{"version":3,"file":"dialect.cjs","names":["entityKind","makeJitQueryMapper","makeDefaultQueryMapper","sql","StringChunk","SQL","Table","CockroachTable","Subquery","Column","View","ViewBaseConfig","CockroachViewBase","CockroachColumn","Param","V1","DrizzleError"],"sources":["../../src/cockroach-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 { CockroachColumn } from '~/cockroach-core/columns/index.ts';\nimport type {\n\tAnyCockroachSelectQueryBuilder,\n\tCockroachDeleteConfig,\n\tCockroachInsertConfig,\n\tCockroachSelectJoinConfig,\n\tCockroachUpdateConfig,\n} from '~/cockroach-core/query-builders/index.ts';\nimport type { CockroachSelectConfig, SelectedFieldsOrdered } from '~/cockroach-core/query-builders/select.types.ts';\nimport { CockroachTable } from '~/cockroach-core/table.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 { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport { and, eq, View } from '~/sql/index.ts';\nimport { type Name, Param, type Query, SQL, sql, type SQLChunk, StringChunk } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { getTableName, getTableUniqueName, Table } from '~/table.ts';\nimport { upgradeIfNeeded } from '~/up-migrations/cockroach.ts';\nimport { makeDefaultQueryMapper, makeJitQueryMapper, type RowsMapperGenerator, type UpdateSet } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { CockroachSession } from './session.ts';\nimport { CockroachViewBase } from './view-base.ts';\nimport type { CockroachMaterializedView } from './view.ts';\n\nexport interface CockroachDialectConfig {\n\tuseJitMappers?: boolean;\n}\n\nexport class CockroachDialect {\n\tstatic readonly [entityKind]: string = 'CockroachDialect';\n\n\treadonly mapperGenerators: {\n\t\trows: RowsMapperGenerator;\n\t};\n\n\tconstructor(config?: CockroachDialectConfig) {\n\t\tthis.mapperGenerators = {\n\t\t\trows: config?.useJitMappers ? makeJitQueryMapper : makeDefaultQueryMapper,\n\t\t};\n\t}\n\n\tasync migrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: CockroachSession,\n\t\tconfig: string | MigrationConfig,\n\t): Promise<void | MigratorInitFailResponse> {\n\t\tconst migrationsTable = typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: (config.migrationsTable ?? '__drizzle_migrations');\n\t\tconst migrationsSchema = typeof config === 'string'\n\t\t\t? 'drizzle'\n\t\t\t: (config.migrationsSchema ?? 'drizzle');\n\n\t\tawait session.execute(\n\t\t\tsql`CREATE SCHEMA IF NOT EXISTS ${sql.identifier(migrationsSchema)}`,\n\t\t);\n\n\t\tconst { newDb } = await upgradeIfNeeded(\n\t\t\tmigrationsSchema,\n\t\t\tmigrationsTable,\n\t\t\tsession,\n\t\t\tmigrations,\n\t\t);\n\n\t\tif (newDb) {\n\t\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)} (\n\t\t\t\tid INT GENERATED ALWAYS AS IDENTITY,\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 with time zone DEFAULT now()\n\t\t\t)\n\t\t`;\n\n\t\t\tawait session.execute(migrationTableCreate);\n\t\t}\n\n\t\tconst dbMigrations = await session.objects<{\n\t\t\tid: number;\n\t\t\thash: string;\n\t\t\tcreated_at: string;\n\t\t\tname: string | null;\n\t\t}>(\n\t\t\tsql`select id, hash, created_at, name from ${sql.identifier(migrationsSchema)}.${\n\t\t\t\tsql.identifier(\n\t\t\t\t\tmigrationsTable,\n\t\t\t\t)\n\t\t\t}`,\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 ${sql.identifier(migrationsSchema)}.${\n\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\tmigrationsTable,\n\t\t\t\t\t)\n\t\t\t\t} (\"hash\", \"created_at\", \"name\") \n\t\t\t\tvalues (${migration.hash}, ${migration.folderMillis}, ${migration.name})`,\n\t\t\t);\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst migrationsToRun = getMigrationsToRun({\n\t\t\tlocalMigrations: migrations,\n\t\t\tdbMigrations,\n\t\t});\n\t\tawait session.transaction(async (tx) => {\n\t\t\tfor await (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 tx.execute(\n\t\t\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\tmigrationsTable,\n\t\t\t\t\t\t)\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.replace(/\"/g, '\"\"')}\"`;\n\t}\n\n\tescapeParam(num: number): string {\n\t\treturn `$${num + 1}`;\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 queriesLen = queries.length;\n\t\tconst withSqlChunks: SQLChunk[] = new Array(queriesLen + 1);\n\t\tlet writeIdx = 0;\n\t\twithSqlChunks[writeIdx++] = new StringChunk('with ');\n\n\t\tfor (let i = 0; i < queriesLen; ++i) {\n\t\t\tconst w = queries[i]!;\n\t\t\twithSqlChunks[writeIdx++] = (i < queriesLen - 1)\n\t\t\t\t? sql`${sql.identifier(w._.alias)} as (${w._.sql}), `\n\t\t\t\t: sql`${sql.identifier(w._.alias)} as (${w._.sql}) `;\n\t\t}\n\n\t\treturn new SQL(withSqlChunks);\n\t}\n\n\tbuildDeleteQuery({\n\t\ttable,\n\t\twhere,\n\t\treturning,\n\t\twithList,\n\t}: CockroachDeleteConfig): 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, table })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\treturn sql`${withSql}delete from ${table}${whereSql}${returningSql}`;\n\t}\n\n\tbuildUpdateSet(table: CockroachTable, set: UpdateSet): SQL {\n\t\tconst tableColumns = table[Table.Symbol.Columns];\n\n\t\tconst columnNames = Object.keys(tableColumns).filter(\n\t\t\t(colName) =>\n\t\t\t\tset[colName] !== undefined\n\t\t\t\t|| tableColumns[colName]?.onUpdateFn !== undefined,\n\t\t);\n\n\t\tconst setLength = columnNames.length;\n\t\tconst setArr: SQLChunk[] = new Array(setLength);\n\n\t\tfor (let i = 0; i < columnNames.length; ++i) {\n\t\t\tconst colName = columnNames[i]!;\n\t\t\tconst col = tableColumns[colName]!;\n\n\t\t\tlet value;\n\t\t\tif (set[colName] !== undefined) {\n\t\t\t\tvalue = set[colName];\n\t\t\t} else {\n\t\t\t\tconst updateRes = col.onUpdateFn?.();\n\t\t\t\tvalue = is(updateRes, SQL) ? updateRes : sql.param(updateRes, col);\n\t\t\t}\n\n\t\t\tsetArr[i] = i < setLength - 1\n\t\t\t\t? sql`${sql.identifier(col.name)} = ${value}, `\n\t\t\t\t: sql`${sql.identifier(col.name)} = ${value}`;\n\t\t}\n\n\t\treturn new SQL(setArr);\n\t}\n\n\tbuildUpdateQuery({\n\t\ttable,\n\t\tset,\n\t\twhere,\n\t\treturning,\n\t\twithList,\n\t\tfrom,\n\t\tjoins,\n\t}: CockroachUpdateConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst tableName = table[CockroachTable.Symbol.Name];\n\t\tconst tableSchema = table[CockroachTable.Symbol.Schema];\n\t\tconst origTableName = table[CockroachTable.Symbol.OriginalName];\n\t\tconst alias = tableName === origTableName ? undefined : tableName;\n\t\tconst tableSql = sql`${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${\n\t\t\tsql.identifier(\n\t\t\t\torigTableName,\n\t\t\t)\n\t\t}${alias && sql` ${sql.identifier(alias)}`}`;\n\n\t\tconst setSql = this.buildUpdateSet(table, set);\n\n\t\tconst fromSql = from && new SQL([new StringChunk(' from '), this.buildFromTable(from)]);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: !from, table })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\treturn sql`${withSql}update ${tableSql} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}`;\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, table }: {\n\t\t\tisSingleTable?: boolean;\n\t\t\ttable?: CockroachTable | CockroachViewBase | SQL | Subquery;\n\t\t} = {},\n\t): SQL {\n\t\tconst { length: columnsLen } = fields;\n\t\tconst chunks: SQLChunk[] = [];\n\t\tconst tableName = table\n\t\t\t? is(table, SQL) || is(table, Subquery)\n\t\t\t\t? undefined\n\t\t\t\t: (table[Table.Symbol.IsAlias] || table[Table.Symbol.Schema] === undefined\n\t\t\t\t\t? table[Table.Symbol.Name]\n\t\t\t\t\t: `${table[Table.Symbol.Schema]}.${table[Table.Symbol.Name]}`)\n\t\t\t: undefined;\n\n\t\tfor (let i = 0; i < columnsLen; ++i) {\n\t\t\tconst { field, fieldType } = fields[i]!;\n\n\t\t\tswitch (fieldType) {\n\t\t\t\tcase 'Column': {\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunks.push(\n\t\t\t\t\t\t\tfield.isAlias\n\t\t\t\t\t\t\t\t? sql`${sql.identifier(getOriginalColumnFromAlias(field).name)} as ${field}`\n\t\t\t\t\t\t\t\t: sql.identifier(field.name),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunks.push(\n\t\t\t\t\t\t\tfield.isAlias\n\t\t\t\t\t\t\t\t? sql`${getOriginalColumnFromAlias(field)} as ${field}`\n\t\t\t\t\t\t\t\t: field,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'SQL.Aliased': {\n\t\t\t\t\tif (field.isSelectionField) {\n\t\t\t\t\t\tif (!isSingleTable && field.origin !== undefined) {\n\t\t\t\t\t\t\tchunks.push(sql.identifier(field.origin), new StringChunk('.'));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchunks.push(sql.identifier(field.fieldAlias));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (isSingleTable && tableName !== undefined) {\n\t\t\t\t\t\t\tconst { queryChunks } = field.sql;\n\t\t\t\t\t\t\tconst newChunks: SQLChunk[] = new Array(queryChunks.length);\n\t\t\t\t\t\t\tlet abort = false;\n\n\t\t\t\t\t\t\tfor (let i = 0; i < queryChunks.length; ++i) {\n\t\t\t\t\t\t\t\tconst c = queryChunks[i]!;\n\t\t\t\t\t\t\t\tif (is(c, Column)) {\n\t\t\t\t\t\t\t\t\tconst { table } = c;\n\t\t\t\t\t\t\t\t\tconst columnTableName = table[Table.Symbol.IsAlias] || table[Table.Symbol.Schema] === undefined\n\t\t\t\t\t\t\t\t\t\t? table[Table.Symbol.Name]\n\t\t\t\t\t\t\t\t\t\t: `${table[Table.Symbol.Schema]}.${table[Table.Symbol.Name]}`;\n\t\t\t\t\t\t\t\t\tif (columnTableName !== tableName) {\n\t\t\t\t\t\t\t\t\t\tabort = true;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tnewChunks[i] = sql.identifier(c.name);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewChunks[i] = c;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (abort) {\n\t\t\t\t\t\t\t\tchunks.push(field.sql);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst newSql = new SQL(newChunks);\n\t\t\t\t\t\t\t\tif (field.sql.shouldInlineParams) newSql.inlineParams();\n\t\t\t\t\t\t\t\tchunks.push(newSql);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tchunks.push(field.sql);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchunks.push(sql` as ${sql.identifier(field.fieldAlias)}`);\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'SQL': {\n\t\t\t\t\tif (isSingleTable && tableName !== undefined) {\n\t\t\t\t\t\tconst { queryChunks } = field;\n\t\t\t\t\t\tconst newChunks: SQLChunk[] = new Array(queryChunks.length);\n\t\t\t\t\t\tlet abort = false;\n\n\t\t\t\t\t\tfor (let i = 0; i < queryChunks.length; ++i) {\n\t\t\t\t\t\t\tconst c = queryChunks[i]!;\n\t\t\t\t\t\t\tif (is(c, Column)) {\n\t\t\t\t\t\t\t\tconst { table } = c;\n\t\t\t\t\t\t\t\tconst columnTableName = table[Table.Symbol.IsAlias] || table[Table.Symbol.Schema] === undefined\n\t\t\t\t\t\t\t\t\t? table[Table.Symbol.Name]\n\t\t\t\t\t\t\t\t\t: `${table[Table.Symbol.Schema]}.${table[Table.Symbol.Name]}`;\n\t\t\t\t\t\t\t\tif (columnTableName !== tableName) {\n\t\t\t\t\t\t\t\t\tabort = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tnewChunks[i] = sql.identifier(c.name);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tnewChunks[i] = c;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (abort) {\n\t\t\t\t\t\t\tchunks.push(field);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst newSql = new SQL(newChunks);\n\t\t\t\t\t\t\tif (field.shouldInlineParams) newSql.inlineParams();\n\t\t\t\t\t\t\tchunks.push(newSql);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else chunks.push(field);\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'Subquery': {\n\t\t\t\t\tif (!field._.isWith) {\n\t\t\t\t\t\tchunks.push(sql`(${field._.sql}) ${sql.identifier(field._.alias)}`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunks.push(field);\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (i < columnsLen - 1) {\n\t\t\t\tchunks.push(new StringChunk(', '));\n\t\t\t}\n\t\t}\n\n\t\treturn new SQL(chunks);\n\t}\n\n\tprivate buildJoins(\n\t\tjoins: CockroachSelectJoinConfig[] | undefined,\n\t): SQL | undefined {\n\t\tif (!joins || joins.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst joinsArray: SQLChunk[] = [];\n\n\t\tfor (const [index, joinMeta] of joins.entries()) {\n\t\t\tif (index === 0) {\n\t\t\t\tjoinsArray.push(new StringChunk(' '));\n\t\t\t}\n\t\t\tconst table = joinMeta.table;\n\t\t\tconst lateralSql = joinMeta.lateral ? sql` lateral` : undefined;\n\t\t\tconst onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;\n\n\t\t\tif (is(table, CockroachTable)) {\n\t\t\t\tconst tableName = table[CockroachTable.Symbol.Name];\n\t\t\t\tconst tableSchema = table[CockroachTable.Symbol.Schema];\n\t\t\t\tconst origTableName = table[CockroachTable.Symbol.OriginalName];\n\t\t\t\tconst alias = tableName === origTableName ? undefined : joinMeta.alias;\n\t\t\t\tjoinsArray.push(\n\t\t\t\t\tsql`${new StringChunk(joinMeta.joinType)} join${lateralSql} ${\n\t\t\t\t\t\ttableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined\n\t\t\t\t\t}${sql.identifier(origTableName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`,\n\t\t\t\t);\n\t\t\t} else if (is(table, View)) {\n\t\t\t\tconst viewName = table[ViewBaseConfig].name;\n\t\t\t\tconst viewSchema = table[ViewBaseConfig].schema;\n\t\t\t\tconst origViewName = table[ViewBaseConfig].originalName;\n\t\t\t\tconst alias = viewName === origViewName ? undefined : joinMeta.alias;\n\t\t\t\tjoinsArray.push(\n\t\t\t\t\tsql`${new StringChunk(joinMeta.joinType)} join${lateralSql} ${\n\t\t\t\t\t\tviewSchema ? sql`${sql.identifier(viewSchema)}.` : undefined\n\t\t\t\t\t}${sql.identifier(origViewName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tjoinsArray.push(\n\t\t\t\t\tsql`${new StringChunk(joinMeta.joinType)} join${lateralSql} ${table}${onSql}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (index < joins.length - 1) {\n\t\t\t\tjoinsArray.push(new StringChunk(' '));\n\t\t\t}\n\t\t}\n\n\t\treturn new SQL(joinsArray);\n\t}\n\n\tprivate buildFromTable(\n\t\ttable: SQL | Subquery | CockroachViewBase | CockroachTable | undefined,\n\t): SQL | Subquery | CockroachViewBase | CockroachTable | undefined {\n\t\tif (is(table, Table) && table[Table.Symbol.IsAlias]) {\n\t\t\tlet fullName = sql`${sql.identifier(table[Table.Symbol.OriginalName])}`;\n\t\t\tif (table[Table.Symbol.Schema]) {\n\t\t\t\tfullName = sql`${sql.identifier(table[Table.Symbol.Schema]!)}.${fullName}`;\n\t\t\t}\n\t\t\treturn sql`${fullName} ${sql.identifier(table[Table.Symbol.Name])}`;\n\t\t}\n\n\t\tif (is(table, View) && table[ViewBaseConfig].isAlias) {\n\t\t\tlet fullName = sql`${sql.identifier(table[ViewBaseConfig].originalName)}`;\n\t\t\tif (table[ViewBaseConfig].schema) {\n\t\t\t\tfullName = sql`${sql.identifier(table[ViewBaseConfig].schema)}.${fullName}`;\n\t\t\t}\n\t\t\treturn sql`${fullName} ${sql.identifier(table[ViewBaseConfig].name)}`;\n\t\t}\n\n\t\treturn table;\n\t}\n\n\tbuildSelectQuery({\n\t\twithList,\n\t\tfieldsFlat,\n\t\twhere,\n\t\thaving,\n\t\ttable,\n\t\tjoins,\n\t\torderBy,\n\t\tgroupBy,\n\t\tlimit,\n\t\toffset,\n\t\tlockingClause,\n\t\tdistinct,\n\t\tsetOperators,\n\t}: CockroachSelectConfig): SQL {\n\t\tif (!fieldsFlat) {\n\t\t\tthrow new Error('Select query builder must be provided with `fieldsFlat` on `buildSelectQuery` invocation');\n\t\t}\n\t\tconst fieldsList = fieldsFlat;\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, CockroachViewBase)\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(\n\t\t\t\t\t\t({ alias }) =>\n\t\t\t\t\t\t\talias\n\t\t\t\t\t\t\t\t=== (table[Table.Symbol.IsAlias]\n\t\t\t\t\t\t\t\t\t? getTableName(table)\n\t\t\t\t\t\t\t\t\t: 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\t\t'->',\n\t\t\t\t\t\t)\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\tlet distinctSql: SQL | undefined;\n\t\tif (distinct) {\n\t\t\tdistinctSql = distinct === true\n\t\t\t\t? sql` distinct`\n\t\t\t\t: sql` distinct on (${sql.join(distinct.on, new StringChunk(', '))})`;\n\t\t}\n\n\t\tconst selection = this.buildSelection(fieldsList, { isSingleTable, table });\n\n\t\tconst tableSql = this.buildFromTable(table);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst havingSql = having ? sql` having ${having}` : undefined;\n\n\t\tlet orderBySql;\n\t\tif (orderBy && orderBy.length > 0) {\n\t\t\torderBySql = sql` order by ${sql.join(orderBy, new StringChunk(', '))}`;\n\t\t}\n\n\t\tlet groupBySql;\n\t\tif (groupBy && groupBy.length > 0) {\n\t\t\tgroupBySql = sql` group by ${sql.join(groupBy, new StringChunk(', '))}`;\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 offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\tconst lockingClauseSql = sql.empty();\n\t\tif (lockingClause) {\n\t\t\tconst clauseSql = sql` for ${new StringChunk(lockingClause.strength)}`;\n\t\t\tif (lockingClause.config.of) {\n\t\t\t\tclauseSql.append(\n\t\t\t\t\tsql` of ${\n\t\t\t\t\t\tsql.join(\n\t\t\t\t\t\t\tArray.isArray(lockingClause.config.of)\n\t\t\t\t\t\t\t\t? lockingClause.config.of\n\t\t\t\t\t\t\t\t: [lockingClause.config.of],\n\t\t\t\t\t\t\tnew StringChunk(', '),\n\t\t\t\t\t\t)\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (lockingClause.config.noWait) {\n\t\t\t\tclauseSql.append(sql` nowait`);\n\t\t\t} else if (lockingClause.config.skipLocked) {\n\t\t\t\tclauseSql.append(sql` skip locked`);\n\t\t\t}\n\t\t\tlockingClauseSql.append(clauseSql);\n\t\t}\n\t\tconst finalQuery =\n\t\t\tsql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}${lockingClauseSql}`;\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(\n\t\tleftSelect: SQL,\n\t\tsetOperators: CockroachSelectConfig['setOperators'],\n\t): 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}: {\n\t\tleftSelect: SQL;\n\t\tsetOperator: CockroachSelectConfig['setOperators'][number];\n\t}): 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 Sql syntax, Table from one of the SELECTs cannot be used in global ORDER clause\n\t\t\tfor (const singleOrderBy of orderBy) {\n\t\t\t\tif (is(singleOrderBy, CockroachColumn)) {\n\t\t\t\t\torderByValues.push(sql.identifier(singleOrderBy.name));\n\t\t\t\t} else if (is(singleOrderBy, SQL)) {\n\t\t\t\t\tfor (let i = 0; i < singleOrderBy.queryChunks.length; i++) {\n\t\t\t\t\t\tconst chunk = singleOrderBy.queryChunks[i];\n\n\t\t\t\t\t\tif (is(chunk, CockroachColumn)) {\n\t\t\t\t\t\t\tsingleOrderBy.queryChunks[i] = sql.identifier(chunk.name);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t} else {\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\torderBySql = sql` order by ${sql.join(orderByValues, new StringChunk(', '))} `;\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 = new StringChunk(`${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\ttable,\n\t\tvalues: valuesOrSelect,\n\t\tonConflict,\n\t\treturning,\n\t\twithList,\n\t\tselect,\n\t\tcolumnList,\n\t}: CockroachInsertConfig): SQL {\n\t\tconst columns: Record<string, CockroachColumn> = table[Table.Symbol.Columns];\n\n\t\tconst colEntries: [string, CockroachColumn][] = columnList\n\t\t\t? columnList.map((name) => [name, columns[name]!])\n\t\t\t: Object.entries(columns);\n\t\tconst colEntriesFiltered: [string, CockroachColumn][] = select && !is(valuesOrSelect, SQL)\n\t\t\t? Object\n\t\t\t\t.keys((valuesOrSelect as TypedQueryBuilder<any>).getSelectedFields())\n\t\t\t\t.map((key) => [key, columns[key]] as [string, CockroachColumn])\n\t\t\t: colEntries.filter(([_, col]) => !col.shouldDisableInsert());\n\n\t\tconst insertOrderArr: SQLChunk[] = new Array(colEntriesFiltered.length * 2 + 1);\n\t\tlet writeIdx = 0;\n\t\tinsertOrderArr[writeIdx++] = new StringChunk('(');\n\t\tfor (let i = 0; i < colEntriesFiltered.length; ++i) {\n\t\t\tconst [, { name }] = colEntriesFiltered[i]!;\n\t\t\tinsertOrderArr[writeIdx++] = sql.identifier(name);\n\n\t\t\tif (i < colEntriesFiltered.length - 1) insertOrderArr[writeIdx++] = new StringChunk(', ');\n\t\t}\n\t\tinsertOrderArr[writeIdx++] = new StringChunk(')');\n\t\tconst insertOrder = new SQL(insertOrderArr);\n\n\t\tconst valuesSqlList: SQLChunk[] = Array.from({\n\t\t\tlength: select\n\t\t\t\t? 1\n\t\t\t\t: (colEntriesFiltered.length * 2 + 1) * (valuesOrSelect as Record<string, unknown>[]).length\n\t\t\t\t\t+ (valuesOrSelect as Record<string, unknown>[]).length,\n\t\t});\n\n\t\tif (select) {\n\t\t\tvaluesSqlList[0] = (valuesOrSelect as AnyCockroachSelectQueryBuilder | SQL).getSQL();\n\t\t} else {\n\t\t\tconst values = valuesOrSelect as Record<string, unknown>[];\n\n\t\t\tlet writeIdx = 0;\n\t\t\tvaluesSqlList[writeIdx++] = new StringChunk('values ');\n\n\t\t\tfor (let valueIndex = 0; valueIndex < values.length; ++valueIndex) {\n\t\t\t\tconst value = values[valueIndex]!;\n\n\t\t\t\tvaluesSqlList[writeIdx++] = new StringChunk('(');\n\t\t\t\tfor (let i = 0; i < colEntriesFiltered.length; ++i) {\n\t\t\t\t\tconst [fieldName, col] = colEntriesFiltered[i]!;\n\t\t\t\t\tconst colValue = value[fieldName];\n\t\t\t\t\tif (colValue === 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\tconst defaultValue = is(defaultFnResult, SQL)\n\t\t\t\t\t\t\t\t? defaultFnResult\n\t\t\t\t\t\t\t\t: sql.param(defaultFnResult, col);\n\t\t\t\t\t\t\tvaluesSqlList[writeIdx++] = 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)\n\t\t\t\t\t\t\t\t? onUpdateFnResult\n\t\t\t\t\t\t\t\t: sql.param(onUpdateFnResult, col);\n\t\t\t\t\t\t\tvaluesSqlList[writeIdx++] = newValue;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvaluesSqlList[writeIdx++] = new StringChunk(`default`);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvaluesSqlList[writeIdx++] = is(colValue, SQL) ? colValue : new Param(colValue, col);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (i < colEntriesFiltered.length - 1) {\n\t\t\t\t\t\tvaluesSqlList[writeIdx++] = new StringChunk(', ');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvaluesSqlList[writeIdx++] = new StringChunk(')');\n\n\t\t\t\tif (valueIndex < values.length - 1) {\n\t\t\t\t\tvaluesSqlList[writeIdx++] = new StringChunk(`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst valuesSql = new SQL(valuesSqlList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true, table })}`\n\t\t\t: undefined;\n\n\t\tconst onConflictSql = onConflict\n\t\t\t? sql` on conflict ${onConflict}`\n\t\t\t: undefined;\n\n\t\treturn sql`${withSql}insert into ${table} ${insertOrder} ${valuesSql}${onConflictSql}${returningSql}`;\n\t}\n\n\tbuildRefreshMaterializedViewQuery({\n\t\tview,\n\t\tconcurrently,\n\t\twithNoData,\n\t}: {\n\t\tview: CockroachMaterializedView;\n\t\tconcurrently?: boolean;\n\t\twithNoData?: boolean;\n\t}): SQL {\n\t\tconst concurrentlySql = concurrently ? sql` concurrently` : undefined;\n\t\tconst withNoDataSql = withNoData ? sql` with no data` : undefined;\n\n\t\treturn sql`refresh materialized view${concurrentlySql} ${view}${withNoDataSql}`;\n\t}\n\n\tsqlToQuery(sql: SQL, invokeSource?: 'indexes' | undefined): Query {\n\t\treturn sql.toQuery({\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// buildRelationalQueryWithPK({\n\t// \tfullSchema,\n\t// \tschema,\n\t// \ttableNamesMap,\n\t// \ttable,\n\t// \ttableConfig,\n\t// \tqueryConfig: config,\n\t// \ttableAlias,\n\t// \tisRoot = false,\n\t// \tjoinOn,\n\t// }: {\n\t// \tfullSchema: Record<string, unknown>;\n\t// \tschema: TablesRelationalConfig;\n\t// \ttableNamesMap: Record<string, string>;\n\t// \ttable: CockroachTable;\n\t// \ttableConfig: TableRelationalConfig;\n\t// \tqueryConfig: true | DBQueryConfig<'many', true>;\n\t// \ttableAlias: string;\n\t// \tisRoot?: boolean;\n\t// \tjoinOn?: SQL;\n\t// }): BuildRelationalQueryResult<CockroachTable, CockroachColumn> {\n\t// \t// For { \"<relation>\": true }, return a table with selection of all columns\n\t// \tif (config === true) {\n\t// \t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t// \t\tconst selection: BuildRelationalQueryResult<CockroachTable, CockroachColumn>['selection'] = 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: value as CockroachColumn,\n\t// \t\t\trelationTableTsKey: undefined,\n\t// \t\t\tisJson: false,\n\t// \t\t\tselection: [],\n\t// \t\t}));\n\n\t// \t\treturn {\n\t// \t\t\ttableTsKey: tableConfig.tsName,\n\t// \t\t\tsql: table,\n\t// \t\t\tselection,\n\t// \t\t};\n\t// \t}\n\n\t// \t// let selection: BuildRelationalQueryResult<CockroachTable, CockroachColumn>['selection'] = [];\n\t// \t// let selectionForBuild = selection;\n\n\t// \tconst aliasedColumns = Object.fromEntries(\n\t// \t\tObject.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]),\n\t// \t);\n\n\t// \tconst aliasedRelations = Object.fromEntries(\n\t// \t\tObject.entries(tableConfig.relations).map(([key, value]) => [key, aliasedRelation(value, tableAlias)]),\n\t// \t);\n\n\t// \tconst aliasedFields = Object.assign({}, aliasedColumns, aliasedRelations);\n\n\t// \tlet where, hasUserDefinedWhere;\n\t// \tif (config.where) {\n\t// \t\tconst whereSql = typeof config.where === 'function' ? config.where(aliasedFields, operators) : config.where;\n\t// \t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t// \t\thasUserDefinedWhere = !!where;\n\t// \t}\n\t// \twhere = and(joinOn, where);\n\n\t// \t// const fieldsSelection: { tsKey: string; value: CockroachColumn | SQL.Aliased; isExtra?: boolean }[] = [];\n\t// \tlet joins: Join[] = [];\n\t// \tlet selectedColumns: string[] = [];\n\n\t// \t// Figure out which columns to select\n\t// \tif (config.columns) {\n\t// \t\tlet isIncludeMode = false;\n\n\t// \t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t// \t\t\tif (value === undefined) {\n\t// \t\t\t\tcontinue;\n\t// \t\t\t}\n\n\t// \t\t\tif (field in tableConfig.columns) {\n\t// \t\t\t\tif (!isIncludeMode && value === true) {\n\t// \t\t\t\t\tisIncludeMode = true;\n\t// \t\t\t\t}\n\t// \t\t\t\tselectedColumns.push(field);\n\t// \t\t\t}\n\t// \t\t}\n\n\t// \t\tif (selectedColumns.length > 0) {\n\t// \t\t\tselectedColumns = isIncludeMode\n\t// \t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t// \t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t// \t\t}\n\t// \t} else {\n\t// \t\t// Select all columns if selection is not specified\n\t// \t\tselectedColumns = Object.keys(tableConfig.columns);\n\t// \t}\n\n\t// \t// for (const field of selectedColumns) {\n\t// \t// \tconst column = tableConfig.columns[field]! as CockroachColumn;\n\t// \t// \tfieldsSelection.push({ tsKey: field, value: column });\n\t// \t// }\n\n\t// \tlet initiallySelectedRelations: {\n\t// \t\ttsKey: string;\n\t// \t\tqueryConfig: true | DBQueryConfig<'many', false>;\n\t// \t\trelation: Relation;\n\t// \t}[] = [];\n\n\t// \t// let selectedRelations: BuildRelationalQueryResult<CockroachTable, CockroachColumn>['selection'] = [];\n\n\t// \t// Figure out which relations to select\n\t// \tif (config.with) {\n\t// \t\tinitiallySelectedRelations = Object.entries(config.with)\n\t// \t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t// \t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t// \t}\n\n\t// \tconst manyRelations = initiallySelectedRelations.filter((r) =>\n\t// \t\tis(r.relation, Many)\n\t// \t\t&& (schema[tableNamesMap[r.relation.referencedTable[Table.Symbol.Name]]!]?.primaryKey.length ?? 0) > 0\n\t// \t);\n\t// \t// If this is the last Many relation (or there are no Many relations), we are on the innermost subquery level\n\t// \tconst isInnermostQuery = manyRelations.length < 2;\n\n\t// \tconst selectedExtras: {\n\t// \t\ttsKey: string;\n\t// \t\tvalue: SQL.Aliased;\n\t// \t}[] = [];\n\n\t// \t// Figure out which extras to select\n\t// \tif (isInnermostQuery && config.extras) {\n\t// \t\tconst extras = typeof config.extras === 'function'\n\t// \t\t\t? config.extras(aliasedFields, { sql })\n\t// \t\t\t: config.extras;\n\t// \t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t// \t\t\tselectedExtras.push({\n\t// \t\t\t\ttsKey,\n\t// \t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t// \t\t\t});\n\t// \t\t}\n\t// \t}\n\n\t// \t// Transform `fieldsSelection` into `selection`\n\t// \t// `fieldsSelection` shouldn't be used after this point\n\t// \t// for (const { tsKey, value, isExtra } of fieldsSelection) {\n\t// \t// \tselection.push({\n\t// \t// \t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t// \t// \t\ttsKey,\n\t// \t// \t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t// \t// \t\trelationTableTsKey: undefined,\n\t// \t// \t\tisJson: false,\n\t// \t// \t\tisExtra,\n\t// \t// \t\tselection: [],\n\t// \t// \t});\n\t// \t// }\n\n\t// \tlet orderByOrig = typeof config.orderBy === 'function'\n\t// \t\t? config.orderBy(aliasedFields, orderByOperators)\n\t// \t\t: config.orderBy ?? [];\n\t// \tif (!Array.isArray(orderByOrig)) {\n\t// \t\torderByOrig = [orderByOrig];\n\t// \t}\n\t// \tconst orderBy = orderByOrig.map((orderByValue) => {\n\t// \t\tif (is(orderByValue, Column)) {\n\t// \t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as CockroachColumn;\n\t// \t\t}\n\t// \t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t// \t});\n\n\t// \tconst limit = isInnermostQuery ? config.limit : undefined;\n\t// \tconst offset = isInnermostQuery ? config.offset : undefined;\n\n\t// \t// For non-root queries without additional config except columns, return a table with selection\n\t// \tif (\n\t// \t\t!isRoot\n\t// \t\t&& initiallySelectedRelations.length === 0\n\t// \t\t&& selectedExtras.length === 0\n\t// \t\t&& !where\n\t// \t\t&& orderBy.length === 0\n\t// \t\t&& limit === undefined\n\t// \t\t&& offset === undefined\n\t// \t) {\n\t// \t\treturn {\n\t// \t\t\ttableTsKey: tableConfig.tsName,\n\t// \t\t\tsql: table,\n\t// \t\t\tselection: selectedColumns.map((key) => ({\n\t// \t\t\t\tdbKey: tableConfig.columns[key]!.name,\n\t// \t\t\t\ttsKey: key,\n\t// \t\t\t\tfield: tableConfig.columns[key] as CockroachColumn,\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\t// \t}\n\n\t// \tconst selectedRelationsWithoutPK:\n\n\t// \t// Process all relations without primary keys, because they need to be joined differently and will all be on the same query level\n\t// \tfor (\n\t// \t\tconst {\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tqueryConfig: selectedRelationConfigValue,\n\t// \t\t\trelation,\n\t// \t\t} of initiallySelectedRelations\n\t// \t) {\n\t// \t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t// \t\tconst relationTableName = relation.referencedTable[Table.Symbol.Name];\n\t// \t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t// \t\tconst relationTable = schema[relationTableTsName]!;\n\n\t// \t\tif (relationTable.primaryKey.length > 0) {\n\t// \t\t\tcontinue;\n\t// \t\t}\n\n\t// \t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t// \t\tconst joinOn = and(\n\t// \t\t\t...normalizedRelation.fields.map((field, i) =>\n\t// \t\t\t\teq(\n\t// \t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t// \t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t// \t\t\t\t)\n\t// \t\t\t),\n\t// \t\t);\n\t// \t\tconst builtRelation = this.buildRelationalQueryWithoutPK({\n\t// \t\t\tfullSchema,\n\t// \t\t\tschema,\n\t// \t\t\ttableNamesMap,\n\t// \t\t\ttable: fullSchema[relationTableTsName] as CockroachTable,\n\t// \t\t\ttableConfig: schema[relationTableTsName]!,\n\t// \t\t\tqueryConfig: selectedRelationConfigValue,\n\t// \t\t\ttableAlias: relationTableAlias,\n\t// \t\t\tjoinOn,\n\t// \t\t\tnestedQueryRelation: relation,\n\t// \t\t});\n\t// \t\tconst field = sql`${sql.identifier(relationTableAlias)}.${sql.identifier('data')}`.as(selectedRelationTsKey);\n\t// \t\tjoins.push({\n\t// \t\t\ton: sql`true`,\n\t// \t\t\ttable: new Subquery(builtRelation.sql as SQL, {}, relationTableAlias),\n\t// \t\t\talias: relationTableAlias,\n\t// \t\t\tjoinType: 'left',\n\t// \t\t\tlateral: true,\n\t// \t\t});\n\t// \t\tselectedRelations.push({\n\t// \t\t\tdbKey: selectedRelationTsKey,\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tfield,\n\t// \t\t\trelationTableTsKey: relationTableTsName,\n\t// \t\t\tisJson: true,\n\t// \t\t\tselection: builtRelation.selection,\n\t// \t\t});\n\t// \t}\n\n\t// \tconst oneRelations = initiallySelectedRelations.filter((r): r is typeof r & { relation: One } =>\n\t// \t\tis(r.relation, One)\n\t// \t);\n\n\t// \t// Process all One relations with PKs, because they can all be joined on the same level\n\t// \tfor (\n\t// \t\tconst {\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tqueryConfig: selectedRelationConfigValue,\n\t// \t\t\trelation,\n\t// \t\t} of oneRelations\n\t// \t) {\n\t// \t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t// \t\tconst relationTableName = relation.referencedTable[Table.Symbol.Name];\n\t// \t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t// \t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t// \t\tconst relationTable = schema[relationTableTsName]!;\n\n\t// \t\tif (relationTable.primaryKey.length === 0) {\n\t// \t\t\tcontinue;\n\t// \t\t}\n\n\t// \t\tconst joinOn = and(\n\t// \t\t\t...normalizedRelation.fields.map((field, i) =>\n\t// \t\t\t\teq(\n\t// \t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t// \t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t// \t\t\t\t)\n\t// \t\t\t),\n\t// \t\t);\n\t// \t\tconst builtRelation = this.buildRelationalQueryWithPK({\n\t// \t\t\tfullSchema,\n\t// \t\t\tschema,\n\t// \t\t\ttableNamesMap,\n\t// \t\t\ttable: fullSchema[relationTableTsName] as CockroachTable,\n\t// \t\t\ttableConfig: schema[relationTableTsName]!,\n\t// \t\t\tqueryConfig: selectedRelationConfigValue,\n\t// \t\t\ttableAlias: relationTableAlias,\n\t// \t\t\tjoinOn,\n\t// \t\t});\n\t// \t\tconst field = sql`case when ${sql.identifier(relationTableAlias)} is null then null else json_build_array(${\n\t// \t\t\tsql.join(\n\t// \t\t\t\tbuiltRelation.selection.map(({ field }) =>\n\t// \t\t\t\t\tis(field, SQL.Aliased)\n\t// \t\t\t\t\t\t? sql`${sql.identifier(relationTableAlias)}.${sql.identifier(field.fieldAlias)}`\n\t// \t\t\t\t\t\t: is(field, Column)\n\t// \t\t\t\t\t\t? aliasedTableColumn(field, relationTableAlias)\n\t// \t\t\t\t\t\t: field\n\t// \t\t\t\t),\n\t// \t\t\t\tnew StringChunk(', '),\n\t// \t\t\t)\n\t// \t\t}) end`.as(selectedRelationTsKey);\n\t// \t\tconst isLateralJoin = is(builtRelation.sql, SQL);\n\t// \t\tjoins.push({\n\t// \t\t\ton: isLateralJoin ? sql`true` : joinOn,\n\t// \t\t\ttable: is(builtRelation.sql, SQL)\n\t// \t\t\t\t? new Subquery(builtRelation.sql, {}, relationTableAlias)\n\t// \t\t\t\t: aliasedTable(builtRelation.sql, relationTableAlias),\n\t// \t\t\talias: relationTableAlias,\n\t// \t\t\tjoinType: 'left',\n\t// \t\t\tlateral: is(builtRelation.sql, SQL),\n\t// \t\t});\n\t// \t\tselectedRelations.push({\n\t// \t\t\tdbKey: selectedRelationTsKey,\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tfield,\n\t// \t\t\trelationTableTsKey: relationTableTsName,\n\t// \t\t\tisJson: true,\n\t// \t\t\tselection: builtRelation.selection,\n\t// \t\t});\n\t// \t}\n\n\t// \tlet distinct: CockroachSelectConfig['distinct'];\n\t// \tlet tableFrom: CockroachTable | Subquery = table;\n\n\t// \t// Process first Many relation - each one requires a nested subquery\n\t// \tconst manyRelation = manyRelations[0];\n\t// \tif (manyRelation) {\n\t// \t\tconst {\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tqueryConfig: selectedRelationQueryConfig,\n\t// \t\t\trelation,\n\t// \t\t} = manyRelation;\n\n\t// \t\tdistinct = {\n\t// \t\t\ton: tableConfig.primaryKey.map((c) => aliasedTableColumn(c as CockroachColumn, tableAlias)),\n\t// \t\t};\n\n\t// \t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t// \t\tconst relationTableName = relation.referencedTable[Table.Symbol.Name];\n\t// \t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t// \t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t// \t\tconst joinOn = and(\n\t// \t\t\t...normalizedRelation.fields.map((field, i) =>\n\t// \t\t\t\teq(\n\t// \t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t// \t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t// \t\t\t\t)\n\t// \t\t\t),\n\t// \t\t);\n\n\t// \t\tconst builtRelationJoin = this.buildRelationalQueryWithPK({\n\t// \t\t\tfullSchema,\n\t// \t\t\tschema,\n\t// \t\t\ttableNamesMap,\n\t// \t\t\ttable: fullSchema[relationTableTsName] as CockroachTable,\n\t// \t\t\ttableConfig: schema[relationTableTsName]!,\n\t// \t\t\tqueryConfig: selectedRelationQueryConfig,\n\t// \t\t\ttableAlias: relationTableAlias,\n\t// \t\t\tjoinOn,\n\t// \t\t});\n\n\t// \t\tconst builtRelationSelectionField = sql`case when ${\n\t// \t\t\tsql.identifier(relationTableAlias)\n\t// \t\t} is null then '[]' else json_agg(json_build_array(${\n\t// \t\t\tsql.join(\n\t// \t\t\t\tbuiltRelationJoin.selection.map(({ field }) =>\n\t// \t\t\t\t\tis(field, SQL.Aliased)\n\t// \t\t\t\t\t\t? sql`${sql.identifier(relationTableAlias)}.${sql.identifier(field.fieldAlias)}`\n\t// \t\t\t\t\t\t: is(field, Column)\n\t// \t\t\t\t\t\t? aliasedTableColumn(field, relationTableAlias)\n\t// \t\t\t\t\t\t: field\n\t// \t\t\t\t),\n\t// \t\t\t\tnew StringChunk(', '),\n\t// \t\t\t)\n\t// \t\t})) over (partition by ${sql.join(distinct.on, new StringChunk(', '))}) end`.as(selectedRelationTsKey);\n\t// \t\tconst isLateralJoin = is(builtRelationJoin.sql, SQL);\n\t// \t\tjoins.push({\n\t// \t\t\ton: isLateralJoin ? sql`true` : joinOn,\n\t// \t\t\ttable: isLateralJoin\n\t// \t\t\t\t? new Subquery(builtRelationJoin.sql as SQL, {}, relationTableAlias)\n\t// \t\t\t\t: aliasedTable(builtRelationJoin.sql as CockroachTable, relationTableAlias),\n\t// \t\t\talias: relationTableAlias,\n\t// \t\t\tjoinType: 'left',\n\t// \t\t\tlateral: isLateralJoin,\n\t// \t\t});\n\n\t// \t\t// Build the \"from\" subquery with the remaining Many relations\n\t// \t\tconst builtTableFrom = this.buildRelationalQueryWithPK({\n\t// \t\t\tfullSchema,\n\t// \t\t\tschema,\n\t// \t\t\ttableNamesMap,\n\t// \t\t\ttable,\n\t// \t\t\ttableConfig,\n\t// \t\t\tqueryConfig: {\n\t// \t\t\t\t...config,\n\t// \t\t\t\twhere: undefined,\n\t// \t\t\t\torderBy: undefined,\n\t// \t\t\t\tlimit: undefined,\n\t// \t\t\t\toffset: undefined,\n\t// \t\t\t\twith: manyRelations.slice(1).reduce<NonNullable<typeof config['with']>>(\n\t// \t\t\t\t\t(result, { tsKey, queryConfig: configValue }) => {\n\t// \t\t\t\t\t\tresult[tsKey] = configValue;\n\t// \t\t\t\t\t\treturn result;\n\t// \t\t\t\t\t},\n\t// \t\t\t\t\t{},\n\t// \t\t\t\t),\n\t// \t\t\t},\n\t// \t\t\ttableAlias,\n\t// \t\t});\n\n\t// \t\tselectedRelations.push({\n\t// \t\t\tdbKey: selectedRelationTsKey,\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tfield: builtRelationSelectionField,\n\t// \t\t\trelationTableTsKey: relationTableTsName,\n\t// \t\t\tisJson: true,\n\t// \t\t\tselection: builtRelationJoin.selection,\n\t// \t\t});\n\n\t// \t\t// selection = builtTableFrom.selection.map((item) =>\n\t// \t\t// \tis(item.field, SQL.Aliased)\n\t// \t\t// \t\t? { ...item, field: sql`${sql.identifier(tableAlias)}.${sql.identifier(item.field.fieldAlias)}` }\n\t// \t\t// \t\t: item\n\t// \t\t// );\n\t// \t\t// selectionForBuild = [{\n\t// \t\t// \tdbKey: '*',\n\t// \t\t// \ttsKey: '*',\n\t// \t\t// \tfield: sql`${sql.identifier(tableAlias)}.*`,\n\t// \t\t// \tselection: [],\n\t// \t\t// \tisJson: false,\n\t// \t\t// \trelationTableTsKey: undefined,\n\t// \t\t// }];\n\t// \t\t// const newSelectionItem: (typeof selection)[number] = {\n\t// \t\t// \tdbKey: selectedRelationTsKey,\n\t// \t\t// \ttsKey: selectedRelationTsKey,\n\t// \t\t// \tfield,\n\t// \t\t// \trelationTableTsKey: relationTableTsName,\n\t// \t\t// \tisJson: true,\n\t// \t\t// \tselection: builtRelationJoin.selection,\n\t// \t\t// };\n\t// \t\t// selection.push(newSelectionItem);\n\t// \t\t// selectionForBuild.push(newSelectionItem);\n\n\t// \t\ttableFrom = is(builtTableFrom.sql, CockroachTable)\n\t// \t\t\t? builtTableFrom.sql\n\t// \t\t\t: new Subquery(builtTableFrom.sql, {}, tableAlias);\n\t// \t}\n\n\t// \tif (selectedColumns.length === 0 && selectedRelations.length === 0 && selectedExtras.length === 0) {\n\t// \t\tthrow new DrizzleError(`No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\")`);\n\t// \t}\n\n\t// \tlet selection: BuildRelationalQueryResult<CockroachTable, CockroachColumn>['selection'];\n\n\t// \tfunction prepareSelectedColumns() {\n\t// \t\treturn selectedColumns.map((key) => ({\n\t// \t\t\tdbKey: tableConfig.columns[key]!.name,\n\t// \t\t\ttsKey: key,\n\t// \t\t\tfield: tableConfig.columns[key] as CockroachColumn,\n\t// \t\t\trelationTableTsKey: undefined,\n\t// \t\t\tisJson: false,\n\t// \t\t\tselection: [],\n\t// \t\t}));\n\t// \t}\n\n\t// \tfunction prepareSelectedExtras() {\n\t// \t\treturn selectedExtras.map((item) => ({\n\t// \t\t\tdbKey: item.value.fieldAlias,\n\t// \t\t\ttsKey: item.tsKey,\n\t// \t\t\tfield: item.value,\n\t// \t\t\trelationTableTsKey: undefined,\n\t// \t\t\tisJson: false,\n\t// \t\t\tselection: [],\n\t// \t\t}));\n\t// \t}\n\n\t// \tif (isRoot) {\n\t// \t\tselection = [\n\t// \t\t\t...prepareSelectedColumns(),\n\t// \t\t\t...prepareSelectedExtras(),\n\t// \t\t];\n\t// \t}\n\n\t// \tif (hasUserDefinedWhere || orderBy.length > 0) {\n\t// \t\ttableFrom = new Subquery(\n\t// \t\t\tthis.buildSelectQuery({\n\t// \t\t\t\ttable: is(tableFrom, CockroachTable) ? aliasedTable(tableFrom, tableAlias) : tableFrom,\n\t// \t\t\t\tfields: {},\n\t// \t\t\t\tfieldsFlat: selectionForBuild.map(({ field }) => ({\n\t// \t\t\t\t\tpath: [],\n\t// \t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t// \t\t\t\t})),\n\t// \t\t\t\tjoins,\n\t// \t\t\t\tdistinct,\n\t// \t\t\t}),\n\t// \t\t\t{},\n\t// \t\t\ttableAlias,\n\t// \t\t);\n\t// \t\tselectionForBuild = selection.map((item) =>\n\t// \t\t\tis(item.field, SQL.Aliased)\n\t// \t\t\t\t? { ...item, field: sql`${sql.identifier(tableAlias)}.${sql.identifier(item.field.fieldAlias)}` }\n\t// \t\t\t\t: item\n\t// \t\t);\n\t// \t\tjoins = [];\n\t// \t\tdistinct = undefined;\n\t// \t}\n\n\t// \tconst result = this.buildSelectQuery({\n\t// \t\ttable: is(tableFrom, CockroachTable) ? aliasedTable(tableFrom, tableAlias) : tableFrom,\n\t// \t\tfields: {},\n\t// \t\tfieldsFlat: selectionForBuild.map(({ field }) => ({\n\t// \t\t\tpath: [],\n\t// \t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t// \t\t})),\n\t// \t\twhere,\n\t// \t\tlimit,\n\t// \t\toffset,\n\t// \t\tjoins,\n\t// \t\torderBy,\n\t// \t\tdistinct,\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\tbuildRelationalQueryWithoutPK({\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: CockroachTable;\n\t\ttableConfig: V1.TableRelationalConfig;\n\t\tqueryConfig: true | V1.DBQueryConfig<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: V1.Relation;\n\t\tjoinOn?: SQL;\n\t}): V1.BuildRelationalQueryResult<CockroachTable, CockroachColumn> {\n\t\tlet selection: V1.BuildRelationalQueryResult<\n\t\t\tCockroachTable,\n\t\t\tCockroachColumn\n\t\t>['selection'] = [];\n\t\tlet limit,\n\t\t\toffset,\n\t\t\torderBy: NonNullable<CockroachSelectConfig['orderBy']> = [],\n\t\t\twhere;\n\t\tconst joins: CockroachSelectJoinConfig[] = [];\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map(([key, value]) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as CockroachColumn, 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]) => [\n\t\t\t\t\tkey,\n\t\t\t\t\taliasedTableColumn(value, tableAlias),\n\t\t\t\t]),\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: {\n\t\t\t\ttsKey: string;\n\t\t\t\tvalue: CockroachColumn | SQL.Aliased;\n\t\t\t}[] = [];\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(\n\t\t\t\t\t\t\t(key) => !selectedColumns.includes(key),\n\t\t\t\t\t\t);\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 CockroachColumn;\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.DBQueryConfig<'many', false>;\n\t\t\t\trelation: V1.Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which 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(\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\tentry,\n\t\t\t\t\t\t): entry is [(typeof entry)[0], NonNullable<(typeof entry)[1]>] => !!entry[1],\n\t\t\t\t\t)\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tqueryConfig,\n\t\t\t\t\t\trelation: tableConfig.relations[tsKey]!,\n\t\t\t\t\t}));\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)\n\t\t\t\t\t\t? value.fieldAlias\n\t\t\t\t\t\t: tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column)\n\t\t\t\t\t\t? aliasedTableColumn(value, tableAlias)\n\t\t\t\t\t\t: 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(\n\t\t\t\t\t\torderByValue,\n\t\t\t\t\t\ttableAlias,\n\t\t\t\t\t) as CockroachColumn;\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 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(\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\trelation,\n\t\t\t\t);\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(\n\t\t\t\t\t\t\t\tnormalizedRelation.references[i]!,\n\t\t\t\t\t\t\t\trelationTableAlias,\n\t\t\t\t\t\t\t),\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.buildRelationalQueryWithoutPK({\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 CockroachTable,\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(\n\t\t\t\t\tselectedRelationTsKey,\n\t\t\t\t);\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({\n\t\t\t\tmessage: `No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\")`,\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_build_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\tnew StringChunk(', '),\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_agg(${field}${\n\t\t\t\t\torderBy.length > 0\n\t\t\t\t\t\t? sql` order by ${sql.join(orderBy, new StringChunk(', '))}`\n\t\t\t\t\t\t: undefined\n\t\t\t\t}), '[]'::json)`;\n\t\t\t\t// orderBy = [];\n\t\t\t}\n\t\t\tconst nestedSelection = [\n\t\t\t\t{\n\t\t\t\t\tdbKey: 'data',\n\t\t\t\t\ttsKey: 'data',\n\t\t\t\t\tfield: field.as('data'),\n\t\t\t\t\tisJson: true,\n\t\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\t\tselection,\n\t\t\t\t},\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\tfieldType: 'SQL',\n\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\torderBy,\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 = [];\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, CockroachTable)\n\t\t\t\t\t? result\n\t\t\t\t\t: new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => {\n\t\t\t\t\tconst mapped = is(field, Column) ? aliasedTableColumn(field, tableAlias) : field;\n\t\t\t\t\tconst fieldType = is(mapped, Column) ? 'Column' : is(mapped, SQL.Aliased) ? 'SQL.Aliased' : 'SQL';\n\t\t\t\t\treturn { path: [], field: mapped, fieldType } as SelectedFieldsOrdered[number];\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\tconst mapped = is(field, Column) ? aliasedTableColumn(field, tableAlias) : field;\n\t\t\t\t\tconst fieldType = is(mapped, Column) ? 'Column' : is(mapped, SQL.Aliased) ? 'SQL.Aliased' : 'SQL';\n\t\t\t\t\treturn { path: [], field: mapped, fieldType } as SelectedFieldsOrdered[number];\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\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n}\n"],"mappings":"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"}