{"version":3,"file":"dialect.cjs","names":["entityKind","CodecsCollection","resolvePgTypeAlias","makeJitQueryMapper","makeJitRqbMapper","makeDefaultQueryMapper","makeDefaultRqbMapper","StringChunk","sql","SQL","Table","PgTable","Subquery","Column","View","ViewBaseConfig","PgViewBase","PgColumn","Param","DrizzleError","TableColumns"],"sources":["../../src/pg-core/dialect.ts"],"sourcesContent":["import { aliasedTable, getOriginalColumnFromAlias } from '~/alias.ts';\nimport { CodecsCollection } from '~/codecs.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError } from '~/errors.ts';\nimport { PgColumn, type PgCustomColumn } from '~/pg-core/columns/index.ts';\nimport type {\n\tAnyPgSelectQueryBuilder,\n\tPgDeleteConfig,\n\tPgInsertConfig,\n\tPgSelectJoinConfig,\n\tPgUpdateConfig,\n} from '~/pg-core/query-builders/index.ts';\nimport type { PgSelectConfig, SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts';\nimport { PgTable } from '~/pg-core/table.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport {\n\ttype AnyOne,\n\t// AggregatedField,\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfigWithComment,\n\tgetTableAsAliasSQL,\n\tmakeDefaultRqbMapper,\n\tmakeJitRqbMapper,\n\ttype RelationalRowsMapperGenerator,\n\trelationExtrasToSQL,\n\trelationsFilterToSQL,\n\trelationsOrderToSQL,\n\trelationToSQL,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n\ttype WithContainer,\n} from '~/relations.ts';\nimport { and, isSQLWrapper, type SQLWrapper, 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, Table, TableColumns } from '~/table.ts';\nimport { makeDefaultQueryMapper, makeJitQueryMapper, type RowsMapperGenerator, type UpdateSet } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { type PgCodecs, type PostgresType, resolvePgTypeAlias } from './codecs.ts';\nimport { PgViewBase } from './view-base.ts';\nimport type { PgMaterializedView, PgView } from './view.ts';\n\n/** Used to build mappers directly in driver in minipg */\nexport type PreparedQuerySelection = {\n\ttype: 'plain';\n\tfields: SelectedFieldsOrdered;\n} | {\n\ttype: 'relational';\n\tfields: BuildRelationalQueryResult['selection'];\n};\n\n/** Selection shape converter for driver-side mapping, provided per driver where supported */\nexport type ShapeGenerator = (\n\tselection: PreparedQuerySelection,\n\tnullableObjectPaths: string[] | undefined,\n) => any;\n\nexport interface PgDialectConfig {\n\tcodecs?: PgCodecs;\n\tuseJitMappers?: boolean;\n\t// Mapper replacement for driver-side mapping\n\tshapeGenerator?: ShapeGenerator;\n}\n\nexport class PgDialect {\n\tstatic readonly [entityKind]: string = 'PgDialect';\n\n\treadonly codecs: CodecsCollection<PostgresType>;\n\treadonly mapperGenerators: {\n\t\trows: RowsMapperGenerator;\n\t\trelationalRows: RelationalRowsMapperGenerator;\n\t};\n\treadonly shapeGenerator?: ShapeGenerator;\n\n\tconstructor(config?: PgDialectConfig) {\n\t\tthis.codecs = new CodecsCollection<PostgresType>(resolvePgTypeAlias, config?.codecs);\n\t\tthis.shapeGenerator = config?.shapeGenerator;\n\t\tthis.mapperGenerators = config?.useJitMappers\n\t\t\t? {\n\t\t\t\trows: makeJitQueryMapper,\n\t\t\t\trelationalRows: makeJitRqbMapper,\n\t\t\t}\n\t\t\t: {\n\t\t\t\trows: makeDefaultQueryMapper,\n\t\t\t\trelationalRows: makeDefaultRqbMapper,\n\t\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\tcomment,\n\t\tignoreSelectionCastCodecs,\n\t}: PgDeleteConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${\n\t\t\t\tthis.buildSelection(returning, { isSingleTable: true, ignoreCastCodecs: ignoreSelectionCastCodecs, table })\n\t\t\t}`\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\t\tcomment !== undefined ? sql` ${comment}` : undefined\n\t\t}`;\n\t}\n\n\tbuildUpdateSet(table: PgTable, 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\tcomment,\n\t\tignoreSelectionCastCodecs,\n\t}: PgUpdateConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst tableName = table[PgTable.Symbol.Name];\n\t\tconst tableSchema = table[PgTable.Symbol.Schema];\n\t\tconst origTableName = table[PgTable.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 ${\n\t\t\t\tthis.buildSelection(returning, { isSingleTable: !from, ignoreCastCodecs: ignoreSelectionCastCodecs, table })\n\t\t\t}`\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\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, ignoreCastCodecs = false, table }: {\n\t\t\tisSingleTable?: boolean;\n\t\t\tignoreCastCodecs?: boolean;\n\t\t\ttable?: PgTable | PgViewBase | 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, codecOverride, column, fieldType } = fields[i]!;\n\t\t\tconst override = codecOverride as PostgresType | undefined;\n\n\t\t\tswitch (fieldType) {\n\t\t\t\tcase 'Column': {\n\t\t\t\t\tlet name: Name | Column;\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tname = field.isAlias\n\t\t\t\t\t\t\t? sql.identifier(getOriginalColumnFromAlias(field).name)\n\t\t\t\t\t\t\t: sql.identifier(field.name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = field.isAlias ? getOriginalColumnFromAlias(field) : field;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst casted = ignoreCastCodecs ? name : this.codecs.apply(field, 'cast', name, override);\n\t\t\t\t\tchunks.push(field.isAlias ? sql`${casted} as ${field}` : casted);\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\tconst query = !isSingleTable && field.origin !== undefined\n\t\t\t\t\t\t\t? sql`${sql.identifier(field.origin)}.${sql.identifier(field.fieldAlias)}`\n\t\t\t\t\t\t\t: sql.identifier(field.fieldAlias);\n\t\t\t\t\t\tif (column && !ignoreCastCodecs) chunks.push(this.codecs.apply(column, 'cast', query, override));\n\t\t\t\t\t\telse chunks.push(query);\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(\n\t\t\t\t\t\t\t\t\tcolumn && !ignoreCastCodecs ? this.codecs.apply(column, 'cast', field.sql, override) : field.sql,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst newSql = new SQL(newChunks);\n\n\t\t\t\t\t\t\t\tif (field.sql.shouldInlineParams) newSql.inlineParams();\n\t\t\t\t\t\t\t\tchunks.push(\n\t\t\t\t\t\t\t\t\tcolumn && !ignoreCastCodecs ? this.codecs.apply(column, 'cast', newSql, override) : newSql,\n\t\t\t\t\t\t\t\t);\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(\n\t\t\t\t\t\t\t\tcolumn && !ignoreCastCodecs ? this.codecs.apply(column, 'cast', field.sql, override) : field.sql,\n\t\t\t\t\t\t\t);\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(column && !ignoreCastCodecs ? this.codecs.apply(column, 'cast', field, override) : 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(column && !ignoreCastCodecs ? this.codecs.apply(column, 'cast', newSql, override) : newSql);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else chunks.push(column && !ignoreCastCodecs ? this.codecs.apply(column, 'cast', field, override) : 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 (column && !ignoreCastCodecs && !field._.isWith) {\n\t\t\t\t\t\tconst innerCasted = this.codecs.apply(column, 'cast', sql`(${field._.sql})`, override);\n\t\t\t\t\t\tchunks.push(sql`${innerCasted} ${sql.identifier(field._.alias)}`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunks.push(column ? this.codecs.apply(column, 'cast', field) : field, override);\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(joins: PgSelectJoinConfig[] | undefined): 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, PgTable)) {\n\t\t\t\tconst tableName = table[PgTable.Symbol.Name];\n\t\t\t\tconst tableSchema = table[PgTable.Symbol.Schema];\n\t\t\t\tconst origTableName = table[PgTable.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 | PgViewBase | PgTable | undefined,\n\t): SQL | Subquery | PgViewBase | PgTable | 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\tsetFieldsFlat: setSelection,\n\t\tcomment,\n\t\tignoreSelectionCastCodecs,\n\t}: PgSelectConfig): 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, PgViewBase)\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, {\n\t\t\tisSingleTable,\n\t\t\tignoreCastCodecs: ignoreSelectionCastCodecs || setOperators.length > 0,\n\t\t\ttable,\n\t\t});\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.map((it) => sql.identifier(it[PgTable.Symbol.Name]))\n\t\t\t\t\t\t\t\t: [sql.identifier(lockingClause.config.of[PgTable.Symbol.Name])],\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\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, setSelection!, ignoreSelectionCastCodecs, setOperators);\n\t\t}\n\n\t\treturn finalQuery;\n\t}\n\n\tbuildSetOperations(\n\t\tleftSelect: SQL,\n\t\toutputSelection: SelectedFieldsOrdered,\n\t\tignoreSelectionCastCodecs: boolean | undefined,\n\t\tsetOperators: PgSelectConfig['setOperators'],\n\t): SQL {\n\t\tfor (let i = 0; i < setOperators.length; ++i) {\n\t\t\tconst setOperator = setOperators[i]!;\n\t\t\tleftSelect = this.buildSetOperationQuery({ leftSelect, setOperator });\n\t\t}\n\n\t\treturn ignoreSelectionCastCodecs ? leftSelect : sql`select ${\n\t\t\tthis.buildSelection(\n\t\t\t\toutputSelection.map((field) => {\n\t\t\t\t\tif (field.fieldType === 'SQL.Aliased') {\n\t\t\t\t\t\tconst ref = field.field.clone();\n\t\t\t\t\t\tref.isSelectionField = true;\n\t\t\t\t\t\treturn { ...field, field: ref, fieldType: 'SQL.Aliased' };\n\t\t\t\t\t}\n\t\t\t\t\tif (field.fieldType === 'Column' && field.field.isAlias) {\n\t\t\t\t\t\tconst ref = new SQL.Aliased(sql`${sql.identifier(field.field.name)}`, field.field.name);\n\t\t\t\t\t\tref.isSelectionField = true;\n\t\t\t\t\t\treturn { ...field, field: ref, fieldType: 'SQL.Aliased' };\n\t\t\t\t\t}\n\t\t\t\t\tif (field.fieldType === 'Subquery') {\n\t\t\t\t\t\tconst ref = new SQL.Aliased(sql`${field.field.getSQL()}`, field.field._.alias);\n\t\t\t\t\t\tref.isSelectionField = true;\n\t\t\t\t\t\treturn { ...field, field: ref, fieldType: 'SQL.Aliased' };\n\t\t\t\t\t}\n\t\t\t\t\treturn field;\n\t\t\t\t}),\n\t\t\t\t{\n\t\t\t\t\tisSingleTable: true,\n\t\t\t\t\tignoreCastCodecs: ignoreSelectionCastCodecs,\n\t\t\t\t},\n\t\t\t)\n\t\t} from (${leftSelect}) ${sql.identifier('drizzle_union')}`;\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: PgSelectConfig['setOperators'][number];\n\t}): SQL {\n\t\tconst leftChunk = sql`(${leftSelect.getSQL()}) `;\n\t\tconst rightChunk = sql`(${rightSelect.withoutSelectionCastCodecs().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, PgColumn)) {\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, PgColumn)) {\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\toverridingSystemValue_,\n\t\tcomment,\n\t\tcolumnList,\n\t\tignoreSelectionCastCodecs,\n\t}: PgInsertConfig): SQL {\n\t\tconst columns: Record<string, PgColumn> = table[Table.Symbol.Columns];\n\t\tconst colEntries: [string, PgColumn][] = columnList\n\t\t\t? columnList.map((name) => [name, columns[name]!])\n\t\t\t: Object.entries(columns);\n\n\t\tconst colFilteredEntries: [string, PgColumn][] = 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, PgColumn])\n\t\t\t: overridingSystemValue_\n\t\t\t? colEntries\n\t\t\t: colEntries.filter(([_, col]) => !col.shouldDisableInsert());\n\n\t\tconst insertOrderArr: SQLChunk[] = new Array(colFilteredEntries.length * 2 + 1);\n\t\tlet writeIdx = 0;\n\t\tinsertOrderArr[writeIdx++] = new StringChunk('(');\n\t\tfor (let i = 0; i < colFilteredEntries.length; ++i) {\n\t\t\tconst [, { name }] = colFilteredEntries[i]!;\n\t\t\tinsertOrderArr[writeIdx++] = sql.identifier(name);\n\n\t\t\tif (i < colFilteredEntries.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: (colFilteredEntries.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 AnyPgSelectQueryBuilder | SQL).getSQL();\n\t\t} else {\n\t\t\tconst values = valuesOrSelect as Record<string, Param | SQL>[];\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 < colFilteredEntries.length; ++i) {\n\t\t\t\t\tconst [fieldName, col] = colFilteredEntries[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 < colFilteredEntries.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 ${\n\t\t\t\tthis.buildSelection(returning, { isSingleTable: true, ignoreCastCodecs: ignoreSelectionCastCodecs, table })\n\t\t\t}`\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\tconst overridingSql = overridingSystemValue_ === true\n\t\t\t? sql`overriding system value `\n\t\t\t: undefined;\n\n\t\treturn sql`${withSql}insert into ${table} ${insertOrder} ${overridingSql}${valuesSql}${onConflictSql}${returningSql}${\n\t\t\tcomment !== undefined ? sql` ${comment}` : undefined\n\t\t}`;\n\t}\n\n\tbuildRefreshMaterializedViewQuery({\n\t\tview,\n\t\tconcurrently,\n\t\twithNoData,\n\t}: {\n\t\tview: PgMaterializedView;\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\tcodecs: this.codecs,\n\t\t\tinvokeSource,\n\t\t});\n\t}\n\t_sqlToQuery(sql: SQL): 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\tcodecs: this.codecs,\n\t\t\ttagged: true,\n\t\t});\n\t}\n\n\tprivate buildRqbColumn(\n\t\ttable: Table | View,\n\t\tfield: unknown,\n\t\tkey: string,\n\t\tinJson: boolean,\n\t\tselection: BuildRelationalQueryResult['selection'],\n\t\ttableTsName: string,\n\t) {\n\t\tlet decoderColumn: Column | undefined;\n\t\tlet fieldType: BuildRelationalQueryResult['selection'][number]['fieldType'];\n\t\tlet output: SQL;\n\n\t\tif (is(field, Column)) {\n\t\t\tdecoderColumn = field;\n\t\t\tfieldType = 'Column';\n\n\t\t\tconst name = sql`${table}.${sql.identifier(field.name)}`;\n\t\t\tconst casted = inJson && (<PgCustomColumn<any>> field).jsonSelectIdentifier\n\t\t\t\t? (<PgCustomColumn<any>> field).jsonSelectIdentifier!(name, sql, (<PgCustomColumn<any>> field).dimensions)\n\t\t\t\t: this.codecs.apply(field, inJson ? 'castInJson' : 'cast', name);\n\n\t\t\toutput = sql`${casted} as ${sql.identifier(key)}`;\n\t\t} else if (is(field, SQL)) {\n\t\t\tdecoderColumn = (is(field.decoder, Column)) ? field.decoder : undefined;\n\t\t\tfieldType = 'SQL';\n\n\t\t\tconst q = sql`${table}.${sql.identifier(key)}`;\n\t\t\toutput = sql`${decoderColumn ? this.codecs.apply(decoderColumn, inJson ? 'castInJson' : 'cast', q) : q} as ${\n\t\t\t\tsql.identifier(key)\n\t\t\t}`;\n\t\t} else if (is(field, SQL.Aliased)) {\n\t\t\tdecoderColumn = is(field.sql.decoder, Column) ? field.sql.decoder : undefined;\n\t\t\tfieldType = 'SQL.Aliased';\n\n\t\t\tconst q = sql`${table}.${sql.identifier(field.fieldAlias)}`;\n\t\t\toutput = sql`${decoderColumn ? this.codecs.apply(decoderColumn, inJson ? 'castInJson' : 'cast', q) : q} as ${\n\t\t\t\tsql.identifier(key)\n\t\t\t}`;\n\t\t} else if (isSQLWrapper(field)) {\n\t\t\tconst query = (field as SQLWrapper).getSQL();\n\t\t\tdecoderColumn = is(query.decoder, Column) ? query.decoder : undefined;\n\t\t\tfieldType = 'SQLWrapper';\n\n\t\t\tconst q = sql`${table}.${sql.identifier(key)}`;\n\t\t\toutput = sql`${decoderColumn ? this.codecs.apply(decoderColumn, inJson ? 'castInJson' : 'cast', q) : q} as ${\n\t\t\t\tsql.identifier(key)\n\t\t\t}`;\n\t\t} else {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage: field === undefined\n\t\t\t\t\t? `Unknown column: \"${tableTsName}\".\"${key}\"`\n\t\t\t\t\t: `Views with nested selections are not supported by the relational query builder`,\n\t\t\t});\n\t\t}\n\n\t\tselection.push(\n\t\t\t(decoderColumn\n\t\t\t\t? {\n\t\t\t\t\tkey,\n\t\t\t\t\tfield,\n\t\t\t\t\tfieldType,\n\t\t\t\t\tcodec: decoderColumn && (!inJson || !(<PgCustomColumn<any>> decoderColumn).mapFromJsonValue)\n\t\t\t\t\t\t? this.codecs.get(decoderColumn, inJson ? 'normalizeInJson' : 'normalize')\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tarrayDimensions: (<PgColumn> decoderColumn).dimensions,\n\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\tkey,\n\t\t\t\t\tfield,\n\t\t\t\t\tfieldType,\n\t\t\t\t}) as BuildRelationalQueryResult['selection'][number],\n\t\t);\n\n\t\treturn output;\n\t}\n\n\tprivate buildColumns = (\n\t\ttable: Table | View,\n\t\tselection: BuildRelationalQueryResult['selection'],\n\t\tinJson: boolean,\n\t\ttableTsName: string,\n\t\tconfig?: DBQueryConfigWithComment<'many'>,\n\t) => {\n\t\tif (!config?.columns) {\n\t\t\treturn sql.join(\n\t\t\t\tObject.entries(table[TableColumns]).map(([k, v]) => {\n\t\t\t\t\treturn this.buildRqbColumn(table, v, k, inJson, selection, tableTsName);\n\t\t\t\t}),\n\t\t\t\tnew StringChunk(', '),\n\t\t\t);\n\t\t}\n\n\t\tconst entries = Object.entries(config.columns);\n\t\tconst columnContainer: Record<string, unknown> = table[TableColumns];\n\n\t\tconst columnIdentifiers: SQL[] = [];\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\tcolumnIdentifiers.push(this.buildRqbColumn(table, columnContainer[k]!, k, inJson, selection, tableTsName));\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 (config.columns[k] === false) continue;\n\t\t\t\tcolumnIdentifiers.push(this.buildRqbColumn(table, v, k, inJson, selection, tableTsName));\n\t\t\t}\n\t\t}\n\n\t\treturn columnIdentifiers.length\n\t\t\t? sql.join(columnIdentifiers, new StringChunk(', '))\n\t\t\t: undefined;\n\t};\n\n\tbuildRelationalQuery({\n\t\tschema,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\trelationWhere,\n\t\tmode,\n\t\terrorPath,\n\t\tdepth,\n\t\tthroughJoin,\n\t\tnested,\n\t}: {\n\t\tschema: TablesRelationalConfig;\n\t\ttable: PgTable | PgView;\n\t\ttableConfig: TableRelationalConfig;\n\t\tqueryConfig?: DBQueryConfigWithComment<'many'> | true;\n\t\trelationWhere?: SQL;\n\t\tmode: 'first' | 'many';\n\t\terrorPath?: string;\n\t\tdepth?: number;\n\t\tthroughJoin?: SQL;\n\t\tnested?: boolean;\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 where: SQL | undefined = params && 'where' in params && relationWhere\n\t\t\t? and(\n\t\t\t\trelationsFilterToSQL(\n\t\t\t\t\ttable,\n\t\t\t\t\tparams.where,\n\t\t\t\t\ttableConfig.relations,\n\t\t\t\t\tschema,\n\t\t\t\t),\n\t\t\t\trelationWhere,\n\t\t\t)\n\t\t\t: params && 'where' in params\n\t\t\t? relationsFilterToSQL(\n\t\t\t\ttable,\n\t\t\t\tparams.where,\n\t\t\t\ttableConfig.relations,\n\t\t\t\tschema,\n\t\t\t)\n\t\t\t: relationWhere;\n\t\tconst order = params?.orderBy\n\t\t\t? relationsOrderToSQL(table, params.orderBy)\n\t\t\t: undefined;\n\t\tconst columns = this.buildColumns(table, selection, !!nested, tableConfig.name, params);\n\t\tconst extras = params?.extras\n\t\t\t? relationExtrasToSQL(table, params.extras, this.codecs, nested)\n\t\t\t: undefined;\n\t\tif (extras) selection.push(...extras.selection);\n\n\t\tconst selectionArr: SQL[] = [];\n\t\tif (columns) selectionArr.push(columns);\n\t\tif (extras?.sql) selectionArr.push(extras.sql);\n\n\t\tlet joins: SQL | undefined;\n\t\tswitch (params) {\n\t\t\tcase undefined:\n\t\t\t\tbreak;\n\t\t\tdefault: {\n\t\t\t\tconst { with: withParam } = params as WithContainer;\n\t\t\t\tif (!withParam) break;\n\n\t\t\t\tconst withEntries = Object.entries(withParam).filter(([_, v]) => v);\n\t\t\t\tif (!withEntries.length) break;\n\n\t\t\t\tconst joinChunks: SQLChunk[] = new Array(withEntries.length * 2);\n\t\t\t\tjoinChunks[0] = new StringChunk(' ');\n\n\t\t\t\tfor (let readIdx = 0, writeIdx = 1; readIdx < withEntries.length; ++readIdx) {\n\t\t\t\t\tconst [k, join] = withEntries[readIdx]!;\n\n\t\t\t\t\tconst relation = tableConfig.relations[k];\n\t\t\t\t\tif (!relation) throw new DrizzleError({ message: `Unknown relation \"${tableConfig.name}\" -> \"${k}\"` });\n\t\t\t\t\tconst isSingle = relation.relationType === 'one';\n\t\t\t\t\tconst targetTable = aliasedTable(\n\t\t\t\t\t\trelation.targetTable,\n\t\t\t\t\t\t`d${currentDepth + 1}`,\n\t\t\t\t\t);\n\t\t\t\t\tconst throughTable = relation.throughTable\n\t\t\t\t\t\t? (aliasedTable(relation.throughTable, `tr${currentDepth}`) as\n\t\t\t\t\t\t\t| Table\n\t\t\t\t\t\t\t| View)\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\tconst { filter, joinCondition } = relationToSQL(\n\t\t\t\t\t\trelation,\n\t\t\t\t\t\ttable,\n\t\t\t\t\t\ttargetTable,\n\t\t\t\t\t\tthroughTable,\n\t\t\t\t\t);\n\n\t\t\t\t\tselectionArr.push(\n\t\t\t\t\t\tsql`${sql.identifier(k)}.${sql.identifier('r')} as ${sql.identifier(k)}`,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst throughJoin = throughTable\n\t\t\t\t\t\t? sql` inner join ${getTableAsAliasSQL(throughTable)} on ${joinCondition!}`\n\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\tconst innerQuery = this.buildRelationalQuery({\n\t\t\t\t\t\ttable: targetTable as PgTable | PgView,\n\t\t\t\t\t\tmode: isSingle ? 'first' : 'many',\n\t\t\t\t\t\tschema,\n\t\t\t\t\t\tqueryConfig: join as DBQueryConfigWithComment,\n\t\t\t\t\t\ttableConfig: schema[relation.targetTableName]!,\n\t\t\t\t\t\trelationWhere: filter,\n\t\t\t\t\t\terrorPath: `${currentPath.length ? `${currentPath}.` : ''}${k}`,\n\t\t\t\t\t\tdepth: currentDepth + 1,\n\t\t\t\t\t\tthroughJoin,\n\t\t\t\t\t\tnested: true,\n\t\t\t\t\t});\n\n\t\t\t\t\tselection.push({\n\t\t\t\t\t\tfield: targetTable,\n\t\t\t\t\t\tfieldType: 'Nested',\n\t\t\t\t\t\tkey: k,\n\t\t\t\t\t\tselection: innerQuery.selection,\n\t\t\t\t\t\tisArray: !isSingle,\n\t\t\t\t\t\tisOptional: ((relation as AnyOne).optional ?? false)\n\t\t\t\t\t\t\t|| (join !== true\n\t\t\t\t\t\t\t\t&& !!(join as Exclude<typeof join, boolean | undefined>)\n\t\t\t\t\t\t\t\t\t.where),\n\t\t\t\t\t});\n\n\t\t\t\t\tconst joinQuery = sql`left join lateral(select ${\n\t\t\t\t\t\tisSingle\n\t\t\t\t\t\t\t? sql`row_to_json(${sql.identifier('t')}.*) ${sql.identifier('r')}`\n\t\t\t\t\t\t\t: sql`coalesce(json_agg(row_to_json(${sql.identifier('t')}.*)), '[]') as ${sql.identifier('r')}`\n\t\t\t\t\t} from (${innerQuery.sql}) as ${sql.identifier('t')}) as ${sql.identifier(k)} on true`;\n\n\t\t\t\t\tjoinChunks[writeIdx++] = joinQuery;\n\t\t\t\t\tif (readIdx < withEntries.length - 1) joinChunks[writeIdx++] = new StringChunk(' ');\n\t\t\t\t}\n\n\t\t\t\tjoins = new SQL(joinChunks);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\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\tconst selectionSet = sql.join(selectionArr, new StringChunk(', '));\n\t\tconst comment = config !== true && config?.comment\n\t\t\t? sql.comment(config.comment)\n\t\t\t: undefined;\n\n\t\tconst query = sql`select ${selectionSet} from ${getTableAsAliasSQL(table)}${throughJoin}${joins}${\n\t\t\twhere ? sql` where ${where}` : undefined\n\t\t}${order ? sql` order by ${order}` : undefined}${limit !== undefined ? sql` limit ${limit}` : undefined}${\n\t\t\toffset !== undefined ? sql` offset ${offset}` : undefined\n\t\t}${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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"}