Home / Function/ buildSelectQuery() — drizzle-orm Function Reference

buildSelectQuery() — drizzle-orm Function Reference

Architecture documentation for the buildSelectQuery() function in dialect.ts from the drizzle-orm codebase.

Entity Profile

Dependency Diagram

graph TD
  8ae83588_d5c3_3834_94e9_82ba6770d1a1["buildSelectQuery()"]
  9c5eee4c_4b78_a585_4038_d710de212097["MySqlDialect"]
  8ae83588_d5c3_3834_94e9_82ba6770d1a1 -->|defined in| 9c5eee4c_4b78_a585_4038_d710de212097
  1a21ab38_4faf_3068_e256_38391d240199["buildRelationalQuery()"]
  1a21ab38_4faf_3068_e256_38391d240199 -->|calls| 8ae83588_d5c3_3834_94e9_82ba6770d1a1
  82000e3a_faae_8201_7ec2_d2c8f50015b0["buildRelationalQueryWithoutLateralSubqueries()"]
  82000e3a_faae_8201_7ec2_d2c8f50015b0 -->|calls| 8ae83588_d5c3_3834_94e9_82ba6770d1a1
  36b61a5b_7f68_2e43_5760_d461578993f6["buildWithCTE()"]
  8ae83588_d5c3_3834_94e9_82ba6770d1a1 -->|calls| 36b61a5b_7f68_2e43_5760_d461578993f6
  d2bb0977_2845_5bd0_d019_e55f619ef7e8["buildSelection()"]
  8ae83588_d5c3_3834_94e9_82ba6770d1a1 -->|calls| d2bb0977_2845_5bd0_d019_e55f619ef7e8
  7c20c441_cfa6_cf8b_7c30_26d754c4801b["buildIndex()"]
  8ae83588_d5c3_3834_94e9_82ba6770d1a1 -->|calls| 7c20c441_cfa6_cf8b_7c30_26d754c4801b
  1a6d3dd7_66dd_323c_34ba_58c1bebc1ede["buildOrderBy()"]
  8ae83588_d5c3_3834_94e9_82ba6770d1a1 -->|calls| 1a6d3dd7_66dd_323c_34ba_58c1bebc1ede
  6b198fad_61da_d3c6_6497_9634ac05c48a["buildLimit()"]
  8ae83588_d5c3_3834_94e9_82ba6770d1a1 -->|calls| 6b198fad_61da_d3c6_6497_9634ac05c48a
  3da984c5_cedc_6ee4_6ea2_52428870cfec["buildSetOperations()"]
  8ae83588_d5c3_3834_94e9_82ba6770d1a1 -->|calls| 3da984c5_cedc_6ee4_6ea2_52428870cfec
  style 8ae83588_d5c3_3834_94e9_82ba6770d1a1 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

drizzle-orm/src/mysql-core/dialect.ts lines 277–428

	buildSelectQuery(
		{
			withList,
			fields,
			fieldsFlat,
			where,
			having,
			table,
			joins,
			orderBy,
			groupBy,
			limit,
			offset,
			lockingClause,
			distinct,
			setOperators,
			useIndex,
			forceIndex,
			ignoreIndex,
		}: MySqlSelectConfig,
	): SQL {
		const fieldsList = fieldsFlat ?? orderSelectedFields<MySqlColumn>(fields);
		for (const f of fieldsList) {
			if (
				is(f.field, Column)
				&& getTableName(f.field.table)
					!== (is(table, Subquery)
						? table._.alias
						: is(table, MySqlViewBase)
						? table[ViewBaseConfig].name
						: is(table, SQL)
						? undefined
						: getTableName(table))
				&& !((table) =>
					joins?.some(({ alias }) =>
						alias === (table[Table.Symbol.IsAlias] ? getTableName(table) : table[Table.Symbol.BaseName])
					))(f.field.table)
			) {
				const tableName = getTableName(f.field.table);
				throw new Error(
					`Your "${
						f.path.join('->')
					}" field references a column "${tableName}"."${f.field.name}", but the table "${tableName}" is not part of the query! Did you forget to join it?`,
				);
			}
		}

		const isSingleTable = !joins || joins.length === 0;

		const withSql = this.buildWithCTE(withList);

		const distinctSql = distinct ? sql` distinct` : undefined;

		const selection = this.buildSelection(fieldsList, { isSingleTable });

		const tableSql = (() => {
			if (is(table, Table) && table[Table.Symbol.IsAlias]) {
				return sql`${sql`${sql.identifier(table[Table.Symbol.Schema] ?? '')}.`.if(table[Table.Symbol.Schema])}${
					sql.identifier(table[Table.Symbol.OriginalName])
				} ${sql.identifier(table[Table.Symbol.Name])}`;
			}

			return table;
		})();

		const joinsArray: SQL[] = [];

		if (joins) {
			for (const [index, joinMeta] of joins.entries()) {
				if (index === 0) {
					joinsArray.push(sql` `);
				}
				const table = joinMeta.table;
				const lateralSql = joinMeta.lateral ? sql` lateral` : undefined;
				const onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;

				if (is(table, MySqlTable)) {
					const tableName = table[MySqlTable.Symbol.Name];
					const tableSchema = table[MySqlTable.Symbol.Schema];
					const origTableName = table[MySqlTable.Symbol.OriginalName];
					const alias = tableName === origTableName ? undefined : joinMeta.alias;

Domain

Subdomains

Frequently Asked Questions

What does buildSelectQuery() do?
buildSelectQuery() is a function in the drizzle-orm codebase, defined in drizzle-orm/src/mysql-core/dialect.ts.
Where is buildSelectQuery() defined?
buildSelectQuery() is defined in drizzle-orm/src/mysql-core/dialect.ts at line 277.
What does buildSelectQuery() call?
buildSelectQuery() calls 6 function(s): buildIndex, buildLimit, buildOrderBy, buildSelection, buildSetOperations, buildWithCTE.
What calls buildSelectQuery()?
buildSelectQuery() is called by 2 function(s): buildRelationalQuery, buildRelationalQueryWithoutLateralSubqueries.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free