drizzle-orm 1.0.0-beta.18-1d08dde → 1.0.0-beta.18-75f52f7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -43,7 +43,7 @@ declare const DefaultServices: Layer.Layer<EffectCache | EffectLogger, never, ne
43
43
  */
44
44
  declare const make: <TSchema extends Record<string, unknown> = Record<string, never>, TRelations extends AnyRelations = EmptyRelations>(config?: EffectDrizzleConfig<TSchema, TRelations> | undefined) => Effect.Effect<EffectPgDatabase<TSchema, TRelations> & {
45
45
  $client: PgClient;
46
- }, never, EffectCache | PgClient | EffectLogger>;
46
+ }, never, EffectCache | EffectLogger | PgClient>;
47
47
  /**
48
48
  * Convenience function that creates an EffectPgDatabase with `DefaultServices` already provided.
49
49
  */
@@ -43,7 +43,7 @@ declare const DefaultServices: Layer.Layer<EffectCache | EffectLogger, never, ne
43
43
  */
44
44
  declare const make: <TSchema extends Record<string, unknown> = Record<string, never>, TRelations extends AnyRelations = EmptyRelations>(config?: EffectDrizzleConfig<TSchema, TRelations> | undefined) => Effect.Effect<EffectPgDatabase<TSchema, TRelations> & {
45
45
  $client: PgClient;
46
- }, never, EffectCache | PgClient | EffectLogger>;
46
+ }, never, EffectCache | EffectLogger | PgClient>;
47
47
  /**
48
48
  * Convenience function that creates an EffectPgDatabase with `DefaultServices` already provided.
49
49
  */
@@ -171,7 +171,7 @@ var MySqlDialect = class {
171
171
  const distinctSql = distinct ? __sql_sql_ts.sql` distinct` : void 0;
172
172
  const selection = this.buildSelection(fieldsList, { isSingleTable });
173
173
  const tableSql = (() => {
174
- if ((0, __entity_ts.is)(table, __table_ts.Table) && table[__table_ts.Table.Symbol.IsAlias]) return __sql_sql_ts.sql`${__sql_sql_ts.sql`${__sql_sql_ts.sql.identifier(table[__table_ts.Table.Symbol.Schema] ?? "")}.`.if(table[__table_ts.Table.Symbol.Schema])}${__sql_sql_ts.sql.identifier(table[__table_ts.Table.Symbol.OriginalName])} ${__sql_sql_ts.sql.identifier(table[__table_ts.Table.Symbol.Name])}`;
174
+ if ((0, __entity_ts.is)(table, __table_ts.Table) && table[__table_ts.Table.Symbol.IsAlias]) return __sql_sql_ts.sql`${table[__table_ts.Table.Symbol.Schema] ? __sql_sql_ts.sql`${__sql_sql_ts.sql.identifier(table[__table_ts.Table.Symbol.Schema])}.` : void 0}${__sql_sql_ts.sql.identifier(table[__table_ts.Table.Symbol.OriginalName])} ${__sql_sql_ts.sql.identifier(table[__table_ts.Table.Symbol.Name])}`;
175
175
  if ((0, __entity_ts.is)(table, __sql_sql_ts.View) && table[__view_common_ts.ViewBaseConfig].isAlias) {
176
176
  let fullName = __sql_sql_ts.sql`${__sql_sql_ts.sql.identifier(table[__view_common_ts.ViewBaseConfig].originalName)}`;
177
177
  if (table[__view_common_ts.ViewBaseConfig].schema) fullName = __sql_sql_ts.sql`${__sql_sql_ts.sql.identifier(table[__view_common_ts.ViewBaseConfig].schema)}.${fullName}`;
@@ -497,9 +497,9 @@ var MySqlDialect = class {
497
497
  orderBy,
498
498
  setOperators: []
499
499
  });
500
- if (config !== true && config.comment !== void 0) {
500
+ if (config !== true && config.comment) {
501
501
  const comment = __sql_sql_ts.sql.comment(config.comment);
502
- result = __sql_sql_ts.sql`${result}${__sql_sql_ts.sql` ${comment}`.if(comment)}`;
502
+ result = comment ? __sql_sql_ts.sql`${result} ${comment}` : result;
503
503
  }
504
504
  return {
505
505
  tableTsKey: tableConfig.tsName,
@@ -668,9 +668,9 @@ var MySqlDialect = class {
668
668
  orderBy,
669
669
  setOperators: []
670
670
  });
671
- if (config !== true && config.comment !== void 0) {
671
+ if (config !== true && config.comment) {
672
672
  const comment = __sql_sql_ts.sql.comment(config.comment);
673
- result = __sql_sql_ts.sql`${result}${__sql_sql_ts.sql` ${comment}`.if(comment)}`;
673
+ result = comment ? __sql_sql_ts.sql`${result} ${comment}` : result;
674
674
  }
675
675
  return {
676
676
  tableTsKey: tableConfig.tsName,
@@ -804,8 +804,10 @@ var MySqlDialect = class {
804
804
  if (extras?.sql) selectionArr.push(extras.sql);
805
805
  if (!selectionArr.length) throw new __errors_ts.DrizzleError({ message: `No fields selected for table "${tableConfig.name}"${currentPath ? ` ("${currentPath}")` : ""}` });
806
806
  if (isNestedMany && order) selectionArr.push(__sql_sql_ts.sql`row_number() over (order by ${order})`);
807
+ const selectionSet = __sql_sql_ts.sql.join(selectionArr, __sql_sql_ts.sql`, `);
808
+ const comment = config !== true && config?.comment ? __sql_sql_ts.sql.comment(config.comment) : void 0;
807
809
  return {
808
- sql: __sql_sql_ts.sql`select ${__sql_sql_ts.sql.join(selectionArr, __sql_sql_ts.sql`, `)} from ${(0, __relations_ts.getTableAsAliasSQL)(table)}${throughJoin}${__sql_sql_ts.sql`${joins}`.if(joins)}${__sql_sql_ts.sql` where ${where}`.if(where)}${__sql_sql_ts.sql` order by ${order}`.if(order)}${__sql_sql_ts.sql` limit ${limit}`.if(limit !== void 0)}${__sql_sql_ts.sql` offset ${offset}`.if(offset !== void 0)}${config !== true && config?.comment !== void 0 ? __sql_sql_ts.sql` ${__sql_sql_ts.sql.comment(config.comment)}` : void 0}`,
810
+ sql: __sql_sql_ts.sql`select ${selectionSet} from ${(0, __relations_ts.getTableAsAliasSQL)(table)}${throughJoin}${joins ? __sql_sql_ts.sql`${joins}` : void 0}${where ? __sql_sql_ts.sql` where ${where}` : void 0}${order ? __sql_sql_ts.sql` order by ${order}` : void 0}${limit !== void 0 ? __sql_sql_ts.sql` limit ${limit}` : void 0}${offset !== void 0 ? __sql_sql_ts.sql` offset ${offset}` : void 0}${comment ? __sql_sql_ts.sql` ${comment}` : void 0}`,
809
811
  selection
810
812
  };
811
813
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dialect.cjs","names":["entityKind","CasingCache","sql","Table","SQL","MySqlColumn","Column","Subquery","MySqlViewBase","ViewBaseConfig","View","MySqlTable","Param","V1","DrizzleError","TableColumns","One"],"sources":["../../src/mysql-core/dialect.ts"],"sourcesContent":["import * as V1 from '~/_relations.ts';\nimport {\n\taliasedTable,\n\taliasedTableColumn,\n\tgetOriginalColumnFromAlias,\n\tmapColumnsInAliasedSQLToAlias,\n\tmapColumnsInSQLToAlias,\n} from '~/alias.ts';\nimport { CasingCache } from '~/casing.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError } from '~/errors.ts';\nimport type { MigrationConfig, MigrationMeta, MigratorInitFailResponse } from '~/migrator.ts';\nimport { getMigrationsToRun } from '~/migrator.utils.ts';\nimport type {\n\tAnyOne,\n\tBuildRelationalQueryResult,\n\tColumnWithTSName,\n\tDBQueryConfigWithComment,\n\tRelation,\n\tTableRelationalConfig,\n\tTablesRelationalConfig,\n\tWithContainer,\n} from '~/relations.ts';\nimport {\n\t// AggregatedField,\n\tgetTableAsAliasSQL,\n\tOne,\n\trelationExtrasToSQL,\n\trelationsFilterToSQL,\n\trelationsOrderToSQL,\n\trelationToSQL,\n} from '~/relations.ts';\nimport { and, eq } from '~/sql/expressions/index.ts';\nimport { isSQLWrapper, Param, SQL, sql, View } from '~/sql/sql.ts';\nimport type { Name, Placeholder, QueryWithTypings, SQLChunk, SQLWrapper } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { getTableName, getTableUniqueName, Table, TableColumns } from '~/table.ts';\nimport { upgradeIfNeeded } from '~/up-migrations/mysql.ts';\nimport { type Casing, orderSelectedFields, type UpdateSet } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { MySqlColumn } from './columns/common.ts';\nimport type { MySqlCustomColumn } from './columns/custom.ts';\nimport type { MySqlDeleteConfig } from './query-builders/delete.ts';\nimport type { MySqlInsertConfig } from './query-builders/insert.ts';\nimport type {\n\tAnyMySqlSelectQueryBuilder,\n\tMySqlSelectConfig,\n\tMySqlSelectJoinConfig,\n\tSelectedFieldsOrdered,\n} from './query-builders/select.types.ts';\nimport type { MySqlUpdateConfig } from './query-builders/update.ts';\nimport type { MySqlSession } from './session.ts';\nimport { MySqlTable } from './table.ts';\nimport { MySqlViewBase } from './view-base.ts';\nimport type { MySqlView } from './view.ts';\n\nexport interface MySqlDialectConfig {\n\tcasing?: Casing;\n\tescapeParam?: (num: number) => string;\n}\n\nexport class MySqlDialect {\n\tstatic readonly [entityKind]: string = 'MySqlDialect';\n\n\t/** @internal */\n\treadonly casing: CasingCache;\n\n\tconstructor(config?: MySqlDialectConfig) {\n\t\tthis.casing = new CasingCache(config?.casing);\n\n\t\tif (config?.escapeParam) {\n\t\t\tthis.escapeParam = config.escapeParam;\n\t\t}\n\t}\n\n\tasync migrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: MySqlSession,\n\t\tconfig: Omit<MigrationConfig, 'migrationsSchema'>,\n\t): Promise<void | MigratorInitFailResponse> {\n\t\tconst migrationsTable = config.migrationsTable ?? '__drizzle_migrations';\n\n\t\t// Detect DB version and upgrade table schema if needed\n\t\tconst { newDb } = await upgradeIfNeeded(migrationsTable, session, migrations);\n\n\t\tif (newDb) {\n\t\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash TEXT NOT NULL,\n\t\t\t\tcreated_at BIGINT,\n\t\t\t\tname TEXT,\n\t\t\t\tapplied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n\t\t\t)\n\t\t`;\n\t\t\tawait session.execute(migrationTableCreate);\n\t\t}\n\n\t\tconst dbMigrations = await session.all<{ id: number; hash: string; created_at: string; name: string | null }>(\n\t\t\tsql`select id, hash, created_at, name from ${sql.identifier(migrationsTable)}`,\n\t\t);\n\n\t\tif (typeof config === 'object' && config.init) {\n\t\t\tif (dbMigrations.length) {\n\t\t\t\treturn { exitCode: 'databaseMigrations' as const };\n\t\t\t}\n\n\t\t\tif (migrations.length > 1) {\n\t\t\t\treturn { exitCode: 'localMigrations' as const };\n\t\t\t}\n\n\t\t\tconst [migration] = migrations;\n\n\t\t\tif (!migration) return;\n\n\t\t\tawait session.execute(\n\t\t\t\tsql`insert into ${\n\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t} (\\`hash\\`, \\`created_at\\`, \\`name\\`) values(${migration.hash}, ${migration.folderMillis}, ${migration.name})`,\n\t\t\t);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst migrationsToRun = getMigrationsToRun({ localMigrations: migrations, dbMigrations });\n\t\tawait session.transaction(async (tx) => {\n\t\t\tfor (const migration of migrationsToRun) {\n\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\tawait tx.execute(sql.raw(stmt));\n\t\t\t\t}\n\t\t\t\tawait session.execute(\n\t\t\t\t\tsql`insert into ${\n\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t} (\\`hash\\`, \\`created_at\\`, \\`name\\`) values(${migration.hash}, ${migration.folderMillis}, ${migration.name})`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\n\tescapeName(name: string): string {\n\t\treturn `\\`${name}\\``;\n\t}\n\n\tescapeParam(_num: number): string {\n\t\treturn `?`;\n\t}\n\n\tescapeString(str: string): string {\n\t\treturn `'${str.replace(/'/g, \"''\")}'`;\n\t}\n\n\tprivate buildWithCTE(queries: Subquery[] | undefined): SQL | undefined {\n\t\tif (!queries?.length) return undefined;\n\n\t\tconst withSqlChunks = [sql`with `];\n\t\tfor (const [i, w] of queries.entries()) {\n\t\t\twithSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);\n\t\t\tif (i < queries.length - 1) {\n\t\t\t\twithSqlChunks.push(sql`, `);\n\t\t\t}\n\t\t}\n\t\twithSqlChunks.push(sql` `);\n\t\treturn sql.join(withSqlChunks);\n\t}\n\n\tbuildDeleteQuery({ table, where, returning, withList, limit, orderBy, comment }: MySqlDeleteConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}delete from ${table}${whereSql}${orderBySql}${limitSql}${returningSql}${\n\t\t\tcomment !== undefined ? sql` ${comment}` : undefined\n\t\t}`;\n\t}\n\n\tbuildUpdateSet(table: MySqlTable, set: UpdateSet): SQL {\n\t\tconst tableColumns = table[Table.Symbol.Columns];\n\n\t\tconst columnNames = Object.keys(tableColumns).filter((colName) =>\n\t\t\tset[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined\n\t\t);\n\n\t\tconst setLength = columnNames.length;\n\t\treturn sql.join(columnNames.flatMap((colName, i) => {\n\t\t\tconst col = tableColumns[colName]!;\n\n\t\t\tconst onUpdateFnResult = col.onUpdateFn?.();\n\t\t\tconst value = set[colName] ?? (is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col));\n\t\t\tconst res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;\n\n\t\t\tif (i < setLength - 1) {\n\t\t\t\treturn [res, sql.raw(', ')];\n\t\t\t}\n\t\t\treturn [res];\n\t\t}));\n\t}\n\n\tbuildUpdateQuery({ table, set, where, returning, withList, limit, orderBy, comment }: MySqlUpdateConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst setSql = this.buildUpdateSet(table, set);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}update ${table} set ${setSql}${whereSql}${orderBySql}${limitSql}${returningSql}${\n\t\t\tcomment !== undefined ? sql` ${comment}` : undefined\n\t\t}`;\n\t}\n\n\t/**\n\t * Builds selection SQL with provided fields/expressions\n\t *\n\t * Examples:\n\t *\n\t * `select <selection> from`\n\t *\n\t * `insert ... returning <selection>`\n\t *\n\t * If `isSingleTable` is true, then columns won't be prefixed with table name\n\t */\n\tprivate buildSelection(\n\t\tfields: SelectedFieldsOrdered,\n\t\t{ isSingleTable = false }: { isSingleTable?: boolean } = {},\n\t): SQL {\n\t\tconst columnsLen = fields.length;\n\n\t\tconst chunks = fields\n\t\t\t.flatMap(({ field }, i) => {\n\t\t\t\tconst chunk: SQLChunk[] = [];\n\n\t\t\t\tif (is(field, SQL.Aliased) && field.isSelectionField) {\n\t\t\t\t\tif (!isSingleTable && field.origin !== undefined) chunk.push(sql.identifier(field.origin), sql.raw('.'));\n\t\t\t\t\tchunk.push(sql.identifier(field.fieldAlias));\n\t\t\t\t} else if (is(field, SQL.Aliased) || is(field, SQL)) {\n\t\t\t\t\tconst query = is(field, SQL.Aliased) ? field.sql : field;\n\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tconst newSql = new SQL(\n\t\t\t\t\t\t\tquery.queryChunks.map((c) => {\n\t\t\t\t\t\t\t\tif (is(c, MySqlColumn)) {\n\t\t\t\t\t\t\t\t\treturn sql.identifier(this.casing.getColumnCasing(c));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn c;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tchunk.push(query.shouldInlineParams ? newSql.inlineParams() : newSql);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(query);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (is(field, SQL.Aliased)) {\n\t\t\t\t\t\tchunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Column)) {\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tfield.isAlias\n\t\t\t\t\t\t\t\t? sql`${sql.identifier(this.casing.getColumnCasing(getOriginalColumnFromAlias(field)))} as ${field}`\n\t\t\t\t\t\t\t\t: sql.identifier(this.casing.getColumnCasing(field)),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(field.isAlias ? sql`${getOriginalColumnFromAlias(field)} as ${field}` : field);\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Subquery)) {\n\t\t\t\t\tconst entries = Object.entries(field._.selectedFields) as [string, SQL.Aliased | Column | SQL][];\n\n\t\t\t\t\tif (entries.length === 1) {\n\t\t\t\t\t\tconst entry = entries[0]![1];\n\n\t\t\t\t\t\tconst fieldDecoder = is(entry, SQL)\n\t\t\t\t\t\t\t? entry.decoder\n\t\t\t\t\t\t\t: is(entry, Column)\n\t\t\t\t\t\t\t? { mapFromDriverValue: (v: any) => entry.mapFromDriverValue(v) }\n\t\t\t\t\t\t\t: entry.sql.decoder;\n\n\t\t\t\t\t\tif (fieldDecoder) {\n\t\t\t\t\t\t\tfield._.sql.decoder = fieldDecoder;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tchunk.push(field);\n\t\t\t\t}\n\n\t\t\t\tif (i < columnsLen - 1) {\n\t\t\t\t\tchunk.push(sql`, `);\n\t\t\t\t}\n\n\t\t\t\treturn chunk;\n\t\t\t});\n\n\t\treturn sql.join(chunks);\n\t}\n\n\tprivate buildLimit(limit: number | Placeholder | undefined): SQL | undefined {\n\t\treturn typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\t}\n\n\tprivate buildOrderBy(orderBy: (MySqlColumn | SQL | SQL.Aliased)[] | undefined): SQL | undefined {\n\t\treturn orderBy && orderBy.length > 0 ? sql` order by ${sql.join(orderBy, sql`, `)}` : undefined;\n\t}\n\n\tprivate buildIndex({\n\t\tindexes,\n\t\tindexFor,\n\t}: {\n\t\tindexes: string[] | undefined;\n\t\tindexFor: 'USE' | 'FORCE' | 'IGNORE';\n\t}): SQL | undefined {\n\t\treturn indexes && indexes.length > 0\n\t\t\t? sql` ${sql.raw(indexFor)} INDEX ${indexes.map((it) => sql.identifier(it))}`\n\t\t\t: undefined;\n\t}\n\n\tbuildSelectQuery(\n\t\t{\n\t\t\twithList,\n\t\t\tfields,\n\t\t\tfieldsFlat,\n\t\t\twhere,\n\t\t\thaving,\n\t\t\ttable,\n\t\t\tjoins,\n\t\t\torderBy,\n\t\t\tgroupBy,\n\t\t\tlimit,\n\t\t\toffset,\n\t\t\tlockingClause,\n\t\t\tdistinct,\n\t\t\tsetOperators,\n\t\t\tuseIndex,\n\t\t\tforceIndex,\n\t\t\tignoreIndex,\n\t\t\tcomment,\n\t\t}: MySqlSelectConfig,\n\t): SQL {\n\t\tconst fieldsList = fieldsFlat ?? orderSelectedFields<MySqlColumn>(fields);\n\t\tfor (const f of fieldsList) {\n\t\t\tif (\n\t\t\t\tis(f.field, Column)\n\t\t\t\t&& getTableName(f.field.table)\n\t\t\t\t\t!== (is(table, Subquery)\n\t\t\t\t\t\t? table._.alias\n\t\t\t\t\t\t: is(table, MySqlViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].name\n\t\t\t\t\t\t: is(table, SQL)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: getTableName(table))\n\t\t\t\t&& !((table) =>\n\t\t\t\t\tjoins?.some(({ alias }) =>\n\t\t\t\t\t\talias === (table[Table.Symbol.IsAlias] ? getTableName(table) : table[Table.Symbol.BaseName])\n\t\t\t\t\t))(f.field.table)\n\t\t\t) {\n\t\t\t\tconst tableName = getTableName(f.field.table);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Your \"${\n\t\t\t\t\t\tf.path.join('->')\n\t\t\t\t\t}\" field references a column \"${tableName}\".\"${f.field.name}\", but the table \"${tableName}\" is not part of the query! Did you forget to join it?`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst isSingleTable = !joins || joins.length === 0;\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst distinctSql = distinct ? sql` distinct` : undefined;\n\n\t\tconst selection = this.buildSelection(fieldsList, { isSingleTable });\n\n\t\tconst tableSql = (() => {\n\t\t\tif (is(table, Table) && table[Table.Symbol.IsAlias]) {\n\t\t\t\treturn sql`${sql`${sql.identifier(table[Table.Symbol.Schema] ?? '')}.`.if(table[Table.Symbol.Schema])}${\n\t\t\t\t\tsql.identifier(table[Table.Symbol.OriginalName])\n\t\t\t\t} ${sql.identifier(table[Table.Symbol.Name])}`;\n\t\t\t}\n\n\t\t\tif (is(table, View) && table[ViewBaseConfig].isAlias) {\n\t\t\t\tlet fullName = sql`${sql.identifier(table[ViewBaseConfig].originalName)}`;\n\t\t\t\tif (table[ViewBaseConfig].schema) {\n\t\t\t\t\tfullName = sql`${sql.identifier(table[ViewBaseConfig].schema)}.${fullName}`;\n\t\t\t\t}\n\t\t\t\treturn sql`${fullName} ${sql.identifier(table[ViewBaseConfig].name)}`;\n\t\t\t}\n\n\t\t\treturn table;\n\t\t})();\n\n\t\tconst joinsArray: SQL[] = [];\n\n\t\tif (joins) {\n\t\t\tfor (const [index, joinMeta] of joins.entries()) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t\tconst table = joinMeta.table;\n\t\t\t\tconst lateralSql = joinMeta.lateral ? sql` lateral` : undefined;\n\t\t\t\tconst onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;\n\n\t\t\t\tif (is(table, MySqlTable)) {\n\t\t\t\t\tconst tableName = table[MySqlTable.Symbol.Name];\n\t\t\t\t\tconst tableSchema = table[MySqlTable.Symbol.Schema];\n\t\t\t\t\tconst origTableName = table[MySqlTable.Symbol.OriginalName];\n\t\t\t\t\tconst alias = tableName === origTableName ? undefined : joinMeta.alias;\n\t\t\t\t\tconst useIndexSql = this.buildIndex({ indexes: joinMeta.useIndex, indexFor: 'USE' });\n\t\t\t\t\tconst forceIndexSql = this.buildIndex({ indexes: joinMeta.forceIndex, indexFor: 'FORCE' });\n\t\t\t\t\tconst ignoreIndexSql = this.buildIndex({ indexes: joinMeta.ignoreIndex, indexFor: 'IGNORE' });\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${\n\t\t\t\t\t\t\ttableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined\n\t\t\t\t\t\t}${sql.identifier(origTableName)}${useIndexSql}${forceIndexSql}${ignoreIndexSql}${\n\t\t\t\t\t\t\talias && sql` ${sql.identifier(alias)}`\n\t\t\t\t\t\t}${onSql}`,\n\t\t\t\t\t);\n\t\t\t\t} else if (is(table, View)) {\n\t\t\t\t\tconst viewName = table[ViewBaseConfig].name;\n\t\t\t\t\tconst viewSchema = table[ViewBaseConfig].schema;\n\t\t\t\t\tconst origViewName = table[ViewBaseConfig].originalName;\n\t\t\t\t\tconst alias = viewName === origViewName ? undefined : joinMeta.alias;\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${\n\t\t\t\t\t\t\tviewSchema ? sql`${sql.identifier(viewSchema)}.` : undefined\n\t\t\t\t\t\t}${sql.identifier(origViewName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${table}${onSql}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (index < joins.length - 1) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst joinsSql = sql.join(joinsArray);\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst havingSql = having ? sql` having ${having}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst groupBySql = groupBy && groupBy.length > 0 ? sql` group by ${sql.join(groupBy, sql`, `)}` : undefined;\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\tconst useIndexSql = this.buildIndex({ indexes: useIndex, indexFor: 'USE' });\n\n\t\tconst forceIndexSql = this.buildIndex({ indexes: forceIndex, indexFor: 'FORCE' });\n\n\t\tconst ignoreIndexSql = this.buildIndex({ indexes: ignoreIndex, indexFor: 'IGNORE' });\n\n\t\tlet lockingClausesSql;\n\t\tif (lockingClause) {\n\t\t\tconst { config, strength } = lockingClause;\n\t\t\tlockingClausesSql = sql` for ${sql.raw(strength)}`;\n\t\t\tif (config.noWait) {\n\t\t\t\tlockingClausesSql.append(sql` nowait`);\n\t\t\t} else if (config.skipLocked) {\n\t\t\t\tlockingClausesSql.append(sql` skip locked`);\n\t\t\t}\n\t\t}\n\n\t\tconst finalQuery =\n\t\t\tsql`${withSql}select${distinctSql} ${selection} from ${tableSql}${useIndexSql}${forceIndexSql}${ignoreIndexSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}${lockingClausesSql}${\n\t\t\t\tcomment !== undefined ? sql` ${comment}` : undefined\n\t\t\t}`;\n\n\t\tif (setOperators.length > 0) {\n\t\t\treturn this.buildSetOperations(finalQuery, setOperators);\n\t\t}\n\n\t\treturn finalQuery;\n\t}\n\n\tbuildSetOperations(leftSelect: SQL, setOperators: MySqlSelectConfig['setOperators']): SQL {\n\t\tconst [setOperator, ...rest] = setOperators;\n\n\t\tif (!setOperator) {\n\t\t\tthrow new Error('Cannot pass undefined values to any set operator');\n\t\t}\n\n\t\tif (rest.length === 0) {\n\t\t\treturn this.buildSetOperationQuery({ leftSelect, setOperator });\n\t\t}\n\n\t\t// Some recursive magic here\n\t\treturn this.buildSetOperations(\n\t\t\tthis.buildSetOperationQuery({ leftSelect, setOperator }),\n\t\t\trest,\n\t\t);\n\t}\n\n\tbuildSetOperationQuery({\n\t\tleftSelect,\n\t\tsetOperator: { type, isAll, rightSelect, limit, orderBy, offset },\n\t}: { leftSelect: SQL; setOperator: MySqlSelectConfig['setOperators'][number] }): SQL {\n\t\tconst leftChunk = sql`(${leftSelect.getSQL()}) `;\n\t\tconst rightChunk = sql`(${rightSelect.getSQL()})`;\n\n\t\tlet orderBySql;\n\t\tif (orderBy && orderBy.length > 0) {\n\t\t\tconst orderByValues: (SQL<unknown> | Name)[] = [];\n\n\t\t\t// The next bit is necessary because the sql operator replaces ${table.column} with `table`.`column`\n\t\t\t// which is invalid MySql syntax, Table from one of the SELECTs cannot be used in global ORDER clause\n\t\t\tfor (const orderByUnit of orderBy) {\n\t\t\t\tif (is(orderByUnit, MySqlColumn)) {\n\t\t\t\t\torderByValues.push(sql.identifier(this.casing.getColumnCasing(orderByUnit)));\n\t\t\t\t} else if (is(orderByUnit, SQL)) {\n\t\t\t\t\tfor (let i = 0; i < orderByUnit.queryChunks.length; i++) {\n\t\t\t\t\t\tconst chunk = orderByUnit.queryChunks[i];\n\n\t\t\t\t\t\tif (is(chunk, MySqlColumn)) {\n\t\t\t\t\t\t\torderByUnit.queryChunks[i] = sql.identifier(this.casing.getColumnCasing(chunk));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\torderByValues.push(sql`${orderByUnit}`);\n\t\t\t\t} else {\n\t\t\t\t\torderByValues.push(sql`${orderByUnit}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\torderBySql = sql` order by ${sql.join(orderByValues, sql`, `)} `;\n\t\t}\n\n\t\tconst limitSql = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\n\t\tconst operatorChunk = sql.raw(`${type} ${isAll ? 'all ' : ''}`);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\treturn sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;\n\t}\n\n\tbuildInsertQuery(\n\t\t{ table, values: valuesOrSelect, ignore, onConflict, select, comment }: MySqlInsertConfig,\n\t): { sql: SQL; generatedIds: Record<string, unknown>[] } {\n\t\t// const isSingleValue = values.length === 1;\n\t\tconst valuesSqlList: ((SQLChunk | SQL)[] | SQL)[] = [];\n\t\tconst columns: Record<string, MySqlColumn> = table[Table.Symbol.Columns];\n\t\tconst colEntries: [string, MySqlColumn][] = Object.entries(columns).filter(([_, col]) =>\n\t\t\t!col.shouldDisableInsert()\n\t\t);\n\n\t\tconst insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));\n\t\tconst generatedIdsResponse: Record<string, unknown>[] = [];\n\n\t\tif (select) {\n\t\t\tconst select = valuesOrSelect as AnyMySqlSelectQueryBuilder | SQL;\n\n\t\t\tif (is(select, SQL)) {\n\t\t\t\tvaluesSqlList.push(select);\n\t\t\t} else {\n\t\t\t\tvaluesSqlList.push(select.getSQL());\n\t\t\t}\n\t\t} else {\n\t\t\tconst values = valuesOrSelect as Record<string, Param | SQL>[];\n\t\t\tvaluesSqlList.push(sql.raw('values '));\n\n\t\t\tfor (const [valueIndex, value] of values.entries()) {\n\t\t\t\tconst generatedIds: Record<string, unknown> = {};\n\n\t\t\t\tconst valueList: (SQLChunk | SQL)[] = [];\n\t\t\t\tfor (const [fieldName, col] of colEntries) {\n\t\t\t\t\tconst colValue = value[fieldName];\n\t\t\t\t\tif (colValue === undefined || (is(colValue, Param) && colValue.value === undefined)) {\n\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\tif (col.defaultFn !== undefined) {\n\t\t\t\t\t\t\tconst defaultFnResult = col.defaultFn();\n\t\t\t\t\t\t\tgeneratedIds[fieldName] = defaultFnResult;\n\t\t\t\t\t\t\tconst defaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);\n\t\t\t\t\t\t\tvalueList.push(defaultValue);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (!col.default && col.onUpdateFn !== undefined) {\n\t\t\t\t\t\t\tconst onUpdateFnResult = col.onUpdateFn();\n\t\t\t\t\t\t\tconst newValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);\n\t\t\t\t\t\t\tvalueList.push(newValue);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvalueList.push(sql`default`);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (col.defaultFn && is(colValue, Param)) {\n\t\t\t\t\t\t\tgeneratedIds[fieldName] = colValue.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvalueList.push(colValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tgeneratedIdsResponse.push(generatedIds);\n\t\t\t\tvaluesSqlList.push(valueList);\n\t\t\t\tif (valueIndex < values.length - 1) {\n\t\t\t\t\tvaluesSqlList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst valuesSql = sql.join(valuesSqlList);\n\n\t\tconst ignoreSql = ignore ? sql` ignore` : undefined;\n\n\t\tconst onConflictSql = onConflict ? sql` on duplicate key ${onConflict}` : undefined;\n\n\t\treturn {\n\t\t\tsql: sql`insert${ignoreSql} into ${table} ${insertOrder} ${valuesSql}${onConflictSql}${\n\t\t\t\tcomment !== undefined ? sql` ${comment}` : undefined\n\t\t\t}`,\n\t\t\tgeneratedIds: generatedIdsResponse,\n\t\t};\n\t}\n\n\tsqlToQuery(sql: SQL, invokeSource?: 'indexes' | undefined): QueryWithTypings {\n\t\treturn sql.toQuery({\n\t\t\tcasing: this.casing,\n\t\t\tescapeName: this.escapeName,\n\t\t\tescapeParam: this.escapeParam,\n\t\t\tescapeString: this.escapeString,\n\t\t\tinvokeSource,\n\t\t});\n\t}\n\n\t/** @deprecated */\n\t_buildRelationalQuery({\n\t\tfullSchema,\n\t\tschema,\n\t\ttableNamesMap,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\ttableAlias,\n\t\tnestedQueryRelation,\n\t\tjoinOn,\n\t}: {\n\t\tfullSchema: Record<string, unknown>;\n\t\tschema: V1.TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t\ttable: MySqlTable;\n\t\ttableConfig: V1.TableRelationalConfig;\n\t\tqueryConfig: true | V1.DBQueryConfigWithComment<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: V1.Relation;\n\t\tjoinOn?: SQL;\n\t}): V1.BuildRelationalQueryResult<MySqlTable, MySqlColumn> {\n\t\tlet selection: V1.BuildRelationalQueryResult<MySqlTable, MySqlColumn>['selection'] = [];\n\t\tlet limit, offset, orderBy: MySqlSelectConfig['orderBy'], where;\n\t\tconst joins: MySqlSelectJoinConfig[] = [];\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map((\n\t\t\t\t[key, value],\n\t\t\t) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as MySqlColumn, tableAlias),\n\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\tisJson: false,\n\t\t\t\tselection: [],\n\t\t\t}));\n\t\t} else {\n\t\t\tconst aliasedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]),\n\t\t\t);\n\n\t\t\tif (config.where) {\n\t\t\t\tconst whereSql = typeof config.where === 'function'\n\t\t\t\t\t? config.where(aliasedColumns, V1.getOperators())\n\t\t\t\t\t: config.where;\n\t\t\t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t\t\t}\n\n\t\t\tconst fieldsSelection: { tsKey: string; value: MySqlColumn | SQL.Aliased }[] = [];\n\t\t\tlet selectedColumns: string[] = [];\n\n\t\t\t// Figure out which columns to select\n\t\t\tif (config.columns) {\n\t\t\t\tlet isIncludeMode = false;\n\n\t\t\t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field in tableConfig.columns) {\n\t\t\t\t\t\tif (!isIncludeMode && value === true) {\n\t\t\t\t\t\t\tisIncludeMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectedColumns.push(field);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (selectedColumns.length > 0) {\n\t\t\t\t\tselectedColumns = isIncludeMode\n\t\t\t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t\t\t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Select all columns if selection is not specified\n\t\t\t\tselectedColumns = Object.keys(tableConfig.columns);\n\t\t\t}\n\n\t\t\tfor (const field of selectedColumns) {\n\t\t\t\tconst column = tableConfig.columns[field]! as MySqlColumn;\n\t\t\t\tfieldsSelection.push({ tsKey: field, value: column });\n\t\t\t}\n\n\t\t\tlet selectedRelations: {\n\t\t\t\ttsKey: string;\n\t\t\t\tqueryConfig: true | V1.DBQueryConfigWithComment<'many', false>;\n\t\t\t\trelation: V1.Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which V1.relations to select\n\t\t\tif (config.with) {\n\t\t\t\tselectedRelations = Object.entries(config.with)\n\t\t\t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t\t\t}\n\n\t\t\tlet extras;\n\n\t\t\t// Figure out which extras to select\n\t\t\tif (config.extras) {\n\t\t\t\textras = typeof config.extras === 'function'\n\t\t\t\t\t? config.extras(aliasedColumns, { sql })\n\t\t\t\t\t: config.extras;\n\t\t\t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t\t\t\t\tfieldsSelection.push({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Transform `fieldsSelection` into `selection`\n\t\t\t// `fieldsSelection` shouldn't be used after this point\n\t\t\tfor (const { tsKey, value } of fieldsSelection) {\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\t\tisJson: false,\n\t\t\t\t\tselection: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet orderByOrig = typeof config.orderBy === 'function'\n\t\t\t\t? config.orderBy(aliasedColumns, V1.getOrderByOperators())\n\t\t\t\t: config.orderBy ?? [];\n\t\t\tif (!Array.isArray(orderByOrig)) {\n\t\t\t\torderByOrig = [orderByOrig];\n\t\t\t}\n\t\t\torderBy = orderByOrig.map((orderByValue) => {\n\t\t\t\tif (is(orderByValue, Column)) {\n\t\t\t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as MySqlColumn;\n\t\t\t\t}\n\t\t\t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t\t\t});\n\n\t\t\tlimit = config.limit;\n\t\t\toffset = config.offset;\n\n\t\t\t// Process all V1.relations\n\t\t\tfor (\n\t\t\t\tconst {\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tqueryConfig: selectedRelationConfigValue,\n\t\t\t\t\trelation,\n\t\t\t\t} of selectedRelations\n\t\t\t) {\n\t\t\t\tconst normalizedRelation = V1.normalizeRelation(schema, tableNamesMap, relation);\n\t\t\t\tconst relationTableName = getTableUniqueName(relation.referencedTable);\n\t\t\t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t\t\t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t\t\t\tconst joinOn = and(\n\t\t\t\t\t...normalizedRelation.fields.map((field, i) =>\n\t\t\t\t\t\teq(\n\t\t\t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t\t\t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst builtRelation = this._buildRelationalQuery({\n\t\t\t\t\tfullSchema,\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\ttable: fullSchema[relationTableTsName] as MySqlTable,\n\t\t\t\t\ttableConfig: schema[relationTableTsName]!,\n\t\t\t\t\tqueryConfig: is(relation, V1.One)\n\t\t\t\t\t\t? (selectedRelationConfigValue === true\n\t\t\t\t\t\t\t? { limit: 1 }\n\t\t\t\t\t\t\t: { ...selectedRelationConfigValue, limit: 1 })\n\t\t\t\t\t\t: selectedRelationConfigValue,\n\t\t\t\t\ttableAlias: relationTableAlias,\n\t\t\t\t\tjoinOn,\n\t\t\t\t\tnestedQueryRelation: relation,\n\t\t\t\t});\n\t\t\t\tconst field = sql`${sql.identifier(relationTableAlias)}.${sql.identifier('data')}`.as(selectedRelationTsKey);\n\t\t\t\tjoins.push({\n\t\t\t\t\ton: sql`true`,\n\t\t\t\t\ttable: new Subquery(builtRelation.sql as SQL, {}, relationTableAlias),\n\t\t\t\t\talias: relationTableAlias,\n\t\t\t\t\tjoinType: 'left',\n\t\t\t\t\tlateral: true,\n\t\t\t\t});\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: selectedRelationTsKey,\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tfield,\n\t\t\t\t\trelationTableTsKey: relationTableTsName,\n\t\t\t\t\tisJson: true,\n\t\t\t\t\tselection: builtRelation.selection,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (selection.length === 0) {\n\t\t\tthrow new DrizzleError({ message: `No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\")` });\n\t\t}\n\n\t\tlet result;\n\n\t\twhere = and(joinOn, where);\n\n\t\tif (nestedQueryRelation) {\n\t\t\tlet field = sql`json_array(${\n\t\t\t\tsql.join(\n\t\t\t\t\tselection.map(({ field, tsKey, isJson }) =>\n\t\t\t\t\t\tisJson\n\t\t\t\t\t\t\t? sql`${sql.identifier(`${tableAlias}_${tsKey}`)}.${sql.identifier('data')}`\n\t\t\t\t\t\t\t: is(field, SQL.Aliased)\n\t\t\t\t\t\t\t? field.sql\n\t\t\t\t\t\t\t: field\n\t\t\t\t\t),\n\t\t\t\t\tsql`, `,\n\t\t\t\t)\n\t\t\t})`;\n\t\t\tif (is(nestedQueryRelation, V1.Many)) {\n\t\t\t\tfield = sql`coalesce(json_arrayagg(${field}), json_array())`;\n\t\t\t}\n\t\t\tconst nestedSelection = [{\n\t\t\t\tdbKey: 'data',\n\t\t\t\ttsKey: 'data',\n\t\t\t\tfield: field.as('data'),\n\t\t\t\tisJson: true,\n\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\tselection,\n\t\t\t}];\n\n\t\t\tconst needsSubquery = limit !== undefined || offset !== undefined || (orderBy?.length ?? 0) > 0;\n\n\t\t\tif (needsSubquery) {\n\t\t\t\tresult = this.buildSelectQuery({\n\t\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\t\tfields: {},\n\t\t\t\t\tfieldsFlat: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\tfield: sql.raw('*'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...(((orderBy?.length ?? 0) > 0)\n\t\t\t\t\t\t\t? [{\n\t\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\t\tfield: sql`row_number() over (order by ${sql.join(orderBy!, sql`, `)})`,\n\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t: []),\n\t\t\t\t\t],\n\t\t\t\t\twhere,\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset,\n\t\t\t\t\tsetOperators: [],\n\t\t\t\t});\n\n\t\t\t\twhere = undefined;\n\t\t\t\tlimit = undefined;\n\t\t\t\toffset = undefined;\n\t\t\t\torderBy = undefined;\n\t\t\t} else {\n\t\t\t\tresult = aliasedTable(table, tableAlias);\n\t\t\t}\n\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: is(result, MySqlTable) ? result : new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t} else {\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: selection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t}\n\n\t\tif (config !== true && config.comment !== undefined) {\n\t\t\tconst comment = sql.comment(config.comment);\n\t\t\tresult = sql`${result}${sql` ${comment}`.if(comment)}`;\n\t\t}\n\n\t\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n\n\t/** @deprecated */\n\t_buildRelationalQueryWithoutLateralSubqueries({\n\t\tfullSchema,\n\t\tschema,\n\t\ttableNamesMap,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\ttableAlias,\n\t\tnestedQueryRelation,\n\t\tjoinOn,\n\t}: {\n\t\tfullSchema: Record<string, unknown>;\n\t\tschema: V1.TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t\ttable: MySqlTable;\n\t\ttableConfig: V1.TableRelationalConfig;\n\t\tqueryConfig: true | V1.DBQueryConfigWithComment<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: V1.Relation;\n\t\tjoinOn?: SQL;\n\t}): V1.BuildRelationalQueryResult<MySqlTable, MySqlColumn> {\n\t\tlet selection: V1.BuildRelationalQueryResult<MySqlTable, MySqlColumn>['selection'] = [];\n\t\tlet limit, offset, orderBy: MySqlSelectConfig['orderBy'] = [], where;\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map((\n\t\t\t\t[key, value],\n\t\t\t) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as MySqlColumn, tableAlias),\n\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\tisJson: false,\n\t\t\t\tselection: [],\n\t\t\t}));\n\t\t} else {\n\t\t\tconst aliasedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]),\n\t\t\t);\n\n\t\t\tif (config.where) {\n\t\t\t\tconst whereSql = typeof config.where === 'function'\n\t\t\t\t\t? config.where(aliasedColumns, V1.getOperators())\n\t\t\t\t\t: config.where;\n\t\t\t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t\t\t}\n\n\t\t\tconst fieldsSelection: { tsKey: string; value: MySqlColumn | SQL.Aliased }[] = [];\n\t\t\tlet selectedColumns: string[] = [];\n\n\t\t\t// Figure out which columns to select\n\t\t\tif (config.columns) {\n\t\t\t\tlet isIncludeMode = false;\n\n\t\t\t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field in tableConfig.columns) {\n\t\t\t\t\t\tif (!isIncludeMode && value === true) {\n\t\t\t\t\t\t\tisIncludeMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectedColumns.push(field);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (selectedColumns.length > 0) {\n\t\t\t\t\tselectedColumns = isIncludeMode\n\t\t\t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t\t\t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Select all columns if selection is not specified\n\t\t\t\tselectedColumns = Object.keys(tableConfig.columns);\n\t\t\t}\n\n\t\t\tfor (const field of selectedColumns) {\n\t\t\t\tconst column = tableConfig.columns[field]! as MySqlColumn;\n\t\t\t\tfieldsSelection.push({ tsKey: field, value: column });\n\t\t\t}\n\n\t\t\tlet selectedRelations: {\n\t\t\t\ttsKey: string;\n\t\t\t\tqueryConfig: true | V1.DBQueryConfigWithComment<'many', false>;\n\t\t\t\trelation: V1.Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which V1.relations to select\n\t\t\tif (config.with) {\n\t\t\t\tselectedRelations = Object.entries(config.with)\n\t\t\t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t\t\t}\n\n\t\t\tlet extras;\n\n\t\t\t// Figure out which extras to select\n\t\t\tif (config.extras) {\n\t\t\t\textras = typeof config.extras === 'function'\n\t\t\t\t\t? config.extras(aliasedColumns, { sql })\n\t\t\t\t\t: config.extras;\n\t\t\t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t\t\t\t\tfieldsSelection.push({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Transform `fieldsSelection` into `selection`\n\t\t\t// `fieldsSelection` shouldn't be used after this point\n\t\t\tfor (const { tsKey, value } of fieldsSelection) {\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\t\tisJson: false,\n\t\t\t\t\tselection: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet orderByOrig = typeof config.orderBy === 'function'\n\t\t\t\t? config.orderBy(aliasedColumns, V1.getOrderByOperators())\n\t\t\t\t: config.orderBy ?? [];\n\t\t\tif (!Array.isArray(orderByOrig)) {\n\t\t\t\torderByOrig = [orderByOrig];\n\t\t\t}\n\t\t\torderBy = orderByOrig.map((orderByValue) => {\n\t\t\t\tif (is(orderByValue, Column)) {\n\t\t\t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as MySqlColumn;\n\t\t\t\t}\n\t\t\t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t\t\t});\n\n\t\t\tlimit = config.limit;\n\t\t\toffset = config.offset;\n\n\t\t\t// Process all V1.relations\n\t\t\tfor (\n\t\t\t\tconst {\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tqueryConfig: selectedRelationConfigValue,\n\t\t\t\t\trelation,\n\t\t\t\t} of selectedRelations\n\t\t\t) {\n\t\t\t\tconst normalizedRelation = V1.normalizeRelation(schema, tableNamesMap, relation);\n\t\t\t\tconst relationTableName = getTableUniqueName(relation.referencedTable);\n\t\t\t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t\t\t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t\t\t\tconst joinOn = and(\n\t\t\t\t\t...normalizedRelation.fields.map((field, i) =>\n\t\t\t\t\t\teq(\n\t\t\t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t\t\t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst builtRelation = this._buildRelationalQueryWithoutLateralSubqueries({\n\t\t\t\t\tfullSchema,\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\ttable: fullSchema[relationTableTsName] as MySqlTable,\n\t\t\t\t\ttableConfig: schema[relationTableTsName]!,\n\t\t\t\t\tqueryConfig: is(relation, V1.One)\n\t\t\t\t\t\t? (selectedRelationConfigValue === true\n\t\t\t\t\t\t\t? { limit: 1 }\n\t\t\t\t\t\t\t: { ...selectedRelationConfigValue, limit: 1 })\n\t\t\t\t\t\t: selectedRelationConfigValue,\n\t\t\t\t\ttableAlias: relationTableAlias,\n\t\t\t\t\tjoinOn,\n\t\t\t\t\tnestedQueryRelation: relation,\n\t\t\t\t});\n\t\t\t\tlet fieldSql = sql`(${builtRelation.sql})`;\n\t\t\t\tif (is(relation, V1.Many)) {\n\t\t\t\t\tfieldSql = sql`coalesce(${fieldSql}, json_array())`;\n\t\t\t\t}\n\t\t\t\tconst field = fieldSql.as(selectedRelationTsKey);\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: selectedRelationTsKey,\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tfield,\n\t\t\t\t\trelationTableTsKey: relationTableTsName,\n\t\t\t\t\tisJson: true,\n\t\t\t\t\tselection: builtRelation.selection,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (selection.length === 0) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage:\n\t\t\t\t\t`No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\"). You need to have at least one item in \"columns\", \"with\" or \"extras\". If you need to select all columns, omit the \"columns\" key or set it to undefined.`,\n\t\t\t});\n\t\t}\n\n\t\tlet result;\n\n\t\twhere = and(joinOn, where);\n\n\t\tif (nestedQueryRelation) {\n\t\t\tlet field = sql`json_array(${\n\t\t\t\tsql.join(\n\t\t\t\t\tselection.map(({ field }) =>\n\t\t\t\t\t\tis(field, MySqlColumn)\n\t\t\t\t\t\t\t? sql.identifier(this.casing.getColumnCasing(field))\n\t\t\t\t\t\t\t: is(field, SQL.Aliased)\n\t\t\t\t\t\t\t? field.sql\n\t\t\t\t\t\t\t: field\n\t\t\t\t\t),\n\t\t\t\t\tsql`, `,\n\t\t\t\t)\n\t\t\t})`;\n\t\t\tif (is(nestedQueryRelation, V1.Many)) {\n\t\t\t\tfield = sql`json_arrayagg(${field})`;\n\t\t\t}\n\t\t\tconst nestedSelection = [{\n\t\t\t\tdbKey: 'data',\n\t\t\t\ttsKey: 'data',\n\t\t\t\tfield,\n\t\t\t\tisJson: true,\n\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\tselection,\n\t\t\t}];\n\n\t\t\tconst needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;\n\n\t\t\tif (needsSubquery) {\n\t\t\t\tresult = this.buildSelectQuery({\n\t\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\t\tfields: {},\n\t\t\t\t\tfieldsFlat: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\tfield: sql.raw('*'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...(orderBy.length > 0)\n\t\t\t\t\t\t\t? [{\n\t\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\t\tfield: sql`row_number() over (order by ${sql.join(orderBy, sql`, `)})`,\n\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t: [],\n\t\t\t\t\t],\n\t\t\t\t\twhere,\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset,\n\t\t\t\t\tsetOperators: [],\n\t\t\t\t});\n\n\t\t\t\twhere = undefined;\n\t\t\t\tlimit = undefined;\n\t\t\t\toffset = undefined;\n\t\t\t\torderBy = undefined;\n\t\t\t} else {\n\t\t\t\tresult = aliasedTable(table, tableAlias);\n\t\t\t}\n\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: is(result, MySqlTable) ? result : new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t} else {\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: selection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t}\n\n\t\tif (config !== true && config.comment !== undefined) {\n\t\t\tconst comment = sql.comment(config.comment);\n\t\t\tresult = sql`${result}${sql` ${comment}`.if(comment)}`;\n\t\t}\n\n\t\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n\n\tprivate nestedSelectionerror() {\n\t\tthrow new DrizzleError({\n\t\t\tmessage: `Views with nested selections are not supported by the relational query builder`,\n\t\t});\n\t}\n\n\tprivate buildRqbColumn(table: Table | View, column: unknown, key: string) {\n\t\tif (is(column, Column)) {\n\t\t\tconst name = sql`${table}.${sql.identifier(this.casing.getColumnCasing(column))}`;\n\n\t\t\tswitch (column.columnType) {\n\t\t\t\tcase 'MySqlBinary':\n\t\t\t\tcase 'MySqlVarBinary':\n\t\t\t\tcase 'MySqlTime':\n\t\t\t\tcase 'MySqlDateTimeString':\n\t\t\t\tcase 'MySqlTimestampString':\n\t\t\t\tcase 'MySqlFloat':\n\t\t\t\tcase 'MySqlDecimal':\n\t\t\t\tcase 'MySqlDecimalNumber':\n\t\t\t\tcase 'MySqlDecimalBigInt':\n\t\t\t\tcase 'MySqlBigInt64':\n\t\t\t\tcase 'MySqlBigIntString': {\n\t\t\t\t\treturn sql`cast(${name} as char) as ${sql.identifier(key)}`;\n\t\t\t\t}\n\n\t\t\t\tcase 'MySqlBlob':\n\t\t\t\tcase 'MySqlBlobBuffer': {\n\t\t\t\t\treturn sql`to_base64(${name}) as ${sql.identifier(key)}`;\n\t\t\t\t}\n\n\t\t\t\tcase 'MySqlCustomColumn': {\n\t\t\t\t\treturn sql`${(<MySqlCustomColumn<any>> column).jsonSelectIdentifier(name, sql)} as ${sql.identifier(key)}`;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\treturn sql`${name} as ${sql.identifier(key)}`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sql`${table}.${\n\t\t\tis(column, SQL.Aliased)\n\t\t\t\t? sql.identifier(column.fieldAlias)\n\t\t\t\t: isSQLWrapper(column)\n\t\t\t\t? sql.identifier(key)\n\t\t\t\t: this.nestedSelectionerror()\n\t\t} as ${sql.identifier(key)}`;\n\t}\n\n\tprivate unwrapAllColumns = (table: Table | View, selection: BuildRelationalQueryResult['selection']) => {\n\t\treturn sql.join(\n\t\t\tObject.entries(table[TableColumns]).map(([k, v]) => {\n\t\t\t\tselection.push({\n\t\t\t\t\tkey: k,\n\t\t\t\t\tfield: v as Column | SQL | SQLWrapper | SQL.Aliased,\n\t\t\t\t});\n\n\t\t\t\treturn this.buildRqbColumn(table, v, k);\n\t\t\t}),\n\t\t\tsql`, `,\n\t\t);\n\t};\n\n\tprivate getSelectedTableColumns = (table: Table | View, columns: Record<string, boolean | undefined>) => {\n\t\tconst selectedColumns: ColumnWithTSName[] = [];\n\t\tconst columnContainer = table[TableColumns];\n\t\tconst entries = Object.entries(columns);\n\n\t\tlet colSelectionMode: boolean | undefined;\n\t\tfor (const [k, v] of entries) {\n\t\t\tif (v === undefined) continue;\n\t\t\tcolSelectionMode = colSelectionMode || v;\n\n\t\t\tif (v) {\n\t\t\t\tconst column = columnContainer[k]!;\n\n\t\t\t\tselectedColumns.push({\n\t\t\t\t\tcolumn: column as Column | SQL | SQLWrapper | SQL.Aliased,\n\t\t\t\t\ttsName: k,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (colSelectionMode === false) {\n\t\t\tfor (const [k, v] of Object.entries(columnContainer)) {\n\t\t\t\tif (columns[k] === false) continue;\n\n\t\t\t\tselectedColumns.push({\n\t\t\t\t\tcolumn: v as Column | SQL | SQLWrapper | SQL.Aliased | Table,\n\t\t\t\t\ttsName: k,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn selectedColumns;\n\t};\n\n\tprivate buildColumns = (\n\t\ttable: MySqlTable | MySqlView,\n\t\tselection: BuildRelationalQueryResult['selection'],\n\t\tparams?: DBQueryConfigWithComment<'many'>,\n\t) =>\n\t\tparams?.columns\n\t\t\t? (() => {\n\t\t\t\tconst columnIdentifiers: SQL[] = [];\n\n\t\t\t\tconst selectedColumns = this.getSelectedTableColumns(table, params.columns);\n\n\t\t\t\tfor (const { column, tsName } of selectedColumns) {\n\t\t\t\t\tcolumnIdentifiers.push(this.buildRqbColumn(table, column, tsName));\n\n\t\t\t\t\tselection.push({\n\t\t\t\t\t\tkey: tsName,\n\t\t\t\t\t\tfield: column,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn columnIdentifiers.length\n\t\t\t\t\t? sql.join(columnIdentifiers, sql`, `)\n\t\t\t\t\t: undefined;\n\t\t\t})()\n\t\t\t: this.unwrapAllColumns(table, selection);\n\n\tbuildRelationalQuery(\n\t\t{\n\t\t\tschema,\n\t\t\ttable,\n\t\t\ttableConfig,\n\t\t\tqueryConfig: config,\n\t\t\trelationWhere,\n\t\t\tmode,\n\t\t\terrorPath,\n\t\t\tdepth,\n\t\t\tisNestedMany,\n\t\t\tthroughJoin,\n\t\t}: {\n\t\t\tschema: TablesRelationalConfig;\n\t\t\ttable: MySqlTable | MySqlView;\n\t\t\ttableConfig: TableRelationalConfig;\n\t\t\tqueryConfig?: DBQueryConfigWithComment<'many'> | true;\n\t\t\trelationWhere?: SQL;\n\t\t\tmode: 'first' | 'many';\n\t\t\terrorPath?: string;\n\t\t\tdepth?: number;\n\t\t\tisNestedMany?: boolean;\n\t\t\tthroughJoin?: SQL;\n\t\t},\n\t): BuildRelationalQueryResult {\n\t\tconst selection: BuildRelationalQueryResult['selection'] = [];\n\t\tconst isSingle = mode === 'first';\n\t\tconst params = config === true ? undefined : config;\n\t\tconst currentPath = errorPath ?? '';\n\t\tconst currentDepth = depth ?? 0;\n\t\tif (!currentDepth) table = aliasedTable(table, `d${currentDepth}`);\n\n\t\tconst limit = isSingle ? 1 : params?.limit;\n\t\tconst offset = params?.offset;\n\n\t\tconst columns = this.buildColumns(table, selection, params);\n\n\t\tconst where: SQL | undefined = (params?.where && relationWhere)\n\t\t\t? and(\n\t\t\t\trelationsFilterToSQL(table, params.where, tableConfig.relations, schema, this.casing),\n\t\t\t\trelationWhere,\n\t\t\t)\n\t\t\t: params?.where\n\t\t\t? relationsFilterToSQL(table, params.where, tableConfig.relations, schema, this.casing)\n\t\t\t: relationWhere;\n\t\tconst order = params?.orderBy ? relationsOrderToSQL(table, params.orderBy) : undefined;\n\t\tconst extras = params?.extras ? relationExtrasToSQL(table, params.extras) : undefined;\n\t\tif (extras) selection.push(...extras.selection);\n\n\t\tconst selectionArr: SQL[] = columns ? [columns] : [];\n\n\t\tconst joins = params\n\t\t\t? (() => {\n\t\t\t\tconst { with: joins } = params as WithContainer;\n\t\t\t\tif (!joins) return;\n\n\t\t\t\tconst withEntries = Object.entries(joins).filter(([_, v]) => v);\n\t\t\t\tif (!withEntries.length) return;\n\n\t\t\t\treturn sql.join(\n\t\t\t\t\twithEntries.map(([k, join]) => {\n\t\t\t\t\t\tselectionArr.push(sql`${sql.identifier(k)}.${sql.identifier('r')} as ${sql.identifier(k)}`);\n\n\t\t\t\t\t\t// if (is(tableConfig.relations[k]!, AggregatedField)) {\n\t\t\t\t\t\t// \tconst relation = tableConfig.relations[k]!;\n\t\t\t\t\t\t// \trelation.onTable(table);\n\t\t\t\t\t\t// \tconst query = relation.getSQL();\n\n\t\t\t\t\t\t// \tselection.push({\n\t\t\t\t\t\t// \t\tkey: k,\n\t\t\t\t\t\t// \t\tfield: relation,\n\t\t\t\t\t\t// \t});\n\n\t\t\t\t\t\t// \treturn sql` left join lateral (${query}) as ${sql.identifier(k)} on true`;\n\t\t\t\t\t\t// }\n\n\t\t\t\t\t\tconst relation = tableConfig.relations[k]! as Relation;\n\t\t\t\t\t\tconst isSingle = is(relation, One);\n\t\t\t\t\t\tconst targetTable = aliasedTable(relation.targetTable, `d${currentDepth + 1}`);\n\t\t\t\t\t\tconst throughTable = relation.throughTable\n\t\t\t\t\t\t\t? aliasedTable(relation.throughTable, `tr${currentDepth}`)\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tconst { filter, joinCondition } = relationToSQL(\n\t\t\t\t\t\t\tthis.casing,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttable,\n\t\t\t\t\t\t\ttargetTable,\n\t\t\t\t\t\t\tthroughTable,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst throughJoin = throughTable\n\t\t\t\t\t\t\t? sql` inner join ${getTableAsAliasSQL(throughTable)} on ${joinCondition!}`\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\tconst innerQuery = this.buildRelationalQuery({\n\t\t\t\t\t\t\ttable: targetTable as MySqlTable,\n\t\t\t\t\t\t\tmode: isSingle ? 'first' : 'many',\n\t\t\t\t\t\t\tschema,\n\t\t\t\t\t\t\tqueryConfig: join as DBQueryConfigWithComment,\n\t\t\t\t\t\t\ttableConfig: schema[relation.targetTableName]!,\n\t\t\t\t\t\t\trelationWhere: filter,\n\t\t\t\t\t\t\terrorPath: `${currentPath.length ? `${currentPath}.` : ''}${k}`,\n\t\t\t\t\t\t\tdepth: currentDepth + 1,\n\t\t\t\t\t\t\tisNestedMany: !isSingle,\n\t\t\t\t\t\t\tthroughJoin,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tselection.push({\n\t\t\t\t\t\t\tfield: targetTable,\n\t\t\t\t\t\t\tkey: k,\n\t\t\t\t\t\t\tselection: innerQuery.selection,\n\t\t\t\t\t\t\tisArray: !isSingle,\n\t\t\t\t\t\t\tisOptional: ((relation as AnyOne).optional ?? false)\n\t\t\t\t\t\t\t\t|| (join !== true && !!(join as Exclude<typeof join, boolean | undefined>).where),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst jsonColumns = sql.join(\n\t\t\t\t\t\t\tinnerQuery.selection.map((s) => sql`${sql.raw(this.escapeString(s.key))}, ${sql.identifier(s.key)}`),\n\t\t\t\t\t\t\tsql`, `,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst joinQuery = sql` left join lateral(select ${sql`${\n\t\t\t\t\t\t\tisSingle\n\t\t\t\t\t\t\t\t? sql`json_object(${jsonColumns})`\n\t\t\t\t\t\t\t\t: sql`coalesce(json_arrayagg(json_object(${jsonColumns})), json_array())`\n\t\t\t\t\t\t} as ${sql.identifier('r')}`} from (${innerQuery.sql}) as ${sql.identifier('t')}) as ${\n\t\t\t\t\t\t\tsql.identifier(k)\n\t\t\t\t\t\t} on true`;\n\n\t\t\t\t\t\treturn joinQuery;\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t})()\n\t\t\t: undefined;\n\n\t\tif (extras?.sql) selectionArr.push(extras.sql);\n\t\tif (!selectionArr.length) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage: `No fields selected for table \"${tableConfig.name}\"${currentPath ? ` (\"${currentPath}\")` : ''}`,\n\t\t\t});\n\t\t}\n\t\t// json_arrayagg() ignores order by clause otherwise\n\t\tif (isNestedMany && order) {\n\t\t\tselectionArr.push(sql`row_number() over (order by ${order})`);\n\t\t}\n\t\tconst selectionSet = sql.join(selectionArr, sql`, `);\n\n\t\tconst query = sql`select ${selectionSet} from ${getTableAsAliasSQL(table)}${throughJoin}${sql`${joins}`.if(joins)}${\n\t\t\tsql` where ${where}`.if(where)\n\t\t}${sql` order by ${order}`.if(order)}${sql` limit ${limit}`.if(limit !== undefined)}${\n\t\t\tsql` offset ${offset}`.if(offset !== undefined)\n\t\t}${config !== true && config?.comment !== undefined ? sql` ${sql.comment(config.comment)}` : undefined}`;\n\n\t\treturn {\n\t\t\tsql: query,\n\t\t\tselection,\n\t\t};\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"dialect.cjs","names":["entityKind","CasingCache","sql","Table","SQL","MySqlColumn","Column","Subquery","MySqlViewBase","ViewBaseConfig","View","MySqlTable","Param","V1","DrizzleError","TableColumns","One"],"sources":["../../src/mysql-core/dialect.ts"],"sourcesContent":["import * as V1 from '~/_relations.ts';\nimport {\n\taliasedTable,\n\taliasedTableColumn,\n\tgetOriginalColumnFromAlias,\n\tmapColumnsInAliasedSQLToAlias,\n\tmapColumnsInSQLToAlias,\n} from '~/alias.ts';\nimport { CasingCache } from '~/casing.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError } from '~/errors.ts';\nimport type { MigrationConfig, MigrationMeta, MigratorInitFailResponse } from '~/migrator.ts';\nimport { getMigrationsToRun } from '~/migrator.utils.ts';\nimport type {\n\tAnyOne,\n\tBuildRelationalQueryResult,\n\tColumnWithTSName,\n\tDBQueryConfigWithComment,\n\tRelation,\n\tTableRelationalConfig,\n\tTablesRelationalConfig,\n\tWithContainer,\n} from '~/relations.ts';\nimport {\n\t// AggregatedField,\n\tgetTableAsAliasSQL,\n\tOne,\n\trelationExtrasToSQL,\n\trelationsFilterToSQL,\n\trelationsOrderToSQL,\n\trelationToSQL,\n} from '~/relations.ts';\nimport { and, eq } from '~/sql/expressions/index.ts';\nimport { isSQLWrapper, Param, SQL, sql, View } from '~/sql/sql.ts';\nimport type { Name, Placeholder, QueryWithTypings, SQLChunk, SQLWrapper } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { getTableName, getTableUniqueName, Table, TableColumns } from '~/table.ts';\nimport { upgradeIfNeeded } from '~/up-migrations/mysql.ts';\nimport { type Casing, orderSelectedFields, type UpdateSet } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { MySqlColumn } from './columns/common.ts';\nimport type { MySqlCustomColumn } from './columns/custom.ts';\nimport type { MySqlDeleteConfig } from './query-builders/delete.ts';\nimport type { MySqlInsertConfig } from './query-builders/insert.ts';\nimport type {\n\tAnyMySqlSelectQueryBuilder,\n\tMySqlSelectConfig,\n\tMySqlSelectJoinConfig,\n\tSelectedFieldsOrdered,\n} from './query-builders/select.types.ts';\nimport type { MySqlUpdateConfig } from './query-builders/update.ts';\nimport type { MySqlSession } from './session.ts';\nimport { MySqlTable } from './table.ts';\nimport { MySqlViewBase } from './view-base.ts';\nimport type { MySqlView } from './view.ts';\n\nexport interface MySqlDialectConfig {\n\tcasing?: Casing;\n\tescapeParam?: (num: number) => string;\n}\n\nexport class MySqlDialect {\n\tstatic readonly [entityKind]: string = 'MySqlDialect';\n\n\t/** @internal */\n\treadonly casing: CasingCache;\n\n\tconstructor(config?: MySqlDialectConfig) {\n\t\tthis.casing = new CasingCache(config?.casing);\n\n\t\tif (config?.escapeParam) {\n\t\t\tthis.escapeParam = config.escapeParam;\n\t\t}\n\t}\n\n\tasync migrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: MySqlSession,\n\t\tconfig: Omit<MigrationConfig, 'migrationsSchema'>,\n\t): Promise<void | MigratorInitFailResponse> {\n\t\tconst migrationsTable = config.migrationsTable ?? '__drizzle_migrations';\n\n\t\t// Detect DB version and upgrade table schema if needed\n\t\tconst { newDb } = await upgradeIfNeeded(migrationsTable, session, migrations);\n\n\t\tif (newDb) {\n\t\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash TEXT NOT NULL,\n\t\t\t\tcreated_at BIGINT,\n\t\t\t\tname TEXT,\n\t\t\t\tapplied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n\t\t\t)\n\t\t`;\n\t\t\tawait session.execute(migrationTableCreate);\n\t\t}\n\n\t\tconst dbMigrations = await session.all<{ id: number; hash: string; created_at: string; name: string | null }>(\n\t\t\tsql`select id, hash, created_at, name from ${sql.identifier(migrationsTable)}`,\n\t\t);\n\n\t\tif (typeof config === 'object' && config.init) {\n\t\t\tif (dbMigrations.length) {\n\t\t\t\treturn { exitCode: 'databaseMigrations' as const };\n\t\t\t}\n\n\t\t\tif (migrations.length > 1) {\n\t\t\t\treturn { exitCode: 'localMigrations' as const };\n\t\t\t}\n\n\t\t\tconst [migration] = migrations;\n\n\t\t\tif (!migration) return;\n\n\t\t\tawait session.execute(\n\t\t\t\tsql`insert into ${\n\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t} (\\`hash\\`, \\`created_at\\`, \\`name\\`) values(${migration.hash}, ${migration.folderMillis}, ${migration.name})`,\n\t\t\t);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst migrationsToRun = getMigrationsToRun({ localMigrations: migrations, dbMigrations });\n\t\tawait session.transaction(async (tx) => {\n\t\t\tfor (const migration of migrationsToRun) {\n\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\tawait tx.execute(sql.raw(stmt));\n\t\t\t\t}\n\t\t\t\tawait session.execute(\n\t\t\t\t\tsql`insert into ${\n\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t} (\\`hash\\`, \\`created_at\\`, \\`name\\`) values(${migration.hash}, ${migration.folderMillis}, ${migration.name})`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\n\tescapeName(name: string): string {\n\t\treturn `\\`${name}\\``;\n\t}\n\n\tescapeParam(_num: number): string {\n\t\treturn `?`;\n\t}\n\n\tescapeString(str: string): string {\n\t\treturn `'${str.replace(/'/g, \"''\")}'`;\n\t}\n\n\tprivate buildWithCTE(queries: Subquery[] | undefined): SQL | undefined {\n\t\tif (!queries?.length) return undefined;\n\n\t\tconst withSqlChunks = [sql`with `];\n\t\tfor (const [i, w] of queries.entries()) {\n\t\t\twithSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);\n\t\t\tif (i < queries.length - 1) {\n\t\t\t\twithSqlChunks.push(sql`, `);\n\t\t\t}\n\t\t}\n\t\twithSqlChunks.push(sql` `);\n\t\treturn sql.join(withSqlChunks);\n\t}\n\n\tbuildDeleteQuery({ table, where, returning, withList, limit, orderBy, comment }: MySqlDeleteConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}delete from ${table}${whereSql}${orderBySql}${limitSql}${returningSql}${\n\t\t\tcomment !== undefined ? sql` ${comment}` : undefined\n\t\t}`;\n\t}\n\n\tbuildUpdateSet(table: MySqlTable, set: UpdateSet): SQL {\n\t\tconst tableColumns = table[Table.Symbol.Columns];\n\n\t\tconst columnNames = Object.keys(tableColumns).filter((colName) =>\n\t\t\tset[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined\n\t\t);\n\n\t\tconst setLength = columnNames.length;\n\t\treturn sql.join(columnNames.flatMap((colName, i) => {\n\t\t\tconst col = tableColumns[colName]!;\n\n\t\t\tconst onUpdateFnResult = col.onUpdateFn?.();\n\t\t\tconst value = set[colName] ?? (is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col));\n\t\t\tconst res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;\n\n\t\t\tif (i < setLength - 1) {\n\t\t\t\treturn [res, sql.raw(', ')];\n\t\t\t}\n\t\t\treturn [res];\n\t\t}));\n\t}\n\n\tbuildUpdateQuery({ table, set, where, returning, withList, limit, orderBy, comment }: MySqlUpdateConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst setSql = this.buildUpdateSet(table, set);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}update ${table} set ${setSql}${whereSql}${orderBySql}${limitSql}${returningSql}${\n\t\t\tcomment !== undefined ? sql` ${comment}` : undefined\n\t\t}`;\n\t}\n\n\t/**\n\t * Builds selection SQL with provided fields/expressions\n\t *\n\t * Examples:\n\t *\n\t * `select <selection> from`\n\t *\n\t * `insert ... returning <selection>`\n\t *\n\t * If `isSingleTable` is true, then columns won't be prefixed with table name\n\t */\n\tprivate buildSelection(\n\t\tfields: SelectedFieldsOrdered,\n\t\t{ isSingleTable = false }: { isSingleTable?: boolean } = {},\n\t): SQL {\n\t\tconst columnsLen = fields.length;\n\n\t\tconst chunks = fields\n\t\t\t.flatMap(({ field }, i) => {\n\t\t\t\tconst chunk: SQLChunk[] = [];\n\n\t\t\t\tif (is(field, SQL.Aliased) && field.isSelectionField) {\n\t\t\t\t\tif (!isSingleTable && field.origin !== undefined) chunk.push(sql.identifier(field.origin), sql.raw('.'));\n\t\t\t\t\tchunk.push(sql.identifier(field.fieldAlias));\n\t\t\t\t} else if (is(field, SQL.Aliased) || is(field, SQL)) {\n\t\t\t\t\tconst query = is(field, SQL.Aliased) ? field.sql : field;\n\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tconst newSql = new SQL(\n\t\t\t\t\t\t\tquery.queryChunks.map((c) => {\n\t\t\t\t\t\t\t\tif (is(c, MySqlColumn)) {\n\t\t\t\t\t\t\t\t\treturn sql.identifier(this.casing.getColumnCasing(c));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn c;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tchunk.push(query.shouldInlineParams ? newSql.inlineParams() : newSql);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(query);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (is(field, SQL.Aliased)) {\n\t\t\t\t\t\tchunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Column)) {\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tfield.isAlias\n\t\t\t\t\t\t\t\t? sql`${sql.identifier(this.casing.getColumnCasing(getOriginalColumnFromAlias(field)))} as ${field}`\n\t\t\t\t\t\t\t\t: sql.identifier(this.casing.getColumnCasing(field)),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(field.isAlias ? sql`${getOriginalColumnFromAlias(field)} as ${field}` : field);\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Subquery)) {\n\t\t\t\t\tconst entries = Object.entries(field._.selectedFields) as [string, SQL.Aliased | Column | SQL][];\n\n\t\t\t\t\tif (entries.length === 1) {\n\t\t\t\t\t\tconst entry = entries[0]![1];\n\n\t\t\t\t\t\tconst fieldDecoder = is(entry, SQL)\n\t\t\t\t\t\t\t? entry.decoder\n\t\t\t\t\t\t\t: is(entry, Column)\n\t\t\t\t\t\t\t? { mapFromDriverValue: (v: any) => entry.mapFromDriverValue(v) }\n\t\t\t\t\t\t\t: entry.sql.decoder;\n\n\t\t\t\t\t\tif (fieldDecoder) {\n\t\t\t\t\t\t\tfield._.sql.decoder = fieldDecoder;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tchunk.push(field);\n\t\t\t\t}\n\n\t\t\t\tif (i < columnsLen - 1) {\n\t\t\t\t\tchunk.push(sql`, `);\n\t\t\t\t}\n\n\t\t\t\treturn chunk;\n\t\t\t});\n\n\t\treturn sql.join(chunks);\n\t}\n\n\tprivate buildLimit(limit: number | Placeholder | undefined): SQL | undefined {\n\t\treturn typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\t}\n\n\tprivate buildOrderBy(orderBy: (MySqlColumn | SQL | SQL.Aliased)[] | undefined): SQL | undefined {\n\t\treturn orderBy && orderBy.length > 0 ? sql` order by ${sql.join(orderBy, sql`, `)}` : undefined;\n\t}\n\n\tprivate buildIndex({\n\t\tindexes,\n\t\tindexFor,\n\t}: {\n\t\tindexes: string[] | undefined;\n\t\tindexFor: 'USE' | 'FORCE' | 'IGNORE';\n\t}): SQL | undefined {\n\t\treturn indexes && indexes.length > 0\n\t\t\t? sql` ${sql.raw(indexFor)} INDEX ${indexes.map((it) => sql.identifier(it))}`\n\t\t\t: undefined;\n\t}\n\n\tbuildSelectQuery(\n\t\t{\n\t\t\twithList,\n\t\t\tfields,\n\t\t\tfieldsFlat,\n\t\t\twhere,\n\t\t\thaving,\n\t\t\ttable,\n\t\t\tjoins,\n\t\t\torderBy,\n\t\t\tgroupBy,\n\t\t\tlimit,\n\t\t\toffset,\n\t\t\tlockingClause,\n\t\t\tdistinct,\n\t\t\tsetOperators,\n\t\t\tuseIndex,\n\t\t\tforceIndex,\n\t\t\tignoreIndex,\n\t\t\tcomment,\n\t\t}: MySqlSelectConfig,\n\t): SQL {\n\t\tconst fieldsList = fieldsFlat ?? orderSelectedFields<MySqlColumn>(fields);\n\t\tfor (const f of fieldsList) {\n\t\t\tif (\n\t\t\t\tis(f.field, Column)\n\t\t\t\t&& getTableName(f.field.table)\n\t\t\t\t\t!== (is(table, Subquery)\n\t\t\t\t\t\t? table._.alias\n\t\t\t\t\t\t: is(table, MySqlViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].name\n\t\t\t\t\t\t: is(table, SQL)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: getTableName(table))\n\t\t\t\t&& !((table) =>\n\t\t\t\t\tjoins?.some(({ alias }) =>\n\t\t\t\t\t\talias === (table[Table.Symbol.IsAlias] ? getTableName(table) : table[Table.Symbol.BaseName])\n\t\t\t\t\t))(f.field.table)\n\t\t\t) {\n\t\t\t\tconst tableName = getTableName(f.field.table);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Your \"${\n\t\t\t\t\t\tf.path.join('->')\n\t\t\t\t\t}\" field references a column \"${tableName}\".\"${f.field.name}\", but the table \"${tableName}\" is not part of the query! Did you forget to join it?`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst isSingleTable = !joins || joins.length === 0;\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst distinctSql = distinct ? sql` distinct` : undefined;\n\n\t\tconst selection = this.buildSelection(fieldsList, { isSingleTable });\n\n\t\tconst tableSql = (() => {\n\t\t\tif (is(table, Table) && table[Table.Symbol.IsAlias]) {\n\t\t\t\treturn sql`${table[Table.Symbol.Schema] ? sql`${sql.identifier(table[Table.Symbol.Schema]!)}.` : undefined}${\n\t\t\t\t\tsql.identifier(table[Table.Symbol.OriginalName])\n\t\t\t\t} ${sql.identifier(table[Table.Symbol.Name])}`;\n\t\t\t}\n\n\t\t\tif (is(table, View) && table[ViewBaseConfig].isAlias) {\n\t\t\t\tlet fullName = sql`${sql.identifier(table[ViewBaseConfig].originalName)}`;\n\t\t\t\tif (table[ViewBaseConfig].schema) {\n\t\t\t\t\tfullName = sql`${sql.identifier(table[ViewBaseConfig].schema)}.${fullName}`;\n\t\t\t\t}\n\t\t\t\treturn sql`${fullName} ${sql.identifier(table[ViewBaseConfig].name)}`;\n\t\t\t}\n\n\t\t\treturn table;\n\t\t})();\n\n\t\tconst joinsArray: SQL[] = [];\n\n\t\tif (joins) {\n\t\t\tfor (const [index, joinMeta] of joins.entries()) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t\tconst table = joinMeta.table;\n\t\t\t\tconst lateralSql = joinMeta.lateral ? sql` lateral` : undefined;\n\t\t\t\tconst onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;\n\n\t\t\t\tif (is(table, MySqlTable)) {\n\t\t\t\t\tconst tableName = table[MySqlTable.Symbol.Name];\n\t\t\t\t\tconst tableSchema = table[MySqlTable.Symbol.Schema];\n\t\t\t\t\tconst origTableName = table[MySqlTable.Symbol.OriginalName];\n\t\t\t\t\tconst alias = tableName === origTableName ? undefined : joinMeta.alias;\n\t\t\t\t\tconst useIndexSql = this.buildIndex({ indexes: joinMeta.useIndex, indexFor: 'USE' });\n\t\t\t\t\tconst forceIndexSql = this.buildIndex({ indexes: joinMeta.forceIndex, indexFor: 'FORCE' });\n\t\t\t\t\tconst ignoreIndexSql = this.buildIndex({ indexes: joinMeta.ignoreIndex, indexFor: 'IGNORE' });\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${\n\t\t\t\t\t\t\ttableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined\n\t\t\t\t\t\t}${sql.identifier(origTableName)}${useIndexSql}${forceIndexSql}${ignoreIndexSql}${\n\t\t\t\t\t\t\talias && sql` ${sql.identifier(alias)}`\n\t\t\t\t\t\t}${onSql}`,\n\t\t\t\t\t);\n\t\t\t\t} else if (is(table, View)) {\n\t\t\t\t\tconst viewName = table[ViewBaseConfig].name;\n\t\t\t\t\tconst viewSchema = table[ViewBaseConfig].schema;\n\t\t\t\t\tconst origViewName = table[ViewBaseConfig].originalName;\n\t\t\t\t\tconst alias = viewName === origViewName ? undefined : joinMeta.alias;\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${\n\t\t\t\t\t\t\tviewSchema ? sql`${sql.identifier(viewSchema)}.` : undefined\n\t\t\t\t\t\t}${sql.identifier(origViewName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${table}${onSql}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (index < joins.length - 1) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst joinsSql = sql.join(joinsArray);\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst havingSql = having ? sql` having ${having}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst groupBySql = groupBy && groupBy.length > 0 ? sql` group by ${sql.join(groupBy, sql`, `)}` : undefined;\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\tconst useIndexSql = this.buildIndex({ indexes: useIndex, indexFor: 'USE' });\n\n\t\tconst forceIndexSql = this.buildIndex({ indexes: forceIndex, indexFor: 'FORCE' });\n\n\t\tconst ignoreIndexSql = this.buildIndex({ indexes: ignoreIndex, indexFor: 'IGNORE' });\n\n\t\tlet lockingClausesSql;\n\t\tif (lockingClause) {\n\t\t\tconst { config, strength } = lockingClause;\n\t\t\tlockingClausesSql = sql` for ${sql.raw(strength)}`;\n\t\t\tif (config.noWait) {\n\t\t\t\tlockingClausesSql.append(sql` nowait`);\n\t\t\t} else if (config.skipLocked) {\n\t\t\t\tlockingClausesSql.append(sql` skip locked`);\n\t\t\t}\n\t\t}\n\n\t\tconst finalQuery =\n\t\t\tsql`${withSql}select${distinctSql} ${selection} from ${tableSql}${useIndexSql}${forceIndexSql}${ignoreIndexSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}${lockingClausesSql}${\n\t\t\t\tcomment !== undefined ? sql` ${comment}` : undefined\n\t\t\t}`;\n\n\t\tif (setOperators.length > 0) {\n\t\t\treturn this.buildSetOperations(finalQuery, setOperators);\n\t\t}\n\n\t\treturn finalQuery;\n\t}\n\n\tbuildSetOperations(leftSelect: SQL, setOperators: MySqlSelectConfig['setOperators']): SQL {\n\t\tconst [setOperator, ...rest] = setOperators;\n\n\t\tif (!setOperator) {\n\t\t\tthrow new Error('Cannot pass undefined values to any set operator');\n\t\t}\n\n\t\tif (rest.length === 0) {\n\t\t\treturn this.buildSetOperationQuery({ leftSelect, setOperator });\n\t\t}\n\n\t\t// Some recursive magic here\n\t\treturn this.buildSetOperations(\n\t\t\tthis.buildSetOperationQuery({ leftSelect, setOperator }),\n\t\t\trest,\n\t\t);\n\t}\n\n\tbuildSetOperationQuery({\n\t\tleftSelect,\n\t\tsetOperator: { type, isAll, rightSelect, limit, orderBy, offset },\n\t}: { leftSelect: SQL; setOperator: MySqlSelectConfig['setOperators'][number] }): SQL {\n\t\tconst leftChunk = sql`(${leftSelect.getSQL()}) `;\n\t\tconst rightChunk = sql`(${rightSelect.getSQL()})`;\n\n\t\tlet orderBySql;\n\t\tif (orderBy && orderBy.length > 0) {\n\t\t\tconst orderByValues: (SQL<unknown> | Name)[] = [];\n\n\t\t\t// The next bit is necessary because the sql operator replaces ${table.column} with `table`.`column`\n\t\t\t// which is invalid MySql syntax, Table from one of the SELECTs cannot be used in global ORDER clause\n\t\t\tfor (const orderByUnit of orderBy) {\n\t\t\t\tif (is(orderByUnit, MySqlColumn)) {\n\t\t\t\t\torderByValues.push(sql.identifier(this.casing.getColumnCasing(orderByUnit)));\n\t\t\t\t} else if (is(orderByUnit, SQL)) {\n\t\t\t\t\tfor (let i = 0; i < orderByUnit.queryChunks.length; i++) {\n\t\t\t\t\t\tconst chunk = orderByUnit.queryChunks[i];\n\n\t\t\t\t\t\tif (is(chunk, MySqlColumn)) {\n\t\t\t\t\t\t\torderByUnit.queryChunks[i] = sql.identifier(this.casing.getColumnCasing(chunk));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\torderByValues.push(sql`${orderByUnit}`);\n\t\t\t\t} else {\n\t\t\t\t\torderByValues.push(sql`${orderByUnit}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\torderBySql = sql` order by ${sql.join(orderByValues, sql`, `)} `;\n\t\t}\n\n\t\tconst limitSql = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\n\t\tconst operatorChunk = sql.raw(`${type} ${isAll ? 'all ' : ''}`);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\treturn sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;\n\t}\n\n\tbuildInsertQuery(\n\t\t{ table, values: valuesOrSelect, ignore, onConflict, select, comment }: MySqlInsertConfig,\n\t): { sql: SQL; generatedIds: Record<string, unknown>[] } {\n\t\t// const isSingleValue = values.length === 1;\n\t\tconst valuesSqlList: ((SQLChunk | SQL)[] | SQL)[] = [];\n\t\tconst columns: Record<string, MySqlColumn> = table[Table.Symbol.Columns];\n\t\tconst colEntries: [string, MySqlColumn][] = Object.entries(columns).filter(([_, col]) =>\n\t\t\t!col.shouldDisableInsert()\n\t\t);\n\n\t\tconst insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));\n\t\tconst generatedIdsResponse: Record<string, unknown>[] = [];\n\n\t\tif (select) {\n\t\t\tconst select = valuesOrSelect as AnyMySqlSelectQueryBuilder | SQL;\n\n\t\t\tif (is(select, SQL)) {\n\t\t\t\tvaluesSqlList.push(select);\n\t\t\t} else {\n\t\t\t\tvaluesSqlList.push(select.getSQL());\n\t\t\t}\n\t\t} else {\n\t\t\tconst values = valuesOrSelect as Record<string, Param | SQL>[];\n\t\t\tvaluesSqlList.push(sql.raw('values '));\n\n\t\t\tfor (const [valueIndex, value] of values.entries()) {\n\t\t\t\tconst generatedIds: Record<string, unknown> = {};\n\n\t\t\t\tconst valueList: (SQLChunk | SQL)[] = [];\n\t\t\t\tfor (const [fieldName, col] of colEntries) {\n\t\t\t\t\tconst colValue = value[fieldName];\n\t\t\t\t\tif (colValue === undefined || (is(colValue, Param) && colValue.value === undefined)) {\n\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\tif (col.defaultFn !== undefined) {\n\t\t\t\t\t\t\tconst defaultFnResult = col.defaultFn();\n\t\t\t\t\t\t\tgeneratedIds[fieldName] = defaultFnResult;\n\t\t\t\t\t\t\tconst defaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);\n\t\t\t\t\t\t\tvalueList.push(defaultValue);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (!col.default && col.onUpdateFn !== undefined) {\n\t\t\t\t\t\t\tconst onUpdateFnResult = col.onUpdateFn();\n\t\t\t\t\t\t\tconst newValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);\n\t\t\t\t\t\t\tvalueList.push(newValue);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvalueList.push(sql`default`);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (col.defaultFn && is(colValue, Param)) {\n\t\t\t\t\t\t\tgeneratedIds[fieldName] = colValue.value;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvalueList.push(colValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tgeneratedIdsResponse.push(generatedIds);\n\t\t\t\tvaluesSqlList.push(valueList);\n\t\t\t\tif (valueIndex < values.length - 1) {\n\t\t\t\t\tvaluesSqlList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst valuesSql = sql.join(valuesSqlList);\n\n\t\tconst ignoreSql = ignore ? sql` ignore` : undefined;\n\n\t\tconst onConflictSql = onConflict ? sql` on duplicate key ${onConflict}` : undefined;\n\n\t\treturn {\n\t\t\tsql: sql`insert${ignoreSql} into ${table} ${insertOrder} ${valuesSql}${onConflictSql}${\n\t\t\t\tcomment !== undefined ? sql` ${comment}` : undefined\n\t\t\t}`,\n\t\t\tgeneratedIds: generatedIdsResponse,\n\t\t};\n\t}\n\n\tsqlToQuery(sql: SQL, invokeSource?: 'indexes' | undefined): QueryWithTypings {\n\t\treturn sql.toQuery({\n\t\t\tcasing: this.casing,\n\t\t\tescapeName: this.escapeName,\n\t\t\tescapeParam: this.escapeParam,\n\t\t\tescapeString: this.escapeString,\n\t\t\tinvokeSource,\n\t\t});\n\t}\n\n\t/** @deprecated */\n\t_buildRelationalQuery({\n\t\tfullSchema,\n\t\tschema,\n\t\ttableNamesMap,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\ttableAlias,\n\t\tnestedQueryRelation,\n\t\tjoinOn,\n\t}: {\n\t\tfullSchema: Record<string, unknown>;\n\t\tschema: V1.TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t\ttable: MySqlTable;\n\t\ttableConfig: V1.TableRelationalConfig;\n\t\tqueryConfig: true | V1.DBQueryConfigWithComment<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: V1.Relation;\n\t\tjoinOn?: SQL;\n\t}): V1.BuildRelationalQueryResult<MySqlTable, MySqlColumn> {\n\t\tlet selection: V1.BuildRelationalQueryResult<MySqlTable, MySqlColumn>['selection'] = [];\n\t\tlet limit, offset, orderBy: MySqlSelectConfig['orderBy'], where;\n\t\tconst joins: MySqlSelectJoinConfig[] = [];\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map((\n\t\t\t\t[key, value],\n\t\t\t) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as MySqlColumn, tableAlias),\n\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\tisJson: false,\n\t\t\t\tselection: [],\n\t\t\t}));\n\t\t} else {\n\t\t\tconst aliasedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]),\n\t\t\t);\n\n\t\t\tif (config.where) {\n\t\t\t\tconst whereSql = typeof config.where === 'function'\n\t\t\t\t\t? config.where(aliasedColumns, V1.getOperators())\n\t\t\t\t\t: config.where;\n\t\t\t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t\t\t}\n\n\t\t\tconst fieldsSelection: { tsKey: string; value: MySqlColumn | SQL.Aliased }[] = [];\n\t\t\tlet selectedColumns: string[] = [];\n\n\t\t\t// Figure out which columns to select\n\t\t\tif (config.columns) {\n\t\t\t\tlet isIncludeMode = false;\n\n\t\t\t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field in tableConfig.columns) {\n\t\t\t\t\t\tif (!isIncludeMode && value === true) {\n\t\t\t\t\t\t\tisIncludeMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectedColumns.push(field);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (selectedColumns.length > 0) {\n\t\t\t\t\tselectedColumns = isIncludeMode\n\t\t\t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t\t\t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Select all columns if selection is not specified\n\t\t\t\tselectedColumns = Object.keys(tableConfig.columns);\n\t\t\t}\n\n\t\t\tfor (const field of selectedColumns) {\n\t\t\t\tconst column = tableConfig.columns[field]! as MySqlColumn;\n\t\t\t\tfieldsSelection.push({ tsKey: field, value: column });\n\t\t\t}\n\n\t\t\tlet selectedRelations: {\n\t\t\t\ttsKey: string;\n\t\t\t\tqueryConfig: true | V1.DBQueryConfigWithComment<'many', false>;\n\t\t\t\trelation: V1.Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which V1.relations to select\n\t\t\tif (config.with) {\n\t\t\t\tselectedRelations = Object.entries(config.with)\n\t\t\t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t\t\t}\n\n\t\t\tlet extras;\n\n\t\t\t// Figure out which extras to select\n\t\t\tif (config.extras) {\n\t\t\t\textras = typeof config.extras === 'function'\n\t\t\t\t\t? config.extras(aliasedColumns, { sql })\n\t\t\t\t\t: config.extras;\n\t\t\t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t\t\t\t\tfieldsSelection.push({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Transform `fieldsSelection` into `selection`\n\t\t\t// `fieldsSelection` shouldn't be used after this point\n\t\t\tfor (const { tsKey, value } of fieldsSelection) {\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\t\tisJson: false,\n\t\t\t\t\tselection: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet orderByOrig = typeof config.orderBy === 'function'\n\t\t\t\t? config.orderBy(aliasedColumns, V1.getOrderByOperators())\n\t\t\t\t: config.orderBy ?? [];\n\t\t\tif (!Array.isArray(orderByOrig)) {\n\t\t\t\torderByOrig = [orderByOrig];\n\t\t\t}\n\t\t\torderBy = orderByOrig.map((orderByValue) => {\n\t\t\t\tif (is(orderByValue, Column)) {\n\t\t\t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as MySqlColumn;\n\t\t\t\t}\n\t\t\t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t\t\t});\n\n\t\t\tlimit = config.limit;\n\t\t\toffset = config.offset;\n\n\t\t\t// Process all V1.relations\n\t\t\tfor (\n\t\t\t\tconst {\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tqueryConfig: selectedRelationConfigValue,\n\t\t\t\t\trelation,\n\t\t\t\t} of selectedRelations\n\t\t\t) {\n\t\t\t\tconst normalizedRelation = V1.normalizeRelation(schema, tableNamesMap, relation);\n\t\t\t\tconst relationTableName = getTableUniqueName(relation.referencedTable);\n\t\t\t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t\t\t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t\t\t\tconst joinOn = and(\n\t\t\t\t\t...normalizedRelation.fields.map((field, i) =>\n\t\t\t\t\t\teq(\n\t\t\t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t\t\t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst builtRelation = this._buildRelationalQuery({\n\t\t\t\t\tfullSchema,\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\ttable: fullSchema[relationTableTsName] as MySqlTable,\n\t\t\t\t\ttableConfig: schema[relationTableTsName]!,\n\t\t\t\t\tqueryConfig: is(relation, V1.One)\n\t\t\t\t\t\t? (selectedRelationConfigValue === true\n\t\t\t\t\t\t\t? { limit: 1 }\n\t\t\t\t\t\t\t: { ...selectedRelationConfigValue, limit: 1 })\n\t\t\t\t\t\t: selectedRelationConfigValue,\n\t\t\t\t\ttableAlias: relationTableAlias,\n\t\t\t\t\tjoinOn,\n\t\t\t\t\tnestedQueryRelation: relation,\n\t\t\t\t});\n\t\t\t\tconst field = sql`${sql.identifier(relationTableAlias)}.${sql.identifier('data')}`.as(selectedRelationTsKey);\n\t\t\t\tjoins.push({\n\t\t\t\t\ton: sql`true`,\n\t\t\t\t\ttable: new Subquery(builtRelation.sql as SQL, {}, relationTableAlias),\n\t\t\t\t\talias: relationTableAlias,\n\t\t\t\t\tjoinType: 'left',\n\t\t\t\t\tlateral: true,\n\t\t\t\t});\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: selectedRelationTsKey,\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tfield,\n\t\t\t\t\trelationTableTsKey: relationTableTsName,\n\t\t\t\t\tisJson: true,\n\t\t\t\t\tselection: builtRelation.selection,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (selection.length === 0) {\n\t\t\tthrow new DrizzleError({ message: `No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\")` });\n\t\t}\n\n\t\tlet result;\n\n\t\twhere = and(joinOn, where);\n\n\t\tif (nestedQueryRelation) {\n\t\t\tlet field = sql`json_array(${\n\t\t\t\tsql.join(\n\t\t\t\t\tselection.map(({ field, tsKey, isJson }) =>\n\t\t\t\t\t\tisJson\n\t\t\t\t\t\t\t? sql`${sql.identifier(`${tableAlias}_${tsKey}`)}.${sql.identifier('data')}`\n\t\t\t\t\t\t\t: is(field, SQL.Aliased)\n\t\t\t\t\t\t\t? field.sql\n\t\t\t\t\t\t\t: field\n\t\t\t\t\t),\n\t\t\t\t\tsql`, `,\n\t\t\t\t)\n\t\t\t})`;\n\t\t\tif (is(nestedQueryRelation, V1.Many)) {\n\t\t\t\tfield = sql`coalesce(json_arrayagg(${field}), json_array())`;\n\t\t\t}\n\t\t\tconst nestedSelection = [{\n\t\t\t\tdbKey: 'data',\n\t\t\t\ttsKey: 'data',\n\t\t\t\tfield: field.as('data'),\n\t\t\t\tisJson: true,\n\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\tselection,\n\t\t\t}];\n\n\t\t\tconst needsSubquery = limit !== undefined || offset !== undefined || (orderBy?.length ?? 0) > 0;\n\n\t\t\tif (needsSubquery) {\n\t\t\t\tresult = this.buildSelectQuery({\n\t\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\t\tfields: {},\n\t\t\t\t\tfieldsFlat: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\tfield: sql.raw('*'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...(((orderBy?.length ?? 0) > 0)\n\t\t\t\t\t\t\t? [{\n\t\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\t\tfield: sql`row_number() over (order by ${sql.join(orderBy!, sql`, `)})`,\n\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t: []),\n\t\t\t\t\t],\n\t\t\t\t\twhere,\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset,\n\t\t\t\t\tsetOperators: [],\n\t\t\t\t});\n\n\t\t\t\twhere = undefined;\n\t\t\t\tlimit = undefined;\n\t\t\t\toffset = undefined;\n\t\t\t\torderBy = undefined;\n\t\t\t} else {\n\t\t\t\tresult = aliasedTable(table, tableAlias);\n\t\t\t}\n\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: is(result, MySqlTable) ? result : new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t} else {\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: selection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t}\n\n\t\tif (config !== true && config.comment) {\n\t\t\tconst comment = sql.comment(config.comment);\n\t\t\tresult = comment ? sql`${result} ${comment}` : result;\n\t\t}\n\n\t\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n\n\t/** @deprecated */\n\t_buildRelationalQueryWithoutLateralSubqueries({\n\t\tfullSchema,\n\t\tschema,\n\t\ttableNamesMap,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\ttableAlias,\n\t\tnestedQueryRelation,\n\t\tjoinOn,\n\t}: {\n\t\tfullSchema: Record<string, unknown>;\n\t\tschema: V1.TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t\ttable: MySqlTable;\n\t\ttableConfig: V1.TableRelationalConfig;\n\t\tqueryConfig: true | V1.DBQueryConfigWithComment<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: V1.Relation;\n\t\tjoinOn?: SQL;\n\t}): V1.BuildRelationalQueryResult<MySqlTable, MySqlColumn> {\n\t\tlet selection: V1.BuildRelationalQueryResult<MySqlTable, MySqlColumn>['selection'] = [];\n\t\tlet limit, offset, orderBy: MySqlSelectConfig['orderBy'] = [], where;\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map((\n\t\t\t\t[key, value],\n\t\t\t) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as MySqlColumn, tableAlias),\n\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\tisJson: false,\n\t\t\t\tselection: [],\n\t\t\t}));\n\t\t} else {\n\t\t\tconst aliasedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]),\n\t\t\t);\n\n\t\t\tif (config.where) {\n\t\t\t\tconst whereSql = typeof config.where === 'function'\n\t\t\t\t\t? config.where(aliasedColumns, V1.getOperators())\n\t\t\t\t\t: config.where;\n\t\t\t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t\t\t}\n\n\t\t\tconst fieldsSelection: { tsKey: string; value: MySqlColumn | SQL.Aliased }[] = [];\n\t\t\tlet selectedColumns: string[] = [];\n\n\t\t\t// Figure out which columns to select\n\t\t\tif (config.columns) {\n\t\t\t\tlet isIncludeMode = false;\n\n\t\t\t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field in tableConfig.columns) {\n\t\t\t\t\t\tif (!isIncludeMode && value === true) {\n\t\t\t\t\t\t\tisIncludeMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectedColumns.push(field);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (selectedColumns.length > 0) {\n\t\t\t\t\tselectedColumns = isIncludeMode\n\t\t\t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t\t\t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Select all columns if selection is not specified\n\t\t\t\tselectedColumns = Object.keys(tableConfig.columns);\n\t\t\t}\n\n\t\t\tfor (const field of selectedColumns) {\n\t\t\t\tconst column = tableConfig.columns[field]! as MySqlColumn;\n\t\t\t\tfieldsSelection.push({ tsKey: field, value: column });\n\t\t\t}\n\n\t\t\tlet selectedRelations: {\n\t\t\t\ttsKey: string;\n\t\t\t\tqueryConfig: true | V1.DBQueryConfigWithComment<'many', false>;\n\t\t\t\trelation: V1.Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which V1.relations to select\n\t\t\tif (config.with) {\n\t\t\t\tselectedRelations = Object.entries(config.with)\n\t\t\t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t\t\t}\n\n\t\t\tlet extras;\n\n\t\t\t// Figure out which extras to select\n\t\t\tif (config.extras) {\n\t\t\t\textras = typeof config.extras === 'function'\n\t\t\t\t\t? config.extras(aliasedColumns, { sql })\n\t\t\t\t\t: config.extras;\n\t\t\t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t\t\t\t\tfieldsSelection.push({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Transform `fieldsSelection` into `selection`\n\t\t\t// `fieldsSelection` shouldn't be used after this point\n\t\t\tfor (const { tsKey, value } of fieldsSelection) {\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\t\tisJson: false,\n\t\t\t\t\tselection: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet orderByOrig = typeof config.orderBy === 'function'\n\t\t\t\t? config.orderBy(aliasedColumns, V1.getOrderByOperators())\n\t\t\t\t: config.orderBy ?? [];\n\t\t\tif (!Array.isArray(orderByOrig)) {\n\t\t\t\torderByOrig = [orderByOrig];\n\t\t\t}\n\t\t\torderBy = orderByOrig.map((orderByValue) => {\n\t\t\t\tif (is(orderByValue, Column)) {\n\t\t\t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as MySqlColumn;\n\t\t\t\t}\n\t\t\t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t\t\t});\n\n\t\t\tlimit = config.limit;\n\t\t\toffset = config.offset;\n\n\t\t\t// Process all V1.relations\n\t\t\tfor (\n\t\t\t\tconst {\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tqueryConfig: selectedRelationConfigValue,\n\t\t\t\t\trelation,\n\t\t\t\t} of selectedRelations\n\t\t\t) {\n\t\t\t\tconst normalizedRelation = V1.normalizeRelation(schema, tableNamesMap, relation);\n\t\t\t\tconst relationTableName = getTableUniqueName(relation.referencedTable);\n\t\t\t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t\t\t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t\t\t\tconst joinOn = and(\n\t\t\t\t\t...normalizedRelation.fields.map((field, i) =>\n\t\t\t\t\t\teq(\n\t\t\t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t\t\t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst builtRelation = this._buildRelationalQueryWithoutLateralSubqueries({\n\t\t\t\t\tfullSchema,\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\ttable: fullSchema[relationTableTsName] as MySqlTable,\n\t\t\t\t\ttableConfig: schema[relationTableTsName]!,\n\t\t\t\t\tqueryConfig: is(relation, V1.One)\n\t\t\t\t\t\t? (selectedRelationConfigValue === true\n\t\t\t\t\t\t\t? { limit: 1 }\n\t\t\t\t\t\t\t: { ...selectedRelationConfigValue, limit: 1 })\n\t\t\t\t\t\t: selectedRelationConfigValue,\n\t\t\t\t\ttableAlias: relationTableAlias,\n\t\t\t\t\tjoinOn,\n\t\t\t\t\tnestedQueryRelation: relation,\n\t\t\t\t});\n\t\t\t\tlet fieldSql = sql`(${builtRelation.sql})`;\n\t\t\t\tif (is(relation, V1.Many)) {\n\t\t\t\t\tfieldSql = sql`coalesce(${fieldSql}, json_array())`;\n\t\t\t\t}\n\t\t\t\tconst field = fieldSql.as(selectedRelationTsKey);\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: selectedRelationTsKey,\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tfield,\n\t\t\t\t\trelationTableTsKey: relationTableTsName,\n\t\t\t\t\tisJson: true,\n\t\t\t\t\tselection: builtRelation.selection,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (selection.length === 0) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage:\n\t\t\t\t\t`No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\"). You need to have at least one item in \"columns\", \"with\" or \"extras\". If you need to select all columns, omit the \"columns\" key or set it to undefined.`,\n\t\t\t});\n\t\t}\n\n\t\tlet result;\n\n\t\twhere = and(joinOn, where);\n\n\t\tif (nestedQueryRelation) {\n\t\t\tlet field = sql`json_array(${\n\t\t\t\tsql.join(\n\t\t\t\t\tselection.map(({ field }) =>\n\t\t\t\t\t\tis(field, MySqlColumn)\n\t\t\t\t\t\t\t? sql.identifier(this.casing.getColumnCasing(field))\n\t\t\t\t\t\t\t: is(field, SQL.Aliased)\n\t\t\t\t\t\t\t? field.sql\n\t\t\t\t\t\t\t: field\n\t\t\t\t\t),\n\t\t\t\t\tsql`, `,\n\t\t\t\t)\n\t\t\t})`;\n\t\t\tif (is(nestedQueryRelation, V1.Many)) {\n\t\t\t\tfield = sql`json_arrayagg(${field})`;\n\t\t\t}\n\t\t\tconst nestedSelection = [{\n\t\t\t\tdbKey: 'data',\n\t\t\t\ttsKey: 'data',\n\t\t\t\tfield,\n\t\t\t\tisJson: true,\n\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\tselection,\n\t\t\t}];\n\n\t\t\tconst needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;\n\n\t\t\tif (needsSubquery) {\n\t\t\t\tresult = this.buildSelectQuery({\n\t\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\t\tfields: {},\n\t\t\t\t\tfieldsFlat: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\tfield: sql.raw('*'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...(orderBy.length > 0)\n\t\t\t\t\t\t\t? [{\n\t\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\t\tfield: sql`row_number() over (order by ${sql.join(orderBy, sql`, `)})`,\n\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t: [],\n\t\t\t\t\t],\n\t\t\t\t\twhere,\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset,\n\t\t\t\t\tsetOperators: [],\n\t\t\t\t});\n\n\t\t\t\twhere = undefined;\n\t\t\t\tlimit = undefined;\n\t\t\t\toffset = undefined;\n\t\t\t\torderBy = undefined;\n\t\t\t} else {\n\t\t\t\tresult = aliasedTable(table, tableAlias);\n\t\t\t}\n\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: is(result, MySqlTable) ? result : new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t} else {\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: selection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t}\n\n\t\tif (config !== true && config.comment) {\n\t\t\tconst comment = sql.comment(config.comment);\n\t\t\tresult = comment ? sql`${result} ${comment}` : result;\n\t\t}\n\n\t\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n\n\tprivate nestedSelectionerror() {\n\t\tthrow new DrizzleError({\n\t\t\tmessage: `Views with nested selections are not supported by the relational query builder`,\n\t\t});\n\t}\n\n\tprivate buildRqbColumn(table: Table | View, column: unknown, key: string) {\n\t\tif (is(column, Column)) {\n\t\t\tconst name = sql`${table}.${sql.identifier(this.casing.getColumnCasing(column))}`;\n\n\t\t\tswitch (column.columnType) {\n\t\t\t\tcase 'MySqlBinary':\n\t\t\t\tcase 'MySqlVarBinary':\n\t\t\t\tcase 'MySqlTime':\n\t\t\t\tcase 'MySqlDateTimeString':\n\t\t\t\tcase 'MySqlTimestampString':\n\t\t\t\tcase 'MySqlFloat':\n\t\t\t\tcase 'MySqlDecimal':\n\t\t\t\tcase 'MySqlDecimalNumber':\n\t\t\t\tcase 'MySqlDecimalBigInt':\n\t\t\t\tcase 'MySqlBigInt64':\n\t\t\t\tcase 'MySqlBigIntString': {\n\t\t\t\t\treturn sql`cast(${name} as char) as ${sql.identifier(key)}`;\n\t\t\t\t}\n\n\t\t\t\tcase 'MySqlBlob':\n\t\t\t\tcase 'MySqlBlobBuffer': {\n\t\t\t\t\treturn sql`to_base64(${name}) as ${sql.identifier(key)}`;\n\t\t\t\t}\n\n\t\t\t\tcase 'MySqlCustomColumn': {\n\t\t\t\t\treturn sql`${(<MySqlCustomColumn<any>> column).jsonSelectIdentifier(name, sql)} as ${sql.identifier(key)}`;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\treturn sql`${name} as ${sql.identifier(key)}`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sql`${table}.${\n\t\t\tis(column, SQL.Aliased)\n\t\t\t\t? sql.identifier(column.fieldAlias)\n\t\t\t\t: isSQLWrapper(column)\n\t\t\t\t? sql.identifier(key)\n\t\t\t\t: this.nestedSelectionerror()\n\t\t} as ${sql.identifier(key)}`;\n\t}\n\n\tprivate unwrapAllColumns = (table: Table | View, selection: BuildRelationalQueryResult['selection']) => {\n\t\treturn sql.join(\n\t\t\tObject.entries(table[TableColumns]).map(([k, v]) => {\n\t\t\t\tselection.push({\n\t\t\t\t\tkey: k,\n\t\t\t\t\tfield: v as Column | SQL | SQLWrapper | SQL.Aliased,\n\t\t\t\t});\n\n\t\t\t\treturn this.buildRqbColumn(table, v, k);\n\t\t\t}),\n\t\t\tsql`, `,\n\t\t);\n\t};\n\n\tprivate getSelectedTableColumns = (table: Table | View, columns: Record<string, boolean | undefined>) => {\n\t\tconst selectedColumns: ColumnWithTSName[] = [];\n\t\tconst columnContainer = table[TableColumns];\n\t\tconst entries = Object.entries(columns);\n\n\t\tlet colSelectionMode: boolean | undefined;\n\t\tfor (const [k, v] of entries) {\n\t\t\tif (v === undefined) continue;\n\t\t\tcolSelectionMode = colSelectionMode || v;\n\n\t\t\tif (v) {\n\t\t\t\tconst column = columnContainer[k]!;\n\n\t\t\t\tselectedColumns.push({\n\t\t\t\t\tcolumn: column as Column | SQL | SQLWrapper | SQL.Aliased,\n\t\t\t\t\ttsName: k,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (colSelectionMode === false) {\n\t\t\tfor (const [k, v] of Object.entries(columnContainer)) {\n\t\t\t\tif (columns[k] === false) continue;\n\n\t\t\t\tselectedColumns.push({\n\t\t\t\t\tcolumn: v as Column | SQL | SQLWrapper | SQL.Aliased | Table,\n\t\t\t\t\ttsName: k,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn selectedColumns;\n\t};\n\n\tprivate buildColumns = (\n\t\ttable: MySqlTable | MySqlView,\n\t\tselection: BuildRelationalQueryResult['selection'],\n\t\tparams?: DBQueryConfigWithComment<'many'>,\n\t) =>\n\t\tparams?.columns\n\t\t\t? (() => {\n\t\t\t\tconst columnIdentifiers: SQL[] = [];\n\n\t\t\t\tconst selectedColumns = this.getSelectedTableColumns(table, params.columns);\n\n\t\t\t\tfor (const { column, tsName } of selectedColumns) {\n\t\t\t\t\tcolumnIdentifiers.push(this.buildRqbColumn(table, column, tsName));\n\n\t\t\t\t\tselection.push({\n\t\t\t\t\t\tkey: tsName,\n\t\t\t\t\t\tfield: column,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn columnIdentifiers.length\n\t\t\t\t\t? sql.join(columnIdentifiers, sql`, `)\n\t\t\t\t\t: undefined;\n\t\t\t})()\n\t\t\t: this.unwrapAllColumns(table, selection);\n\n\tbuildRelationalQuery(\n\t\t{\n\t\t\tschema,\n\t\t\ttable,\n\t\t\ttableConfig,\n\t\t\tqueryConfig: config,\n\t\t\trelationWhere,\n\t\t\tmode,\n\t\t\terrorPath,\n\t\t\tdepth,\n\t\t\tisNestedMany,\n\t\t\tthroughJoin,\n\t\t}: {\n\t\t\tschema: TablesRelationalConfig;\n\t\t\ttable: MySqlTable | MySqlView;\n\t\t\ttableConfig: TableRelationalConfig;\n\t\t\tqueryConfig?: DBQueryConfigWithComment<'many'> | true;\n\t\t\trelationWhere?: SQL;\n\t\t\tmode: 'first' | 'many';\n\t\t\terrorPath?: string;\n\t\t\tdepth?: number;\n\t\t\tisNestedMany?: boolean;\n\t\t\tthroughJoin?: SQL;\n\t\t},\n\t): BuildRelationalQueryResult {\n\t\tconst selection: BuildRelationalQueryResult['selection'] = [];\n\t\tconst isSingle = mode === 'first';\n\t\tconst params = config === true ? undefined : config;\n\t\tconst currentPath = errorPath ?? '';\n\t\tconst currentDepth = depth ?? 0;\n\t\tif (!currentDepth) table = aliasedTable(table, `d${currentDepth}`);\n\n\t\tconst limit = isSingle ? 1 : params?.limit;\n\t\tconst offset = params?.offset;\n\n\t\tconst columns = this.buildColumns(table, selection, params);\n\n\t\tconst where: SQL | undefined = (params?.where && relationWhere)\n\t\t\t? and(\n\t\t\t\trelationsFilterToSQL(table, params.where, tableConfig.relations, schema, this.casing),\n\t\t\t\trelationWhere,\n\t\t\t)\n\t\t\t: params?.where\n\t\t\t? relationsFilterToSQL(table, params.where, tableConfig.relations, schema, this.casing)\n\t\t\t: relationWhere;\n\t\tconst order = params?.orderBy ? relationsOrderToSQL(table, params.orderBy) : undefined;\n\t\tconst extras = params?.extras ? relationExtrasToSQL(table, params.extras) : undefined;\n\t\tif (extras) selection.push(...extras.selection);\n\n\t\tconst selectionArr: SQL[] = columns ? [columns] : [];\n\n\t\tconst joins = params\n\t\t\t? (() => {\n\t\t\t\tconst { with: joins } = params as WithContainer;\n\t\t\t\tif (!joins) return;\n\n\t\t\t\tconst withEntries = Object.entries(joins).filter(([_, v]) => v);\n\t\t\t\tif (!withEntries.length) return;\n\n\t\t\t\treturn sql.join(\n\t\t\t\t\twithEntries.map(([k, join]) => {\n\t\t\t\t\t\tselectionArr.push(sql`${sql.identifier(k)}.${sql.identifier('r')} as ${sql.identifier(k)}`);\n\n\t\t\t\t\t\t// if (is(tableConfig.relations[k]!, AggregatedField)) {\n\t\t\t\t\t\t// \tconst relation = tableConfig.relations[k]!;\n\t\t\t\t\t\t// \trelation.onTable(table);\n\t\t\t\t\t\t// \tconst query = relation.getSQL();\n\n\t\t\t\t\t\t// \tselection.push({\n\t\t\t\t\t\t// \t\tkey: k,\n\t\t\t\t\t\t// \t\tfield: relation,\n\t\t\t\t\t\t// \t});\n\n\t\t\t\t\t\t// \treturn sql` left join lateral (${query}) as ${sql.identifier(k)} on true`;\n\t\t\t\t\t\t// }\n\n\t\t\t\t\t\tconst relation = tableConfig.relations[k]! as Relation;\n\t\t\t\t\t\tconst isSingle = is(relation, One);\n\t\t\t\t\t\tconst targetTable = aliasedTable(relation.targetTable, `d${currentDepth + 1}`);\n\t\t\t\t\t\tconst throughTable = relation.throughTable\n\t\t\t\t\t\t\t? aliasedTable(relation.throughTable, `tr${currentDepth}`)\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tconst { filter, joinCondition } = relationToSQL(\n\t\t\t\t\t\t\tthis.casing,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttable,\n\t\t\t\t\t\t\ttargetTable,\n\t\t\t\t\t\t\tthroughTable,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst throughJoin = throughTable\n\t\t\t\t\t\t\t? sql` inner join ${getTableAsAliasSQL(throughTable)} on ${joinCondition!}`\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\tconst innerQuery = this.buildRelationalQuery({\n\t\t\t\t\t\t\ttable: targetTable as MySqlTable,\n\t\t\t\t\t\t\tmode: isSingle ? 'first' : 'many',\n\t\t\t\t\t\t\tschema,\n\t\t\t\t\t\t\tqueryConfig: join as DBQueryConfigWithComment,\n\t\t\t\t\t\t\ttableConfig: schema[relation.targetTableName]!,\n\t\t\t\t\t\t\trelationWhere: filter,\n\t\t\t\t\t\t\terrorPath: `${currentPath.length ? `${currentPath}.` : ''}${k}`,\n\t\t\t\t\t\t\tdepth: currentDepth + 1,\n\t\t\t\t\t\t\tisNestedMany: !isSingle,\n\t\t\t\t\t\t\tthroughJoin,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tselection.push({\n\t\t\t\t\t\t\tfield: targetTable,\n\t\t\t\t\t\t\tkey: k,\n\t\t\t\t\t\t\tselection: innerQuery.selection,\n\t\t\t\t\t\t\tisArray: !isSingle,\n\t\t\t\t\t\t\tisOptional: ((relation as AnyOne).optional ?? false)\n\t\t\t\t\t\t\t\t|| (join !== true && !!(join as Exclude<typeof join, boolean | undefined>).where),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst jsonColumns = sql.join(\n\t\t\t\t\t\t\tinnerQuery.selection.map((s) => sql`${sql.raw(this.escapeString(s.key))}, ${sql.identifier(s.key)}`),\n\t\t\t\t\t\t\tsql`, `,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst joinQuery = sql` left join lateral(select ${sql`${\n\t\t\t\t\t\t\tisSingle\n\t\t\t\t\t\t\t\t? sql`json_object(${jsonColumns})`\n\t\t\t\t\t\t\t\t: sql`coalesce(json_arrayagg(json_object(${jsonColumns})), json_array())`\n\t\t\t\t\t\t} as ${sql.identifier('r')}`} from (${innerQuery.sql}) as ${sql.identifier('t')}) as ${\n\t\t\t\t\t\t\tsql.identifier(k)\n\t\t\t\t\t\t} on true`;\n\n\t\t\t\t\t\treturn joinQuery;\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t})()\n\t\t\t: undefined;\n\n\t\tif (extras?.sql) selectionArr.push(extras.sql);\n\t\tif (!selectionArr.length) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage: `No fields selected for table \"${tableConfig.name}\"${currentPath ? ` (\"${currentPath}\")` : ''}`,\n\t\t\t});\n\t\t}\n\t\t// json_arrayagg() ignores order by clause otherwise\n\t\tif (isNestedMany && order) {\n\t\t\tselectionArr.push(sql`row_number() over (order by ${order})`);\n\t\t}\n\t\tconst selectionSet = sql.join(selectionArr, sql`, `);\n\t\tconst comment = config !== true && config?.comment ? sql.comment(config.comment) : undefined;\n\n\t\tconst query = sql`select ${selectionSet} from ${getTableAsAliasSQL(table)}${throughJoin}${\n\t\t\tjoins ? sql`${joins}` : undefined\n\t\t}${where ? sql` where ${where}` : undefined}${order ? sql` order by ${order}` : undefined}${\n\t\t\tlimit !== undefined ? sql` limit ${limit}` : undefined\n\t\t}${offset !== undefined ? sql` offset ${offset}` : undefined}${comment ? sql` ${comment}` : undefined}`;\n\n\t\treturn {\n\t\t\tsql: query,\n\t\t\tselection,\n\t\t};\n\t}\n}\n"],"mappings":"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"}
@@ -168,7 +168,7 @@ var MySqlDialect = class {
168
168
  const distinctSql = distinct ? sql` distinct` : void 0;
169
169
  const selection = this.buildSelection(fieldsList, { isSingleTable });
170
170
  const tableSql = (() => {
171
- 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])}`;
171
+ if (is(table, Table) && table[Table.Symbol.IsAlias]) return sql`${table[Table.Symbol.Schema] ? sql`${sql.identifier(table[Table.Symbol.Schema])}.` : void 0}${sql.identifier(table[Table.Symbol.OriginalName])} ${sql.identifier(table[Table.Symbol.Name])}`;
172
172
  if (is(table, View) && table[ViewBaseConfig].isAlias) {
173
173
  let fullName = sql`${sql.identifier(table[ViewBaseConfig].originalName)}`;
174
174
  if (table[ViewBaseConfig].schema) fullName = sql`${sql.identifier(table[ViewBaseConfig].schema)}.${fullName}`;
@@ -494,9 +494,9 @@ var MySqlDialect = class {
494
494
  orderBy,
495
495
  setOperators: []
496
496
  });
497
- if (config !== true && config.comment !== void 0) {
497
+ if (config !== true && config.comment) {
498
498
  const comment = sql.comment(config.comment);
499
- result = sql`${result}${sql` ${comment}`.if(comment)}`;
499
+ result = comment ? sql`${result} ${comment}` : result;
500
500
  }
501
501
  return {
502
502
  tableTsKey: tableConfig.tsName,
@@ -665,9 +665,9 @@ var MySqlDialect = class {
665
665
  orderBy,
666
666
  setOperators: []
667
667
  });
668
- if (config !== true && config.comment !== void 0) {
668
+ if (config !== true && config.comment) {
669
669
  const comment = sql.comment(config.comment);
670
- result = sql`${result}${sql` ${comment}`.if(comment)}`;
670
+ result = comment ? sql`${result} ${comment}` : result;
671
671
  }
672
672
  return {
673
673
  tableTsKey: tableConfig.tsName,
@@ -801,8 +801,10 @@ var MySqlDialect = class {
801
801
  if (extras?.sql) selectionArr.push(extras.sql);
802
802
  if (!selectionArr.length) throw new DrizzleError({ message: `No fields selected for table "${tableConfig.name}"${currentPath ? ` ("${currentPath}")` : ""}` });
803
803
  if (isNestedMany && order) selectionArr.push(sql`row_number() over (order by ${order})`);
804
+ const selectionSet = sql.join(selectionArr, sql`, `);
805
+ const comment = config !== true && config?.comment ? sql.comment(config.comment) : void 0;
804
806
  return {
805
- sql: sql`select ${sql.join(selectionArr, sql`, `)} from ${getTableAsAliasSQL(table)}${throughJoin}${sql`${joins}`.if(joins)}${sql` where ${where}`.if(where)}${sql` order by ${order}`.if(order)}${sql` limit ${limit}`.if(limit !== void 0)}${sql` offset ${offset}`.if(offset !== void 0)}${config !== true && config?.comment !== void 0 ? sql` ${sql.comment(config.comment)}` : void 0}`,
807
+ sql: sql`select ${selectionSet} from ${getTableAsAliasSQL(table)}${throughJoin}${joins ? sql`${joins}` : void 0}${where ? sql` where ${where}` : void 0}${order ? sql` order by ${order}` : void 0}${limit !== void 0 ? sql` limit ${limit}` : void 0}${offset !== void 0 ? sql` offset ${offset}` : void 0}${comment ? sql` ${comment}` : void 0}`,
806
808
  selection
807
809
  };
808
810
  }