pqb 0.61.13 → 0.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.js","sources":["../src/utils.ts","../src/columns/types.ts","../src/query/query-columns/query-columns.ts","../src/query/errors.ts","../src/query/expressions/expression.ts","../src/query/expressions/sql-ref-expression.ts","../src/query/expressions/raw-sql.ts","../src/tableData.ts","../src/columns/column.ts","../src/columns/column-from-db.utils.ts","../src/columns/column-data-types.ts","../src/columns/code.ts","../src/columns/column-types/custom-type.ts","../src/columns/column-types/enum.ts","../src/columns/column.utils.ts","../src/query/basic-features/get/get-value-key.ts","../src/columns/operators.ts","../src/columns/column-types/date-time.ts","../src/columns/column-types/array.ts","../src/columns/column-types/json.ts","../src/columns/column-types/number.ts","../src/columns/default-schema-config.ts","../src/columns/column-types/string.ts","../src/columns/column-types/boolean.ts","../src/columns/timestamps.ts","../src/columns/column-types/postgis.ts","../src/columns/column-types.ts","../src/columns/column-types/virtual.ts","../src/columns/column-types/unknown.ts","../src/columns/columns-by-type.ts","../src/columns/any-shape.ts","../src/query/query-data.ts","../src/query/basic-features/clone/clone.ts","../src/query/extra-features/hooks/hooks.ts","../src/query/query-columns/query-column-parsers.ts","../src/quote.ts","../src/query/basic-features/log/log.ts","../src/query/basic-features/storage/storage.ts","../src/query/basic-features/transaction/transaction.ts","../src/query/extra-features/data-transform/transform.ts","../src/query/extra-features/computed/computed.ts","../src/query/query-columns/primary-keys.ts","../src/query/extra-features/scope/scope.ts","../src/query/internal-features/mutative-queries-select-relation/mutative-queries-select-relations.result-handler.ts","../src/query/then/then.ts","../src/query/basic-features/as/as.ts","../src/query/query.utils.ts","../src/query/extra-features/none/none.ts","../src/query/internal-features/sub-query/sub-query-for-sql.ts","../src/query/basic-features/from/from.ts","../src/query/basic-features/wrap/wrap.ts","../src/query/query.ts","../src/query/sql/get-is-join-sub-query.ts","../src/query/basic-features/join/process-join-args.ts","../src/query/relations.ts","../src/query/basic-features/where/where.ts","../src/query/extra-features/chain/chain.ts","../src/query/internal-features/sub-query/sub-query.ts","../src/query/sql/wrap-main-query-in-cte.ts","../src/query/sql/sql.ts","../src/query/basic-features/join/join.ts","../src/query/basic-features/select/hook-select.ts","../src/query/internal-features/mutative-queries-select-relation/mutative-queries-select-relations.qb.ts","../src/query/basic-features/select/select.utils.ts","../src/query/basic-features/union/union.ts","../src/query/basic-features/cte/cte.query.ts","../src/query/sql/column-to-sql.ts","../src/query/basic-features/join/join.sql.ts","../src/query/expressions/select-item-expression.ts","../src/query/basic-features/get/get.utils.ts","../src/query/basic-features/json/json.utils.ts","../src/query/basic-features/cte/move-mutative-query-to-cte-base.sql.ts","../src/query/extra-features/hooks/hooks.sql.ts","../src/query/internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql.ts","../src/query/basic-features/select/select.sql.ts","../src/query/basic-features/where/where.sql.ts","../src/query/sql/sql-constants.ts","../src/query/basic-features/mutate/insert.sql.ts","../src/query/basic-features/limit-offset/limit-offset.sql.ts","../src/query/basic-features/mutate/update.sql.ts","../src/query/basic-features/mutate/delete.sql.ts","../src/query/basic-features/distinct/distinct.sql.ts","../src/query/extra-features/search/search.sql.ts","../src/query/sql/check-if-a-simple-query.ts","../src/query/basic-features/from/fromAndAs.sql.ts","../src/query/basic-features/having/having.sql.ts","../src/query/basic-features/order/order.sql.ts","../src/query/basic-features/window/window.sql.ts","../src/query/basic-features/union/union.sql.ts","../src/query/basic-features/for/for.sql.ts","../src/query/sql/to-sql.ts","../src/query/basic-features/cte/cte.sql.ts","../src/query/basic-features/get/get.query.ts","../src/query/expressions/fn-expression.ts","../src/query/basic-features/aggregate/aggregate.ts","../src/query/basic-features/mutate/create-from.ts","../src/query/basic-features/select/select.ts","../src/query/basic-features/mutate/create.ts","../src/query/basic-features/mutate/delete.ts","../src/query/basic-features/mutate/or-create.ts","../src/query/expressions/ref-expression.ts","../src/query/basic-features/mutate/update.ts","../src/query/basic-features/mutate/upsert.ts","../src/query/basic-features/schema/schema.ts","../src/query/expressions/column-ref-expression.ts","../src/query/expressions/or-expression.ts","../src/query/expressions/val-expression.ts","../src/query/expressions/query-expressions.ts","../src/query/extra-features/append-query/append-query.ts","../src/query/extra-features/merge/merge.ts","../src/query/extra-features/default-privileges/default-privileges.ts","../src/query/basic-features/json/json.ts","../src/query/basic-features/for/for.ts","../src/query/extra-features/search/search.ts","../src/query/extra-features/clear/clear.ts","../src/query/basic-features/having/having.ts","../src/query/extra-features/data-transform/map.ts","../src/query/basic-features/mutate/soft-delete.ts","../src/query/basic-features/distinct/distinct.ts","../src/query/basic-features/limit-offset/limit-offset.ts","../src/query/basic-features/order/order.ts","../src/query/extra-features/truncate/truncate.sql.ts","../src/query/extra-features/truncate/truncate.ts","../src/query/basic-features/window/window.ts","../src/query/query-methods.ts","../src/query/db-sql-query.ts","../src/query/db.ts","../src/adapters/adapter.ts"],"sourcesContent":["import url from 'url';\nimport path from 'node:path';\n\nexport type UnionToIntersection<U> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (U extends any ? (x: U) => void : never) extends (x: infer I) => void\n ? I\n : never;\n\n// It may be a value or an array of such values.\nexport type MaybeArray<T> = T | T[];\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport interface FnUnknownToUnknown {\n (a: unknown): unknown;\n}\n\n// Utility type to store info to know which keys are available.\n// Use it for cases where you'd want to pick a string union,\n// this record type solves the same use case, but is better at handling the empty case.\nexport interface RecordKeyTrue {\n [K: string]: true;\n}\n\nexport interface RecordString {\n [K: string]: string;\n}\n\nexport interface RecordStringOrNumber {\n [K: string]: string | number;\n}\n\nexport interface RecordOptionalString {\n [K: string]: string | undefined;\n}\n\nexport interface RecordUnknown {\n [K: string]: unknown;\n}\n\nexport interface RecordBoolean {\n [K: string]: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ShallowSimplify<T> = T extends any ? { [K in keyof T]: T[K] } : T;\n\n/**\n * Merge methods from multiple class into another class.\n * @param derivedCtor - target class to merge methods into\n * @param constructors - classes to merge methods from\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function applyMixins(targetClass: any, mixinClasses: any[]) {\n const target = targetClass.prototype;\n for (const mixinClass of mixinClasses) {\n for (const key of Object.getOwnPropertyNames(mixinClass.prototype)) {\n if (key !== 'constructor') {\n target[key] = mixinClass.prototype[key];\n }\n }\n }\n}\n\n/**\n * Join array of strings with '', ignoring empty strings, false, undefined.\n * @param strings - array of strings, or false, or undefined\n */\nexport const joinTruthy = (...strings: (string | false | undefined)[]) => {\n return strings.filter((string) => string).join('');\n};\n\n/**\n * When array is passed, it is returned as is, otherwise, returns a new array with the provided value.\n * @param item - array or a value to turn into array\n */\nexport const toArray = <T>(item: T) =>\n (Array.isArray(item) ? item : [item]) as unknown as T extends unknown[]\n ? T\n : [T];\n\n// Shared doing nothing function\nexport const noop = () => {};\n\nexport const returnArg = <T>(a: T) => a;\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type EmptyObject = {};\n// Shared empty object to avoid unnecessary allocations\nexport const emptyObject = {};\n\n// Type of empty array\nexport type EmptyTuple = [];\n// Shared empty array to avoid unnecessary allocations\nexport const emptyArray = [];\n\n/**\n * Push a value into an array in the object if it's defined, or set a new array with a single value into the object.\n * Does not mutate the array.\n *\n * @param obj - object that can contain the array by the key\n * @param key - key to access an array in the object\n * @param value - value to push into the array\n */\nexport const pushOrNewArrayToObjectImmutable = (\n obj: object,\n key: string | number,\n value: unknown,\n) => {\n (obj as RecordUnknown)[key] = (obj as RecordUnknown)[key]\n ? [...((obj as RecordUnknown)[key] as unknown[]), value]\n : [value];\n};\n\n/**\n * Set value into the object in data, create the object if it doesn't yet exist.\n * Does not mutate the object.\n *\n * @param q - object\n * @param object - query data key to get the object\n * @param key - object key to set the value into\n * @param value - value to set by the key\n */\nexport const setObjectValueImmutable = <T>(\n q: T,\n object: string,\n key: PropertyKey,\n value: unknown,\n): T => {\n (q as RecordUnknown)[object] = {\n ...((q as RecordUnknown)[object] as RecordUnknown),\n [key]: value,\n };\n return q;\n};\n\nexport const spreadObjectValues = (\n q: object,\n object: string,\n value: RecordUnknown,\n) => {\n (q as RecordUnknown)[object] = {\n ...((q as RecordUnknown)[object] as RecordUnknown),\n ...value,\n };\n};\n\n/**\n * Push value into an array if it's defined, or return a new array with a single value.\n * @param arr - array to push into, or `undefined`\n * @param value - value to push into the array\n */\nexport const pushOrNewArray = <Arr extends unknown[]>(\n arr: Arr | undefined,\n value: Arr[number],\n): Arr => {\n if (arr) {\n arr.push(value);\n return arr;\n } else {\n return [value] as Arr;\n }\n};\n\n/**\n * For code generation: quote a string with a single quote, escape characters.\n * @param s - string to quote\n */\nexport const singleQuote = (s: string) => {\n return `'${s.replaceAll('\\\\', '\\\\\\\\').replaceAll(\"'\", \"\\\\'\")}'`;\n};\n\n/**\n * For code generation: quote string with a backtick, escape characters.\n * @param s - string to quote\n */\nexport const backtickQuote = (s: string) => {\n return `\\`${s.replaceAll('\\\\', '\\\\\\\\').replaceAll('`', '\\\\`')}\\``;\n};\n\n/**\n * For code generation: stringify array of strings using a single quote.\n * @param arr\n */\nexport const singleQuoteArray = (arr: string[]) => {\n return `[${arr.map(singleQuote).join(', ')}]`;\n};\n\n/**\n * For code generation: some strings must be quoted when used as an object key.\n * This function quotes the strings when needed.\n * @param key - object key to quote\n * @param toCamel - change to camel case\n */\nexport const quoteObjectKey = (key: string, toCamel: boolean | undefined) => {\n if (toCamel) key = toCamelCase(key);\n return /^[a-zA-Z_$][\\w$]*$/.test(key) ? key : singleQuote(key);\n};\n\n/**\n * Check if the object has no values that are not `undefined`.\n * @param obj\n */\nexport const isObjectEmpty = (obj: object) => !objectHasValues(obj);\n\n/**\n * Check if the object has at least one value that is not `undefined`.\n * Nulls counts.\n * @param obj - any object\n */\nexport const objectHasValues = (obj?: object) => {\n if (!obj) return false;\n for (const key in obj) {\n if (obj[key as keyof typeof obj] !== undefined) return true;\n }\n return false;\n};\n\n/**\n * If we simply log file path as it is, it may be not clickable in the terminal.\n * On Windows, it is clickable as it is, so it is returned as is.\n * On Linux (at least in my JetBrains editor terminal) it's transformed to URL format to be clickable.\n * @param path - file path\n */\nexport const pathToLog = (path: string) => {\n return process.platform === 'win32'\n ? path\n : url.pathToFileURL(path).toString();\n};\n\n/**\n * Translate a string to camelCase\n * @param str - string to translate\n */\nexport const toCamelCase = (str: string) => {\n return str\n .replace(/^_+/g, '')\n .replace(/_+./g, (a) => a[a.length - 1].toUpperCase())\n .replace(/_+$/g, '');\n};\n\n/**\n * Translate a string to a PascalCase\n * @param str - string to translate\n */\nexport const toPascalCase = (str: string) => {\n const camel = toCamelCase(str);\n return camel[0].toUpperCase() + camel.slice(1);\n};\n\n/**\n * Translate a string to a snake_case.\n * @param str - string to translate\n */\nexport const toSnakeCase = (str: string) => {\n return str.replace(/[A-Z]/g, (a) => `_${a.toLowerCase()}`);\n};\n\n/**\n * Compare two values deeply.\n * undefined and empty object are considered to be equal.\n * @param a - any value\n * @param b - any value\n */\nexport const deepCompare = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n\n if (typeof a !== typeof b) {\n if (a === undefined && typeof b === 'object') {\n a = emptyObject;\n } else if (typeof a === 'object' && b === undefined) {\n b = emptyObject;\n } else {\n return false;\n }\n }\n\n if (typeof a === 'object') {\n if (a === null) {\n return b === null;\n }\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) {\n return false;\n }\n\n return a.every((item, i) => deepCompare(item, (b as unknown[])[i]));\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n for (const key in a) {\n if (!deepCompare((a as RecordUnknown)[key], (b as RecordUnknown)[key])) {\n return false;\n }\n }\n\n for (const key in b as RecordUnknown) {\n if (!(key in a) && (b as RecordUnknown)[key] !== undefined) {\n return false;\n }\n }\n\n return true;\n }\n\n return a === b;\n};\n\n/**\n * Returns a relative path to use as an `import` source to import one file from another.\n * @param from - TS file where we want to place the `import`\n * @param to - TS file that we're importing\n */\nexport const getImportPath = (from: string, to: string) => {\n const rel = path\n .relative(path.dirname(from), to)\n .split(path.sep)\n .join(path.posix.sep);\n\n const importPath =\n rel.startsWith('./') || rel.startsWith('../') ? rel : `./${rel}`;\n\n return importPath.replace(/\\.[tj]s$/, '');\n};\n\n/**\n * Get stack trace to collect info about who called the function\n */\nexport const getStackTrace = (): NodeJS.CallSite[] | undefined => {\n let stack: NodeJS.CallSite[] | undefined;\n const original = Error.prepareStackTrace;\n Error.prepareStackTrace = (_, s) => (stack = s as NodeJS.CallSite[]);\n new Error().stack;\n Error.prepareStackTrace = original;\n return stack;\n};\n\n/**\n * Get a file path of the function which called the function which called this `getCallerFilePath`.\n * Determines file path by error stack trace, skips any paths that are located in `node_modules`.\n * @param stack - optionally provide an existing stack trace\n */\nexport const getCallerFilePath = (\n stack = getStackTrace(),\n): string | undefined => {\n if (stack) {\n const coreLibFile = stack[0]?.getFileName();\n let i = 1;\n if (stack[1]?.getFileName() === coreLibFile) {\n i++;\n }\n // other orchid library that called the function in this file\n const libFile = stack[i]?.getFileName();\n const libDir = libFile && path.dirname(libFile);\n for (; i < stack.length; i++) {\n const item = stack[i];\n let file = item.getFileName();\n if (\n !file ||\n // skip files in the caller orchid library\n path.dirname(file) === libDir ||\n // skip any files in the node_modules\n /\\bnode_modules\\b/.test(file)\n ) {\n continue;\n }\n\n // on Windows with ESM file is file:///C:/path/to/file.ts\n // it is not a valid URL\n if (/file:\\/\\/\\/\\w+:\\//.test(file)) {\n file = decodeURI(file.slice(8));\n } else {\n try {\n file = new URL(file).pathname;\n } catch (_) {}\n }\n\n return file;\n }\n }\n\n return;\n};\n\n/**\n * Call function passing `this` as an argument,\n * micro-optimization for `map` and `forEach` to not define temporary inline function\n * ```ts\n * arrayOfFns.map(callWithThis, argument)\n * ```\n * @param cb\n */\nexport const callWithThis = function <T, R>(this: T, cb: (arg: T) => R): R {\n return cb(this);\n};\n\nexport const pick = <T, Keys extends keyof T>(\n obj: T,\n keys: Keys[],\n): Pick<T, Keys> => {\n const res = {} as T;\n for (const key of keys) {\n res[key] = obj[key];\n }\n return res;\n};\n\nexport const omit = <T, Keys extends keyof T>(\n obj: T,\n keys: Keys[],\n): Omit<T, Keys> => {\n const res = { ...obj };\n for (const key of keys) {\n delete res[key];\n }\n return res;\n};\n\nexport const addValue = (values: unknown[], value: unknown) => {\n values.push(value);\n return `$${values.length}`;\n};\n\nexport const getFreeAlias = (\n obj: RecordUnknown | undefined,\n as: string,\n): string => {\n if (obj?.[as]) {\n let suffix = 2;\n let name;\n while (obj[(name = as + suffix)]) {\n suffix++;\n }\n as = name;\n }\n return as;\n};\n\nexport const setFreeAlias = (\n obj: RecordUnknown,\n as: string,\n value: unknown,\n): string => {\n const key = getFreeAlias(obj, as);\n obj[key] = value;\n return key;\n};\n\nexport const getFreeSetAlias = (\n set: Set<string>,\n as: string,\n start = 2,\n): string => {\n if (set.has(as)) {\n let suffix = start;\n let name;\n while (set.has((name = as + suffix))) {\n suffix++;\n }\n as = name;\n }\n return as;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const exhaustive = (_: never) => {\n throw new Error('Condition was not exhaustive');\n};\n\nexport const pluralize = (w: string, count: number, append = 's') => {\n return count === 1 ? w : w + append;\n};\n\nexport const isIterable = (x: unknown): x is Iterable<unknown> =>\n !!(\n x &&\n typeof x === 'object' &&\n typeof x[Symbol.iterator as never] === 'function'\n );\n\nexport const colors = {\n yellow: (s: string) => `\\x1b[33m${s}\\x1b[0m`,\n green: (s: string) => `\\x1b[32m${s}\\x1b[0m`,\n red: (s: string) => `\\x1b[31m${s}\\x1b[0m`,\n blue: (s: string) => `\\x1b[34m${s}\\x1b[0m`,\n bright: (s: string) => `\\x1b[1m${s}\\x1b[0m`,\n blueBold: (s: string) => `\\x1b[1m\\x1b[34m${s}\\x1b[0m`,\n yellowBold: (s: string) => `\\x1b[1m\\x1b[33m${s}\\x1b[0m`,\n greenBold: (s: string) => `\\x1b[1m\\x1b[32m${s}\\x1b[0m`,\n pale: (s: string) => `\\x1b[2m${s}\\x1b[0m`,\n};\n","/**\n * Symbol that turns on a snake case column names.\n * It is set on the column types.\n * When it's on, column names in ORM are still as user types them, but they are translated to snake_case when generating SQL.\n */\nexport const snakeCaseKey: unique symbol = Symbol('snakeCase');\n\nexport interface TimeInterval {\n years?: number;\n months?: number;\n days?: number;\n hours?: number;\n minutes?: number;\n seconds?: number;\n}\n","import { Column } from '../../columns';\nimport { Query } from '../query';\n\nexport interface QueryInternalColumnNameToKey {\n // cache `columnNameToKey` method that's available on table instances\n columnNameToKeyMap?: Map<string, string>;\n}\n\n/**\n * In snake case mode, or when columns have custom names,\n * use this method to exchange a db column name to its runtime key.\n */\nexport const queryColumnNameToKey = (\n q: Query,\n name: string,\n): string | undefined => {\n let map = q.internal.columnNameToKeyMap;\n if (!map) {\n q.internal.columnNameToKeyMap = map = new Map<string, string>();\n\n const { shape } = q;\n for (const key in q.shape) {\n const column = shape[key];\n map.set((column as Column.Pick.QueryInit).data.name ?? key, key);\n }\n }\n\n return map.get(name);\n};\n","import { RecordUnknown } from '../utils';\nimport { PickQueryShape } from './pick-query-types';\nimport { IsQuery, Query } from './query';\nimport { queryColumnNameToKey } from './query-columns/query-columns';\n\nexport abstract class OrchidOrmError extends Error {}\n\n/**\n * When we search for a single record, and it is not found, it can either throw an error, or return `undefined`.\n *\n * Unlike other database libraries, `Orchid ORM` decided to throw errors by default when using methods `take`, `find`, `findBy`, `get` and the record is not found.\n * It is a [good practice](https://github.com/goldbergyoni/nodebestpractices/blob/master/sections/errorhandling/centralizedhandling.md) to catch common errors in a centralized place (see [global error handling](https://orchid-orm.netlify.app/guide/error-handling.html#global-error-handling)), and this allows for a more concise code.\n *\n * If it's more suitable to get the `undefined` value instead of throwing, use `takeOptional`, `findOptional`, `findByOptional`, `getOptional` instead.\n */\nexport class NotFoundError extends OrchidOrmError {\n // `#query` is private to prevent it from serializing to not cause problems to test runner reports\n // it is exposed with `getQuery` method which prevents this problem from both Vitest and Jest.\n // Exposing it with `get query()` still leaves the issue in Vitest.\n readonly #query: Query;\n\n constructor(query: IsQuery, message = 'Record is not found') {\n super(message);\n this.#query = query as Query;\n }\n\n getQuery() {\n return this.#query;\n }\n}\n\nexport class OrchidOrmInternalError extends Error {\n // `#query` is private to prevent it from serializing to not cause problems to test runner reports\n // it is exposed with `getQuery` method which prevents this problem from both Vitest and Jest.\n // Exposing it with `get query()` still leaves the issue in Vitest.\n readonly #query: Query;\n\n constructor(query: IsQuery, message?: string, public data?: RecordUnknown) {\n super(message);\n this.#query = query as Query;\n }\n\n getQuery() {\n return this.#query;\n }\n}\n\nexport type QueryErrorName =\n | 'parseComplete'\n | 'bindComplete'\n | 'closeComplete'\n | 'noData'\n | 'portalSuspended'\n | 'replicationStart'\n | 'emptyQuery'\n | 'copyDone'\n | 'copyData'\n | 'rowDescription'\n | 'parameterDescription'\n | 'parameterStatus'\n | 'backendKeyData'\n | 'notification'\n | 'readyForQuery'\n | 'commandComplete'\n | 'dataRow'\n | 'copyInResponse'\n | 'copyOutResponse'\n | 'authenticationOk'\n | 'authenticationMD5Password'\n | 'authenticationCleartextPassword'\n | 'authenticationSASL'\n | 'authenticationSASLContinue'\n | 'authenticationSASLFinal'\n | 'error'\n | 'notice';\n\nexport abstract class QueryError<\n T extends PickQueryShape = PickQueryShape,\n> extends OrchidOrmInternalError {\n declare message: string;\n declare name: QueryErrorName;\n declare stack: string | undefined;\n code: string | undefined;\n detail: string | undefined;\n severity: string | undefined;\n hint: string | undefined;\n position: string | undefined;\n internalPosition: string | undefined;\n internalQuery: string | undefined;\n where: string | undefined;\n schema: string | undefined;\n table: string | undefined;\n column: string | undefined;\n dataType: string | undefined;\n constraint: string | undefined;\n file: string | undefined;\n line: string | undefined;\n routine: string | undefined;\n\n get isUnique() {\n return this.code === '23505';\n }\n\n #columnsCache?: { [K in keyof T['shape']]?: true };\n get columns() {\n if (this.#columnsCache) return this.#columnsCache;\n\n const columns: { [K in keyof T['shape']]?: true } = {};\n\n if (this.detail) {\n const list = this.detail.match(/\\((.*)\\)=/)?.[1];\n if (list) {\n list.split(', ').forEach((item) => {\n const column = (\n item.startsWith('\"') ? item.slice(1, -1) : item\n ) as keyof T['shape'];\n\n const key =\n queryColumnNameToKey(this.getQuery(), column as string) ?? column;\n columns[key as keyof T['shape']] = true;\n });\n }\n }\n\n return (this.#columnsCache = columns);\n }\n}\n\nexport class MoreThanOneRowError extends OrchidOrmInternalError {\n constructor(query: IsQuery, message?: string) {\n super(query, message);\n }\n}\n\nexport class UnhandledTypeError extends OrchidOrmInternalError {\n constructor(query: IsQuery, value: never) {\n super(query, `Unhandled type: ${JSON.stringify(value)} received`);\n }\n}\n","import { EmptyObject, RecordUnknown } from '../../utils';\nimport { Column } from '../../columns/column';\nimport { OperatorToSQL } from '../../columns/operators';\nimport { HasBeforeAndBeforeSet } from '../internal-features/sub-query/sub-query-for-sql';\nimport { PickQuerySelectable } from '../pick-query-types';\nimport { QueryBeforeHook } from '../query-data';\nimport { ToSqlValues } from '../sql/to-sql';\n\nexport type SelectableOrExpression<\n T extends PickQuerySelectable = PickQuerySelectable,\n C extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n> = '*' | keyof T['__selectable'] | Expression<C>;\n\nexport type SelectableOrExpressions<\n T extends PickQuerySelectable = PickQuerySelectable,\n C extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n> = ('*' | keyof T['__selectable'] | Expression<C>)[];\n\nexport type ExpressionOutput<\n T extends PickQuerySelectable,\n Expr extends SelectableOrExpression<T>,\n> = Expr extends keyof T['__selectable']\n ? T['__selectable'][Expr]['column']\n : Expr extends Expression\n ? Expr['result']['value']\n : never;\n\n// The chain array is used to store a sequence of operators and their arguments, one be one.\n// For example, expression of numeric type may be chained to `lt`, `gt` and similar functions.\nexport type ExpressionChain = (OperatorToSQL | unknown)[];\n\nexport interface ExpressionData extends HasBeforeAndBeforeSet {\n chain?: ExpressionChain;\n expr?: Expression;\n before?: QueryBeforeHook[];\n dynamicBefore?: boolean;\n}\n\n// Base class for the raw SQL and other classes that can produce SQL\nexport abstract class Expression<\n T extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n> {\n // `result` contains an instance of a column type.\n // Starts with underscore to allow having `type` method\n abstract result: { value: T };\n\n abstract q: ExpressionData;\n\n // used in update to prevent non-select sub-queries\n declare meta: { kind: 'select' };\n\n // Produce SQL string by calling `makeSQL` and applying operators from the `q.chain`, push query variables into given `values` array.\n toSQL(ctx: ToSqlValues, quotedAs?: string): string {\n let sql = this.makeSQL(ctx, quotedAs);\n if (this.q.chain) {\n const { chain: chain } = this.q;\n for (let i = 0, len = chain.length; i < len; i += 2) {\n sql = (chain[i] as OperatorToSQL)(\n sql,\n chain[i + 1] as never,\n ctx,\n quotedAs,\n );\n }\n }\n return sql;\n }\n\n // `makeSQL` should be implemented on subclasses of Expression to return SQL of the expression.\n // Result of `makeSQL` will be chained with operators by `toSQL`.\n abstract makeSQL(ctx: ToSqlValues, quotedAs?: string): string;\n}\n\n// Check if the unknown thing is an Expression\nexport const isExpression = (arg: unknown): arg is Expression =>\n arg instanceof Expression;\n\n// Object representing SQL query.\n// Constructed by `toSQL`, passed to adapter.query and adapter.array\nexport type TemplateLiteralArgs = [\n strings: TemplateStringsArray,\n ...values: unknown[],\n];\n\n// Check if arguments are a template literal.\nexport const isTemplateLiteralArgs = (\n args: unknown[],\n): args is TemplateLiteralArgs =>\n Array.isArray(args[0]) && 'raw' in args[0] && Array.isArray(args[0].raw);\n\n// Argument type for `sql` function.\n// It can take a template literal, an object `{ raw: string, values?: Record<string, unknown> }`,\n// or a function to build SQL lazily.\nexport type SQLArgs = StaticSQLArgs | [DynamicSQLArg<Column.Pick.QueryColumn>];\n\n// Function for sql method to build SQL lazily (dynamically).\n// May be used for computed column to build a different SQL in different executions.\nexport interface DynamicSQLArg<T extends Column.Pick.QueryColumn> {\n (sql: (...args: StaticSQLArgs) => Expression<T>): Expression<T>;\n}\n\n// SQL arguments for a non-lazy SQL expression.\nexport type StaticSQLArgs =\n | TemplateLiteralArgs\n | [{ raw: string; values?: RawSQLValues }];\n\n// Record of values to pass and store in a RawSql instance.\nexport type RawSQLValues = RecordUnknown;\n\n// `type` method to be used in both static and dynamic variants of SQL expressions.\nexport abstract class ExpressionTypeMethod {\n // Define the resulting column type for the raw SQL.\n type<\n T extends {\n q: { expr?: Expression };\n columnTypes: unknown;\n },\n C extends Column.Pick.QueryColumn,\n >(\n this: T,\n fn: (types: T['columnTypes']) => C,\n ): // Omit is optimal\n Omit<T, 'result'> & { result: { value: C } } {\n const column = fn(this.columnTypes) as unknown as Column;\n (this.q.expr as Expression).result.value = column;\n Object.assign(\n 'baseQuery' in this ? (this.baseQuery as EmptyObject) : this,\n column.operators,\n );\n return this as never;\n }\n}\n\nexport const templateLiteralSQLToCode = (sql: TemplateLiteralArgs): string => {\n let code = '`';\n\n const parts = sql[0];\n let i = 0;\n for (let last = parts.length - 1; i < last; i++) {\n code += parts[i] + `\\${${sql[i + 1]}}`;\n }\n code += parts[i];\n\n return code + '`';\n};\n","import { Expression, ExpressionData } from './expression';\nimport { Column } from '../../columns/column';\n\n/**\n * Expression for a SQL identifier reference.\n * Used to safely quote identifiers in raw SQL queries.\n */\nexport class SqlRefExpression extends Expression {\n result = { value: {} as Column.Pick.QueryColumn };\n q: ExpressionData = { expr: this };\n\n constructor(public name: string) {\n super();\n }\n\n makeSQL() {\n // Quote a SQL identifier (table name, column name, schema name, etc.).\n // Handle dots to support qualified names like \"schema.table\" → \"schema\".\"table\".\n // Escape double quotes by doubling them.\n return `\"${this.name.replaceAll('\"', '\"\"').replaceAll('.', '\".\"')}\"`;\n }\n}\n","import {\n DynamicSQLArg,\n Expression,\n ExpressionData,\n ExpressionTypeMethod,\n isTemplateLiteralArgs,\n RawSQLValues,\n SQLArgs,\n StaticSQLArgs,\n TemplateLiteralArgs,\n templateLiteralSQLToCode,\n} from './expression';\nimport { SqlRefExpression } from './sql-ref-expression';\nimport { Column } from '../../columns/column';\nimport { ColumnSchemaConfig } from '../../columns/column-schema';\nimport { DefaultColumnTypes } from '../../columns/column-types';\nimport { ToSQLCtx, ToSqlValues } from '../sql/to-sql';\nimport { emptyObject, RecordUnknown } from '../../utils';\nimport { PrepareSubQueryForSql } from '../internal-features/sub-query/sub-query-for-sql';\nimport { SQLQueryArgs } from '../db-sql-query';\n\nlet prepareSubQueryForSql: PrepareSubQueryForSql;\nexport const setRawSqlPrepareSubQueryForSql = (fn: PrepareSubQueryForSql) => {\n prepareSubQueryForSql = fn;\n};\n\n// reuse array to track which variables were used in the SQL, to throw when there are some unused.\nconst used: string[] = [];\nconst literalValues: number[] = [];\n\nexport const templateLiteralToSQL = (\n template: TemplateLiteralArgs,\n ctx: ToSqlValues,\n quotedAs?: string,\n): string => {\n let sql = '';\n const { values } = ctx;\n const parts = template[0];\n literalValues.length = 0;\n\n let i = 0;\n for (let last = parts.length - 1; i < last; i++) {\n sql += parts[i];\n\n const value = template[i + 1];\n if (value instanceof Expression) {\n sql += value.toSQL(ctx, quotedAs);\n } else {\n values.push(value);\n literalValues.push(sql.length);\n sql += `$${values.length}`;\n }\n }\n\n return sql + parts[i];\n};\n\nexport interface RawSqlBase extends Expression {\n _sql: string | TemplateLiteralArgs;\n _values?: RawSQLValues;\n}\n\n// RawSql extends both Expression and ExpressionTypeMethod, so it needs a separate interface.\nexport interface RawSql<\n T extends Column.Pick.QueryColumn,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ColumnTypes,\n> extends Expression<T>,\n RawSqlBase,\n ExpressionTypeMethod {}\n\nexport class RawSql<\n T extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n ColumnTypes = DefaultColumnTypes<ColumnSchemaConfig>,\n> extends Expression<T> {\n // Column type instance, it is assigned directly to the prototype of RawSql class.\n declare result: { value: T };\n // Column types are stored to be passed to the `type` callback.\n declare columnTypes: ColumnTypes;\n q: ExpressionData;\n _sql: string | TemplateLiteralArgs;\n _values?: RawSQLValues;\n\n constructor(\n sql: string | TemplateLiteralArgs,\n values?: RawSQLValues,\n type?: T,\n ) {\n super();\n this.q = { expr: this };\n this._sql = sql;\n this._values = values;\n this.result = { value: type as T };\n if (type) {\n Object.assign(this, type.operators);\n }\n }\n\n // Attach query variables to the raw SQL.\n values<Self extends RawSqlBase>(this: Self, values: RawSQLValues): Self {\n this._values = values;\n return this;\n }\n\n // Produce SQL string, push query variables into given `values` array.\n makeSQL(ctx: ToSqlValues, quotedAs?: string): string {\n let sql;\n const isTemplate = typeof this._sql !== 'string';\n\n if (isTemplate) {\n sql = templateLiteralToSQL(\n this._sql as TemplateLiteralArgs,\n ctx,\n quotedAs,\n );\n } else {\n sql = this._sql as string;\n }\n\n const data = this._values;\n if (!data) {\n return sql;\n }\n\n const { values } = ctx;\n const arr = sql.split(\"'\");\n const len = arr.length;\n used.length = 0;\n for (let i = 0; i < len; i += 2) {\n arr[i] = arr[i].replace(/\\$\\$?(\\w+)/g, (match, key, i) => {\n if (isTemplate && literalValues.includes(i)) return match;\n\n const value = data[key];\n if (value === undefined) {\n throw new Error(`Query variable \\`${key}\\` is not provided`);\n }\n\n used.push(key);\n\n if (match.length - key.length === 2) {\n if (typeof value !== 'string') {\n throw new Error(\n `Expected string value for $$${key} SQL keyword, got ${typeof value}`,\n );\n }\n\n return `\"${value.replace('\"', '\"\"').replace('.', '\".\"')}\"`;\n }\n\n values.push(value);\n return `$${values.length}`;\n });\n }\n\n if (used.length > 0 && used.length < Object.keys(data).length) {\n for (const key in data) {\n if (!used.includes(key)) {\n throw new Error(`Query variable \\`${key}\\` is unused`);\n }\n }\n }\n\n return arr.join(\"'\");\n }\n}\n\n// Check if something is a raw SQL.\nexport const isRawSQL = (arg: unknown): arg is RawSqlBase =>\n arg instanceof RawSql;\n\nRawSql.prototype.type = ExpressionTypeMethod.prototype.type;\n\n// Convert raw SQL to code for a code generator.\nexport const rawSqlToCode = (rawSql: RawSqlBase, t: string): string => {\n const { _sql: sql, _values: values } = rawSql;\n let code = `${t}.sql`;\n\n code +=\n typeof sql === 'string'\n ? values\n ? `({ raw: '${sql.replace(/'/g, \"\\\\'\")}' })`\n : `\\`${sql.replace(/`/g, '\\\\`')}\\``\n : templateLiteralSQLToCode(sql);\n\n if (values) {\n code += `.values(${JSON.stringify(values)})`;\n }\n\n return code;\n};\n\n// `DynamicRawSQL` extends both `Expression` and `ExpressionTypeMethod`, so it needs a separate interface.\nexport interface DynamicRawSQL<T extends Column.Pick.QueryColumn>\n extends Expression<T>,\n ExpressionTypeMethod {}\n\n// Calls the given function to get inner SQL each time when converting to SQL.\nexport class DynamicRawSQL<\n T extends Column.Pick.QueryColumn,\n ColumnTypes = DefaultColumnTypes<ColumnSchemaConfig>,\n> extends Expression<T> {\n declare columnTypes: ColumnTypes;\n result: { value: T } = emptyObject as { value: T };\n q: ExpressionData;\n dynamicBefore = true;\n\n constructor(public fn: DynamicSQLArg<T>) {\n super();\n this.q = { expr: this };\n }\n\n // Calls the given function to get SQL from it.\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n const expr = this.fn(raw as never);\n this.q.beforeSet = this.q.before = undefined;\n const prepared = prepareSubQueryForSql(\n this,\n expr as never,\n ) as unknown as Expression;\n return prepared.toSQL(ctx, quotedAs);\n }\n}\n\nDynamicRawSQL.prototype.type = ExpressionTypeMethod.prototype.type;\n\n/**\n * @deprecated use `sql` instead\n */\nexport function raw<T = never>(\n ...args: StaticSQLArgs\n): RawSql<Column.Pick.QueryColumnOfType<T>>;\n/**\n * @deprecated use `sql` instead\n */\nexport function raw<T = never>(\n ...args: [DynamicSQLArg<Column.Pick.QueryColumnOfType<T>>]\n): DynamicRawSQL<Column.Pick.QueryColumnOfType<T>>;\nexport function raw(...args: SQLArgs) {\n return isTemplateLiteralArgs(args)\n ? new RawSql(args)\n : typeof args[0] === 'function'\n ? new DynamicRawSQL(args[0])\n : new RawSql(args[0].raw, args[0].values);\n}\n\n// Raw SQL count(*) to apply directly to `QueryData.select`.\nexport const countSelect = [new RawSql('count(*)')];\n\nexport function sqlQueryArgsToExpression(args: SQLQueryArgs): RawSqlBase {\n return Array.isArray(args[0])\n ? new RawSql(args as TemplateLiteralArgs)\n : (args[0] as never);\n}\n\nexport interface SqlFn {\n <\n T,\n Args extends\n | TemplateLiteralArgs\n | [sql: string]\n | [values: RecordUnknown, sql?: string],\n >(\n this: T,\n ...args: Args\n ): Args extends [RecordUnknown]\n ? (...sql: TemplateLiteralArgs) => RawSql<Column.Pick.QueryColumn, T>\n : RawSql<Column.Pick.QueryColumn, T>;\n\n /**\n * `sql.ref` quotes a SQL identifier such as a table name, column name, or schema name.\n * Use it when you need to dynamically reference an identifier in raw SQL.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * const schema = 'my_schema';\n *\n * // Produces: SET LOCAL search_path TO \"my_schema\"\n * await db.$query`SET LOCAL search_path TO ${sql.ref(schema)}`\n * ```\n *\n * It handles dots to support qualified names:\n *\n * ```ts\n * // \"my_schema\".\"my_table\"\n * sql.ref('my_schema.my_table');\n * ```\n */\n ref(name: string): SqlRefExpression;\n unsafe(sql: string | number | boolean): UnsafeSqlExpression;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const sqlFn: SqlFn = ((...args: any[]): any => {\n const arg = args[0];\n if (Array.isArray(arg)) {\n return new RawSql(args as TemplateLiteralArgs);\n }\n\n if (typeof args[0] === 'string') {\n return new RawSql(args[0]);\n }\n\n if (args[1] !== undefined) {\n return new RawSql(args[1], arg);\n }\n\n return (...args: TemplateLiteralArgs) =>\n new RawSql(args, arg as RecordUnknown);\n}) as SqlFn;\n\nsqlFn.ref = (name) => new SqlRefExpression(name);\nsqlFn.unsafe = (sql) => new UnsafeSqlExpression(sql);\n\nexport class UnsafeSqlExpression extends Expression {\n declare result: { value: Column.Pick.QueryColumn };\n q: ExpressionData;\n\n constructor(public sql: string | number | boolean) {\n super();\n this.q = { expr: this };\n }\n\n makeSQL(): string {\n return String(this.sql);\n }\n}\n","import { Column } from './columns/column';\nimport { RawSqlBase, sqlFn, SqlFn } from './query/expressions/raw-sql';\nimport OptionsArg = TableData.Index.OptionsArg;\nimport { Expression } from './query/expressions/expression';\nimport { EmptyTuple, MaybeArray, RecordUnknown } from './utils';\nimport { SearchWeight } from './query';\n\nexport interface TableData {\n primaryKey?: TableData.PrimaryKey;\n indexes?: TableData.Index[];\n excludes?: TableData.Exclude[];\n constraints?: TableData.Constraint[];\n}\n\nexport namespace TableData {\n // Used in migrations to also drop related entities if is set to CASCADE\n export type DropMode = 'CASCADE' | 'RESTRICT';\n\n export interface PrimaryKey {\n columns: string[];\n name?: string;\n }\n\n export interface ColumnIndex {\n options: Index.ColumnArg & Index.Options;\n }\n\n export interface ColumnExclude extends ColumnIndex {\n with: string;\n }\n\n export interface Index {\n columns: Index.ColumnOrExpressionOptions[];\n options: Index.Options;\n }\n\n export interface Exclude {\n columns: Exclude.ColumnOrExpressionOptions[];\n options: Exclude.Options;\n }\n\n export interface Constraint {\n name?: string;\n check?: Check;\n identity?: Identity;\n references?: References;\n dropMode?: TableData.DropMode;\n }\n\n export type Check = RawSqlBase;\n\n export interface ColumnReferences {\n fnOrTable: TableData.References.FnOrTable;\n foreignColumns: string[];\n options?: References.Options;\n }\n\n export interface References extends ColumnReferences {\n columns: string[];\n }\n\n export interface Identity extends SequenceBaseOptions {\n always?: boolean;\n }\n\n interface SequenceBaseOptions {\n increment?: number;\n start?: number;\n min?: number;\n max?: number;\n cache?: number;\n cycle?: boolean;\n }\n\n export interface SequenceOptions extends SequenceBaseOptions {\n dataType?: 'smallint' | 'integer' | 'bigint';\n ownedBy?: string;\n }\n\n export namespace Index {\n // config for a single column or an expression in the index\n export interface ColumnOptions {\n collate?: string;\n opclass?: string;\n order?: string;\n // weight for a column in a search index\n weight?: SearchWeight;\n }\n\n export interface UniqueOptionsArg<Name extends string = string> {\n name?: Name;\n nullsNotDistinct?: boolean;\n using?: string;\n include?: MaybeArray<string>;\n with?: string;\n tablespace?: string;\n where?: string;\n dropMode?: DropMode;\n }\n\n export interface OptionsArg extends UniqueOptionsArg {\n unique?: boolean;\n }\n\n export interface TsVectorArg extends OptionsArg, TsVectorOptions {}\n\n // all possible index options, excluding column/expression options\n export type Options = TsVectorArg;\n\n export interface UniqueColumnArg<Name extends string = string>\n extends ColumnOptions,\n UniqueOptionsArg<Name> {\n expression?: string;\n }\n\n // argument of column's index method, may have an expression\n export interface ColumnArg extends UniqueColumnArg {\n unique?: boolean;\n }\n\n interface TsVectorOptions {\n // set the language for the tsVector, 'english' is a default\n language?: string;\n // set the column with language for the tsVector\n languageColumn?: string;\n // create a tsVector index\n tsVector?: boolean;\n }\n\n export interface TsVectorColumnArg extends ColumnArg, TsVectorOptions {}\n\n // for a table index that has an expression in the list\n export interface ExpressionOptions extends ColumnOptions {\n expression: string;\n }\n\n // for a table index that has a column in the list\n export interface ColumnOptionsForColumn<Column extends PropertyKey>\n extends ColumnOptions {\n column: Column;\n }\n\n // for a table index, it can have either a column or an expression in its list\n export type ColumnOrExpressionOptions<Column extends PropertyKey = string> =\n ColumnOptionsForColumn<Column> | ExpressionOptions;\n }\n\n export namespace Exclude {\n export interface Options {\n name?: string;\n using?: string;\n include?: MaybeArray<string>;\n with?: string;\n tablespace?: string;\n where?: string;\n dropMode?: DropMode;\n }\n\n export interface ArgColumnOptions {\n collate?: string;\n opclass?: string;\n order?: string;\n }\n\n export interface ColumnArg extends Options, ArgColumnOptions {}\n\n interface ColumnBaseOptions extends ArgColumnOptions {\n with: string;\n }\n\n interface ColumnOptions<Column extends PropertyKey>\n extends ColumnBaseOptions {\n column: Column;\n }\n\n interface ExpressionOptions extends ColumnBaseOptions {\n expression: string;\n }\n\n export type ColumnOrExpressionOptions<Column extends PropertyKey = string> =\n ColumnOptions<Column> | ExpressionOptions;\n }\n\n export namespace References {\n export type FnOrTable = (() => Column.ForeignKey.TableParam) | string;\n\n /**\n * - MATCH FULL will not allow one column of a multicolumn foreign key to be null unless all foreign key columns are null;\n * if they are all null, the row is not required to have a match in the referenced table.\n * - MATCH SIMPLE (default) allows any of the foreign key columns to be null; if any of them are null, the row is not required to have a match in the referenced table.\n * - MATCH PARTIAL - PG docs say it's not implemented.\n */\n export type Match = 'FULL' | 'PARTIAL' | 'SIMPLE';\n\n /**\n * - NO ACTION Produce an error indicating that the deletion or update would create a foreign key constraint violation. If the constraint is deferred, this error will be produced at constraint check time if there still exist any referencing rows. This is the default action.\n * - RESTRICT Produce an error indicating that the deletion or update would create a foreign key constraint violation. This is the same as NO ACTION except that the check is not deferrable.\n * - CASCADE Delete any rows referencing the deleted row, or update the values of the referencing column(s) to the new values of the referenced columns, respectively.\n * - SET NULL Set all the referencing columns, or a specified subset of the referencing columns, to null. A subset of columns can only be specified for ON DELETE actions.\n * - SET DEFAULT Set all the referencing columns, or a specified subset of the referencing columns, to their default values. A subset of columns can only be specified for ON DELETE actions. (There must be a row in the referenced table matching the default values, if they are not null, or the operation will fail.)\n */\n export type Action =\n | 'NO ACTION'\n | 'RESTRICT'\n | 'CASCADE'\n | 'SET NULL'\n | 'SET DEFAULT';\n\n // Foreign key options without name, is used for `autoForeignKey` in the ORM.\n export interface BaseOptions {\n match?: Match;\n onUpdate?: Action;\n onDelete?: Action;\n dropMode?: TableData.DropMode;\n }\n\n // Used in migrations to make foreign key SQL\n export interface Options extends BaseOptions {\n name?: string;\n }\n }\n}\n\nexport type TableDataInput = {\n primaryKey?: TableData.PrimaryKey;\n index?: TableData.Index;\n exclude?: TableData.Exclude;\n constraint?: TableData.Constraint;\n};\n\nexport interface TableDataItem {\n tableDataItem: true;\n columns: unknown;\n}\n\nexport interface NonUniqDataItem extends TableDataItem {\n columns: EmptyTuple;\n}\n\nexport interface UniqueTableDataItem<\n Shape extends Column.QueryColumns = Column.QueryColumns,\n> {\n columns: (keyof Shape)[];\n name: string;\n}\n\nexport interface TableDataMethods<Key extends PropertyKey> {\n primaryKey<Columns extends [Key, ...Key[]], Name extends string>(\n columns: Columns,\n name?: Name,\n ): {\n tableDataItem: true;\n columns: Columns;\n name: string extends Name ? never : Name;\n };\n\n unique<\n Columns extends [\n Key | TableData.Index.ColumnOrExpressionOptions<Key>,\n ...(Key | TableData.Index.ColumnOrExpressionOptions<Key>)[],\n ],\n Name extends string,\n >(\n columns: Columns,\n options?: TableData.Index.UniqueOptionsArg<Name>,\n ): {\n tableDataItem: true;\n columns: Columns extends (\n | Key\n | TableData.Index.ColumnOptionsForColumn<Key>\n )[]\n ? {\n [I in keyof Columns]: 'column' extends keyof Columns[I]\n ? Columns[I]['column']\n : Columns[I];\n }\n : never;\n name: string extends Name ? never : Name;\n };\n\n index(\n columns: (Key | TableData.Index.ColumnOrExpressionOptions<Key>)[],\n options?: TableData.Index.OptionsArg,\n ): NonUniqDataItem;\n\n searchIndex(\n columns: (Key | TableData.Index.ColumnOrExpressionOptions<Key>)[],\n options?: TableData.Index.TsVectorArg,\n ): NonUniqDataItem;\n\n /**\n * Defines an `EXCLUDE` constraint for multiple columns.\n *\n * The first argument is an array of columns and/or SQL expressions:\n *\n * ```ts\n * interface ExcludeColumnOptions {\n * // column name OR expression is required\n * column: string;\n * // SQL expression, like 'tstzrange(\"startDate\", \"endDate\")'\n * expression: string;\n *\n * // required: operator for the EXCLUDE constraint to work\n * with: string;\n *\n * collate?: string;\n * opclass?: string; // for example, varchar_ops\n * order?: string; // ASC, DESC, ASC NULLS FIRST, DESC NULLS LAST\n * }\n * ```\n *\n * The second argument is an optional object with options for the whole exclude constraint:\n *\n * ```ts\n * interface ExcludeOptions {\n * // algorithm to use such as GIST, GIN\n * using?: string;\n * // EXCLUDE creates an index under the hood, include columns to the index\n * include?: MaybeArray<string>;\n * // see \"storage parameters\" in the Postgres document for creating an index, for example, 'fillfactor = 70'\n * with?: string;\n * // The tablespace in which to create the constraint. If not specified, default_tablespace is consulted, or temp_tablespaces for indexes on temporary tables.\n * tablespace?: string;\n * // WHERE clause to filter records for the constraint\n * where?: string;\n * // for dropping the index at a down migration\n * dropMode?: DropMode;\n * }\n * ```\n *\n * Example:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable(\n * 'table',\n * (t) => ({\n * id: t.identity().primaryKey(),\n * roomId: t.integer(),\n * startAt: t.timestamp(),\n * endAt: t.timestamp(),\n * }),\n * (t) => [\n * t.exclude(\n * [\n * { column: 'roomId', with: '=' },\n * { expression: 'tstzrange(\"startAt\", \"endAt\")', with: '&&' },\n * ],\n * {\n * using: 'GIST',\n * },\n * ),\n * ],\n * );\n * });\n * ```\n */\n exclude(\n columns: TableData.Exclude.ColumnOrExpressionOptions<Key>[],\n options?: TableData.Exclude.Options,\n ): NonUniqDataItem;\n\n foreignKey<Shape>(\n columns: [string, ...string[]],\n fnOrTable: () => new () => { columns: { shape: Shape } },\n foreignColumns: [keyof Shape, ...(keyof Shape)[]],\n options?: TableData.References.Options,\n ): NonUniqDataItem;\n foreignKey(\n columns: [string, ...string[]],\n fnOrTable: string,\n foreignColumns: [string, ...string[]],\n options?: TableData.References.Options,\n ): NonUniqDataItem;\n\n check(check: RawSqlBase, name?: string): NonUniqDataItem;\n\n sql: SqlFn;\n}\n\nexport type TableDataItemsUniqueColumns<\n Shape extends Column.QueryColumns,\n T extends MaybeArray<TableDataItem>,\n> = MaybeArray<TableDataItem> extends T\n ? never\n : T extends UniqueTableDataItem<Shape>\n ? ItemUniqueColumns<Shape, T>\n : T extends unknown[]\n ? {\n [Item in T[number] as PropertyKey]: Item extends UniqueTableDataItem<Shape>\n ? ItemUniqueColumns<Shape, Item>\n : never;\n }[PropertyKey]\n : never;\n\ntype ItemUniqueColumns<\n Shape extends Column.QueryColumns,\n T extends UniqueTableDataItem<Shape>,\n> = {\n [Column in T['columns'][number]]: UniqueQueryTypeOrExpression<\n Shape[Column]['queryType']\n >;\n};\n\nexport type TableDataItemsUniqueColumnTuples<\n Shape extends Column.QueryColumns,\n T extends MaybeArray<TableDataItem>,\n> = MaybeArray<TableDataItem> extends T\n ? never\n : T extends UniqueTableDataItem<Shape>\n ? T['columns']\n : T extends TableDataItem[]\n ? Exclude<T[number]['columns'], []>\n : never;\n\nexport type UniqueQueryTypeOrExpression<T> =\n | T\n | Expression<Column.Pick.QueryColumnOfType<T>>;\n\nexport type TableDataItemsUniqueConstraints<\n T extends MaybeArray<TableDataItem>,\n> = MaybeArray<TableDataItem> extends T\n ? never\n : T extends UniqueTableDataItem\n ? T['name']\n : // TODO: there may be non-unique items\n T extends UniqueTableDataItem[]\n ? T[number]['name']\n : never;\n\nexport type TableDataFn<Shape, Data extends MaybeArray<TableDataItem>> = (\n t: TableDataMethods<keyof Shape>,\n) => Data;\n\nconst makeIndex = (\n columns: (string | TableData.Index.ColumnOrExpressionOptions)[],\n first?: string | TableData.Index.OptionsArg,\n second?: TableData.Index.OptionsArg,\n): {\n index: {\n columns: (string | TableData.Index.ColumnOrExpressionOptions)[];\n options: TableData.Index.Options;\n unique?: boolean;\n };\n} => {\n if (typeof first === 'string') {\n const options: OptionsArg = { ...second, name: first };\n return {\n index: { columns, options },\n };\n } else {\n const options: OptionsArg = first ?? {};\n return {\n index: { columns, options },\n };\n }\n};\n\nexport const tableDataMethods: TableDataMethods<string> = {\n primaryKey(columns, name) {\n return { primaryKey: { columns, name } } as never;\n },\n unique(columns, ...args) {\n const [first, second] = args as\n | [options?: RecordUnknown]\n | [name: string, options?: RecordUnknown];\n const input = makeIndex(columns, first, second);\n input.index.options.unique = true;\n return input as never;\n },\n index: makeIndex as never,\n searchIndex(columns, ...args) {\n const [first, second] = args as\n | [options?: RecordUnknown]\n | [name: string, options?: RecordUnknown];\n const input = makeIndex(columns, first, second);\n input.index.options.using ??= 'gin';\n input.index.options.tsVector = true;\n return input as never;\n },\n exclude(columns, ...args) {\n const [first, second] = args as\n | [options?: RecordUnknown]\n | [name: string, options?: RecordUnknown];\n if (typeof first === 'string') {\n const options: TableData.Exclude.Options = second ?? {};\n return {\n exclude: { columns, options: { ...options, name: first } },\n } as never;\n } else {\n const options: TableData.Exclude.Options = first ?? {};\n return {\n exclude: { columns, options },\n } as never;\n }\n },\n foreignKey(\n columns: [string, ...string[]],\n fnOrTable: (() => new () => { columns: { shape: unknown } }) | string,\n foreignColumns: [string, ...string[]],\n options?: TableData.References.Options,\n ) {\n return {\n constraint: {\n name: options?.name,\n references: { columns, fnOrTable, foreignColumns, options },\n },\n } as never;\n },\n check(check, name) {\n return { constraint: { check, name } } as never;\n },\n sql: sqlFn,\n};\n\nexport const parseTableData = (\n dataFn?: TableDataFn<unknown, any>,\n): TableData => {\n const tableData: TableData = {};\n if (dataFn) {\n const input = dataFn(tableDataMethods);\n if (Array.isArray(input)) {\n for (const item of input) {\n parseTableDataInput(tableData, item);\n }\n } else {\n parseTableDataInput(tableData, input);\n }\n }\n return tableData;\n};\n\nexport const parseTableDataInput = (\n tableData: TableData,\n item: TableDataInput,\n) => {\n if (item.primaryKey) {\n tableData.primaryKey = item.primaryKey;\n } else if (item.index) {\n (tableData.indexes ??= []).push(\n parseIndexOrExclude(item.index as TableData.Index),\n );\n } else if (item.exclude) {\n (tableData.excludes ??= []).push(\n parseIndexOrExclude(item.exclude as TableData.Exclude),\n );\n } else if (item.constraint) {\n (tableData.constraints ??= []).push(item.constraint);\n if (item.constraint.references?.options?.dropMode) {\n item.constraint.dropMode = item.constraint.references.options.dropMode;\n }\n }\n};\n\nconst parseIndexOrExclude = <T extends TableData.Index | TableData.Exclude>(\n item: T,\n): T => {\n for (let i = item.columns.length - 1; i >= 0; i--) {\n if (typeof item.columns[i] === 'string') {\n item.columns[i] = {\n column: item.columns[i] as unknown as string,\n };\n }\n }\n return item;\n};\n","import { Query } from '../query/query';\nimport { emptyObject, RecordString, RecordUnknown } from '../utils';\nimport {\n RawSQLValues,\n StaticSQLArgs,\n TemplateLiteralArgs,\n templateLiteralSQLToCode,\n} from '../query/expressions/expression';\nimport { raw, RawSqlBase } from '../query/expressions/raw-sql';\nimport { TableData } from '../tableData';\nimport { ColumnTypeSchemaArg } from './column-schema';\nimport { Code, ColumnToCodeCtx } from './code';\n\nimport { Operator } from './operators';\nimport { PickQueryInputType, PickQueryShape } from '../query/pick-query-types';\nimport { QueryHookUtils } from '../query/extra-features/hooks/hooks';\n\nexport namespace Column {\n export namespace Modifiers {\n // marks the column as a primary, this typing is used in onConflict logic\n export interface IsPrimaryKey<Name extends string> {\n data: {\n primaryKey: Name;\n };\n }\n\n // marks the column as unique, this typing is used in onConflict logic\n export type IsUnique<Name extends string> = {\n data: {\n unique: Name;\n };\n };\n\n // marks the column as a nullable, adds `null` type to `type` and `inputType`\n export type Nullable<\n T extends Column.Pick.ForNullable,\n InputSchema,\n OutputSchema,\n QuerySchema,\n > = {\n [K in keyof T]: K extends 'type'\n ? T['type'] | null\n : K extends 'inputType'\n ? T['inputType'] | null\n : K extends 'inputSchema'\n ? InputSchema\n : K extends 'outputType'\n ?\n | T['outputType']\n | (unknown extends T['nullType'] ? null : T['nullType'])\n : K extends 'outputSchema'\n ? OutputSchema\n : K extends 'queryType'\n ? T['queryType'] | null\n : K extends 'querySchema'\n ? QuerySchema\n : K extends 'data'\n ? T['data'] & DataNullable\n : K extends 'operators'\n ? {\n [K in keyof T['operators']]: K extends 'equals' | 'not'\n ? Operator<T | null>\n : T['operators'][K];\n }\n : T[K];\n };\n\n export type QueryColumnToNullable<C> = {\n [K in keyof C]: K extends 'outputType' | 'queryType' ? C[K] | null : C[K];\n };\n\n export type QueryColumnToOptional<C> = {\n [K in keyof C]: K extends 'outputType' ? C[K] | undefined : C[K];\n };\n\n interface DataNullable {\n isNullable: true;\n optional: true;\n }\n\n // allow `null` in .where({ column: { equals: null } }) and the same for `not`\n export interface OperatorsNullable<T> {\n equals: Operator<T | null>;\n not: Operator<T | null>;\n }\n\n // change the input type of the column\n export type Encode<T, InputSchema, Input> = {\n [K in keyof T]: K extends 'inputType'\n ? Input\n : K extends 'inputSchema'\n ? InputSchema\n : T[K];\n };\n\n // change the output type of the column\n export type Parse<T extends Pick.ForParse, OutputSchema, Output> = {\n [K in keyof T]: K extends 'outputType'\n ? null extends T['type']\n ?\n | (Output extends null ? never : Output)\n | (unknown extends T['nullType'] ? null : T['nullType'])\n : Output\n : K extends 'outputSchema'\n ? null extends T['type']\n ? OutputSchema | T['nullSchema']\n : OutputSchema\n : T[K];\n };\n\n // change the output type of null value\n export type ParseNull<\n T extends Column.Pick.ForParseNull,\n NullSchema,\n NullType,\n > = {\n [K in keyof T]: K extends 'outputType'\n ? null extends T['type']\n ? Exclude<T['outputType'], null> | NullType\n : T['outputType']\n : K extends 'nullType'\n ? NullType\n : K extends 'outputSchema'\n ? null extends T['type']\n ? T['outputSchema'] | NullSchema\n : T['outputSchema']\n : K extends 'nullSchema'\n ? NullSchema\n : T[K];\n };\n\n type DefaultData<T extends Column.Data, Value> = {\n [K in keyof T]: K extends 'default'\n ? Value extends null\n ? never\n : Value\n : K extends 'optional'\n ? true\n : T[K];\n };\n\n // adds default type to the column\n // removes the default if the Value is null\n export type Default<T extends Column.Pick.Data, Value> = {\n [K in keyof T]: K extends 'data' ? DefaultData<T['data'], Value> : T[K];\n };\n\n type DefaultSelectData<T extends Column.Data, Value> = {\n [K in keyof T]: K extends 'explicitSelect'\n ? Value extends true\n ? false\n : true\n : T[K];\n };\n\n // whether to select column by default or with *\n export type DefaultSelect<\n T extends Column.Pick.Data,\n Value extends boolean,\n > = {\n [K in keyof T]: K extends 'data'\n ? DefaultSelectData<T['data'], Value>\n : T[K];\n };\n\n export interface IsAppReadOnly {\n data: {\n appReadOnly: true;\n };\n }\n\n export type Generated<T extends Column.Pick.Data> = {\n [K in keyof T]: K extends 'data'\n ? {\n [K in keyof T['data']]: K extends 'default' ? true : T['data'][K];\n }\n : K extends 'inputType'\n ? never\n : T[K];\n };\n }\n\n export namespace Pick {\n export interface Data {\n data: Column.Data;\n }\n\n export interface Type {\n type: unknown;\n }\n\n export interface OutputType {\n outputType: unknown;\n }\n\n export interface InputType {\n inputType: unknown;\n }\n\n export interface DataAndInputType extends Data, InputType {}\n\n export interface NullType {\n nullType: unknown;\n }\n\n export interface OutputTypeAndOperators extends OutputType {\n operators: unknown;\n }\n\n export interface DataAndDataType extends Data {\n dataType: string;\n }\n\n // Use a lightweight column type across the query builder, this helps TS significantly.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n export interface QueryColumn extends OutputType {\n dataType: string;\n type: unknown;\n queryType: unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n operators: any;\n }\n\n export interface QueryColumnOfType<T> {\n dataType: string;\n type: T;\n outputType: T;\n queryType: T;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n operators: any;\n }\n\n export interface QueryColumnOfTypeAndOps<DataType, T, Ops> {\n dataType: DataType;\n type: T;\n outputType: T;\n queryType: T;\n operators: Ops;\n }\n\n export interface QueryColumnOfDataType<T extends string>\n extends QueryColumn {\n dataType: T;\n }\n\n export interface QueryInit extends QueryColumn, InputType {\n data: Column.QueryData;\n }\n\n export interface OutputSchema {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n outputSchema: any;\n }\n\n export interface NullSchema {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nullSchema: any;\n }\n\n export interface TypeSchemas extends OutputSchema, NullSchema {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputSchema: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n querySchema: any;\n }\n\n export interface ForNullable\n extends Data,\n Type,\n InputType,\n OutputType,\n TypeSchemas {\n nullType: unknown;\n queryType: unknown;\n operators: unknown;\n }\n\n export interface ForParse extends Type, NullType, NullSchema {}\n\n export interface ForParseNull extends Type, OutputType, OutputSchema {}\n\n export interface ForValidation extends TypeSchemas, DataAndDataType {}\n }\n\n export namespace Shape {\n export interface Data {\n [K: string]: Column.Pick.Data;\n }\n\n export interface QueryInit {\n [K: string]: Column.Pick.QueryInit;\n }\n\n export interface ForValidation {\n [K: string]: Column.Pick.ForValidation;\n }\n }\n\n export interface QueryColumns {\n [K: string]: Column.Pick.QueryColumn;\n }\n\n export interface QueryColumnsInit {\n [K: string]: Pick.QueryInit;\n }\n\n export namespace ForeignKey {\n export interface TableParamInstance {\n schema?: string;\n table: string;\n columns: PickQueryShape;\n }\n\n // minimal table class type to use in the foreign key option\n export interface TableParam {\n new (): TableParamInstance;\n }\n\n // string union of available column names of the table\n export type ColumnNameOfTable<Table extends Column.ForeignKey.TableParam> =\n Table extends new () => { columns: { shape: infer R } } ? keyof R : never;\n }\n\n export namespace Error {\n // Can be used to customize required and invalidType validation error message on any column.\n // must be a type, because of zod typing\n export interface Messages {\n required?: string;\n invalidType?: string;\n }\n\n export interface Message {\n message?: string;\n }\n\n // Parameter of column types to customize an error message.\n export type StringOrMessage = string | Message;\n }\n\n export interface InputOutputQueryTypes {\n inputType: unknown;\n outputType: unknown;\n queryType: unknown;\n }\n\n export interface InputOutputQueryTypesWithSchemas\n extends InputOutputQueryTypes {\n inputSchema: unknown;\n outputSchema: unknown;\n querySchema: unknown;\n }\n\n export interface QueryData {\n explicitSelect?: boolean;\n primaryKey?: string;\n unique?: string;\n optional?: true;\n isNullable?: true;\n default?: unknown;\n name?: string;\n readOnly?: boolean;\n appReadOnly: true | undefined;\n }\n\n // type of data for ColumnType\n export interface Data {\n // column key is assigned when instantiating a table interface\n key: string;\n\n // name of the column in the database, if different from the code\n name?: string;\n\n // true when is nullable or has a default\n optional: true | undefined;\n\n // is null value allowed\n isNullable?: true;\n\n // true for primary key, string for primary key with a custom name\n primaryKey?: string;\n\n // if column has a default value, then it can be omitted in `create` method\n default: unknown;\n\n // to hide default from generated code\n defaultDefault: unknown;\n\n // if the `default` is a function, instantiating table query will set `runtimeDefault` to wrap the `default` function with `encode` if it is set.\n runtimeDefault?(): unknown;\n\n // column should not be implicitly selected\n explicitSelect?: boolean;\n\n // parse and encode a column to use it `as` another column\n as?: Column.Pick.Data;\n\n unique?: string;\n\n // hook for modifying base query object of the table\n // used for automatic updating of `updatedAt`\n modifyQuery?(q: Query, column: Column.Pick.Data): void;\n\n // raw database check expression\n checks?: Column.Data.Check[];\n\n // if the column is of domain or other user-defined type\n isOfCustomType?: boolean;\n\n // error messages: key is camelCased version of Zod, like invalidType, and the value is the message\n errors?: RecordString;\n\n // identify whether this column is from `timestamps()` helper for codegen purposes\n defaultTimestamp?: 'createdAt' | 'updatedAt';\n\n // alias of the type used as a column function name\n alias?: string;\n\n // name of extension that contains the column type, if it's not standard\n extension?: string;\n\n // encode value passed to `create` to an appropriate value for a database\n encode?(input: any): unknown; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n // parse value from a database into what is preferred by the app\n parse?(input: any): unknown; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n // parse value from a database when it is an element of database array type\n parseItem?(input: string): unknown;\n\n // replaces selected nulls with custom values\n parseNull?(): unknown;\n\n // this is used to cast column types in SQL when wrapping rows as JSON.\n // decimal and similar columns have to be casted to text to not loose precision.\n jsonCast?: string;\n\n // removes the column from update and create, it's for generated and computed columns\n readOnly?: boolean;\n\n // removes the column from update and create, but it is still allowed to be set in the hooks\n appReadOnly: true | undefined;\n\n // set a value on create\n setOnCreate?(arg: QueryHookUtils<PickQueryInputType>): unknown;\n\n // set a value on update\n setOnUpdate?(arg: QueryHookUtils<PickQueryInputType>): unknown;\n\n // set a value on save\n setOnSave?(arg: QueryHookUtils<PickQueryInputType>): unknown;\n\n // postgres internal number modifier, it can be present on custom types.\n typmod?: number;\n\n // virtual columns are read only, and they are ignored in update in create,\n // unlike unknown column that is extending virtual\n virtual?: true;\n\n maxChars?: number;\n numericPrecision?: number;\n numericScale?: number;\n dateTimePrecision?: number;\n validationDefault?: unknown;\n indexes?: TableData.ColumnIndex[];\n excludes?: TableData.ColumnExclude[];\n comment?: string;\n collate?: string;\n compression?: string;\n foreignKeys?: TableData.ColumnReferences[];\n identity?: TableData.Identity;\n // raw SQL for generated columns\n generated?: Data.Generated;\n // computed and generated columns are readonly\n readonly?: boolean;\n }\n\n export namespace Data {\n export interface Check {\n sql: RawSqlBase;\n name?: string;\n }\n\n export interface Generated {\n toSQL(\n ctx: { values: unknown[]; snakeCase: boolean | undefined },\n quotedAs?: string,\n ): string;\n\n toCode(): string;\n }\n }\n\n interface AsTypeArgWithType<Schema> {\n type: Schema;\n input?: Schema;\n output?: Schema;\n query?: Schema;\n }\n\n interface AsTypeArgWithoutType<Schema> {\n input: Schema;\n output: Schema;\n query: Schema;\n }\n\n export type AsTypeArg<Schema> =\n | AsTypeArgWithType<Schema>\n | AsTypeArgWithoutType<Schema>;\n}\n\n// change column type and all schemas to nullable\nexport function makeColumnNullable<\n T extends Column.Pick.ForNullable,\n InputSchema,\n OutputSchema,\n QuerySchema,\n>(\n column: T,\n inputSchema: InputSchema,\n outputSchema: OutputSchema,\n querySchema: QuerySchema,\n) {\n const c = setColumnData(column, 'isNullable', true) as unknown as Column;\n c.inputSchema = inputSchema;\n c.outputSchema = outputSchema;\n c.querySchema = querySchema;\n return c as unknown as Column.Modifiers.Nullable<\n T,\n InputSchema,\n OutputSchema,\n QuerySchema\n >;\n}\n\n// clone column type and set data to it\nexport const setColumnData = <\n T extends Column.Pick.Data,\n K extends keyof T['data'],\n>(\n q: T,\n key: K,\n value: T['data'][K],\n): T => {\n const cloned = Object.create(q);\n cloned.data = { ...q.data, [key]: value };\n return cloned;\n};\n\n// clone column type and push data to array property of it\nexport const pushColumnData = <\n T extends Column.Pick.Data,\n K extends keyof T['data'],\n>(\n q: T,\n key: K,\n value: unknown,\n) => {\n const arr = q.data[key as keyof typeof q.data] as unknown[];\n return setColumnData(\n q,\n key,\n (arr ? [...arr, value] : [value]) as unknown as T['data'][K],\n );\n};\n\n// Clone a column or a JSON type and set the value in its data.\nexport const setDataValue = <\n T extends Column.Pick.Data,\n Key extends string,\n Value,\n>(\n item: T,\n key: Key,\n value: Value,\n params?: Column.Error.StringOrMessage,\n): T => {\n const cloned = Object.create(item);\n cloned.data = { ...item.data, [key]: value };\n\n if (params && (typeof params === 'string' || params.message)) {\n (cloned.data.errors ??= {})[key] =\n typeof params === 'string' ? params : params.message;\n }\n\n return cloned as T;\n};\n\n// current name of the column, set by `name` method\nlet currentName: string | undefined;\n\n// set current name of the column\nexport function setCurrentColumnName(name: string): void {\n currentName = name;\n}\n\n// consume column name: reset current name and return the value it contained\nexport const consumeColumnName = () => {\n const name = currentName;\n currentName = undefined;\n return name;\n};\n\n// by default, updatedAt and createdAt timestamps are defaulted to now()\nconst defaultNowFn = 'now()';\n\n// stores SQL to use as default for updatedAt and createdAt\nlet currentNowFn = defaultNowFn;\n\n// change default SQL for updatedAt and createdAt\nexport const setDefaultNowFn = (sql: string) => {\n currentNowFn = sql;\n};\n\n// get default SQL for updatedAt and createdAt\nexport const getDefaultNowFn = () => currentNowFn;\n\n// reset default SQL for updatedAt and createdAt to now()\nexport const resetDefaultNowFn = () => {\n currentNowFn = defaultNowFn;\n};\n\n// default language for full text search\nlet defaultLanguage = 'english';\n\n// set default language for full text search\nexport const setDefaultLanguage = (lang?: string) => {\n defaultLanguage = lang || 'english';\n};\n\n// get default language for full text search\nexport const getDefaultLanguage = () => defaultLanguage;\n\nexport abstract class Column<\n Schema extends ColumnTypeSchemaArg = ColumnTypeSchemaArg,\n Type = unknown,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n InputSchema = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Ops = any,\n InputType = Type,\n OutputType = Type,\n OutputSchema = InputSchema,\n QueryType = InputType,\n QuerySchema = InputSchema,\n> {\n // name of the type in a database\n abstract dataType: string;\n\n // operators supported by the type, that are available in `where` method\n abstract operators: Ops;\n\n // turn the column into TS code, used for code generation\n abstract toCode(ctx: ColumnToCodeCtx, key: string): Code;\n\n // Type returned from a database before parsing, it is an output type of db.\n // Unlike `queryType`, it cannot be a union.\n type!: Type;\n\n // allowed type for creating and updating, it is processed by `encode` function when it's defined.\n inputType!: InputType;\n\n // type returned from a database and processed by `parse` function when it's defined.\n outputType!: OutputType;\n\n // Allowed type to use in `where` and other query methods.\n // Input type of db: timestamp can be sent as a string, a number, or Date (serialized by `pg` driver).\n // It is **not** processed by the ORM, only by a database driver.\n queryType!: QueryType;\n\n declare nullType: unknown;\n declare nullSchema: unknown;\n declare isNullable: boolean;\n\n // data of the column that specifies column characteristics and validations\n data: Column.Data;\n\n error: Schema['error'];\n\n _parse?: (input: unknown) => unknown;\n\n constructor(\n schema: ColumnTypeSchemaArg,\n // type for validation lib for inserting and updating records\n // public inputSchema: InputSchema = undefined as InputSchema,\n public inputSchema: InputSchema,\n // type for validation lib for selected data\n public outputSchema: OutputSchema = inputSchema as unknown as OutputSchema,\n // type for validation lib for validating filters\n public querySchema: QuerySchema = inputSchema as unknown as QuerySchema,\n ) {\n this.parse = schema.parse;\n this.parseNull = schema.parseNull;\n this.encode = schema.encode;\n this.asType = schema.asType;\n this.narrowType = schema.narrowType;\n this.narrowAllTypes = schema.narrowAllTypes;\n this.nullable = schema.nullable;\n this.error = schema.error;\n const name = consumeColumnName();\n this.data = (name ? { name } : {}) as Column.Data;\n }\n\n /**\n * Set a default value to a column. Columns that have defaults become optional when creating a record.\n *\n * If you provide a value or a raw SQL, such default should be set on the column in migration to be applied on a database level.\n *\n * Or you can specify a callback that returns a value. This function will be called for each creating record. Such a default won't be applied to a database.\n *\n * ```ts\n * export class Table extends BaseTable {\n * readonly table = 'table';\n * columns = this.setColumns((t) => ({\n * // values as defaults:\n * int: t.integer().default(123),\n * text: t.text().default('text'),\n *\n * // raw SQL default:\n * timestamp: t.timestamp().default(t.sql`now()`),\n *\n * // runtime default, each new records gets a new random value:\n * random: t.numeric().default(() => Math.random()),\n * }));\n * }\n * ```\n *\n * @param value - default value or a function returning a value\n */\n default<\n T extends Column.Pick.DataAndInputType,\n Value extends T['inputType'] | null | RawSqlBase | (() => T['inputType']),\n >(this: T, value: Value): Column.Modifiers.Default<T, Value> {\n return setColumnData(this, 'default', value) as Column.Modifiers.Default<\n T,\n Value\n >;\n }\n\n /**\n * Use `hasDefault` to let the column be omitted when creating records.\n *\n * It's better to use {@link default} instead so the value is explicit and serves as a hint.\n */\n hasDefault<T extends Column.Pick.Data>(\n this: T,\n ): Column.Modifiers.Default<T, RawSqlBase> {\n return this as Column.Modifiers.Default<T, RawSqlBase>;\n }\n\n /**\n * Set a database-level validation check to a column. `check` accepts a raw SQL.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * // validate rank to be from 1 to 10\n * rank: t.integer().check(t.sql`1 >= \"rank\" AND \"rank\" <= 10`),\n * // constraint name can be passed as a second argument\n * column: t.integer().check(t.sql`...`, 'check_name'),\n * // a single column can have multiple checks\n * multiChecksColumn: t\n * .integer()\n * .check(t.sql`...`)\n * .check(t.sql`...`, 'optional_name'),\n * }));\n * });\n * ```\n *\n * @param sql - raw SQL expression\n * @param name - to specify a constraint name\n */\n check<T extends Column.Pick.Data>(\n this: T,\n sql: RawSqlBase,\n name?: string,\n ): T {\n return pushColumnData(this, 'checks', { sql, name });\n }\n\n /**\n * Use `nullable` to mark the column as nullable. By default, all columns are required.\n *\n * Nullable columns are optional when creating records.\n *\n * ```ts\n * export class Table extends BaseTable {\n * readonly table = 'table';\n * columns = this.setColumns((t) => ({\n * name: t.integer().nullable(),\n * }));\n * }\n * ```\n */\n nullable: Schema['nullable'];\n\n /**\n * Set a custom function to process value for the column when creating or updating a record.\n *\n * The type of `input` argument will be used as the type of the column when creating and updating.\n *\n * If you have a validation library [installed and configured](/guide/columns-validation-methods.html),\n * first argument is a schema to validate the input.\n *\n * ```ts\n * import { z } from 'zod';\n *\n * export class Table extends BaseTable {\n * readonly table = 'table';\n * columns = this.setColumns((t) => ({\n * // encode boolean, number, or string to text before saving\n * column: t\n * .string()\n * // when having validation library, the first argument is a validation schema\n * .encode(\n * z.boolean().or(z.number()).or(z.string()),\n * (input: boolean | number | string) => String(input),\n * )\n * // no schema argument otherwise\n * .encode((input: boolean | number | string) => String(input)),\n * }));\n * }\n *\n * // numbers and booleans will be converted to a string:\n * await db.table.create({ column: 123 });\n * await db.table.create({ column: true });\n * await db.table.where({ column: 'true' }).update({ column: false });\n * ```\n *\n * @param fn - function to encode value for a database, argument type is specified by you, return type must be compatible with a database\n */\n encode: Schema['encode'];\n\n /**\n * Set a custom function to process value after loading it from a database.\n *\n * The type of input is the type of column before `.parse`, the resulting type will replace the type of column.\n *\n * If you have a validation library [installed and configured](/guide/columns-validation-methods.html),\n * first argument is a schema for validating the output.\n *\n * For handling `null` values use {@link parseNull} instead or in addition.\n *\n * ```ts\n * import { z } from 'zod';\n * import { number, integer } from 'valibot';\n *\n * export class Table extends BaseTable {\n * readonly table = 'table';\n * columns = this.setColumns((t) => ({\n * columnZod: t\n * .string()\n * // when having validation library, the first argument is a schema\n * .parse(z.number().int(), (input) => parseInt(input))\n * // no schema argument otherwise\n * .parse((input) => parseInt(input)),\n *\n * columnValibot: t\n * .string()\n * .parse(number([integer()]), (input) => parseInt(input))\n * .parse((input) => parseInt(input)),\n * }));\n * }\n *\n * // column will be parsed to a number\n * const value: number = await db.table.get('column');\n * ```\n *\n * @param fn - function to parse a value from the database, argument is the type of this column, return type is up to you\n */\n parse: Schema['parse'];\n\n /**\n * Use `parseNull` to specify runtime defaults at selection time.\n *\n * The `parseNull` function is only triggered for `nullable` columns.\n *\n * ```ts\n * export class Table extends BaseTable {\n * readonly table = 'table';\n * columns = this.setColumns((t) => ({\n * column: t\n * .integer()\n * .parse(String) // parse non-nulls to string\n * .parseNull(() => false), // replace nulls with false\n * .nullable(),\n * }));\n * }\n *\n * const record = await db.table.take()\n * record.column // can be a string or boolean, not null\n * ```\n *\n * If you have a validation library [installed and configured](/guide/columns-validation-methods),\n * first argument is a schema for validating the output.\n *\n * ```ts\n * export class Table extends BaseTable {\n * readonly table = 'table';\n * columns = this.setColumns((t) => ({\n * column: t\n * .integer()\n * .parse(z.string(), String) // parse non-nulls to string\n * .parseNull(z.literal(false), () => false), // replace nulls with false\n * .nullable(),\n * }));\n * }\n *\n * const record = await db.table.take()\n * record.column // can be a string or boolean, not null\n *\n * Table.outputSchema().parse({\n * column: false, // the schema expects strings or `false` literals, not nulls\n * })\n * ```\n */\n parseNull: Schema['parseNull'];\n\n /**\n * This method changes a column type without modifying its behavior.\n * This is needed when converting columns to a validation schema, the converter will pick a different type specified by `.as`.\n *\n * Before calling `.as` need to use `.encode` with the input of the same type as the input of the target column,\n * and `.parse` which returns the correct type.\n *\n * ```ts\n * // column has the same type as t.integer()\n * const column = t\n * .string()\n * .encode((input: number) => input)\n * .parse((text) => parseInt(text))\n * .as(t.integer());\n * ```\n *\n * @param column - other column type to inherit from\n */\n as<\n T extends { inputType: unknown; outputType: unknown; data: Column.Data },\n C extends {\n inputType: T['inputType'];\n outputType: T['outputType'];\n },\n >(this: T, column: C): C {\n return setColumnData(\n this,\n 'as',\n column as unknown as T['data']['as'],\n ) as unknown as C;\n }\n\n /**\n * @deprecated use narrowType instead\n */\n asType: Schema['asType'];\n\n /**\n * `narrowType` narrows TypeScript types of a column. It sets input, output, query type altogether.\n *\n * For example, to narrow a `string` type to a union of string literals.\n *\n * When _not_ integrating with [validation libraries](/guide/columns-validation-methods), `narrowType` has the following syntax:\n *\n * ```ts\n * export class Table extends BaseTable {\n * readonly table = 'table';\n * columns = this.setColumns((t) => ({\n * size: t.string().narrowType((t) => t<'small' | 'medium' | 'large'>()),\n * }));\n * }\n *\n * // size will be typed as 'small' | 'medium' | 'large'\n * const size = await db.table.get('size');\n * ```\n *\n * - `input` is for `create`, `update` methods.\n * - `output` is for the data that is loaded from a database and parsed if the column has `parse`.\n * - `query` is used in `where` and other query methods, it should be compatible with the actual database column type.\n *\n * When integrating with a [validation library](/guide/columns-validation-methods), also provide validation schemas:\n *\n * ```ts\n * const sizeSchema = z.union([\n * z.literal('small'),\n * z.literal('medium'),\n * z.literal('large'),\n * ]);\n *\n * export class Table extends BaseTable {\n * readonly table = 'table';\n * columns = this.setColumns((t) => ({\n * size: t.text().narrowType(sizeSchema),\n * }));\n * }\n *\n * // size will be typed as 'small' | 'medium' | 'large'\n * const size = await db.table.get('size');\n * ```\n */\n narrowType: Schema['narrowType'];\n\n /**\n * Allows to narrow different TypeScript types of a column granularly.\n *\n * Use it when the column's input is different from output.\n *\n * When _not_ integrating with [validation libraries](/guide/columns-validation-methods), `narrowAllTypes` has the following syntax:\n *\n * ```ts\n * export class Table extends BaseTable {\n * readonly table = 'table';\n * columns = this.setColumns((t) => ({\n * size: t.string().narrowAllTypes((t) =>\n * t<{\n * // what types are accepted when creating/updating\n * input: 'small' | 'medium' | 'large';\n * // how types are retured from a database\n * output: 'small' | 'medium' | 'large';\n * // what types the column accepts in `where` and similar\n * query: 'small' | 'medium' | 'large';\n * }>(),\n * ),\n * }));\n * }\n *\n * // size will be typed as 'small' | 'medium' | 'large'\n * const size = await db.table.get('size');\n * ```\n *\n * - `input` is for `create`, `update` methods.\n * - `output` is for the data that is loaded from a database and parsed if the column has `parse`.\n * - `query` is used in `where` and other query methods, it should be compatible with the actual database column type.\n *\n * When integrating with a [validation library](/guide/columns-validation-methods), also provide validation schemas:\n *\n * ```ts\n * const sizeSchema = z.union([\n * z.literal('small'),\n * z.literal('medium'),\n * z.literal('large'),\n * ]);\n *\n * export class Table extends BaseTable {\n * readonly table = 'table';\n * columns = this.setColumns((t) => ({\n * size: t.text().narrowAllTypes({\n * input: sizeSchema,\n * output: sizeSchema,\n * query: sizeSchema,\n * }),\n * }));\n * }\n *\n * // size will be typed as 'small' | 'medium' | 'large'\n * const size = await db.table.get('size');\n * ```\n */\n narrowAllTypes: Schema['narrowAllTypes'];\n\n input<T extends { inputSchema: unknown }, InputSchema extends Schema['type']>(\n this: T,\n fn: (schema: T['inputSchema']) => InputSchema,\n ): { [K in keyof T]: K extends 'inputSchema' ? InputSchema : T[K] } {\n const cloned = Object.create(this);\n cloned.inputSchema = fn(this.inputSchema);\n return cloned;\n }\n\n output<\n T extends { outputSchema: unknown },\n OutputSchema extends Schema['type'],\n >(\n this: T,\n fn: (schema: T['outputSchema']) => OutputSchema,\n ): { [K in keyof T]: K extends 'outputSchema' ? OutputSchema : T[K] } {\n const cloned = Object.create(this);\n cloned.outputSchema = fn(this.outputSchema);\n return cloned;\n }\n\n query<T extends { querySchema: unknown }, QuerySchema extends Schema['type']>(\n this: T,\n fn: (schema: T['querySchema']) => QuerySchema,\n ): { [K in keyof T]: K extends 'querySchema' ? QuerySchema : T[K] } {\n const cloned = Object.create(this);\n cloned.querySchema = fn(this.querySchema);\n return cloned;\n }\n\n /**\n * Set a database column name.\n *\n * @param name - name of the column in database.\n */\n name<T extends Column.Pick.Data>(this: T, name: string): T {\n return setColumnData(this, 'name', name);\n }\n\n /**\n * Append `select(false)` to a column to exclude it from the default selection.\n * It won't be selected with `selectAll` or `select('*')` as well.\n *\n * ```ts\n * export class UserTable extends BaseTable {\n * readonly table = 'user';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * name: t.string(),\n * password: t.string().select(false),\n * }));\n * }\n *\n * // only id and name are selected, without password\n * const user = await db.user.find(123);\n *\n * // password is still omitted, even with the wildcard\n * const same = await db.user.find(123).select('*');\n *\n * const comment = await db.comment.find(123).select({\n * // password is omitted in the sub-selects as well\n * author: (q) => q.author,\n * });\n *\n * // password is omitted here as well\n * const created = await db.user.create(userData);\n * ```\n *\n * Such a column can only be selected explicitly.\n *\n * ```ts\n * const userWithPassword = await db.user.find(123).select('*', 'password');\n * ```\n */\n select<T extends Column.Pick.Data, Value extends boolean>(\n this: T,\n value: Value,\n ): Column.Modifiers.DefaultSelect<T, Value> {\n return setColumnData(this, 'explicitSelect', !value) as never;\n }\n\n /**\n * Forbid the column to be used in [create](/guide/create-update-delete.html#create-insert) and [update](/guide/create-update-delete.html#update) methods.\n *\n * `readOnly` column is still can be set from a [hook](http://localhost:5173/guide/hooks.html#set-values-before-create-or-update).\n *\n * `readOnly` column can be used together with a `default`.\n *\n * ```ts\n * export class Table extends BaseTable {\n * readonly table = 'table';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * column: t.string().default(() => 'default value'),\n * another: t.string().readOnly(),\n * }));\n *\n * init(orm: typeof db) {\n * this.beforeSave(({ set }) => {\n * set({ another: 'value' });\n * });\n * }\n * }\n *\n * // later in the code\n * db.table.create({ column: 'value' }); // TS error, runtime error\n * ```\n */\n readOnly<T>(this: T): T & Column.Modifiers.IsAppReadOnly {\n return setColumnData(this as never, 'appReadOnly', true as never) as never;\n }\n\n /**\n * Set a column value when creating a record.\n * This works for [readOnly](#readonly) columns as well.\n *\n * If no value or undefined is returned, the hook won't have any effect.\n *\n * ```ts\n * export class Table extends BaseTable {\n * readonly table = 'table';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * column: t.string().setOnCreate(() => 'value'),\n * }));\n * }\n * ```\n */\n setOnCreate<T extends Column.Pick.QueryInit>(\n this: T,\n fn: (arg: QueryHookUtils<PickQueryInputType>) => T['inputType'] | void,\n ): T {\n return setColumnData(this as never, 'setOnCreate', fn as never) as never;\n }\n\n /**\n * Set a column value when updating a record.\n * This works for [readOnly](#readonly) columns as well.\n *\n * If no value or undefined is returned, the hook won't have any effect.\n *\n * ```ts\n * export class Table extends BaseTable {\n * readonly table = 'table';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * column: t.string().setOnUpdate(() => 'value'),\n * }));\n * }\n * ```\n */\n setOnUpdate<T extends Column.Pick.QueryInit>(\n this: T,\n fn: (arg: QueryHookUtils<PickQueryInputType>) => T['inputType'] | void,\n ): T {\n return setColumnData(this as never, 'setOnUpdate', fn as never) as never;\n }\n\n /**\n * Set a column value when creating or updating a record.\n * This works for [readOnly](#readonly) columns as well.\n *\n * If no value or undefined is returned, the hook won't have any effect.\n *\n * ```ts\n * export class Table extends BaseTable {\n * readonly table = 'table';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * column: t.string().setOnSave(() => 'value'),\n * }));\n * }\n * ```\n */\n setOnSave<T extends Column.Pick.QueryInit>(\n this: T,\n fn: (arg: QueryHookUtils<PickQueryInputType>) => T['inputType'] | void,\n ): T {\n return setColumnData(this as never, 'setOnSave', fn as never) as never;\n }\n\n /**\n * Mark the column as a primary key.\n * This column type becomes an argument of the `.find` method.\n * So if the primary key is of `integer` type (`identity` or `serial`), `.find` will accept the number,\n * or if the primary key is of `UUID` type, `.find` will expect a string.\n *\n * Using `primaryKey` on a `uuid` column will automatically add a [gen_random_uuid](https://www.postgresql.org/docs/current/functions-uuid.html) default.\n *\n * ```ts\n * export class Table extends BaseTable {\n * readonly table = 'table';\n * columns = this.setColumns((t) => ({\n * id: t.uuid().primaryKey(),\n * // database-level name can be passed:\n * id: t.uuid().primaryKey('primary_key_name'),\n * }));\n * }\n *\n * // primary key can be used by `find` later:\n * db.table.find('97ba9e78-7510-415a-9c03-23d440aec443');\n * ```\n *\n * @param name - to specify a constraint name\n */\n primaryKey<T extends Column.Pick.Data, Name extends string>(\n this: T,\n name?: Name,\n ): T & Column.Modifiers.IsPrimaryKey<Name> {\n return setColumnData(this, 'primaryKey', name ?? (true as never)) as never;\n }\n\n /**\n * Defines a reference between different tables to enforce data integrity.\n *\n * In [snakeCase](/guide/orm-and-query-builder.html#snakecase-option) mode, columns of both tables are translated to a snake_case.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * otherId: t.integer().foreignKey('otherTableName', 'columnName'),\n * }));\n * });\n * ```\n *\n * In the migration it's different from OrchidORM table code where a callback with a table is expected:\n *\n * ```ts\n * export class SomeTable extends BaseTable {\n * readonly table = 'someTable';\n * columns = this.setColumns((t) => ({\n * otherTableId: t.integer().foreignKey(() => OtherTable, 'id'),\n * }));\n * }\n * ```\n *\n * Optionally you can pass the third argument to `foreignKey` with options:\n *\n * ```ts\n * type ForeignKeyOptions = {\n * // name of the constraint\n * name?: string;\n * // see database docs for MATCH in FOREIGN KEY\n * match?: 'FULL' | 'PARTIAL' | 'SIMPLE';\n *\n * onUpdate?: 'NO ACTION' | 'RESTRICT' | 'CASCADE' | 'SET NULL' | 'SET DEFAULT';\n * onDelete?: 'NO ACTION' | 'RESTRICT' | 'CASCADE' | 'SET NULL' | 'SET DEFAULT';\n * };\n * ```\n *\n * ## composite foreign key\n *\n * Set foreign key from multiple columns in the current table to corresponding columns in the other table.\n *\n * The first argument is an array of columns in the current table, the second argument is another table name, the third argument is an array of columns in another table, and the fourth argument is for options.\n *\n * Options are the same as in a single-column foreign key.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.integer(),\n * name: t.string(), // string is varchar(255)\n * ...t.foreignKey(\n * ['id', 'name'],\n * 'otherTable',\n * ['foreignId', 'foreignName'],\n * {\n * name: 'constraintName',\n * match: 'FULL',\n * onUpdate: 'RESTRICT',\n * onDelete: 'CASCADE',\n * },\n * ),\n * }));\n * });\n * ```\n *\n * @param fn - function returning a table class\n * @param column - column in the foreign table to connect with\n * @param options - {@link ForeignKeyOptions}\n */\n foreignKey<T, Shape>(\n this: T,\n fn: () => new () => { columns: { shape: Shape } },\n column: keyof Shape,\n options?: TableData.References.Options,\n ): T;\n foreignKey<T, Table extends string, Column extends string>(\n this: T,\n table: Table,\n column: Column,\n options?: TableData.References.Options,\n ): T;\n foreignKey(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fnOrTable: any,\n column: string,\n options: TableData.References.Options = emptyObject,\n ) {\n return pushColumnData(this, 'foreignKeys', {\n fnOrTable,\n foreignColumns: [column],\n options,\n });\n }\n\n // format the column into the database type\n toSQL(): string {\n return this.dataType;\n }\n\n /**\n * Add an index to the column.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * // add an index to the name column with default settings:\n * name: t.text().index(),\n * // options are described below:\n * name: t.text().index({ ...options }),\n * // with a database-level name:\n * name: t.text().index({ name: 'custom_index_name', ...indexOptions }),\n * }));\n * });\n * ```\n *\n * Possible options are:\n *\n * ```ts\n * type IndexOptions = {\n * name?: string,\n * // NULLS NOT DISTINCT: availabe in Postgres 15+, makes sense only for unique index\n * nullsNotDistinct?: true;\n * // index algorithm to use such as GIST, GIN\n * using?: string;\n * // specify collation:\n * collate?: string;\n * // see `opclass` in the Postgres document for creating the index\n * opclass?: string;\n * // specify index order such as ASC NULLS FIRST, DESC NULLS LAST\n * order?: string;\n * // include columns to an index to optimize specific queries\n * include?: MaybeArray<string>;\n * // see \"storage parameters\" in the Postgres document for creating an index, for example, 'fillfactor = 70'\n * with?: string;\n * // The tablespace in which to create the index. If not specified, default_tablespace is consulted, or temp_tablespaces for indexes on temporary tables.\n * tablespace?: string;\n * // WHERE clause to filter records for the index\n * where?: string;\n * // mode is for dropping the index\n * mode?: 'CASCADE' | 'RESTRICT';\n * };\n * ```\n *\n * @param args\n */\n index<T extends Column.Pick.Data>(\n this: T,\n ...args: [options?: TableData.Index.ColumnArg]\n ): T {\n const a = args as\n | [options?: RecordUnknown]\n | [name: string, options?: RecordUnknown];\n\n return pushColumnData(this, 'indexes', {\n options:\n (typeof a[0] === 'string' ? { ...a[1], name: a[0] } : a[0]) ??\n emptyObject,\n });\n }\n\n /**\n * `searchIndex` is designed for [full text search](/guide/text-search).\n *\n * It can accept the same options as a regular `index`, but it is `USING GIN` by default, and it is concatenating columns into a `tsvector` database type.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * title: t.text(),\n * body: t.text(),\n * ...t.searchIndex(['title', 'body']),\n * }));\n * });\n * ```\n *\n * Produces the following index ('english' is a default language, see [full text search](/guide/text-search.html#language) for changing it):\n *\n * ```sql\n * CREATE INDEX \"table_title_body_idx\" ON \"table\" USING GIN (to_tsvector('english', \"title\" || ' ' || \"body\"))\n * ```\n *\n * You can set different search weights (`A` to `D`) on different columns inside the index:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * title: t.text(),\n * body: t.text(),\n * ...t.searchIndex([\n * { column: 'title', weight: 'A' },\n * { column: 'body', weight: 'B' },\n * ]),\n * }));\n * });\n * ```\n *\n * When the table has localized columns,\n * you can define different indexes for different languages by setting the `language` parameter:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * titleEn: t.text(),\n * bodyEn: t.text(),\n * titleFr: t.text(),\n * bodyFr: t.text(),\n * ...t.searchIndex(['titleEn', 'bodyEn'], { language: 'english' }),\n * ...t.searchIndex(['titleFr', 'bodyFr'], { language: 'french' }),\n * }));\n * });\n * ```\n *\n * Alternatively, different table records may correspond to a single language,\n * then you can define a search index that relies on a language column by using `languageColumn` parameter:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * lang: t.type('regconfig'),\n * title: t.text(),\n * body: t.text(),\n * ...t.searchIndex(['title', 'body'], { languageColumn: 'lang' }),\n * }));\n * });\n * ```\n *\n * It can be more efficient to use a [generated](/guide/migration-column-methods.html#generated-column) column instead of indexing text column in the way described above,\n * and to set a `searchIndex` on it:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * title: t.text(),\n * body: t.text(),\n * generatedTsVector: t.tsvector().generated(['title', 'body']).searchIndex(),\n * }));\n * });\n * ```\n *\n * Produces the following index:\n *\n * ```sql\n * CREATE INDEX \"table_generatedTsVector_idx\" ON \"table\" USING GIN (\"generatedTsVector\")\n * ```\n *\n * @param options - index options\n */\n searchIndex<T extends { data: Column['data']; dataType: string }>(\n this: T,\n ...args: [options?: TableData.Index.TsVectorColumnArg]\n ): T {\n const a = args as\n | [options?: RecordUnknown]\n | [name: string, options?: RecordUnknown];\n\n return pushColumnData(this, 'indexes', {\n options: {\n ...(typeof a[0] === 'string' ? { ...a[1], name: a[0] } : a[0]),\n ...(this.dataType === 'tsvector'\n ? { using: 'GIN' }\n : { tsVector: true }),\n },\n });\n }\n\n unique<\n T extends Column.Pick.Data,\n const Options extends TableData.Index.ColumnArg,\n >(\n this: T,\n ...args: [options?: Options]\n ): T & Column.Modifiers.IsUnique<Options['name'] & string> {\n const a = args as\n | [options?: RecordUnknown]\n | [name: string, options?: RecordUnknown];\n\n return pushColumnData(this, 'indexes', {\n options: {\n ...(typeof a[0] === 'string' ? { ...a[1], name: a[0] } : a[0]),\n unique: true,\n },\n }) as never;\n }\n\n /**\n * Add [EXCLUDE constraint](https://www.postgresql.org/docs/current/sql-createtable.html#SQL-CREATETABLE-EXCLUDE) to the column.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * // exclude rows with overlapping time ranges, && is for the `WITH` operator\n * timeRange: t.type('tstzrange').exclude('&&'),\n * // with a database-level name:\n * timeRange: t.type('tstzrange').exclude('&&', 'no_overlap'),\n * // with options:\n * timeRange: t.type('tstzrange').exclude('&&', { ...options }),\n * // with name and options:\n * name: t.type('tstzrange').exclude('&&', 'no_overlap', { ...options }),\n * }));\n * });\n * ```\n *\n * Possible options are:\n *\n * ```ts\n * interface ExcludeColumnOptions {\n * // specify collation:\n * collate?: string;\n * // see `opclass` in the Postgres document for creating the index\n * opclass?: string;\n * // specify index order such as ASC NULLS FIRST, DESC NULLS LAST\n * order?: string;\n * // algorithm to use such as GIST, GIN\n * using?: string;\n * // EXCLUDE creates an index under the hood, include columns to the index\n * include?: MaybeArray<string>;\n * // see \"storage parameters\" in the Postgres document for creating an index, for example, 'fillfactor = 70'\n * with?: string;\n * // The tablespace in which to create the constraint. If not specified, default_tablespace is consulted, or temp_tablespaces for indexes on temporary tables.\n * tablespace?: string;\n * // WHERE clause to filter records for the constraint\n * where?: string;\n * // for dropping the index at a down migration\n * dropMode?: DropMode;\n * }\n * ```\n */\n exclude<T extends Column.Pick.Data>(\n this: T,\n op: string,\n ...args: [options?: TableData.Exclude.ColumnArg]\n ): T {\n const a = args as\n | [options?: RecordUnknown]\n | [name: string, options?: RecordUnknown];\n\n return pushColumnData(this, 'excludes', {\n with: op,\n options:\n (typeof a[0] === 'string' ? { ...a[1], name: a[0] } : a[0]) ??\n emptyObject,\n });\n }\n\n comment<T extends Column.Pick.Data>(this: T, comment: string): T {\n return setColumnData(this, 'comment', comment);\n }\n\n compression<T extends Column.Pick.Data>(this: T, compression: string): T {\n return setColumnData(this, 'compression', compression);\n }\n\n collate<T extends Column.Pick.Data>(this: T, collate: string): T {\n return setColumnData(this, 'collate', collate);\n }\n\n modifyQuery<T extends Column.Pick.Data>(this: T, cb: (q: Query) => void): T {\n return setColumnData(this, 'modifyQuery', cb);\n }\n\n /**\n * Define a generated column. `generated` accepts a raw SQL.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * two: t.integer().generated`1 + 1`,\n * }));\n * });\n * ```\n *\n * @param args - raw SQL\n */\n generated<T extends Column.Pick.Data>(\n this: T,\n ...args: StaticSQLArgs\n ): Column.Modifiers.Generated<T> {\n const sql = raw(...args);\n const column = setColumnData(this, 'generated', {\n toSQL(ctx, quoted) {\n return sql.toSQL(ctx, quoted);\n },\n\n toCode() {\n let sql = '.generated';\n\n if (Array.isArray(args[0])) {\n sql += templateLiteralSQLToCode(args as TemplateLiteralArgs);\n } else {\n const { raw, values } = args[0] as {\n raw: string;\n values?: RawSQLValues;\n };\n sql += `({ raw: '${raw.replace(/'/g, \"\\\\'\")}'${\n values ? `, values: ${JSON.stringify(values)}` : ''\n } })`;\n }\n\n return sql;\n },\n });\n column.data.readOnly = true;\n return column as never;\n }\n}\n","import { RawSql } from '../query/expressions/raw-sql';\nimport { Column } from './column';\nimport { RecordString } from '../utils';\nimport { TemplateLiteralArgs } from '../query/expressions/expression';\n\nexport interface ColumnFromDbParams {\n isNullable?: boolean;\n default?: string;\n maxChars?: number;\n numericPrecision?: number;\n numericScale?: number;\n dateTimePrecision?: number;\n compression?: string;\n collate?: string;\n extension?: string;\n typmod: number;\n}\n\nconst knownDefaults: RecordString = {\n current_timestamp: 'now()',\n 'transaction_timestamp()': 'now()',\n};\n\nconst simplifyColumnDefault = (value?: string) => {\n if (typeof value === 'string') {\n return new RawSql([\n [knownDefaults[value.toLowerCase()] || value],\n ] as unknown as TemplateLiteralArgs);\n }\n return;\n};\n\nexport const assignDbDataToColumn = (\n column: Column.Pick.Data,\n params: ColumnFromDbParams,\n): Column.Pick.Data => {\n const { dateTimePrecision } = params;\n\n Object.assign(column.data, {\n ...params,\n dateTimePrecision:\n // 0 is default for date, 6 is default for timestamp\n dateTimePrecision && dateTimePrecision !== 6\n ? dateTimePrecision\n : undefined,\n collate: params.collate,\n default: simplifyColumnDefault(params.default),\n });\n\n return column;\n};\n","import { Column } from './column';\n\n// method names for numeric columns and JSON types to generate methods' code\nexport const numberMethodNames: (keyof AdditionalNumberData)[] = [\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'step',\n 'int',\n 'finite',\n 'safe',\n];\n\nexport interface AdditionalNumberData {\n lt?: number;\n lte?: number;\n gt?: number;\n gte?: number;\n step?: number;\n int?: boolean;\n finite?: boolean;\n safe?: boolean;\n}\n\n// numeric column and JSON type data for validations\nexport interface BaseNumberData extends Column.Data, AdditionalNumberData {}\n\n// method names for string columns and JSON types to generate methods' code\nexport const stringMethodNames: (keyof AdditionalStringData)[] = [\n 'nonEmpty',\n 'min',\n 'max',\n 'length',\n 'email',\n 'url',\n 'emoji',\n 'uuid',\n 'cuid',\n 'cuid2',\n 'ulid',\n 'regex',\n 'includes',\n 'startsWith',\n 'endsWith',\n 'datetime',\n 'ipv4',\n 'ipv6',\n 'trim',\n 'toLowerCase',\n 'toUpperCase',\n];\n\nexport interface AdditionalStringData {\n min?: number;\n max?: number;\n length?: number;\n email?: boolean;\n url?: boolean;\n emoji?: boolean;\n uuid?: boolean;\n cuid?: boolean;\n cuid2?: boolean;\n ulid?: boolean;\n regex?: RegExp;\n includes?: string;\n startsWith?: string;\n endsWith?: string;\n datetime?: {\n offset?: boolean;\n precision?: number;\n };\n ipv4?: true;\n ipv6?: true;\n nonEmpty?: boolean;\n trim?: boolean;\n toLowerCase?: boolean;\n toUpperCase?: boolean;\n}\n\n// string column and JSON type data for validations\nexport interface StringData extends Column.Data, AdditionalStringData {}\n\n// method names for date columns to generate methods' code\nexport const dateMethodNames: (keyof AdditionalDateData)[] = ['min', 'max'];\n\nexport interface AdditionalDateData {\n min?: Date;\n max?: Date;\n}\n\n// date column data for validations\nexport interface DateColumnData extends Column.Data, AdditionalDateData {}\n\n// method names for array column and JSON type to generate methods' code\nexport const arrayMethodNames: (keyof ArrayMethodsData)[] = [\n 'min',\n 'max',\n 'length',\n 'nonEmpty',\n];\n\n// array column and JSON type data for validations\nexport interface ArrayMethodsData {\n min?: number;\n max?: number;\n length?: number;\n nonEmpty?: boolean;\n}\n\nexport interface ArrayMethodsDataForBaseColumn\n extends Column.Data,\n ArrayMethodsData {}\n","import { Column } from './column';\nimport {\n emptyArray,\n emptyObject,\n objectHasValues,\n quoteObjectKey,\n RecordKeyTrue,\n RecordString,\n singleQuote,\n singleQuoteArray,\n toArray,\n toSnakeCase,\n} from '../utils';\nimport { TableData } from '../tableData';\nimport {\n arrayMethodNames,\n ArrayMethodsDataForBaseColumn,\n BaseNumberData,\n DateColumnData,\n dateMethodNames,\n numberMethodNames,\n StringData,\n stringMethodNames,\n} from './column-data-types';\nimport { isRawSQL, rawSqlToCode } from '../query/expressions/raw-sql';\n\n// Type for composing code pieces for the code generation\nexport type Code = string | Codes;\nexport type Codes = Code[];\n\nexport interface ColumnToCodeCtx {\n t: string;\n table: string;\n currentSchema: string;\n migration?: boolean;\n snakeCase?: boolean;\n}\n\n/**\n * Push code: this will append a code string to the last code array element when possible.\n * @param code - array of code to push into\n * @param add - code to push\n */\nexport const addCode = (code: Code[], add: Code) => {\n if (typeof add === 'object') {\n code.push(add);\n } else {\n const last = code.length - 1;\n if (typeof code[last] === 'string') {\n code[last] = code[last] + add;\n } else {\n code.push(add);\n }\n }\n};\n\n/**\n * Convert the code item into string.\n *\n * @param code - code item\n * @param tabs - each new line will be prefixed with the tabs. Each element of the code represents a new line\n * @param shift - array elements of the given code will be shifted with this sting\n */\nexport const codeToString = (\n code: Code,\n tabs: string,\n shift: string,\n): string => {\n if (typeof code === 'string') return `${tabs}${code}`;\n\n const lines: string[] = [];\n for (const item of code) {\n if (typeof item === 'string') {\n lines.push(`${tabs}${item}`);\n } else {\n lines.push(codeToString(item, tabs + shift, shift));\n }\n }\n\n return lines.length ? lines.join('\\n') : '';\n};\n\n/**\n * Convert a column default value into code string.\n *\n * @param t - column types variable name\n * @param value - column default\n */\nexport const columnDefaultArgumentToCode = (\n t: string,\n value: unknown,\n): string => {\n if (typeof value === 'object' && value && isRawSQL(value)) {\n return rawSqlToCode(value, t);\n } else if (typeof value === 'function') {\n return value.toString();\n } else if (typeof value === 'string') {\n return singleQuote(value);\n } else {\n return JSON.stringify(value);\n }\n};\n\n/**\n * Build a function that will generate a code for a specific column type.\n *\n * @param methodNames - array of column method names to convert to code\n * @param skip - allows skipping some methods\n * @param aliases - provide aliases for specific methods\n */\nexport const columnMethodsToCode = <T extends Column.Data>(\n methodNames: (keyof T)[],\n skip?: RecordKeyTrue,\n aliases?: RecordString,\n) => {\n return (\n data: T,\n migration: boolean | undefined,\n skipLocal?: RecordKeyTrue,\n ) => {\n return migration\n ? ''\n : methodNames\n .map((key) =>\n (skipLocal || skip)?.[key as string] ||\n (key === 'min' &&\n (data as { nonEmpty?: boolean }).nonEmpty &&\n (data as { min?: number }).min === 1)\n ? ''\n : columnMethodToCode(data, key, aliases?.[key as string]),\n )\n .join('');\n };\n};\n\n/**\n * Converts a single column method into code\n *\n * @param data - column `data` object that has info about applied methods\n * @param key - name of the method\n * @param name - optional alias for this method\n */\nconst columnMethodToCode = <T extends Column.Data, K extends keyof T>(\n data: T,\n key: K,\n name: string = key as string,\n): string => {\n const param = data[key];\n if (param === undefined) return '';\n\n const error = data.errors?.[key as string];\n\n let params;\n if (typeof param === 'object' && param && param?.constructor === Object) {\n const props: string[] = [];\n for (const key in param) {\n if (key === 'message') continue;\n\n const value = (param as T)[key as keyof T];\n if (value !== undefined) {\n props.push(\n `${key}: ${typeof value === 'string' ? singleQuote(value) : value}`,\n );\n }\n }\n\n if (error) props.push(`message: ${singleQuote(error)}`);\n\n params = props.length ? `{ ${props.join(', ')} }` : '';\n } else {\n params =\n param === true\n ? ''\n : typeof param === 'string'\n ? singleQuote(param)\n : param instanceof Date\n ? `new Date('${param.toISOString()}')`\n : param;\n\n if (error) {\n if (param !== true) params += ', ';\n params += singleQuote(error);\n }\n }\n\n return `.${name}(${params})`;\n};\n\n// Function to encode string column methods\nexport const stringDataToCode =\n columnMethodsToCode<StringData>(stringMethodNames);\n\n// Function to encode numeric column methods.\n// `int` method is skipped because it's defined by the column type itself.\n// Alias `lte` and `gte` to `max` and `min` for readability.\nexport const numberDataToCode = columnMethodsToCode<BaseNumberData>(\n numberMethodNames,\n undefined,\n { lte: 'max', gte: 'min' },\n);\n\n// Function to encode date column methods\nexport const dateDataToCode =\n columnMethodsToCode<DateColumnData>(dateMethodNames);\n// Function to encode array column methods\nexport const arrayDataToCode =\n columnMethodsToCode<ArrayMethodsDataForBaseColumn>(arrayMethodNames);\n\n/**\n * Converts column type and JSON type custom errors into code\n *\n * @param errors - custom error messages\n */\nexport const columnErrorMessagesToCode = (errors: RecordString): Code => {\n const props: Code[] = [];\n\n if (errors.required) {\n props.push(`required: ${singleQuote(errors.required)},`);\n }\n\n if (errors.invalidType) {\n props.push(`invalidType: ${singleQuote(errors.invalidType)},`);\n }\n\n const code: Code[] = [];\n\n if (!props.length) return code;\n\n addCode(code, '.error({');\n code.push(props);\n addCode(code, '})');\n\n return code;\n};\n\nexport const isDefaultTimeStamp = (item: Column.Pick.DataAndDataType) => {\n if (item.dataType !== 'timestamptz') return false;\n\n const def = item.data.default;\n if (!isRawSQL(def)) return false;\n\n return typeof def._sql === 'string' && def._sql.startsWith('now()');\n};\n\nconst combineCodeElements = (input: Code): Code => {\n if (typeof input === 'string') return input;\n\n const output: Code = [];\n let i = -1;\n\n for (const item of input) {\n if (typeof item === 'string') {\n if (typeof output[i] === 'string') {\n output[i] += item;\n } else {\n output[++i] = item;\n }\n } else {\n output[++i] = combineCodeElements(item);\n }\n }\n\n return output;\n};\n\nexport const columnsShapeToCode = (\n ctx: ColumnToCodeCtx,\n shape: Column.Shape.QueryInit,\n): Codes => {\n const hasTimestamps =\n // migration should capture the current `nowSQL`, it can be changed later by user\n !ctx.migration &&\n 'createdAt' in shape &&\n isDefaultTimeStamp(\n shape.createdAt as unknown as Column.Pick.DataAndDataType,\n ) &&\n 'updatedAt' in shape &&\n isDefaultTimeStamp(\n shape.updatedAt as unknown as Column.Pick.DataAndDataType,\n );\n\n const code: Code = [];\n\n for (const key in shape) {\n if (hasTimestamps && (key === 'createdAt' || key === 'updatedAt')) continue;\n\n const column = shape[key];\n const name = column.data.name;\n if (name === key) column.data.name = undefined;\n\n code.push(\n ...combineCodeElements([\n `${quoteObjectKey(key, ctx.snakeCase)}: `,\n ...toArray((shape[key] as Column).toCode(ctx, key)),\n ',',\n ]),\n );\n\n if (name === key) column.data.name = name;\n }\n\n if (hasTimestamps) {\n code.push(`...${ctx.t}.timestamps(),`);\n }\n\n return code;\n};\n\nexport const pushTableDataCode = (code: Codes, ast: TableData): Codes => {\n const lines: Codes[] = [\n ast.primaryKey && [primaryKeyInnerToCode(ast.primaryKey, 't') + ','],\n ...(ast.indexes?.map((x) => indexToCode(x, 't')) || emptyArray),\n ...(ast.excludes?.map((x) => excludeToCode(x, 't')) || emptyArray),\n ...(ast.constraints?.map((x) => constraintToCode(x, 't', true)) ||\n emptyArray),\n ].filter((x): x is string[] => !!x);\n\n if (lines.length > 1) {\n code.push('(t) => [', ...lines, '],');\n } else if (lines[0].length === 1 && typeof lines[0][0] === 'string') {\n code.push('(t) => ' + lines[0][0]);\n } else {\n code.push('(t) => ', lines[0]);\n }\n\n return code;\n};\n\nexport const primaryKeyInnerToCode = (\n primaryKey: TableData.PrimaryKey,\n t: string,\n): string => {\n const name = primaryKey.name;\n\n return `${t}.primaryKey([${primaryKey.columns.map(singleQuote).join(', ')}]${\n name ? `, ${singleQuote(name)}` : ''\n })`;\n};\n\nconst indexOrExcludeToCode =\n <T extends TableData.Index | TableData.Exclude>(\n innerToCode: (item: T, t: string) => Codes,\n ) =>\n (item: T, t: string, prefix?: string) => {\n const code = innerToCode(item, t);\n if (prefix) code[0] = prefix + code[0];\n const last = code[code.length - 1];\n if (typeof last === 'string' && !last.endsWith(',')) addCode(code, ',');\n return code;\n };\n\nexport const indexInnerToCode = (index: TableData.Index, t: string): Codes => {\n const code: Codes = [\n `${t}.${\n index.options.tsVector\n ? 'searchIndex'\n : index.options.unique\n ? 'unique'\n : 'index'\n }(`,\n ];\n\n const columnOptions = ['collate', 'opclass', 'order', 'weight'] as const;\n\n const indexOptionsKeys: (undefined | keyof TableData.Index.Options)[] = [\n index.options.tsVector ? 'unique' : undefined,\n 'name',\n 'using',\n 'nullsNotDistinct',\n 'include',\n 'with',\n 'tablespace',\n 'where',\n 'language',\n 'languageColumn',\n 'dropMode',\n ];\n\n const hasOptions = indexOptionsKeys.some((key) => key && index.options[key]);\n\n const columnsMultiline = index.columns.some((column) => {\n for (const key in column) {\n if (key !== 'column' && column[key as keyof typeof column] !== undefined)\n return true;\n }\n return false;\n });\n\n if (columnsMultiline) {\n const objects: Codes = [];\n\n for (const column of index.columns) {\n const expr = 'expression' in column ? column.expression : column.column;\n\n let hasOptions = false;\n for (const key in column) {\n if (key !== 'column') {\n hasOptions = true;\n }\n }\n\n if (!hasOptions) {\n objects.push(`${singleQuote(expr)},`);\n } else {\n const props: Codes = [\n `${'expression' in column ? 'expression' : 'column'}: ${singleQuote(\n expr,\n )},`,\n ];\n for (const key of columnOptions) {\n const value = column[key];\n if (value !== undefined) {\n props.push(`${key}: ${singleQuote(value)},`);\n }\n }\n\n objects.push('{', props, '},');\n }\n }\n\n code.push(['[', objects, hasOptions ? '],' : ']']);\n } else {\n addCode(\n code,\n `[${index.columns\n .map((it) => singleQuote((it as { column: string }).column))\n .join(', ')}]`,\n );\n }\n\n if (hasOptions) {\n if (columnsMultiline) {\n code.push(['{']);\n } else {\n addCode(code, ', {');\n }\n\n const options: string[] = [];\n for (const key of indexOptionsKeys) {\n if (!key) continue;\n\n const value = index.options[key];\n if (value === null || value === undefined) continue;\n\n options.push(\n `${key}: ${\n Array.isArray(value)\n ? singleQuoteArray(value)\n : typeof value === 'string'\n ? singleQuote(value)\n : value\n },`,\n );\n }\n\n if (columnsMultiline) {\n code.push([options, '},']);\n } else {\n code.push(options);\n addCode(code, '}');\n }\n }\n\n if (columnsMultiline) {\n code.push('),');\n } else {\n addCode(code, ')');\n }\n\n return code;\n};\n\nexport const indexToCode = indexOrExcludeToCode(indexInnerToCode);\n\nexport const excludeInnerToCode = (\n item: TableData.Exclude,\n t: string,\n): Codes => {\n const code: Codes = [`${t}.exclude(`];\n\n const columnOptions = ['collate', 'opclass', 'order', 'with'] as const;\n\n const optionsKeys: (undefined | keyof TableData.Exclude.Options)[] = [\n 'name',\n 'using',\n 'include',\n 'with',\n 'tablespace',\n 'where',\n 'dropMode',\n ];\n\n const hasOptions = optionsKeys.some((key) => key && item.options[key]);\n\n const objects: Codes = [];\n\n for (const column of item.columns) {\n const expr = 'expression' in column ? column.expression : column.column;\n\n const props: Codes = [\n `${'expression' in column ? 'expression' : 'column'}: ${singleQuote(\n expr,\n )},`,\n ];\n for (const key of columnOptions) {\n const value = column[key];\n if (value !== undefined) {\n props.push(`${key}: ${singleQuote(value)},`);\n }\n }\n\n objects.push('{', props, '},');\n }\n\n code.push(['[', objects, hasOptions ? '],' : ']']);\n\n if (hasOptions) {\n code.push(['{']);\n\n const options: string[] = [];\n for (const key of optionsKeys) {\n if (!key) continue;\n\n const value = item.options[key];\n if (value === null || value === undefined) continue;\n\n options.push(\n `${key}: ${\n Array.isArray(value)\n ? singleQuoteArray(value)\n : typeof value === 'string'\n ? singleQuote(value)\n : value\n },`,\n );\n }\n\n code.push([options, '},']);\n }\n\n code.push('),');\n\n return code;\n};\n\nexport const excludeToCode = indexOrExcludeToCode(excludeInnerToCode);\n\nexport const constraintToCode = (\n item: TableData.Constraint,\n t: string,\n m?: boolean,\n prefix?: string,\n): Codes => {\n const code = constraintInnerToCode(item, t, m);\n if (prefix) code[0] = prefix + code[0];\n const last = code[code.length - 1];\n if (typeof last === 'string' && !last.endsWith(','))\n code[code.length - 1] += ',';\n return code;\n};\n\nexport const constraintInnerToCode = (\n item: TableData.Constraint,\n t: string,\n m?: boolean,\n): Codes => {\n if (item.references) {\n return [\n `${t}.foreignKey(`,\n referencesArgsToCode(item.references, item.name, m),\n '),',\n ];\n }\n\n return [\n `${t}.check(${rawSqlToCode(item.check as TableData.Check, t)}${\n item.name ? `, ${singleQuote(item.name)}` : ''\n })`,\n ];\n};\n\nexport const referencesArgsToCode = (\n {\n columns,\n fnOrTable,\n foreignColumns,\n options,\n }: Exclude<TableData.Constraint['references'], undefined>,\n name: string | false = options?.name || false,\n m?: boolean,\n): Codes => {\n const args: Codes = [];\n\n args.push(`${singleQuoteArray(columns)},`);\n\n if (m && typeof fnOrTable !== 'string') {\n const { schema, table } = new (fnOrTable())();\n fnOrTable = schema ? `${schema}.${table}` : table;\n }\n\n args.push(\n `${\n typeof fnOrTable === 'string'\n ? singleQuote(fnOrTable)\n : fnOrTable.toString()\n },`,\n );\n\n args.push(`${singleQuoteArray(foreignColumns)},`);\n\n if (objectHasValues(options) || name) {\n const lines: string[] = [];\n if (name) lines.push(`name: ${singleQuote(name)},`);\n for (const key in options) {\n if (key === 'name') continue;\n const value = options[key as keyof typeof options];\n if (value) lines.push(`${key}: ${singleQuote(value)},`);\n }\n args.push('{', lines, '},');\n }\n\n return args;\n};\n\nexport const columnForeignKeysToCode = (\n foreignKeys: TableData.ColumnReferences[],\n migration: boolean | undefined,\n): Codes => {\n const code: Codes = [];\n for (const foreignKey of foreignKeys) {\n addCode(code, `.foreignKey(`);\n for (const part of foreignKeyArgumentToCode(foreignKey, migration)) {\n addCode(code, part);\n }\n addCode(code, ')');\n }\n return code;\n};\n\nexport const foreignKeyArgumentToCode = (\n {\n fnOrTable,\n foreignColumns,\n options = emptyObject,\n }: TableData.ColumnReferences,\n migration: boolean | undefined,\n): Codes => {\n const code: Code = [];\n\n if (migration && typeof fnOrTable !== 'string') {\n const { schema, table } = new (fnOrTable())();\n fnOrTable = schema ? `${schema}.${table}` : table;\n }\n\n code.push(\n typeof fnOrTable === 'string'\n ? singleQuote(fnOrTable)\n : fnOrTable.toString(),\n );\n\n addCode(code, `, ${singleQuote(foreignColumns[0])}`);\n\n const hasOptions =\n options.name || options.match || options.onUpdate || options.onDelete;\n\n if (hasOptions) {\n const arr: string[] = [];\n\n if (options.name) arr.push(`name: ${singleQuote(options.name)},`);\n if (options.match) arr.push(`match: ${singleQuote(options.match)},`);\n if (options.onUpdate)\n arr.push(`onUpdate: ${singleQuote(options.onUpdate)},`);\n if (options.onDelete)\n arr.push(`onDelete: ${singleQuote(options.onDelete)},`);\n\n addCode(code, ', {');\n code.push(arr);\n addCode(code, '}');\n }\n\n return code;\n};\n\nexport const columnIndexesToCode = (\n items: Exclude<Column.Data['indexes'], undefined>,\n): Codes => {\n const code: Codes = [];\n for (const { options } of items) {\n addCode(code, `.${options.unique ? 'unique' : 'index'}(`);\n\n const arr = [\n options.name && `name: ${singleQuote(options.name)},`,\n options.collate && `collate: ${singleQuote(options.collate)},`,\n options.opclass && `opclass: ${singleQuote(options.opclass)},`,\n options.order && `order: ${singleQuote(options.order)},`,\n options.using && `using: ${singleQuote(options.using)},`,\n options.include &&\n `include: ${\n typeof options.include === 'string'\n ? singleQuote(options.include)\n : `[${options.include.map(singleQuote).join(', ')}]`\n },`,\n options.nullsNotDistinct && `nullsNotDistinct: true,`,\n options.with && `with: ${singleQuote(options.with)},`,\n options.tablespace && `tablespace: ${singleQuote(options.tablespace)},`,\n options.where && `where: ${singleQuote(options.where)},`,\n ].filter((x): x is string => !!x);\n\n if (arr.length) {\n addCode(code, '{');\n addCode(code, arr);\n addCode(code, '}');\n }\n\n addCode(code, ')');\n }\n return code;\n};\n\nexport const columnExcludesToCode = (\n items: Exclude<Column.Data['excludes'], undefined>,\n): Codes => {\n const code: Codes = [];\n for (const { options, with: w } of items) {\n addCode(code, `.exclude('${w}'`);\n\n const arr = [\n options.name && `name: ${singleQuote(options.name)},`,\n options.collate && `collate: ${singleQuote(options.collate)},`,\n options.opclass && `opclass: ${singleQuote(options.opclass)},`,\n options.order && `order: ${singleQuote(options.order)},`,\n options.using && `using: ${singleQuote(options.using)},`,\n options.include &&\n `include: ${\n typeof options.include === 'string'\n ? singleQuote(options.include)\n : `[${options.include.map(singleQuote).join(', ')}]`\n },`,\n options.with && `with: ${singleQuote(options.with)},`,\n options.tablespace && `tablespace: ${singleQuote(options.tablespace)},`,\n options.where && `where: ${singleQuote(options.where)},`,\n ].filter((x): x is string => !!x);\n\n if (arr.length) {\n addCode(code, ', {');\n addCode(code, arr);\n addCode(code, '}');\n }\n\n addCode(code, ')');\n }\n return code;\n};\n\nexport const columnCheckToCode = (\n ctx: ColumnToCodeCtx,\n checks: Column.Data.Check[],\n): string => {\n return checks\n .map(\n ({ sql, name }) =>\n `.check(${rawSqlToCode(sql, ctx.t)}${name ? `, '${name}'` : ''})`,\n )\n .join('');\n};\n\nexport const identityToCode = (\n identity: TableData.Identity,\n dataType?: string,\n) => {\n const code: Codes = [];\n\n if (dataType === 'integer') {\n code.push(`identity(`);\n } else {\n code.push(`${dataType}().identity(`);\n }\n\n const props: string[] = [];\n if (identity.always) props.push(`always: true,`);\n if (identity.increment && identity.increment !== 1)\n props.push(`increment: ${identity.increment},`);\n if (identity.start && identity.start !== 1)\n props.push(`start: ${identity.start},`);\n if (identity.min) props.push(`min: ${identity.min},`);\n if (identity.max) props.push(`max: ${identity.max},`);\n if (identity.cache && identity.cache !== 1)\n props.push(`cache: ${identity.cache},`);\n if (identity.cycle) props.push(`cycle: true,`);\n\n if (props.length) {\n addCode(code, '{');\n code.push(props, '}');\n }\n\n addCode(code, ')');\n\n return code;\n};\n\nexport const columnCode = (\n type: Column,\n ctx: ColumnToCodeCtx,\n key: string,\n code: Code,\n): Code => {\n const { data } = type;\n\n code = toArray(code);\n\n let prepend = `${ctx.t}.`;\n const keyName = ctx.snakeCase ? toSnakeCase(key) : key;\n const name = data.name ?? keyName;\n if (name !== keyName) {\n prepend += `name(${singleQuote(name)}).`;\n }\n\n if (typeof code[0] === 'string') {\n code[0] = `${prepend}${code[0]}`;\n } else {\n code[0].unshift(prepend);\n }\n\n if (data.generated) {\n addCode(code, data.generated.toCode());\n }\n\n if (data.primaryKey) {\n addCode(\n code,\n `.primaryKey(${\n data.primaryKey === (true as never) ? '' : singleQuote(data.primaryKey)\n })`,\n );\n }\n\n if (data.foreignKeys) {\n for (const part of columnForeignKeysToCode(\n data.foreignKeys,\n ctx.migration,\n )) {\n addCode(code, part);\n }\n }\n\n if (data.explicitSelect) addCode(code, '.select(false)');\n\n if (data.isNullable) addCode(code, '.nullable()');\n\n if (data.as && !ctx.migration) {\n addCode(code, `.as(${(data.as as Column).toCode(ctx, key)})`);\n }\n\n if (\n data.default !== undefined &&\n data.default !== data.defaultDefault &&\n (!ctx.migration || typeof data.default !== 'function')\n ) {\n addCode(\n code,\n `.default(${columnDefaultArgumentToCode(ctx.t, data.default)})`,\n );\n }\n\n if (data.indexes) {\n for (const part of columnIndexesToCode(data.indexes)) {\n addCode(code, part);\n }\n }\n\n if (data.excludes) {\n for (const part of columnExcludesToCode(data.excludes)) {\n addCode(code, part);\n }\n }\n\n if (data.comment) addCode(code, `.comment(${singleQuote(data.comment)})`);\n\n if (data.checks) {\n addCode(code, columnCheckToCode(ctx, data.checks));\n }\n\n if (data.errors) {\n for (const part of columnErrorMessagesToCode(data.errors)) {\n addCode(code, part);\n }\n }\n\n const { validationDefault } = data;\n if (validationDefault) {\n addCode(\n code,\n `.validationDefault(${\n typeof validationDefault === 'function'\n ? validationDefault.toString()\n : typeof validationDefault === 'string'\n ? singleQuote(validationDefault)\n : JSON.stringify(validationDefault)\n })`,\n );\n }\n\n if (data.compression)\n addCode(code, `.compression(${singleQuote(data.compression)})`);\n\n if (data.collate) addCode(code, `.collate(${singleQuote(data.collate)})`);\n\n if (data.modifyQuery && !ctx.migration)\n addCode(code, `.modifyQuery(${data.modifyQuery.toString()})`);\n\n return code.length === 1 && typeof code[0] === 'string' ? code[0] : code;\n};\n","import { singleQuote } from '../../utils';\nimport { Column, setColumnData } from '../column';\nimport { Code, columnCode, ColumnToCodeCtx } from '../code';\nimport { Operators, OperatorsAny } from '../operators';\nimport { ColumnSchemaConfig } from '../column-schema';\n\n// for a user-defined type, or for unsupported yet type from some module\nexport class CustomTypeColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n unknown,\n ReturnType<Schema['unknown']>,\n OperatorsAny\n> {\n operators = Operators.any;\n public dataType: string;\n\n constructor(\n schema: Schema,\n public typeName: string,\n public typeSchema?: string,\n extension?: string,\n ) {\n super(\n schema,\n schema.unknown() as never,\n schema.unknown() as never,\n schema.unknown() as never,\n );\n this.dataType = typeSchema ? typeSchema + '.' + typeName : typeName;\n this.data.isOfCustomType = true;\n this.data.extension = extension;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const {\n dataType,\n data: { typmod },\n } = this;\n\n return columnCode(\n this,\n ctx,\n key,\n `type(${singleQuote(\n (dataType.startsWith(ctx.currentSchema)\n ? dataType.slice(ctx.currentSchema.length + 1)\n : dataType) +\n (typmod !== undefined && typmod !== -1 && !dataType.includes('(')\n ? `(${typmod})`\n : ''),\n )})`,\n );\n }\n\n as<\n T extends { inputType: unknown; outputType: unknown; data: Column.Data },\n C extends {\n inputType: T['inputType'];\n outputType: T['outputType'];\n },\n >(this: T, column: C): C {\n const c = column as unknown as Column.Pick.TypeSchemas;\n const extended = setColumnData(\n this,\n 'as',\n column as unknown as T['data']['as'],\n ) as unknown as Column.Pick.TypeSchemas;\n\n extended.inputSchema = c.inputSchema;\n extended.outputSchema = c.outputSchema;\n extended.querySchema = c.querySchema;\n\n return extended as never;\n }\n}\n\n// domain column type: https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-user-defined-data-types/\nexport class DomainColumn<\n Schema extends ColumnSchemaConfig,\n> extends CustomTypeColumn<Schema> {\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `domain(${singleQuote(this.dataType)})`);\n }\n}\n","import { Column } from '../column';\nimport { columnCode, ColumnToCodeCtx } from '../code';\nimport { Code } from '../code';\nimport { Operators, OperatorsOrdinalText } from '../operators';\nimport { ColumnTypeSchemaArg } from '../column-schema';\n\nexport class EnumColumn<\n Schema extends ColumnTypeSchemaArg,\n SchemaType extends Schema['type'],\n const T extends readonly string[],\n> extends Column<Schema, T[number], SchemaType, OperatorsOrdinalText> {\n operators = Operators.ordinalText;\n dataType = 'enum';\n\n constructor(\n schema: Schema,\n public enumName: string,\n public options: T,\n schemaType: SchemaType,\n ) {\n super(schema, schemaType);\n this.inputSchema = this.outputSchema = this.querySchema = schemaType;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const options = ctx.migration\n ? ''\n : `, [${this.options.map((option) => `'${option}'`).join(', ')}]`;\n return columnCode(this, ctx, key, `enum('${this.enumName}'${options})`);\n }\n\n toSQL() {\n const name = this.enumName;\n const index = name.indexOf('.');\n return `\"${\n index === -1 ? name : `${name.slice(0, index)}\".\"${name.slice(index + 1)}`\n }\"`;\n }\n}\n","import { Column } from './column';\nimport { DomainColumn } from './column-types/custom-type';\nimport { EnumColumn } from './column-types/enum';\nimport { getValueKey } from '../query/basic-features/get/get-value-key';\nimport { ColumnsParsers } from '../query/query-columns/query-column-parsers';\nimport { setObjectValueImmutable } from '../utils';\n\nexport interface DbStructureDomainsMap {\n [K: string]: Column;\n}\n\nexport const addColumnParserToQuery = (\n q: { parsers?: ColumnsParsers },\n key: string | getValueKey,\n column: Column.Pick.QueryColumn,\n) => {\n if ((column as Column)._parse) {\n setObjectValueImmutable(q, 'parsers', key, (column as Column)._parse);\n }\n};\n\nexport const setColumnDefaultParse = (\n column: Column.Pick.Data,\n parse: (input: any) => unknown, // eslint-disable-line @typescript-eslint/no-explicit-any\n) => {\n column.data.parse = parse;\n (column as Column)._parse = (input: unknown) =>\n input === null ? null : parse(input);\n};\n\nexport const setColumnParse = (\n column: Column.Pick.Data,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fn: (input: any) => unknown,\n outputSchema?: unknown,\n) => {\n const c = Object.create(column);\n c.outputSchema = outputSchema;\n c.data = { ...column.data, parse: fn };\n\n const { parseNull } = column.data;\n c._parse = parseNull\n ? (input: unknown) => (input === null ? parseNull() : fn(input))\n : (input: unknown) => (input === null ? null : fn(input));\n\n return c;\n};\n\nexport const setColumnParseNull = (\n column: Column.Pick.Data,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fn: () => unknown,\n nullSchema?: unknown,\n) => {\n const c = Object.create(column);\n c.nullSchema = nullSchema;\n c.data = { ...column.data, parseNull: fn };\n\n const { parse } = column.data;\n c._parse = parse\n ? (input: unknown) => (input === null ? fn() : parse(input))\n : (input: unknown) => (input === null ? fn() : input);\n\n return c;\n};\n\nexport const setColumnEncode = (\n column: Column.Pick.Data,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fn: (input: any) => unknown,\n inputSchema?: unknown,\n) => {\n const c = Object.create(column);\n c.inputSchema = inputSchema;\n c.data = { ...column.data, encode: fn };\n return c;\n};\n\nexport const getColumnBaseType = (\n column: Column.Pick.Data,\n domainsMap: DbStructureDomainsMap,\n type: string,\n) => {\n return column instanceof EnumColumn\n ? 'text'\n : column instanceof DomainColumn\n ? domainsMap[column.dataType]?.dataType\n : type;\n};\n","// Symbol that is used in the parsers in the query data for a column that doesn't have a name\n// this is for the case when using query.get('column') or query.count() - it returns anonymous value\nexport type getValueKey = typeof getValueKey;\n// Symbol that is used in the parsers in the query data for a column that doesn't have a name\n// this is for the case when using query.get('column') or query.count() - it returns anonymous value\nexport const getValueKey = Symbol('get');\n","import { IsQuery, Query, SetQueryReturnsColumnOrThrow } from '../query/query';\nimport { addColumnParserToQuery } from './column.utils';\nimport { Column } from './column';\nimport { ToSQLCtx } from '../query/sql/to-sql';\nimport { MoveMutativeQueryToCte } from '../query/basic-features/cte/cte.sql';\nimport {\n ArgWithBeforeAndBeforeSet,\n PrepareSubQueryForSql,\n} from '../query/internal-features/sub-query/sub-query-for-sql';\nimport { Db } from '../query/db';\nimport {\n PickQueryColumTypes,\n PickQueryQ,\n PickQueryResult,\n PickQueryResultColumnTypes,\n} from '../query/pick-query-types';\nimport {\n addValue,\n emptyArray,\n isIterable,\n MaybeArray,\n RecordUnknown,\n setObjectValueImmutable,\n} from '../utils';\nimport { Expression, isExpression } from '../query/expressions/expression';\nimport { BooleanQueryColumn } from '../query/basic-features/aggregate/aggregate';\nimport { getValueKey } from '../query/basic-features/get/get-value-key';\nimport { QueryThen } from '../query';\n\n// workaround for circular dependencies between columns and sql\nlet moveMutativeQueryToCte: MoveMutativeQueryToCte;\nexport const setMoveMutativeQueryToCte = (fn: MoveMutativeQueryToCte) => {\n moveMutativeQueryToCte = fn;\n};\n\nlet prepareSubQueryForSql: PrepareSubQueryForSql;\nexport const setPrepareSubQueryForSql = (fn: PrepareSubQueryForSql) => {\n prepareSubQueryForSql = fn;\n};\n\nlet dbClass: typeof Db;\nexport const setDb = (db: typeof Db) => {\n dbClass = db;\n};\n\n/**\n * Function to turn the operator expression into SQL.\n *\n * @param key - SQL of the target to apply operator for, can be a quoted column name or an SQL expression wrapped with parens.\n * @param args - arguments of operator function.\n * @param ctx - context object for SQL conversions, for collecting query variables.\n * @param quotedAs - quoted table name.\n */\nexport interface OperatorToSQL {\n (key: string, args: [unknown], ctx: unknown, quotedAs?: string): string;\n}\n\n// Operator function type.\n// Table.count().gt(10) <- here `.gt(10)` is this operator function.\n// It discards previously defined column type operators and applies new ones,\n// for a case when operator gives a different column type.\nexport interface Operator<\n Value,\n Column extends Column.Pick.OutputTypeAndOperators = Column.Pick.OutputTypeAndOperators,\n> {\n <T extends PickQueryResult>(this: T, arg: Value):\n | {\n [K in Exclude<\n keyof T,\n keyof T['result']['value']['operators']\n >]: K extends 'result'\n ? { value: Column }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<Column['outputType']>\n : T[K];\n } & Column['operators'];\n // argument type of the function\n _opType: Value;\n}\n\n// Extend query object with given operator methods, so that user can call `gt` after calling `count`.\n// If query already has the same operators, nothing is changed.\n// Previously defined operators, if any, are **not** dropped from the query.\nexport function setQueryOperators(query: IsQuery, operators: RecordUnknown) {\n const q = (query as unknown as PickQueryQ).q;\n\n if (q.operators !== operators) {\n q.operators = operators;\n Object.assign(query, operators);\n }\n\n return query;\n}\n\n/**\n * Makes operator function that has `_op` property.\n *\n * @param _op - function to turn the operator call into SQL.\n */\nconst make = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _op: (key: string, args: any, ctx: ToSQLCtx, quotedAs?: string) => string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any => {\n return Object.assign(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function (this: PickQueryQ, value: any) {\n const { q } = this;\n\n const val = prepareOpArg(this, value);\n (q.chain ??= []).push(_op, val || value);\n\n // parser might be set by a previous type, but is not needed for boolean\n if (q.parsers?.[getValueKey]) {\n setObjectValueImmutable(q, 'parsers', getValueKey, undefined);\n }\n\n return setQueryOperators(this as never, boolean as never);\n },\n {\n // function to turn the operator expression into SQL\n _op,\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as never;\n};\n\n// is different from `make` by `(q.chain ??= []).push(_op, value -> args)`\nconst makeVarArg = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _op: (key: string, args: any[], ctx: ToSQLCtx, quotedAs?: string) => string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any => {\n return Object.assign(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function (this: PickQueryQ, ...args: any[]) {\n const { q } = this;\n\n args.forEach((arg, i) => {\n const val = prepareOpArg(this, arg);\n if (val) args[i] = val;\n });\n\n (q.chain ??= []).push(_op, args);\n\n // parser might be set by a previous type, but is not needed for boolean\n if (q.parsers?.[getValueKey]) {\n setObjectValueImmutable(q, 'parsers', getValueKey, undefined);\n }\n\n return setQueryOperators(this as never, boolean as never);\n },\n {\n // function to turn the operator expression into SQL\n _op,\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as never;\n};\n\nexport const prepareOpArg = (q: unknown, arg: unknown) => {\n return arg instanceof dbClass\n ? prepareSubQueryForSql(q as ArgWithBeforeAndBeforeSet, arg as Query)\n : undefined;\n};\n\n// Handles array, expression object, query object to insert into sql.\n// Saves values to `ctx.values`.\nconst quoteValue = (\n arg: unknown,\n ctx: ToSQLCtx,\n quotedAs: string | undefined,\n IN?: boolean,\n): string => {\n if (arg && typeof arg === 'object') {\n if (IN && isIterable(arg)) {\n return `(${(Array.isArray(arg) ? arg : [...arg])\n .map((value) => addValue(ctx.values, value))\n .join(', ')})`;\n }\n\n if (isExpression(arg)) {\n return arg.toSQL(ctx, quotedAs);\n }\n\n if ('toSQL' in arg) {\n return `(${moveMutativeQueryToCte(ctx, arg as never)})`;\n }\n\n if (!(arg instanceof Date) && !Array.isArray(arg)) {\n arg = JSON.stringify(arg);\n }\n }\n\n return addValue(ctx.values, arg);\n};\n\nconst quoteLikeValue = (\n arg: unknown,\n ctx: ToSQLCtx,\n quotedAs: string | undefined,\n jsonArray?: boolean,\n): string => {\n if (arg && typeof arg === 'object') {\n if (!jsonArray && Array.isArray(arg)) {\n return `(${arg.map((value) => addValue(ctx.values, value)).join(', ')})`;\n }\n\n if (isExpression(arg)) {\n return arg.toSQL(ctx, quotedAs);\n }\n\n if ('toSQL' in arg) {\n return `replace(replace((${moveMutativeQueryToCte(\n ctx,\n arg as never,\n )}), '%', '\\\\\\\\%'), '_', '\\\\\\\\_')`;\n }\n }\n\n return addValue(ctx.values, (arg as string).replace(/[%_]/g, '\\\\$&'));\n};\n\n// common operators that exist for any types\ninterface Base<Value> {\n __hasSelect: true;\n equals: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n not: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n in: Operator<Value[] | IsQuery | Expression, BooleanQueryColumn>;\n notIn: Operator<Value[] | IsQuery | Expression, BooleanQueryColumn>;\n}\n\nconst base = {\n equals: make((key, value, ctx, quotedAs) =>\n value === null\n ? `${key} IS NULL`\n : `${key} = ${quoteValue(value, ctx, quotedAs)}`,\n ),\n not: make((key, value, ctx, quotedAs) =>\n value === null\n ? `${key} IS NOT NULL`\n : `${key} <> ${quoteValue(value, ctx, quotedAs)}`,\n ),\n in: make((key, value, ctx, quotedAs) =>\n Array.isArray(value) && !value.length\n ? 'false'\n : `${key} IN ${quoteValue(value, ctx, quotedAs, true)}`,\n ),\n notIn: make((key, value, ctx, quotedAs) =>\n Array.isArray(value) && !value.length\n ? 'true'\n : `NOT ${key} IN ${quoteValue(value, ctx, quotedAs, true)}`,\n ),\n} as Base<unknown>;\n\ninterface OperatorsBooleanSelf extends OperatorsBoolean {\n result: { value: BooleanQueryColumn };\n}\n\n// Numeric, date, and time can be compared with `lt`, `gt`, so it's generic.\ninterface Ord<Value> extends Base<Value> {\n lt: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n lte: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n gt: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n gte: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n between: Operator<\n [Value | IsQuery | Expression, Value | IsQuery | Expression],\n BooleanQueryColumn\n >;\n}\n\nexport type OperatorsNumber = Ord<number>;\n\nconst ord = {\n ...base,\n lt: make(\n (key, value, ctx, quotedAs) =>\n `${key} < ${quoteValue(value, ctx, quotedAs)}`,\n ),\n lte: make(\n (key, value, ctx, quotedAs) =>\n `${key} <= ${quoteValue(value, ctx, quotedAs)}`,\n ),\n gt: make(\n (key, value, ctx, quotedAs) =>\n `${key} > ${quoteValue(value, ctx, quotedAs)}`,\n ),\n gte: make(\n (key, value, ctx, quotedAs) =>\n `${key} >= ${quoteValue(value, ctx, quotedAs)}`,\n ),\n between: make(\n (key, [from, to], ctx, quotedAs) =>\n `${key} BETWEEN ${quoteValue(from, ctx, quotedAs)} AND ${quoteValue(\n to,\n ctx,\n quotedAs,\n )}`,\n ),\n} as OperatorsNumber;\n\n// Boolean type operators\nexport interface OperatorsBoolean extends Ord<boolean> {\n and: Operator<OperatorsBooleanSelf, BooleanQueryColumn>;\n or: Operator<OperatorsBooleanSelf, BooleanQueryColumn>;\n}\n\nconst boolean = {\n ...ord,\n and: make(\n (key, value, ctx, quotedAs) =>\n `${key} AND ${value.q.expr.toSQL(ctx, quotedAs)}`,\n ),\n or: make(\n (key, value, ctx, quotedAs) =>\n `(${key}) OR (${value.q.expr.toSQL(ctx, quotedAs)})`,\n ),\n} as unknown as OperatorsBoolean;\n\n// Text type operators\nexport interface OperatorsText extends Base<string> {\n contains: Operator<string | IsQuery | Expression, BooleanQueryColumn>;\n containsSensitive: Operator<\n string | IsQuery | Expression,\n BooleanQueryColumn\n >;\n startsWith: Operator<string | IsQuery | Expression, BooleanQueryColumn>;\n startsWithSensitive: Operator<\n string | IsQuery | Expression,\n BooleanQueryColumn\n >;\n endsWith: Operator<string | IsQuery | Expression, BooleanQueryColumn>;\n endsWithSensitive: Operator<\n string | IsQuery | Expression,\n BooleanQueryColumn\n >;\n}\n\nconst text = {\n ...base,\n contains: make(\n (key, value, ctx, quotedAs) =>\n `${key} ILIKE '%' || ${quoteLikeValue(value, ctx, quotedAs)} || '%'`,\n ),\n containsSensitive: make(\n (key, value, ctx, quotedAs) =>\n `${key} LIKE '%' || ${quoteLikeValue(value, ctx, quotedAs)} || '%'`,\n ),\n startsWith: make(\n (key, value, ctx, quotedAs) =>\n `${key} ILIKE ${quoteLikeValue(value, ctx, quotedAs)} || '%'`,\n ),\n startsWithSensitive: make(\n (key, value, ctx, quotedAs) =>\n `${key} LIKE ${quoteLikeValue(value, ctx, quotedAs)} || '%'`,\n ),\n endsWith: make(\n (key, value, ctx, quotedAs) =>\n `${key} ILIKE '%' || ${quoteLikeValue(value, ctx, quotedAs)}`,\n ),\n endsWithSensitive: make(\n (key, value, ctx, quotedAs) =>\n `${key} LIKE '%' || ${quoteLikeValue(value, ctx, quotedAs)}`,\n ),\n} as OperatorsText;\n\nexport interface OperatorsOrdinalText extends Ord<string>, OperatorsText {}\n\nconst ordinalText = {\n ...ord,\n ...text,\n} as OperatorsOrdinalText;\n\ninterface JsonPathQueryOptions {\n vars?: RecordUnknown;\n silent?: boolean;\n}\n\ninterface JsonPathQueryTypeOptions<\n T extends PickQueryColumTypes,\n C extends Column.Pick.QueryColumn,\n> extends JsonPathQueryOptions {\n type?: (types: T['columnTypes']) => C;\n}\n\ninterface JsonPathQuery {\n /**\n * Selects a value from JSON data using a JSON path.\n *\n * Calls the [jsonb_path_query_first](https://www.postgresql.org/docs/current/functions-json.html) Postgres function.\n *\n * Type can be provided via `{ type: (t) => t.columnType() }` options, by default the type is `unknown`.\n *\n * Optionally takes `vars` and `silent` parameters, see [Postgres docs](https://www.postgresql.org/docs/current/functions-json.html) for details.\n *\n * The `type` option sets the output type when selecting a value,\n * also it makes specific operators available in `where`, so that you can apply `contains` if the type is text, and `gt` if the type is numeric.\n *\n * ```ts\n * // query a single value from a JSON data,\n * // because of the provided type, string JSON value will be parsed to a Date object.\n * const value = await db.table\n * .get('data')\n * .jsonPathQueryFirst('$.path.to.date', { type: (t) => t.date().asDate() });\n *\n * // using it in a select\n * const records = await db.table.select({\n * date: (q) =>\n * q.get('data').jsonPathQueryFirst('$[*] ? (@ = key)', {\n * type: (t) => t.integer(),\n * // defining `vars` and `silent`\n * vars: { key: 'key' },\n * silent: true,\n * }),\n * });\n *\n * // using it in `where`\n * const filtered = await db.table.where((q) =>\n * // filtering records by the `name` property from the `data` JSON column\n * q.get('data').jsonPathQueryFirst('$.name').equals('name'),\n * );\n *\n * // using it in update\n * await db.table.find(id).update({\n * // using data property to set the `name` column\n * name: (q) =>\n * q.get('data').jsonPathQueryFirst('$.name', { type: (t) => t.string() }),\n * });\n *\n * // filtering records to contain 'word' in the json property \"name\"\n * await db.table.where((q) =>\n * q\n * .get('data')\n * .jsonPathQueryFirst('$.name', { type: (t) => t.string() })\n * .contains('word'),\n * );\n * ```\n *\n * @param path - JSON path\n * @param options - can have type, vars, silent\n */\n <\n T extends PickQueryResultColumnTypes,\n C extends Column.Pick.QueryColumn = Column.Pick.QueryColumnOfTypeAndOps<\n string,\n unknown,\n OperatorsAny\n >,\n >(\n this: T,\n path: string,\n options?: JsonPathQueryTypeOptions<T, C>,\n ): Omit<\n SetQueryReturnsColumnOrThrow<T, C>,\n keyof T['result']['value']['operators']\n > &\n C['operators'];\n\n // disallow it from `where`\n _opType: never;\n}\n\n// JSON type operators\nexport interface OperatorsJson extends Ord<unknown> {\n jsonPathQueryFirst: JsonPathQuery;\n jsonSupersetOf: Operator<unknown | IsQuery | Expression, BooleanQueryColumn>;\n jsonSubsetOf: Operator<unknown | IsQuery | Expression, BooleanQueryColumn>;\n jsonSet: {\n /**\n * Returns a JSON value/object/array where a given value is set at the given path.\n * The path is a key or an array of keys to access the value.\n *\n * Calls the [jsonb_set](https://www.postgresql.org/docs/current/functions-json.html) Postgres function.\n *\n * It can be used in all contexts on a single JSON value.\n *\n * ```ts\n * await db.table.find(id).update({\n * data: (q) => q.get('data').jsonSet(['path', 'to', 'value'], 'new value'),\n * // supports sql for the value\n * data: (q) => q.get('data').jsonSet(['path', 'to', 'value'], sql`'new value'`),\n * });\n * ```\n *\n * @param path - key or array of keys\n * @param value - value to set\n */\n <T extends PickQueryResult>(\n this: T,\n path: MaybeArray<string | number>,\n value: unknown,\n ): T;\n // disallow it from `where`\n _opType: never;\n };\n jsonReplace: {\n /**\n * The same as {@link jsonSet}, but sets the last argument of `jsonb_set` to false,\n * so this function only has effect when the value already existed in the JSON.\n *\n * ```ts\n * await db.table.find(id).update({\n * // data.path.to.value will be updated only if it already was defined\n * data: (q) => q.get('data').jsonReplace(['path', 'to', 'value'], 'new value'),\n * // supports sql for the value\n * data: (q) =>\n * q.get('data').jsonReplace(['path', 'to', 'value'], sql`'new value'`),\n * });\n * ```\n *\n * @param path - key or array of keys\n * @param value - value to set\n */\n <T extends PickQueryResult>(\n this: T,\n path: MaybeArray<string | number>,\n value: unknown,\n ): T;\n // disallow it from `where`\n _opType: never;\n };\n jsonInsert: {\n /**\n * Inserts a value into a given position of JSON array and returns the whole array.\n * The path is a key or an array of keys to access the value.\n *\n * If a value exists at the given path, the value is not replaced.\n *\n * Provide `{ after: true }` option to insert a value after a given position.\n *\n * Calls the [jsonb_insert](https://www.postgresql.org/docs/current/functions-json.html) Postgres function.\n *\n * It can be used in all contexts on a single JSON value.\n *\n * ```ts\n * // update the record with data { tags: ['two'] } to have data { tags: ['one', 'two'] }\n * await db.table.find(id).update({\n * data: (q) => q.get('data').jsonInsert(['tags', 0], 'one'),\n * // supports sql for the value\n * data: (q) => q.get('data').jsonInsert(['tags', 0], sql`'one'`),\n * });\n *\n * // add 'three' after 'two'\n * await db.table.find(id).update({\n * data: (q) => q.get('data').jsonInsert(['tags', 1], 'three', { after: true }),\n * });\n * ```\n *\n * @param path - key or array of keys\n * @param value - value to insert\n * @param options - can have `after: true`\n */\n <T extends PickQueryResult>(\n this: T,\n path: MaybeArray<string | number>,\n value: unknown,\n options?: { after?: boolean },\n ): T;\n // disallow it from `where`\n _opType: never;\n };\n jsonRemove: {\n /**\n * Remove a value from a JSON object or array at a given path.\n * The path is a key or an array of keys to access the value.\n *\n * Uses the [#-](https://www.postgresql.org/docs/current/functions-json.html) Postgres operator.\n *\n * It can be used in all contexts on a single JSON value.\n *\n * ```ts\n * // the record has data { tags: ['one', 'two'] }\n * // removing the first tag, the data will be { tags: ['two'] }\n * const result = await db.table.find(id).update({\n * data: (q) => q.get('data').jsonRemove(['tags', 0]),\n * });\n * ```\n *\n * @param path - key or array of keys\n */\n <T extends PickQueryResult>(this: T, path: MaybeArray<string | number>): T;\n // disallow it from `where`\n _opType: never;\n };\n}\n\nconst encodeJsonPath = (ctx: ToSQLCtx, path: MaybeArray<string | number>) =>\n addValue(ctx.values, `{${Array.isArray(path) ? path.join(', ') : path}}`);\n\nconst jsonPathQueryOp = (\n key: string,\n [path, options]: [path: string, options?: JsonPathQueryOptions],\n ctx: ToSQLCtx,\n) =>\n `jsonb_path_query_first(${key}, ${addValue(ctx.values, path)}${\n options?.vars\n ? `, ${addValue(ctx.values, JSON.stringify(options.vars))}${\n options.silent ? ', true' : ''\n }`\n : options?.silent\n ? ', NULL, true'\n : ''\n })`;\n\nconst quoteJsonValue = (\n arg: unknown,\n ctx: ToSQLCtx,\n quotedAs: string | undefined,\n IN?: boolean,\n): string => {\n if (arg && typeof arg === 'object') {\n if (IN && Array.isArray(arg)) {\n return `(${arg\n .map((value) => addValue(ctx.values, JSON.stringify(value)) + '::jsonb')\n .join(', ')})`;\n }\n\n if (isExpression(arg)) {\n return 'to_jsonb(' + arg.toSQL(ctx, quotedAs) + ')';\n }\n\n if ('toSQL' in arg) {\n return `to_jsonb((${moveMutativeQueryToCte(ctx, arg as never)}))`;\n }\n }\n\n return addValue(ctx.values, JSON.stringify(arg)) + '::jsonb';\n};\n\nconst serializeJsonValue = (\n arg: unknown,\n ctx: ToSQLCtx,\n quotedAs: string | undefined,\n): string => {\n if (arg && typeof arg === 'object') {\n if (isExpression(arg)) {\n return 'to_jsonb(' + arg.toSQL(ctx, quotedAs) + ')';\n }\n\n if ('toSQL' in arg) {\n return `to_jsonb((${moveMutativeQueryToCte(ctx, arg as never)}))`;\n }\n }\n\n return addValue(ctx.values, JSON.stringify(arg));\n};\n\nconst json = {\n ...ord,\n equals: make((key, value, ctx, quotedAs) =>\n value === null\n ? `nullif(${key}, 'null'::jsonb) IS NULL`\n : `${key} = ${quoteJsonValue(value, ctx, quotedAs)}`,\n ),\n not: make((key, value, ctx, quotedAs) =>\n value === null\n ? `nullif(${key}, 'null'::jsonb) IS NOT NULL`\n : `${key} != ${quoteJsonValue(value, ctx, quotedAs)}`,\n ),\n in: make((key, value, ctx, quotedAs) =>\n Array.isArray(value) && !value.length\n ? 'false'\n : `${key} IN ${quoteJsonValue(value, ctx, quotedAs, true)}`,\n ),\n notIn: make((key, value, ctx, quotedAs) =>\n Array.isArray(value) && !value.length\n ? 'true'\n : `NOT ${key} IN ${quoteJsonValue(value, ctx, quotedAs, true)}`,\n ),\n jsonPathQueryFirst: Object.assign(\n function (\n this: IsQuery,\n path: string,\n options?: JsonPathQueryTypeOptions<\n PickQueryColumTypes,\n Column.Pick.QueryColumn\n >,\n ) {\n const { q, columnTypes } = this as Query;\n const chain = (q.chain ??= []);\n chain.push(jsonPathQueryOp, [path, options]);\n\n if (q.parsers?.[getValueKey]) {\n setObjectValueImmutable(q, 'parsers', getValueKey, undefined);\n }\n\n if (options?.type) {\n const type = options.type(columnTypes);\n addColumnParserToQuery(q, getValueKey, type);\n\n // push the type cast `::type` only if operator is applied\n chain.push = (...args: unknown[]) => {\n chain.push = Array.prototype.push;\n chain.push((s: string) => `${s}::${type.dataType}`, emptyArray);\n return chain.push(...args);\n };\n\n return setQueryOperators(this, type.operators);\n }\n\n return this;\n },\n { _op: jsonPathQueryOp },\n ) as never,\n jsonSupersetOf: make(\n (key, value, ctx, quotedAs) =>\n `${key} @> ${quoteValue(value, ctx, quotedAs)}`,\n ),\n jsonSubsetOf: make(\n (key, value, ctx, quotedAs) =>\n `${key} <@ ${quoteValue(value, ctx, quotedAs)}`,\n ),\n jsonSet: makeVarArg(\n (key, [path, value], ctx, quotedAs) =>\n `jsonb_set(${key}, ${encodeJsonPath(ctx, path)}, ${serializeJsonValue(\n value,\n ctx,\n quotedAs,\n )})`,\n ),\n jsonReplace: makeVarArg(\n (key, [path, value], ctx, quotedAs) =>\n `jsonb_set(${key}, ${encodeJsonPath(ctx, path)}, ${serializeJsonValue(\n value,\n ctx,\n quotedAs,\n )}, false)`,\n ),\n jsonInsert: makeVarArg(\n (key, [path, value, options], ctx, quotedAs) =>\n `jsonb_insert(${key}, ${encodeJsonPath(ctx, path)}, ${serializeJsonValue(\n value,\n ctx,\n quotedAs,\n )}${options?.after ? ', true' : ''})`,\n ),\n jsonRemove: makeVarArg(\n (key, [path], ctx) => `(${key} #- ${encodeJsonPath(ctx, path)})`,\n ),\n} as OperatorsJson;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type OperatorsAny = Base<any>;\nexport type OperatorsDate = Ord<Date | string>;\n\nexport type OperatorsTime = Ord<string>;\n\nexport interface OperatorsArray<T> extends Ord<T[]> {\n has: Operator<T | IsQuery | Expression, BooleanQueryColumn>;\n hasEvery: Operator<T[] | IsQuery | Expression, BooleanQueryColumn>;\n hasSome: Operator<T[] | IsQuery | Expression, BooleanQueryColumn>;\n containedIn: Operator<T[] | IsQuery | Expression, BooleanQueryColumn>;\n length: {\n _opType:\n | number\n | {\n [K in Exclude<\n keyof OperatorsNumber,\n '__hasSelect'\n >]?: OperatorsNumber[K]['_opType'];\n };\n };\n}\n\nconst array = {\n ...ord,\n has: make(\n (key, value, ctx, quotedAs) =>\n `${quoteValue(value, ctx, quotedAs)} = ANY(${key})`,\n ),\n hasEvery: make(\n (key, value, ctx, quotedAs) =>\n `${key} @> ${quoteValue(value, ctx, quotedAs)}`,\n ),\n hasSome: make(\n (key, value, ctx, quotedAs) =>\n `${key} && ${quoteValue(value, ctx, quotedAs)}`,\n ),\n containedIn: make(\n (key, value, ctx, quotedAs) =>\n `${key} <@ ${quoteValue(value, ctx, quotedAs)}`,\n ),\n length: make((key, value, ctx, quotedAs) => {\n const expr = `COALESCE(array_length(${key}, 1), 0)`;\n return typeof value === 'number'\n ? `${expr} = ${quoteValue(value, ctx, quotedAs)}`\n : Object.keys(value)\n .map((key) =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (ord as any)[key]._op(expr, value[key], ctx, quotedAs),\n )\n .join(' AND ');\n }),\n} as OperatorsArray<unknown>;\n\n// `Operators` has operators grouped by types. To be used by column classes.\nexport const Operators: {\n any: OperatorsAny;\n ordinalText: OperatorsOrdinalText;\n boolean: OperatorsBoolean;\n number: OperatorsNumber;\n date: OperatorsDate;\n time: OperatorsTime;\n text: OperatorsText;\n json: OperatorsJson;\n array: OperatorsArray<unknown>;\n} = {\n any: base,\n boolean,\n ordinalText,\n number: ord,\n date: ord,\n time: ord,\n text,\n json,\n array,\n} as never;\n","import { Column } from '../column';\nimport { joinTruthy } from '../../utils';\nimport { TimeInterval } from '../types';\nimport { Code, ColumnToCodeCtx, dateDataToCode } from '../code';\nimport { columnCode } from '../code';\nimport { Operators, OperatorsDate, OperatorsTime } from '../operators';\nimport { DateColumnData } from '../column-data-types';\nimport { ColumnSchemaConfig } from '../column-schema';\n\nexport type DateColumnInput = string | number | Date;\n\n// encode string, number, or Date to a Date object,\nconst dateTimeEncode = (input: DateColumnInput) => {\n return typeof input === 'number' ? new Date(input) : input;\n};\n\n// common class for Date and DateTime columns\nexport abstract class DateBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends Column<\n Schema,\n string,\n ReturnType<Schema['stringNumberDate']>,\n OperatorsDate,\n DateColumnInput,\n string,\n ReturnType<Schema['stringSchema']>\n> {\n declare data: DateColumnData;\n operators = Operators.date;\n asNumber: Schema['dateAsNumber'];\n asDate: Schema['dateAsDate'];\n\n constructor(schema: Schema) {\n super(\n schema,\n schema.stringNumberDate() as never,\n schema.stringSchema() as never,\n schema.stringNumberDate() as never,\n );\n this.asNumber = schema.dateAsNumber;\n this.asDate = schema.dateAsDate;\n this.data.encode = dateTimeEncode;\n }\n}\n\n// date\t4 bytes\tdate (no time of day)\t4713 BC\t5874897 AD 1 day\nexport class DateColumn<\n Schema extends ColumnSchemaConfig,\n> extends DateBaseColumn<Schema> {\n dataType = 'date' as const;\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(\n this,\n ctx,\n key,\n `date()${dateDataToCode(this.data, ctx.migration)}`,\n );\n }\n}\n\nexport abstract class DateTimeBaseClass<\n Schema extends ColumnSchemaConfig,\n> extends DateBaseColumn<Schema> {\n declare data: DateColumnData & { dateTimePrecision?: number };\n\n constructor(schema: Schema, dateTimePrecision?: number) {\n super(schema);\n this.data.dateTimePrecision = dateTimePrecision;\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.dateTimePrecision !== undefined &&\n `(${this.data.dateTimePrecision})`,\n );\n }\n}\n\nexport abstract class DateTimeTzBaseClass<\n Schema extends ColumnSchemaConfig,\n> extends DateTimeBaseClass<Schema> {\n abstract baseDataType: string;\n\n toSQL() {\n return joinTruthy(\n this.baseDataType,\n this.data.dateTimePrecision !== undefined &&\n `(${this.data.dateTimePrecision})`,\n ' with time zone',\n );\n }\n}\n\nconst timestampToCode = (\n self:\n | TimestampColumn<ColumnSchemaConfig>\n | TimestampTZColumn<ColumnSchemaConfig>,\n ctx: ColumnToCodeCtx,\n key: string,\n) => {\n const { dateTimePrecision: p } = self.data;\n\n const { defaultTimestamp } = self.data;\n // migrations should capture the current `nowSQL`, it can be changed by user later.\n if (!ctx.migration && defaultTimestamp) {\n const noTz = self instanceof TimestampColumn ? 'NoTZ' : '';\n\n const def = self.data.default;\n const modifyQuery = self.data.modifyQuery;\n self.data.default = undefined;\n self.data.modifyQuery = undefined;\n\n const code = columnCode(\n self,\n ctx,\n key,\n `timestamps${noTz}(${\n p && p !== 6 ? p : ''\n }).${defaultTimestamp}${dateDataToCode(self.data, ctx.migration)}`,\n );\n\n self.data.default = def;\n self.data.modifyQuery = modifyQuery;\n\n return code;\n } else {\n return columnCode(\n self,\n ctx,\n key,\n `${self instanceof TimestampColumn ? 'timestampNoTZ' : 'timestamp'}(${\n p && p !== 6 ? p : ''\n })${dateDataToCode(self.data, ctx.migration)}`,\n );\n }\n};\n\n// timestamp [ (p) ] [ without time zone ]\t8 bytes\tboth date and time (no time zone)\t4713 BC\t294276 AD\t1 microsecond\nexport class TimestampColumn<\n Schema extends ColumnSchemaConfig,\n> extends DateTimeBaseClass<Schema> {\n dataType = 'timestamp' as const;\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return timestampToCode(this, ctx, key);\n }\n}\n\n// timestamp [ (p) ] with time zone\t8 bytes\tboth date and time, with time zone\t4713 BC\t294276 AD\t1 microsecond\nexport class TimestampTZColumn<\n Schema extends ColumnSchemaConfig,\n> extends DateTimeTzBaseClass<Schema> {\n dataType = 'timestamptz' as const;\n baseDataType = 'timestamp' as const;\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return timestampToCode(this, ctx, key);\n }\n}\n\n// time [ (p) ] [ without time zone ]\t8 bytes\ttime of day (no date)\t00:00:00\t24:00:00\t1 microsecond\nexport class TimeColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsTime\n> {\n declare data: DateColumnData & { dateTimePrecision?: number };\n dataType = 'time' as const;\n operators = Operators.time;\n\n constructor(schema: Schema, dateTimePrecision?: number) {\n super(schema, schema.stringSchema() as never);\n this.data.dateTimePrecision = dateTimePrecision;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const { dateTimePrecision } = this.data;\n return columnCode(\n this,\n ctx,\n key,\n `time(${dateTimePrecision || ''})${dateDataToCode(\n this.data,\n ctx.migration,\n )}`,\n );\n }\n}\n\n// interval [ fields ] [ (p) ]\t16 bytes\ttime interval\t-178000000 years\t178000000 years\t1 microsecond\nexport class IntervalColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n TimeInterval,\n ReturnType<Schema['timeInterval']>,\n OperatorsDate\n> {\n declare data: Column.Data & { fields?: string; precision?: number };\n dataType = 'interval' as const;\n operators = Operators.date;\n\n constructor(schema: Schema, fields?: string, precision?: number) {\n super(schema, schema.timeInterval() as never);\n this.data.fields = fields;\n this.data.precision = precision;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const { fields, precision } = this.data;\n return columnCode(\n this,\n ctx,\n key,\n `interval(${[fields && `'${fields}'`, precision && String(precision)]\n .filter((part) => part)\n .join(', ')})`,\n );\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.fields && ` ${this.data.fields}`,\n this.data.precision !== undefined && ` (${this.data.precision})`,\n );\n }\n}\n","import { Column } from '../column';\nimport {\n addCode,\n Code,\n arrayDataToCode,\n Codes,\n ColumnToCodeCtx,\n} from '../code';\nimport { columnCode } from '../code';\nimport { Operators, OperatorsArray } from '../operators';\nimport { setColumnDefaultParse } from '../column.utils';\nimport { ArrayMethodsData } from '../column-data-types';\nimport { ColumnSchemaConfig, ColumnTypeSchemaArg } from '../column-schema';\n\nexport interface ArrayColumnValue {\n type: unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputSchema: any;\n inputType: unknown;\n outputType: unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n outputSchema: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n queryType: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n querySchema: any;\n toSQL(): string;\n toCode(ctx: ColumnToCodeCtx, key: string): Code;\n data: Column.Data;\n}\n\nexport interface ArrayData<Item extends ArrayColumnValue>\n extends Column.Data,\n ArrayMethodsData {\n item: Item;\n arrayDims: number;\n}\n\nexport class ArrayColumn<\n Schema extends ColumnTypeSchemaArg,\n Item extends ArrayColumnValue,\n InputType,\n OutputType,\n QueryType,\n> extends Column<\n Schema,\n Item['type'][],\n InputType,\n OperatorsArray<Item['queryType']>,\n Item['inputType'][],\n Item['outputType'][],\n OutputType,\n Item['queryType'][],\n QueryType\n> {\n dataType = 'array' as const;\n operators = Operators.array as OperatorsArray<Item['queryType']>;\n declare data: ArrayData<Item>;\n\n constructor(\n schema: Schema,\n item: Item,\n inputType: InputType,\n outputType?: OutputType,\n queryType?: QueryType,\n ) {\n super(schema, inputType, outputType, queryType);\n\n // array items cannot be non-nullable, postgres limitation\n item.data.isNullable = true;\n\n setColumnDefaultParse(this, (input) => parse.call(this as never, input));\n\n this.data.item = item instanceof ArrayColumn ? item.data.item : item;\n this.data.name = item.data.name;\n this.data.arrayDims =\n item instanceof ArrayColumn ? item.data.arrayDims + 1 : 1;\n }\n\n toSQL(): string {\n return this.data.item.toSQL() + '[]'.repeat(this.data.arrayDims);\n }\n\n toCode(\n this: ArrayColumn<\n ColumnSchemaConfig,\n ArrayColumnValue,\n unknown,\n unknown,\n unknown\n >,\n ctx: ColumnToCodeCtx,\n key: string,\n ): Code {\n let open = 'array(';\n let close = ')';\n for (let i = 1; i < this.data.arrayDims; i++) {\n open += `${ctx.t}.array(`;\n close += ')';\n }\n\n const code: Codes = [open];\n\n const { item } = this.data;\n const { isNullable } = item.data;\n delete item.data.isNullable;\n addCode(code, item.toCode(ctx, key));\n item.data.isNullable = isNullable;\n\n addCode(code, `${close}${arrayDataToCode(this.data, ctx.migration)}`);\n return columnCode(this, ctx, key, code);\n }\n}\n\nconst parse = function (\n this: ArrayColumn<\n ColumnTypeSchemaArg,\n ArrayColumnValue,\n unknown,\n unknown,\n unknown\n >,\n source: string | unknown[],\n) {\n // in the case it was selected via json agg from a sub-select\n if (typeof source !== 'string') return source;\n\n const entries: unknown[] = [];\n parsePostgresArray(source, entries, this.data.item.data.parseItem);\n return entries;\n};\n\n/**\n * based on https://github.com/bendrucker/postgres-array/tree/master\n * and slightly optimized\n */\nconst parsePostgresArray = (\n source: string,\n entries: unknown[],\n transform?: (input: string) => unknown,\n): number => {\n let pos = 0;\n\n if (source[0] === '[') {\n pos = source.indexOf('=') + 1;\n if (!pos) pos = source.length;\n }\n\n if (source[pos] === '{') pos++;\n\n let recorded = '';\n while (pos < source.length) {\n const character = source[pos++];\n\n if (character === '{') {\n const innerEntries: unknown[] = [];\n entries.push(innerEntries);\n pos +=\n parsePostgresArray(source.slice(pos - 1), innerEntries, transform) - 1;\n } else if (character === '}') {\n if (recorded) {\n entries.push(\n recorded === 'NULL'\n ? null\n : transform\n ? transform(recorded)\n : recorded,\n );\n }\n\n return pos;\n } else if (character === '\"') {\n let esc = false;\n let rec = '';\n while (pos < source.length) {\n let char: string;\n while ((char = source[pos++]) === '\\\\') {\n if (!(esc = !esc)) rec += '\\\\';\n }\n\n if (esc) {\n esc = false;\n } else if (char === '\"') {\n break;\n }\n\n rec += char;\n }\n\n entries.push(transform ? transform(rec) : rec);\n recorded = '';\n } else if (character === ',') {\n if (recorded) {\n entries.push(\n recorded === 'NULL'\n ? null\n : transform\n ? transform(recorded)\n : recorded,\n );\n\n recorded = '';\n }\n } else {\n recorded += character;\n }\n }\n\n return pos;\n};\n","import { Column } from '../column';\nimport { columnCode, ColumnToCodeCtx } from '../code';\nimport { Operators, OperatorsJson, OperatorsText } from '../operators';\nimport { Code } from '../code';\nimport {\n defaultSchemaConfig,\n DefaultSchemaConfig,\n} from '../default-schema-config';\nimport { ColumnSchemaConfig, ColumnTypeSchemaArg } from '../column-schema';\n\nconst encode = (x: unknown) => (x === null ? x : JSON.stringify(x));\n\n// Type of JSON column (jsonb).\nexport class JSONColumn<\n T,\n Schema extends ColumnTypeSchemaArg,\n InputSchema = Schema['type'],\n> extends Column<Schema, T, InputSchema, OperatorsJson> {\n dataType = 'jsonb' as const;\n operators = Operators.json;\n\n constructor(schema: Schema, inputType: Schema['type']) {\n super(schema, inputType as InputSchema);\n this.data.encode = encode;\n this.data.parseItem = JSON.parse;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `json()`);\n }\n}\n\n// JSON non-binary type, stored as a text in the database, so it doesn't have rich functionality.\nexport class JSONTextColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'json' as const;\n operators = Operators.text;\n\n private static _instance: JSONTextColumn<DefaultSchemaConfig> | undefined;\n static get instance() {\n return (this._instance ??= new JSONTextColumn(defaultSchemaConfig));\n }\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `jsonText()`);\n }\n}\n","import { Column, setColumnData } from '../column';\nimport {\n Code,\n numberDataToCode,\n addCode,\n Codes,\n ColumnToCodeCtx,\n} from '../code';\nimport { columnCode, identityToCode } from '../code';\nimport { Operators, OperatorsNumber } from '../operators';\nimport { TableData } from '../../tableData';\nimport { BaseNumberData } from '../column-data-types';\nimport { ColumnSchemaConfig } from '../column-schema';\nimport { joinTruthy } from '../../utils';\nimport { Expression } from '../../query/expressions/expression';\n\nexport interface NumberColumnData extends BaseNumberData, Column.Data {\n identity?: TableData.Identity;\n}\n\nexport interface SerialColumnData extends NumberColumnData {\n default: Expression;\n}\n\nexport abstract class NumberBaseColumn<\n Schema extends ColumnSchemaConfig,\n SchemaType extends Schema['type'],\n> extends Column<Schema, number, SchemaType, OperatorsNumber> {\n declare data: NumberColumnData;\n operators = Operators.number;\n}\n\nexport abstract class IntegerBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberBaseColumn<Schema, ReturnType<Schema['int']>> {\n declare data: NumberColumnData;\n constructor(schema: Schema) {\n super(schema, schema.int() as never);\n this.data.int = true;\n }\n}\n\nexport abstract class NumberAsStringBaseColumn<\n Schema extends ColumnSchemaConfig,\n InputType = string | number,\n> extends Column<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsNumber,\n InputType\n> {\n operators = Operators.number;\n declare data: Column.Data;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n this.data.jsonCast = 'text';\n }\n}\n\nexport interface DecimalColumnData extends Column.Data {\n numericPrecision?: number;\n numericScale?: number;\n}\n\n// exact numeric of selectable precision\nexport class DecimalColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberAsStringBaseColumn<Schema> {\n declare data: DecimalColumnData;\n operators = Operators.number;\n dataType = 'numeric' as const;\n\n constructor(\n schema: Schema,\n numericPrecision?: number,\n numericScale?: number,\n ) {\n super(schema);\n this.data.numericPrecision = numericPrecision;\n this.data.numericScale = numericScale;\n this.data.alias = 'decimal';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const { numericPrecision, numericScale } = this.data;\n return columnCode(\n this,\n ctx,\n key,\n `decimal(${numericPrecision || ''}${\n numericScale ? `, ${numericScale}` : ''\n })`,\n );\n }\n\n toSQL() {\n const { numericPrecision, numericScale } = this.data;\n\n return joinTruthy(\n this.dataType,\n numericPrecision\n ? numericScale\n ? `(${numericPrecision}, ${numericScale})`\n : `(${numericPrecision})`\n : undefined,\n );\n }\n}\n\nconst skipNumberMethods = { int: true } as const;\n\nconst intToCode = (\n column: Column,\n ctx: ColumnToCodeCtx,\n key: string,\n alias: string,\n): Code => {\n let code: Codes;\n\n if (column.data.identity) {\n code = identityToCode(column.data.identity, alias);\n } else {\n code = [`${alias}()`];\n }\n\n addCode(\n code,\n numberDataToCode(column.data, ctx.migration, skipNumberMethods),\n );\n\n return columnCode(column, ctx, key, code);\n};\n\nexport type IdentityColumn<T extends Column.Pick.Data> =\n Column.Modifiers.Default<T, Expression>;\n\n// signed two-byte integer\nexport class SmallIntColumn<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int2' as const;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'smallint';\n this.data.parseItem = parseInt;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return intToCode(this, ctx, key, 'smallint');\n }\n\n identity<T extends Column>(\n this: T,\n options: TableData.Identity = {},\n ): IdentityColumn<T> {\n return setColumnData(this, 'identity', options) as IdentityColumn<T>;\n }\n}\n\n// signed four-byte integer\nexport class IntegerColumn<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int4' as const;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'integer';\n this.data.parseItem = parseInt;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return intToCode(this, ctx, key, 'integer');\n }\n\n identity<T extends Column>(\n this: T,\n options: TableData.Identity = {},\n ): IdentityColumn<T> {\n return setColumnData(this, 'identity', options) as IdentityColumn<T>;\n }\n}\n\n// signed eight-byte integer\nexport class BigIntColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberAsStringBaseColumn<Schema, string | number | bigint> {\n dataType = 'int8' as const;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'bigint';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return intToCode(this, ctx, key, 'bigint');\n }\n\n identity<T extends Column>(\n this: T,\n options: TableData.Identity = {},\n ): IdentityColumn<T> {\n return setColumnData(this, 'identity', options) as IdentityColumn<T>;\n }\n}\n\n// single precision floating-point number (4 bytes)\nexport class RealColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberBaseColumn<Schema, ReturnType<Schema['number']>> {\n dataType = 'float4' as const;\n\n constructor(schema: Schema) {\n super(schema, schema.number() as never);\n this.data.alias = 'real';\n this.data.parseItem = parseFloat;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(\n this,\n ctx,\n key,\n `real()${numberDataToCode(this.data, ctx.migration)}`,\n );\n }\n}\n\n// double precision floating-point number (8 bytes)\nexport class DoublePrecisionColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberAsStringBaseColumn<Schema> {\n dataType = 'float8' as const;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'doublePrecision';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `doublePrecision()`);\n }\n}\n\n// autoincrementing two-byte integer\nexport class SmallSerialColumn<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int2' as const;\n declare data: SerialColumnData;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.int = true;\n this.data.alias = 'smallSerial';\n this.data.parseItem = parseInt;\n }\n\n toSQL() {\n return 'smallserial';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(\n this,\n ctx,\n key,\n `smallSerial()${numberDataToCode(\n this.data,\n ctx.migration,\n skipNumberMethods,\n )}`,\n );\n }\n}\n\n// autoincrementing four-byte integer\nexport class SerialColumn<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int4' as const;\n declare data: SerialColumnData;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.int = true;\n this.data.alias = 'serial';\n this.data.parseItem = parseInt;\n }\n\n toSQL() {\n return 'serial';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(\n this,\n ctx,\n key,\n `serial()${numberDataToCode(\n this.data,\n ctx.migration,\n skipNumberMethods,\n )}`,\n );\n }\n}\n\n// autoincrementing eight-byte integer\nexport class BigSerialColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberAsStringBaseColumn<Schema> {\n dataType = 'int8' as const;\n declare data: SerialColumnData;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'bigint';\n }\n\n toSQL() {\n return 'bigserial';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `bigSerial()`);\n }\n}\n","import {\n DateColumn,\n TimestampColumn,\n TimestampTZColumn,\n} from './column-types/date-time';\nimport { EnumColumn } from './column-types/enum';\nimport { ArrayColumn, ArrayColumnValue } from './column-types/array';\nimport { JSONColumn } from './column-types/json';\nimport {\n BigIntColumn,\n BigSerialColumn,\n DecimalColumn,\n DoublePrecisionColumn,\n IntegerColumn,\n RealColumn,\n SerialColumn,\n SmallIntColumn,\n SmallSerialColumn,\n} from './column-types/number';\nimport {\n CitextColumn,\n MoneyColumn,\n StringColumn,\n TextColumn,\n VarCharColumn,\n} from './column-types/string';\nimport { Column, setColumnData } from './column';\nimport { setColumnParse, setColumnParseNull } from './column.utils';\nimport { ColumnSchemaConfig } from './column-schema';\nimport { MaybeArray, noop } from '../utils';\n\nexport interface DefaultSchemaConfig extends ColumnSchemaConfig<Column> {\n parse<T extends Column.Pick.ForParse, Output>(\n this: T,\n fn: (input: T['type']) => Output,\n ): Column.Modifiers.Parse<T, unknown, Output>;\n\n parseNull<T extends Column.Pick.ForParseNull, Output>(\n this: T,\n fn: () => Output,\n ): Column.Modifiers.ParseNull<T, unknown, Output>;\n\n encode<T extends { type: unknown }, Input>(\n this: T,\n fn: (input: Input) => unknown,\n ): Column.Modifiers.Encode<T, unknown, Input>;\n\n /**\n * @deprecated use narrowType instead\n */\n asType<\n T,\n Types extends {\n type: unknown;\n inputType: unknown;\n outputType: unknown;\n queryType: unknown;\n },\n >(\n this: T,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _fn: (\n type: <Type, Input = Type, Output = Type, Query = Type>() => {\n type: Type;\n inputType: Input;\n outputType: Output;\n queryType: Query;\n },\n ) => Types,\n ): { [K in keyof T]: K extends keyof Types ? Types[K] : T[K] };\n\n narrowType<\n T extends Column.InputOutputQueryTypes,\n Types extends Column.InputOutputQueryTypes,\n >(\n this: T,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _fn: (\n type: <\n Type extends T['inputType'] extends T['outputType'] & T['queryType']\n ? T['outputType'] & T['queryType'] // generated column case\n : T['inputType'] & T['outputType'] & T['queryType'],\n >() => {\n inputType: T['inputType'] extends never ? never : Type;\n outputType: Type;\n queryType: Type;\n },\n ) => Types,\n ): { [K in keyof T]: K extends keyof Types ? Types[K] : T[K] };\n\n narrowAllTypes<\n T extends Column.InputOutputQueryTypes,\n Types extends Column.InputOutputQueryTypes,\n >(\n this: T,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _fn: (\n type: <\n Types extends {\n input?: T['inputType'];\n output?: T['outputType'];\n query?: T['queryType'];\n },\n >() => {\n inputType: undefined extends Types['input']\n ? T['inputType']\n : Types['input'];\n outputType: undefined extends Types['output']\n ? T['outputType']\n : Types['output'];\n queryType: undefined extends Types['query']\n ? T['queryType']\n : Types['query'];\n },\n ) => Types,\n ): { [K in keyof T]: K extends keyof Types ? Types[K] : T[K] };\n\n dateAsNumber<T extends Column>(\n this: T,\n ): Column.Modifiers.Parse<T, unknown, number>;\n dateAsDate<T extends Column>(\n this: T,\n ): Column.Modifiers.Parse<T, unknown, Date>;\n\n enum<const T extends readonly [string, ...string[]]>(\n dataType: string,\n type: T,\n ): EnumColumn<DefaultSchemaConfig, unknown, T>;\n\n array<Item extends ArrayColumnValue>(\n item: Item,\n ): ArrayColumn<DefaultSchemaConfig, Item, unknown, unknown, unknown>;\n\n json<T>(): JSONColumn<\n // (#286) the default type shouldn't conform to a function,\n // because otherwise `update` can't differentiate between a function and non-function value\n unknown extends T ? MaybeArray<string | number | boolean | object> : T,\n DefaultSchemaConfig\n >;\n\n inputSchema(): undefined;\n outputSchema(): undefined;\n querySchema(): undefined;\n updateSchema(): undefined;\n pkeySchema(): undefined;\n\n smallint(): SmallIntColumn<DefaultSchemaConfig>;\n integer(): IntegerColumn<DefaultSchemaConfig>;\n real(): RealColumn<DefaultSchemaConfig>;\n smallSerial(): SmallSerialColumn<DefaultSchemaConfig>;\n serial(): SerialColumn<DefaultSchemaConfig>;\n\n bigint(): BigIntColumn<DefaultSchemaConfig>;\n decimal(\n precision?: number,\n scale?: number,\n ): DecimalColumn<DefaultSchemaConfig>;\n doublePrecision(): DoublePrecisionColumn<DefaultSchemaConfig>;\n bigSerial(): BigSerialColumn<DefaultSchemaConfig>;\n money(): MoneyColumn<DefaultSchemaConfig>;\n varchar(limit?: number): VarCharColumn<DefaultSchemaConfig>;\n text(): TextColumn<DefaultSchemaConfig>;\n string(limit?: number): StringColumn<DefaultSchemaConfig>;\n citext(): CitextColumn<DefaultSchemaConfig>;\n\n date(): DateColumn<DefaultSchemaConfig>;\n timestampNoTZ(precision?: number): TimestampColumn<DefaultSchemaConfig>;\n timestamp(precision?: number): TimestampTZColumn<DefaultSchemaConfig>;\n}\n\n// parse a date string to date object, with respect to null\nconst parseDateToDate = (value: unknown): Date => new Date(value as string);\n\nexport const defaultSchemaConfig = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parse(fn: (input: any) => unknown) {\n return setColumnParse(this as never, fn);\n },\n parseNull(fn: () => unknown) {\n return setColumnParseNull(this as never, fn);\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n encode(fn: (input: any) => unknown) {\n return setColumnData(this as Column.Pick.Data, 'encode', fn);\n },\n asType() {\n return this as never;\n },\n narrowType() {\n return this as never;\n },\n narrowAllTypes() {\n return this as never;\n },\n dateAsNumber(this: { data: Column.Data; parse(fn: unknown): unknown }) {\n return this.parse(Date.parse) as never;\n },\n dateAsDate(this: { data: Column.Data; parse(fn: unknown): unknown }) {\n return this.parse(parseDateToDate) as never;\n },\n enum<const T extends readonly [string, ...string[]]>(\n dataType: string,\n type: T,\n ) {\n return new EnumColumn(defaultSchemaConfig, dataType, type, undefined);\n },\n array<Item extends ArrayColumnValue>(item: Item) {\n return new ArrayColumn(defaultSchemaConfig, item, undefined);\n },\n boolean: noop,\n buffer: noop,\n unknown: noop,\n never: noop,\n stringSchema: noop,\n stringMin: noop,\n stringMax: noop,\n stringMinMax: noop,\n number: noop,\n int: noop,\n stringNumberDate: noop,\n timeInterval: noop,\n bit: noop,\n uuid: noop,\n nullable(this: Column.Pick.ForNullable) {\n return setColumnData(this, 'isNullable', true);\n },\n json() {\n return new JSONColumn(defaultSchemaConfig, undefined);\n },\n setErrors: noop,\n\n smallint: () => new SmallIntColumn(defaultSchemaConfig),\n integer: () => new IntegerColumn(defaultSchemaConfig),\n real: () => new RealColumn(defaultSchemaConfig),\n smallSerial: () => new SmallSerialColumn(defaultSchemaConfig),\n serial: () => new SerialColumn(defaultSchemaConfig),\n\n bigint: () => new BigIntColumn(defaultSchemaConfig),\n decimal: (precision?: number, scale?: number) =>\n new DecimalColumn(defaultSchemaConfig, precision, scale),\n doublePrecision: () => new DoublePrecisionColumn(defaultSchemaConfig),\n bigSerial: () => new BigSerialColumn(defaultSchemaConfig),\n money: () => new MoneyColumn(defaultSchemaConfig),\n varchar: (limit: number) => new VarCharColumn(defaultSchemaConfig, limit),\n text: () => new TextColumn(defaultSchemaConfig),\n string: (limit?: number) => new StringColumn(defaultSchemaConfig, limit),\n citext: () => new CitextColumn(defaultSchemaConfig),\n\n date: () => new DateColumn(defaultSchemaConfig),\n timestampNoTZ: (precision?: number) =>\n new TimestampColumn(defaultSchemaConfig, precision),\n timestamp: (precision?: number) =>\n new TimestampTZColumn(defaultSchemaConfig, precision),\n\n geographyPointSchema: noop,\n} as unknown as DefaultSchemaConfig;\n","import { Column, getDefaultLanguage, setColumnData } from '../column';\nimport { NumberColumnData } from './number';\nimport { Code, ColumnToCodeCtx, stringDataToCode } from '../code';\nimport { columnCode } from '../code';\nimport { RawSql, RawSqlBase } from '../../query/expressions/raw-sql';\nimport {\n Operators,\n OperatorsNumber,\n OperatorsOrdinalText,\n OperatorsText,\n} from '../operators';\nimport { setColumnDefaultParse } from '../column.utils';\nimport {\n defaultSchemaConfig,\n DefaultSchemaConfig,\n} from '../default-schema-config';\nimport { StringData } from '../column-data-types';\nimport { ColumnSchemaConfig } from '../column-schema';\nimport {\n joinTruthy,\n quoteObjectKey,\n RecordString,\n toSnakeCase,\n} from '../../utils';\nimport { StaticSQLArgs } from '../../query/expressions/expression';\nimport { SearchWeightRecord } from '../../query';\n\nexport type TextColumnData = StringData;\n\nexport abstract class TextBaseColumn<\n Schema extends ColumnSchemaConfig,\n Ops = OperatorsText,\n> extends Column<Schema, string, ReturnType<Schema['stringSchema']>, Ops> {\n declare data: TextColumnData;\n operators = Operators.text as Ops;\n\n constructor(\n schema: Schema,\n schemaType: ReturnType<\n Schema['stringSchema']\n > = schema.stringSchema() as never,\n ) {\n super(schema, schemaType);\n }\n}\n\nexport abstract class LimitedTextBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends TextBaseColumn<Schema, OperatorsOrdinalText> {\n declare data: TextColumnData & { maxChars?: number };\n operators = Operators.ordinalText;\n\n constructor(schema: Schema, limit?: number) {\n super(\n schema,\n (limit !== undefined\n ? schema.stringMax(limit)\n : schema.stringSchema()) as never,\n );\n this.data.maxChars = limit;\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.maxChars !== undefined && `(${this.data.maxChars})`,\n );\n }\n}\n\n// character varying(n), varchar(n) variable-length with limit\nexport class VarCharColumn<\n Schema extends ColumnSchemaConfig,\n> extends LimitedTextBaseColumn<Schema> {\n dataType = 'varchar' as const;\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const { maxChars } = this.data;\n return columnCode(\n this,\n ctx,\n key,\n `varchar(${maxChars ?? ''})${stringDataToCode(this.data, ctx.migration)}`,\n );\n }\n}\n\nexport class StringColumn<\n Schema extends ColumnSchemaConfig,\n> extends VarCharColumn<Schema> {\n constructor(schema: Schema, limit = 255) {\n super(schema, limit);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n let max: number | undefined = this.data.maxChars;\n if (max === 255) max = undefined;\n return columnCode(\n this,\n ctx,\n key,\n `string(${max ?? ''})${stringDataToCode(this.data, ctx.migration)}`,\n );\n }\n}\n\nconst textColumnToCode = (\n column: TextBaseColumn<ColumnSchemaConfig> & {\n data: TextColumnData & { minArg?: number; maxArg?: number };\n },\n ctx: ColumnToCodeCtx,\n key: string,\n) => {\n const data = { ...column.data };\n let args = '';\n const hasMax = data.maxArg !== undefined && data.max === data.maxArg;\n if ((data.minArg !== undefined && data.min === data.minArg) || hasMax) {\n if (data.minArg !== 0 || (hasMax && data.max !== Infinity)) {\n args += data.minArg;\n }\n delete data.min;\n if (hasMax) {\n if (data.maxArg !== Infinity) {\n args += `, ${data.maxArg}`;\n }\n delete data.max;\n }\n }\n return columnCode(\n column,\n ctx,\n key,\n `${column.dataType}(${args})${stringDataToCode(data, ctx.migration)}`,\n );\n};\n\n// text\tvariable unlimited length\nexport class TextColumn<\n Schema extends ColumnSchemaConfig,\n> extends TextBaseColumn<Schema, OperatorsOrdinalText> {\n dataType = 'text' as const;\n declare data: TextColumnData & { minArg?: number; maxArg?: number };\n operators = Operators.ordinalText;\n\n private static _instance: TextColumn<DefaultSchemaConfig> | undefined;\n static get instance() {\n return (this._instance ??= new TextColumn(defaultSchemaConfig));\n }\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return textColumnToCode(this, ctx, key);\n }\n}\n\nconst byteaParse = (val: unknown) =>\n typeof val === 'string' ? Buffer.from(val.slice(2), 'hex') : val;\n\n// To store binary strings\nexport class ByteaColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['buffer']>,\n OperatorsOrdinalText,\n Buffer,\n Buffer,\n ReturnType<Schema['buffer']>,\n string,\n ReturnType<Schema['stringSchema']>\n> {\n dataType = 'bytea' as const;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.buffer() as never);\n setColumnDefaultParse(this, byteaParse);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `bytea()`);\n }\n}\n\n// point\t16 bytes\tPoint on a plane\t(x,y)\nexport class PointColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'point' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `point()`);\n }\n}\n\n// line\t32 bytes\tInfinite line\t{A,B,C}\nexport class LineColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'line' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `line()`);\n }\n}\n\n// lseg\t32 bytes\tFinite line segment\t((x1,y1),(x2,y2))\nexport class LsegColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'lseg' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `lseg()`);\n }\n}\n\n// box\t32 bytes\tRectangular box\t((x1,y1),(x2,y2))\nexport class BoxColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'box' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `box()`);\n }\n}\n\n// path\t16+16n bytes\tClosed path (similar to polygon)\t((x1,y1),...)\n// path\t16+16n bytes\tOpen path\t[(x1,y1),...]\nexport class PathColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'path' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `path()`);\n }\n}\n\n// polygon\t40+16n bytes\tPolygon (similar to closed path)\t((x1,y1),...)\nexport class PolygonColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'polygon' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `polygon()`);\n }\n}\n\n// circle\t24 bytes\tCircle\t<(x,y),r> (center point and radius)\nexport class CircleColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'circle' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `circle()`);\n }\n}\n\nexport class MoneyColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['number']>,\n OperatorsNumber,\n string | number,\n number,\n ReturnType<Schema['number']>,\n string | number\n> {\n dataType = 'money' as const;\n declare data: NumberColumnData;\n operators = Operators.number;\n\n constructor(schema: Schema) {\n super(schema, schema.number() as never);\n setColumnDefaultParse(this, moneyParse);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `money()`);\n }\n}\n\nconst moneyParse = Object.assign(\n function (input: unknown) {\n return input === null\n ? input\n : parseFloat((input as string).replace(/,/g, '').replace(/\\$/g, ''));\n },\n {\n hideFromCode: true,\n },\n);\n\n// cidr\t7 or 19 bytes\tIPv4 and IPv6 networks\nexport class CidrColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'cidr' as const;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `cidr()`);\n }\n}\n\n// inet\t7 or 19 bytes\tIPv4 and IPv6 hosts and networks\nexport class InetColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsOrdinalText\n> {\n dataType = 'inet' as const;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `inet()`);\n }\n}\n\n// macaddr\t6 bytes\tMAC addresses\nexport class MacAddrColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsOrdinalText\n> {\n dataType = 'macaddr' as const;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `macaddr()`);\n }\n}\n\n// macaddr8\t8 bytes\tMAC addresses (EUI-64 format)\nexport class MacAddr8Column<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsOrdinalText\n> {\n dataType = 'macaddr8' as const;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `macaddr8()`);\n }\n}\n\n// Bit strings are strings of 1's and 0's.\n// They can be used to store or visualize bit masks.\n// There are two SQL bit types: bit(n) and bit varying(n), where n is a positive integer.\nexport class BitColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['bit']>,\n OperatorsOrdinalText\n> {\n dataType = 'bit' as const;\n operators = Operators.ordinalText;\n declare data: Column.Data & { length: number };\n\n constructor(schema: Schema, length: number) {\n super(schema, schema.bit(length) as ReturnType<Schema['bit']>);\n this.data.length = length;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const { length } = this.data;\n return columnCode(this, ctx, key, `bit(${length})`);\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.length !== undefined && `(${this.data.length})`,\n );\n }\n}\n\nexport class BitVaryingColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['bit']>,\n OperatorsOrdinalText\n> {\n dataType = 'varbit' as const;\n operators = Operators.ordinalText;\n declare data: Column.Data & { length?: number };\n\n constructor(schema: Schema, length?: number) {\n super(schema, schema.bit(length) as ReturnType<Schema['bit']>);\n this.data.length = length;\n this.data.alias = 'bitVarying';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const { length } = this.data;\n return columnCode(this, ctx, key, `bitVarying(${length ?? ''})`);\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.length !== undefined && `(${this.data.length})`,\n );\n }\n}\n\ntype TsVectorGeneratedColumns = string[] | SearchWeightRecord;\n\n// A tsvector value is a sorted list of distinct lexemes\nexport class TsVectorColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsOrdinalText\n> {\n dataType = 'tsvector' as const;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema, public defaultLanguage = getDefaultLanguage()) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `tsvector()`);\n }\n\n /**\n * For `tsvector` column type, it can also accept language (optional) and columns:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('post', (t) => ({\n * id: t.id(),\n * title: t.text(),\n * body: t.text(),\n * // join title and body into a single ts_vector\n * generatedTsVector: t.tsvector().generated(['title', 'body']).searchIndex(),\n * // with language:\n * spanishTsVector: t\n * .tsvector()\n * .generated('spanish', ['title', 'body'])\n * .searchIndex(),\n * }));\n * });\n * ```\n *\n * @param args\n */\n generated<T extends Column.Pick.Data>(\n this: T,\n ...args:\n | StaticSQLArgs\n | [language: string, columns: TsVectorGeneratedColumns]\n | [columns: TsVectorGeneratedColumns]\n ): Column.Modifiers.Generated<T> {\n const arg = args[0];\n // early return on StaticSQLArgs case\n if (typeof arg === 'object' && 'raw' in arg) {\n return super.generated(...(args as StaticSQLArgs)) as never;\n }\n\n const toSQL: Column.Data.Generated['toSQL'] = (ctx) => {\n const first = args[0];\n const target = typeof first === 'string' ? (args[1] as string[]) : first;\n\n const language =\n typeof first === 'string'\n ? first\n : (this as unknown as TsVectorColumn<ColumnSchemaConfig>)\n .defaultLanguage;\n\n const { snakeCase } = ctx;\n\n let sql;\n if (Array.isArray(target)) {\n const columns =\n target.length === 1\n ? `\"${snakeCase ? toSnakeCase(target[0]) : target[0]}\"`\n : target\n .map(\n (column) =>\n `coalesce(\"${\n snakeCase ? toSnakeCase(column) : column\n }\", '')`,\n )\n .join(` || ' ' || `);\n\n sql = `to_tsvector('${language}', ${columns})`;\n } else {\n for (const key in target) {\n sql =\n (sql ? sql + ' || ' : '(') +\n `setweight(to_tsvector('${language}', coalesce(\"${\n snakeCase ? toSnakeCase(key) : key\n }\", '')), '${(target as RecordString)[key]}')`;\n }\n if (sql) {\n sql += ')';\n } else {\n throw new Error('Empty target in the text search generated column');\n }\n }\n\n return sql;\n };\n\n const toCode = (): string => {\n let code = '.generated(';\n\n const first = args[0];\n let target;\n if (typeof first === 'string') {\n code += `'${first}', `;\n target = args[1] as string[];\n } else {\n target = args[0];\n }\n\n if (Array.isArray(target)) {\n code += `[${target.map((x) => `'${x}'`).join(', ')}]`;\n } else {\n const pairs: string[] = [];\n for (const key in target as RecordString) {\n pairs.push(\n `${quoteObjectKey(key, false)}: '${(target as RecordString)[key]}'`,\n );\n }\n code += `{ ${pairs.join(', ')} }`;\n }\n\n return code + ')';\n };\n\n const column = setColumnData(this, 'generated', {\n toSQL,\n toCode,\n });\n column.data.readOnly = true;\n return column as never;\n }\n}\n\n// A tsquery value stores lexemes that are to be searched for\nexport class TsQueryColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsOrdinalText\n> {\n dataType = 'tsquery' as const;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `tsquery()`);\n }\n}\n\nconst uuidDefaultSQL = 'gen_random_uuid()';\nconst uuidDefault = new RawSql(uuidDefaultSQL);\n\n// uuid stores Universally Unique Identifiers (UUID)\nexport class UUIDColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['uuid']>,\n OperatorsOrdinalText\n> {\n dataType = 'uuid' as const;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.uuid() as never);\n this.data.defaultDefault = uuidDefault;\n }\n\n /**\n * see {@link Column.primaryKey}\n */\n primaryKey<T extends Column.Pick.Data, Name extends string>(\n this: T,\n name?: Name,\n ): // using & bc otherwise the return type doesn't match `primaryKey` in ColumnType and TS complains\n T & {\n data: { primaryKey: Name; default: RawSqlBase };\n } {\n const column = super.primaryKey(name);\n if (!column.data.default) column.data.default = uuidDefault;\n return column as never;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `uuid()`);\n }\n}\n\n// xml data type can be used to store XML data\nexport class XMLColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n string,\n ReturnType<Schema['stringSchema']>,\n OperatorsText\n> {\n dataType = 'xml' as const;\n operators = Operators.text;\n\n private static _instance: XMLColumn<DefaultSchemaConfig> | undefined;\n static get instance() {\n return (this._instance ??= new XMLColumn(defaultSchemaConfig));\n }\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `xml()`);\n }\n}\n\n// citext is a postgres extension\nexport class CitextColumn<\n Schema extends ColumnSchemaConfig,\n> extends TextBaseColumn<Schema, OperatorsOrdinalText> {\n dataType = 'citext' as const;\n declare data: TextColumnData & { minArg?: number; maxArg?: number };\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n this.data.extension = 'citext';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return textColumnToCode(this, ctx, key);\n }\n}\n","import { Column } from '../column';\nimport { columnCode, ColumnToCodeCtx } from '../code';\nimport { Code } from '../code';\nimport { Operators, OperatorsBoolean } from '../operators';\nimport {\n defaultSchemaConfig,\n DefaultSchemaConfig,\n} from '../default-schema-config';\nimport { ColumnSchemaConfig } from '../column-schema';\n\n// 1 byte, true or false\nexport class BooleanColumn<Schema extends ColumnSchemaConfig> extends Column<\n Schema,\n boolean,\n ReturnType<Schema['boolean']>,\n OperatorsBoolean\n> {\n dataType = 'bool' as const;\n operators = Operators.boolean;\n\n private static _instance: BooleanColumn<DefaultSchemaConfig> | undefined;\n static get instance() {\n return (this._instance ??= new BooleanColumn(defaultSchemaConfig));\n }\n\n constructor(schema: Schema) {\n super(schema, schema.boolean() as never);\n this.data.alias = 'boolean';\n this.data.parseItem = parseItem;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, 'boolean()');\n }\n}\n\nconst parseItem = (input: string) => input[0] === 't';\n","import { pushOrNewArrayToObjectImmutable, RecordUnknown } from '../utils';\nimport { Column, getDefaultNowFn } from './column';\nimport { RawSql, RawSqlBase } from '../query/expressions/raw-sql';\n\n// Column types returned by `...t.timestamps()` and variations.\nexport interface Timestamps<T extends Column.Pick.Data> {\n // Timestamp column with a `now()` default\n createdAt: Column.Modifiers.Default<T, RawSqlBase>;\n // Timestamp column with a `now()` default, and it's being updated on every record update.\n updatedAt: Column.Modifiers.Default<T, RawSqlBase>;\n}\n\n// Simplified SQL type that returns raw SQL as it is, without dealing with SQL variables.\nclass SimpleRawSQL extends RawSql {\n // Simply returning SQL provided in the constructor.\n makeSQL(): string {\n return this._sql as string;\n }\n}\n\n// Construct a simplified raw SQL.\nconst raw = (sql: string) => new SimpleRawSQL(sql);\n\nexport interface TimestampHelpers {\n /**\n * Add `createdAt` and `updatedAt` timestamps. Both have `now()` as a default, `updatedAt` is automatically updated during update.\n */\n timestamps<T extends Column.Pick.Data>(this: {\n timestamp(): T;\n }): Timestamps<T>;\n\n /**\n * The same as {@link timestamps}, for the timestamp without time zone time.\n */\n timestampsNoTZ<T extends Column.Pick.Data>(this: {\n timestampNoTZ(): T;\n }): Timestamps<T>;\n}\n\nconst makeTimestamps = <T extends Column.Pick.Data>(timestamp: () => T) => {\n const now = getDefaultNowFn();\n const nowRaw = raw(now);\n const updatedAt = (timestamp() as unknown as Column).default(nowRaw);\n let updater:\n | ((data: (RecordUnknown | (() => void))[]) => RecordUnknown | undefined)\n | undefined;\n\n updatedAt.data.modifyQuery = (q: unknown, column: Column.Pick.Data) => {\n if (!updater) {\n const key = column.data.key;\n updater = (data) => {\n if (\n data.some((item) => {\n return typeof item !== 'function' && item[key];\n })\n )\n return;\n\n return { [column.data.key]: nowRaw };\n };\n }\n\n pushOrNewArrayToObjectImmutable(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (q as any).q,\n 'updateData',\n updater,\n );\n };\n updatedAt.data.defaultTimestamp = 'updatedAt';\n\n const createdAt = (timestamp() as unknown as Column).default(nowRaw);\n createdAt.data.defaultTimestamp = 'createdAt';\n\n return {\n createdAt,\n updatedAt,\n } as Timestamps<T>;\n};\n\nexport const timestampHelpers: TimestampHelpers = {\n timestamps<T extends Column.Pick.Data>(this: {\n timestamp(): T;\n }): Timestamps<T> {\n return makeTimestamps(this.timestamp);\n },\n\n timestampsNoTZ<T extends Column.Pick.Data>(this: {\n timestampNoTZ(): T;\n }): Timestamps<T> {\n return makeTimestamps(this.timestampNoTZ);\n },\n};\n","import { Code, ColumnToCodeCtx } from '../code';\nimport { Column } from '../column';\nimport { Operators, OperatorsAny } from '../operators';\nimport { columnCode } from '../code';\nimport { setColumnDefaultParse } from '../column.utils';\nimport { ColumnSchemaConfig } from '../column-schema';\n\nconst defaultSrid = 4326;\n\nexport interface PostgisPoint {\n lon: number;\n lat: number;\n srid?: number;\n}\n\nconst encode = ({ srid = defaultSrid, lon, lat }: PostgisPoint): string => {\n const arr = new Uint8Array(25);\n const view = new DataView(arr.buffer);\n\n // first byte 01 indicates little-endian\n view.setInt8(0, 1);\n\n // geometry type Point\n view.setInt8(1, 1);\n // it's a part of geom type, not sure why it's 32\n view.setInt8(4, 32);\n\n view.setUint32(5, srid, true);\n view.setFloat64(9, lon, true);\n view.setFloat64(17, lat, true);\n\n return uint8ArrToHex(arr);\n};\n\nexport class PostgisGeographyPointColumn<\n Schema extends ColumnSchemaConfig,\n> extends Column<\n Schema,\n PostgisPoint,\n ReturnType<Schema['geographyPointSchema']>,\n OperatorsAny\n> {\n dataType = 'geography(Point)';\n operators = Operators.any;\n\n // It is used by test-factory\n static encode = encode;\n\n static isDefaultPoint(typmod: number) {\n return typmodType(typmod) === 'Point' && typmodSrid(typmod) === defaultSrid;\n }\n\n constructor(schema: Schema) {\n super(schema, schema.geographyPointSchema() as never);\n setColumnDefaultParse(this, parse);\n this.data.encode = encode;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `geography.point()`);\n }\n}\n\nconst parse = (input: string): PostgisPoint => {\n const bytes = new Uint8Array(20);\n for (let i = 0; i < 40; i += 2) {\n bytes[i / 2] = parseInt(input.slice(10 + i, 12 + i), 16);\n }\n const view = new DataView(bytes.buffer);\n\n const srid = view.getUint32(0, true);\n const lon = view.getFloat64(4, true);\n const lat = view.getFloat64(12, true);\n\n return srid === defaultSrid\n ? { lon, lat }\n : {\n lon,\n lat,\n srid,\n };\n};\n\nconst typmodGetType = (typmod: number) => (typmod & 0x000000fc) >> 2;\n\nconst lwtypeName = (type: number) =>\n [\n 'Unknown',\n 'Point',\n 'LineString',\n 'Polygon',\n 'MultiPoint',\n 'MultiLineString',\n 'MultiPolygon',\n 'GeometryCollection',\n 'CircularString',\n 'CompoundCurve',\n 'CurvePolygon',\n 'MultiCurve',\n 'MultiSurface',\n 'PolyhedralSurface',\n 'Triangle',\n 'Tin',\n ][type] || 'Invalid type';\n\nconst typmodGetZ = (typmod: number) => (typmod & 0x00000002) >> 1;\n\nconst typmodGetM = (typmod: number) => typmod & 0x00000001;\n\nconst typmodType = (typmod: number) => {\n const type = typmodGetType(typmod);\n\n let s = '';\n\n if (typmod < 0 || type === 0) {\n s += 'Geometry';\n } else {\n s += lwtypeName(type);\n }\n\n if (typmod >= 0 && typmodGetZ(typmod)) s += 'Z';\n\n if (typmod >= 0 && typmodGetM(typmod)) s += 'M';\n\n return s;\n};\n\nconst typmodSrid = (typmod: number) => {\n return typmod < 0 ? 0 : ((typmod & 0x0fffff00) - (typmod & 0x10000000)) >> 8;\n};\n\nexport const postgisTypmodToSql = (typmod: number) => {\n const srid = typmodSrid(typmod);\n return typmodType(typmod) + (srid === defaultSrid ? '' : ', ' + srid);\n};\n\nlet byteToHex: string[] | undefined;\nfunction uint8ArrToHex(arr: Uint8Array) {\n if (!byteToHex) {\n byteToHex = [];\n for (let n = 0; n <= 0xff; ++n) {\n const hexOctet = n.toString(16).padStart(2, '0');\n byteToHex.push(hexOctet);\n }\n }\n\n const hexOctets = [];\n\n for (let i = 0; i < arr.length; ++i) hexOctets.push(byteToHex[arr[i]]);\n\n return hexOctets.join('');\n}\n","import { IdentityColumn, IntegerColumn } from './column-types/number';\nimport {\n BitColumn,\n BitVaryingColumn,\n BoxColumn,\n ByteaColumn,\n CidrColumn,\n CircleColumn,\n InetColumn,\n LineColumn,\n LsegColumn,\n MacAddr8Column,\n MacAddrColumn,\n PathColumn,\n PointColumn,\n PolygonColumn,\n TsQueryColumn,\n TsVectorColumn,\n UUIDColumn,\n XMLColumn,\n} from './column-types/string';\nimport { IntervalColumn, TimeColumn } from './column-types/date-time';\nimport { BooleanColumn } from './column-types/boolean';\nimport { JSONTextColumn } from './column-types/json';\nimport { timestampHelpers, TimestampHelpers } from './timestamps';\nimport { CustomTypeColumn, DomainColumn } from './column-types/custom-type';\nimport { RawSql, sqlFn, SqlFn } from '../query/expressions/raw-sql';\nimport { TableData } from '../tableData';\nimport { PostgisGeographyPointColumn } from './column-types/postgis';\nimport { ColumnSchemaConfig } from './column-schema';\nimport {\n Column,\n setCurrentColumnName,\n setDefaultLanguage,\n setDefaultNowFn,\n} from './column';\n\nexport const getColumnTypes = <\n ColumnTypes,\n Shape extends Column.QueryColumnsInit,\n>(\n types: ColumnTypes,\n fn: (t: ColumnTypes) => Shape,\n nowSQL: string | undefined,\n language: string | undefined,\n): Shape => {\n if (nowSQL) setDefaultNowFn(nowSQL);\n if (language) setDefaultLanguage(language);\n return fn(types);\n};\n\nexport interface DefaultColumnTypes<SchemaConfig extends ColumnSchemaConfig>\n extends TimestampHelpers {\n schema: SchemaConfig;\n enum: SchemaConfig['enum'];\n array: SchemaConfig['array'];\n\n name<T>(this: T, name: string): T;\n\n sql: SqlFn;\n\n smallint: SchemaConfig['smallint'];\n integer: SchemaConfig['integer'];\n bigint: SchemaConfig['bigint'];\n numeric: SchemaConfig['decimal'];\n decimal: SchemaConfig['decimal'];\n real: SchemaConfig['real'];\n doublePrecision: SchemaConfig['doublePrecision'];\n identity(\n options?: TableData.Identity,\n ): IdentityColumn<ReturnType<SchemaConfig['integer']>>;\n smallSerial: SchemaConfig['smallSerial'];\n serial: SchemaConfig['serial'];\n bigSerial: SchemaConfig['bigSerial'];\n money: SchemaConfig['money'];\n varchar: SchemaConfig['varchar'];\n text: SchemaConfig['text'];\n // `varchar` column with optional limit defaulting to 255.\n string: SchemaConfig['string'];\n citext: SchemaConfig['citext'];\n bytea(): ByteaColumn<SchemaConfig>;\n date: SchemaConfig['date'];\n timestampNoTZ: SchemaConfig['timestampNoTZ'];\n timestamp: SchemaConfig['timestamp'];\n time(precision?: number): TimeColumn<SchemaConfig>;\n interval(fields?: string, precision?: number): IntervalColumn<SchemaConfig>;\n boolean(): BooleanColumn<SchemaConfig>;\n point(): PointColumn<SchemaConfig>;\n line(): LineColumn<SchemaConfig>;\n lseg(): LsegColumn<SchemaConfig>;\n box(): BoxColumn<SchemaConfig>;\n path(): PathColumn<SchemaConfig>;\n polygon(): PolygonColumn<SchemaConfig>;\n circle(): CircleColumn<SchemaConfig>;\n cidr(): CidrColumn<SchemaConfig>;\n inet(): InetColumn<SchemaConfig>;\n macaddr(): MacAddrColumn<SchemaConfig>;\n macaddr8(): MacAddr8Column<SchemaConfig>;\n bit(length: number): BitColumn<SchemaConfig>;\n bitVarying(length?: number): BitVaryingColumn<SchemaConfig>;\n tsvector(): TsVectorColumn<SchemaConfig>;\n tsquery(): TsQueryColumn<SchemaConfig>;\n uuid(): UUIDColumn<SchemaConfig>;\n xml(): XMLColumn<SchemaConfig>;\n json: SchemaConfig['json'];\n jsonText(): JSONTextColumn<SchemaConfig>;\n type(dataType: string): CustomTypeColumn<SchemaConfig>;\n domain(dataType: string): DomainColumn<SchemaConfig>;\n\n geography: {\n point(): PostgisGeographyPointColumn<SchemaConfig>;\n };\n}\n\nexport const makeColumnTypes = <SchemaConfig extends ColumnSchemaConfig>(\n schema: SchemaConfig,\n): DefaultColumnTypes<SchemaConfig> => {\n return {\n schema,\n enum: schema.enum,\n array: schema.array,\n\n name(name: string) {\n setCurrentColumnName(name);\n return this;\n },\n\n sql: sqlFn,\n\n smallint: schema.smallint,\n integer: schema.integer,\n bigint: schema.bigint,\n numeric: schema.decimal,\n decimal: schema.decimal,\n real: schema.real,\n doublePrecision: schema.doublePrecision,\n identity(options) {\n return (schema.integer() as IntegerColumn<SchemaConfig>).identity(\n options,\n ) as never;\n },\n smallSerial: schema.smallSerial,\n serial: schema.serial,\n bigSerial: schema.bigSerial,\n money: schema.money,\n varchar: schema.varchar,\n text: schema.text,\n string: schema.string,\n citext: schema.citext,\n bytea() {\n return new ByteaColumn<SchemaConfig>(schema);\n },\n date: schema.date,\n timestampNoTZ: schema.timestampNoTZ,\n timestamp: schema.timestamp,\n time(precision) {\n return new TimeColumn<SchemaConfig>(schema, precision);\n },\n interval(fields, precision) {\n return new IntervalColumn<SchemaConfig>(schema, fields, precision);\n },\n boolean() {\n return new BooleanColumn<SchemaConfig>(schema);\n },\n point() {\n return new PointColumn<SchemaConfig>(schema);\n },\n line() {\n return new LineColumn<SchemaConfig>(schema);\n },\n lseg() {\n return new LsegColumn<SchemaConfig>(schema);\n },\n box() {\n return new BoxColumn<SchemaConfig>(schema);\n },\n path() {\n return new PathColumn<SchemaConfig>(schema);\n },\n polygon() {\n return new PolygonColumn<SchemaConfig>(schema);\n },\n circle() {\n return new CircleColumn<SchemaConfig>(schema);\n },\n cidr() {\n return new CidrColumn<SchemaConfig>(schema);\n },\n inet() {\n return new InetColumn<SchemaConfig>(schema);\n },\n macaddr() {\n return new MacAddrColumn<SchemaConfig>(schema);\n },\n macaddr8() {\n return new MacAddr8Column<SchemaConfig>(schema);\n },\n bit(length) {\n return new BitColumn<SchemaConfig>(schema, length);\n },\n bitVarying(length) {\n return new BitVaryingColumn<SchemaConfig>(schema, length);\n },\n tsvector() {\n return new TsVectorColumn<SchemaConfig>(schema);\n },\n tsquery() {\n return new TsQueryColumn<SchemaConfig>(schema);\n },\n uuid() {\n return new UUIDColumn<SchemaConfig>(schema);\n },\n xml() {\n return new XMLColumn<SchemaConfig>(schema);\n },\n json: schema.json,\n jsonText() {\n return new JSONTextColumn<SchemaConfig>(schema);\n },\n type(dataType) {\n return new CustomTypeColumn<SchemaConfig>(schema, dataType);\n },\n domain(dataType) {\n return new DomainColumn<SchemaConfig>(schema, dataType);\n },\n\n geography: {\n point() {\n return new PostgisGeographyPointColumn(schema);\n },\n },\n\n ...timestampHelpers,\n };\n};\n\nRawSql.prototype.columnTypes = makeColumnTypes;\n","import { Column } from '../column';\nimport { Operators, OperatorsAny } from '../operators';\nimport { ColumnSchemaConfig } from '../column-schema';\nimport { RecordUnknown } from '../../utils';\nimport {\n CreateCtx,\n CreateSelf,\n} from '../../query/basic-features/mutate/create';\nimport { UpdateSelf } from '../../query/basic-features/mutate/update';\n\nexport abstract class VirtualColumn<\n Schema extends ColumnSchemaConfig,\n InputSchema extends Schema['type'] = ReturnType<Schema['never']>,\n> extends Column<Schema, unknown, InputSchema, OperatorsAny> {\n dataType = '';\n operators = Operators.any;\n\n constructor(\n schema: Schema,\n inputSchema: InputSchema = schema.never() as InputSchema,\n ) {\n super(schema, inputSchema);\n // to omit it from selection when selecting *\n this.data.explicitSelect = this.data.appReadOnly = this.data.virtual = true;\n }\n\n toCode(): never {\n throw new Error(`toCode is not implemented for virtual column`);\n }\n\n create?(\n q: CreateSelf,\n ctx: CreateCtx,\n items: unknown[],\n rowIndex: number[],\n count: number,\n ): void;\n\n update?(q: UpdateSelf, set: RecordUnknown): void;\n}\n","import { VirtualColumn } from './virtual';\nimport { RawSql } from '../../query/expressions/raw-sql';\nimport { defaultSchemaConfig } from '../default-schema-config';\nimport { ColumnSchemaConfig } from '../column-schema';\n\n// unknown column is used for the case of raw SQL when user doesn't specify a column\nexport class UnknownColumn<\n Schema extends ColumnSchemaConfig,\n> extends VirtualColumn<Schema> {\n static instance = new UnknownColumn(defaultSchemaConfig);\n\n selectable = true;\n\n constructor(schema: Schema) {\n super(schema, schema.unknown() as never);\n // include this column when selecting *, unlike the parent VirtualColumn\n this.data.explicitSelect =\n this.data.appReadOnly =\n this.data.virtual =\n undefined;\n }\n}\n\nRawSql.prototype.result = { value: UnknownColumn.instance };\n","import { makeColumnTypes } from './column-types';\nimport { Column } from './column';\nimport { ColumnSchemaConfig } from './column-schema';\n\nexport interface ColumnsByType {\n [K: string]: () => Column.Pick.Data;\n}\n\nexport const makeColumnsByType = (schema: ColumnSchemaConfig) => {\n const t = makeColumnTypes(schema);\n\n // not implementing char, character, bpchar\n return {\n bool: t.boolean,\n boolean: t.boolean,\n bytea: t.bytea,\n int8: t.bigint,\n bigint: t.bigint,\n int2: t.smallint,\n smallint: t.smallint,\n int4: t.integer,\n integer: t.integer,\n text: t.text,\n json: t.jsonText,\n xml: t.xml,\n point: t.point,\n lseg: t.lseg,\n path: t.path,\n box: t.box,\n polygon: t.polygon,\n line: t.line,\n cidr: t.cidr,\n float4: t.real,\n real: t.real,\n float8: t.doublePrecision,\n 'double precision': t.doublePrecision,\n circle: t.circle,\n macaddr8: t.macaddr8,\n money: t.money,\n macaddr: t.macaddr,\n inet: t.inet,\n varchar: t.varchar,\n 'character varying': t.varchar,\n date: t.date,\n time: t.time,\n 'time without time zone': t.time,\n timestamp: t.timestampNoTZ,\n 'timestamp without time zone': t.timestampNoTZ,\n timestamptz: t.timestamp,\n 'timestamp with time zone': t.timestamp,\n interval: t.interval,\n bit() {\n return t.bit(Infinity);\n },\n varbit: t.bitVarying,\n 'bit varying': t.bitVarying,\n numeric: t.decimal,\n decimal: t.decimal,\n uuid: t.uuid,\n tsvector: t.tsvector,\n tsquery: t.tsquery,\n jsonb: schema.json as () => Column,\n smallserial: t.smallSerial,\n serial: t.serial,\n bigserial: t.bigSerial,\n // requires citext extension\n citext: t.citext,\n geographyDefaultPoint: t.geography.point,\n } as never;\n};\n","import { UnknownColumn } from './column-types/unknown';\nimport { Column } from './column';\nimport { emptyObject } from '../utils';\n\nexport const anyShape = new Proxy(emptyObject, {\n get() {\n return UnknownColumn.instance;\n },\n}) as Column.QueryColumnsInit;\n","import { IsQuery, Query, QueryReturnType } from './query';\nimport { ComputedColumns } from './extra-features/computed/computed';\nimport { Column } from '../columns/column';\nimport { ColumnsShape } from '../columns/columns-shape';\nimport { CteItem } from './basic-features/cte/cte.sql';\nimport {\n HasBeforeAndBeforeSet,\n SubQueryForSql,\n} from './internal-features/sub-query/sub-query-for-sql';\nimport {\n BatchParsers,\n ColumnsParsers,\n PickQueryDataParsers,\n} from './query-columns/query-column-parsers';\nimport {\n PickQueryInputType,\n PickQueryQ,\n PickQueryTable,\n} from './pick-query-types';\nimport {\n Expression,\n ExpressionChain,\n SelectableOrExpression,\n} from './expressions/expression';\nimport { AdapterBase, QueryResult } from '../adapters/adapter';\nimport { HasHookSelect } from './basic-features/select/hook-select';\nimport {\n MaybeArray,\n pushOrNewArrayToObjectImmutable,\n RecordString,\n RecordUnknown,\n} from '../utils';\nimport { RelationConfigBase } from './relations';\nimport { QueryDataAliases } from './basic-features/as/as';\nimport { AfterCommitErrorHandler } from './basic-features/transaction/transaction';\nimport { Sql } from './sql/sql';\nimport { QueryDataTransform } from './extra-features/data-transform/transform';\nimport { QueryHookUtils } from './extra-features/hooks/hooks';\nimport { SelectItem } from './basic-features/select/select.sql';\nimport { QueryDataSources } from './extra-features/search/search.sql';\nimport { JoinItem, JoinItemArgs } from './basic-features/join/join.sql';\nimport { WhereItem } from './basic-features/where/where.sql';\nimport { OrderItem } from './basic-features/order/order.sql';\nimport { HavingItem } from './basic-features/having/having.sql';\nimport { WindowItem } from './basic-features/window/window.sql';\nimport { QueryDataUnion } from './basic-features/union/union.sql';\nimport {\n OnConflictMerge,\n OnConflictSet,\n OnConflictTarget,\n} from './basic-features/mutate/insert.sql';\nimport { QueryLogger, QueryLogObject } from './basic-features/log/log';\nimport { QuerySchema } from './basic-features/schema/schema';\nimport { MutativeQueriesSelectRelationsQueryData } from './internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\n\nexport interface RecordOfColumnsShapeBase {\n [K: string]: Column.Shape.QueryInit;\n}\n\nexport interface WithConfigs {\n [K: string]: WithConfig;\n}\n\nexport interface WithConfig {\n shape: Column.Shape.QueryInit;\n computeds?: ComputedColumns;\n}\n\n// Column shapes of joined tables. Used to select, filter, order by the columns of joined tables.\nexport type JoinedShapes = RecordOfColumnsShapeBase;\n\n// Column parsers of joined tables. Used to parse the columns when selecting the column of joined tables.\nexport interface JoinedParsers {\n [K: string]: ColumnsParsers | undefined;\n}\n\nexport type QueryBeforeHook = (query: Query) => void | Promise<void>;\n\nexport type QueryBeforeActionHook = (\n utils: QueryHookUtils<PickQueryInputType>,\n) => void | Promise<void>;\n\nexport type QueryAfterHook<Data = unknown> = (\n data: Data,\n query: Query,\n) => unknown | Promise<unknown>;\n\nexport type QueryDataScopes = {\n [K: string]: QueryScopeData;\n};\n\n// Query data stored for a specific scope to be applied to the query.\n// The scope function is stored and called lazily when building SQL.\nexport type QueryScopeData = (q: Query) => {\n and?: WhereItem[];\n or?: WhereItem[][];\n};\n\nexport type QueryDataFromItem = string | SubQueryForSql | Expression;\n\nexport interface QueryDataJoinTo extends PickQueryTable, PickQueryQ {}\n\nexport interface HandleResult {\n (\n q: Query,\n returnType: QueryReturnType,\n result: QueryResult,\n sql: Sql,\n isSubQuery?: true,\n ): unknown;\n}\n\nexport type WithItems = CteItem[];\n\nexport interface JoinValueDedupItem {\n q: Query;\n a: string;\n}\n\nexport type QueryType =\n | undefined\n // the same as undefined, used only in SQL composer to override default value\n | null\n | 'upsert'\n | 'insert'\n | 'update'\n | 'delete';\n\nexport interface AsFn {\n (as: string): void;\n}\n\nexport interface QueryData\n extends QueryDataAliases,\n PickQueryDataParsers,\n HasHookSelect,\n MutativeQueriesSelectRelationsQueryData {\n type: QueryType;\n adapter: AdapterBase;\n shape: ColumnsShape;\n handleResult: HandleResult;\n // When executed in a transaction,\n // the query will be wrapped with a `SAVEPOINT x; *query*; ROLLBACK TO SAVEPOINT x (if fails)`.\n // This allows to continue working with the transaction, otherwise it would be in a failed state and wouldn't accept more queries.\n catch?: boolean;\n returnType: QueryReturnType;\n returning?: boolean;\n returningMany?: boolean;\n wrapInTransaction?: boolean;\n throwOnNotFound?: boolean;\n ensureCount?: number;\n with?: WithItems;\n withShapes?: WithConfigs;\n joinTo?: QueryDataJoinTo;\n joinedShapes?: JoinedShapes;\n joinedParsers?: JoinedParsers;\n joinedBatchParsers?: { [K: string]: BatchParsers };\n joinedComputeds?: { [K: string]: ComputedColumns | undefined };\n joined?: { [K: string]: Query };\n joinedForSelect?: string;\n innerJoinLateral?: true;\n // to select values with `get` or aggregate them when they were joined inside `select`.\n // joined table name is implicit in such a case.\n valuesJoinedAs?: RecordString;\n schema?: QuerySchema;\n select?: SelectItem[];\n selectCache?: { sql: string; aliases: string[] };\n selectAllColumns?: string[];\n /**\n * Subset of the `shape` that only includes columns with no `data.explicitSelect`.\n */\n selectAllShape: RecordUnknown;\n /**\n * column type for query with 'value' or 'valueOrThrow' return type\n * Is needed in {@link getShapeFromSelect} to get shape of sub-select that returns a single value.\n */\n getColumn?: Column.Pick.QueryColumn;\n // expr when a single value is returned from the query, when using `get`, or functions.\n expr?: Expression;\n from?: MaybeArray<QueryDataFromItem>;\n updateFrom?: JoinItemArgs;\n sources?: QueryDataSources;\n and?: WhereItem[];\n or?: WhereItem[][];\n order?: OrderItem[];\n // It is used for ORM relations that are known to return a single record to omit `LIMIT` and `OFFSET` from SQL.\n returnsOne?: true;\n // It is used by `joinQueryChainHOF`\n // to remove `LIMIT` and `OFFSET`\n // from the inner query and apply it to the outer query for grouping-ordering reasons.\n useFromLimitOffset?: true;\n coalesceValue?: unknown | Expression;\n notFoundDefault?: unknown;\n defaults?: RecordUnknown;\n // available computed columns, this can be set when selecting from a `with` expression\n runtimeComputeds?: ComputedColumns;\n // selected computed columns\n selectedComputeds?: ComputedColumns;\n // a set for deduplication of hooks added dynamically from the sub queries\n beforeSet?: Set<QueryBeforeHook>;\n // regular before are executed before SQL is generated,\n // but in some cases (dynamic aka lazy SQL) this is impossible,\n // such queries need a second round of `before` hooks to execute after SQL generation.\n dynamicBefore?: HasBeforeAndBeforeSet[];\n // run functions before any query\n before?: QueryBeforeHook[];\n // run functions after any query\n after?: QueryAfterHook[];\n // run functions before create\n beforeCreate?: QueryBeforeHook[];\n // run functions after create in transaction\n afterCreate?: QueryAfterHook[];\n // run functions after create commit\n afterCreateCommit?: QueryAfterHook[];\n // additional select for afterCreate hooks\n afterCreateSelect?: Set<string>;\n // run functions before update\n beforeUpdate?: QueryBeforeHook[];\n // run functions after update in transaction\n afterUpdate?: QueryAfterHook[];\n // run functions after update commit\n afterUpdateCommit?: QueryAfterHook[];\n // additional select for afterUpdate hooks\n afterUpdateSelect?: Set<string>;\n // run functions after create or update in transaction\n afterSave?: QueryAfterHook[];\n // run functions after create or update commit\n afterSaveCommit?: QueryAfterHook[];\n // run functions before delete\n beforeDelete?: QueryBeforeHook[];\n // run functions after delete in transaction\n afterDelete?: QueryAfterHook[];\n // run functions after delete commit\n afterDeleteCommit?: QueryAfterHook[];\n // additional select for afterDelete hooks\n afterDeleteSelect?: Set<string>;\n // catch after commit hooks errors, letting query to return its result\n catchAfterCommitErrors?: AfterCommitErrorHandler[];\n // log settings\n log?: QueryLogObject;\n // logger with `log`, `warn`, `error`\n logger: QueryLogger;\n // convert query into prepared statement automatically as an optimization\n autoPreparedStatements?: boolean;\n // functions to transform query result after loading data\n transform?: QueryDataTransform[];\n // default language for the full text search\n language?: string;\n // Is set for query arg inside `select`, `where`, and others callbacks.\n // It is used by ORM to skip applying a join to the query when `subQuery` is true,\n // the join will be applied after callback is resolved.\n // 1 for the same query, 2 for relation queries returned from the callback.\n subQuery?: number;\n // once there is a hasMany or hasAndBelongsToMany in the chain,\n // the following belongTo and hasOne must also return multiple\n chainMultiple?: boolean;\n // Chained relations, such as `db.user.messages.chat` are stored into array.\n relChain?: { query: Query; rel: RelationConfigBase }[];\n /**\n * Stores current operator functions available for the query.\n * Is needed to remove these operators from query object when changing the query type, see {@link setQueryOperators}.\n */\n operators?: RecordUnknown;\n // Track the applied scopes, this is used when removing the scope from the query.\n scopes?: { [K: string]: QueryScopeData };\n // to allow updating or deleting all records\n all?: true;\n\n chain?: ExpressionChain;\n\n // It is used by `joinQueryChainHOF` to customize the outer query of a chained relation.\n outerQuery?: Query;\n\n // `set` data for insert or update that was set from a `before*` hook\n hookCreateSet?: RecordUnknown[];\n hookUpdateSet?: RecordUnknown[];\n\n appendQueries?: SubQueryForSql[];\n asFns?: AsFn[];\n\n /** select and upsert **/\n\n distinct?: SelectableOrExpression[];\n only?: boolean;\n join?: JoinItem[];\n joinValueDedup?: Map<string, JoinValueDedupItem>;\n group?: (string | Expression)[];\n having?: HavingItem[];\n window?: WindowItem[];\n union?: QueryDataUnion;\n limit?: number;\n offset?: number;\n for?: {\n type: 'UPDATE' | 'NO KEY UPDATE' | 'SHARE' | 'KEY SHARE';\n tableNames?: string[] | Expression;\n mode?: 'NO WAIT' | 'SKIP LOCKED';\n };\n\n /** upsert **/\n\n // upsert does 2 queries: simple find/update, then a union of find/update and insert.\n // this signals SQL code to run the second query for the same query object.\n upsertUpdate?: boolean;\n upsertSecond?: boolean;\n // only for tha data function, it's called only in toSQL after the first query is made.\n upsertInsert?(): unknown;\n\n /** insert **/\n\n columns: string[];\n insertFrom?: SubQueryForSql;\n insertValuesAs?: string;\n queryColumnsCount?: number;\n values: unknown[][];\n onConflict?: {\n target?: OnConflictTarget;\n set?: OnConflictSet;\n merge?: OnConflictMerge;\n };\n\n /** update **/\n\n updateData?: UpdateQueryDataItem[];\n updateMany?: UpdateManyQueryData;\n}\n\nexport interface UpdateManyQueryData {\n primaryKeys: string[];\n setColumns: string[];\n data: RecordUnknown[];\n strict?: boolean;\n}\n\nexport interface UpdateQueryDataObject {\n [K: string]: Expression | { op: string; arg: unknown } | unknown;\n}\n\nexport interface UpdatedAtDataInjector {\n (data: UpdateQueryDataItem[]): UpdateQueryDataObject | void;\n}\n\nexport type UpdateQueryDataItem = UpdateQueryDataObject | UpdatedAtDataInjector;\n\nexport interface PickQueryDataShapeAndJoinedShapes {\n shape: Column.Shape.QueryInit;\n joinedShapes?: JoinedShapes;\n}\n\nexport interface PickQueryDataShapeAndJoinedShapesAndAliases\n extends PickQueryDataShapeAndJoinedShapes,\n QueryDataAliases {}\n\n/**\n * Push a new element into an array in the query data - immutable version\n *\n * @param q - query\n * @param key - key to get the array\n * @param value - new element to push\n */\nexport const pushQueryValueImmutable = <T extends IsQuery>(\n q: T,\n key: string,\n value: unknown,\n): T => {\n pushOrNewArrayToObjectImmutable(\n (q as unknown as { q: object }).q,\n key,\n value,\n );\n return q;\n};\n\nexport const getClonedQueryData = (query: QueryData): QueryData => {\n return { ...query };\n};\n","import { Query } from '../../query';\nimport { PickQueryQ } from '../../pick-query-types';\nimport { getClonedQueryData } from '../../query-data';\n\n/**\n * Call `.clone()` on a supposed query object\n */\nexport const _clone = (q: unknown): Query => (q as unknown as Query).clone();\n\nexport class QueryClone {\n /**\n * Clones the current query chain, useful for re-using partial query snippets in other queries without mutating the original.\n *\n * Used under the hood, and not really needed on the app side.\n */\n clone<T>(this: T): T {\n const cloned = Object.create((this as unknown as Query).baseQuery);\n cloned.q = getClonedQueryData((this as unknown as PickQueryQ).q);\n return cloned;\n }\n}\n","import {\n IsQuery,\n Query,\n QueryOrExpression,\n QueryReturnType,\n} from '../../query';\nimport { AfterCommitErrorHandler } from '../../basic-features/transaction/transaction';\nimport { Column } from '../../../columns';\nimport {\n PickQueryInputType,\n PickQueryQ,\n PickQueryShape,\n} from '../../pick-query-types';\nimport { _clone } from '../../basic-features/clone/clone';\nimport { emptyArray, RecordString, RecordUnknown } from '../../../utils';\nimport { QueryBatchResult } from '../../basic-features/select/select.utils';\nimport {\n pushQueryValueImmutable,\n QueryAfterHook,\n QueryBeforeActionHook,\n QueryBeforeHook,\n} from '../../query-data';\n\n// A function type for after-hook. Constructs type of data argument based on selected columns.\nexport type AfterHook<\n Select extends PropertyKey[],\n Shape extends Column.QueryColumns,\n> = QueryAfterHook<\n {\n [K in Select[number]]: K extends keyof Shape\n ? Shape[K]['outputType']\n : never;\n }[]\n>;\n\n// Hook argument for selecting columns: array of column names of the table.\nexport type HookSelectArg<T extends PickQueryShape> = (keyof T['shape'] &\n string)[];\n\n// Possible action types to attach hook for.\nexport type HookAction = 'Create' | 'Update' | 'Save' | 'Delete';\n\n// Save `before` hook into the query.\nconst before = <T>(q: T, key: HookAction, cb: QueryBeforeHook): T =>\n pushQueryValueImmutable(q as IsQuery, `before${key}`, cb) as never;\n\n// Save `after` hook into the query: this saves the function and the hook selection into the query data.\nconst after = <T extends PickQueryShape, S extends HookSelectArg<T>>(\n query: T,\n key: HookAction,\n select: S,\n cb: AfterHook<S, T['shape']>,\n commit?: boolean,\n): T => {\n const q = query as unknown as PickQueryQ;\n pushQueryValueImmutable(\n q as never,\n `after${key}${commit ? 'Commit' : ''}`,\n cb,\n );\n\n if (key === 'Save') {\n addSelect(q, 'Create', select);\n addSelect(q, 'Update', select);\n } else {\n addSelect(q, key, select);\n }\n\n return query;\n};\n\nconst addSelect = (\n q: PickQueryQ,\n key: 'Create' | 'Update' | 'Delete',\n select: string[],\n) => {\n const prop = `after${key}Select` as const;\n const set = (q.q[prop] = new Set(q.q[prop]));\n for (const column of select) {\n set.add(column);\n }\n};\n\nexport const _queryHookBeforeQuery = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeHook,\n): T => {\n return pushQueryValueImmutable(q as never, 'before', cb);\n};\n\nexport const _queryHookAfterQuery = <T extends PickQueryShape>(\n q: T,\n cb: QueryAfterHook,\n): T => {\n return pushQueryValueImmutable(q as never, 'after', cb);\n};\n\nexport const _hookSelectColumns = (\n query: Query,\n columns: string[],\n asFn: (as: string[]) => void,\n) => {\n const hookSelect = (query.q.hookSelect = new Map(\n query.q.hookSelect && [...query.q.hookSelect],\n ));\n\n const aliases: string[] = [];\n const addAlias = (as: string) => {\n aliases.push(as);\n if (aliases.length === columns.length) {\n asFn(aliases);\n }\n };\n\n for (const column of columns) {\n const item = hookSelect.get(column);\n hookSelect.set(column, {\n ...item,\n select: column,\n onAs: [...(item?.onAs || emptyArray), addAlias],\n });\n }\n};\n\nexport class QueryHookUtils<T extends PickQueryInputType> {\n constructor(\n public query: IsQuery,\n public columns: string[],\n private key: 'hookCreateSet' | 'hookUpdateSet',\n ) {}\n\n set = (data: {\n [K in keyof T['inputType']]?:\n | T['inputType'][K]\n | (() => QueryOrExpression<T['inputType'][K]>);\n }) => {\n const set: RecordUnknown = {};\n for (const key in data) {\n if (data[key] !== undefined) {\n set[key] = data[key];\n }\n }\n pushQueryValueImmutable(this.query, this.key, set);\n };\n}\n\nexport const finalizeNestedHookSelect = (\n batches: QueryBatchResult[],\n returnType: QueryReturnType,\n tempColumns: Set<string> | undefined,\n renames: RecordString | undefined,\n key: string,\n) => {\n if (renames) {\n for (const { data } of batches) {\n for (const record of data) {\n if (record) {\n for (const a in renames) {\n record[a] = record[renames[a]];\n }\n }\n }\n }\n }\n\n if (tempColumns?.size) {\n for (const { data } of batches) {\n for (const record of data) {\n if (record) {\n for (const key of tempColumns) {\n delete record[key];\n }\n }\n }\n }\n }\n\n if (returnType === 'one' || returnType === 'oneOrThrow') {\n for (const batch of batches) {\n batch.data = batch.data[0];\n }\n } else if (returnType === 'pluck') {\n for (const { data } of batches) {\n for (let i = 0; i < data.length; i++) {\n data[i] = data[i][key];\n }\n }\n } else if (returnType === 'value' || returnType === 'valueOrThrow') {\n for (const item of batches) {\n item.parent[item.key] = item.data[0]?.[key];\n }\n }\n};\n\nexport const _queryHookBeforeCreate = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeActionHook,\n): T => {\n return before(q, 'Create', (q) =>\n cb(new QueryHookUtils(q, q.q.columns, 'hookCreateSet')),\n );\n};\n\nexport const _queryHookAfterCreate = <\n T extends PickQueryShape,\n S extends HookSelectArg<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Create', select, cb);\n};\n\nexport const _queryHookAfterCreateCommit = <\n T extends PickQueryShape,\n S extends HookSelectArg<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Create', select, cb, true);\n};\n\nexport const _queryHookBeforeUpdate = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeActionHook,\n): T => {\n return before(q, 'Update', (q) => {\n const columns = new Set<string>();\n\n if (q.q.updateData) {\n for (const item of q.q.updateData) {\n if (typeof item === 'object') {\n for (const key in item) {\n columns.add(key);\n }\n }\n }\n }\n\n if (q.q.updateMany) {\n for (const key of q.q.updateMany.setColumns) {\n columns.add(key);\n }\n }\n\n return cb(new QueryHookUtils(q, [...columns], 'hookUpdateSet'));\n });\n};\n\nexport const _queryHookAfterUpdate = <\n T extends PickQueryShape,\n S extends HookSelectArg<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Update', select, cb);\n};\n\nexport const _queryHookAfterUpdateCommit = <\n T extends PickQueryShape,\n S extends HookSelectArg<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Update', select, cb, true);\n};\n\nexport const _queryHookBeforeSave = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeActionHook,\n): T => {\n return _queryHookBeforeUpdate(_queryHookBeforeCreate(q, cb), cb);\n};\n\nexport const _queryHookAfterSave = <\n T extends PickQueryShape,\n S extends HookSelectArg<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Save', select, cb);\n};\n\nexport const _queryAfterSaveCommit = <\n T extends PickQueryShape,\n S extends HookSelectArg<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Save', select, cb, true);\n};\n\nexport const _queryHookBeforeDelete = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeHook,\n): T => {\n return before(q, 'Delete', cb);\n};\n\nexport const _queryHookAfterDelete = <\n T extends PickQueryShape,\n S extends HookSelectArg<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Delete', select, cb);\n};\n\nexport const _queryHookAfterDeleteCommit = <\n T extends PickQueryShape,\n S extends HookSelectArg<T>,\n>(\n q: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n): T => {\n return after(q, 'Delete', select, cb, true);\n};\n\nexport abstract class QueryHooks {\n /**\n * Run the function before any kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeQuery<T>(this: T, cb: QueryBeforeHook): T {\n return _queryHookBeforeQuery(_clone(this), cb) as T;\n }\n\n /**\n * Run the function after any kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n *\n * @param cb - function to call, first argument is the query result of type `unknown`, second argument is a query object\n */\n afterQuery<T>(this: T, cb: QueryAfterHook): T {\n return _queryHookAfterQuery(_clone(this), cb) as T;\n }\n\n /**\n * Run the function before a `create` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeCreate<T>(this: T, cb: QueryBeforeActionHook): T {\n return _queryHookBeforeCreate(_clone(this), cb) as T;\n }\n\n /**\n * Run the function after a `create` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterCreate<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterCreate(_clone(this), select, cb) as unknown as T;\n }\n\n /**\n * Run the function after transaction for a `create` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterCreateCommit<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterCreateCommit(\n _clone(this),\n select,\n cb,\n ) as unknown as T;\n }\n\n /**\n * Run the function before an `update` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeUpdate<T>(this: T, cb: QueryBeforeActionHook): T {\n return _queryHookBeforeUpdate(_clone(this), cb) as T;\n }\n\n /**\n * Run the function after an `update` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n * If no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterUpdate<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterUpdate(_clone(this), select, cb) as unknown as T;\n }\n\n /**\n * Run the function after transaction for an `update` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n * If no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterUpdateCommit<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterUpdateCommit(\n _clone(this),\n select,\n cb,\n ) as unknown as T;\n }\n\n /**\n * Run the function before a `create` or an `update` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeSave<T>(this: T, cb: QueryBeforeActionHook): T {\n return _queryHookBeforeSave(_clone(this), cb) as T;\n }\n\n /**\n * Run the function after a `create` or an `update` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n * For the `update` query, if no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterSave<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterSave(_clone(this), select, cb) as unknown as T;\n }\n\n /**\n * Run the function after transaction for a `create` or an `update` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n * For the `update` query, if no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterSaveCommit<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryAfterSaveCommit(_clone(this), select, cb) as unknown as T;\n }\n\n /**\n * Run the function before a `delete` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeDelete<T>(this: T, cb: QueryBeforeHook): T {\n return _queryHookBeforeDelete(_clone(this), cb) as T;\n }\n\n /**\n * Run the function after a `delete` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n * If no records were deleted, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterDelete<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterDelete(_clone(this), select, cb) as unknown as T;\n }\n\n /**\n * Run the function after transaction for a `delete` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n * If no records were deleted, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterDeleteCommit<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterDeleteCommit(\n _clone(this),\n select,\n cb,\n ) as unknown as T;\n }\n\n /**\n * Add `catchAfterCommitError` to the query to catch possible errors that are coming from after commit hooks.\n *\n * When it is used, the transaction will return its result disregarding of a failed hook.\n *\n * Without `catchAfterCommitError`, the transaction function throws and won't return result.\n * Result is still accessible from the error object [AfterCommitError](#AfterCommitError).\n *\n * ```ts\n * const result = await db\n * .$transaction(async () => {\n * return db.table.create(data);\n * })\n * .catchAfterCommitError((err) => {\n * // err is instance of AfterCommitError (see below)\n * })\n * // can be added multiple times, all catchers will be executed\n * .catchAfterCommitError((err) => {});\n *\n * // result is available even if an after commit hook has failed\n * result.id;\n * ```\n */\n catchAfterCommitError<T>(this: T, fn: AfterCommitErrorHandler): T {\n const q = _clone(this);\n pushQueryValueImmutable(q, 'catchAfterCommitErrors', fn);\n return q as T;\n }\n}\n","import { FnUnknownToUnknown, MaybePromise } from '../../utils';\nimport { HookSelect } from '../basic-features/select/hook-select';\nimport { Query } from '../query';\nimport { getValueKey } from '../basic-features/get/get-value-key';\n\nexport interface PickQueryDataParsers {\n // column parsers that are applied by default, when not selecting anything\n defaultParsers?: ColumnsParsers;\n // parsers added for selected items\n parsers?: ColumnsParsers;\n // parsers for nested records\n batchParsers?: BatchParsers;\n}\n\n// function to parse a single column after loading the data\nexport type ColumnParser = FnUnknownToUnknown;\n\n// To parse all returned rows. Unlike column parser, can return a promise.\nexport interface BatchParser {\n path: string[];\n fn: (path: string[], queryResult: { rows: unknown[] }) => MaybePromise<void>;\n}\n\n// set of value parsers\n// key is a name of a selected column,\n// or it can be a `getValueKey` to parse single values requested by the `.get()`, `.count()`, or similar methods\nexport type ColumnsParsers = { [K in string | getValueKey]?: ColumnParser };\n\n// set of batch parsers\n// is only triggered when loading all,\n// or when using `hookSelect` or computed columns that convert response to `all` internally.\n// key is a name of a selected column,\n// or it can be a `getValueKey` to parse single values requested by the `.get()`, `.count()`, or similar methods\nexport type BatchParsers = BatchParser[];\n\n/**\n * generic utility to add a parser to the query object\n * @param query - the query object, it will be mutated\n * @param key - the name of the column in the data loaded by the query\n * @param parser - function to process the value of the column with.\n */\nexport const setParserToQuery = (\n query: { parsers?: ColumnsParsers },\n key: string | getValueKey,\n parser?: ColumnParser,\n) => {\n if (parser) {\n if (query.parsers) query.parsers[key] = parser;\n else query.parsers = { [key]: parser };\n } else if (query.parsers) {\n delete query.parsers[key];\n }\n};\n\n/**\n * similar to setParserToQuery,\n * but if the parser for the column is already set,\n * this will wrap it with HOC to additionally parse with a provided function\n * @param query - the query object, it will be mutated\n * @param key - the name of the column in the data loaded by the query\n * @param parser - function to process the value of the column with.\n */\nexport const overrideParserInQuery = (\n query: { parsers?: ColumnsParsers },\n key: string | getValueKey,\n parser: ColumnParser,\n) => {\n if (query.parsers) {\n const existing = query.parsers[key];\n query.parsers[key] = existing\n ? (value: unknown) => parser(existing(value))\n : parser;\n } else query.parsers = { [key]: parser } as ColumnsParsers;\n};\n\nexport const getQueryParsers = (q: Query, hookSelect?: HookSelect) => {\n if (hookSelect) {\n const parsers = { ...q.q.parsers };\n const { defaultParsers } = q.q;\n if (defaultParsers) {\n for (const [key, value] of hookSelect) {\n const parser = defaultParsers[key];\n if (parser) {\n parsers[value.as || key] = parser;\n }\n }\n }\n return parsers;\n }\n\n return q.q.select ? q.q.parsers : q.q.defaultParsers;\n};\n","// eslint-disable-next-line\ntype Value = any;\n\nconst escape = (\n value: Value,\n migration?: boolean,\n nested?: boolean,\n): string => {\n const type = typeof value;\n if (type === 'number' || type === 'bigint') return String(value);\n else if (type === 'string') return escapeString(value);\n else if (type === 'boolean') return value ? 'true' : 'false';\n else if (value instanceof Date) return `'${value.toISOString()}'`;\n else if (Array.isArray(value))\n return migration && nested && !value.length\n ? ''\n : (migration ? (nested ? '{' : \"'{\") : nested ? '[' : 'ARRAY[') +\n value.map((el) => escape(el, migration, true)).join(',') +\n (migration ? (nested ? '}' : \"}'\") : ']');\n else if (value === null || value === undefined) return 'NULL';\n else return escapeString(JSON.stringify(value));\n};\n\nexport const escapeForLog = (value: Value): string => escape(value);\n\nexport const escapeForMigration = (value: Value): string => escape(value, true);\n\nexport const escapeString = (value: string) =>\n `'${value.replaceAll(\"'\", \"''\")}'`;\n","import { escapeForLog } from '../../../quote';\nimport { _clone } from '../clone/clone';\nimport { SingleSql } from '../../sql/sql';\n\nexport interface QueryLogObject {\n colors: boolean;\n beforeQuery(sql: SingleSql): unknown;\n afterQuery(sql: SingleSql, logData: unknown): void;\n onError(error: Error, sql: SingleSql, logData: unknown): void;\n}\n\nexport interface QueryLogger {\n log(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n}\n\nexport interface QueryLogOptions {\n log?: boolean | Partial<QueryLogObject>;\n logger?: QueryLogger;\n}\n\nexport const logColors = {\n boldCyanBright: (message: string) =>\n `\\u001b[1m\\u001b[96m${message}\\u001b[39m\\u001b[22m`,\n\n boldBlue: (message: string) =>\n `\\u001b[1m\\u001b[34m${message}\\u001b[39m\\u001b[22m`,\n\n boldYellow: (message: string) =>\n `\\u001b[1m\\u001b[33m${message}\\u001b[39m\\u001b[22m`,\n\n boldMagenta: (message: string) =>\n `\\u001b[1m\\u001b[33m${message}\\u001b[39m\\u001b[22m`,\n\n boldRed: (message: string) =>\n `\\u001b[1m\\u001b[31m${message}\\u001b[39m\\u001b[22m`,\n};\n\nconst makeMessage = (\n colors: boolean,\n timeColor: (message: string) => string,\n time: [number, number],\n sqlColor: (message: string) => string,\n sql: string,\n valuesColor: (message: string) => string,\n values?: unknown[],\n): string => {\n const elapsed = process.hrtime(time);\n const formattedTime = `(${elapsed[0] ? `${elapsed[0]}s ` : ''}${(\n elapsed[1] / 1000000\n ).toFixed(1)}ms)`;\n\n const result = `${colors ? timeColor(formattedTime) : formattedTime} ${\n colors ? sqlColor(sql) : sql\n }`;\n\n if (!values?.length) {\n return result;\n }\n\n const formattedValues = `[${values.map(escapeForLog).join(', ')}]`;\n\n return `${result} ${colors ? valuesColor(formattedValues) : formattedValues}`;\n};\n\nexport const logParamToLogObject = (\n logger: QueryLogger,\n log: QueryLogOptions['log'],\n): QueryLogObject | undefined => {\n if (!log) return;\n\n const logObject = Object.assign(\n {\n colors: true,\n beforeQuery() {\n return process.hrtime();\n },\n afterQuery(sql, time: [number, number]) {\n logger.log(\n makeMessage(\n colors,\n logColors.boldCyanBright,\n time,\n logColors.boldBlue,\n sql.text,\n logColors.boldYellow,\n sql.values,\n ),\n );\n },\n onError(error, sql, time: [number, number]) {\n const message = `Error: ${error.message}`;\n\n logger.error(\n `${makeMessage(\n colors,\n logColors.boldMagenta,\n time,\n logColors.boldRed,\n sql.text,\n logColors.boldYellow,\n sql.values,\n )} ${colors ? logColors.boldRed(message) : message}`,\n );\n },\n } as QueryLogObject,\n log === true ? {} : log,\n );\n\n const colors = logObject.colors;\n\n return logObject;\n};\n\nexport class QueryLog {\n /**\n * Override the `log` option, which can also be set in `createDb` or when creating a table instance:\n *\n * ```ts\n * // turn log on for this query:\n * await db.table.all().log(true);\n * await db.table.all().log(); // no argument for true\n *\n * // turn log off for this query:\n * await db.table.all().log(false);\n * ```\n *\n * Use {@link $withOptions} to override `log` for a scope of a callback.\n */\n log<T>(this: T, log = true): T {\n const q = _clone(this);\n q.q.log = logParamToLogObject(q.q.logger, log);\n return q as T;\n }\n}\n","import { logParamToLogObject, QueryLogObject } from '../log/log';\nimport {\n TransactionAdapterBase,\n TransactionAfterCommitHook,\n} from '../../../adapters/adapter';\nimport { PickQueryQ, PickQueryQAndInternal } from '../../pick-query-types';\nimport { QuerySchema } from '../schema/schema';\n\nexport interface AsyncState {\n // Database adapter that is connected to a currently running transaction.\n transactionAdapter?: TransactionAdapterBase;\n // Number of transaction nesting.\n // Top transaction has id = 0, transaction inside of transaction will have id = 1, and so on.\n transactionId?: number;\n // Array of data and functions to call after commit.\n // 1st element is a query result, 2nd element is a query object, 3rd element is array of functions to call with the query result and object.\n afterCommit?: TransactionAfterCommitHook[];\n // To log all the queries after inside the storage scope\n log?: QueryLogObject;\n // number of test transaction wrapping the current one\n testTransactionCount?: number;\n // sequential number for catching save-points\n catchI?: number;\n // a db schema to use by default\n schema?: QuerySchema;\n}\n\nexport interface StorageOptions {\n log?: boolean;\n schema?: QuerySchema;\n}\n\nexport const processStorageOptions = (\n query: PickQueryQ,\n options: StorageOptions,\n): Pick<AsyncState, 'log' | 'schema'> | undefined => {\n let log;\n if (options.log !== undefined && !query.q.log) {\n log = logParamToLogObject(query.q.logger, options.log);\n }\n\n return log || 'schema' in options\n ? {\n log,\n schema: options.schema,\n }\n : undefined;\n};\n\nlet currentDefaultSchema: string | undefined;\nexport const setCurrentDefaultSchema = (schema: QuerySchema | undefined) => {\n currentDefaultSchema = typeof schema === 'function' ? schema() : schema;\n};\n\nexport const getQuerySchema = (query: PickQueryQ) =>\n query.q.schema || currentDefaultSchema;\n\nexport class QueryStorage {\n async withOptions<Result>(\n this: PickQueryQAndInternal,\n options: StorageOptions,\n cb: () => Promise<Result>,\n ): Promise<Result> {\n const state = this.internal.asyncStorage.getStore();\n const opts = processStorageOptions(this, options);\n\n return this.internal.asyncStorage.run(\n {\n ...state,\n ...opts,\n },\n cb,\n );\n }\n}\n","import { Query } from '../../query';\nimport {\n AdapterTransactionOptions,\n AfterCommitHook,\n AfterCommitStandaloneHook,\n TransactionAdapterBase,\n TransactionAfterCommitHook,\n} from '../../../adapters/adapter';\nimport { emptyArray, emptyObject } from '../../../utils';\nimport { SingleSqlItem } from '../../sql/sql';\nimport { OrchidOrmError } from '../../errors';\nimport { PickQueryQAndInternal } from '../../pick-query-types';\nimport { _clone } from '../clone/clone';\nimport {\n AsyncState,\n processStorageOptions,\n StorageOptions,\n} from '../storage/storage';\n\nexport interface AsyncTransactionState extends AsyncState {\n transactionAdapter: TransactionAdapterBase;\n transactionId: number;\n}\n\nexport const commitSql: SingleSqlItem = {\n text: 'COMMIT',\n};\n\nexport const rollbackSql: SingleSqlItem = {\n text: 'ROLLBACK',\n};\n\nexport type IsolationLevel =\n | 'SERIALIZABLE'\n | 'REPEATABLE READ'\n | 'READ COMMITTED'\n | 'READ UNCOMMITTED';\n\nexport interface TransactionOptions extends StorageOptions {\n level?: IsolationLevel;\n readOnly?: boolean;\n deferrable?: boolean;\n}\n\nexport interface AfterCommitErrorFulfilledResult\n extends PromiseFulfilledResult<unknown> {\n name?: string;\n}\n\nexport interface AfterCommitErrorRejectedResult extends PromiseRejectedResult {\n name?: string;\n}\n\nexport type AfterCommitErrorResult =\n | AfterCommitErrorFulfilledResult\n | AfterCommitErrorRejectedResult;\n\n/**\n * `AfterCommitError` is thrown when one of after commit hooks throws.\n *\n * ```ts\n * interface AfterCommitError extends OrchidOrmError {\n * // the result of transaction functions\n * result: unknown;\n *\n * // Promise.allSettled result + optional function names\n * hookResults: (\n * | {\n * status: 'fulfilled';\n * value: unknown;\n * name?: string;\n * }\n * | {\n * status: 'rejected';\n * reason: any; // the error object thrown by a hook\n * name?: string;\n * }\n * )[];\n * }\n * ```\n *\n * Use `function name() {}` function syntax for hooks to give them names,\n * so later they can be identified when handling after commit errors.\n *\n * ```ts\n * class SomeTable extends BaseTable {\n * readonly table = 'someTable';\n * columns = this.setColumns((t) => ({\n * ...someColumns,\n * }));\n *\n * init(orm: typeof db) {\n * // anonymous funciton - has no name\n * this.afterCreateCommit([], async () => {\n * // ...\n * });\n *\n * // named function\n * this.afterCreateCommit([], function myHook() => {\n * // ...\n * });\n * }\n * }\n * ```\n */\nexport class AfterCommitError extends OrchidOrmError {\n constructor(\n public result: unknown,\n public hookResults: AfterCommitErrorResult[],\n ) {\n super('After commit hooks have failed');\n }\n}\n\nexport type AfterCommitErrorHandler = (\n error: AfterCommitError,\n) => void | Promise<void>;\n\nexport const _runAfterCommitHooks = async (\n result: unknown,\n promises: unknown[],\n getHookNames: () => string[],\n catchAfterCommitErrors: AfterCommitErrorHandler[] | undefined,\n) => {\n const hookResults = await Promise.allSettled(promises);\n if (hookResults.some((result) => result.status === 'rejected')) {\n const hookNames = getHookNames();\n\n for (const [i, r] of hookResults.entries()) {\n (r as AfterCommitErrorResult).name = hookNames[i];\n }\n\n const err = new AfterCommitError(result, hookResults);\n if (!catchAfterCommitErrors) throw err;\n\n for (const fn of catchAfterCommitErrors) {\n try {\n fn(err);\n } catch {}\n }\n }\n};\n\n/**\n * Check if inside transaction started by user (not test transaction).\n */\nexport const isInUserTransaction = (\n trx: AsyncState | undefined,\n): trx is AsyncState =>\n trx?.transactionId !== undefined &&\n // when inside test transactions, compare transaction counts to ensure there is a user transaction.\n (!trx.testTransactionCount || trx.transactionId >= trx.testTransactionCount);\n\nexport class QueryTransaction {\n /**\n * In Orchid ORM the method is `$transaction`, when using `pqb` on its own it is `transaction`.\n *\n * `COMMIT` happens automatically after the callback was successfully resolved, and `ROLLBACK` is done automatically if the callback fails.\n *\n * Let's consider the case of transferring money from one user to another:\n *\n * ```ts\n * export const transferMoney = async (\n * fromId: number,\n * toId: number,\n * amount: number,\n * ) => {\n * try {\n * // db.$transaction returns data that is returned from the callback\n * // result here is senderRemainder\n * const result = await db.$transaction(async () => {\n * const sender = await db.user.find(fromId);\n * const senderRemainder = sender.balance - amount;\n * if (senderRemainder < 0) {\n * throw new Error('Sender does not have enough money');\n * }\n *\n * await db.user.find(fromId).decrement({\n * balance: amount,\n * });\n * await db.user.find(toId).increment({\n * balance: amount,\n * });\n *\n * return senderRemainder;\n * });\n * } catch (error) {\n * // handle transaction error\n * }\n * };\n * ```\n *\n * It performs 3 queries in a single transaction: load sender record, decrement sender's balance, increment receiver's balance.\n *\n * If sender or receiver record doesn't exist, it will throw `NotFound` error, and there is an error thrown when sender's balance is too low.\n * In such case, the transaction will be rolled back and no changes will be applied to the database.\n *\n * Internally, ORM relies on [AsyncLocalStorage](https://nodejs.org/api/async_context.html#class-asynclocalstorage) feature of node.js,\n * it allows passing the transaction object implicitly. So that any query that is done inside of callback, will run inside a transaction.\n *\n * ## nested transactions\n *\n * Transactions can be nested one in another.\n * The top level transaction is the real one,\n * and the nested ones are emulated with [savepoint](https://www.postgresql.org/docs/current/sql-savepoint.html) instead of `BEGIN`\n * and [release savepoint](https://www.postgresql.org/docs/current/sql-release-savepoint.html) instead of `COMMIT`.\n *\n * Use [ensureTransaction](#ensuretransaction) to run all queries in a single transaction.\n *\n * ```ts\n * const result = await db.$transaction(async () => {\n * await db.table.create(...one);\n *\n * const result = await db.$transaction(async () => {\n * await db.table.create(...two);\n * return 123;\n * });\n *\n * await db.table.create(...three);\n *\n * return result;\n * });\n *\n * // result is returned from the inner transaction\n * result === 123;\n * ```\n *\n * If the inner transaction throws an error, and it is caught by `try/catch` of outer transaction,\n * it performs [rollback to savepoint](https://www.postgresql.org/docs/current/sql-rollback-to.html)\n * and the outer transaction can continue:\n *\n * ```ts\n * class CustomError extends Error {}\n *\n * await db.$transaction(async () => {\n * try {\n * await db.$transaction(async () => {\n * throw new CustomError();\n * });\n * } catch (err) {\n * if (err instanceof CustomError) {\n * // ignore this error\n * return;\n * }\n * throw err;\n * }\n *\n * // this transaction can continue\n * await db.table.create(...data);\n * });\n * ```\n *\n * If the error in the inner transaction is not caught, all nested transactions are rolled back and aborted.\n */\n transaction<Result>(\n this: PickQueryQAndInternal,\n cb: () => Promise<Result>,\n ): Promise<Result>;\n transaction<Result>(\n this: PickQueryQAndInternal,\n options: IsolationLevel | TransactionOptions,\n cb: () => Promise<Result>,\n ): Promise<Result>;\n async transaction<Result>(\n this: PickQueryQAndInternal,\n cbOrOptions: IsolationLevel | TransactionOptions | (() => Promise<Result>),\n cb?: () => Promise<Result>,\n ): Promise<Result> {\n let options: TransactionOptions;\n let fn: () => Promise<Result>;\n if (typeof cbOrOptions === 'function') {\n options = emptyObject as TransactionOptions;\n fn = cbOrOptions;\n } else {\n options =\n typeof cbOrOptions === 'object' ? cbOrOptions : { level: cbOrOptions };\n fn = cb as () => Promise<Result>;\n }\n\n const sql = {\n values: emptyArray,\n } as unknown as SingleSqlItem;\n\n const opts = processStorageOptions(this, options);\n\n const log = opts?.log || this.q.log;\n\n let logData: unknown | undefined;\n\n let state = this.internal.asyncStorage.getStore();\n const transactionId =\n state?.transactionId !== undefined ? state.transactionId + 1 : 0;\n\n const callback = (transactionAdapter: TransactionAdapterBase) => {\n if (log) log.afterQuery(sql, logData);\n if (log) logData = log.beforeQuery(commitSql);\n\n if (state) {\n state.transactionId = transactionId;\n return fn();\n }\n\n state = {\n ...opts,\n transactionAdapter,\n transactionId,\n };\n\n if (options.log !== undefined) {\n state.log = log;\n }\n\n return this.internal.asyncStorage.run(state, fn);\n };\n\n const transactionAdapter = state?.transactionAdapter;\n if (!state || !transactionAdapter) {\n let transactionOptions: AdapterTransactionOptions | undefined;\n\n if (options.level) {\n transactionOptions = {\n options: `ISOLATION LEVEL ${options.level}`,\n };\n }\n\n if (options.readOnly !== undefined) {\n const add = `READ ${options.readOnly ? 'ONLY' : 'WRITE'}`;\n const opts = (transactionOptions ??= {});\n if (opts.options) opts.options += ' ' + add;\n else opts.options = add;\n }\n\n if (options.deferrable !== undefined) {\n const add = `${options.deferrable ? '' : 'NOT '}DEFERRABLE`;\n const opts = (transactionOptions ??= {});\n if (opts.options) opts.options += ' ' + add;\n else opts.options = add;\n }\n\n if (log) {\n sql.text = transactionOptions?.options\n ? `BEGIN ${transactionOptions.options}`\n : 'BEGIN';\n logData = log.beforeQuery(sql);\n }\n\n const result = await this.q.adapter\n .transaction(transactionOptions, callback)\n .catch((err) => {\n if (log) log.afterQuery(rollbackSql, logData);\n\n throw err;\n });\n\n if (log) log.afterQuery(commitSql, logData);\n\n // state was defined in the callback above;\n runAfterCommit((state as AsyncState).afterCommit, result);\n\n return result;\n } else {\n try {\n sql.text = `SAVEPOINT \"t${transactionId}\"`;\n if (log) logData = log.beforeQuery(sql);\n\n await transactionAdapter.arrays(sql.text, sql.values);\n\n let result;\n try {\n result = await callback(transactionAdapter);\n } catch (err) {\n sql.text = `ROLLBACK TO SAVEPOINT \"t${transactionId}\"`;\n if (log) logData = log.beforeQuery(sql);\n await transactionAdapter.arrays(sql.text, sql.values);\n if (log) log.afterQuery(sql, logData);\n throw err;\n }\n\n sql.text = `RELEASE SAVEPOINT \"t${transactionId}\"`;\n if (log) logData = log.beforeQuery(sql);\n await transactionAdapter.arrays(sql.text, sql.values);\n if (log) log.afterQuery(sql, logData);\n\n // transactionId is trx.testTransactionCount when only the test transactions are left,\n // and it's time to execute after commit hooks, because they won't be executed for test transactions.\n if (transactionId === state.testTransactionCount) {\n const { afterCommit } = state;\n state.afterCommit = undefined;\n runAfterCommit(afterCommit, result);\n }\n\n return result;\n } finally {\n state.transactionId = transactionId - 1;\n }\n }\n }\n\n /**\n * Use the `$ensureTransaction` when you want to ensure the sequence of queries is running in a transaction, but there is no need for Postgres [savepoints](https://www.postgresql.org/docs/current/sql-savepoint.html).\n *\n * ```ts\n * async function updateUserBalance(userId: string, amount: number) {\n * await db.$ensureTransaction(async () => {\n * await db.transfer.create({ userId, amount })\n * await db.user.find(userId).increment({ balance: amount })\n * })\n * }\n *\n * async function saveDeposit(userId: string, deposit: { ... }) {\n * await db.$ensureTransaction(async () => {\n * await db.deposit.create(deposit)\n * // transaction in updateUserBalance won't be started\n * await updateUserBalance(userId, deposit.amount)\n * })\n * }\n * ```\n */\n ensureTransaction<Result>(\n this: PickQueryQAndInternal,\n cb: () => Promise<Result>,\n ): Promise<Result> {\n const trx = this.internal.asyncStorage.getStore();\n if (trx) return cb();\n\n return (\n QueryTransaction.prototype.transaction as (cb: unknown) => Promise<Result>\n ).call(this, cb) as Promise<Result>;\n }\n\n isInTransaction(): boolean {\n const trx = (this as unknown as Query).internal.asyncStorage.getStore();\n\n return isInUserTransaction(trx);\n }\n\n /**\n * Schedules a hook to run after the outermost transaction commits:\n *\n * ```ts\n * await db.$transaction(async () => {\n * await db.table.create(data)\n * await db.table.where({ ...conditions }).update({ key: 'value' })\n *\n * db.$afterCommit(() => { // can be sync or async\n * console.log('after commit')\n * })\n * })\n * ```\n *\n * If used outside the transaction, the hook will be executed almost immediately, on the next microtask:\n *\n * ```ts\n * db.$afterCommit(async () => { // can be sync or async\n * console.log('after commit')\n * })\n * ```\n *\n * If the callback has no `try/catch` and throws an error,\n * this will cause `uncaughtException` if the callback is sync and `unhandledRejection` if it is async.\n */\n afterCommit(this: Query, hook: AfterCommitStandaloneHook): void {\n const trx = this.internal.asyncStorage.getStore();\n if (isInUserTransaction(trx)) {\n (trx.afterCommit ??= []).push(hook);\n } else {\n queueMicrotask(hook);\n }\n }\n\n /**\n * Whenever a query in a transaction fails, the transaction is transitioned to a failed state, no further queries are possible.\n *\n * Use [catchUniqueError](/guide/error-handling.html#catchuniqueerror) to handle uniqueness errors,\n * the following examples do not use it to illustrate error handling.\n *\n * ```ts\n * // This transaction is going to fail\n * db.$transaction(async () => {\n * try {\n * // imagine it fails because the username is already taken\n * await db.user.insert({ username: 'taken' });\n * } catch (err) {\n * // even though the query is wrapped in a try-catch, the transaction fails anyway\n * }\n * });\n * ```\n *\n * You can use `catch` method on a query instead of `try-catch` to surpass the problem.\n * The following transaction won't fail:\n *\n * ```ts\n * // Transaction succeeds\n * db.$transaction(async () => {\n * const result = await db.user.insert({ username: 'taken' }).catch(() => 'failed');\n *\n * if (result === 'failed') {\n * await db.user.insert({ username: 'another' });\n * }\n * });\n * ```\n *\n * This is because when using `catch` method, `OrchidORM` will wrap the query with a savepoint.\n *\n * Alternatively, you can use the `recoverable()` method:\n *\n * ```ts\n * // Transaction succeeds\n * db.$transaction(async () => {\n * try {\n * await db.user.insert({ username: 'taken' }).recoverable();\n * } catch (err) {\n * await db.user.insert({ username: 'another' });\n * }\n * });\n * ```\n */\n recoverable<T>(this: T): T {\n const q = _clone(this);\n q.q.catch = true;\n return q as T;\n }\n}\n\n// `afterCommit` hooks are detached from the main flow, this function won't throw.\nconst runAfterCommit = (\n afterCommit: TransactionAfterCommitHook[] | undefined,\n result: unknown,\n) => {\n // to suppress throws of sync afterCommit hooks.\n queueMicrotask(async () => {\n if (afterCommit) {\n const promises = [];\n\n let catchAfterCommitErrors: AfterCommitErrorHandler[] | undefined;\n for (let i = 0, len = afterCommit.length; i < len; ) {\n const first = afterCommit[i];\n if (typeof first === 'function') {\n try {\n promises.push(first());\n } catch (err) {\n promises.push(Promise.reject(err));\n }\n i++;\n } else {\n const q = afterCommit[i + 1] as Query;\n if (q.q.catchAfterCommitErrors) {\n (catchAfterCommitErrors ??= []).push(...q.q.catchAfterCommitErrors);\n }\n\n for (const fn of afterCommit[i + 2] as AfterCommitHook[]) {\n try {\n promises.push(fn(first as unknown[], q));\n } catch (err) {\n promises.push(Promise.reject(err));\n }\n }\n i += 3;\n }\n }\n\n const getHookNames = () => {\n const hookNames = [];\n for (let i = 0, len = afterCommit.length; i < len; ) {\n const first = afterCommit[i];\n if (typeof first === 'function') {\n hookNames.push(first.name);\n i++;\n } else {\n for (const fn of afterCommit[i + 2] as AfterCommitHook[]) {\n hookNames.push(fn.name);\n }\n i += 3;\n }\n }\n return hookNames;\n };\n\n await _runAfterCommitHooks(\n result,\n promises,\n getHookNames,\n catchAfterCommitErrors,\n );\n }\n });\n};\n","import { Column } from '../../../columns';\nimport { IsQuery, QueryReturnType } from '../../query';\nimport { _clone } from '../../basic-features/clone/clone';\nimport { QueryBatchResult } from '../../basic-features/select/select.utils';\nimport { pushQueryValueImmutable, QueryData } from '../../query-data';\nimport { QueryThen } from '../../then/then';\n\n// result transformer: function for `transform`, object for `map`\nexport type QueryDataTransform =\n | QueryDataTransformFn\n | {\n map: (record: unknown, index: number, array: unknown) => unknown;\n thisArg?: unknown;\n };\n\ninterface QueryDataTransformFn {\n (data: unknown, queryData: unknown): unknown;\n}\n\n/**\n * See `transform` query method.\n * This helper applies all transform functions to a result.\n *\n * @param queryData - query data\n * @param returnType - return type of the query, for proper `map` handling\n * @param fns - array of transform functions, can be undefined\n * @param result - query result to transform\n */\nexport const applyTransforms = (\n queryData: unknown,\n returnType: QueryReturnType,\n fns: QueryDataTransform[],\n result: unknown,\n): unknown => {\n for (const fn of fns) {\n if ('map' in fn) {\n if (!returnType || returnType === 'all' || returnType === 'pluck') {\n result = (result as unknown[]).map(fn.map, fn.thisArg);\n } else if (result !== undefined) {\n result =\n result === null ? null : fn.map.call(fn.thisArg, result, 0, result);\n }\n } else {\n result = fn(result, queryData);\n }\n }\n return result;\n};\n\nexport const applyBatchTransforms = (\n q: QueryData,\n batches: QueryBatchResult[],\n) => {\n if (q.transform) {\n for (const item of batches) {\n item.parent[item.key] = applyTransforms(\n q,\n q.returnType,\n q.transform,\n item.data,\n );\n }\n }\n};\n\nexport class QueryTransform {\n /**\n * Transform the result of the query right after loading it.\n *\n * `transform` method should be called in the last order, other methods can't be chained after calling it.\n *\n * It is meant to transform the whole result of a query, for transforming individual records consider using {@link QueryMap.map}.\n *\n * The [hooks](/guide/hooks.html) that are going to run after the query will receive the query result **before** transferring.\n *\n * Consider the following example of a cursor-based pagination by `id`:\n *\n * ```ts\n * const lastId: number | undefined = req.query.cursor;\n *\n * type Result = {\n * nodes: { id: number; text: string }[];\n * cursor?: number;\n * };\n *\n * // result is only for demo, it will be inferred\n * const posts: Result = await db.post\n * .select('id', 'text')\n * .where({ id: { lt: lastId } })\n * .order({ id: 'DESC' })\n * .limit(100)\n * .transform((nodes) => ({ nodes, cursor: nodes.at(-1)?.id }));\n * ```\n *\n * You can also use the `tranform` on nested sub-queries:\n *\n * ```ts\n * type Result = {\n * nodes: {\n * id: number;\n * text: string;\n * comments: { nodes: { id: number; text: string }[]; cursor?: number };\n * }[];\n * cursor?: number;\n * };\n *\n * const postsWithComments: Result = await db.post\n * .select('id', 'text')\n * .select({\n * comments: (q) =>\n * q.comments\n * .select('id', 'text')\n * .transform((nodes) => ({ nodes, cursor: nodes.at(-1)?.id })),\n * })\n * .transform((nodes) => ({ nodes, cursor: nodes.at(-1)?.id }));\n * ```\n *\n * @param fn - function to transform query result with\n */\n transform<T extends IsQuery, Result>(\n this: T,\n fn: (\n input: T extends { then: QueryThen<infer Data> } ? Data : never,\n queryData: QueryData,\n ) => Result,\n ): {\n [K in keyof T]: K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'result'\n ? { value: Column.Pick.QueryColumnOfType<Result> }\n : K extends 'then'\n ? QueryThen<Result>\n : T[K];\n } {\n return pushQueryValueImmutable(_clone(this), 'transform', fn) as never;\n }\n}\n","import {\n IsQuery,\n QueryOrExpression,\n QueryReturnType,\n ReturnsQueryOrExpression,\n} from '../../query';\nimport { Column, UnknownColumn } from '../../../columns';\nimport { Expression } from '../../expressions/expression';\nimport {\n EmptyObject,\n FnUnknownToUnknown,\n MaybePromise,\n RecordString,\n RecordUnknown,\n} from '../../../utils';\nimport { RelationsBase } from '../../relations';\nimport { PickQueryQ, PickQueryShape } from '../../pick-query-types';\nimport { QueryBatchResult } from '../../basic-features/select/select.utils';\nimport { QueryExpressions } from '../../expressions/query-expressions';\nimport { QuerySql } from '../../sql/sql';\nimport { finalizeNestedHookSelect } from '../hooks/hooks';\nimport { applyBatchTransforms } from '../data-transform/transform';\nimport { QueryData } from '../../query-data';\n\ndeclare module '../../../columns/column' {\n namespace Column {\n interface Data {\n // SQL computed columns have an Expression in their data, which will be used for building SQL.\n computed?: Expression;\n }\n }\n}\n\nexport type ComputedColumnsFromOptions<\n T extends ComputedOptionsFactory<never, never> | undefined,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n> = T extends ((...args: any[]) => infer R extends ComputedOptionsConfig)\n ? {\n [K in keyof R]: R[K] extends QueryOrExpression<unknown>\n ? R[K]['result']['value']\n : R[K] extends () => {\n result: { value: infer Value extends Column.Pick.QueryColumn };\n }\n ? Value\n : never;\n }\n : EmptyObject;\n\nexport interface ComputedOptionsConfig {\n [K: string]: QueryOrExpression<unknown> | ReturnsQueryOrExpression<unknown>;\n}\n\nexport type ComputedOptionsFactory<\n ColumnTypes,\n Shape extends Column.QueryColumns,\n> = (t: ComputedMethods<ColumnTypes, Shape>) => ComputedOptionsConfig;\n\nexport interface RuntimeComputedQueryColumn<OutputType>\n extends Column.Pick.QueryColumn {\n dataType: 'runtimeComputed';\n type: never;\n outputType: OutputType;\n queryType: undefined;\n operators: { cannotQueryRuntimeComputed: never };\n}\n\nexport interface ComputedMethods<ColumnTypes, Shape extends Column.QueryColumns>\n extends QueryComputedArg<ColumnTypes, Shape> {\n computeAtRuntime<Deps extends keyof Shape, OutputType>(\n dependsOn: Deps[],\n fn: (record: {\n [K in keyof Shape & Deps]: Shape[K]['outputType'];\n }) => OutputType,\n ): { result: { value: RuntimeComputedQueryColumn<OutputType> } };\n\n computeBatchAtRuntime<Deps extends keyof Shape, OutputType>(\n dependsOn: Deps[],\n fn: (\n record: {\n [K in keyof Shape & Deps]: Shape[K]['outputType'];\n }[],\n ) => MaybePromise<OutputType[]>,\n ): { result: { value: RuntimeComputedQueryColumn<OutputType> } };\n}\n\nexport class ComputedColumn {\n constructor(\n public kind: 'one' | 'many',\n public deps: string[],\n public fn: FnUnknownToUnknown,\n ) {}\n}\n\nexport interface ComputedColumns {\n [K: string]: ComputedColumn;\n}\n\nconst computeAtRuntime = (deps: string[], fn: () => void) =>\n new ComputedColumn('one', deps, fn);\nconst computeBatchAtRuntime = (deps: string[], fn: () => void) =>\n new ComputedColumn('many', deps, fn);\n\nexport interface QueryComputedArg<\n ColumnTypes,\n Shape extends Column.QueryColumns,\n> extends QueryExpressions,\n QuerySql<ColumnTypes> {\n shape: Shape;\n columnTypes: ColumnTypes;\n windows: EmptyObject;\n relations: RelationsBase;\n result: EmptyObject;\n __selectable: {\n [K in keyof Shape]: { as: string; column: Column.Pick.QueryColumn };\n };\n}\n\nexport const applyComputedColumns = (\n q: IsQuery,\n fn: ComputedOptionsFactory<never, never>,\n) => {\n (q as unknown as RecordUnknown).computeAtRuntime = computeAtRuntime;\n (q as unknown as RecordUnknown).computeBatchAtRuntime = computeBatchAtRuntime;\n\n const computed = fn(q as never);\n for (const key in computed) {\n let item = computed[key];\n if (typeof item === 'function') item = item.call(computed);\n\n if (item instanceof ComputedColumn) {\n (q as unknown as PickQueryQ).q.runtimeComputeds = {\n ...(q as unknown as PickQueryQ).q.runtimeComputeds,\n [key]: item,\n };\n } else {\n let col = item.result.value as Column | undefined;\n if (!col) {\n item.result.value = col = Object.create(\n UnknownColumn.instance,\n ) as Column;\n col.data = { ...col.data };\n }\n\n ((q as unknown as PickQueryShape).shape as Column.QueryColumns)[key] =\n col;\n\n const { data } = col;\n data.computed = item as Expression;\n data.explicitSelect = true;\n data.readOnly = true;\n\n const parse = (item.result.value as Column)._parse;\n if (parse) {\n ((q as unknown as PickQueryQ).q.defaultParsers ??= {})[key] = parse;\n }\n }\n }\n\n (q as unknown as RecordUnknown).computeAtRuntime = (\n q as unknown as RecordUnknown\n ).computeBatchAtRuntime = undefined;\n};\n\nexport const processComputedResult = (query: QueryData, result: unknown) => {\n let promises: Promise<void>[] | undefined;\n\n for (const key in query.selectedComputeds) {\n const computed = query.selectedComputeds[key];\n if (computed.kind === 'one') {\n for (const record of result as RecordUnknown[]) {\n record[key] = computed.fn(record);\n }\n } else {\n const res = computed.fn(result);\n if (Array.isArray(res)) {\n saveBatchComputed(key, result, res);\n } else {\n (promises ??= []).push(\n (res as Promise<unknown[]>).then((res) =>\n saveBatchComputed(key, result, res),\n ),\n );\n }\n }\n }\n\n if (!promises) return;\n return Promise.all(promises);\n};\n\nexport const processComputedBatches = (\n query: QueryData,\n batches: QueryBatchResult[],\n originalReturnType: QueryReturnType,\n returnType: QueryReturnType,\n tempColumns: Set<string> | undefined,\n renames: RecordString | undefined,\n key: string,\n) => {\n let promises: Promise<void>[] | undefined;\n\n const plainValue =\n originalReturnType === 'value' || originalReturnType === 'valueOrThrow';\n\n for (const computedKey in query.selectedComputeds) {\n const setAsKey = plainValue ? key : computedKey;\n\n const computed = query.selectedComputeds[computedKey];\n if (computed.kind === 'one') {\n for (const { data } of batches) {\n for (const record of data) {\n if (record) {\n record[setAsKey] = computed.fn(record);\n }\n }\n }\n } else {\n for (const { data } of batches) {\n let present;\n let blanks: Set<number> | undefined;\n if (!returnType || returnType === 'all') {\n present = data;\n } else {\n present = [];\n blanks = new Set<number>();\n for (let i = 0; i < data.length; i++) {\n if (data[i]) {\n present.push(data[i]);\n } else {\n blanks.add(i);\n }\n }\n }\n\n const res = computed.fn(present);\n if (Array.isArray(res)) {\n saveBatchComputed(setAsKey, data, res, blanks);\n } else {\n (promises ??= []).push(\n (res as Promise<unknown[]>).then((res) =>\n saveBatchComputed(setAsKey, data, res, blanks),\n ),\n );\n }\n }\n }\n }\n\n if (!promises) return;\n\n return Promise.all(promises).then(() => {\n finalizeNestedHookSelect(\n batches,\n originalReturnType,\n tempColumns,\n renames,\n key,\n );\n\n applyBatchTransforms(query, batches);\n });\n};\n\nconst saveBatchComputed = (\n key: string,\n result: unknown,\n res: unknown[],\n blanks?: Set<number>,\n) => {\n const len = (result as unknown[]).length;\n const actual = res.length + (blanks?.size || 0);\n if (len !== actual) {\n throw new Error(\n `Incorrect length of batch computed result for column ${key}. Expected ${len}, received ${actual}.`,\n );\n }\n\n if (blanks) {\n for (let i = 0, r = 0; i < len; i++) {\n if (!blanks.has(i)) {\n (result as RecordUnknown[])[i][key] = res[r++];\n }\n }\n } else {\n for (let i = 0; i < len; i++) {\n (result as RecordUnknown[])[i][key] = res[i];\n }\n }\n};\n","import { OrchidOrmInternalError } from '../errors';\nimport { Query } from '../query';\n\nexport const getPrimaryKeys = (q: Query) => {\n return (q.internal.primaryKeys ??= collectPrimaryKeys(q));\n};\n\nexport const requirePrimaryKeys = (q: Query, message: string) => {\n const primaryKeys = getPrimaryKeys(q);\n if (!primaryKeys.length) {\n throw new OrchidOrmInternalError(q, message);\n }\n return primaryKeys;\n};\n\nconst collectPrimaryKeys = (q: Query): string[] => {\n const primaryKeys = [];\n const { shape } = q.q;\n for (const key in shape) {\n if (shape[key].data.primaryKey) {\n primaryKeys.push(key);\n }\n }\n\n const pkey = q.internal.tableData.primaryKey;\n if (pkey) {\n primaryKeys.push(...pkey.columns);\n }\n\n return primaryKeys;\n};\n","import { QueryHasWhere, Where } from '../../basic-features/where/where';\nimport { Query, SelectableFromShape } from '../../query';\nimport { Column } from '../../../columns/column';\nimport {\n PickQueryScopes,\n PickQuerySelectableShapeRelationsWithData,\n} from '../../pick-query-types';\nimport { setObjectValueImmutable } from '../../../utils';\nimport { _clone } from '../../basic-features/clone/clone';\nimport { QueryDataScopes } from '../../query-data';\n\n// Scopes data stored in table instance. Doesn't change after defining a table.\nexport type QueryScopes<Keys extends string> = {\n [K in Keys]: unknown;\n};\n\nexport interface ScopeArgumentQuery<\n Table extends string | undefined,\n Shape extends Column.QueryColumns,\n> extends Where,\n PickQuerySelectableShapeRelationsWithData {\n __isQuery: true;\n table: Table;\n shape: Shape;\n __selectable: SelectableFromShape<Shape, Table>;\n}\n\nexport const _unscope = (q: Query, scope: PropertyKey): Query => {\n if (q.q.scopes) {\n q.q.scopes = { ...q.q.scopes };\n delete q.q.scopes[scope as string];\n for (const _ in q.q.scopes) {\n return q as never;\n }\n delete q.q.scopes;\n }\n\n return q as never;\n};\n\n/**\n * This feature allows defining a set of query modifiers to use it later.\n * Only [where conditions](/guide/where.html) can be set in a scope.\n * If you define a scope with name `default`, it will be applied for all table queries by default.\n *\n * ```ts\n * import { BaseTable } from './baseTable';\n *\n * export class SomeTable extends BaseTable {\n * readonly table = 'some';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * hidden: t.boolean(),\n * active: t.boolean(),\n * }));\n *\n * scopes = this.setScopes({\n * default: (q) => q.where({ hidden: false }),\n * active: (q) => q.where({ active: true }),\n * });\n * }\n *\n * const db = orchidORM(\n * { databaseURL: '...' },\n * {\n * some: SomeTable,\n * },\n * );\n *\n * // the default scope is applied for all queries:\n * const nonHiddenRecords = await db.some;\n * ```\n */\nexport class QueryScope {\n /**\n * See {@link QueryScope}\n *\n * Use the `scope` method to apply a pre-defined scope.\n *\n * ```ts\n * // use the `active` scope that is defined in the table:\n * await db.some.scope('active');\n * ```\n *\n * @param scope - name of the scope to apply\n */\n scope<T extends PickQueryScopes>(\n this: T,\n scope: keyof T['__scopes'],\n ): T & QueryHasWhere {\n const q = _clone(this);\n\n if (!q.q.scopes?.[scope as string]) {\n const s = (q.internal.scopes as QueryDataScopes)[scope as string];\n\n if (!s) throw new Error(`Scope ${scope as string} is not defined`);\n\n setObjectValueImmutable(q.q, 'scopes', scope, s);\n }\n\n return q as never;\n }\n\n /**\n * See {@link QueryScope}\n *\n * Remove conditions that were added by the scope from the query.\n *\n * ```ts\n * // SomeTable has a default scope, ignore it for this query:\n * await db.some.unscope('default');\n * ```\n *\n * @param scope - name of the scope to remove from the query\n */\n unscope<T extends PickQueryScopes>(this: T, scope: keyof T['__scopes']): T {\n return _unscope(_clone(this), scope) as never;\n }\n}\n","import { Query } from '../../query';\nimport {\n MutativeQueriesSelectRelationsSqlProp,\n MutativeQueriesSelectRelationsSqlState,\n MutativeQueriesSelectRelationsValue,\n} from './mutative-queries-select-relations.sql';\nimport { requirePrimaryKeys } from '../../query-columns/primary-keys';\nimport { _unscope } from '../../extra-features/scope/scope';\nimport { getFreeAlias, RecordString, RecordUnknown } from '../../../utils';\nimport {\n SelectAsValue,\n SelectItem,\n} from '../../basic-features/select/select.sql';\nimport { maybeWrappedThen } from '../../then/then';\nimport { AdapterBase } from 'pqb/internal';\n\nexport const checkIfNeedResultAllForMutativeQueriesSelectRelations = (\n sql: MutativeQueriesSelectRelationsSqlProp,\n): MutativeQueriesSelectRelationsValue | undefined => {\n return sql.mutativeQueriesSelectRelationsState?.value;\n};\n\nexport const checkIfShouldReleaseSavepointForMutativeQueriesSelectRelations = (\n sql: MutativeQueriesSelectRelationsSqlProp,\n): MutativeQueriesSelectRelationsValue | undefined => {\n return sql.mutativeQueriesSelectRelationsState?.value;\n};\n\nexport const loadMutativeQueriesSelectRelations = (\n sql: MutativeQueriesSelectRelationsSqlProp,\n result: unknown,\n adapter: AdapterBase,\n startingSavepoint?: string,\n renames?: RecordString,\n): Promise<void> | undefined =>\n sql.mutativeQueriesSelectRelationsState?.value\n ? loadRelations(\n sql.mutativeQueriesSelectRelationsState,\n result,\n adapter,\n startingSavepoint,\n renames,\n )\n : undefined;\n\nexport const loadRelations = async (\n state: MutativeQueriesSelectRelationsSqlState,\n result: unknown,\n adapter: AdapterBase,\n startingSavepoint?: string,\n renames?: RecordString,\n): Promise<void> => {\n const q = state.query as Query;\n\n const primaryKeys = requirePrimaryKeys(\n q,\n 'Cannot select a relation of a table that has no primary keys',\n );\n const selectQuery = _unscope(q, 'nonDeleted');\n selectQuery.q.type = selectQuery.q.returnType = undefined;\n\n const matchSourceTableIds: RecordUnknown = {};\n for (const pkey of primaryKeys) {\n matchSourceTableIds[pkey] = {\n in: (result as RecordUnknown[]).map((row) => row[pkey]),\n };\n }\n (selectQuery.q.and ??= []).push(matchSourceTableIds);\n\n const relationsSelect = state.value as Record<string, Query>;\n\n const selectAs: SelectAsValue = { ...relationsSelect };\n\n const select: SelectItem[] = [{ selectAs }];\n\n const relationKeyAliases = primaryKeys.map((key) => {\n if (key in selectAs) {\n const as = getFreeAlias(selectAs, key);\n selectAs[as] = key;\n return as;\n } else {\n select.push(key);\n return key;\n }\n });\n\n selectQuery.q.select = select;\n\n const relationsResult = (await maybeWrappedThen.call(\n selectQuery,\n undefined,\n async (err) => {\n await adapter.arrays(`ROLLBACK TO SAVEPOINT \"${startingSavepoint}\"`);\n throw err;\n },\n startingSavepoint,\n )) as RecordUnknown[];\n\n for (const row of result as RecordUnknown[]) {\n const relationRow = relationsResult.find((relationRow) => {\n return !primaryKeys.some(\n (key, i) => relationRow[relationKeyAliases[i]] !== row[key],\n );\n });\n if (relationRow) {\n Object.assign(row, relationRow);\n }\n }\n\n // when relation is loaded under the same key as a transient primary key:\n // no need to rename it because the relation was already loaded under the key name.\n if (renames) {\n for (const key in relationsSelect) {\n if (key in renames) {\n delete renames[key];\n }\n }\n }\n};\n","import { Query, QueryReturnType } from '../query';\nimport {\n _runAfterCommitHooks,\n AsyncTransactionState,\n commitSql,\n isInUserTransaction,\n} from '../basic-features/transaction/transaction';\nimport { processComputedResult } from '../extra-features/computed/computed';\nimport { Column, ColumnsShape } from '../../columns';\nimport { HookPurpose } from '../extra-features/hooks/hooks.sql';\nimport { getValueKey } from '../basic-features/get/get-value-key';\nimport {\n AdapterBase,\n AfterCommitHook,\n QueryResult,\n} from '../../adapters/adapter';\nimport {\n callWithThis,\n emptyArray,\n MaybePromise,\n RecordString,\n RecordUnknown,\n ShallowSimplify,\n} from '../../utils';\nimport {\n ColumnParser,\n ColumnsParsers,\n getQueryParsers,\n} from '../query-columns/query-column-parsers';\nimport { _clone } from '../basic-features/clone/clone';\nimport { NotFoundError, QueryError } from '../errors';\nimport { SingleSql, SingleSqlItem, Sql } from '../sql/sql';\nimport { applyTransforms } from '../extra-features/data-transform/transform';\nimport { HandleResult, QueryAfterHook, QueryBeforeHook } from '../query-data';\nimport { PickQueryReturnType } from '../pick-query-types';\nimport {\n AsyncState,\n setCurrentDefaultSchema,\n} from '../basic-features/storage/storage';\nimport {\n checkIfNeedResultAllForMutativeQueriesSelectRelations,\n checkIfShouldReleaseSavepointForMutativeQueriesSelectRelations,\n loadMutativeQueriesSelectRelations,\n} from '../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.result-handler';\n\n// This is a standard Promise['then'] method\n// copied from TS standard library because the original `then` is not decoupled from the Promise\nexport interface QueryThen<T> {\n <TResult1 = T, TResult2 = never>(\n onfulfilled?: (value: T) => TResult1 | PromiseLike<TResult1>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onrejected?: (reason: any) => TResult2 | PromiseLike<TResult2>,\n ): Promise<TResult1 | TResult2>;\n} // This is a standard Promise['catch'] method\n\nexport type QueryThenShallowSimplify<T> = QueryThen<ShallowSimplify<T>>;\n\nexport type QueryThenShallowSimplifyArr<T> = QueryThen<ShallowSimplify<T>[]>;\n\nexport type QueryThenShallowSimplifyOptional<T> = QueryThen<\n ShallowSimplify<T> | undefined\n>;\n\nexport type QueryThenByQuery<\n T extends PickQueryReturnType,\n Result extends Column.QueryColumns,\n> = T['returnType'] extends undefined | 'all'\n ? QueryThenShallowSimplifyArr<ColumnsShape.Output<Result>>\n : T['returnType'] extends 'one'\n ? QueryThenShallowSimplifyOptional<ColumnsShape.Output<Result>>\n : T['returnType'] extends 'oneOrThrow'\n ? QueryThenShallowSimplify<ColumnsShape.Output<Result>>\n : T['returnType'] extends 'value'\n ? QueryThen<Result['value']['outputType'] | undefined>\n : T['returnType'] extends 'valueOrThrow'\n ? QueryThen<Result['value']['outputType']>\n : T['returnType'] extends 'rows'\n ? QueryThen<ColumnsShape.Output<Result>[keyof Result][][]>\n : T['returnType'] extends 'pluck'\n ? QueryThen<Result['pluck']['outputType'][]>\n : QueryThen<void>;\n\nexport type QueryThenByReturnType<\n T extends QueryReturnType,\n Result extends Column.QueryColumns,\n> = T extends undefined | 'all'\n ? QueryThenShallowSimplifyArr<ColumnsShape.Output<Result>>\n : T extends 'one'\n ? QueryThenShallowSimplifyOptional<ColumnsShape.Output<Result>>\n : T extends 'oneOrThrow'\n ? QueryThenShallowSimplify<ColumnsShape.Output<Result>>\n : T extends 'value'\n ? QueryThen<Result['value']['outputType'] | undefined>\n : T extends 'valueOrThrow'\n ? QueryThen<Result['value']['outputType']>\n : T extends 'rows'\n ? QueryThen<ColumnsShape.Output<Result>[keyof Result][][]>\n : T extends 'pluck'\n ? QueryThen<Result['pluck']['outputType'][]>\n : QueryThen<void>;\n\n// copied from TS standard library because the original `catch` is not decoupled from the Promise\nexport interface QueryCatch {\n <Q, TResult = never>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this: { then: (onfulfilled?: (value: Q) => any) => any },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onrejected?: (reason: any) => TResult | PromiseLike<TResult>,\n ): Promise<Q | TResult>;\n}\n\nexport const queryMethodByReturnType: {\n [K in string]: 'query' | 'arrays';\n} = {\n undefined: 'query',\n all: 'query',\n rows: 'arrays',\n pluck: 'arrays',\n one: 'query',\n oneOrThrow: 'query',\n value: 'arrays',\n valueOrThrow: 'arrays',\n void: 'arrays',\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Resolve = (result: any) => any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Reject = (error: any) => any;\n\nexport interface QueryCatchers {\n catchUniqueError<ThenResult, CatchResult>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this: { then: (onfulfilled?: (value: ThenResult) => any) => any },\n fn: (reason: QueryError) => CatchResult,\n ): Promise<ThenResult | CatchResult>;\n}\n\nexport class Then implements QueryCatchers {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n catch(this: Query, fn: (reason: any) => unknown) {\n const q = _clone(this as unknown as Query);\n q.q.catch = true;\n return q.then(undefined, fn);\n }\n\n catchUniqueError(fn: (reason: QueryError) => unknown) {\n const q = _clone(this as unknown as Query);\n q.q.catch = true;\n return q.then(undefined, (err) => {\n if (err instanceof QueryError && err.isUnique) {\n return fn(err);\n } else {\n throw err;\n }\n }) as never;\n }\n}\n\n// For storing error with the stacktrace leading to the code which calls `await query`,\n// using it later when catching query error.\nlet queryError: Error = undefined as unknown as Error;\n\n// `query.then` getter: it must be a getter to store the error with stacktrace prior to executing `await`.\nexport const getThen = function (): (\n this: Query,\n resolve?: Resolve,\n reject?: Reject,\n) => Promise<unknown> {\n queryError = new Error();\n return maybeWrappedThen;\n};\n\nObject.defineProperty(Then.prototype, 'then', {\n configurable: true,\n get: getThen,\n set(value) {\n Object.defineProperty(this, 'then', {\n value,\n });\n },\n});\n\nexport function maybeWrappedThen(\n this: Query,\n resolve?: Resolve,\n reject?: Reject,\n parentSavepoint?: string,\n): Promise<unknown> {\n const { q } = this;\n\n const shouldCatch = q.catch;\n\n let beforeActionHooks: QueryBeforeHook[] | undefined;\n let afterHooks: QueryAfterHook[] | undefined;\n let afterSaveHooks: QueryAfterHook[] | undefined;\n let afterCommitHooks: QueryAfterHook[] | undefined;\n let afterSaveCommitHooks: QueryAfterHook[] | undefined;\n if (q.type) {\n if (q.type === 'insert') {\n beforeActionHooks = q.beforeCreate;\n afterHooks = q.afterCreate;\n afterSaveHooks = q.afterSave;\n afterCommitHooks = q.afterCreateCommit;\n afterSaveCommitHooks = q.afterSaveCommit;\n } else if (q.type === 'update') {\n beforeActionHooks = q.beforeUpdate;\n afterHooks = q.afterUpdate;\n afterSaveHooks = q.afterSave;\n afterCommitHooks = q.afterUpdateCommit;\n afterSaveCommitHooks = q.afterSaveCommit;\n } else if (q.type === 'upsert') {\n if (q.upsertSecond) {\n beforeActionHooks = q.beforeCreate;\n } else if (q.upsertUpdate && q.updateData) {\n beforeActionHooks = q.beforeUpdate;\n afterHooks = q.afterUpdate;\n afterSaveHooks = q.afterSave;\n afterCommitHooks = q.afterUpdateCommit;\n afterSaveCommitHooks = q.afterSaveCommit;\n }\n } else if (q.type === 'delete') {\n beforeActionHooks = q.beforeDelete;\n afterHooks = q.afterDelete;\n afterCommitHooks = q.afterDeleteCommit;\n }\n }\n\n const { before } = q;\n const beforeHooks =\n before && beforeActionHooks\n ? [...before, ...beforeActionHooks]\n : before\n ? before\n : beforeActionHooks;\n\n const state = this.internal.asyncStorage.getStore();\n if (\n (q.wrapInTransaction || (q.selectRelation && q.type) || afterHooks) &&\n !state?.transactionAdapter\n ) {\n return this.transaction(\n () =>\n new Promise((resolve, reject) => {\n const state =\n this.internal.asyncStorage.getStore() as AsyncTransactionState;\n return then(\n this,\n state.transactionAdapter,\n state,\n beforeHooks,\n afterHooks,\n afterSaveHooks,\n afterCommitHooks,\n afterSaveCommitHooks,\n resolve,\n reject,\n shouldCatch,\n parentSavepoint,\n );\n }),\n ).then(resolve, reject);\n } else {\n return then(\n this,\n state?.transactionAdapter || this.q.adapter,\n state,\n beforeHooks,\n afterHooks,\n afterSaveHooks,\n afterCommitHooks,\n afterSaveCommitHooks,\n resolve,\n reject,\n shouldCatch,\n parentSavepoint,\n );\n }\n}\n\nconst queriesNames: RecordString = {};\nlet nameI = 0;\n\nconst callAfterHook = function (\n this: [result: unknown[], q: Query],\n cb: QueryAfterHook,\n): Promise<unknown> | unknown {\n return cb(this[0], this[1]);\n};\n\nconst beginSql: SingleSqlItem = { text: 'BEGIN' };\n\nconst then = async (\n q: Query,\n adapter: AdapterBase,\n state?: AsyncState,\n beforeHooks?: QueryBeforeHook[],\n afterHooks?: QueryAfterHook[],\n afterSaveHooks?: QueryAfterHook[],\n afterCommitHooks?: QueryAfterHook[],\n afterSaveCommitHooks?: QueryAfterHook[],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resolve?: (result: any) => any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n reject?: (error: any) => any,\n shouldCatch?: boolean,\n parentSavepoint?: string,\n): Promise<unknown> => {\n const { q: query } = q;\n\n let sql: (Sql & { name?: string }) | undefined;\n let logData: unknown | undefined;\n const log = state?.log ?? query.log;\n setCurrentDefaultSchema(state?.schema);\n\n // save error to a local variable before async operations\n const localError = queryError;\n\n try {\n if (beforeHooks) {\n await Promise.all(beforeHooks.map(callWithThis, q));\n }\n\n const localSql = (sql = q.toSQL(true));\n\n if (q.q.dynamicBefore) {\n let promises: Promise<unknown>[] | undefined;\n\n for (const data of q.q.dynamicBefore) {\n if (data.before) {\n for (const before of data.before) {\n const promise = before(q);\n if (promise) (promises ??= []).push(promise);\n }\n }\n }\n\n if (promises) await Promise.all(promises);\n }\n\n const { tableHook, cteHooks } = sql;\n const { returnType = 'all' } = query;\n const tempReturnType =\n tableHook?.select ||\n cteHooks?.hasSelect ||\n (returnType === 'rows' && q.q.batchParsers) ||\n checkIfNeedResultAllForMutativeQueriesSelectRelations(sql)\n ? 'all'\n : returnType;\n\n let result: unknown;\n let queryResult: QueryResult;\n let cteData: Record<string, unknown[]> | undefined;\n\n const startingSavepoint = setCatchingSavepoint(\n !parentSavepoint && shouldCatch && state,\n );\n\n const releasingSavepoint =\n checkIfShouldReleaseSavepointForMutativeQueriesSelectRelations(sql) ||\n parentSavepoint\n ? undefined\n : startingSavepoint;\n\n if ('text' in sql) {\n if (query.autoPreparedStatements) {\n sql.name =\n queriesNames[sql.text] ||\n (queriesNames[sql.text] = (nameI++).toString(36));\n }\n\n if (log) {\n logData = log.beforeQuery(sql);\n }\n\n const method = queryMethodByReturnType[tempReturnType];\n queryResult = await execQuery(\n adapter,\n method,\n sql,\n startingSavepoint,\n releasingSavepoint,\n );\n const { runAfterQuery } = sql;\n\n if (log) {\n log.afterQuery(sql, logData);\n // set sql to be undefined to prevent logging on error in case if afterHooks throws\n sql = undefined;\n }\n\n if (runAfterQuery) {\n const r = await runAfterQuery(queryResult);\n if (r) {\n return resolve ? resolve(r.result) : r.result;\n }\n }\n\n if (localSql.cteHooks?.hasSelect) {\n const lastRowI = queryResult.rows.length - 1;\n const lastFieldI = queryResult.fields.length - 1;\n\n const fieldName =\n method === 'query' ? queryResult.fields[lastFieldI].name : lastFieldI;\n cteData = queryResult.rows[lastRowI][fieldName];\n queryResult.fields.length = lastFieldI;\n queryResult.rowCount--;\n queryResult.rows.length = lastRowI;\n\n if (method === 'query') {\n for (const row of queryResult.rows) {\n delete row[fieldName];\n }\n } else {\n for (const row of queryResult.rows) {\n row.length = lastFieldI;\n }\n }\n }\n\n result = query.handleResult(q, tempReturnType, queryResult, localSql);\n } else {\n // autoPreparedStatements in batch doesn't seem to make sense\n\n const queryMethod = queryMethodByReturnType[tempReturnType] as 'query';\n\n const queryBatch = async (batch: SingleSql[]) => {\n const last = batch.length - 1;\n for (let i = 0; i <= last; i++) {\n sql = batch[i];\n\n if (log) {\n logData = log.beforeQuery(sql);\n }\n\n const result = await execQuery(\n adapter,\n queryMethod,\n sql,\n i === 0 ? startingSavepoint : undefined,\n i === last ? releasingSavepoint : undefined,\n );\n\n if (queryResult) {\n queryResult.rowCount += result.rowCount;\n queryResult.rows.push(...result.rows);\n } else {\n queryResult = result;\n }\n\n if (log) {\n log.afterQuery(sql, logData);\n }\n }\n\n // set sql to be undefined to prevent logging on error in case if afterHooks throws\n sql = undefined;\n };\n\n if (state) {\n await queryBatch(sql.batch);\n } else {\n const { batch } = sql;\n\n if (log) logData = log.beforeQuery(beginSql);\n await adapter.transaction(async () => {\n if (log) log.afterQuery(beginSql, logData);\n const res = await queryBatch(batch);\n if (log) logData = log.beforeQuery(commitSql);\n return res;\n });\n if (log) log.afterQuery(commitSql, logData);\n }\n\n // runAfterQuery is not called because it's only for upsert,\n // while this batch branch is for batch insert\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n result = query.handleResult(q, tempReturnType, queryResult!, localSql);\n }\n\n // TODO: move computeds after parsing\n let tempColumns: Set<string> | undefined;\n let renames: RecordString | undefined;\n if (tableHook?.select) {\n for (const [\n column,\n { as, temp, notLoaded },\n ] of tableHook.select.entries()) {\n if (notLoaded) continue;\n\n if (as) {\n (renames ??= {})[column] = as;\n }\n\n if (temp) {\n (tempColumns ??= new Set())?.add(temp);\n }\n }\n\n if (renames) {\n for (const record of result as RecordUnknown[]) {\n for (const a in renames) {\n const value = record[renames[a]];\n record[renames[a]] = record[a];\n record[a] = value;\n }\n }\n }\n\n if (query.selectedComputeds) {\n const promise = processComputedResult(query, result);\n if (promise) await promise;\n }\n }\n\n let cteAfterHooks: (() => unknown)[] | undefined;\n let cteAfterCommitHooks: (() => unknown)[] | undefined;\n if (localSql.cteHooks) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const addedAfterHooks = new Set<(data: unknown, query: any) => unknown>();\n const addedAfterCommitHooks = new Set<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (data: unknown, query: any) => unknown\n >();\n\n interface TableData {\n data: {\n [K in HookPurpose | 'Save']?: unknown[];\n };\n }\n\n const dataPerSubQuery = new Map<string, TableData>();\n\n for (const cteName in localSql.cteHooks.tableHooks) {\n const hook = localSql.cteHooks.tableHooks[cteName];\n\n const data = cteData?.[cteName];\n if (!data && hook.throwOnNotFound) {\n throw new NotFoundError(q, `Record for cte ${cteName} is not found`);\n }\n\n const purpose = hook.tableHook.hookPurpose as HookPurpose | undefined;\n if (!purpose) continue;\n\n let tableData = dataPerSubQuery.get(hook.table);\n if (!tableData) {\n tableData = { data: {} };\n dataPerSubQuery.set(hook.table, tableData);\n }\n\n if (data) {\n const existing = tableData.data[purpose];\n tableData.data[purpose] = existing ? [...existing, ...data] : data;\n\n if (purpose === 'Create' || purpose === 'Update') {\n tableData.data.Save = tableData.data.Save\n ? [...tableData.data.Save, ...data]\n : data;\n }\n\n let hasParsers: boolean | undefined;\n const parsers: ColumnsParsers = {};\n for (const key in hook.shape) {\n if ((hook.shape[key] as Column)._parse) {\n hasParsers = true;\n parsers[key] = (hook.shape[key] as Column)._parse;\n }\n }\n\n if (hasParsers) {\n for (const row of data) {\n parseRecord(parsers, row);\n }\n }\n }\n }\n\n for (const cteName in localSql.cteHooks.tableHooks) {\n const hook = localSql.cteHooks.tableHooks[cteName];\n const { tableHook } = hook;\n\n const purpose = tableHook.hookPurpose as HookPurpose | undefined;\n const tableData = dataPerSubQuery.get(hook.table);\n if (!purpose || !tableData) continue;\n\n for (const purpose of ['Create', 'Update', 'Delete', 'Save'] as const) {\n const data = tableData.data[purpose];\n if (!data) continue;\n\n const afterKey = `after${purpose}` as const;\n const after = tableHook[afterKey];\n if (after) {\n const arr = (cteAfterHooks ??= []);\n for (const fn of after) {\n const hookData = addedAfterHooks.has(fn);\n if (!hookData) {\n addedAfterHooks.add(fn);\n arr.push(() => fn(data, q));\n }\n }\n }\n\n const afterCommitKey = `after${purpose}Commit` as const;\n const afterCommit = tableHook[afterCommitKey];\n if (afterCommit) {\n const arr = (cteAfterHooks ??= []);\n for (const fn of afterCommit) {\n const hookData = addedAfterCommitHooks.has(fn);\n if (!hookData) {\n addedAfterCommitHooks.add(fn);\n arr.push(() => fn(data, q));\n }\n }\n }\n }\n }\n }\n\n const queryAfter = query.after;\n const hasAfterHook =\n afterHooks ||\n afterSaveHooks ||\n afterCommitHooks ||\n afterSaveCommitHooks ||\n queryAfter ||\n cteAfterHooks ||\n cteAfterCommitHooks;\n if (hasAfterHook) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (!queryResult!.rowCount) {\n afterHooks =\n afterSaveHooks =\n afterCommitHooks =\n afterSaveCommitHooks =\n undefined;\n }\n\n if (afterHooks || afterSaveHooks || queryAfter || cteAfterHooks) {\n const args = [result, q];\n await Promise.all(\n [\n ...(afterHooks || emptyArray),\n ...(afterSaveHooks || emptyArray),\n ...(queryAfter || emptyArray),\n ...(cteAfterHooks || emptyArray),\n ].map(callAfterHook, args),\n );\n }\n\n // afterCommitHooks are executed later after transaction commit,\n // or, if we don't have transaction, they are executed intentionally after other after hooks\n if (afterCommitHooks || afterSaveCommitHooks || cteAfterCommitHooks) {\n const afterActionAndSaveCommit = (afterCommitHooks ||\n afterSaveCommitHooks) && [\n ...(afterCommitHooks || emptyArray),\n ...(afterSaveCommitHooks || emptyArray),\n ];\n\n if (isInUserTransaction(state)) {\n if (afterActionAndSaveCommit) {\n (state.afterCommit ??= []).push(\n result as unknown[],\n q,\n afterActionAndSaveCommit,\n );\n }\n\n if (cteAfterCommitHooks) {\n (state.afterCommit ??= []).push(\n result as unknown[],\n q,\n cteAfterCommitHooks,\n );\n }\n } else {\n // result can be transformed later, reference the current form to use it in hook.\n const localResult = result as unknown[];\n // to suppress throws of sync afterCommit hooks.\n queueMicrotask(async () => {\n const promises: (unknown | Promise<unknown>)[] = [];\n if (afterActionAndSaveCommit) {\n for (const fn of afterActionAndSaveCommit) {\n try {\n promises.push(\n (fn as unknown as AfterCommitHook)(localResult, q),\n );\n } catch (err) {\n promises.push(Promise.reject(err));\n }\n }\n }\n\n if (cteAfterCommitHooks) {\n for (const fn of cteAfterCommitHooks) {\n try {\n promises.push(fn());\n } catch (err) {\n promises.push(Promise.reject(err));\n }\n }\n }\n\n await _runAfterCommitHooks(\n localResult,\n promises,\n () =>\n [\n ...(afterCommitHooks || emptyArray),\n ...(cteAfterCommitHooks || emptyArray),\n ].map((h) => h.name),\n q.q.catchAfterCommitErrors,\n );\n });\n }\n }\n }\n\n const promise =\n loadMutativeQueriesSelectRelations(\n localSql,\n result,\n adapter,\n startingSavepoint,\n renames,\n ) ||\n /**\n * In case when we have MutativeQueriesSelectRelations, the first query does insert/update/delete,\n * it must not run batchParsers because it doesn't have the data yet.\n * The second query loads data and performs batchParsers.\n */\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n parseBatch(q, queryResult!);\n\n if (promise) {\n await promise;\n }\n\n // can be set by hooks or by computed columns\n if (tableHook?.select || tempReturnType !== returnType) {\n if (renames) {\n // to not mutate the original result because it's passed to hooks\n const renamedResult = Array.from({\n length: (result as RecordUnknown[]).length,\n });\n\n for (\n let i = 0, len = (result as RecordUnknown[]).length;\n i < len;\n ++i\n ) {\n const record = (result as RecordUnknown[])[i];\n const renamedRecord = (renamedResult[i] = { ...record });\n for (const a in renames) {\n // TODO: no need to assign if the one or another is in `tempColumns`\n renamedRecord[a] = record[renames[a]];\n renamedRecord[renames[a]] = record[a];\n }\n }\n\n result = renamedResult;\n }\n\n result = filterResult(\n q,\n returnType,\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n queryResult!,\n result,\n tempColumns,\n hasAfterHook,\n );\n }\n\n if (query.transform) {\n result = applyTransforms(query, returnType, query.transform, result);\n }\n\n return resolve ? resolve(result) : result;\n } catch (err) {\n let error;\n if (err instanceof adapter.errorClass) {\n if (\n // a special not found error thrown by 'not-found'::int\n 'code' in err &&\n err.code === '22P02' &&\n err.message.endsWith(`\"not-found\"`)\n ) {\n error = new NotFoundError(q);\n } else {\n error = new (q.error as unknown as new () => QueryError)();\n adapter.assignError(error, err);\n }\n error.cause = localError;\n } else {\n error = err;\n if (error instanceof Error) {\n error.cause = localError;\n }\n }\n\n // shift stack by one to point to the calling code\n const stack = localError.stack;\n if (stack) {\n const from = stack.indexOf('\\n');\n if (from !== -1) {\n const to = stack.indexOf('\\n', from + 1);\n if (to !== -1) {\n localError.stack = stack.slice(0, from) + stack.slice(to);\n }\n }\n }\n\n if (log && sql) {\n log.onError(error as Error, sql as SingleSqlItem, logData);\n }\n\n if (reject) return reject(error);\n\n throw error;\n }\n};\n\nconst setCatchingSavepoint = (\n catchTrx: AsyncState | false | undefined,\n): string | undefined => {\n return catchTrx\n ? `s${(catchTrx.catchI = (catchTrx.catchI || 0) + 1)}`\n : undefined;\n};\n\n/**\n * Executes a query and in the case there are rows, but nothing was selected,\n * it populates the response with empty objects,\n * because user might expect empty objects to be returned for an empty select.\n */\nconst execQuery = (\n adapter: AdapterBase,\n method: 'query' | 'arrays',\n sql: SingleSql,\n startingSavepoint: string | undefined,\n releasingSavepoint?: string | undefined,\n) => {\n return (\n adapter[method as 'query'](\n sql.text,\n sql.values,\n startingSavepoint,\n releasingSavepoint,\n ) as Promise<QueryResult>\n ).then((result) => {\n if (result.rowCount && !result.rows.length) {\n result.rows.length = result.rowCount;\n result.rows.fill({});\n }\n\n return result;\n });\n};\n\nexport const handleResult: HandleResult = (\n q,\n returnType,\n result,\n sql,\n isSubQuery,\n) => {\n const parsers = getQueryParsers(q, sql.tableHook?.select);\n\n switch (returnType) {\n case 'all': {\n if (q.q.throwOnNotFound && result.rows.length === 0)\n throw new NotFoundError(q);\n\n const { rows } = result;\n\n if (parsers) {\n for (const row of rows) {\n parseRecord(parsers, row);\n }\n }\n\n return rows;\n }\n case 'one': {\n const { rows } = result;\n if (!rows.length) return;\n\n if (parsers) parseRecord(parsers, rows[0]);\n\n return rows[0];\n }\n case 'oneOrThrow': {\n const { rows } = result;\n if (!rows.length) throw new NotFoundError(q);\n\n if (parsers) parseRecord(parsers, rows[0]);\n\n return rows[0];\n }\n case 'rows': {\n const { rows } = result;\n\n if (parsers) {\n parseRows(parsers, result.fields, rows);\n }\n\n return rows;\n }\n case 'pluck': {\n const { rows } = result;\n\n parsePluck(parsers, isSubQuery, rows);\n\n return rows;\n }\n case 'value': {\n const { rows } = result;\n\n return rows[0]?.[0] !== undefined\n ? parseValue(rows[0][0], parsers)\n : q.q.notFoundDefault;\n }\n case 'valueOrThrow': {\n if (q.q.returning) {\n if (q.q.throwOnNotFound && result.rowCount === 0) {\n throw new NotFoundError(q);\n }\n return result.rowCount;\n }\n\n const { rows } = result;\n\n if (rows[0]?.[0] === undefined) throw new NotFoundError(q);\n return parseValue(rows[0][0], parsers);\n }\n case 'void': {\n return;\n }\n }\n};\n\nconst parseBatch = (q: Query, queryResult: QueryResult): MaybePromise<void> => {\n let promises: Promise<void>[] | undefined;\n\n if (q.q.batchParsers) {\n for (const parser of q.q.batchParsers) {\n const res = parser.fn(parser.path, queryResult);\n if (res) (promises ??= []).push(res);\n }\n }\n\n return promises && (Promise.all(promises) as never);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const parseRecord = (parsers: ColumnsParsers, row: any): unknown => {\n for (const key in parsers) {\n if (key in row) {\n row[key] = (parsers[key] as ColumnParser)(row[key]);\n }\n }\n return row;\n};\n\nconst parseRows = (\n parsers: ColumnsParsers,\n fields: { name: string }[],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rows: any[],\n): void => {\n for (let i = fields.length - 1; i >= 0; i--) {\n const parser = parsers[fields[i].name];\n if (parser) {\n for (const row of rows) {\n row[i] = parser(row[i]);\n }\n }\n }\n};\n\nconst parsePluck = (\n parsers: ColumnsParsers | undefined,\n isSubQuery: true | undefined,\n rows: unknown[],\n): void => {\n const pluck = parsers?.pluck;\n if (pluck) {\n for (let i = 0; i < rows.length; i++) {\n rows[i] = pluck(isSubQuery ? rows[i] : (rows[i] as RecordUnknown)[0]);\n }\n } else if (!isSubQuery) {\n for (let i = 0; i < rows.length; i++) {\n rows[i] = (rows[i] as RecordUnknown)[0];\n }\n }\n};\n\nconst parseValue = (value: unknown, parsers?: ColumnsParsers): unknown => {\n const parser = parsers?.[getValueKey];\n return parser ? parser(value) : value;\n};\n\nexport const filterResult = (\n q: Query,\n returnType: QueryReturnType,\n queryResult: QueryResult,\n result: unknown,\n tempColumns: Set<string> | undefined,\n // result should not be mutated when having hooks, because hook may want to access the data later\n hasAfterHook?: unknown,\n): unknown => {\n if (returnType === 'all') {\n return filterAllResult(result, tempColumns, hasAfterHook);\n }\n\n if (returnType === 'oneOrThrow' || returnType === 'one') {\n let row = (result as RecordUnknown[])[0];\n if (!row) {\n if (returnType === 'oneOrThrow') throw new NotFoundError(q);\n return undefined;\n } else if (!tempColumns?.size) {\n return row;\n } else {\n if (hasAfterHook) row = { ...row };\n\n for (const column of tempColumns) {\n delete row[column];\n }\n\n return row;\n }\n }\n\n if (returnType === 'value') {\n return (result as RecordUnknown[])[0]?.[\n getFirstResultKey(q, queryResult) as string\n ];\n }\n\n if (returnType === 'valueOrThrow') {\n if (q.q.returning) {\n return queryResult.rowCount;\n }\n\n const row = (result as RecordUnknown[])[0];\n if (!row) throw new NotFoundError(q);\n\n return row[getFirstResultKey(q, queryResult) as string];\n }\n\n if (returnType === 'pluck') {\n const key = getFirstResultKey(q, queryResult) as string;\n return (result as RecordUnknown[]).map((row) => row[key]);\n }\n\n if (returnType === 'rows') {\n result = filterAllResult(result, tempColumns, hasAfterHook);\n return (result as RecordUnknown[]).map((record) => Object.values(record));\n }\n\n return;\n};\n\nconst getFirstResultKey = (q: Query, queryResult: QueryResult) => {\n if (q.q.select) {\n return queryResult.fields[0].name;\n } else {\n for (const key in q.q.selectedComputeds) {\n return key;\n }\n }\n return;\n};\n\nconst filterAllResult = (\n result: unknown,\n tempColumns: Set<string> | undefined,\n hasAfterHook: unknown,\n) => {\n if (tempColumns?.size) {\n if (hasAfterHook) {\n return (result as RecordUnknown[]).map((data) => {\n const record = { ...data };\n for (const key of tempColumns) {\n delete record[key];\n }\n return record;\n });\n } else {\n for (const record of result as RecordUnknown[]) {\n for (const key of tempColumns) {\n delete record[key];\n }\n }\n }\n }\n return result;\n};\n","import { PickQueryQ, PickQuerySelectableShapeAs } from '../../pick-query-types';\nimport { getFreeAlias, RecordString } from '../../../utils';\nimport { Query } from '../../query';\n\nimport { _clone } from '../clone/clone';\nimport { QueryData } from '../../query-data';\n\ninterface PickQueryDataAliases {\n aliases?: RecordString;\n}\n\nexport interface QueryDataAliases extends PickQueryDataAliases {\n as?: string;\n // stores `aliases` of the parent query object when the current query object is withing a query callback.\n outerAliases?: RecordString;\n}\n\nexport type SetQueryTableAlias<\n T extends PickQuerySelectableShapeAs,\n As extends string,\n> = {\n [K in keyof T]: K extends '__selectable'\n ? Omit<T['__selectable'], `${T['__as']}.${keyof T['shape'] & string}`> & {\n [K in keyof T['shape'] & string as `${As}.${K}`]: {\n as: K;\n column: T['shape'][K];\n };\n }\n : K extends '__as'\n ? As\n : T[K];\n};\n\nexport type AsQueryArg = PickQuerySelectableShapeAs;\n\n/** getters **/\n\nexport const getQueryAs = (q: { table?: string; q: { as?: string } }) => {\n return q.q.as || (q.table as string);\n};\n\nexport const requireQueryAs = (q: { table?: string; q: { as?: string } }) => {\n const as = getQueryAs(q);\n if (!as) throw new Error(`Table name or alias is missing`);\n return as;\n};\n\nexport const _getQueryAs = (q: Query): string | undefined => q.q.as;\n\nexport const _getQueryFreeAlias = (q: QueryDataAliases, as: string): string =>\n q.aliases ? getFreeAlias(q.aliases, as) : as;\n\nexport const _checkIfAliased = (\n q: Query,\n as: string,\n name: string,\n): boolean => {\n return q.q.aliases?.[as] === name;\n};\n\nexport const _getQueryAliasOrName = (\n q: PickQueryDataAliases,\n as: string,\n): string => {\n return q.aliases?.[as] || as;\n};\n\nexport const _getQueryOuterAliases = (\n q: QueryDataAliases,\n): RecordString | undefined => {\n return q.outerAliases;\n};\n\n/** setters **/\n\nexport const _setQueryAs = <T extends AsQueryArg, As extends string>(\n self: T,\n as: As,\n): SetQueryTableAlias<T, As> => {\n const { q } = self as unknown as PickQueryQ;\n q.as = as;\n q.aliases = {\n ...q.aliases!,\n [as]: _getQueryFreeAlias(q, as),\n };\n\n return self as never;\n};\n\nexport const _setQueryAlias = (q: Query, name: string, as: string): void => {\n q.q.aliases = { ...q.q.aliases, [as]: name };\n};\n\nexport const _setSubQueryAliases = (q: Query): void => {\n q.q.outerAliases = q.q.aliases;\n};\n\n/**\n * Is used in `chain`: combines query and its relation aliases,\n * stores the result to the relation query data.\n */\nexport const _applyRelationAliases = (\n query: Query,\n relQueryData: QueryData,\n): void => {\n const aliases = query.q.as\n ? { ...query.q.aliases }\n : { ...query.q.aliases, [query.table as string]: query.table as string };\n\n const relAliases = relQueryData.aliases!; // is always set for a relation\n for (const as in relAliases) {\n aliases[as] = getFreeAlias(aliases, as);\n }\n relQueryData.as = aliases[relQueryData.as!]; // `as` is always set for a relation;\n relQueryData.aliases = aliases;\n};\n\nexport const _copyQueryAliasToQuery = (\n fromQuery: Query,\n toQuery: Query,\n key: string,\n): string => {\n const name = _getQueryAliasOrName(fromQuery.q, key);\n if (name !== key) {\n _setQueryAlias(toQuery, name, key);\n }\n return name;\n};\n\nexport abstract class QueryAsMethods {\n /**\n * Sets table alias:\n *\n * ```ts\n * db.table.as('u').select('u.name');\n *\n * // Can be used in the join:\n * db.table.join(db.profile.as('p'), 'p.userId', 'user.id');\n * ```\n *\n * @param as - alias for the table of this query\n */\n as<T extends AsQueryArg, As extends string>(\n this: T,\n as: As,\n ): SetQueryTableAlias<T, As> {\n return _setQueryAs(_clone(this), as) as never;\n }\n}\n","import {\n IsQuery,\n Query,\n QueryTake,\n QueryTakeOptional,\n SetQueryReturnsAll,\n SetQueryReturnsRows,\n} from './query';\nimport { emptyObject, getFreeAlias, RecordUnknown } from '../utils';\nimport { OrchidOrmInternalError } from './errors';\nimport {\n PickQueryQ,\n PickQueryQAndBaseQuery,\n PickQueryResult,\n PickQueryResultReturnType,\n} from './pick-query-types';\nimport { _checkIfAliased } from './basic-features/as/as';\nimport { getValueKey } from './basic-features/get/get-value-key';\n\nimport { getClonedQueryData } from './query-data';\nimport { Column } from '../columns';\n\n/**\n * Push all elements of given array into the array in the query data,\n * set given array if there is no array yet in the query data.\n * Not mutating the array.\n *\n * @param q - query\n * @param key - key to get the array\n * @param value - array with values\n */\nexport const pushQueryArrayImmutable = <T extends PickQueryQ>(\n q: T,\n key: string,\n value: unknown[],\n): T => {\n const arr = (q.q as unknown as RecordUnknown)[key] as unknown[];\n (q.q as unknown as RecordUnknown)[key] = arr ? [...arr, ...value] : value;\n return q;\n};\n\n/**\n * Set value into the object in query data, create the object if it doesn't yet exist.\n * Does not mutate the object.\n *\n * @param q - query\n * @param object - query data key to get the object\n * @param key - object key to set the value into\n * @param value - value to set by the key\n */\nexport const setQueryObjectValueImmutable = <T extends PickQueryQ>(\n q: T,\n object: string,\n key: string,\n value: unknown,\n): T => {\n (q.q as unknown as RecordUnknown)[object] = {\n ...((q.q as unknown as RecordUnknown)[object] as RecordUnknown),\n [key]: value,\n };\n return q as unknown as T;\n};\n\n/**\n * Throw runtime error when delete or update has no where conditions\n *\n * @param q - query\n * @param method - 'update' or 'delete'\n */\nexport const throwIfNoWhere = (q: PickQueryQ, method: string): void => {\n if (!q.q.or && !q.q.and && !q.q.scopes && !q.q.all) {\n throw new OrchidOrmInternalError(\n q as Query,\n `Dangerous ${method} without conditions`,\n );\n }\n};\n\nexport const throwIfJoinLateral = (q: PickQueryQ, method: string): void => {\n if (q.q.join?.some((x) => Array.isArray(x) || ('s' in x.args && x.args.s))) {\n throw new OrchidOrmInternalError(\n q as Query,\n `Cannot join a complex query in ${method}`,\n );\n }\n};\n\nexport const throwOnReadOnlyUpdate = (\n query: unknown,\n column: Column.Pick.Data,\n key: string,\n) => {\n if (column.data.appReadOnly || column.data.readOnly) {\n throw new OrchidOrmInternalError(\n query as Query,\n 'Trying to update a readonly column',\n { column: key },\n );\n }\n};\n\n// Searches if a given name is already taken, if it is taken it suffixes it with an increment.\n// Stores an empty object under this key and this alias to the query data.\nexport const saveAliasedShape = (\n q: IsQuery,\n as: string,\n key: 'joinedShapes' | 'withShapes',\n): string => {\n const shapes = (q as Query).q[key];\n\n as = getFreeAlias(shapes, as);\n\n setQueryObjectValueImmutable(q as Query, key, as, emptyObject);\n\n return as;\n};\n\n/**\n * Extend query prototype with new methods.\n * The query and its data are cloned (with Object.create).\n *\n * @param q - query object to extend from\n * @param methods - methods to add\n */\nexport const extendQuery = <\n T extends PickQueryQAndBaseQuery,\n Methods extends RecordUnknown,\n>(\n q: T,\n methods: Methods,\n): T & Methods => {\n const base = Object.create(q.baseQuery);\n base.baseQuery = base;\n\n Object.assign(base, methods);\n\n const cloned = Object.create(base);\n cloned.q = getClonedQueryData(q.q);\n\n return cloned as T & Methods;\n};\n\nexport const _queryAll = <T extends PickQueryResult>(\n q: T,\n): SetQueryReturnsAll<T> => {\n (q as unknown as PickQueryQ).q.returnType = 'all';\n (q as unknown as PickQueryQ).q.all = true;\n return q as never;\n};\n\nexport const _queryTake = <T extends PickQueryResultReturnType>(\n query: T,\n): QueryTake<T> => {\n const q = (query as unknown as PickQueryQ).q;\n switch (q.returnType) {\n case 'valueOrThrow':\n case 'pluck':\n case 'void':\n break;\n case 'value': {\n q.returnType = 'valueOrThrow';\n break;\n }\n default: {\n q.returnType = 'oneOrThrow';\n }\n }\n return query as never;\n};\n\nexport const _queryTakeOptional = <T extends PickQueryResultReturnType>(\n query: T,\n): QueryTakeOptional<T> => {\n const q = (query as unknown as PickQueryQ).q;\n switch (q.returnType) {\n case 'value':\n case 'pluck':\n case 'void':\n break;\n case 'valueOrThrow': {\n q.returnType = 'value';\n break;\n }\n default: {\n q.returnType = 'one';\n }\n }\n return query as never;\n};\n\nexport const _queryExec = <T extends IsQuery>(q: T) => {\n (q as unknown as PickQueryQ).q.returnType = 'void';\n return q as never;\n};\n\nexport const _queryRows = <T extends PickQueryResult>(\n q: T,\n): SetQueryReturnsRows<T> => {\n (q as unknown as PickQueryQ).q.returnType = 'rows';\n return q as never;\n};\n\nexport const getFullColumnTable = (\n q: IsQuery,\n column: string,\n index: number,\n as: string | getValueKey | undefined,\n): string => {\n const table = column.slice(0, index);\n return as && table !== as && _checkIfAliased(q as Query, table, as as string)\n ? (as as string)\n : table;\n};\n","import { Query, QueryReturnType } from '../../query';\nimport { extendQuery } from '../../query.utils';\nimport { RawSql } from '../../expressions/raw-sql';\nimport { NotFoundError } from '../../errors';\nimport { applyTransforms } from '../data-transform/transform';\nimport { pushQueryValueImmutable, QueryData } from '../../query-data';\n\nconst noneResult = (q: Query, queryData: QueryData, type: QueryReturnType) => {\n if (!type || type === 'all' || type === 'rows' || type === 'pluck') {\n return [];\n } else if (type === 'one' || type === 'value' || type === 'void') {\n return queryData.notFoundDefault;\n } else if (type === 'valueOrThrow' && queryData.returning) {\n return 0;\n } else {\n throw new NotFoundError(q);\n }\n};\n\n/**\n * Methods added to the query prototype when calling {@link QueryMethods.none}.\n */\nexport const noneMethods = {\n // `then` resolves or rejects based on a return type of the query.\n // It is `async` so it returns a chainable Promise.\n async then(\n this: Query,\n resolve?: (data?: unknown) => void,\n reject?: (err: unknown) => void,\n ) {\n try {\n let result = noneResult(this, this.q, this.q.returnType);\n\n if (this.q.transform) {\n result = applyTransforms(\n this.q,\n this.q.returnType,\n this.q.transform,\n result,\n );\n }\n\n return resolve?.(result);\n } catch (err) {\n return reject?.(err);\n }\n },\n catch(this: PromiseLike<unknown>, reject?: (err: unknown) => void) {\n return this.then(undefined, reject);\n },\n};\n\nexport const _queryNone = <T>(q: T): T => {\n if (isQueryNone(q)) return q;\n\n q = extendQuery(q as Query, noneMethods) as T;\n\n pushQueryValueImmutable(q as Query, 'and', new RawSql('false'));\n\n pushQueryValueImmutable(\n q as Query,\n 'transform',\n (_: unknown, queryData: QueryData) =>\n noneResult(q as Query, queryData, queryData.returnType),\n );\n\n return q;\n};\n\nexport const isQueryNone = (q: unknown) =>\n (q as Query).then === noneMethods.then;\n","import { pushQueryArrayImmutable } from '../../query.utils';\nimport {\n pushQueryValueImmutable,\n QueryBeforeHook,\n QueryData,\n} from '../../query-data';\nimport { ToSQLQuery } from '../../sql/to-sql';\nimport { setPrepareSubQueryForSql } from '../../../columns/operators';\nimport { setRawSqlPrepareSubQueryForSql } from '../../expressions/raw-sql';\nimport { PickQueryQ } from '../../pick-query-types';\n\nexport interface SubQueryForSql extends ToSQLQuery {\n __forSql: true;\n}\n\nexport interface HasBeforeAndBeforeSet {\n before?: QueryBeforeHook[];\n beforeSet?: QueryData['beforeSet'];\n}\n\nexport interface ArgWithBeforeAndBeforeSet {\n q: HasBeforeAndBeforeSet;\n}\n\nexport interface PrepareSubQueryForSqlArg extends PickQueryQ {\n dynamicBefore?: boolean;\n}\n\nexport interface PrepareSubQueryForSql {\n (\n mainQuery: ArgWithBeforeAndBeforeSet,\n subQuery: PrepareSubQueryForSqlArg,\n ): SubQueryForSql;\n}\n\nexport const prepareSubQueryForSql: PrepareSubQueryForSql = (\n mainQuery,\n subQuery,\n) => {\n // used in DynamicRawSql because it doesn't know what callbacks does it need before executing\n if (subQuery.dynamicBefore) {\n pushQueryValueImmutable(mainQuery as never, 'dynamicBefore', subQuery.q);\n return subQuery as never;\n }\n\n let beforeAction = subQuery.q.type\n ? subQuery.q.type === 'insert'\n ? subQuery.q.beforeCreate\n : subQuery.q.type === 'update'\n ? subQuery.q.beforeUpdate\n : subQuery.q.type === 'upsert'\n ? subQuery.q.upsertUpdate && subQuery.q.updateData\n ? subQuery.q.beforeUpdate && subQuery.q.beforeCreate\n ? [...subQuery.q.beforeUpdate, ...subQuery.q.beforeCreate]\n : subQuery.q.beforeUpdate || subQuery.q.beforeCreate\n : subQuery.q.beforeCreate\n : subQuery.q.type === 'delete'\n ? subQuery.q.beforeDelete\n : undefined\n : undefined;\n\n const { beforeSet } = subQuery.q;\n beforeAction =\n beforeAction && beforeSet\n ? [...beforeAction, ...beforeSet]\n : beforeSet\n ? [...beforeSet]\n : beforeAction;\n\n if (beforeAction) {\n const newSet = new Set(mainQuery.q.beforeSet);\n const filteredHooks = [];\n for (const hook of beforeAction) {\n if (!newSet.has(hook)) {\n newSet.add(hook);\n filteredHooks.push(hook);\n }\n }\n mainQuery.q.beforeSet = newSet;\n beforeAction = filteredHooks;\n\n if (beforeAction.length) {\n pushQueryArrayImmutable(\n mainQuery as PickQueryQ,\n 'before',\n beforeAction.map((fn) => () => fn(subQuery as never)),\n );\n }\n }\n\n return subQuery as never;\n};\n\nsetPrepareSubQueryForSql(prepareSubQueryForSql);\nsetRawSqlPrepareSubQueryForSql(prepareSubQueryForSql);\n","import { IsQuery, Query, SelectableFromShape } from '../../query';\nimport { sqlQueryArgsToExpression } from '../../expressions/raw-sql';\nimport { anyShape, Column, ColumnsShape } from '../../../columns';\nimport {\n prepareSubQueryForSql,\n SubQueryForSql,\n} from '../../internal-features/sub-query/sub-query-for-sql';\nimport {\n PickQueryAs,\n PickQueryHasSelect,\n PickQueryResultAs,\n PickQuerySelectableResultInputTypeAs,\n PickQueryQ,\n PickQueryReturnType,\n PickQuerySelectable,\n PickQueryShape,\n PickQueryWithData,\n} from '../../pick-query-types';\nimport { MaybeArray, UnionToIntersection } from '../../../utils';\nimport { getQueryAs, SetQueryTableAlias } from '../as/as';\nimport {\n ColumnsParsers,\n getQueryParsers,\n} from '../../query-columns/query-column-parsers';\nimport { isExpression } from '../../expressions/expression';\nimport { _clone } from '../clone/clone';\nimport { getShapeFromSelect } from '../select/select.utils';\nimport { WithDataItems } from '../cte/cte.sql';\nimport { SQLQueryArgs } from '../../db-sql-query';\nimport { JoinedParsers, WithConfig, WithConfigs } from '../../query-data';\nimport { QueryThenByQuery } from '../../then/then';\n\nexport interface FromQuerySelf\n extends PickQuerySelectable,\n PickQueryShape,\n PickQueryReturnType,\n PickQueryWithData,\n PickQueryAs,\n PickQueryHasSelect {}\n\nexport type FromArg<T extends FromQuerySelf> =\n | IsQuery\n | Exclude<keyof T['withData'], symbol | number>;\n\nexport type FromResult<\n T extends FromQuerySelf,\n Arg extends MaybeArray<FromArg<T>>,\n> = Arg extends string\n ? T['withData'] extends WithDataItems\n ? {\n [K in keyof T]: K extends '__selectable'\n ? SelectableFromShape<T['withData'][Arg]['shape'], Arg>\n : K extends 'result'\n ? T['withData'][Arg]['shape']\n : K extends 'then'\n ? QueryThenByQuery<T, T['withData'][Arg]['shape']>\n : T[K];\n }\n : SetQueryTableAlias<T, Arg>\n : Arg extends PickQuerySelectableResultInputTypeAs\n ? {\n [K in keyof T]: K extends '__defaultSelect'\n ? keyof Arg['result']\n : K extends '__selectable'\n ? SelectableFromShape<Arg['result'], Arg['__as']>\n : K extends '__as'\n ? Arg['__as']\n : K extends 'result'\n ? Arg['result']\n : K extends 'shape'\n ? Arg['result']\n : K extends 'inputType'\n ? Arg['inputType']\n : K extends 'then'\n ? QueryThenByQuery<T, Arg['result']>\n : T[K];\n }\n : Arg extends (infer A)[]\n ? {\n [K in keyof T]: K extends '__selectable'\n ? UnionToIntersection<\n A extends string\n ? T['withData'] extends WithDataItems\n ? {\n [K in keyof T['withData'][A]['shape'] &\n string as `${A}.${K}`]: {\n as: K;\n column: T['withData'][A]['shape'][K];\n };\n }\n : never\n : A extends PickQueryResultAs\n ? {\n [K in keyof A['result'] &\n string as `${A['__as']}.${K}`]: K extends string\n ? {\n as: K;\n column: A['result'][K];\n }\n : never;\n }\n : never\n >\n : T[K];\n }\n : T;\n\nconst addWithParsers = (w: WithConfig, parsers: ColumnsParsers) => {\n for (const key in w.shape) {\n const { _parse } = w.shape[key] as Column;\n if (_parse) parsers[key] = _parse;\n }\n};\n\nexport function queryFrom<\n T extends FromQuerySelf,\n Arg extends MaybeArray<FromArg<T>>,\n>(self: T, arg: Arg): FromResult<T, Arg> {\n const data = (self as unknown as PickQueryQ).q;\n if (typeof arg === 'string') {\n data.as ||= arg;\n const w = data.withShapes?.[arg];\n data.shape = (w?.shape ?? anyShape) as ColumnsShape;\n data.runtimeComputeds = w?.computeds;\n\n const parsers: ColumnsParsers = {};\n data.defaultParsers = parsers;\n if (w) addWithParsers(w, parsers);\n\n const i = arg.indexOf('.');\n if (i !== -1) {\n data.schema = arg.slice(0, i);\n arg = arg.slice(i + 1) as Arg;\n } else if (w) {\n data.schema = undefined;\n }\n } else if (Array.isArray(arg)) {\n const { shape } = data;\n\n const joinedParsers: JoinedParsers = {};\n\n // TODO: batchParsers\n for (const item of arg) {\n if (typeof item === 'string') {\n const w = (data.withShapes as WithConfigs)[item];\n\n Object.assign(shape, w.shape);\n if (w.computeds)\n data.runtimeComputeds = { ...data.runtimeComputeds, ...w.computeds };\n\n const parsers: ColumnsParsers = {};\n joinedParsers[item] = parsers;\n addWithParsers(w, parsers);\n } else if (!isExpression(item)) {\n const sub = prepareSubQueryForSql(self as unknown as Query, item);\n Object.assign(shape, getShapeFromSelect(sub, true));\n\n const key = getQueryAs(sub);\n joinedParsers[key] = getQueryParsers(sub as unknown as Query);\n }\n }\n\n data.joinedParsers = joinedParsers;\n } else {\n const q = prepareSubQueryForSql(self as never, arg as never);\n data.as ||= q.q.as || q.table || 't';\n data.shape = getShapeFromSelect(q, true) as ColumnsShape;\n data.defaultParsers = getQueryParsers(q as unknown as Query);\n data.batchParsers = q.q.batchParsers;\n }\n\n data.from = arg as SubQueryForSql;\n data.selectAllColumns = data.scopes = undefined;\n\n return self as never;\n}\n\nexport function queryFromSql<T extends FromQuerySelf>(\n self: T,\n args: SQLQueryArgs,\n): T {\n const data = (self as unknown as PickQueryQ).q;\n data.as ||= 't';\n data.from = sqlQueryArgsToExpression(args);\n data.selectAllColumns = undefined;\n return self;\n}\n\nexport class FromMethods {\n /**\n * Set the `FROM` value, by default the table name is used.\n *\n * `from` determines a set of available tables and columns withing the query,\n * and thus it must not follow `select`, use `select` only after `from`.\n *\n * ```ts\n * // accepts sub-query:\n * db.table.from(db.otherTable.select('foo', 'bar'));\n *\n * // accepts alias of `WITH` expression:\n * q.with('withTable', db.table.select('id', 'name'))\n * .from('withTable')\n * // `select` is after `from`\n * .select('id', 'name');\n * ```\n *\n * `from` can accept multiple sources:\n *\n * ```ts\n * db.table\n * // add a `WITH` statement called `withTable\n * .with('withTable', db.table.select('one'))\n * // select from `withTable` and from `otherTable`\n * .from('withTable', db.otherTable.select('two'))\n * // source names and column names are properly typed when selecting\n * .select('withTable.one', 'otherTable.two');\n * ```\n *\n * @param arg - query or name of CTE table\n */\n from<T extends FromQuerySelf, Arg extends MaybeArray<FromArg<T>>>(\n this: T,\n arg: T['__hasSelect'] extends true\n ? '`select` must be placed after `from`'\n : Arg,\n ): FromResult<T, Arg> {\n return queryFrom(_clone(this), arg as never) as never;\n }\n\n /**\n * Set the `FROM` value with custom SQL:\n *\n * ```ts\n * const value = 123;\n * db.table.fromSql`value = ${value}`;\n * ```\n *\n * @param args - SQL expression\n */\n fromSql<T extends FromQuerySelf>(this: T, ...args: SQLQueryArgs): T {\n return queryFromSql(_clone(this), args as never) as never;\n }\n\n /**\n * Adds `ONLY` SQL keyword to the `FROM`.\n * When selecting from a parent table that has a table inheritance,\n * setting `only` will make it to select rows only from the parent table.\n *\n * ```ts\n * db.table.only();\n *\n * // disabling `only` after being enabled\n * db.table.only().only(false);\n * ```\n *\n * @param only - can be disabled by passing `false` if was enabled previously.\n */\n only<T>(this: T, only = true): T {\n const q = _clone(this);\n q.q.only = only;\n return q as T;\n }\n}\n","import { IsQuery, Query } from '../../query';\nimport { FromQuerySelf, queryFrom } from '../from/from';\nimport { _setQueryAs, SetQueryTableAlias } from '../as/as';\nimport { _clone } from '../clone/clone';\n\nexport type WrapQueryArg = FromQuerySelf;\n\nexport function queryWrap<\n T extends IsQuery,\n Q extends WrapQueryArg,\n As extends string = 't',\n>(self: T, query: Q, as: As = 't' as As): SetQueryTableAlias<Q, As> {\n return _setQueryAs(queryFrom(query, self) as never, as) as never;\n}\n\n/**\n * This function is useful when wrapping a query,\n * such as when doing `SELECT json_agg(t.*) FROM (...) AS t`,\n * to get rid of default scope conditions (WHERE deletedAt IS NULL)\n * that otherwise would be duplicated inside the `FROM` and after `AS t`.\n */\nexport function cloneQueryBaseUnscoped(query: Query) {\n const q = query.baseQuery.clone();\n q.q.or = q.q.and = q.q.scopes = undefined;\n return q;\n}\n\nexport class QueryWrap {\n wrap<T extends IsQuery, Q extends WrapQueryArg, As extends string = 't'>(\n this: T,\n query: Q,\n as?: As,\n ): SetQueryTableAlias<Q, As> {\n return queryWrap(this, _clone(query), as) as never;\n }\n}\n","import { QueryMethods } from './query-methods';\nimport { QueryData } from './query-data';\nimport { QueryBuilder } from './db';\nimport { Column } from '../columns/column';\nimport { WithDataItems } from './basic-features/cte/cte.sql';\nimport { ColumnsShape } from '../columns';\nimport { QueryInternal } from './query-internal';\nimport {\n PickQueryResult,\n PickQueryResultReturnType,\n PickQueryReturnType,\n PickQuerySelectable,\n PickQueryShape,\n PickQueryTable,\n} from './pick-query-types';\nimport { EmptyObject, RecordKeyTrue, RecordUnknown } from '../utils';\nimport { RelationsBase } from './relations';\nimport { QueryError, QueryErrorName } from './errors';\nimport { Expression } from './expressions/expression';\nimport { GetStringArg } from './basic-features/get/get.utils';\nimport { QueryHasWhere } from './basic-features/where/where';\nimport {\n QueryCatch,\n QueryThen,\n QueryThenByQuery,\n QueryThenShallowSimplify,\n QueryThenShallowSimplifyArr,\n QueryThenShallowSimplifyOptional,\n} from './then/then';\n\nexport interface DbExtension {\n name: string;\n version?: string;\n}\n\nexport interface GeneratorIgnore {\n schemas?: string[];\n enums?: string[];\n domains?: string[];\n extensions?: string[];\n tables?: string[];\n}\n\nexport interface DbDomainArg<ColumnTypes> {\n (columnTypes: ColumnTypes): Column;\n}\n\nexport interface DbDomainArgRecord {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [K: string]: DbDomainArg<any>;\n}\n\nexport type SelectableFromShape<\n Shape extends Column.QueryColumns,\n Table extends string | undefined,\n> = { [K in keyof Shape]: { as: K; column: Shape[K] } } & {\n [K in keyof Shape & string as `${Table}.${K}`]: {\n as: K;\n column: Shape[K];\n };\n};\n\nexport type QueryReturnType =\n | QueryReturnTypeAll\n | 'one'\n | 'oneOrThrow'\n | 'rows'\n | 'pluck'\n | 'value'\n | 'valueOrThrow'\n | 'void';\n\nexport type QueryReturnTypeAll = undefined | 'all';\n\nexport type QueryReturnTypeOptional = 'one' | 'value';\n\nexport interface QueryHasSelect {\n __hasSelect: true;\n}\n\nexport interface IsQuery {\n __isQuery: true;\n}\n\n// affects on typing of `chain`\nexport interface IsSubQuery {\n __subQuery: true;\n}\n\nexport interface IsQueries {\n [K: string]: IsQuery;\n}\n\nexport interface QueryOrExpression<T> {\n result: { value: Column.Pick.QueryColumnOfType<T> };\n}\n\n// query metadata that is stored only on TS side, not available in runtime\nexport interface QuerySelectable {\n [K: PropertyKey]: { as: string; column: Column.Pick.QueryColumn };\n}\n\nexport interface Query\n extends IsQuery,\n PickQueryTable,\n PickQueryShape,\n PickQuerySelectable,\n QueryMethods<unknown> {\n __as: string;\n\n // Commented out for TS optimizations purposes:\n // Single relations (belongsTo, hasOne) returns one when subQuery is true, returns many otherwise.\n // It is of type `true | undefined` when is set.\n // __subQuery: boolean;\n // Union of available full text search aliases to use in `headline` and in `order`.\n // __tsQuery?: string;\n\n // return type of `create`, `update`, `delete` depends on whether the query has select\n __hasSelect: boolean;\n // `update` and `delete` require the query to have `where`.\n // Calling `.all()` is also setting `__hasWhere` to true.\n __hasWhere: boolean;\n // Record<string, true> where keys are columns with defaults for `create` to make them optional.\n __defaults: EmptyObject;\n // Used to determine what scopes are available on the table.\n __scopes: EmptyObject;\n // union of columns to select by default or with *\n __defaultSelect: PropertyKey;\n result: Column.QueryColumns;\n withData: WithDataItems;\n baseQuery: Query;\n internal: QueryInternal;\n returnType: QueryReturnType;\n qb: QueryBuilder;\n columnTypes: unknown;\n inputType: RecordUnknown;\n q: QueryData;\n then: QueryThen<unknown>;\n catch: QueryCatch;\n windows: EmptyObject;\n relations: RelationsBase;\n relationQueries: IsQueries;\n error: new (\n message: string,\n length: number,\n name: QueryErrorName,\n ) => QueryError;\n}\n\nexport type SelectableOfType<T extends PickQuerySelectable, Type> = {\n [K in keyof T['__selectable']]: T['__selectable'][K]['column']['type'] extends Type | null\n ? K\n : never;\n}[keyof T['__selectable']];\n\nexport type SelectableOrExpressionOfType<\n T extends PickQuerySelectable,\n C extends Column.Pick.Type,\n> =\n | SelectableOfType<T, C['type']>\n | Expression<Column.Pick.QueryColumnOfType<C['type'] | null>>;\n\nexport const queryTypeWithLimitOne: RecordKeyTrue = {\n one: true,\n oneOrThrow: true,\n value: true,\n valueOrThrow: true,\n};\n\n// Change the query type to return multiple object records.\n// It wraps the query with `WhereResult` to allow updating and deleting all records when the `all` method is used.\nexport type SetQueryReturnsAll<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'all'\n : K extends 'then'\n ? QueryThenShallowSimplifyArr<ColumnsShape.Output<T['result']>>\n : T[K];\n} & QueryHasWhere;\n\nexport type SetQueryReturnsAllResult<\n T extends PickQueryResult,\n Result extends Column.QueryColumns,\n> = {\n [K in keyof T]: K extends 'returnType'\n ? 'all'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThenShallowSimplifyArr<T['result']>\n : T[K];\n} & QueryHasWhere;\n\nexport type QueryTakeOptional<T extends PickQueryResultReturnType> =\n T['returnType'] extends 'value' | 'pluck' | 'void'\n ? T\n : T['returnType'] extends 'valueOrThrow'\n ? {\n [K in keyof T]: K extends 'returnType'\n ? 'value'\n : K extends 'then'\n ? QueryThen<T['result']['value']['outputType'] | undefined>\n : T[K];\n }\n : {\n [K in keyof T]: K extends 'returnType'\n ? 'one'\n : K extends 'then'\n ? QueryThenShallowSimplifyOptional<ColumnsShape.Output<T['result']>>\n : T[K];\n };\n\nexport type QueryManyTakeOptional<T extends PickQueryResultReturnType> = {\n [K in keyof T]: K extends 'returnType'\n ? 'one'\n : K extends 'then'\n ? QueryThenShallowSimplifyOptional<ColumnsShape.Output<T['result']>>\n : T[K];\n};\n\nexport type QueryTake<T extends PickQueryResultReturnType> =\n T['returnType'] extends 'valueOrThrow' | 'pluck' | 'void'\n ? T\n : T['returnType'] extends 'value'\n ? {\n [K in keyof T]: K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<Exclude<T['result']['value']['outputType'], undefined>>\n : T[K];\n }\n : {\n [K in keyof T]: K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'then'\n ? QueryThenShallowSimplify<ColumnsShape.Output<T['result']>>\n : T[K];\n };\n\nexport type QueryManyTake<T extends PickQueryResultReturnType> = {\n [K in keyof T]: K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'then'\n ? QueryThenShallowSimplify<ColumnsShape.Output<T['result']>>\n : T[K];\n};\n\nexport type SetQueryReturnsOne<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'then'\n ? QueryThenShallowSimplify<ColumnsShape.Output<T['result']>>\n : T[K];\n};\n\nexport type SetQueryReturnsOneResult<\n T extends PickQueryResult,\n Result extends Column.QueryColumns,\n> = {\n [K in keyof T]: K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThenShallowSimplify<ColumnsShape.Output<Result>>\n : T[K];\n};\n\nexport type SetQueryReturnsRows<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'rows'\n : K extends 'then'\n ? QueryThen<ColumnsShape.Output<T['result']>[keyof T['result']][][]>\n : T[K];\n};\n\nexport type SetQueryReturnsPluck<\n T extends PickQuerySelectable,\n S extends keyof T['__selectable'] | Expression,\n> = S extends keyof T['__selectable']\n ? {\n [K in keyof T]: K extends '__hasSelect'\n ? true\n : K extends 'result'\n ? {\n pluck: T['__selectable'][S]['column'];\n }\n : K extends 'returnType'\n ? 'pluck'\n : K extends 'then'\n ? QueryThen<T['__selectable'][S]['column']['outputType'][]>\n : T[K];\n }\n : {\n [K in keyof T]: K extends '__hasSelect'\n ? true\n : K extends 'result'\n ? {\n pluck: S extends Expression ? S['result']['value'] : never;\n }\n : K extends 'returnType'\n ? 'pluck'\n : K extends 'then'\n ? QueryThen<\n (S extends Expression\n ? S['result']['value']['outputType']\n : never)[]\n >\n : T[K];\n };\n\nexport type SetValueQueryReturnsPluckColumn<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'result'\n ? { pluck: T['result']['value'] }\n : K extends 'returnType'\n ? 'pluck'\n : K extends 'then'\n ? QueryThen<T['result']['value']['outputType'][]>\n : T[K];\n} & QueryHasSelect;\n\nexport type SetQueryReturnsPluckColumnResult<\n T extends PickQueryResult,\n Result extends Column.QueryColumns,\n> = {\n [K in keyof T]: K extends 'result'\n ? { pluck: T['result']['value'] }\n : K extends 'returnType'\n ? 'pluck'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<T['result']['value']['outputType'][]>\n : T[K];\n} & QueryHasSelect;\n\nexport type SetQueryReturnsValueOrThrow<\n T extends PickQuerySelectable,\n Arg extends keyof T['__selectable'],\n> = SetQueryReturnsColumnOrThrow<T, T['__selectable'][Arg]['column']> &\n T['__selectable'][Arg]['column']['operators'];\n\nexport type SetValueQueryReturnsValueOrThrow<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<T['result']['value']['outputType']>\n : T[K];\n};\n\nexport type SetQueryReturnsValueOptional<\n T extends PickQuerySelectable,\n Arg extends GetStringArg<T>,\n> = SetQueryReturnsColumnOptional<\n T,\n {\n [K in keyof T['__selectable'][Arg]['column']]: K extends 'outputType'\n ? T['__selectable'][Arg]['column'][K] | undefined\n : T['__selectable'][Arg]['column'][K];\n }\n> &\n Omit<T['__selectable'][Arg]['column']['operators'], 'equals' | 'not'> &\n Column.Modifiers.OperatorsNullable<T['__selectable'][Arg]['column']>;\n\nexport type SetQueryReturnsColumnOrThrow<\n T,\n Column extends Column.Pick.OutputType,\n> = {\n [K in keyof T]: K extends 'result'\n ? { value: Column }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<Column['outputType']>\n : T[K];\n} & QueryHasSelect;\n\nexport type SetQueryReturnsColumnOptional<\n T,\n Column extends Column.Pick.OutputType,\n> = {\n [K in keyof T]: K extends 'result'\n ? { value: Column }\n : K extends 'returnType'\n ? 'value'\n : K extends 'then'\n ? QueryThen<Column['outputType'] | undefined>\n : T[K];\n} & QueryHasSelect;\n\nexport type SetQueryReturnsColumn<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'result'\n ? { value: T['result']['pluck'] }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<T['result']['pluck']['outputType']>\n : T[K];\n} & QueryHasSelect;\n\nexport type SetQueryReturnsColumnResult<\n T extends PickQueryResult,\n Result extends Column.QueryColumns,\n> = {\n [K in keyof T]: K extends 'result'\n ? { value: T['result']['pluck'] }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<Result['pluck']['outputType']>\n : T[K];\n} & QueryHasSelect;\n\nexport type SetQueryReturnsRowCount<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'result'\n ? { value: Column.Pick.QueryColumnOfType<number> }\n : K extends 'then'\n ? QueryThen<number>\n : T[K];\n};\n\nexport type SetQueryReturnsRowCountMany<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'pluck'\n : K extends 'result'\n ? { pluck: Column.Pick.QueryColumnOfType<number> }\n : K extends 'then'\n ? QueryThen<number>\n : T[K];\n};\n\nexport type SetQueryReturnsVoid<T> = {\n [K in keyof T]: K extends 'returnType'\n ? 'void'\n : K extends 'then'\n ? QueryThen<void>\n : T[K];\n};\n\nexport type SetQueryResult<\n T extends PickQueryReturnType,\n Result extends Column.QueryColumns,\n> = {\n [K in keyof T]: K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThenByQuery<T, Result>\n : T[K];\n};\n\nexport interface ReturnsQueryOrExpression<T> {\n (): QueryOrExpression<T>;\n}\n\nexport interface QueryOrExpressionBooleanOrNullResult {\n result: { value: Column.Pick.QueryColumnOfType<boolean | null> };\n}\n\nexport const isQueryReturnsAll = (q: Query) =>\n !q.q.returnType || q.q.returnType === 'all';\n\nexport const isQuery = (q: unknown): q is IsQuery =>\n !!q && typeof q === 'object' && '__isQuery' in q && q.__isQuery === true;\n","import { RecordBoolean, RecordUnknown } from '../../utils';\nimport { PickQueryQAndBaseQuery } from '../pick-query-types';\n\nexport const skipQueryKeysForSubQuery: RecordBoolean = {\n adapter: true,\n schema: true,\n updateData: true,\n parsers: true,\n as: true,\n and: true,\n or: true,\n returnType: true,\n joinedShapes: true,\n returnsOne: true,\n aliases: true,\n defaults: true,\n transform: true,\n throwOnNotFound: true,\n before: true,\n after: true,\n beforeCreate: true,\n afterCreate: true,\n afterCreateCommit: true,\n afterCreateSelect: true,\n beforeUpdate: true,\n afterUpdate: true,\n afterUpdateCommit: true,\n afterUpdateSelect: true,\n afterSave: true,\n afterSaveCommit: true,\n afterSaveSelect: true,\n beforeDelete: true,\n afterDelete: true,\n afterDeleteCommit: true,\n afterDeleteSelect: true,\n catchAfterCommitErrors: true,\n log: true,\n logger: true,\n autoPreparedStatements: true,\n catch: true,\n};\n\n// extracted from `join` to prevent circular dependencies between query join and sql join\nexport const getIsJoinSubQuery = (query: PickQueryQAndBaseQuery) => {\n const {\n q,\n baseQuery: { q: baseQ },\n } = query;\n for (const key in q) {\n if (\n !skipQueryKeysForSubQuery[key] &&\n (q as never as RecordUnknown)[key] !==\n (baseQ as never as RecordUnknown)[key]\n ) {\n return true;\n }\n }\n return false;\n};\n","import { isQuery, IsQuery, Query } from '../../query';\nimport { JoinArgs, JoinCallback, JoinFirstArg, JoinQueryBuilder } from './join';\nimport { pushQueryArrayImmutable } from '../../query.utils';\nimport { ColumnsShape } from '../../../columns/columns-shape';\nimport { Column } from '../../../columns/column';\nimport { getIsJoinSubQuery } from '../../sql/get-is-join-sub-query';\nimport { prepareSubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { returnArg } from '../../../utils';\nimport { RelationJoinQuery } from '../../relations';\nimport {\n PickQueryQ,\n PickQueryRelationQueries,\n PickQueryRelations,\n} from '../../pick-query-types';\nimport { _clone } from '../clone/clone';\nimport { JoinItemArgs } from './join.sql';\nimport { JoinedShapes, QueryData, QueryDataJoinTo } from '../../query-data';\n\n/**\n * Processes arguments of join {@link JoinArgs} into {@link JoinItemArgs} type for building sql.\n * Resolves join callback.\n * Detects if the join should be an implicit lateral join.\n *\n * @param joinTo - main query\n * @param joinKey - joining as\n * @param first - first join argument\n * @param args - rest join arguments\n * @param joinSubQuery - callee should find out whether first argument should result in a sub-queried join\n * @param shape - aliased shape of a joined table, the one from `getShapeFromSelect`\n * @param whereExists - the lateral expression should be never wrapped into a sub query for `whereExist`\n * @param forbidLateral - LATERAL with a query that references the main table is not available in `updateFrom`\n */\nexport const processJoinArgs = (\n joinTo: Query,\n first: JoinFirstArg<never>,\n args:\n | [JoinCallback<Query, JoinFirstArg<Query>>]\n | JoinArgs<Query, JoinFirstArg<Query>>,\n joinSubQuery: boolean,\n shape: Column.QueryColumns | undefined,\n whereExists?: boolean,\n joinKey?: string,\n forbidLateral?: boolean,\n): JoinItemArgs => {\n if (typeof first === 'string') {\n if (first in joinTo.relations) {\n const rel = joinTo.relations[first];\n let relQuery = rel.query as Query;\n\n // clone in case the callback changes alias\n if (typeof args[0] === 'function') relQuery = _clone(relQuery);\n\n const j = rel.joinQuery(relQuery, joinTo) as Query;\n if (typeof args[0] === 'function') {\n const r = args[0](\n makeJoinQueryBuilder(j, j.q.joinedShapes, joinTo, shape) as never,\n ) as Query;\n\n if (r.q.as !== joinKey) {\n relQuery.q.as = r.q.as;\n }\n\n return {\n j: j.merge(r),\n s: whereExists ? false : joinSubQuery || getIsJoinSubQuery(r),\n r,\n };\n }\n\n return { j, s: joinSubQuery };\n } else if (typeof args[0] !== 'function') {\n return { w: first, a: args as never };\n } else {\n const joinToQ = joinTo.q;\n const w = joinToQ.withShapes?.[first];\n if (!w) {\n throw new Error('Cannot find a `with` statement');\n }\n\n const j = joinTo.qb.baseQuery.clone();\n j.table = first;\n j.q = {\n shape: w.shape,\n runtimeComputeds: w.computeds,\n adapter: joinToQ.adapter,\n handleResult: joinToQ.handleResult,\n returnType: 'all',\n logger: joinToQ.logger,\n } as QueryData;\n j.baseQuery = j as Query;\n\n const joinedShapes = {\n ...joinToQ.joinedShapes,\n [(joinToQ.as || joinTo.table) as string]: joinTo.shape,\n } as JoinedShapes;\n\n const r = prepareSubQueryForSql(\n joinTo,\n args[0](\n makeJoinQueryBuilder(\n j,\n j.q.joinedShapes\n ? {\n ...j.q.joinedShapes,\n ...joinedShapes,\n }\n : joinedShapes,\n joinTo,\n shape,\n ) as never,\n ) as Query,\n );\n\n return {\n w: first,\n r,\n s: whereExists ? false : joinSubQuery || getIsJoinSubQuery(r),\n };\n }\n }\n\n const args0 = args.length ? args[0] : returnArg;\n if (typeof args0 === 'function') {\n let q = first as Query & {\n joinQueryAfterCallback?: RelationJoinQuery;\n };\n\n if (q.joinQueryAfterCallback) {\n let base = q.baseQuery;\n if (q.q.as) {\n base = base.as(q.q.as);\n }\n\n const { q: query } = q.joinQueryAfterCallback(\n base,\n joinTo,\n ) as unknown as PickQueryQ;\n\n if (query.and || query.or || query.scopes) {\n q = _clone(q);\n if (query.and) {\n pushQueryArrayImmutable(q, 'and', query.and);\n }\n if (query.or) {\n pushQueryArrayImmutable(q, 'or', query.or);\n }\n if (query.scopes) {\n q.q.scopes = { ...q.q.scopes, ...query.scopes };\n }\n }\n }\n\n const joinedShapes = {\n ...joinTo.q.joinedShapes,\n [(joinTo.q.as || joinTo.table) as string]: joinTo.shape,\n } as JoinedShapes;\n\n const r = args0(\n makeJoinQueryBuilder(\n q,\n q.q.joinedShapes\n ? {\n ...q.q.joinedShapes,\n ...joinedShapes,\n }\n : joinedShapes,\n joinTo,\n shape,\n ) as never,\n ) as Query;\n\n joinSubQuery ||= getIsJoinSubQuery(r);\n return {\n q: joinSubQuery && !forbidLateral ? q.merge(r) : q,\n r,\n s: joinSubQuery,\n };\n }\n\n return {\n q: first,\n a: args,\n s: joinSubQuery,\n } as never;\n};\n\nexport const preprocessJoinArg = (\n q: PickQueryRelations,\n arg: JoinFirstArg<never>,\n) => {\n if (typeof arg === 'function') {\n arg = arg(\n (q as unknown as PickQueryRelationQueries).relationQueries as never,\n );\n\n (\n arg as unknown as { joinQueryAfterCallback: unknown }\n ).joinQueryAfterCallback = (\n arg as unknown as { joinQuery: unknown }\n ).joinQuery;\n }\n\n return isQuery(arg) ? prepareSubQueryForSql(q as Query, arg as Query) : arg;\n};\n\n/**\n * Creates {@link JoinQueryBuilder} argument for join callback.\n *\n * @param joinedQuery - the query that is joining\n * @param joinedShapes\n * @param joinTo\n * @param shape - in `updateFrom` the columns of 2nd callback are aliased\n */\nconst makeJoinQueryBuilder = (\n joinedQuery: IsQuery,\n joinedShapes: JoinedShapes | undefined,\n joinTo: QueryDataJoinTo,\n shape: Column.QueryColumns | undefined,\n): JoinQueryBuilder<Query, Query> => {\n const q = (joinedQuery as Query).baseQuery.clone();\n q.baseQuery = q;\n q.q.as = (joinedQuery as Query).q.as;\n q.q.joinedShapes = joinedShapes;\n q.q.joinTo = joinTo;\n\n // scopes are applied when handling 1st join argument,\n // prevent them to be applied a second time by a callback.\n if (q.q.scopes) {\n q.q.scopes = undefined;\n }\n\n if (shape) {\n q.q.shape = shape as ColumnsShape;\n }\n return q as never;\n};\n","import {\n PickQueryAs,\n PickQuerySelectableReturnType,\n PickQuerySelectable,\n PickQueryShape,\n PickQueryTable,\n PickQueryResult,\n PickQueryRelations,\n} from './pick-query-types';\nimport { RecordUnknown } from '../utils';\nimport { IsQuery } from './query';\n\nexport interface RelationJoinQuery {\n (joiningQuery: IsQuery, baseQuery: IsQuery): IsQuery;\n}\n\nexport interface RelationConfigQuery\n extends PickQueryResult,\n PickQuerySelectable,\n PickQueryShape,\n PickQueryTable,\n PickQueryAs,\n PickQueryRelations {}\n\nexport interface RelationConfigBase extends IsQuery {\n returnsOne: boolean;\n query: RelationConfigQuery;\n joinQuery: RelationJoinQuery;\n reverseJoin: RelationJoinQuery;\n params: unknown;\n\n queryRelated(params: unknown): unknown;\n\n modifyRelatedQuery?(relatedQuery: IsQuery): (query: IsQuery) => void;\n\n maybeSingle: PickQuerySelectableReturnType;\n // Omit `belongsTo` foreign keys to be able to create records\n // with `db.book.create({ authorId: 123 })`\n // or with `db.book.create({ author: authorData })`.\n // Other relation kinds have `omitForeignKeyInCreate: never`.\n omitForeignKeyInCreate: PropertyKey;\n // Data for `create` method that may have required properties.\n // Only `belongsTo` has it for required foreign keys.\n dataForCreate?: RelationConfigDataForCreate;\n // Data for `create` method with all optional properties.\n // Other than `belongsTo` relation kinds use it.\n optionalDataForCreate: unknown;\n dataForUpdate: unknown;\n dataForUpdateOne: unknown;\n primaryKeys: string[];\n}\n\nexport interface RelationConfigDataForCreate {\n columns: PropertyKey;\n nested: RecordUnknown;\n}\n\nexport interface RelationsBase {\n [K: string]: RelationConfigBase;\n}\n\n/* getters */\n\nexport const isRelationQuery = (q: IsQuery): q is RelationConfigBase =>\n 'joinQuery' in q;\n","import {\n IsQuery,\n Query,\n QueryHasSelect,\n QueryOrExpressionBooleanOrNullResult,\n QueryTake,\n QueryTakeOptional,\n} from '../../query';\nimport {\n _queryTake,\n _queryTakeOptional,\n pushQueryArrayImmutable,\n} from '../../query.utils';\nimport {\n JoinArgs,\n JoinCallback,\n JoinCallbackArgs,\n JoinFirstArg,\n} from '../join/join';\nimport { sqlQueryArgsToExpression } from '../../expressions/raw-sql';\nimport { preprocessJoinArg, processJoinArgs } from '../join/process-join-args';\nimport { _queryNone } from '../../extra-features/none/none';\nimport { prepareSubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { prepareOpArg } from '../../../columns/operators';\nimport {\n PickQuerySelectableShapeRelationsWithDataAs,\n PickQueryQ,\n PickQueryRelations,\n PickQuerySelectableRelations,\n PickQuerySelectableRelationsResultReturnType,\n} from '../../pick-query-types';\nimport {\n EmptyObject,\n isIterable,\n MaybeArray,\n RecordUnknown,\n} from '../../../utils';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { _setSubQueryAliases } from '../as/as';\nimport { _clone } from '../clone/clone';\nimport { QueryExpressions } from '../../expressions/query-expressions';\nimport { resolveSubQueryCallback } from '../../internal-features/sub-query/sub-query';\nimport { OrchidOrmInternalError } from '../../errors';\nimport { SQLQueryArgs } from '../../db-sql-query';\nimport { getClonedQueryData, pushQueryValueImmutable } from '../../query-data';\n\n/*\nArgument of `where`:\n- can be an object with special keys `NOT`, `OR`, `IN`, etc.: q.where({ NOT: { key: 'value' } })\n- can be a raw SQL: q.where(q.raw`sql`)\n- can be a special query builder: q.whereNot((q) => q.whereIn(...))\n- can be a nested `where` query to be joined wth `AND`: q.where(q.where(...), q.where(...))\n- can be an object where keys are column names and values can be one of:\n - value to check for equality\n - null for `IS NULL`\n - object with column operators: q.where({ num: { gt: 5 } })\n - raw SQL: q.where({ num: q.raw`sql` })\n - sub query returning a single column: q.where({ num: db.someTable.where(...).get('column') })\n */\nexport type WhereArg<T extends PickQuerySelectableRelations> =\n | {\n [K in keyof T['__selectable'] | 'NOT' | 'OR' | 'IN']?: K extends 'NOT'\n ? WhereArg<T> | WhereArgs<T>\n : K extends 'OR'\n ? (WhereArg<T> | WhereArgs<T>)[]\n : K extends 'IN'\n ? MaybeArray<{\n columns: (keyof T['__selectable'])[];\n values: unknown[][] | IsQuery | Expression;\n }>\n :\n | T['__selectable'][K]['column']['queryType']\n | null\n // inlined `ColumnOperators` helper\n | {\n [O in keyof T['__selectable'][K]['column']['operators']]?:\n | T['__selectable'][K]['column']['operators'][O]['_opType'];\n }\n // inlined QueryOrExpression\n | {\n result: {\n value: {\n // simplified Column.Pick.QueryColumn\n queryType:\n | T['__selectable'][K]['column']['queryType']\n | null;\n };\n };\n }\n // returns inlined QueryOrExpression\n | ((q: T) => {\n result: {\n value: {\n // simplified Column.Pick.QueryColumn\n queryType:\n | T['__selectable'][K]['column']['queryType']\n | null;\n };\n };\n });\n }\n | ((\n q: WhereQueryBuilder<T>,\n ) => QueryOrExpressionBooleanOrNullResult | WhereQueryBuilder<T>);\n\n/**\n * Callback argument of `where`.\n * It has `where` methods (`where`, `whereNot`, `whereExists`, etc.),\n * and it has relations that you can aggregate and use a boolean comparison with, such as:\n * ```ts\n * db.table.where((q) => q.relation.count().equals(10))\n * ```\n */\nexport type WhereQueryBuilder<T extends PickQueryRelations> =\n EmptyObject extends T['relations']\n ? {\n [K in keyof T]: K extends\n | keyof Where\n | keyof QueryExpressions\n | 'table' // is needed for `useHelper`\n | 'get'\n | 'columnTypes'\n | '__selectable'\n | 'relations'\n | 'useHelper'\n | 'modify'\n // rest are required by `useHelper`\n | 'result'\n | 'returnType'\n | 'withData'\n | 'windows'\n | 'then'\n ? T[K]\n : never;\n }\n : {\n [K in keyof T['relations'] | keyof T]: K extends keyof T['relations']\n ? T['relations'][K]['query']\n : K extends keyof T &\n (\n | keyof Where\n | keyof QueryExpressions\n | 'table' // is needed for `useHelper`\n | 'get'\n | 'columnTypes'\n | '__selectable'\n | 'relations'\n | 'useHelper'\n | 'modify'\n // rest are required by `useHelper`\n | 'result'\n | 'returnType'\n | 'withData'\n | 'windows'\n | 'then'\n )\n ? T[K]\n : never;\n };\n\n// One or more of {@link WhereArg} or a string template for raw SQL.\nexport type WhereArgs<T extends PickQuerySelectableRelations> = WhereArg<T>[];\n\nexport type WhereNotArgs<T extends PickQuerySelectableRelations> = [\n WhereArg<T>,\n];\n\n// Argument of `whereIn`: can be a column name or a tuple with column names to search in.\nexport type WhereInColumn<T extends PickQuerySelectableRelations> =\n | keyof T['__selectable']\n | [keyof T['__selectable'], ...(keyof T['__selectable'])[]];\n\n// If `WhereInColumn` is a single column, it accepts array of values, or Query returning single column, or raw SQL expression.\n// If `WhereInColumn` is a tuple, it accepts a tuple of values described above.\nexport type WhereInValues<\n T extends PickQuerySelectableRelations,\n Column,\n> = Column extends keyof T['__selectable']\n ?\n | Iterable<T['__selectable'][Column]['column']['queryType']>\n | IsQuery\n | Expression\n :\n | ({\n [I in keyof Column]: Column[I] extends keyof T['__selectable']\n ? T['__selectable'][Column[I]]['column']['queryType']\n : never;\n } & {\n length: Column extends { length: number } ? Column['length'] : never;\n })[]\n | IsQuery\n | Expression;\n\n// In addition to `WhereInColumn` + `WhereInValues` where user can provide a tuple with columns and a tuple with values, enable `whereIn` with object syntax.\n// Each key is a column name, value is array of column values, or a query returning single column, or a raw SQL expression.\nexport type WhereInArg<T extends PickQuerySelectableRelations> = {\n [K in keyof T['__selectable']]?:\n | Iterable<T['__selectable'][K]['column']['queryType']>\n | IsQuery\n | Expression;\n};\n\n// After applying `where`, attach `__hasWhere: true` to query to allow updating and deleting.\nexport interface QueryHasWhere {\n __hasWhere: true;\n}\n\ninterface QueryFnReturningSelect {\n (q: never): QueryHasSelect;\n}\n\nconst resolveCallbacksInArgs = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereArgs<T>,\n) => {\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (typeof arg === 'function') {\n const qb = Object.create(q);\n qb.q = getClonedQueryData((q as unknown as PickQueryQ).q);\n qb.q.and = qb.q.or = qb.q.scopes = undefined;\n qb.q.subQuery = 1;\n _setSubQueryAliases(qb);\n\n const resolved = resolveSubQueryCallback(qb, arg as never) as never;\n args[i] = prepareSubQueryForSql(q as never, resolved) as never;\n } else if (arg.constructor === Object) {\n const copy = ((args as RecordUnknown[])[i] = {\n ...(arg as RecordUnknown),\n });\n for (const key in arg) {\n const value = arg[key as never] as RecordUnknown;\n if (typeof value === 'function') {\n let resolved = (value as (q: unknown) => unknown)(q);\n if (!isExpression(resolved)) {\n resolved = prepareSubQueryForSql(\n q as unknown as Query,\n resolved as unknown as Query,\n );\n }\n copy[key] = resolved;\n } else {\n prepareWhereObj(q, value, true);\n }\n }\n }\n }\n};\n\nconst prepareWhereObj = (\n q: PickQuerySelectableRelations,\n value: RecordUnknown,\n checkNested?: boolean,\n) => {\n for (const op in value) {\n const param = value[op];\n if (param && typeof param === 'object') {\n if (Array.isArray(param)) {\n param.forEach((item, i) => {\n const val = prepareOpArg(q, item);\n if (val) param[i] = val;\n });\n } else if (checkNested && param.constructor === Object) {\n prepareWhereObj(q, param as RecordUnknown);\n } else {\n const val = prepareOpArg(q, param);\n if (val) value[op] = val;\n }\n }\n }\n};\n\n/**\n * Mutative {@link Where.prototype.where}\n */\nexport const _queryWhere = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereArgs<T>,\n): T & QueryHasWhere => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryArrayImmutable(q as never, 'and', args) as never;\n};\n\nexport const _queryFindBy = <\n T extends PickQuerySelectableRelationsResultReturnType,\n>(\n q: T,\n arg: WhereArg<T>,\n): QueryTake<T & QueryHasWhere> => {\n validateFindBy(q, arg, 'findBy');\n return _queryTake(_queryWhere(q, [arg]));\n};\n\nexport const _queryFindByOptional = <\n T extends PickQuerySelectableRelationsResultReturnType,\n>(\n q: T,\n arg: WhereArg<T>,\n): QueryTakeOptional<T & QueryHasWhere> => {\n validateFindBy(q, arg, 'findByOptional');\n return _queryTakeOptional(_queryWhere(q, [arg]));\n};\n\nconst validateFindBy = (\n q: unknown,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n arg: WhereArg<any>,\n method: string,\n) => {\n let nonEmpty: boolean | undefined;\n for (const key in arg) {\n nonEmpty = true;\n if (arg[key as keyof typeof arg] === undefined) {\n throw new OrchidOrmInternalError(\n q as never,\n `${method} was called with undefined value`,\n );\n }\n }\n if (!nonEmpty) {\n throw new OrchidOrmInternalError(\n q as never,\n `${method} was called with empty object`,\n );\n }\n};\n\n/**\n * Mutative {@link Where.prototype.whereSql}\n */\nexport const _queryWhereSql = <T>(q: T, args: SQLQueryArgs): T => {\n return pushQueryValueImmutable(\n q as never,\n 'and',\n sqlQueryArgsToExpression(args),\n ) as never;\n};\n\n/**\n * Mutative {@link Where.prototype.whereNot}\n */\nexport const _queryWhereNot = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereNotArgs<T>,\n): T & QueryHasWhere => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryValueImmutable(q as never, 'and', {\n NOT: args,\n }) as never;\n};\n\n/**\n * Mutative {@link Where.prototype.whereNotSql}\n */\nexport const _queryWhereNotSql = <T>(q: T, args: SQLQueryArgs): T => {\n return pushQueryValueImmutable(q as never, 'and', {\n NOT: sqlQueryArgsToExpression(args),\n }) as never;\n};\n\n/**\n * Mutative {@link Where.prototype.whereNotExists}\n */\nexport const _queryWhereNotExists = (q: Query, arg: unknown, args: unknown) => {\n return _queryWhereNot(q, existsArgs(q, arg as never, args as never)) as never;\n};\n\nexport const _queryWhereOneOf = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereArgs<T>,\n): T => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryValueImmutable(q as never, 'and', {\n OR: args,\n }) as never;\n};\n\nexport const _queryWhereNotOneOf = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereArgs<T>,\n): T => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryValueImmutable(q as never, 'and', {\n NOT: { OR: args },\n }) as never;\n};\n\n/**\n * Mutative {@link Where.prototype.orWhere}\n */\nexport const _queryOr = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereArgs<T>,\n): T & QueryHasWhere => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryArrayImmutable(\n q as never,\n 'or',\n args.map((item) => [item]),\n ) as never;\n};\n\n/**\n * Mutative {@link Where.prototype.orWhereNot}\n */\nexport const _queryOrNot = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereArgs<T>,\n): T & QueryHasWhere => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryArrayImmutable(\n q as never,\n 'or',\n args.map((item) => {\n return [{ NOT: item }];\n }),\n ) as never;\n};\n\n/**\n * Mutative {@link Where.prototype.whereIn}\n */\nexport const _queryWhereIn = <T>(\n q: T,\n and: boolean,\n arg: unknown,\n values: unknown[] | Iterable<unknown> | IsQuery | Expression | undefined,\n not?: boolean,\n): T & QueryHasWhere => {\n let item;\n if (values) {\n if (isIterable(values)) values = [...values];\n\n if ('length' in values && !values.length) {\n return _queryNone(q) as T & QueryHasWhere;\n }\n\n if (values instanceof (q as Query).constructor) {\n values = prepareSubQueryForSql(q as Query, values as Query);\n }\n\n if (Array.isArray(arg)) {\n item = {\n IN: {\n columns: arg,\n values,\n },\n };\n } else {\n item = { [arg as string]: { in: values } };\n }\n } else {\n item = {} as { [K: string]: { in: Iterable<unknown> } };\n for (const key in arg as { [K: string]: Iterable<unknown> }) {\n let values = (arg as { [K: string]: Iterable<unknown> })[key];\n\n if (\n ('length' in values && !values.length) ||\n ('size' in values && !values.size)\n ) {\n return _queryNone(q) as T & QueryHasWhere;\n }\n\n if (values instanceof (q as Query).constructor) {\n // TODO: add a test, not sure if `in` expects a query in this case\n values = prepareSubQueryForSql(q as Query, values as never) as never;\n }\n\n item[key] = { in: values };\n }\n }\n\n if (not) item = { NOT: item };\n\n if (and) {\n pushQueryValueImmutable(q as never, 'and', item);\n } else {\n pushQueryValueImmutable(q as never, 'or', [item]);\n }\n\n return q as never;\n};\n\n/**\n * Process arguments of `whereExists`.\n */\nconst existsArgs = (\n self: Query,\n q: JoinFirstArg<Query>,\n args: JoinArgs<Query, Query>,\n) => {\n const joinArgs = processJoinArgs(\n self,\n preprocessJoinArg(self, q) as never,\n args as never,\n false,\n undefined,\n true,\n );\n\n return [\n {\n EXISTS: joinArgs,\n },\n ] as never;\n};\n\n/**\n * Mutative {@link Where.prototype.whereExists}\n */\nexport const _queryWhereExists = <\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n>(\n q: T,\n arg: Arg,\n args: [JoinCallback<T, Arg>] | JoinArgs<T, Arg>,\n): T & QueryHasWhere => {\n return _queryWhere(\n q as never,\n existsArgs(q as unknown as Query, arg as never, args as never),\n ) as never;\n};\n\nexport class Where {\n /**\n * Constructing `WHERE` conditions:\n *\n * ```ts\n * import { sql } from './baseTable'\n *\n * db.table.where({\n * // column of the current table\n * name: 'John',\n *\n * // table name may be specified, it can be the name of a joined table\n * 'table.lastName': 'Johnsonuk',\n *\n * // object with operators, see the \"column operators\" section to see a full list of them:\n * age: {\n * gt: 30,\n * lt: 70,\n * },\n *\n * // where column equals to raw SQL\n * // import `sql` from your `BaseTable`\n * column: sql`sql expression`,\n * // or use `(q) => sql` for the same\n * column2: (q) => sql`sql expression`,\n *\n * // reference other columns in such a way:\n * firstName: (q) => q.ref('lastName'),\n * });\n * ```\n *\n * Multiple `where`s are joined with `AND`:\n *\n * ```ts\n * db.table.where({ foo: 'foo' }).where({ bar: 'bar' });\n * ```\n *\n * ```sql\n * SELECT * FROM table WHERE foo = 'foo' AND bar = 'bar'\n * ```\n *\n * `undefined` values are ignored, so you can supply a partial object with conditions:\n *\n * ```ts\n * type Params = {\n * // allow providing exact age, or lower or greater than\n * age?: number | { lt?: number; gt?: number };\n * };\n *\n * const loadRecords = async (params: Params) => {\n * // this will load all records if params is an empty object\n * const records = await db.table.where(params);\n * };\n * ```\n *\n * It supports a sub-query that is selecting a single value to compare it with a column:\n *\n * ```ts\n * db.table.where({\n * // compare `someColumn` in one table with the `column` value returned from another query.\n * someColumn: db.otherTable.where(...conditions).get('column'),\n * });\n * ```\n *\n * `where` can accept other queries and merge their conditions:\n *\n * ```ts\n * const otherQuery = db.table.where({ name: 'John' });\n *\n * db.table.where({ id: 1 }, otherQuery);\n * // this will produce WHERE \"table\".\"id\" = 1 AND \"table\".\"name' = 'John'\n * ```\n *\n * `where` supports raw SQL:\n *\n * ```ts\n * db.table.where(sql`a = b`);\n * ```\n *\n * `where` can accept a callback with a specific query builder containing all \"where\" methods such as `where`, `orWhere`, `whereNot`, `whereIn`, `whereExists`:\n *\n * ```ts\n * db.table.where((q) =>\n * q\n * .where({ name: 'Name' })\n * .orWhere({ id: 1 }, { id: 2 })\n * .whereIn('letter', ['a', 'b', 'c'])\n * .whereExists(db.message, 'authorId', 'id'),\n * );\n * ```\n *\n * `where` can accept multiple arguments, conditions are joined with `AND`:\n *\n * ```ts\n * db.table.where(\n * { id: 1 },\n * db.table.where({ name: 'John' }),\n * sql`a = b`,\n * );\n * ```\n *\n * ## where sub query\n *\n * `where` handles a special callback where you can query a relation to get some value and filter by that value.\n *\n * It is useful for a faceted search. For instance, posts have tags, and we want to find all posts that have all the given tags.\n *\n * ```ts\n * const givenTags = ['typescript', 'node.js'];\n *\n * const posts = await db.post.where(\n * (post) =>\n * post.tags // query tags of the post\n * .whereIn('tagName', givenTags) // where name of the tag is inside array\n * .count() // count how many such tags were found\n * .equals(wantedTags.length), // the count must be exactly the length of array\n * // if the post has ony `typescript` tag but not the `node.js` it will be omitted\n * );\n * ```\n *\n * This will produce an efficient SQL query:\n *\n * ```sql\n * SELECT * FROM \"post\"\n * WHERE (\n * SELECT count(*) = 3\n * FROM \"tag\" AS \"tags\"\n * WHERE \"tag\".\"tagName\" IN ('typescript', 'node.js')\n * -- join tags to the post via \"postTag\" table\n * AND EXISTS (\n * SELECT 1 FROM \"postTag\"\n * WHERE \"postTag\".\"postId\" = \"post\".\"id\"\n * AND \"postTag\".\"tagId\" = \"tag\".\"id\"\n * )\n * )\n * ```\n *\n * In the example above we use `count()`, you can also use any other aggregate method instead, such as `min`, `max`, `avg`.\n *\n * The `count()` is chained with `equals` to check for a strict equality, any other operation is also allowed, such as `not`, `lt`, `gt`.\n *\n * ## where special keys\n *\n * The object passed to `where` can contain special keys, each of the keys corresponds to its own method and takes the same value as the type of argument of the method.\n *\n * For example:\n *\n * ```ts\n * db.table.where({\n * NOT: { key: 'value' },\n * OR: [{ name: 'a' }, { name: 'b' }],\n * IN: {\n * columns: ['id', 'name'],\n * values: [\n * [1, 'a'],\n * [2, 'b'],\n * ],\n * },\n * });\n * ```\n *\n * Using methods `whereNot`, `orWhere`, `whereIn` instead of this is a shorter and cleaner way, but in some cases, such object keys way may be more convenient.\n *\n * ```ts\n * db.table.where({\n * // see .whereNot\n * NOT: { id: 1 },\n * // can be an array:\n * NOT: [{ id: 1 }, { id: 2 }],\n *\n * // see .orWhere\n * OR: [{ name: 'a' }, { name: 'b' }],\n * // can be an array:\n * // this will give id = 1 AND id = 2 OR id = 3 AND id = 4\n * OR: [\n * [{ id: 1 }, { id: 2 }],\n * [{ id: 3 }, { id: 4 }],\n * ],\n *\n * // see .in, the key syntax requires an object with columns and values\n * IN: {\n * columns: ['id', 'name'],\n * values: [\n * [1, 'a'],\n * [2, 'b'],\n * ],\n * },\n * // can be an array:\n * IN: [\n * {\n * columns: ['id', 'name'],\n * values: [\n * [1, 'a'],\n * [2, 'b'],\n * ],\n * },\n * { columns: ['someColumn'], values: [['foo', 'bar']] },\n * ],\n * });\n * ```\n *\n * ## column operators\n *\n * `where` argument can take an object where the key is the name of the operator and the value is its argument.\n *\n * Different types of columns support different sets of operators.\n *\n * All column operators can take a value of the same type as the column, a sub-query, or a raw SQL expression:\n *\n * ```ts\n * db.table.where({\n * numericColumn: {\n * // lower than 5\n * lt: 5,\n *\n * // lower than the value returned by sub-query\n * lt: db.otherTable.select('someNumber').take(),\n *\n * // raw SQL expression produces WHERE \"numericColumn\" < \"otherColumn\" + 10\n * lt: sql`\"otherColumn\" + 10`,\n * },\n * });\n * ```\n *\n * ### Any type of column operators\n *\n * `equals` is a simple `=` operator, it may be useful for comparing column value with JSON object:\n *\n * ```ts\n * db.table.where({\n * // when searching for an exact same JSON value, this won't work:\n * jsonColumn: someObject,\n *\n * // use `{ equals: ... }` instead:\n * jsonColumn: { equals: someObject },\n * });\n * ```\n *\n * `not` is `!=` (aka `<>`) not equal operator:\n *\n * ```ts\n * db.table.where({\n * anyColumn: { not: value },\n * });\n * ```\n *\n * `in` is for the `IN` operator to check if the column value is included in a list of values.\n *\n * Takes an array of the same type as a column, a sub-query that returns a list of values, or a raw SQL expression that returns a list.\n *\n * ```ts\n * db.table.where({\n * column: {\n * in: ['a', 'b', 'c'],\n *\n * // WHERE \"column\" IN (SELECT \"column\" FROM \"otherTable\")\n * in: db.otherTable.select('column'),\n *\n * in: sql`('a', 'b')`,\n * },\n * });\n * ```\n *\n * `notIn` is for the `NOT IN` operator, and takes the same arguments as `in`\n *\n * ### Numeric, Date, and Time column operators\n *\n * To compare numbers, dates, and times.\n *\n * `lt` is for `<` (lower than)\n *\n * `lte` is for `<=` (lower than or equal)\n *\n * `gt` is for `>` (greater than)\n *\n * `gte` is for `>=` (greater than or equal)\n *\n * ```ts\n * db.table.where({\n * numericColumn: {\n * gt: 5,\n * lt: 10,\n * },\n *\n * date: {\n * lte: new Date(),\n * },\n *\n * time: {\n * gte: new Date(),\n * },\n * });\n * ```\n *\n * `between` also works with numeric, dates, and time columns, it takes an array of two elements.\n *\n * Both elements can be of the same type as a column, a sub-query, or a raw SQL expression.\n *\n * ```ts\n * db.table.where({\n * column: {\n * // simple values\n * between: [1, 10],\n *\n * // sub-query and raw SQL expression\n * between: [db.otherTable.select('column').take(), sql`2 + 2`],\n * },\n * });\n * ```\n *\n * ### Text column operators\n *\n * For `text`, `varchar`, `string`, and `json` columns.\n *\n * `json` is stored as text, so it has text operators. Use the `jsonb` type for JSON operators.\n *\n * Takes a string, or sub-query returning string, or raw SQL expression as well as other operators.\n *\n * ```ts\n * db.table.where({\n * textColumn: {\n * // WHERE \"textColumn\" LIKE '%string%'\n * contains: 'string',\n * // WHERE \"textColumn\" ILIKE '%string%'\n * containsInsensitive: 'string',\n * // WHERE \"textColumn\" LIKE 'string%'\n * startsWith: 'string',\n * // WHERE \"textColumn\" ILIKE 'string%'\n * startsWithInsensitive: 'string',\n * // WHERE \"textColumn\" LIKE '%string'\n * endsWith: 'string',\n * // WHERE \"textColumn\" ILIKE '%string'\n * endsWithInsensitive: 'string',\n * },\n * });\n * ```\n *\n * ### JSONB column operators\n *\n * JSON functions are available only for the `jsonb` column, note that the `json` type has text operators instead.\n *\n * You can use [jsonPathQueryFirst](/guide/json.html#jsonpathqueryfirst) to filter by a JSON value, follow the link for details.\n *\n * The value can be of any type, it can also be returned from a sub-query, raw SQL expression.\n *\n * ```ts\n * db.table.where((q) =>\n * q.get('jsonbColumn').jsonPathQueryFirst('$.name').equals(value),\n * );\n * ```\n *\n * `jsonSupersetOf`: check if the column value is a superset of provided value.\n *\n * For instance, it is true if the column has JSON `{ \"a\": 1, \"b\": 2 }` and provided value is `{ \"a\": 1 }`.\n *\n * Takes the value of any type, or sub query which returns a single value, or a raw SQL expression.\n *\n * ```ts\n * db.table.where({\n * jsonbColumn: {\n * jsonSupersetOf: { a: 1 },\n * },\n * });\n * ```\n *\n * `jsonSubsetOf`: check if the column value is a subset of provided value.\n *\n * For instance, it is true if the column has JSON `{ \"a\": 1 }` and provided value is `{ \"a\": 1, \"b\": 2 }`.\n *\n * Takes the value of any type, or sub query which returns a single value, or a raw SQL expression.\n *\n * ```ts\n * db.table.where({\n * jsonbColumn: {\n * jsonSubsetOf: { a: 1 },\n * },\n * });\n * ```\n *\n * @param args - {@link WhereArgs}\n */\n where<T extends PickQuerySelectableRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): T & QueryHasWhere {\n return _queryWhere(_clone(this), args as never) as never;\n }\n\n /**\n * Use a custom SQL expression in `WHERE` statement:\n *\n * ```ts\n * db.table.whereSql`a = b`;\n * ```\n *\n * @param args - SQL expression\n */\n whereSql<T>(this: T, ...args: SQLQueryArgs): T & QueryHasWhere {\n return _queryWhereSql(_clone(this), args as never) as never;\n }\n\n /**\n * `whereNot` takes the same argument as `where`,\n * multiple conditions are combined with `AND`,\n * the whole group of conditions is negated with `NOT`.\n *\n * ```ts\n * // find records of different colors than red\n * db.table.whereNot({ color: 'red' });\n * // WHERE NOT color = 'red'\n * db.table.whereNot({ one: 1, two: 2 });\n * // WHERE NOT (one = 1 AND two = 2)\n * ```\n *\n * @param args - {@link WhereArgs}\n */\n whereNot<T extends PickQuerySelectableRelations>(\n this: T,\n ...args: WhereNotArgs<T>\n ): T & QueryHasWhere {\n return _queryWhereNot(_clone(this), args as never) as never;\n }\n\n /**\n * `whereNotSql` is a version of `whereNot` accepting SQL expression:\n *\n * ```ts\n * db.table.whereNotSql`sql expression`\n * ```\n *\n * @param args - SQL expression\n */\n whereNotSql<T>(this: T, ...args: SQLQueryArgs): T {\n return _queryWhereNotSql(_clone(this), args) as never;\n }\n\n /**\n * `whereOneOf` stands for \"...**and** where one of the given is true\".\n *\n * Accepts the same arguments as `where`.\n *\n * ```ts\n * db.table.where({ id: 1 }).whereOneOf({ color: 'red' }, { color: 'blue' });\n * ```\n *\n * ```sql\n * SELECT * FROM table\n * WHERE id = 1 AND (color = 'red' OR color = 'blue')\n * ```\n *\n * Note that columns inside every argument are joined with `AND`:\n *\n * ```ts\n * db.table.whereOneOf({ id: 1, color: 'red' }, { id: 2 });\n * ```\n *\n * ```sql\n * SELECT * FROM table\n * WHERE (id = 1 AND color = 'red') OR (id = 2)\n * ```\n *\n * @param args - same arguments as in {@link where}, joined with `OR`\n */\n whereOneOf<T extends PickQuerySelectableRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): T {\n return _queryWhereOneOf(_clone(this), args as never) as never;\n }\n\n /**\n * Negative {@link whereOneOf}:\n *\n * ```ts\n * db.table.where({ id: 1 }).whereNotOneOf({ color: 'red' }, { color: 'blue' });\n * ```\n *\n * ```sql\n * SELECT * FROM table\n * WHERE id = 1 AND NOT (color = 'red' OR color = 'blue')\n * ```\n *\n * @param args - same arguments as in {@link where}, joined with `OR`\n */\n whereNotOneOf<T extends PickQuerySelectableRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): T {\n return _queryWhereNotOneOf(_clone(this), args as never) as never;\n }\n\n /**\n * `orWhere` stands for \"...**or** where one of the given is true\".\n *\n * Accepts the same arguments as `where`.\n *\n * ```ts\n * db.table.where({ id: 1, color: 'red' }).orWhere({ id: 2, color: 'blue' });\n * // equivalent:\n * db.table.orWhere({ id: 1, color: 'red' }, { id: 2, color: 'blue' });\n * ```\n *\n * ```sql\n * SELECT * FROM table\n * WHERE (id = 1 AND color = 'red') OR (id = 2 AND color = 'blue')\n * ```\n *\n * @param args - same arguments as in {@link where}, joined with `OR`\n */\n orWhere<T extends PickQuerySelectableRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): T & QueryHasWhere {\n return _queryOr(_clone(this), args as never) as never;\n }\n\n /**\n * `orWhereNot` takes the same arguments as {@link orWhere}, and prepends each condition with `NOT` just as {@link whereNot} does.\n *\n * @param args - {@link WhereArgs} will be prefixed with `NOT` and joined with `OR`\n */\n orWhereNot<T extends PickQuerySelectableRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): T & QueryHasWhere {\n return _queryOrNot(_clone(this), args as never) as never;\n }\n\n /**\n * `whereIn` and related methods are for the `IN` operator to check for inclusion in a list of values.\n *\n * When used with a single column it works equivalent to the `in` column operator:\n *\n * ```ts\n * db.table.whereIn('column', [1, 2, 3]);\n * db.table.whereIn('column', new Set([1, 2, 3]));\n * // the same as:\n * db.table.where({ column: { in: [1, 2, 3] } });\n * db.table.where({ column: { in: new Set([1, 2, 3]) } });\n * ```\n *\n * `whereIn` can support a tuple of columns, that's what the `in` operator cannot support:\n *\n * ```ts\n * db.table.whereIn(\n * ['id', 'name'],\n * [\n * [1, 'Alice'],\n * [2, 'Bob'],\n * ],\n * );\n * ```\n *\n * It supports sub query which should return records with columns of the same type:\n *\n * ```ts\n * db.table.whereIn(['id', 'name'], db.otherTable.select('id', 'name'));\n * ```\n *\n * It supports raw SQL expression:\n *\n * ```ts\n * db.table.whereIn(['id', 'name'], sql`((1, 'one'), (2, 'two'))`);\n * ```\n *\n * When empty set of values is given, `whereIn` will resolve into a {@link QueryMethods.none} query that has a special behavior.\n *\n * ```ts\n * // following queries resolves into `none`:\n * db.table.whereIn('id', [])\n * db.table.whereIn(['id', 'name'], [])\n * db.table.whereIn({ id: [] })\n * ```\n */\n whereIn<\n T extends PickQuerySelectableRelations,\n Column extends WhereInColumn<T>,\n >(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [arg: WhereInArg<T>]\n ): T & QueryHasWhere {\n return _queryWhereIn(_clone(this), true, args[0], args[1]) as never;\n }\n\n /**\n * Takes the same arguments as {@link whereIn}.\n * Add a `WHERE IN` condition prefixed with `OR` to the query:\n *\n * ```ts\n * db.table.whereIn('a', [1, 2, 3]).orWhereIn('b', ['one', 'two']);\n * ```\n */\n orWhereIn<\n T extends PickQuerySelectableRelations,\n Column extends WhereInColumn<T>,\n >(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [WhereInArg<T>]\n ): T & QueryHasWhere {\n return _queryWhereIn(_clone(this), false, args[0], args[1]) as never;\n }\n\n /**\n * Acts as `whereIn`, but negates the condition with `NOT`:\n *\n * ```ts\n * db.table.whereNotIn('color', ['red', 'green', 'blue']);\n * ```\n */\n whereNotIn<\n T extends PickQuerySelectableRelations,\n Column extends WhereInColumn<T>,\n >(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [arg: WhereInArg<T>]\n ): T & QueryHasWhere {\n return _queryWhereIn(_clone(this), true, args[0], args[1], true) as never;\n }\n\n /**\n * Acts as `whereIn`, but prepends `OR` to the condition and negates it with `NOT`:\n *\n * ```ts\n * db.table.whereNotIn('a', [1, 2, 3]).orWhereNoIn('b', ['one', 'two']);\n * ```\n */\n orWhereNotIn<\n T extends PickQuerySelectableRelations,\n Column extends WhereInColumn<T>,\n >(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [arg: WhereInArg<T>]\n ): T & QueryHasWhere {\n return _queryWhereIn(_clone(this), false, args[0], args[1], true) as never;\n }\n\n /**\n * `whereExists` is for support of the `WHERE EXISTS (query)` clause.\n *\n * This method is accepting the same arguments as `join`, see the {@link Join.join} section for more details.\n *\n * ```ts\n * // find users who have accounts\n * // find by a relation name if it's defined\n * db.user.whereExists('account');\n *\n * // find users who have an account with positive balance\n * // `accounts` is a relation name\n * db.user.whereExists((q) => q.accounts.where({ balance: { gt: 0 } }));\n *\n * // find using a table and a join conditions\n * db.user.whereExists(db.account, 'account.id', 'user.id');\n *\n * // find using a query builder in a callback:\n * db.user.whereExists(db.account, (q) => q.on('account.id', '=', 'user.id'));\n * ```\n */\n whereExists<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallbackArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Cb | JoinArgs<T, Arg>\n ): Arg extends QueryFnReturningSelect\n ? { error: 'Cannot select in whereExists' }\n : Cb[0] extends QueryFnReturningSelect\n ? { error: 'Cannot select in whereExists' }\n : T & QueryHasWhere {\n return _queryWhereExists(\n _clone(this) as unknown as T,\n arg,\n args as never,\n ) as never;\n }\n\n /**\n * Acts as `whereExists`, but prepends the condition with `OR`:\n *\n * ```ts\n * // find users who have an account or a profile,\n * // imagine that the user has both `account` and `profile` relations defined.\n * db.user.whereExist('account').orWhereExists('profile');\n * ```\n */\n orWhereExists<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n >(this: T, arg: Arg, ...args: JoinArgs<T, Arg>): T & QueryHasWhere {\n const q = _clone(this);\n return _queryOr(q, existsArgs(q, arg as never, args as never)) as never;\n }\n\n /**\n * Acts as `whereExists`, but negates the condition with `NOT`:\n *\n * ```ts\n * // find users who don't have an account,\n * // image that the user `belongsTo` or `hasOne` account.\n * db.user.whereNotExist('account');\n * ```\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param args - no arguments needed when the first argument is a relation name, or conditions to join the table with.\n */\n whereNotExists<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n >(this: T, arg: Arg, ...args: JoinArgs<T, Arg>): T & QueryHasWhere {\n const q = _clone(this);\n return _queryWhereNotExists(q, arg, args);\n }\n\n /**\n * Acts as `whereExists`, but prepends the condition with `OR` and negates it with `NOT`:\n *\n * ```ts\n * // find users who don't have an account OR who don't have a profile\n * // imagine that the user has both `account` and `profile` relations defined.\n * db.user.whereNotExists('account').orWhereNotExists('profile');\n * ```\n */\n orWhereNotExists<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n >(this: T, arg: Arg, ...args: JoinArgs<T, Arg>): T & QueryHasWhere {\n const q = _clone(this);\n return _queryOrNot(q, existsArgs(q, arg as never, args as never)) as never;\n }\n}\n","import { IsQuery, Query } from '../../query';\nimport { _queryWhere } from '../../basic-features/where/where';\nimport { _queryAll } from '../../query.utils';\nimport { QueryData } from '../../query-data';\nimport { RelationConfigBase } from '../../relations';\nimport { _applyRelationAliases, getQueryAs } from '../../basic-features/as/as';\n\nexport const _chain = (\n fromQuery: IsQuery,\n toQuery: IsQuery,\n rel: RelationConfigBase,\n) => {\n const self = fromQuery as Query;\n const toTable = toQuery as Query;\n\n let query: Query;\n let q: QueryData;\n if (self.q.subQuery) {\n query = toTable;\n query.q.subQuery = 2;\n q = query.q as QueryData;\n\n // once there is a hasMany or hasAndBelongsToMany in the chain,\n // the following belongTo and hasOne must also return multiple\n if (\n // `select({ q => q.rel })`: on the first relation it doesn't matter if the parent has chainMultiple\n self.q.subQuery > 1 &&\n self.q.chainMultiple\n ) {\n q.returnType = q.returnsOne = q.limit = undefined;\n } else if (!((rel.query as Query).q as QueryData).returnsOne) {\n q.chainMultiple = true;\n }\n } else {\n // Relation query returns a single record in case of belongsTo or hasOne,\n // but when called as a query chain like `q.user.profile` it should return many.\n query = _queryWhere(_queryAll(toTable), [\n {\n EXISTS: { q: rel.reverseJoin(self, toTable) },\n },\n ]);\n\n q = query.q as QueryData;\n\n q.returnType = q.returnsOne = q.limit = undefined;\n }\n\n if (self.q.relChain) {\n q.relChain = [...self.q.relChain, { query: self, rel }];\n } else {\n q.relChain = [{ query: self, rel }];\n }\n\n _applyRelationAliases(self, q);\n\n q.joinedShapes = {\n [getQueryAs(self)]: self.q.shape,\n ...self.q.joinedShapes,\n };\n\n rel.modifyRelatedQuery?.(query)?.(self);\n\n return query;\n};\n","import type { Query } from '../../query';\nimport { _clone } from '../../basic-features/clone/clone';\nimport { _chain } from '../../extra-features/chain/chain';\nimport { _setSubQueryAliases } from '../../basic-features/as/as';\nimport { ToSQLQuery } from '../../sql/to-sql';\nimport { getClonedQueryData } from '../../query-data';\n\n/**\n * In `select`, `update`, `create` it's possible to pass a callback with a sub-query.\n * This function resolves such a sub-query.\n *\n * @param q - main query object to pass to a callback as argument\n * @param cb - sub-query callback\n */\nexport const resolveSubQueryCallback = (\n q: ToSQLQuery,\n cb: (q: ToSQLQuery) => ToSQLQuery,\n): ToSQLQuery => {\n let base;\n // `with` can pass a generic `qb` here, it has no table.\n // Do not memoize anything into `internal` of a common `qb`,\n // because it is common and will be re-used.\n if (q.table) {\n base = q.internal.callbackArg;\n if (!base) {\n base = Object.create(q.baseQuery) as Query;\n base.baseQuery = base;\n\n const { relations } = q;\n for (const key in relations) {\n Object.defineProperty(base, key, {\n get() {\n const rel = relations[key as string];\n const relQuery = _clone(rel.query);\n relQuery.q.withShapes = this.q.withShapes;\n return _chain(this, relQuery, rel);\n },\n });\n }\n\n q.internal.callbackArg = base;\n }\n } else {\n base = q;\n }\n\n const arg = Object.create(base);\n\n arg.q = getClonedQueryData(q.q);\n arg.q.subQuery = 1;\n // Deleting `with` because sub-query should duplicate WITH statements of the parent query in its SQL\n arg.q.with = arg.q.relChain = undefined;\n _setSubQueryAliases(arg);\n\n return cb(arg as Query);\n};\n","import { QueryData, QueryType } from '../query-data';\nimport { ToSQLCtx } from './to-sql';\nimport { addTopCte, addTopCteSql } from 'pqb/internal';\n\nexport const getShouldWrapMainQueryInCte = (\n ctx: ToSQLCtx,\n q: QueryData,\n type: QueryType,\n isSubSql?: boolean,\n): boolean | undefined => {\n return (\n ((!isSubSql && type && ctx.topCtx.cteHooks) || q.appendQueries) && true\n );\n};\n\nexport const wrapMainQueryInCte = (\n ctx: ToSQLCtx,\n q: QueryData,\n isSubSql?: boolean,\n) => {\n let as: string | undefined;\n if (!isSubSql && !ctx.cteName) {\n as = addTopCteSql(ctx, ctx.wrapAs, ctx.sql.join(' '));\n }\n\n q.appendQueries?.forEach((query) =>\n addTopCte('after', ctx, query, query.q.type),\n );\n\n if (!isSubSql && !ctx.cteName) {\n const addNull = ctx.topCtx.cteHooks?.hasSelect;\n ctx.sql = [`SELECT *${addNull ? ', NULL' : ''} FROM ${as}`];\n }\n};\n","import {\n HasCteHooks,\n HasTableHook,\n} from '../basic-features/select/hook-select';\nimport { QueryResult } from '../../adapters/adapter';\nimport { PickQueryColumTypes } from '../pick-query-types';\nimport { DynamicSQLArg, StaticSQLArgs } from '../expressions/expression';\nimport { DynamicRawSQL, raw, RawSql } from '../expressions/raw-sql';\nimport { Column } from '../../columns';\nimport { ToSQLCtx, ToSQLQuery } from './to-sql';\nimport { QueryType } from '../query-data';\nimport { wrapMainQueryInCte } from './wrap-main-query-in-cte';\nimport { OrchidOrmInternalError } from '../errors';\nimport { QuerySchema } from '../basic-features/schema/schema';\nimport { getQuerySchema } from '../basic-features/storage/storage';\nimport { MutativeQueriesSelectRelationsSqlProp } from '../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\n\nexport interface SqlCommonOptions\n extends HasTableHook,\n HasCteHooks,\n MutativeQueriesSelectRelationsSqlProp {}\n\nexport interface SingleSqlItem {\n // SQL string\n text: string;\n // bind values passed along with SQL string\n values?: unknown[];\n runAfterQuery?: RunAfterQuery;\n}\n\n// is executed immediately after querying SQL.\n// `then` early returns its result if `runAfterQuery` returns a result.\nexport interface RunAfterQuery {\n (queryResult: QueryResult): void | Promise<{ result: unknown }>;\n}\n\nexport interface SingleSql extends SingleSqlItem, SqlCommonOptions {}\n\nexport interface BatchSql extends SqlCommonOptions {\n // batch of sql queries, is used when there is too many binding params for insert\n batch: SingleSql[];\n}\n\n// Output type of the `toSQL` method of query objects.\n// This will be passed to database adapter to perform query.\nexport type Sql = SingleSql | BatchSql;\n\nexport const makeSql = (\n ctx: ToSQLCtx,\n type: QueryType,\n isSubSql: boolean | undefined,\n runAfterQuery?: RunAfterQuery,\n): SingleSql => {\n if (\n (!isSubSql &&\n // require type to exclude SELECT because it does not require wrapping in CTE for UNION\n type &&\n // exclude insert because insert handles this logic on its own, since it has to deal with batches\n type !== 'insert' &&\n // exclude upsert because it upsert is SELECT from a union, select doesn't require wrapping\n type !== 'upsert' &&\n ctx.topCtx.cteHooks) ||\n ctx.q.appendQueries\n ) {\n wrapMainQueryInCte(ctx, ctx.q, isSubSql);\n }\n\n return {\n text: ctx.sql.join(' '),\n values: ctx.values,\n runAfterQuery,\n };\n};\n\nexport const quoteSchemaAndTable = (\n schema: string | undefined,\n table: string,\n): string => {\n return schema ? `\"${schema}\".\"${table}\"` : `\"${table}\"`;\n};\n\nexport const requireTableOrStringFrom = (query: ToSQLQuery): string => {\n const table =\n query.table ||\n (typeof query.q.from === 'string' ? query.q.from : undefined);\n\n if (!table) {\n throw new OrchidOrmInternalError(\n query,\n \"The query object does not have a table and doesn't define a `from` string\",\n );\n }\n\n return table;\n};\n\nexport const quoteTableWithSchema = (query: ToSQLQuery): string =>\n quoteFromWithSchema(getQuerySchema(query), requireTableOrStringFrom(query));\n\nexport const quoteFromWithSchema = (\n schema: QuerySchema | undefined,\n table: string,\n): string => {\n const s = typeof schema === 'function' ? schema() : schema;\n return s ? `\"${s}\".\"${table}\"` : `\"${table}\"`;\n};\n\nexport const makeRowToJson = (\n table: string,\n shape: Column.Shape.Data,\n aliasName: boolean,\n includingExplicitSelect?: boolean,\n): string => {\n let isSimple = true;\n const list: string[] = [];\n\n for (const key in shape) {\n const column = shape[key];\n if (!includingExplicitSelect && column.data.explicitSelect) {\n continue;\n }\n\n if ((aliasName && column.data.name) || column.data.jsonCast) {\n isSimple = false;\n }\n\n list.push(\n `'${key}', \"${table}\".\"${(aliasName && column.data.name) || key}\"${\n column.data.jsonCast ? `::${column.data.jsonCast}` : ''\n }`,\n );\n }\n\n return isSimple\n ? `row_to_json(\"${table}\".*)`\n : `CASE WHEN to_jsonb(\"${table}\") IS NULL THEN NULL ELSE json_build_object(` +\n list.join(', ') +\n ') END';\n};\n\nexport const getSqlText = (sql: Sql) => {\n if ('text' in sql) return sql.text;\n throw new Error(`Batch SQL is not supported in this query`);\n};\n\nexport class QuerySql<ColumnTypes> {\n /**\n * @deprecated: use `sql` exported from the `createBaseTable` (see \"define a base table\" in the docs)\n *\n * When there is a need to use a piece of raw SQL, use the `sql` exported from the `BaseTable` file, it is also attached to query objects for convenience.\n *\n * When selecting a custom SQL, specify a resulting type with `<generic>` syntax:\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * const result: { num: number }[] = await db.table.select({\n * num: sql<number>`random() * 100`,\n * });\n * ```\n *\n * In a situation when you want the result to be parsed, such as when returning a timestamp that you want to be parsed into a `Date` object, provide a column type in such a way:\n *\n * This example assumes that the `timestamp` column was overridden with `asDate` as shown in [Override column types](/guide/columns-overview#override-column-types).\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * const result: { timestamp: Date }[] = await db.table.select({\n * timestamp: sql`now()`.type((t) => t.timestamp()),\n * });\n * ```\n *\n * In some cases such as when using [from](/guide/orm-and-query-builder.html#from), setting column type via callback allows for special `where` operations:\n *\n * ```ts\n * const subQuery = db.someTable.select({\n * sum: () => sql`$a + $b`.type((t) => t.decimal()).values({ a: 1, b: 2 }),\n * });\n *\n * // `gt`, `gte`, `min`, `lt`, `lte`, `max` in `where`\n * // are allowed only for numeric columns:\n * const result = await db.$from(subQuery).where({ sum: { gte: 5 } });\n * ```\n *\n * Many query methods have a version suffixed with `Sql`, you can pass an SQL template literal directly to these methods.\n * These methods are: `whereSql`, `whereNotSql`, `orderSql`, `havingSql`, `fromSql`, `findBySql`.\n *\n * ```ts\n * await db.table.whereSql`\"someValue\" = random() * 100`;\n * ```\n *\n * Interpolating values in template literals is completely safe:\n *\n * ```ts\n * // get value from user-provided params\n * const { value } = req.params;\n *\n * // SQL injection is prevented by a library, this is safe:\n * await db.table.whereSql`column = ${value}`;\n * ```\n *\n * In the example above, TS cannot check if the table has `column` column, or if there are joined tables that have such column which will lead to error.\n * Instead, use the [column](/guide/sql-expressions#column) or [ref](/guide/sql-expressions#ref) to reference a column:\n *\n * ```ts\n * // ids will be prefixed with proper table names, no ambiguity:\n * db.table.join(db.otherTable, 'id', 'other.otherId').where`\n * ${db.table.column('id')} = 1 AND\n * ${db.otherTable.ref('id')} = 2\n * `;\n * ```\n *\n * SQL can be passed with a simple string, it's important to note that this is not safe to interpolate values in it.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * // no interpolation is okay\n * await db.table.where(sql({ raw: 'column = random() * 100' }));\n *\n * // get value from user-provided params\n * const { value } = req.params;\n *\n * // this is NOT safe, SQL injection is possible:\n * await db.table.where(sql({ raw: `column = random() * ${value}` }));\n * ```\n *\n * To inject values into `sql({ raw: '...' })` SQL strings, denote it with `$` in the string and provide `values` object.\n *\n * Use `$$` to provide column or/and table name (`column` or `ref` are preferable). Column names will be quoted so don't quote them manually.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * // get value from user-provided params\n * const { value } = req.params;\n *\n * // this is SAFE, SQL injection are prevented:\n * await db.table.where(\n * sql<boolean>({\n * raw: '$$column = random() * $value',\n * values: {\n * column: 'someTable.someColumn', // or simply 'column'\n * one: value,\n * two: 123,\n * },\n * }),\n * );\n * ```\n *\n * Summarizing:\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * // simplest form:\n * sql`key = ${value}`;\n *\n * // with resulting type:\n * sql<boolean>`key = ${value}`;\n *\n * // with column type for select:\n * sql`key = ${value}`.type((t) => t.boolean());\n *\n * // with column name via `column` method:\n * sql`${db.table.column('column')} = ${value}`;\n *\n * // raw SQL string, not allowed to interpolate values:\n * sql({ raw: 'random()' });\n *\n * // with resulting type and `raw` string:\n * sql<number>({ raw: 'random()' });\n *\n * // with column name and a value in a `raw` string:\n * sql({\n * raw: `$$column = $value`,\n * values: { column: 'columnName', value: 123 },\n * });\n *\n * // combine template literal, column type, and values:\n * sql`($one + $two) / $one`.type((t) => t.numeric()).values({ one: 1, two: 2 });\n * ```\n *\n * @param args - template literal or an object { raw: string }\n * @return object that has `type` and `values` methods\n */\n sql<T = unknown>(\n this: PickQueryColumTypes,\n ...args: StaticSQLArgs\n ): RawSql<Column.Pick.QueryColumnOfType<T>, ColumnTypes>;\n sql<T = unknown>(\n this: PickQueryColumTypes,\n ...args: [DynamicSQLArg<Column.Pick.QueryColumnOfType<T>>]\n ): DynamicRawSQL<Column.Pick.QueryColumnOfType<T>, ColumnTypes>;\n sql(this: PickQueryColumTypes, ...args: unknown[]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sql = (raw as any)(...args);\n sql.columnTypes = this.columnTypes;\n return sql;\n }\n}\n","import {\n IsQuery,\n Query,\n QuerySelectable,\n SelectableFromShape,\n} from '../../query';\nimport { Column } from '../../../columns/column';\nimport { addColumnParserToQuery, ColumnsShape } from '../../../columns';\nimport {\n PickQuerySelectableResultRelationsWithDataReturnType,\n PickQueryResultRelationsWithDataReturnTypeShape,\n PickQuerySelectableShapeRelationsWithDataAs,\n PickQueryQ,\n PickQueryRelationsWithData,\n PickQueryTable,\n PickQueryResultAs,\n PickQueryShapeAsRelations,\n PickQuerySelectable,\n PickQuerySelectableRelationsResultReturnType,\n PickQuerySelectableShape,\n PickQuerySelectableColumnTypes,\n PickQuerySelectableResultAs,\n PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n PickQuerySelectableShapeRelationsWithDataAsResultReturnType,\n PickQueryHasSelectResultShapeAsRelations,\n PickQuerySelectableRelations,\n PickQueryResultAsRelations,\n PickQueryRelations,\n} from '../../pick-query-types';\nimport {\n EmptyObject,\n EmptyTuple,\n pushOrNewArrayToObjectImmutable,\n setObjectValueImmutable,\n} from '../../../utils';\nimport { getQueryAs } from '../as/as';\nimport { Expression } from '../../expressions/expression';\nimport { _clone } from '../clone/clone';\nimport {\n prepareSubQueryForSql,\n SubQueryForSql,\n} from '../../internal-features/sub-query/sub-query-for-sql';\nimport { _queryNone, isQueryNone } from '../../extra-features/none/none';\nimport {\n BatchParsers,\n ColumnsParsers,\n getQueryParsers,\n setParserToQuery,\n} from '../../query-columns/query-column-parsers';\nimport { preprocessJoinArg, processJoinArgs } from './process-join-args';\nimport { getIsJoinSubQuery } from '../../sql/get-is-join-sub-query';\nimport { getShapeFromSelect } from '../select/select.utils';\nimport { WithDataItem } from '../cte/cte.sql';\nimport {\n isRelationQuery,\n RelationConfigBase,\n RelationsBase,\n} from '../../relations';\nimport { ComputedColumns } from '../../extra-features/computed/computed';\nimport { throwIfJoinLateral } from '../../query.utils';\nimport { resolveSubQueryCallback } from '../../internal-features/sub-query/sub-query';\nimport { SelectAs, SelectAsValue, SelectItem } from '../select/select.sql';\nimport { JoinItemArgs } from './join.sql';\nimport { getSqlText } from '../../sql/sql';\nimport { JoinValueDedupItem, pushQueryValueImmutable } from '../../query-data';\nimport { ToSQLQuery } from '../../sql/to-sql';\nimport { QueryThenByQuery } from '../../then/then';\nimport { getValueKey } from '../get/get-value-key';\n\n// Type of column names of a `with` table, to use to join a `with` table by these columns.\n// Union of `with` column names that may be prefixed with a `with` table name.\ntype WithSelectable<W extends WithDataItem> =\n | keyof W['shape']\n | `${W['table']}.${keyof W['shape'] & string}`;\n\n/**\n * The first argument of all `join` and `joinLateral` methods.\n * See argument of {@link join}.\n */\nexport type JoinFirstArg<T extends PickQueryRelationsWithData> =\n | PickQueryResultAs\n | keyof T['relations']\n | keyof T['withData']\n | ((q: {\n [K in keyof T['relations']]: T['relations'][K]['query'];\n }) => PickQueryResultAs)\n | FnPickQueryResultAs;\n\ninterface FnPickQueryResultAs {\n (): PickQueryResultAs;\n}\n\n/**\n * Arguments of `join` methods (not `joinLateral`).\n * See {@link join}\n */\nexport type JoinArgs<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n> = Arg extends PickQueryResultAs\n ? // Available arguments when joining a query object. Can be:\n // - an object where keys are columns of the joined table and values are columns of the main table or a raw SQL.\n // - raw SQL expression\n // - `true` to join without conditions\n // - pair of columns, first is of the joined table, second is of main table\n // - string tuple of a column of a joined table, operator string such as '=' or '!=', and a column of the main table\n | [\n conditions:\n | {\n [K in JoinSelectable<Arg>]:\n | keyof T['__selectable']\n | Expression;\n }\n | Expression,\n ]\n | [\n leftColumn: JoinSelectable<Arg> | Expression,\n rightColumn: keyof T['__selectable'] | Expression,\n ]\n | [\n leftColumn: JoinSelectable<Arg> | Expression,\n op: string,\n rightColumn: keyof T['__selectable'] | Expression,\n ]\n : Arg extends keyof T['withData']\n ? JoinWithArgs<T, T['withData'][Arg]>\n : EmptyTuple;\n\n/**\n * Column names of the joined table that can be used to join.\n * Derived from 'result', not from 'shape',\n * because if the joined table has a specific selection, it will be wrapped like:\n * ```sql\n * JOIN (SELECT something FROM joined) joined ON joined.something = ...\n * ```\n * And the selection becomes available to use in the `ON` and to select from the joined table.\n */\ntype JoinSelectable<Q extends PickQueryResultAs> =\n | keyof Q['result']\n | `${Q['__as']}.${keyof Q['result'] & string}`;\n\n// Available arguments when joining a `with` table. Can be:\n// - an object where keys are columns of the `with` table and values are columns of the main table or a raw SQL\n// - raw SQL expression\n// - pair of columns, first is of the `with` table, second is of main table\n// - string tuple of a column of a `with` table, operator string such as '=' or '!=', and a column of the main table\ntype JoinWithArgs<T extends PickQuerySelectable, Arg extends WithDataItem> =\n | [\n conditions:\n | {\n [K in WithSelectable<Arg>]: keyof T['__selectable'] | Expression;\n }\n | Expression,\n ]\n | [\n leftColumn: WithSelectable<Arg> | Expression,\n rightColumn: keyof T['__selectable'] | Expression,\n ]\n | [\n leftColumn: WithSelectable<Arg> | Expression,\n op: string,\n rightColumn: keyof T['__selectable'] | Expression,\n ];\n\nexport type JoinResultRequireMain<\n T extends PickQuerySelectable,\n JoinedSelectable,\n> = {\n // is optimal\n [K in keyof T]: K extends '__selectable'\n ? T['__selectable'] & JoinedSelectable\n : T[K];\n};\n\n/**\n * Result of all `join` methods, not `joinLateral`.\n * Adds joined table columns from its 'result' to the '__selectable' of the query.\n */\nexport type JoinResult<\n T extends PickQuerySelectableRelationsResultReturnType,\n Joined extends PickQuerySelectableRelations,\n RequireMain,\n> = RequireMain extends true\n ? {\n // is optimal, same as JoinResultRequireMain above, inlined for fewer instantiations.\n [K in keyof T]: K extends '__selectable'\n ? T['__selectable'] & Joined['__selectable']\n : K extends 'relations'\n ? {\n [K in\n | keyof T['relations']\n | keyof Joined['relations']]: K extends keyof Joined['relations']\n ? Joined['relations'][K]\n : T['relations'][K];\n }\n : T[K];\n }\n : {\n [K in keyof T]: K extends '__selectable'\n ? {\n [K in keyof T['__selectable']]: {\n as: T['__selectable'][K]['as'];\n column: Column.Modifiers.QueryColumnToNullable<\n T['__selectable'][K]['column']\n >;\n };\n } & Joined['__selectable'] // & is optimal\n : K extends 'result'\n ? // nullable result: inlined for optimization\n {\n [K in keyof T['result']]: Column.Modifiers.QueryColumnToNullable<\n T['result'][K]\n >;\n }\n : K extends 'then'\n ? QueryThenByQuery<\n T,\n // nullable result: inlined for optimization\n {\n [K in keyof T['result']]: Column.Modifiers.QueryColumnToNullable<\n T['result'][K]\n >;\n }\n >\n : K extends 'relations'\n ? {\n [K in\n | keyof T['relations']\n | keyof Joined['relations']]: K extends keyof Joined['relations']\n ? Joined['relations'][K]\n : T['relations'][K];\n }\n : T[K];\n };\n\n/**\n * Calls {@link JoinResult} with either callback result, if join has a callback,\n * or with a query derived from the first join argument.\n */\nexport type JoinResultFromArgs<\n T extends PickQuerySelectableResultRelationsWithDataReturnType,\n Arg,\n Args extends unknown[],\n RequireJoined,\n RequireMain,\n> = JoinResult<\n T,\n // .join(db.table, () => query)\n Args[0] extends GenericJoinCallback\n ? JoinResultSelectable<\n ReturnType<Args[0]>['result'],\n ReturnType<Args[0]>['__as'],\n ReturnType<Args[0]>['relations'],\n RequireJoined\n >\n : // .join(db.table, ...)\n Arg extends PickQueryHasSelectResultShapeAsRelations\n ? JoinResultSelectable<\n Arg['__hasSelect'] extends true\n ? // If joined query has select, computed values won't be available, use `result` as is\n Arg['result']\n : // If no select, allow using computed values by setting result to shape\n Arg['shape'],\n Arg['__as'],\n Arg['relations'],\n RequireJoined\n >\n : // .join('rel-name')\n Arg extends keyof T['relations']\n ? JoinResultSelectable<\n T['relations'][Arg]['query']['shape'],\n T['relations'][Arg]['query']['__as'],\n T['relations'][Arg]['query']['relations'],\n RequireJoined\n >\n : // .join((q) => q.relation)\n // .join(() => db.table)\n Arg extends FirstArgCallback\n ? JoinResultSelectable<\n ReturnType<Arg>['shape'],\n ReturnType<Arg>['__as'],\n ReturnType<Arg>['relations'],\n RequireJoined\n >\n : // .join('cte-name')\n Arg extends keyof T['withData']\n ? T['withData'][Arg] extends WithDataItem\n ? JoinResultSelectable<\n T['withData'][Arg]['shape'],\n T['withData'][Arg]['table'],\n EmptyObject,\n RequireJoined\n >\n : never\n : never,\n RequireMain\n>;\n\ninterface GenericJoinCallback {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (...args: any[]): PickQueryResultAsRelations;\n}\ninterface FirstArgCallback {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (...args: any[]): PickQueryShapeAsRelations;\n}\n\n/**\n * Result of all `joinLateral` methods.\n * Adds joined table columns from its 'result' to the '__selectable' of the query.\n *\n * @param T - query type to join to\n * @param Arg - first arg of join, see {@link JoinFirstArg}\n * @param RequireJoined - when false, joined table shape will be mapped to make all columns optional\n */\nexport type JoinLateralResult<\n T extends PickQuerySelectable,\n As extends string,\n Result extends Column.QueryColumns,\n JoinedRelations extends RelationsBase,\n RequireJoined,\n> = JoinAddSelectable<\n T,\n JoinResultSelectable<Result, As, JoinedRelations, RequireJoined>\n>;\n\n/**\n * Build `selectable` type for joined table.\n *\n * When `RequireJoined` parameter is false,\n * the result type of the joined table will be mapped to make all columns optional.\n *\n * Callback may override the joined table alias.\n *\n * The resulting selectable receives all joined table columns prefixed with the table name or alias,\n * and a star prefixed with the table name or alias to select all joined columns.\n */\nexport type JoinResultSelectable<\n // Interestingly, accepting T and inlining T['result'] adds a LOT (~823k) instantiations\n Result extends Column.QueryColumns,\n As extends string,\n JoinedRelations,\n RequireJoined,\n> = RequireJoined extends true\n ? {\n __selectable: {\n [K in '*' | (keyof Result & string) as `${As}.${K}`]: K extends '*'\n ? {\n as: As;\n column: ColumnsShape.MapToObjectColumn<Result>;\n }\n : {\n as: K;\n column: Result[K];\n };\n };\n relations: {\n [K in keyof JoinedRelations &\n string as `${As}.${K}`]: JoinedRelations[K];\n };\n }\n : {\n __selectable: {\n [K in '*' | (keyof Result & string) as `${As}.${K}`]: K extends '*'\n ? {\n as: As;\n column: ColumnsShape.MapToNullableObjectColumn<Result>;\n }\n : {\n as: K;\n column: Column.Modifiers.QueryColumnToNullable<Result[K]>;\n };\n };\n relations: {\n [K in keyof JoinedRelations &\n string as `${As}.${K}`]: JoinedRelations[K];\n };\n };\n\n// Replace the '__selectable' of the query with the given selectable.\ntype JoinAddSelectable<\n T extends PickQuerySelectable,\n Joined extends PickQuerySelectableRelations,\n> = {\n // is optimal\n [K in keyof T]: K extends '__selectable'\n ? T['__selectable'] & Joined['__selectable']\n : T[K];\n};\n\n/**\n * Map the first argument of `join` or `joinLateral` to a query type.\n *\n * `with` table arg is mapped into `QueryBase`,\n * query arg is returned as is,\n * relation name is replaced with a relation table.\n */\nexport type JoinArgToQuery<\n T extends PickQueryRelationsWithData,\n Arg extends JoinFirstArg<T>,\n> = Arg extends keyof T['withData']\n ? T['withData'][Arg] extends WithDataItem\n ? /**\n * Map the `with` table first argument of `join` or `joinLateral` to a query type.\n * Constructs `selectable` based on `with` table shape.\n */\n {\n [K in 'result' | '__as' | keyof T]: K extends '__as'\n ? T['withData'][Arg]['table']\n : K extends '__selectable'\n ? {\n [K in keyof T['withData'][Arg]['shape'] &\n string as `${T['withData'][Arg]['table']}.${K}`]: {\n as: K;\n column: T['withData'][Arg]['shape'][K];\n };\n }\n : K extends 'result'\n ? T['withData'][Arg]['shape']\n : K extends keyof T\n ? T[K]\n : never;\n }\n : never\n : Arg extends PickQuerySelectableResultAs\n ? Arg\n : Arg extends keyof T['relations']\n ? T['relations'][Arg]['query']\n : Arg extends JoinArgToQueryCallback\n ? ReturnType<Arg>\n : never;\n\ninterface JoinArgToQueryCallback {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (...args: any[]): IsQuery;\n}\n\n/**\n * Type of the `join` callback (not `joinLateral`).\n *\n * Receives a query builder that can access columns of both the main and the joined table.\n *\n * The query builder is limited to `or` and `where` methods only.\n *\n * Callback must return a query builder.\n */\nexport interface JoinCallback<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n> {\n (q: JoinQueryBuilder<T, JoinArgToQuery<T, Arg>>): IsQuery;\n}\n\nexport type JoinCallbackArgs<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n> = [cb?: JoinCallback<T, Arg> | true];\n\n/**\n * Type of {@link QueryJoin.join} query method.\n */\nexport interface JoinQueryMethod {\n <\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallbackArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Cb | JoinArgs<T, Arg>\n ): JoinResultFromArgs<T, Arg, Cb, true, true>;\n}\n\n/**\n * After getting a query from a sub-query callback,\n * join it to the main query in case it's a relation query.\n *\n * If it's not a relation query, it will be returned as is.\n *\n * @param q - main query object\n * @param sub - sub-query query object\n */\nexport const joinSubQuery = (q: ToSQLQuery, sub: ToSQLQuery): SubQueryForSql =>\n prepareSubQueryForSql(\n q as Query,\n (isRelationQuery(sub) ? sub.joinQuery(sub, q) : sub) as never,\n );\n\nexport const _joinReturningArgs = <\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n RequireJoined extends boolean,\n>(\n query: T,\n require: RequireJoined,\n first:\n | JoinFirstArg<never>\n // is used by `joinQueryChainHOF` in ORM\n | { _internalJoin: Query },\n args: JoinArgs<Query, JoinFirstArg<Query>>,\n forbidLateral?: boolean,\n): JoinItemArgs | undefined => {\n let joinKey: string | undefined;\n let joined: Query | undefined;\n let shape: Column.QueryColumns | undefined;\n let parsers: ColumnsParsers | undefined;\n let batchParsers: BatchParsers | undefined;\n let computeds: ComputedColumns | undefined;\n let joinSubQuery = false;\n let joinTo = query as unknown as Query;\n\n first = preprocessJoinArg(query, first as JoinFirstArg<never>) as Query;\n\n if (typeof first === 'object') {\n let isInternalJoin;\n if ('_internalJoin' in first) {\n isInternalJoin = true;\n first = first._internalJoin as JoinFirstArg<never>;\n }\n\n if (require && isQueryNone(first)) {\n return;\n }\n\n const q = first as Query;\n if (!isInternalJoin) {\n joinSubQuery = getIsJoinSubQuery(q);\n }\n\n joinKey = q.q.as || q.table;\n if (joinKey) {\n joined = q;\n shape = getShapeFromSelect(q, joinSubQuery && !!q.q.select);\n parsers = getQueryParsers(q);\n batchParsers = q.q.batchParsers;\n computeds = q.q.runtimeComputeds;\n\n if (joinSubQuery) {\n first = q.clone() as JoinFirstArg<Query>;\n (first as Query).shape = shape as never;\n }\n }\n } else {\n joinKey = first as string;\n\n const relation = query.relations[joinKey];\n if (relation) {\n joined = relation.query as Query;\n shape = getShapeFromSelect(relation.query as never);\n const r = prepareSubQueryForSql(query as never, relation.query as Query);\n parsers = getQueryParsers(r as unknown as Query);\n batchParsers = r.q.batchParsers;\n computeds = r.q.runtimeComputeds;\n } else {\n const i = joinKey.indexOf('.');\n if (i === -1) {\n const w = (query as unknown as PickQueryQ).q.withShapes?.[joinKey];\n shape = w?.shape;\n computeds = w?.computeds;\n // TODO batchParsers\n\n if (shape) {\n // clone the shape to mutate it below; in other cases the shape is newly created\n if (!require) shape = { ...shape };\n\n const arg = { parsers: {} as ColumnsParsers };\n for (const key in shape) {\n addColumnParserToQuery(arg, key, shape[key]);\n }\n }\n } else {\n const joinedRelKey = joinKey.slice(0, i);\n const joinedQuery = (query as unknown as PickQueryQ).q.joined?.[\n joinedRelKey\n ] as Query;\n joinTo = joinedQuery;\n joinKey = first = joinKey.slice(i + 1);\n const relation = joinedQuery.relations[first];\n joined = relation.query as Query;\n shape = getShapeFromSelect(relation.query as never);\n const r = prepareSubQueryForSql(\n query as never,\n relation.query as Query,\n );\n parsers = getQueryParsers(r as unknown as Query);\n batchParsers = r.q.batchParsers;\n computeds = r.q.runtimeComputeds;\n }\n }\n }\n\n const joinArgs = processJoinArgs(\n joinTo,\n first,\n args,\n joinSubQuery,\n shape,\n false,\n joinKey,\n forbidLateral,\n );\n\n if ('r' in joinArgs) {\n joinKey = getQueryAs(joinArgs.r as never);\n if (joined && joinKey !== getQueryAs(joined)) {\n joined = _clone(joined);\n joined.q.as = joinKey;\n }\n }\n\n if (require && 'r' in joinArgs && isQueryNone(joinArgs.r)) {\n return;\n } else if (joinKey && 's' in joinArgs && joinArgs.s) {\n const j = (\n 'j' in joinArgs\n ? joinArgs.r ?? joinArgs.j\n : 'r' in joinArgs\n ? joinArgs.r\n : joinArgs.q\n ) as Query;\n\n const jq = j.q;\n if (jq.select || !jq.selectAllColumns) {\n const { q } = query as unknown as PickQueryQ;\n\n // if 2nd argument callback is present, and it has select,\n // re-assign the columns shape from it.\n if ('r' in joinArgs && joinArgs.r) {\n joinArgs.c = shape = getShapeFromSelect(j, true);\n }\n\n if (joined) setObjectValueImmutable(q, 'joined', joinKey, joined);\n setObjectValueImmutable(q, 'joinedShapes', joinKey, shape);\n setObjectValueImmutable(q, 'joinedParsers', joinKey, getQueryParsers(j));\n\n if (jq.batchParsers) {\n setObjectValueImmutable(\n jq,\n 'joinedBatchParsers',\n joinKey,\n jq.batchParsers,\n );\n }\n\n setObjectValueImmutable(\n q,\n 'joinedComputeds',\n joinKey,\n jq.runtimeComputeds,\n );\n } else {\n addAllShapesAndParsers(\n query,\n joinKey,\n joined,\n shape,\n parsers,\n batchParsers,\n computeds,\n );\n }\n } else {\n addAllShapesAndParsers(\n query,\n joinKey,\n joined,\n shape,\n parsers,\n batchParsers,\n computeds,\n );\n }\n\n return joinArgs;\n};\n\nconst addAllShapesAndParsers = (\n query: unknown,\n joinKey?: string,\n joined?: PickQueryRelations,\n shape?: Column.QueryColumns,\n parsers?: ColumnsParsers,\n batchParsers?: BatchParsers,\n computeds?: ComputedColumns,\n) => {\n if (!joinKey) return;\n\n const { q } = query as PickQueryQ;\n\n if (joined) setObjectValueImmutable(q, 'joined', joinKey, joined);\n setObjectValueImmutable(q, 'joinedShapes', joinKey, shape);\n setObjectValueImmutable(q, 'joinedParsers', joinKey, parsers);\n\n if (batchParsers) {\n setObjectValueImmutable(q, 'joinedBatchParsers', joinKey, batchParsers);\n }\n\n setObjectValueImmutable(q, 'joinedComputeds', joinKey, computeds);\n};\n\n/**\n * Generic function to construct all JOIN queries.\n * Add a shape of the joined table into `joinedShapes`.\n * Add column parsers of the joined table into `joinedParsers`.\n * Add join data into `join` of the query data.\n *\n * @param query - query object to join to\n * @param require - true for INNER kind of JOIN\n * @param type - SQL of the JOIN kind: JOIN, LEFT JOIN, RIGHT JOIN, etc.\n * @param first - the first argument of join: join target\n * @param args - rest join arguments: columns to join with, or a callback\n */\nexport const _join = (\n query: PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n require: boolean,\n type: string,\n first:\n | JoinFirstArg<never>\n // is used by `joinQueryChainHOF` in ORM\n | { _internalJoin: Query },\n args: JoinArgs<Query, JoinFirstArg<Query>>,\n): never => {\n const joinArgs = _joinReturningArgs(query, require, first, args);\n if (!joinArgs) {\n return _queryNone(query) as never;\n }\n\n pushQueryValueImmutable(query as never, 'join', {\n type,\n args: joinArgs,\n });\n\n if ((query as unknown as PickQueryQ).q.type === 'delete') {\n throwIfJoinLateral(\n query as never,\n (query as unknown as PickQueryQ).q.type as string,\n );\n }\n\n return query as never;\n};\n\nexport const _joinLateralProcessArg = (\n q: Query,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n arg: JoinFirstArg<any>,\n cb: (\n q: JoinQueryBuilder<PickQuerySelectableShape, PickQuerySelectableResultAs>,\n ) => {\n table: string;\n result: Column.QueryColumns;\n },\n): Query => {\n let relation: RelationConfigBase | undefined;\n if (typeof arg === 'string') {\n relation = q.relations[arg];\n if (relation) {\n arg = _clone(relation.query);\n } else {\n const w = q.q.withShapes?.[arg];\n if (w) {\n const t = Object.create((q as unknown as Query).qb);\n t.table = arg;\n t.shape = w.shape;\n t.computeds = w.computeds;\n t.q = {\n ...t.q,\n shape: w.shape,\n };\n t.baseQuery = t;\n arg = t;\n }\n }\n }\n\n let result = resolveSubQueryCallback(\n arg as Query,\n cb as never,\n ) as unknown as Query;\n\n if (relation) {\n result = relation.joinQuery(\n result as unknown as Query,\n q as unknown as Query,\n ) as unknown as Query;\n }\n\n return result;\n};\n\n/**\n * Generic function to construct all JOIN LATERAL queries.\n * Adds a shape of the joined table into `joinedShapes`.\n * Adds column parsers of the joined table into `joinedParsers`.\n * Adds join data into `join` of the query data.\n *\n * @param self - query object to join to\n * @param type - SQL of the JOIN kind: JOIN or LEFT JOIN\n * @param joinQuery - join target: a query, or a relation name, or a `with` table name, or a callback returning a query.\n * @param as - alias of the joined table, it is set the join lateral happens when selecting a relation in `select`\n * @param innerJoinLateral - add `ON p.r IS NOT NULL` check to have INNER JOIN like experience when sub-selecting arrays.\n */\nexport const _joinLateral = (\n self: PickQueryResultRelationsWithDataReturnTypeShape,\n type: string,\n joinQuery: Query,\n as?: string,\n innerJoinLateral?: boolean,\n): string | undefined => {\n const query = self as Query;\n\n joinQuery = prepareSubQueryForSql(self as Query, joinQuery) as never;\n joinQuery.q.joinTo = query;\n\n as ||= getQueryAs(joinQuery);\n setObjectValueImmutable(\n query.q,\n 'joinedComputeds',\n as,\n joinQuery.q.runtimeComputeds,\n );\n\n const joinArgs = {\n l: joinQuery,\n a: as,\n i: innerJoinLateral,\n };\n\n const joinAs = (as || joinQuery.q.as || joinQuery.table) as string;\n\n const joinValue =\n joinQuery.q.returnType === 'value' ||\n joinQuery.q.returnType === 'valueOrThrow';\n\n let joinValueAs: string | undefined;\n let joinValueSelect: SelectItem | undefined;\n let existingValue: JoinValueDedupItem | undefined;\n\n if (joinValue) {\n const map = query.q.joinValueDedup\n ? new Map(query.q.joinValueDedup)\n : new Map<string, JoinValueDedupItem>();\n query.q.joinValueDedup = map;\n\n const select = joinQuery.q.select as SelectItem[];\n joinValueSelect = select[0];\n joinQuery.q.select = [];\n const dedupKey = getSqlText(joinQuery.toSQL());\n joinQuery.q.select = select;\n\n existingValue = map.get(dedupKey);\n if (existingValue) {\n joinValueAs = existingValue.a as string;\n } else {\n joinValueAs = joinAs;\n map.set(dedupKey, { q: joinQuery, a: as });\n }\n }\n\n if (!existingValue) {\n const joinedAs = getQueryAs(query);\n setObjectValueImmutable(\n joinQuery.q,\n 'joinedShapes',\n joinedAs,\n query.q.shape,\n );\n }\n\n const shape = getShapeFromSelect(joinQuery, true);\n setObjectValueImmutable(query.q, 'joinedShapes', joinAs, shape);\n\n const parsers = getQueryParsers(joinQuery);\n\n if (joinValue) {\n setObjectValueImmutable(query.q, 'valuesJoinedAs', joinAs, joinValueAs);\n\n const parse = parsers && getValueKey in parsers;\n if (parse) {\n const parse = parsers[getValueKey];\n setParserToQuery(query.q, joinAs, parse);\n parsers[joinAs] = parse;\n }\n }\n\n setObjectValueImmutable(\n query.q,\n 'joinedParsers',\n joinValueAs || joinAs,\n getQueryParsers(joinQuery),\n );\n\n if (joinQuery.q.batchParsers) {\n setObjectValueImmutable(\n query.q,\n 'joinedBatchParsers',\n joinAs,\n joinQuery.q.batchParsers,\n );\n }\n\n if (joinValueAs) {\n if (existingValue) {\n existingValue.q.q.select = [\n {\n selectAs: {\n ...((existingValue.q.q.select?.[0] as SelectAs)\n .selectAs as SelectAsValue),\n [joinAs]: joinValueSelect as never,\n },\n },\n ];\n\n return joinValueAs;\n }\n\n joinQuery.q.select = [\n { selectAs: { [joinValueAs]: joinValueSelect as string } },\n ];\n }\n\n pushQueryValueImmutable(query, 'join', {\n type: `${type} LATERAL`,\n args: joinArgs,\n });\n\n return joinAs;\n};\n\nexport class QueryJoin {\n /**\n * ## Select relation\n *\n * Before joining a table, consider if selecting a relation is enough for your case:\n *\n * ```ts\n * // select users with profiles\n * // result type is Array<{ name: string, profile: Profile }>\n * await db.user.select('name', {\n * profile: (q) => q.profile,\n * });\n *\n * // select posts with counts of comments, filter and order by comments count\n * // result type is Array<Post & { commentsCount: number }>\n * await db.post\n * .select('*', {\n * commentsCount: (q) => q.comments.count(),\n * })\n * .where({ commentsCount: { gt: 10 } })\n * .order({ commentsCount: 'DESC' });\n *\n * // select authors with array of their book titles\n * // result type is Array<Author & { books: string[] }>\n * await db.author.select('*', {\n * books: (q) => q.books.pluck('title'),\n * });\n * ```\n *\n * Internally, such selects will use `LEFT JOIN LATERAL` to join a relation.\n * If you're loading users with profiles (one-to-one relation), and some users don't have a profile, `profile` property will have `NULL` for such users.\n * If you want to load only users that have profiles, and filter out the rest, add `.join()` method to the relation without arguments:\n *\n * ```ts\n * // load only users who have a profile\n * await db.user.select('*', {\n * profile: (q) => q.profile.join(),\n * });\n *\n * // load only users who have a specific profile\n * await db.user.select('*', {\n * profile: (q) => q.profile.join().where({ age: { gt: 20 } }),\n * });\n * ```\n *\n * You can also use this `.join()` method on the one-to-many relations, and records with empty array will be filtered out:\n *\n * ```ts\n * // posts that have no tags won't be loaded\n * // result type is Array<Post & { tags: Tag[] }>\n * db.post.select('*', {\n * tags: (q) => q.tags.join(),\n * });\n * ```\n *\n * # join\n *\n * `join` methods allows to join other tables, relations by name, [with](/guide/advanced-queries#with) statements, sub queries.\n *\n * All the `join` methods accept the same arguments, but returning type is different because with `join` it's guaranteed to load joined table, and with `leftJoin` the joined table columns may be `NULL` when no matching record was found.\n *\n * For the following examples, imagine you have a `User` table with `id` and `name`, and `Message` table with `id`, `text`, messages belongs to user via `userId` column:\n *\n * ```ts\n * export class UserTable extends BaseTable {\n * readonly table = 'user';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * name: t.text(),\n * }));\n *\n * relations = {\n * messages: this.hasMany(() => MessageTable, {\n * primaryKey: 'id',\n * foreignKey: 'userId',\n * }),\n * };\n * }\n *\n * export class MessageTable extends BaseTable {\n * readonly table = 'message';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * text: t.text(),\n * ...t.timestamps(),\n * }));\n *\n * relations = {\n * user: this.belongsTo(() => UserTable, {\n * primaryKey: 'id',\n * foreignKey: 'userId',\n * }),\n * };\n * }\n * ```\n *\n * `join` is a method for SQL `JOIN`, which is equivalent to `INNER JOIN`, `LEFT INNERT JOIN`.\n *\n * When no matching record is found, it will skip records of the main table.\n *\n * ### join relation\n *\n * When relations are defined between the tables, you can join them by a relation name.\n * Joined table can be references from `where` and `select` by a relation name.\n *\n * ```ts\n * const result = await db.user\n * .join('messages')\n * // after joining a table, you can use it in `where` conditions:\n * .where({ 'messages.text': { startsWith: 'Hi' } })\n * .select(\n * 'name', // name is User column, table name may be omitted\n * 'messages.text', // text is the Message column, and the table name is required\n * );\n *\n * // result has the following type:\n * const ok: { name: string; text: string }[] = result;\n * ```\n *\n * The first argument can also be a callback, where instead of relation name as a string you're picking it as a property of `q`.\n * In such a way, you can alias the relation with `as`, add `where` conditions, use other query methods.\n *\n * ```ts\n * const result = await db.user.join((q) =>\n * q.messages.as('m').where({ text: 'some text' }),\n * );\n * ```\n *\n * Optionally, you can pass a second callback argument, it makes `on` and `orOn` methods available.\n *\n * But remember that when joining a relation, the relevant `ON` conditions are already handled automatically.\n *\n * ```ts\n * const result = await db.user.join(\n * (q) => q.messages.as('m'),\n * (q) =>\n * q\n * .on('messages.text', 'user.name') // additionally, match message with user name\n * .where({ text: 'some text' }), // you can add `where` in a second callback as well.\n * );\n * ```\n *\n * ### join a relation of the joined\n *\n * After joining a relation or a table:\n *\n * ```ts\n * db.post.join('comments');\n *\n * db.post.join(() => db.comment);\n * ```\n *\n * You can join a relation of that joined table:\n *\n * ```ts\n * db.post.join('comments').join('comments.author');\n *\n * db.post.join(() => db.comment).join('comment.author');\n * ```\n *\n * Note that in the first case it's `comments` - a relation name, while in the second case it is a table name.\n *\n * ### joins deduplication\n *\n * When joining the same table with the same condition more than once, duplicated joins will be ignored:\n *\n * ```ts\n * // joining a relation\n * db.post.join('comments').join('comments');\n *\n * // joining a table with a condition\n * db.post\n * .join('comments', 'comments.postId', 'post.id')\n * .join('comments', 'comments.postId', 'post.id');\n * ```\n *\n * Both queries will produce SQL with only 1 join\n *\n * ```sql\n * SELECT * FROM post JOIN comments ON comments.postId = post.id\n * ```\n *\n * However, this is only possible if the join has no dynamic values:\n *\n * ```ts\n * db.post\n * .join('comments', (q) => q.where({ rating: { gt: 5 } }))\n * .join('comments', (q) => q.where({ rating: { gt: 5 } }));\n * ```\n *\n * Both joins above have the same `{ gt: 5 }`, but still, the `5` is a dynamic value and in this case joins will be duplicated,\n * resulting in a database error.\n *\n * ### select full joined records\n *\n * `select` supports selecting a full record of a previously joined table by passing a table name with `.*` at the end:\n *\n * ```ts\n * const result = await db.book.join('author').select('title', {\n * author: 'author.*',\n * });\n *\n * // result has the following type:\n * const ok: {\n * // title of the book\n * title: string;\n * // a full author record is included:\n * author: { id: number; name: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * It works fine for `1:1` (`belongsTo`, `hasOne`) relations, but it may have an unexpected result for `1:M` or `M:M` (`hasMany`, `hasAndBelongsToMany`) relations.\n * For any kind of relation, it results in one main table record with data of exactly one joined table record, i.e. when selecting in this way, the records **won't** be collected into arrays.\n *\n * ```ts\n * const result = await db.user\n * .join('messages')\n * .where({ 'messages.text': { startsWith: 'Hi' } })\n * .select('name', { messages: 'messages.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included:\n * messages: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * Because it's a one-to-many relation, one user has many messages, the user data will be duplicated for different messages data:\n *\n * | name | msg |\n * | ------ | ------------------------------ |\n * | user 1 | `{ id: 1, text: 'message 1' }` |\n * | user 1 | `{ id: 2, text: 'message 2' }` |\n * | user 1 | `{ id: 3, text: 'message 3' }` |\n *\n * ### join table\n *\n * If relation wasn't defined, provide a `db.table` instance and specify columns for the join.\n * Joined table can be references from `where` and `select` by a table name.\n *\n * ```ts\n * db.user\n * .join(db.message, 'userId', 'user.id')\n * .where({ 'message.text': { startsWith: 'Hi' } })\n * .select('name', 'message.text');\n * ```\n *\n * The name of the joining table can be omitted, but not the name of the main table:\n *\n * ```ts\n * db.user.join(db.message, 'userId', 'user.id');\n * ```\n *\n * Joined table can have an alias for referencing it further:\n *\n * ```ts\n * db.user\n * .join(db.message.as('m'), 'message.userId', 'user.id')\n * .where({ 'm.text': { startsWith: 'Hi' } })\n * .select('name', 'm.text');\n * ```\n *\n * Joined table can be selected as an object as well as the relation join above:\n *\n * ```ts\n * const result = await db.user\n * .join(db.message.as('m'), 'message.userId', 'user.id')\n * .where({ 'm.text': { startsWith: 'Hi' } })\n * .select('name', { msg: 'm.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included as msg:\n * msg: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * You can provide a custom comparison operator\n *\n * ```ts\n * db.user.join(db.message, 'userId', '!=', 'user.id');\n * ```\n *\n * Join can accept raw SQL for the `ON` part of join:\n *\n * ```ts\n * db.user.join(\n * db.message,\n * // `sql` can be imported from your `BaseTable` file\n * sql`lower(\"message\".\"text\") = lower(\"user\".\"name\")`,\n * );\n * ```\n *\n * Join can accept raw SQL instead of columns:\n *\n * ```ts\n * db.user.join(\n * db.message,\n * sql`lower(\"message\".\"text\")`,\n * sql`lower(\"user\".\"name\")`,\n * );\n *\n * // with operator:\n * db.user.join(\n * db.message,\n * sql`lower(\"message\".\"text\")`,\n * '!=',\n * sql`lower(\"user\".\"name\")`,\n * );\n * ```\n *\n * To join based on multiple columns, you can provide an object where keys are joining table columns, and values are main table columns or a raw SQL:\n *\n * ```ts\n * db.user.join(db.message, {\n * 'message.userId': 'user.id',\n *\n * // joined table name may be omitted\n * userId: 'user.id',\n *\n * // value can be a raw SQL expression:\n * text: sql`lower(\"user\".\"name\")`,\n * });\n * ```\n *\n * Join all records without conditions by providing `true`:\n *\n * ```ts\n * db.user.join(db.message, true);\n * ```\n *\n * Join methods can accept a callback with a special query builder that has `on` and `orOn` methods for handling advanced cases:\n *\n * ```ts\n * db.user.join(\n * db.message,\n * (q) =>\n * q\n * .on('message.userId', 'user.id')\n * // joined table name may be omitted\n * .on('userId', 'user.id')\n * // operator can be specified:\n * .on('userId', '!=', 'user.id')\n * // operator can be specified with table names as well:\n * .on('message.userId', '!=', 'user.id')\n * // `.orOn` takes the same arguments as `.on` and acts like `.or`:\n * .on('userId', 'user.id') // where message.userId = user.id\n * .orOn('text', 'user.name'), // or message.text = user.name\n * );\n * ```\n *\n * Column names in the where conditions are applied for the joined table, but you can specify a table name to add a condition for the main table.\n *\n * ```ts\n * db.user.join(db.message, (q) =>\n * q\n * .on('userId', 'user.id')\n * .where({\n * // not prefixed column name is for joined table:\n * text: { startsWith: 'hello' },\n * // specify a table name to set condition on the main table:\n * 'user.name': 'Bob',\n * })\n * // id is a column of a joined table Message\n * .whereIn('id', [1, 2, 3])\n * // condition for id of a user\n * .whereIn('user.id', [4, 5, 6]),\n * );\n * ```\n *\n * The query above will generate the following SQL (simplified):\n *\n * ```sql\n * SELECT * FROM \"user\"\n * JOIN \"message\"\n * ON \"message\".\"userId\" = \"user\".\"id\"\n * AND \"message\".\"text\" ILIKE 'hello%'\n * AND \"user\".\"name\" = 'Bob'\n * AND \"message\".\"id\" IN (1, 2, 3)\n * AND \"user\".\"id\" IN (4, 5, 6)\n * ```\n *\n * The join argument can be a query with `select`, `where`, and other methods. In such case, it will be handled as a sub query:\n *\n * ```ts\n * db.user.join(\n * db.message\n * .select('id', 'userId', 'text')\n * .where({ text: { startsWith: 'Hi' } })\n * .as('t'),\n * 'userId',\n * 'user.id',\n * );\n * ```\n *\n * It will produce such SQL:\n *\n * ```sql\n * SELECT * FROM \"user\"\n * JOIN (\n * SELECT \"t\".\"id\", \"t\".\"userId\", \"t\".\"text\"\n * FROM \"message\" AS \"t\"\n * ) \"t\" ON \"t\".\"userId\" = \"user\".\"id\"\n * ```\n *\n * ## implicit join lateral\n *\n * `JOIN`'s source expression that comes before `ON` cannot access other tables, but in some cases this may be needed.\n *\n * For example, let's consider joining last 10 messages of a user:\n *\n * ```ts\n * await db.user.join('messages', (q) => q.order({ createdAt: 'DESC' }).limit(10));\n * ```\n *\n * When the `join`'s callback returns a more complex query than the one that simply applies certain conditions,\n * it will implicitly generate a `JOIN LATERAL` SQL query, as the following:\n *\n * ```sql\n * SELECT *\n * FROM \"user\"\n * JOIN LATERAL (\n * SELECT *\n * FROM \"message\" AS \"messages\"\n * WHERE \"message\".\"userId\" = \"user\".\"id\"\n * ORDER BY \"message\".\"createdAt\" DESC\n * LIMIT 10\n * ) \"messages\" ON true\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n join<\n T extends PickQuerySelectableShapeRelationsWithDataAsResultReturnType,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallbackArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Cb | JoinArgs<T, Arg>\n ): JoinResultFromArgs<T, Arg, Cb, true, true> {\n return _join(\n _clone(this),\n true,\n 'JOIN',\n arg as never,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\n }\n\n /**\n * `leftJoin` is a method for SQL `LEFT JOIN`, which is equivalent to `OUTER JOIN`, `LEFT OUTER JOIN`.\n *\n * When no matching record is found, it will fill joined table columns with `NULL` values in the result rows.\n *\n * Works just like `join`, except for result type that may have `null`:\n *\n * ```ts\n * const result = await db.user\n * .leftJoin('messages')\n * .select('name', 'messages.text');\n *\n * // the same query, but joining table explicitly\n * const result2: typeof result = await db.user\n * .leftJoin(db.message, 'userId', 'user.id')\n * .select('name', 'message.text');\n *\n * // result has the following type:\n * const ok: { name: string; text: string | null }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n leftJoin<\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallbackArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Cb | JoinArgs<T, Arg>\n ): JoinResultFromArgs<T, Arg, Cb, false, true> {\n return _join(\n _clone(this),\n false,\n 'LEFT JOIN',\n arg as never,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\n }\n\n /**\n * `rightJoin` is a method for SQL `RIGHT JOIN`, which is equivalent to `RIGHT OUTER JOIN`.\n *\n * Takes the same arguments as `json`.\n *\n * It will load all records from the joining table, and fill the main table columns with `null` when no match is found.\n *\n * The columns of the table you're joining to are becoming nullable when using `rightJoin`.\n *\n * ```ts\n * const result = await db.user\n * .rightJoin('messages')\n * .select('name', 'messages.text');\n *\n * // even though name is not a nullable column, it becomes nullable after using rightJoin\n * const ok: { name: string | null; text: string }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n rightJoin<\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallbackArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Cb | JoinArgs<T, Arg>\n ): JoinResultFromArgs<T, Arg, Cb, true, false> {\n return _join(\n _clone(this),\n true,\n 'RIGHT JOIN',\n arg as never,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\n }\n\n /**\n * `fullJoin` is a method for SQL `FULL JOIN`, which is equivalent to `FULL OUTER JOIN`.\n *\n * Takes the same arguments as `json`.\n *\n * It will load all records from the joining table, both sides of the join may result in `null` values when there is no match.\n *\n * All columns become nullable after using `fullJoin`.\n *\n * ```ts\n * const result = await db.user\n * .rightJoin('messages')\n * .select('name', 'messages.text');\n *\n * // all columns can be null\n * const ok: { name: string | null; text: string | null }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n fullJoin<\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallbackArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Cb | JoinArgs<T, Arg>\n ): JoinResultFromArgs<T, Arg, Cb, false, false> {\n return _join(\n _clone(this),\n false,\n 'FULL JOIN',\n arg as never,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\n }\n\n /**\n * `joinLateral` allows joining a table with a sub-query that can reference the main table of current query and the other joined tables.\n *\n * First argument is the other table you want to join, or a name of relation, or a name of `with` defined table.\n *\n * Second argument is a callback where you can reference other tables using `on` and `orOn`, select columns, do `where` conditions, and use any other query methods to build a sub-query.\n *\n * Note that the regular `join` will also generate `JOIN LATERAL` SQL expression when the query returned from callback is complex enough (see the bottom of {@link join} description).\n *\n * ```ts\n * // joinLateral messages relation, alias it as `m`\n * // without aliasing you can refer to the message by a table name\n * db.user\n * .joinLateral(db.message.as('m'), (q) =>\n * q\n * // select message columns\n * .select('text')\n * // join the message to the user, column names can be prefixed with table names\n * .on('authorId', 'user.id')\n * // message columns are available without prefixing,\n * // outer table columns are available with a table name\n * .where({ text: 'some text', 'user.name': 'name' })\n * .order({ createdAt: 'DESC' }),\n * )\n * // only selected message columns are available in select and where\n * .select('id', 'name', 'm.text')\n * .where({ 'm.text': messageData.text });\n * ```\n *\n * As well as simple `join`, `joinLateral` can select an object of full joined record:\n *\n * ```ts\n * // join by relation name\n * const result = await db.user\n * .joinLateral('messages', (q) => q.as('message')) // alias to 'message'\n * .select('name', { message: 'message.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included:\n * message: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * `message` can be aliased withing the `select` as well as in case of a simple `join`:\n *\n * ```ts\n * // join by relation name\n * const result = await db.user\n * .joinLateral('messages', (q) => q.as('message')) // alias to 'message'\n * .select('name', { msg: 'message.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included as msg:\n * msg: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param cb - callback for shaping the joined query\n */\n joinLateral<\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n Arg extends JoinFirstArg<T>,\n As extends string,\n Result extends Column.QueryColumns,\n JoinedRelations extends RelationsBase,\n >(\n this: T,\n arg: Arg,\n cb: (q: JoinQueryBuilder<T, JoinArgToQuery<T, Arg>>) => {\n __as: As;\n result: Result;\n relations: JoinedRelations;\n },\n ): JoinLateralResult<T, As, Result, JoinedRelations, true> {\n const q = _clone(this);\n _joinLateral(\n q,\n 'JOIN',\n _joinLateralProcessArg(q, arg as never, cb as never),\n );\n return q as never;\n }\n\n /**\n * The same as {@link joinLateral}, but when no records found for the join it will result in `null`:\n *\n * ```ts\n * const result = await db.user\n * .leftJoinLateral('messages', (q) => q.as('message'))\n * .select('name', 'message.text');\n *\n * // result has the following type:\n * const ok: { name: string; text: string | null }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param cb - callback for shaping the joined query\n */\n leftJoinLateral<\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n Arg extends JoinFirstArg<T>,\n As extends string,\n Result extends Column.QueryColumns,\n JoinedRelations extends RelationsBase,\n >(\n this: T,\n arg: Arg,\n cb: (q: JoinQueryBuilder<T, JoinArgToQuery<T, Arg>>) => {\n __as: As;\n result: Result;\n relations: JoinedRelations;\n },\n ): JoinLateralResult<T, As, Result, JoinedRelations, false> {\n const q = _clone(this);\n _joinLateral(\n q,\n 'LEFT JOIN',\n _joinLateralProcessArg(q, arg as never, cb as never),\n );\n return q as never;\n }\n\n /**\n * This method may be useful\n * for combining with [createForEachFrom](/guide/create-update-delete.html#createForEachFrom-insertForEachFrom).\n *\n * `createForEachFrom` creates multiple record based on a selecting query:\n *\n * ```sql\n * INSERT INTO t1(c1, c2)\n * SELECT c1, c2 FROM t2\n * ```\n *\n * Such a query inserts one record per one selected record.\n *\n * Use `joinData` to insert a multiplication of selected records and the provided data.\n *\n * ```ts\n * const data = [{ column2: 'one' }, { column2: 'two' }, { column2: 'three' }];\n *\n * await db.table.createForEachFrom(\n * db.otherTable\n * .joinData('data', (t) => ({ column2: t.text() }), data)\n * .select('otherTable.column1', 'data.column2'),\n * );\n * ```\n *\n * If the query on the other table returns 2 records,\n * and the data array contains 3 records, then 2 \\* 3 = 6 will be inserted - every combination.\n *\n * Joined data values are available in `where` just as usual.\n *\n * @param as - alias to reference joined columns\n * @param fn - declare column types\n * @param data - array of data to join\n */\n joinData<\n T extends PickQuerySelectableColumnTypes,\n As extends string,\n RecordType extends Column.QueryColumnsInit,\n Item extends ColumnsShape.Input<RecordType>,\n >(\n this: T,\n as: As,\n fn: (types: T['columnTypes']) => RecordType,\n data: Item[],\n ): {\n [K in keyof T]: K extends '__selectable'\n ? T['__selectable'] & {\n [K in keyof RecordType & string as `${As}.${K}`]: {\n as: K;\n column: RecordType[K];\n };\n }\n : T[K];\n } {\n const shape = fn(this.columnTypes);\n\n const query = _clone(this);\n\n const parsers = Object.fromEntries(\n Object.entries(shape).map(([key, column]) => [\n key,\n (column as Column)._parse,\n ]),\n );\n\n const { q } = query;\n setObjectValueImmutable(q, 'joinedShapes', as, shape);\n setObjectValueImmutable(q, 'joinedParsers', as, parsers);\n\n pushOrNewArrayToObjectImmutable(q, 'join', {\n type: 'JOIN',\n args: { a: as, c: shape, d: data },\n });\n\n return query as never;\n }\n}\n\n// Arguments of `on` and `orOn` methods inside `join` callback.\n// Takes a pair of columns to check them for equality, or a pair of columns separated with an operator such as '!='.\ntype OnArgs<S extends QuerySelectable> =\n | [leftColumn: keyof S, rightColumn: keyof S]\n | [leftColumn: keyof S, op: string, rightColumn: keyof S];\n\n// Construct an object for `ON` type of where condition.\nconst makeOnItem = (\n joinTo: PickQuerySelectable,\n joinFrom: PickQuerySelectable,\n args: OnArgs<QuerySelectable>,\n) => ({\n ON: {\n joinFrom,\n from: args[0],\n joinTo,\n to: args.length === 2 ? args[1] : args[2],\n op: args.length === 2 ? undefined : args[1],\n },\n});\n\n// Add `ON` statement.\nexport const pushQueryOnForOuter = <T extends PickQuerySelectable>(\n q: T,\n joinFrom: PickQuerySelectable,\n joinTo: PickQuerySelectable,\n leftColumn: string,\n rightColumn: string,\n): T => {\n return pushQueryValueImmutable(q as never, 'and', {\n ON: {\n joinFrom: joinTo,\n from: leftColumn,\n joinTo: joinFrom,\n to: rightColumn,\n useOuterAliases: true,\n },\n }) as never;\n};\n\n// Add `ON` statement.\nexport const pushQueryOn = <T extends PickQuerySelectable>(\n q: T,\n joinFrom: PickQuerySelectable,\n joinTo: PickQuerySelectable,\n ...on: OnArgs<QuerySelectable>\n): T => {\n return pushQueryValueImmutable(\n q as never,\n 'and',\n makeOnItem(joinFrom, joinTo, on),\n ) as never;\n};\n\n// Add `ON` statement separated from previous statements with `OR`.\nexport const pushQueryOrOn = <T extends PickQuerySelectable>(\n q: T,\n joinFrom: PickQuerySelectable,\n joinTo: PickQuerySelectable,\n ...on: OnArgs<QuerySelectable>\n) => {\n return pushQueryValueImmutable(q as never, 'or', [\n makeOnItem(joinFrom, joinTo, on),\n ]);\n};\n\n// Used by the ORM to join relations.\n// Adds a shape of relation to the `joinedShapes`, and adds an `on` statement.\nexport const addQueryOn = <T extends PickQuerySelectable>(\n query: T,\n joinFrom: PickQuerySelectable,\n joinTo: PickQuerySelectable,\n ...args: OnArgs<QuerySelectable>\n): T => {\n const cloned = _clone(query);\n\n const { q } = cloned;\n\n setObjectValueImmutable(\n q,\n 'joinedShapes',\n ((joinFrom as unknown as PickQueryQ).q.as ||\n (joinFrom as PickQueryTable).table) as string,\n (joinFrom as unknown as PickQueryQ).q.shape,\n );\n\n return pushQueryOn(cloned, joinFrom, joinTo, ...args) as never;\n};\n\n// To join record based on a value inside their json columns\ntype OnJsonPathEqualsArgs<S extends QuerySelectable> = [\n leftColumn: keyof S,\n leftPath: string,\n rightColumn: keyof S,\n rightPath: string,\n];\n\n/**\n * Mutative {@link OnMethods.prototype.on}\n */\nexport const _queryJoinOn = <T extends PickQuerySelectable>(\n q: T,\n args: OnArgs<T['__selectable']>,\n): T => {\n return pushQueryOn(\n q,\n (q as unknown as PickQueryQ).q.joinTo as unknown as PickQuerySelectable,\n q,\n ...args,\n );\n};\n\n/**\n * Mutative {@link OnMethods.prototype.orOn}\n */\nexport const _queryJoinOrOn = <T extends PickQuerySelectable>(\n q: T,\n args: OnArgs<T['__selectable']>,\n): T => {\n return pushQueryOrOn(\n q,\n (q as unknown as PickQueryQ).q.joinTo as unknown as PickQuerySelectable,\n q,\n ...args,\n ) as unknown as T;\n};\n\n/**\n * Mutative {@link OnMethods.prototype.onJsonPathEquals}\n */\nexport const _queryJoinOnJsonPathEquals = <T extends PickQuerySelectable>(\n q: T,\n args: OnJsonPathEqualsArgs<T['__selectable']>,\n): T => {\n return pushQueryValueImmutable(q as never, 'and', {\n ON: args,\n }) as unknown as T;\n};\n\n/**\n * Argument of join callback.\n * It is a query object of table that you're joining, with ability to select main table's columns.\n * Adds {@link OnMethods.prototype.on} method and similar to the query.\n */\nexport type JoinQueryBuilder<\n T extends PickQuerySelectableShape,\n J extends PickQuerySelectableResultAs,\n> = {\n [K in keyof J | keyof OnMethods]: K extends '__selectable'\n ? SelectableFromShape<J['result'], J['__as']> &\n Omit<T['__selectable'], keyof T['shape']>\n : K extends keyof OnMethods\n ? OnMethods[K]\n : K extends keyof J\n ? J[K]\n : never;\n};\n\nexport class OnMethods {\n /**\n * Use `on` to specify columns to join records.\n *\n * ```ts\n * q\n * .on('message.userId', 'user.id')\n * // joined table name may be omitted\n * .on('userId', 'user.id')\n * // operator can be specified:\n * .on('userId', '!=', 'user.id')\n * // operator can be specified with table names as well:\n * .on('message.userId', '!=', 'user.id')\n * ```\n *\n * @param args - columns to join with\n */\n on<T extends PickQuerySelectable>(\n this: T,\n ...args: OnArgs<T['__selectable']>\n ): T {\n return _queryJoinOn(_clone(this) as never, args);\n }\n\n /**\n * Works as {@link on}, but the added conditions will be separated from previous with `OR`.\n *\n * @param args - columns to join with\n */\n orOn<T extends PickQuerySelectable>(\n this: T,\n ...args: OnArgs<T['__selectable']>\n ): T {\n return _queryJoinOrOn(_clone(this) as never, args);\n }\n\n /**\n * Use `onJsonPathEquals` to join record based on a field of their JSON column:\n *\n * ```ts\n * db.table.join(db.otherTable, (q) =>\n * // '$.key' is a JSON path\n * q.onJsonPathEquals('otherTable.data', '$.key', 'table.data', '$.key'),\n * );\n * ```\n *\n * @param args - columns and JSON paths to join with.\n */\n onJsonPathEquals<T extends PickQuerySelectable>(\n this: T,\n ...args: OnJsonPathEqualsArgs<T['__selectable']>\n ): T {\n return _queryJoinOnJsonPathEquals(_clone(this) as never, args);\n }\n}\n","import { Column } from '../../../columns/column';\nimport { HookPurpose } from '../../extra-features/hooks/hooks.sql';\nimport { IsQuery, Query } from '../../query';\nimport { QueryAfterHook } from '../../query-data';\n\nexport interface HasCteHooks {\n cteHooks?: CteHooks;\n}\n\nexport interface CteHooks {\n hasSelect?: boolean;\n tableHooks?: CteTableHooks;\n ensureCount?: EnsureCount;\n}\n\nexport interface EnsureCount {\n [cteName: string]: EnsureCountItem;\n}\n\nexport type EnsureCountItem =\n | {\n count: number;\n }\n | {\n jsonNotNull: string;\n };\n\nexport interface CteTableHooks {\n [K: string]: CteTableHook;\n}\n\nexport interface CteTableHook {\n table: string;\n shape: Column.Shape.Data;\n tableHook: TableHook;\n throwOnNotFound?: boolean;\n}\n\nexport interface TableHook {\n hookPurpose?: HookPurpose;\n select?: HookSelect;\n afterCreate?: QueryAfterHook[];\n afterUpdate?: QueryAfterHook[];\n afterSave?: QueryAfterHook[];\n afterDelete?: QueryAfterHook[];\n afterCreateCommit?: QueryAfterHook[];\n afterUpdateCommit?: QueryAfterHook[];\n afterSaveCommit?: QueryAfterHook[];\n afterDeleteCommit?: QueryAfterHook[];\n}\n\nexport type HookSelect = Map<string, HookSelectValue>;\n\nexport interface HookSelectValue {\n select: string | { sql: string };\n as?: string;\n temp?: string;\n onAs?: ((as: string) => void)[];\n notLoaded?: boolean;\n}\n\nexport interface HasTableHook {\n tableHook?: TableHook;\n}\n\nexport interface HasHookSelect {\n // additional columns to select for `after` hooks\n hookSelect?: HookSelect;\n}\n\nexport const _addToHookSelect = (\n query: IsQuery,\n selects: string[],\n notLoaded?: boolean,\n) => {\n const { q } = query as Query;\n const map: HookSelect = (q.hookSelect = new Map(q.hookSelect));\n for (const key of selects) {\n const item = map.get(key) || { select: key };\n map.set(key, notLoaded ? { ...item, notLoaded } : item);\n }\n};\n\nexport const _addToHookSelectWithTable = (\n query: IsQuery,\n selects: string[],\n table: string,\n) => {\n const { q } = query as Query;\n const map: HookSelect = (q.hookSelect = new Map(q.hookSelect));\n for (const column of selects) {\n map.set(column, { select: `${table}.${column}` });\n }\n};\n","import { QueryData } from '../../query-data';\n\nexport const setSelectRelation = (q: QueryData) => {\n q.selectRelation = true;\n};\n","import { getValueKey } from '../get/get-value-key';\nimport {\n BatchParser,\n getQueryParsers,\n setParserToQuery,\n} from '../../query-columns/query-column-parsers';\nimport { parseRecord } from '../../then/then';\nimport {\n RecordString,\n RecordUnknown,\n setObjectValueImmutable,\n spreadObjectValues,\n} from '../../../utils';\nimport {\n addColumnParserToQuery,\n Column,\n defaultSchemaConfig,\n JSONTextColumn,\n setColumnData,\n UnknownColumn,\n} from '../../../columns';\nimport { processComputedBatches } from '../../extra-features/computed/computed';\nimport { isQueryNone } from '../../extra-features/none/none';\nimport { cloneQueryBaseUnscoped } from '../wrap/wrap';\nimport { prepareSubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { RawSql } from '../../expressions/raw-sql';\nimport { SelectArg, SelectAsArg, SelectSelf } from './select';\nimport { _joinLateral } from '../join/join';\nimport {\n PickQueryQ,\n PickQueryQAndInternal,\n PickQuerySelectable,\n} from '../../pick-query-types';\nimport {\n Expression,\n isExpression,\n SelectableOrExpression,\n} from '../../expressions/expression';\nimport { getFullColumnTable, pushQueryArrayImmutable } from '../../query.utils';\nimport { IsQuery, Query } from '../../query';\nimport { NotFoundError } from '../../errors';\nimport { finalizeNestedHookSelect } from '../../extra-features/hooks/hooks';\nimport { applyBatchTransforms } from '../../extra-features/data-transform/transform';\nimport { resolveSubQueryCallback } from '../../internal-features/sub-query/sub-query';\nimport { isRelationQuery } from '../../relations';\nimport { _copyQueryAliasToQuery } from '../as/as';\nimport { _addToHookSelect, _addToHookSelectWithTable } from './hook-select';\nimport { SelectAsValue, SelectItem } from './select.sql';\nimport { pushQueryValueImmutable, QueryData } from '../../query-data';\nimport { ToSQLQuery } from '../../sql/to-sql';\n\nimport { setSelectRelation } from '../../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.qb';\n\n// add a parser for a raw expression column\n// is used by .select and .get methods\nexport const addParserForRawExpression = (\n q: PickQueryQ,\n key: string | getValueKey,\n raw: Expression,\n) => {\n if (raw.result.value) addColumnParserToQuery(q.q, key, raw.result.value);\n};\n\n// add parsers when selecting a full joined table by name or alias\nconst addParsersForSelectJoined = (\n q: PickQueryQ,\n arg: string,\n as: string | getValueKey = arg,\n) => {\n const parsers = q.q.joinedParsers?.[arg];\n if (parsers) {\n setParserToQuery(q.q, as, (row) => parseRecord(parsers, row));\n }\n\n const batchParsers = q.q.joinedBatchParsers?.[arg];\n if (batchParsers) {\n pushQueryArrayImmutable(\n q,\n 'batchParsers',\n batchParsers.map((x) => ({\n path: [as as string, ...x.path],\n fn: x.fn,\n })),\n );\n }\n};\n\nexport interface QueryBatchResult {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parent: any;\n key: PropertyKey;\n}\n\n// add parser for a single key-value pair of selected object\nexport const addParserForSelectItem = <T extends PickQuerySelectable>(\n query: T,\n as: string | getValueKey | undefined,\n key: string,\n arg: SelectableOrExpression<T> | Query,\n columnAlias?: string,\n joinQuery?: boolean,\n): string | Expression | Query | undefined => {\n if (typeof arg === 'object') {\n const { q: q } = arg as Query;\n\n if (q.batchParsers) {\n pushQueryArrayImmutable(\n query as unknown as Query,\n 'batchParsers',\n q.batchParsers.map((bp) => ({\n path: [key, ...bp.path],\n fn: bp.fn,\n })),\n );\n }\n\n const parsers = isExpression(arg)\n ? undefined\n : getQueryParsers(arg as Query);\n\n if (\n parsers ||\n q.hookSelect ||\n q.transform ||\n q.returnType === 'oneOrThrow' ||\n q.returnType === 'valueOrThrow' ||\n q.returnType === 'one' ||\n q.returnType === 'value'\n ) {\n pushQueryValueImmutable(query as unknown as Query, 'batchParsers', {\n path: [key],\n fn: (path, queryResult) => {\n const { rows } = queryResult;\n const originalReturnType = q.returnType || 'all';\n let returnType = originalReturnType;\n const { hookSelect } = q;\n const batches: QueryBatchResult[] = [];\n\n const last = path.length;\n if (returnType === 'value' || returnType === 'valueOrThrow') {\n if (hookSelect) {\n batches.push = (item) => {\n // if the item has no key, it means value return was implicitly turned into 'one' return,\n // happens when getting a computed column\n if (!(key in item)) {\n returnType = returnType === 'value' ? 'one' : 'oneOrThrow';\n }\n batches.push = Array.prototype.push;\n return batches.push(item);\n };\n }\n }\n\n collectNestedSelectBatches(batches, rows, path, last);\n\n switch (returnType) {\n case 'all': {\n if (parsers) {\n for (const { data } of batches) {\n for (const one of data) {\n parseRecord(parsers, one);\n }\n }\n }\n break;\n }\n case 'one':\n case 'oneOrThrow': {\n if (parsers) {\n if (returnType === 'one') {\n for (const batch of batches) {\n if (batch.data) parseRecord(parsers, batch.data);\n else batch.parent[batch.key] = batch.data = undefined; // null to undefined\n }\n } else {\n for (const { data } of batches) {\n if (!data) throw new NotFoundError(arg as Query);\n parseRecord(parsers, data);\n }\n }\n } else if (returnType === 'one') {\n for (const batch of batches) {\n if (!batch.data)\n batch.parent[batch.key] = batch.data = undefined; // null to undefined\n }\n } else {\n for (const { data } of batches) {\n if (!data) throw new NotFoundError(arg as Query);\n }\n }\n\n if (hookSelect) {\n for (const batch of batches) {\n batch.data = [batch.data];\n }\n }\n\n break;\n }\n case 'pluck': {\n const parse = parsers?.pluck;\n if (parse) {\n for (const { data } of batches) {\n for (let i = 0; i < data.length; i++) {\n (data as unknown as RecordUnknown)[i] = parse(data[i]);\n }\n }\n }\n\n // not transforming data for hookSelect because it's set to load 'all' elsewhere for this case\n\n break;\n }\n case 'value':\n case 'valueOrThrow': {\n const notNullable = !(q.getColumn as Column.Pick.Data | undefined)\n ?.data.isNullable;\n\n const parse = parsers?.[getValueKey];\n if (parse) {\n if (returnType === 'value') {\n for (const item of batches) {\n item.parent[item.key] = item.data =\n item.data === null ? q.notFoundDefault : parse(item.data);\n }\n } else {\n for (const item of batches) {\n if (notNullable && item.data === null) {\n throw new NotFoundError(arg as Query);\n }\n\n item.parent[item.key] = item.data = parse(item.data);\n }\n }\n } else if (returnType === 'value') {\n for (const item of batches) {\n if (item.data === null) {\n item.parent[item.key] = item.data = q.notFoundDefault;\n }\n }\n } else if (notNullable) {\n for (const { data } of batches) {\n if (data === null) throw new NotFoundError(arg as Query);\n }\n }\n\n if (hookSelect) {\n for (const batch of batches) {\n batch.data = [batch.data];\n }\n }\n\n break;\n }\n }\n\n if (hookSelect) {\n let tempColumns: Set<string> | undefined;\n let renames: RecordString | undefined;\n for (const column of hookSelect.keys()) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const select = hookSelect!.get(column)!;\n\n if (select.as) (renames ??= {})[column] = select.as;\n\n if (select.temp) {\n (tempColumns ??= new Set())?.add(select.as || column);\n }\n }\n\n if (renames) {\n for (const { data } of batches) {\n for (const record of data) {\n if (record) {\n for (const a in renames) {\n const value = record[renames[a]];\n record[renames[a]] = record[a];\n record[a] = value;\n }\n }\n }\n }\n }\n\n if (q.selectedComputeds) {\n const maybePromise = processComputedBatches(\n q,\n batches,\n originalReturnType,\n returnType,\n tempColumns,\n renames,\n key,\n );\n if (maybePromise) return maybePromise;\n }\n\n finalizeNestedHookSelect(\n batches,\n originalReturnType,\n tempColumns,\n renames,\n key,\n );\n }\n\n applyBatchTransforms(q, batches);\n return;\n },\n } as BatchParser);\n }\n\n if (!joinQuery && (arg as Query).q?.subQuery && arg.q.expr) {\n arg = arg.q.expr;\n }\n\n if (isExpression(arg)) {\n addParserForRawExpression(query as never, key, arg);\n return arg;\n }\n\n return arg;\n }\n\n return setParserForSelectedString(\n query as never,\n arg as string,\n as,\n key,\n columnAlias,\n );\n};\n\nconst collectNestedSelectBatches = (\n batches: QueryBatchResult[],\n rows: unknown[],\n path: string[],\n last: number,\n) => {\n const stack: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parent: any;\n key: PropertyKey;\n i: number;\n }[] = rows.map(\n (row) =>\n ({\n data: row,\n parent: row,\n i: 0,\n key: path[0],\n } as never),\n );\n\n while (stack.length > 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const item = stack.pop()!;\n const { i } = item;\n if (i === last) {\n batches.push(item);\n continue;\n }\n\n const { data } = item;\n const key = path[i];\n if (Array.isArray(data)) {\n for (let key = 0; key < data.length; key++) {\n stack.push({ data: data[key], parent: data, key, i });\n }\n } else if (data && typeof data === 'object') {\n stack.push({ data: data[key], parent: data, key, i: i + 1 });\n }\n }\n};\n\n// reuse SQL for empty array for JSON agg expressions\nconst emptyArrSQL = new RawSql(\"'[]'\");\n\n// process select argument: add parsers, join relations when needed\nexport const processSelectArg = <T extends SelectSelf>(\n q: T,\n as: string | undefined,\n arg: SelectArg<T>,\n columnAs?: string | getValueKey,\n): SelectItem | undefined | false => {\n const query = q as unknown as Query;\n\n if (typeof arg === 'string') {\n return setParserForSelectedString(q as unknown as Query, arg, as, columnAs);\n }\n\n const selectAs: SelectAsValue = {};\n\n for (const key in arg as unknown as SelectAsArg<T>) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let value = (arg as unknown as SelectAsArg<T>)[key] as any;\n let joinQuery: boolean | undefined;\n\n if (typeof value === 'function') {\n value = resolveSubQueryCallback(q as unknown as ToSQLQuery, value);\n\n if (isQueryNone(value)) {\n if (value.q.innerJoinLateral) {\n return false;\n }\n }\n\n if (!isExpression(value)) {\n if (\n isRelationQuery(value) &&\n // `subQuery = 1` case is when callback returns the same query as it gets,\n // for example `q => q.get('name')`.\n (value as unknown as Query).q.subQuery !== 1\n ) {\n joinQuery = true;\n setSelectRelation(query.q);\n\n value = value.joinQuery(value, q as unknown as IsQuery);\n\n let subQuery;\n const { returnType, innerJoinLateral } = value.q;\n if (!returnType || returnType === 'all') {\n subQuery = value.json(false);\n\n // no need to coalesce in case of inner lateral join.\n if (!innerJoinLateral) {\n value.q.coalesceValue = emptyArrSQL;\n }\n } else if (returnType === 'pluck') {\n // no select in case of plucking a computed\n subQuery = value.q.select\n ? value\n .wrap(cloneQueryBaseUnscoped(value))\n .jsonAgg(value.q.select[0])\n : value.json(false);\n\n value.q.coalesceValue = emptyArrSQL;\n } else {\n if (returnType === 'value' || returnType === 'valueOrThrow') {\n if (value.q.select) {\n // todo: investigate what is this for\n if (typeof value.q.select[0] === 'string') {\n value.q.select[0] = {\n selectAs: { r: value.q.select[0] },\n };\n }\n\n subQuery = value;\n } else {\n subQuery = value.json(false);\n }\n } else {\n subQuery = value;\n }\n }\n\n const as = _joinLateral(\n q,\n innerJoinLateral ? 'JOIN' : 'LEFT JOIN',\n subQuery,\n key,\n // no need for `ON p.r IS NOT NULL` check when joining a single record,\n // `JOIN` will handle it on itself.\n innerJoinLateral &&\n returnType !== 'one' &&\n returnType !== 'oneOrThrow',\n );\n\n if (as) {\n value.q.joinedForSelect = _copyQueryAliasToQuery(\n value,\n q as unknown as Query,\n as,\n );\n }\n }\n\n value = prepareSubQueryForSql(q as never, value);\n }\n }\n\n selectAs[key] = addParserForSelectItem(\n q as unknown as Query,\n as,\n key,\n value,\n key,\n joinQuery,\n );\n }\n\n return { selectAs };\n};\n\n// process string select arg\n// adds a column parser for a column\n// when table.* string is provided, sets a parser for a joined table\nexport const setParserForSelectedString = (\n query: PickQueryQAndInternal,\n arg: string,\n as: string | getValueKey | undefined,\n columnAs?: string | getValueKey,\n columnAlias?: string,\n): string | undefined => {\n const { q } = query;\n const index = arg.indexOf('.');\n if (index === -1) {\n return selectColumn(query, q, arg, columnAs, columnAlias);\n }\n\n const table = getFullColumnTable(query as unknown as IsQuery, arg, index, as);\n const column = arg.slice(index + 1);\n\n // 'table.*' is selecting a full joined record (without computeds)\n if (column === '*') {\n addParsersForSelectJoined(query, table, columnAs);\n return table === as ? column : arg;\n }\n\n if (table === as) {\n return selectColumn(query, q, column, columnAs, columnAlias);\n }\n\n const parser = q.joinedParsers?.[table]?.[column];\n if (parser) setParserToQuery(q, columnAs || column, parser);\n\n const batchParsers = q.joinedBatchParsers?.[table];\n if (batchParsers) {\n let cloned = false;\n for (const bp of batchParsers) {\n if (bp.path[0] === column) {\n if (!cloned) {\n q.batchParsers = [...(q.batchParsers || [])];\n cloned = true;\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n q.batchParsers!.push(bp);\n }\n }\n }\n\n const computeds = q.joinedComputeds?.[table];\n if (computeds?.[column]) {\n const computed = computeds[column];\n _addToHookSelectWithTable(query, computed.deps, table);\n\n setObjectValueImmutable(q, 'selectedComputeds', column, computed);\n return;\n }\n\n return arg;\n};\n\nconst selectColumn = (\n query: PickQueryQAndInternal,\n q: QueryData,\n key: string,\n columnAs?: string | getValueKey,\n columnAlias?: string,\n) => {\n if (key === '*') {\n const { defaultParsers } = query.q;\n if (defaultParsers) {\n spreadObjectValues(query.q, 'parsers', defaultParsers);\n }\n } else {\n const parser = query.q.defaultParsers?.[key];\n if (parser) setObjectValueImmutable(q, 'parsers', columnAs || key, parser);\n\n if (q.runtimeComputeds?.[key]) {\n const computed = q.runtimeComputeds[key];\n _addToHookSelect(query, computed.deps);\n\n query.q.selectedComputeds = {\n ...query.q.selectedComputeds,\n [columnAlias || key]: computed,\n };\n return;\n }\n }\n\n return key;\n};\n\n// is mapping the result of a query into a columns shape\n// in this way, the result of a sub query becomes available outside of it for using in WHERE and other methods\n//\n// when isSubQuery is true, it will remove data.name of columns,\n// so that outside of the sub-query the columns are named with app-side names,\n// while db column names are encapsulated inside the sub-query\nexport const getShapeFromSelect = (\n q: IsQuery,\n isSubQuery?: boolean,\n): Column.QueryColumns => {\n const query = (q as Query).q;\n const { shape } = query;\n let select: SelectItem[] | undefined;\n\n if (query.selectedComputeds) {\n select = query.select ? [...query.select] : [];\n for (const key in query.selectedComputeds) {\n select.push(...query.selectedComputeds[key].deps);\n }\n } else {\n select = query.select;\n }\n\n let result: Column.QueryColumns;\n if (!select) {\n if (query.type) {\n // mutative queries with no select are returning nothing\n result = {};\n } else if (isSubQuery) {\n // when no select, and it is a sub-query, return the table shape with unnamed columns\n result = {};\n for (const key in shape) {\n const column = shape[key];\n if (!column.data.explicitSelect) {\n result[key] = column.data.name\n ? setColumnData(column, 'name', undefined)\n : column;\n }\n }\n } else {\n result = shape;\n }\n } else {\n result = {};\n for (const item of select) {\n if (typeof item === 'string') {\n addColumnToShapeFromSelect(q, item, shape, query, result, isSubQuery);\n } else if (isExpression(item)) {\n result.value = item.result.value;\n } else if (item && 'selectAs' in item) {\n for (const key in item.selectAs) {\n const it = item.selectAs[key];\n if (typeof it === 'string') {\n addColumnToShapeFromSelect(\n q,\n it,\n shape,\n query,\n result,\n isSubQuery,\n key,\n );\n } else if (isExpression(it)) {\n result[key] = it.result.value || UnknownColumn.instance;\n } else if (it) {\n const { returnType } = it.q;\n if (returnType === 'value' || returnType === 'valueOrThrow') {\n const type = it.q.getColumn;\n result[key] = type\n ? mapSubSelectColumn(\n type as unknown as Column.Pick.Data,\n isSubQuery,\n )\n : UnknownColumn.instance;\n } else {\n result[key] = new JSONTextColumn(defaultSchemaConfig);\n }\n }\n }\n }\n }\n }\n\n return result;\n};\n\n// converts selected items into a shape of columns\n// when `isSubQuery` is true, it un-names named columns\nconst addColumnToShapeFromSelect = (\n q: IsQuery,\n arg: string,\n shape: Column.QueryColumns,\n query: QueryData,\n result: Column.QueryColumns,\n isSubQuery?: boolean,\n key?: string,\n) => {\n const index = arg.indexOf('.');\n if (index !== -1) {\n const as = (q as Query).q.as || (q as Query).table;\n const table = getFullColumnTable(q, arg, index, as);\n const column = arg.slice(index + 1);\n if (table === as) {\n result[key || column] = shape[column];\n } else {\n const it = query.joinedShapes?.[table]?.[column];\n if (it)\n result[key || column] = mapSubSelectColumn(\n it as unknown as Column.Pick.Data,\n isSubQuery,\n );\n }\n } else if (arg === '*') {\n for (const key in shape) {\n if (!(shape[key] as unknown as Column.Pick.Data).data.explicitSelect) {\n result[key] = mapSubSelectColumn(\n shape[key] as unknown as Column.Pick.Data,\n isSubQuery,\n );\n }\n }\n } else {\n result[key || arg] = mapSubSelectColumn(\n shape[arg] as unknown as Column.Pick.Data,\n isSubQuery,\n );\n }\n};\n\n// un-name a column if `isSubQuery` is true\nconst mapSubSelectColumn = (column: Column.Pick.Data, isSubQuery?: boolean) => {\n // `!column` is needed for case when wrong column is passed to subquery (see issue #236)\n if (\n !isSubQuery ||\n !column ||\n (!column.data.name && !column.data.explicitSelect)\n ) {\n return column;\n }\n\n const cloned = Object.create(column);\n cloned.data = { ...column.data, name: undefined, explicitSelect: undefined };\n return cloned;\n};\n","import { Query } from '../../query';\nimport { prepareSubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { PickQueryQ, PickQueryResult } from '../../pick-query-types';\nimport { Expression } from '../../expressions/expression';\nimport { _clone } from '../clone/clone';\nimport { UnionItem, UnionKind } from './union.sql';\n\n// argument of `union`-like query methods.\n// it supports query objects with the same result as in the previous query,\n// or a raw SQL\nexport type UnionArgs<T extends PickQueryResult> = (\n | {\n result: {\n [K in keyof T['result']]: {\n queryType: T['result'][K]['queryType'];\n };\n };\n }\n | ((q: T) => Expression)\n)[];\n\nexport const _queryUnion = <T extends PickQueryResult>(\n base: T,\n args: UnionArgs<T>,\n k: UnionKind,\n p?: boolean,\n m?: boolean,\n): T => {\n const query = (base as unknown as Query).baseQuery.clone();\n\n const u = args.map(\n (a) =>\n ({\n a: prepareSubQueryForSql(\n base as never,\n (typeof a === 'function' ? a(query as never) : a) as never,\n ),\n k,\n m,\n } as UnionItem),\n );\n\n const { q } = query;\n const baseQ = (base as unknown as PickQueryQ).q;\n\n q.union = baseQ.union\n ? {\n ...baseQ.union,\n u: [...baseQ.union.u, ...u],\n }\n : {\n b: base as never,\n u,\n p,\n };\n\n return query as never;\n};\n\nexport class Union {\n /**\n * Creates a union query, takes one or more queries or SQL expressions.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * // The first query of the union\n * db.one\n * .select('id', 'name')\n * // add two more queries to the union\n * .union(\n * db.two.select('id', 'name'),\n * (q = sql`SELECT id, name FROM \"thirdTable\"`),\n * )\n * // sub-sequent `union` is equivalent to passing multiple queries into a single `union`\n * .union(db.three.select('id', 'name'));\n * ```\n *\n * `order`, `limit`, `offset` are special, it matters if you place them **before** or **after** the `union`, it also have a meaning to place them before and after.\n *\n * ```ts\n * // order, limit, offset are applied ONLY to 'one'\n * db.one\n * .order('x')\n * .limit(1)\n * .offset(1)\n * // 'two' also has order, limit, and offset\n * .unionAll(db.two.order('y').limit(2).offset(2))\n * // sets order, limit, offset for all records\n * .order('z')\n * .limit(3)\n * .offset(3);\n * ```\n *\n * Equivalent SQL:\n *\n * ```sql\n * -- both union parts have their own order, limit, offset\n * ( SELECT * FROM one ORDER x ASC LIMIT 1 OFFSET 1 )\n * UNION ALL\n * ( SELECT * FROM two ORDER y ASC LIMIT 2 OFFSET 2 )\n * -- order, limit, offset of the whole query\n * ORDER BY z ASC LIMIT 3 OFFSET 3\n * ```\n *\n * All the listed methods have the same signature, they are only different by SQL keyword:\n *\n * - `union` - union of all queries, performs deduplication\n * - `unionAll` - `union` that allows duplicated rows\n * - `intersect` - get only rows that are present in all queries\n * - `intersectAll` - `intersect` that allows duplicated rows\n * - `except` - get only rows that are in the first query but not in the second\n * - `exceptAll` - `except` that allows duplicated rows\n *\n * @param args - array of queries or SQL expressions\n */\n union<T extends PickQueryResult>(this: T, ...args: UnionArgs<T>): T {\n return _queryUnion(\n _clone(this),\n args as UnionArgs<Query>,\n 'UNION',\n ) as never;\n }\n\n /**\n * Same as {@link union}, but allows duplicated rows.\n *\n * @param args - array of queries or SQL expressions\n */\n unionAll<T extends PickQueryResult>(this: T, ...args: UnionArgs<T>): T {\n return _queryUnion(\n _clone(this),\n args as UnionArgs<Query>,\n 'UNION ALL',\n ) as never;\n }\n\n /**\n * Same as {@link union}, but uses a `INTERSECT` SQL keyword instead\n *\n * @param args - array of queries or SQL expressions\n */\n intersect<T extends PickQueryResult>(this: T, ...args: UnionArgs<T>): T {\n return _queryUnion(\n _clone(this),\n args as UnionArgs<Query>,\n 'INTERSECT',\n ) as never;\n }\n\n /**\n * Same as {@link intersect}, but allows duplicated rows.\n *\n * @param args - array of queries or SQL expressions\n */\n intersectAll<T extends PickQueryResult>(this: T, ...args: UnionArgs<T>): T {\n return _queryUnion(\n _clone(this),\n args as UnionArgs<Query>,\n 'INTERSECT ALL',\n ) as never;\n }\n\n /**\n * Same as {@link union}, but uses an `EXCEPT` SQL keyword instead\n *\n * @param args - array of queries or SQL expressions\n */\n except<T extends PickQueryResult>(this: T, ...args: UnionArgs<T>): T {\n return _queryUnion(\n _clone(this),\n args as UnionArgs<Query>,\n 'EXCEPT',\n ) as never;\n }\n\n /**\n * Same as {@link except}, but allows duplicated rows.\n *\n * @param args - array of queries or SQL expressions\n */\n exceptAll<T extends PickQueryResult>(this: T, ...args: UnionArgs<T>): T {\n return _queryUnion(\n _clone(this),\n args as UnionArgs<Query>,\n 'EXCEPT ALL',\n ) as never;\n }\n}\n","import { Query } from '../../query';\nimport { setQueryObjectValueImmutable } from '../../query.utils';\nimport { _queryUnion } from '../union/union';\nimport { CteItem, CteOptions } from './cte.sql';\nimport { Column } from '../../../columns';\nimport { prepareSubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport {\n PickQueryResult,\n PickQueryWithDataColumnTypes,\n} from '../../pick-query-types';\nimport { EmptyObject, pushOrNewArrayToObjectImmutable } from '../../../utils';\nimport { Expression } from '../../expressions/expression';\nimport { _clone } from '../clone/clone';\nimport { getShapeFromSelect } from '../select/select.utils';\nimport { QuerySql } from '../../sql/sql';\nimport { pushQueryValueImmutable } from '../../query-data';\n\n// `with` method options\n// - `columns`: true to get all columns from the query, or array of column names\n// - `materialized`, `notMaterialized`: adds corresponding SQL keyword\nexport interface CteArgsOptions {\n columns?: string[] | boolean;\n materialized?: true;\n notMaterialized?: true;\n}\n\nexport interface CteRecursiveOptions extends CteArgsOptions {\n union?:\n | 'UNION'\n | 'UNION ALL'\n | 'INTERSECT'\n | 'INTERSECT ALL'\n | 'EXCEPT'\n | 'EXCEPT ALL';\n}\n\nexport interface CteQueryBuilder<T extends PickQueryWithDataColumnTypes>\n extends Query {\n sql: QuerySql<T['columnTypes']>['sql'];\n relations: EmptyObject;\n withData: T['withData'];\n}\n\n// Adds a `withData` entry to a query\nexport type CteResult<\n T extends PickQueryWithDataColumnTypes,\n Name extends string,\n Q extends PickQueryResult,\n> = {\n [K in keyof T]: K extends 'withData'\n ? {\n [K in keyof T['withData'] | Name]: K extends Name\n ? {\n table: Name;\n shape: Q['result'];\n }\n : K extends keyof T['withData']\n ? T['withData'][K]\n : never;\n }\n : T[K];\n};\n\nexport type CteSqlResult<\n T extends PickQueryWithDataColumnTypes,\n Name extends string,\n Shape extends Column.QueryColumns,\n> = {\n [K in keyof T]: K extends 'withData'\n ? {\n [K in Name | keyof T['withData']]: K extends Name\n ? {\n table: Name;\n shape: Shape;\n }\n : K extends keyof T['withData']\n ? T['withData'][K]\n : never;\n }\n : T[K];\n};\n\nconst _addCte = (query: Query, item: CteItem) =>\n pushOrNewArrayToObjectImmutable(query.q, 'with', item);\n\nexport const _prependWith = (\n q: Query,\n name: string | ((as: string) => void),\n queryArg:\n | PickQueryResult\n | ((q: CteQueryBuilder<PickQueryWithDataColumnTypes>) => PickQueryResult),\n) => _with(q, name, queryArg, undefined, true);\n\nexport const _with = (\n q: Query,\n name: string | ((as: string) => void),\n queryArg:\n | PickQueryResult\n | ((q: CteQueryBuilder<PickQueryWithDataColumnTypes>) => PickQueryResult),\n options?: CteArgsOptions,\n prepend?: boolean,\n) => {\n let query: Query;\n if (typeof queryArg === 'function') {\n const arg = q.qb.clone();\n arg.q.withShapes = q.q.withShapes;\n query = queryArg(arg) as Query;\n } else {\n query = queryArg as Query;\n }\n\n if (options?.columns === true) {\n options = {\n ...options,\n columns: Object.keys(query.shape),\n };\n }\n\n _addCte(q, {\n n: name,\n o: options as CteOptions,\n q: prepareSubQueryForSql(q, query),\n p: prepend,\n });\n\n const shape = getShapeFromSelect(query, true);\n\n if (typeof name === 'string') {\n setQueryObjectValueImmutable(q, 'withShapes', name, {\n shape: shape as Column.Shape.QueryInit,\n computeds: query.q.runtimeComputeds,\n });\n }\n\n return q;\n};\n\nexport class CteQuery {\n /**\n * Use `with` to add a Common Table Expression (CTE) to the query.\n *\n * `with` can be chained to any table on `db` instance, or to `db.$qb`,\n * note that in the latter case it won't have customized column types to use for typing SQL.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * // can access custom columns when using off a table\n * db.anyTable.with('x', (q) =>\n * q.select({ column: (q) => sql`123`.type((t) => t.customColumn()) }),\n * );\n *\n * // only default columns are available when using off `$qb`\n * db.$qb.with('x', (q) =>\n * q.select({ column: (q) => sql`123`.type((t) => t.integer()) }),\n * );\n * ```\n *\n * `with` accepts query objects, callbacks returning query objects, and custom SQL expressions returned from callbacks.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * db.table\n * .with(\n * 'alias',\n * // define CTE by building a query\n * db.table.select('one', 'two', 'three').where({ x: 123 }),\n * )\n * .from('alias')\n * .select('one')\n * .where({ two: 123 });\n *\n * // 2nd argument can be a callback accepting a query builder\n * db.table\n * .with('alias', (q) =>\n * // select a custom sql\n * q.select({ column: (q) => sql`123`.type((t) => t.integer()) }),\n * )\n * .from('alias')\n * .select('column')\n * .where({ column: 123 });\n *\n * // 2nd argument can be used for options\n * db.table\n * .with(\n * 'alias',\n * {\n * // all parameters are optional\n * materialized: true,\n * notMaterialized: true,\n * },\n * db.table,\n * )\n * .from('alias');\n * ```\n *\n * One `WITH` expression can reference the other:\n *\n * ```ts\n * db.$qb\n * .with('a', db.table.select('id', 'name'))\n * .with('b', (q) => q.from('a').where({ key: 'value' }))\n * .from('b');\n * ```\n *\n * Defined `WITH` expression can be used in `.from` or `.join` with all the type safeness:\n *\n * ```ts\n * db.table.with('alias', db.table).from('alias').select('alias.id');\n *\n * db.firstTable\n * .with('secondTable', db.secondTable)\n * .join('secondTable', 'secondTable.someId', 'firstTable.id')\n * .select('firstTable.column', 'secondTable.column');\n * ```\n *\n * ## creating records using `with` values\n *\n * You can use values returned from `with` statements when creating records:\n *\n * ```ts\n * db.table\n * .with('created', () => db.someTable.create(data).select('one', 'two'))\n * .create({\n * column: (q) => q.from('created').get('one'),\n * otherColumn: (q) => q.from('created').get('two'),\n * });\n *\n * // A record in `with` is created once, its values are used to create two records\n * db.table\n * .with('created', () => db.someTable.create(data).select('one', 'two'))\n * .createMany([\n * {\n * column: (q) => q.from('created').get('one'),\n * otherColumn: (q) => q.from('created').get('two'),\n * },\n * {\n * column: (q) => q.from('created').get('one'),\n * otherColumn: (q) => q.from('created').get('two'),\n * },\n * ]);\n * ```\n */\n with<T extends PickQueryWithDataColumnTypes, Name extends string, Q>(\n this: T,\n name: Name,\n query: Q | ((q: CteQueryBuilder<T>) => Q),\n ): CteResult<T, Name, Q extends PickQueryResult ? Q : never>;\n with<\n T extends PickQueryWithDataColumnTypes,\n Name extends string,\n Q extends PickQueryResult,\n >(\n this: T,\n name: Name,\n options: CteArgsOptions,\n query: Q | ((q: CteQueryBuilder<T>) => Q),\n ): CteResult<T, Name, Q>;\n with(\n name: string,\n second:\n | CteArgsOptions\n | PickQueryResult\n | ((q: CteQueryBuilder<PickQueryWithDataColumnTypes>) => PickQueryResult),\n third?:\n | PickQueryResult\n | ((q: CteQueryBuilder<PickQueryWithDataColumnTypes>) => PickQueryResult),\n ) {\n const q = _clone(this);\n\n // eslint-disable-next-line prefer-const\n let [options, queryArg] = third\n ? [second as CteArgsOptions, third]\n : [undefined, second];\n\n return _with(q, name, queryArg as never, options);\n }\n\n /**\n * It is priceless for fetching tree-like structures, or any other recursive cases.\n *\n * For example, it is useful for loading a tree of categories, where one category can include many other categories.\n *\n * Similarly to [with](#with), `withRecursive` can be chained to any table or `db.$qb`.\n *\n * For the first example, consider the employee table, an employee may or may not have a manager.\n *\n * ```ts\n * class Employee extends BaseTable {\n * readonly table = 'employee';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * name: t.string(),\n * managerId: t.integer().nullable(),\n * }));\n * }\n * ```\n *\n * The task is to load all subordinates of the manager with the id 1.\n *\n * ```ts\n * db.$qb\n * .withRecursive(\n * 'subordinates',\n * // the base, anchor query: find the manager to begin recursion with\n * db.employee.select('id', 'name', 'managerId').find(1),\n * // recursive query:\n * // find employees whos managerId is id from the surrounding subordinates CTE\n * (q) =>\n * q\n * .from(db.employee)\n * .select('id', 'name', 'managerId')\n * .join('subordinates', 'subordinates.id', 'profile.managerId'),\n * )\n * .from('subordinates');\n * ```\n *\n * As being shown, `withRecursive` accepts one query to begin with, and a second query in a callback that can reference the surrounding table expression \"subordinates\".\n *\n * These two queries are joined with `UNION ALL` by default.\n *\n * You can customize it by passing options after the name.\n *\n * ```ts\n * db.$qb\n * .withRecursive(\n * 'subordinates',\n * {\n * // all parameters are optional\n * union: 'UNION',\n * materialized: true,\n * notMaterialized: true,\n * },\n * // ...snip\n * )\n * .from('subordinates');\n * ```\n *\n * Recursive query can be constructed with basic SQL instructions only, without referencing other tables.\n * In the following example, we recursively select numbers from 1 to 100, and additionally apply n > 10 filter in the end.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * db.$qb\n * .withRecursive(\n * 't',\n * // select `1 AS n` for the base query\n * (q) => q.select({ n: (q) => sql`1`.type((t) => t.integer()) }),\n * // select `n + 1 AS n` for the recursive part\n * (q) =>\n * q\n * .from('t')\n * // type can be omitted here because it was defined in the base query\n * .select({ n: (q) => sql`n + 1` })\n * .where({ n: { lt: 100 } }),\n * )\n * .from('t')\n * .where({ n: { gt: 10 } });\n * ```\n */\n withRecursive<\n T extends PickQueryWithDataColumnTypes,\n Name extends string,\n Q extends PickQueryResult,\n Result = CteResult<T, Name, Q>,\n >(\n this: T,\n name: Name,\n base: Q | ((qb: CteQueryBuilder<T>) => Q),\n recursive: (qb: {\n [K in keyof Result]: K extends 'result' ? Q['result'] : Result[K];\n }) => PickQueryResult,\n ): Result;\n withRecursive<\n T extends PickQueryWithDataColumnTypes,\n Name extends string,\n Q extends PickQueryResult,\n Result = CteResult<T, Name, Q>,\n >(\n this: T,\n name: Name,\n options: CteRecursiveOptions,\n base: Q | ((qb: CteQueryBuilder<T>) => Q),\n recursive: (qb: {\n [K in keyof Result]: K extends 'result' ? Q['result'] : Result[K];\n }) => PickQueryResult,\n ): Result;\n withRecursive(name: string, ...args: unknown[]) {\n const q = _clone(this);\n\n // eslint-disable-next-line prefer-const\n let [options, baseFn, recursiveFn] = (\n args.length === 2 ? [{}, args[0], args[1]] : args\n ) as [\n options: CteRecursiveOptions,\n base: Query | ((q: unknown) => Query),\n recursive: (q: unknown) => Query,\n ];\n\n const arg = q.qb.clone();\n arg.q.withShapes = q.q.withShapes;\n let query = typeof baseFn === 'function' ? baseFn(arg) : baseFn;\n const shape = getShapeFromSelect(query, true) as Column.Shape.QueryInit;\n const withConfig = { shape, computeds: query.q.runtimeComputeds };\n (arg.q.withShapes ??= {})[name] = withConfig;\n const recursive = recursiveFn(arg);\n\n query = _queryUnion(query, [recursive], options.union ?? 'UNION ALL');\n\n (options as CteOptions).recursive = true;\n\n if (options.columns === true) {\n options = {\n ...options,\n columns: Object.keys(shape),\n };\n }\n\n _addCte(q, {\n n: name,\n o: options as CteOptions,\n q: prepareSubQueryForSql(q, query),\n });\n\n return setQueryObjectValueImmutable(q, 'withShapes', name, withConfig);\n }\n\n /**\n * Use `withSql` to add a Common Table Expression (CTE) based on a custom SQL.\n *\n * Similarly to [with](#with), `withRecursive` can be chained to any table or `db.$qb`.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * db.table\n * .withSql(\n * 'alias',\n * // define column types of the expression:\n * (t) => ({\n * one: t.integer(),\n * two: t.string(),\n * }),\n * // define SQL expression:\n * (q) => sql`(VALUES (1, 'two')) t(one, two)`,\n * )\n * // is not prefixed in the middle of a query chain\n * .withSql(\n * 'second',\n * (t) => ({\n * x: t.integer(),\n * }),\n * (q) => sql`(VALUES (1)) t(x)`,\n * )\n * .from('alias');\n * ```\n *\n * Options can be passed via a second argument:\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * db.table\n * .withSql(\n * 'alias',\n * {\n * // all parameters are optional\n * recursive: true,\n * materialized: true,\n * notMaterialized: true,\n * },\n * (t) => ({\n * one: t.integer(),\n * two: t.string(),\n * }),\n * (q) => sql`(VALUES (1, 'two')) t(one, two)`,\n * )\n * .from('alias');\n * ```\n */\n withSql<\n T extends PickQueryWithDataColumnTypes,\n Name extends string,\n Shape extends Column.Shape.QueryInit,\n >(\n this: T,\n name: Name,\n options: CteOptions,\n shape: (t: T['columnTypes']) => Shape,\n expr: (q: T) => Expression,\n ): CteSqlResult<T, Name, Shape>;\n withSql<\n T extends PickQueryWithDataColumnTypes,\n Name extends string,\n Shape extends Column.Shape.QueryInit,\n >(\n this: T,\n name: Name,\n shape: (t: T['columnTypes']) => Shape,\n expr: (q: T) => Expression,\n ): CteSqlResult<T, Name, Shape>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n withSql(this: PickQueryWithDataColumnTypes, name: string, ...args: any[]) {\n const q = _clone(this);\n\n const [options, shapeFn, sql] =\n args.length === 2 ? [undefined, args[0], args[1]] : args;\n\n const shape = shapeFn(this.columnTypes);\n\n pushQueryValueImmutable(q, 'with', {\n n: name,\n o: { ...options, columns: Object.keys(shape) },\n s: sql(q),\n });\n\n return setQueryObjectValueImmutable(q, 'withShapes', name, {\n shape,\n });\n }\n}\n","import { PickQueryDataShapeAndJoinedShapes, QueryData } from '../query-data';\nimport { ToSQLCtx } from './to-sql';\nimport { Column } from '../../columns/column';\nimport { RecordString } from '../../utils';\nimport { ColumnsParsers } from '../query-columns/query-column-parsers';\nimport { _getQueryAliasOrName } from '../basic-features/as/as';\nimport { Expression, SelectableOrExpression } from '../expressions/expression';\nimport { makeRowToJson } from './sql';\n\n/**\n * Acts as {@link simpleExistingColumnToSQL} except that the column is optional and will return quoted key if no column.\n */\nexport function simpleColumnToSQL(\n ctx: ToSQLCtx,\n key: string,\n column?: Column.Pick.QueryColumn,\n quotedAs?: string,\n): string {\n if (!column) return `\"${key}\"`;\n\n const { data } = column as unknown as Column.Pick.Data;\n return data.computed\n ? `(${data.computed.toSQL(ctx, quotedAs)})`\n : `${quotedAs ? `${quotedAs}.` : ''}\"${data.name || key}\"`;\n}\n\n// Takes a column name without a dot and the optional column object.\n// Handles computed column, uses column.data.name when set, prefixes regular column with `quotedAs`.\nexport function simpleExistingColumnToSQL(\n ctx: ToSQLCtx,\n key: string,\n column: Column.Pick.QueryColumn,\n quotedAs?: string,\n): string {\n const { data } = column as unknown as Column.Pick.Data;\n return data.computed\n ? `(${data.computed.toSQL(ctx, quotedAs)})`\n : `${quotedAs ? `${quotedAs}.` : ''}\"${data.name || key}\"`;\n}\n\nexport const columnToSql = (\n ctx: ToSQLCtx,\n data: {\n valuesJoinedAs?: RecordString;\n aliases?: RecordString;\n joinedShapes?: QueryData['joinedShapes'];\n parsers?: ColumnsParsers;\n },\n shape: Column.QueryColumns,\n column: string,\n quotedAs?: string,\n select?: true,\n): string => {\n let index = column.indexOf('.');\n if (index === -1) {\n const joinAs = data.valuesJoinedAs?.[column];\n if (joinAs) {\n column = joinAs + '.' + column;\n index = joinAs.length;\n }\n }\n\n if (index !== -1) {\n return columnWithDotToSql(\n ctx,\n data,\n shape,\n column,\n index,\n quotedAs,\n select,\n );\n }\n\n return simpleColumnToSQL(ctx, column, shape[column], quotedAs);\n};\n\n/**\n * in a case when ordering or grouping by a column which was selected as expression:\n * ```ts\n * table.select({ x: (q) => q.sum('x') }).group('x').order('x')\n * ```\n * the column must not be prefixed with a table name.\n */\nexport const maybeSelectedColumnToSql = (\n ctx: ToSQLCtx,\n data: QueryData,\n column: string,\n quotedAs?: string,\n): string => {\n const index = column.indexOf('.');\n if (index !== -1) {\n return columnWithDotToSql(ctx, data, data.shape, column, index, quotedAs);\n } else {\n if (data.joinedShapes?.[column]) {\n return `\"${column}\".\"${column}\"`;\n }\n\n if (data.select) {\n for (const s of data.select) {\n if (typeof s === 'object' && 'selectAs' in s) {\n if (column in s.selectAs) {\n return simpleColumnToSQL(ctx, column, data.shape[column]);\n }\n }\n }\n }\n\n return simpleColumnToSQL(ctx, column, data.shape[column], quotedAs);\n }\n};\n\nconst columnWithDotToSql = (\n ctx: ToSQLCtx,\n data: {\n aliases?: RecordString;\n joinedShapes?: QueryData['joinedShapes'];\n parsers?: ColumnsParsers;\n },\n shape: Column.QueryColumns,\n column: string,\n index: number,\n quotedAs?: string,\n select?: true,\n): string => {\n const table = column.slice(0, index);\n const key = column.slice(index + 1);\n if (key === '*') {\n const shape = data.joinedShapes?.[table];\n return shape\n ? select\n ? makeRowToJson(table, shape as never, true)\n : `\"${table}\".*`\n : column;\n }\n\n const tableName = _getQueryAliasOrName(data, table);\n const quoted = `\"${table}\"`;\n\n const col = (quoted === quotedAs\n ? shape[key]\n : data.joinedShapes?.[tableName]?.[key]) as unknown as\n | Column.Pick.Data\n | undefined;\n\n if (col) {\n if (col.data.name) {\n return `\"${tableName}\".\"${col.data.name}\"`;\n }\n\n if (col.data.computed) {\n return `(${col.data.computed.toSQL(ctx, quoted)})`;\n }\n\n return `\"${tableName}\".\"${key}\"`;\n }\n\n return `\"${tableName}\".\"${key}\"`;\n};\n\nexport const columnToSqlWithAs = (\n ctx: ToSQLCtx,\n data: QueryData,\n column: string,\n as: string,\n quotedAs?: string,\n select?: true,\n jsonList?: { [K: string]: Column.Pick.Data | undefined },\n): string => {\n const index = column.indexOf('.');\n return index !== -1\n ? tableColumnToSqlWithAs(\n ctx,\n data,\n column,\n column.slice(0, index),\n column.slice(index + 1),\n as,\n quotedAs,\n select,\n jsonList,\n )\n : ownColumnToSqlWithAs(ctx, data, column, as, quotedAs, select, jsonList);\n};\n\nexport const tableColumnToSqlWithAs = (\n ctx: ToSQLCtx,\n data: QueryData,\n column: string,\n table: string,\n key: string,\n as: string,\n quotedAs?: string,\n select?: true,\n jsonList?: { [K: string]: Column.Pick.Data | undefined },\n): string => {\n if (key === '*') {\n if (jsonList) jsonList[as] = undefined;\n\n const shape = data.joinedShapes?.[table];\n if (shape) {\n if (select) {\n return makeRowToJson(table, shape as never, true) + ` \"${as}\"`;\n }\n\n return `\"${table}\".\"${table}\" \"${as}\"`;\n }\n\n return column;\n }\n\n const tableName = _getQueryAliasOrName(data, table);\n const quoted = `\"${table}\"`;\n\n const col = (quoted === quotedAs\n ? data.shape[key]\n : data.joinedShapes?.[tableName][key]) as unknown as Column.Pick.Data;\n\n if (jsonList) jsonList[as] = col as never;\n\n if (col) {\n if (col.data.name && col.data.name !== key) {\n return `\"${tableName}\".\"${col.data.name}\" \"${as}\"`;\n }\n\n if (col.data.computed) {\n return `(${col.data.computed.toSQL(ctx, quoted)}) \"${as}\"`;\n }\n }\n\n return `\"${tableName}\".\"${key}\"${key === as ? '' : ` \"${as}\"`}`;\n};\n\nexport const ownColumnToSqlWithAs = (\n ctx: ToSQLCtx,\n data: QueryData,\n column: string,\n as: string,\n quotedAs?: string,\n select?: true,\n jsonList?: { [K: string]: Column.Pick.Data | undefined },\n): string => {\n if (!select && data.joinedShapes?.[column]) {\n if (jsonList) jsonList[as] = undefined;\n\n return `\"${column}\".\"${column}\" \"${as}\"`;\n }\n\n const col = data.shape[column];\n\n if (jsonList) jsonList[as] = col;\n\n if (col) {\n if (col.data.name && col.data.name !== column) {\n return `${quotedAs ? `${quotedAs}.` : ''}\"${col.data.name}\"${\n col.data.name === as ? '' : ` \"${as}\"`\n }`;\n }\n\n if (col.data.computed) {\n return `(${col.data.computed.toSQL(ctx, quotedAs)}) \"${as}\"`;\n }\n }\n\n return `${quotedAs ? `${quotedAs}.` : ''}\"${column}\"${\n column === as ? '' : ` \"${as}\"`\n }`;\n};\n\nexport const rawOrColumnToSql = (\n ctx: ToSQLCtx,\n data: PickQueryDataShapeAndJoinedShapes,\n expr: SelectableOrExpression,\n quotedAs: string | undefined,\n shape: Column.QueryColumns = data.shape,\n select?: true,\n): string => {\n return typeof expr === 'string'\n ? columnToSql(ctx, data, shape, expr, quotedAs, select)\n : (expr as Expression).toSQL(ctx, quotedAs);\n};\n","import { columnToSql, rawOrColumnToSql } from '../../sql/column-to-sql';\nimport { IsQuery, Query } from '../../query';\nimport { whereToSql } from '../where/where.sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport {\n JoinedShapes,\n PickQueryDataShapeAndJoinedShapes,\n PickQueryDataShapeAndJoinedShapesAndAliases,\n QueryData,\n} from '../../query-data';\nimport { RawSql } from '../../expressions/raw-sql';\nimport { Column } from '../../../columns/column';\nimport { moveMutativeQueryToCte } from '../cte/cte.sql';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { _getQueryAliasOrName, getQueryAs } from '../as/as';\nimport { addValue, RecordUnknown } from '../../../utils';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport {\n quoteFromWithSchema,\n quoteTableWithSchema,\n requireTableOrStringFrom,\n} from '../../sql/sql';\nimport { getQuerySchema } from '../storage/storage';\n\nexport type SimpleJoinItemNonSubQueryArgs =\n | [{ [K: string]: string | Expression } | Expression | true]\n | [leftColumn: string | Expression, rightColumn: string | Expression]\n | [\n leftColumn: string | Expression,\n op: string,\n rightColumn: string | Expression,\n ];\n\nexport type JoinItemArgs =\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // lateral join query\n l: SubQueryForSql;\n // as\n a: string;\n // \"inner join\" by checking `IS NOT NULL` in the `ON`\n i?: boolean;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // relation query from `relation.joinQuery`\n j: IsQuery;\n // join a sub query, is not applicable in whereExists\n s: boolean;\n // callback result, if callback is present\n r?: IsQuery;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // `with` item name\n w: string;\n // callback result\n r: IsQuery;\n // join a sub query, is not applicable in whereExists\n s: boolean;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // `with` item name\n w: string;\n // join arguments\n a: SimpleJoinItemNonSubQueryArgs;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // joining query\n q: IsQuery;\n // join a sub query, is not applicable in whereExists\n s: boolean;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // joining query\n q: IsQuery;\n // callback result\n r: IsQuery;\n // join a sub query, is not applicable in whereExists\n s: boolean;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // joining query\n q: IsQuery;\n // join arguments\n a: SimpleJoinItemNonSubQueryArgs;\n // join a sub query, is not applicable in whereExists\n s: boolean;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c: Column.Shape.Data;\n // alias\n a: string;\n // array of values, item is a record\n d: RecordUnknown[];\n };\n\nexport interface JoinItem {\n type: string;\n args: JoinItemArgs;\n}\n\ntype ItemOf2Or3Length =\n | [leftColumn: string | Expression, rightColumn: string | Expression]\n | [\n leftColumn: string | Expression,\n op: string,\n rightColumn?: string | Expression,\n ];\n\ninterface SqlJoinItem {\n target: string;\n on?: string;\n}\n\nexport const processJoinItem = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: PickQueryDataShapeAndJoinedShapesAndAliases,\n args: JoinItemArgs,\n quotedAs: string | undefined,\n): SqlJoinItem => {\n let target: string;\n let on: string | undefined;\n\n const forbidLateral = 'u' in args;\n\n // lateral\n if ('l' in args) {\n const { aliasValue } = ctx;\n ctx.aliasValue = true;\n\n target = `(${moveMutativeQueryToCte(ctx, args.l)}) \"${_getQueryAliasOrName(\n query,\n args.a,\n )}\"`;\n\n on = `${args.i ? `\"${args.a}\".\"${args.a}\" IS NOT NULL` : 'true'}`;\n\n ctx.aliasValue = aliasValue;\n } else if ('j' in args) {\n const { j, s, r } = args as {\n j: SubQueryForSql;\n s: boolean;\n r?: Query;\n };\n\n const tableName = (\n typeof j.q.from === 'string' ? j.q.from : j.table\n ) as string;\n\n const joinTable = requireTableOrStringFrom(j);\n target = quoteFromWithSchema(getQuerySchema(j), joinTable);\n\n const as = j.q.as as string;\n const joinAs = `\"${as}\"`;\n if (as !== tableName) {\n target += ` ${joinAs}`;\n }\n\n if (r && s) {\n target = subJoinToSql(\n ctx,\n j,\n `\"${joinTable}\"`,\n !forbidLateral,\n joinAs,\n true,\n );\n } else {\n on = whereToSql(ctx, j, j.q, joinAs);\n }\n } else if ('w' in args) {\n const { w } = args;\n target = `\"${w}\"`;\n\n if ('r' in args) {\n const { s, r } = args as {\n w: string;\n s: boolean;\n r: SubQueryForSql;\n };\n if (s) {\n target = subJoinToSql(ctx, r, target, !forbidLateral, target);\n } else {\n on = whereToSql(ctx, r as unknown as Query, r.q, target);\n }\n } else {\n on = processArgs(\n args.a,\n ctx,\n query,\n target,\n (query.joinedShapes as JoinedShapes)[w],\n quotedAs,\n );\n }\n } else if ('d' in args) {\n const shape = args.c;\n const { values } = ctx;\n\n target = `(VALUES ${args.d\n .map((x) => {\n return (\n '(' +\n Object.entries(shape)\n .map(([key, column]) => {\n const value = x[key];\n return (\n addValue(\n values,\n value === null || value === undefined\n ? null\n : column.data.encode\n ? column.data.encode(value)\n : value,\n ) +\n '::' +\n (column as Column).dataType\n );\n })\n .join(', ') +\n ')'\n );\n })\n .join(', ')}) \"${args.a}\"(${Object.entries(shape)\n .map(([key, column]) => `\"${column.data.name || key}\"`)\n .join(', ')})`;\n } else {\n const { q, s } = args as {\n q: SubQueryForSql;\n s: boolean;\n };\n let joinAs;\n\n if ('r' in args) {\n const { r } = args as {\n q: Query;\n s: boolean;\n r: Query;\n };\n\n const res = getArgQueryTarget(ctx, q, s && !forbidLateral, s, s);\n target = res.target;\n joinAs = res.joinAs;\n\n if (!s || forbidLateral) {\n on = whereToSql(ctx, r, r.q, `\"${getQueryAs(r)}\"`);\n }\n } else {\n const res = getArgQueryTarget(ctx, q, false, s);\n target = res.target;\n joinAs = res.joinAs;\n\n if ('a' in args) {\n on = processArgs(args.a, ctx, query, joinAs, q.shape, quotedAs);\n }\n }\n\n // if it's a sub query, WHERE conditions are already in the sub query\n if (!s) {\n const whereSql = whereToSql(\n ctx,\n q,\n {\n ...q.q,\n joinedShapes: {\n ...query.joinedShapes,\n ...q.q.joinedShapes,\n [(table.q.as || table.table) as string]: table.q.shape,\n },\n },\n joinAs,\n );\n if (whereSql) {\n if (on) on += ` AND ${whereSql}`;\n else on = whereSql;\n }\n }\n }\n\n return { target, on };\n};\n\nconst getArgQueryTarget = (\n ctx: ToSQLCtx,\n first: SubQueryForSql,\n lateral: boolean,\n joinSubQuery: boolean,\n cloned?: boolean,\n) => {\n const joinQuery = first.q;\n\n const quotedFrom =\n typeof joinQuery.from === 'string' ? `\"${joinQuery.from}\"` : undefined;\n\n let joinAs = quotedFrom || `\"${first.table}\"`;\n\n const qAs = joinQuery.as ? `\"${joinQuery.as}\"` : undefined;\n const addAs = qAs && qAs !== joinAs;\n\n if (joinSubQuery) {\n return {\n target: subJoinToSql(ctx, first, joinAs, lateral, qAs, cloned),\n joinAs: addAs ? qAs : joinAs,\n };\n } else {\n let target = quotedFrom || quoteTableWithSchema(first);\n if (addAs) {\n joinAs = qAs;\n target += ` ${qAs}`;\n }\n return { target, joinAs };\n }\n};\n\nconst subJoinToSql = (\n ctx: ToSQLCtx,\n jq: SubQueryForSql,\n innerAs: string,\n lateral: boolean,\n outerAs?: string,\n cloned?: boolean,\n) => {\n if (!jq.q.select && jq.q.selectAllColumns) {\n if (!cloned) jq = jq.clone();\n jq.q.select = [new RawSql(`${innerAs}.*`)];\n }\n\n const sql = `(${moveMutativeQueryToCte(ctx, jq)}) ${outerAs || innerAs}`;\n return lateral ? `LATERAL ${sql}` : sql;\n};\n\nconst processArgs = (\n args: SimpleJoinItemNonSubQueryArgs,\n ctx: ToSQLCtx,\n query: PickQueryDataShapeAndJoinedShapes,\n joinAs: string,\n joinShape: Column.QueryColumns,\n quotedAs?: string,\n): string | undefined => {\n return args.length\n ? args.length === 1\n ? getObjectOrRawConditions(\n ctx,\n query,\n args[0],\n quotedAs,\n joinAs,\n joinShape,\n )\n : getConditionsFor3Or4LengthItem(\n ctx,\n query,\n joinAs,\n quotedAs,\n args as ItemOf2Or3Length,\n joinShape,\n )\n : undefined;\n};\n\nconst getConditionsFor3Or4LengthItem = (\n ctx: ToSQLCtx,\n query: PickQueryDataShapeAndJoinedShapes,\n target: string,\n quotedAs: string | undefined,\n args: ItemOf2Or3Length,\n joinShape: Column.QueryColumns,\n): string => {\n const [leftColumn, opOrRightColumn, maybeRightColumn] = args;\n\n const op = maybeRightColumn ? opOrRightColumn : '=';\n const rightColumn = maybeRightColumn ? maybeRightColumn : opOrRightColumn;\n\n return `${rawOrColumnToSql(\n ctx,\n query,\n leftColumn,\n target,\n joinShape,\n )} ${op} ${rawOrColumnToSql(ctx, query, rightColumn, quotedAs, query.shape)}`;\n};\n\nconst getObjectOrRawConditions = (\n ctx: ToSQLCtx,\n query: PickQueryDataShapeAndJoinedShapes,\n data: { [K: string]: string | Expression } | Expression | true,\n quotedAs: string | undefined,\n joinAs: string,\n joinShape: Column.QueryColumns,\n): string => {\n if (data === true) {\n return 'true';\n } else if (isExpression(data)) {\n return data.toSQL(ctx, quotedAs);\n } else {\n const pairs: string[] = [];\n const shape = query.shape;\n\n for (const key in data) {\n const value = data[key];\n\n pairs.push(\n `${columnToSql(\n ctx,\n query,\n joinShape,\n key,\n joinAs,\n )} = ${rawOrColumnToSql(ctx, query, value, quotedAs, shape)}`,\n );\n }\n\n return pairs.join(', ');\n }\n};\n\nexport const pushJoinSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryData & {\n join: JoinItem[];\n },\n quotedAs?: string,\n) => {\n const joinSet = query.join.length > 1 ? new Set<string>() : null;\n\n for (const item of query.join) {\n const { target, on = 'true' } = processJoinItem(\n ctx,\n table,\n query,\n item.args,\n quotedAs,\n );\n\n const sql = `${item.type} ${target} ON ${on}`;\n\n if (joinSet) {\n if (joinSet.has(sql)) continue;\n joinSet.add(sql);\n }\n\n ctx.sql.push(sql);\n }\n};\n","import { selectAllSql } from '../basic-features/select/select.sql';\nimport { columnToSql } from '../sql/column-to-sql';\nimport { Column } from '../../columns/column';\nimport { Expression, ExpressionData } from './expression';\nimport { ToSQLCtx, ToSQLQuery } from '../sql/to-sql';\nimport { QueryData } from '../query-data';\n\n/**\n * Expression that can turn a {@link SelectItem} (except {@link SelectAs}) into SQL.\n * Used by `get` to have an expression that can be chained with operators.\n */\nexport class SelectItemExpression<\n T extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n> extends Expression<T> {\n result: { value: T };\n q: ExpressionData;\n\n constructor(\n public query: ToSQLQuery,\n public item: string | Expression,\n value?: T,\n ) {\n super();\n this.result = { value: value as T };\n this.q = query.q as ExpressionData;\n if (value) Object.assign(this, value.operators);\n }\n\n // `makeSQL` acts similarly to how select args are handled\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n const q = this.q as QueryData;\n return typeof this.item === 'string'\n ? this.item === '*'\n ? selectAllSql(q, quotedAs).join(', ')\n : columnToSql(ctx, q, q.shape, this.item, quotedAs, true)\n : this.item.toSQL(ctx, quotedAs);\n }\n}\n","import { SelectItemExpression } from '../../expressions/select-item-expression';\nimport { Operators, setQueryOperators } from '../../../columns/operators';\nimport { getFullColumnTable } from '../../query.utils';\nimport { Column } from '../../../columns';\nimport {\n PickQueryQ,\n PickQuerySelectable,\n PickQueryShape,\n PickQueryTable,\n} from '../../pick-query-types';\nimport { Expression } from '../../expressions/expression';\nimport {\n IsQuery,\n SetQueryReturnsColumnOptional,\n SetQueryReturnsColumnOrThrow,\n SetQueryReturnsValueOptional,\n SetQueryReturnsValueOrThrow,\n} from '../../query';\nimport { getValueKey } from './get-value-key';\nimport {\n addParserForRawExpression,\n setParserForSelectedString,\n} from '../select/select.utils';\nimport { getQueryAs } from '../as/as';\n\nexport type QueryGetSelf = PickQuerySelectable;\n\n// `get` method argument, accepts a string for a column name or a raw SQL\nexport type GetArg<T extends QueryGetSelf> = GetStringArg<T> | Expression;\n\nexport type GetStringArg<T extends PickQuerySelectable> =\n keyof T['__selectable'] & string;\n\n// `get` method result: returns a column type for raw expression or a value type for string argument\nexport type GetResult<\n T extends QueryGetSelf,\n Arg extends GetArg<T>,\n> = Arg extends string\n ? SetQueryReturnsValueOrThrow<T, Arg>\n : Arg extends Expression\n ? SetQueryReturnsColumnOrThrow<T, Arg['result']['value']>\n : never;\n\nexport type GetResultOptional<\n T extends QueryGetSelf,\n Arg extends GetArg<T>,\n> = Arg extends string\n ? SetQueryReturnsValueOptional<T, Arg>\n : Arg extends Expression\n ? SetQueryReturnsColumnOptional<T, Arg['result']['value']>\n : never;\n\nexport const _getSelectableColumn = (\n q: IsQuery,\n arg: string,\n): Column.Pick.QueryColumn | undefined => {\n let type: Column.Pick.QueryColumn | undefined = (q as unknown as PickQueryQ).q\n .shape[arg];\n if (!type) {\n const index = arg.indexOf('.');\n if (index !== -1) {\n const as =\n (q as unknown as PickQueryQ).q.as || (q as PickQueryTable).table;\n\n const table = getFullColumnTable(q, arg, index, as);\n const column = arg.slice(index + 1);\n\n if (table === as) {\n type = (q as unknown as PickQueryShape).shape[column];\n } else {\n type = (q as unknown as PickQueryQ).q.joinedShapes?.[table]?.[column];\n }\n }\n }\n return type;\n};\n\n// mutate the query to get a single value\nconst _get = <\n T extends QueryGetSelf,\n R extends 'value' | 'valueOrThrow',\n Arg extends GetArg<T>,\n>(\n query: T,\n returnType: R,\n arg: Arg,\n): R extends 'value' ? GetResultOptional<T, Arg> : GetResult<T, Arg> => {\n const q = (query as unknown as PickQueryQ).q;\n\n if (q.returning) q.returning = undefined;\n\n q.returnType = returnType;\n\n let type: Column | undefined;\n if (typeof arg === 'string') {\n const joinedAs = q.valuesJoinedAs?.[arg];\n\n type = (\n joinedAs\n ? q.joinedShapes?.[joinedAs]?.value\n : _getSelectableColumn(query as never, arg)\n ) as Column | undefined;\n\n q.getColumn = type;\n\n const selected = setParserForSelectedString(\n query as never,\n joinedAs ? joinedAs + '.' + arg : arg,\n getQueryAs(query as never),\n getValueKey,\n );\n\n q.select = selected\n ? [(q.expr = new SelectItemExpression(query as never, selected, type))]\n : undefined;\n } else {\n type = arg.result.value as Column | undefined;\n q.getColumn = type;\n addParserForRawExpression(query as never, getValueKey, arg);\n q.select = [(q.expr = arg)];\n }\n\n return setQueryOperators(\n query as never,\n type?.operators || Operators.any,\n ) as never;\n};\n\nexport function _queryGet<T extends QueryGetSelf, Arg extends GetArg<T>>(\n self: T,\n arg: Arg,\n): GetResult<T, Arg> {\n return _get(self, 'valueOrThrow', arg);\n}\n\nexport function _queryGetOptional<\n T extends QueryGetSelf,\n Arg extends GetArg<T>,\n>(self: T, arg: Arg): GetResultOptional<T, Arg> {\n return _get(self, 'value', arg);\n}\n","import { _queryGetOptional } from '../get/get.utils';\nimport {\n Query,\n queryTypeWithLimitOne,\n SetQueryReturnsColumnOptional,\n} from '../../query';\nimport { Column } from '../../../columns/column';\nimport { cloneQueryBaseUnscoped, queryWrap } from '../wrap/wrap';\nimport { UnknownColumn } from '../../../columns';\nimport { selectToSql } from '../select/select.sql';\nimport { Expression, ExpressionData } from '../../expressions/expression';\nimport { getQueryAs } from '../as/as';\nimport { ToSQLCtx } from '../../sql/to-sql';\n\nclass RowToJsonExpression extends Expression {\n q: ExpressionData;\n result = { value: UnknownColumn.instance };\n\n constructor(\n public from: Query,\n public one: boolean,\n public coalesce?: boolean,\n ) {\n super();\n this.q = { expr: this };\n }\n\n makeSQL(ctx: ToSQLCtx) {\n const q = this.from;\n const aliases: string[] = [];\n const jsonList: { [K: string]: Column | undefined } = {};\n const select = selectToSql(\n ctx,\n q,\n q.q,\n `\"${getQueryAs(q)}\"`,\n q.q.hookSelect,\n undefined,\n aliases,\n jsonList,\n );\n q.q.selectCache = { sql: select, aliases };\n\n let rowToJson: string;\n if (Object.values(jsonList).some((x) => x?.data.jsonCast)) {\n rowToJson = `json_build_object(${Object.entries(jsonList)\n .map(\n ([key, column]) =>\n `'${key}', t.\"${key}\"${\n column?.data.jsonCast ? `::${column.data.jsonCast}` : ''\n }`,\n )\n .join(', ')})`;\n } else {\n rowToJson = 'row_to_json(t.*)';\n }\n\n return this.one\n ? rowToJson\n : this.coalesce !== false\n ? `COALESCE(json_agg(${rowToJson}), '[]')`\n : `json_agg(${rowToJson})`;\n }\n}\n\nexport function queryJson<T>(\n self: T,\n coalesce?: boolean,\n): SetQueryReturnsColumnOptional<T, Column.Pick.QueryColumnOfType<string>> {\n const inner = (self as Query).clone();\n\n const q = queryWrap(inner, cloneQueryBaseUnscoped(inner)) as unknown as Query;\n // json_agg is used instead of jsonb_agg because it is 2x faster, according to my benchmarks\n _queryGetOptional(\n q,\n new RowToJsonExpression(\n inner,\n queryTypeWithLimitOne[(self as Query).q.returnType as string],\n coalesce,\n ),\n );\n\n // to skip LIMIT 1\n q.q.returnsOne = true;\n\n return q as never;\n}\n","import { SelectItemExpression } from '../../expressions/select-item-expression';\nimport { ToSql, ToSQLCtx } from '../../sql/to-sql';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { addTopCte } from './cte.sql';\nimport { _clone } from '../clone/clone';\nimport { getShapeFromSelect } from '../select/select.utils';\nimport { getQueryAs } from '../as/as';\nimport { getSqlText } from '../../sql/sql';\nimport { QueryType } from '../../query-data';\n\nexport const moveQueryToCte = (\n ctx: ToSQLCtx,\n query: SubQueryForSql,\n type: QueryType,\n dontAddTableHook?: boolean,\n): {\n as: string;\n makeSelectList(isSubSql?: boolean): string[];\n} => {\n const { returnType } = query.q;\n\n let valueAs: string | undefined;\n if (\n returnType === 'value' ||\n returnType === 'valueOrThrow' ||\n returnType === 'pluck'\n ) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const first = query.q.select![0];\n if (\n first instanceof SelectItemExpression &&\n typeof first.item === 'string'\n ) {\n valueAs = first.item;\n } else {\n query = _clone(query) as unknown as SubQueryForSql;\n query.q.returnType = 'one';\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n query.q.select = [{ selectAs: { value: query.q.select![0] as never } }];\n valueAs = 'value';\n }\n }\n\n const as = addTopCte('before', ctx, query, type, undefined, dontAddTableHook);\n\n const makeSelectList = (isSubSql?: boolean) => {\n const list: string[] = [];\n\n let selectedCount = 0;\n if (valueAs) {\n selectedCount = 1;\n list.push(`\"${as}\".\"${valueAs}\"`);\n } else if (returnType !== 'void') {\n const shape = getShapeFromSelect(query, true);\n const keys = Object.keys(shape);\n selectedCount = keys.length;\n list.push(...keys.map((key) => `\"${as}\".\"${key}\"`));\n }\n\n if (!isSubSql && ctx.topCtx.cteHooks?.hasSelect) {\n list.push('NULL::json');\n ctx.selectedCount = selectedCount;\n }\n\n return list;\n };\n\n return {\n as,\n makeSelectList,\n };\n};\n\nexport const moveMutativeQueryToCteBase = (\n toSql: ToSql,\n ctx: ToSQLCtx,\n query: SubQueryForSql,\n type = query.q.type,\n): {\n as: string;\n makeSql(isSubSql?: boolean): string;\n} => {\n if (!query.q.type) {\n const as = getQueryAs(query);\n return {\n as,\n makeSql: () => getSqlText(toSql(query, query.q.type, ctx, true)),\n };\n }\n\n const { as, makeSelectList } = moveQueryToCte(ctx, query, type);\n\n return {\n as,\n // need to be called lazily for the upsert case because `ctx.cteHooks?.hasSelect` can change after the first query\n makeSql(isSubSql) {\n return 'SELECT ' + makeSelectList(isSubSql) + ` FROM \"${as}\"`;\n },\n };\n};\n","import { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { Column } from '../../../columns/column';\nimport {\n CteHooks,\n CteTableHook,\n EnsureCountItem,\n HookSelect,\n TableHook,\n} from '../../basic-features/select/hook-select';\nimport { QueryData } from '../../query-data';\n\nexport type HookPurpose = 'Create' | 'Update' | 'Delete';\n\nexport const addTableHook = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n data: QueryData,\n select?: HookSelect,\n hookPurpose?: HookPurpose,\n dontAddTableHook?: boolean,\n): void => {\n if (data.ensureCount !== undefined && ctx.cteName) {\n const cteHooks = setCteHooks(ctx, true);\n (cteHooks.ensureCount ??= {})[ctx.cteName] = { count: data.ensureCount };\n }\n\n const afterCreate = data.afterCreate;\n const afterUpdate = data.afterUpdate;\n const afterSave = data.afterSave;\n const afterDelete = data.afterDelete;\n const afterCreateCommit = data.afterCreateCommit;\n const afterUpdateCommit = data.afterUpdateCommit;\n const afterSaveCommit = data.afterSaveCommit;\n const afterDeleteCommit = data.afterDeleteCommit;\n const throwOnNotFound =\n // Assuming that Create always returns a record, though needs to be cautions with onConflictDoNothing\n hookPurpose !== 'Create' &&\n (data.returnType === 'oneOrThrow' || data.returnType === 'valueOrThrow');\n\n const hasAfterHook =\n afterCreate ||\n afterUpdate ||\n afterSave ||\n afterDelete ||\n afterCreateCommit ||\n afterUpdateCommit ||\n afterSaveCommit ||\n afterDeleteCommit;\n\n if (!select && !hasAfterHook && !throwOnNotFound) {\n return;\n }\n\n const tableHook: TableHook = {\n hookPurpose,\n select,\n afterCreate,\n afterUpdate,\n afterSave,\n afterDelete,\n afterCreateCommit,\n afterUpdateCommit,\n afterSaveCommit,\n afterDeleteCommit,\n };\n\n if (ctx.cteName && !dontAddTableHook) {\n if (tableHook && (hasAfterHook || throwOnNotFound)) {\n const shape: Column.Shape.Data = {};\n if (tableHook.select) {\n for (const key of tableHook.select.keys()) {\n shape[key] = q.shape[key] as unknown as Column.Pick.Data;\n }\n }\n\n const item: CteTableHook = {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n table: q.table!,\n shape,\n tableHook: tableHook,\n throwOnNotFound,\n };\n\n const hasSelect = throwOnNotFound || !!tableHook.select;\n const cteHooks = setCteHooks(ctx, hasSelect);\n (cteHooks.tableHooks ??= {})[ctx.cteName] ??= item;\n }\n } else {\n ctx.topCtx.tableHook = tableHook;\n }\n};\n\nexport const setCteHooks = (ctx: ToSQLCtx, hasSelect: boolean): CteHooks => {\n if (\n hasSelect &&\n ctx.topCtx.selectList &&\n ctx.topCtx === ctx.topCtx.topCtx &&\n !ctx.topCtx.cteHookTopNullSelectAppended\n ) {\n ctx.topCtx.selectList.push('NULL');\n ctx.topCtx.cteHookTopNullSelectAppended = true;\n }\n\n if (ctx.topCtx.cteHooks) {\n if (hasSelect) ctx.topCtx.cteHooks.hasSelect = true;\n return ctx.topCtx.cteHooks;\n } else {\n return (ctx.topCtx.cteHooks = {\n hasSelect,\n });\n }\n};\n\nexport const ensureCTECount = (\n ctx: ToSQLCtx,\n cteName: string,\n countItem: EnsureCountItem,\n) => {\n (setCteHooks(ctx, true).ensureCount ??= {})[cteName] = countItem;\n};\n","import { IsQuery, Query } from '../../query';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { _clone } from '../../basic-features/clone/clone';\nimport {\n prepareSubQueryForSql,\n SubQueryForSql,\n} from '../sub-query/sub-query-for-sql';\nimport { requirePrimaryKeys } from '../../query-columns/primary-keys';\nimport {\n _addToHookSelect,\n HookSelect,\n HookSelectValue,\n} from '../../basic-features/select/hook-select';\nimport { moveQueryToCte } from '../../basic-features/cte/move-mutative-query-to-cte-base.sql';\nimport { ensureCTECount } from '../../extra-features/hooks/hooks.sql';\nimport { JoinItem } from '../../basic-features/join/join.sql';\n\nexport interface MutativeQueriesSelectRelationsQueryData {\n selectRelation?: true;\n}\n\nexport interface MutativeQueriesSelectRelationsSqlProp {\n mutativeQueriesSelectRelationsState?: MutativeQueriesSelectRelationsSqlState;\n}\n\nexport interface MutativeQueriesSelectRelationsSqlState {\n query: IsQuery;\n value?: MutativeQueriesSelectRelationsValue;\n}\n\nexport interface MutativeQueriesSelectRelationsValue {\n [K: string]: IsQuery;\n}\n\nexport const newMutativeQueriesSelectRelationsSqlState = (\n query: ToSQLQuery,\n): MutativeQueriesSelectRelationsSqlState | undefined =>\n query.q.selectRelation && {\n query,\n };\n\nexport const setMutativeQueriesSelectRelationsSqlState = (\n d: MutativeQueriesSelectRelationsSqlState,\n as: string,\n rel: IsQuery,\n) => {\n (d.value ??= {})[as] = rel;\n};\n\nexport const handleInsertAndUpdateSelectRelationsSqlState = (\n ctx: ToSQLCtx,\n state: MutativeQueriesSelectRelationsSqlState | undefined,\n) => {\n if (state) {\n ctx.topCtx.mutativeQueriesSelectRelationsSqlState = state;\n }\n};\n\nexport const handleDeleteSelectRelationsSqlState = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n relationSelectState: MutativeQueriesSelectRelationsSqlState | undefined,\n returning: string | undefined,\n):\n | {\n join: JoinItem;\n joinedShape: string;\n movedWhereToCte: boolean;\n addReturning: string;\n }\n | undefined => {\n const selectRelations = relationSelectState?.value;\n if (!selectRelations) return;\n\n const selectPrimaryKeysQuery = prepareSubQueryForSql(query, _clone(query));\n\n const primaryKeys = requirePrimaryKeys(\n query as Query,\n 'primary keys are required for selecting relation in delete',\n );\n\n _addToHookSelect(selectPrimaryKeysQuery, primaryKeys, true);\n\n const { as: cteAs } = moveQueryToCte(\n ctx,\n selectPrimaryKeysQuery as unknown as SubQueryForSql,\n undefined,\n true,\n );\n\n const relKeys = Object.keys(selectRelations);\n\n ctx.selectedCount = (returning ? ctx.selectedCount : 0) + relKeys.length;\n\n const hookSelect = selectPrimaryKeysQuery.q.hookSelect as HookSelect;\n\n const join: JoinItem = {\n type: 'JOIN',\n args: {\n w: cteAs,\n a: [\n Object.fromEntries(\n primaryKeys.map((key) => {\n const selected = hookSelect.get(key) as HookSelectValue;\n return [\n cteAs + '.' + ((selected.as || selected.select) as string),\n key,\n ];\n }),\n ),\n ],\n },\n };\n\n for (const relKey in selectRelations) {\n const rel = selectRelations[relKey] as Query;\n if (\n rel.q.returnType === 'oneOrThrow' ||\n rel.q.returnType === 'valueOrThrow'\n ) {\n ensureCTECount(ctx, cteAs, { jsonNotNull: relKey });\n }\n }\n\n return {\n join,\n joinedShape: cteAs,\n movedWhereToCte: true,\n addReturning: relKeys.map((key) => `${cteAs}.\"${key}\"`).join(', '),\n };\n};\n\nexport const setMutativeQueriesSelectRelationsStateOnSql = (\n ctx: ToSQLCtx,\n sql: MutativeQueriesSelectRelationsSqlProp,\n) => {\n sql.mutativeQueriesSelectRelationsState =\n ctx.topCtx.mutativeQueriesSelectRelationsSqlState;\n};\n","import { RawSql } from '../../expressions/raw-sql';\nimport {\n columnToSqlWithAs,\n ownColumnToSqlWithAs,\n simpleColumnToSQL,\n tableColumnToSqlWithAs,\n} from '../../sql/column-to-sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { QueryData } from '../../query-data';\nimport { _queryGetOptional } from '../get/get.utils';\nimport { queryJson } from '../json/json.utils';\nimport { queryWrap } from '../wrap/wrap';\nimport { isQueryNone } from '../../extra-features/none/none';\nimport { anyShape } from '../../../columns/any-shape';\nimport { Column } from '../../../columns/column';\nimport { IntegerBaseColumn } from '../../../columns/column-types/number';\nimport { moveMutativeQueryToCte } from '../cte/cte.sql';\nimport { SelectItemExpression } from '../../expressions/select-item-expression';\nimport { HookSelect, HookSelectValue } from './hook-select';\nimport {\n addValue,\n getFreeAlias,\n isObjectEmpty,\n RecordString,\n RecordUnknown,\n} from '../../../utils';\nimport { ColumnsParsers } from '../../query-columns/query-column-parsers';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport {\n Expression,\n isExpression,\n SelectableOrExpression,\n} from '../../expressions/expression';\nimport { isRelationQuery } from '../../relations';\nimport { OrchidOrmInternalError, UnhandledTypeError } from '../../errors';\nimport { Query } from '../../query';\nimport { makeRowToJson } from '../../sql/sql';\nimport {\n MutativeQueriesSelectRelationsSqlState,\n setMutativeQueriesSelectRelationsSqlState,\n} from '../../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\n\nexport type SelectItem = string | SelectAs | Expression | undefined;\n\nexport interface SelectAs {\n selectAs: SelectAsValue;\n}\n\nexport interface SelectAsValue {\n [K: string]: string | Query | Expression | undefined;\n}\n\nexport const setSqlCtxSelectList = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: {\n shape: Column.QueryColumns;\n hookSelect?: HookSelect;\n selectCache?: QueryData['selectCache'];\n returnType?: QueryData['returnType'];\n },\n quotedAs?: string,\n isSubSql?: boolean,\n aliases?: string[],\n): void => {\n if (query.selectCache) {\n if (aliases) aliases.push(...query.selectCache.aliases);\n ctx.selectList = [query.selectCache.sql];\n } else {\n ctx.selectList = selectToSqlList(\n ctx,\n table,\n query,\n quotedAs,\n query.hookSelect,\n isSubSql,\n aliases,\n undefined,\n undefined,\n );\n\n if (!isSubSql && ctx.topCtx.cteHooks?.hasSelect) {\n ctx.selectList.push('NULL');\n }\n }\n};\n\nexport const selectToSqlList = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: {\n select?: QueryData['select'];\n selectAllColumns?: string[];\n selectAllShape?: RecordUnknown;\n join?: QueryData['join'];\n hookSelect?: HookSelect;\n shape: Column.QueryColumns;\n parsers?: ColumnsParsers;\n joinedShapes?: QueryData['joinedShapes'];\n returnType?: QueryData['returnType'];\n },\n quotedAs: string | undefined,\n hookSelect: HookSelect | undefined = query.hookSelect,\n isSubSql?: boolean,\n aliases?: string[],\n jsonList?: { [K: string]: Column.Pick.Data | undefined },\n delayedRelationSelect?: MutativeQueriesSelectRelationsSqlState,\n): string[] => {\n let selected: RecordUnknown | undefined;\n let selectedAs: RecordString | undefined;\n\n let list: string[] = [];\n\n ctx.selectedCount = 0;\n\n if (query.select) {\n for (const item of query.select) {\n if (typeof item === 'string') {\n let sql;\n if (item === '*') {\n if (hookSelect) {\n selected ??= {};\n selectedAs ??= {};\n for (const key in query.selectAllShape) {\n selected[key] = quotedAs;\n selectedAs[key] = key;\n }\n }\n\n sql = internalSelectAllSql(ctx, query, quotedAs, jsonList).join(', ');\n } else {\n ctx.selectedCount++;\n\n const index = item.indexOf('.');\n if (index !== -1) {\n const tableName = item.slice(0, index);\n const key = item.slice(index + 1);\n\n if (hookSelect?.get(key)) {\n (selected ??= {})[key] = `\"${tableName}\"`;\n (selectedAs ??= {})[key] = key;\n }\n\n sql = tableColumnToSqlWithAs(\n ctx,\n table.q,\n item,\n tableName,\n key,\n key === '*' ? tableName : key,\n quotedAs,\n true,\n jsonList,\n );\n } else {\n if (hookSelect?.get(item)) {\n (selected ??= {})[item] = quotedAs;\n (selectedAs ??= {})[item] = item;\n }\n\n sql = ownColumnToSqlWithAs(\n ctx,\n table.q,\n item,\n item,\n quotedAs,\n true,\n jsonList,\n );\n }\n }\n\n list.push(sql);\n aliases?.push('');\n } else if (item) {\n if ('selectAs' in item) {\n const obj = item.selectAs as {\n [K: string]: SelectableOrExpression | SubQueryForSql;\n };\n for (const as in obj) {\n ctx.selectedCount++;\n\n if (hookSelect) {\n (selected ??= {})[as] = true;\n }\n\n const value = obj[as];\n if (typeof value === 'object') {\n if (isExpression(value)) {\n list.push(`${value.toSQL(ctx, quotedAs)} \"${as}\"`);\n if (jsonList) {\n jsonList[as] = value.result\n .value as unknown as Column.Pick.Data;\n }\n aliases?.push(as);\n } else if (delayedRelationSelect && isRelationQuery(value)) {\n setMutativeQueriesSelectRelationsSqlState(\n delayedRelationSelect,\n as,\n value,\n );\n } else {\n pushSubQuerySql(ctx, query, value, as, list, quotedAs, aliases);\n if (jsonList) {\n jsonList[as] =\n value.q.returnType === 'value' ||\n value.q.returnType === 'valueOrThrow'\n ? ((value.q.expr?.result.value ||\n value.result?.value) as unknown as Column.Pick.Data)\n : undefined;\n }\n }\n } else if (value) {\n if (hookSelect) {\n (selectedAs ??= {})[value as string] = as;\n }\n\n list.push(\n columnToSqlWithAs(\n ctx,\n table.q,\n value as string,\n as,\n quotedAs,\n true,\n jsonList,\n ),\n );\n aliases?.push(as);\n }\n }\n } else {\n // selecting a single value from expression\n ctx.selectedCount++;\n const sql = item.toSQL(ctx, quotedAs);\n\n // `get` column\n if (\n hookSelect &&\n item instanceof SelectItemExpression &&\n typeof item.item === 'string' &&\n item.item !== '*'\n ) {\n const i = item.item.indexOf('.');\n let key: string | undefined;\n if (i !== -1) {\n if (item.item.slice(0, i) === table.table) {\n key = item.item.slice(i + 1);\n }\n } else {\n key = item.item;\n }\n\n if (key) {\n const column = (item.q as QueryData).shape[key];\n (selectedAs ??= {})[key] = column?.data.name || key;\n }\n }\n\n list.push(ctx.aliasValue ? `${sql} ${quotedAs}` : sql);\n aliases?.push('');\n }\n }\n }\n }\n\n if (hookSelect) {\n for (const column of hookSelect.keys()) {\n const item = hookSelect.get(column) as HookSelectValue;\n const { select } = item;\n let sql;\n let quotedTable;\n let columnName;\n let col;\n\n if (typeof select === 'string') {\n const index = select.indexOf('.');\n if (index !== -1) {\n const tableName = select.slice(0, index);\n quotedTable = `\"${tableName}\"`;\n columnName = select.slice(index + 1);\n col = table.q.joinedShapes?.[tableName]?.[columnName] as\n | Column\n | undefined;\n sql = col?.data.computed\n ? col.data.computed.toSQL(ctx, `\"${tableName}\"`)\n : `\"${tableName}\".\"${col?.data.name || columnName}\"`;\n } else {\n quotedTable = quotedAs;\n columnName = select;\n col = query.shape[select] as Column | undefined;\n sql = simpleColumnToSQL(ctx, select, col, quotedAs);\n }\n } else {\n columnName = column;\n sql = select.sql;\n }\n\n let name = columnName;\n if (selected?.[columnName]) {\n if (selected?.[columnName] === quotedTable) {\n if (!isSubSql) {\n hookSelect.delete(column);\n }\n item.onAs?.forEach((fn) => fn(columnName));\n continue;\n }\n\n name = getFreeAlias(selected, column);\n\n item.as = name;\n item.temp = name;\n sql += ` \"${name}\"`;\n item.onAs?.forEach((fn) => fn(name));\n } else if (selectedAs?.[columnName]) {\n const as = selectedAs[columnName];\n item.as = as;\n item.temp = columnName;\n item.onAs?.forEach((fn) => fn(as));\n continue;\n } else {\n if (col?.data.name || typeof select === 'object') {\n sql += ` \"${columnName}\"`;\n }\n item.temp = columnName;\n item.onAs?.forEach((fn) => fn(column));\n }\n\n if (jsonList) jsonList[name] = col;\n\n ctx.selectedCount++;\n list.push(sql);\n }\n }\n\n if (!list.length && !query.select && query.returnType !== 'void') {\n list = internalSelectAllSql(ctx, query, quotedAs, jsonList);\n }\n\n return list;\n};\n\nexport const selectToSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: {\n select?: QueryData['select'];\n selectAllColumns?: string[];\n selectAllShape?: RecordUnknown;\n join?: QueryData['join'];\n hookSelect?: HookSelect;\n shape: Column.QueryColumns;\n parsers?: ColumnsParsers;\n joinedShapes?: QueryData['joinedShapes'];\n returnType?: QueryData['returnType'];\n },\n quotedAs: string | undefined,\n hookSelect: HookSelect | undefined = query.hookSelect,\n isSubSql?: boolean,\n aliases?: string[],\n jsonList?: { [K: string]: Column.Pick.Data | undefined },\n delayedRelationSelect?: MutativeQueriesSelectRelationsSqlState,\n): string => {\n const list = selectToSqlList(\n ctx,\n table,\n query,\n quotedAs,\n hookSelect,\n isSubSql,\n aliases,\n jsonList,\n delayedRelationSelect,\n );\n\n return list.join(', ');\n};\n\nconst internalSelectAllSql = (\n ctx: ToSQLCtx,\n query: {\n updateFrom?: unknown;\n updateMany?: unknown;\n join?: QueryData['join'];\n selectAllColumns?: string[];\n selectAllShape?: RecordUnknown;\n shape: Column.QueryColumns;\n },\n quotedAs?: string,\n jsonList?: { [K: string]: Column.Pick.Data | undefined },\n): string[] => {\n if (jsonList) {\n Object.assign(jsonList, query.selectAllShape);\n }\n\n let columnsCount: number | undefined;\n if (query.shape !== anyShape) {\n let columnsCount = 0;\n for (const key in query.shape) {\n if (!(query.shape[key] as Column).data.explicitSelect) {\n columnsCount++;\n }\n }\n ctx.selectedCount += columnsCount;\n }\n\n return selectAllSql(query, quotedAs, columnsCount);\n};\n\nexport const selectAllSql = (\n q: {\n updateFrom?: unknown;\n updateMany?: unknown;\n join?: QueryData['join'];\n selectAllColumns?: string[];\n selectAllShape?: RecordUnknown;\n shape: Column.QueryColumns;\n },\n quotedAs?: string,\n columnsCount?: number,\n): string[] => {\n return q.join?.length || q.updateFrom || q.updateMany\n ? q.selectAllColumns?.map((item) => `${quotedAs}.${item}`) ||\n (isEmptySelect(q.shape, columnsCount) ? [] : [`${quotedAs}.*`])\n : q.selectAllColumns\n ? [...q.selectAllColumns]\n : isEmptySelect(q.shape, columnsCount)\n ? []\n : ['*'];\n};\n\nconst isEmptySelect = (shape: Column.QueryColumns, columnsCount?: number) =>\n columnsCount === undefined\n ? shape === anyShape\n ? false\n : isObjectEmpty(shape)\n : !columnsCount;\n\nconst pushSubQuerySql = (\n ctx: ToSQLCtx,\n mainQuery: {\n joinedShapes?: QueryData['joinedShapes'];\n },\n query: SubQueryForSql,\n as: string,\n list: string[],\n quotedAs?: string,\n aliases?: string[],\n) => {\n const { returnType = 'all' } = query.q;\n\n if (isQueryNone(query)) {\n let sql: string;\n switch (returnType) {\n case 'one':\n case 'oneOrThrow':\n case 'void':\n return;\n case 'value':\n case 'valueOrThrow':\n if (\n query.q.returning ||\n query.q.expr?.result.value instanceof IntegerBaseColumn\n ) {\n sql = '0';\n } else {\n return;\n }\n break;\n case 'all':\n case 'pluck':\n case 'rows':\n sql = `'[]'::json`;\n break;\n default:\n throw new UnhandledTypeError(query, returnType);\n }\n list.push(`${sql} \"${as}\"`);\n aliases?.push(as);\n return;\n }\n\n if (query.q.joinedForSelect) {\n let sql;\n switch (returnType) {\n case 'one':\n case 'oneOrThrow': {\n const table = query.q.joinedForSelect;\n const shape = mainQuery.joinedShapes?.[\n as\n ] as unknown as Column.Shape.Data;\n sql = makeRowToJson(table, shape, false);\n break;\n }\n case 'all':\n case 'value':\n case 'pluck':\n case 'rows':\n sql = `\"${query.q.joinedForSelect}\".\"${as}\"`;\n break;\n case 'valueOrThrow':\n if (query.q.returning) return;\n sql = `\"${query.q.joinedForSelect}\".\"${as}\"`;\n break;\n case 'void':\n return;\n default:\n throw new UnhandledTypeError(query, returnType);\n }\n\n if (sql) {\n list.push(`${coalesce(ctx, query, sql, quotedAs)} \"${as}\"`);\n aliases?.push(as);\n }\n return;\n }\n\n switch (returnType) {\n case 'all':\n case 'one':\n case 'oneOrThrow':\n query = queryJson(query) as unknown as typeof query;\n break;\n case 'pluck': {\n const { select } = query.q;\n const first = select?.[0];\n if (!first && query.q.runtimeComputeds?.[as]) {\n query = queryJson(query) as unknown as typeof query;\n } else if (!first) {\n throw new OrchidOrmInternalError(\n query,\n `Nothing was selected for pluck`,\n );\n } else {\n const cloned = query.clone();\n cloned.q.select = [{ selectAs: { c: first } }] as SelectItem[];\n query = queryWrap(\n cloned,\n cloned.baseQuery.clone(),\n ) as unknown as SubQueryForSql;\n _queryGetOptional(\n query as never,\n new RawSql(`COALESCE(json_agg(\"c\"), '[]')`),\n );\n }\n break;\n }\n case 'value':\n case 'valueOrThrow':\n if (!query.q.returning && query.q.runtimeComputeds?.[as]) {\n query = queryJson(query) as unknown as typeof query;\n }\n break;\n case 'rows':\n case 'void':\n break;\n default:\n throw new UnhandledTypeError(query, returnType);\n }\n\n list.push(\n `${coalesce(\n ctx,\n query,\n `(${moveMutativeQueryToCte(ctx, query)})`,\n quotedAs,\n )} \"${as}\"`,\n );\n};\n\nconst coalesce = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n sql: string,\n quotedAs?: string,\n) => {\n const { coalesceValue } = query.q;\n if (coalesceValue !== undefined) {\n const value = isExpression(coalesceValue)\n ? coalesceValue.toSQL(ctx, quotedAs)\n : addValue(ctx.values, coalesceValue);\n return `COALESCE(${sql}, ${value})`;\n }\n\n return sql;\n};\n","import { Query } from '../../query';\nimport {\n columnToSql,\n simpleColumnToSQL,\n simpleExistingColumnToSQL,\n} from '../../sql/column-to-sql';\nimport { JoinItemArgs, processJoinItem } from '../join/join.sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport {\n PickQueryDataShapeAndJoinedShapes,\n QueryData,\n QueryScopeData,\n} from '../../query-data';\nimport { Column } from '../../../columns/column';\nimport { selectToSql } from '../select/select.sql';\nimport { OperatorToSQL } from '../../../columns/operators';\nimport { moveMutativeQueryToCte } from '../cte/cte.sql';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { _getQueryOuterAliases, getQueryAs, QueryDataAliases } from '../as/as';\nimport { ColumnsParsers } from '../../query-columns/query-column-parsers';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { addValue, MaybeArray, RecordUnknown, toArray } from '../../../utils';\nimport { WhereSearchItem } from '../../extra-features/search/search.sql';\nimport { joinSubQuery } from '../join/join';\n\nexport type WhereItem =\n | {\n [K: string]:\n | unknown\n | { [K: string]: unknown | SubQueryForSql | Expression }\n | Expression;\n\n NOT?: MaybeArray<WhereItem>;\n AND?: MaybeArray<WhereItem>;\n OR?: MaybeArray<WhereItem>[];\n IN?: MaybeArray<WhereInItem>;\n EXISTS?: MaybeArray<JoinItemArgs>;\n ON?: WhereOnItem | WhereJsonPathEqualsItem;\n SEARCH?: MaybeArray<WhereSearchItem>;\n }\n | Query\n | Expression;\n\nexport interface WhereInItem {\n columns: string[];\n values: unknown[][] | SubQueryForSql | Expression;\n}\n\nexport type WhereJsonPathEqualsItem = [\n leftColumn: string,\n leftPath: string,\n rightColumn: string,\n rightPath: string,\n];\n\nexport interface WhereOnItem {\n joinFrom: WhereOnJoinItem;\n from: string;\n joinTo: WhereOnJoinItem;\n to: string;\n useOuterAliases?: true;\n op?: string;\n}\n\nexport type WhereOnJoinItem = { table?: string; q: { as?: string } } | string;\n\ninterface QueryDataForWhere extends QueryDataAliases {\n and?: QueryData['and'];\n or?: QueryData['or'];\n shape: QueryData['shape'];\n joinedShapes?: QueryData['joinedShapes'];\n scopes?: { [K: string]: QueryScopeData };\n outerAliases?: QueryData['outerAliases'];\n parsers?: ColumnsParsers;\n}\n\ninterface QueryDataWithLanguage extends QueryDataForWhere {\n language?: QueryData['language'];\n}\n\nexport const pushWhereStatementSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n) => {\n const res = whereToSql(ctx, table, query, quotedAs);\n if (res) {\n ctx.sql.push('WHERE', res);\n }\n};\n\nexport const pushWhereToSql = (\n sql: string[],\n ctx: ToSQLCtx,\n table: Query,\n query: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n) => {\n const res = whereToSql(ctx, table, query, quotedAs, parens);\n if (res) {\n sql.push(res);\n }\n};\n\nexport const whereToSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n): string | undefined => {\n if (query.scopes) {\n let sql = andOrToSql(ctx, table, query, quotedAs, true);\n\n const data = Object.create(query);\n for (const key in query.scopes) {\n const scope = query.scopes[key];\n const scopeResult = scope(table.baseQuery);\n data.and = scopeResult.and;\n data.or = scopeResult.or;\n const scopeSql = andOrToSql(ctx, table, data, quotedAs, true);\n if (scopeSql) sql = sql ? sql + ' AND ' + scopeSql : scopeSql;\n }\n\n return sql;\n }\n\n return andOrToSql(ctx, table, query, quotedAs, parens);\n};\n\nconst andOrToSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n): string | undefined => {\n let sql;\n if (query.or) {\n const ors = query.and?.length ? [query.and, ...query.or] : query.or;\n sql = ors\n .map((and) => processAnds(and, ctx, table, query, quotedAs))\n .join(' OR ');\n } else if (query.and) {\n sql = processAnds(query.and, ctx, table, query, quotedAs);\n } else {\n return;\n }\n\n return parens && sql ? `(${sql})` : sql;\n};\n\nconst processAnds = (\n and: WhereItem[],\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n): string | undefined => {\n const ands: string[] = [];\n for (const data of and) {\n processWhere(ands, ctx, table, query, data, quotedAs);\n }\n if (!ands.length) return;\n\n const sql = ands.join(' AND ');\n return parens && ands.length > 1 ? `(${sql})` : sql;\n};\n\nconst processWhere = (\n ands: string[],\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataWithLanguage,\n data: WhereItem,\n quotedAs?: string,\n) => {\n if ('prototype' in data || 'baseQuery' in data) {\n const query = data as Query;\n if (query.q.expr) {\n if (query.q.subQuery === 1) {\n ands.push(selectToSql(ctx, table, query.q, quotedAs));\n } else {\n const q = joinSubQuery(table, query);\n q.q.select = [query.q.expr];\n ands.push(`(${moveMutativeQueryToCte(ctx, q)})`);\n }\n } else {\n pushWhereToSql(\n ands,\n ctx,\n query,\n query.q,\n query.table && `\"${query.table}\"`,\n true,\n );\n }\n return;\n }\n\n if (isExpression(data)) {\n ands.push(`(${data.toSQL(ctx, quotedAs)})`);\n return;\n }\n\n for (const key in data) {\n const value = (data as RecordUnknown)[key];\n if (value === undefined) continue;\n\n if (key === 'AND') {\n const arr = toArray(value as MaybeArray<WhereItem>);\n const sql = processAnds(arr, ctx, table, query, quotedAs);\n if (sql) ands.push(sql);\n } else if (key === 'OR') {\n const arr = (value as MaybeArray<WhereItem>[]).map(toArray);\n const sqls = arr.reduce<string[]>((acc, and) => {\n const sql = processAnds(and, ctx, table, query, quotedAs);\n if (sql) acc.push(sql);\n return acc;\n }, []);\n if (sqls.length) ands.push(`(${sqls.join(' OR ')})`);\n } else if (key === 'NOT') {\n const arr = toArray(value as MaybeArray<WhereItem>);\n ands.push(`NOT ${processAnds(arr, ctx, table, query, quotedAs, true)}`);\n } else if (key === 'ON') {\n if (Array.isArray(value)) {\n const item = value as WhereJsonPathEqualsItem;\n const leftColumn = columnToSql(\n ctx,\n query,\n query.shape,\n item[0],\n quotedAs,\n );\n\n const leftPath = item[1];\n const rightColumn = columnToSql(\n ctx,\n query,\n query.shape,\n item[2],\n quotedAs,\n );\n\n const rightPath = item[3];\n\n ands.push(\n `jsonb_path_query_first(${leftColumn}, ${addValue(\n ctx.values,\n leftPath,\n )}) = jsonb_path_query_first(${rightColumn}, ${addValue(\n ctx.values,\n rightPath,\n )})`,\n );\n } else {\n const item = value as WhereOnItem;\n const joinAs = `\"${getJoinItemSource(item.joinFrom)}\"`;\n\n const q: OnColumnToSQLQuery = item.useOuterAliases\n ? {\n joinedShapes: query.joinedShapes,\n aliases: _getQueryOuterAliases(query),\n shape: query.shape,\n }\n : query;\n\n ands.push(\n `${onColumnToSql(ctx, q, joinAs, item.from)} ${\n item.op || '='\n } ${onColumnToSql(ctx, q, joinAs, item.to)}`,\n );\n }\n } else if (key === 'IN') {\n toArray(value as MaybeArray<WhereInItem>).forEach((item) => {\n pushIn(ctx, query, ands, quotedAs, item);\n });\n } else if (key === 'EXISTS') {\n const joinItems = (\n Array.isArray((value as unknown[])[0]) ? value : [value]\n ) as JoinItemArgs[];\n\n const joinSet = joinItems.length > 1 ? new Set<string>() : null;\n\n for (const args of joinItems) {\n const { target, on } = processJoinItem(\n ctx,\n table,\n query,\n args,\n quotedAs,\n );\n\n const sql = `EXISTS (SELECT 1 FROM ${target}${\n on ? ` WHERE ${on}` : ''\n })`;\n if (joinSet) {\n if (joinSet.has(sql)) continue;\n joinSet.add(sql);\n }\n\n ands.push(sql);\n }\n } else if (key === 'SEARCH') {\n const search = value as WhereSearchItem;\n ands.push(`${search.vectorSQL} @@ \"${search.as}\"`);\n } else if (\n typeof value === 'object' &&\n value &&\n !(value instanceof Date) &&\n !Array.isArray(value)\n ) {\n whereExprOrQuery(ctx, ands, query, key, value, quotedAs);\n } else {\n const column = columnToSql(ctx, query, query.shape, key, quotedAs);\n ands.push(\n `${column} ${\n value === null ? 'IS NULL' : `= ${addValue(ctx.values, value)}`\n }`,\n );\n }\n }\n};\n\nconst whereExprOrQuery = (\n ctx: ToSQLCtx,\n ands: string[],\n query: QueryDataForWhere,\n key: string,\n value: object,\n quotedAs?: string,\n) => {\n if (isExpression(value)) {\n ands.push(\n `${columnToSql(ctx, query, query.shape, key, quotedAs)} = ${value.toSQL(\n ctx,\n quotedAs,\n )}`,\n );\n } else {\n let column: Column.Pick.QueryColumn | undefined = query.shape[key];\n let quotedColumn: string | undefined;\n if (column) {\n quotedColumn = simpleExistingColumnToSQL(ctx, key, column, quotedAs);\n } else if (!column) {\n const index = key.indexOf('.');\n if (index !== -1) {\n const table = key.slice(0, index);\n const quoted = `\"${table}\"`;\n const name = key.slice(index + 1);\n\n column = (\n quotedAs === quoted\n ? query.shape[name]\n : query.joinedShapes?.[table]?.[name]\n ) as typeof column;\n\n quotedColumn = simpleColumnToSQL(ctx, name, column, quoted);\n } else {\n column = query.joinedShapes?.[key]?.value;\n quotedColumn = `\"${key}\".\"${key}\"`;\n }\n\n if (!column || !quotedColumn) {\n throw new Error(`Unknown column ${key} provided to condition`);\n }\n }\n\n if (value instanceof ctx.qb.constructor) {\n const subQuerySql = moveMutativeQueryToCte(ctx, value as SubQueryForSql);\n\n ands.push(`${quotedColumn} = (${subQuerySql})`);\n } else {\n for (const op in value) {\n const operator = (column.operators as RecordUnknown)[op];\n if (!operator) {\n throw new Error(`Unknown operator ${op} provided to condition`);\n }\n\n if (value[op as keyof typeof value] === undefined) continue;\n\n ands.push(\n `${(operator as unknown as { _op: OperatorToSQL })._op(\n quotedColumn as string,\n value[op as keyof typeof value],\n ctx,\n quotedAs,\n )}`,\n );\n }\n }\n }\n};\n\ninterface OnColumnToSQLQuery {\n joinedShapes?: QueryData['joinedShapes'];\n aliases?: QueryData['aliases'];\n shape: Column.QueryColumns;\n}\n\nconst onColumnToSql = (\n ctx: ToSQLCtx,\n query: OnColumnToSQLQuery,\n joinAs: string,\n column: string,\n) => columnToSql(ctx, query, query.shape, column, joinAs);\n\nconst getJoinItemSource = (joinItem: WhereOnJoinItem) => {\n return typeof joinItem === 'string' ? joinItem : getQueryAs(joinItem);\n};\n\nconst pushIn = (\n ctx: ToSQLCtx,\n query: PickQueryDataShapeAndJoinedShapes,\n ands: string[],\n quotedAs: string | undefined,\n arg: {\n columns: string[];\n values: unknown[][] | SubQueryForSql | Expression;\n },\n) => {\n // if there are multiple columns, make `(col1, col2) IN ((1, 2), (3, 4))`,\n // otherwise, make `col IN (1, 2, 3)`\n const multiple = arg.columns.length > 1;\n\n let value: string;\n\n if (Array.isArray(arg.values)) {\n value = `${arg.values\n .map(\n multiple\n ? (arr) =>\n `(${arr.map((value) => addValue(ctx.values, value)).join(', ')})`\n : (arr) =>\n `${arr.map((value) => addValue(ctx.values, value)).join(', ')}`,\n )\n .join(', ')}`;\n\n value = `(${value})`;\n } else if (isExpression(arg.values)) {\n value = arg.values.toSQL(ctx, quotedAs);\n } else {\n value = `(${moveMutativeQueryToCte(ctx, arg.values)})`;\n }\n\n const columnsSql = arg.columns\n .map((column) => columnToSql(ctx, query, query.shape, column, quotedAs))\n .join(', ');\n\n ands.push(`${multiple ? `(${columnsSql})` : columnsSql} IN ${value}`);\n};\n","export const MAX_BINDING_PARAMS = 65536;\n","import { pushWhereStatementSql } from '../where/where.sql';\nimport { SelectAsValue, SelectItem, selectToSql } from '../select/select.sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { pushQueryValueImmutable, QueryData } from '../../query-data';\nimport { Db } from '../../db';\nimport { RawSql } from '../../expressions/raw-sql';\nimport { MAX_BINDING_PARAMS } from '../../sql/sql-constants';\nimport {\n composeCteSingleSql,\n getTopCteSize,\n moveMutativeQueryToCte,\n setTopCteSize,\n} from '../cte/cte.sql';\nimport { Column } from '../../../columns/column';\nimport {\n addTableHook,\n HookPurpose,\n} from '../../extra-features/hooks/hooks.sql';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { moveQueryToCte } from '../cte/move-mutative-query-to-cte-base.sql';\nimport { isRelationQuery } from '../../relations';\nimport { quoteTableWithSchema, SingleSqlItem, Sql } from '../../sql/sql';\nimport {\n addValue,\n emptyArray,\n pushOrNewArray,\n RecordUnknown,\n toArray,\n} from '../../../utils';\nimport { OrchidOrmInternalError } from '../../errors';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { HookSelect } from '../select/hook-select';\nimport { getPrimaryKeys } from '../../query-columns/primary-keys';\nimport { _clone } from '../clone/clone';\nimport { Query } from '../../query';\nimport {\n getShouldWrapMainQueryInCte,\n wrapMainQueryInCte,\n} from '../../sql/wrap-main-query-in-cte';\nimport {\n MutativeQueriesSelectRelationsSqlState,\n newMutativeQueriesSelectRelationsSqlState,\n handleInsertAndUpdateSelectRelationsSqlState,\n} from '../../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\n\nexport type OnConflictTarget =\n | string\n | string[]\n | Expression\n | { constraint: string };\n\nexport type OnConflictSet = RecordUnknown;\n\nexport type OnConflictMerge = string | string[] | { except: string | string[] };\n\ninterface InsertSqlState {\n ctx: ToSQLCtx;\n q: ToSQLQuery;\n query: QueryData;\n quotedAs: string;\n isSubSql?: boolean;\n relationSelectState?: MutativeQueriesSelectRelationsSqlState;\n returningPos: number;\n insertSql: string;\n selectFromSql?: string;\n}\n\ninterface InsertValuesSqlState extends InsertSqlState {\n valuesPrepend: string;\n valuesSql: string[];\n valuesAppend: string;\n}\n\nexport const makeInsertSql = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n query: QueryData,\n quotedAs: string,\n isSubSql?: boolean,\n): Sql => {\n let { columns } = query;\n const { shape, hookCreateSet } = query;\n const QueryClass = ctx.qb.constructor as unknown as Db;\n\n let { insertFrom, queryColumnsCount, values } = query;\n\n let hookSetSql: string | undefined;\n if (hookCreateSet) {\n ({ hookSetSql, columns, insertFrom, queryColumnsCount, values } =\n processHookSet(\n ctx,\n q,\n values,\n hookCreateSet,\n columns,\n QueryClass,\n quotedAs,\n ));\n }\n\n const quotedColumns = columns.map(\n (column) => `\"${shape[column]?.data.name || column}\"`,\n );\n\n let runtimeDefaults: (() => unknown)[] | undefined;\n let runtimeDefaultColumns: string[] | undefined;\n if (q.internal.runtimeDefaultColumns) {\n runtimeDefaults = [];\n runtimeDefaultColumns = [];\n for (const key of q.internal.runtimeDefaultColumns) {\n if (!columns.includes(key)) {\n const column = shape[key];\n columns.push(key);\n quotedColumns.push(`\"${column.data.name || key}\"`);\n runtimeDefaults.push(column.data.runtimeDefault as () => unknown);\n runtimeDefaultColumns.push(key);\n }\n }\n }\n\n if (quotedColumns.length === 0) {\n const key = Object.keys(q.shape)[0];\n if (key) {\n const column = q.shape[key] as unknown as Column.Pick.Data;\n quotedColumns[0] = `\"${column?.data.name || key}\"`;\n\n // for `create({})` case: `{}` is transformed into `[[]]`,\n // we replace it with `[[undefined]]`, and it generates SQL `VALUES (DEFAULT)`\n if (Array.isArray(values) && Array.isArray(values[0])) {\n values = values.map(() => [undefined]);\n }\n }\n }\n\n // `insertWith` queries are applied only once, need to ignore if `ctx.hasNonSelect` is changed below.\n const hasNonSelect = ctx.hasNonSelect;\n\n const sqlState: InsertSqlState = {\n ctx,\n q,\n query,\n quotedAs,\n isSubSql,\n returningPos: 0,\n insertSql: `INSERT INTO ${quoteTableWithSchema(q)}${\n quotedColumns.length ? '(' + quotedColumns.join(', ') + ')' : ''\n }`,\n };\n ctx.sql.push(null as never, null as never);\n\n const hasOnConflictWhere = pushOnConflictSql(\n ctx,\n query,\n quotedAs,\n columns,\n quotedColumns,\n runtimeDefaultColumns,\n );\n\n const upsert = query.type === 'upsert';\n\n if (upsert || (insertFrom && !isRelationQuery(q)) || hasOnConflictWhere) {\n pushWhereStatementSql(ctx, q, query, quotedAs);\n }\n\n sqlState.relationSelectState = newMutativeQueriesSelectRelationsSqlState(q);\n\n sqlState.returningPos = ctx.sql.length;\n\n let insertManyFromValuesAs: string | undefined;\n if (insertFrom) {\n if (values.length < 2) {\n const q = insertFrom.clone();\n\n if (values[0]?.length) {\n pushQueryValueImmutable(\n q,\n 'select',\n new RawSql(\n encodeRow(\n ctx,\n ctx.values,\n QueryClass,\n values[0],\n runtimeDefaults,\n quotedAs,\n ),\n ),\n );\n }\n\n ctx.sql[1] = moveMutativeQueryToCte(ctx, q);\n } else {\n const { as, makeSelectList } = moveQueryToCte(\n ctx,\n insertFrom,\n insertFrom.q.type,\n );\n\n const selectList = makeSelectList(true);\n\n insertManyFromValuesAs = query.insertValuesAs;\n selectList.push(\n ...columns.slice(queryColumnsCount || 0).map((key) => {\n const column = shape[key];\n return column\n ? `${insertManyFromValuesAs}.\"${column.data.name || key}\"::${\n column.dataType\n }`\n : `${insertManyFromValuesAs}.\"${key}\"`;\n }),\n );\n\n sqlState.selectFromSql = ` SELECT ${selectList.join(', ')} FROM \"${as}\",`;\n }\n }\n\n if (!insertFrom || insertManyFromValuesAs) {\n const valuesSqlState = sqlState as InsertValuesSqlState;\n valuesSqlState.valuesSql = [];\n valuesSqlState.valuesPrepend =\n (insertManyFromValuesAs ? '(' : '') + (upsert ? 'SELECT ' : 'VALUES ');\n valuesSqlState.valuesAppend = insertManyFromValuesAs\n ? `) ${insertManyFromValuesAs}(${quotedColumns\n .slice(queryColumnsCount || 0)\n .join(', ')})`\n : '';\n\n let ctxValues = ctx.values;\n const restValuesLen = ctxValues.length;\n let currentValuesLen = restValuesLen;\n let batch: SingleSqlItem[] | undefined;\n const { skipBatchCheck } = ctx;\n\n for (let i = 0; i < values.length; i++) {\n const topCteSize = getTopCteSize(ctx);\n\n ctx.skipBatchCheck = true;\n\n let encodedRow = encodeRow(\n ctx,\n ctxValues,\n QueryClass,\n values[i],\n runtimeDefaults,\n quotedAs,\n hookSetSql,\n );\n ctx.skipBatchCheck = skipBatchCheck;\n\n if (!upsert) encodedRow = '(' + encodedRow + ')';\n\n if (ctxValues.length > MAX_BINDING_PARAMS) {\n if (ctxValues.length - currentValuesLen > MAX_BINDING_PARAMS) {\n throw new Error(\n `Too many parameters for a single insert row, max is ${MAX_BINDING_PARAMS}`,\n );\n }\n\n if (!skipBatchCheck) {\n setTopCteSize(ctx, topCteSize);\n\n // save current batch\n applySqlState(sqlState);\n\n ctxValues.length = currentValuesLen;\n\n batch = pushOrNewArray(batch, composeCteSingleSql(ctx));\n\n // reset sql and values for the next batch, repeat the last cycle\n ctx.topCtx.topCTE = undefined;\n ctxValues = ctx.values = [];\n valuesSqlState.valuesSql.length = 0;\n i--;\n continue;\n }\n }\n\n currentValuesLen = ctxValues.length;\n valuesSqlState.valuesSql.push(encodedRow);\n }\n\n if (batch) {\n if (hasNonSelect) {\n throw new OrchidOrmInternalError(\n q,\n `Cannot insert many records when having a non-select sub-query`,\n );\n }\n\n applySqlState(sqlState);\n\n batch.push(composeCteSingleSql(ctx));\n\n handleInsertAndUpdateSelectRelationsSqlState(\n ctx,\n sqlState.relationSelectState,\n );\n\n return {\n batch,\n };\n }\n }\n\n applySqlState(sqlState);\n\n handleInsertAndUpdateSelectRelationsSqlState(\n ctx,\n sqlState.relationSelectState,\n );\n\n return {\n text: ctx.sql.join(' '),\n values: ctx.values,\n };\n};\n\nconst pushOnConflictSql = (\n ctx: ToSQLCtx,\n query: QueryData,\n quotedAs: string,\n columns: string[],\n quotedColumns: string[],\n runtimeDefaultColumns?: string[],\n): boolean => {\n if (!query.onConflict) return false;\n\n const { shape } = query;\n\n ctx.sql.push('ON CONFLICT');\n\n const { target } = query.onConflict;\n if (target) {\n if (typeof target === 'string') {\n ctx.sql.push(`(\"${shape[target]?.data.name || target}\")`);\n } else if (Array.isArray(target)) {\n ctx.sql.push(\n `(${target.reduce(\n (sql, item, i) =>\n sql + (i ? ', ' : '') + `\"${shape[item]?.data.name || item}\"`,\n '',\n )})`,\n );\n } else if ('toSQL' in target) {\n ctx.sql.push(target.toSQL(ctx, quotedAs));\n } else {\n ctx.sql.push(`ON CONSTRAINT \"${target.constraint}\"`);\n }\n }\n\n // merge: undefined should also be handled by this `if`\n if ('merge' in query.onConflict) {\n let sql: string;\n\n const { merge } = query.onConflict;\n if (merge) {\n if (typeof merge === 'string') {\n const name = shape[merge]?.data.name || merge;\n sql = `DO UPDATE SET \"${name}\" = excluded.\"${name}\"`;\n } else if ('except' in merge) {\n sql = mergeColumnsSql(columns, quotedColumns, target, [\n ...toArray(merge.except),\n ...(runtimeDefaultColumns || emptyArray),\n ]);\n } else {\n sql = `DO UPDATE SET ${merge.reduce((sql, item, i) => {\n const name = shape[item]?.data.name || item;\n return sql + (i ? ', ' : '') + `\"${name}\" = excluded.\"${name}\"`;\n }, '')}`;\n }\n } else {\n sql = mergeColumnsSql(\n columns,\n quotedColumns,\n target,\n runtimeDefaultColumns,\n );\n }\n\n ctx.sql.push(sql);\n return true;\n } else if (query.onConflict.set) {\n const { set } = query.onConflict;\n const arr: string[] = [];\n for (const key in set) {\n const val = set[key];\n const value = isExpression(val)\n ? val.toSQL(ctx, quotedAs)\n : addValue(ctx.values, val);\n\n arr.push(`\"${shape[key]?.data.name || key}\" = ${value}`);\n }\n\n ctx.sql.push('DO UPDATE SET', arr.join(', '));\n return true;\n } else {\n ctx.sql.push('DO NOTHING');\n return false;\n }\n};\n\nconst applySqlState = (\n sqlState: InsertSqlState | InsertValuesSqlState,\n): void => {\n const { ctx } = sqlState;\n\n const insertSql = sqlState.selectFromSql\n ? sqlState.insertSql + sqlState.selectFromSql\n : sqlState.insertSql;\n\n const wrapInCte = getShouldWrapMainQueryInCte(\n ctx,\n sqlState.query,\n 'insert',\n sqlState.isSubSql,\n );\n\n if ('valuesSql' in sqlState) {\n ctx.sql[1] =\n sqlState.valuesPrepend +\n sqlState.valuesSql.join(', ') +\n sqlState.valuesAppend;\n }\n\n const returning = makeReturningSql(\n ctx,\n sqlState.q,\n sqlState.query,\n sqlState.quotedAs,\n sqlState.relationSelectState,\n 'Create',\n undefined,\n sqlState.isSubSql || !!ctx.topCtx.cteHooks,\n );\n\n if (returning) {\n ctx.sql[sqlState.returningPos] = 'RETURNING ' + returning;\n }\n\n ctx.sql[0] = insertSql;\n\n if (wrapInCte) {\n wrapMainQueryInCte(ctx, sqlState.query);\n }\n};\n\nconst processHookSet = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n values: unknown[][],\n hookCreateSet: RecordUnknown[],\n columns: string[],\n QueryClass: Db,\n quotedAs: string,\n): {\n hookSetSql?: string | undefined;\n columns: string[];\n insertFrom?: SubQueryForSql;\n queryColumnsCount?: number;\n values: unknown[][];\n} => {\n const hookSet: RecordUnknown = {};\n for (const item of hookCreateSet) {\n Object.assign(hookSet, item);\n }\n\n const addHookSetColumns = Object.keys(hookSet).filter(\n (key) => !columns.includes(key),\n );\n\n let insertFrom = q.q.insertFrom;\n if (insertFrom) {\n const newColumns = new Set<string>();\n const originalSelect = insertFrom.q.select;\n if (originalSelect) {\n insertFrom = _clone(insertFrom) as unknown as SubQueryForSql;\n const select: SelectItem[] = [];\n for (const s of originalSelect) {\n if (typeof s === 'string' && !hookSet[s]) {\n select.push(s);\n newColumns.add(s);\n } else if (typeof s === 'object' && 'selectAs' in s) {\n const filtered: SelectAsValue = {};\n for (const key in s.selectAs) {\n if (!hookSet[key]) {\n filtered[key] = s.selectAs[key];\n newColumns.add(key);\n }\n }\n select.push({ selectAs: filtered });\n }\n }\n insertFrom.q.select = select;\n }\n\n if (values.length) {\n const newValues: unknown[][] = [];\n\n const valuesColumnsSet = new Set<string>();\n values.forEach((originalRow, i) => {\n const valuesColumns = columns.slice(-originalRow.length);\n const row: unknown[] = [];\n newValues[i] = row;\n valuesColumns.forEach((c, i) => {\n if (!hookSet[c] && !newColumns.has(c)) {\n valuesColumnsSet.add(c);\n row.push(originalRow[i]);\n }\n });\n });\n\n for (const valueColumn of valuesColumnsSet) {\n newColumns.add(valueColumn);\n }\n\n values = newValues;\n } else {\n values = [[]];\n }\n\n columns.forEach((column) => {\n if (column in hookSet) {\n newColumns.add(column);\n\n const fromHook = {\n fromHook: encodeValue(\n ctx,\n ctx.values,\n QueryClass,\n hookSet[column],\n quotedAs,\n ),\n };\n\n for (const row of values) {\n row.push(fromHook);\n }\n }\n });\n\n const queryColumnsCount = insertFrom.q.select?.length;\n\n if (addHookSetColumns) {\n for (const key of addHookSetColumns) {\n for (const row of values) {\n row.push({\n fromHook: encodeValue(\n ctx,\n ctx.values,\n QueryClass,\n hookSet[key],\n quotedAs,\n ),\n });\n }\n }\n\n return {\n columns: [...newColumns, ...addHookSetColumns],\n insertFrom,\n queryColumnsCount,\n values,\n };\n }\n\n return { columns: [...newColumns], insertFrom, queryColumnsCount, values };\n }\n\n columns.forEach((column, i) => {\n if (column in hookSet) {\n const fromHook = {\n fromHook: encodeValue(\n ctx,\n ctx.values,\n QueryClass,\n hookSet[column],\n quotedAs,\n ),\n };\n for (const row of values) {\n row[i] = fromHook;\n }\n }\n });\n\n const hookSetSql = addHookSetColumns\n .map((key) =>\n encodeValue(\n ctx,\n ctx.values,\n QueryClass,\n (hookSet as RecordUnknown)[key],\n quotedAs,\n ),\n )\n .join(', ');\n\n return {\n hookSetSql,\n columns: addHookSetColumns ? [...columns, ...addHookSetColumns] : columns,\n values,\n };\n};\n\nconst mergeColumnsSql = (\n columns: string[],\n quotedColumns: string[],\n target: OnConflictTarget | undefined,\n except?: string[],\n): string => {\n const notExcluded: string[] = [];\n\n const exclude =\n typeof target === 'string'\n ? [target]\n : Array.isArray(target)\n ? [...target]\n : [];\n\n if (except) {\n if (typeof except === 'string') {\n exclude.push(except);\n } else {\n exclude.push(...except);\n }\n }\n\n for (let i = 0; i < columns.length; i++) {\n if (!exclude.includes(columns[i])) {\n notExcluded.push(quotedColumns[i]);\n }\n }\n\n return notExcluded.length\n ? `DO UPDATE SET ${notExcluded\n .map((column) => `${column} = excluded.${column}`)\n .join(', ')}`\n : // update whatever is the first column because DO NOTHING prevents RETURNING,\n // and we might want to return data from the insert\n `DO UPDATE SET ${quotedColumns[0]} = excluded.${quotedColumns[0]}`;\n};\n\nconst encodeRow = (\n ctx: ToSQLCtx,\n values: unknown[],\n QueryClass: Db,\n row: unknown[],\n runtimeDefaults?: (() => unknown)[],\n quotedAs?: string,\n hookSetSql?: string,\n) => {\n const arr = row.map((value) =>\n encodeValue(ctx, values, QueryClass, value, quotedAs),\n );\n\n if (runtimeDefaults) {\n for (const fn of runtimeDefaults) {\n arr.push(addValue(values, fn()));\n }\n }\n\n if (hookSetSql) arr.push(hookSetSql);\n\n return arr.join(', ');\n};\n\nconst encodeValue = (\n ctx: ToSQLCtx,\n values: unknown[],\n QueryClass: Db,\n value: unknown,\n quotedAs?: string,\n) => {\n if (value && typeof value === 'object') {\n if (value instanceof Expression) {\n return value.toSQL(ctx, quotedAs);\n } else if (value instanceof (QueryClass as never)) {\n return `(${moveMutativeQueryToCte(ctx, value as SubQueryForSql)})`;\n } else if ('fromHook' in value) {\n return value.fromHook as string;\n }\n }\n\n return value === undefined ? 'DEFAULT' : addValue(values, value);\n};\n\nexport const makeReturningSql = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n data: QueryData,\n quotedAs: string,\n relationSelectState: MutativeQueriesSelectRelationsSqlState | undefined,\n hookPurpose?: HookPurpose,\n addHookPurpose?: HookPurpose,\n isSubSql?: boolean,\n): string | undefined => {\n const hookSelect = hookPurpose && data[`after${hookPurpose}Select`];\n\n const { select } = data;\n if (!q.q.hookSelect && !hookSelect?.size && !select?.length && !hookPurpose) {\n const select = hookSelect && new Map();\n\n addTableHook(ctx, q, q.q, select);\n\n ctx.selectedCount = 1;\n return returnSqlOrNull(ctx, q, isSubSql);\n }\n\n const otherCTEHookSelect =\n addHookPurpose && data[`after${addHookPurpose}Select`];\n\n let tempSelect: HookSelect | undefined;\n if (\n q.q.hookSelect ||\n hookSelect ||\n otherCTEHookSelect ||\n q.q.selectRelation\n ) {\n tempSelect = new Map(q.q.hookSelect);\n\n if (hookSelect) {\n for (const column of hookSelect) {\n if (!tempSelect.has(column)) {\n tempSelect.set(column, { select: column });\n }\n }\n }\n\n if (otherCTEHookSelect) {\n for (const column of otherCTEHookSelect) {\n if (!tempSelect.has(column)) {\n tempSelect.set(column, { select: column });\n }\n }\n }\n\n // delete loads relations in a CTE\n if (q.q.selectRelation && hookPurpose !== 'Delete') {\n for (const column of getPrimaryKeys(q as Query)) {\n if (!tempSelect.has(column)) {\n tempSelect.set(column, { select: column });\n }\n }\n }\n }\n\n let sql: string | undefined;\n if (tempSelect?.size || select?.length) {\n sql = selectToSql(\n ctx,\n q,\n data,\n quotedAs,\n tempSelect,\n isSubSql,\n undefined,\n undefined,\n relationSelectState,\n );\n }\n\n addTableHook(ctx, q, data, tempSelect, hookPurpose);\n\n if (!sql) ctx.selectedCount = 1;\n\n return returnSqlOrNull(ctx, q, isSubSql, sql);\n};\n\nconst returnSqlOrNull = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n isSubSql?: boolean,\n sql?: string,\n): string | undefined => {\n return (\n sql ||\n (isSubSql || ctx.topCtx.cteHooks || q.q.appendQueries ? 'NULL' : undefined)\n );\n};\n","import { QueryData } from '../../query-data';\nimport { queryTypeWithLimitOne } from '../../index';\nimport { addValue } from '../../../utils';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { ToSQLCtx } from '../../sql/to-sql';\n\nexport function pushLimitOffsetSql(\n ctx: ToSQLCtx,\n query: QueryData,\n fromQuery?: SubQueryForSql,\n) {\n if (query.useFromLimitOffset) {\n const q = fromQuery?.q as QueryData;\n if (q.limit) {\n ctx.sql.push(`LIMIT ${addValue(ctx.values, q.limit)}`);\n }\n if (q.offset) {\n ctx.sql.push(`OFFSET ${addValue(ctx.values, q.offset)}`);\n }\n } else {\n pushLimitSQL(ctx.sql, ctx.values, query);\n\n if (query.offset && !query.returnsOne) {\n ctx.sql.push(`OFFSET ${addValue(ctx.values, query.offset)}`);\n }\n }\n}\n\nexport function pushLimitSQL(sql: string[], values: unknown[], q: QueryData) {\n if (!q.returnsOne) {\n if (queryTypeWithLimitOne[q.returnType as string] && !q.returning) {\n sql.push(`LIMIT 1`);\n } else if (q.limit) {\n sql.push(`LIMIT ${addValue(values, q.limit)}`);\n }\n }\n}\n","import { makeReturningSql } from './insert.sql';\nimport { pushWhereStatementSql, whereToSql } from '../where/where.sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport {\n QueryData,\n UpdateManyQueryData,\n UpdateQueryDataItem,\n UpdateQueryDataObject,\n} from '../../query-data';\nimport { Db } from '../../db';\nimport { selectToSql } from '../select/select.sql';\nimport { countSelect } from '../../expressions/raw-sql';\nimport { Query } from '../../query';\nimport { JoinItemArgs, processJoinItem } from '../join/join.sql';\nimport { moveMutativeQueryToCte, setFreeTopCteAs } from '../cte/cte.sql';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { pushLimitSQL } from '../limit-offset/limit-offset.sql';\nimport { makeSql, quoteTableWithSchema, Sql } from '../../sql/sql';\nimport {\n addValue,\n emptyObject,\n pushOrNewArray,\n RecordUnknown,\n} from '../../../utils';\nimport { isExpression } from '../../expressions/expression';\nimport { throwOnReadOnlyUpdate } from '../../query.utils';\nimport { OrchidOrmInternalError } from '../../errors';\nimport { ensureCTECount } from '../../extra-features/hooks/hooks.sql';\nimport {\n MutativeQueriesSelectRelationsSqlState,\n newMutativeQueriesSelectRelationsSqlState,\n handleInsertAndUpdateSelectRelationsSqlState,\n} from '../../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\n\nexport const pushUpdateSql = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n isSubSql?: boolean,\n): Sql => {\n const quotedTable = `\"${query.table || (q.from as string)}\"`;\n const from = quoteTableWithSchema(query);\n\n const set: string[] = [];\n\n const hookSet = q.hookUpdateSet\n ? Object.fromEntries(\n q.hookUpdateSet.flatMap((item) => Object.entries(item)),\n )\n : emptyObject;\n\n const relationSelectState = newMutativeQueriesSelectRelationsSqlState(query);\n\n // User can use `set({ key: 'value' })` multiple times,\n // `usedSetKeys` is here to track what keys were already added to SQL to not add them twice.\n const usedSetKeys = new Set<string>();\n\n // Applies `hookSet`: key-values that should be set by the update hooks.\n // Adds SQL key-value pairs into `set` array.\n // Must be applied before other `set` data: the earlier one takes precedence.\n if (q.hookUpdateSet) {\n applySet(ctx, query, set, hookSet, emptyObject, usedSetKeys, quotedAs);\n }\n\n // updateData is array of update sets that's coming from `set`, `updateMany`, also `timestamps` logic are adding to it,\n // `processData` processes it into `set` array of SQL strings for key-value pairs.\n if (q.updateData) {\n processData(ctx, query, set, q.updateData, hookSet, usedSetKeys, quotedAs);\n }\n\n let updateManyValuesSql;\n if (q.updateMany) {\n for (const key of q.updateMany.primaryKeys) {\n usedSetKeys.add(key);\n }\n\n updateManyValuesSql = makeUpdateManyValuesSql(\n ctx,\n query,\n q,\n q.updateMany,\n set,\n usedSetKeys,\n quotedAs,\n );\n }\n\n // If nothing to set, make a SELECT query\n if (!set.length) {\n pushSelectForEmptySet(\n ctx,\n query,\n q,\n quotedAs,\n from,\n isSubSql,\n updateManyValuesSql,\n relationSelectState,\n );\n } else {\n ctx.sql.push(`UPDATE ${from}`);\n\n if (quotedTable !== quotedAs) {\n ctx.sql.push(quotedAs);\n }\n\n ctx.sql.push('SET', set.join(', '));\n\n let fromWhereSql;\n\n if (updateManyValuesSql) {\n if (q.updateMany?.strict) {\n addUpdateManyCteForStrict(ctx, q.updateMany);\n }\n\n ctx.sql.push('FROM', updateManyValuesSql);\n } else if (q.updateFrom) {\n fromWhereSql = pushUpdateFromSql(ctx, query, q, quotedAs, q.updateFrom);\n }\n\n pushUpdateWhereSql(ctx, query, q, quotedAs, fromWhereSql);\n\n pushUpdateReturning(\n ctx,\n query,\n q,\n quotedAs,\n 'RETURNING',\n relationSelectState,\n isSubSql,\n );\n }\n\n handleInsertAndUpdateSelectRelationsSqlState(ctx, relationSelectState);\n\n return makeSql(ctx, 'update', isSubSql);\n};\n\nconst pushSelectForEmptySet = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n from: string,\n isSubSql?: boolean,\n updateManyValuesSql?: string,\n relationSelectState?: MutativeQueriesSelectRelationsSqlState,\n) => {\n if (!q.select) {\n q.select = countSelect;\n }\n\n pushUpdateReturning(\n ctx,\n query,\n q,\n quotedAs,\n 'SELECT',\n relationSelectState,\n isSubSql,\n );\n\n let fromSql = `FROM ${from}`;\n\n if (updateManyValuesSql) {\n fromSql += `, ${updateManyValuesSql}`;\n }\n\n ctx.sql.push(fromSql);\n pushWhereStatementSql(ctx, query, q, quotedAs);\n pushLimitSQL(ctx.sql, ctx.values, q);\n};\n\n// For strict variants, set up CTE infrastructure\nconst addUpdateManyCteForStrict = (\n ctx: ToSQLCtx,\n updateMany: UpdateManyQueryData,\n) => {\n const wrapAs = setFreeTopCteAs(ctx);\n ctx.wrapAs = wrapAs;\n ensureCTECount(ctx, wrapAs, { count: updateMany.data.length });\n};\n\nconst pushUpdateFromSql = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n updateFrom: JoinItemArgs,\n): string | undefined => {\n const { target, on } = processJoinItem(ctx, query, q, updateFrom, quotedAs);\n\n ctx.sql.push(`FROM ${target}`);\n\n let fromWhereSql = on;\n\n if (q.join) {\n const joinSet = q.join.length > 1 ? new Set<string>() : null;\n\n for (const item of q.join) {\n const { target, on } = processJoinItem(\n ctx,\n query,\n q,\n item.args,\n quotedAs,\n );\n\n if (joinSet) {\n const key = `${item.type}${target}${on}`;\n if (joinSet.has(key)) continue;\n joinSet.add(key);\n }\n\n ctx.sql.push(`${item.type} ${target} ON true`);\n\n if (on) {\n fromWhereSql = fromWhereSql ? fromWhereSql + ' AND ' + on : on;\n }\n }\n }\n\n return fromWhereSql;\n};\n\nconst pushUpdateWhereSql = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n fromWhereSql?: string,\n): void => {\n const mainWhereSql = whereToSql(ctx, query, q, quotedAs);\n const whereSql = mainWhereSql\n ? fromWhereSql\n ? mainWhereSql + ' AND ' + fromWhereSql\n : mainWhereSql\n : fromWhereSql;\n if (whereSql) {\n ctx.sql.push('WHERE', whereSql);\n }\n};\n\nconst pushUpdateReturning = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n keyword: string,\n relationSelectState: MutativeQueriesSelectRelationsSqlState | undefined,\n isSubSql?: boolean,\n) => {\n const returning = makeReturningSql(\n ctx,\n query,\n q,\n quotedAs,\n relationSelectState,\n 'Update',\n undefined,\n isSubSql,\n );\n\n if (returning) ctx.sql.push(keyword, returning);\n};\n\nconst processData = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n set: string[],\n data: UpdateQueryDataItem[],\n hookSet: RecordUnknown,\n usedSetKeys: Set<string>,\n quotedAs?: string,\n) => {\n let append: UpdateQueryDataItem[] | undefined;\n\n for (let i = data.length - 1; i >= 0; i--) {\n const item = data[i];\n if (typeof item === 'function') {\n const result = item(data);\n if (result) append = pushOrNewArray(append, result);\n } else {\n applySet(ctx, query, set, item, hookSet, usedSetKeys, quotedAs);\n }\n }\n\n if (append) {\n processData(ctx, query, set, append, hookSet, usedSetKeys, quotedAs);\n }\n};\n\nconst applySet = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n set: string[],\n item: UpdateQueryDataObject,\n skipColumns: RecordUnknown,\n usedSetKeys: Set<string>,\n quotedAs?: string,\n) => {\n const QueryClass = ctx.qb.constructor as unknown as Db;\n const shape = query.q.shape;\n\n for (const key in item) {\n if (usedSetKeys.has(key)) {\n continue;\n }\n\n usedSetKeys.add(key);\n\n const value = item[key];\n if (value === undefined || key in skipColumns) continue;\n\n set.push(\n `\"${shape[key].data.name || key}\" = ${processValue(\n ctx,\n query,\n QueryClass,\n key,\n value,\n quotedAs,\n )}`,\n );\n }\n};\n\nconst processValue = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n QueryClass: Db,\n key: string,\n value: UpdateQueryDataObject[string],\n quotedAs?: string,\n) => {\n if (value && typeof value === 'object') {\n if (isExpression(value)) {\n return value.toSQL(ctx, quotedAs);\n } else if (value instanceof (QueryClass as never)) {\n const subQuery = value as Query;\n if (subQuery.q.subQuery === 1) {\n return selectToSql(ctx, query, subQuery.q, quotedAs);\n }\n\n return `(${moveMutativeQueryToCte(\n ctx,\n subQuery as unknown as SubQueryForSql,\n )})`;\n } else if ('op' in value && 'arg' in value) {\n return `\"${query.q.shape[key].data.name || key}\" ${\n (value as { op: string }).op\n } ${addValue(ctx.values, (value as { arg: unknown }).arg)}`;\n }\n }\n\n return addValue(ctx.values, value);\n};\n\n// Build FROM (VALUES ...) \"v\"(\"col1\", \"col2\")\nconst makeUpdateManyValuesSql = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n updateMany: UpdateManyQueryData,\n set: string[],\n usedSetKeys: Set<string>,\n quotedAs: string,\n) => {\n const { shape } = q;\n\n const keysSet = new Set<string>();\n const valueRows: string[] = [];\n const quotedColumnNames: string[] = [];\n const { data } = updateMany;\n\n for (let i = 0; i < data.length; i++) {\n const row = data[i];\n const cells: string[] = [];\n let keysInRow = 0;\n\n for (const key in row) {\n let value = row[key];\n if (value === undefined) {\n continue;\n }\n\n const column = shape[key];\n const columnName = column.data.name || key;\n\n if (column.data.virtual) continue;\n throwOnReadOnlyUpdate(query, column, key);\n\n keysInRow++;\n\n if (isExpression(value)) {\n cells.push(value.toSQL(ctx, quotedAs));\n } else {\n if (column.data.encode && value !== null) {\n value = column.data.encode(value);\n }\n\n cells.push(addValue(ctx.values, value));\n }\n\n // Cast the first VALUES row so Postgres can infer column types,\n // and collect the alias column names once.\n if (i === 0) {\n keysSet.add(key);\n cells[cells.length - 1] += `::${column.dataType}`;\n quotedColumnNames.push(`\"${columnName}\"`);\n\n if (!usedSetKeys.has(key)) {\n set.push(`\"${shape[key].data.name || key}\" = \"v\".\"${columnName}\"`);\n }\n } else if (!keysSet.has(key)) {\n throwOnDifferentColumns(query, keysSet, row, i);\n }\n }\n\n if (keysInRow < keysSet.size) {\n throwOnDifferentColumns(query, keysSet, row, i);\n }\n\n valueRows.push(`(${cells.join(', ')})`);\n }\n\n return `(VALUES ${valueRows.join(', ')}) \"v\"(${quotedColumnNames.join(\n ', ',\n )})`;\n};\n\nconst throwOnDifferentColumns = (\n query: ToSQLQuery,\n keysSet: Set<string>,\n row: RecordUnknown,\n i: number,\n) => {\n throw new OrchidOrmInternalError(\n query,\n `Row ${i} has different columns than row 0. Expected: [${[...keysSet].join(\n ', ',\n )}], got: [${Object.keys(row).join(', ')}]`,\n );\n};\n","import { pushWhereStatementSql } from '../where/where.sql';\nimport { makeReturningSql } from './insert.sql';\nimport { processJoinItem } from '../join/join.sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { QueryData } from '../../query-data';\nimport { Query } from '../../query';\nimport { isRelationQuery } from '../../relations';\nimport { OrchidOrmInternalError } from '../../errors';\nimport { makeSql, quoteTableWithSchema, Sql } from '../../sql/sql';\nimport {\n handleDeleteSelectRelationsSqlState,\n newMutativeQueriesSelectRelationsSqlState,\n} from '../../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\nimport { anyShape } from '../../../columns';\n\nexport const pushDeleteSql = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n isSubSql?: boolean,\n): Sql => {\n const from = quoteTableWithSchema(query);\n ctx.sql.push(`DELETE FROM ${from}`);\n\n if (q.as && query.table !== q.as) {\n ctx.sql.push(quotedAs);\n }\n\n const relationSelectState = newMutativeQueriesSelectRelationsSqlState(query);\n\n let returning = makeReturningSql(\n ctx,\n query,\n q,\n quotedAs,\n relationSelectState,\n 'Delete',\n undefined,\n isSubSql,\n );\n\n const selectRelations = handleDeleteSelectRelationsSqlState(\n ctx,\n query,\n relationSelectState,\n returning,\n );\n\n let join = q.join;\n if (selectRelations) {\n returning =\n (returning ? returning + ', ' : '') + selectRelations.addReturning;\n\n join = join ? [...join, selectRelations.join] : [selectRelations.join];\n\n q = {\n ...q,\n joinedShapes: {\n ...q.joinedShapes,\n [selectRelations.joinedShape]: anyShape,\n },\n };\n }\n\n let conditions: string | undefined;\n if (join?.length) {\n const targets: string[] = [];\n const ons: string[] = [];\n\n const joinSet = join.length > 1 ? new Set<string>() : null;\n\n for (const item of join) {\n const lateral = 'l' in item.args && item.args.l;\n if (lateral) {\n if (isRelationQuery(lateral)) {\n continue;\n }\n\n throw new OrchidOrmInternalError(\n query as Query,\n 'Join lateral is not supported in delete',\n );\n }\n\n const join = processJoinItem(ctx, query, q, item.args, quotedAs);\n\n const key = `${join.target}${join.on}`;\n if (joinSet) {\n if (joinSet.has(key)) continue;\n joinSet.add(key);\n }\n targets.push(join.target);\n if (join.on) ons.push(join.on);\n }\n\n if (targets.length) {\n ctx.sql.push(`USING ${targets.join(', ')}`);\n }\n\n conditions = ons.join(' AND ');\n }\n\n if (!selectRelations?.movedWhereToCte) {\n pushWhereStatementSql(ctx, query, q, quotedAs);\n }\n\n if (conditions) {\n if (\n !selectRelations?.movedWhereToCte &&\n (q.and?.length || q.or?.length || q.scopes)\n ) {\n ctx.sql.push('AND', conditions);\n } else {\n ctx.sql.push('WHERE', conditions);\n }\n }\n\n if (returning) {\n ctx.sql.push('RETURNING', returning);\n }\n\n return makeSql(ctx, 'delete', isSubSql);\n};\n","import { rawOrColumnToSql } from '../../sql/column-to-sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { QueryData } from '../../query-data';\n\nexport const pushDistinctSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n distinct: Exclude<QueryData['distinct'], undefined>,\n quotedAs?: string,\n) => {\n ctx.sql.push('DISTINCT');\n\n if (distinct.length) {\n const columns = distinct?.map((item) =>\n rawOrColumnToSql(ctx, table.q, item, quotedAs),\n );\n ctx.sql.push(`ON (${columns?.join(', ') || ''})`);\n }\n};\n","import { columnToSql } from '../../sql/column-to-sql';\nimport { SortDir } from '../../basic-features/order/order.sql';\nimport { addValue, MaybeArray } from '../../../utils';\nimport { Expression } from '../../expressions/expression';\nimport { ToSQLCtx } from '../../sql/to-sql';\nimport { QueryData } from '../../query-data';\nimport { isRawSQL } from '../../expressions/raw-sql';\n\nexport type OrderTsQueryConfig = true | OrderTsQueryConfigObject;\n\ninterface OrderTsQueryConfigObject {\n coverDensity?: boolean;\n weights?: number[];\n normalization?: number;\n dir?: SortDir;\n}\n\nexport type SearchWeight = 'A' | 'B' | 'C' | 'D';\n\nexport interface SearchWeightRecord {\n [K: string]: SearchWeight;\n}\n\nexport interface WhereSearchItem {\n as: string;\n vectorSQL: string;\n}\n\nexport type QuerySourceItem = {\n queryAs: string;\n as?: string;\n textSQL?: MaybeArray<string>;\n langSQL?: string;\n vectorSQL?: string;\n order?: OrderTsQueryConfig;\n} & (\n | {\n language?: string;\n }\n | {\n languageColumn: string;\n }\n) &\n (\n | {\n text: string | Expression;\n }\n | {\n in: MaybeArray<string> | SearchWeightRecord;\n }\n | {\n vector: string;\n }\n ) &\n (\n | {\n query: string | Expression;\n }\n | {\n plainQuery: string | Expression;\n }\n | {\n phraseQuery: string | Expression;\n }\n | {\n tsQuery: string | Expression;\n }\n );\n\nexport interface QueryDataSources {\n [K: string]: QuerySourceItem;\n}\n\nexport const searchSourcesToSql = (\n ctx: ToSQLCtx,\n data: QueryData,\n sources: QueryDataSources,\n sql: string,\n quotedAs?: string,\n): string => {\n for (const as in sources) {\n const source = sources[as];\n\n const lang = getSearchLang(ctx, data, source, quotedAs);\n source.vectorSQL = getTsVector(ctx, data, lang, source, quotedAs);\n\n let fn;\n let query;\n if ('query' in source) {\n fn = 'websearch_to_tsquery';\n query = source.query;\n } else if ('plainQuery' in source) {\n fn = 'plainto_tsquery';\n query = source.plainQuery;\n } else if ('phraseQuery' in source) {\n fn = 'phraseto_tsquery';\n query = source.phraseQuery;\n } else {\n fn = 'to_tsquery';\n query = source.tsQuery;\n }\n\n let querySql;\n if (typeof query === 'string') {\n ctx.values.push(query);\n querySql = `$${ctx.values.length}`;\n } else {\n querySql = `${query.toSQL(ctx, quotedAs)}`;\n }\n\n sql += `, ${fn}(${lang}, ${querySql}) \"${as}\"`;\n }\n return sql;\n};\n\nexport const getSearchLang = (\n ctx: ToSQLCtx,\n data: QueryData,\n source: QuerySourceItem,\n quotedAs?: string,\n): string => {\n return (source.langSQL ??=\n 'languageColumn' in source\n ? columnToSql(ctx, data, data.shape, source.languageColumn, quotedAs)\n : isRawSQL(source.language)\n ? source.language.toSQL(ctx)\n : addValue(ctx.values, source.language || data.language || 'english'));\n};\n\nexport const getSearchText = (\n ctx: ToSQLCtx,\n data: QueryData,\n source: QuerySourceItem,\n quotedAs?: string,\n forHeadline?: boolean,\n): MaybeArray<string> => {\n let sql = source.textSQL;\n if (sql) return sql;\n\n if ('in' in source) {\n if (typeof source.in === 'string') {\n sql = columnToSql(ctx, data, data.shape, source.in, quotedAs);\n } else if (Array.isArray(source.in)) {\n sql = `concat_ws(' ', ${source.in\n .map((column) => columnToSql(ctx, data, data.shape, column, quotedAs))\n .join(', ')})`;\n } else {\n sql = [];\n for (const key in source.in) {\n sql.push(columnToSql(ctx, data, data.shape, key, quotedAs));\n }\n }\n } else if ('vector' in source) {\n if (forHeadline) {\n throw new Error(\n 'Cannot use a search based on a vector column for a search headline',\n );\n }\n\n sql = columnToSql(ctx, data, data.shape, source.vector, quotedAs);\n } else {\n if (typeof source.text === 'string') {\n sql = addValue(ctx.values, source.text);\n } else {\n sql = source.text.toSQL(ctx, quotedAs);\n }\n }\n\n return (source.textSQL = sql);\n};\n\nconst getTsVector = (\n ctx: ToSQLCtx,\n data: QueryData,\n lang: string,\n source: QuerySourceItem,\n quotedAs?: string,\n): string => {\n const text = getSearchText(ctx, data, source, quotedAs);\n\n if ('in' in source) {\n if (typeof source.in === 'string' || Array.isArray(source.in)) {\n return `to_tsvector(${lang}, ${text})`;\n } else {\n let tsVector = '';\n let i = 0;\n for (const key in source.in) {\n tsVector =\n (tsVector ? `${tsVector} || ` : '') +\n `setweight(to_tsvector(${lang}, ${text[i++]}), ${addValue(\n ctx.values,\n source.in[key],\n )})`;\n }\n return tsVector;\n }\n } else if ('vector' in source) {\n return text as string;\n } else {\n return `to_tsvector(${lang}, ${text})`;\n }\n};\n","import { QueryData } from '../query-data';\nimport { PickQueryQ } from '../pick-query-types';\n\n// used in `from` logic to decide if convert query to sql or just write table name\nexport const checkIfASimpleQuery = (q: PickQueryQ) => {\n if (\n (q.q.returnType && q.q.returnType !== 'all') ||\n q.q.selectAllColumns ||\n q.q.and?.length ||\n q.q.or?.length ||\n q.q.scopes\n )\n return false;\n\n const keys = Object.keys(q.q) as (keyof QueryData)[];\n return !keys.some((key) => queryKeysOfNotSimpleQuery.includes(key));\n};\n\nconst queryKeysOfNotSimpleQuery: (keyof QueryData)[] = [\n 'with',\n 'as',\n 'from',\n 'select',\n 'distinct',\n 'only',\n 'join',\n 'group',\n 'having',\n 'window',\n 'union',\n 'order',\n 'limit',\n 'offset',\n 'for',\n];\n","import { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { QueryData, QueryDataFromItem } from '../../query-data';\nimport { moveMutativeQueryToCte } from '../cte/cte.sql';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { isExpression } from '../../expressions/expression';\nimport { getQueryAs } from '../as/as';\nimport { searchSourcesToSql } from '../../extra-features/search/search.sql';\nimport { quoteFromWithSchema, quoteTableWithSchema } from '../../sql/sql';\nimport { checkIfASimpleQuery } from '../../sql/check-if-a-simple-query';\nimport { getQuerySchema } from '../storage/storage';\n\nlet fromQuery: SubQueryForSql | undefined;\n\nexport const pushFromAndAs = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n data: QueryData,\n quotedAs?: string,\n): SubQueryForSql | undefined => {\n let sql = 'FROM ';\n\n const from = getFrom(ctx, query, data, quotedAs);\n sql += from;\n\n if (data.sources) {\n sql = searchSourcesToSql(ctx, data, data.sources, sql, quotedAs);\n }\n\n ctx.sql.push(sql);\n\n if (fromQuery) {\n const fq = fromQuery;\n fromQuery = undefined;\n return fq;\n }\n return;\n};\n\nconst getFrom = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n data: QueryData,\n quotedAs?: string,\n) => {\n fromQuery = undefined;\n\n if (data.from) {\n const { from } = data;\n if (Array.isArray(from)) {\n return from\n .map((item) => fromToSql(ctx, query, data, item, quotedAs))\n .join(', ');\n }\n\n return fromToSql(ctx, query, data, from, quotedAs);\n }\n\n let sql = quoteTableWithSchema(query);\n\n if (data.as && query.table !== data.as) {\n sql += ` ${quotedAs}`;\n }\n\n if (data.only) sql = `ONLY ${sql}`;\n\n return sql;\n};\n\nconst fromToSql = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n data: QueryData,\n from: QueryDataFromItem,\n quotedAs?: string,\n) => {\n let only: boolean | undefined;\n let sql;\n if (typeof from === 'object') {\n if (isExpression(from)) {\n sql = from.toSQL(ctx, quotedAs) + ' ' + quotedAs;\n } else {\n only = from.q.only;\n\n if (!from.table) {\n sql = `(${moveMutativeQueryToCte(ctx, from)})`;\n }\n // if the query contains more than just schema return (SELECT ...)\n else if (!checkIfASimpleQuery(from)) {\n sql = `(${moveMutativeQueryToCte(ctx, from)}) ${\n quotedAs || `\"${getQueryAs(from)}\"`\n }`;\n } else {\n sql = quoteTableWithSchema(from);\n }\n\n fromQuery = from;\n }\n } else {\n sql = quoteFromWithSchema(getQuerySchema(query), from);\n }\n\n return (only === undefined ? data.only : only) ? `ONLY ${sql}` : sql;\n};\n","import { ToSQLCtx } from '../../sql/to-sql';\nimport { templateLiteralToSQL } from '../../expressions/raw-sql';\nimport { QueryData } from '../../query-data';\nimport { Expression, TemplateLiteralArgs } from '../../expressions/expression';\n\nexport type HavingItem = TemplateLiteralArgs | Expression[];\n\nexport const pushHavingSql = (\n ctx: ToSQLCtx,\n query: QueryData,\n quotedAs?: string,\n) => {\n const conditions = havingToSql(ctx, query, quotedAs);\n if (conditions?.length) ctx.sql.push('HAVING', conditions);\n};\n\nexport const havingToSql = (\n ctx: ToSQLCtx,\n query: QueryData,\n quotedAs?: string,\n): string | undefined => {\n return query.having\n ?.map((it) =>\n 'raw' in it[0]\n ? templateLiteralToSQL(it as TemplateLiteralArgs, ctx, quotedAs)\n : it\n .map((item) => (item as Expression).toSQL(ctx, quotedAs))\n .join(' AND '),\n )\n .join(' AND ');\n};\n","import { maybeSelectedColumnToSql } from '../../sql/column-to-sql';\nimport { ToSQLCtx } from '../../sql/to-sql';\nimport { QueryData } from '../../query-data';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { addValue, emptyObject } from '../../../utils';\nimport { OrderTsQueryConfig } from '../../extra-features/search/search.sql';\n\nexport type SortDir = 'ASC' | 'DESC' | 'ASC NULLS FIRST' | 'DESC NULLS LAST';\n\nexport type OrderItem = string | { [K: string]: SortDir } | Expression;\n\nexport const pushOrderBySql = (\n ctx: ToSQLCtx,\n data: QueryData,\n quotedAs: string | undefined,\n order: Exclude<QueryData['order'], undefined>,\n) => {\n ctx.sql.push(\n `ORDER BY ${order\n .map((item) => orderByToSql(ctx, data, item, quotedAs))\n .join(', ')}`,\n );\n};\n\nexport const orderByToSql = (\n ctx: ToSQLCtx,\n data: QueryData,\n order: OrderItem,\n quotedAs?: string,\n) => {\n if (typeof order === 'string') {\n return addOrder(ctx, data, order, quotedAs);\n }\n\n if (isExpression(order)) {\n return order.toSQL(ctx, quotedAs);\n }\n\n const sql: string[] = [];\n for (const key in order) {\n const value = order[key];\n sql.push(addOrder(ctx, data, key, quotedAs, value as SortDir));\n }\n return sql.join(', ');\n};\n\nconst addOrder = (\n ctx: ToSQLCtx,\n data: QueryData,\n column: string,\n quotedAs?: string,\n dir?: SortDir | OrderTsQueryConfig,\n): string => {\n if (data.sources?.[column]) {\n const search = data.sources[column];\n const order: OrderTsQueryConfig =\n dir ||\n (!search.order || search.order === true ? emptyObject : search.order);\n\n return `${order.coverDensity ? 'ts_rank_cd' : 'ts_rank'}(${\n order.weights ? `${addValue(ctx.values, `{${order.weights}}`)}, ` : ''\n }${search.vectorSQL}, \"${column}\"${\n order.normalization !== undefined\n ? `, ${addValue(ctx.values, order.normalization)}`\n : ''\n }) ${order.dir || 'DESC'}`;\n }\n\n return `${maybeSelectedColumnToSql(ctx, data, column, quotedAs)} ${\n dir || 'ASC'\n }`;\n};\n","import { rawOrColumnToSql } from '../../sql/column-to-sql';\nimport { orderByToSql, OrderItem } from '../order/order.sql';\nimport { QueryData } from '../../query-data';\nimport { ToSQLCtx } from '../../sql/to-sql';\nimport {\n Expression,\n isExpression,\n SelectableOrExpression,\n} from '../../expressions/expression';\n\nexport interface WindowItem {\n [K: string]: WindowDeclaration | Expression;\n}\n\nexport interface WindowDeclaration {\n partitionBy?: SelectableOrExpression | SelectableOrExpression[];\n order?: OrderItem;\n}\n\nexport const windowToSql = (\n ctx: ToSQLCtx,\n data: QueryData,\n window: string | WindowDeclaration | Expression,\n quotedAs?: string,\n) => {\n if (typeof window === 'string') return `\"${window}\"`;\n\n if (isExpression(window)) return `(${window.toSQL(ctx, quotedAs)})`;\n\n const sql: string[] = [];\n if (window.partitionBy) {\n sql.push(\n `PARTITION BY ${\n Array.isArray(window.partitionBy)\n ? window.partitionBy\n .map((partitionBy) =>\n rawOrColumnToSql(ctx, data, partitionBy, quotedAs),\n )\n .join(', ')\n : rawOrColumnToSql(ctx, data, window.partitionBy, quotedAs)\n }`,\n );\n }\n\n if (window.order) {\n sql.push(`ORDER BY ${orderByToSql(ctx, data, window.order, quotedAs)}`);\n }\n\n return `(${sql.join(' ')})`;\n};\n","import { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { Query } from '../../query';\nimport { ToSQLCtx } from '../../sql/to-sql';\nimport { moveMutativeQueryToCte } from '../cte/cte.sql';\n\nexport interface UnionItem {\n a: SubQueryForSql | Expression;\n k: UnionKind;\n // true to not wrap the union member into parens.\n p?: boolean;\n}\n\nexport interface UnionSet {\n b: Query;\n u: UnionItem[];\n}\n\nexport type UnionKind =\n | 'UNION'\n | 'UNION ALL'\n | 'INTERSECT'\n | 'INTERSECT ALL'\n | 'EXCEPT'\n | 'EXCEPT ALL';\n\nexport interface QueryDataUnion {\n b: SubQueryForSql;\n u: UnionItem[];\n // true to not wrap the first union query into parens.\n p?: boolean;\n}\n\nexport const pushUnionSql = (\n ctx: ToSQLCtx,\n union: QueryDataUnion,\n quotedAs?: string,\n) => {\n const { b } = union;\n const s = moveMutativeQueryToCte(ctx, b);\n ctx.sql.push(union.p ? s : `(${s})`);\n\n for (const u of union.u) {\n const s = isExpression(u.a)\n ? u.a.toSQL(ctx, quotedAs)\n : moveMutativeQueryToCte(ctx, u.a);\n ctx.sql.push(`${u.k} ${u.p ? s : '(' + s + ')'}`);\n }\n};\n","import { isExpression } from '../../expressions/expression';\nimport { QueryData } from '../../query-data';\nimport { ToSQLCtx } from '../../sql/to-sql';\n\nexport const pushForSql = (\n ctx: ToSQLCtx,\n q: QueryData,\n type: QueryData['type'],\n quotedAs?: string,\n) => {\n if (q.for && (type !== 'upsert' || !q.upsertSecond)) {\n ctx.sql.push('FOR', q.for.type);\n const { tableNames } = q.for;\n if (tableNames) {\n ctx.sql.push(\n 'OF',\n isExpression(tableNames)\n ? tableNames.toSQL(ctx, quotedAs)\n : tableNames.map((x) => `\"${x}\"`).join(', '),\n );\n }\n if (q.for.mode) ctx.sql.push(q.for.mode);\n }\n};\n","import { IsQuery, Query } from '../query';\nimport { QueryData, QueryType } from '../query-data';\nimport { QueryBuilder } from '../db';\nimport {\n addWithToSql,\n ctesToSql,\n setFreeTopCteAs,\n TopCTE,\n} from '../basic-features/cte/cte.sql';\nimport { SubQueryForSql } from '../internal-features/sub-query/sub-query-for-sql';\nimport { makeInsertSql } from '../basic-features/mutate/insert.sql';\nimport { pushUpdateSql } from '../basic-features/mutate/update.sql';\nimport { pushDeleteSql } from '../basic-features/mutate/delete.sql';\nimport {\n _clone,\n _queryInsert,\n JoinItem,\n makeRowToJson,\n makeSql,\n MoreThanOneRowError,\n QueryInternal,\n RawSql,\n setMutativeQueriesSelectRelationsStateOnSql,\n Sql,\n} from '../index';\nimport { moveMutativeQueryToCteBase } from '../basic-features/cte/move-mutative-query-to-cte-base.sql';\nimport { pushDistinctSql } from '../basic-features/distinct/distinct.sql';\nimport { setSqlCtxSelectList } from '../basic-features/select/select.sql';\nimport { pushFromAndAs } from '../basic-features/from/fromAndAs.sql';\nimport { pushJoinSql } from '../basic-features/join/join.sql';\nimport { pushWhereStatementSql } from '../basic-features/where/where.sql';\nimport { columnToSql } from './column-to-sql';\nimport { pushHavingSql } from '../basic-features/having/having.sql';\nimport { windowToSql } from '../basic-features/window/window.sql';\nimport { pushOrderBySql } from '../basic-features/order/order.sql';\nimport { pushLimitOffsetSql } from '../basic-features/limit-offset/limit-offset.sql';\nimport { addTableHook } from '../extra-features/hooks/hooks.sql';\nimport { RunAfterQuery } from './sql';\nimport { HasCteHooks, TableHook } from '../basic-features/select/hook-select';\nimport { isExpression } from '../expressions/expression';\nimport { pushUnionSql } from '../basic-features/union/union.sql';\nimport { pushForSql } from '../basic-features/for/for.sql';\nimport { setCurrentDefaultSchema } from '../basic-features/storage/storage';\nimport { emptyArray } from 'pqb/internal';\nimport { MutativeQueriesSelectRelationsSqlState } from '../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\n\ninterface ToSqlOptionsInternal {\n hasNonSelect?: boolean;\n // selected value in JOIN LATERAL will have an alias to reference it from SELECT\n aliasValue?: true;\n // for insert batching logic: skip a batch check when is inside a WITH subquery\n skipBatchCheck?: true;\n selectedCount?: number;\n selectList?: string[];\n}\n\nexport interface ToSqlValues {\n values: unknown[];\n}\n\nexport interface TopToSqlCtx\n extends ToSqlOptionsInternal,\n HasCteHooks,\n ToSqlValues {\n topCtx: TopToSqlCtx;\n topCTE?: TopCTE;\n tableHook?: TableHook;\n mutativeQueriesSelectRelationsSqlState?: MutativeQueriesSelectRelationsSqlState;\n cteHookTopNullSelectAppended?: boolean;\n}\n\nexport interface ToSQLCtx extends ToSqlOptionsInternal, ToSqlValues {\n topCtx: TopToSqlCtx;\n qb: QueryBuilder;\n q: QueryData;\n sql: string[];\n selectedCount: number;\n cteName?: string;\n wrapAs?: string;\n}\n\nexport interface ToSQLQuery extends IsQuery {\n __isQuery: Query['__isQuery'];\n q: Query['q'];\n qb: Query['qb'];\n table?: Query['table'];\n internal: QueryInternal;\n relations: Query['relations'];\n withData: Query['withData'];\n clone: Query['clone'];\n baseQuery: Query['baseQuery'];\n returnType: Query['returnType'];\n result: Query['result'];\n shape: Query['shape'];\n}\n\nexport interface ToSql {\n (\n table: ToSQLQuery,\n type: QueryType,\n topCtx?: TopToSqlCtx,\n isSubSql?: boolean,\n cteName?: string,\n calledByThen?: boolean,\n dontAddTableHook?: boolean,\n ): Sql;\n}\n\nexport const newToSqlCtx = (query: ToSQLQuery): ToSQLCtx => {\n const ctx = {\n topCtx: undefined as unknown as TopToSqlCtx,\n qb: query.qb,\n q: query.q,\n sql: [],\n values: [],\n selectedCount: 0,\n };\n\n ctx.topCtx = ctx;\n\n return ctx;\n};\n\nexport const toSql: ToSql = (\n table,\n type,\n topCtx,\n isSubSql,\n cteName,\n calledByThen,\n dontAddTableHook,\n) => {\n const query = table.q;\n const sql: string[] = [];\n const values = topCtx?.values || [];\n const ctx: ToSQLCtx = {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n topCtx: topCtx!,\n qb: table.qb,\n q: query,\n sql,\n values,\n aliasValue: topCtx?.aliasValue,\n skipBatchCheck: topCtx?.skipBatchCheck,\n hasNonSelect: topCtx?.hasNonSelect,\n selectedCount: 0,\n cteName,\n };\n\n if (topCtx) {\n if (type) topCtx.hasNonSelect = true;\n } else {\n ctx.topCtx = ctx as TopToSqlCtx;\n if (!calledByThen) {\n setCurrentDefaultSchema(table.internal.asyncStorage.getStore()?.schema);\n }\n }\n\n ctesToSql(ctx, query.with);\n\n let result: Sql;\n\n let selectKeywordPos: number | undefined;\n let prependedSelectParenthesis: boolean | undefined;\n\n let fromQuery: SubQueryForSql | undefined;\n\n if (query.asFns) {\n let as;\n if (isSubSql) {\n as = cteName || setFreeTopCteAs(ctx);\n } else {\n as = ctx.wrapAs = setFreeTopCteAs(ctx);\n }\n for (const fn of query.asFns) {\n fn(as);\n }\n }\n\n if (type && type !== 'upsert') {\n const tableName = table.table ?? query.as;\n if (!tableName) throw new Error(`Table is missing for ${type}`);\n\n if (type === 'insert') {\n result = makeInsertSql(ctx, table, query, `\"${tableName}\"`, isSubSql);\n } else {\n // insert does not support aliasing the target table, while update and delete support it\n const quotedAs = `\"${query.as || tableName}\"`;\n\n if (type === 'update') {\n result = pushUpdateSql(ctx, table, query, quotedAs, isSubSql);\n } else if (type === 'delete') {\n result = pushDeleteSql(ctx, table, query, quotedAs, isSubSql);\n } else {\n throw new Error(`Unsupported query type ${type}`);\n }\n }\n } else {\n let selectSqlPos: number | undefined;\n let runAfterQuery: RunAfterQuery | undefined;\n let skipSelect: boolean | undefined;\n if (type === 'upsert') {\n const upsertUpdate = query.upsertUpdate && query.updateData;\n if (isSubSql || query.upsertSecond) {\n skipSelect = true;\n\n const upsertOrCreate = _clone(table as Query);\n\n // it expected for update to not find records, do not throw if not found\n if (upsertOrCreate.q.returnType === 'oneOrThrow') {\n upsertOrCreate.q.returnType = 'one';\n } else if (upsertOrCreate.q.returnType === 'valueOrThrow') {\n upsertOrCreate.q.returnType = 'value';\n }\n\n const { as, makeSql: makeFirstSql } = moveMutativeQueryToCteBase(\n toSql,\n ctx,\n upsertOrCreate as unknown as SubQueryForSql,\n upsertUpdate ? 'update' : null,\n );\n\n upsertOrCreate.q.or = upsertOrCreate.q.scopes = undefined;\n\n upsertOrCreate.q.and = [\n // use raw SQL rather than _queryWhereNotExists to avoid soft delete being appended\n new RawSql(`NOT EXISTS (SELECT 1 FROM \"${as}\")`),\n ];\n\n if (query.upsertInsert) {\n const insertData = query.upsertInsert();\n _queryInsert(upsertOrCreate as never, insertData as never);\n upsertOrCreate.q.type = 'upsert';\n }\n\n const { makeSql: makeSecondSql } = moveMutativeQueryToCteBase(\n toSql,\n ctx,\n upsertOrCreate as unknown as SubQueryForSql,\n 'insert',\n );\n\n sql.push(makeFirstSql(isSubSql), 'UNION ALL', makeSecondSql(isSubSql));\n } else {\n const second = _clone(table);\n second.q.upsertSecond = true;\n // let's call before hooks only once for upsert\n second.q.before = undefined;\n runAfterQuery = (queryResult) => {\n if (queryResult.rowCount) {\n second.q.upsertSecond = undefined;\n if (queryResult.rowCount > 1) {\n throw new MoreThanOneRowError(\n second,\n `Only one row was expected to find, found ${queryResult.rowCount} rows.`,\n );\n }\n return;\n }\n\n return second\n .then((result) => ({ result }))\n .finally(() => {\n second.q.upsertSecond = undefined;\n });\n };\n\n if (upsertUpdate) {\n const result = toSql(table, 'update', topCtx, isSubSql);\n if ('text' in result) {\n result.runAfterQuery = runAfterQuery;\n }\n return result;\n }\n }\n }\n\n const quotedAs =\n (query.as || table.table) && `\"${query.as || table.table}\"`;\n\n if (query.union) {\n pushUnionSql(ctx, query.union, quotedAs);\n } else if (!skipSelect) {\n selectKeywordPos = sql.length;\n sql.push('SELECT');\n\n if (query.distinct) {\n pushDistinctSql(ctx, table, query.distinct, quotedAs);\n }\n\n selectSqlPos = sql.length - 1;\n\n const aliases = query.group ? [] : undefined;\n setSqlCtxSelectList(ctx, table, query, quotedAs, isSubSql, aliases);\n\n fromQuery =\n ((table.table || query.from) &&\n pushFromAndAs(ctx, table, query, quotedAs)) ||\n undefined;\n\n if (query.join) {\n pushJoinSql(\n ctx,\n table,\n query as QueryData & { join: JoinItem[] },\n quotedAs,\n );\n }\n\n if (query.and || query.or || query.scopes) {\n pushWhereStatementSql(ctx, table, query, quotedAs);\n }\n\n if (query.group) {\n const group = query.group.map((item) => {\n if (isExpression(item)) {\n return item.toSQL(ctx, quotedAs);\n } else {\n const i = (aliases as string[]).indexOf(item as string);\n return i !== -1\n ? i + 1\n : columnToSql(\n ctx,\n table.q,\n table.shape,\n item as string,\n quotedAs,\n );\n }\n });\n sql.push(`GROUP BY ${group.join(', ')}`);\n }\n\n if (query.having) pushHavingSql(ctx, query, quotedAs);\n\n if (query.window) {\n const window: string[] = [];\n for (const item of query.window) {\n for (const key in item) {\n window.push(\n `\"${key}\" AS ${windowToSql(ctx, query, item[key], quotedAs)}`,\n );\n }\n }\n sql.push(`WINDOW ${window.join(', ')}`);\n }\n }\n\n if (query.order) {\n pushOrderBySql(ctx, query, quotedAs, query.order);\n }\n\n pushLimitOffsetSql(ctx, query, fromQuery);\n\n pushForSql(ctx, query, type, quotedAs);\n\n addTableHook(\n ctx,\n table,\n query,\n query.hookSelect,\n undefined,\n dontAddTableHook,\n );\n\n // compose select in the last moment because NULL for CTE selects\n // can be added by sub queries added in where or in other places\n if (selectSqlPos !== undefined && ctx.selectList?.length) {\n sql[selectSqlPos] += ' ' + ctx.selectList.join(', ');\n }\n\n if (selectKeywordPos !== undefined && !isSubSql && ctx.topCtx.cteHooks) {\n sql[selectKeywordPos] = '(' + sql[selectKeywordPos];\n prependedSelectParenthesis = true;\n }\n\n result = makeSql(ctx, type, isSubSql, runAfterQuery);\n }\n\n if (!ctx.cteName) {\n result.tableHook = ctx.topCtx.tableHook;\n if (!topCtx) {\n setMutativeQueriesSelectRelationsStateOnSql(ctx, result);\n }\n }\n\n if (!isSubSql) {\n if (ctx.topCtx.cteHooks && 'text' in result) {\n result.cteHooks = ctx.topCtx.cteHooks;\n\n if (ctx.topCtx.cteHooks.hasSelect) {\n if (prependedSelectParenthesis) {\n result.text += ')';\n }\n\n const { tableHooks, ensureCount } = ctx.topCtx.cteHooks;\n\n const keyValues = [\n ...(tableHooks\n ? Object.entries(tableHooks).map(\n ([cteName, data]) =>\n `'${cteName}', (SELECT json_agg(${makeRowToJson(\n cteName,\n data.shape,\n false,\n true,\n )}) FROM \"${cteName}\")`,\n )\n : emptyArray),\n ...(ensureCount\n ? Object.entries(ensureCount).map(\n ([cteName, item]) =>\n `'#${cteName}', CASE WHEN ${\n 'count' in item\n ? `(SELECT count(*) FROM \"${cteName}\") < ${item.count}`\n : `(SELECT \"${cteName}\".\"${item.jsonNotNull}\" FROM \"${cteName}\") IS NULL`\n } THEN (SELECT 'not-found')::int END`,\n )\n : emptyArray),\n ];\n\n result.text += ` UNION ALL SELECT ${'NULL, '.repeat(\n ctx.selectedCount || 0,\n )}json_build_object(${keyValues.join(', ')})`;\n }\n }\n }\n\n if ('text' in result) addWithToSql(ctx, result, isSubSql);\n\n return result;\n};\n","import { emptyObject, RecordUnknown, setFreeAlias } from '../../../utils';\nimport { Expression } from '../../expressions/expression';\nimport { toSql, ToSQLCtx } from '../../sql/to-sql';\nimport { QueryData, WithItems } from '../../query-data';\nimport { Column } from '../../../columns';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { moveMutativeQueryToCteBase } from './move-mutative-query-to-cte-base.sql';\nimport { setMoveMutativeQueryToCte } from '../../../columns/operators';\nimport { getSqlText, SingleSql, SingleSqlItem } from '../../sql/sql';\n\nexport interface WithDataItem {\n table: string;\n shape: Column.QueryColumns;\n}\n\nexport interface WithDataItems {\n [K: string]: WithDataItem;\n}\n\nexport interface CteItem {\n // name\n n: string | ((as: string) => void);\n // options\n o?: CteOptions;\n // query\n q?: SubQueryForSql;\n // sql\n s?: Expression;\n // prepend: false by default\n p?: boolean;\n}\n\nexport interface CteOptions {\n columns?: string[];\n recursive?: true;\n materialized?: true;\n notMaterialized?: true;\n}\n\nexport interface TopCTE {\n names: RecordUnknown;\n stack: string[][];\n append: string[][];\n}\n\nconst newTopCte = (ctx: ToSQLCtx): TopCTE => ({\n names: { ...ctx.q.withShapes, ...ctx.q.joinedShapes },\n stack: [],\n append: [],\n});\n\nexport const getTopCteSize = ({\n topCtx: { topCTE },\n}: ToSQLCtx): number | undefined => topCTE?.append.length;\n\nexport const setTopCteSize = ({ topCtx }: ToSQLCtx, size?: number) => {\n if (topCtx.topCTE) {\n if (size) {\n topCtx.topCTE.append.length = size;\n } else {\n topCtx.topCTE = undefined;\n }\n }\n};\n\nexport const ctesToSql = (ctx: ToSQLCtx, ctes?: WithItems): void => {\n if (!ctes) return;\n\n for (const item of ctes) {\n const place = item.p ? 'before' : 'after';\n if (ctx !== ctx.topCtx && item.q?.q.type) {\n addTopCte(place, ctx, item.q, item.q.q.type, item.n);\n } else {\n addTopCteInternal(place, ctx, item, item.q?.q.type);\n }\n }\n};\n\nexport const cteToSqlGiveAs = (\n ctx: ToSQLCtx,\n item: CteItem,\n type: QueryData['type'],\n dontAddTableHook?: boolean,\n): { as: string; sql: string } => {\n let inner: string;\n\n let as;\n if (typeof item.n === 'string') {\n as = item.n;\n } else {\n if (ctx === ctx.topCtx) {\n const topCTE = (ctx.topCtx.topCTE ??= newTopCte(ctx));\n as = setFreeAlias(topCTE.names, 'q', true);\n item.n(as);\n } else {\n // TODO\n throw new Error('not implemented yet');\n }\n }\n\n if (item.q) {\n inner = getSqlText(\n toSql(item.q, type, ctx.topCtx, true, as, undefined, dontAddTableHook),\n );\n } else {\n inner = (item.s as Expression).toSQL(ctx.topCtx, `\"${as}\"`);\n }\n\n const o = item.o ?? (emptyObject as CteOptions);\n return {\n as,\n sql: `${o.recursive ? 'RECURSIVE ' : ''}\"${as}\"${\n o.columns ? `(${o.columns.map((x) => `\"${x}\"`).join(', ')})` : ''\n } AS ${\n o.materialized\n ? 'MATERIALIZED '\n : o.notMaterialized\n ? 'NOT MATERIALIZED '\n : ''\n }(${inner})`,\n };\n};\n\nexport const cteToSql = (\n ctx: ToSQLCtx,\n item: CteItem,\n type: QueryData['type'],\n dontAddTableHook?: boolean,\n): string => cteToSqlGiveAs(ctx, item, type, dontAddTableHook).sql;\n\nexport const setFreeTopCteAs = (ctx: ToSQLCtx) => {\n const topCTE = (ctx.topCtx.topCTE ??= newTopCte(ctx));\n const as = setFreeAlias(topCTE.names, 'q', true);\n topCTE.names[as] = true;\n return as;\n};\n\nexport const addTopCteSql = (\n ctx: ToSQLCtx,\n as: string | undefined,\n sql: string,\n): string => {\n const topCTE = (ctx.topCtx.topCTE ??= newTopCte(ctx));\n\n as ??= setFreeAlias(topCTE.names, 'q', true);\n topCTE.names[as] = true;\n\n const target =\n topCTE.stack[topCTE.stack.length - 1] ||\n (topCTE.append[topCTE.append.length] = []);\n\n target.push(as + ' AS (' + sql + ')');\n return as;\n};\n\nexport const addTopCte = (\n place: 'before' | 'after',\n ctx: ToSQLCtx,\n q: SubQueryForSql,\n type: QueryData['type'],\n as?: string | ((as: string) => void),\n dontAddTableHook?: boolean,\n): string => {\n const topCTE = (ctx.topCtx.topCTE ??= newTopCte(ctx));\n\n if (typeof as !== 'string') {\n const name = setFreeAlias(topCTE.names, 'q', true);\n\n if (as) {\n as(name);\n }\n\n as = name;\n }\n\n addTopCteInternal(place, ctx, { n: as, q }, type, dontAddTableHook);\n\n return as;\n};\n\nconst addTopCteInternal = (\n place: 'before' | 'after',\n ctx: ToSQLCtx,\n item: CteItem,\n type: QueryData['type'],\n dontAddTableHook?: boolean,\n) => {\n const topCTE = (ctx.topCtx.topCTE ??= newTopCte(ctx));\n\n const target =\n (place === 'before' && topCTE.stack[topCTE.stack.length - 1]) ||\n (topCTE.append[topCTE.append.length] = []);\n\n const prepend: string[] = [];\n topCTE.stack.push(prepend);\n\n const sql = cteToSql(ctx, item, type, dontAddTableHook); // more ctes can be appended here\n\n target.push(...prepend, sql);\n\n topCTE.stack.pop();\n};\n\nexport const addWithToSql = (\n ctx: ToSQLCtx,\n sql: SingleSql,\n isSubSql?: boolean,\n): void => {\n if (!isSubSql && ctx.topCtx.topCTE) {\n const sqls: string[] = [];\n if (!isSubSql && ctx.topCtx.topCTE) {\n for (const append of ctx.topCtx.topCTE.append) {\n sqls.push(...append);\n }\n }\n\n sql.text = 'WITH ' + sqls.join(', ') + ' ' + sql.text;\n }\n};\n\nexport const composeCteSingleSql = (ctx: ToSQLCtx): SingleSqlItem => {\n const result = {\n text: ctx.sql.join(' '),\n values: ctx.values,\n };\n addWithToSql(ctx, result);\n return result;\n};\n\nexport interface MoveMutativeQueryToCte {\n (ctx: ToSQLCtx, query: SubQueryForSql): string;\n}\n\nexport const moveMutativeQueryToCte: MoveMutativeQueryToCte = (ctx, query) => {\n const { makeSql } = moveMutativeQueryToCteBase(toSql, ctx, query);\n return makeSql(true);\n};\n\nsetMoveMutativeQueryToCte(moveMutativeQueryToCte);\n","import {\n _queryGet,\n _queryGetOptional,\n GetArg,\n GetResult,\n GetResultOptional,\n QueryGetSelf,\n} from './get.utils';\n\nimport { _clone } from '../clone/clone';\n\nexport class QueryGet {\n /**\n * `.get` returns a single value, adds `LIMIT 1` to the query, and accepts a column name or a raw SQL expression.\n *\n * `get` throws a `NotFoundError` when not found, and `getOptional` returns `undefined`.\n *\n * ```ts\n * import { NumberColumn } from 'orchid-orm';\n * import { sql } from './baseTable';\n *\n * const firstName: string = await db.table.get('name');\n *\n * const rawResult: number = await db.table.get(sql((t) => t.integer())`1 + 1`);\n *\n * const firstNameOptional: string | undefined = await db.table.getOptional(\n * 'name',\n * );\n * ```\n *\n * @param arg - string for a column to get, or a raw SQL\n */\n get<T extends QueryGetSelf, Arg extends GetArg<T>>(\n this: T,\n arg: Arg,\n ): GetResult<T, Arg> {\n return _queryGet(_clone(this), arg) as never;\n }\n\n /**\n * `.getOptional` returns a single value or undefined when not found:\n *\n * ```ts\n * const firstName: string | undefined = await db.table.getOptional('name');\n * ```\n *\n * @param arg - string for a column to get, or a raw SQL\n */\n getOptional<T extends QueryGetSelf, Arg extends GetArg<T>>(\n this: T,\n arg: Arg,\n ): GetResultOptional<T, Arg> {\n return _queryGetOptional(_clone(this), arg) as never;\n }\n}\n","import { Query, SetQueryReturnsColumnOrThrow } from '../query';\nimport { columnToSql, rawOrColumnToSql } from '../sql/column-to-sql';\nimport { OrderItem, pushOrderBySql } from '../basic-features/order/order.sql';\nimport { WhereItem, whereToSql } from '../basic-features/where/where.sql';\nimport { windowToSql } from '../basic-features/window/window.sql';\nimport { extendQuery } from '../query.utils';\nimport { addColumnParserToQuery, Column } from '../../columns';\nimport {\n PickQuerySelectableResultRelationsWindows,\n PickQuerySelectable,\n PickQuerySelectableResultWindows,\n} from '../pick-query-types';\nimport {\n Expression,\n ExpressionData,\n ExpressionTypeMethod,\n SelectableOrExpression,\n} from './expression';\nimport { addValue, emptyObject, toArray } from '../../utils';\nimport { getValueKey } from '../basic-features/get/get-value-key';\nimport { WhereArg, WhereArgs } from '../basic-features/where/where';\nimport { OrderArg, OrderArgs } from '../basic-features/order/order';\nimport { WindowArgDeclaration } from '../basic-features/window/window';\nimport { ToSQLCtx } from '../sql/to-sql';\nimport { QueryData } from '../query-data';\n\n// Additional SQL options that can be accepted by any aggregate function.\nexport interface AggregateOptions<\n T extends PickQuerySelectableResultRelationsWindows,\n> {\n // Add DISTINCT inside of function call.\n distinct?: boolean;\n // The same argument as in .order() to be set inside of function call.\n order?: OrderArg<T> | OrderArgs<T>;\n // The same argument as in .where() to be set inside of function call.\n filter?: WhereArg<T>;\n // The same argument as in .orWhere() to support OR logic of the filter clause.\n filterOr?: WhereArgs<T>;\n // Adds WITHIN GROUP SQL statement.\n withinGroup?: boolean;\n // defines OVER clause.\n // Can be the name of a window defined by calling the .window() method,\n // or object the same as the .window() method takes to define a window.\n over?: Over<T>;\n}\n\n// Window definition or name.\nexport type Over<T extends PickQuerySelectableResultWindows> =\n | keyof T['windows']\n | WindowArgDeclaration<T>;\n\n// Arguments of function.\n// It can be a column name, expression,\n// `pairs` is for { key: value } which is translated to ('key', value) (used by `jsonObjectAgg`),\n// `value` is for a query variable (used by `stringAgg` for a delimiter).\nexport type FnExpressionArgs<Q extends PickQuerySelectable> = (\n | SelectableOrExpression<Q>\n | FnExpressionArgsPairs<Q>\n | FnExpressionArgsValue\n)[];\n\nexport interface FnExpressionArgsPairs<Q extends PickQuerySelectable> {\n pairs: { [K: string]: SelectableOrExpression<Q> };\n}\n\nexport interface FnExpressionArgsValue {\n value: unknown;\n}\n\n// Expression for SQL function calls.\nexport class FnExpression<\n Q extends Query = Query,\n T extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n> extends Expression<T> {\n result: { value: T };\n q: ExpressionData;\n\n /**\n * @param query - query object.\n * @param fn - SQL function name.\n * @param args - arguments of the function.\n * @param options - aggregate options.\n * @param value - column type of the function result.\n */\n constructor(\n public query: Q,\n public fn: string,\n public args: FnExpressionArgs<Q>,\n public options: AggregateOptions<Q> = emptyObject,\n value: T,\n ) {\n super();\n this.result = { value };\n this.q = query.q as ExpressionData;\n this.q.expr = this;\n Object.assign(query, value.operators);\n\n // Throw happens only on `undefined`, which is not the case for `sum` and other functions that can return `null`.\n query.q.returnType = 'valueOrThrow';\n query.q.returnsOne = true;\n query.q.getColumn = value;\n query.q.select = [this];\n\n addColumnParserToQuery(query.q, getValueKey, value);\n }\n\n // Builds function SQL.\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n const sql: string[] = [`${this.fn}(`];\n\n const { values } = ctx;\n const { options } = this;\n\n if (options.distinct && !options.withinGroup) sql.push('DISTINCT ');\n\n const q = this.q as QueryData;\n sql.push(\n this.args\n .map((arg) => {\n if (typeof arg === 'string') {\n return arg === '*'\n ? '*'\n : columnToSql(ctx, q, q.shape, arg, quotedAs);\n } else if (arg instanceof Expression) {\n return arg.toSQL(ctx, quotedAs);\n } else if ('pairs' in (arg as FnExpressionArgsPairs<Query>)) {\n const args: string[] = [];\n const { pairs } = arg as FnExpressionArgsPairs<Query>;\n for (const key in pairs) {\n args.push(\n // ::text is needed to bypass \"could not determine data type of parameter\" postgres error\n `${addValue(values, key)}::text, ${rawOrColumnToSql(\n ctx,\n q,\n pairs[key as keyof typeof pairs] as never,\n quotedAs,\n )}`,\n );\n }\n return args.join(', ');\n } else {\n return addValue(values, (arg as FnExpressionArgsValue).value);\n }\n })\n .join(', '),\n );\n\n if (options.withinGroup) sql.push(') WITHIN GROUP (');\n else if (options.order) sql.push(' ');\n\n if (options.order) {\n pushOrderBySql(\n { ...ctx, sql },\n q,\n quotedAs,\n toArray(options.order) as OrderItem[],\n );\n }\n\n sql.push(')');\n\n if (options.filter || options.filterOr) {\n const whereSql = whereToSql(\n ctx,\n this.query,\n {\n and: options.filter ? ([options.filter] as WhereItem[]) : undefined,\n or: options.filterOr?.map((item) => [item]) as WhereItem[][],\n shape: q.shape,\n joinedShapes: q.joinedShapes,\n },\n quotedAs,\n );\n if (whereSql) {\n sql.push(` FILTER (WHERE ${whereSql})`);\n }\n }\n\n if (options.over) {\n sql.push(\n ` OVER ${windowToSql(ctx, q, options.over as string, quotedAs)}`,\n );\n }\n\n return sql.join('');\n }\n}\n\n// Applies a function expression to the query.\nexport function makeFnExpression<\n T extends PickQuerySelectableResultRelationsWindows,\n C extends Column.Pick.QueryColumn,\n>(\n self: T,\n type: C,\n fn: string,\n args: FnExpressionArgs<Query>,\n options?: AggregateOptions<T>,\n): SetQueryReturnsColumnOrThrow<T, C> & C['operators'] {\n const q = extendQuery(self as unknown as Query, type.operators);\n (q.baseQuery as unknown as ExpressionTypeMethod).type =\n ExpressionTypeMethod.prototype.type;\n\n new FnExpression<Query, Column.Pick.QueryColumn>(\n q,\n fn,\n args,\n options as AggregateOptions<Query> | undefined,\n type,\n );\n\n // discard 'map` and 'transform' when applying aggregations\n q.q.transform = undefined;\n\n return q as never;\n}\n","import {\n Query,\n SelectableOrExpressionOfType,\n SetQueryReturnsColumnOrThrow,\n} from '../../query';\nimport {\n AggregateOptions,\n makeFnExpression,\n FnExpression,\n Over,\n} from '../../expressions/fn-expression';\nimport {\n OperatorsAny,\n OperatorsArray,\n OperatorsBoolean,\n OperatorsNumber,\n OperatorsText,\n} from '../../../columns/operators';\nimport { RawSql } from '../../expressions/raw-sql';\nimport {\n BooleanColumn,\n DecimalColumn,\n IntegerColumn,\n JSONTextColumn,\n NumberAsStringBaseColumn,\n NumberBaseColumn,\n RealColumn,\n TextColumn,\n XMLColumn,\n} from '../../../columns';\nimport { Column } from '../../../columns/column';\nimport { defaultSchemaConfig } from '../../../columns/default-schema-config';\nimport {\n _getSelectableColumn,\n _queryGetOptional,\n QueryGetSelf,\n} from '../get/get.utils';\nimport {\n Expression,\n ExpressionOutput,\n SelectableOrExpression,\n} from '../../expressions/expression';\nimport {\n PickQuerySelectableResultRelationsWindows,\n PickQueryQ,\n PickQuerySelectable,\n} from '../../pick-query-types';\nimport { emptyArray } from '../../../utils';\nimport { _clone } from '../clone/clone';\n\n// Helper function to check if we're selecting a count on this query.\n// Used in `create` to not return a full record after `count()` method.\nexport const isSelectingCount = (q: PickQueryQ) => {\n const { expr } = q.q;\n return (\n expr instanceof FnExpression && expr.fn === 'count' && expr.args[0] === '*'\n );\n};\n\n// `count` returns `bigint` type that is represented by a string.\n// This is needed to parse the value back to a number.\nconst intNullable = new IntegerColumn(defaultSchemaConfig)\n .nullable()\n .parse(parseInt as never);\n\n// double-precision is represented by string in JS, parse it to float.\nconst floatNullable = new RealColumn(defaultSchemaConfig)\n .nullable()\n .parse(parseFloat as never);\n\nconst booleanNullable = BooleanColumn.instance.nullable();\n\nconst textNullable = TextColumn.instance.nullable();\n\nconst jsonTextNullable = JSONTextColumn.instance.nullable();\n\nconst xmlNullable = XMLColumn.instance.nullable();\n\nconst stringAsNumberNullable =\n new (NumberAsStringBaseColumn as unknown as typeof DecimalColumn)(\n defaultSchemaConfig,\n ).nullable();\n\nconst numericResultColumn = (\n q: unknown,\n arg: PropertyKey | Expression,\n): Column => {\n const query = q as Query;\n\n const type =\n typeof arg === 'string'\n ? _getSelectableColumn(query, arg)\n : (arg as Expression).result.value;\n\n let column =\n type instanceof NumberBaseColumn ? floatNullable : stringAsNumberNullable;\n\n const parse = typeof arg === 'string' && query.q.parsers?.[arg];\n if (parse) column = column.parse(parse) as typeof column;\n return column;\n};\n\ninterface OperatorsCount extends OperatorsNumber {\n isCount: true;\n}\n\ntype CountColumn = Column.Pick.QueryColumnOfTypeAndOps<\n 'int8',\n number,\n OperatorsCount\n>;\n\ntype CountReturn<T> = SetQueryReturnsColumnOrThrow<T, CountColumn> &\n OperatorsCount;\n\ntype SelectableDataType<\n T extends PickQuerySelectable,\n DataType extends string,\n> =\n | {\n [K in keyof T['__selectable']]: T['__selectable'][K]['column']['dataType'] extends DataType\n ? K\n : never;\n }[keyof T['__selectable']]\n | Expression<Column.Pick.QueryColumnOfDataType<DataType>>;\n\ntype NumericReturn<\n T extends PickQuerySelectable,\n Arg,\n> = Arg extends keyof T['__selectable']\n ? SetQueryReturnsColumnOrThrow<\n T,\n Column.Pick.QueryColumnOfTypeAndOps<\n T['__selectable'][Arg]['column']['dataType'],\n T['__selectable'][Arg]['column']['type'] | null,\n OperatorsNumber\n >\n > &\n OperatorsNumber\n : Arg extends Expression\n ? SetQueryReturnsColumnOrThrow<\n T,\n Column.Pick.QueryColumnOfTypeAndOps<\n Arg['result']['value']['dataType'],\n Arg['result']['value']['type'] | null,\n OperatorsNumber\n >\n > &\n OperatorsNumber\n : never;\n\ntype NullableNumberReturn<T, DataType> = SetQueryReturnsColumnOrThrow<\n T,\n Column.Pick.QueryColumnOfTypeAndOps<DataType, number | null, OperatorsNumber>\n> &\n OperatorsNumber;\n\nexport type BooleanQueryColumn = Column.Pick.QueryColumnOfTypeAndOps<\n 'bool',\n boolean,\n OperatorsBoolean\n>;\n\ntype BooleanNullable = Column.Pick.QueryColumnOfTypeAndOps<\n 'bool',\n boolean | null,\n OperatorsBoolean\n>;\n\ntype NullableBooleanReturn<T> = SetQueryReturnsColumnOrThrow<\n T,\n BooleanNullable\n> &\n OperatorsBoolean;\n\ntype NullableJSONAggReturn<\n T extends PickQuerySelectable,\n Arg extends SelectableOrExpression<T>,\n> = SetQueryReturnsColumnOrThrow<\n T,\n {\n dataType: 'json';\n type: (ExpressionOutput<T, Arg>['type'] | null)[] | null;\n outputType: (ExpressionOutput<T, Arg>['outputType'] | null)[] | null;\n queryType: (ExpressionOutput<T, Arg>['queryType'] | null)[] | null;\n operators: OperatorsArray<never>;\n }\n> &\n OperatorsArray<never>;\n\ninterface RecordSelectableOrExpression<T extends PickQuerySelectable> {\n [K: string]: SelectableOrExpression<T>;\n}\n\ntype NullableJSONObjectReturn<\n T extends PickQuerySelectable,\n Obj extends RecordSelectableOrExpression<T>,\n> = SetQueryReturnsColumnOrThrow<\n T,\n {\n dataType: 'json';\n type:\n | {\n [K in keyof Obj]: ExpressionOutput<T, Obj[K]>['type'];\n }\n | null;\n outputType:\n | {\n [K in keyof Obj]: ExpressionOutput<T, Obj[K]>['outputType'];\n }\n | null;\n queryType:\n | {\n [K in keyof Obj]: ExpressionOutput<T, Obj[K]>['queryType'];\n }\n | null;\n operators: OperatorsAny;\n }\n> &\n OperatorsAny;\n\ntype StringColumn = Column.Pick.QueryColumnOfTypeAndOps<\n string,\n string,\n OperatorsText\n>;\n\ntype StringNullable = Column.Pick.QueryColumnOfTypeAndOps<\n string,\n string | null,\n OperatorsText\n>;\n\ntype NullableStringReturn<T> = SetQueryReturnsColumnOrThrow<T, StringNullable> &\n OperatorsText;\n\nexport interface AggregateArgTypes {\n minMax: // bpchar, timetz not supported by ORM\n | 'citext'\n | 'date'\n | 'float4'\n | 'float8'\n | 'inet'\n | 'int2'\n | 'int4'\n | 'int8'\n | 'interval'\n | 'money'\n | 'numeric'\n | 'text'\n | 'time'\n | 'timestamp'\n | 'timestamptz';\n sum:\n | 'float4'\n | 'float8'\n | 'int2'\n | 'int4'\n | 'int8'\n | 'interval'\n | 'money'\n | 'numeric';\n avg: // unlike sum, avg has no money\n 'float4' | 'float8' | 'int2' | 'int4' | 'int8' | 'interval' | 'numeric';\n bit: 'bit' | 'int2' | 'int4' | 'int8';\n bool: 'bool';\n stringAgg: 'bytea' | 'text';\n}\n\n// Query methods to get a single value for an aggregate function\nexport class AggregateMethods {\n /**\n * Use `exists()` to check if there is at least one record-matching condition.\n *\n * It will discard previous `select` statements if any. Returns a boolean.\n *\n * ```ts\n * const exists: boolean = await db.table.where(...conditions).exists();\n * ```\n */\n exists<T extends QueryGetSelf>(\n this: T,\n ): SetQueryReturnsColumnOrThrow<T, BooleanQueryColumn> {\n const q = _queryGetOptional(_clone(this), new RawSql('true'));\n q.q.notFoundDefault = false;\n q.q.coalesceValue = new RawSql('false');\n return q as never;\n }\n\n /**\n * Count records with the `count` function:\n *\n * ```ts\n * // count all records:\n * const result: number = await db.table.count();\n *\n * // count records where a column is not NULL:\n * db.table.count('name');\n *\n * // see options above:\n * db.table.count('*', aggregateOptions);\n *\n * // select counts of people grouped by city\n * db.people\n * .select('city', {\n * population: (q) => q.count(),\n * })\n * .group('city');\n * ```\n *\n * @param arg - optionally, provide a column or a raw SQL for the `count` argument\n * @param options - aggregation options\n */\n count<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpression<T> = '*',\n options?: AggregateOptions<T>,\n ): CountReturn<T> {\n return makeFnExpression(\n this,\n intNullable,\n 'count',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Get the minimum value for the specified numeric column, returns number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = await db.table.min(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select min product price grouped by product category\n * db.product\n * .select('category', {\n * minPrice: (q) => q.min('price'),\n * })\n * .group('category')\n * .take();\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n min<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableDataType<T, AggregateArgTypes['minMax']>,\n >(this: T, arg: Arg, options?: AggregateOptions<T>): NumericReturn<T, Arg> {\n return makeFnExpression(\n this,\n numericResultColumn(this, arg),\n 'min',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Gets the maximum value for the specified numeric column, returns number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = await db.table.max(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select max product price grouped by product category\n * db.product\n * .select('category', {\n * maxPrice: (q) => q.max('price'),\n * })\n * .group('category')\n * .take();\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n max<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableDataType<T, AggregateArgTypes['minMax']>,\n >(this: T, arg: Arg, options?: AggregateOptions<T>): NumericReturn<T, Arg> {\n return makeFnExpression(\n this,\n numericResultColumn(this, arg),\n 'max',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Retrieve the sum of the values of a given numeric column, returns number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = await db.table.sum(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select sum of employee salaries grouped by years\n * db.employee\n * .select('year', {\n * yearlySalaries: (q) => q.sum('salary'),\n * })\n * .group('year');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n sum<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableDataType<T, AggregateArgTypes['sum']>,\n >(this: T, arg: Arg, options?: AggregateOptions<T>): NumericReturn<T, Arg> {\n return makeFnExpression(\n this,\n numericResultColumn(this, arg),\n 'sum',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Retrieve the average value of a numeric column, it returns a number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = db.table.avg('numericColumn', aggregateOptions);\n *\n * // select average movies ratings\n * db.movie\n * .select('title', {\n * averageRating: (q) => q.avg('rating'),\n * })\n * .group('title');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n avg<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableDataType<T, AggregateArgTypes['avg']>,\n >(this: T, arg: Arg, options?: AggregateOptions<T>): NumericReturn<T, Arg> {\n return makeFnExpression(\n this,\n numericResultColumn(this, arg),\n 'avg',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Bitwise `and` aggregation, returns `number` or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = db.table.bitAnd(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select grouped `bitAnd`\n * db.table\n * .select('someColumn', {\n * bitAnd: (q) => q.bitAnd('numericColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n bitAnd<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableDataType<T, AggregateArgTypes['bit']>,\n >(this: T, arg: Arg, options?: AggregateOptions<T>): NumericReturn<T, Arg> {\n return makeFnExpression(\n this,\n numericResultColumn(this, arg),\n 'bit_and',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Bitwise `or` aggregation, returns `number` or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = db.table.bitOr('numericColumn', aggregateOptions);\n *\n * // select grouped `bitOr`\n * db.table\n * .select('someColumn', {\n * bitOr: (q) => q.bitOr('numericColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n bitOr<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableDataType<T, AggregateArgTypes['bit']>,\n >(this: T, arg: Arg, options?: AggregateOptions<T>): NumericReturn<T, Arg> {\n return makeFnExpression(\n this,\n numericResultColumn(this, arg),\n 'bit_or',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Aggregate booleans with `and` logic, it returns `boolean` or `null` if there are no records.\n *\n * ```ts\n * const result: boolean | null = db.table.boolAnd(\n * 'booleanColumn',\n * aggregateOptions,\n * );\n *\n * // select grouped `boolAnd`\n * db.table\n * .select('someColumn', {\n * boolAnd: (q) => q.boolAnd('booleanColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - boolean column or raw SQL\n * @param options - aggregation options\n */\n boolAnd<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n arg: SelectableDataType<T, AggregateArgTypes['bool']>,\n options?: AggregateOptions<T>,\n ): NullableBooleanReturn<T> {\n return makeFnExpression(\n this,\n booleanNullable,\n 'bool_and',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Aggregate booleans with `or` logic, it returns `boolean` or `null` if there are no records.\n *\n * ```ts\n * const result: boolean | null = db.table.boolOr(\n * 'booleanColumn',\n * aggregateOptions,\n * );\n *\n * // select grouped `boolOr`\n * db.table\n * .select('someColumn', {\n * boolOr: (q) => q.boolOr('booleanColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - boolean column or raw SQL\n * @param options - aggregation options\n */\n boolOr<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n arg: SelectableDataType<T, AggregateArgTypes['bool']>,\n options?: AggregateOptions<T>,\n ): NullableBooleanReturn<T> {\n return makeFnExpression(\n this,\n booleanNullable,\n 'bool_or',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Equivalent to {@link boolAnd}\n */\n every<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n arg: SelectableDataType<T, AggregateArgTypes['bool']>,\n options?: AggregateOptions<T>,\n ): NullableBooleanReturn<T> {\n return makeFnExpression(\n this,\n booleanNullable,\n 'every',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Aggregate values into an array by using `json_agg`. Returns array of values or `null` if there are no records.\n *\n * `jsonAgg` is working a bit faster, `jsonbAgg` is better only when applying JSON operations in SQL.\n *\n * ```ts\n * const idsOrNull: number[] | null = db.table.jsonAgg('id', aggregateOptions);\n *\n * const namesOrNull: string[] | null = db.table.jsonbAgg(\n * 'name',\n * aggregateOptions,\n * );\n *\n * // select grouped `jsonAgg`\n * db.table\n * .select('someColumn', {\n * jsonAgg: (q) => q.jsonAgg('anyColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - any column or raw SQL\n * @param options - aggregation options\n */\n jsonAgg<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableOrExpression<T>,\n >(\n this: T,\n arg: Arg,\n options?: AggregateOptions<T>,\n ): NullableJSONAggReturn<T, Arg> {\n return makeFnExpression(\n this,\n jsonTextNullable,\n 'json_agg',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * See {@link jsonAgg}\n */\n jsonbAgg<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableOrExpression<T>,\n >(\n this: T,\n arg: Arg,\n options?: AggregateOptions<T>,\n ): NullableJSONAggReturn<T, Arg> {\n return makeFnExpression(\n this,\n jsonTextNullable,\n 'jsonb_agg',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * It does the construction of JSON objects, keys are provided strings and values can be table columns or raw SQL expressions, and returns `object` or `null` if no records.\n *\n * `jsonObjectAgg` is different from `jsonbObjectAgg` by internal representation in the database, `jsonObjectAgg` is a bit faster as it constructs a simple string.\n *\n * ```ts\n * import { TextColumn } from './string';\n *\n * // object has type { nameAlias: string, foo: string } | null\n * const object = await db.table.jsonObjectAgg(\n * {\n * // select a column with alias\n * nameAlias: 'name',\n * // select raw SQL with alias\n * foo: sql<string>`\"bar\" || \"baz\"`,\n * },\n * aggregateOptions,\n * );\n *\n * // select aggregated object\n * db.table.select('id', {\n * object: (q) =>\n * q.jsonObjectAgg({\n * nameAlias: 'name',\n * foo: sql<string>`\"bar\" || \"baz\"`,\n * }),\n * });\n * ```\n *\n * @param arg - object where values are column names or SQL\n * @param options - aggregation options\n */\n jsonObjectAgg<\n T extends PickQuerySelectableResultRelationsWindows,\n Obj extends RecordSelectableOrExpression<T>,\n >(\n this: T,\n arg: Obj,\n options?: AggregateOptions<T>,\n ): NullableJSONObjectReturn<T, Obj> {\n return makeFnExpression(\n this,\n jsonTextNullable,\n 'json_object_agg',\n [{ pairs: arg }],\n options,\n ) as never;\n }\n\n /**\n * See {@link jsonObjectAgg}\n */\n jsonbObjectAgg<\n T extends PickQuerySelectableResultRelationsWindows,\n Obj extends RecordSelectableOrExpression<T>,\n >(\n this: T,\n arg: Obj,\n options?: AggregateOptions<T>,\n ): NullableJSONObjectReturn<T, Obj> {\n return makeFnExpression(\n this,\n jsonTextNullable,\n 'jsonb_object_agg',\n [{ pairs: arg }],\n options,\n ) as never;\n }\n\n /**\n * Select joined strings, it returns a string or `null` if no records.\n *\n * ```ts\n * const result: string | null = db.table.stringAgg(\n * 'name',\n * ', ',\n * aggregateOptions,\n * );\n *\n * // select joined strings grouped by some column\n * db.table\n * .select('someColumn', {\n * joinedNames: (q) => q.stringAgg('name', ', '),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - string column or SQL\n * @param delimiter - string to join with\n * @param options - aggration options\n */\n stringAgg<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n arg: SelectableDataType<T, AggregateArgTypes['stringAgg']>,\n delimiter: string,\n options?: AggregateOptions<T>,\n ): NullableStringReturn<T> {\n return makeFnExpression(\n this,\n textNullable,\n 'string_agg',\n [arg, { value: delimiter }],\n options,\n ) as never;\n }\n\n /**\n * Concatenates `xml` columns, returns a `string` or `null` if no records.\n *\n * ```ts\n * const xml: string | null = await db.table.xmlAgg('xmlColumn', aggregateOptions);\n *\n * // select joined XMLs grouped by some column\n * db.table\n * .select('someColumn', {\n * joinedXMLs: (q) => q.xmlAgg('xml'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - column or SQL with XML\n * @param options - aggregation options\n */\n xmlAgg<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, StringColumn>,\n options?: AggregateOptions<T>,\n ): NullableStringReturn<T> {\n return makeFnExpression(\n this,\n xmlNullable,\n 'xmlagg',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Selects the` row_number` window function.\n *\n * Returns the number of the current row within its partition, counting from 1.\n *\n * ```ts\n * // result is of type Array<{ rowNumber: number }>\n * const result = await db.table.select({\n * rowNumber: (q) =>\n * q.rowNumber({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n rowNumber<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T, 'int8'> {\n return makeFnExpression(this, intNullable, 'row_number', emptyArray, {\n over,\n }) as never;\n }\n\n /**\n * Selects the` rank` window function.\n *\n * Returns the rank of the current row, with gaps; that is, the row_number of the first row in its peer group.\n *\n * ```ts\n * // result is of type Array<{ rank: number }>\n * const result = await db.table.select({\n * rank: (q) =>\n * q.rank({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n rank<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T, 'int8'> {\n return makeFnExpression(this, intNullable, 'rank', emptyArray, {\n over,\n }) as never;\n }\n\n /**\n * Selects the` dense_rank` window function.\n *\n * Returns the rank of the current row, without gaps; this function effectively counts peer groups.\n *\n * ```ts\n * // result is of type Array<{ denseRank: number }>\n * const result = await db.table.select({\n * denseRank: (q) =>\n * q.denseRank({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n denseRank<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T, 'int8'> {\n return makeFnExpression(this, intNullable, 'dense_rank', emptyArray, {\n over,\n }) as never;\n }\n\n /**\n * Selects the `percent_rank` window function.\n *\n * Returns the relative rank of the current row, that is (rank - 1) / (total partition rows - 1). The value thus ranges from 0 to 1 inclusive.\n *\n * ```ts\n * // result is of type Array<{ percentRank: number }>\n * const result = await db.table.select({\n * percentRank: (q) =>\n * q.percentRank({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n percentRank<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T, 'float8'> {\n return makeFnExpression(this, intNullable, 'percent_rank', emptyArray, {\n over,\n }) as never;\n }\n\n /**\n * Selects the `cume_dist` window function.\n *\n * Returns the cumulative distribution, that is (number of partition rows preceding or peers with current row) / (total partition rows). The value thus ranges from 1/N to 1.\n *\n * ```ts\n * // result is of type Array<{ cumeDist: number }>\n * const result = await db.table.select({\n * cumeDist: (q) =>\n * q.cumeDist({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n cumeDist<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T, 'float8'> {\n return makeFnExpression(this, floatNullable, 'cume_dist', emptyArray, {\n over,\n }) as never;\n }\n}\n","import { Column } from '../../../columns/column';\nimport {\n createCtx,\n CreateData,\n createSelect,\n CreateSelf,\n handleManyData,\n handleOneData,\n insert,\n throwOnReadOnly,\n} from './create';\nimport {\n Query,\n SetQueryReturnsRowCount,\n SetQueryReturnsRowCountMany,\n queryTypeWithLimitOne,\n IsQuery,\n SetQueryReturnsAll,\n SetQueryReturnsOne,\n SetQueryReturnsColumn,\n SetValueQueryReturnsPluckColumn,\n} from '../../query';\nimport { QueryData } from '../../query-data';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { MaybeArray, RecordUnknown } from '../../../utils';\nimport { _clone } from '../clone/clone';\n\nexport type CreateFromMethodNames =\n | 'createOneFrom'\n | 'insertOneFrom'\n | CreateManyFromMethodNames;\n\nexport type CreateManyFromMethodNames =\n | 'createManyFrom'\n | 'insertManyFrom'\n | 'createForEachFrom'\n | 'insertForEachFrom';\n\ninterface QueryReturningOne extends IsQuery {\n result: Column.QueryColumns;\n returnType: 'one' | 'oneOrThrow';\n}\n\ntype CreateRawOrFromResult<T extends CreateSelf> = T extends { isCount: true }\n ? T\n : T['returnType'] extends undefined | 'all'\n ? SetQueryReturnsOne<T>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumn<T>\n : T;\n\ntype InsertRawOrFromResult<T extends CreateSelf> = T['__hasSelect'] extends true\n ? T['returnType'] extends undefined | 'all'\n ? SetQueryReturnsOne<T>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumn<T>\n : T\n : SetQueryReturnsRowCount<T>;\n\ntype CreateManyFromResult<T extends CreateSelf> = T extends {\n isCount: true;\n}\n ? T\n : T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAll<T>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetValueQueryReturnsPluckColumn<T>\n : T;\n\ntype InsertManyFromResult<T extends CreateSelf> = T['__hasSelect'] extends true\n ? T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAll<T>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetValueQueryReturnsPluckColumn<T>\n : T\n : SetQueryReturnsRowCountMany<T>;\n\n/**\n * Is used by all create from queries methods.\n * Collects columns and values from the inner query and optionally from the given data,\n * calls {@link insert} with a 'from' kind of create query.\n *\n * @param query - query object.\n * @param from - inner query from which to create new records.\n * @param many - whether is createManyFrom or createForEachFrom.\n * @param queryMany - whether is createForEachFrom\n * @param data - optionally passed custom data when creating a single record.\n */\nconst insertFrom = (\n query: CreateSelf,\n from: IsQuery,\n many?: boolean,\n queryMany?: boolean,\n data?: MaybeArray<RecordUnknown>,\n): CreateSelf => {\n const ctx = createCtx();\n\n const obj =\n data &&\n (Array.isArray(data)\n ? handleManyData(query, data, ctx)\n : handleOneData(query, data, ctx));\n\n return insert(\n query,\n {\n insertFrom: from,\n columns: obj?.columns || [],\n values: obj?.values || [],\n },\n many,\n queryMany,\n );\n};\n\n/**\n * Function to collect column names from the inner query of create `from` methods.\n *\n * @param q - the creating query\n * @param from - inner query to grab the columns from.\n * @param obj - optionally passed object with specific data, only available when creating a single record.\n * @param many - whether it's for `createForEachFrom`. If no, throws if the inner query returns multiple records.\n */\nexport const getFromSelectColumns = (\n q: CreateSelf,\n from: SubQueryForSql,\n obj?: {\n columns: string[];\n values: QueryData['values'];\n },\n many?: boolean,\n): {\n columns: string[];\n queryColumnsCount: number;\n values: unknown[][];\n} => {\n if (!many && !queryTypeWithLimitOne[from.q.returnType as string]) {\n throw new Error(\n 'Cannot create based on a query which returns multiple records',\n );\n }\n\n const queryColumns = new Set<string>();\n from.q.select?.forEach((item) => {\n if (typeof item === 'string') {\n const index = item.indexOf('.');\n queryColumns.add(index === -1 ? item : item.slice(index + 1));\n } else if (item && 'selectAs' in item) {\n for (const column in item.selectAs) {\n queryColumns.add(column);\n }\n }\n });\n\n const allColumns = new Set<string>(queryColumns);\n const queryColumnsCount = queryColumns.size;\n const allValues: unknown[][] = [];\n if (obj?.columns) {\n for (const objectValues of obj.values) {\n const values: unknown[] = [];\n allValues.push(values);\n\n obj.columns.forEach((column, i) => {\n if (!queryColumns.has(column)) {\n allColumns.add(column);\n values.push(objectValues[i]);\n }\n });\n }\n }\n\n for (const key of queryColumns) {\n const column = q.shape[key] as unknown as Column.Pick.Data;\n if (column) throwOnReadOnly(from, column, key);\n }\n\n return {\n columns: [...allColumns],\n queryColumnsCount,\n values: allValues,\n };\n};\n\nexport const _queryCreateOneFrom = <\n T extends CreateSelf,\n Q extends QueryReturningOne,\n>(\n q: T,\n query: Q,\n data?: Omit<CreateData<T>, keyof Q['result']>,\n): CreateRawOrFromResult<T> => {\n createSelect(q as unknown as Query);\n return insertFrom(q, query, false, false, data) as never;\n};\n\nexport const _queryInsertOneFrom = <\n T extends CreateSelf,\n Q extends QueryReturningOne,\n>(\n q: T,\n query: Q,\n data?: Omit<CreateData<T>, keyof Q['result']>,\n): InsertRawOrFromResult<T> => {\n return insertFrom(q, query, false, false, data) as never;\n};\n\nexport const _queryCreateManyFrom = <\n T extends CreateSelf,\n Q extends QueryReturningOne,\n>(\n q: T,\n query: Q,\n data: Omit<CreateData<T>, keyof Q['result']>[],\n): CreateManyFromResult<T> => {\n createSelect(q as unknown as Query);\n return insertFrom(q, query, true, false, data) as never;\n};\n\nexport const _queryInsertManyFrom = <\n T extends CreateSelf,\n Q extends QueryReturningOne,\n>(\n q: T,\n query: Q,\n data: Omit<CreateData<T>, keyof Q['result']>[],\n): InsertManyFromResult<T> => {\n return insertFrom(q, query, true, false, data) as never;\n};\n\nexport const _queryCreateForEachFrom = <T extends CreateSelf>(\n q: T,\n query: IsQuery,\n): CreateManyFromResult<T> => {\n createSelect(q as unknown as Query);\n return insertFrom(q, query, true, true) as never;\n};\n\nexport const _queryInsertForEachFrom = <T extends CreateSelf>(\n q: T,\n query: IsQuery,\n): InsertManyFromResult<T> => {\n return insertFrom(q, query, true, true) as never;\n};\n\nexport class QueryCreateFrom {\n /**\n * Inserts a single record based on a query that selects a single record.\n *\n * Performs a single SQL query based on `INSERT ... SELECT ... FROM`.\n *\n * See {@link createManyFrom} to insert multiple records based on a single record query,\n * and {@link createForEachFrom} to insert a record per every one found by the query.\n *\n * The first argument is a query of a **single** record, it should have `find`, `take`, or similar.\n *\n * The second optional argument is a data which will be merged with columns returned by the query.\n *\n * The data for the second argument is the same as in {@link create}.\n *\n * Columns with runtime defaults (defined with a callback) are supported here.\n * The value for such a column will be injected unless selected from a related table or provided in a data object.\n *\n * ```ts\n * const oneRecord = await db.table.createOneFrom(\n * db.relatedTable\n * // use select to map columns from one table to another\n * .select({\n * // relatedTable's id will be inserted as \"relatedId\"\n * relatedId: 'id',\n * })\n * .findBy({ key: 'value' }),\n * // optional argument:\n * {\n * key: 'value',\n * // supports sql, nested select, create, update, delete queries\n * fromSql: () => sql`custom sql`,\n * fromQuery: () => db.otherTable.find(id).update(data).get('column'),\n * fromRelated: (q) => q.relatedTable.create(data).get('column'),\n * },\n * );\n * ```\n *\n * The query above will produce such a SQL (omitting `from*` values):\n *\n * ```sql\n * INSERT INTO \"table\"(\"relatedId\", \"key\")\n * SELECT \"relatedTable\".\"id\" AS \"relatedId\", 'value'\n * FROM \"relatedTable\"\n * WHERE \"relatedTable\".\"key\" = 'value'\n * LIMIT 1\n * RETURNING *\n * ```\n *\n * @param query - query to create new records from\n * @param data - additionally you can set some columns\n */\n createOneFrom<T extends CreateSelf, Q extends QueryReturningOne>(\n this: T,\n query: Q,\n data?: Omit<CreateData<T>, keyof Q['result']>,\n ): CreateRawOrFromResult<T> {\n return _queryCreateOneFrom(_clone(this) as never, query, data);\n }\n\n /**\n * Works exactly as {@link createOneFrom}, except that it returns inserted row count by default.\n *\n * @param query - query to create new records from\n * @param data - additionally you can set some columns\n */\n insertOneFrom<T extends CreateSelf, Q extends QueryReturningOne>(\n this: T,\n query: Q,\n data?: Omit<CreateData<T>, keyof Q['result']>,\n ): InsertRawOrFromResult<T> {\n return _queryInsertOneFrom(_clone(this) as never, query, data);\n }\n\n /**\n * Inserts multiple records based on a query that selects a single record.\n *\n * Performs a single SQL query based on `INSERT ... SELECT ... FROM`.\n *\n * See {@link createOneFrom} to insert a single record based on a single record query,\n * and {@link createForEachFrom} to insert a record per every one found by the query.\n *\n * The first argument is a query of a **single** record, it should have `find`, `take`, or similar.\n *\n * The second argument is array of objects to be merged with columns returned by the query.\n *\n * The data for the second argument is the same as in {@link createMany}.\n *\n * Columns with runtime defaults (defined with a callback) are supported here.\n * The value for such a column will be injected unless selected from a related table or provided in a data object.\n *\n * ```ts\n * const twoRecords = await db.table.createManyFrom(\n * db.relatedTable\n * // use select to map columns from one table to another\n * .select({\n * // relatedTable's id will be inserted as \"relatedId\"\n * relatedId: 'id',\n * })\n * .findBy({ key: 'value' }),\n * [\n * {\n * key: 'value 1',\n * // supports sql, nested select, create, update, delete queries\n * fromSql: () => sql`custom sql`,\n * fromQuery: () => db.otherTable.find(id).update(data).get('column'),\n * fromRelated: (q) => q.relatedTable.create(data).get('column'),\n * },\n * {\n * key: 'value 2',\n * },\n * ],\n * );\n * ```\n *\n * The query above will produce such a SQL (omitting `from*` values):\n *\n * ```sql\n * WITH \"relatedTable\" AS (\n * SELECT \"relatedTable\".\"id\" AS \"relatedId\", 'value'\n * FROM \"relatedTable\"\n * WHERE \"relatedTable\".\"key\" = 'value'\n * LIMIT 1\n * )\n * INSERT INTO \"table\"(\"relatedId\", \"key\")\n * SELECT \"relatedTable\".*, v.\"key\"::text\n * FROM \"relatedTable\", (VALUES ('value1'), ('value2')) v(\"key\")\n * RETURNING *\n * ```\n *\n * @param query - query to create new records from\n * @param data - array of records to create\n */\n createManyFrom<T extends CreateSelf, Q extends QueryReturningOne>(\n this: T,\n query: Q,\n data: Omit<CreateData<T>, keyof Q['result']>[],\n ): CreateManyFromResult<T> {\n return _queryCreateManyFrom(_clone(this) as never, query, data);\n }\n\n /**\n * Works exactly as {@link createManyFrom}, except that it returns inserted row count by default.\n *\n * @param query - query to create new records from\n * @param data - array of records to create\n */\n insertManyFrom<T extends CreateSelf, Q extends QueryReturningOne>(\n this: T,\n query: Q,\n data: Omit<CreateData<T>, keyof Q['result']>[],\n ): InsertManyFromResult<T> {\n return _queryInsertManyFrom(_clone(this) as never, query, data);\n }\n\n /**\n * Inserts a single record per every record found in a given query.\n *\n * Performs a single SQL query based on `INSERT ... SELECT ... FROM`.\n *\n * Unlike {@link createOneFrom}, it doesn't accept second argument with data.\n *\n * Runtime defaults cannot work with it.\n *\n * ```ts\n * const manyRecords = await db.table.createForEachFrom(\n * db.relatedTable.select({ relatedId: 'id' }).where({ key: 'value' }),\n * );\n * ```\n *\n * @param query - query to create new records from\n */\n createForEachFrom<T extends CreateSelf>(\n this: T,\n query: IsQuery,\n ): CreateManyFromResult<T> {\n return _queryCreateForEachFrom(_clone(this) as never, query);\n }\n\n /**\n * Works exactly as {@link createForEachFrom}, except that it returns inserted row count by default.\n *\n * @param query - query to create new records from\n */\n insertForEachFrom<T extends CreateSelf>(\n this: T,\n query: IsQuery,\n ): InsertManyFromResult<T> {\n return _queryInsertForEachFrom(_clone(this) as never, query);\n }\n}\n","import { IsQuery, IsSubQuery, Query, QueryReturnType } from '../../query';\nimport { pushQueryArrayImmutable } from '../../query.utils';\nimport { Column } from '../../../columns/column';\nimport { _queryNone } from '../../extra-features/none/none';\nimport { EmptyObject, UnionToIntersection } from '../../../utils';\nimport {\n PickQueryDefaultSelect,\n PickQueryHasSelect,\n PickQueryQ,\n PickQueryRelations,\n PickQueryRelationsWithData,\n PickQueryResult,\n PickQueryReturnType,\n PickQuerySelectable,\n PickQueryShape,\n PickQueryWithData,\n} from '../../pick-query-types';\nimport { Expression } from '../../expressions/expression';\nimport { ColumnsShape } from '../../../columns/columns-shape';\nimport { _clone } from '../clone/clone';\nimport { processSelectArg } from './select.utils';\nimport { SelectItem } from './select.sql';\nimport { QueryThenByReturnType } from '../../then/then';\n\nexport interface SelectSelf\n extends PickQuerySelectable,\n PickQueryHasSelect,\n PickQueryDefaultSelect,\n PickQueryShape,\n PickQueryRelations,\n PickQueryResult,\n PickQueryReturnType,\n PickQueryWithData {}\n\n// .select method argument.\nexport type SelectArg<T extends SelectSelf> = '*' | keyof T['__selectable'];\n\nexport type SelectArgs<T extends SelectSelf> = (\n | '*'\n | keyof T['__selectable']\n)[];\n\ninterface SubQueryAddition<T extends PickQueryWithData> extends IsSubQuery {\n withData: T['withData']; // to refer to the outside `.with` from a relation query\n}\n\nexport type SelectAsFnArg<T extends PickQueryRelationsWithData> =\n EmptyObject extends T['relations']\n ? T\n : {\n [K in keyof T['relations'] | keyof T]: K extends keyof T['relations']\n ? T['relations'][K]['maybeSingle'] & SubQueryAddition<T>\n : K extends keyof T\n ? T[K]\n : never;\n };\n\n// .select method object argument.\n// Key is alias for selected item,\n// value can be a column, raw, or a function returning query or raw.\nexport interface SelectAsArg<T extends SelectSelf> {\n [K: string]:\n | keyof T['__selectable']\n | Expression\n | ((q: SelectAsFnArg<T>) => unknown);\n}\n\ntype SelectAsFnReturnType =\n | {\n result: Column.QueryColumns;\n returnType: Exclude<QueryReturnType, 'rows'>;\n }\n | Expression;\n\ninterface SelectAsCheckReturnTypes {\n [K: string]: PropertyKey | Expression | ((q: never) => SelectAsFnReturnType);\n}\n\ntype SelectReturnType<T extends PickQueryReturnType> =\n T['returnType'] extends 'valueOrThrow'\n ? 'oneOrThrow'\n : T extends 'value'\n ? 'one'\n : T['returnType'] extends 'pluck'\n ? 'all'\n : T['returnType'];\n\n// Result type of select without the ending object argument.\ntype SelectResult<T extends SelectSelf, Columns extends PropertyKey[]> = {\n [K in keyof T]: K extends '__hasSelect'\n ? true\n : K extends 'result'\n ? {\n [K in '*' extends Columns[number]\n ? Exclude<Columns[number], '*'> | T['__defaultSelect']\n : Columns[number] as T['__selectable'][K]['as']]: T['__selectable'][K]['column'];\n } & (T['__hasSelect'] extends (\n T['returnType'] extends 'value' | 'valueOrThrow' ? never : true\n )\n ? Omit<T['result'], Columns[number]> // Omit is optimal\n : unknown)\n : K extends 'returnType'\n ? SelectReturnType<T>\n : K extends 'then'\n ? QueryThenByReturnType<\n SelectReturnType<T>,\n // the result is copy-pasted to save on TS instantiations\n {\n [K in '*' extends Columns[number]\n ? Exclude<Columns[number], '*'> | T['__defaultSelect']\n : Columns[number] as T['__selectable'][K]['as']]: T['__selectable'][K]['column'];\n } & (T['__hasSelect'] extends (\n T['returnType'] extends 'value' | 'valueOrThrow' ? never : true\n )\n ? Omit<T['result'], Columns[number]>\n : unknown)\n >\n : T[K];\n};\n\ntype SelectResultObj<\n T extends SelectSelf,\n Obj,\n> = Obj extends SelectAsCheckReturnTypes\n ? {\n [K in keyof T]: K extends '__hasSelect'\n ? true\n : K extends '__selectable'\n ? T['__selectable'] & SelectAsSelectable<Obj>\n : K extends 'result'\n ? // Combine previously selected items, all columns if * was provided,\n // and the selected by string and object arguments.\n {\n [K in T['__hasSelect'] extends (\n T['returnType'] extends 'value' | 'valueOrThrow' ? never : true\n )\n ? keyof Obj | keyof T['result']\n : keyof Obj]: K extends keyof Obj\n ? SelectAsValueResult<T, Obj[K]>\n : K extends keyof T['result']\n ? T['result'][K]\n : never;\n }\n : K extends 'returnType'\n ? SelectReturnType<T>\n : K extends 'then'\n ? QueryThenByReturnType<\n SelectReturnType<T>,\n // result is copy-pasted to save on TS instantiations\n {\n [K in T['__hasSelect'] extends (\n T['returnType'] extends 'value' | 'valueOrThrow' ? never : true\n )\n ? keyof Obj | keyof T['result']\n : keyof Obj]: K extends keyof Obj\n ? SelectAsValueResult<T, Obj[K]>\n : K extends keyof T['result']\n ? T['result'][K]\n : never;\n }\n >\n : T[K];\n }\n : `Invalid return type of ${{\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [K in keyof Obj]: Obj[K] extends (...args: any[]) => any\n ? ReturnType<Obj[K]> extends SelectAsFnReturnType\n ? never\n : K\n : never;\n }[keyof Obj] &\n string}`;\n\n// Result type of select with the ending object argument.\ntype SelectResultColumnsAndObj<\n T extends SelectSelf,\n Columns extends PropertyKey[],\n Obj,\n> = {\n [K in keyof T]: K extends '__hasSelect'\n ? true\n : K extends '__selectable'\n ? T['__selectable'] & SelectAsSelectable<Obj>\n : K extends 'result'\n ? // Combine previously selected items, all columns if * was provided,\n // and the selected by string and object arguments.\n {\n [K in\n | ('*' extends Columns[number]\n ? Exclude<Columns[number], '*'> | T['__defaultSelect']\n : Columns[number])\n | keyof Obj as K extends Columns[number]\n ? T['__selectable'][K]['as']\n : K]: K extends keyof Obj\n ? SelectAsValueResult<T, Obj[K]>\n : T['__selectable'][K]['column'];\n } & (T['__hasSelect'] extends (\n T['returnType'] extends 'value' | 'valueOrThrow' ? never : true\n )\n ? Omit<T['result'], Columns[number]>\n : unknown)\n : K extends 'returnType'\n ? SelectReturnType<T>\n : K extends 'then'\n ? QueryThenByReturnType<\n SelectReturnType<T>,\n // result is copy-pasted to save on TS instantiations\n {\n [K in\n | ('*' extends Columns[number]\n ? Exclude<Columns[number], '*'> | T['__defaultSelect']\n : Columns[number])\n | keyof Obj as K extends Columns[number]\n ? T['__selectable'][K]['as']\n : K]: K extends keyof Obj\n ? SelectAsValueResult<T, Obj[K]>\n : T['__selectable'][K]['column'];\n } & (T['__hasSelect'] extends (\n T['returnType'] extends 'value' | 'valueOrThrow' ? never : true\n )\n ? Omit<T['result'], Columns[number]>\n : unknown)\n >\n : T[K];\n};\n\n// To allow where-ing on a relation that returns a single value.\n// Where-ing is allowed because relation is joined and the value is not JSON-ed.\n\n// To allow where-ing on a relation that returns a single record.\n// Where-ing is allowed because relation is joined and the row is not JSON-ed unlike selecting multiple rows.\ninterface AllowedRelationOneQueryForSelectable extends IsSubQuery {\n result: Column.QueryColumns;\n returnType: 'value' | 'valueOrThrow' | 'one' | 'oneOrThrow';\n}\n\n// Add new '__selectable' types based on the select object argument.\ntype SelectAsSelectable<Obj> = UnionToIntersection<\n {\n [K in keyof Obj]: Obj[K] extends ((\n q: never,\n ) => infer R extends AllowedRelationOneQueryForSelectable)\n ? {\n [C in R['returnType'] extends 'value' | 'valueOrThrow'\n ? K\n : keyof R['result'] as R['returnType'] extends\n | 'value'\n | 'valueOrThrow'\n ? K\n : `${K & string}.${C & string}`]: {\n as: C;\n column: R['returnType'] extends 'value' | 'valueOrThrow'\n ? R['result']['value']\n : R['result'][C & keyof R['result']];\n };\n }\n : never;\n }[keyof Obj]\n>;\n\n// map a single value of select object arg into a column\ntype SelectAsValueResult<\n T extends SelectSelf,\n Arg,\n> = Arg extends keyof T['__selectable']\n ? T['__selectable'][Arg]['column']\n : Arg extends Expression\n ? Arg['result']['value']\n : Arg extends (q: never) => IsQuery\n ? SelectSubQueryResult<ReturnType<Arg>>\n : Arg extends (q: never) => Expression\n ? ReturnType<Arg>['result']['value']\n : Arg extends (q: never) => IsQuery | Expression\n ?\n | SelectSubQueryResult<Exclude<ReturnType<Arg>, Expression>>\n | Exclude<ReturnType<Arg>, IsQuery>['result']['value']\n : never;\n\n// map a sub query result into a column\n// query that returns many becomes an array column\n// query that returns a single value becomes a column of that value\n// query that returns 'pluck' becomes a column with array type of specific value type\n// query that returns a single record becomes an object column, possibly nullable\nexport type SelectSubQueryResult<Arg extends SelectSelf> =\n Arg['returnType'] extends undefined | 'all'\n ? ColumnsShape.MapToObjectArrayColumn<Arg['result']>\n : Arg['returnType'] extends 'value' | 'valueOrThrow'\n ? Arg['result']['value']\n : Arg['returnType'] extends 'pluck'\n ? ColumnsShape.MapToPluckColumn<Arg['result']>\n : Arg['returnType'] extends 'one'\n ? ColumnsShape.MapToNullableObjectColumn<Arg['result']>\n : ColumnsShape.MapToObjectColumn<Arg['result']>;\n\nexport function _querySelect<\n T extends SelectSelf,\n Columns extends SelectArgs<T>,\n>(q: T, columns: Columns): SelectResult<T, Columns>;\nexport function _querySelect<T extends SelectSelf, Obj extends SelectAsArg<T>>(\n q: T,\n obj: Obj,\n): SelectResultObj<T, Obj>;\nexport function _querySelect<\n T extends SelectSelf,\n Columns extends SelectArgs<T>,\n Obj extends SelectAsArg<T>,\n>(\n q: T,\n args: [...columns: Columns, obj: Obj],\n): SelectResultColumnsAndObj<T, Columns, Obj>;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function _querySelect(q: Query, args: any[]): any {\n if (q.q.returning) {\n q.q.select = q.q.returning = undefined;\n }\n\n const { returnType } = q.q;\n if (returnType === 'valueOrThrow') {\n q.q.returnType = q.q.returningMany ? 'all' : 'oneOrThrow';\n } else if (returnType === 'value') {\n q.q.returnType = q.q.returningMany ? 'all' : 'one';\n } else if (returnType === 'void') {\n q.q.returnType = q.q.returningMany ? 'all' : 'oneOrThrow';\n }\n\n const len = args.length;\n if (!len) {\n q.q.select ??= [];\n return q;\n }\n\n const as = q.q.as || q.table;\n const selectArgs: SelectItem[] = [];\n for (const arg of args) {\n const item = processSelectArg(q, as, arg);\n if (item) selectArgs.push(item);\n else if (item === false) return _queryNone(q);\n }\n\n return pushQueryArrayImmutable(q, 'select', selectArgs);\n}\n\nexport const _querySelectAll = (query: IsQuery) => {\n const q = query as unknown as PickQueryQ;\n q.q.select = ['*'];\n q.q.parsers = q.q.defaultParsers;\n};\n\nexport class Select {\n /**\n * Takes a list of columns to be selected, and by default, the query builder will select all columns of the table.\n *\n * The last argument can be an object. Keys of the object are column aliases, value can be a column name, sub-query, or raw SQL expression.\n *\n * ```ts\n * import { sql } from './baseTable'\n *\n * // select columns of the table:\n * db.table.select('id', 'name', { idAlias: 'id' });\n *\n * // accepts columns with table names:\n * db.table.select('user.id', 'user.name', { nameAlias: 'user.name' });\n *\n * // table name may refer to the current table or a joined table:\n * db.table\n * .join(db.message, 'authorId', 'user.id')\n * .select('user.name', 'message.text', { textAlias: 'message.text' });\n *\n * // select value from the sub-query,\n * // this sub-query should return a single record and a single column:\n * db.table.select({\n * subQueryResult: Otherdb.table.select('column').take(),\n * });\n *\n * // select raw SQL value, specify the returning type via <generic> syntax:\n * db.table.select({\n * raw: sql<number>`1 + 2`,\n * });\n *\n * // select raw SQL value, the resulting type can be set by providing a column type in such way:\n * db.table.select({\n * raw: sql`1 + 2`.type((t) => t.integer()),\n * });\n *\n * // same raw SQL query as above, but the sql is returned from a callback\n * db.table.select({\n * raw: () => sql`1 + 2`.type((t) => t.integer()),\n * });\n * ```\n *\n * When you use the ORM and defined relations, `select` can also accept callbacks with related table queries:\n *\n * ```ts\n * await db.author.select({\n * allBooks: (q) => q.books,\n * firstBook: (q) => q.books.order({ createdAt: 'ASC' }).take(),\n * booksCount: (q) => q.books.count(),\n * });\n * ```\n *\n * When you're selecting a relation that's connected via `belongsTo` or `hasOne`, it becomes available to use in `order` or in `where`:\n *\n * ```ts\n * // select books with their authors included, order by author name and filter by author column:\n * await db.books\n * .select({\n * author: (q) => q.author,\n * })\n * .order('author.name')\n * .where({ 'author.isPopular': true });\n * ```\n */\n select<T extends SelectSelf, Columns extends SelectArgs<T>>(\n this: T,\n ...args: Columns\n ): SelectResult<T, Columns>;\n select<T extends SelectSelf, Obj extends SelectAsArg<T>>(\n this: T,\n obj: Obj,\n ): SelectResultObj<T, Obj>;\n select<\n T extends SelectSelf,\n Columns extends SelectArgs<T>,\n Obj extends SelectAsArg<T>,\n >(\n this: T,\n ...args: [...columns: Columns, obj: Obj]\n ): SelectResultColumnsAndObj<T, Columns, Obj>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n select(this: SelectSelf, ...args: any[]): any {\n return _querySelect(_clone(this), args);\n }\n\n /**\n * When querying the table or creating records, all columns are selected by default,\n * but updating and deleting queries are returning affected row counts by default.\n *\n * Use `selectAll` to select all columns. If the `.select` method was applied before it will be discarded.\n *\n * ```ts\n * const selectFull = await db.table\n * .select('id', 'name') // discarded by `selectAll`\n * .selectAll();\n *\n * const updatedFull = await db.table.selectAll().where(conditions).update(data);\n *\n * const deletedFull = await db.table.selectAll().where(conditions).delete();\n * ```\n */\n selectAll<T extends SelectSelf>(this: T): SelectResult<T, ['*']> {\n const q = _clone(this);\n _querySelectAll(q);\n if (q.q.returning) {\n q.q.returnType = q.q.returningMany ? 'all' : 'oneOrThrow';\n q.q.returning = undefined;\n }\n return q as never;\n }\n}\n","import {\n Query,\n SetQueryReturnsColumnOptional,\n QueryTakeOptional,\n SetQueryReturnsRowCount,\n SetQueryReturnsRowCountMany,\n QueryOrExpression,\n IsQuery,\n isQuery,\n SetQueryReturnsAllResult,\n SetQueryReturnsOneResult,\n SetQueryReturnsColumnResult,\n SetQueryResult,\n SetQueryReturnsPluckColumnResult,\n} from '../../query';\nimport {\n anyShape,\n Column,\n ColumnSchemaConfig,\n VirtualColumn,\n} from '../../../columns';\nimport { isSelectingCount } from '../aggregate/aggregate';\nimport {\n CreateFromMethodNames,\n CreateManyFromMethodNames,\n getFromSelectColumns,\n} from './create-from';\nimport { _querySelectAll } from '../select/select';\nimport { prepareSubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport {\n PickQueryDefaults,\n PickQueryHasSelect,\n PickQueryInputType,\n PickQueryQ,\n PickQueryRelations,\n PickQueryResult,\n PickQueryReturnType,\n PickQueryShape,\n PickQueryUniqueProperties,\n PickQueryWithData,\n} from '../../pick-query-types';\nimport { EmptyObject, FnUnknownToUnknown, RecordUnknown } from '../../../utils';\nimport { RelationConfigDataForCreate } from '../../relations';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { _getQueryFreeAlias, _setQueryAlias } from '../as/as';\nimport { _clone } from '../clone/clone';\n\nimport { joinSubQuery } from '../join/join';\nimport { resolveSubQueryCallback } from '../../internal-features/sub-query/sub-query';\nimport { OrchidOrmInternalError } from '../../errors';\nimport { OnConflictMerge } from './insert.sql';\nimport { ToSQLQuery } from '../../sql/to-sql';\nimport { QueryData } from '../../query-data';\n\nexport interface CreateSelf\n extends IsQuery,\n PickQueryHasSelect,\n PickQueryDefaults,\n PickQueryResult,\n PickQueryRelations,\n PickQueryWithData,\n PickQueryReturnType,\n PickQueryShape,\n PickQueryUniqueProperties,\n PickQueryInputType {}\n\n// Type of argument for `create`, `createMany`, optional argument for `createOneFrom`,\n// `defaults` use a Partial of it.\n//\n// It maps `inputType` of the table into object to accept a corresponding type,\n// or raw SQL per column, or a sub-query for a column.\n//\n// It allows to omit `belongsTo` foreign keys when a `belongsTo` record is provided by a relation name.\n// For example, it allows to create with `db.book.create({ authorId: 123 })`\n// or with `db.book.create({ author: authorData })`\n//\n// It enables all forms of relation operations such as nested `create`, `connect`, etc.\nexport type CreateData<T extends CreateSelf> =\n EmptyObject extends T['relations']\n ? // if no relations, don't load TS with extra calculations\n CreateDataWithDefaults<T, keyof T['__defaults']>\n : CreateRelationsData<T>;\n\ntype CreateDataWithDefaults<\n T extends CreateSelf,\n Defaults extends PropertyKey,\n> = {\n [K in keyof T['inputType'] as K extends Defaults\n ? never\n : K]: K extends Defaults ? never : CreateColumn<T, K>;\n} & {\n [K in Defaults]?: K extends keyof T['inputType'] ? CreateColumn<T, K> : never;\n};\n\ntype CreateDataWithDefaultsForRelations<\n T extends CreateSelf,\n Defaults extends keyof T['inputType'],\n OmitFKeys extends PropertyKey,\n> = {\n [K in keyof T['inputType'] as K extends Defaults | OmitFKeys\n ? never\n : K]: K extends Defaults | OmitFKeys ? never : CreateColumn<T, K>;\n} & {\n [K in Defaults as K extends OmitFKeys ? never : K]?: CreateColumn<T, K>;\n};\n\n// Type of available variants to provide for a specific column when creating\nexport type CreateColumn<\n T extends CreateSelf,\n K extends keyof T['inputType'],\n> = T['inputType'][K] | ((q: T) => QueryOrExpression<T['inputType'][K]>);\n\n// Combine data of the table with data that can be set for relations\nexport type CreateRelationsData<T extends CreateSelf> =\n // Data except `belongsTo` foreignKeys: { name: string, fooId: number } -> { name: string }\n CreateDataWithDefaultsForRelations<\n T,\n keyof T['__defaults'],\n T['relations'][keyof T['relations']]['omitForeignKeyInCreate']\n > &\n CreateBelongsToData<T> &\n // Union of the rest relations objects, intersection is not needed here because there are no required properties:\n // { foo: object } | { bar: object }\n T['relations'][keyof T['relations']]['optionalDataForCreate'];\n\n// Intersection of objects for `belongsTo` relations:\n// ({ fooId: number } | { foo: object }) & ({ barId: number } | { bar: object })\nexport type CreateBelongsToData<T extends CreateSelf> = [\n T['relations'][keyof T['relations']]['dataForCreate'],\n] extends [never]\n ? EmptyObject\n : CreateRelationsDataOmittingFKeys<\n T,\n T['relations'][keyof T['relations']]['dataForCreate']\n >;\n\n// Intersection of relations that may omit foreign key (belongsTo):\n// ({ fooId: number } | { foo: object }) & ({ barId: number } | { bar: object })\nexport type CreateRelationsDataOmittingFKeys<\n T extends CreateSelf,\n // Collect a union of `belongsTo` relation objects.\n Union,\n> =\n // Based on UnionToIntersection from here https://stackoverflow.com/a/50375286\n (\n Union extends RelationConfigDataForCreate\n ? (\n u: // omit relation columns if they are in defaults, is tested in factory.test.ts\n Union['columns'] extends keyof T['__defaults']\n ? {\n [P in Exclude<\n Union['columns'] & keyof T['inputType'],\n keyof T['__defaults']\n >]: CreateColumn<T, P>;\n } & {\n [P in keyof T['__defaults'] & Union['columns']]?: CreateColumn<\n T,\n P\n >;\n } & Partial<Union['nested']>\n :\n | {\n [P in Union['columns'] &\n keyof T['inputType']]: CreateColumn<T, P>;\n }\n | Union['nested'],\n ) => void\n : never\n ) extends // must be handled as a function argument, belongsTo.test relies on this\n (u: infer Obj) => void\n ? Obj\n : never;\n\n// `create` method output type\n// - if `count` method is preceding `create`, will return 0 or 1 if created.\n// - If the query returns multiple, forces it to return one record.\n// - if it is a `pluck` query, forces it to return a single value\nexport type CreateResult<T extends CreateSelf> = T extends { isCount: true }\n ? T\n : T['returnType'] extends undefined | 'all'\n ? SetQueryReturnsOneResult<T, NarrowCreateResult<T>>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumnResult<T, NarrowCreateResult<T>>\n : SetQueryResult<T, NarrowCreateResult<T>>;\n\n// `insert` method output type\n// - query returns inserted row count by default.\n// - returns a record with selected columns if the query has a select.\n// - if the query returns multiple, forces it to return one record.\n// - if it is a `pluck` query, forces it to return a single value\ntype InsertResult<T extends CreateSelf> = T['__hasSelect'] extends true\n ? T['returnType'] extends undefined | 'all'\n ? SetQueryReturnsOneResult<T, NarrowCreateResult<T>>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumnResult<T, NarrowCreateResult<T>>\n : SetQueryResult<T, NarrowCreateResult<T>>\n : SetQueryReturnsRowCount<T>;\n\n// `createMany` method output type\n// - if `count` method is preceding `create`, will return 0 or 1 if created.\n// - If the query returns a single record, forces it to return multiple.\n// - otherwise, query result remains as is.\ntype CreateManyResult<T extends CreateSelf> = T extends { isCount: true }\n ? SetQueryResult<T, NarrowCreateResult<T>>\n : T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAllResult<T, NarrowCreateResult<T>>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetQueryReturnsPluckColumnResult<T, NarrowCreateResult<T>>\n : SetQueryResult<T, NarrowCreateResult<T>>;\n\n// `insertMany` method output type\n// - query returns inserted row count by default.\n// - returns records with selected columns if the query has a select.\n// - if the query returns a single record, forces it to return multiple records.\ntype InsertManyResult<T extends CreateSelf> = T['__hasSelect'] extends true\n ? T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAllResult<T, NarrowCreateResult<T>>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetQueryReturnsPluckColumnResult<T, NarrowCreateResult<T>>\n : SetQueryResult<T, NarrowCreateResult<T>>\n : SetQueryReturnsRowCountMany<T>;\n\n/**\n * When creating a record with a *belongs to* nested record,\n * un-nullify foreign key columns of the result.\n *\n * The same should work as well with any non-null columns passed to `create`, but it's to be implemented later.\n */\ntype NarrowCreateResult<T extends CreateSelf> =\n EmptyObject extends T['relations']\n ? T['result']\n : {\n [K in keyof T['result']]: K extends T['relations'][keyof T['relations']]['omitForeignKeyInCreate']\n ? Column.Pick.QueryColumnOfTypeAndOps<\n string,\n Exclude<T['result'][K]['type'], null>,\n T['result'][K]['operators']\n >\n : T['result'][K];\n };\n\n// `onConflictDoNothing()` method output type:\n// overrides query return type from 'oneOrThrow' to 'one', from 'valueOrThrow' to 'value',\n// because `ignore` won't return any data in case of a conflict.\ntype IgnoreResult<T extends CreateSelf> = T['returnType'] extends 'oneOrThrow'\n ? QueryTakeOptional<T>\n : T['returnType'] extends 'valueOrThrow'\n ? SetQueryReturnsColumnOptional<T, T['result']['value']>\n : T;\n\n// Argument of `onConflict`, can be:\n// - a unique column name\n// - an array of unique column names\n// - raw or other kind of Expression\ntype OnConflictArg<T extends PickQueryUniqueProperties> =\n | T['internal']['uniqueColumnNames']\n | T['internal']['uniqueColumnTuples']\n | Expression\n | { constraint: T['internal']['uniqueConstraints'] };\n\nexport type AddQueryDefaults<\n T extends CreateSelf,\n DefaultKeys extends PropertyKey,\n> = {\n [K in keyof T]: K extends '__defaults'\n ? { [K in keyof T['__defaults'] | DefaultKeys]: true }\n : T[K];\n};\n\n/**\n * Used by ORM to access the context of current create query.\n * Is passed to the `create` method of a {@link VirtualColumn}\n */\nexport interface CreateCtx {\n columns: Map<string, number>;\n returnTypeAll?: true;\n resultAll: RecordUnknown[];\n}\n\n// Type of `encode` of columns.\ninterface RecordEncoder {\n [K: string]: FnUnknownToUnknown;\n}\n\n// Function called by all `create` methods to override query select.\n// Clears select if query returning nothing or a count.\n// Otherwise, selects all if query doesn't have select.\nexport const createSelect = (q: Query) => {\n if (q.q.returnType === 'void' || isSelectingCount(q)) {\n q.q.select = undefined;\n } else if (!q.q.select) {\n _querySelectAll(q);\n q.q.returning = true;\n }\n};\n\ninterface CreateHandler {\n column: {\n create(\n query: CreateSelf,\n ctx: CreateCtx,\n items: RecordUnknown[],\n rowIndexes: number[],\n count: number,\n ): void;\n };\n rowIndexes: number[];\n}\n\ninterface CreateHandlers {\n [columnName: string]: CreateHandler;\n}\n\n/**\n * Processes arguments of data to create.\n * If the passed key is for a {@link VirtualColumn}, calls `create` of the virtual column.\n * Otherwise, ignores keys that aren't relevant to the table shape,\n * collects columns to the `ctx.columns` set, collects columns encoders.\n *\n * @param q - query object.\n * @param item - argument of data to create.\n * @param rowIndex - index of record's data in `createMany` args array.\n * @param ctx - context of create query to be shared with a {@link VirtualColumn}.\n * @param encoders - to collect `encode`s of columns.\n * @param createHandlers - collects column `create` functions per column having it, and collects row indexes having a value for this column\n */\nconst processCreateItem = (\n q: CreateSelf,\n item: RecordUnknown,\n rowIndex: number,\n ctx: CreateCtx,\n encoders: RecordEncoder,\n createHandlers: CreateHandlers,\n) => {\n const { shape } = (q as Query).q;\n for (const key in item) {\n const column = shape[key];\n if (!column) continue;\n\n if (column.data.virtual) {\n const virtual = column as VirtualColumn<ColumnSchemaConfig>;\n if (virtual.create) {\n if (createHandlers[key]) {\n createHandlers[key].rowIndexes.push(rowIndex);\n } else {\n createHandlers[key] = {\n column: virtual,\n rowIndexes: [rowIndex],\n } as CreateHandler;\n }\n }\n continue;\n }\n\n throwOnReadOnly(q, column, key);\n\n let value = item[key];\n\n if (typeof value === 'function') {\n value = item[key] = resolveSubQueryCallback(\n q as unknown as ToSQLQuery,\n value as (q: ToSQLQuery) => ToSQLQuery,\n );\n\n if (isQuery(value)) {\n value = item[key] = joinSubQuery(\n q as Query,\n prepareSubQueryForSql(q as Query, value as Query),\n );\n }\n }\n\n if (\n !ctx.columns.has(key) &&\n ((column && !column.data.readOnly) || shape === anyShape) &&\n value !== undefined\n ) {\n ctx.columns.set(key, ctx.columns.size);\n encoders[key] = column?.data.encode as FnUnknownToUnknown;\n }\n }\n};\n\nconst runCreateHandlers = (\n q: CreateSelf,\n ctx: CreateCtx,\n data: RecordUnknown[],\n createHandlers: CreateHandlers,\n) => {\n const count = data.length;\n for (const key in createHandlers) {\n const { column, rowIndexes } = createHandlers[key];\n const items = rowIndexes.map((i) => data[i]);\n column.create(q, ctx, items, rowIndexes, count);\n }\n};\n\nexport const throwOnReadOnly = (\n q: unknown,\n column: Column.Pick.Data,\n key: string,\n) => {\n if (column.data.appReadOnly || column.data.readOnly) {\n throw new OrchidOrmInternalError(\n q as Query,\n 'Trying to insert a readonly column',\n { column: key },\n );\n }\n};\n\n// Creates a new context of create query.\nexport const createCtx = (): CreateCtx => ({\n columns: new Map(),\n resultAll: undefined as unknown as RecordUnknown[],\n});\n\n/**\n * Processes arguments of `create`, `insert`, `createOneFrom` and `insertOneFrom` when it has data.\n * Apply defaults that may be present on a query object to the data.\n * Maps data object into array of values, encodes values when the column has an encoder.\n *\n * @param q - query object.\n * @param data - argument with data for create.\n * @param ctx - context of the create query.\n */\nexport const handleOneData = (\n q: CreateSelf,\n data: RecordUnknown,\n ctx: CreateCtx,\n): { columns: string[]; values: unknown[][] } => {\n const encoders: RecordEncoder = {};\n const defaults = (q as Query).q.defaults;\n\n data = defaults ? { ...defaults, ...data } : { ...data };\n\n const createHandlers: CreateHandlers = {};\n\n processCreateItem(q, data, 0, ctx, encoders, createHandlers);\n\n runCreateHandlers(q, ctx, [data], createHandlers);\n\n const columns = Array.from(ctx.columns.keys());\n const values = [\n columns.map((key) =>\n // undefined values were stripped and no need to check for them\n encoders[key] && !isExpression(data[key]) && data[key] !== null\n ? encoders[key](data[key])\n : data[key],\n ),\n ];\n\n return { columns, values };\n};\n\n/**\n * Processes arguments of `createMany`, `insertMany`.\n * Apply defaults that may be present on a query object to the data.\n * Maps data objects into array of arrays of values, encodes values when the column has an encoder.\n *\n * @param q - query object.\n * @param data - arguments with data for create.\n * @param ctx - context of the create query.\n */\nexport const handleManyData = (\n q: CreateSelf,\n data: RecordUnknown[],\n ctx: CreateCtx,\n): { columns: string[]; values: unknown[][] } => {\n const encoders: RecordEncoder = {};\n const defaults = (q as Query).q.defaults;\n\n data = data.map(\n defaults ? (item) => ({ ...defaults, ...item }) : (item) => ({ ...item }),\n );\n\n const createHandlers: CreateHandlers = {};\n\n const len = data.length;\n for (let i = 0; i < len; i++) {\n processCreateItem(q, data[i], i, ctx, encoders, createHandlers);\n }\n\n runCreateHandlers(q, ctx, data, createHandlers);\n\n const values = Array(data.length);\n const columns = Array.from(ctx.columns.keys());\n\n for (let i = 0; i < len; i++) {\n const item = data[i];\n (values as unknown[][])[i] = columns.map((key) =>\n encoders[key] && item[key] !== undefined && !isExpression(item[key])\n ? encoders[key](item[key])\n : item[key],\n );\n }\n\n return { columns, values };\n};\n\n/**\n * Core function that is used by all `create` and `insert` methods.\n * Sets query `type` to `insert` for `toSQL` to know it's for inserting.\n * Sets query columns and values.\n * Sets query kind, which is checked by `update` method when returning a query from callback.\n * Overrides query return type according to what is current create method supposed to return.\n *\n * @param self - query object.\n * @param columns - columns list of all values.\n * @param insertFrom - query of `createFrom` and alike\n * @param values - array of arrays matching columns\n * @param many - whether it's for creating one or many.\n * @param queryMany - whether is createForEachFrom\n */\nexport const insert = (\n self: CreateSelf,\n {\n columns,\n insertFrom,\n values,\n }: {\n insertFrom?: IsQuery;\n columns: string[];\n values: QueryData['values'];\n },\n many?: boolean,\n queryMany?: boolean,\n) => {\n const { q } = self as unknown as { q: QueryData };\n\n if (!q.select?.length) {\n q.returning = true;\n }\n\n q.type = 'insert';\n\n insertFrom = insertFrom\n ? (q.insertFrom = prepareSubQueryForSql(self as never, insertFrom as Query))\n : q.insertFrom;\n\n if (insertFrom) {\n if (q.insertFrom) {\n const obj = getFromSelectColumns(\n self,\n q.insertFrom,\n {\n columns,\n values,\n },\n queryMany,\n );\n columns = obj.columns;\n values = obj.values;\n q.queryColumnsCount = obj.queryColumnsCount;\n }\n\n if (values.length > 1) {\n const insertValuesAs = _getQueryFreeAlias(q, 'v');\n _setQueryAlias(self as Query, 'v', insertValuesAs);\n\n q.insertValuesAs = insertValuesAs;\n }\n }\n\n q.columns = columns;\n q.values = values;\n\n const { select, returnType } = q;\n\n if (!select) {\n if (returnType !== 'void') {\n q.returnType = 'valueOrThrow';\n if (many) q.returningMany = true;\n }\n } else if (many) {\n if (returnType === 'one' || returnType === 'oneOrThrow') {\n q.returnType = 'all';\n } else if (returnType === 'value' || returnType === 'valueOrThrow') {\n q.returnType = 'pluck';\n }\n } else if (!returnType || returnType === 'all') {\n q.returnType = insertFrom ? (insertFrom as Query).q.returnType : 'one';\n } else if (returnType === 'pluck') {\n q.returnType = 'valueOrThrow';\n }\n\n return self;\n};\n\nexport const _queryCreate = <T extends CreateSelf>(\n q: T,\n data: CreateData<T>,\n): CreateResult<T> => {\n createSelect(q as unknown as Query);\n return _queryInsert(q, data) as never;\n};\n\nexport const _queryInsert = <T extends CreateSelf>(\n query: T,\n data: CreateData<T>,\n): InsertResult<T> => {\n const ctx = createCtx();\n const obj = handleOneData(query, data, ctx) as {\n columns: string[];\n values: QueryData['values'];\n };\n\n return insert(query, obj) as never;\n};\n\nexport const _queryCreateMany = <T extends CreateSelf>(\n q: T,\n data: CreateData<T>[],\n): CreateManyResult<T> => {\n createSelect(q as unknown as Query);\n return _queryInsertMany(q, data as never) as never;\n};\n\nexport const _queryInsertMany = <T extends CreateSelf>(\n q: T,\n data: CreateData<T>[],\n): InsertManyResult<T> => {\n const ctx = createCtx();\n let result = insert(q, handleManyData(q, data, ctx), true) as never;\n if (!data.length) result = (result as Query).none() as never;\n return result;\n};\n\nexport const _queryDefaults = <\n T extends CreateSelf,\n Data extends Partial<CreateData<T>>,\n>(\n q: T,\n data: Data,\n): AddQueryDefaults<T, keyof Data> => {\n (q as unknown as Query).q.defaults = data;\n return q as never;\n};\n\n/**\n * Names of all create methods,\n * is used in relational query to remove these methods if chained relation shouldn't have them,\n * for the case of has one/many through.\n */\nexport type CreateMethodsNames =\n | 'create'\n | 'insert'\n | 'createMany'\n | 'insertMany'\n | CreateFromMethodNames;\n\nexport type CreateManyMethodsNames =\n | 'createMany'\n | 'insertMany'\n | CreateManyFromMethodNames;\n\nexport class QueryCreate {\n /**\n * `create` and `insert` create a single record.\n *\n * Use `select`, `selectAll`, `get`, or `pluck` alongside `create` or `insert` to\n * specify returning columns.\n *\n * Each column may accept a specific value, a raw SQL, or a query that returns a single value.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * const oneRecord = await db.table.create({\n * name: 'John',\n * password: '1234',\n * });\n *\n * // When using `.onConflictDoNothing()`,\n * // the record may be not created and the `createdCount` will be 0.\n * const createdCount = await db.table.insert(data).onConflictDoNothing();\n *\n * await db.table.create({\n * // raw SQL\n * column1: () => sql`'John' || ' ' || 'Doe'`,\n *\n * // query that returns a single value\n * // returning multiple values will result in Postgres error\n * column2: () => db.otherTable.get('someColumn'),\n *\n * // nesting creates, updates, deletes produces a single SQL\n * column4: () => db.otherTable.create(data).get('someColumn'),\n * column5: (q) => q.relatedTable.find(id).update(data).get('someColumn'),\n * });\n * ```\n *\n * Creational methods can be used in {@link WithMethods.with} expressions:\n *\n * ```ts\n * db.$qb\n * // create a record in one table\n * .with('a', db.table.select('id').create(data))\n * // create a record in other table using the first table record id\n * .with('b', (q) =>\n * db.otherTable.select('id').create({\n * ...otherData,\n * aId: () => q.from('a').get('id'),\n * }),\n * )\n * .from('b');\n * ```\n *\n * @param data - data for the record, may have values, raw SQL, queries, relation operations.\n */\n create<T extends CreateSelf>(this: T, data: CreateData<T>): CreateResult<T> {\n return _queryCreate(_clone(this), data) as never;\n }\n\n /**\n * Works exactly as {@link create}, except that it returns inserted row count by default.\n *\n * @param data - data for the record, may have values, raw SQL, queries, relation operations.\n */\n insert<T extends CreateSelf>(this: T, data: CreateData<T>): InsertResult<T> {\n return _queryInsert(_clone(this), data) as never;\n }\n\n /**\n * `createMany` and `insertMany` will create a batch of records.\n *\n * Each column may be set with a specific value, a raw SQL, or a query, the same as in {@link create}.\n *\n * In case one of the objects has fewer fields, the `DEFAULT` SQL keyword will be placed in its place in the `VALUES` statement.\n *\n * ```ts\n * const manyRecords = await db.table.createMany([\n * { key: 'value', otherKey: 'other value' },\n * { key: 'value' }, // default will be used for `otherKey`\n * ]);\n *\n * // `createdCount` will be 3.\n * const createdCount = await db.table.insertMany([data, data, data]);\n * ```\n *\n * When nesting creates, a separate create query will be executed for every time it's used:\n *\n * ```ts\n * // will be performed twice, even though it is defined once\n * const nestedCreate = db.otherTable.create(data).get('column');\n *\n * await db.table.createMany([{ column: nestedCreate }, { column: nestedCreate }]);\n * ```\n *\n * Because of a limitation of Postgres protocol, queries having more than **65535** of values are going to fail in runtime.\n * To solve this seamlessly, `OrchidORM` will automatically batch such queries, and wrap them into a transaction, unless they are already in a transaction.\n *\n * ```ts\n * // OK: executes 2 inserts wrapped into a transaction\n * await db.table.createMany(\n * Array.from({ length: 65536 }, () => ({ text: 'text' })),\n * );\n * ```\n *\n * However, this only works in the case shown above. This **won't** work if you're using the `createMany` in `with` statement,\n * or if the insert is used as a sub-query in other query part.\n *\n * @param data - array of records data, may have values, raw SQL, queries, relation operations\n */\n createMany<T extends CreateSelf>(\n this: T,\n data: CreateData<T>[],\n ): CreateManyResult<T> {\n return _queryCreateMany(_clone(this), data) as never;\n }\n\n /**\n * Works exactly as {@link createMany}, except that it returns inserted row count by default.\n *\n * @param data - array of records data, may have values, raw SQL, queries, relation operations\n */\n insertMany<T extends CreateSelf>(\n this: T,\n data: CreateData<T>[],\n ): InsertManyResult<T> {\n return _queryInsertMany(_clone(this), data) as never;\n }\n\n /**\n * `defaults` allows setting values that will be used later in `create`.\n *\n * Columns provided in `defaults` are marked as optional in the following `create`.\n *\n * Default data is the same as in {@link create} and {@link createMany},\n * so you can provide a raw SQL, or a query with a query.\n *\n * ```ts\n * // Will use firstName from defaults and lastName from create argument:\n * db.table\n * .defaults({\n * firstName: 'first name',\n * lastName: 'last name',\n * })\n * .create({\n * lastName: 'override the last name',\n * });\n * ```\n *\n * @param data - default values for `create` and `createMany` which will follow `defaults`\n */\n defaults<T extends CreateSelf, Data extends Partial<CreateData<T>>>(\n this: T,\n data: Data,\n ): AddQueryDefaults<T, keyof Data> {\n return _queryDefaults(_clone(this) as never, data as never);\n }\n\n /**\n * By default, violating unique constraint will cause the creative query to throw,\n * you can define what to do on a conflict: to ignore it, or to merge the existing record with a new data.\n *\n * A conflict occurs when a table has a primary key or a unique index on a column,\n * or a composite primary key unique index on a set of columns,\n * and a row being created has the same value as a row that already exists in the table in this column(s).\n *\n * Use {@link onConflictDoNothing} to suppress the error and continue without updating the record,\n * or the `merge` to update the record with new values automatically,\n * or the `set` to specify own values for the update.\n *\n * `onConflict` only accepts column names that are defined in `primaryKey` or `unique` in the table definition.\n * To specify a constraint, its name also must be explicitly set in `primaryKey` or `unique` in the table code.\n *\n * Postgres has a limitation that a single `INSERT` query can have only a single `ON CONFLICT` clause that can target only a single unique constraint\n * for updating the record.\n *\n * If your table has multiple potential reasons for unique constraint violation, such as username and email columns in a user table,\n * consider using `upsert` instead.\n *\n * ```ts\n * // leave `onConflict` without argument to ignore or merge on any conflict\n * db.table.create(data).onConflictDoNothing();\n *\n * // single column:\n * // (this requires a composite primary key or unique index, see below)\n * db.table.create(data).onConflict('email').merge();\n *\n * // array of columns:\n * db.table.create(data).onConflict(['email', 'name']).merge();\n *\n * // constraint name\n * db.table.create(data).onConflict({ constraint: 'unique_index_name' }).merge();\n *\n * // raw SQL expression:\n * db.table\n * .create(data)\n * .onConflict(sql`(email) where condition`)\n * .merge();\n * ```\n *\n * :::info\n * A primary key or a unique index for a **single** column can be fined on a column:\n *\n * ```ts\n * export class MyTable extends BaseTable {\n * columns = this.setColumns((t) => ({\n * pkey: t.uuid().primaryKey(),\n * unique: t.string().unique(),\n * }));\n * }\n * ```\n *\n * But for composite primary keys or indexes (having multiple columns), define it in a separate function:\n *\n * ```ts\n * export class MyTable extends BaseTable {\n * columns = this.setColumns(\n * (t) => ({\n * one: t.integer(),\n * two: t.string(),\n * three: t.boolean(),\n * }),\n * (t) => [t.primaryKey(['one', 'two']), t.unique(['two', 'three'])],\n * );\n * }\n * ```\n * :::\n *\n * You can use the `sql` function exported from your `BaseTable` file in onConflict.\n * It can be useful to specify a condition when you have a partial index:\n *\n * ```ts\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * active: true,\n * })\n * // ignore only when having conflicting email and when active is true.\n * .onConflict(sql`(email) where active`)\n * .ignore();\n * ```\n *\n * For `merge` and `set`, you can append `where` to update data only for the matching rows:\n *\n * ```ts\n * const timestamp = Date.now();\n *\n * db.table\n * .create(data)\n * .onConflict('email')\n * .set({\n * name: 'John Doe',\n * updatedAt: timestamp,\n * })\n * .where({ updatedAt: { lt: timestamp } });\n * ```\n *\n * @param arg - optionally provide an array of columns\n */\n onConflict<T extends CreateSelf, Arg extends OnConflictArg<T>>(\n this: T,\n arg: Arg,\n ): OnConflictQueryBuilder<T, Arg> {\n return new OnConflictQueryBuilder(this, arg as never);\n }\n\n /**\n * Use `onConflictDoNothing` to suppress unique constraint violation error when creating a record.\n *\n * Adds `ON CONFLICT (columns) DO NOTHING` clause to the insert statement, columns are optional.\n *\n * Can also accept a constraint name.\n *\n * ```ts\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * })\n * // on any conflict:\n * .onConflictDoNothing()\n * // or, for a specific column:\n * .onConflictDoNothing('email')\n * // or, for a specific constraint:\n * .onConflictDoNothing({ constraint: 'unique_index_name' });\n * ```\n *\n * When there is a conflict, nothing can be returned from the database, so `onConflictDoNothing` adds `| undefined` part to the response type.\n *\n * ```ts\n * const maybeRecord: RecordType | undefined = await db.table\n * .create(data)\n * .onConflictDoNothing();\n *\n * const maybeId: number | undefined = await db.table\n * .get('id')\n * .create(data)\n * .onConflictDoNothing();\n * ```\n *\n * When creating multiple records, only created records will be returned. If no records were created, array will be empty:\n *\n * ```ts\n * // array can be empty\n * const arr = await db.table.createMany([data, data, data]).onConflictDoNothing();\n * ```\n */\n onConflictDoNothing<T extends CreateSelf, Arg extends OnConflictArg<T>>(\n this: T,\n arg?: Arg,\n ): IgnoreResult<T> {\n const q = _clone(this);\n q.q.onConflict = {\n target: arg as never,\n };\n\n if (q.q.returnType === 'oneOrThrow') {\n q.q.returnType = 'one';\n } else if (q.q.returnType === 'valueOrThrow') {\n q.q.returnType = 'value';\n }\n\n return q as never;\n }\n}\n\ntype OnConflictSet<T extends CreateSelf> = {\n [K in keyof T['inputType']]?:\n | T['inputType'][K]\n | (() => QueryOrExpression<T['inputType'][K]>);\n};\n\nexport class OnConflictQueryBuilder<\n T extends CreateSelf,\n Arg extends OnConflictArg<T> | undefined,\n> {\n constructor(private query: T, private onConflict: Arg) {}\n\n /**\n * Available only after `onConflict`.\n *\n * Updates the record with a given data when conflict occurs.\n *\n * ```ts\n * db.table\n * .create(data)\n * .onConflict('email')\n * .set({\n * // supports plain values and SQL expressions\n * key: 'value',\n * fromSql: () => sql`custom sql`,\n * })\n * // to update records only on certain conditions\n * .where({ ...certainConditions });\n * ```\n *\n * @param set - object containing new column values\n */\n set(set: OnConflictSet<T>): T {\n let resolved: RecordUnknown | undefined;\n for (const key in set) {\n const column = this.query.shape[key] as unknown as Column.Pick.Data;\n if (column) throwOnReadOnly(this.query, column, key);\n\n if (typeof set[key] === 'function') {\n if (!resolved) resolved = { ...set };\n\n resolved[key] = (set[key] as () => unknown)();\n }\n }\n\n (this.query as unknown as Query).q.onConflict = {\n target: this.onConflict as never,\n set: resolved || set,\n };\n return this.query;\n }\n\n /**\n * Available only after `onConflict`.\n *\n * Use this method to merge all the data you have passed into `create` to update the existing record on conflict.\n *\n * If the table has columns with **dynamic** default values, such values will be applied as well.\n *\n * You can exclude certain columns from being merged by passing the `except` option.\n *\n * ```ts\n * // merge the full data\n * db.table.create(data).onConflict('email').merge();\n *\n * // merge only a single column\n * db.table.create(data).onConflict('email').merge('name');\n *\n * // merge multiple columns\n * db.table.create(data).onConflict('email').merge(['name', 'quantity']);\n *\n * // merge all columns except some\n * db.table\n * .create(data)\n * .onConflict('email')\n * .merge({ except: ['name', 'quantity'] });\n *\n * // merge can be applied also for batch creates\n * db.table.createMany([data1, data2, data2]).onConflict('email').merge();\n *\n * // update records only on certain conditions\n * db.table\n * .create(data)\n * .onConflict('email')\n * .merge()\n * .where({ ...certainConditions });\n * ```\n *\n * @param merge - no argument will merge all data, or provide a column(s) to merge, or provide `except` to update all except some.\n */\n merge(\n merge?:\n | keyof T['shape']\n | (keyof T['shape'])[]\n | { except: keyof T['shape'] | (keyof T['shape'])[] },\n ): T {\n (this.query as unknown as PickQueryQ).q.onConflict = {\n target: this.onConflict as never,\n merge: merge as OnConflictMerge,\n };\n return this.query;\n }\n}\n","import {\n SetQueryReturnsRowCount,\n SetQueryReturnsRowCountMany,\n} from '../../query';\nimport { throwIfJoinLateral, throwIfNoWhere } from '../../query.utils';\nimport {\n PickQueryHasSelectResultReturnType,\n PickQueryHasWhere,\n PickQueryHasSelectHasWhereResultReturnType,\n PickQueryQ,\n} from '../../pick-query-types';\nimport { EmptyTuple } from '../../../utils';\nimport { _clone } from '../clone/clone';\n\nexport type DeleteMethodsNames = 'delete';\n\nexport type DeleteArgs<T extends PickQueryHasWhere> =\n T['__hasWhere'] extends true ? EmptyTuple : [never];\n\nexport type DeleteResult<T extends PickQueryHasSelectResultReturnType> =\n T['__hasSelect'] extends true\n ? T\n : T['returnType'] extends undefined | 'all'\n ? SetQueryReturnsRowCountMany<T>\n : SetQueryReturnsRowCount<T>;\n\nexport const _queryDelete = <T extends PickQueryHasSelectResultReturnType>(\n query: T,\n): DeleteResult<T> => {\n const q = (query as unknown as PickQueryQ).q;\n if (!q.select) {\n if (q.returnType === 'oneOrThrow' || q.returnType === 'valueOrThrow') {\n q.throwOnNotFound = true;\n }\n q.returningMany = !q.returnType || q.returnType === 'all';\n q.returnType = 'valueOrThrow';\n q.returning = true;\n }\n\n throwIfNoWhere(query as unknown as PickQueryQ, 'delete');\n throwIfJoinLateral(query as unknown as PickQueryQ, 'delete');\n\n q.type = 'delete';\n return query as never;\n};\n\nexport class QueryDelete {\n /**\n * This method deletes one or more rows, based on other conditions specified in the query.\n *\n * By default, `delete` will return a count of deleted records.\n *\n * Place `select`, `selectAll`, or `get` before `delete` to specify returning columns.\n *\n * Need to provide `where`, `findBy`, or `find` conditions before calling `delete`.\n * To prevent accidental deletion of all records, deleting without where will result in TypeScript and a runtime error.\n *\n * Use `all()` to delete ALL records without conditions:\n *\n * ```ts\n * await db.table.all().delete();\n * ```\n *\n * ```ts\n * // deletedCount is the number of deleted records\n * const deletedCount = await db.table.where(...conditions).delete();\n *\n * // returns a single value, throws if not found\n * const id: number | undefined = await db.table\n * .findBy(...conditions)\n * .get('id')\n * .delete();\n *\n * // returns an array of records with specified columns\n * const deletedRecord = await db.table\n * .select('id', 'name', 'age')\n * .where(...conditions)\n * .delete();\n *\n * // returns an array of fully deleted records\n * const deletedUsersFull = await db.table\n * .selectAll()\n * .where(...conditions)\n * .delete();\n * ```\n *\n * `delete` supports joining, under the hood the join is transformed to `USING` and `WHERE` statements:\n *\n * ```ts\n * // delete all users who have corresponding profile records:\n * db.table.join(db.profile, 'profile.userId', 'user.id').all().delete();\n * ```\n *\n * `delete` can be used in {@link WithMethods.with} expressions:\n *\n * ```ts\n * db.$qb\n * // delete a record in one table\n * .with('a', db.table.find(1).select('id').delete())\n * // delete a record in other table using the first table record id\n * .with('b', (q) =>\n * db.otherTable.select('id').whereIn('aId', q.from('a').pluck('id')).delete(),\n * )\n * .from('b');\n * ```\n */\n delete<T extends PickQueryHasSelectHasWhereResultReturnType>(\n this: T,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ..._args: DeleteArgs<T>\n ): DeleteResult<T> {\n return _queryDelete(_clone(this)) as never;\n }\n}\n","import { _queryInsert, CreateData } from './create';\nimport { UpsertResult, UpsertThis } from './upsert';\nimport {\n PickQueryHasSelectResultReturnType,\n PickQueryQ,\n} from '../../pick-query-types';\nimport { FnUnknownToUnknown, RecordUnknown } from '../../../utils';\nimport { _clone } from '../clone/clone';\n\n// `orCreate` arg type.\n// Unlike `upsert`, doesn't pass a data to `create` callback.\nexport type OrCreateArg<Data> = Data | (() => Data);\n\n// this is used by `upsert` and `orCreate` methods.\n// `updateData` and `mergeData` args are passed only by `upsert`.\nexport function _orCreate<T extends PickQueryHasSelectResultReturnType>(\n query: T,\n data: unknown | FnUnknownToUnknown,\n updateData?: unknown,\n mergeData?: unknown,\n): UpsertResult<T> {\n const { q } = query as unknown as PickQueryQ;\n q.returnsOne = true;\n if (!q.select) {\n q.returnType = 'void';\n }\n\n if (typeof data === 'function') {\n q.upsertInsert = () =>\n mergeData\n ? {\n ...mergeData,\n ...((data as FnUnknownToUnknown)(updateData) as RecordUnknown),\n }\n : (data as FnUnknownToUnknown)(updateData);\n } else {\n if (mergeData) {\n data = { ...mergeData, ...(data as RecordUnknown) };\n }\n _queryInsert(query as never, data as never);\n }\n\n q.type = 'upsert';\n\n return query as never;\n}\n\nexport class QueryOrCreate {\n /**\n * `orCreate` creates a record only if it was not found by conditions.\n *\n * `find` or `findBy` must precede `orCreate`.\n *\n * It is accepting the same argument as `create` commands.\n *\n * No result is returned by default, place `get`, `select`, or `selectAll` before `orCreate` to specify returning columns.\n *\n * ```ts\n * const user = await db.user\n * .selectAll()\n * .findBy({ email: 'some@email.com' })\n * .orCreate({\n * email: 'some@email.com',\n * name: 'created user',\n * // supports sql and nested queries\n * fromSQL: () => sql`*SQL expression*`,\n * fromQuery: () => db.someTable.create(data).get('column'),\n * fromRelated: (q) => q.relatedTable.update(data).get('column'),\n * });\n * ```\n *\n * The data can be returned from a function, it won't be called if the record was found:\n *\n * ```ts\n * const user = await db.user\n * .selectAll()\n * .findBy({ email: 'some@email.com' })\n * .orCreate(() => ({\n * email: 'some@email.com',\n * name: 'created user',\n * }));\n * ```\n *\n * `orCreate` works by performing just a single query in the case if the record exists, and one additional query when the record does not exist.\n *\n * At first, it performs a \"find\" query, the query cost is exact same as if you didn't use `orCreate`.\n *\n * Then, if the record wasn't found, it performs a single query with CTE expressions to try finding it again, for the case it was already created just a moment before,\n * and then it creates the record if it's still not found. Using such CTE allows to skip using transactions, while still conforming to atomicity.\n *\n * ```sql\n * -- first query\n * SELECT * FROM \"table\" WHERE \"key\" = 'value'\n *\n * -- the record could have been created in between these two queries\n *\n * -- second query\n * WITH find_row AS (\n * SELECT * FROM \"table\" WHERE \"key\" = 'value'\n * )\n * WITH insert_row AS (\n * INSERT INTO \"table\" (\"key\")\n * SELECT 'value'\n * -- skip the insert if the row already exists\n * WHERE NOT EXISTS (SELECT 1 FROM find_row)\n * RETURNING *\n * )\n * SELECT * FROM find_row\n * UNION ALL\n * SELECT * FROM insert_row\n * ```\n *\n * @param data - the same data as for `create`, it may be returned from a callback\n */\n orCreate<T extends UpsertThis>(\n this: T,\n data: OrCreateArg<CreateData<T>>,\n ): UpsertResult<T> {\n return _orCreate(_clone(this) as never, data);\n }\n}\n","import { Column } from '../../columns';\nimport { Expression, ExpressionData } from './expression';\nimport { Query } from '../query';\nimport { columnToSql } from '../sql/column-to-sql';\nimport { ToSQLCtx } from '../sql/to-sql';\nimport { QueryData } from '../query-data';\n\nexport class RefExpression<\n T extends Column.Pick.QueryColumn,\n> extends Expression<T> {\n result: { value: T };\n q: ExpressionData;\n table?: string;\n\n constructor(value: T, query: Query, public ref: string) {\n super();\n this.result = { value };\n this.q = query.q as ExpressionData;\n this.q.expr = this;\n this.table = query.table;\n Object.assign(this, value.operators);\n }\n\n makeSQL(ctx: ToSQLCtx): string {\n const q = this.q as QueryData;\n const as = q.as || this.table;\n return columnToSql(ctx, q, q.shape, this.ref, as && `\"${as}\"`);\n }\n}\n","import {\n isQuery,\n Query,\n QueryOrExpression,\n SetQueryReturnsAllResult,\n SetQueryReturnsPluckColumnResult,\n SetQueryReturnsRowCount,\n SetQueryReturnsRowCountMany,\n SetQueryResult,\n} from '../../query';\nimport { throwIfNoWhere, throwOnReadOnlyUpdate } from '../../query.utils';\nimport { _queryWhere, QueryHasWhere } from '../where/where';\nimport {\n anyShape,\n Column,\n ColumnSchemaConfig,\n VirtualColumn,\n} from '../../../columns';\nimport {\n _joinReturningArgs,\n JoinArgs,\n JoinCallbackArgs,\n JoinFirstArg,\n JoinResultFromArgs,\n joinSubQuery,\n} from '../join/join';\nimport { _queryNone } from '../../extra-features/none/none';\nimport {\n PickQueryAs,\n PickQueryHasSelect,\n PickQueryHasWhere,\n PickQueryInputType,\n PickQueryRelations,\n PickQueryResult,\n PickQueryReturnType,\n PickQuerySelectable,\n PickQueryShape,\n PickQueryResultReturnTypeUniqueColumns,\n PickQueryUniqueProperties,\n PickQueryWithData,\n} from '../../pick-query-types';\nimport { EmptyObject, RecordUnknown } from '../../../utils';\nimport { RelationConfigBase } from '../../relations';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { _clone } from '../clone/clone';\nimport { OrchidOrmInternalError } from '../../errors';\nimport { requirePrimaryKeys } from '../../query-columns/primary-keys';\nimport { resolveSubQueryCallback } from '../../internal-features/sub-query/sub-query';\nimport { pushQueryValueImmutable, QueryData } from '../../query-data';\nimport { ToSQLQuery } from '../../sql/to-sql';\nimport { RefExpression } from '../../expressions/ref-expression';\n\nexport interface UpdateSelf\n extends PickQuerySelectable,\n PickQueryResult,\n PickQueryRelations,\n PickQueryWithData,\n PickQueryReturnType,\n PickQueryShape,\n PickQueryInputType,\n PickQueryAs,\n PickQueryHasSelect,\n PickQueryHasWhere {}\n\n// Type of argument for `update` and `updateOrThrow`\n//\n// It maps the `inputType` of a table into object with column values.\n// The column value may be a specific value, or raw SQL, or a query returning a single value,\n// or a callback with a relation query that is returning a single value,\n// or a callback with JSON methods.\n//\n// It enables all forms of relation operations such as nested `create`, `connect`, etc.\nexport type UpdateData<T extends UpdateSelf> =\n EmptyObject extends T['relations']\n ? {\n [K in keyof T['inputType']]?: UpdateColumn<T, K>;\n }\n : {\n [K in\n | keyof T['inputType']\n | keyof T['relations']]?: K extends keyof T['inputType']\n ? UpdateColumn<T, K>\n : UpdateRelationData<T, T['relations'][K]>;\n };\n\n// Type of available variants to provide for a specific column when updating.\n// The column value may be a specific value, or raw SQL, or a query returning a single value,\n// or a callback with a relation query that is returning a single value,\n// or a callback with JSON methods.\ntype UpdateColumn<T extends UpdateSelf, Key extends keyof T['inputType']> =\n | T['inputType'][Key]\n | ((q: {\n [K in keyof T['relations'] | keyof T]: K extends keyof T['relations']\n ? T['relations'][K]['query']\n : K extends keyof T\n ? T[K]\n : never;\n }) => QueryOrExpression<T['inputType'][Key]>);\n\n// Add relation operations to the update argument.\ntype UpdateRelationData<\n T extends UpdateSelf,\n Rel extends RelationConfigBase,\n> = T['returnType'] extends undefined | 'all'\n ? Rel['dataForUpdate']\n : Rel['dataForUpdateOne'];\n\n// Type of argument for `update`.\n// not available when there are no conditions on the query.\nexport type UpdateArg<T extends UpdateSelf> = T['__hasWhere'] extends true\n ? UpdateData<T>\n : 'Update statement must have where conditions. To update all prefix `update` with `all()`';\n\n// `update` and `updateOrThrow` methods output type.\n// Unless something was explicitly selected on the query, it's returning the count of updated records.\ntype UpdateResult<T extends UpdateSelf> = T['__hasSelect'] extends true\n ? T\n : T['returnType'] extends undefined | 'all'\n ? SetQueryReturnsRowCountMany<T>\n : SetQueryReturnsRowCount<T>;\n\nexport type NumericColumns<T extends UpdateSelf> = {\n [K in keyof T['inputType']]: Exclude<\n T['shape'][K]['queryType'],\n string\n > extends number | bigint | null\n ? K\n : never;\n}[keyof T['inputType']];\n\n// `increment` and `decrement` methods argument type.\n// Accepts a column name to change, or an object with column names and number values to increment or decrement with.\nexport type ChangeCountArg<T extends UpdateSelf> =\n | NumericColumns<T>\n | {\n [K in NumericColumns<T>]?: T['shape'][K]['type'] extends number | null\n ? number\n : number | string | bigint;\n };\n\n// `type` instead of `interface`: PickQueryResultReturnTypeUniqueColumns and\n// PickQueryUniqueProperties both declare `internal` with different shapes,\n// which `interface extends` cannot merge.\ntype UpdateManyBySelf = UpdateSelf &\n PickQueryResultReturnTypeUniqueColumns &\n PickQueryUniqueProperties;\n\n// Data type for updateMany / updateManyOptional (PK-based)\ntype UpdateManyData<T extends UpdateSelf> = ({\n [K in keyof T['shape'] as T['shape'][K] extends {\n data: { primaryKey: string };\n }\n ? K\n : never]: T['shape'][K]['queryType'] | Expression;\n} & {\n [P in keyof T['inputType']]?: T['inputType'][P] | Expression;\n})[];\n\n// Valid keys for updateManyBy: a single unique column name or a compound tuple\ntype UpdateManyByKeys<T extends UpdateManyBySelf> =\n | T['internal']['uniqueColumnNames']\n | T['internal']['uniqueColumnTuples'];\n\n// Extract key column names from a string or tuple\ntype UpdateManyByKeyColumns<Keys> = Keys extends string\n ? Keys\n : Keys extends unknown[]\n ? Keys[number] & string\n : never;\n\n// Data type for updateManyBy / updateManyByOptional (custom keys)\n// Inlined to minimize mapped type instantiations\ntype UpdateManyByData<T extends UpdateSelf, K extends string> = ({\n [P in K & keyof T['inputType']]-?: T['inputType'][P];\n} & {\n [P in keyof T['inputType'] as P extends K ? never : P]?:\n | T['inputType'][P]\n | Expression;\n})[];\n\n// Return type for updateMany/updateManyBy — mirrors InsertManyResult\ntype UpdateManyResult<T extends UpdateSelf> = T['__hasSelect'] extends true\n ? T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAllResult<T, T['result']>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetQueryReturnsPluckColumnResult<T, T['result']>\n : SetQueryResult<T, T['result']>\n : SetQueryReturnsRowCountMany<T>;\n\nconst _queryUpdateMany = <T extends UpdateSelf>(\n self: T,\n primaryKeys: string[],\n data: RecordUnknown[],\n strict: boolean,\n): T => {\n const query = self as unknown as Query;\n const { q } = query;\n const { shape } = q;\n\n q.type = 'update';\n setUpdateReturning(q);\n\n if (!data.length) {\n return _queryNone(query) as never;\n }\n\n const firstRow = data[0];\n const setColumns = Object.keys(firstRow).filter(\n (key) => !primaryKeys.includes(key) && firstRow[key] !== undefined,\n );\n\n q.updateMany = {\n primaryKeys,\n setColumns,\n data,\n strict,\n };\n\n _queryWhere(query, [\n Object.fromEntries(\n primaryKeys.map((key) => {\n const column = shape[key];\n return [\n key,\n new RefExpression(column, query, `v.${column.data.name || key}`),\n ];\n }),\n ),\n ]);\n\n return query as never;\n};\n\n// apply `increment` or a `decrement`,\n// mutates the `queryData` of a query.\nexport const _queryChangeCounter = <T extends UpdateSelf>(\n self: T,\n op: string,\n data: ChangeCountArg<T>,\n) => {\n const q = (self as unknown as Query).q;\n q.type = 'update';\n\n if (!q.select) {\n if (q.returnType === 'oneOrThrow' || q.returnType === 'valueOrThrow') {\n q.throwOnNotFound = true;\n }\n q.returningMany = !q.returnType || q.returnType === 'all';\n q.returnType = 'valueOrThrow';\n q.returning = true;\n }\n\n let map: { [K: string]: { op: string; arg: number } };\n if (typeof data === 'object') {\n map = {};\n for (const key in data) {\n map[key] = { op, arg: data[key as never] as number };\n\n const column = self.shape[key];\n if (column) {\n throwOnReadOnlyUpdate(self, column as unknown as Column.Pick.Data, key);\n }\n }\n } else {\n map = { [data as string]: { op, arg: 1 } };\n\n const column = self.shape[data as string];\n if (column) {\n throwOnReadOnlyUpdate(\n self,\n column as unknown as Column.Pick.Data,\n data as string,\n );\n }\n }\n\n pushQueryValueImmutable(self as unknown as Query, 'updateData', map);\n return self as never;\n};\n\nexport const _queryUpdate = <T extends UpdateSelf>(\n updateSelf: T,\n arg: UpdateArg<T>,\n): UpdateResult<T> => {\n const query = updateSelf as unknown as Query;\n const { q } = query;\n\n q.type = 'update';\n\n const set = { ...(arg as RecordUnknown) };\n pushQueryValueImmutable(query, 'updateData', set);\n\n const { shape } = q;\n\n let selectQuery: Query | undefined;\n\n for (const key in arg) {\n const item = shape[key];\n if (!item && shape !== anyShape) {\n delete set[key];\n } else if (item.data.virtual) {\n (item as VirtualColumn<ColumnSchemaConfig>).update?.(query, set);\n delete set[key];\n } else {\n if (item) throwOnReadOnlyUpdate(query, item, key);\n\n let value = set[key];\n if (typeof value === 'function') {\n if (!selectQuery) {\n selectQuery = query.clone();\n selectQuery.q.type = undefined;\n }\n\n value = resolveSubQueryCallback(\n selectQuery,\n value as (q: ToSQLQuery) => ToSQLQuery,\n );\n if (\n isQuery(value) &&\n (value as Query).q.type &&\n (value as Query).q.subQuery\n ) {\n throw new OrchidOrmInternalError(\n value,\n `Only selecting queries are allowed inside a callback of update, ${\n (value as Query).q.type\n } is given instead.`,\n );\n }\n\n set[key] = joinSubQuery(query, value as Query);\n }\n\n if (\n value !== null &&\n value !== undefined &&\n !isExpression(value) &&\n !isQuery(value)\n ) {\n const encode = item?.data.encode;\n if (encode) set[key] = encode(value);\n }\n }\n }\n\n setUpdateReturning(q);\n\n // assuming conditions are set by `updateFrom` or `updateMany`\n if (!q.updateFrom && !q.updateMany) {\n throwIfNoWhere(query, 'update');\n }\n\n return query as never;\n};\n\nconst setUpdateReturning = (q: QueryData) => {\n const returnCount = !q.select;\n // Skip returnType normalization when updateMany is set —\n // _queryUpdateMany already configured these, and .set() must not override them.\n if (returnCount && !q.updateMany) {\n q.returningMany = !q.returnType || q.returnType === 'all';\n q.returnType = 'valueOrThrow';\n q.returning = true;\n }\n};\n\nexport const _queryUpdateOrThrow = <T extends UpdateSelf>(\n q: T,\n arg: UpdateArg<T>,\n): UpdateResult<T> => {\n (q as unknown as Query).q.throwOnNotFound = true;\n return _queryUpdate(q, arg);\n};\n\nexport class QueryUpdate {\n /**\n * `update` takes an object with columns and values to update records.\n *\n * By default, `update` will return a count of updated records.\n *\n * Use `select`, `selectAll`, `get`, or `pluck` alongside `update` to specify\n * returning columns.\n *\n * You need to provide `where`, `findBy`, or `find` conditions before calling `update`.\n * To ensure that the whole table won't be updated by accident, updating without where conditions will result in TypeScript and runtime errors.\n *\n * Use `all()` to update ALL records without conditions:\n *\n * ```ts\n * await db.table.all().update({ name: 'new name' });\n * ```\n *\n * If `select` and `where` were specified before the update it will return an array of updated records.\n *\n * If `select` and `take`, `find`, or similar were specified before the update it will return one updated record.\n *\n * For a column value you can provide a specific value, raw SQL, a query object that returns a single value, or a callback with a sub-query.\n *\n * The callback is allowed to select a single value from a relation (see `fromRelation` column below),\n * or to use a [jsonSet](/guide/advanced-queries.html#jsonset),\n * [jsonInsert](/guide/advanced-queries.html#jsoninsert),\n * and [jsonRemove](/guide/advanced-queries.html#jsonremove) for a JSON column (see `jsonColumn` below).\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * // returns number of updated records by default\n * const updatedCount = await db.table\n * .where({ name: 'old name' })\n * .update({ name: 'new name' });\n *\n * // returning only `id`\n * const id = await db.table.find(1).get('id').update({ name: 'new name' });\n *\n * // `selectAll` + `find` will return a full record\n * const oneFullRecord = await db.table\n * .selectAll()\n * .find(1)\n * .update({ name: 'new name' });\n *\n * // `selectAll` + `where` will return array of full records\n * const recordsArray = await db.table\n * .select('id', 'name')\n * .where({ id: 1 })\n * .update({ name: 'new name' });\n *\n * await db.table.where({ ...conditions }).update({\n * // set the column to a specific value\n * value: 123,\n *\n * // use custom SQL to update the column\n * fromSql: () => sql`2 + 2`,\n *\n * // use query that returns a single value\n * // returning multiple values will result in Postgres error\n * fromQuery: () => db.otherTable.get('someColumn'),\n *\n * // select a single value from a related record\n * fromRelation: (q) => q.relatedTable.get('someColumn'),\n *\n * // set a new value to the `.foo.bar` path into a JSON column\n * jsonColumn: (q) => q.jsonSet('jsonColumn', ['foo', 'bar'], 'new value'),\n * });\n * ```\n *\n * `update` can be used in [with](/guide/advanced-queries#with) expressions:\n *\n * ```ts\n * db.$qb\n * // update record in one table\n * .with('a', db.table.find(1).select('id').update(data))\n * // update record in other table using the first table record id\n * .with('b', (q) =>\n * db.otherTable\n * .find(1)\n * .select('id')\n * .update({\n * ...otherData,\n * aId: () => q.from('a').get('id'),\n * }),\n * )\n * .from('b');\n *\n * `update` can be used in {@link WithMethods.with} expressions:\n *\n * ```ts\n * db.$qb\n * // update record in one table\n * .with('a', db.table.find(1).select('id').update(data))\n * // update record in other table using the first table record id\n * .with('b', (q) =>\n * db.otherTable\n * .find(1)\n * .select('id')\n * .update({\n * ...otherData,\n * aId: () => q.from('a').get('id'),\n * }),\n * )\n * .from('b');\n * ```\n *\n * ### sub-queries\n *\n * In all `create`, `update`, `upsert` methods,\n * you can use sub queries that are either selecting a single value,\n * or creating/updating/deleting a record and return a single value.\n *\n * ```ts\n * await db.table.where({ ...conditions }).update({\n * // `column` will be set to a value of the `otherColumn` of the created record.\n * column: () => db.otherTable.get('otherColumn').create({ ...data }),\n *\n * // `column2` will be set to a value of the `otherColumn` of the updated record.\n * column2: () =>\n * db.otherTable\n * .get('otherColumn')\n * .findBy({ ...conditions })\n * .update({ key: 'value' }),\n *\n * // `column3` will be set to a value of the `otherColumn` of the deleted record.\n * column3: () =>\n * db.otherTable\n * .get('otherColumn')\n * .findBy({ ...conditions })\n * .delete(),\n * });\n * ```\n *\n * This is achieved by defining a `WITH` clause under the hood, it produces such a query:\n *\n * ```sql\n * WITH q AS (\n * INSERT INTO \"otherTable\"(col1, col2, col3)\n * VALUES ('val1', 'val2', 'val3')\n * RETURNING \"otherTable\".\"selectedColumn\"\n * )\n * -- In a case of create\n * INSERT INTO \"table\"(\"column\") VALUES ((SELECT * FROM \"q\"))\n * -- In a case of update\n * UPDATE \"table\"\n * SET \"column\" = (SELECT * FROM \"q\")\n * ```\n *\n * The query is atomic.\n * No changes will persist in the database if the sub-query fails, or if the top-level query fails, or if multiple rows are returned from a sub-query.\n *\n * [//]: # 'not supported in create because cannot query related records for a thing that is not created yet'\n * [//]: # 'modificational sub queries are not allowed in update because it would be too hard to join a with statement to the update query'\n *\n * Only selective sub-queries are supported in `update` queries when the sub-query is using a relation:\n *\n * ```ts\n * db.book.update({\n * authorName: (q) => q.author.get('name'),\n * });\n * ```\n *\n * ### null, undefined, unknown columns\n *\n * - `null` value will set a column to `NULL`\n * - `undefined` value will be ignored\n * - unknown columns will be ignored\n *\n * ```ts\n * db.table.findBy({ id: 1 }).update({\n * name: null, // updates to null\n * age: undefined, // skipped, no effect\n * lalala: 123, // skipped\n * });\n * ```\n *\n * ### empty set\n *\n * When trying to query update with an empty object, it will be transformed seamlessly to a `SELECT` query:\n *\n * ```ts\n * // imagine the data is an empty object\n * const data = req.body;\n *\n * // query is transformed to `SELECT count(*) WHERE key = 'value'`\n * const count = await db.table.where({ key: 'value' }).update(data);\n *\n * // will select a full record by id\n * const record = await db.table.find(1).selectAll().update(data);\n *\n * // will select a single column by id\n * const name = await db.table.find(1).get('name').update(data);\n * ```\n *\n * If the table has `updatedAt` [timestamp](/guide/common-column-methods.html#timestamps), it will be updated even for an empty data.\n *\n * @param arg - data to update records with, may have specific values, raw SQL, queries, or callbacks with sub-queries.\n */\n update<T extends UpdateSelf>(this: T, arg: UpdateArg<T>): UpdateResult<T> {\n return _queryUpdate(_clone(this), arg as never) as never;\n }\n\n /**\n * To make sure that at least one row was updated use `updateOrThrow`:\n *\n * ```ts\n * import { NotFoundError } from 'orchid-orm';\n *\n * try {\n * // updatedCount is guaranteed to be greater than 0\n * const updatedCount = await db.table\n * .where(conditions)\n * .updateOrThrow({ name: 'name' });\n *\n * // updatedRecords is guaranteed to be a non-empty array\n * const updatedRecords = await db.table\n * .where(conditions)\n * .select('id')\n * .updateOrThrow({ name: 'name' });\n * } catch (err) {\n * if (err instanceof NotFoundError) {\n * // handle error\n * }\n * }\n * ```\n *\n * @param arg - data to update records with, may have specific values, raw SQL, queries, or callbacks with sub-queries.\n */\n updateOrThrow<T extends UpdateSelf>(\n this: T,\n arg: UpdateArg<T>,\n ): UpdateResult<T> {\n return _queryUpdateOrThrow(_clone(this), arg as never) as never;\n }\n\n /**\n * Use `updateFrom` to update records in one table based on a query result from another table or CTE.\n *\n * `updateFrom` accepts the same arguments as {@link Query.join}.\n *\n * ```ts\n * // save all author names to their books by using a relation name:\n * db.books.updateFrom('author').set({ authorName: (q) => q.ref('author.name') });\n *\n * // update from authors that match the condition:\n * db.books\n * .updateFrom((q) => q.author.where({ writingSkills: 'good' }))\n * .set({ authorName: (q) => q.ref('author.name') });\n *\n * // update from any table using custom `on` conditions:\n * db.books\n * .updateFrom(\n * () => db.authors,\n * (q) => q.on('authors.id', 'books.authorId'),\n * )\n * .set({ authorName: (q) => q.ref('author.name') });\n *\n * // conditions after `updateFrom` can reference both tables:\n * db.books\n * .updateFrom(() => db.authors)\n * .where({\n * 'authors.id': (q) => q.ref('books.authorId'),\n * })\n * .set({ authorName: (q) => q.ref('author.name') });\n *\n * // can join and use another table in between `updateFrom` and `set`:\n * db.books\n * .updateFrom('author')\n * .join('publisher')\n * .set({\n * authorName: (q) => q.ref('author.name'),\n * publisherName: (q) => q.ref('publisher.name'),\n * });\n *\n * // updating from a CTE\n * db.books\n * .with('a', () =>\n * db.authors.where({ writingSkills: 'good' }).select('id', 'name').limit(10),\n * )\n * .updateFrom('a', (q) => q.on('a.id', 'books.authorId'))\n * .set({ authorName: (q) => q.ref('author.name') });\n * ```\n */\n updateFrom<\n T extends UpdateSelf,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallbackArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Cb | JoinArgs<T, Arg>\n ): JoinResultFromArgs<T, Arg, Cb, true, true> & QueryHasWhere {\n const q = _clone(this);\n\n const joinArgs = _joinReturningArgs(\n q,\n true,\n arg as never,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n true,\n );\n if (!joinArgs) {\n return _queryNone(q) as never;\n }\n\n joinArgs.u = true;\n q.q.updateFrom = joinArgs;\n\n return q as never;\n }\n\n /**\n * Use after {@link updateFrom}\n */\n set<T extends UpdateSelf>(this: T, arg: UpdateArg<T>): UpdateResult<T> {\n return _queryUpdate(_clone(this), arg as never) as never;\n }\n\n /**\n * Increments a column by `1`, returns a count of updated records by default.\n *\n * ```ts\n * const updatedCount = await db.table\n * .where(...conditions)\n * .increment('numericColumn');\n * ```\n *\n * When using `find` or `get` it will throw `NotFoundError` when no records found.\n *\n * ```ts\n * // throws when not found\n * const updatedCount = await db.table.find(1).increment('numericColumn');\n *\n * // also throws when not found\n * const updatedCount2 = await db.table\n * .where(...conditions)\n * .get('columnName')\n * .increment('numericColumn');\n * ```\n *\n * Provide an object to increment multiple columns with different values.\n * Use `select` to specify columns to return.\n *\n * ```ts\n * // increment someColumn by 5 and otherColumn by 10, return updated records\n * const result = await db.table\n * .selectAll()\n * .where(...conditions)\n * .increment({\n * someColumn: 5,\n * otherColumn: 10,\n * });\n * ```\n *\n * @param data - name of the column to increment, or an object with columns and values to add\n */\n increment<T extends UpdateSelf>(\n this: T,\n data: ChangeCountArg<T>,\n ): UpdateResult<T> {\n return _queryChangeCounter(_clone(this), '+', data as never);\n }\n\n /**\n * Decrements a column by `1`, returns a count of updated records by default.\n *\n * ```ts\n * const updatedCount = await db.table\n * .where(...conditions)\n * .decrement('numericColumn');\n * ```\n *\n * When using `find` or `get` it will throw `NotFoundError` when no records found.\n *\n * ```ts\n * // throws when not found\n * const updatedCount = await db.table.find(1).decrement('numericColumn');\n *\n * // also throws when not found\n * const updatedCount2 = await db.table\n * .where(...conditions)\n * .get('columnName')\n * .decrement('numericColumn');\n * ```\n *\n * Provide an object to decrement multiple columns with different values.\n * Use `select` to specify columns to return.\n *\n * ```ts\n * // decrement someColumn by 5 and otherColumn by 10, return updated records\n * const result = await db.table\n * .selectAll()\n * .where(...conditions)\n * .decrement({\n * someColumn: 5,\n * otherColumn: 10,\n * });\n * ```\n *\n * @param data - name of the column to decrement, or an object with columns and values to subtract\n */\n decrement<T extends UpdateSelf>(\n this: T,\n data: ChangeCountArg<T>,\n ): UpdateResult<T> {\n return _queryChangeCounter(_clone(this), '-', data as never);\n }\n\n /**\n * Updates multiple records with different per-row data in a single query.\n *\n * Each row must include the primary key and the columns to update.\n * All rows must have the same set of non-key columns.\n *\n * Returns a count of updated records by default.\n * Use `select`, `selectAll`, `get`, or `pluck` alongside `updateMany` to return\n * updated records.\n *\n * Throws {@link NotFoundError} if any record is not found.\n * Use {@link updateManyOptional} to skip missing records without throwing.\n *\n * ```ts\n * // returns count of updated records\n * const count = await db.table.updateMany([\n * { id: 1, name: 'Alice', age: 30 },\n * { id: 2, name: 'Bob', age: 25 },\n * ]);\n *\n * // returns array of updated records\n * const records = await db.table.select('id', 'name').updateMany([\n * { id: 1, name: 'Alice' },\n * { id: 2, name: 'Bob' },\n * ]);\n * ```\n *\n * `.set()` applies shared values to all rows.\n * `.set()` values take precedence over per-row values for the same column.\n *\n * ```ts\n * await db.table\n * .updateMany([\n * { id: 1, name: 'Alice' },\n * { id: 2, name: 'Bob' },\n * ])\n * .set({ updatedBy: currentUser.id });\n * ```\n */\n updateMany<T extends UpdateSelf>(\n this: T,\n data: UpdateManyData<T>,\n ): UpdateManyResult<T> & QueryHasWhere {\n const q = _clone(this) as unknown as Query;\n return _queryUpdateMany(\n q as never,\n requirePrimaryKeys(q, 'updateMany requires a primary key'),\n data as RecordUnknown[],\n true,\n ) as never;\n }\n\n /**\n * Same as {@link updateMany}, but skips missing records rather than throwing.\n *\n * ```ts\n * // updates what it can, doesn't throw for missing id: 999\n * const count = await db.table.updateManyOptional([\n * { id: 1, name: 'Alice' },\n * { id: 999, name: 'Ghost' },\n * ]);\n * ```\n */\n updateManyOptional<T extends UpdateSelf>(\n this: T,\n data: UpdateManyData<T>,\n ): UpdateManyResult<T> & QueryHasWhere {\n const q = _clone(this) as unknown as Query;\n return _queryUpdateMany(\n q as never,\n requirePrimaryKeys(q, 'updateMany requires a primary key'),\n data as RecordUnknown[],\n false,\n ) as never;\n }\n\n /**\n * Like {@link updateMany}, but matches rows by a unique column or a compound unique constraint instead of the primary key.\n *\n * Throws {@link NotFoundError} if any record is not found.\n * Use {@link updateManyByOptional} to skip records with no matching key without throwing.\n *\n * ```ts\n * // single unique column\n * await db.table.updateManyBy('email', [\n * { email: 'alice@test.com', name: 'Alice' },\n * { email: 'bob@test.com', name: 'Bob' },\n * ]);\n *\n * // compound unique constraint\n * await db.table.updateManyBy(['firstName', 'lastName'], [\n * { firstName: 'John', lastName: 'Doe', bio: 'updated' },\n * ]);\n * ```\n */\n updateManyBy<\n T extends UpdateManyBySelf,\n Keys extends UpdateManyByKeys<T>,\n K extends string = UpdateManyByKeyColumns<Keys>,\n >(\n this: T,\n keys: Keys,\n data: UpdateManyByData<T, K>,\n ): UpdateManyResult<T> & QueryHasWhere {\n return _queryUpdateMany(\n _clone(this) as never,\n typeof keys === 'string' ? [keys] : (keys as unknown as string[]),\n data as RecordUnknown[],\n true,\n ) as never;\n }\n\n /**\n * Same as {@link updateManyBy}, but skips records with no matching key rather than throwing.\n *\n * ```ts\n * await db.table.updateManyByOptional('email', [\n * { email: 'alice@test.com', name: 'Alice' },\n * { email: 'unknown@test.com', name: 'Ghost' },\n * ]);\n * ```\n */\n updateManyByOptional<\n T extends UpdateManyBySelf,\n Keys extends UpdateManyByKeys<T>,\n K extends string = UpdateManyByKeyColumns<Keys>,\n >(\n this: T,\n keys: Keys,\n data: UpdateManyByData<T, K>,\n ): UpdateManyResult<T> & QueryHasWhere {\n return _queryUpdateMany(\n _clone(this) as never,\n typeof keys === 'string' ? [keys] : (keys as unknown as string[]),\n data as RecordUnknown[],\n false,\n ) as never;\n }\n}\n","import {\n Query,\n SetQueryReturnsOne,\n SetQueryReturnsVoid,\n SetValueQueryReturnsValueOrThrow,\n} from '../../query';\nimport { _queryUpdate, UpdateData, UpdateSelf } from './update';\nimport { CreateData, CreateSelf } from './create';\nimport { _orCreate } from './or-create';\nimport { PickQueryHasSelectResultReturnType } from '../../pick-query-types';\nimport { isObjectEmpty } from '../../../utils';\nimport { _clone } from '../clone/clone';\n\ntype UpsertCreate<DataKey extends PropertyKey, CD> = {\n [K in keyof CD as K extends DataKey ? never : K]: CD[K];\n} & {\n [K in DataKey]?: K extends keyof CD ? CD[K] : never;\n};\n\n// unless upsert query has a select, it returns void\nexport type UpsertResult<T extends PickQueryHasSelectResultReturnType> =\n T['__hasSelect'] extends true\n ? T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetValueQueryReturnsValueOrThrow<T>\n : SetQueryReturnsOne<T>\n : SetQueryReturnsVoid<T>;\n\n// Require type of query object to query only one record\n// because upserting multiple isn't possible\nexport interface UpsertThis extends UpdateSelf, CreateSelf {\n __hasWhere: true;\n returnType: 'one' | 'oneOrThrow' | 'value' | 'valueOrThrow' | 'void';\n}\n\nexport type UpsertData<T extends UpsertThis, Update extends UpdateData<T>> =\n | {\n update: Update;\n create: CreateData<T> | ((update: Update) => CreateData<T>);\n }\n | {\n data: Update;\n create:\n | UpsertCreate<keyof Update, CreateData<T>>\n | ((update: Update) => UpsertCreate<keyof Update, CreateData<T>>);\n };\n\nexport const _queryUpsert = (\n q: Query,\n data: UpsertData<UpsertThis, UpdateData<Query>>,\n): Query => {\n q.q.upsertUpdate = true;\n\n let updateData;\n let mergeData;\n if ('data' in data) {\n updateData = mergeData = data.data;\n } else {\n updateData = data.update;\n }\n\n if (!isObjectEmpty(updateData)) {\n _queryUpdate(q, updateData as never);\n }\n\n return _orCreate(q as Query, data.create, updateData, mergeData) as Query;\n};\n\nexport class QueryUpsert {\n /**\n * `upsert` tries to update a single record, and then it creates the record if it doesn't yet exist.\n *\n * `find` or `findBy` must precede `upsert` because it does not work with multiple updates.\n *\n * In case more than one row was updated, it will throw `MoreThanOneRowError` and the transaction will be rolled back.\n *\n * It can take `update` and `create` objects, then they are used separately for update and create queries.\n * Or, it can take `data` and `create` objects, `data` will be used for update and be mixed to `create` object.\n *\n * `data` and `update` objects are of the same type that's expected by `update` method, `create` object is of type of `create` method argument.\n *\n * No values are returned by default, place `select` or `selectAll` before `upsert` to specify returning columns.\n *\n * ```ts\n * await db.user\n * .selectAll()\n * .findBy({ email: 'some@email.com' })\n * .upsert({\n * data: {\n * // update record's name\n * name: 'new name',\n * // supports sql and nested queries\n * fromSQL: () => sql`*SQL expression*`,\n * fromQuery: () => db.someTable.create(data).get('column'),\n * },\n * create: {\n * // create a new record with this email and a name 'new name'\n * email: 'some@email.com',\n * // supports sql and nested queries as well\n * },\n * create: {\n * // create a new record with this email and a name 'new name'\n * email: 'some@email.com',\n * },\n * });\n *\n * // the same as above but using `update` and `create`\n * await db.user\n * .selectAll()\n * .findBy({ email: 'some@email.com' })\n * .upsert({\n * update: {\n * name: 'updated user',\n * },\n * create: {\n * email: 'some@email.com',\n * // here we use a different name when creating a record\n * name: 'created user',\n * },\n * });\n * ```\n *\n * The data for `create` may be returned from a function, it won't be called if a record was updated:\n *\n * ```ts\n * await db.user\n * .selectAll()\n * .findBy({ email: 'some@email.com' })\n * .upsert({\n * update: {\n * name: 'updated user',\n * },\n * create: () => ({\n * email: 'some@email.com',\n * name: 'created user',\n * }),\n * });\n *\n * // the same as above using `data`\n * await db.user\n * .selectAll()\n * .findBy({ email: 'some@email.com' })\n * .upsert({\n * data: {\n * name: 'updated user',\n * },\n * create: () => ({\n * email: 'some@email.com',\n * // name in `create` is overriding the name from `data`\n * name: 'created user',\n * }),\n * });\n * ```\n *\n * Data from `data` or `update` is passed to the `create` function and can be used:\n *\n * ```ts\n * const user = await db.user\n * .selectAll()\n * .findBy({ email: 'some@email.com' })\n * .upsert({\n * data: {\n * name: 'updated user',\n * },\n * // `updateData` has the exact type of what is passed to `data`\n * create: (updateData) => ({\n * email: `${updateData.name}@email.com`,\n * }),\n * });\n * ```\n *\n * `upsert` works in the exact same way as [orCreate](#orCreate), but with `UPDATE` statement instead of `SELECT`.\n * it also performs a single query if the record exists, and two queries if there is no record yet.\n *\n * @param data - `update` property for the data to update, `create` property for the data to create\n */\n upsert<T extends UpsertThis, Update extends UpdateData<T>>(\n this: T,\n data: UpsertData<T, Update>,\n ): UpsertResult<T> {\n return _queryUpsert(_clone(this), data as never) as never;\n }\n}\n","import { _clone } from '../clone/clone';\n\nexport type QuerySchema = (() => string) | string;\n\ninterface HasQuerySchema {\n q: {\n schema?: QuerySchema;\n };\n}\n\nexport const getQuerySchema = (query: HasQuerySchema): string | undefined => {\n const { schema } = query.q;\n return typeof schema === 'function' ? schema() : schema;\n};\n\nexport class QueryWithSchema {\n /**\n * Specifies the schema to be used as a prefix of a table name.\n *\n * Though this method can be used to set the schema right when building the query,\n * it's better to specify schema when calling `db(table, () => columns, { schema: string })`\n *\n * ```ts\n * db.table.withSchema('customSchema').select('id');\n * ```\n *\n * Resulting SQL:\n *\n * ```sql\n * SELECT \"user\".\"id\" FROM \"customSchema\".\"user\"\n * ```\n *\n * You can set a **default** schema for all tables in a callback by using {@link $withOptions}.\n *\n * @param schema - a name of the database schema to use\n */\n withSchema<T>(this: T, schema: QuerySchema | undefined): T {\n const q = _clone(this);\n q.q.schema = schema;\n return q as T;\n }\n}\n","import { Column } from '../../columns';\nimport { Expression, ExpressionData } from './expression';\nimport { simpleExistingColumnToSQL } from '../sql/column-to-sql';\nimport { ToSQLCtx } from '../sql/to-sql';\n\n// Expression created by `Query.column('name')`, it will prefix the column with a table name from query's context.\nexport class ColumnRefExpression<\n T extends Column.Pick.QueryColumn,\n> extends Expression<T> {\n result: { value: T };\n q: ExpressionData;\n\n constructor(value: T, public name: string) {\n super();\n this.result = { value };\n this.q = { expr: this };\n Object.assign(this, value.operators);\n }\n\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n return simpleExistingColumnToSQL(\n ctx,\n this.name,\n this.result.value,\n quotedAs,\n );\n }\n}\n","import { Expression, ExpressionData, isExpression } from './expression';\nimport { BooleanQueryColumn } from '../basic-features/aggregate/aggregate';\nimport {\n Operators,\n OperatorsBoolean,\n prepareOpArg,\n} from '../../columns/operators';\nimport { QueryOrExpressionBooleanOrNullResult } from '../query';\nimport { moveMutativeQueryToCte } from '../basic-features/cte/cte.sql';\nimport { SubQueryForSql } from '../internal-features/sub-query/sub-query-for-sql';\nimport { ToSQLCtx } from '../sql/to-sql';\n\nexport interface OrExpression\n extends Expression<BooleanQueryColumn>,\n OperatorsBoolean {}\n\nexport type OrExpressionArg = QueryOrExpressionBooleanOrNullResult | undefined;\n\nexport class OrExpression extends Expression<BooleanQueryColumn> {\n declare result: { value: BooleanQueryColumn };\n q: ExpressionData;\n\n constructor(public args: [OrExpressionArg, ...OrExpressionArg[]]) {\n super();\n this.q = { expr: this };\n\n args.forEach((arg, i) => {\n const val = prepareOpArg(this, arg);\n if (val) args[i] = val as never;\n });\n }\n\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n const res: string[] = [];\n for (const arg of this.args) {\n if (arg) {\n if (isExpression(arg)) {\n const sql = arg.toSQL(ctx, quotedAs);\n if (sql) res.push(sql);\n } else {\n res.push(\n `(${moveMutativeQueryToCte(\n ctx,\n arg as unknown as SubQueryForSql,\n )})`,\n );\n }\n }\n }\n\n return `(${res.join(' OR ')})`;\n }\n}\n\nObject.assign(OrExpression.prototype, Operators.boolean);\n","import { addValue, emptyObject } from '../../utils';\nimport { Column } from '../../columns';\nimport { Expression, ExpressionData } from './expression';\nimport { ToSqlValues } from '../sql/to-sql';\n\nexport class ValExpression extends Expression {\n // TODO: move unknown column to core and use it here\n result = { value: emptyObject as Column };\n q: ExpressionData;\n\n constructor(public value: unknown) {\n super();\n this.q = { expr: this };\n }\n\n makeSQL(ctx: ToSqlValues): string {\n return addValue(ctx.values, this.value);\n }\n}\n","import {\n PickQueryColumTypes,\n PickQueryHasSelect,\n PickQueryMetaSelectableResultRelationsWindowsColumnTypes,\n PickQuerySelectable,\n PickQueryShape,\n} from '../pick-query-types';\nimport { ColumnRefExpression } from './column-ref-expression';\nimport { Column, UnknownColumn } from '../../columns';\nimport { RefExpression } from './ref-expression';\nimport { _clone } from '../basic-features/clone/clone';\nimport { getFullColumnTable } from '../query.utils';\nimport { ValExpression } from './val-expression';\nimport { SelectableOrExpressions } from './expression';\nimport { AggregateOptions, makeFnExpression } from './fn-expression';\nimport { emptyObject } from '../../utils';\nimport { OrExpression, OrExpressionArg } from './or-expression';\n\nimport { QueryThen } from '../then/then';\n\ninterface QueryReturnsFnAdd<T extends PickQueryColumTypes>\n extends PickQueryHasSelect {\n type<C extends Column.Pick.QueryColumn>(\n fn: (types: T['columnTypes']) => C,\n ): {\n [K in keyof T]: K extends 'result'\n ? { value: C }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<C['outputType']>\n : T[K];\n } & C['operators'];\n}\n\ntype SetQueryReturnsFn<\n T extends PickQueryColumTypes,\n C extends Column.Pick.OutputType,\n> = {\n [K in keyof T]: K extends 'result'\n ? { value: C }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<C['outputType']>\n : T[K];\n} & QueryReturnsFnAdd<T>;\n\nexport class QueryExpressions {\n /**\n * `column` references a table column, this can be used in raw SQL or when building a column expression.\n * Only for referencing a column in the query's table. For referencing joined table's columns, see [ref](#ref).\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * await db.table.select({\n * // select `(\"table\".\"id\" = 1 OR \"table\".\"name\" = 'name') AS \"one\"`,\n * // returns a boolean\n * one: (q) =>\n * sql<boolean>`${q.column('id')} = ${1} OR ${q.column('name')} = ${'name'}`,\n *\n * // selects the same as above, but by building a query\n * two: (q) => q.column('id').equals(1).or(q.column('name').equals('name')),\n * });\n * ```\n *\n * @param name - column name\n */\n column<T extends PickQueryShape, K extends keyof T['shape']>(\n this: T,\n name: K,\n ): ColumnRefExpression<T['shape'][K]> & T['shape'][K]['operators'] {\n const column = (this.shape as { [K: PropertyKey]: Column })[name];\n return new ColumnRefExpression(\n (column || UnknownColumn.instance) as T['shape'][K],\n name as string,\n ) as never;\n }\n\n /**\n * `ref` is similar to [column](#column), but it also allows to reference a column of joined table,\n * and other dynamically defined columns.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * await db.table.join('otherTable').select({\n * // select `(\"otherTable\".\"id\" = 1 OR \"otherTable\".\"name\" = 'name') AS \"one\"`,\n * // returns a boolean\n * one: (q) =>\n * sql<boolean>`${q.ref('otherTable.id')} = ${1} OR ${q.ref(\n * 'otherTable.name',\n * )} = ${'name'}`,\n *\n * // selects the same as above, but by building a query\n * two: (q) =>\n * q\n * .ref('otherTable.id')\n * .equals(1)\n * .or(q.ref('otherTable.name').equals('name')),\n * });\n * ```\n *\n * @param arg - any available column name, such as of a joined table\n */\n ref<\n T extends PickQuerySelectable,\n K extends keyof T['__selectable'] & string,\n >(\n this: T,\n arg: K,\n ): RefExpression<T['__selectable'][K]['column']> &\n T['__selectable'][K]['column']['operators'] {\n const q = _clone(this);\n\n const { shape } = q.q;\n let column: Column.Pick.QueryColumn | undefined;\n\n const index = arg.indexOf('.');\n if (index !== -1) {\n const as = q.q.as || q.table;\n const table = getFullColumnTable(q, arg, index, as);\n const col = arg.slice(index + 1);\n if (table === as) {\n column = shape[col];\n } else {\n column = q.q.joinedShapes?.[table][col];\n }\n } else {\n column = shape[arg];\n }\n\n return new RefExpression(column || UnknownColumn.instance, q, arg) as never;\n }\n\n val(value: unknown): ValExpression {\n return new ValExpression(value);\n }\n\n /**\n * `fn` allows to call an arbitrary SQL function.\n *\n * For example, calling `sqrt` function to get a square root from some numeric column:\n *\n * ```ts\n * const q = await db.table.select({\n * sqrt: (q) => q.fn<number>('sqrt', ['numericColumn']),\n * }).take();\n *\n * q.sqrt; // has type `number` just as provided\n * ```\n *\n * If this is an aggregate function, you can specify aggregation options (see [Aggregate](/guide/aggregate.html)) via third parameter.\n *\n * Use `type` method to specify a column type so that its operators such as `lt` and `gt` become available:\n *\n * ```ts\n * const q = await db.table.select({\n * // Produces `sqrt(\"numericColumn\") > 5`\n * sqrtIsGreaterThan5: (q) =>\n * q\n * .fn('sqrt', ['numericColumn'])\n * .type((t) => t.float())\n * .gt(5),\n * }).take();\n *\n * // Return type is boolean | null\n * // todo: it should be just boolean if the column is not nullable, but for now it's always nullable\n * q.sqrtIsGreaterThan5;\n * ```\n *\n * @param fn\n * @param args\n * @param options\n */\n fn<\n T extends PickQueryMetaSelectableResultRelationsWindowsColumnTypes,\n Type = unknown,\n C extends Column.Pick.QueryColumn = Column.Pick.QueryColumnOfType<Type>,\n >(\n this: T,\n fn: string,\n args: SelectableOrExpressions<T>,\n options?: AggregateOptions<T>,\n ): SetQueryReturnsFn<T, C> {\n return makeFnExpression(\n this,\n emptyObject as C,\n fn,\n args as never,\n options,\n ) as never;\n }\n\n or(...args: [OrExpressionArg, ...OrExpressionArg[]]): OrExpression {\n return new OrExpression(args);\n }\n}\n","import {\n prepareSubQueryForSql,\n pushQueryValueImmutable,\n Query,\n} from 'pqb/internal';\n\nexport const _appendQuery = (\n main: Query,\n append: Query,\n asFn: (as: string) => void,\n) => {\n return pushQueryValueImmutable(\n pushQueryValueImmutable(\n main,\n 'appendQueries',\n prepareSubQueryForSql(main, append),\n ),\n 'asFns',\n asFn,\n );\n};\n","import {\n PickQueryHasSelect,\n PickQueryHasSelectResult,\n PickQueryHasWhere,\n PickQueryQ,\n PickQueryResult,\n PickQueryReturnType,\n PickQuerySelectable,\n PickQueryTable,\n PickQueryThen,\n PickQueryWindows,\n PickQueryWithData,\n} from '../../pick-query-types';\nimport { RecordUnknown } from '../../../utils';\nimport { _clone } from '../../basic-features/clone/clone';\nimport { UnionSet } from '../../basic-features/union/union.sql';\nimport { QueryThenByQuery } from '../../then/then';\n\nexport interface MergeQueryArg\n extends PickQueryTable,\n PickQuerySelectable,\n PickQueryResult,\n PickQueryReturnType,\n PickQueryWithData,\n PickQueryWindows,\n PickQueryThen,\n PickQueryHasSelect,\n PickQueryHasWhere {}\n\nexport type MergeQuery<T extends MergeQueryArg, Q extends MergeQueryArg> = {\n [K in keyof T]: K extends '__hasWhere' | '__hasSelect'\n ? T[K] & Q[K] // true if any of them is true\n : K extends '__selectable' | 'windows' | 'withData'\n ? Q[K] & Omit<T[K], keyof Q[K]>\n : K extends 'result'\n ? MergeQueryResult<T, Q>\n : K extends 'returnType'\n ? Q['returnType'] extends undefined\n ? T['returnType']\n : Q['returnType']\n : K extends 'then'\n ? // Q may be an update query that returns count by default,\n // and whether it returns count or not depends on if the T query had selected anything.\n Q['returnType'] extends undefined\n ? QueryThenByQuery<T, MergeQueryResult<T, Q>>\n : Q['returnType'] extends 'all' | 'one' | 'oneOrThrow' | 'rows'\n ? QueryThenByQuery<Q, MergeQueryResult<T, Q>>\n : Q['__hasSelect'] extends true\n ? Q['then']\n : T['__hasSelect'] extends true\n ? T['then']\n : Q['then']\n : T[K];\n};\n\ntype MergeQueryResult<\n T extends PickQueryHasSelectResult,\n Q extends PickQueryHasSelectResult,\n> = T['__hasSelect'] extends true\n ? Q['__hasSelect'] extends true\n ? Omit<T['result'], keyof Q['result']> & Q['result']\n : T['result']\n : Q['result'];\n\nconst mergableObjects = new Set([\n 'shape',\n 'withShapes',\n 'defaultParsers',\n 'parsers',\n 'defaults',\n 'joinedShapes',\n 'joinedParsers',\n 'joined',\n 'joinedBatchParsers',\n 'selectedComputeds',\n]);\n\nconst dontMergeArrays = new Set(['selectAllColumns']);\n\nexport class MergeQueryMethods {\n merge<T extends MergeQueryArg, Q extends MergeQueryArg>(\n this: T,\n q: Q,\n ): MergeQuery<T, Q> {\n const query = _clone(this);\n const a = query.q as never as RecordUnknown;\n const b = (q as unknown as PickQueryQ).q as never as RecordUnknown;\n\n for (const key in b) {\n const value = b[key];\n switch (typeof value) {\n case 'boolean':\n case 'string':\n case 'number':\n a[key] = value;\n break;\n case 'object':\n if (Array.isArray(value)) {\n if (!dontMergeArrays.has(key)) {\n a[key] = a[key] ? [...(a[key] as unknown[]), ...value] : value;\n }\n } else if (mergableObjects.has(key)) {\n a[key] = a[key]\n ? { ...(a[key] as RecordUnknown), ...value }\n : value;\n } else if (key === 'union') {\n a[key] = a[key]\n ? {\n b: (a[key] as UnionSet).b,\n u: [...(a[key] as UnionSet).u, ...(value as UnionSet).u],\n }\n : value;\n } else if (value instanceof Set) {\n a[key] = a[key]\n ? new Set([...(a[key] as Set<unknown>), ...value])\n : value;\n } else {\n a[key] = value;\n }\n break;\n }\n }\n\n if (b.returnType) a.returnType = b.returnType;\n\n return query as never;\n }\n}\n","export namespace DefaultPrivileges {\n export type ObjectType = (typeof DEFAULT_PRIVILEGE.OBJECT_TYPES)[number];\n\n export interface Privilege {\n Table: (typeof DEFAULT_PRIVILEGE.PRIVILEGES.TABLE)[number];\n Sequence: (typeof DEFAULT_PRIVILEGE.PRIVILEGES.SEQUENCE)[number];\n Function: (typeof DEFAULT_PRIVILEGE.PRIVILEGES.FUNCTION)[number];\n Type: (typeof DEFAULT_PRIVILEGE.PRIVILEGES.TYPE)[number];\n Schema: (typeof DEFAULT_PRIVILEGE.PRIVILEGES.SCHEMA)[number];\n LargeObject: (typeof DEFAULT_PRIVILEGE.PRIVILEGES.LARGE_OBJECT)[number];\n }\n\n interface ObjectSetting<T> {\n privileges?: T[];\n grantablePrivileges?: T[];\n }\n\n export interface SchemaTargetConfig {\n owner?: string;\n schema: string;\n all?: boolean;\n allGrantable?: boolean;\n tables?: ObjectSetting<Privilege['Table']>;\n sequences?: ObjectSetting<Privilege['Sequence']>;\n functions?: ObjectSetting<Privilege['Function']>;\n types?: ObjectSetting<Privilege['Type']>;\n }\n\n export interface GlobalTargetConfig {\n owner?: string;\n schema?: never;\n all?: boolean;\n allGrantable?: boolean;\n tables?: ObjectSetting<Privilege['Table']>;\n sequences?: ObjectSetting<Privilege['Sequence']>;\n functions?: ObjectSetting<Privilege['Function']>;\n types?: ObjectSetting<Privilege['Type']>;\n schemas?: ObjectSetting<Privilege['Schema']>;\n largeObjects?: ObjectSetting<Privilege['LargeObject']>;\n }\n\n export interface SupportedDefaultPrivileges {\n OBJECT_TYPES: string[];\n PRIVILEGES: {\n TABLE: string[];\n SEQUENCE: string[];\n FUNCTION: string[];\n TYPE: string[];\n SCHEMA: string[];\n LARGE_OBJECT?: string[];\n };\n }\n\n export type SchemaConfig = SchemaTargetConfig | GlobalTargetConfig;\n}\n\n// Default privileges constants grouped under DEFAULT_PRIVILEGE\nconst DEFAULT_PRIVILEGE = {\n OBJECT_TYPES: [\n 'TABLES',\n 'SEQUENCES',\n 'FUNCTIONS',\n 'TYPES',\n 'SCHEMAS',\n 'LARGE_OBJECTS',\n ] as const,\n PRIVILEGES: {\n TABLE: [\n 'ALL',\n 'SELECT',\n 'INSERT',\n 'UPDATE',\n 'DELETE',\n 'TRUNCATE',\n 'REFERENCES',\n 'TRIGGER',\n 'MAINTAIN', // Supported starting with PostgreSQL 17\n ] as const,\n SEQUENCE: ['ALL', 'USAGE', 'SELECT', 'UPDATE'] as const,\n FUNCTION: ['ALL', 'EXECUTE'] as const,\n TYPE: ['ALL', 'USAGE'] as const,\n SCHEMA: ['ALL', 'USAGE', 'CREATE'] as const,\n LARGE_OBJECT: ['ALL', 'SELECT', 'UPDATE'] as const,\n },\n};\n\nconst supportedPrivilegesCache = new Map<\n number,\n DefaultPrivileges.SupportedDefaultPrivileges\n>();\n\nexport function getSupportedDefaultPrivileges(\n version: number,\n): DefaultPrivileges.SupportedDefaultPrivileges {\n const cached = supportedPrivilegesCache.get(version);\n if (cached) return cached;\n\n let result: DefaultPrivileges.SupportedDefaultPrivileges;\n if (version >= 18) {\n result =\n DEFAULT_PRIVILEGE as unknown as DefaultPrivileges.SupportedDefaultPrivileges;\n } else if (version >= 17) {\n result = {\n OBJECT_TYPES: DEFAULT_PRIVILEGE.OBJECT_TYPES.filter(\n (t) => t !== 'LARGE_OBJECTS',\n ),\n PRIVILEGES: {\n TABLE: [...DEFAULT_PRIVILEGE.PRIVILEGES.TABLE],\n SEQUENCE: [...DEFAULT_PRIVILEGE.PRIVILEGES.SEQUENCE],\n FUNCTION: [...DEFAULT_PRIVILEGE.PRIVILEGES.FUNCTION],\n TYPE: [...DEFAULT_PRIVILEGE.PRIVILEGES.TYPE],\n SCHEMA: [...DEFAULT_PRIVILEGE.PRIVILEGES.SCHEMA],\n },\n };\n } else {\n result = {\n OBJECT_TYPES: DEFAULT_PRIVILEGE.OBJECT_TYPES.filter(\n (t) => t !== 'LARGE_OBJECTS',\n ),\n PRIVILEGES: {\n TABLE: DEFAULT_PRIVILEGE.PRIVILEGES.TABLE.filter(\n (p) => p !== 'MAINTAIN',\n ),\n SEQUENCE: [...DEFAULT_PRIVILEGE.PRIVILEGES.SEQUENCE],\n FUNCTION: [...DEFAULT_PRIVILEGE.PRIVILEGES.FUNCTION],\n TYPE: [...DEFAULT_PRIVILEGE.PRIVILEGES.TYPE],\n SCHEMA: [...DEFAULT_PRIVILEGE.PRIVILEGES.SCHEMA],\n },\n };\n }\n\n supportedPrivilegesCache.set(version, result);\n return result;\n}\n","import { SetQueryReturnsColumnOptional } from '../../query';\nimport { queryJson } from './json.utils';\nimport { Column } from '../../../columns';\n\nexport abstract class QueryJsonMethods {\n /**\n * Wraps the query in a way to select a single JSON string.\n * So that JSON encoding is done on a database side, and the application doesn't have to turn a response to a JSON.\n * It may be better for performance in some cases.\n *\n * ```ts\n * // json is a JSON string that you can directly send as a response.\n * const json = await db.table.select('id', 'name').json();\n * ```\n *\n * @param coalesce\n */\n json<T>(\n this: T,\n coalesce?: boolean,\n ): SetQueryReturnsColumnOptional<T, Column.Pick.QueryColumnOfType<string>> {\n return queryJson(this, coalesce) as never;\n }\n}\n","import { IsQuery, Query } from '../../query';\nimport { extendQuery } from '../../query.utils';\nimport { Expression } from '../../expressions/expression';\nimport { _clone } from '../clone/clone';\nimport { QueryData } from '../../query-data';\n\ntype ForQueryBuilder<Q> = Q & {\n noWait<T extends Q>(this: T): T;\n skipLocked<T extends Q>(this: T): T;\n};\n\nconst forMethods = {\n noWait() {\n const q = _clone(this);\n const data = q.q as QueryData | undefined;\n if (data?.for) data.for.mode = 'NO WAIT';\n return q as never;\n },\n skipLocked() {\n const q = _clone(this);\n const data = q.q as QueryData | undefined;\n if (data?.for) data.for.mode = 'SKIP LOCKED';\n return q as never;\n },\n};\n\n// Extends the query with `for` methods, the query is cloned, and sets `for` data.\nconst forQueryBuilder = <T>(\n arg: T,\n type: Exclude<QueryData['for'], undefined>['type'],\n tableNames?: string[] | Expression,\n): ForQueryBuilder<T> => {\n const q = extendQuery(arg as Query, forMethods);\n\n q.q.for = {\n type,\n tableNames,\n };\n\n return q as never;\n};\n\nexport class For {\n forUpdate<T extends IsQuery>(\n this: T,\n tableNames?: string[] | Expression,\n ): ForQueryBuilder<T> {\n return forQueryBuilder(this, 'UPDATE', tableNames);\n }\n\n forNoKeyUpdate<T extends IsQuery>(\n this: T,\n tableNames?: string[] | Expression,\n ): ForQueryBuilder<T> {\n return forQueryBuilder(this, 'NO KEY UPDATE', tableNames);\n }\n\n forShare<T extends IsQuery>(\n this: T,\n tableNames?: string[] | Expression,\n ): ForQueryBuilder<T> {\n return forQueryBuilder(this, 'SHARE', tableNames);\n }\n\n forKeyShare<T extends IsQuery>(\n this: T,\n tableNames?: string[] | Expression,\n ): ForQueryBuilder<T> {\n return forQueryBuilder(this, 'KEY SHARE', tableNames);\n }\n}\n","import {\n Query,\n SelectableOrExpressionOfType,\n SetQueryReturnsColumnOrThrow,\n} from '../../query';\nimport { AggregateMethods } from '../../basic-features/aggregate/aggregate';\nimport {\n saveAliasedShape,\n setQueryObjectValueImmutable,\n} from '../../query.utils';\nimport { columnToSql } from '../../sql/column-to-sql';\nimport { Operators } from '../../../columns/operators';\nimport { Column } from '../../../columns';\nimport { OrchidOrmInternalError } from '../../errors';\nimport { PickQuerySelectable, PickQueryTsQuery } from '../../pick-query-types';\nimport { Expression, ExpressionData } from '../../expressions/expression';\nimport { addValue, emptyObject, MaybeArray } from '../../../utils';\nimport { _clone } from '../../basic-features/clone/clone';\nimport {\n getSearchLang,\n getSearchText,\n OrderTsQueryConfig,\n QuerySourceItem,\n SearchWeight,\n} from './search.sql';\nimport { ToSQLCtx } from '../../sql/to-sql';\nimport { pushQueryValueImmutable, QueryData } from '../../query-data';\nimport { OrderArgSelf } from '../../basic-features/order/order';\n\n// `headline` first argument is a name of the search.\ntype HeadlineSearchArg<T extends PickQueryTsQuery> = Exclude<\n T['__tsQuery'],\n undefined\n>;\n\n// Options of the `headline` function:\n// - text: column name or a raw SQL with the full text to select headline from.\n// - options: string or an expression returning Postgres headline options (https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-HEADLINE).\ninterface HeadlineParams<T extends PickQuerySelectable> {\n text?: SelectableOrExpressionOfType<T, Column.Pick.QueryColumnOfType<string>>;\n options?: string | Expression;\n}\n\n// define a `headline` method on a query builder\ndeclare module '../../basic-features/aggregate/aggregate' {\n interface AggregateMethods {\n /**\n * Give the `as` alias for the search, and it becomes possible to select a text with highlights of the matching words or phrases:\n *\n * ```ts\n * db.table\n * .search({\n * as: 'search',\n * in: 'body',\n * query: 'query',\n * })\n * .select({\n * highlightedText: (q) => q.headline('search'),\n * });\n * ```\n *\n * When searching in the generated `tsvector` column, need to provide a text source to the `headline`:\n *\n * ```ts\n * db.table\n * .search({\n * as: 'search',\n * vector: 'textVector',\n * query: 'query',\n * })\n * .select({\n * // `body` is a column name\n * highlightedText: (q) => q.headline('search', { text: 'body' }),\n * });\n * ```\n *\n * `text` can be a raw SQL, here we are joining multiple columns:\n *\n * ```ts\n * import { raw } from 'orchid-orm';\n *\n * db.table\n * .search({\n * as: 'search',\n * vector: 'titleAndBodyVector',\n * query: 'query',\n * })\n * .select({\n * highlightedText: (q) =>\n * q.headline('search', { text: raw`concat_ws(' ', title, body)` }),\n * });\n * ```\n *\n * `headline` supports a string for `options`, see details [in Postgres doc](https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-HEADLINE).\n *\n * Provide a simple string or a raw SQL:\n *\n * ```ts\n * db.table\n * .search({\n * as: 'search',\n * in: 'body',\n * query: 'query',\n * })\n * .select({\n * highlightedText: (q) =>\n * q.headline('search', {\n * options:\n * 'MaxFragments=10, MaxWords=7, MinWords=3, StartSel=<<, StopSel=>>',\n * }),\n * });\n * ```\n *\n * @param search - name of the search to use the query from\n * @param options - `text` for a text source, `options` for `ts_headline` options\n */\n headline<T extends OrderArgSelf>(\n this: T,\n search: HeadlineSearchArg<T>,\n options?: HeadlineParams<T>,\n ): SetQueryReturnsColumnOrThrow<T, Column.Pick.QueryColumnOfType<string>>;\n }\n}\n\n// type of `search` argument\nexport type SearchArg<T extends PickQuerySelectable, As extends string> = {\n // alias this search to use in `order` and/or in `headline`\n as?: As;\n // order results by search rank\n order?: OrderTsQueryConfig;\n} & (\n | {\n // language to use for parsing documents into ts_vector\n language?: string | Expression;\n }\n | {\n // use a language stored in a column of the table\n languageColumn?: keyof T['__selectable'];\n }\n) &\n (\n | {\n // text to search in: simple string or raw SQL\n text: string | Expression;\n }\n | {\n // Provide one or multiple columns to search in.\n // Define an object like `{ title: 'A', body: 'B' }` to set column weights.\n in:\n | MaybeArray<keyof T['__selectable']>\n | { [K in keyof T['__selectable']]?: SearchWeight };\n }\n | {\n // search in a generated vector column\n vector: {\n [K in keyof T['__selectable']]: T['__selectable'][K]['column']['dataType'] extends 'tsvector'\n ? K\n : never;\n }[keyof T['__selectable']];\n }\n ) &\n (\n | {\n // string or a raw SQL for `websearch_to_tsquery` kind of query\n query: string | Expression;\n }\n | {\n // string or a raw SQL for `plainto_tsquery` kind of query\n plainQuery: string | Expression;\n }\n | {\n // string or a raw SQL for `phraseto_tsquery` kind of query\n phraseQuery: string | Expression;\n }\n | {\n // string or a raw SQL for `to_tsquery` kind of query\n tsQuery: string | Expression;\n }\n );\n\n// query type after `search`: this is collecting search aliases in `meta.tsQuery`\nexport type WhereSearchResult<T, As extends string> = T & {\n __tsQuery: string extends As ? never : As;\n};\n\nclass Headline extends Expression<Column.Pick.QueryColumnOfType<string>> {\n result = emptyObject as { value: Column.Pick.QueryColumnOfType<string> };\n\n constructor(\n public q: ExpressionData,\n public source: QuerySourceItem,\n public params?: HeadlineParams<Query>,\n ) {\n super();\n q.expr = this;\n }\n\n makeSQL(ctx: ToSQLCtx, quotedAs: string | undefined): string {\n const { source, params } = this;\n const q = this.q as QueryData;\n const lang = getSearchLang(ctx, q, source, quotedAs);\n\n const text = params?.text\n ? params.text instanceof Expression\n ? params.text.toSQL(ctx, quotedAs)\n : columnToSql(ctx, q, q.shape, params.text, quotedAs)\n : getSearchText(ctx, q, source, quotedAs, true);\n\n const options = params?.options\n ? `, ${\n params.options instanceof Expression\n ? params.options.toSQL(ctx, quotedAs)\n : addValue(ctx.values, params.options)\n }`\n : '';\n\n return `ts_headline(${lang}, ${text}, \"${source.as}\"${options})`;\n }\n}\n\nObject.assign(Headline, Operators.text);\n\nAggregateMethods.prototype.headline = function (\n this: PickQuerySelectable,\n search: string,\n params?: HeadlineParams<Query>,\n) {\n const q = this as unknown as Query;\n const source = q.q.sources?.[search];\n if (!source)\n throw new OrchidOrmInternalError(q, `Search \\`${search}\\` is not defined`);\n\n return new Headline(q.q as ExpressionData, source, params);\n} as never;\n\nexport class SearchMethods {\n /**\n * ## language\n *\n * By default, the search language is English.\n *\n * You can set a different default language in the `createBaseTable` config:\n *\n * ```ts\n * import { createBaseTable } from 'orchid-orm';\n *\n * export const BaseTable = createBaseTable({\n * language: 'swedish',\n * });\n * ```\n *\n * See the list of supported language configs with the SQL:\n *\n * ```sql\n * SELECT cfgname FROM pg_ts_config;\n * ```\n *\n * When performing a search, you can override the default language:\n *\n * ```ts\n * db.table.search({\n * language: 'finnish',\n * in: 'body',\n * query: 'query',\n * });\n * ```\n *\n * `language` also accepts a raw SQL.\n *\n * The language can be stored in the column of this table, then you can use `languageColumn` to use this column for the search:\n *\n * ```ts\n * db.table.search({\n * // the table has `lang` column, use it for the search\n * languageColumn: 'lang',\n * in: 'body',\n * query: 'query',\n * });\n * ```\n *\n * ## text vector to search in\n *\n * The text to search in can be a simple string, or a raw SQL, or a text column, or multiple columns:\n *\n * ```ts\n * db.table.search({\n * // search in the given string\n * text: 'simply a string to search in',\n * query: 'query',\n * });\n *\n * import { raw } from 'orchid-orm';\n *\n * db.table.search({\n * // raw SQL: join text columns with space\n * text: raw`concat_ws(' ', title, body)`,\n * query: 'query',\n * });\n *\n * db.table.search({\n * // search in a single text column\n * in: 'body',\n * query: 'query',\n * });\n *\n * db.table.search({\n * // search in multiple columns, they are concatenated with `concat_ws` as shown above\n * in: ['title', 'body'],\n * query: 'query',\n * });\n *\n * db.table.search({\n * // search in multiple columns with different weights. Weight can be A, B, C, or D\n * in: {\n * title: 'A',\n * body: 'B',\n * },\n * query: 'query',\n * });\n * ```\n *\n * For better performance, define a [generated](/guide/migration-column-methods.html#generated) column of `tsvector` type, and use it in the search with `vector` keyword:\n *\n * ```ts\n * db.table.search({\n * vector: 'titleAndBodyVector',\n * query: 'query',\n * });\n * ```\n *\n * ## search query\n *\n * Read about different search queries in [this Postgres doc](https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES).\n *\n * `search` method can accept one of the following queries:\n *\n * - `query`: corresponds to `websearch_to_tsquery` in Postgres, good to use by default\n * - `plainQuery`: corresponds to `plainto_tsquery`\n * - `phraseQuery`: corresponds to `phraseto_tsquery`\n * - `tsQuery`: corresponds to `to_tsquery`\n *\n * The `query` (`websearch_to_tsquery`) can work with any user input, while other query kinds require a specific format and will fail for invalid input.\n *\n * Each query kind accepts a string or a raw SQL.\n *\n * ```ts\n * import { raw } from 'orchid-orm';\n *\n * db.table.search({\n * vector: 'titleAndBodyVector',\n * // can accept raw SQL:\n * phraseQuery: raw`'The Fat Rats'`,\n * });\n * ```\n *\n * ## order by search rank\n *\n * Read about search ranking in [this Postgres doc](https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-RANKING).\n *\n * Set `order: true` to order results by the search rank:\n *\n * ```ts\n * db.table.search({\n * in: 'body',\n * query: 'query',\n * // will add ORDER BY ts_rank(to_tsvector('english', body)) DESC\n * order: true,\n * });\n * ```\n *\n * To order with `ts_rank_cd` instead of `ts_rank`, set `coverDensity: true`:\n *\n * ```ts\n * db.table.search({\n * in: 'body',\n * query: 'query',\n * // will add ORDER BY ts_rank_cd(to_tsvector('english', body)) DESC\n * order: {\n * coverDensity: true,\n * },\n * });\n * ```\n *\n * Other options are:\n *\n * ```ts\n * db.table.search({\n * in: 'body',\n * query: 'query',\n * order: {\n * // weights for D, C, B, A:\n * weights: [0.1, 0.2, 0.4, 1],\n * // by default, rank ignores the document length\n * // change rank behavior by providing here a special number\n * normalization: 32,\n * // it's possible to change the order direction:\n * dir: 'ASC', // DESC by default\n * },\n * });\n * ```\n *\n * Giving the `as` alias for the search allows to set the ordering in the `order` method:\n *\n * ```ts\n * db.table\n * .search({\n * as: 'search',\n * in: 'body',\n * query: 'query',\n * })\n * .order({\n * // can be `search: true` for defaults\n * search: {\n * // same options as above\n * coverDensity: true,\n * weights: [0.1, 0.2, 0.4, 1.0],\n * normalization: 32,\n * dir: 'ASC',\n * },\n * });\n * ```\n *\n * @param arg - search config\n */\n search<T extends PickQuerySelectable, As extends string>(\n this: T,\n arg: SearchArg<T, As>,\n ): WhereSearchResult<T, As> {\n const q = _clone(this);\n\n if (!arg.as) {\n const as = saveAliasedShape(q, '@q', 'joinedShapes') as As;\n\n arg = {\n ...arg,\n as,\n };\n }\n\n setQueryObjectValueImmutable(q, 'sources', arg.as as string, arg);\n if (arg.order) {\n pushQueryValueImmutable(q, 'order', arg.as);\n }\n\n return pushQueryValueImmutable(q, 'and', { SEARCH: arg }) as never;\n }\n}\n","import { isExpression } from '../../expressions/expression';\nimport { RecordUnknown } from '../../../utils';\nimport { _clone } from '../../basic-features/clone/clone';\n\nexport type ClearStatement =\n | 'with'\n | 'select'\n | 'where'\n | 'union'\n | 'using'\n | 'join'\n | 'group'\n | 'order'\n | 'having'\n | 'limit'\n | 'offset'\n | 'counters';\n\nexport class Clear {\n clear<T>(this: T, ...clears: ClearStatement[]): T {\n const q = _clone(this);\n clears.forEach((clear) => {\n if (clear === 'where') {\n delete q.q.and;\n delete q.q.or;\n } else if (clear === 'counters') {\n if ('type' in q.q && q.q.type === 'update') {\n q.q.updateData = q.q.updateData?.filter((item) => {\n if (!isExpression(item) && typeof item !== 'function') {\n let removed = false;\n for (const key in item) {\n const value = item[key] as RecordUnknown;\n if (\n typeof value === 'object' &&\n (value.op === '+' || value.op === '-')\n ) {\n delete item[key];\n removed = true;\n }\n }\n if (removed && !Object.keys(item).length) {\n return false;\n }\n }\n\n return true;\n });\n }\n } else {\n delete (q.q as never as RecordUnknown)[clear];\n }\n });\n return q as never;\n }\n}\n","import { FnUnknownToUnknown } from '../../../utils';\nimport { _clone } from '../clone/clone';\nimport { SQLQueryArgs } from '../../db-sql-query';\nimport { PickQueryQ } from '../../pick-query-types';\nimport { pushQueryValueImmutable } from '../../query-data';\n\n// Function argument of `having`:\n// the same query builder as in `select` is passed in, boolean expression is expected to be returned.\ntype HavingArgFn<T> = (q: T) => {\n result: { value: { outputType: boolean } };\n};\n\nexport class Having {\n /**\n * Build a `HAVING` clause to the query to filter records by results of [aggregate functions](#aggregate-functions).\n *\n * The argument of `having` is a function where you call the aggregate function and compare it with some value by using [column operators](/guide/where.html#column-operators).\n *\n * ```ts\n * db.table.having((q) => q.count().gte(10));\n * // HAVING count(*) >= 10\n * ```\n *\n * Multiple having conditions will be combined with `AND`:\n *\n * ```ts\n * db.table.having(\n * (q) => q.sum('column').gt(5),\n * (q) => q.avg('column').lt(10),\n * );\n * // HAVING sum(column) > 5 AND avg(column) < 10\n * ```\n *\n * After applying a comparison, `or` and `and` methods become available:\n *\n * ```ts\n * db.table.having((q) =>\n * q.sum('column').equals(5).or(q.min('column').gt(1), q.max('column').lt(10)),\n * );\n * // HAVING (sum(column) = 5) OR (min(column) > 1 AND max(column) < 10)\n * ```\n *\n * Aggregate functions are exactly the same functions described in [aggregate functions](#aggregate-functions), they can accept aggregation options:\n *\n * ```ts\n * db.table.having((q) =>\n * q\n * .count('id', {\n * distinct: true,\n * order: { createdAt: 'DESC', filter: { someColumn: { not: null } } },\n * })\n * .gte(10),\n * );\n * ```\n *\n * Arguments of the aggregate function and of the comparison can be raw SQL:\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * db.table.having((q) => q.count(sql('coalesce(one, two)')).gte(sql`2 + 2`));\n * ```\n *\n * @param args - raw SQL template string or one or multiple callbacks returning a boolean expression\n */\n having<T>(this: T, ...args: HavingArgFn<T>[]): T {\n const q = _clone(this);\n return pushQueryValueImmutable(\n q,\n 'having',\n args.map((arg) => ((arg as FnUnknownToUnknown)(q) as PickQueryQ).q.expr),\n ) as never;\n }\n\n /**\n * Provide SQL expression for the `HAVING` SQL statement:\n *\n * ```ts\n * db.table.havingSql`count(*) >= ${10}`;\n * ```\n *\n * @param args - SQL expression\n */\n havingSql<T>(this: T, ...args: SQLQueryArgs): T {\n return pushQueryValueImmutable(_clone(this), 'having', args) as never;\n }\n}\n","import { QueryReturnTypeAll, QueryReturnTypeOptional } from '../../query';\nimport { Column } from '../../../columns/column';\nimport { PickQueryReturnType } from '../../pick-query-types';\nimport { RecordUnknown } from '../../../utils';\nimport { _clone } from '../../basic-features/clone/clone';\nimport { pushQueryValueImmutable } from '../../query-data';\nimport { QueryThen } from '../../then/then';\n\nexport class QueryMap {\n /**\n * Use `map` to transform individual records of a query result.\n *\n * Use `map` to transform individual records of a query result. If the query returns multiple, `map` function going to transform records one by one.\n *\n * For an optional query result (`findOptional`, `getOptional`, etc.), `map` is **not** called for empty results.\n *\n * For transforming the result of a query as a whole, consider using {@link Query.transform} instead.\n *\n * ```ts\n * // add a `titleLength` to every post\n * const posts = await db.post.limit(10).map((post, i) => ({\n * ...post,\n * titleLength: post.title.length,\n * }));\n *\n * posts[0].titleLength; // number\n *\n * // using the exact same `map` function to transform a single post\n * const singlePost = await db.post.find(id).map((post, i) => ({\n * ...post,\n * titleLength: post.title.length,\n * }));\n *\n * singlePost.titleLength; // number\n *\n * // can be used in sub-queries\n * const postsWithComments = await db.post.select('title', {\n * comments: (q) =>\n * q.comments.map((comment, i) => ({\n * ...comment,\n * truncatedContent: comment.content.slice(0, 100),\n * })),\n * });\n *\n * postsWithComments[0].comments[0].truncatedContent; // string\n * ```\n *\n * @param fn - function to transform an individual record\n * @param thisArg - same as in the native array map\n */\n map<T extends PickQueryReturnType, Result>(\n this: T,\n fn: // `| null` is the case of aggregations such as `sum`.\n T extends { returnType: 'valueOrThrow'; then: QueryThen<infer Data | null> }\n ? (input: Data, index: number, value: Data) => Result\n : T['returnType'] extends QueryReturnTypeAll | 'pluck'\n ? T extends { then: QueryThen<(infer Data)[]> }\n ? (input: Data, index: number, arr: Data[]) => Result\n : never\n : // `| undefined` is needed to remove undefined type from map's arg\n T extends { then: QueryThen<infer Data | undefined> }\n ? (input: Data, index: number, value: Data) => Result\n : never,\n thisArg?: unknown,\n ): // When the map returns object, a query result is a map of key-value columns.\n // It's used to correctly infer type in case of a nested sub-query select with the map inside.\n Result extends RecordUnknown\n ? {\n [K in keyof T]: K extends 'result'\n ? { [K in keyof Result]: Column.Pick.QueryColumnOfType<Result[K]> }\n : K extends 'then'\n ? QueryThen<\n T['returnType'] extends QueryReturnTypeAll | 'pluck'\n ? Result[]\n : T['returnType'] extends QueryReturnTypeOptional\n ? Result | undefined\n : Result\n >\n : T[K];\n }\n : // When the map returns a scalar value, a query type should adjust to a single value\n {\n [K in keyof T]: K extends 'returnType'\n ? T['returnType'] extends QueryReturnTypeAll | 'pluck'\n ? 'pluck'\n : T['returnType'] extends 'one'\n ? 'value'\n : 'valueOrThrow'\n : K extends 'result'\n ? T['returnType'] extends QueryReturnTypeAll | 'pluck'\n ? { pluck: Column.Pick.QueryColumnOfType<Result> }\n : T['returnType'] extends QueryReturnTypeOptional\n ? { value: Column.Pick.QueryColumnOfType<Result | undefined> }\n : {\n value: Column.Pick.QueryColumnOfType<\n T extends {\n returnType: 'valueOrThrow';\n then: QueryThen<unknown | null>;\n }\n ? Result | null // aggregation such as `sum`\n : Result\n >;\n }\n : K extends 'then'\n ? QueryThen<\n T['returnType'] extends QueryReturnTypeAll | 'pluck'\n ? Result[]\n : T['returnType'] extends QueryReturnTypeOptional\n ? Result | undefined\n : T extends {\n returnType: 'valueOrThrow';\n then: QueryThen<unknown | null>;\n }\n ? Result | null\n : Result\n >\n : T[K];\n } {\n return pushQueryValueImmutable(_clone(this), 'transform', {\n map: fn,\n thisArg,\n }) as never;\n }\n}\n","import { IsQuery } from '../../query';\nimport { RawSql } from '../../expressions/raw-sql';\nimport { Column } from '../../../columns/column';\nimport { RecordUnknown, setObjectValueImmutable } from '../../../utils';\nimport {\n PickQueryBaseQuery,\n PickQueryHasSelect,\n PickQueryHasWhere,\n PickQueryInternal,\n PickQueryQ,\n PickQueryResult,\n PickQueryReturnType,\n} from '../../pick-query-types';\nimport { _clone } from '../clone/clone';\nimport { _queryUpdate } from './update';\nimport { _queryDelete, DeleteArgs, DeleteResult } from './delete';\nimport { QueryDataScopes } from '../../query-data';\nimport { _unscope } from '../../extra-features/scope/scope';\n\nexport type SoftDeleteOption<Shape extends Column.QueryColumns> =\n | true\n | keyof Shape;\n\nexport function enableSoftDelete(\n query: IsQuery,\n table: string | undefined,\n shape: Column.QueryColumnsInit,\n softDelete: true | PropertyKey,\n scopes: QueryDataScopes,\n) {\n const column = softDelete === true ? 'deletedAt' : softDelete;\n\n if (!shape[column as string]) {\n throw new Error(\n `Table ${table} is missing ${\n column as string\n } column which is required for soft delete`,\n );\n }\n\n const scope = () => ({ and: [{ [column]: null }] });\n\n (scopes as RecordUnknown).deleted = scope;\n const { q } = query as unknown as PickQueryQ;\n setObjectValueImmutable(q, 'scopes', 'nonDeleted', scope);\n\n const _del = _softDelete(\n column,\n (query as unknown as PickQueryInternal).internal.nowSQL,\n );\n (query as unknown as PickQueryBaseQuery).baseQuery.delete = function (\n this: unknown,\n ) {\n return _del.call(_clone(this));\n };\n}\n\nconst nowSql = new RawSql('now()');\n\nconst _softDelete = (column: PropertyKey, customNowSQL?: string) => {\n const set = { [column]: customNowSQL ? new RawSql(customNowSQL) : nowSql };\n return function (this: unknown) {\n return _queryUpdate(this as never, set as never);\n };\n};\n\nexport interface QueryWithSoftDelete\n extends PickQueryResult,\n PickQueryReturnType,\n PickQueryHasSelect,\n PickQueryHasWhere {\n __scopes: NonDeletedScope;\n}\n\nexport interface NonDeletedScope {\n nonDeleted: true;\n}\n\n/**\n * `softDelete` configures the table to set `deletedAt` to current time instead of deleting records.\n * All queries on such table will filter out deleted records by default.\n *\n * ```ts\n * import { BaseTable } from './baseTable';\n *\n * export class SomeTable extends BaseTable {\n * readonly table = 'some';\n * columns = this.setColumns((t) => ({\n * id: t.identity().primaryKey(),\n * deletedAt: t.timestamp().nullable(),\n * }));\n *\n * // true is for using `deletedAt` column\n * readonly softDelete = true;\n * // or provide a different column name\n * readonly softDelete = 'myDeletedAt';\n * }\n *\n * const db = orchidORM(\n * { databaseURL: '...' },\n * {\n * someTable: SomeTable,\n * },\n * );\n *\n * // deleted records are ignored by default\n * const onlyNonDeleted = await db.someTable;\n * ```\n */\nexport class SoftDeleteMethods {\n /**\n * `includeDeleted` disables the default `deletedAt` filter:\n *\n * ```ts\n * const allRecords = await db.someTable.includeDeleted();\n * ```\n */\n includeDeleted<T extends QueryWithSoftDelete>(this: T): T {\n return _unscope(_clone(this), 'nonDeleted') as never;\n }\n\n /**\n * `hardDelete` deletes records bypassing the `softDelete` behavior:\n *\n * ```ts\n * await db.someTable.find(1).hardDelete();\n * ```\n */\n hardDelete<T extends QueryWithSoftDelete>(\n this: T,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ..._args: DeleteArgs<T>\n ): DeleteResult<T> {\n return _queryDelete(_unscope(_clone(this), 'nonDeleted')) as never;\n }\n}\n","import { _clone } from '../clone/clone';\nimport { SelectableOrExpressions } from '../../expressions/expression';\nimport { PickQuerySelectable } from '../../pick-query-types';\nimport { pushQueryArrayImmutable } from '../../query.utils';\n\nexport class QueryDistinct {\n /**\n * Adds a `DISTINCT` keyword to `SELECT`:\n *\n * ```ts\n * db.table.distinct().select('name');\n * ```\n *\n * Can accept column names or raw SQL expressions to place it to `DISTINCT ON (...)`:\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * // Distinct on the name and raw SQL\n * db.table.distinct('name', sql`raw sql`).select('id', 'name');\n * ```\n *\n * @param columns - column names or a raw SQL\n */\n distinct<T extends PickQuerySelectable>(\n this: T,\n ...columns: SelectableOrExpressions<T>\n ): T {\n return pushQueryArrayImmutable(\n _clone(this),\n 'distinct',\n columns as string[],\n ) as never;\n }\n}\n","import { _clone } from '../clone/clone';\nimport { IsQuery, IsSubQuery } from '../../query';\n\ninterface SubQueryReturningSingle extends IsSubQuery {\n returnType: 'one' | 'oneOrThrow';\n}\n\nexport class QueryLimitOffset {\n /**\n * Adds a limit clause to the query.\n *\n * ```ts\n * db.table.limit(10);\n * ```\n *\n * @param arg - limit number\n */\n limit<T>(\n this: T,\n arg: T extends SubQueryReturningSingle\n ? 'Cannot apply limit on the query returning a single record'\n : number | undefined,\n ): T {\n const q = _clone(this);\n q.q.limit = arg as number;\n return q as T;\n }\n\n /**\n * Adds an offset clause to the query.\n *\n * ```ts\n * db.table.offset(10);\n * ```\n *\n * @param arg - offset number\n */\n offset<T extends IsQuery>(this: T, arg: number | undefined): T {\n const q = _clone(this);\n q.q.offset = arg;\n return q as never;\n }\n}\n","import {\n PickQueryResult,\n PickQuerySelectable,\n PickQueryTsQuery,\n} from '../../pick-query-types';\nimport { Expression } from '../../expressions/expression';\nimport { pushQueryArrayImmutable } from '../../query.utils';\nimport { _clone } from '../clone/clone';\nimport { SQLQueryArgs } from '../../db-sql-query';\nimport { sqlQueryArgsToExpression } from '../../expressions/raw-sql';\nimport { OrderTsQueryConfig } from '../../extra-features/search/search.sql';\nimport { SortDir } from './order.sql';\nimport { pushQueryValueImmutable } from '../../query-data';\n\nexport interface OrderArgSelf\n extends PickQuerySelectable,\n PickQueryResult,\n PickQueryTsQuery {}\n\nexport type OrderArg<T extends OrderArgSelf> =\n | OrderArgKey<T>\n | OrderArgTsQuery<T>\n | {\n [K in OrderArgKey<T> | OrderArgTsQuery<T>]?: K extends OrderArgTsQuery<T>\n ? OrderTsQueryConfig\n : SortDir;\n }\n | Expression;\n\nexport type OrderArgs<T extends OrderArgSelf> = OrderArg<T>[];\n\ntype OrderArgTsQuery<T extends OrderArgSelf> =\n | string\n | undefined extends T['__tsQuery']\n ? never\n : Exclude<T['__tsQuery'], undefined>;\n\ntype OrderArgKey<T extends OrderArgSelf> =\n | {\n // filter out runtime computed selectables\n [K in keyof T['__selectable']]: T['__selectable'][K]['column']['queryType'] extends undefined\n ? never\n : K;\n }[keyof T['__selectable']]\n // separate mappings are better than a single combined\n | {\n [K in keyof T['result']]: T['result'][K]['dataType'] extends\n | 'array'\n | 'object'\n | 'runtimeComputed'\n ? never\n : K;\n }[keyof T['result']];\n\nexport class QueryOrder {\n /**\n * Adds an order by clause to the query.\n *\n * Takes one or more arguments, each argument can be a column name or an object.\n *\n * ```ts\n * db.table.order('id', 'name'); // ASC by default\n *\n * db.table.order({\n * id: 'ASC', // or DESC\n *\n * // to set nulls order:\n * name: 'ASC NULLS FIRST',\n * age: 'DESC NULLS LAST',\n * });\n * ```\n *\n * `order` can refer to the values returned from `select` sub-queries (unlike `where` which cannot).\n * So you can select a count of related records and order by it.\n *\n * For example, `comment` has many `likes`.\n * We are selecting few columns of `comment`, selecting `likesCount` by a sub-query in a select, and ordering comments by likes count:\n *\n * ```ts\n * db.comment\n * .select('title', 'content', {\n * likesCount: (q) => q.likes.count(),\n * })\n * .order({\n * likesCount: 'DESC',\n * });\n * ```\n *\n * @param args - column name(s) or an object with column names and sort directions.\n */\n order<T extends OrderArgSelf>(this: T, ...args: OrderArgs<T>): T {\n return pushQueryArrayImmutable(_clone(this), 'order', args) as never;\n }\n\n /**\n * Order by SQL expression\n *\n * Order by raw SQL expression.\n *\n * ```ts\n * db.table.orderSql`raw sql`;\n * ```\n *\n * @param args - SQL expression\n */\n orderSql<T>(this: T, ...args: SQLQueryArgs): T {\n return pushQueryValueImmutable(\n _clone(this),\n 'order',\n sqlQueryArgsToExpression(args),\n ) as never;\n }\n}\n","import { ToSQLQuery } from '../../sql/to-sql';\nimport { quoteTableWithSchema, SingleSql } from '../../sql/sql';\n\nexport interface TruncateOptions {\n restartIdentity?: boolean;\n cascade?: boolean;\n}\n\nexport const makeTruncateSql = (\n query: ToSQLQuery,\n options?: TruncateOptions,\n): SingleSql => {\n let text = `TRUNCATE ${quoteTableWithSchema(query)}`;\n\n if (options?.restartIdentity) text += ' RESTART IDENTITY';\n if (options?.cascade) text += ' CASCADE';\n\n return { text, values: [] };\n};\n","import { Query, SetQueryReturnsVoid } from '../../query';\nimport { _queryExec } from '../../query.utils';\nimport { makeTruncateSql } from './truncate.sql';\nimport { _clone } from '../../basic-features/clone/clone';\n\nexport class QueryTruncate {\n /**\n * Truncates the specified table.\n *\n * ```ts\n * // simply truncate\n * await db.table.truncate();\n *\n * // restart autoincrementing columns:\n * await db.table.truncate({ restartIdentity: true });\n *\n * // truncate also dependant tables:\n * await db.table.truncate({ cascade: true });\n * ```\n *\n * @param options - truncate options, may have `cascade: true` and `restartIdentity: true`\n */\n truncate<T>(\n this: T,\n options?: { restartIdentity?: boolean; cascade?: boolean },\n ): SetQueryReturnsVoid<T> {\n const query = Object.create(_clone(this)) as Query;\n\n query.toSQL = () => makeTruncateSql(query, options);\n\n return _queryExec(query) as never;\n }\n}\n","import { RecordUnknown } from '../../../utils';\nimport { _clone } from '../clone/clone';\nimport { OrderArg, OrderArgSelf } from '../order/order';\nimport { pushQueryValueImmutable } from '../../query-data';\nimport {\n Expression,\n SelectableOrExpression,\n SelectableOrExpressions,\n} from '../../expressions/expression';\n\n// argument of the window method\n// it is an object where keys are name of windows\n// and values can be a window options or a raw SQL\nexport interface WindowArg<T extends OrderArgSelf> {\n [K: string]: WindowArgDeclaration<T> | Expression;\n}\n\n// SQL window options to specify partitionBy and order of the window\nexport interface WindowArgDeclaration<T extends OrderArgSelf = OrderArgSelf> {\n partitionBy?: SelectableOrExpression<T> | SelectableOrExpressions<T>;\n order?: OrderArg<T>;\n}\n\n// add new windows to a query\ntype WindowResult<T, W extends RecordUnknown> = T & {\n windows: { [K in keyof W]: true };\n};\n\nexport class QueryWindow {\n /**\n * Add a window with `window` and use it later by its name for aggregate or window functions:\n *\n * ```ts\n * db.table\n * // define window `windowName`\n * .window({\n * windowName: {\n * partitionBy: 'someColumn',\n * order: {\n * id: 'DESC',\n * },\n * },\n * })\n * .select({\n * avg: (q) =>\n * // calculate average price over the window\n * q.avg('price', {\n * // use window by its name\n * over: 'windowName',\n * }),\n * });\n * ```\n *\n * @param arg - window config\n */\n window<T extends OrderArgSelf, W extends WindowArg<T>>(\n this: T,\n arg: W,\n ): WindowResult<T, W> {\n return pushQueryValueImmutable(_clone(this), 'window', arg) as never;\n }\n}\n","import {\n IsQuery,\n IsSubQuery,\n Query,\n QueryReturnType,\n QueryTake,\n QueryTakeOptional,\n SetQueryReturnsAll,\n SetQueryReturnsPluck,\n SetQueryReturnsRows,\n SetQueryReturnsVoid,\n} from './query';\nimport { toSql, ToSQLQuery } from './sql/to-sql';\nimport {\n _queryAll,\n _queryExec,\n _queryRows,\n _queryTake,\n _queryTakeOptional,\n pushQueryArrayImmutable,\n} from './query.utils';\nimport {\n QueryCatchers,\n QueryThen,\n QueryThenByQuery,\n QueryThenShallowSimplify,\n QueryThenShallowSimplifyArr,\n QueryThenShallowSimplifyOptional,\n Then,\n} from './then/then';\nimport { AggregateMethods } from './basic-features/aggregate/aggregate';\nimport { Select } from './basic-features/select/select';\nimport { FromMethods } from './basic-features/from/from';\nimport {\n JoinResultRequireMain,\n OnMethods,\n QueryJoin,\n} from './basic-features/join/join';\nimport { CteQuery } from './basic-features/cte/cte.query';\nimport { Union } from './basic-features/union/union';\nimport { QueryJsonMethods } from './basic-features/json/json';\nimport { QueryCreate } from './basic-features/mutate/create';\nimport { QueryCreateFrom } from './basic-features/mutate/create-from';\nimport { QueryUpdate } from './basic-features/mutate/update';\nimport { QueryDelete } from './basic-features/mutate/delete';\nimport { QueryTransaction } from './basic-features/transaction/transaction';\nimport { For } from './basic-features/for/for';\nimport {\n _queryFindBy,\n _queryFindByOptional,\n _queryWhere,\n _queryWhereSql,\n QueryHasWhere,\n Where,\n} from './basic-features/where/where';\nimport { SearchMethods } from './extra-features/search/search';\nimport { Clear } from './extra-features/clear/clear';\nimport { Having } from './basic-features/having/having';\nimport { QueryLog } from './basic-features/log/log';\nimport { QueryHooks } from './extra-features/hooks/hooks';\nimport { QueryUpsert } from './basic-features/mutate/upsert';\nimport { QueryGet } from './basic-features/get/get.query';\nimport {\n MergeQuery,\n MergeQueryArg,\n MergeQueryMethods,\n} from './extra-features/merge/merge';\nimport { QueryTransform } from './extra-features/data-transform/transform';\nimport { QueryMap } from './extra-features/data-transform/map';\nimport { QueryScope } from './extra-features/scope/scope';\nimport { SoftDeleteMethods } from './basic-features/mutate/soft-delete';\nimport { _queryNone } from './extra-features/none/none';\nimport { _chain } from './extra-features/chain/chain';\nimport { QueryOrCreate } from './basic-features/mutate/or-create';\nimport { WithDataItems } from './basic-features/cte/cte.sql';\nimport { Column } from '../columns';\nimport { Expression, SelectableOrExpression } from './expressions/expression';\nimport { applyMixins, EmptyObject } from '../utils';\nimport {\n PickQueryResultReturnType,\n PickQueryRelations,\n PickQueryResult,\n PickQueryResultReturnTypeUniqueColumns,\n PickQuerySelectable,\n PickQuerySelectableShapeAs,\n PickQuerySelectableShapeRelationsReturnTypeIsSubQuery,\n PickQueryShapeResultReturnTypeSinglePrimaryKey,\n PickQueryTableMetaShapeTableAs,\n PickQueryHasSelectResult,\n} from './pick-query-types';\nimport {\n _getQueryAs,\n _setQueryAlias,\n QueryAsMethods,\n} from './basic-features/as/as';\nimport { QuerySql, Sql } from './sql/sql';\nimport { OrchidOrmInternalError } from './errors';\nimport { SQLQueryArgs } from './db-sql-query';\nimport { _clone, QueryClone } from './basic-features/clone/clone';\nimport { addParserForSelectItem } from './basic-features/select/select.utils';\nimport { QueryExpressions } from './expressions/query-expressions';\nimport { QueryWrap } from './basic-features/wrap/wrap';\nimport { QueryDistinct } from './basic-features/distinct/distinct';\nimport { QueryLimitOffset } from './basic-features/limit-offset/limit-offset';\nimport { QueryOrder } from './basic-features/order/order';\nimport { QueryTruncate } from './extra-features/truncate/truncate';\nimport { QueryWindow } from './basic-features/window/window';\nimport { QueryWithSchema } from './basic-features/schema/schema';\nimport { QueryStorage } from './basic-features/storage/storage';\n\nexport type GroupArgs<T extends PickQueryResult> = (\n | {\n [K in keyof T['result']]: T['result'][K]['dataType'] extends\n | 'array'\n | 'object'\n | 'runtimeComputed'\n ? never\n : K;\n }[keyof T['result']]\n | Expression\n)[];\n\ninterface QueryHelperQuery<T extends PickQuerySelectableShapeAs>\n extends MergeQueryArg {\n returnType: QueryReturnType;\n __selectable: Omit<\n T['__selectable'],\n `${T['__as']}.${Extract<keyof T['shape'], string>}`\n >;\n result: Column.QueryColumns;\n windows: EmptyObject;\n withData: WithDataItems;\n then: unknown;\n}\n\ninterface IsQueryHelper {\n isQueryHelper: true;\n table: string | undefined;\n args: unknown[];\n result: unknown;\n}\n\ninterface IsQueryHelperForTable<Table extends string | undefined>\n extends IsQueryHelper {\n table: Table;\n}\n\ninterface QueryHelper<\n T extends PickQueryTableMetaShapeTableAs,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Args extends any[],\n Result,\n> extends IsQueryHelper {\n <Q extends QueryHelperQuery<T>>(\n q: Q,\n ...args: Args\n ): Result extends MergeQueryArg ? MergeQuery<Q, Result> : Result;\n\n __as: T['__as'];\n table: T['table'];\n args: Args;\n result: Result;\n}\n\n// Get result of query helper, for https://github.com/romeerez/orchid-orm/issues/215\nexport type QueryHelperResult<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends QueryHelper<PickQueryTableMetaShapeTableAs, any[], MergeQueryArg>,\n> = T['result'];\n\ninterface NarrowTypeSelf extends PickQueryResultReturnType {\n returnType:\n | undefined\n | 'all'\n | 'one'\n | 'oneOrThrow'\n | 'value'\n | 'valueOrThrow'\n | 'pluck';\n}\n\ntype NarrowInvalidKeys<T extends PickQueryResult, Narrow> = {\n [K in keyof Narrow]: K extends keyof T['result']\n ? Narrow[K] extends T['result'][K]['outputType']\n ? never\n : K\n : K;\n}[keyof Narrow];\n\ninterface NarrowValueTypeResult<T extends PickQueryResultReturnType, Narrow>\n extends Column.QueryColumns {\n value: {\n [K in keyof T['result']['value']]: K extends 'outputType'\n ? Narrow\n : T['result']['value'][K];\n };\n}\n\ninterface NarrowPluckTypeResult<T extends PickQueryResultReturnType, Narrow>\n extends Column.QueryColumns {\n pluck: {\n [K in keyof T['result']['pluck']]: K extends 'outputType'\n ? Narrow extends unknown[]\n ? Narrow[number]\n : Narrow\n : T['result']['pluck'][K];\n };\n}\n\ntype QueryIfResult<\n T extends PickQueryResultReturnType,\n R extends PickQueryResult,\n> = {\n [K in keyof T]: K extends 'result'\n ? {\n [K in\n | keyof T['result']\n | keyof R['result']]: K extends keyof T['result']\n ? K extends keyof R['result']\n ? R['result'][K] | T['result'][K]\n : T['result'][K]\n : Column.Modifiers.QueryColumnToOptional<R['result'][K]>;\n }\n : K extends 'then'\n ? QueryIfResultThen<T, R>\n : T[K];\n};\n\nexport type QueryIfResultThen<\n T extends PickQueryResultReturnType,\n R extends PickQueryResult,\n> = T['returnType'] extends undefined | 'all'\n ? QueryThenShallowSimplifyArr<\n {\n [K in keyof T['result']]: K extends keyof R['result']\n ? T['result'][K]['outputType'] | R['result'][K]['outputType']\n : T['result'][K]['outputType'];\n } & {\n [K in keyof R['result'] as K extends keyof T['result']\n ? never\n : K]?: R['result'][K]['outputType'];\n }\n >\n : T['returnType'] extends 'one'\n ? QueryThenShallowSimplifyOptional<\n {\n [K in keyof T['result']]: K extends keyof R['result']\n ? T['result'][K]['outputType'] | R['result'][K]['outputType']\n : T['result'][K]['outputType'];\n } & {\n [K in keyof R['result'] as K extends keyof T['result']\n ? never\n : K]?: R['result'][K]['outputType'];\n }\n >\n : T['returnType'] extends 'oneOrThrow'\n ? QueryThenShallowSimplify<\n {\n [K in keyof T['result']]: K extends keyof R['result']\n ? T['result'][K]['outputType'] | R['result'][K]['outputType']\n : T['result'][K]['outputType'];\n } & {\n [K in keyof R['result'] as K extends keyof T['result']\n ? never\n : K]?: R['result'][K]['outputType'];\n }\n >\n : T['returnType'] extends 'value'\n ? QueryThen<\n | T['result']['value']['outputType']\n | R['result']['value']['outputType']\n | undefined\n >\n : T['returnType'] extends 'valueOrThrow'\n ? QueryThen<\n T['result']['value']['outputType'] | R['result']['value']['outputType']\n >\n : T['returnType'] extends 'rows'\n ? QueryThen<\n (\n | T['result'][keyof T['result']]['outputType']\n | R['result'][keyof R['result']]['outputType']\n )[][]\n >\n : T['returnType'] extends 'pluck'\n ? QueryThen<\n (\n | T['result']['pluck']['outputType']\n | R['result']['pluck']['outputType']\n )[]\n >\n : QueryThen<void>;\n\nexport interface QueryMethods<ColumnTypes>\n extends QueryClone,\n QueryAsMethods,\n AggregateMethods,\n QueryDistinct,\n Select,\n FromMethods,\n QueryJoin,\n QueryLimitOffset,\n CteQuery,\n Union,\n QueryJsonMethods,\n QueryCreate,\n QueryCreateFrom,\n QueryUpdate,\n QueryDelete,\n QueryStorage,\n QueryTransaction,\n QueryTruncate,\n For,\n Where,\n SearchMethods,\n Clear,\n Having,\n QueryCatchers,\n QueryLog,\n QueryOrder,\n QueryWithSchema,\n QueryHooks,\n QueryUpsert,\n QueryOrCreate,\n QueryGet,\n MergeQueryMethods,\n QuerySql<ColumnTypes>,\n QueryTransform,\n QueryMap,\n QueryScope,\n SoftDeleteMethods,\n QueryExpressions,\n QueryWrap,\n QueryWindow {}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport class QueryMethods<ColumnTypes> {\n /**\n * `.all` is a default behavior, that returns an array of objects:\n *\n * ```ts\n * const records = db.table\n * .take() // .take() will be overridden by .all()\n * .all();\n * ```\n */\n all<T extends PickQueryResult>(this: T): SetQueryReturnsAll<T> {\n return _queryAll(_clone(this)) as never;\n }\n\n /**\n * Use `take` to \"take\" a single record. It adds `LIMIT 1`, throws a `NotFoundError` when not found.\n *\n * ```ts\n * const taken: TableType = await db.table.where({ key: 'value' }).take();\n * ```\n *\n * Makes no effect if the query previously has `get`, `pluck`, `exec`.\n *\n * Changes `getOptional` to `get`.\n */\n take<T extends PickQueryResultReturnType>(this: T): QueryTake<T> {\n return _queryTake(_clone(this)) as never;\n }\n\n /**\n * Use `takeOptional` to \"take\" a single record. It adds `LIMIT 1`, returns `undefined` when not found.\n *\n * ```ts\n * const takenOptional: TableType | undefined = await db.table\n * .where({ key: 'value' })\n * .takeOptional();\n * ```\n *\n * Makes no effect if the query previously has `getOptional`, `pluck`, `exec`.\n *\n * Changes `get` to `getOptional`.\n */\n takeOptional<T extends PickQueryResultReturnType>(\n this: T,\n ): QueryTakeOptional<T> {\n return _queryTakeOptional(_clone(this)) as never;\n }\n\n /**\n * `.rows` returns an array of arrays without field names:\n *\n * ```ts\n * const rows: Array<Array<number | string>> = await db.table\n * .select('id', 'name')\n * .rows();\n *\n * rows.forEach((row) => {\n * // row is array of column values\n * row.forEach((value) => {\n * // value is an id or a name\n * });\n * });\n * ```\n */\n rows<T extends PickQueryResult>(this: T): SetQueryReturnsRows<T> {\n return _queryRows(_clone(this)) as never;\n }\n\n /**\n * `.pluck` returns a single array of a single selected column values:\n *\n * ```ts\n * const ids = await db.table.select('id').pluck();\n * // ids are an array of all users' id like [1, 2, 3]\n * ```\n * @param select - column name or a raw SQL\n */\n pluck<T extends PickQuerySelectable, S extends SelectableOrExpression<T>>(\n this: T,\n select: S,\n ): SetQueryReturnsPluck<T, S> {\n const q = _clone(this);\n q.q.returnType = 'pluck';\n\n const selected = addParserForSelectItem(\n q as never,\n q.q.as || q.table,\n 'pluck',\n select,\n );\n q.q.select = selected ? [selected as never] : undefined;\n return q as never;\n }\n\n /**\n * `.exec` won't parse the response at all, and returns undefined:\n *\n * ```ts\n * const nothing = await db.table.take().exec();\n * ```\n */\n exec<T>(this: T): SetQueryReturnsVoid<T> {\n return _queryExec(_clone(this)) as never;\n }\n\n /**\n * Call `toSQL` on a query to get an object with a `text` SQL string and a `values` array of binding values:\n *\n * ```ts\n * const sql = db.table.select('id', 'name').where({ name: 'name' }).toSQL();\n *\n * expect(sql.text).toBe(\n * 'SELECT \"table\".\"id\", \"table\".\"name\" FROM \"table\" WHERE \"table\".\"name\" = $1',\n * );\n * expect(sql.values).toEqual(['name']);\n * ```\n *\n * `toSQL` is called internally when awaiting a query.\n *\n * It is caching the result. Not mutating query methods are resetting the cache, but need to be careful with mutating methods that start with `_` - they won't reset the cache, which may lead to unwanted results.\n *\n * `toSQL` optionally accepts such parameters:\n *\n * ```ts\n * type ToSqlOptions = {\n * values?: [];\n * };\n * ```\n */\n toSQL(this: ToSQLQuery, callFromThen?: boolean): Sql {\n return toSql(\n this,\n this.q.type,\n undefined,\n undefined,\n undefined,\n callFromThen,\n );\n }\n\n /**\n * Finds a single record by the primary key (id), throws [NotFoundError](/guide/error-handling.html) if not found.\n * Not available if the table has no or multiple primary keys.\n *\n * ```ts\n * const result: TableType = await db.table.find(1);\n * ```\n *\n * @param value - primary key value to find by\n */\n find<T extends PickQueryShapeResultReturnTypeSinglePrimaryKey>(\n this: T,\n value: T['internal']['singlePrimaryKey'] | Expression,\n ): QueryTake<T> & QueryHasWhere {\n const q = _clone(this);\n\n if (value === null || value === undefined) {\n throw new OrchidOrmInternalError(\n q,\n `${value} is not allowed in the find method`,\n );\n }\n\n return _queryTake(\n _queryWhere(q, [\n {\n [q.internal.singlePrimaryKey]: value,\n } as never,\n ]),\n ) as never;\n }\n\n /**\n * Finds a single record with a given SQL, throws {@link NotFoundError} if not found:\n *\n * ```ts\n * await db.user.findBySql`\n * age = ${age} AND\n * name = ${name}\n * `;\n * ```\n *\n * @param args - SQL expression\n */\n findBySql<T extends PickQueryResultReturnType>(\n this: T,\n ...args: SQLQueryArgs\n ): QueryTake<T> & QueryHasWhere {\n const q = _clone(this);\n return _queryTake(_queryWhereSql(q, args)) as never;\n }\n\n /**\n * Finds a single record by the primary key (id), returns `undefined` when not found.\n * Not available if the table has no or multiple primary keys.\n *\n * ```ts\n * const result: TableType | undefined = await db.table.find(123);\n * ```\n *\n * @param value - primary key value to find by, or a raw SQL\n */\n findOptional<T extends PickQueryShapeResultReturnTypeSinglePrimaryKey>(\n this: T,\n value: T['internal']['singlePrimaryKey'] | Expression,\n ): QueryTakeOptional<T> & QueryHasWhere {\n return _queryTakeOptional((this as unknown as Query).find(value)) as never;\n }\n\n /**\n * Finds a single record with a given SQL.\n * Returns `undefined` when not found.\n *\n * ```ts\n * await db.user.findBySqlOptional`\n * age = ${age} AND\n * name = ${name}\n * `;\n * ```\n *\n * @param args - SQL expression\n */\n findBySqlOptional<T extends PickQueryResultReturnType>(\n this: T,\n ...args: SQLQueryArgs\n ): QueryTakeOptional<T> & QueryHasWhere {\n return _queryTakeOptional(\n (this as unknown as Query).findBySql(...args),\n ) as never;\n }\n\n /**\n * Finds a single unique record, throws [NotFoundError](/guide/error-handling.html) if not found.\n * It accepts values of primary keys, unique columns, or compound unique constraints defined on the table.\n * `findBy`'s argument type is a union of all possible sets of unique conditions.\n *\n * You can use `where(...).take()` for non-unique conditions.\n *\n * ```ts\n * await db.table.findBy({ key: 'value' });\n * ```\n *\n * @param uniqueColumnValues - is derived from primary keys, unique columns, and compound unique constraints in the table\n */\n findBy<T extends PickQueryResultReturnTypeUniqueColumns>(\n this: T,\n uniqueColumnValues: T['internal']['uniqueColumns'],\n ): QueryTake<T> & QueryHasWhere {\n return _queryFindBy(_clone(this), uniqueColumnValues as never) as never;\n }\n\n /**\n * Finds a single unique record, returns `undefined` if not found.\n * It accepts values of primary keys, unique columns, or compound unique constraints defined on the table.\n * `findBy`'s argument type is a union of all possible sets of unique conditions.\n *\n * You can use `where(...).takeOptional()` for non-unique conditions.\n *\n * ```ts\n * await db.table.findByOptional({ key: 'value' });\n * ```\n *\n * @param uniqueColumnValues - is derived from primary keys, unique columns, and compound unique constraints in the table\n */\n findByOptional<T extends PickQueryResultReturnTypeUniqueColumns>(\n this: T,\n uniqueColumnValues: T['internal']['uniqueColumns'],\n ): QueryTakeOptional<T> & QueryHasWhere {\n return _queryFindByOptional(\n _clone(this),\n uniqueColumnValues as never,\n ) as never;\n }\n\n /**\n * For the `GROUP BY` SQL statement, it is accepting column names or raw expressions.\n *\n * `group` is useful when aggregating values.\n *\n * ```ts\n * // Select the category and sum of prices grouped by the category\n * const results = db.product\n * .select('category')\n * .selectSum('price', { as: 'sumPrice' })\n * .group('category');\n * ```\n *\n * Also, it's possible to group by a selected value:\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * const results = db.product\n * .select({\n * month: sql`extract(month from \"createdAt\")`.type((t) =>\n * // month is returned as string, parse it to int\n * t.string().parse(parseInt),\n * ),\n * })\n * .selectSum('price', { as: 'sumPrice' })\n * // group by month extracted from \"createdAt\"\n * .group('month');\n * ```\n *\n * Column aliases in `select` take precedence over table columns,\n * so if in the query above `db.product` had a column `month`,\n * the query would work in the exact same way, group by would reference the selected `month` expression.\n *\n * @param columns - column names or a raw SQL\n */\n group<T extends PickQueryHasSelectResult>(\n this: T,\n ...columns: T['__hasSelect'] extends true\n ? GroupArgs<T>\n : { error: 'select is required for group' }[]\n ): T {\n return pushQueryArrayImmutable(_clone(this), 'group', columns) as never;\n }\n\n /**\n * `none` will resolve the query into an empty result, without executing a database query.\n *\n * ```ts\n * await db.table.none(); // -> empty array\n * await db.table.findOptional(123).none(); // -> undefined\n * await db.table.find(123).none(); // throws NotFoundError\n * ```\n *\n * [create](/guide/create-update-delete.html#create) chained with `count`, [update](/guide/create-update-delete.html#update), and [delete](/guide/create-update-delete.html#del-delete) are returning a count of affected records.\n *\n * When they are called with `none`, query does not execute and 0 is returned.\n *\n * ```ts\n * await db.table.insert(data); // -> 0\n * await db.table.all().update(data); // -> 0\n * await db.table.all().delete(); // -> 0\n * ```\n *\n * When it's being used in sub-selects, it will return empty arrays, `undefined`'s, or `0` for count,\n * or it will throw if the sub-query require a result:\n *\n * ```ts\n * await db.user.select({\n * // returns empty array\n * pets: (q) => q.pets.none(),\n * // returns `undefined`\n * firstPet: (q) => q.pets.none().takeOptional(),\n * // throws NotFound error\n * requriedFirstPet: (q) => q.pets.none().take(),\n * // returns `undefined`\n * firstPetName: (q) => q.pets.none().getOptional('name'),\n * // throws NotFound error\n * requiredFirstPetName: (q) => q.pets.none().get('name'),\n * // returns empty array\n * petsNames: (q) => q.pets.none().pluck('name'),\n * // returns 0\n * petsCount: (q) => q.pets.none().count(),\n * });\n * ```\n *\n * When the `none` query is being used for joins that require match, the host query will return an empty result:\n *\n * ```ts\n * // all the following queries will resolve into empty arrays\n *\n * await db.user.select({\n * pets: (q) => q.pets.join().none(),\n * });\n *\n * await db.user.join((q) => q.pets.none());\n *\n * await db.user.join('pets', (q) => q.none());\n * ```\n *\n * When it's being used in `leftJoin` or `fullJoin`, it implicitly adds `ON false` into the join's SQL.\n *\n * ```ts\n * // this query can return user records\n * await db.user.leftJoin('pets', (q) => q.none());\n *\n * // this query won't return user records, because of the added where condition\n * await db.user.leftJoin('pets', (q) => q.none()).where({ 'pets.name': 'Kitty' });\n * ```\n */\n none<T>(this: T): T {\n return _queryNone(this);\n }\n\n /**\n * Use `makeHelper` to make a query helper - a function where you can modify the query, and reuse this function across different places.\n *\n * The idea is similar to {@link modify}, the difference is that `modify` is per query, and `makeHelper` can be reused.\n *\n * ```ts\n * const defaultAuthorSelect = db.author.makeHelper((q) => {\n * return q.select('firstName', 'lastName');\n * });\n *\n * // this will select id, firstName, lastName with a correct TS type\n * // and return a single record\n * const result = await defaultAuthorSelect(db.author.select('id').find(1));\n * ```\n *\n * Such helper is available for relation queries inside `select`:\n *\n * ```ts\n * await db.book.select({\n * author: (book) => defaultAuthorSelect(book.author),\n * });\n * ```\n *\n * Helper can accept additional arguments:\n *\n * ```ts\n * const selectFollowing = db.user.makeHelper((q, currentUser: { id: number }) => {\n * return q.select({\n * following: (q) =>\n * q.followers.where({ followerId: currentUser.id }).exists(),\n * });\n * });\n *\n * // select some columns and the `following` boolean field from users\n * await selectFollowing(db.user.select('id', 'name'), currentUser);\n * ```\n *\n * To get the result type of query helper, use `QueryHelperResult` type:\n *\n * ```ts\n * import { QueryHelperResult } from 'orchid-orm';\n *\n * const selectHelper = db.table.makeHelper((q) => q.select('id', 'name'));\n *\n * // This type is identical to `db.table.select('id', 'name')`\n * type SelectQuery = QueryHelperResult<typeof selectHelper>;\n *\n * // Await to get result, the type is `{ id: number, name: string }[]`\n * type Result = Awaited<QueryHelperResult<typeof selectHelper>>;\n * ```\n *\n * @param fn - helper function\n */\n makeHelper<\n T extends PickQuerySelectableShapeAs,\n Args extends unknown[],\n Result extends MergeQueryArg,\n >(\n this: T,\n fn: (q: T, ...args: Args) => Result,\n ): QueryHelper<T, Args, Result> {\n const helperAs =\n (this as unknown as Query).q.as ||\n ((this as unknown as Query).table as string);\n\n return ((query: T, ...args: Args) => {\n const q = _clone(query);\n\n // alias the original table name inside the makeHelper with dynamic table name from the invoking code\n const as = _getQueryAs(q);\n if (as) {\n _setQueryAlias(q, as, helperAs);\n }\n\n return fn(q as never, ...args);\n }) as never;\n }\n\n /**\n * `useHelper` allows to use {@link makeHelper} in different queries:\n *\n * ```ts\n * const helper = db.table.makeHelper((q) => {\n * // all query methods are available\n * return q.select('name').where({ active: true }).order({ createdAt: 'DESC' });\n * });\n *\n * const record = await db.table.select('id').useHelper(helper).find(1);\n *\n * record.id; // id was selected before `useHelper`\n * record.name; // name was selected by the function\n * ```\n *\n * When the helper result isn't certain, it will result in a union of all possibilities.\n * Use this sparingly as it complicates dealing with the result.\n *\n * ```ts\n * const helper = db.table.makeHelper((q) => {\n * if (Math.random() > 0.5) {\n * return q.select('one');\n * } else {\n * return q.select('two');\n * }\n * });\n *\n * const record = await db.table.useHelper(helper).find(1);\n *\n * // TS error: we don't know for sure if the `one` was selected.\n * record.one;\n *\n * // use `in` operator to disambiguate the result type\n * if ('one' in record) {\n * record.one;\n * } else {\n * record.two;\n * }\n * ```\n *\n * You can define and pass parameters:\n *\n * ```ts\n * const helper = db.table.makeHelper((q, select: 'id' | 'name') => {\n * return q.select(select);\n * });\n *\n * const record = await db.table.useHelper(helper, 'id').find(1);\n * // record has type { id: number } | { name: string }\n * if ('id' in record) {\n * record.id;\n * }\n * ```\n *\n * @param fn - function to useHelper the query with. The result type will be merged with the main query as if the `merge` method was used.\n * @param args\n */\n useHelper<\n T extends MergeQueryArg,\n Fn extends IsQueryHelperForTable<T['table']>,\n >(\n this: T,\n fn: Fn,\n ...args: Fn['args']\n ): Fn['result'] extends MergeQueryArg\n ? MergeQuery<T, Fn['result']>\n : Fn['result'] {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (fn as any)(this as never, ...args);\n }\n\n /**\n * `modify` is useful when you'd like to modify the query based on some condition.\n *\n * ```ts\n * // parameters coming from outside\n * const selectOneOrAnother = true;\n * const filterBySomething = true;\n *\n * type ResultType =\n * | { id: number; one: string }[]\n * | { id: number; another: string }[];\n * const result = await db.table\n * .select('id')\n * // conditional select results in a union type\n * .modify((q) => (includeName ? q.select('one') : q.select('another')))\n * // can use any query methods in modify\n * .modify((q) => (filterBySomething ? q.where({ something: true }) : q));\n * ```\n *\n * @param fn - accepts the current query as a parameters. Anything returned by the function will be the return type of the query.\n */\n modify<T, R>(this: T, fn: (q: T) => R): R {\n return fn(this);\n }\n\n /**\n * Narrows a part of the query output type.\n * Use with caution, type-safety isn't guaranteed with it.\n * This is similar so using `as` keyword from TypeScript, except that it applies only to a part of the result.\n *\n * The syntax `()<{ ... }>()` is enforced by internal limitations.\n *\n * ```ts\n * const rows = db.table\n * // filter out records where the `nullableColumn` is null\n * .where({ nullableColumn: { not: null } });\n * // narrows only a specified column, the rest of result is unchanged\n * .narrowType()<{ nullableColumn: string }>()\n *\n * // the column had type `string | null`, now it is `string`\n * rows[0].nullableColumn\n *\n * // imagine that table has a enum column kind with variants 'first' | 'second'\n * // and a boolean `approved`\n * db.table\n * .where({ kind: 'first', approved: true })\n * // after applying such `where`, it's safe to narrow the type to receive the literal values\n * .narrowType()<{ kind: 'first', approved: true }>();\n * ```\n */\n narrowType<T extends NarrowTypeSelf>(\n this: T,\n ): <Narrow>() => T['returnType'] extends\n | undefined\n | 'all'\n | 'one'\n | 'oneOrThrow'\n ? [NarrowInvalidKeys<T, Narrow>] extends [never]\n ? {\n [K in keyof T]: K extends 'result'\n ? T['result'] & {\n [K in keyof Narrow]: {\n outputType: Narrow[K];\n };\n }\n : K extends 'then'\n ? QueryThenByQuery<\n T,\n T['result'] & {\n [K in keyof Narrow]: {\n outputType: Narrow[K];\n };\n }\n >\n : T[K];\n }\n : `narrowType() error: provided type does not extend the '${NarrowInvalidKeys<\n T,\n Narrow\n > &\n string}' column type`\n : (\n T['returnType'] extends 'pluck'\n ? Narrow extends unknown[]\n ? Narrow[number]\n : Narrow\n : Narrow\n ) extends (\n T['returnType'] extends 'pluck'\n ? T['result']['pluck']['outputType']\n : T['result']['value']['outputType']\n )\n ? {\n [K in keyof T]: K extends 'result'\n ? T['returnType'] extends 'value' | 'valueOrThrow'\n ? NarrowValueTypeResult<T, Narrow>\n : NarrowPluckTypeResult<T, Narrow>\n : K extends 'then'\n ? QueryThenByQuery<\n T,\n T['returnType'] extends 'value' | 'valueOrThrow'\n ? NarrowValueTypeResult<T, Narrow>\n : NarrowPluckTypeResult<T, Narrow>\n >\n : T[K];\n }\n : 'narrowType() error: provided type does not extend the returning column column type' {\n return () => this as never;\n }\n\n if<T extends PickQueryResultReturnType, R extends PickQueryResult>(\n this: T,\n condition: boolean | null | undefined,\n fn: (q: T) => R & { returnType: T['returnType'] },\n ): QueryIfResult<T, R> {\n return (condition ? fn(this) : this) as never;\n }\n\n queryRelated<\n T extends PickQueryRelations,\n RelName extends keyof T['relations'],\n >(\n this: T,\n relName: RelName,\n params: T['relations'][RelName]['params'],\n ): T['relations'][RelName]['maybeSingle'] {\n return this.relations[relName as string].queryRelated(params) as never;\n }\n\n chain<\n T extends PickQuerySelectableShapeRelationsReturnTypeIsSubQuery,\n RelName extends keyof T['relations'],\n >(\n this: T,\n relName: RelName,\n ): // Adding `selectable` context of a parent table only if it is a sub query\n T['__subQuery'] extends true | undefined\n ? [T['returnType'], T['relations'][RelName]['returnsOne']] extends [\n 'one' | 'oneOrThrow',\n true,\n ]\n ? {\n [K in\n | keyof T['relations'][RelName]['maybeSingle']]: K extends '__selectable'\n ? T['relations'][RelName]['maybeSingle']['__selectable'] &\n Omit<T['__selectable'], keyof T['shape']>\n : T['relations'][RelName]['maybeSingle'][K];\n } & IsSubQuery\n : JoinResultRequireMain<\n T['relations'][RelName]['query'],\n Omit<T['__selectable'], keyof T['shape']>\n >\n : T['relations'][RelName]['query'] {\n const rel = this.relations[relName as string];\n\n return _chain(this as unknown as IsQuery, _clone(rel.query), rel) as never;\n }\n}\n\napplyMixins(QueryMethods, [\n QueryClone,\n QueryAsMethods,\n AggregateMethods,\n QueryDistinct,\n Select,\n FromMethods,\n QueryJoin,\n QueryLimitOffset,\n OnMethods,\n CteQuery,\n Union,\n QueryJsonMethods,\n QueryCreate,\n QueryCreateFrom,\n QueryUpdate,\n QueryDelete,\n QueryStorage,\n QueryTransaction,\n QueryTruncate,\n For,\n Where,\n SearchMethods,\n Clear,\n Having,\n Then,\n QueryLog,\n QueryOrder,\n QueryWithSchema,\n QueryUpsert,\n QueryOrCreate,\n QueryHooks,\n QueryGet,\n MergeQueryMethods,\n QuerySql,\n QueryTransform,\n QueryMap,\n QueryScope,\n SoftDeleteMethods,\n QueryExpressions,\n QueryWrap,\n QueryWindow,\n]);\n","import { QueryBuilder } from './db';\nimport { QueryData } from './query-data';\nimport {\n isRawSQL,\n RawSqlBase,\n templateLiteralToSQL,\n} from './expressions/raw-sql';\nimport { Sql } from './sql/sql';\nimport { TemplateLiteralArgs } from './expressions/expression';\nimport { AdapterBase, QueryResult, QueryResultRow } from '../adapters/adapter';\nimport { RecordUnknown } from '../utils';\nimport { TopToSqlCtx, ToSQLCtx } from './sql/to-sql';\nimport { QueryInternal } from './query-internal';\n\n// Argument for `query` and `queryArrays`, it can be a SQL template literal, or a raw SQL object.\nexport type SQLQueryArgs = TemplateLiteralArgs | [RawSqlBase];\n\nexport interface DbSqlQuery {\n <T extends QueryResultRow = QueryResultRow>(...args: SQLQueryArgs): Promise<\n QueryResult<T>\n >;\n\n /**\n * Returns an array of records:\n *\n * ```ts\n * const array: T[] = await db.$query.records<T>`SELECT * FROM table`;\n * ```\n */\n records<T extends RecordUnknown = RecordUnknown>(\n ...args: SQLQueryArgs\n ): Promise<T[]>;\n\n /**\n * Returns a single record, throws [NotFoundError](/guide/error-handling) if not found.\n *\n * ```ts\n * const one: T = await db.$query.take<T>`SELECT * FROM table LIMIT 1`;\n * ```\n */\n take<T extends RecordUnknown = RecordUnknown>(\n ...args: SQLQueryArgs\n ): Promise<T>;\n\n /**\n * Returns a single record or `undefined` when not found.\n *\n * ```ts\n * const maybeOne: T | undefined = await db.$query\n * .takeOptional<T>`SELECT * FROM table LIMIT 1`;\n * ```\n */\n takeOptional<T extends RecordUnknown = RecordUnknown>(\n ...args: SQLQueryArgs\n ): Promise<T | undefined>;\n\n /**\n * Returns array of tuples of the values:\n *\n * ```ts\n * const arrayOfTuples: [number, string][] = await db.$query.rows<\n * [number, string]\n * >`SELECT id, name FROM table`;\n * ```\n */\n rows<T extends unknown[]>(...args: SQLQueryArgs): Promise<T[]>;\n\n /**\n * Returns a flat array of values for a single column:\n *\n * ```ts\n * const strings: string[] = await db.$query.pluck<string>`SELECT name FROM table`;\n * ```\n */\n pluck<T>(...args: SQLQueryArgs): Promise<T[]>;\n\n /**\n * Returns a single value, throws [NotFoundError](/guide/error-handling) if not found.\n *\n * ```ts\n * const value: number = await db.$query.get<number>`SELECT 1`;\n * ```\n */\n get<T>(...args: SQLQueryArgs): Promise<T>;\n\n /**\n * Returns a single value or `undefined` when not found.\n *\n * ```ts\n * const value: number | undefined = await db.$query.getOptional<number>`SELECT 1`;\n * ```\n */\n getOptional<T>(...args: SQLQueryArgs): Promise<T | undefined>;\n}\n\nexport const performQuery = async <Result = QueryResult>(\n q: {\n qb: QueryBuilder;\n internal: QueryInternal;\n adapterNotInTransaction: AdapterBase;\n q: QueryData;\n },\n args: SQLQueryArgs,\n method: 'query' | 'arrays',\n): Promise<Result> => {\n const trx = q.internal.asyncStorage.getStore();\n let sql: Sql;\n if (isRawSQL(args[0])) {\n const values: unknown[] = [];\n sql = {\n text: args[0].toSQL({ values }),\n values,\n };\n } else {\n const values: unknown[] = [];\n\n const ctx: ToSQLCtx = {\n topCtx: undefined as never,\n qb: q.qb,\n q: q.q,\n sql: [],\n values,\n selectedCount: 0,\n };\n ctx.topCtx = ctx as TopToSqlCtx;\n\n sql = {\n text: templateLiteralToSQL(args as TemplateLiteralArgs, ctx),\n values,\n };\n }\n\n const log = trx?.log ?? q.q.log;\n let logData: unknown | undefined;\n if (log) logData = log.beforeQuery(sql);\n\n try {\n const result = await (trx?.transactionAdapter || q.adapterNotInTransaction)[\n method as 'query'\n ](sql.text, sql.values);\n\n if (log) log.afterQuery(sql, logData);\n\n return result as Result;\n } catch (err) {\n if (log) {\n log.onError(err as Error, sql, logData);\n }\n\n throw err;\n }\n};\n","import {\n DbDomainArg,\n DbExtension,\n GeneratorIgnore,\n IsQuery,\n Query,\n SelectableFromShape,\n} from './query';\nimport { QueryMethods } from './query-methods';\nimport {\n anyShape,\n Column,\n ColumnSchemaConfig,\n ColumnsShape,\n DefaultColumnTypes,\n getColumnTypes,\n makeColumnTypes,\n} from '../columns';\nimport { inspect } from 'node:util';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n DynamicRawSQL,\n raw,\n RawSql,\n sqlFn,\n UnsafeSqlExpression,\n} from './expressions/raw-sql';\nimport { SqlRefExpression } from './expressions/sql-ref-expression';\nimport { ScopeArgumentQuery } from './extra-features/scope/scope';\nimport {\n defaultSchemaConfig,\n DefaultSchemaConfig,\n} from '../columns/default-schema-config';\nimport {\n enableSoftDelete,\n NonDeletedScope,\n SoftDeleteOption,\n} from './basic-features/mutate/soft-delete';\nimport {\n parseTableData,\n TableData,\n TableDataFn,\n TableDataItem,\n TableDataItemsUniqueColumns,\n TableDataItemsUniqueColumnTuples,\n TableDataItemsUniqueConstraints,\n UniqueQueryTypeOrExpression,\n} from '../tableData';\nimport {\n applyComputedColumns,\n ComputedColumnsFromOptions,\n ComputedOptionsFactory,\n} from './extra-features/computed/computed';\nimport { DbSqlQuery, performQuery, SQLQueryArgs } from './db-sql-query';\nimport { snakeCaseKey } from '../columns/types';\nimport { setDb } from '../columns/operators';\nimport {\n applyMixins,\n emptyObject,\n EmptyObject,\n pushOrNewArray,\n RecordString,\n RecordUnknown,\n toSnakeCase,\n} from '../utils';\nimport { AdapterBase, QueryArraysResult } from '../adapters/adapter';\nimport { NotFoundError, QueryError, QueryErrorName } from './errors';\nimport { ColumnsParsers } from './query-columns/query-column-parsers';\nimport { MaybeArray } from 'rollup';\nimport { DynamicSQLArg, StaticSQLArgs } from './expressions/expression';\nimport { logParamToLogObject, QueryLogOptions } from './basic-features/log/log';\nimport {\n handleResult,\n QueryCatch,\n QueryThenShallowSimplifyArr,\n} from './then/then';\nimport {\n _queryHookBeforeCreate,\n _queryHookBeforeSave,\n _queryHookBeforeUpdate,\n} from './extra-features/hooks/hooks';\nimport { QueryData, QueryDataScopes } from './query-data';\nimport { QueryInternal } from './query-internal';\nimport { QuerySchema } from './basic-features/schema/schema';\nimport { AsyncState } from './basic-features/storage/storage';\nimport { DbRole } from './extra-features/roles/roles';\n\nexport type ShapeColumnPrimaryKeys<Shape extends Column.QueryColumnsInit> = {\n [K in {\n [K in keyof Shape]: Shape[K]['data']['primaryKey'] extends string\n ? K\n : never;\n }[keyof Shape]]: UniqueQueryTypeOrExpression<Shape[K]['queryType']>;\n};\n\nexport type ShapeUniqueColumns<Shape extends Column.QueryColumnsInit> = {\n [K in keyof Shape]: Shape[K]['data']['unique'] extends string\n ? {\n [C in K]: UniqueQueryTypeOrExpression<Shape[K]['queryType']>;\n }\n : never;\n}[keyof Shape];\n\nexport type UniqueConstraints<Shape extends Column.QueryColumnsInit> =\n | {\n [K in keyof Shape]: Shape[K]['data']['primaryKey'] extends string\n ? string extends Shape[K]['data']['primaryKey']\n ? never\n : Shape[K]['data']['primaryKey']\n : Shape[K]['data']['unique'] extends string\n ? string extends Shape[K]['data']['unique']\n ? never\n : Shape[K]['data']['unique']\n : never;\n }[keyof Shape];\n\nexport type NoPrimaryKeyOption = 'error' | 'warning' | 'ignore';\n\n// Options that are also available in `orchidORM` of the ORM\nexport interface DbSharedOptions extends QueryLogOptions {\n autoPreparedStatements?: boolean;\n noPrimaryKey?: NoPrimaryKeyOption;\n extensions?: (string | RecordString)[];\n domains?: {\n [K: string]: DbDomainArg<DefaultColumnTypes<DefaultSchemaConfig>>;\n };\n generatorIgnore?: GeneratorIgnore;\n schema?: QuerySchema;\n /**\n * For `hasMany` and `hasOne`:\n * controls nested create|connect|connectOrCreate strategy in `createMany`.\n * When creating many records <= this value, it will use a single query with CTEs.\n * Otherwise, it will perform nested operations in separate queries in a transaction.\n * A single query is more efficient on lower amount of records and on lower latency to a database.\n */\n nestedCreateBatchMax?: number;\n roles?: DbRole[];\n managedRolesSql?: string;\n}\n\nexport interface DbOptions<SchemaConfig extends ColumnSchemaConfig, ColumnTypes>\n extends DbSharedOptions {\n schemaConfig?: SchemaConfig;\n // concrete column types or a callback for overriding standard column types\n // this types will be used in tables to define their columns\n columnTypes?:\n | ColumnTypes\n | ((t: DefaultColumnTypes<SchemaConfig>) => ColumnTypes);\n // when set to true, all columns will be translated to `snake_case` when querying database\n snakeCase?: boolean;\n // if `now()` for some reason doesn't suite your timestamps, provide a custom SQL for it\n nowSQL?: string;\n}\n\nexport interface DbOptionsWithAdapter<\n SchemaConfig extends ColumnSchemaConfig,\n ColumnTypes,\n> extends DbOptions<SchemaConfig, ColumnTypes> {\n adapter: AdapterBase;\n}\n\n// Options of `createDb`.\nexport interface DbTableOptions<\n ColumnTypes,\n Table extends string | undefined,\n Shape extends Column.QueryColumns,\n> extends QueryLogOptions {\n schema?: QuerySchema;\n /**\n * Prepare all SQL queries before executing,\n * true by default\n */\n autoPreparedStatements?: boolean;\n noPrimaryKey?: NoPrimaryKeyOption;\n snakeCase?: boolean;\n /**\n * Default language for the full text search\n */\n language?: string;\n /**\n * See {@link ScopeMethods}\n */\n scopes?: DbTableOptionScopes<Table, Shape>;\n /**\n * See {@link SoftDeleteMethods}\n */\n softDelete?: SoftDeleteOption<Shape>;\n /**\n * Table comment, for migrations generator\n */\n comment?: string;\n /**\n * Computed SQL or JS columns definitions\n */\n computed?: ComputedOptionsFactory<ColumnTypes, Shape>;\n /**\n * For customizing `now()` sql, used in soft delete\n */\n nowSQL?: string;\n}\n\n/**\n * See {@link ScopeMethods}\n */\nexport type DbTableOptionScopes<\n Table extends string | undefined,\n Shape extends Column.QueryColumns,\n Keys extends string = string,\n> = { [K in Keys]: (q: ScopeArgumentQuery<Table, Shape>) => IsQuery };\n\nexport interface QueryBuilder extends Query {\n returnType: undefined;\n}\n\nexport class Db<\n Table extends string | undefined = undefined,\n Shape extends Column.QueryColumnsInit = Column.QueryColumnsInit,\n PrimaryKeys = never,\n UniqueColumns = never,\n UniqueColumnTuples = never,\n UniqueConstraints = never,\n ColumnTypes = DefaultColumnTypes<ColumnSchemaConfig>,\n ShapeWithComputed extends Column.QueryColumnsInit = Shape,\n Scopes extends RecordUnknown | undefined = EmptyObject,\n DefaultSelect extends keyof Shape = keyof Shape,\n >\n extends QueryMethods<ColumnTypes>\n implements Query\n{\n declare q: QueryData;\n declare __isQuery: true;\n declare __as: Table & string;\n declare __selectable: SelectableFromShape<ShapeWithComputed, Table>;\n // declare __subQuery: boolean;\n declare __hasSelect: boolean;\n declare __hasWhere: boolean;\n declare __defaults: {\n [K in {\n [K in keyof Shape]: unknown extends Shape[K]['data']['default']\n ? never\n : K;\n }[keyof Shape]]: true;\n };\n declare __scopes: { [K in keyof Scopes]: true };\n declare __defaultSelect: DefaultSelect;\n baseQuery: Query;\n columns: (keyof Shape)[];\n declare outputType: ColumnsShape.DefaultSelectOutput<Shape>;\n declare inputType: ColumnsShape.Input<Shape>;\n declare result: { [K in DefaultSelect]: Shape[K] };\n declare returnType: undefined;\n declare then: QueryThenShallowSimplifyArr<ColumnsShape.DefaultOutput<Shape>>;\n declare windows: EmptyObject;\n relations: EmptyObject;\n relationQueries: EmptyObject;\n declare withData: EmptyObject;\n error: new (\n message: string,\n length: number,\n name: QueryErrorName,\n ) => QueryError<this>;\n internal: QueryInternal<\n {\n [K in keyof PrimaryKeys]: (\n keyof PrimaryKeys extends K ? never : keyof PrimaryKeys\n ) extends never\n ? PrimaryKeys[K]\n : never;\n }[keyof PrimaryKeys],\n PrimaryKeys | UniqueColumns,\n | {\n [K in keyof Shape]: Shape[K]['data']['unique'] extends string\n ? K\n : never;\n }[keyof Shape]\n | keyof PrimaryKeys,\n UniqueColumnTuples,\n UniqueConstraints\n >;\n declare catch: QueryCatch;\n\n constructor(\n public adapterNotInTransaction: AdapterBase,\n public qb: QueryBuilder,\n public table: Table = undefined as Table,\n public shape: ShapeWithComputed = anyShape as ShapeWithComputed,\n public columnTypes: ColumnTypes,\n asyncStorage: AsyncLocalStorage<AsyncState>,\n options: DbTableOptions<ColumnTypes, Table, ShapeWithComputed>,\n tableData: TableData = {},\n ) {\n super();\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n\n const { softDelete } = options;\n const scopes = (\n options.scopes || softDelete ? {} : emptyObject\n ) as QueryDataScopes;\n\n this.baseQuery = this as Query;\n this.relations = {};\n this.relationQueries = {};\n\n const logger = options.logger || console;\n\n const parsers = {} as ColumnsParsers;\n let hasParsers = false;\n let modifyQuery: ((q: Query) => void)[] | undefined = undefined;\n let prepareSelectAll = false;\n let hasHookSetters: true | undefined;\n let runtimeDefaultColumns: string[] | undefined;\n let selectAllCount = 0;\n const { snakeCase } = options;\n for (const key in shape) {\n const column = shape[key] as unknown as Column;\n column.data.key = key;\n\n if (column._parse) {\n hasParsers = true;\n parsers[key] = column._parse;\n }\n\n if (column.data.name) {\n prepareSelectAll = true;\n } else if (snakeCase) {\n const snakeName = toSnakeCase(key);\n if (snakeName !== key) {\n prepareSelectAll = true;\n column.data.name = snakeName;\n }\n }\n\n if (column.data.explicitSelect) {\n prepareSelectAll = true;\n } else {\n selectAllCount++;\n }\n\n const { modifyQuery: mq } = column.data;\n if (mq) {\n modifyQuery = pushOrNewArray(modifyQuery, (q: Query) => mq(q, column));\n }\n\n if (typeof column.data.default === 'function') {\n if (!runtimeDefaultColumns) runtimeDefaultColumns = [key];\n else runtimeDefaultColumns.push(key);\n\n if (!column.data.runtimeDefault) {\n const {\n data: { default: def, encode },\n } = column;\n\n column.data.runtimeDefault = encode\n ? () => encode(def())\n : (def as () => unknown);\n }\n }\n\n if (\n column.data.setOnCreate ||\n column.data.setOnUpdate ||\n column.data.setOnSave\n ) {\n hasHookSetters = true;\n }\n }\n\n this.internal = {\n runtimeDefaultColumns,\n asyncStorage,\n scopes,\n snakeCase: options.snakeCase,\n noPrimaryKey: options.noPrimaryKey === 'ignore',\n comment: options.comment,\n nowSQL: options.nowSQL,\n tableData,\n selectAllCount,\n } as QueryInternal;\n\n this.q = {\n adapter: adapterNotInTransaction,\n shape: shape as Column.QueryColumnsInit,\n handleResult,\n logger,\n log: logParamToLogObject(logger, options.log),\n autoPreparedStatements: options.autoPreparedStatements ?? false,\n defaultParsers: hasParsers ? parsers : undefined,\n language: options.language,\n schema: options?.schema,\n } as QueryData;\n\n let shapeHasPrimaryKey: boolean | undefined;\n for (const key in shape) {\n if (shape[key].data.primaryKey) {\n shapeHasPrimaryKey = true;\n\n if (this.internal.singlePrimaryKey) {\n this.internal.singlePrimaryKey = undefined as never;\n break;\n }\n\n this.internal.singlePrimaryKey = key as never;\n }\n }\n\n if (\n !shapeHasPrimaryKey &&\n !tableData.primaryKey &&\n shape !== anyShape &&\n options.noPrimaryKey !== 'ignore'\n ) {\n const message = `Table ${table} has no primary key`;\n if (options.noPrimaryKey === 'error') throw new Error(message);\n else logger.warn(message);\n }\n\n const columns = Object.keys(shape) as unknown as (keyof Shape)[];\n\n this.columns = columns as (keyof Shape)[];\n\n if (options.computed) applyComputedColumns(this, options.computed);\n\n if (prepareSelectAll) {\n const selectAllShape: RecordUnknown = (this.q.selectAllShape = {});\n const list: string[] = [];\n for (const key in shape) {\n const column = shape[key] as unknown as Column;\n if (!column.data.explicitSelect) {\n list.push(\n column.data.name ? `\"${column.data.name}\" \"${key}\"` : `\"${key}\"`,\n );\n selectAllShape[key] = column;\n }\n }\n this.q.selectAllColumns = list;\n } else {\n this.q.selectAllShape = { ...shape };\n }\n\n if (modifyQuery) {\n for (const cb of modifyQuery) {\n cb(this);\n }\n }\n\n this.error = class extends QueryError {\n constructor(message?: string) {\n super(self, message);\n }\n };\n\n if (options.scopes) {\n for (const key in options.scopes) {\n const scopeFn = options.scopes[key];\n\n (scopes as RecordUnknown)[key] = (q: Query) => {\n const result = scopeFn(q as never) as Query;\n return { and: result.q.and, or: result.q.or };\n };\n }\n\n if (scopes.default) {\n this.q.scopes = { default: scopes.default };\n }\n }\n\n if (softDelete) {\n enableSoftDelete(this, table, shape, softDelete, scopes);\n }\n\n if (hasHookSetters) {\n const hooks = {\n setOnCreate: _queryHookBeforeCreate,\n setOnUpdate: _queryHookBeforeUpdate,\n setOnSave: _queryHookBeforeSave,\n };\n\n for (const key in shape) {\n const { data } = shape[key] as unknown as Column;\n\n for (const hookKey in hooks) {\n const fn = data[hookKey as 'setOnCreate'];\n if (fn) {\n hooks[hookKey as 'setOnCreate'](this, (arg) => {\n const value = fn(arg);\n if (value !== undefined) {\n arg.set({ [key]: value });\n }\n });\n }\n }\n }\n }\n }\n\n /**\n * When in transaction, returns a db adapter object for the transaction,\n * returns a default adapter object otherwise.\n */\n $getAdapter() {\n return (\n this.internal.asyncStorage.getStore()?.transactionAdapter ||\n this.adapterNotInTransaction\n );\n }\n\n [inspect.custom]() {\n return `Query<${this.table}>`;\n }\n\n /**\n * Use `query` to perform raw SQL queries.\n *\n * ```ts\n * const value = 1;\n *\n * // it is safe to interpolate inside the backticks (``):\n * const result = await db.query<{ one: number }>`SELECT ${value} AS one`;\n * // data is inside `rows` array:\n * result.rows[0].one;\n * ```\n *\n * If the query is executing inside a transaction, it will use the transaction connection automatically.\n *\n * ```ts\n * await db.transaction(async () => {\n * // both queries will execute in the same transaction\n * await db.query`SELECT 1`;\n * await db.query`SELECT 2`;\n * });\n * ```\n *\n * Alternatively, support a simple SQL string, with optional `values`:\n *\n * Note that the values is a simple array, and the SQL is referring to the values with `$1`, `$2` and so on.\n *\n * ```ts\n * const value = 1;\n *\n * // it is NOT safe to interpolate inside a simple string, use `values` to pass the values.\n * import { raw } from 'orchid-orm';\n *\n * const result = await db.query<{ one: number }>(raw({\n * raw: 'SELECT $1 AS one',\n * values: [value],\n * }));\n * // data is inside `rows` array:\n * result.rows[0].one;\n * ```\n *\n * @param args - SQL template literal, or a raw SQL object created by `raw()` or `sql()` function\n */\n get query(): DbSqlQuery {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const q = this;\n let query = q._query;\n if (!query) {\n q._query = query = Object.assign(\n (...args: SQLQueryArgs) => performQuery(q, args, 'query'),\n {\n async records(...args: SQLQueryArgs) {\n const { rows } = await performQuery(q, args, 'query');\n return rows;\n },\n async take(...args: SQLQueryArgs) {\n const {\n rows: [row],\n } = await performQuery(q, args, 'query');\n if (!row) throw new NotFoundError(q);\n return row;\n },\n async takeOptional(...args: SQLQueryArgs) {\n const { rows } = await performQuery(q, args, 'query');\n return rows[0];\n },\n async rows(...args: SQLQueryArgs) {\n const { rows } = await performQuery(q, args, 'arrays');\n return rows;\n },\n async pluck(...args: SQLQueryArgs) {\n const { rows } = await performQuery(q, args, 'arrays');\n return rows.map((row) => row[0]);\n },\n async get(...args: SQLQueryArgs) {\n const {\n rows: [row],\n } = await performQuery(q, args, 'arrays');\n if (!row) throw new NotFoundError(q);\n return row[0];\n },\n async getOptional(...args: SQLQueryArgs) {\n const { rows } = await performQuery(q, args, 'arrays');\n return rows[0]?.[0];\n },\n },\n ) as never;\n }\n return query;\n }\n private _query?: DbSqlQuery;\n\n /**\n * Performs a SQL query, returns a db result with array of arrays instead of objects:\n *\n * ```ts\n * const value = 1;\n *\n * // it is safe to interpolate inside the backticks (``):\n * const result = await db.queryArrays<[number]>`SELECT ${value} AS one`;\n * // `rows` is an array of arrays:\n * const row = result.rows[0];\n * row[0]; // our value\n * ```\n *\n * @param args - SQL template literal, or a raw SQL object created by `raw()` or `sql()` function\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n queryArrays<R extends any[] = any[]>(\n ...args: SQLQueryArgs\n ): Promise<QueryArraysResult<R>> {\n return performQuery<QueryArraysResult<R>>(this, args, 'arrays');\n }\n}\n\nsetDb(Db);\n\napplyMixins(Db, [QueryMethods]);\nDb.prototype.constructor = Db;\nDb.prototype.__isQuery = true;\n\n// Function to build a new table instance.\nexport interface DbTableConstructor<ColumnTypes> {\n <\n Table extends string,\n Shape extends Column.QueryColumnsInit,\n Data extends MaybeArray<TableDataItem>,\n Options extends DbTableOptions<ColumnTypes, Table, Shape>,\n >(\n table: Table,\n shape?: ((t: ColumnTypes) => Shape) | Shape,\n tableData?: TableDataFn<Shape, Data>,\n options?: Options,\n ): Db<\n Table,\n Shape,\n keyof ShapeColumnPrimaryKeys<Shape> extends never\n ? never\n : ShapeColumnPrimaryKeys<Shape>,\n ShapeUniqueColumns<Shape> | TableDataItemsUniqueColumns<Shape, Data>,\n TableDataItemsUniqueColumnTuples<Shape, Data>,\n UniqueConstraints<Shape> | TableDataItemsUniqueConstraints<Data>,\n ColumnTypes,\n Shape & ComputedColumnsFromOptions<Options['computed']>,\n MapTableScopesOption<Options>,\n ColumnsShape.DefaultSelectKeys<Shape>\n > & {\n ko: Shape;\n };\n}\n\nexport interface DbSqlMethod<ColumnTypes> {\n <T>(...args: StaticSQLArgs): RawSql<\n Column.Pick.QueryColumnOfType<T>,\n ColumnTypes\n >;\n <T>(\n ...args: [DynamicSQLArg<Column.Pick.QueryColumnOfType<T>>]\n ): DynamicRawSQL<Column.Pick.QueryColumnOfType<T>, ColumnTypes>;\n ref(name: string): SqlRefExpression;\n unsafe(sql: string | number | boolean): UnsafeSqlExpression;\n}\n\nexport type MapTableScopesOption<T> = T extends { scopes: RecordUnknown }\n ? T extends { softDelete: true | PropertyKey }\n ? T['scopes'] & NonDeletedScope\n : T['scopes']\n : T extends { softDelete: true | PropertyKey }\n ? { nonDeleted: unknown }\n : EmptyObject;\n\nexport interface DbResult<ColumnTypes>\n extends Db<string, never, never, never, never, never, ColumnTypes>,\n DbTableConstructor<ColumnTypes> {\n adapter: AdapterBase;\n close: AdapterBase['close'];\n sql: DbSqlMethod<ColumnTypes>;\n}\n{\n}\n\n/**\n * If you'd like to use the query builder of OrchidORM as a standalone tool, install `pqb` package and use `createDb` to initialize it.\n *\n * As `Orchid ORM` focuses on ORM usage, docs examples mostly demonstrates how to work with ORM-defined tables,\n * but everything that's not related to table relations should also work with `pqb` query builder on its own.\n *\n * It is accepting the same options as `orchidORM` + options of `createBaseTable`:\n *\n * ```ts\n * import { createDb } from 'orchid-orm';\n *\n * import { zodSchemaConfig } from 'orchid-orm-schema-to-zod';\n * // or\n * import { SchemaConfig } from 'orchid-orm-valibot';\n *\n * const db = createDb({\n * // db connection options\n * databaseURL: process.env.DATABASE_URL,\n * log: true,\n *\n * // columns in db are in snake case:\n * snakeCase: true,\n *\n * // override default SQL for timestamp, see `nowSQL` above\n * nowSQL: `now() AT TIME ZONE 'UTC'`,\n *\n * // optional, but recommended: makes zod schemas for your tables\n * schemaConfig: zodSchemaConfig,\n * // or\n * schemaConfig: valibotSchemaConfig,\n *\n * // override column types:\n * columnTypes: (t) => ({\n * // by default timestamp is returned as a string, override to a number\n * timestamp: () => t.timestamp().asNumber(),\n * }),\n * });\n * ```\n *\n * After `db` is defined, construct queryable tables in such way:\n *\n * ```ts\n * export const User = db('user', (t) => ({\n * id: t.identity().primaryKey(),\n * name: t.string(),\n * password: t.varchar(100),\n * age: t.integer().nullable(),\n * ...t.timestamps(),\n * }));\n * ```\n *\n * Now the `User` can be used for making type-safe queries:\n *\n * ```ts\n * const users = await User.select('id', 'name') // only known columns are allowed\n * .where({ age: { gte: 20 } }) // gte is available only on the numeric field, and the only number is allowed\n * .order({ createdAt: 'DESC' }) // type safe as well\n * .limit(10);\n *\n * // users array has a proper type of Array<{ id: number, name: string }>\n * ```\n *\n * The optional third argument is for table options:\n *\n * ```ts\n * const Table = db('table', (t) => ({ ...columns }), {\n * // provide this value if the table belongs to a specific database schema:\n * schema: 'customTableSchema',\n * // override `log` option of `createDb`:\n * log: true, // boolean or object described `createdDb` section\n * logger: { ... }, // override logger\n * noPrimaryKey: 'ignore', // override noPrimaryKey\n * snakeCase: true, // override snakeCase\n * })\n * ```\n */\nexport const createDbWithAdapter = <\n SchemaConfig extends ColumnSchemaConfig = DefaultSchemaConfig,\n ColumnTypes = DefaultColumnTypes<SchemaConfig>,\n>({\n log,\n logger,\n snakeCase,\n schemaConfig = defaultSchemaConfig as unknown as SchemaConfig,\n columnTypes: ctOrFn = makeColumnTypes(schemaConfig) as unknown as ColumnTypes,\n schema,\n ...options\n}: DbOptionsWithAdapter<SchemaConfig, ColumnTypes>): DbResult<ColumnTypes> => {\n const { adapter } = options;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const commonOptions: DbTableOptions<any, any, Column.QueryColumns> = {\n log,\n logger,\n autoPreparedStatements: options.autoPreparedStatements ?? false,\n noPrimaryKey: options.noPrimaryKey ?? 'error',\n nowSQL: options.nowSQL,\n snakeCase,\n };\n\n const ct =\n typeof ctOrFn === 'function'\n ? (\n ctOrFn as unknown as (\n t: DefaultColumnTypes<SchemaConfig>,\n ) => ColumnTypes\n )(makeColumnTypes(schemaConfig))\n : ctOrFn;\n\n if (snakeCase) {\n (ct as { [snakeCaseKey]?: boolean })[snakeCaseKey] = true;\n }\n\n const asyncStorage = new AsyncLocalStorage<AsyncState>();\n\n const qb = _initQueryBuilder(\n adapter,\n ct,\n asyncStorage,\n commonOptions,\n options,\n );\n\n commonOptions.schema = schema;\n\n const { nowSQL } = options;\n const tableConstructor: DbTableConstructor<ColumnTypes> = (\n table,\n shape,\n dataFn,\n options,\n ) => {\n return new Db(\n adapter,\n qb as never,\n table,\n typeof shape === 'function'\n ? getColumnTypes(ct, shape, nowSQL, options?.language)\n : shape,\n ct,\n asyncStorage,\n { ...commonOptions, ...options },\n parseTableData(dataFn),\n ) as never;\n };\n\n const db = Object.assign(tableConstructor, qb, {\n adapter,\n close: () => adapter.close(),\n });\n\n Object.setPrototypeOf(db, Db.prototype);\n\n db.sql = _createDbSqlMethod(ct) as typeof db.sql;\n\n return db as never;\n};\n\nexport function _createDbSqlMethod<ColumnTypes>(\n columnTypes: ColumnTypes,\n): DbSqlMethod<ColumnTypes> {\n // bind column types\n const fn = ((...args: unknown[]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sql = (raw as any)(...args);\n sql.columnTypes = columnTypes;\n return sql;\n }) as DbSqlMethod<ColumnTypes>;\n fn.ref = sqlFn.ref;\n fn.unsafe = sqlFn.unsafe;\n return fn;\n}\n\nexport const _initQueryBuilder = (\n adapter: AdapterBase,\n columnTypes: unknown,\n asyncStorage: AsyncLocalStorage<AsyncState>,\n commonOptions: DbTableOptions<unknown, undefined, Column.QueryColumns>,\n options: DbSharedOptions,\n): Db => {\n const qb = new Db(\n adapter,\n undefined as unknown as QueryBuilder,\n undefined,\n anyShape,\n columnTypes,\n asyncStorage,\n commonOptions,\n );\n\n qb.internal.nestedCreateBatchMax = options.nestedCreateBatchMax ?? 100;\n\n if (options.extensions) {\n const arr: DbExtension[] = [];\n for (const x of options.extensions) {\n if (typeof x === 'string') {\n arr.push({ name: x });\n } else {\n for (const key in x) {\n arr.push({ name: key, version: x[key] });\n }\n }\n }\n qb.internal.extensions = arr;\n }\n\n qb.internal.domains = options.domains;\n qb.internal.generatorIgnore = options.generatorIgnore;\n qb.internal.roles = options.roles;\n qb.internal.managedRolesSql = options.managedRolesSql;\n\n return (qb.qb = qb as never);\n};\n","import { emptyObject } from '../utils';\nimport { setTimeout } from 'timers/promises';\nimport { QueryError } from '../query/errors';\nimport { Query, QuerySchema } from '../query';\n\n/**\n * Generic result returning from query methods.\n */\nexport interface QueryResultRow {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [K: string]: any;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface QueryResult<T extends QueryResultRow = any> {\n rowCount: number;\n rows: T[];\n fields: {\n name: string;\n }[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface QueryArraysResult<R extends any[] = any[]> {\n rowCount: number;\n rows: R[];\n fields: { name: string }[];\n}\n\nexport interface AdapterConfigBase {\n databaseURL?: string;\n /**\n * This option may be useful in CI when database container has started, CI starts performing next steps,\n * migrations begin to apply though database may be not fully ready for connections yet.\n *\n * Set `connectRetry: true` for the default backoff strategy. It performs 10 attempts starting with 50ms delay and increases delay exponentially according to this formula:\n *\n * ```\n * (factor, defaults to 1.5) ** (currentAttempt - 1) * (delay, defaults to 50)\n * ```\n *\n * So the 2nd attempt will happen in 50ms from start, 3rd attempt in 125ms, 3rd in 237ms, and so on.\n *\n * You can customize max attempts to be made, `factor` multiplier and the starting delay by passing:\n *\n * ```ts\n * const options = {\n * databaseURL: process.env.DATABASE_URL,\n * connectRetry: {\n * attempts: 15, // max attempts\n * strategy: {\n * delay: 100, // initial delay\n * factor: 2, // multiplier for the formula above\n * }\n * }\n * };\n *\n * rakeDb(options, { ... });\n * ```\n *\n * You can pass a custom function to `strategy` to customize delay behavior:\n *\n * ```ts\n * import { setTimeout } from 'timers/promises';\n *\n * const options = {\n * databaseURL: process.env.DATABASE_URL,\n * connectRetry: {\n * attempts: 5,\n * stragegy(currentAttempt: number, maxAttempts: number) {\n * // linear: wait 100ms after 1st attempt, then 200m after 2nd, and so on.\n * return setTimeout(currentAttempt * 100);\n * },\n * },\n * };\n * ```\n */\n connectRetry?: AdapterConfigConnectRetryParam | true;\n}\n\ninterface AdapterConfigConnectRetryParam {\n attempts?: number;\n strategy?:\n | AdapterConfigConnectRetryStrategyParam\n | AdapterConfigConnectRetryStrategy;\n}\n\ninterface AdapterConfigConnectRetryStrategyParam {\n delay?: number;\n factor?: number;\n}\n\nexport interface AdapterConfigConnectRetry {\n attempts: number;\n strategy: AdapterConfigConnectRetryStrategy;\n}\n\ninterface AdapterConfigConnectRetryStrategy {\n (attempt: number, attempts: number): Promise<void> | void;\n}\n\nexport interface AdapterTransactionOptions {\n options?: string;\n locals?: {\n [ConfigName: string]: string | number;\n };\n}\n\nexport type TransactionArgs<Result> = [\n cbOrOptions:\n | undefined\n | AdapterTransactionOptions\n | ((adapter: TransactionAdapterBase) => Promise<Result>),\n optionalCb?: (adapter: TransactionAdapterBase) => Promise<Result>,\n];\n\n// Interface of a database adapter to use for different databases.\nexport interface AdapterBase {\n connectRetryConfig?: AdapterConfigConnectRetry;\n searchPath?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n errorClass: new (...args: any[]) => Error;\n assignError(to: QueryError, from: Error): void;\n isInTransaction(): boolean;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n updateConfig(config: any): Promise<void>;\n\n reconfigure(params: {\n database?: string;\n user?: string;\n password?: string;\n searchPath?: string;\n }): AdapterBase;\n\n getDatabase(): string;\n getUser(): string;\n getSearchPath(): string | undefined;\n getHost(): string;\n // adapter is not using the schema anyhow on its own, it just stores it for rake-db\n getSchema(): QuerySchema | undefined;\n\n connect?(): Promise<unknown>;\n\n // make a query to get rows as objects\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n // only has effect in a transaction\n startingSavepoint?: string,\n releasingSavepoint?: string,\n ): Promise<QueryResult<T>>;\n // make a query to get rows as array of column values\n arrays<R extends any[] = any[]>( // eslint-disable-line @typescript-eslint/no-explicit-any\n text: string,\n values?: unknown[],\n // only has effect in a transaction\n startingSavepoint?: string,\n releasingSavepoint?: string,\n ): Promise<QueryArraysResult<R>>;\n /**\n * Run a transaction\n *\n * @param cb - callback will be called with a db client with a dedicated connection.\n * @param options - optional transaction parameters\n */\n transaction<T>(\n options: AdapterTransactionOptions | undefined,\n cb: (adapter: TransactionAdapterBase) => Promise<T>,\n ): Promise<T>;\n /**\n * Run a transaction\n *\n * @param cb - callback will be called with a db client with a dedicated connection.\n */\n transaction<T>(\n cb: (adapter: TransactionAdapterBase) => Promise<T>,\n ): Promise<T>;\n // close connection\n close(): Promise<void>;\n}\n\n/**\n * Use it as an argument type when need to enforce the call site to use a transaction\n */\nexport interface TransactionAdapterBase extends AdapterBase {\n isInTransaction(): true;\n}\n\n/**\n * Element of `afterCommit` transaction array. See {@link AsyncState.afterCommit}.\n */\nexport type TransactionAfterCommitHook =\n | unknown[]\n | Query\n | AfterCommitHook[]\n | AfterCommitStandaloneHook;\n\n// Function to call after transaction commit.\nexport interface AfterCommitHook {\n (data: unknown[], q: Query): unknown | Promise<unknown>;\n}\n\nexport interface AfterCommitStandaloneHook {\n (): unknown | Promise<unknown>;\n}\n\nexport const setConnectRetryConfig = (\n adapter: AdapterBase,\n config: AdapterConfigConnectRetryParam,\n) => {\n adapter.connectRetryConfig = {\n attempts: config.attempts ?? 10,\n strategy:\n typeof config.strategy === 'function'\n ? config.strategy\n : defaultConnectRetryStrategy(config.strategy ?? emptyObject),\n };\n};\n\nexport const wrapAdapterFnWithConnectRetry = <\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Fn extends (this: unknown, ...args: any[]) => Promise<unknown>,\n>(\n adapter: AdapterBase,\n fn: Fn,\n) => {\n return async function (...args) {\n let attempt = 1;\n for (;;) {\n try {\n return await fn.call(this, ...args);\n } catch (err) {\n const config = adapter.connectRetryConfig;\n if (\n !err ||\n typeof err !== 'object' ||\n (err as { code: string }).code !== 'ECONNREFUSED' ||\n !config ||\n attempt >= config.attempts\n ) {\n throw err;\n }\n\n await config.strategy(attempt, config.attempts);\n attempt++;\n }\n }\n } as Fn;\n};\n\nconst defaultConnectRetryStrategy = (\n param: AdapterConfigConnectRetryStrategyParam,\n): AdapterConfigConnectRetryStrategy => {\n return (attempt) =>\n setTimeout((param.factor ?? 1.5) ** (attempt - 1) * (param.delay ?? 50));\n};\n"],"names":["path","_query","prepareSubQueryForSql","i","raw","args","sql","key","hasOptions","moveMutativeQueryToCte","parse","encode","column","q","getQuerySchema","result","transactionAdapter","opts","res","relationRow","resolve","reject","state","promise","tableHook","purpose","values","addTopCteSql","addTopCte","joinSubQuery","relation","as","shape","columnsCount","query","value","select","target","on","join","s","cteName","emptyArray","pushQueryValueImmutable","inspect","AsyncLocalStorage","options","setTimeout"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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"}