@crvouga/postgres-mem 0.1.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.
- package/AGENTS.md +159 -0
- package/COMPATIBILITY-AUDIT.md +155 -0
- package/COMPATIBILITY.md +87 -0
- package/LICENSE +21 -0
- package/README.md +325 -0
- package/compat/coverage.json +1081 -0
- package/compat/divergences.json +191 -0
- package/compat/gate-report.json +80 -0
- package/compat/requirements.json +1105 -0
- package/compat/requirements.raw.html +484 -0
- package/compat/scenario-types.ts +98 -0
- package/compat/scenarios.ts +98 -0
- package/compat/sections/agg.ts +45 -0
- package/compat/sections/api.ts +28 -0
- package/compat/sections/arr.ts +45 -0
- package/compat/sections/cat.ts +47 -0
- package/compat/sections/con.ts +32 -0
- package/compat/sections/cpy.ts +24 -0
- package/compat/sections/cte.ts +29 -0
- package/compat/sections/dat.ts +60 -0
- package/compat/sections/ddl.ts +55 -0
- package/compat/sections/det.ts +20 -0
- package/compat/sections/dml.ts +37 -0
- package/compat/sections/eco.ts +16 -0
- package/compat/sections/err.ts +16 -0
- package/compat/sections/exp.ts +53 -0
- package/compat/sections/fun.ts +58 -0
- package/compat/sections/fzz.ts +36 -0
- package/compat/sections/guc.ts +27 -0
- package/compat/sections/joi.ts +33 -0
- package/compat/sections/jsn.ts +46 -0
- package/compat/sections/lim.ts +13 -0
- package/compat/sections/par.ts +61 -0
- package/compat/sections/pre.ts +26 -0
- package/compat/sections/sch.ts +31 -0
- package/compat/sections/sel.ts +43 -0
- package/compat/sections/seq.ts +31 -0
- package/compat/sections/snp.ts +21 -0
- package/compat/sections/tok.ts +53 -0
- package/compat/sections/trg.ts +57 -0
- package/compat/sections/tsr.ts +37 -0
- package/compat/sections/txn.ts +39 -0
- package/compat/sections/typ.ts +55 -0
- package/compat/sections/uni.ts +13 -0
- package/compat/sections/win.ts +43 -0
- package/compat/smoke-baseline.json +3 -0
- package/compat/unsupported-register.json +2526 -0
- package/dist/api/bind.d.ts +10 -0
- package/dist/api/database.d.ts +69 -0
- package/dist/api/statement.d.ts +51 -0
- package/dist/ast/nodes.d.ts +810 -0
- package/dist/constraints/enforce.d.ts +39 -0
- package/dist/errors/error.d.ts +24 -0
- package/dist/executor/ddl.d.ts +23 -0
- package/dist/executor/dml.d.ts +10 -0
- package/dist/executor/execute.d.ts +11 -0
- package/dist/executor/relation.d.ts +60 -0
- package/dist/executor/select.d.ts +41 -0
- package/dist/executor/session.d.ts +21 -0
- package/dist/executor/triggers-exec.d.ts +1 -0
- package/dist/executor/triggers.d.ts +16 -0
- package/dist/executor/window.d.ts +13 -0
- package/dist/expressions/context.d.ts +23 -0
- package/dist/expressions/eval.d.ts +38 -0
- package/dist/expressions/operators.d.ts +8 -0
- package/dist/expressions/pattern.d.ts +20 -0
- package/dist/functions/aggregates.d.ts +17 -0
- package/dist/functions/array-fns.d.ts +2 -0
- package/dist/functions/datetime-fns.d.ts +26 -0
- package/dist/functions/datetime-registry.d.ts +2 -0
- package/dist/functions/json-fns.d.ts +7 -0
- package/dist/functions/math-fns.d.ts +2 -0
- package/dist/functions/misc-fns.d.ts +8 -0
- package/dist/functions/scalar.d.ts +10 -0
- package/dist/functions/srf.d.ts +12 -0
- package/dist/functions/string-fns.d.ts +4 -0
- package/dist/functions/tsearch-fns.d.ts +2 -0
- package/dist/functions/util.d.ts +14 -0
- package/dist/functions/window.d.ts +7 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +19591 -0
- package/dist/index.js.map +7 -0
- package/dist/lexer/tokenize.d.ts +8 -0
- package/dist/parser/index.d.ts +1 -0
- package/dist/parser/parser.d.ts +96 -0
- package/dist/runtime/clock.d.ts +14 -0
- package/dist/runtime/index.d.ts +3 -0
- package/dist/runtime/options.d.ts +25 -0
- package/dist/runtime/prng.d.ts +48 -0
- package/dist/schema/catalog-tables.d.ts +1 -0
- package/dist/schema/catalog.d.ts +12 -0
- package/dist/serialization/codec.d.ts +29 -0
- package/dist/serialization/index.d.ts +1 -0
- package/dist/storage/database-state.d.ts +216 -0
- package/dist/transactions/manager.d.ts +25 -0
- package/dist/tsearch/stem.d.ts +5 -0
- package/dist/tsearch/tsearch.d.ts +59 -0
- package/dist/types/cast.d.ts +26 -0
- package/dist/types/compare.d.ts +18 -0
- package/dist/types/datetime.d.ts +68 -0
- package/dist/types/jsonb.d.ts +45 -0
- package/dist/types/numeric.d.ts +69 -0
- package/dist/types/resolve.d.ts +15 -0
- package/dist/types/timezone.d.ts +9 -0
- package/dist/types/value.d.ts +99 -0
- package/dist/unstable.d.ts +15 -0
- package/dist/unstable.js +19153 -0
- package/dist/unstable.js.map +7 -0
- package/package.json +120 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/errors/error.ts", "../src/runtime/prng.ts", "../src/schema/catalog.ts", "../src/tsearch/stem.ts", "../src/tsearch/tsearch.ts", "../src/types/datetime.ts", "../src/types/numeric.ts", "../src/types/jsonb.ts", "../src/types/value.ts", "../src/storage/database-state.ts", "../src/transactions/manager.ts", "../src/types/cast.ts", "../src/types/resolve.ts", "../src/executor/relation.ts", "../src/functions/datetime-fns.ts", "../src/types/compare.ts", "../src/functions/util.ts", "../src/functions/array-fns.ts", "../src/types/timezone.ts", "../src/functions/datetime-registry.ts", "../src/functions/json-fns.ts", "../src/functions/math-fns.ts", "../src/functions/misc-fns.ts", "../src/expressions/pattern.ts", "../src/functions/string-fns.ts", "../src/functions/tsearch-fns.ts", "../src/functions/scalar.ts", "../src/expressions/operators.ts", "../src/expressions/eval.ts", "../src/functions/aggregates.ts", "../src/functions/srf.ts", "../src/functions/window.ts", "../src/executor/window.ts", "../src/executor/select.ts", "../src/constraints/enforce.ts", "../src/executor/triggers.ts", "../src/executor/dml.ts", "../src/executor/session.ts", "../src/expressions/context.ts", "../src/lexer/tokenize.ts", "../src/parser/parser.ts", "../src/runtime/clock.ts", "../src/runtime/options.ts", "../src/executor/ddl.ts", "../src/executor/execute.ts", "../src/api/bind.ts", "../src/api/statement.ts", "../src/api/database.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * PostgresError mirrors the shape a real PostgreSQL server reports:\n * a human message plus a five-character SQLSTATE code.\n *\n * `category` is a stable, coarse-grained enum for consumers that do not want\n * to switch on raw SQLSTATE codes. New categories may appear in minor\n * releases \u2014 always include a default case.\n */\nexport type ErrorCategory =\n | \"syntax\"\n | \"undefined_table\"\n | \"undefined_column\"\n | \"undefined_function\"\n | \"undefined_object\"\n | \"duplicate_object\"\n | \"duplicate_table\"\n | \"duplicate_column\"\n | \"constraint_not_null\"\n | \"constraint_unique\"\n | \"constraint_check\"\n | \"constraint_foreign_key\"\n | \"constraint_exclusion\"\n | \"restrict_violation\"\n | \"invalid_text_representation\"\n | \"numeric_value_out_of_range\"\n | \"division_by_zero\"\n | \"datatype_mismatch\"\n | \"cannot_coerce\"\n | \"invalid_parameter_value\"\n | \"invalid_datetime\"\n | \"ambiguous_column\"\n | \"ambiguous_function\"\n | \"grouping_error\"\n | \"windowing_error\"\n | \"invalid_column_reference\"\n | \"wrong_object_type\"\n | \"dependent_objects\"\n | \"transaction_state\"\n | \"misuse\"\n | \"unsupported\"\n | \"internal\"\n | \"data_exception\"\n | \"program_limit_exceeded\"\n | \"invalid_cursor\"\n | \"snapshot_format\"\n | \"snapshot_version\"\n | \"string_data_right_truncation\"\n | \"invalid_regular_expression\"\n | \"case_not_found\"\n | \"cardinality_violation\"\n | \"undefined_parameter\"\n | \"not_null_violation\"\n | \"check_violation\"\n | \"array_subscript_error\"\n | \"array_element_error\"\n | \"invalid_escape_sequence\"\n | \"feature_not_supported\"\n | \"null_value_not_allowed\"\n | \"invalid_argument_for_power_function\"\n | \"invalid_argument_for_log\"\n | \"invalid_argument_for_width_bucket_function\"\n | \"sequence_generator_limit_exceeded\"\n | \"object_not_in_prerequisite_state\"\n | \"substring_error\"\n | \"invalid_table_definition\"\n | \"duplicate_schema\"\n | \"duplicate_function\"\n | \"generated_always\"\n | \"invalid_row_count\"\n | \"duplicate_prepared_statement\"\n | \"undefined_prepared_statement\"\n | \"invalid_savepoint_specification\"\n | \"raise_exception\"\n | \"invalid_function_definition\";\n\nconst CATEGORY_TO_SQLSTATE: Record<ErrorCategory, string> = {\n syntax: \"42601\",\n undefined_table: \"42P01\",\n undefined_column: \"42703\",\n undefined_function: \"42883\",\n undefined_object: \"42704\",\n duplicate_object: \"42710\",\n duplicate_table: \"42P07\",\n duplicate_column: \"42701\",\n constraint_not_null: \"23502\",\n constraint_unique: \"23505\",\n constraint_check: \"23514\",\n constraint_foreign_key: \"23503\",\n constraint_exclusion: \"23P01\",\n restrict_violation: \"23001\",\n invalid_text_representation: \"22P02\",\n numeric_value_out_of_range: \"22003\",\n division_by_zero: \"22012\",\n datatype_mismatch: \"42804\",\n cannot_coerce: \"42846\",\n invalid_parameter_value: \"22023\",\n invalid_datetime: \"22008\",\n ambiguous_column: \"42702\",\n ambiguous_function: \"42725\",\n grouping_error: \"42803\",\n windowing_error: \"42P20\",\n invalid_column_reference: \"42P10\",\n wrong_object_type: \"42809\",\n dependent_objects: \"2BP01\",\n transaction_state: \"25P01\",\n misuse: \"XX000\",\n unsupported: \"0A000\",\n internal: \"XX000\",\n data_exception: \"22000\",\n program_limit_exceeded: \"54000\",\n invalid_cursor: \"34000\",\n snapshot_format: \"XX001\",\n snapshot_version: \"XX002\",\n string_data_right_truncation: \"22001\",\n invalid_regular_expression: \"2201B\",\n case_not_found: \"20000\",\n cardinality_violation: \"21000\",\n undefined_parameter: \"42P02\",\n not_null_violation: \"23502\",\n check_violation: \"23514\",\n array_subscript_error: \"2202E\",\n array_element_error: \"2202E\",\n invalid_escape_sequence: \"22025\",\n feature_not_supported: \"0A000\",\n null_value_not_allowed: \"22004\",\n invalid_argument_for_power_function: \"2201F\",\n invalid_argument_for_log: \"2201E\",\n invalid_argument_for_width_bucket_function: \"2201G\",\n sequence_generator_limit_exceeded: \"2200H\",\n object_not_in_prerequisite_state: \"55000\",\n substring_error: \"22011\",\n invalid_table_definition: \"42P16\",\n duplicate_schema: \"42P06\",\n duplicate_function: \"42723\",\n generated_always: \"428C9\",\n invalid_row_count: \"2201W\",\n duplicate_prepared_statement: \"42P05\",\n undefined_prepared_statement: \"26000\",\n invalid_savepoint_specification: \"3B001\",\n raise_exception: \"P0001\",\n invalid_function_definition: \"2F005\",\n};\n\nexport class PostgresError extends Error {\n readonly category: ErrorCategory;\n /** Five-character SQLSTATE, e.g. \"42P01\". Always set. */\n readonly sqlState: string;\n /** Alias of sqlState (node-postgres `err.code` convention). */\n readonly code: string;\n\n constructor(category: ErrorCategory, message: string, sqlState?: string) {\n super(message);\n this.name = \"PostgresError\";\n this.category = category;\n this.sqlState = sqlState ?? CATEGORY_TO_SQLSTATE[category] ?? \"XX000\";\n this.code = this.sqlState;\n }\n}\n\nexport function pgError(category: ErrorCategory, message: string, sqlState?: string): PostgresError {\n return new PostgresError(category, message, sqlState);\n}\n\n/**\n * SQL the oracle accepts but this engine has not implemented must fail loud,\n * never silently misbehave. The compat gate keys off this.\n */\nexport function unsupported(what: string): PostgresError {\n return new PostgresError(\"unsupported\", `${what} is not supported`);\n}\n\nexport function isPostgresError(err: unknown): err is PostgresError {\n return err instanceof PostgresError;\n}\n", "/**\n * Deterministic 64-bit PRNG (xorshift64*).\n * Used for PostgreSQL `random()` / `gen_random_uuid()` and any other\n * nondeterministic builtins.\n */\nexport class Prng {\n private state: bigint;\n\n /**\n * @param seed - Engine seed. `0` is replaced with a non-zero constant.\n */\n constructor(seed: number | bigint = 1) {\n let s = typeof seed === \"bigint\" ? seed : BigInt(seed | 0);\n if (s === 0n) s = 0x9e3779b97f4a7c15n;\n this.state = BigInt.asUintN(64, s);\n }\n\n /** Next unsigned 64-bit value. */\n nextU64(): bigint {\n let x = this.state;\n x ^= BigInt.asUintN(64, x >> 12n);\n x ^= BigInt.asUintN(64, x << 25n);\n x ^= BigInt.asUintN(64, x >> 27n);\n this.state = BigInt.asUintN(64, x);\n return BigInt.asUintN(64, x * 0x2545f4914f6cdd1dn);\n }\n\n /** Next float in `[0, 1)` from 53 bits of {@link nextU64}. */\n nextFloat(): number {\n const bits = this.nextU64();\n return Number(bits >> 11n) / Number(1n << 53n);\n }\n\n /**\n * Next integer in `[min, max]` (inclusive).\n *\n * @throws {RangeError} If `max < min`.\n */\n nextInt(min: number, max: number): number {\n if (max < min) throw new RangeError(\"max < min\");\n const span = max - min + 1;\n return min + Number(this.nextU64() % BigInt(span));\n }\n\n /** Next bigint in `[min, max]` (inclusive). */\n nextBigInt(min: bigint, max: bigint): bigint {\n if (max < min) throw new RangeError(\"max < min\");\n const span = max - min + 1n;\n return min + (this.nextU64() % span);\n }\n\n /** Random UUIDv4 string from PRNG bits. */\n nextUuid4(): string {\n const bytes = new Uint8Array(16);\n for (let i = 0; i < 16; i += 8) {\n let v = this.nextU64();\n for (let j = 0; j < 8; j++) {\n bytes[i + j] = Number(v & 0xffn);\n v >>= 8n;\n }\n }\n bytes[6] = (bytes[6]! & 0x0f) | 0x40;\n bytes[8] = (bytes[8]! & 0x3f) | 0x80;\n const hex = [...bytes].map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n }\n\n /** Reseed from a float in [-1, 1] (SQL `setseed()`). */\n setSeedFloat(seed: number): void {\n const scaled = BigInt(Math.round(seed * 2 ** 31));\n let s = BigInt.asUintN(64, scaled * 0x9e3779b97f4a7c15n);\n if (s === 0n) s = 0x9e3779b97f4a7c15n;\n this.state = s;\n }\n\n /** Current unsigned 64-bit engine state (for snapshot / transaction rollback). */\n getState(): bigint {\n return this.state;\n }\n\n /** Restore unsigned 64-bit engine state from {@link getState}. */\n setState(state: bigint): void {\n this.state = BigInt.asUintN(64, state);\n }\n\n /** Independent copy with the same engine state. */\n clone(): Prng {\n const copy = new Prng(1);\n copy.state = this.state;\n return copy;\n }\n}\n\n/**\n * CSPRNG-backed entropy for `random()` / `gen_random_uuid()` when\n * {@link DatabaseOptions.random} is `\"os\"`. `setState` is a no-op so\n * ROLLBACK / snapshot restore do not rewind draws.\n */\nexport class OsEntropy extends Prng {\n constructor() {\n super(1);\n }\n\n override nextU64(): bigint {\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n let value = 0n;\n for (let i = 0; i < 8; i++) {\n value |= BigInt(bytes[i]!) << BigInt(i * 8);\n }\n return BigInt.asUintN(64, value);\n }\n\n override getState(): bigint {\n return 0n;\n }\n\n override setState(_state: bigint): void {}\n\n override clone(): Prng {\n return new OsEntropy();\n }\n}\n\n/** FNV-1a hash of `parts` as a signed 32-bit seed (for tests and custom PRNGs). */\nexport function deriveSeed(...parts: Array<number | string | bigint>): number {\n let hash = 2166136261;\n for (const part of parts) {\n const text = String(part);\n for (let i = 0; i < text.length; i++) {\n hash ^= text.charCodeAt(i)!;\n hash = Math.imul(hash, 16777619);\n }\n }\n return hash | 0;\n}\n", "import type { Relation } from \"../executor/relation.ts\";\nimport type { EngineCtx } from \"../expressions/context.ts\";\n\n/**\n * Virtual pg_catalog / information_schema relations, materialized on demand.\n * Implemented in catalog-tables.ts; this indirection keeps the executor\n * import graph acyclic.\n */\nexport type CatalogBuilder = (ctx: EngineCtx, schema: string, name: string) => Relation | null;\n\nlet builder: CatalogBuilder | null = null;\n\nexport function setCatalogBuilder(b: CatalogBuilder): void {\n builder = b;\n}\n\nexport function catalogRelation(ctx: EngineCtx, schema: string, name: string): Relation | null {\n if (schema !== \"pg_catalog\" && schema !== \"information_schema\") return null;\n return builder ? builder(ctx, schema, name) : null;\n}\n\n/** Relations resolvable unqualified via the implicit pg_catalog search-path entry. */\nexport const PG_CATALOG_RELATIONS: ReadonlySet<string> = new Set([\n \"pg_namespace\",\n \"pg_class\",\n \"pg_attribute\",\n \"pg_type\",\n \"pg_proc\",\n \"pg_enum\",\n \"pg_constraint\",\n \"pg_index\",\n \"pg_sequence\",\n \"pg_sequences\",\n \"pg_tables\",\n \"pg_views\",\n \"pg_matviews\",\n \"pg_indexes\",\n \"pg_settings\",\n \"pg_database\",\n \"pg_roles\",\n \"pg_user\",\n \"pg_trigger\",\n]);\n", "/**\n * Porter2 (Snowball English) stemmer \u2014 the algorithm behind PostgreSQL's\n * `english` text search dictionary.\n */\n\nconst VOWELS = \"aeiouy\";\n\nfunction isVowel(c: string): boolean {\n return VOWELS.includes(c);\n}\n\nfunction prelude(word: string): string {\n let w = word.replace(/^'/, \"\").replace(/'$/, \"\").replace(/'s$/, \"\").replace(/'$/, \"\");\n if (w.startsWith(\"y\")) w = `Y${w.slice(1)}`;\n w = w.replace(/([aeiouy])y/g, \"$1Y\");\n return w;\n}\n\nfunction markRegions(w: string): { r1: number; r2: number } {\n let r1 = w.length;\n let r2 = w.length;\n // exceptional forms\n for (const prefix of [\"gener\", \"commun\", \"arsen\"]) {\n if (w.startsWith(prefix)) {\n r1 = prefix.length;\n break;\n }\n }\n if (r1 === w.length) {\n for (let i = 1; i < w.length; i++) {\n if (!isVowel(w[i]!) && isVowel(w[i - 1]!)) {\n r1 = i + 1;\n break;\n }\n }\n }\n for (let i = r1 + 1; i < w.length; i++) {\n if (!isVowel(w[i]!) && isVowel(w[i - 1]!)) {\n r2 = i + 1;\n break;\n }\n }\n return { r1, r2 };\n}\n\nfunction isShortSyllable(w: string, i: number): boolean {\n if (i === 0) {\n return w.length >= 2 && isVowel(w[0]!) && !isVowel(w[1]!);\n }\n return (\n isVowel(w[i]!) &&\n i + 1 < w.length &&\n !isVowel(w[i + 1]!) &&\n w[i + 1] !== \"w\" &&\n w[i + 1] !== \"x\" &&\n w[i + 1] !== \"Y\" &&\n i - 1 >= 0 &&\n !isVowel(w[i - 1]!)\n );\n}\n\nfunction isShortWord(w: string, r1: number): boolean {\n return r1 >= w.length && isShortSyllable(w, w.length - 2);\n}\n\nconst EXCEPTIONS1: Record<string, string> = {\n skis: \"ski\",\n skies: \"sky\",\n dying: \"die\",\n lying: \"lie\",\n tying: \"tie\",\n idly: \"idl\",\n gently: \"gentl\",\n ugly: \"ugli\",\n early: \"earli\",\n only: \"onli\",\n singly: \"singl\",\n sky: \"sky\",\n news: \"news\",\n howe: \"howe\",\n atlas: \"atlas\",\n cosmos: \"cosmos\",\n bias: \"bias\",\n andes: \"andes\",\n};\n\nconst EXCEPTIONS2 = new Set([\"inning\", \"outing\", \"canning\", \"herring\", \"earring\", \"proceed\", \"exceed\", \"succeed\"]);\n\nconst DOUBLES = [\"bb\", \"dd\", \"ff\", \"gg\", \"mm\", \"nn\", \"pp\", \"rr\", \"tt\"];\n\nfunction endsWithDouble(w: string): boolean {\n return DOUBLES.some((d) => w.endsWith(d));\n}\n\nconst VALID_LI = \"cdeghkmnrt\";\n\nexport function stemEnglish(input: string): string {\n let w = input.toLowerCase();\n if (w.length <= 2) return w;\n if (EXCEPTIONS1[w] !== undefined) return EXCEPTIONS1[w]!;\n w = prelude(w);\n const { r1, r2 } = markRegions(w);\n\n // Step 0: strip 's / ' / 's'\n if (w.endsWith(\"'s'\")) w = w.slice(0, -3);\n else if (w.endsWith(\"'s\")) w = w.slice(0, -2);\n else if (w.endsWith(\"'\")) w = w.slice(0, -1);\n\n // Step 1a\n if (w.endsWith(\"sses\")) w = `${w.slice(0, -4)}ss`;\n else if (w.endsWith(\"ied\") || w.endsWith(\"ies\")) {\n w = w.slice(0, -3) + (w.length - 3 > 1 ? \"i\" : \"ie\");\n } else if (w.endsWith(\"ss\") || w.endsWith(\"us\")) {\n // no-op\n } else if (w.endsWith(\"s\")) {\n const stem = w.slice(0, -1);\n if ([...stem.slice(0, -1)].some(isVowel)) w = stem;\n }\n\n if (EXCEPTIONS2.has(w)) return w;\n\n // Step 1b\n const step1bDone = ((): boolean => {\n if (w.endsWith(\"eedly\")) {\n if (w.length - 5 >= r1) w = `${w.slice(0, -5)}ee`;\n return true;\n }\n if (w.endsWith(\"eed\")) {\n if (w.length - 3 >= r1) w = `${w.slice(0, -3)}ee`;\n return true;\n }\n return false;\n })();\n if (!step1bDone) {\n for (const suffix of [\"ingly\", \"edly\", \"ing\", \"ed\"]) {\n if (w.endsWith(suffix)) {\n const stem = w.slice(0, -suffix.length);\n if ([...stem].some(isVowel)) {\n w = stem;\n if (w.endsWith(\"at\") || w.endsWith(\"bl\") || w.endsWith(\"iz\")) w += \"e\";\n else if (endsWithDouble(w)) w = w.slice(0, -1);\n else if (isShortWord(w, r1)) w += \"e\";\n }\n break;\n }\n }\n }\n\n // Step 1c\n if (w.length > 2 && (w.endsWith(\"y\") || w.endsWith(\"Y\")) && !isVowel(w[w.length - 2]!)) {\n w = `${w.slice(0, -1)}i`;\n }\n\n // Step 2\n const step2: Array<[string, string]> = [\n [\"ization\", \"ize\"],\n [\"ational\", \"ate\"],\n [\"fulness\", \"ful\"],\n [\"ousness\", \"ous\"],\n [\"iveness\", \"ive\"],\n [\"tional\", \"tion\"],\n [\"biliti\", \"ble\"],\n [\"lessli\", \"less\"],\n [\"entli\", \"ent\"],\n [\"ation\", \"ate\"],\n [\"alism\", \"al\"],\n [\"aliti\", \"al\"],\n [\"ousli\", \"ous\"],\n [\"iviti\", \"ive\"],\n [\"fulli\", \"ful\"],\n [\"enci\", \"ence\"],\n [\"anci\", \"ance\"],\n [\"abli\", \"able\"],\n [\"izer\", \"ize\"],\n [\"ator\", \"ate\"],\n [\"alli\", \"al\"],\n [\"bli\", \"ble\"],\n ];\n for (const [suffix, repl] of step2) {\n if (w.endsWith(suffix)) {\n if (w.length - suffix.length >= r1) w = w.slice(0, -suffix.length) + repl;\n break;\n }\n }\n if (w.endsWith(\"ogi\") && w.length - 3 >= r1 && w[w.length - 4] === \"l\") {\n w = `${w.slice(0, -3)}og`;\n } else if (w.endsWith(\"li\") && w.length - 2 >= r1 && VALID_LI.includes(w[w.length - 3] ?? \"\")) {\n if (!step2.some(([s]) => w.endsWith(s))) w = w.slice(0, -2);\n }\n\n // Step 3\n const step3: Array<[string, string]> = [\n [\"ational\", \"ate\"],\n [\"tional\", \"tion\"],\n [\"alize\", \"al\"],\n [\"icate\", \"ic\"],\n [\"iciti\", \"ic\"],\n [\"ical\", \"ic\"],\n [\"ness\", \"\"],\n [\"ful\", \"\"],\n ];\n for (const [suffix, repl] of step3) {\n if (w.endsWith(suffix)) {\n if (w.length - suffix.length >= r1) w = w.slice(0, -suffix.length) + repl;\n break;\n }\n }\n if (w.endsWith(\"ative\") && w.length - 5 >= r2) {\n w = w.slice(0, -5);\n }\n\n // Step 4\n const step4 = [\n \"ement\",\n \"ance\",\n \"ence\",\n \"able\",\n \"ible\",\n \"ment\",\n \"ant\",\n \"ent\",\n \"ism\",\n \"ate\",\n \"iti\",\n \"ous\",\n \"ive\",\n \"ize\",\n \"al\",\n \"er\",\n \"ic\",\n ];\n for (const suffix of step4) {\n if (w.endsWith(suffix)) {\n if (w.length - suffix.length >= r2) w = w.slice(0, -suffix.length);\n break;\n }\n }\n if (w.endsWith(\"ion\") && w.length - 3 >= r2 && (w[w.length - 4] === \"s\" || w[w.length - 4] === \"t\")) {\n w = w.slice(0, -3);\n }\n\n // Step 5\n if (w.endsWith(\"e\")) {\n if (w.length - 1 >= r2) w = w.slice(0, -1);\n else if (w.length - 1 >= r1 && !isShortSyllable(w, w.length - 3)) w = w.slice(0, -1);\n } else if (w.endsWith(\"ll\") && w.length - 1 >= r2) {\n w = w.slice(0, -1);\n }\n\n return w.toLowerCase();\n}\n", "import { pgError, unsupported } from \"../errors/error.ts\";\nimport { stemEnglish } from \"./stem.ts\";\n\n/**\n * Minimal-real tsvector / tsquery: canonical text storage, `simple` and\n * `english` configurations, AND/OR/NOT/phrase queries, ts_rank.\n */\n\nconst ENGLISH_STOPWORDS = new Set(\n `i me my myself we our ours ourselves you your yours yourself yourselves he him his himself she her hers herself it its itself they them their theirs themselves what which who whom this that these those am is are was were be been being have has had having do does did doing a an the and but if or because as until while of at by for with about against between into through during before after above below to from up down in out on off over under again further then once here there when where why how all any both each few more most other some such no nor not only own same so than too very s t can will just don should now`.split(\n \" \",\n ),\n);\n\nexport interface Lexeme {\n word: string;\n positions: Array<{ pos: number; weight: string }>;\n}\n\nfunction tokenizeText(text: string): Array<{ word: string; pos: number }> {\n const out: Array<{ word: string; pos: number }> = [];\n const re = /[0-9A-Za-z\\u0080-\\uffff][0-9A-Za-z\\u0080-\\uffff']*/g;\n let m: RegExpExecArray | null;\n let pos = 0;\n while ((m = re.exec(text)) !== null) {\n pos += 1;\n out.push({ word: m[0], pos });\n }\n return out;\n}\n\nfunction normalizeWord(config: string, word: string): string | null {\n const lower = word.toLowerCase().replace(/'+$/, \"\").replace(/^'+/, \"\");\n if (lower === \"\") return null;\n if (config === \"simple\") return lower;\n if (config === \"english\") {\n if (ENGLISH_STOPWORDS.has(lower)) return null;\n return stemEnglish(lower);\n }\n throw pgError(\"undefined_object\", `text search configuration \"${config}\" does not exist`);\n}\n\n/** Build canonical tsvector text: lexemes sorted, with positions. */\nexport function toTsvector(config: string, text: string): string {\n const lexemes = new Map<string, number[]>();\n for (const { word, pos } of tokenizeText(text)) {\n const norm = normalizeWord(config, word);\n if (norm === null) continue;\n const positions = lexemes.get(norm) ?? [];\n if (positions.length < 256) positions.push(Math.min(pos, 16383));\n lexemes.set(norm, positions);\n }\n const words = [...lexemes.keys()].sort();\n return words.map((w) => `'${w.replaceAll(\"'\", \"''\")}':${lexemes.get(w)!.join(\",\")}`).join(\" \");\n}\n\n/** Parse tsvector text (typinput): `'a':1,2 'b':3A b` */\nexport function parseTsvector(text: string): string {\n const lexemes = new Map<string, Array<{ pos: number; weight: string }>>();\n const re = /'((?:[^']|'')*)'(?::([0-9A-Da-d,]+))?|([^\\s':]+)(?::([0-9A-Da-d,]+))?/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text)) !== null) {\n const word = (m[1] !== undefined ? m[1].replaceAll(\"''\", \"'\") : m[3]!) ?? \"\";\n if (word === \"\") continue;\n const posSpec = m[2] ?? m[4];\n const existing = lexemes.get(word) ?? [];\n if (posSpec) {\n for (const p of posSpec.split(\",\")) {\n const wm = /^(\\d+)([A-Da-d]?)$/.exec(p.trim());\n if (!wm) throw pgError(\"syntax\", `syntax error in tsvector: \"${text}\"`);\n existing.push({ pos: Number(wm[1]), weight: (wm[2] || \"D\").toUpperCase() });\n }\n }\n lexemes.set(word, existing);\n }\n const words = [...lexemes.keys()].sort();\n return words\n .map((w) => {\n const positions = lexemes.get(w)!;\n const quoted = `'${w.replaceAll(\"'\", \"''\")}'`;\n if (positions.length === 0) return quoted;\n return `${quoted}:${positions.map((p) => `${p.pos}${p.weight === \"D\" ? \"\" : p.weight}`).join(\",\")}`;\n })\n .join(\" \");\n}\n\nfunction renderTsvector(lexemes: Map<string, Array<{ pos: number; weight: string }>>): string {\n const words = [...lexemes.keys()].sort();\n return words\n .map((w) => {\n const positions = lexemes.get(w)!;\n const quoted = `'${w.replaceAll(\"'\", \"''\")}'`;\n if (positions.length === 0) return quoted;\n return `${quoted}:${positions.map((p) => `${p.pos}${p.weight === \"D\" ? \"\" : p.weight}`).join(\",\")}`;\n })\n .join(\" \");\n}\n\n/** tsvector || tsvector: shift right-side positions by the left's max position, merge lexemes. */\nexport function tsvectorConcat(a: string, b: string): string {\n const left = tsvectorLexemes(a);\n const right = tsvectorLexemes(b);\n let maxPos = 0;\n for (const lex of left) {\n for (const p of lex.positions) maxPos = Math.max(maxPos, p.pos);\n }\n const merged = new Map<string, Array<{ pos: number; weight: string }>>();\n for (const lex of left) merged.set(lex.word, [...lex.positions]);\n for (const lex of right) {\n const existing = merged.get(lex.word) ?? [];\n for (const p of lex.positions) {\n existing.push({ pos: Math.min(p.pos + maxPos, 16383), weight: p.weight });\n }\n merged.set(lex.word, existing);\n }\n return renderTsvector(merged);\n}\n\nexport function tsvectorLexemes(vec: string): Lexeme[] {\n const out: Lexeme[] = [];\n const re = /'((?:[^']|'')*)'(?::([0-9A-Da-d,]+))?/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(vec)) !== null) {\n const word = m[1]!.replaceAll(\"''\", \"'\");\n const positions: Array<{ pos: number; weight: string }> = [];\n if (m[2]) {\n for (const p of m[2].split(\",\")) {\n const wm = /^(\\d+)([A-Da-d]?)$/.exec(p.trim());\n if (wm) positions.push({ pos: Number(wm[1]), weight: (wm[2] || \"D\").toUpperCase() });\n }\n }\n out.push({ word, positions });\n }\n return out;\n}\n\n// --- tsquery ------------------------------------------------------------------\n\nexport type TsQueryNode =\n | { kind: \"lexeme\"; word: string; prefix: boolean; weights: string | null }\n | { kind: \"and\"; left: TsQueryNode; right: TsQueryNode }\n | { kind: \"or\"; left: TsQueryNode; right: TsQueryNode }\n | { kind: \"not\"; operand: TsQueryNode }\n | { kind: \"phrase\"; left: TsQueryNode; right: TsQueryNode; distance: number };\n\nclass TsQueryParser {\n private pos = 0;\n constructor(\n private readonly text: string,\n private readonly config: string,\n ) {}\n\n parse(): TsQueryNode | null {\n const node = this.parseOr();\n this.skipWs();\n if (this.pos < this.text.length) {\n throw pgError(\"syntax\", `syntax error in tsquery: \"${this.text}\"`);\n }\n return node;\n }\n\n private skipWs(): void {\n while (this.pos < this.text.length && /\\s/.test(this.text[this.pos]!)) this.pos++;\n }\n\n private parseOr(): TsQueryNode | null {\n let left = this.parseAnd();\n for (;;) {\n this.skipWs();\n if (this.text[this.pos] === \"|\") {\n this.pos++;\n const right = this.parseAnd();\n if (left === null) left = right;\n else if (right !== null) left = { kind: \"or\", left, right };\n continue;\n }\n return left;\n }\n }\n\n private parseAnd(): TsQueryNode | null {\n let left = this.parsePhrase();\n for (;;) {\n this.skipWs();\n if (this.text[this.pos] === \"&\") {\n this.pos++;\n const right = this.parsePhrase();\n if (left === null) left = right;\n else if (right !== null) left = { kind: \"and\", left, right };\n continue;\n }\n return left;\n }\n }\n\n private parsePhrase(): TsQueryNode | null {\n let left = this.parseNot();\n for (;;) {\n this.skipWs();\n const m = /^<(?:(\\d+)|-)>/.exec(this.text.slice(this.pos));\n if (m) {\n this.pos += m[0].length;\n const distance = m[1] !== undefined ? Number(m[1]) : 1;\n const right = this.parseNot();\n if (left === null) left = right;\n else if (right !== null) left = { kind: \"phrase\", left, right, distance };\n continue;\n }\n return left;\n }\n }\n\n private parseNot(): TsQueryNode | null {\n this.skipWs();\n if (this.text[this.pos] === \"!\") {\n this.pos++;\n const operand = this.parseNot();\n if (operand === null) throw pgError(\"syntax\", `syntax error in tsquery: \"${this.text}\"`);\n return { kind: \"not\", operand };\n }\n return this.parsePrimary();\n }\n\n private parsePrimary(): TsQueryNode | null {\n this.skipWs();\n const c = this.text[this.pos];\n if (c === undefined) throw pgError(\"syntax\", `syntax error in tsquery: \"${this.text}\"`);\n if (c === \"(\") {\n this.pos++;\n const inner = this.parseOr();\n this.skipWs();\n if (this.text[this.pos] !== \")\") throw pgError(\"syntax\", `syntax error in tsquery: \"${this.text}\"`);\n this.pos++;\n return inner;\n }\n if (c === \"'\") {\n this.pos++;\n let word = \"\";\n for (;;) {\n const ch = this.text[this.pos];\n if (ch === undefined) throw pgError(\"syntax\", `syntax error in tsquery: \"${this.text}\"`);\n if (ch === \"'\") {\n if (this.text[this.pos + 1] === \"'\") {\n word += \"'\";\n this.pos += 2;\n continue;\n }\n this.pos++;\n break;\n }\n word += ch;\n this.pos++;\n }\n return this.finishLexeme(word);\n }\n const m = /^[^\\s&|!()<'\"]+/.exec(this.text.slice(this.pos));\n if (!m) throw pgError(\"syntax\", `syntax error in tsquery: \"${this.text}\"`);\n this.pos += m[0].length;\n return this.finishLexeme(m[0]);\n }\n\n private finishLexeme(word: string): TsQueryNode | null {\n let prefix = false;\n let weights: string | null = null;\n if (this.text[this.pos] === \":\") {\n const rest = /^:([A-Da-d*]+)/.exec(this.text.slice(this.pos));\n if (rest) {\n this.pos += rest[0].length;\n if (rest[1]!.includes(\"*\")) prefix = true;\n const w = rest[1]!.replaceAll(\"*\", \"\").toUpperCase();\n if (w.length > 0) weights = w;\n }\n }\n const norm = normalizeWord(this.config, word);\n if (norm === null) return null;\n return { kind: \"lexeme\", word: norm, prefix, weights };\n }\n}\n\nexport function toTsquery(config: string, text: string): string {\n const node = new TsQueryParser(text, config).parse();\n return tsqueryText(node);\n}\n\nexport function plaintoTsquery(config: string, text: string): string {\n const words: string[] = [];\n for (const { word } of tokenizeText(text)) {\n const norm = normalizeWord(config, word);\n if (norm !== null) words.push(norm);\n }\n return words.map((w) => `'${w.replaceAll(\"'\", \"''\")}'`).join(\" & \");\n}\n\nexport function phrasetoTsquery(config: string, text: string): string {\n const words: string[] = [];\n for (const { word } of tokenizeText(text)) {\n const norm = normalizeWord(config, word);\n if (norm !== null) words.push(norm);\n }\n return words.map((w) => `'${w.replaceAll(\"'\", \"''\")}'`).join(\" <-> \");\n}\n\nexport function websearchToTsquery(_config: string, _text: string): string {\n throw unsupported(\"websearch_to_tsquery\");\n}\n\nexport function tsqueryText(node: TsQueryNode | null): string {\n if (node === null) return \"\";\n const render = (n: TsQueryNode, parentPrec: number): string => {\n switch (n.kind) {\n case \"lexeme\": {\n let out = `'${n.word.replaceAll(\"'\", \"''\")}'`;\n if (n.prefix || n.weights) {\n out += \":\";\n if (n.weights) out += n.weights;\n if (n.prefix) out += \"*\";\n }\n return out;\n }\n case \"not\": {\n return `!${render(n.operand, 4)}`;\n }\n case \"phrase\": {\n const s = `${render(n.left, 3)} ${n.distance === 1 ? \"<->\" : `<${n.distance}>`} ${render(n.right, 3)}`;\n return parentPrec > 2 ? `( ${s} )` : s;\n }\n case \"and\": {\n const s = `${render(n.left, 2)} & ${render(n.right, 2)}`;\n return parentPrec > 1 ? `( ${s} )` : s;\n }\n case \"or\": {\n const s = `${render(n.left, 1)} | ${render(n.right, 1)}`;\n return parentPrec > 0 ? `( ${s} )` : s;\n }\n }\n };\n return render(node, 0);\n}\n\nexport function parseTsqueryText(text: string): TsQueryNode | null {\n return new TsQueryParser(text, \"simple\").parse();\n}\n\n/** tsquery || tsquery / tsquery && tsquery */\nexport function tsqueryCombine(op: \"and\" | \"or\", a: string, b: string): string {\n const l = parseTsqueryText(a);\n const r = parseTsqueryText(b);\n if (l === null) return tsqueryText(r);\n if (r === null) return tsqueryText(l);\n return tsqueryText({ kind: op, left: l, right: r });\n}\n\n/**\n * ts_headline (minimal): wraps query-matching words of the document in\n * StartSel/StopSel. Fragment selection (MaxWords/MinWords windows) is not\n * implemented \u2014 short documents match PG output exactly.\n */\nexport function tsHeadline(config: string, document: string, query: string, options?: string): string {\n let startSel = \"<b>\";\n let stopSel = \"</b>\";\n if (options) {\n for (const part of options.split(\",\")) {\n const eq = part.indexOf(\"=\");\n if (eq === -1) continue;\n const key = part.slice(0, eq).trim().toLowerCase();\n let val = part.slice(eq + 1).trim();\n if (val.startsWith('\"') && val.endsWith('\"')) val = val.slice(1, -1);\n if (key === \"startsel\") startSel = val;\n else if (key === \"stopsel\") stopSel = val;\n }\n }\n const node = parseTsqueryText(query);\n const queryWords = new Map<string, LexemeNode>();\n if (node !== null) collectQueryOperands(node, queryWords);\n const items = [...queryWords.values()];\n const matches = (norm: string): boolean =>\n items.some((it) => (it.prefix ? norm.startsWith(it.word) : norm === it.word));\n const re = /[0-9A-Za-z\\u0080-\\uffff][0-9A-Za-z\\u0080-\\uffff']*/g;\n return document.replace(re, (word) => {\n const norm = normalizeWord(config, word);\n if (norm !== null && matches(norm)) return `${startSel}${word}${stopSel}`;\n return word;\n });\n}\n\n/** !! tsquery */\nexport function tsqueryNegate(a: string): string {\n const n = parseTsqueryText(a);\n if (n === null) return \"\";\n return tsqueryText({ kind: \"not\", operand: n });\n}\n\n// --- matching ------------------------------------------------------------------\n\ninterface MatchPos {\n pos: number;\n weight: string;\n}\n\nfunction lexemeMatches(lexemes: Map<string, MatchPos[]>, node: Extract<TsQueryNode, { kind: \"lexeme\" }>): MatchPos[] {\n const out: MatchPos[] = [];\n if (node.prefix) {\n for (const [word, positions] of lexemes) {\n if (word.startsWith(node.word)) out.push(...positions);\n }\n } else {\n out.push(...(lexemes.get(node.word) ?? []));\n }\n if (node.weights) {\n return out.filter((p) => node.weights!.includes(p.weight));\n }\n return out;\n}\n\nfunction evalMatch(lexemes: Map<string, MatchPos[]>, node: TsQueryNode): boolean {\n switch (node.kind) {\n case \"lexeme\": {\n if (node.prefix) {\n for (const word of lexemes.keys()) {\n if (word.startsWith(node.word)) return true;\n }\n return false;\n }\n if (!node.weights) return lexemes.has(node.word);\n return lexemeMatches(lexemes, node).length > 0;\n }\n case \"and\":\n return evalMatch(lexemes, node.left) && evalMatch(lexemes, node.right);\n case \"or\":\n return evalMatch(lexemes, node.left) || evalMatch(lexemes, node.right);\n case \"not\":\n return !evalMatch(lexemes, node.operand);\n case \"phrase\": {\n return phrasePositions(lexemes, node).length > 0;\n }\n }\n}\n\nfunction phrasePositions(lexemes: Map<string, MatchPos[]>, node: TsQueryNode): number[] {\n switch (node.kind) {\n case \"lexeme\":\n return lexemeMatches(lexemes, node).map((p) => p.pos);\n case \"phrase\": {\n const leftPos = phrasePositions(lexemes, node.left);\n const rightPos = phrasePositions(lexemes, node.right);\n const out: number[] = [];\n for (const r of rightPos) {\n if (leftPos.includes(r - node.distance)) out.push(r);\n }\n return out;\n }\n case \"and\": {\n const l = phrasePositions(lexemes, node.left);\n const r = phrasePositions(lexemes, node.right);\n return l.length > 0 && r.length > 0 ? [...l, ...r] : [];\n }\n case \"or\": {\n return [...phrasePositions(lexemes, node.left), ...phrasePositions(lexemes, node.right)];\n }\n case \"not\":\n return [];\n }\n}\n\nfunction vectorMap(vec: string): Map<string, MatchPos[]> {\n const map = new Map<string, MatchPos[]>();\n for (const lex of tsvectorLexemes(vec)) {\n map.set(lex.word, lex.positions.length > 0 ? lex.positions : []);\n }\n return map;\n}\n\nexport function tsvectorMatches(vec: string, query: string): boolean {\n const node = parseTsqueryText(query);\n if (node === null) return false;\n return evalMatch(vectorMap(vec), node);\n}\n\n// --- ranking (ts_rank) \u2014 faithful port of PG src/backend/utils/adt/tsrank.c -------\n\nexport const DEFAULT_RANK_WEIGHTS = [0.1, 0.2, 0.4, 1.0]; // indexed D, C, B, A\n\nconst MAXENTRYPOS = 16384;\nconst f32 = Math.fround;\n\nfunction weightIndex(w: string): number {\n return w === \"A\" ? 3 : w === \"B\" ? 2 : w === \"C\" ? 1 : 0;\n}\n\ntype LexemeNode = Extract<TsQueryNode, { kind: \"lexeme\" }>;\n\n/** SortAndUniqItems: all unique QI_VAL operands of the query (including under NOT). */\nfunction collectQueryOperands(node: TsQueryNode, out: Map<string, LexemeNode>): void {\n switch (node.kind) {\n case \"lexeme\": {\n const key = `${node.word}\\u0000${node.prefix ? \"*\" : \"\"}`;\n if (!out.has(key)) out.set(key, node);\n break;\n }\n case \"not\":\n collectQueryOperands(node.operand, out);\n break;\n default:\n collectQueryOperands(node.left, out);\n collectQueryOperands(node.right, out);\n }\n}\n\ninterface RankEntry {\n posts: MatchPos[];\n posnull: boolean;\n}\n\n/** find_wordentry: vector entries matching a query operand (prefix may hit several). */\nfunction rankEntriesFor(lexemes: Map<string, MatchPos[]>, item: LexemeNode): RankEntry[] {\n const out: RankEntry[] = [];\n const add = (positions: MatchPos[]): void => {\n if (positions.length === 0) out.push({ posts: [{ pos: 0, weight: \"D\" }], posnull: true });\n else out.push({ posts: positions, posnull: false });\n };\n if (item.prefix) {\n for (const [word, positions] of lexemes) {\n if (word.startsWith(item.word)) add(positions);\n }\n } else {\n const positions = lexemes.get(item.word);\n if (positions !== undefined) add(positions);\n }\n return out;\n}\n\nfunction calcRankOr(w: number[], lexemes: Map<string, MatchPos[]>, items: LexemeNode[]): number {\n let res = 0;\n for (const item of items) {\n for (const entry of rankEntriesFor(lexemes, item)) {\n const post = entry.posts;\n let resj = 0;\n let wjm = -1;\n let jm = 0;\n for (let j = 0; j < post.length; j++) {\n const wp = w[weightIndex(post[j]!.weight)]!;\n resj = f32(resj + f32(wp / ((j + 1) * (j + 1))));\n if (wp > wjm) {\n wjm = wp;\n jm = j;\n }\n }\n res = f32(res + f32(f32(wjm + resj) - f32(wjm / ((jm + 1) * (jm + 1)))) / 1.64493406685);\n }\n }\n if (items.length > 0) res = f32(res / items.length);\n return res;\n}\n\nfunction wordDistance(dist: number): number {\n if (dist > 100) return 1e-30;\n return f32(1.0 / (1.005 + 0.05 * Math.exp(dist / 1.5 - 2)));\n}\n\nfunction calcRankAnd(w: number[], lexemes: Map<string, MatchPos[]>, items: LexemeNode[]): number {\n if (items.length < 2) return calcRankOr(w, lexemes, items);\n let res = -1;\n // pos[i]: positions of the last matched entry for item i (POSNULL uses MAXENTRYPOS-1)\n const prev: (RankEntry | null)[] = new Array(items.length).fill(null);\n for (let i = 0; i < items.length; i++) {\n for (const entry of rankEntriesFor(lexemes, items[i]!)) {\n const post = entry.posnull ? { posts: [{ pos: MAXENTRYPOS - 1, weight: \"D\" }], posnull: true } : entry;\n for (let k = 0; k < i; k++) {\n const ct = prev[k];\n if (!ct) continue;\n for (const pj of post.posts) {\n for (const cl of ct.posts) {\n let dist = Math.abs(pj.pos - cl.pos);\n if (dist !== 0 || post.posnull || ct.posnull) {\n if (dist === 0) dist = MAXENTRYPOS;\n const wp = f32(f32(w[weightIndex(pj.weight)]! * w[weightIndex(cl.weight)]!) * wordDistance(dist));\n const curw = f32(Math.sqrt(wp));\n res = res < 0 ? curw : f32(1.0 - (1.0 - res) * (1.0 - curw));\n }\n }\n }\n }\n prev[i] = post;\n }\n }\n return res;\n}\n\n/** cnt_length: total positions in the vector (posless entries count as 1). */\nfunction cntLength(lexemes: Map<string, MatchPos[]>): number {\n let len = 0;\n for (const positions of lexemes.values()) len += positions.length === 0 ? 1 : positions.length;\n return len;\n}\n\n/** calc_rank + normalization flags (RANK_NORM_*). */\nexport function tsRank(vec: string, query: string, weights?: number[], method = 0): number {\n const node = parseTsqueryText(query);\n if (node === null) return 0;\n const lexemes = vectorMap(vec);\n if (lexemes.size === 0) return 0;\n const w = (weights ?? DEFAULT_RANK_WEIGHTS).map(f32);\n const opMap = new Map<string, LexemeNode>();\n collectQueryOperands(node, opMap);\n const items = [...opMap.values()];\n\n let res =\n node.kind === \"and\" || node.kind === \"phrase\" ? calcRankAnd(w, lexemes, items) : calcRankOr(w, lexemes, items);\n if (res < 0) res = 1e-20;\n\n if ((method & 1) !== 0) res = f32(res / (Math.log(cntLength(lexemes) + 1) / Math.LN2));\n if ((method & 2) !== 0) {\n const len = cntLength(lexemes);\n if (len > 0) res = f32(res / len);\n }\n if ((method & 8) !== 0) res = f32(res / lexemes.size);\n if ((method & 16) !== 0) res = f32(res / (Math.log(lexemes.size + 1) / Math.LN2));\n if ((method & 32) !== 0) res = f32(res / (res + 1));\n return f32(res);\n}\n\nexport function tsvectorLength(vec: string): number {\n return tsvectorLexemes(vec).length;\n}\n\nexport function tsvectorStrip(vec: string): string {\n const words = tsvectorLexemes(vec)\n .map((l) => l.word)\n .sort();\n return words.map((w) => `'${w.replaceAll(\"'\", \"''\")}'`).join(\" \");\n}\n\nexport function tsvectorSetweight(vec: string, weight: string): string {\n const w = weight.toUpperCase();\n if (!/^[A-D]$/.test(w)) {\n throw pgError(\"invalid_parameter_value\", `unrecognized weight: \"${weight}\"`);\n }\n return tsvectorLexemes(vec)\n .map((l) => {\n const quoted = `'${l.word.replaceAll(\"'\", \"''\")}'`;\n if (l.positions.length === 0) return quoted;\n return `${quoted}:${l.positions.map((p) => `${p.pos}${w === \"D\" ? \"\" : w}`).join(\",\")}`;\n })\n .join(\" \");\n}\n", "import { pgError } from \"../errors/error.ts\";\n\n/**\n * Internal representations (mirroring PostgreSQL):\n * - date: integer days since 2000-01-01 (PG epoch); \u00B1Infinity as special\n * - time: bigint microseconds since midnight (0 .. 86_400_000_000 inclusive)\n * - timestamp / timestamptz: bigint microseconds since 2000-01-01 00:00:00 (UTC for tz)\n * - interval: { months, days, micros }\n */\n\nexport const PG_EPOCH_JDATE = 2451545; // 2000-01-01 as Julian day\nexport const UNIX_EPOCH_MICROS_FROM_PG = -946_684_800_000_000n; // 1970-01-01 in PG micros\nexport const DATE_POS_INF = 2147483647;\nexport const DATE_NEG_INF = -2147483648;\nexport const TS_POS_INF = 9223372036854775807n;\nexport const TS_NEG_INF = -9223372036854775808n;\n\nexport interface Interval {\n readonly kind: \"interval\";\n readonly months: number;\n readonly days: number;\n readonly micros: bigint;\n}\n\nexport function makeInterval(months: number, days: number, micros: bigint): Interval {\n return { kind: \"interval\", months, days, micros };\n}\n\nexport function isInterval(v: unknown): v is Interval {\n return typeof v === \"object\" && v !== null && (v as any).kind === \"interval\";\n}\n\nexport const USECS_PER_DAY = 86_400_000_000n;\nexport const USECS_PER_HOUR = 3_600_000_000n;\nexport const USECS_PER_MIN = 60_000_000n;\nexport const USECS_PER_SEC = 1_000_000n;\n\n// --- civil calendar <-> days (Howard Hinnant's algorithm), day 0 = 2000-01-01\n\nexport function civilToDays(y: number, m: number, d: number): number {\n const yy = m <= 2 ? y - 1 : y;\n const era = Math.floor(yy / 400);\n const yoe = yy - era * 400;\n const doy = Math.floor((153 * (m + (m > 2 ? -3 : 9)) + 2) / 5) + d - 1;\n const doe = yoe * 365 + Math.floor(yoe / 4) - Math.floor(yoe / 100) + doy;\n const unixDays = era * 146097 + doe - 719468;\n return unixDays - 10957; // shift epoch 1970-01-01 -> 2000-01-01\n}\n\nexport function daysToCivil(days: number): { y: number; m: number; d: number } {\n const z = days + 10957 + 719468;\n const era = Math.floor(z / 146097);\n const doe = z - era * 146097;\n const yoe = Math.floor((doe - Math.floor(doe / 1460) + Math.floor(doe / 36524) - Math.floor(doe / 146096)) / 365);\n const y = yoe + era * 400;\n const doy = doe - (365 * yoe + Math.floor(yoe / 4) - Math.floor(yoe / 100));\n const mp = Math.floor((5 * doy + 2) / 153);\n const d = doy - Math.floor((153 * mp + 2) / 5) + 1;\n const m = mp + (mp < 10 ? 3 : -9);\n return { y: y + (m <= 2 ? 1 : 0), m, d };\n}\n\nexport function isLeapYear(y: number): boolean {\n return (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0;\n}\n\nconst DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nexport function daysInMonth(y: number, m: number): number {\n if (m === 2 && isLeapYear(y)) return 29;\n return DAYS_IN_MONTH[m - 1]!;\n}\n\nexport function isValidCivil(y: number, m: number, d: number): boolean {\n if (m < 1 || m > 12 || d < 1) return false;\n return d <= daysInMonth(y, m);\n}\n\n/** day of week, 0=Sunday (2000-01-01 was a Saturday = 6) */\nexport function dayOfWeek(days: number): number {\n return (((days + 6) % 7) + 7) % 7;\n}\n\n// --- parsing ------------------------------------------------------------\n\nfunction bad(type: string, text: string): never {\n throw pgError(\"invalid_text_representation\", `invalid input syntax for type ${type}: \"${text}\"`, \"22007\");\n}\n\nfunction outOfRange(_type: string, text: string): never {\n throw pgError(\"invalid_datetime\", `date/time field value out of range: \"${text}\"`, \"22008\");\n}\n\nconst DATE_RE = /^(\\d{1,7})-(\\d{1,2})-(\\d{1,2})(?:\\s*(BC|AD|bc|ad))?$/;\nconst DATE_SLASH_RE = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{1,7})$/;\n\n/** Parse a date string -> days since 2000-01-01. DateStyle ISO, MDY. */\nexport function parseDate(text: string): number {\n const t = text.trim();\n const lower = t.toLowerCase();\n if (lower === \"infinity\") return DATE_POS_INF;\n if (lower === \"-infinity\") return DATE_NEG_INF;\n if (lower === \"epoch\") return civilToDays(1970, 1, 1);\n let y: number;\n let m: number;\n let d: number;\n let mm = DATE_RE.exec(t);\n if (mm) {\n y = Number(mm[1]);\n m = Number(mm[2]);\n d = Number(mm[3]);\n if (mm[4] && mm[4].toLowerCase() === \"bc\") y = -(y - 1);\n } else if ((mm = DATE_SLASH_RE.exec(t))) {\n // MDY datestyle\n m = Number(mm[1]);\n d = Number(mm[2]);\n y = Number(mm[3]);\n } else if (/^\\d{8}$/.test(t)) {\n y = Number(t.slice(0, 4));\n m = Number(t.slice(4, 6));\n d = Number(t.slice(6, 8));\n } else {\n // fall back: maybe it is a full timestamp; take the date part\n const ts = tryParseTimestampParts(t);\n if (ts) {\n if (!isValidCivil(ts.y, ts.m, ts.d)) outOfRange(\"date\", text);\n return civilToDays(ts.y, ts.m, ts.d);\n }\n bad(\"date\", text);\n }\n if (!isValidCivil(y, m, d)) outOfRange(\"date\", text);\n if (y === 0) bad(\"date\", text);\n return civilToDays(y, m, d);\n}\n\nconst TIME_RE = /^(\\d{1,2}):(\\d{1,2})(?::(\\d{1,2})(\\.\\d+)?)?$/;\n\n/** Parse time -> micros since midnight. */\nexport function parseTime(text: string): bigint {\n const t = text.trim();\n // allow trailing timezone offset (ignored for `time`)\n const m = TIME_RE.exec(t.replace(/\\s*[+-]\\d{1,2}(:\\d{2})?(:\\d{2})?$/, \"\").replace(/\\s*(UTC|GMT|Z|z)$/, \"\"));\n if (!m) bad(\"time\", text);\n const hh = Number(m[1]);\n const mi = Number(m[2]);\n const ss = Number(m[3] ?? 0);\n const frac = m[4] ? Math.round(Number(m[4]) * 1_000_000) : 0;\n if (hh > 24 || mi > 59 || ss > 60) outOfRange(\"time\", text);\n const total = BigInt(hh) * USECS_PER_HOUR + BigInt(mi) * USECS_PER_MIN + BigInt(ss) * USECS_PER_SEC + BigInt(frac);\n if (total > USECS_PER_DAY) outOfRange(\"time\", text);\n return total;\n}\n\ninterface TsParts {\n y: number;\n m: number;\n d: number;\n micros: bigint; // time-of-day\n offsetSec: number | null; // explicit zone offset if present\n}\n\nconst TS_RE =\n /^(\\d{1,7})-(\\d{1,2})-(\\d{1,2})(?:[ T](\\d{1,2}):(\\d{1,2})(?::(\\d{1,2})(\\.\\d+)?)?)?\\s*(Z|z|UTC|GMT|[+-]\\d{1,2}(?::?\\d{2})?(?::\\d{2})?)?\\s*(BC|AD|bc|ad)?$/;\n\nfunction tryParseTimestampParts(text: string): TsParts | null {\n const m = TS_RE.exec(text.trim());\n if (!m) return null;\n let y = Number(m[1]);\n if (m[9] && m[9].toLowerCase() === \"bc\") y = -(y - 1);\n const mo = Number(m[2]);\n const d = Number(m[3]);\n const hh = Number(m[4] ?? 0);\n const mi = Number(m[5] ?? 0);\n const ss = Number(m[6] ?? 0);\n const frac = m[7] ? Math.round(Number(m[7]) * 1_000_000) : 0;\n if (hh > 24 || mi > 59 || ss > 60) return null;\n let offsetSec: number | null = null;\n const z = m[8];\n if (z) {\n if (z === \"Z\" || z === \"z\" || z === \"UTC\" || z === \"GMT\") offsetSec = 0;\n else {\n const zm = /^([+-])(\\d{1,2})(?::?(\\d{2}))?(?::(\\d{2}))?$/.exec(z);\n if (!zm) return null;\n const sign = zm[1] === \"-\" ? -1 : 1;\n offsetSec = sign * (Number(zm[2]) * 3600 + Number(zm[3] ?? 0) * 60 + Number(zm[4] ?? 0));\n }\n }\n const micros = BigInt(hh) * USECS_PER_HOUR + BigInt(mi) * USECS_PER_MIN + BigInt(ss) * USECS_PER_SEC + BigInt(frac);\n return { y, m: mo, d, micros, offsetSec };\n}\n\n/** Parse timestamp (no tz interpretation) -> PG micros. */\nexport function parseTimestamp(text: string): bigint {\n const t = text.trim().toLowerCase();\n if (t === \"infinity\") return TS_POS_INF;\n if (t === \"-infinity\") return TS_NEG_INF;\n if (t === \"epoch\") return BigInt(civilToDays(1970, 1, 1)) * USECS_PER_DAY;\n const p = tryParseTimestampParts(text);\n if (!p) bad(\"timestamp\", text);\n if (!isValidCivil(p.y, p.m, p.d)) outOfRange(\"timestamp\", text);\n return BigInt(civilToDays(p.y, p.m, p.d)) * USECS_PER_DAY + p.micros;\n}\n\n/**\n * Parse timestamptz -> UTC micros. `sessionOffsetSec` applies when the input\n * has no explicit zone (session TimeZone; we default to UTC).\n */\nexport function parseTimestampTz(text: string, zoneOffsetForNaive: (naiveMicros: bigint) => number): bigint {\n const t = text.trim().toLowerCase();\n if (t === \"infinity\") return TS_POS_INF;\n if (t === \"-infinity\") return TS_NEG_INF;\n if (t === \"epoch\") return BigInt(civilToDays(1970, 1, 1)) * USECS_PER_DAY;\n const p = tryParseTimestampParts(text);\n if (!p) bad(\"timestamp with time zone\", text);\n if (!isValidCivil(p.y, p.m, p.d)) outOfRange(\"timestamp with time zone\", text);\n const naive = BigInt(civilToDays(p.y, p.m, p.d)) * USECS_PER_DAY + p.micros;\n const off = p.offsetSec !== null ? p.offsetSec : zoneOffsetForNaive(naive);\n return naive - BigInt(off) * USECS_PER_SEC;\n}\n\n// --- formatting ----------------------------------------------------------\n\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\nfunction pad4(n: number): string {\n return String(n).padStart(4, \"0\");\n}\n\nexport function formatDate(days: number): string {\n if (days === DATE_POS_INF) return \"infinity\";\n if (days === DATE_NEG_INF) return \"-infinity\";\n const { y, m, d } = daysToCivil(days);\n if (y <= 0) return `${pad4(1 - y)}-${pad2(m)}-${pad2(d)} BC`;\n return `${pad4(y)}-${pad2(m)}-${pad2(d)}`;\n}\n\nexport function formatTimeOfDay(micros: bigint): string {\n const hh = Number(micros / USECS_PER_HOUR);\n const rem1 = micros % USECS_PER_HOUR;\n const mi = Number(rem1 / USECS_PER_MIN);\n const rem2 = rem1 % USECS_PER_MIN;\n const ss = Number(rem2 / USECS_PER_SEC);\n const frac = Number(rem2 % USECS_PER_SEC);\n let out = `${pad2(hh)}:${pad2(mi)}:${pad2(ss)}`;\n if (frac !== 0) {\n out += `.${String(frac).padStart(6, \"0\")}`.replace(/0+$/, \"\");\n }\n return out;\n}\n\n/** floor-divide micros into (days, timeOfDay) */\nexport function splitTs(micros: bigint): { days: number; tod: bigint } {\n let days = micros / USECS_PER_DAY;\n let tod = micros % USECS_PER_DAY;\n if (tod < 0n) {\n tod += USECS_PER_DAY;\n days -= 1n;\n }\n return { days: Number(days), tod };\n}\n\nexport function formatTimestamp(micros: bigint): string {\n if (micros === TS_POS_INF) return \"infinity\";\n if (micros === TS_NEG_INF) return \"-infinity\";\n const { days, tod } = splitTs(micros);\n const { y, m, d } = daysToCivil(days);\n const datePart = y <= 0 ? `${pad4(1 - y)}-${pad2(m)}-${pad2(d)}` : `${pad4(y)}-${pad2(m)}-${pad2(d)}`;\n const bc = y <= 0 ? \" BC\" : \"\";\n return `${datePart} ${formatTimeOfDay(tod)}${bc}`;\n}\n\n/** Format a UTC timestamptz in a fixed zone offset (seconds east of UTC). */\nexport function formatTimestampTz(micros: bigint, offsetSec: number): string {\n if (micros === TS_POS_INF) return \"infinity\";\n if (micros === TS_NEG_INF) return \"-infinity\";\n const local = micros + BigInt(offsetSec) * USECS_PER_SEC;\n const { days, tod } = splitTs(local);\n const { y, m, d } = daysToCivil(days);\n const abs = Math.abs(offsetSec);\n const oh = Math.floor(abs / 3600);\n const om = Math.floor((abs % 3600) / 60);\n const os = abs % 60;\n let zone = `${offsetSec < 0 ? \"-\" : \"+\"}${pad2(oh)}`;\n if (om !== 0 || os !== 0) zone += `:${pad2(om)}`;\n if (os !== 0) zone += `:${pad2(os)}`;\n const datePart = y <= 0 ? `${pad4(1 - y)}-${pad2(m)}-${pad2(d)}` : `${pad4(y)}-${pad2(m)}-${pad2(d)}`;\n const bc = y <= 0 ? \" BC\" : \"\";\n return `${datePart} ${formatTimeOfDay(tod)}${zone}${bc}`;\n}\n\n// --- interval ------------------------------------------------------------\n\nconst INTERVAL_UNIT: Record<string, { months?: number; days?: number; micros?: bigint }> = {\n microsecond: { micros: 1n },\n microseconds: { micros: 1n },\n us: { micros: 1n },\n millisecond: { micros: 1000n },\n milliseconds: { micros: 1000n },\n ms: { micros: 1000n },\n second: { micros: USECS_PER_SEC },\n seconds: { micros: USECS_PER_SEC },\n sec: { micros: USECS_PER_SEC },\n secs: { micros: USECS_PER_SEC },\n s: { micros: USECS_PER_SEC },\n minute: { micros: USECS_PER_MIN },\n minutes: { micros: USECS_PER_MIN },\n min: { micros: USECS_PER_MIN },\n mins: { micros: USECS_PER_MIN },\n m: { micros: USECS_PER_MIN },\n hour: { micros: USECS_PER_HOUR },\n hours: { micros: USECS_PER_HOUR },\n h: { micros: USECS_PER_HOUR },\n hr: { micros: USECS_PER_HOUR },\n hrs: { micros: USECS_PER_HOUR },\n day: { days: 1 },\n days: { days: 1 },\n d: { days: 1 },\n week: { days: 7 },\n weeks: { days: 7 },\n w: { days: 7 },\n month: { months: 1 },\n months: { months: 1 },\n mon: { months: 1 },\n mons: { months: 1 },\n year: { months: 12 },\n years: { months: 12 },\n y: { months: 12 },\n yr: { months: 12 },\n yrs: { months: 12 },\n decade: { months: 120 },\n decades: { months: 120 },\n century: { months: 1200 },\n centuries: { months: 1200 },\n millennium: { months: 12000 },\n millenniums: { months: 12000 },\n millennia: { months: 12000 },\n};\n\nexport function parseInterval(text: string): Interval {\n const t = text.trim();\n if (t === \"\") bad(\"interval\", text);\n // ISO 8601: P1Y2M3DT4H5M6.7S\n if (/^[Pp]/.test(t)) {\n const iso =\n /^[Pp](?:(-?\\d+(?:\\.\\d+)?)[Yy])?(?:(-?\\d+(?:\\.\\d+)?)[Mm])?(?:(-?\\d+(?:\\.\\d+)?)[Ww])?(?:(-?\\d+(?:\\.\\d+)?)[Dd])?(?:[Tt](?:(-?\\d+(?:\\.\\d+)?)[Hh])?(?:(-?\\d+(?:\\.\\d+)?)[Mm])?(?:(-?\\d+(?:\\.\\d+)?)[Ss])?)?$/.exec(\n t,\n );\n if (!iso) bad(\"interval\", text);\n let months = 0;\n let days = 0;\n let micros = 0n;\n if (iso[1]) months += Math.trunc(Number(iso[1]) * 12);\n if (iso[2]) months += Math.trunc(Number(iso[2]));\n if (iso[3]) days += Math.trunc(Number(iso[3]) * 7);\n if (iso[4]) days += Math.trunc(Number(iso[4]));\n if (iso[5]) micros += BigInt(Math.round(Number(iso[5]) * 3_600_000_000));\n if (iso[6]) micros += BigInt(Math.round(Number(iso[6]) * 60_000_000));\n if (iso[7]) micros += BigInt(Math.round(Number(iso[7]) * 1_000_000));\n return makeInterval(months, days, micros);\n }\n let months = 0;\n let days = 0;\n let micros = 0n;\n let matchedAny = false;\n let rest = t;\n // \"ago\" suffix negates everything\n let ago = false;\n if (/\\s+ago$/i.test(rest)) {\n ago = true;\n rest = rest.replace(/\\s+ago$/i, \"\");\n }\n // consume leading sign applied to an HH:MM[:SS] chunk or quantity-unit pairs\n const tokens = rest.split(/\\s+/);\n let i = 0;\n while (i < tokens.length) {\n const tok = tokens[i]!;\n // time-of-day chunk [+-]HH:MM[:SS[.f]]\n const tm = /^([+-]?)(\\d+):(\\d{1,2})(?::(\\d{1,2})(\\.\\d+)?)?$/.exec(tok);\n if (tm) {\n const sign = tm[1] === \"-\" ? -1n : 1n;\n const hh = BigInt(tm[2]!);\n const mi = BigInt(tm[3]!);\n const ss = BigInt(tm[4] ?? \"0\");\n const frac = tm[5] ? BigInt(Math.round(Number(tm[5]) * 1_000_000)) : 0n;\n micros += sign * (hh * USECS_PER_HOUR + mi * USECS_PER_MIN + ss * USECS_PER_SEC + frac);\n matchedAny = true;\n i += 1;\n continue;\n }\n // sql standard year-month: [+-]Y-M\n const ym = /^([+-]?)(\\d+)-(\\d{1,2})$/.exec(tok);\n if (ym) {\n const sign = ym[1] === \"-\" ? -1 : 1;\n months += sign * (Number(ym[2]) * 12 + Number(ym[3]));\n matchedAny = true;\n i += 1;\n continue;\n }\n // quantity unit\n const qm = /^([+-]?\\d+(?:\\.\\d+)?)$/.exec(tok);\n if (qm && i + 1 < tokens.length) {\n const unit = INTERVAL_UNIT[tokens[i + 1]!.toLowerCase().replace(/,$/, \"\")];\n if (!unit) bad(\"interval\", text);\n const qty = Number(qm[1]);\n if (unit.months) {\n const total = qty * unit.months;\n const wholeMonths = Math.trunc(total);\n months += wholeMonths;\n // fractional months spill into days (30 days per month)\n const fracMonths = total - wholeMonths;\n if (fracMonths !== 0) days += Math.trunc(fracMonths * 30);\n }\n if (unit.days) {\n const total = qty * unit.days;\n const whole = Math.trunc(total);\n days += whole;\n const frac = total - whole;\n if (frac !== 0) micros += BigInt(Math.round(frac * 86_400_000_000));\n }\n if (unit.micros) {\n micros += BigInt(Math.round(qty * Number(unit.micros)));\n }\n matchedAny = true;\n i += 2;\n continue;\n }\n // trailing bare number without a unit is taken as seconds (DecodeInterval)\n if (qm && i === tokens.length - 1) {\n micros += BigInt(Math.round(Number(qm[1]) * 1_000_000));\n matchedAny = true;\n i += 1;\n continue;\n }\n bad(\"interval\", text);\n }\n if (!matchedAny) bad(\"interval\", text);\n if (ago) return makeInterval(-months, -days, -micros);\n return makeInterval(months, days, micros);\n}\n\n/** Render interval in DateStyle 'postgres' (the default). */\nexport function formatInterval(v: Interval): string {\n // Mirrors PG's IntervalStyle=postgres output (AddPostgresIntPart): a positive\n // field following a negative one is prefixed with \"+\"; units are plural unless value == 1.\n const parts: string[] = [];\n let isBefore = false;\n const addPart = (value: number, unit: string): void => {\n if (value === 0) return;\n const sign = isBefore && value > 0 ? \"+\" : \"\";\n parts.push(`${sign}${value} ${unit}${value !== 1 ? \"s\" : \"\"}`);\n isBefore = value < 0;\n };\n addPart(Math.trunc(v.months / 12), \"year\");\n addPart(v.months % 12, \"mon\");\n addPart(v.days, \"day\");\n if (v.micros !== 0n || parts.length === 0) {\n const neg = v.micros < 0n;\n const abs = neg ? -v.micros : v.micros;\n const hh = abs / USECS_PER_HOUR;\n const rem1 = abs % USECS_PER_HOUR;\n const mi = Number(rem1 / USECS_PER_MIN);\n const rem2 = rem1 % USECS_PER_MIN;\n const ss = Number(rem2 / USECS_PER_SEC);\n const frac = Number(rem2 % USECS_PER_SEC);\n const sign = neg ? \"-\" : isBefore ? \"+\" : \"\";\n let time = `${sign}${hh < 10n ? `0${hh}` : String(hh)}:${pad2(mi)}:${pad2(ss)}`;\n if (frac !== 0) time += `.${String(frac).padStart(6, \"0\")}`.replace(/0+$/, \"\");\n parts.push(time);\n }\n return parts.join(\" \");\n}\n\nexport function intervalCmp(a: Interval, b: Interval): number {\n // PG compares on the equivalent total micros with 30-day months, 24h days\n const ta = intervalTotalMicros(a);\n const tb = intervalTotalMicros(b);\n return ta < tb ? -1 : ta > tb ? 1 : 0;\n}\n\nexport function intervalTotalMicros(v: Interval): bigint {\n return (BigInt(v.months) * 30n + BigInt(v.days)) * USECS_PER_DAY + v.micros;\n}\n\nexport function intervalAdd(a: Interval, b: Interval): Interval {\n return makeInterval(a.months + b.months, a.days + b.days, a.micros + b.micros);\n}\n\nexport function intervalNeg(a: Interval): Interval {\n return makeInterval(-a.months, -a.days, -a.micros);\n}\n\nexport function intervalJustifyHours(v: Interval): Interval {\n let days = v.days;\n let micros = v.micros;\n const extraDays = micros / USECS_PER_DAY;\n days += Number(extraDays);\n micros -= extraDays * USECS_PER_DAY;\n if (days > 0 && micros < 0n) {\n days -= 1;\n micros += USECS_PER_DAY;\n } else if (days < 0 && micros > 0n) {\n days += 1;\n micros -= USECS_PER_DAY;\n }\n return makeInterval(v.months, days, micros);\n}\n\nexport function intervalJustifyDays(v: Interval): Interval {\n let months = v.months;\n let days = v.days;\n const extraMonths = Math.trunc(days / 30);\n months += extraMonths;\n days -= extraMonths * 30;\n if (months > 0 && days < 0) {\n months -= 1;\n days += 30;\n } else if (months < 0 && days > 0) {\n months += 1;\n days -= 30;\n }\n return makeInterval(months, days, v.micros);\n}\n\n/** date + interval => timestamp micros arithmetic (add months honoring month-end clamping) */\nexport function timestampAddInterval(ts: bigint, iv: Interval): bigint {\n if (ts === TS_POS_INF || ts === TS_NEG_INF) return ts;\n let result = ts;\n if (iv.months !== 0) {\n const { days, tod } = splitTs(result);\n const civil = daysToCivil(days);\n let totalMonths = civil.y * 12 + (civil.m - 1) + iv.months;\n const y = Math.floor(totalMonths / 12);\n const m = totalMonths - y * 12 + 1;\n totalMonths = 0;\n const d = Math.min(civil.d, daysInMonth(y, m));\n result = BigInt(civilToDays(y, m, d)) * USECS_PER_DAY + tod;\n }\n if (iv.days !== 0) result += BigInt(iv.days) * USECS_PER_DAY;\n result += iv.micros;\n return result;\n}\n", "import { pgError } from \"../errors/error.ts\";\n\n/**\n * Arbitrary-precision decimal mirroring PostgreSQL's `numeric`.\n *\n * Value = (nan/inf special) or coefficient * 10^-dscale where `coef` is a\n * signed bigint and `dscale` (display scale) is the number of digits after\n * the decimal point. Display scale is significant: `2.50` renders as \"2.50\".\n */\nexport interface Numeric {\n readonly kind: \"numeric\";\n /** signed coefficient; value = coef * 10^-dscale */\n readonly coef: bigint;\n /** display scale (digits after decimal point), >= 0 */\n readonly dscale: number;\n readonly special: \"nan\" | \"inf\" | \"-inf\" | null;\n}\n\nconst MAX_DISPLAY_SCALE = 1000;\nconst MIN_SIG_DIGITS = 16;\n\nexport function makeNumeric(coef: bigint, dscale: number): Numeric {\n return { kind: \"numeric\", coef, dscale, special: null };\n}\n\nexport const NUMERIC_NAN: Numeric = { kind: \"numeric\", coef: 0n, dscale: 0, special: \"nan\" };\nexport const NUMERIC_PINF: Numeric = { kind: \"numeric\", coef: 0n, dscale: 0, special: \"inf\" };\nexport const NUMERIC_NINF: Numeric = { kind: \"numeric\", coef: 0n, dscale: 0, special: \"-inf\" };\n\nexport function isNumeric(v: unknown): v is Numeric {\n return typeof v === \"object\" && v !== null && (v as any).kind === \"numeric\";\n}\n\nfunction pow10(n: number): bigint {\n return 10n ** BigInt(n);\n}\n\nexport function numericFromBigInt(v: bigint): Numeric {\n return makeNumeric(v, 0);\n}\n\nexport function numericFromNumber(v: number): Numeric {\n if (Number.isNaN(v)) return NUMERIC_NAN;\n if (v === Number.POSITIVE_INFINITY) return NUMERIC_PINF;\n if (v === Number.NEGATIVE_INFINITY) return NUMERIC_NINF;\n return parseNumeric(shortestNumberString(v));\n}\n\n/** Shortest round-trip decimal digits for a JS number, in plain notation. */\nfunction shortestNumberString(v: number): string {\n const s = String(v);\n if (!s.includes(\"e\") && !s.includes(\"E\")) return s;\n // expand scientific notation\n const m = /^(-?)(\\d+)(?:\\.(\\d+))?[eE]([+-]?\\d+)$/.exec(s);\n if (!m) return s;\n const sign = m[1]!;\n const intPart = m[2]!;\n const fracPart = m[3] ?? \"\";\n const exp = Number(m[4]!);\n const digits = intPart + fracPart;\n const pointPos = intPart.length + exp;\n if (pointPos <= 0) {\n return `${sign}0.${\"0\".repeat(-pointPos)}${digits}`;\n }\n if (pointPos >= digits.length) {\n return sign + digits + \"0\".repeat(pointPos - digits.length);\n }\n return `${sign}${digits.slice(0, pointPos)}.${digits.slice(pointPos)}`;\n}\n\nconst NUMERIC_RE = /^\\s*([+-]?)(?:(\\d[\\d_]*)?(?:\\.(\\d[\\d_]*)?)?)([eE][+-]?\\d[\\d_]*)?\\s*$/;\n\n/** Parse text into numeric. Throws 22P02 on bad syntax (like numeric_in). */\nexport function parseNumeric(text: string): Numeric {\n const trimmed = text.trim();\n const lower = trimmed.toLowerCase();\n if (lower === \"nan\") return NUMERIC_NAN;\n if (lower === \"infinity\" || lower === \"inf\" || lower === \"+infinity\" || lower === \"+inf\") return NUMERIC_PINF;\n if (lower === \"-infinity\" || lower === \"-inf\") return NUMERIC_NINF;\n const m = NUMERIC_RE.exec(trimmed);\n if (!m || (m[2] === undefined && m[3] === undefined)) {\n throw pgError(\"invalid_text_representation\", `invalid input syntax for type numeric: \"${text}\"`);\n }\n const sign = m[1] === \"-\" ? -1n : 1n;\n const intDigits = (m[2] ?? \"\").replaceAll(\"_\", \"\");\n const fracDigits = (m[3] ?? \"\").replaceAll(\"_\", \"\");\n const expPart = m[4] ? Number(m[4].slice(1).replaceAll(\"_\", \"\")) : 0;\n let coef = BigInt((intDigits || \"0\") + fracDigits);\n let dscale = fracDigits.length - expPart;\n if (dscale < 0) {\n coef *= pow10(-dscale);\n dscale = 0;\n }\n if (dscale > MAX_DISPLAY_SCALE) {\n // reduce to max display scale with rounding\n const r = roundToScale(sign * coef, dscale, MAX_DISPLAY_SCALE);\n return makeNumeric(r, MAX_DISPLAY_SCALE);\n }\n return makeNumeric(sign * coef, dscale);\n}\n\n/** Round coefficient at `fromScale` to `toScale` (half away from zero). */\nfunction roundToScale(coef: bigint, fromScale: number, toScale: number): bigint {\n if (toScale >= fromScale) return coef * pow10(toScale - fromScale);\n const drop = fromScale - toScale;\n const p = pow10(drop);\n const q = coef / p;\n const r = coef % p;\n const half = p / 2n;\n if (r >= half) return q + 1n;\n if (-r >= half) return q - 1n;\n return q;\n}\n\nexport function numericRescale(v: Numeric, dscale: number): Numeric {\n if (v.special) return v;\n return makeNumeric(roundToScale(v.coef, v.dscale, dscale), dscale);\n}\n\nexport function numericText(v: Numeric): string {\n if (v.special === \"nan\") return \"NaN\";\n if (v.special === \"inf\") return \"Infinity\";\n if (v.special === \"-inf\") return \"-Infinity\";\n const neg = v.coef < 0n;\n const abs = (neg ? -v.coef : v.coef).toString();\n const scale = v.dscale;\n let out: string;\n if (scale === 0) {\n out = abs;\n } else {\n const padded = abs.padStart(scale + 1, \"0\");\n out = `${padded.slice(0, padded.length - scale)}.${padded.slice(padded.length - scale)}`;\n }\n return neg ? `-${out}` : out;\n}\n\nexport function numericIsZero(v: Numeric): boolean {\n return v.special === null && v.coef === 0n;\n}\n\nexport function numericSign(v: Numeric): number {\n if (v.special === \"nan\") return Number.NaN;\n if (v.special === \"inf\") return 1;\n if (v.special === \"-inf\") return -1;\n return v.coef > 0n ? 1 : v.coef < 0n ? -1 : 0;\n}\n\n/** Compare (NaN sorts greater than everything, like PG). Returns -1|0|1. */\nexport function numericCmp(a: Numeric, b: Numeric): number {\n const rank = (v: Numeric): number =>\n v.special === \"nan\" ? 2 : v.special === \"inf\" ? 1 : v.special === \"-inf\" ? -1 : 0;\n const ra = rank(a);\n const rb = rank(b);\n if (ra !== 0 || rb !== 0) return ra < rb ? -1 : ra > rb ? 1 : 0;\n const scale = Math.max(a.dscale, b.dscale);\n const ca = a.coef * pow10(scale - a.dscale);\n const cb = b.coef * pow10(scale - b.dscale);\n return ca < cb ? -1 : ca > cb ? 1 : 0;\n}\n\nfunction addSpecial(a: Numeric, b: Numeric): Numeric | null {\n if (a.special === \"nan\" || b.special === \"nan\") return NUMERIC_NAN;\n if (a.special === \"inf\") return b.special === \"-inf\" ? NUMERIC_NAN : NUMERIC_PINF;\n if (a.special === \"-inf\") return b.special === \"inf\" ? NUMERIC_NAN : NUMERIC_NINF;\n if (b.special) return b;\n return null;\n}\n\nexport function numericAdd(a: Numeric, b: Numeric): Numeric {\n const sp = addSpecial(a, b);\n if (sp) return sp;\n const scale = Math.max(a.dscale, b.dscale);\n return makeNumeric(a.coef * pow10(scale - a.dscale) + b.coef * pow10(scale - b.dscale), scale);\n}\n\nexport function numericNeg(a: Numeric): Numeric {\n if (a.special === \"inf\") return NUMERIC_NINF;\n if (a.special === \"-inf\") return NUMERIC_PINF;\n if (a.special) return a;\n return makeNumeric(-a.coef, a.dscale);\n}\n\nexport function numericSub(a: Numeric, b: Numeric): Numeric {\n return numericAdd(a, numericNeg(b));\n}\n\nexport function numericMul(a: Numeric, b: Numeric): Numeric {\n if (a.special || b.special) {\n if (a.special === \"nan\" || b.special === \"nan\") return NUMERIC_NAN;\n const sa = numericSign(a);\n const sb = numericSign(b);\n if (sa === 0 || sb === 0) return NUMERIC_NAN; // inf * 0\n return sa * sb > 0 ? NUMERIC_PINF : NUMERIC_NINF;\n }\n return makeNumeric(a.coef * b.coef, a.dscale + b.dscale);\n}\n\n/** Decimal weight: exponent of the first significant digit (0 for 1..9). */\nfunction decimalWeight(v: Numeric): number {\n if (v.coef === 0n) return 0;\n const abs = v.coef < 0n ? -v.coef : v.coef;\n return abs.toString().length - 1 - v.dscale;\n}\n\n/**\n * NBASE (base-10000) weight and first digit group, as numeric.c stores them.\n * weight w means the first digit group has value firstdigit \u00D7 10000^w.\n */\nfunction nbaseFirstDigit(v: Numeric): { weight: number; firstdigit: number } {\n if (v.coef === 0n) return { weight: 0, firstdigit: 0 };\n const abs = v.coef < 0n ? -v.coef : v.coef;\n const dw = abs.toString().length - 1 - v.dscale;\n const weight = Math.floor(dw / 4);\n const e = v.dscale + 4 * weight;\n const firstdigit = e >= 0 ? abs / pow10(e) : abs * pow10(-e);\n return { weight, firstdigit: Number(firstdigit) };\n}\n\n/** Result scale for division, mirroring numeric.c select_div_scale. */\nexport function selectDivScale(a: Numeric, b: Numeric): number {\n const d1 = nbaseFirstDigit(a);\n const d2 = nbaseFirstDigit(b);\n // Estimate quotient weight in NBASE digits (DEC_DIGITS = 4 per digit).\n let qweight = d1.weight - d2.weight;\n if (d1.firstdigit <= d2.firstdigit) qweight--;\n let rscale = MIN_SIG_DIGITS - qweight * 4;\n rscale = Math.max(rscale, a.dscale);\n rscale = Math.max(rscale, b.dscale);\n rscale = Math.max(rscale, 0);\n rscale = Math.min(rscale, MAX_DISPLAY_SCALE);\n return rscale;\n}\n\n/** Divide with explicit result scale, rounding half away from zero. */\nexport function numericDivScaled(a: Numeric, b: Numeric, rscale: number): Numeric {\n const sp = divSpecial(a, b);\n if (sp) return sp;\n if (b.coef === 0n) throw pgError(\"division_by_zero\", \"division by zero\");\n // a.coef*10^-as / b.coef*10^-bs = (a.coef / b.coef) * 10^(bs-as)\n // target: q * 10^-rscale\n const shift = rscale + b.dscale - a.dscale;\n let num = a.coef;\n let den = b.coef;\n if (shift >= 0) num *= pow10(shift);\n else den *= pow10(-shift);\n const neg = num < 0n !== den < 0n;\n const an = num < 0n ? -num : num;\n const ad = den < 0n ? -den : den;\n let q = an / ad;\n const r = an % ad;\n if (r * 2n >= ad) q += 1n;\n return makeNumeric(neg ? -q : q, rscale);\n}\n\nfunction divSpecial(a: Numeric, b: Numeric): Numeric | null {\n if (a.special === \"nan\" || b.special === \"nan\") return NUMERIC_NAN;\n if (a.special) {\n if (b.special) return NUMERIC_NAN; // inf/inf\n if (b.coef === 0n) throw pgError(\"division_by_zero\", \"division by zero\");\n const s = numericSign(a) * numericSign(b);\n return s > 0 ? NUMERIC_PINF : NUMERIC_NINF;\n }\n if (b.special) return makeNumeric(0n, 0);\n return null;\n}\n\nexport function numericDiv(a: Numeric, b: Numeric): Numeric {\n return numericDivScaled(a, b, selectDivScale(a, b));\n}\n\n/** Truncated integer division (div(a,b) function semantics). */\nexport function numericDivTrunc(a: Numeric, b: Numeric): Numeric {\n const sp = divSpecial(a, b);\n if (sp) return sp;\n if (b.coef === 0n) throw pgError(\"division_by_zero\", \"division by zero\");\n const scale = Math.max(a.dscale, b.dscale);\n const ca = a.coef * pow10(scale - a.dscale);\n const cb = b.coef * pow10(scale - b.dscale);\n return makeNumeric(ca / cb, 0);\n}\n\n/** Modulo like numeric_mod: result has scale max(s1, s2), sign of dividend. */\nexport function numericMod(a: Numeric, b: Numeric): Numeric {\n if (a.special === \"nan\" || b.special === \"nan\") return NUMERIC_NAN;\n if (a.special) return NUMERIC_NAN;\n if (b.special) return a;\n if (b.coef === 0n) throw pgError(\"division_by_zero\", \"division by zero\");\n const scale = Math.max(a.dscale, b.dscale);\n const ca = a.coef * pow10(scale - a.dscale);\n const cb = b.coef * pow10(scale - b.dscale);\n return makeNumeric(ca % cb, scale);\n}\n\nexport function numericAbs(a: Numeric): Numeric {\n if (a.special === \"-inf\") return NUMERIC_PINF;\n if (a.special) return a;\n return makeNumeric(a.coef < 0n ? -a.coef : a.coef, a.dscale);\n}\n\n/** round(v, s): round half away from zero; result dscale = max(s, 0). */\nexport function numericRound(a: Numeric, s: number): Numeric {\n if (a.special) return a;\n if (s >= a.dscale) return a;\n const coef = roundToScale(a.coef, a.dscale, Math.max(s, -1000));\n if (s < 0) {\n return makeNumeric(coef * pow10(-s), 0);\n }\n return makeNumeric(coef, s);\n}\n\n/** trunc(v, s): truncate toward zero. */\nexport function numericTrunc(a: Numeric, s: number): Numeric {\n if (a.special) return a;\n if (s >= a.dscale) return a;\n const drop = a.dscale - Math.max(s, 0);\n let coef = a.coef / pow10(drop);\n if (s < 0) {\n const p = pow10(-s);\n coef = (coef / p) * p;\n return makeNumeric(coef, 0);\n }\n return makeNumeric(coef, Math.max(s, 0));\n}\n\nexport function numericFloor(a: Numeric): Numeric {\n if (a.special) return a;\n if (a.dscale === 0) return a;\n const p = pow10(a.dscale);\n let q = a.coef / p;\n if (a.coef < 0n && a.coef % p !== 0n) q -= 1n;\n return makeNumeric(q, 0);\n}\n\nexport function numericCeil(a: Numeric): Numeric {\n if (a.special) return a;\n if (a.dscale === 0) return a;\n const p = pow10(a.dscale);\n let q = a.coef / p;\n if (a.coef > 0n && a.coef % p !== 0n) q += 1n;\n return makeNumeric(q, 0);\n}\n\nexport function numericToNumber(a: Numeric): number {\n if (a.special === \"nan\") return Number.NaN;\n if (a.special === \"inf\") return Number.POSITIVE_INFINITY;\n if (a.special === \"-inf\") return Number.NEGATIVE_INFINITY;\n return Number(numericText(a));\n}\n\n/** Exact bigint if integral after rounding to scale 0 (half away from zero). */\nexport function numericToBigInt(a: Numeric): bigint {\n if (a.special) {\n throw pgError(\"numeric_value_out_of_range\", \"bigint out of range\");\n }\n return roundToScale(a.coef, a.dscale, 0);\n}\n\n/** sqrt via integer Newton iteration at extended scale. */\nexport function numericSqrt(a: Numeric): Numeric {\n if (a.special === \"nan\") return NUMERIC_NAN;\n if (a.special === \"inf\") return NUMERIC_PINF;\n if (a.special === \"-inf\") throw pgError(\"invalid_parameter_value\", \"cannot take square root of a negative number\");\n if (a.coef < 0n) throw pgError(\"invalid_parameter_value\", \"cannot take square root of a negative number\");\n if (a.coef === 0n) return makeNumeric(0n, Math.max(a.dscale, 0));\n // PG numeric_sqrt: sweight from the NBASE-10000 weight of the argument\n const w4 = Math.floor(decimalWeight(a) / 4);\n const sweight = ((w4 + 1) * 4) / 2 - 1;\n let rscale = MIN_SIG_DIGITS - sweight;\n rscale = Math.max(rscale, a.dscale);\n rscale = Math.max(rscale, 0);\n rscale = Math.min(rscale, MAX_DISPLAY_SCALE);\n // compute floor(sqrt(a * 10^(2*(rscale+g)))) with guard digits then round\n const guard = 4;\n const target =\n a.coef * pow10(2 * (rscale + guard) - a.dscale + ((2 * (rscale + guard) - a.dscale) % 2 === 0 ? 0 : 1));\n // ensure even shift for exact sqrt scaling\n let shift = 2 * (rscale + guard) - a.dscale;\n if (shift % 2 !== 0) shift += 1;\n const scaled = a.coef * pow10(shift);\n const root = bigintSqrt(scaled);\n void target;\n const extraScale = (a.dscale + shift) / 2;\n return makeNumeric(roundToScale(root, extraScale, rscale), rscale);\n}\n\nfunction bigintSqrt(n: bigint): bigint {\n if (n < 0n) throw new Error(\"negative\");\n if (n < 2n) return n;\n let x = 1n << BigInt(Math.ceil(n.toString(2).length / 2));\n for (;;) {\n const y = (x + n / x) >> 1n;\n if (y >= x) return x;\n x = y;\n }\n}\n\n// --- fixed-point transcendental core -------------------------------------------\n// Values are bigints scaled by 10^S. Mirrors PG's ln_var/exp_var/power_var so\n// results are correct to the chosen display scale (float64 is not enough).\n\n/** round(num / den), half away from zero; den > 0 */\nfunction roundDiv(num: bigint, den: bigint): bigint {\n const q = num / den;\n const r = num % den;\n if (r === 0n) return q;\n const abs2r = (r < 0n ? -r : r) * 2n;\n if (abs2r >= den) return num < 0n ? q - 1n : q + 1n;\n return q;\n}\n\nfunction fxFrom(v: Numeric, S: number): bigint {\n return roundToScale(v.coef, v.dscale, S);\n}\n\nfunction fxMul(a: bigint, b: bigint, S: number): bigint {\n return roundDiv(a * b, pow10(S));\n}\n\nfunction fxDiv(a: bigint, b: bigint, S: number): bigint {\n const neg = b < 0n;\n return roundDiv(a * pow10(S) * (neg ? -1n : 1n), neg ? -b : b);\n}\n\nfunction isqrt(n: bigint): bigint {\n if (n < 2n) return n;\n // Newton from a power-of-two upper bound; monotonically descends to floor(sqrt(n))\n let x = 1n << BigInt((n.toString(2).length >> 1) + 1);\n for (;;) {\n const y = (x + n / x) >> 1n;\n if (y >= x) return x;\n x = y;\n }\n}\n\nfunction fxSqrt(a: bigint, S: number): bigint {\n return isqrt(a * pow10(S));\n}\n\n/** ln of positive fixed-point x at scale S (repeated sqrt into [0.9, 1.1], then atanh series) */\nfunction fxLn(x: bigint, S: number): bigint {\n const one = pow10(S);\n let m = x;\n let f = 1n;\n const hi = (one * 11n) / 10n;\n const lo = (one * 9n) / 10n;\n while (m > hi || m < lo) {\n m = fxSqrt(m, S);\n f *= 2n;\n }\n const t = fxDiv(m - one, m + one, S);\n const t2 = fxMul(t, t, S);\n let term = t;\n let sum = t;\n let k = 3n;\n for (;;) {\n term = fxMul(term, t2, S);\n const add = roundDiv(term, k);\n if (add === 0n) break;\n sum += add;\n k += 2n;\n }\n return 2n * f * sum;\n}\n\n/** e^x for fixed-point x at scale S (halve into |x| <= 0.01, Taylor, square back) */\nfunction fxExp(x: bigint, S: number): bigint {\n const one = pow10(S);\n const limit = one / 100n;\n let xx = x;\n let halvings = 0;\n while (xx > limit || xx < -limit) {\n xx = roundDiv(xx, 2n);\n halvings++;\n if (halvings > 1000) throw pgError(\"numeric_value_out_of_range\", \"value overflows numeric format\");\n }\n let term = one;\n let sum = one;\n let k = 1n;\n for (;;) {\n term = roundDiv(fxMul(term, xx, S), k);\n if (term === 0n) break;\n sum += term;\n k += 1n;\n }\n let r = sum;\n for (let i = 0; i < halvings; i++) r = fxMul(r, r, S);\n return r;\n}\n\n/** working guard digits beyond the display scale */\nconst FX_GUARD = 24;\n\n/** PG's literal log10(e) constant from numeric.c (not Math.LOG10E) */\n// biome-ignore lint/suspicious/noApproximativeNumericConstant: intentionally PG's truncated constant\nconst PG_LOG10E = 0.434294481903252;\n\n/**\n * PG's estimate_ln_dweight: decimal weight of the most significant digit of\n * ln(x). Near 1 (0.9..1.1) it uses the weight of x-1; otherwise a float estimate.\n */\nfunction estimateLnDweight(a: Numeric): number {\n const nineTenths = makeNumeric(9n, 1);\n const elevenTenths = makeNumeric(11n, 1);\n if (numericCmp(a, nineTenths) >= 0 && numericCmp(a, elevenTenths) <= 0) {\n const d = numericSub(a, makeNumeric(1n, 0));\n if (d.coef === 0n) return 0;\n return decimalWeight(d);\n }\n const x = Math.abs(numericToNumber(a));\n if (x === 0 || !Number.isFinite(x)) return 0;\n const lnd = Math.abs(Math.log(x));\n if (lnd === 0) return 0;\n return Math.trunc(Math.log10(lnd));\n}\n\n/** binary powering of a fixed-point value at scale S (rounds each step, like PG's mul_var chain) */\nfunction fxPow(base: bigint, e: bigint, S: number): bigint {\n let result = pow10(S);\n let sq = base;\n let n = e;\n while (n > 0n) {\n if (n & 1n) result = fxMul(result, sq, S);\n n >>= 1n;\n if (n > 0n) sq = fxMul(sq, sq, S);\n }\n return result;\n}\n\n/** power for numeric with numeric result: ports PG's power_var/power_var_int in fixed point. */\nexport function numericPower(a: Numeric, b: Numeric): Numeric {\n if (a.special === \"nan\" || b.special === \"nan\") return NUMERIC_NAN;\n // integral exponent: power_var_int (exact or rounded binary powering)\n if (!a.special && !b.special && b.dscale === 0) {\n const e = b.coef;\n if (a.coef === 0n || e === 0n) {\n if (a.coef === 0n && e < 0n) {\n throw pgError(\"division_by_zero\", \"zero raised to a negative power is undefined\");\n }\n const zscale = Math.min(Math.max(MIN_SIG_DIGITS, a.dscale), MAX_DISPLAY_SCALE);\n return makeNumeric(e === 0n ? pow10(zscale) : 0n, zscale);\n }\n const p = Math.log10(Math.abs(numericToNumber(a))) * Number(e);\n if (p > 131072) throw pgError(\"numeric_value_out_of_range\", \"value overflows numeric format\");\n let rscale = MIN_SIG_DIGITS - Math.trunc(p);\n rscale = Math.max(rscale, a.dscale);\n rscale = Math.max(rscale, 0);\n rscale = Math.min(rscale, MAX_DISPLAY_SCALE);\n const negate = a.coef < 0n && ((e % 2n) + 2n) % 2n === 1n;\n const absCoef = a.coef < 0n ? -a.coef : a.coef;\n const absE = e < 0n ? -e : e;\n let coef: bigint;\n if (e > 0n && a.dscale * Number(e) <= rscale + 32 && p < 4000) {\n // exact bigint power, then round to the display scale\n let exact = 1n;\n let sq = absCoef;\n let n = absE;\n while (n > 0n) {\n if (n & 1n) exact *= sq;\n n >>= 1n;\n if (n > 0n) sq *= sq;\n }\n coef = roundToScale(exact, a.dscale * Number(e), rscale);\n } else {\n const ws = rscale + Math.max(0, Math.ceil(Math.abs(p))) + FX_GUARD;\n const pow = fxPow(fxFrom(makeNumeric(absCoef, a.dscale), ws), absE, ws);\n const r = e < 0n ? fxDiv(pow10(ws), pow, ws) : pow;\n coef = roundToScale(r, ws, rscale);\n }\n return makeNumeric(negate ? -coef : coef, rscale);\n }\n const av = numericToNumber(a);\n const bv = numericToNumber(b);\n if (av === 0 && bv < 0) throw pgError(\"division_by_zero\", \"zero raised to a negative power is undefined\");\n if (av < 0 && !Number.isInteger(bv)) {\n throw pgError(\"invalid_parameter_value\", \"a negative number raised to a non-integer power yields a complex result\");\n }\n if (a.special || b.special) {\n const r = av ** bv;\n if (Number.isNaN(r)) return NUMERIC_NAN;\n if (r === Number.POSITIVE_INFINITY) return NUMERIC_PINF;\n if (r === Number.NEGATIVE_INFINITY) return NUMERIC_NINF;\n return numericFromNumber(r);\n }\n if (a.coef === 0n) {\n // 0 ^ positive-non-integer = 0 with the default sig-digit scale\n return makeNumeric(0n, MIN_SIG_DIGITS);\n }\n // negative base with integral exponent: sign from exponent parity\n let base = a;\n let negate = false;\n if (a.coef < 0n) {\n base = makeNumeric(-a.coef, a.dscale);\n const ipart = numericRescale(b, 0);\n negate = ((ipart.coef % 2n) + 2n) % 2n === 1n;\n }\n // result decimal-weight estimate \u2192 display scale, as PG power_var does\n const p = Math.log(Math.abs(numericToNumber(base))) * bv * PG_LOG10E;\n if (p > 131072) throw pgError(\"numeric_value_out_of_range\", \"value overflows numeric format\");\n let rscale = MIN_SIG_DIGITS - Math.trunc(p);\n rscale = Math.max(rscale, a.dscale);\n rscale = Math.max(rscale, b.dscale);\n rscale = Math.max(rscale, 0);\n rscale = Math.min(rscale, MAX_DISPLAY_SCALE);\n const ws = rscale + Math.max(0, Math.ceil(p)) + FX_GUARD;\n const lnBase = fxLn(fxFrom(base, ws), ws);\n const arg = fxMul(lnBase, fxFrom(b, ws), ws);\n const r = fxExp(arg, ws);\n const coef = roundToScale(negate ? -r : r, ws, rscale);\n return makeNumeric(coef, rscale);\n}\n\n/** exp(numeric) in fixed point with PG's exp_var display-scale rule. */\nexport function numericExp(a: Numeric): Numeric {\n if (a.special === \"nan\") return NUMERIC_NAN;\n if (a.special === \"inf\") return NUMERIC_PINF;\n if (a.special === \"-inf\") return makeNumeric(0n, 16);\n const xv = numericToNumber(a);\n const p = xv * PG_LOG10E;\n if (p > 131072) throw pgError(\"numeric_value_out_of_range\", \"value overflows numeric format\");\n let rscale = MIN_SIG_DIGITS - Math.trunc(p);\n rscale = Math.max(rscale, a.dscale);\n rscale = Math.max(rscale, 0);\n rscale = Math.min(rscale, MAX_DISPLAY_SCALE);\n const ws = rscale + Math.max(0, Math.ceil(p)) + FX_GUARD;\n const r = fxExp(fxFrom(a, ws), ws);\n return makeNumeric(roundToScale(r, ws, rscale), rscale);\n}\n\nfunction lnRscale(a: Numeric): number {\n let rscale = MIN_SIG_DIGITS - estimateLnDweight(a);\n rscale = Math.max(rscale, a.dscale);\n rscale = Math.max(rscale, 0);\n return Math.min(rscale, MAX_DISPLAY_SCALE);\n}\n\nfunction checkLnArg(a: Numeric): void {\n const s = numericSign(a);\n if (s === 0) throw pgError(\"invalid_parameter_value\", \"cannot take logarithm of zero\");\n if (s < 0) throw pgError(\"invalid_parameter_value\", \"cannot take logarithm of a negative number\");\n}\n\n/** ln(numeric) in fixed point with PG's numeric_ln display-scale rule. */\nexport function numericLn(a: Numeric): Numeric {\n if (a.special === \"nan\") return NUMERIC_NAN;\n if (a.special === \"-inf\") throw pgError(\"invalid_parameter_value\", \"cannot take logarithm of a negative number\");\n if (a.special === \"inf\") return NUMERIC_PINF;\n checkLnArg(a);\n const rscale = lnRscale(a);\n const ws = rscale + FX_GUARD;\n const r = fxLn(fxFrom(a, ws), ws);\n return makeNumeric(roundToScale(r, ws, rscale), rscale);\n}\n\n/** log(base, x) = ln(x)/ln(base) in fixed point with PG's log_var scale rule. */\nexport function numericLogBase(base: Numeric, x: Numeric): Numeric {\n if (base.special === \"nan\" || x.special === \"nan\") return NUMERIC_NAN;\n if (x.special === \"-inf\" || base.special === \"-inf\") {\n throw pgError(\"invalid_parameter_value\", \"cannot take logarithm of a negative number\");\n }\n if (x.special === \"inf\" || base.special === \"inf\") {\n // ln(inf)/ln(b) etc \u2014 mirror float behavior for the special grid\n const r = Math.log(numericToNumber(x)) / Math.log(numericToNumber(base));\n return numericFromNumber(r);\n }\n checkLnArg(x);\n checkLnArg(base);\n let rscale = MIN_SIG_DIGITS - (estimateLnDweight(x) - estimateLnDweight(base));\n rscale = Math.max(rscale, base.dscale);\n rscale = Math.max(rscale, x.dscale);\n rscale = Math.max(rscale, 0);\n rscale = Math.min(rscale, MAX_DISPLAY_SCALE);\n const ws = rscale + FX_GUARD;\n const r = fxDiv(fxLn(fxFrom(x, ws), ws), fxLn(fxFrom(base, ws), ws), ws);\n return makeNumeric(roundToScale(r, ws, rscale), rscale);\n}\n\n/** log10(numeric) in fixed point. */\nexport function numericLog10(a: Numeric): Numeric {\n if (a.special === \"nan\") return NUMERIC_NAN;\n if (a.special === \"-inf\") throw pgError(\"invalid_parameter_value\", \"cannot take logarithm of a negative number\");\n if (a.special === \"inf\") return NUMERIC_PINF;\n checkLnArg(a);\n return numericLogBase(makeNumeric(10n, 0), a);\n}\n\n/** Apply numeric(precision, scale) typmod constraint. */\nexport function applyNumericTypmod(v: Numeric, precision: number, scale: number): Numeric {\n if (v.special) {\n if (v.special === \"nan\") return v;\n throw pgError(\"numeric_value_out_of_range\", `numeric field overflow`);\n }\n const rescaled = numericRescale(v, scale);\n const abs = rescaled.coef < 0n ? -rescaled.coef : rescaled.coef;\n const maxIntDigits = precision - scale;\n const intDigits = abs === 0n ? 0 : Math.max(abs.toString().length - scale, 0);\n if (intDigits > maxIntDigits) {\n throw pgError(\"numeric_value_out_of_range\", `numeric field overflow`);\n }\n return rescaled;\n}\n\n/** Strip trailing fractional zeros (used by jsonb number canonicalization is NOT this; PG keeps scale). */\nexport function numericStripTrailingZeros(v: Numeric): Numeric {\n if (v.special || v.dscale === 0) return v;\n let coef = v.coef;\n let scale = v.dscale;\n while (scale > 0 && coef % 10n === 0n) {\n coef /= 10n;\n scale -= 1;\n }\n return makeNumeric(coef, scale);\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport { type Numeric, numericStripTrailingZeros, numericText, parseNumeric } from \"./numeric.ts\";\n\n/**\n * jsonb value tree. Numbers are kept as `numeric` (PG stores jsonb numbers\n * as numeric \u2014 `1.50::jsonb` keeps its scale). Object keys are unique;\n * output order is (length, byte order), matching PG jsonb.\n */\nexport type JsonbValue =\n | { j: \"null\" }\n | { j: \"bool\"; v: boolean }\n | { j: \"num\"; v: Numeric }\n | { j: \"str\"; v: string }\n | { j: \"arr\"; v: JsonbValue[] }\n | { j: \"obj\"; v: Map<string, JsonbValue> };\n\nexport const JSONB_NULL: JsonbValue = { j: \"null\" };\n\nexport function jsonbBool(v: boolean): JsonbValue {\n return { j: \"bool\", v };\n}\n\nexport function jsonbNum(v: Numeric): JsonbValue {\n return { j: \"num\", v };\n}\n\nexport function jsonbStr(v: string): JsonbValue {\n return { j: \"str\", v };\n}\n\nexport function jsonbArr(v: JsonbValue[]): JsonbValue {\n return { j: \"arr\", v };\n}\n\nexport function jsonbObj(entries: Iterable<[string, JsonbValue]>): JsonbValue {\n const m = new Map<string, JsonbValue>();\n for (const [k, v] of entries) m.set(k, v); // later duplicate wins (PG behavior)\n return { j: \"obj\", v: m };\n}\n\n// --- JSON text parsing (strict RFC 8259 with PG error wording) -----------\n\nclass JsonParser {\n private pos = 0;\n constructor(private readonly text: string) {}\n\n parse(): JsonbValue {\n this.skipWs();\n const v = this.parseValue();\n this.skipWs();\n if (this.pos < this.text.length) this.fail(\"expected end of input\");\n return v;\n }\n\n private fail(_detail: string): never {\n throw pgError(\"invalid_text_representation\", `invalid input syntax for type json`, \"22P02\");\n }\n\n private skipWs(): void {\n while (this.pos < this.text.length) {\n const c = this.text[this.pos]!;\n if (c === \" \" || c === \"\\t\" || c === \"\\n\" || c === \"\\r\") this.pos++;\n else break;\n }\n }\n\n private parseValue(): JsonbValue {\n const c = this.text[this.pos];\n if (c === undefined) this.fail(\"unexpected end\");\n if (c === \"{\") return this.parseObject();\n if (c === \"[\") return this.parseArray();\n if (c === '\"') return jsonbStr(this.parseString());\n if (c === \"t\") {\n this.expect(\"true\");\n return jsonbBool(true);\n }\n if (c === \"f\") {\n this.expect(\"false\");\n return jsonbBool(false);\n }\n if (c === \"n\") {\n this.expect(\"null\");\n return JSONB_NULL;\n }\n return this.parseNumber();\n }\n\n private expect(word: string): void {\n if (this.text.slice(this.pos, this.pos + word.length) !== word) this.fail(`expected ${word}`);\n this.pos += word.length;\n }\n\n private parseObject(): JsonbValue {\n this.pos++; // {\n const m = new Map<string, JsonbValue>();\n this.skipWs();\n if (this.text[this.pos] === \"}\") {\n this.pos++;\n return { j: \"obj\", v: m };\n }\n for (;;) {\n this.skipWs();\n if (this.text[this.pos] !== '\"') this.fail(\"expected string key\");\n const key = this.parseString();\n this.skipWs();\n if (this.text[this.pos] !== \":\") this.fail(\"expected :\");\n this.pos++;\n this.skipWs();\n const value = this.parseValue();\n m.set(key, value);\n this.skipWs();\n const c = this.text[this.pos];\n if (c === \",\") {\n this.pos++;\n continue;\n }\n if (c === \"}\") {\n this.pos++;\n return { j: \"obj\", v: m };\n }\n this.fail(\"expected , or }\");\n }\n }\n\n private parseArray(): JsonbValue {\n this.pos++; // [\n const items: JsonbValue[] = [];\n this.skipWs();\n if (this.text[this.pos] === \"]\") {\n this.pos++;\n return jsonbArr(items);\n }\n for (;;) {\n this.skipWs();\n items.push(this.parseValue());\n this.skipWs();\n const c = this.text[this.pos];\n if (c === \",\") {\n this.pos++;\n continue;\n }\n if (c === \"]\") {\n this.pos++;\n return jsonbArr(items);\n }\n this.fail(\"expected , or ]\");\n }\n }\n\n private parseString(): string {\n this.pos++; // \"\n let out = \"\";\n for (;;) {\n const c = this.text[this.pos];\n if (c === undefined) this.fail(\"unterminated string\");\n if (c === '\"') {\n this.pos++;\n return out;\n }\n if (c === \"\\\\\") {\n const e = this.text[this.pos + 1];\n this.pos += 2;\n switch (e) {\n case '\"':\n out += '\"';\n break;\n case \"\\\\\":\n out += \"\\\\\";\n break;\n case \"/\":\n out += \"/\";\n break;\n case \"b\":\n out += \"\\b\";\n break;\n case \"f\":\n out += \"\\f\";\n break;\n case \"n\":\n out += \"\\n\";\n break;\n case \"r\":\n out += \"\\r\";\n break;\n case \"t\":\n out += \"\\t\";\n break;\n case \"u\": {\n const hex = this.text.slice(this.pos, this.pos + 4);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) this.fail(\"bad unicode escape\");\n this.pos += 4;\n let code = Number.parseInt(hex, 16);\n if (code >= 0xd800 && code <= 0xdbff && this.text.slice(this.pos, this.pos + 2) === \"\\\\u\") {\n const hex2 = this.text.slice(this.pos + 2, this.pos + 6);\n if (/^[0-9a-fA-F]{4}$/.test(hex2)) {\n const low = Number.parseInt(hex2, 16);\n if (low >= 0xdc00 && low <= 0xdfff) {\n code = 0x10000 + (code - 0xd800) * 0x400 + (low - 0xdc00);\n this.pos += 6;\n }\n }\n }\n if (code === 0) {\n throw pgError(\"invalid_text_representation\", \"unsupported Unicode escape sequence\", \"22P05\");\n }\n out += String.fromCodePoint(code);\n break;\n }\n default:\n this.fail(\"bad escape\");\n }\n continue;\n }\n if (c < \" \") this.fail(\"control character in string\");\n out += c;\n this.pos++;\n }\n }\n\n private parseNumber(): JsonbValue {\n const start = this.pos;\n const re = /-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/y;\n re.lastIndex = this.pos;\n const m = re.exec(this.text);\n if (!m || m.index !== start) this.fail(\"bad number\");\n this.pos = re.lastIndex;\n return jsonbNum(parseNumeric(m[0]));\n }\n}\n\nexport function parseJsonText(text: string): JsonbValue {\n return new JsonParser(text).parse();\n}\n\n/** Validate json text without canonicalizing (for `json` type input). */\nexport function validateJsonText(text: string): void {\n new JsonParser(text).parse();\n}\n\nfunction escapeJsonString(s: string): string {\n let out = '\"';\n for (const ch of s) {\n const code = ch.codePointAt(0)!;\n if (ch === '\"') out += '\\\\\"';\n else if (ch === \"\\\\\") out += \"\\\\\\\\\";\n else if (ch === \"\\b\") out += \"\\\\b\";\n else if (ch === \"\\f\") out += \"\\\\f\";\n else if (ch === \"\\n\") out += \"\\\\n\";\n else if (ch === \"\\r\") out += \"\\\\r\";\n else if (ch === \"\\t\") out += \"\\\\t\";\n else if (code < 0x20) out += `\\\\u${code.toString(16).padStart(4, \"0\")}`;\n else out += ch;\n }\n return `${out}\"`;\n}\n\n/** jsonb key sort: length first, then byte order (PG lexCompareJsonbStringValue). */\nexport function jsonbKeyCompare(a: string, b: string): number {\n const ea = new TextEncoder().encode(a);\n const eb = new TextEncoder().encode(b);\n const n = Math.min(ea.length, eb.length);\n for (let i = 0; i < n; i++) {\n if (ea[i]! !== eb[i]!) return ea[i]! < eb[i]! ? -1 : 1;\n }\n if (ea.length !== eb.length) return ea.length < eb.length ? -1 : 1;\n return 0;\n}\n\nfunction sortedKeys(m: Map<string, JsonbValue>): string[] {\n return [...m.keys()].sort((a, b) => {\n if (a.length !== b.length) return a.length - b.length;\n return jsonbKeyCompare(a, b);\n });\n}\n\n/** jsonb number rendering: numeric text with trailing zeros preserved per stored scale. */\nfunction jsonbNumText(v: Numeric): string {\n return numericText(v);\n}\n\n/** Render jsonb in PG's canonical text form: `{\"a\": 1, \"b\": [1, 2]}` */\nexport function jsonbText(v: JsonbValue): string {\n switch (v.j) {\n case \"null\":\n return \"null\";\n case \"bool\":\n return v.v ? \"true\" : \"false\";\n case \"num\":\n return jsonbNumText(v.v);\n case \"str\":\n return escapeJsonString(v.v);\n case \"arr\":\n return `[${v.v.map(jsonbText).join(\", \")}]`;\n case \"obj\": {\n const keys = sortedKeys(v.v);\n return `{${keys.map((k) => `${escapeJsonString(k)}: ${jsonbText(v.v.get(k)!)}`).join(\", \")}}`;\n }\n }\n}\n\n/** Render as compact json text with insertion order (row_to_json / to_json / composite_to_json). */\nexport function jsonbCompactText(v: JsonbValue): string {\n switch (v.j) {\n case \"null\":\n return \"null\";\n case \"bool\":\n return v.v ? \"true\" : \"false\";\n case \"num\":\n return jsonbNumText(v.v);\n case \"str\":\n return escapeJsonString(v.v);\n case \"arr\":\n return `[${v.v.map(jsonbCompactText).join(\",\")}]`;\n case \"obj\":\n return `{${[...v.v.entries()].map(([k, x]) => `${escapeJsonString(k)}:${jsonbCompactText(x)}`).join(\",\")}}`;\n }\n}\n\n/** Structural equality (jsonb = jsonb). */\nexport function jsonbEquals(a: JsonbValue, b: JsonbValue): boolean {\n return jsonbCompare(a, b) === 0;\n}\n\nconst TYPE_ORDER: Record<JsonbValue[\"j\"], number> = {\n // PG jsonb btree ordering: Object > Array > Boolean > Number > String > Null\n obj: 5,\n arr: 4,\n bool: 3,\n num: 2,\n str: 1,\n null: 0,\n};\n\n/** Total order over jsonb (matches jsonb btree comparison semantics). */\nexport function jsonbCompare(a: JsonbValue, b: JsonbValue): number {\n if (a.j !== b.j) return TYPE_ORDER[a.j] - TYPE_ORDER[b.j];\n switch (a.j) {\n case \"null\":\n return 0;\n case \"bool\": {\n const bb = b as Extract<JsonbValue, { j: \"bool\" }>;\n return a.v === bb.v ? 0 : a.v ? 1 : -1;\n }\n case \"num\": {\n const bb = b as Extract<JsonbValue, { j: \"num\" }>;\n const na = numericStripTrailingZeros(a.v);\n const nb = numericStripTrailingZeros(bb.v);\n const ta = numericText(na);\n const tb = numericText(nb);\n if (ta === tb) return 0;\n const fa = Number(ta);\n const fb = Number(tb);\n if (fa !== fb) return fa < fb ? -1 : 1;\n return ta < tb ? -1 : 1;\n }\n case \"str\": {\n const bb = b as Extract<JsonbValue, { j: \"str\" }>;\n return a.v < bb.v ? -1 : a.v > bb.v ? 1 : 0;\n }\n case \"arr\": {\n const bb = b as Extract<JsonbValue, { j: \"arr\" }>;\n if (a.v.length !== bb.v.length) return a.v.length - bb.v.length;\n for (let i = 0; i < a.v.length; i++) {\n const c = jsonbCompare(a.v[i]!, bb.v[i]!);\n if (c !== 0) return c;\n }\n return 0;\n }\n case \"obj\": {\n const bb = b as Extract<JsonbValue, { j: \"obj\" }>;\n if (a.v.size !== bb.v.size) return a.v.size - bb.v.size;\n const ka = sortedKeys(a.v);\n const kb = sortedKeys(bb.v);\n for (let i = 0; i < ka.length; i++) {\n if (ka[i]! !== kb[i]!) {\n if (ka[i]!.length !== kb[i]!.length) return ka[i]!.length - kb[i]!.length;\n return jsonbKeyCompare(ka[i]!, kb[i]!);\n }\n const c = jsonbCompare(a.v.get(ka[i]!)!, bb.v.get(kb[i]!)!);\n if (c !== 0) return c;\n }\n return 0;\n }\n }\n}\n\n/** jsonb containment (@>). */\nexport function jsonbContains(a: JsonbValue, b: JsonbValue): boolean {\n if (a.j === \"obj\" && b.j === \"obj\") {\n for (const [k, bv] of b.v) {\n const av = a.v.get(k);\n if (av === undefined || !jsonbContains(av, bv)) return false;\n }\n return true;\n }\n if (a.j === \"arr\" && b.j === \"arr\") {\n for (const bv of b.v) {\n let found = false;\n for (const av of a.v) {\n if (jsonbContains(av, bv)) {\n found = true;\n break;\n }\n }\n if (!found) return false;\n }\n return true;\n }\n if (a.j === \"arr\" && b.j !== \"arr\" && b.j !== \"obj\") {\n // scalar contained in top-level array\n for (const av of a.v) {\n if (av.j === b.j && jsonbEquals(av, b)) return true;\n }\n return false;\n }\n return a.j === b.j && jsonbEquals(a, b);\n}\n", "import { pgError, unsupported } from \"../errors/error.ts\";\nimport { parseTsqueryText, parseTsvector, tsqueryText } from \"../tsearch/tsearch.ts\";\nimport {\n formatDate,\n formatInterval,\n formatTimeOfDay,\n formatTimestamp,\n formatTimestampTz,\n type Interval,\n parseDate,\n parseInterval,\n parseTime,\n parseTimestamp,\n parseTimestampTz,\n} from \"./datetime.ts\";\nimport { type JsonbValue, jsonbText, parseJsonText, validateJsonText } from \"./jsonb.ts\";\nimport { type Numeric, numericText, parseNumeric } from \"./numeric.ts\";\n\n/**\n * Canonical type ids are lowercase PG internal names: \"int4\", \"text\",\n * \"timestamptz\", \u2026 Arrays are `elem + \"[]\"`. Enums are `\"enum:\" + qualified\n * name`. \"unknown\" is the type of untyped string literals; \"null\" never\n * appears (null datums carry whatever type context provides).\n */\nexport type TypeId = string;\n\nexport type Datum =\n | null\n | boolean\n | number\n | bigint\n | string\n | Uint8Array\n | Numeric\n | Interval\n | PgArray\n | PgRecord\n | JsonbWrap;\n\nexport interface PgArray {\n readonly kind: \"pgarray\";\n readonly elem: TypeId;\n /** dimension lengths, outermost first; empty array => [] */\n readonly dims: number[];\n /** lower bounds per dimension (default 1) */\n readonly lbs: number[];\n /** row-major flattened items */\n readonly items: Datum[];\n}\n\nexport interface PgRecord {\n readonly kind: \"pgrecord\";\n readonly types: TypeId[];\n readonly values: Datum[];\n readonly names?: string[];\n}\n\n/** jsonb datums are wrapped so `typeof` dispatch stays unambiguous. */\nexport interface JsonbWrap {\n readonly kind: \"jsonb\";\n readonly value: JsonbValue;\n}\n\nexport function wrapJsonb(value: JsonbValue): JsonbWrap {\n return { kind: \"jsonb\", value };\n}\n\nexport function isJsonbWrap(v: unknown): v is JsonbWrap {\n return typeof v === \"object\" && v !== null && (v as any).kind === \"jsonb\";\n}\n\nexport function isPgArray(v: unknown): v is PgArray {\n return typeof v === \"object\" && v !== null && (v as any).kind === \"pgarray\";\n}\n\nexport function isPgRecord(v: unknown): v is PgRecord {\n return typeof v === \"object\" && v !== null && (v as any).kind === \"pgrecord\";\n}\n\nexport function makeArray(elem: TypeId, items: Datum[], dims?: number[], lbs?: number[]): PgArray {\n const d = dims ?? (items.length === 0 ? [] : [items.length]);\n const l = lbs ?? d.map(() => 1);\n return { kind: \"pgarray\", elem, dims: d, lbs: l, items };\n}\n\nexport interface TypedValue {\n readonly t: TypeId;\n readonly v: Datum;\n}\n\nexport function tv(t: TypeId, v: Datum): TypedValue {\n return { t, v };\n}\n\nexport const UNKNOWN = \"unknown\";\n\n// --- type name normalization ---------------------------------------------\n\nexport interface TypeMod {\n /** varchar(n)/bpchar(n): max chars; numeric: precision; time/timestamp: fractional digits */\n readonly a?: number;\n /** numeric scale */\n readonly b?: number;\n}\n\nexport interface ColumnType {\n readonly id: TypeId;\n readonly mod: TypeMod | null;\n}\n\nconst TYPE_ALIASES: Record<string, TypeId> = {\n bool: \"bool\",\n boolean: \"bool\",\n int2: \"int2\",\n smallint: \"int2\",\n int4: \"int4\",\n int: \"int4\",\n integer: \"int4\",\n int8: \"int8\",\n bigint: \"int8\",\n float4: \"float4\",\n real: \"float4\",\n float8: \"float8\",\n \"double precision\": \"float8\",\n float: \"float8\",\n numeric: \"numeric\",\n decimal: \"numeric\",\n money: \"money\",\n text: \"text\",\n varchar: \"varchar\",\n \"character varying\": \"varchar\",\n bpchar: \"bpchar\",\n character: \"bpchar\",\n char: \"bpchar\",\n name: \"name\",\n bytea: \"bytea\",\n date: \"date\",\n time: \"time\",\n \"time without time zone\": \"time\",\n timetz: \"timetz\",\n \"time with time zone\": \"timetz\",\n timestamp: \"timestamp\",\n \"timestamp without time zone\": \"timestamp\",\n timestamptz: \"timestamptz\",\n \"timestamp with time zone\": \"timestamptz\",\n interval: \"interval\",\n uuid: \"uuid\",\n json: \"json\",\n jsonb: \"jsonb\",\n regclass: \"regclass\",\n regtype: \"regtype\",\n regproc: \"regproc\",\n oid: \"oid\",\n void: \"void\",\n record: \"record\",\n tsvector: \"tsvector\",\n tsquery: \"tsquery\",\n bit: \"bit\",\n \"bit varying\": \"varbit\",\n varbit: \"varbit\",\n serial: \"int4\",\n serial4: \"int4\",\n serial8: \"int8\",\n bigserial: \"int8\",\n smallserial: \"int2\",\n serial2: \"int2\",\n};\n\nexport function normalizeTypeName(name: string): TypeId | null {\n const lower = name.trim().toLowerCase().replace(/\\s+/g, \" \");\n return TYPE_ALIASES[lower] ?? null;\n}\n\nexport function isArrayType(t: TypeId): boolean {\n return t.endsWith(\"[]\");\n}\n\nexport function arrayElemType(t: TypeId): TypeId {\n return t.slice(0, -2);\n}\n\nexport function arrayTypeOf(elem: TypeId): TypeId {\n // PG arrays are one-level: int4[][] is still _int4\n return isArrayType(elem) ? elem : `${elem}[]`;\n}\n\nexport function isEnumType(t: TypeId): boolean {\n return t.startsWith(\"enum:\");\n}\n\nexport function enumTypeName(t: TypeId): string {\n return t.slice(5);\n}\n\n/** SQL-facing type name (format_type / pg_typeof style). */\nexport function typeDisplayName(t: TypeId): string {\n if (isArrayType(t)) return `${typeDisplayName(arrayElemType(t))}[]`;\n if (isEnumType(t)) return enumTypeName(t);\n switch (t) {\n case \"bool\":\n return \"boolean\";\n case \"int2\":\n return \"smallint\";\n case \"int4\":\n return \"integer\";\n case \"int8\":\n return \"bigint\";\n case \"float4\":\n return \"real\";\n case \"float8\":\n return \"double precision\";\n case \"varchar\":\n return \"character varying\";\n case \"bpchar\":\n return \"character\";\n case \"timestamp\":\n return \"timestamp without time zone\";\n case \"timestamptz\":\n return \"timestamp with time zone\";\n case \"time\":\n return \"time without time zone\";\n case \"timetz\":\n return \"time with time zone\";\n default:\n return t;\n }\n}\n\n// --- OIDs (for catalog output and oracle-conformant field metadata) -------\n\nexport const TYPE_OIDS: Record<string, number> = {\n bool: 16,\n bytea: 17,\n name: 19,\n int8: 20,\n int2: 21,\n int4: 23,\n regproc: 24,\n text: 25,\n oid: 26,\n json: 114,\n float4: 700,\n float8: 701,\n money: 790,\n bpchar: 1042,\n varchar: 1043,\n date: 1082,\n time: 1083,\n timestamp: 1114,\n timestamptz: 1184,\n interval: 1186,\n timetz: 1266,\n bit: 1560,\n varbit: 1562,\n numeric: 1700,\n regclass: 2205,\n regtype: 2206,\n record: 2249,\n uuid: 2950,\n jsonb: 3802,\n tsvector: 3614,\n tsquery: 3615,\n void: 2278,\n unknown: 705,\n};\n\nconst ARRAY_OIDS: Record<string, number> = {\n bool: 1000,\n bytea: 1001,\n name: 1003,\n int8: 1016,\n int2: 1005,\n int4: 1007,\n text: 1009,\n oid: 1028,\n json: 199,\n float4: 1021,\n float8: 1022,\n money: 791,\n bpchar: 1014,\n varchar: 1015,\n date: 1182,\n time: 1183,\n timestamp: 1115,\n timestamptz: 1185,\n interval: 1187,\n timetz: 1270,\n numeric: 1231,\n record: 2287,\n uuid: 2951,\n jsonb: 3807,\n};\n\nexport function typeOid(t: TypeId): number {\n if (isArrayType(t)) return ARRAY_OIDS[arrayElemType(t)] ?? 2277;\n return TYPE_OIDS[t] ?? 705;\n}\n\n// --- float rendering (PG shortest round-trip format) ----------------------\n\n/** Extract shortest digits+exponent for a finite double. */\nfunction shortestParts(v: number): { neg: boolean; digits: string; exp: number } {\n const s = Math.abs(v).toString();\n if (s.includes(\"e\") || s.includes(\"E\")) {\n const m = /^(\\d+)(?:\\.(\\d+))?e([+-]\\d+)$/.exec(s)!;\n const digits = (m[1]! + (m[2] ?? \"\")).replace(/0+$/, \"\") || \"0\";\n const exp = Number(m[3]) + m[1]!.length - 1;\n return { neg: v < 0, digits, exp };\n }\n const dot = s.indexOf(\".\");\n if (dot === -1) {\n const trimmed = s.replace(/0+$/, \"\");\n const digits = trimmed === \"\" ? \"0\" : trimmed;\n return { neg: v < 0, digits, exp: s.length - 1 };\n }\n const intPart = s.slice(0, dot);\n const fracPart = s.slice(dot + 1);\n if (intPart === \"0\") {\n let lead = 0;\n while (lead < fracPart.length && fracPart[lead] === \"0\") lead++;\n const digits = fracPart.slice(lead).replace(/0+$/, \"\") || \"0\";\n return { neg: v < 0, digits, exp: -(lead + 1) };\n }\n const digits = (intPart + fracPart).replace(/0+$/, \"\") || \"0\";\n return { neg: v < 0, digits, exp: intPart.length - 1 };\n}\n\nfunction formatFloatParts(neg: boolean, digits: string, exp: number, sciLow: number, sciHigh: number): string {\n const sign = neg ? \"-\" : \"\";\n if (digits === \"0\") return \"0\";\n if (exp < sciLow || exp >= sciHigh) {\n const mant = digits.length === 1 ? digits : `${digits[0]}.${digits.slice(1)}`;\n const absExp = Math.abs(exp);\n const expStr = absExp < 10 ? `0${absExp}` : String(absExp);\n return `${sign}${mant}e${exp < 0 ? \"-\" : \"+\"}${expStr}`;\n }\n if (exp >= digits.length - 1) {\n return sign + digits + \"0\".repeat(exp - (digits.length - 1));\n }\n if (exp >= 0) {\n return `${sign}${digits.slice(0, exp + 1)}.${digits.slice(exp + 1)}`;\n }\n return `${sign}0.${\"0\".repeat(-exp - 1)}${digits}`;\n}\n\nexport function float8Text(v: number): string {\n if (Number.isNaN(v)) return \"NaN\";\n if (v === Number.POSITIVE_INFINITY) return \"Infinity\";\n if (v === Number.NEGATIVE_INFINITY) return \"-Infinity\";\n if (v === 0) return Object.is(v, -0) ? \"-0\" : \"0\";\n const { neg, digits, exp } = shortestParts(v);\n return formatFloatParts(neg, digits, exp, -4, 15);\n}\n\n/** Shortest digits that round-trip through float32. */\nfunction float4ShortestDigits(v: number): { neg: boolean; digits: string; exp: number } {\n for (let p = 1; p <= 9; p++) {\n const cand = v.toPrecision(p);\n if (Math.fround(Number(cand)) === v) {\n const n = Number(cand);\n return shortestParts(n);\n }\n }\n return shortestParts(v);\n}\n\nexport function float4Text(v: number): string {\n if (Number.isNaN(v)) return \"NaN\";\n if (v === Number.POSITIVE_INFINITY) return \"Infinity\";\n if (v === Number.NEGATIVE_INFINITY) return \"-Infinity\";\n if (v === 0) return Object.is(v, -0) ? \"-0\" : \"0\";\n const { neg, digits, exp } = float4ShortestDigits(v);\n return formatFloatParts(neg, digits, exp, -4, 6);\n}\n\nexport function parseFloatText(text: string, type: \"float4\" | \"float8\"): number {\n const t = text.trim().toLowerCase();\n if (t === \"nan\") return Number.NaN;\n if (t === \"infinity\" || t === \"inf\" || t === \"+infinity\" || t === \"+inf\") return Number.POSITIVE_INFINITY;\n if (t === \"-infinity\" || t === \"-inf\") return Number.NEGATIVE_INFINITY;\n if (!/^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$/.test(t)) {\n throw pgError(\n \"invalid_text_representation\",\n `invalid input syntax for type ${type === \"float4\" ? \"real\" : \"double precision\"}: \"${text}\"`,\n );\n }\n let v = Number(t);\n if (type === \"float4\") {\n v = Math.fround(v);\n if (!Number.isFinite(v) && Number.isFinite(Number(t))) {\n throw pgError(\"numeric_value_out_of_range\", `\"${text}\" is out of range for type real`);\n }\n }\n if (v === 0) v = 0; // canonicalize -0 from parse? PG keeps -0 for floats\n return Number(t) === 0 && t.startsWith(\"-\") ? -0 : v;\n}\n\n// --- integers --------------------------------------------------------------\n\nexport const INT2_MIN = -32768;\nexport const INT2_MAX = 32767;\nexport const INT4_MIN = -2147483648;\nexport const INT4_MAX = 2147483647;\nexport const INT8_MIN = -9223372036854775808n;\nexport const INT8_MAX = 9223372036854775807n;\n\nexport function checkInt2(v: number): number {\n if (!Number.isInteger(v) || v < INT2_MIN || v > INT2_MAX) {\n throw pgError(\"numeric_value_out_of_range\", \"smallint out of range\");\n }\n return v;\n}\n\nexport function checkInt4(v: number): number {\n if (!Number.isInteger(v) || v < INT4_MIN || v > INT4_MAX) {\n throw pgError(\"numeric_value_out_of_range\", \"integer out of range\");\n }\n return v;\n}\n\nexport function checkInt8(v: bigint): bigint {\n if (v < INT8_MIN || v > INT8_MAX) {\n throw pgError(\"numeric_value_out_of_range\", \"bigint out of range\");\n }\n return v;\n}\n\nfunction parseIntegerText(text: string, type: \"int2\" | \"int4\" | \"int8\"): number | bigint {\n const t = text.trim();\n const names = { int2: \"smallint\", int4: \"integer\", int8: \"bigint\" } as const;\n if (!/^[+-]?\\d+$/.test(t)) {\n throw pgError(\"invalid_text_representation\", `invalid input syntax for type ${names[type]}: \"${text}\"`);\n }\n const big = BigInt(t);\n if (type === \"int8\") {\n if (big < INT8_MIN || big > INT8_MAX) {\n throw pgError(\"numeric_value_out_of_range\", `value \"${text}\" is out of range for type bigint`);\n }\n return big;\n }\n const n = Number(big);\n const [min, max] = type === \"int2\" ? [INT2_MIN, INT2_MAX] : [INT4_MIN, INT4_MAX];\n if (big < BigInt(min) || big > BigInt(max)) {\n throw pgError(\"numeric_value_out_of_range\", `value \"${text}\" is out of range for type ${names[type]}`);\n }\n return n;\n}\n\n// --- bool ------------------------------------------------------------------\n\nexport function parseBoolText(text: string): boolean {\n const t = text.trim().toLowerCase();\n if (t === \"t\" || t === \"true\" || t === \"yes\" || t === \"on\" || t === \"y\" || t === \"1\" || t === \"tr\" || t === \"tru\")\n return true;\n if (\n t === \"f\" ||\n t === \"false\" ||\n t === \"no\" ||\n t === \"off\" ||\n t === \"n\" ||\n t === \"0\" ||\n t === \"fa\" ||\n t === \"fal\" ||\n t === \"fals\"\n )\n return false;\n throw pgError(\"invalid_text_representation\", `invalid input syntax for type boolean: \"${text}\"`);\n}\n\n// --- bytea -------------------------------------------------------------------\n\nexport function parseByteaText(text: string): Uint8Array {\n if (text.startsWith(\"\\\\x\") || text.startsWith(\"\\\\X\")) {\n const hex = text.slice(2).replace(/\\s/g, \"\");\n if (hex.length % 2 !== 0 || !/^[0-9a-fA-F]*$/.test(hex)) {\n throw pgError(\"invalid_text_representation\", `invalid hexadecimal data: odd number of digits`);\n }\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < out.length; i++) {\n out[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n }\n return out;\n }\n // escape format\n const bytes: number[] = [];\n for (let i = 0; i < text.length; i++) {\n const c = text[i]!;\n if (c === \"\\\\\") {\n const next = text[i + 1];\n if (next === \"\\\\\") {\n bytes.push(92);\n i += 1;\n } else if (next !== undefined && /[0-3]/.test(next) && /^[0-7]{3}$/.test(text.slice(i + 1, i + 4))) {\n bytes.push(Number.parseInt(text.slice(i + 1, i + 4), 8));\n i += 3;\n } else {\n throw pgError(\"invalid_text_representation\", `invalid input syntax for type bytea`);\n }\n } else {\n bytes.push(c.charCodeAt(0));\n }\n }\n return new Uint8Array(bytes);\n}\n\nexport function byteaText(v: Uint8Array): string {\n let out = \"\\\\x\";\n for (const b of v) out += b.toString(16).padStart(2, \"0\");\n return out;\n}\n\n// --- uuid ---------------------------------------------------------------------\n\nconst UUID_RE = /^\\{?([0-9a-fA-F]{8})-?([0-9a-fA-F]{4})-?([0-9a-fA-F]{4})-?([0-9a-fA-F]{4})-?([0-9a-fA-F]{12})\\}?$/;\n\nexport function parseUuidText(text: string): string {\n const m = UUID_RE.exec(text.trim());\n if (!m) {\n throw pgError(\"invalid_text_representation\", `invalid input syntax for type uuid: \"${text}\"`);\n }\n return `${m[1]}-${m[2]}-${m[3]}-${m[4]}-${m[5]}`.toLowerCase();\n}\n\n// --- money -----------------------------------------------------------------\n\nexport function parseMoneyText(text: string): bigint {\n const t = text.trim().replace(/[$,]/g, \"\");\n const m = /^([+-]?)(\\d*)(?:\\.(\\d*))?$/.exec(t) ?? /^\\((\\d*)(?:\\.(\\d*))?\\)$/.exec(t);\n if (!m || t.replace(/[+\\-().]/g, \"\") === \"\") {\n throw pgError(\"invalid_text_representation\", `invalid input syntax for type money: \"${text}\"`);\n }\n if (t.startsWith(\"(\")) {\n const mm = /^\\((\\d*)(?:\\.(\\d*))?\\)$/.exec(t)!;\n return -moneyCents(mm[1] ?? \"0\", mm[2] ?? \"\");\n }\n const sign = m[1] === \"-\" ? -1n : 1n;\n return sign * moneyCents(m[2] ?? \"0\", m[3] ?? \"\");\n}\n\nfunction moneyCents(intPart: string, fracPart: string): bigint {\n const frac = (fracPart + \"000\").slice(0, 3);\n const cents = BigInt(intPart || \"0\") * 100n + BigInt(frac.slice(0, 2) || \"0\");\n // round on third fractional digit\n return Number(frac[2] ?? \"0\") >= 5 ? cents + 1n : cents;\n}\n\nexport function moneyText(cents: bigint): string {\n const neg = cents < 0n;\n const abs = neg ? -cents : cents;\n const whole = abs / 100n;\n const frac = abs % 100n;\n // C locale money formatting with thousands separators\n const wholeStr = whole.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n const body = `$${wholeStr}.${frac.toString().padStart(2, \"0\")}`;\n return neg ? `-${body}` : body;\n}\n\n// --- array text ---------------------------------------------------------------\n\nfunction arrayElemNeedsQuote(s: string): boolean {\n if (s.length === 0) return true;\n if (/^null$/i.test(s)) return true;\n return /[\\s{},\"\\\\]/.test(s);\n}\n\nfunction quoteArrayElem(s: string): string {\n return `\"${s.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"')}\"`;\n}\n\nexport interface OutputCtx {\n /** offset seconds east of UTC for rendering timestamptz at given UTC micros */\n zoneOffsetAt(utcMicros: bigint): number;\n}\n\nexport const UTC_OUTPUT: OutputCtx = { zoneOffsetAt: () => 0 };\n\nexport function arrayText(arr: PgArray, ctx: OutputCtx): string {\n if (arr.dims.length === 0) return \"{}\";\n const needsLb = arr.lbs.some((l) => l !== 1);\n let idx = 0;\n const renderDim = (dim: number): string => {\n const len = arr.dims[dim]!;\n const parts: string[] = [];\n for (let i = 0; i < len; i++) {\n if (dim === arr.dims.length - 1) {\n const item = arr.items[idx++]!;\n if (item === null) {\n parts.push(\"NULL\");\n } else {\n const s = datumText(arr.elem, item, ctx);\n parts.push(arrayElemNeedsQuote(s) ? quoteArrayElem(s) : s);\n }\n } else {\n parts.push(renderDim(dim + 1));\n }\n }\n return `{${parts.join(\",\")}}`;\n };\n const body = renderDim(0);\n if (!needsLb) return body;\n const spec = arr.dims.map((d, i) => `[${arr.lbs[i]}:${arr.lbs[i]! + d - 1}]`).join(\"\");\n return `${spec}=${body}`;\n}\n\nfunction recordFieldNeedsQuote(s: string): boolean {\n if (s.length === 0) return true;\n return /[\\s(),\"\\\\]/.test(s);\n}\n\nexport function recordText(rec: PgRecord, ctx: OutputCtx): string {\n const parts = rec.values.map((v, i) => {\n if (v === null) return \"\";\n const s = datumText(rec.types[i] ?? \"text\", v, ctx);\n return recordFieldNeedsQuote(s) ? `\"${s.replaceAll('\"', '\"\"').replaceAll(\"\\\\\", \"\\\\\\\\\")}\"` : s;\n });\n return `(${parts.join(\",\")})`;\n}\n\n// --- typoutput -------------------------------------------------------------\n\n/** Render a non-null datum of type `t` to PG wire text. */\nexport function datumText(t: TypeId, v: Datum, ctx: OutputCtx): string {\n if (v === null) throw pgError(\"internal\", \"datumText called with null\");\n if (isArrayType(t)) return arrayText(v as PgArray, ctx);\n if (isEnumType(t)) return v as string;\n switch (t) {\n case \"bool\":\n return (v as boolean) ? \"t\" : \"f\";\n case \"int2\":\n case \"int4\":\n case \"oid\":\n return String(v);\n case \"int8\":\n return String(v);\n case \"float4\":\n return float4Text(v as number);\n case \"float8\":\n return float8Text(v as number);\n case \"numeric\":\n return numericText(v as Numeric);\n case \"money\":\n return moneyText(v as bigint);\n case \"text\":\n case \"varchar\":\n case \"bpchar\":\n case \"name\":\n case \"unknown\":\n case \"json\":\n case \"regclass\":\n case \"regtype\":\n case \"regproc\":\n case \"tsvector\":\n case \"tsquery\":\n case \"bit\":\n case \"varbit\":\n return v as string;\n case \"bytea\":\n return byteaText(v as Uint8Array);\n case \"date\":\n return formatDate(v as number);\n case \"time\":\n return formatTimeOfDay(v as bigint);\n case \"timetz\": {\n const tz = v as unknown as { micros: bigint; offsetSec: number };\n const base = formatTimeOfDay(tz.micros);\n const off = tz.offsetSec;\n const abs = Math.abs(off);\n const oh = Math.floor(abs / 3600);\n const om = Math.floor((abs % 3600) / 60);\n let zone = `${off < 0 ? \"-\" : \"+\"}${oh < 10 ? `0${oh}` : oh}`;\n if (om !== 0) zone += `:${om < 10 ? `0${om}` : om}`;\n return base + zone;\n }\n case \"timestamp\":\n return formatTimestamp(v as bigint);\n case \"timestamptz\":\n return formatTimestampTz(v as bigint, ctx.zoneOffsetAt(v as bigint));\n case \"interval\":\n return formatInterval(v as Interval);\n case \"uuid\":\n return v as string;\n case \"jsonb\":\n return jsonbText((v as JsonbWrap).value);\n case \"record\":\n return recordText(v as PgRecord, ctx);\n case \"void\":\n return \"\";\n default:\n if (isPgRecord(v)) return recordText(v, ctx);\n throw unsupported(`output of type ${t}`);\n }\n}\n\n// --- typinput ----------------------------------------------------------------\n\nexport interface InputCtx {\n /** session zone offset lookup for naive timestamptz input */\n zoneOffsetForNaive(naiveMicros: bigint): number;\n /** enum label validation: returns true when label is valid for the enum type */\n enumHasLabel?(enumType: TypeId, label: string): boolean;\n}\n\nexport const UTC_INPUT: InputCtx = { zoneOffsetForNaive: () => 0 };\n\n/** Parse PG wire text into a datum of type `t` (typinput). */\nexport function datumFromText(t: TypeId, text: string, ctx: InputCtx): Datum {\n if (isArrayType(t)) return parseArrayText(t, text, ctx);\n if (isEnumType(t)) {\n if (ctx.enumHasLabel && !ctx.enumHasLabel(t, text)) {\n throw pgError(\"invalid_text_representation\", `invalid input value for enum ${enumTypeName(t)}: \"${text}\"`);\n }\n return text;\n }\n switch (t) {\n case \"bool\":\n return parseBoolText(text);\n case \"int2\":\n case \"int4\":\n case \"int8\":\n return parseIntegerText(text, t);\n case \"oid\": {\n const n = parseIntegerText(text, \"int8\") as bigint;\n return Number(n);\n }\n case \"float4\":\n return Math.fround(parseFloatText(text, \"float4\"));\n case \"float8\":\n return parseFloatText(text, \"float8\");\n case \"numeric\":\n return parseNumeric(text);\n case \"money\":\n return parseMoneyText(text);\n case \"text\":\n case \"varchar\":\n case \"bpchar\":\n case \"unknown\":\n return text;\n case \"name\":\n return text.slice(0, 63);\n case \"json\":\n validateJsonText(text);\n return text;\n case \"jsonb\":\n return wrapJsonb(parseJsonText(text));\n case \"bytea\":\n return parseByteaText(text);\n case \"date\":\n return parseDate(text);\n case \"time\":\n return parseTime(text);\n case \"timestamp\":\n return parseTimestamp(text);\n case \"timestamptz\":\n return parseTimestampTz(text, ctx.zoneOffsetForNaive);\n case \"interval\":\n return parseInterval(text);\n case \"uuid\":\n return parseUuidText(text);\n case \"tsvector\":\n return parseTsvector(text);\n case \"tsquery\": {\n const node = parseTsqueryText(text);\n return tsqueryText(node);\n }\n case \"bit\":\n case \"varbit\": {\n if (!/^[01]*$/.test(text)) {\n const bad = [...text].find((c) => c !== \"0\" && c !== \"1\")!;\n throw pgError(\"invalid_text_representation\", `\"${bad}\" is not a valid binary digit`);\n }\n return text;\n }\n default:\n throw unsupported(`input of type ${t}`);\n }\n}\n\nfunction parseArrayText(t: TypeId, text: string, ctx: InputCtx): PgArray {\n const elem = arrayElemType(t);\n let s = text.trim();\n let lbs: number[] | null = null;\n // optional dimension spec [1:2][3:4]=\n const dimSpec = /^((?:\\[-?\\d+:-?\\d+\\])+)=/.exec(s);\n if (dimSpec) {\n lbs = [...dimSpec[1]!.matchAll(/\\[(-?\\d+):(-?\\d+)\\]/g)].map((m) => Number(m[1]));\n s = s.slice(dimSpec[0].length);\n }\n if (!s.startsWith(\"{\")) {\n throw pgError(\"invalid_text_representation\", `malformed array literal: \"${text}\"`);\n }\n let pos = 0;\n const parseLevel = (): (Datum | Datum[] | any)[] => {\n // assumes s[pos] === '{'\n pos++;\n const out: any[] = [];\n for (;;) {\n while (pos < s.length && /\\s/.test(s[pos]!)) pos++;\n const c = s[pos];\n if (c === undefined) throw pgError(\"invalid_text_representation\", `malformed array literal: \"${text}\"`);\n if (c === \"}\") {\n pos++;\n return out;\n }\n if (c === \",\") {\n pos++;\n continue;\n }\n if (c === \"{\") {\n out.push(parseLevel());\n continue;\n }\n if (c === '\"') {\n pos++;\n let val = \"\";\n for (;;) {\n const ch = s[pos];\n if (ch === undefined) throw pgError(\"invalid_text_representation\", `malformed array literal: \"${text}\"`);\n if (ch === \"\\\\\") {\n val += s[pos + 1] ?? \"\";\n pos += 2;\n continue;\n }\n if (ch === '\"') {\n pos++;\n break;\n }\n val += ch;\n pos++;\n }\n out.push(datumFromText(elem, val, ctx));\n continue;\n }\n // bare token\n let tok = \"\";\n while (pos < s.length && !/[,}]/.test(s[pos]!)) {\n tok += s[pos];\n pos++;\n }\n tok = tok.trim();\n if (/^null$/i.test(tok)) out.push(null);\n else out.push(datumFromText(elem, tok, ctx));\n }\n };\n const nested = parseLevel();\n while (pos < s.length && /\\s/.test(s[pos]!)) pos++;\n if (pos !== s.length) {\n throw pgError(\"invalid_text_representation\", `malformed array literal: \"${text}\"`);\n }\n // flatten and compute dims\n const dims: number[] = [];\n let level: any = nested;\n while (Array.isArray(level)) {\n dims.push(level.length);\n level = level[0];\n }\n if (nested.length === 0) return makeArray(elem, [], [], []);\n const items: Datum[] = [];\n const flatten = (arr: any[], depth: number): void => {\n if (arr.length !== dims[depth]) {\n throw pgError(\"invalid_text_representation\", `malformed array literal: \"${text}\"`);\n }\n for (const item of arr) {\n if (depth === dims.length - 1) {\n if (Array.isArray(item)) throw pgError(\"invalid_text_representation\", `malformed array literal: \"${text}\"`);\n items.push(item);\n } else {\n if (!Array.isArray(item)) throw pgError(\"invalid_text_representation\", `malformed array literal: \"${text}\"`);\n flatten(item, depth + 1);\n }\n }\n };\n flatten(nested, 0);\n return makeArray(elem, items, dims, lbs ?? dims.map(() => 1));\n}\n", "import type { CreateTriggerStmt, Expr, SelectStmt, Statement } from \"../ast/nodes.ts\";\nimport { pgError } from \"../errors/error.ts\";\nimport type { Clock } from \"../runtime/clock.ts\";\nimport type { Prng } from \"../runtime/prng.ts\";\nimport { PG_CATALOG_RELATIONS } from \"../schema/catalog.ts\";\nimport { type ColumnType, type Datum, TYPE_OIDS, type TypeId, typeDisplayName } from \"../types/value.ts\";\n\n// --- table / relation metadata ---------------------------------------------\n\nexport interface ColumnMeta {\n name: string;\n type: ColumnType;\n notNull: boolean;\n defaultExpr: Expr | null;\n identity: { always: boolean; sequence: string } | null; // sequence = qualified seq key \"schema.name\"\n generated: Expr | null; // GENERATED ALWAYS AS (...) STORED\n collate: string | null;\n /** resolved domain name when column type came from a domain */\n domain: string | null; // \"schema.name\"\n}\n\nexport type ConstraintMeta =\n | { kind: \"primary_key\"; name: string; columns: string[] }\n | { kind: \"unique\"; name: string; columns: string[]; nullsNotDistinct: boolean }\n | { kind: \"check\"; name: string; expr: Expr }\n | {\n kind: \"foreign_key\";\n name: string;\n columns: string[];\n refSchema: string;\n refTable: string;\n refColumns: string[];\n onDelete: string | null;\n onUpdate: string | null;\n match: \"full\" | \"simple\";\n };\n\nexport interface IndexMeta {\n name: string;\n schema: string;\n table: string;\n unique: boolean;\n /** simple column indexes store names; expression indexes store the AST */\n columns: Array<{ column: string | null; expr: Expr | null; dir: \"asc\" | \"desc\"; nulls: \"first\" | \"last\" }>;\n where: Expr | null;\n nullsNotDistinct: boolean;\n /** true when this index backs a constraint (pkey / unique constraint) */\n isConstraint: boolean;\n}\n\nexport interface TriggerMeta {\n name: string;\n timing: \"before\" | \"after\" | \"instead_of\";\n events: CreateTriggerStmt[\"events\"];\n forEachRow: boolean;\n when: Expr | null;\n funcSchema: string;\n funcName: string;\n funcArgs: string[];\n}\n\nexport class TableData {\n name: string;\n schema: string;\n columns: ColumnMeta[];\n rows: Datum[][];\n constraints: ConstraintMeta[];\n triggers: TriggerMeta[];\n temp: boolean;\n /** monotonically increasing oid-like id for catalog output */\n readonly oid: number;\n\n constructor(schema: string, name: string, columns: ColumnMeta[], oid: number, temp = false) {\n this.schema = schema;\n this.name = name;\n this.columns = columns;\n this.rows = [];\n this.constraints = [];\n this.triggers = [];\n this.temp = temp;\n this.oid = oid;\n }\n\n columnIndex(name: string): number {\n return this.columns.findIndex((c) => c.name === name);\n }\n\n clone(): TableData {\n const t = new TableData(\n this.schema,\n this.name,\n this.columns.map((c) => ({ ...c })),\n this.oid,\n this.temp,\n );\n t.rows = this.rows.map((r) => r.slice());\n t.constraints = this.constraints.map((c) => ({ ...c }));\n t.triggers = this.triggers.map((tr) => ({ ...tr }));\n return t;\n }\n}\n\nexport interface ViewData {\n name: string;\n schema: string;\n query: SelectStmt;\n columns: string[] | null;\n materialized: boolean;\n /** materialized contents; null = WITH NO DATA (not populated) */\n matRows: Datum[][] | null;\n matColumns: Array<{ name: string; type: TypeId }> | null;\n temp: boolean;\n oid: number;\n}\n\nexport interface SequenceData {\n name: string;\n schema: string;\n increment: bigint;\n minValue: bigint;\n maxValue: bigint;\n startValue: bigint;\n cache: bigint;\n cycle: boolean;\n lastValue: bigint;\n isCalled: boolean;\n ownedBy: { table: string; column: string } | null;\n dataType: TypeId;\n temp: boolean;\n oid: number;\n}\n\nexport interface EnumData {\n name: string;\n schema: string;\n labels: string[];\n oid: number;\n}\n\nexport interface DomainData {\n name: string;\n schema: string;\n baseType: ColumnType;\n notNull: boolean;\n defaultExpr: Expr | null;\n checks: Array<{ name: string; expr: Expr }>;\n oid: number;\n}\n\nexport interface FunctionData {\n name: string;\n schema: string;\n argNames: (string | null)[];\n argTypes: TypeId[];\n argDefaults: (Expr | null)[];\n returns: TypeId | null;\n returnsSet: boolean;\n returnsTable: Array<{ name: string; type: TypeId }> | null;\n language: string;\n body: Statement[] | null;\n rawBody: string | null;\n strict: boolean;\n oid: number;\n}\n\nexport class SchemaData {\n name: string;\n tables = new Map<string, TableData>();\n views = new Map<string, ViewData>();\n sequences = new Map<string, SequenceData>();\n enums = new Map<string, EnumData>();\n domains = new Map<string, DomainData>();\n functions = new Map<string, FunctionData[]>();\n indexes = new Map<string, IndexMeta>();\n oid: number;\n\n constructor(name: string, oid: number) {\n this.name = name;\n this.oid = oid;\n }\n\n /** all relation names (tables, views, sequences, indexes share pg_class namespace) */\n hasRelation(name: string): boolean {\n return this.tables.has(name) || this.views.has(name) || this.sequences.has(name) || this.indexes.has(name);\n }\n\n clone(): SchemaData {\n const s = new SchemaData(this.name, this.oid);\n for (const [k, v] of this.tables) s.tables.set(k, v.clone());\n for (const [k, v] of this.views) {\n s.views.set(k, {\n ...v,\n matRows: v.matRows ? v.matRows.map((r) => r.slice()) : null,\n matColumns: v.matColumns ? v.matColumns.map((c) => ({ ...c })) : null,\n });\n }\n for (const [k, v] of this.sequences) s.sequences.set(k, { ...v });\n for (const [k, v] of this.enums) s.enums.set(k, { ...v, labels: v.labels.slice() });\n for (const [k, v] of this.domains) s.domains.set(k, { ...v, checks: v.checks.map((c) => ({ ...c })) });\n for (const [k, v] of this.functions)\n s.functions.set(\n k,\n v.map((f) => ({ ...f })),\n );\n for (const [k, v] of this.indexes) s.indexes.set(k, { ...v, columns: v.columns.map((c) => ({ ...c })) });\n return s;\n }\n}\n\nexport interface PreparedStatement {\n name: string;\n argTypes: TypeId[] | null;\n stmt: Statement;\n}\n\n// --- database state -----------------------------------------------------------\n\nexport class DatabaseState {\n schemas = new Map<string, SchemaData>();\n settings = new Map<string, string>();\n /** SET LOCAL values, cleared on COMMIT/ROLLBACK */\n localSettings = new Map<string, string>();\n prepared = new Map<string, PreparedStatement>();\n prng: Prng;\n clock: Clock;\n changes = 0;\n private oidCounter = 16384;\n inTransaction = false;\n /** most recent sequence touched by nextval/setval, for lastval() */\n lastSequence: { schema: string; name: string } | null = null;\n\n constructor(prng: Prng, clock: Clock) {\n this.prng = prng;\n this.clock = clock;\n this.schemas.set(\"public\", new SchemaData(\"public\", this.nextOid()));\n this.settings.set(\"timezone\", \"UTC\");\n this.settings.set(\"search_path\", '\"$user\", public');\n this.settings.set(\"datestyle\", \"ISO, MDY\");\n this.settings.set(\"intervalstyle\", \"postgres\");\n this.settings.set(\"bytea_output\", \"hex\");\n this.settings.set(\"standard_conforming_strings\", \"on\");\n this.settings.set(\"client_encoding\", \"UTF8\");\n this.settings.set(\"server_encoding\", \"UTF8\");\n this.settings.set(\"integer_datetimes\", \"on\");\n this.settings.set(\"transaction_isolation\", \"read committed\");\n this.settings.set(\"application_name\", \"\");\n this.settings.set(\"extra_float_digits\", \"1\");\n this.settings.set(\"client_min_messages\", \"notice\");\n this.settings.set(\"max_identifier_length\", \"63\");\n this.settings.set(\"server_version\", \"18.3\");\n this.settings.set(\"server_version_num\", \"180003\");\n this.settings.set(\"lc_messages\", \"C\");\n this.settings.set(\"lc_monetary\", \"C\");\n this.settings.set(\"lc_numeric\", \"C\");\n this.settings.set(\"lc_time\", \"C\");\n this.settings.set(\"default_transaction_isolation\", \"read committed\");\n this.settings.set(\"statement_timeout\", \"0\");\n this.settings.set(\"array_nulls\", \"on\");\n this.settings.set(\"backslash_quote\", \"safe_encoding\");\n }\n\n nextOid(): number {\n return this.oidCounter++;\n }\n\n getSetting(name: string): string | undefined {\n return this.localSettings.get(name) ?? this.settings.get(name);\n }\n\n /** effective search path: existing schemas from search_path setting */\n effectiveSearchPath(): string[] {\n const raw = this.getSetting(\"search_path\") ?? \"public\";\n const parts = raw\n .split(\",\")\n .map((p) => p.trim())\n .map((p) => (p.startsWith('\"') && p.endsWith('\"') ? p.slice(1, -1) : p))\n .filter((p) => p.length > 0);\n const out: string[] = [];\n for (const p of parts) {\n const name = p === \"$user\" ? \"postgres\" : p;\n if (this.schemas.has(name)) out.push(name);\n }\n return out;\n }\n\n currentSchema(): string {\n const path = this.effectiveSearchPath();\n return path[0] ?? \"public\";\n }\n\n getSchema(name: string): SchemaData {\n const s = this.schemas.get(name);\n if (!s) throw pgError(\"undefined_object\", `schema \"${name}\" does not exist`, \"3F000\");\n return s;\n }\n\n /** Resolve a possibly-qualified relation name to its schema. */\n resolveRelationSchema(parts: string[]): { schema: string; name: string } | null {\n if (parts.length === 2) {\n const [schema, name] = parts as [string, string];\n return { schema, name };\n }\n if (parts.length === 3) {\n // database.schema.name \u2014 database must match\n const [, schema, name] = parts as [string, string, string];\n return { schema, name };\n }\n const name = parts[0]!;\n for (const schema of [\"pg_catalog\", ...this.effectiveSearchPath()]) {\n if (schema === \"pg_catalog\" && PG_CATALOG_RELATIONS.has(name)) return { schema, name };\n const s = this.schemas.get(schema);\n if (s?.hasRelation(name)) return { schema, name };\n }\n return null;\n }\n\n findTable(parts: string[]): TableData | null {\n if (parts.length >= 2) {\n const schema = parts[parts.length - 2]!;\n const name = parts[parts.length - 1]!;\n return this.schemas.get(schema)?.tables.get(name) ?? null;\n }\n const name = parts[0]!;\n for (const schema of this.effectiveSearchPath()) {\n const t = this.schemas.get(schema)?.tables.get(name);\n if (t) return t;\n }\n return null;\n }\n\n requireTable(parts: string[]): TableData {\n const t = this.findTable(parts);\n if (!t) {\n throw pgError(\"undefined_table\", `relation \"${parts.join(\".\")}\" does not exist`);\n }\n return t;\n }\n\n findView(parts: string[]): ViewData | null {\n if (parts.length >= 2) {\n const schema = parts[parts.length - 2]!;\n const name = parts[parts.length - 1]!;\n return this.schemas.get(schema)?.views.get(name) ?? null;\n }\n const name = parts[0]!;\n for (const schema of this.effectiveSearchPath()) {\n const v = this.schemas.get(schema)?.views.get(name);\n if (v) return v;\n }\n return null;\n }\n\n findSequence(parts: string[]): SequenceData | null {\n if (parts.length >= 2) {\n const schema = parts[parts.length - 2]!;\n const name = parts[parts.length - 1]!;\n return this.schemas.get(schema)?.sequences.get(name) ?? null;\n }\n const name = parts[0]!;\n for (const schema of this.effectiveSearchPath()) {\n const s = this.schemas.get(schema)?.sequences.get(name);\n if (s) return s;\n }\n return null;\n }\n\n findEnum(parts: string[]): EnumData | null {\n if (parts.length >= 2) {\n const schema = parts[parts.length - 2]!;\n const name = parts[parts.length - 1]!;\n return this.schemas.get(schema)?.enums.get(name) ?? null;\n }\n const name = parts[0]!;\n for (const schema of [\"pg_catalog\", ...this.effectiveSearchPath()]) {\n const e = this.schemas.get(schema)?.enums.get(name);\n if (e) return e;\n }\n return null;\n }\n\n findDomain(parts: string[]): DomainData | null {\n if (parts.length >= 2) {\n const schema = parts[parts.length - 2]!;\n const name = parts[parts.length - 1]!;\n return this.schemas.get(schema)?.domains.get(name) ?? null;\n }\n const name = parts[0]!;\n for (const schema of [\"pg_catalog\", ...this.effectiveSearchPath()]) {\n const d = this.schemas.get(schema)?.domains.get(name);\n if (d) return d;\n }\n return null;\n }\n\n findFunctions(parts: string[]): FunctionData[] {\n if (parts.length >= 2) {\n const schema = parts[parts.length - 2]!;\n const name = parts[parts.length - 1]!;\n if (schema === \"pg_catalog\") return [];\n return this.schemas.get(schema)?.functions.get(name) ?? [];\n }\n const name = parts[0]!;\n const out: FunctionData[] = [];\n for (const schema of this.effectiveSearchPath()) {\n const fns = this.schemas.get(schema)?.functions.get(name);\n if (fns) out.push(...fns);\n }\n return out;\n }\n\n findEnumByKey(key: string): EnumData | null {\n const dot = key.indexOf(\".\");\n if (dot === -1) return this.findEnum([key]);\n return this.schemas.get(key.slice(0, dot))?.enums.get(key.slice(dot + 1)) ?? null;\n }\n\n /** format_type()-style display name for a type OID (builtin or enum). */\n typeNameForOid(oid: number): string | null {\n for (const [name, o] of Object.entries(TYPE_OIDS)) {\n if (o === oid) return typeDisplayName(name);\n }\n for (const schema of this.schemas.values()) {\n for (const e of schema.enums.values()) {\n if (e.oid === oid) return e.name;\n }\n }\n return null;\n }\n\n /** deep clone for transaction snapshots (datums are immutable; rows copied) */\n clone(): DatabaseState {\n const s = new DatabaseState(this.prng, this.clock);\n s.schemas = new Map();\n for (const [k, v] of this.schemas) s.schemas.set(k, v.clone());\n s.settings = new Map(this.settings);\n s.localSettings = new Map(this.localSettings);\n s.prepared = new Map(this.prepared);\n s.changes = this.changes;\n s.inTransaction = this.inTransaction;\n s.lastSequence = this.lastSequence ? { ...this.lastSequence } : null;\n (s as any).oidCounter = this.oidCounter;\n return s;\n }\n\n /** copy the contents of `other` into this state (rollback restore) */\n restoreFrom(other: DatabaseState): void {\n this.schemas = other.schemas;\n this.settings = other.settings;\n this.localSettings = other.localSettings;\n this.prepared = other.prepared;\n this.changes = other.changes;\n this.lastSequence = other.lastSequence;\n (this as any).oidCounter = (other as any).oidCounter;\n }\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\n\ninterface Snapshot {\n state: DatabaseState;\n prngState: bigint;\n}\n\n/**\n * Single-session transaction manager: BEGIN clones the whole state (datums are\n * immutable; rows are copied), ROLLBACK restores it. Savepoints stack inner\n * snapshots. The PRNG state participates so `random()` draws rewind on\n * rollback (determinism invariant, mirrors sqlite-mem).\n */\nexport class TransactionManager {\n private base: Snapshot | null = null;\n private savepoints: Array<{ name: string; snap: Snapshot }> = [];\n\n constructor(private readonly state: DatabaseState) {}\n\n get inTransaction(): boolean {\n return this.base !== null;\n }\n\n private takeSnapshot(): Snapshot {\n return { state: this.state.clone(), prngState: this.state.prng.getState() };\n }\n\n private restore(snap: Snapshot): void {\n this.state.restoreFrom(snap.state);\n this.state.prng.setState(snap.prngState);\n }\n\n begin(): void {\n if (this.base !== null) {\n // PG raises a WARNING and keeps the transaction; we mirror the no-op\n return;\n }\n this.base = this.takeSnapshot();\n this.state.inTransaction = true;\n }\n\n commit(): void {\n // COMMIT outside a transaction is a WARNING no-op in PG\n this.base = null;\n this.savepoints = [];\n this.state.inTransaction = false;\n this.state.localSettings.clear();\n }\n\n rollback(): void {\n if (this.base !== null) {\n this.restore(this.base);\n }\n this.base = null;\n this.savepoints = [];\n this.state.inTransaction = false;\n this.state.localSettings.clear();\n }\n\n savepoint(name: string): void {\n if (this.base === null) {\n throw pgError(\"transaction_state\", \"SAVEPOINT can only be used in transaction blocks\", \"25P01\");\n }\n this.savepoints.push({ name, snap: this.takeSnapshot() });\n }\n\n releaseSavepoint(name: string): void {\n const idx = this.findSavepoint(name);\n this.savepoints.splice(idx);\n }\n\n rollbackToSavepoint(name: string): void {\n const idx = this.findSavepoint(name);\n const sp = this.savepoints[idx]!;\n this.restore(sp.snap);\n // the savepoint itself survives ROLLBACK TO\n this.savepoints.splice(idx + 1);\n }\n\n private findSavepoint(name: string): number {\n if (this.base === null) {\n throw pgError(\"transaction_state\", `SAVEPOINT can only be used in transaction blocks`, \"25P01\");\n }\n for (let i = this.savepoints.length - 1; i >= 0; i--) {\n if (this.savepoints[i]!.name === name) return i;\n }\n throw pgError(\"invalid_savepoint_specification\", `savepoint \"${name}\" does not exist`, \"3B001\");\n }\n\n /** abort any open transaction without restoring (used by Database.close) */\n reset(): void {\n this.base = null;\n this.savepoints = [];\n this.state.inTransaction = false;\n }\n}\n", "import { pgError, unsupported } from \"../errors/error.ts\";\nimport {\n DATE_NEG_INF,\n DATE_POS_INF,\n type Interval,\n makeInterval,\n splitTs,\n TS_NEG_INF,\n TS_POS_INF,\n USECS_PER_DAY,\n} from \"./datetime.ts\";\nimport { type JsonbValue, jsonbText, parseJsonText } from \"./jsonb.ts\";\nimport {\n applyNumericTypmod,\n makeNumeric,\n type Numeric,\n numericFromBigInt,\n numericFromNumber,\n numericRescale,\n numericToBigInt,\n numericToNumber,\n parseNumeric,\n} from \"./numeric.ts\";\nimport {\n arrayElemType,\n checkInt2,\n checkInt4,\n checkInt8,\n type Datum,\n datumFromText,\n datumText,\n enumTypeName,\n INT2_MAX,\n INT2_MIN,\n INT4_MAX,\n INT4_MIN,\n type InputCtx,\n isArrayType,\n isEnumType,\n type JsonbWrap,\n makeArray,\n type OutputCtx,\n type PgArray,\n type TypedValue,\n type TypeId,\n type TypeMod,\n tv,\n typeDisplayName,\n wrapJsonb,\n} from \"./value.ts\";\n\nexport interface CastEnv extends OutputCtx, InputCtx {\n enumLabels(enumType: TypeId): string[] | null;\n}\n\nexport const UTC_CAST_ENV: CastEnv = {\n zoneOffsetAt: () => 0,\n zoneOffsetForNaive: () => 0,\n enumLabels: () => null,\n};\n\nfunction cannotCast(from: TypeId, to: TypeId): never {\n throw pgError(\"cannot_coerce\", `cannot cast type ${typeDisplayName(from)} to ${typeDisplayName(to)}`);\n}\n\n/** round-half-to-even for float\u2192int casts (PG rint semantics) */\nfunction rint(v: number): number {\n const floor = Math.floor(v);\n const diff = v - floor;\n if (diff > 0.5) return floor + 1;\n if (diff < 0.5) return floor;\n return floor % 2 === 0 ? floor : floor + 1;\n}\n\nconst NUMERIC_TYPES = new Set([\"int2\", \"int4\", \"int8\", \"float4\", \"float8\", \"numeric\"]);\nconst TEXT_TYPES = new Set([\"text\", \"varchar\", \"bpchar\", \"name\", \"unknown\"]);\nconst DATETIME_TYPES = new Set([\"date\", \"time\", \"timetz\", \"timestamp\", \"timestamptz\", \"interval\"]);\n\nexport function isTextType(t: TypeId): boolean {\n return TEXT_TYPES.has(t);\n}\n\nexport function isNumericType(t: TypeId): boolean {\n return NUMERIC_TYPES.has(t);\n}\n\nexport function isDatetimeType(t: TypeId): boolean {\n return DATETIME_TYPES.has(t);\n}\n\n/** implicit-cast reachability (subset of pg_cast castcontext = 'i') */\nexport function canImplicitCast(from: TypeId, to: TypeId): boolean {\n if (from === to) return true;\n if (from === \"unknown\") return true;\n if (isArrayType(from) && isArrayType(to)) return canImplicitCast(arrayElemType(from), arrayElemType(to));\n const key = `${from}->${to}`;\n return IMPLICIT_CASTS.has(key);\n}\n\nconst IMPLICIT_CASTS = new Set([\n \"int2->int4\",\n \"int2->int8\",\n \"int2->numeric\",\n \"int2->float4\",\n \"int2->float8\",\n \"int4->int8\",\n \"int4->numeric\",\n \"int4->float4\",\n \"int4->float8\",\n \"int4->oid\",\n \"int8->numeric\",\n \"int8->float4\",\n \"int8->float8\",\n \"numeric->float4\",\n \"numeric->float8\",\n \"float4->float8\",\n \"text->varchar\",\n \"varchar->text\",\n \"bpchar->text\",\n \"text->name\",\n \"name->text\",\n \"varchar->name\",\n \"date->timestamp\",\n \"date->timestamptz\",\n \"timestamp->timestamptz\",\n \"time->timetz\",\n \"time->interval\",\n \"int4->money\",\n \"int8->money\",\n \"numeric->money\",\n]);\n\n/** assignment casts additionally allowed when storing into a column */\nconst ASSIGNMENT_CASTS = new Set([\n \"int4->int2\",\n \"int8->int2\",\n \"int8->int4\",\n \"numeric->int2\",\n \"numeric->int4\",\n \"numeric->int8\",\n \"float4->int2\",\n \"float4->int4\",\n \"float4->int8\",\n \"float8->int2\",\n \"float8->int4\",\n \"float8->int8\",\n \"float8->float4\",\n \"float4->numeric\",\n \"float8->numeric\",\n \"money->numeric\",\n \"text->bpchar\",\n \"varchar->bpchar\",\n \"bpchar->varchar\",\n \"bpchar->name\",\n \"name->varchar\",\n \"name->bpchar\",\n \"timestamp->date\",\n \"timestamptz->date\",\n \"timestamp->time\",\n \"timestamptz->time\",\n \"timestamptz->timestamp\",\n \"timestamptz->timetz\",\n \"timetz->time\",\n \"interval->time\",\n]);\n\nexport function canAssignCast(from: TypeId, to: TypeId): boolean {\n if (canImplicitCast(from, to)) return true;\n if (isArrayType(from) && isArrayType(to)) return canAssignCast(arrayElemType(from), arrayElemType(to));\n if (isEnumType(to) && TEXT_TYPES.has(from)) return true;\n return ASSIGNMENT_CASTS.has(`${from}->${to}`);\n}\n\nexport interface CastOptions {\n explicit?: boolean;\n mod?: TypeMod | null;\n /** true for INSERT/UPDATE assignment (allows assignment casts + typmod coercion with truncation errors) */\n assignment?: boolean;\n}\n\n/** Cast a typed value to `target`. */\nexport function castTo(env: CastEnv, value: TypedValue, target: TypeId, opts: CastOptions = {}): TypedValue {\n const { t: from, v } = value;\n if (v === null) return tv(target, applyNullTypmod(target, opts));\n if (from === target) {\n return tv(target, applyTypmod(env, target, v, opts));\n }\n\n // unknown (string literal) \u2192 parse via typinput\n if (\n from === \"unknown\" ||\n (TEXT_TYPES.has(from) && (opts.explicit || opts.assignment || TEXT_TYPES.has(target) || target === \"unknown\"))\n ) {\n if (TEXT_TYPES.has(target)) {\n // bpchar \u2192 text/varchar strips trailing blanks (rtrim cast in PG)\n const s = from === \"bpchar\" && target !== \"bpchar\" ? (v as string).replace(/ +$/, \"\") : (v as string);\n return tv(target, applyTypmod(env, target, s, opts));\n }\n if (from === \"unknown\") {\n const parsed = datumFromText(target, v as string, env);\n return tv(target, applyTypmod(env, target, parsed, opts));\n }\n }\n\n // text-ish \u2192 anything (explicit or assignment): via typinput\n if (TEXT_TYPES.has(from) && !TEXT_TYPES.has(target)) {\n if (target === \"bytea\" && from !== \"unknown\") {\n // text \u2192 bytea explicit is allowed only via convert_to; ::bytea parses literal\n const parsed = datumFromText(\"bytea\", v as string, env);\n return tv(target, parsed);\n }\n const parsed = datumFromText(target, v as string, env);\n return tv(target, applyTypmod(env, target, parsed, opts));\n }\n\n // anything \u2192 text-ish: via typoutput (bool special-cases to true/false)\n if (TEXT_TYPES.has(target)) {\n let text: string;\n if (from === \"bool\") text = (v as boolean) ? \"true\" : \"false\";\n else text = datumText(from, v, env);\n return tv(target, applyTypmod(env, target, text, opts));\n }\n\n // numeric family\n if (NUMERIC_TYPES.has(from) && NUMERIC_TYPES.has(target)) {\n return tv(target, applyTypmod(env, target, numericFamilyCast(from, target, v), opts));\n }\n\n // bool \u2194 int4\n if (from === \"bool\" && target === \"int4\") return tv(target, (v as boolean) ? 1 : 0);\n if (from === \"int4\" && target === \"bool\") return tv(target, (v as number) !== 0);\n\n // bytea \u2194 integer (new in PG 18): big-endian two's complement\n if (from === \"bytea\" && (target === \"int2\" || target === \"int4\" || target === \"int8\")) {\n const bytes = v as Uint8Array;\n const width = target === \"int2\" ? 2 : target === \"int4\" ? 4 : 8;\n if (bytes.length > width) {\n const label = target === \"int2\" ? \"smallint\" : target === \"int4\" ? \"integer\" : \"bigint\";\n throw pgError(\"numeric_value_out_of_range\", `${label} out of range`, \"22003\");\n }\n let acc = 0n;\n for (const b of bytes) acc = (acc << 8n) | BigInt(b);\n // shorter inputs zero-extend; sign bit applies only at full width\n const signed = bytes.length === width ? BigInt.asIntN(width * 8, acc) : acc;\n return tv(target, target === \"int8\" ? signed : Number(signed));\n }\n if ((from === \"int2\" || from === \"int4\" || from === \"int8\") && target === \"bytea\") {\n const width = from === \"int2\" ? 2 : from === \"int4\" ? 4 : 8;\n const acc = BigInt.asUintN(width * 8, typeof v === \"bigint\" ? v : BigInt(v as number));\n const bytes = new Uint8Array(width);\n for (let i = width - 1; i >= 0; i--) bytes[i] = Number((acc >> BigInt((width - 1 - i) * 8)) & 0xffn);\n return tv(target, bytes);\n }\n\n // money\n if (from === \"money\" && target === \"numeric\") {\n return tv(target, applyTypmod(env, target, makeNumeric(v as bigint, 2), opts));\n }\n if (NUMERIC_TYPES.has(from) && target === \"money\") {\n const n = numericFamilyCast(from, \"numeric\", v) as Numeric;\n return tv(target, numericRescale(n, 2).coef);\n }\n\n // datetime\n if (DATETIME_TYPES.has(from) && DATETIME_TYPES.has(target)) {\n return tv(target, datetimeCast(env, from, target, v));\n }\n\n // enum \u2194 text handled above (enum output). text \u2192 enum:\n if (isEnumType(target) && TEXT_TYPES.has(from)) {\n const labels = env.enumLabels(target);\n const label = v as string;\n if (labels && !labels.includes(label)) {\n throw pgError(\"invalid_text_representation\", `invalid input value for enum ${enumTypeName(target)}: \"${label}\"`);\n }\n return tv(target, label);\n }\n if (isEnumType(from) && TEXT_TYPES.has(target)) {\n return tv(target, applyTypmod(env, target, v as string, opts));\n }\n\n // json/jsonb\n if (from === \"json\" && target === \"jsonb\") return tv(target, wrapJsonb(parseJsonText(v as string)));\n if (from === \"jsonb\" && target === \"json\") return tv(target, jsonbText((v as JsonbWrap).value));\n if (from === \"jsonb\" && (NUMERIC_TYPES.has(target) || target === \"bool\")) {\n return tv(target, jsonbScalarCast((v as JsonbWrap).value, target));\n }\n\n // arrays\n if (isArrayType(from) && isArrayType(target)) {\n const fromElem = arrayElemType(from);\n const toElem = arrayElemType(target);\n const arr = v as PgArray;\n const items = arr.items.map((item) =>\n item === null\n ? null\n : castTo(env, tv(fromElem, item), toElem, { explicit: opts.explicit, assignment: opts.assignment }).v,\n );\n return tv(target, makeArray(toElem, items, arr.dims.slice(), arr.lbs.slice()));\n }\n\n // oid family\n if (\n (from === \"int4\" || from === \"int8\" || from === \"int2\") &&\n (target === \"oid\" || target === \"regclass\" || target === \"regtype\" || target === \"regproc\")\n ) {\n return tv(target, Number(v));\n }\n if (from === \"oid\" && (target === \"int4\" || target === \"int8\")) {\n return tv(target, target === \"int8\" ? BigInt(v as number) : (v as number));\n }\n\n if (!opts.explicit && !opts.assignment) cannotCast(from, target);\n cannotCast(from, target);\n}\n\nfunction applyNullTypmod(_target: TypeId, _opts: CastOptions): null {\n return null;\n}\n\nfunction jsonbScalarCast(j: JsonbValue, target: TypeId): Datum {\n if (target === \"bool\") {\n if (j.j !== \"bool\")\n throw pgError(\"invalid_parameter_value\", `cannot cast jsonb ${jsonbTypeName(j)} to type boolean`, \"22023\");\n return j.v;\n }\n if (j.j !== \"num\") {\n throw pgError(\n \"invalid_parameter_value\",\n `cannot cast jsonb ${jsonbTypeName(j)} to type ${typeDisplayName(target)}`,\n \"22023\",\n );\n }\n return numericFamilyCast(\"numeric\", target, j.v);\n}\n\nfunction jsonbTypeName(j: JsonbValue): string {\n switch (j.j) {\n case \"null\":\n return \"null\";\n case \"bool\":\n return \"boolean\";\n case \"num\":\n return \"numeric\";\n case \"str\":\n return \"string\";\n case \"arr\":\n return \"array\";\n case \"obj\":\n return \"object\";\n }\n}\n\nexport function numericFamilyCast(from: TypeId, to: TypeId, v: Datum): Datum {\n if (from === to) return v;\n const asNumber = (): number => {\n if (from === \"int8\") return Number(v as bigint);\n if (from === \"numeric\") return numericToNumber(v as Numeric);\n return v as number;\n };\n switch (to) {\n case \"int2\": {\n if (from === \"float4\" || from === \"float8\") {\n const f = v as number;\n if (Number.isNaN(f) || !Number.isFinite(f))\n throw pgError(\"numeric_value_out_of_range\", \"smallint out of range\");\n return checkInt2(rint(f));\n }\n if (from === \"int8\") {\n const b = v as bigint;\n if (b < BigInt(INT2_MIN) || b > BigInt(INT2_MAX))\n throw pgError(\"numeric_value_out_of_range\", \"smallint out of range\");\n return Number(b);\n }\n if (from === \"numeric\") {\n const b = numericToBigInt(v as Numeric);\n if (b < BigInt(INT2_MIN) || b > BigInt(INT2_MAX))\n throw pgError(\"numeric_value_out_of_range\", \"smallint out of range\");\n return Number(b);\n }\n return checkInt2(v as number);\n }\n case \"int4\": {\n if (from === \"float4\" || from === \"float8\") {\n const f = v as number;\n if (Number.isNaN(f) || !Number.isFinite(f)) throw pgError(\"numeric_value_out_of_range\", \"integer out of range\");\n return checkInt4(rint(f));\n }\n if (from === \"int8\") {\n const b = v as bigint;\n if (b < BigInt(INT4_MIN) || b > BigInt(INT4_MAX))\n throw pgError(\"numeric_value_out_of_range\", \"integer out of range\");\n return Number(b);\n }\n if (from === \"numeric\") {\n const b = numericToBigInt(v as Numeric);\n if (b < BigInt(INT4_MIN) || b > BigInt(INT4_MAX))\n throw pgError(\"numeric_value_out_of_range\", \"integer out of range\");\n return Number(b);\n }\n return checkInt4(v as number);\n }\n case \"int8\": {\n if (from === \"float4\" || from === \"float8\") {\n const f = v as number;\n if (Number.isNaN(f) || !Number.isFinite(f)) throw pgError(\"numeric_value_out_of_range\", \"bigint out of range\");\n const r = rint(f);\n if (r < -(2 ** 63) || r >= 2 ** 63) {\n throw pgError(\"numeric_value_out_of_range\", \"bigint out of range\");\n }\n return BigInt(r);\n }\n if (from === \"numeric\") {\n const b = numericToBigInt(v as Numeric);\n return checkInt8(b);\n }\n return BigInt(v as number);\n }\n case \"float4\": {\n const f = Math.fround(asNumber());\n if (!Number.isFinite(f) && Number.isFinite(asNumber())) {\n throw pgError(\"numeric_value_out_of_range\", `value out of range: overflow`);\n }\n return f;\n }\n case \"float8\":\n return asNumber();\n case \"numeric\": {\n if (from === \"int8\") return numericFromBigInt(v as bigint);\n if (from === \"int2\" || from === \"int4\") return numericFromBigInt(BigInt(v as number));\n // float \u2192 numeric via shortest representation\n const f = v as number;\n if (Number.isNaN(f)) return parseNumeric(\"NaN\");\n if (f === Number.POSITIVE_INFINITY) return parseNumeric(\"Infinity\");\n if (f === Number.NEGATIVE_INFINITY) return parseNumeric(\"-Infinity\");\n return numericFromNumber(f);\n }\n default:\n cannotCast(from, to);\n }\n}\n\nfunction datetimeCast(env: CastEnv, from: TypeId, to: TypeId, v: Datum): Datum {\n const key = `${from}->${to}`;\n switch (key) {\n case \"date->timestamp\": {\n const d = v as number;\n if (d === DATE_POS_INF) return TS_POS_INF;\n if (d === DATE_NEG_INF) return TS_NEG_INF;\n return BigInt(d) * USECS_PER_DAY;\n }\n case \"date->timestamptz\": {\n const d = v as number;\n if (d === DATE_POS_INF) return TS_POS_INF;\n if (d === DATE_NEG_INF) return TS_NEG_INF;\n const naive = BigInt(d) * USECS_PER_DAY;\n return naive - BigInt(env.zoneOffsetForNaive(naive)) * 1_000_000n;\n }\n case \"timestamp->date\": {\n const ts = v as bigint;\n if (ts === TS_POS_INF) return DATE_POS_INF;\n if (ts === TS_NEG_INF) return DATE_NEG_INF;\n return splitTs(ts).days;\n }\n case \"timestamptz->date\": {\n const ts = v as bigint;\n if (ts === TS_POS_INF) return DATE_POS_INF;\n if (ts === TS_NEG_INF) return DATE_NEG_INF;\n const local = ts + BigInt(env.zoneOffsetAt(ts)) * 1_000_000n;\n return splitTs(local).days;\n }\n case \"timestamp->timestamptz\": {\n const ts = v as bigint;\n if (ts === TS_POS_INF || ts === TS_NEG_INF) return ts;\n return ts - BigInt(env.zoneOffsetForNaive(ts)) * 1_000_000n;\n }\n case \"timestamptz->timestamp\": {\n const ts = v as bigint;\n if (ts === TS_POS_INF || ts === TS_NEG_INF) return ts;\n return ts + BigInt(env.zoneOffsetAt(ts)) * 1_000_000n;\n }\n case \"timestamp->time\":\n return splitTs(v as bigint).tod;\n case \"timestamptz->time\": {\n const ts = v as bigint;\n const local = ts + BigInt(env.zoneOffsetAt(ts)) * 1_000_000n;\n return splitTs(local).tod;\n }\n case \"time->interval\":\n return makeInterval(0, 0, v as bigint);\n case \"interval->time\": {\n const iv = v as Interval;\n let micros = iv.micros % USECS_PER_DAY;\n if (micros < 0n) micros += USECS_PER_DAY;\n return micros;\n }\n case \"time->timetz\":\n return { micros: v as bigint, offsetSec: 0 } as unknown as Datum;\n case \"timetz->time\":\n return (v as unknown as { micros: bigint }).micros;\n default:\n cannotCast(from, to);\n }\n}\n\n/** Apply typmod (varchar(n) truncation checks, numeric(p,s), bpchar padding, time precision). */\nexport function applyTypmod(_env: CastEnv, t: TypeId, v: Datum, opts: CastOptions): Datum {\n const mod = opts.mod;\n if (v === null) return v;\n if (!mod || mod.a === undefined) {\n if (t === \"bpchar\" && typeof v === \"string\") return v;\n return v;\n }\n switch (t) {\n case \"varchar\": {\n const s = v as string;\n const n = mod.a;\n if ([...s].length <= n) return s;\n const trimmed = trimForCharType(s, n);\n if (trimmed !== null && (opts.assignment || opts.explicit)) {\n if (opts.explicit && !opts.assignment) return [...s].slice(0, n).join(\"\");\n if (trimmed.ok) return trimmed.value;\n }\n throw pgError(\"string_data_right_truncation\", `value too long for type character varying(${n})`, \"22001\");\n }\n case \"bpchar\": {\n const s = v as string;\n const n = mod.a;\n const chars = [...s];\n if (chars.length === n) return s;\n if (chars.length < n) return s + \" \".repeat(n - chars.length);\n const trimmed = trimForCharType(s, n);\n if (opts.explicit && !opts.assignment) return chars.slice(0, n).join(\"\");\n if (trimmed?.ok) return trimmed.value.padEnd(n, \" \");\n throw pgError(\"string_data_right_truncation\", `value too long for type character(${n})`, \"22001\");\n }\n case \"numeric\": {\n if (mod.b === undefined) return applyNumericTypmod(v as Numeric, mod.a, 0);\n return applyNumericTypmod(v as Numeric, mod.a, mod.b);\n }\n case \"time\":\n case \"timestamp\":\n case \"timestamptz\": {\n const p = mod.a;\n if (p >= 6) return v;\n const factor = 10n ** BigInt(6 - p);\n const ts = v as bigint;\n if (ts === TS_POS_INF || ts === TS_NEG_INF) return ts;\n const half = factor / 2n;\n const rounded = ts >= 0n ? ((ts + half) / factor) * factor : -((-ts + half) / factor) * factor;\n return rounded;\n }\n case \"interval\":\n return v;\n case \"bit\":\n case \"varbit\":\n return v;\n default:\n return v;\n }\n}\n\nfunction trimForCharType(s: string, n: number): { ok: boolean; value: string } | null {\n const chars = [...s];\n const excess = chars.slice(n);\n if (excess.every((c) => c === \" \")) {\n return { ok: true, value: chars.slice(0, n).join(\"\") };\n }\n return { ok: false, value: s };\n}\n\n/** unify two types for comparison/set operations (simplified union type resolution) */\nexport function unifyTypes(a: TypeId, b: TypeId): TypeId | null {\n if (a === b) return a;\n if (a === \"unknown\") return b === \"unknown\" ? \"text\" : b;\n if (b === \"unknown\") return a;\n if (NUMERIC_TYPES.has(a) && NUMERIC_TYPES.has(b)) {\n const ladder = [\"int2\", \"int4\", \"int8\", \"numeric\", \"float4\", \"float8\"];\n const ia = ladder.indexOf(a);\n const ib = ladder.indexOf(b);\n return ladder[Math.max(ia, ib)]!;\n }\n if (TEXT_TYPES.has(a) && TEXT_TYPES.has(b)) return \"text\";\n if (canImplicitCast(a, b)) return b;\n if (canImplicitCast(b, a)) return a;\n if (isArrayType(a) && isArrayType(b)) {\n const e = unifyTypes(arrayElemType(a), arrayElemType(b));\n return e === null ? null : `${e}[]`;\n }\n return null;\n}\n\nexport { unsupported };\n", "import type { TypeName } from \"../ast/nodes.ts\";\nimport { pgError } from \"../errors/error.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\nimport type { ColumnType, TypeId, TypeMod } from \"./value.ts\";\nimport { arrayTypeOf, normalizeTypeName } from \"./value.ts\";\n\nexport interface ResolvedType {\n readonly column: ColumnType;\n /** \"schema.name\" when the name resolved to a domain */\n readonly domain: string | null;\n /** serial pseudo-types need sequence creation in DDL */\n readonly serial: \"int2\" | \"int4\" | \"int8\" | null;\n}\n\nconst SERIALS: Record<string, \"int2\" | \"int4\" | \"int8\"> = {\n smallserial: \"int2\",\n serial2: \"int2\",\n serial: \"int4\",\n serial4: \"int4\",\n bigserial: \"int8\",\n serial8: \"int8\",\n};\n\nfunction modOf(t: TypeId, mods: number[]): TypeMod | null {\n if (mods.length === 0) return null;\n if (t === \"numeric\") return { a: mods[0], b: mods[1] ?? 0 };\n return { a: mods[0] };\n}\n\n/**\n * Resolve a parsed type name against the catalog: builtin alias, enum, or\n * domain (searched along search_path). Throws 42704 when nothing matches.\n */\nexport function resolveTypeName(state: DatabaseState, tn: TypeName): ResolvedType {\n const joined = tn.parts.join(\".\");\n const bare =\n tn.parts.length === 1 ? tn.parts[0]! : tn.parts.length === 2 && tn.parts[0] === \"pg_catalog\" ? tn.parts[1]! : null;\n\n if (bare !== null) {\n const serial = SERIALS[bare];\n if (serial !== undefined && tn.arrayDims === 0) {\n return { column: { id: serial, mod: null }, domain: null, serial };\n }\n const builtin = normalizeTypeName(bare);\n if (builtin !== null) {\n const id = tn.arrayDims > 0 ? arrayTypeOf(builtin) : builtin;\n return { column: { id, mod: modOf(builtin, tn.mods) }, domain: null, serial: null };\n }\n }\n\n const enumData = state.findEnum(tn.parts);\n if (enumData) {\n const elem: TypeId = `enum:${enumData.schema}.${enumData.name}`;\n const id = tn.arrayDims > 0 ? arrayTypeOf(elem) : elem;\n return { column: { id, mod: null }, domain: null, serial: null };\n }\n\n const domainData = state.findDomain(tn.parts);\n if (domainData) {\n if (tn.arrayDims > 0) {\n const id = arrayTypeOf(domainData.baseType.id);\n return { column: { id, mod: domainData.baseType.mod }, domain: null, serial: null };\n }\n return {\n column: domainData.baseType,\n domain: `${domainData.schema}.${domainData.name}`,\n serial: null,\n };\n }\n\n throw pgError(\"undefined_object\", `type \"${joined}\" does not exist`);\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport type { EngineCtx } from \"../expressions/context.ts\";\nimport type { Datum, TypedValue, TypeId } from \"../types/value.ts\";\nimport { tv } from \"../types/value.ts\";\n\n/** A column of an intermediate or final result relation. */\nexport interface RelColumn {\n name: string;\n type: TypeId;\n /** range-variable (table alias) the column belongs to; null for computed columns */\n table: string | null;\n /** hidden columns (e.g. ORDER BY helpers) are excluded from final output */\n hidden?: boolean;\n}\n\nexport interface Relation {\n columns: RelColumn[];\n rows: Datum[][];\n}\n\nexport function emptyRelation(): Relation {\n return { columns: [], rows: [] };\n}\n\n/**\n * Row-level name resolution scope. Chains to an outer scope for correlated\n * subqueries and LATERAL.\n */\nexport class RowScope {\n constructor(\n readonly columns: RelColumn[],\n public row: Datum[],\n readonly parent: RowScope | null = null,\n /** range variables visible as whole-row references */\n readonly rangeVars: Set<string> = new Set(),\n ) {}\n\n /** Resolve a (possibly qualified) column reference. undefined = not found. */\n lookup(parts: string[]): TypedValue | undefined {\n if (parts.length === 1) {\n const name = parts[0]!;\n let found: TypedValue | undefined;\n let count = 0;\n for (let i = 0; i < this.columns.length; i++) {\n const c = this.columns[i]!;\n if (c.name === name && !c.hidden) {\n count++;\n if (count > 1) {\n throw pgError(\"ambiguous_column\", `column reference \"${name}\" is ambiguous`);\n }\n found = tv(c.type, this.row[i] ?? null);\n }\n }\n if (found !== undefined) return found;\n // whole-row reference to a range variable\n if (this.rangeVars.has(name)) {\n return this.wholeRow(name);\n }\n return this.parent?.lookup(parts);\n }\n const table = parts[parts.length - 2]!;\n const name = parts[parts.length - 1]!;\n let found: TypedValue | undefined;\n let count = 0;\n // qualified lookups see hidden columns (per-side copies of USING columns)\n for (let i = 0; i < this.columns.length; i++) {\n const c = this.columns[i]!;\n if (c.table === table && c.name === name) {\n count++;\n if (count > 1) {\n throw pgError(\"ambiguous_column\", `column reference \"${name}\" is ambiguous`);\n }\n found = tv(c.type, this.row[i] ?? null);\n }\n }\n if (found !== undefined) return found;\n return this.parent?.lookup(parts);\n }\n\n /** Build a record value from all columns belonging to a range variable. */\n wholeRow(rangeVar: string): TypedValue | undefined {\n const types: TypeId[] = [];\n const values: Datum[] = [];\n const names: string[] = [];\n // include hidden columns: per-side USING copies are real columns of the range var\n for (let i = 0; i < this.columns.length; i++) {\n const c = this.columns[i]!;\n if (c.table === rangeVar) {\n types.push(c.type);\n values.push(this.row[i] ?? null);\n names.push(c.name);\n }\n }\n if (types.length === 0) return undefined;\n return tv(\"record\", { kind: \"pgrecord\", types, values, names });\n }\n\n hasRangeVar(name: string): boolean {\n if (this.rangeVars.has(name)) return true;\n return this.parent?.hasRangeVar(name) ?? false;\n }\n}\n\n/** Environment threaded through statement execution. */\nexport interface ExecEnv {\n ctx: EngineCtx;\n params: TypedValue[] | null;\n /** CTE results by name (WITH clause); shadowed inner-to-outer */\n ctes: Map<string, Relation>;\n outer: RowScope | null;\n}\n\nexport function childEnv(env: ExecEnv, outer: RowScope | null): ExecEnv {\n return { ctx: env.ctx, params: env.params, ctes: env.ctes, outer };\n}\n\nexport function withCtes(env: ExecEnv, ctes: Map<string, Relation>): ExecEnv {\n return { ctx: env.ctx, params: env.params, ctes, outer: env.outer };\n}\n\n/** Final result surfaced by the API layer. */\nexport interface ExecResult {\n columns: Array<{ name: string; type: TypeId }>;\n rows: Datum[][];\n command: string;\n rowCount: number;\n}\n\nexport function relationResult(rel: Relation, command: string): ExecResult {\n const visible = rel.columns.map((c, i) => ({ i, c })).filter(({ c }) => !c.hidden);\n return {\n columns: visible.map(({ c }) => ({ name: c.name, type: c.type })),\n rows: rel.rows.map((r) => visible.map(({ i }) => r[i] ?? null)),\n command,\n rowCount: rel.rows.length,\n };\n}\n\nexport function commandResult(command: string, rowCount: number): ExecResult {\n return { columns: [], rows: [], command, rowCount };\n}\n\n/** column name PG infers for an expression without an alias */\nexport function inferColumnName(e: import(\"../ast/nodes.ts\").Expr): string {\n switch (e.type) {\n case \"colref\":\n return e.parts[e.parts.length - 1]!;\n case \"func\":\n return e.name[e.name.length - 1]!;\n case \"cast\": {\n const inner = inferColumnName(e.expr);\n if (inner !== \"?column?\") return inner;\n return e.target.parts[e.target.parts.length - 1]!;\n }\n case \"collate\":\n return inferColumnName(e.expr);\n case \"case\":\n return \"case\";\n case \"array_ctor\":\n case \"array_query\":\n return \"array\";\n case \"row\":\n return \"row\";\n case \"subquery_expr\":\n return e.kind === \"exists\" ? \"exists\" : \"?column?\";\n case \"bool_lit\":\n return \"bool\";\n case \"extract\":\n return \"extract\";\n case \"position\":\n return \"position\";\n case \"substring_sql\":\n return \"substring\";\n case \"overlay\":\n return \"overlay\";\n case \"trim\":\n return e.side === \"leading\" ? \"ltrim\" : e.side === \"trailing\" ? \"rtrim\" : \"btrim\";\n case \"field_select\":\n return e.field === \"*\" ? \"?column?\" : e.field;\n case \"at_time_zone\":\n return \"timezone\";\n case \"grouping_func\":\n return \"grouping\";\n case \"subscript\":\n return inferColumnName(e.base);\n default:\n return \"?column?\";\n }\n}\n\nexport type { EngineCtx };\n", "import { pgError } from \"../errors/error.ts\";\nimport type { EngineCtx } from \"../expressions/context.ts\";\nimport { castTo } from \"../types/cast.ts\";\nimport {\n civilToDays,\n DATE_NEG_INF,\n DATE_POS_INF,\n dayOfWeek,\n daysInMonth,\n daysToCivil,\n type Interval,\n isValidCivil,\n makeInterval,\n splitTs,\n TS_NEG_INF,\n TS_POS_INF,\n USECS_PER_DAY,\n USECS_PER_HOUR,\n USECS_PER_MIN,\n USECS_PER_SEC,\n} from \"../types/datetime.ts\";\nimport { makeNumeric, type Numeric, numericFromBigInt, parseNumeric } from \"../types/numeric.ts\";\nimport { type TypedValue, tv } from \"../types/value.ts\";\n\n/**\n * EXTRACT / date_part. `asNumeric=true` \u2192 numeric result (EXTRACT, PG 14+);\n * false \u2192 float8 (date_part).\n */\nexport function extractDatePart(ctx: EngineCtx, field0: string, src0: TypedValue, asNumeric: boolean): TypedValue {\n const field = field0.toLowerCase();\n const resultType = asNumeric ? \"numeric\" : \"float8\";\n let src = src0;\n if (src.t === \"unknown\" && typeof src.v === \"string\") {\n src = castTo(ctx, src, \"timestamptz\", { explicit: true });\n }\n if (src.v === null) return tv(resultType, null);\n\n const wrap = (n: Numeric): TypedValue => {\n if (asNumeric) return tv(\"numeric\", n);\n return castTo(ctx, tv(\"numeric\", n), \"float8\", { explicit: true });\n };\n\n switch (src.t) {\n case \"date\": {\n const days = src.v as number;\n if (days === DATE_POS_INF || days === DATE_NEG_INF) return extractInfinity(field, days > 0, wrap, \"date\");\n return wrap(extractFromDate(field, days, src.t));\n }\n case \"timestamp\": {\n const micros = src.v as bigint;\n if (micros === TS_POS_INF || micros === TS_NEG_INF) return extractInfinity(field, micros > 0n, wrap, \"timestamp\");\n const { days, tod } = splitTs(micros);\n if (field === \"epoch\") {\n return wrap(microsToNumericSeconds(micros + 946_684_800_000_000n));\n }\n return wrap(hasTimeField(field) ? extractFromTime(field, tod) : extractFromDate(field, days, src.t));\n }\n case \"timestamptz\": {\n const micros = src.v as bigint;\n if (micros === TS_POS_INF || micros === TS_NEG_INF)\n return extractInfinity(field, micros > 0n, wrap, \"timestamp with time zone\");\n if (field === \"epoch\") {\n return wrap(microsToNumericSeconds(micros + 946_684_800_000_000n));\n }\n const offsetSec = ctx.zoneOffsetAt(micros);\n const local = micros + BigInt(offsetSec) * USECS_PER_SEC;\n if (field === \"timezone\") return wrap(numericFromBigInt(BigInt(offsetSec)));\n if (field === \"timezone_hour\") return wrap(numericFromBigInt(BigInt(Math.trunc(offsetSec / 3600))));\n if (field === \"timezone_minute\") return wrap(numericFromBigInt(BigInt(Math.trunc((offsetSec % 3600) / 60))));\n const { days, tod } = splitTs(local);\n return wrap(hasTimeField(field) ? extractFromTime(field, tod) : extractFromDate(field, days, src.t));\n }\n case \"time\": {\n const micros = src.v as bigint;\n if (field === \"epoch\") return wrap(microsToNumericSeconds(micros));\n if (!hasTimeField(field)) {\n throw pgError(\n \"feature_not_supported\",\n `unit \"${field}\" not supported for type time without time zone`,\n \"0A000\",\n );\n }\n return wrap(extractFromTime(field, micros));\n }\n case \"timetz\": {\n const v = src.v as unknown as { micros: bigint; offsetSec: number };\n if (field === \"timezone\") return wrap(numericFromBigInt(BigInt(v.offsetSec)));\n if (field === \"timezone_hour\") return wrap(numericFromBigInt(BigInt(Math.trunc(v.offsetSec / 3600))));\n if (field === \"timezone_minute\") return wrap(numericFromBigInt(BigInt(Math.trunc((v.offsetSec % 3600) / 60))));\n if (field === \"epoch\") return wrap(microsToNumericSeconds(v.micros - BigInt(v.offsetSec) * USECS_PER_SEC));\n if (!hasTimeField(field)) {\n throw pgError(\"feature_not_supported\", `unit \"${field}\" not supported for type time with time zone`, \"0A000\");\n }\n return wrap(extractFromTime(field, v.micros));\n }\n case \"interval\":\n return wrap(extractFromInterval(field, src.v as Interval));\n default:\n throw pgError(\"datatype_mismatch\", `function extract(unknown, ${src.t}) does not exist`, \"42883\");\n }\n}\n\nfunction extractInfinity(\n field: string,\n positive: boolean,\n wrap: (n: Numeric) => TypedValue,\n typeName: string,\n): TypedValue {\n const monotonic = new Set([\"epoch\", \"julian\", \"year\", \"isoyear\", \"decade\", \"century\", \"millennium\"]);\n if (monotonic.has(field)) {\n // PG returns +/-Infinity \u2014 representable only in float8; numeric supports inf too\n const inf: Numeric = { kind: \"numeric\", coef: 0n, dscale: 0, special: positive ? \"inf\" : \"-inf\" };\n return wrap(inf);\n }\n if (hasTimeField(field) || [\"day\", \"month\", \"quarter\", \"week\", \"dow\", \"isodow\", \"doy\"].includes(field)) {\n return wrap(makeNumeric(0n, 0)); // PG returns NULL actually\n }\n throw pgError(\"invalid_parameter_value\", `unit \"${field}\" not supported for type ${typeName}`);\n}\n\nfunction hasTimeField(field: string): boolean {\n return [\"hour\", \"minute\", \"second\", \"milliseconds\", \"microseconds\"].includes(field);\n}\n\nfunction extractFromTime(field: string, micros: bigint): Numeric {\n switch (field) {\n case \"hour\":\n return numericFromBigInt(micros / USECS_PER_HOUR);\n case \"minute\":\n return numericFromBigInt((micros / USECS_PER_MIN) % 60n);\n case \"second\":\n return makeNumeric(micros % USECS_PER_MIN, 6);\n case \"milliseconds\":\n return makeNumeric((micros % USECS_PER_MIN) / 1000n, 3);\n case \"microseconds\":\n return numericFromBigInt(micros % USECS_PER_MIN);\n default:\n throw pgError(\"invalid_parameter_value\", `unit \"${field}\" not recognized`);\n }\n}\n\nfunction extractFromDate(field: string, days: number, srcType: string): Numeric {\n const { y, m, d } = daysToCivil(days);\n switch (field) {\n case \"year\":\n return numericFromBigInt(BigInt(y));\n case \"month\":\n return numericFromBigInt(BigInt(m));\n case \"day\":\n return numericFromBigInt(BigInt(d));\n case \"quarter\":\n return numericFromBigInt(BigInt(Math.floor((m - 1) / 3) + 1));\n case \"decade\":\n return numericFromBigInt(BigInt(Math.floor(y / 10)));\n case \"century\": {\n const c = y > 0 ? Math.floor((y - 1) / 100) + 1 : -(Math.floor((-y - 1) / 100) + 1) + 1;\n return numericFromBigInt(BigInt(y > 0 ? Math.floor((y - 1) / 100) + 1 : c));\n }\n case \"millennium\":\n return numericFromBigInt(BigInt(y > 0 ? Math.floor((y - 1) / 1000) + 1 : Math.floor(y / 1000)));\n case \"dow\":\n return numericFromBigInt(BigInt(dayOfWeek(days)));\n case \"isodow\": {\n const dw = dayOfWeek(days);\n return numericFromBigInt(BigInt(dw === 0 ? 7 : dw));\n }\n case \"doy\":\n return numericFromBigInt(BigInt(days - civilToDays(y, 1, 1) + 1));\n case \"week\":\n return numericFromBigInt(BigInt(isoWeek(days).week));\n case \"isoyear\":\n return numericFromBigInt(BigInt(isoWeek(days).year));\n case \"epoch\":\n return numericFromBigInt(BigInt(days) * 86400n + 946_684_800n);\n case \"julian\":\n return numericFromBigInt(BigInt(days + 2451545));\n case \"hour\":\n case \"minute\":\n case \"second\":\n case \"milliseconds\":\n case \"microseconds\":\n if (srcType === \"date\") {\n throw pgError(\"feature_not_supported\", `unit \"${field}\" not supported for type date`, \"0A000\");\n }\n return makeNumeric(0n, field === \"second\" ? 6 : 0);\n default:\n throw pgError(\"invalid_parameter_value\", `unit \"${field}\" not recognized for type ${srcType}`);\n }\n}\n\nfunction extractFromInterval(field: string, v: Interval): Numeric {\n const years = Math.trunc(v.months / 12);\n switch (field) {\n case \"year\":\n return numericFromBigInt(BigInt(years));\n case \"month\":\n return numericFromBigInt(BigInt(v.months % 12));\n case \"day\":\n return numericFromBigInt(BigInt(v.days));\n case \"hour\":\n return numericFromBigInt(v.micros / USECS_PER_HOUR);\n case \"minute\":\n return numericFromBigInt((v.micros / USECS_PER_MIN) % 60n);\n case \"second\":\n return makeNumeric(v.micros % USECS_PER_MIN, 6);\n case \"milliseconds\":\n return makeNumeric((v.micros % USECS_PER_MIN) / 1000n, 3);\n case \"microseconds\":\n return numericFromBigInt(v.micros % USECS_PER_MIN);\n case \"quarter\":\n return numericFromBigInt(\n BigInt(Math.floor(((((v.months % 12) + 12) % 12) - (v.months % 12 < 0 ? 0 : 0)) / 3) + 1),\n );\n case \"decade\":\n return numericFromBigInt(BigInt(Math.trunc(v.months / 120)));\n case \"century\":\n return numericFromBigInt(BigInt(Math.trunc(v.months / 1200)));\n case \"millennium\":\n return numericFromBigInt(BigInt(Math.trunc(v.months / 12000)));\n case \"epoch\": {\n const seconds =\n BigInt(v.months) * 2_629_800n + // PG: months * 30.436875 days\n BigInt(v.days) * 86400n;\n const microsPart = v.micros;\n return makeNumeric(seconds * 1_000_000n + microsPart, 6);\n }\n default:\n throw pgError(\"invalid_parameter_value\", `unit \"${field}\" not supported for type interval`);\n }\n}\n\nfunction microsToNumericSeconds(micros: bigint): Numeric {\n return makeNumeric(micros, 6);\n}\n\n/** ISO 8601 week + iso year for a day number. */\nexport function isoWeek(days: number): { week: number; year: number } {\n const { y } = daysToCivil(days);\n const week1Monday = (yy: number): number => {\n const jan4 = civilToDays(yy, 1, 4);\n const dw = dayOfWeek(jan4);\n const isoDw = dw === 0 ? 7 : dw;\n return jan4 - (isoDw - 1);\n };\n let year = y;\n let start = week1Monday(y);\n if (days < start) {\n year = y - 1;\n start = week1Monday(year);\n } else {\n const nextStart = week1Monday(y + 1);\n if (days >= nextStart) {\n year = y + 1;\n start = nextStart;\n }\n }\n return { week: Math.floor((days - start) / 7) + 1, year };\n}\n\n// --- date_trunc -------------------------------------------------------------------\n\nexport function dateTruncDays(field: string, days: number): number {\n const { y, m } = daysToCivil(days);\n switch (field) {\n case \"millennium\":\n return civilToDays(Math.floor((y - 1) / 1000) * 1000 + 1, 1, 1);\n case \"century\":\n return civilToDays(Math.floor((y - 1) / 100) * 100 + 1, 1, 1);\n case \"decade\":\n return civilToDays(Math.floor(y / 10) * 10, 1, 1);\n case \"year\":\n return civilToDays(y, 1, 1);\n case \"quarter\":\n return civilToDays(y, Math.floor((m - 1) / 3) * 3 + 1, 1);\n case \"month\":\n return civilToDays(y, m, 1);\n case \"week\": {\n const dw = dayOfWeek(days);\n const isoDw = dw === 0 ? 7 : dw;\n return days - (isoDw - 1);\n }\n case \"day\":\n return days;\n default:\n throw pgError(\"invalid_parameter_value\", `unit \"${field}\" not supported`);\n }\n}\n\nexport function dateTruncMicros(field: string, micros: bigint): bigint {\n const { days, tod } = splitTs(micros);\n switch (field) {\n case \"hour\":\n return BigInt(days) * USECS_PER_DAY + (tod / USECS_PER_HOUR) * USECS_PER_HOUR;\n case \"minute\":\n return BigInt(days) * USECS_PER_DAY + (tod / USECS_PER_MIN) * USECS_PER_MIN;\n case \"second\":\n return BigInt(days) * USECS_PER_DAY + (tod / USECS_PER_SEC) * USECS_PER_SEC;\n case \"milliseconds\":\n return BigInt(days) * USECS_PER_DAY + (tod / 1000n) * 1000n;\n case \"microseconds\":\n return micros;\n default:\n return BigInt(dateTruncDays(field, days)) * USECS_PER_DAY;\n }\n}\n\nexport function dateTruncInterval(field: string, v: Interval): Interval {\n switch (field) {\n case \"millennium\":\n return makeInterval(Math.trunc(v.months / 12000) * 12000, 0, 0n);\n case \"century\":\n return makeInterval(Math.trunc(v.months / 1200) * 1200, 0, 0n);\n case \"decade\":\n return makeInterval(Math.trunc(v.months / 120) * 120, 0, 0n);\n case \"year\":\n return makeInterval(Math.trunc(v.months / 12) * 12, 0, 0n);\n case \"quarter\":\n return makeInterval(Math.trunc(v.months / 3) * 3, 0, 0n);\n case \"month\":\n return makeInterval(v.months, 0, 0n);\n case \"day\":\n return makeInterval(v.months, v.days, 0n);\n case \"hour\":\n return makeInterval(v.months, v.days, (v.micros / USECS_PER_HOUR) * USECS_PER_HOUR);\n case \"minute\":\n return makeInterval(v.months, v.days, (v.micros / USECS_PER_MIN) * USECS_PER_MIN);\n case \"second\":\n return makeInterval(v.months, v.days, (v.micros / USECS_PER_SEC) * USECS_PER_SEC);\n case \"milliseconds\":\n return makeInterval(v.months, v.days, (v.micros / 1000n) * 1000n);\n case \"microseconds\":\n return v;\n default:\n throw pgError(\"invalid_parameter_value\", `unit \"${field}\" not supported for type interval`);\n }\n}\n\n// --- make_* ---------------------------------------------------------------------\n\nexport function makeDateDatum(y: number, m: number, d: number): number {\n if (y === 0 || !isValidCivil(y < 0 ? y + 1 : y, m, d)) {\n throw pgError(\n \"invalid_datetime\",\n `date field value out of range: ${y}-${String(m).padStart(2, \"0\")}-${String(d).padStart(2, \"0\")}`,\n \"22008\",\n );\n }\n return civilToDays(y < 0 ? y + 1 : y, m, d);\n}\n\nexport function makeTimeDatum(h: number, min: number, sec: number): bigint {\n if (h < 0 || h > 24 || min < 0 || min > 59 || sec < 0 || sec >= 60 || (h === 24 && (min > 0 || sec > 0))) {\n throw pgError(\"invalid_datetime\", `time field value out of range: ${h}:${min}:${sec}`, \"22008\");\n }\n return BigInt(h) * USECS_PER_HOUR + BigInt(min) * USECS_PER_MIN + BigInt(Math.round(sec * 1_000_000));\n}\n\nexport function justifyHours(v: Interval): Interval {\n const extraDays = v.micros / USECS_PER_DAY;\n return makeInterval(v.months, v.days + Number(extraDays), v.micros % USECS_PER_DAY);\n}\n\nexport function justifyDays(v: Interval): Interval {\n const extraMonths = Math.trunc(v.days / 30);\n return makeInterval(v.months + extraMonths, v.days % 30, v.micros);\n}\n\nexport function justifyInterval(v: Interval): Interval {\n let months = v.months;\n let days = v.days;\n let micros = v.micros;\n days += Number(micros / USECS_PER_DAY);\n micros %= USECS_PER_DAY;\n months += Math.trunc(days / 30);\n days %= 30;\n if (micros < 0n && (days > 0 || months > 0)) {\n micros += USECS_PER_DAY;\n days -= 1;\n }\n if (days < 0 && months > 0) {\n days += 30;\n months -= 1;\n }\n if (micros > 0n && (days < 0 || months < 0)) {\n micros -= USECS_PER_DAY;\n days += 1;\n }\n if (days > 0 && months < 0) {\n days -= 30;\n months += 1;\n }\n return makeInterval(months, days, micros);\n}\n\n/** age(a, b): symbolic year/month/day difference like PG timestamp_age */\nexport function timestampAge(a: bigint, b: bigint): Interval {\n const split = (m: bigint): { y: number; mo: number; d: number; tod: bigint } => {\n const { days, tod } = splitTs(m);\n const c = daysToCivil(days);\n return { y: c.y, mo: c.m, d: c.d, tod };\n };\n const A = split(a);\n const B = split(b);\n let years = A.y - B.y;\n let months = A.mo - B.mo;\n let days = A.d - B.d;\n let micros = A.tod - B.tod;\n const sign = a >= b ? 1 : -1;\n if (sign > 0) {\n if (micros < 0n) {\n micros += USECS_PER_DAY;\n days -= 1;\n }\n if (days < 0) {\n // PG borrows the length of tm1's own month (timestamp_age / day_tab[...][tm_mon-1])\n days += daysInMonth(A.y, A.mo);\n months -= 1;\n }\n if (months < 0) {\n months += 12;\n years -= 1;\n }\n } else {\n if (micros > 0n) {\n micros -= USECS_PER_DAY;\n days += 1;\n }\n if (days > 0) {\n days -= daysInMonth(B.y, B.mo === 12 ? 12 : B.mo);\n months += 1;\n }\n if (months > 0) {\n months -= 12;\n years += 1;\n }\n }\n return makeInterval(years * 12 + months, days, micros);\n}\n\nexport function numericSecondsToMicros(n: Numeric): bigint {\n const text = `${n.coef < 0n ? \"-\" : \"\"}${(n.coef < 0n ? -n.coef : n.coef).toString()}`;\n void text;\n // rescale to 6 fraction digits\n let coef = n.coef;\n let ds = n.dscale;\n while (ds < 6) {\n coef *= 10n;\n ds++;\n }\n while (ds > 6) {\n const q = coef / 10n;\n const r = coef % 10n;\n coef = q + (r >= 5n ? 1n : r <= -5n ? -1n : 0n);\n ds--;\n }\n return coef;\n}\n\nexport function parseNumericArg(text: string): Numeric {\n return parseNumeric(text);\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport { type Interval, intervalCmp } from \"./datetime.ts\";\nimport { jsonbCompare } from \"./jsonb.ts\";\nimport { isNumeric, type Numeric, numericCmp, numericStripTrailingZeros, numericText } from \"./numeric.ts\";\nimport {\n arrayElemType,\n byteaText,\n type Datum,\n isArrayType,\n isEnumType,\n type JsonbWrap,\n type PgArray,\n type PgRecord,\n type TypeId,\n} from \"./value.ts\";\n\n/**\n * Total order for non-null datums of the same type. Text uses C-locale\n * (code point) ordering \u2014 the engine's pinned collation.\n *\n * Enum ordering needs label positions; callers pass `enumOrder`.\n */\nexport interface CompareCtx {\n enumOrder?(enumType: TypeId, label: string): number;\n}\n\nexport const DEFAULT_COMPARE_CTX: CompareCtx = {};\n\nexport function datumCompare(t: TypeId, a: Datum, b: Datum, ctx: CompareCtx = DEFAULT_COMPARE_CTX): number {\n if (a === null || b === null) throw pgError(\"internal\", \"datumCompare called with null\");\n if (isArrayType(t)) return arrayCompare(t, a as PgArray, b as PgArray, ctx);\n if (isEnumType(t)) {\n if (!ctx.enumOrder) return cmpString(a as string, b as string);\n return ctx.enumOrder(t, a as string) - ctx.enumOrder(t, b as string);\n }\n switch (t) {\n case \"bool\":\n return a === b ? 0 : a ? 1 : -1;\n case \"int2\":\n case \"int4\":\n case \"oid\":\n case \"date\":\n return (a as number) - (b as number);\n case \"float4\":\n case \"float8\": {\n // NaN sorts last (greater than everything), like PG\n const fa = a as number;\n const fb = b as number;\n const na = Number.isNaN(fa);\n const nb = Number.isNaN(fb);\n if (na || nb) return na && nb ? 0 : na ? 1 : -1;\n return fa < fb ? -1 : fa > fb ? 1 : 0;\n }\n case \"int8\":\n case \"money\":\n case \"timestamp\":\n case \"timestamptz\":\n case \"time\": {\n const ba = a as bigint;\n const bb = b as bigint;\n return ba < bb ? -1 : ba > bb ? 1 : 0;\n }\n case \"numeric\":\n return numericCmp(a as Numeric, b as Numeric);\n case \"text\":\n case \"varchar\":\n case \"bpchar\":\n case \"name\":\n case \"unknown\":\n case \"uuid\":\n case \"tsvector\":\n case \"tsquery\":\n case \"bit\":\n case \"varbit\":\n return cmpString(a as string, b as string);\n case \"bytea\": {\n const ba = a as Uint8Array;\n const bb = b as Uint8Array;\n const n = Math.min(ba.length, bb.length);\n for (let i = 0; i < n; i++) {\n if (ba[i]! !== bb[i]!) return ba[i]! < bb[i]! ? -1 : 1;\n }\n return ba.length - bb.length;\n }\n case \"interval\":\n return intervalCmp(a as Interval, b as Interval);\n case \"jsonb\":\n return jsonbCompare((a as JsonbWrap).value, (b as JsonbWrap).value);\n case \"json\":\n throw pgError(\"undefined_function\", \"could not identify an equality operator for type json\");\n case \"record\":\n return recordCompare(a as PgRecord, b as PgRecord, ctx);\n default:\n throw pgError(\"undefined_function\", `could not identify an ordering operator for type ${t}`);\n }\n}\n\n/** C-locale: compare by code units of UTF-8 bytes. */\nfunction cmpString(a: string, b: string): number {\n if (a === b) return 0;\n const ea = utf8(a);\n const eb = utf8(b);\n const n = Math.min(ea.length, eb.length);\n for (let i = 0; i < n; i++) {\n if (ea[i]! !== eb[i]!) return ea[i]! < eb[i]! ? -1 : 1;\n }\n return ea.length - eb.length;\n}\n\nconst encoder = new TextEncoder();\nfunction utf8(s: string): Uint8Array {\n return encoder.encode(s);\n}\n\nfunction arrayCompare(t: TypeId, a: PgArray, b: PgArray, ctx: CompareCtx): number {\n const elem = arrayElemType(t);\n const n = Math.min(a.items.length, b.items.length);\n for (let i = 0; i < n; i++) {\n const av = a.items[i]!;\n const bv = b.items[i]!;\n if (av === null && bv === null) continue;\n // PG array comparison sorts NULLs last within elements\n if (av === null) return 1;\n if (bv === null) return -1;\n const c = datumCompare(elem, av, bv, ctx);\n if (c !== 0) return c;\n }\n if (a.items.length !== b.items.length) return a.items.length - b.items.length;\n // equal contents; compare dims\n for (let i = 0; i < Math.min(a.dims.length, b.dims.length); i++) {\n if (a.dims[i]! !== b.dims[i]!) return a.dims[i]! - b.dims[i]!;\n }\n return a.dims.length - b.dims.length;\n}\n\nfunction recordCompare(a: PgRecord, b: PgRecord, ctx: CompareCtx): number {\n const n = Math.min(a.values.length, b.values.length);\n for (let i = 0; i < n; i++) {\n const av = a.values[i]!;\n const bv = b.values[i]!;\n if (av === null && bv === null) continue;\n if (av === null) return 1;\n if (bv === null) return -1;\n const c = datumCompare(a.types[i] ?? \"text\", av, bv, ctx);\n if (c !== 0) return c;\n }\n if (a.values.length !== b.values.length) {\n throw pgError(\"datatype_mismatch\", \"cannot compare record types with different numbers of columns\");\n }\n return 0;\n}\n\nexport function datumEquals(t: TypeId, a: Datum, b: Datum, ctx: CompareCtx = DEFAULT_COMPARE_CTX): boolean {\n return datumCompare(t, a, b, ctx) === 0;\n}\n\n/**\n * Canonical grouping/uniqueness key. Equal values (2.50 = 2.5, +0 = -0)\n * must map to the same key.\n */\nexport function datumKey(t: TypeId, v: Datum): string {\n if (v === null) return \"\\u0000N\";\n if (isArrayType(t)) {\n const arr = v as PgArray;\n return `A[${arr.dims.join(\",\")}]${arr.items.map((it) => (it === null ? \"\\u0000N\" : datumKey(arrayElemType(t), it))).join(\"\\u0001\")}`;\n }\n if (isEnumType(t)) return `E${v as string}`;\n switch (t) {\n case \"bool\":\n return v ? \"t\" : \"f\";\n case \"int2\":\n case \"int4\":\n case \"oid\":\n case \"date\":\n return `i${v}`;\n case \"float4\":\n case \"float8\": {\n const f = v as number;\n if (Number.isNaN(f)) return \"fNaN\";\n if (f === 0) return \"f0\";\n return `f${f}`;\n }\n case \"int8\":\n case \"money\":\n case \"timestamp\":\n case \"timestamptz\":\n case \"time\":\n return `i${v}`;\n case \"numeric\": {\n const n = numericStripTrailingZeros(v as Numeric);\n return `n${numericText(n)}`;\n }\n case \"text\":\n case \"varchar\":\n case \"bpchar\":\n case \"name\":\n case \"unknown\":\n case \"uuid\":\n case \"json\":\n case \"tsvector\":\n case \"tsquery\":\n case \"bit\":\n case \"varbit\":\n return `s${v}`;\n case \"bytea\":\n return `b${byteaText(v as Uint8Array)}`;\n case \"interval\": {\n const iv = v as Interval;\n // equal intervals (1 mon vs 30 days) compare equal in PG\n return `v${(BigInt(iv.months) * 30n + BigInt(iv.days)) * 86_400_000_000n + iv.micros}`;\n }\n case \"jsonb\":\n return `j${jsonbKeyText(v as JsonbWrap)}`;\n case \"record\": {\n const r = v as PgRecord;\n return `r(${r.values.map((val, i) => (val === null ? \"\\u0000N\" : datumKey(r.types[i] ?? \"text\", val))).join(\"\\u0001\")})`;\n }\n default:\n if (isNumeric(v)) return `n${numericText(numericStripTrailingZeros(v))}`;\n return `s${String(v)}`;\n }\n}\n\nfunction jsonbKeyText(w: JsonbWrap): string {\n // canonical text is already normalized (sorted keys, canonical numbers)\n return JSON.stringify(canonicalJsonb(w.value));\n}\n\nfunction canonicalJsonb(v: import(\"./jsonb.ts\").JsonbValue): unknown {\n switch (v.j) {\n case \"null\":\n return null;\n case \"bool\":\n return v.v;\n case \"num\":\n return numericText(numericStripTrailingZeros(v.v));\n case \"str\":\n return `s${v.v}`;\n case \"arr\":\n return v.v.map(canonicalJsonb);\n case \"obj\": {\n const keys = [...v.v.keys()].sort();\n return keys.map((k) => [k, canonicalJsonb(v.v.get(k)!)]);\n }\n }\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport type { EngineCtx } from \"../expressions/context.ts\";\nimport { castTo } from \"../types/cast.ts\";\nimport { isNumeric, type Numeric, numericToNumber } from \"../types/numeric.ts\";\nimport { type Datum, type TypedValue, type TypeId, tv } from \"../types/value.ts\";\n\nexport type ScalarFn = (ctx: EngineCtx, args: TypedValue[]) => TypedValue;\n\n/** Wrap a function so any NULL argument short-circuits to a NULL result. */\nexport function strict(resultType: TypeId, fn: ScalarFn): ScalarFn {\n return (ctx, args) => {\n for (const a of args) {\n if (a.v === null) return tv(resultType, null);\n }\n return fn(ctx, args);\n };\n}\n\nexport function argText(ctx: EngineCtx, v: TypedValue): string {\n return castTo(ctx, v, \"text\", { explicit: true }).v as string;\n}\n\nexport function argInt(ctx: EngineCtx, v: TypedValue): number {\n const cast = castTo(ctx, v, \"int4\", {});\n return cast.v as number;\n}\n\nexport function argBigInt(ctx: EngineCtx, v: TypedValue): bigint {\n const cast = castTo(ctx, v, \"int8\", {});\n return cast.v as bigint;\n}\n\nexport function argFloat(ctx: EngineCtx, v: TypedValue): number {\n const cast = castTo(ctx, v, \"float8\", { explicit: true });\n return cast.v as number;\n}\n\nexport function argNumeric(ctx: EngineCtx, v: TypedValue): Numeric {\n const cast = castTo(ctx, v, \"numeric\", { explicit: true });\n return cast.v as Numeric;\n}\n\nexport function argBool(ctx: EngineCtx, v: TypedValue): boolean {\n return castTo(ctx, v, \"bool\", {}).v as boolean;\n}\n\nexport function numericAsNumber(v: Datum): number {\n if (typeof v === \"number\") return v;\n if (typeof v === \"bigint\") return Number(v);\n if (isNumeric(v)) return numericToNumber(v);\n throw pgError(\"datatype_mismatch\", \"expected numeric value\");\n}\n\nexport function arityError(name: string, args: TypedValue[]): never {\n throw pgError(\"undefined_function\", `function ${name}(${args.map((a) => a.t).join(\", \")}) does not exist`, \"42883\");\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport { castTo, unifyTypes } from \"../types/cast.ts\";\nimport { datumCompare, datumEquals } from \"../types/compare.ts\";\nimport {\n arrayElemType,\n arrayTypeOf,\n type Datum,\n isArrayType,\n makeArray,\n type PgArray,\n type TypeId,\n tv,\n UNKNOWN,\n} from \"../types/value.ts\";\nimport { argInt, argText, type ScalarFn, strict } from \"./util.ts\";\n\nfunction requireArray(v: { t: TypeId; v: Datum }, fname: string): PgArray {\n if (!isArrayType(v.t)) {\n throw pgError(\"undefined_function\", `function ${fname}(${v.t}) does not exist`, \"42883\");\n }\n return v.v as PgArray;\n}\n\nfunction dimsOf(arr: PgArray): number[] {\n return arr.dims.length > 0 ? arr.dims : arr.items.length === 0 ? [] : [arr.items.length];\n}\n\nfunction lbsOf(arr: PgArray): number[] {\n const dims = dimsOf(arr);\n return arr.lbs.length === dims.length ? arr.lbs : dims.map(() => 1);\n}\n\nexport function getArrayFunctions(): Map<string, ScalarFn> {\n const m = new Map<string, ScalarFn>();\n\n m.set(\n \"array_length\",\n strict(\"int4\", (ctx, args) => {\n const arr = requireArray(args[0]!, \"array_length\");\n const dim = argInt(ctx, args[1]!);\n const dims = dimsOf(arr);\n if (dim < 1 || dim > dims.length) return tv(\"int4\", null);\n return tv(\"int4\", dims[dim - 1]!);\n }),\n );\n m.set(\n \"array_upper\",\n strict(\"int4\", (ctx, args) => {\n const arr = requireArray(args[0]!, \"array_upper\");\n const dim = argInt(ctx, args[1]!);\n const dims = dimsOf(arr);\n const lbs = lbsOf(arr);\n if (dim < 1 || dim > dims.length) return tv(\"int4\", null);\n return tv(\"int4\", lbs[dim - 1]! + dims[dim - 1]! - 1);\n }),\n );\n m.set(\n \"array_lower\",\n strict(\"int4\", (ctx, args) => {\n const arr = requireArray(args[0]!, \"array_lower\");\n const dim = argInt(ctx, args[1]!);\n const dims = dimsOf(arr);\n const lbs = lbsOf(arr);\n if (dim < 1 || dim > dims.length) return tv(\"int4\", null);\n return tv(\"int4\", lbs[dim - 1]!);\n }),\n );\n m.set(\n \"array_ndims\",\n strict(\"int4\", (_ctx, args) => {\n const arr = requireArray(args[0]!, \"array_ndims\");\n const dims = dimsOf(arr);\n return tv(\"int4\", dims.length === 0 ? null : dims.length);\n }),\n );\n m.set(\n \"cardinality\",\n strict(\"int4\", (_ctx, args) => {\n const arr = requireArray(args[0]!, \"cardinality\");\n return tv(\"int4\", arr.items.length);\n }),\n );\n m.set(\n \"array_dims\",\n strict(\"text\", (_ctx, args) => {\n const arr = requireArray(args[0]!, \"array_dims\");\n const dims = dimsOf(arr);\n if (dims.length === 0) return tv(\"text\", null);\n const lbs = lbsOf(arr);\n let out = \"\";\n for (let i = 0; i < dims.length; i++) {\n out += `[${lbs[i]}:${lbs[i]! + dims[i]! - 1}]`;\n }\n return tv(\"text\", out);\n }),\n );\n m.set(\"array_append\", (ctx, args) => {\n const a = args[0]!;\n const elemT = isArrayType(a.t) ? arrayElemType(a.t) : args[1]!.t === UNKNOWN ? \"text\" : args[1]!.t;\n const arr = a.v === null ? makeArray(elemT, []) : (a.v as PgArray);\n const el = castTo(ctx, args[1]!, elemT, {});\n if ((arr.dims.length || 1) > 1) throw pgError(\"array_subscript_error\", \"cannot append to multidimensional array\");\n return tv(arrayTypeOf(elemT), makeArray(elemT, [...arr.items, el.v]));\n });\n m.set(\"array_prepend\", (ctx, args) => {\n const a = args[1]!;\n const elemT = isArrayType(a.t) ? arrayElemType(a.t) : args[0]!.t === UNKNOWN ? \"text\" : args[0]!.t;\n const arr = a.v === null ? makeArray(elemT, []) : (a.v as PgArray);\n const el = castTo(ctx, args[0]!, elemT, {});\n return tv(arrayTypeOf(elemT), makeArray(elemT, [el.v, ...arr.items]));\n });\n m.set(\"array_cat\", (ctx, args) => {\n const a = args[0]!;\n const b = args[1]!;\n if (a.v === null) return b;\n if (b.v === null) return a;\n const ea = arrayElemType(a.t);\n const eb = arrayElemType(b.t);\n const elem = unifyTypes(ea === UNKNOWN ? eb : ea, eb === UNKNOWN ? ea : eb) ?? \"text\";\n const arrA = castTo(ctx, a, arrayTypeOf(elem), {}).v as PgArray;\n const arrB = castTo(ctx, b, arrayTypeOf(elem), {}).v as PgArray;\n return tv(arrayTypeOf(elem), makeArray(elem, [...arrA.items, ...arrB.items]));\n });\n m.set(\"array_remove\", (ctx, args) => {\n const a = args[0]!;\n if (a.v === null) return tv(a.t, null);\n const arr = requireArray(a, \"array_remove\");\n const elemT = arrayElemType(a.t);\n const target = castTo(ctx, args[1]!, elemT, {});\n const items = arr.items.filter((item) => {\n if (item === null) return target.v !== null;\n if (target.v === null) return true;\n return !datumEquals(elemT, item, target.v, ctx);\n });\n return tv(a.t, makeArray(elemT, items));\n });\n m.set(\"array_replace\", (ctx, args) => {\n const a = args[0]!;\n if (a.v === null) return tv(a.t, null);\n const arr = requireArray(a, \"array_replace\");\n const elemT = arrayElemType(a.t);\n const from = castTo(ctx, args[1]!, elemT, {});\n const to = castTo(ctx, args[2]!, elemT, {});\n const items = arr.items.map((item) => {\n const matches = item === null ? from.v === null : from.v !== null && datumEquals(elemT, item, from.v, ctx);\n return matches ? to.v : item;\n });\n return tv(a.t, makeArray(elemT, items, arr.dims, arr.lbs));\n });\n m.set(\"array_position\", (ctx, args) => {\n const a = args[0]!;\n if (a.v === null) return tv(\"int4\", null);\n const arr = requireArray(a, \"array_position\");\n if (dimsOf(arr).length > 1) {\n throw pgError(\"array_subscript_error\", \"searching for elements in multidimensional arrays is not supported\");\n }\n const elemT = arrayElemType(a.t);\n const target = castTo(ctx, args[1]!, elemT, {});\n const start = args.length > 2 ? argInt(ctx, args[2]!) : 1;\n const lb = lbsOf(arr)[0] ?? 1;\n for (let i = Math.max(start - lb, 0); i < arr.items.length; i++) {\n const item = arr.items[i]!;\n const eq = item === null ? target.v === null : target.v !== null && datumEquals(elemT, item, target.v, ctx);\n if (eq) return tv(\"int4\", i + lb);\n }\n return tv(\"int4\", null);\n });\n m.set(\"array_positions\", (ctx, args) => {\n const a = args[0]!;\n if (a.v === null) return tv(\"int4[]\", null);\n const arr = requireArray(a, \"array_positions\");\n if (dimsOf(arr).length > 1) {\n throw pgError(\"array_subscript_error\", \"searching for elements in multidimensional arrays is not supported\");\n }\n const elemT = arrayElemType(a.t);\n const target = castTo(ctx, args[1]!, elemT, {});\n const lb = lbsOf(arr)[0] ?? 1;\n const out: Datum[] = [];\n for (let i = 0; i < arr.items.length; i++) {\n const item = arr.items[i]!;\n const eq = item === null ? target.v === null : target.v !== null && datumEquals(elemT, item, target.v, ctx);\n if (eq) out.push(i + lb);\n }\n return tv(\"int4[]\", makeArray(\"int4\", out));\n });\n m.set(\n \"array_fill\",\n strict(\"text[]\", (_ctx, args) => {\n const value = args[0]!;\n const dimsArr = args[1]!.v as PgArray;\n const dims = dimsArr.items.map((d) => Number(d));\n const lbs = args.length > 2 ? (args[2]!.v as PgArray).items.map((d) => Number(d)) : dims.map(() => 1);\n const total = dims.reduce((a, b) => a * b, 1);\n if (dims.some((d) => d < 0)) throw pgError(\"invalid_parameter_value\", \"dimension array entry must be positive\");\n const elemT = value.t === UNKNOWN ? \"text\" : value.t;\n const items: Datum[] = new Array(total).fill(value.v);\n return tv(arrayTypeOf(elemT), makeArray(elemT, items, dims, lbs));\n }),\n );\n m.set(\n \"trim_array\",\n strict(\"text[]\", (ctx, args) => {\n const a = args[0]!;\n const arr = requireArray(a, \"trim_array\");\n const n = argInt(ctx, args[1]!);\n if (n < 0 || n > arr.items.length) {\n throw pgError(\n \"array_element_error\",\n `number of elements to trim must be between 0 and ${arr.items.length}`,\n \"2202E\",\n );\n }\n return tv(a.t, makeArray(arrayElemType(a.t), arr.items.slice(0, arr.items.length - n)));\n }),\n );\n m.set(\"array_to_string\", (ctx, args) => {\n const a = args[0]!;\n if (a.v === null || args[1]!.v === null) return tv(\"text\", null);\n const arr = requireArray(a, \"array_to_string\");\n const sep = argText(ctx, args[1]!);\n const nullStr = args.length > 2 && args[2]!.v !== null ? argText(ctx, args[2]!) : null;\n const elemT = arrayElemType(a.t);\n const parts: string[] = [];\n for (const item of arr.items) {\n if (item === null) {\n if (nullStr !== null) parts.push(nullStr);\n continue;\n }\n parts.push(castTo(ctx, tv(elemT, item), \"text\", { explicit: true }).v as string);\n }\n return tv(\"text\", parts.join(sep));\n });\n m.set(\n \"array_sort\",\n strict(\"text[]\", (ctx, args) => {\n const a = args[0]!;\n const arr = requireArray(a, \"array_sort\");\n const elemT = arrayElemType(a.t);\n const items = [...arr.items].sort((x, y) => {\n if (x === null) return y === null ? 0 : 1;\n if (y === null) return -1;\n return datumCompare(elemT, x, y, ctx);\n });\n return tv(a.t, makeArray(elemT, items));\n }),\n );\n m.set(\n \"array_reverse\",\n strict(\"text[]\", (_ctx, args) => {\n const a = args[0]!;\n const arr = requireArray(a, \"array_reverse\");\n return tv(a.t, makeArray(arrayElemType(a.t), [...arr.items].reverse()));\n }),\n );\n m.set(\n \"array_shuffle\",\n strict(\"text[]\", (ctx, args) => {\n const a = args[0]!;\n const arr = requireArray(a, \"array_shuffle\");\n const items = [...arr.items];\n for (let i = items.length - 1; i > 0; i--) {\n const j = ctx.state.prng.nextInt(0, i);\n [items[i], items[j]] = [items[j]!, items[i]!];\n }\n return tv(a.t, makeArray(arrayElemType(a.t), items));\n }),\n );\n m.set(\n \"array_sample\",\n strict(\"text[]\", (ctx, args) => {\n const a = args[0]!;\n const arr = requireArray(a, \"array_sample\");\n const n = argInt(ctx, args[1]!);\n if (n < 0 || n > arr.items.length) {\n throw pgError(\"invalid_parameter_value\", `sample size must be between 0 and ${arr.items.length}`, \"22023\");\n }\n const items = [...arr.items];\n const out: Datum[] = [];\n for (let i = 0; i < n; i++) {\n const j = ctx.state.prng.nextInt(0, items.length - 1);\n out.push(items[j]!);\n items.splice(j, 1);\n }\n return tv(a.t, makeArray(arrayElemType(a.t), out));\n }),\n );\n\n return m;\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport { UNIX_EPOCH_MICROS_FROM_PG } from \"./datetime.ts\";\n\n/**\n * Time zone offset resolution. The engine pins the session default to UTC.\n * Fixed offsets and IANA names (via Intl) are supported; POSIX-style\n * `UTC+N` / `Etc/GMT+N` have inverted signs per POSIX.\n */\n\nconst intlCache = new Map<string, Intl.DateTimeFormat>();\n\nfunction intlFor(zone: string): Intl.DateTimeFormat | null {\n const cached = intlCache.get(zone);\n if (cached) return cached;\n try {\n const fmt = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: zone,\n timeZoneName: \"longOffset\",\n year: \"numeric\",\n });\n intlCache.set(zone, fmt);\n return fmt;\n } catch {\n return null;\n }\n}\n\n/** parse fixed offsets: \"+05\", \"-08:30\", \"05:30:10\" (east positive) */\nfunction parseFixedOffset(zone: string): number | null {\n const m = /^([+-]?)(\\d{1,2})(?::(\\d{2}))?(?::(\\d{2}))?$/.exec(zone.trim());\n if (!m) return null;\n const sign = m[1] === \"-\" ? -1 : 1;\n return sign * (Number(m[2]) * 3600 + Number(m[3] ?? 0) * 60 + Number(m[4] ?? 0));\n}\n\n/** POSIX style: UTC+5 / GMT-3 \u2192 sign inverted (west positive in POSIX) */\nfunction parsePosixOffset(zone: string): number | null {\n const m = /^(?:utc|gmt)([+-])(\\d{1,2})(?::(\\d{2}))?$/i.exec(zone.trim());\n if (!m) return null;\n const sign = m[1] === \"-\" ? 1 : -1;\n return sign * (Number(m[2]) * 3600 + Number(m[3] ?? 0) * 60);\n}\n\nfunction pgMicrosToUnixMs(utcMicros: bigint): number {\n return Number((utcMicros - UNIX_EPOCH_MICROS_FROM_PG) / 1000n);\n}\n\n/** Offset (seconds east of UTC) of `zone` at the given UTC instant. */\nexport function zoneOffsetAtUtc(zone: string, utcMicros: bigint): number {\n const z = zone.trim();\n const lower = z.toLowerCase();\n if (lower === \"utc\" || lower === \"gmt\" || lower === \"z\" || lower === \"zulu\" || lower === \"universal\") return 0;\n const posix = parsePosixOffset(z);\n if (posix !== null) return posix;\n const fixed = parseFixedOffset(z);\n if (fixed !== null) return fixed;\n const fmt = intlFor(z);\n if (fmt) {\n const ms = clampDateMs(pgMicrosToUnixMs(utcMicros));\n const parts = fmt.formatToParts(new Date(ms));\n const tzName = parts.find((p) => p.type === \"timeZoneName\")?.value ?? \"GMT\";\n const m = /GMT([+-])(\\d{2}):(\\d{2})(?::(\\d{2}))?/.exec(tzName);\n if (!m) return 0;\n const sign = m[1] === \"-\" ? -1 : 1;\n return sign * (Number(m[2]) * 3600 + Number(m[3]) * 60 + Number(m[4] ?? 0));\n }\n throw pgError(\"invalid_parameter_value\", `time zone \"${zone}\" not recognized`);\n}\n\nfunction clampDateMs(ms: number): number {\n const MAX = 8.64e15;\n return Math.max(-MAX, Math.min(MAX, ms));\n}\n\n/**\n * Offset for interpreting a naive local timestamp in `zone`\n * (two-pass refinement over {@link zoneOffsetAtUtc}).\n */\nexport function zoneOffsetForNaive(zone: string, naiveMicros: bigint): number {\n const first = zoneOffsetAtUtc(zone, naiveMicros);\n const second = zoneOffsetAtUtc(zone, naiveMicros - BigInt(first) * 1_000_000n);\n return second;\n}\n\n/** Validate a zone string (throws when unrecognized). */\nexport function validateZone(zone: string): void {\n zoneOffsetAtUtc(zone, 0n);\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport type { EngineCtx } from \"../expressions/context.ts\";\nimport { castTo } from \"../types/cast.ts\";\nimport {\n civilToDays,\n dayOfWeek,\n daysToCivil,\n formatInterval,\n type Interval,\n intervalTotalMicros,\n makeInterval,\n splitTs,\n TS_NEG_INF,\n TS_POS_INF,\n USECS_PER_DAY,\n USECS_PER_HOUR,\n USECS_PER_MIN,\n USECS_PER_SEC,\n} from \"../types/datetime.ts\";\nimport { isNumeric, numericToNumber } from \"../types/numeric.ts\";\nimport { zoneOffsetAtUtc, zoneOffsetForNaive } from \"../types/timezone.ts\";\nimport { datumFromText, type TypedValue, tv } from \"../types/value.ts\";\nimport {\n dateTruncDays,\n dateTruncInterval,\n dateTruncMicros,\n extractDatePart,\n isoWeek,\n justifyDays,\n justifyHours,\n justifyInterval,\n makeDateDatum,\n makeTimeDatum,\n numericSecondsToMicros,\n timestampAge,\n} from \"./datetime-fns.ts\";\nimport { argFloat, argInt, argNumeric, argText, type ScalarFn, strict } from \"./util.ts\";\n\nexport function getDatetimeFunctions(): Map<string, ScalarFn> {\n const m = new Map<string, ScalarFn>();\n\n m.set(\"now\", (ctx) => tv(\"timestamptz\", ctx.txNow));\n m.set(\"transaction_timestamp\", (ctx) => tv(\"timestamptz\", ctx.txNow));\n m.set(\"statement_timestamp\", (ctx) => tv(\"timestamptz\", ctx.stmtNow));\n m.set(\"clock_timestamp\", (ctx) => tv(\"timestamptz\", ctx.stmtNow));\n m.set(\"current_timestamp\", (ctx) => tv(\"timestamptz\", ctx.txNow));\n m.set(\"current_date\", (ctx) => {\n const offset = ctx.zoneOffsetAt(ctx.txNow);\n const local = ctx.txNow + BigInt(offset) * USECS_PER_SEC;\n return tv(\"date\", splitTs(local).days);\n });\n m.set(\"current_time\", (ctx) => {\n const offset = ctx.zoneOffsetAt(ctx.txNow);\n const local = ctx.txNow + BigInt(offset) * USECS_PER_SEC;\n return tv(\"timetz\", { micros: splitTs(local).tod, offsetSec: offset } as never);\n });\n m.set(\"localtimestamp\", (ctx) => {\n const offset = ctx.zoneOffsetAt(ctx.txNow);\n return tv(\"timestamp\", ctx.txNow + BigInt(offset) * USECS_PER_SEC);\n });\n m.set(\"localtime\", (ctx) => {\n const offset = ctx.zoneOffsetAt(ctx.txNow);\n const local = ctx.txNow + BigInt(offset) * USECS_PER_SEC;\n return tv(\"time\", splitTs(local).tod);\n });\n\n m.set(\n \"date_trunc\",\n strict(\"timestamp\", (ctx, args) => {\n const field = argText(ctx, args[0]!).toLowerCase();\n const src = args[1]!;\n if (src.t === \"interval\") return tv(\"interval\", dateTruncInterval(field, src.v as Interval));\n if (src.t === \"date\") {\n const days = src.v as number;\n return tv(\"timestamp\", BigInt(dateTruncDays(field, days)) * USECS_PER_DAY);\n }\n if (src.t === \"timestamptz\" || (src.t === \"unknown\" && args.length === 2)) {\n const cast = castTo(ctx, src, src.t === \"unknown\" ? \"timestamptz\" : \"timestamptz\", { explicit: true });\n const micros = cast.v as bigint;\n if (micros === TS_POS_INF || micros === TS_NEG_INF) return tv(\"timestamptz\", micros);\n const zone = args.length > 2 ? argText(ctx, args[2]!) : ctx.timezone();\n const offset = zoneOffsetAtUtc(zone, micros);\n const local = micros + BigInt(offset) * USECS_PER_SEC;\n const truncLocal = dateTruncMicros(field, local);\n const offset2 = zoneOffsetForNaive(zone, truncLocal);\n return tv(\"timestamptz\", truncLocal - BigInt(offset2) * USECS_PER_SEC);\n }\n const cast = castTo(ctx, src, \"timestamp\", { explicit: true });\n const micros = cast.v as bigint;\n if (micros === TS_POS_INF || micros === TS_NEG_INF) return tv(\"timestamp\", micros);\n return tv(\"timestamp\", dateTruncMicros(field, micros));\n }),\n );\n\n m.set(\n \"date_part\",\n strict(\"float8\", (ctx, args) => extractDatePart(ctx, argText(ctx, args[0]!), args[1]!, false)),\n );\n m.set(\n \"extract\",\n strict(\"numeric\", (ctx, args) => extractDatePart(ctx, argText(ctx, args[0]!), args[1]!, true)),\n );\n\n m.set(\n \"age\",\n strict(\"interval\", (ctx, args) => {\n if (args.length === 1) {\n const b = castTo(ctx, args[0]!, \"timestamp\", { explicit: true }).v as bigint;\n // age(x) = age(current_date::timestamp, x)\n const offset = ctx.zoneOffsetAt(ctx.txNow);\n const local = ctx.txNow + BigInt(offset) * USECS_PER_SEC;\n const midnight = BigInt(splitTs(local).days) * USECS_PER_DAY;\n return tv(\"interval\", timestampAge(midnight, b));\n }\n const a = castTo(ctx, args[0]!, \"timestamp\", { explicit: true }).v as bigint;\n const b = castTo(ctx, args[1]!, \"timestamp\", { explicit: true }).v as bigint;\n return tv(\"interval\", timestampAge(a, b));\n }),\n );\n\n m.set(\n \"make_date\",\n strict(\"date\", (ctx, args) => {\n const y = argInt(ctx, args[0]!);\n const mo = argInt(ctx, args[1]!);\n const d = argInt(ctx, args[2]!);\n return tv(\"date\", makeDateDatum(y, mo, d));\n }),\n );\n m.set(\n \"make_time\",\n strict(\"time\", (ctx, args) => {\n const h = argInt(ctx, args[0]!);\n const min = argInt(ctx, args[1]!);\n const sec = argFloat(ctx, args[2]!);\n return tv(\"time\", makeTimeDatum(h, min, sec));\n }),\n );\n m.set(\n \"make_timestamp\",\n strict(\"timestamp\", (ctx, args) => {\n const y = argInt(ctx, args[0]!);\n const mo = argInt(ctx, args[1]!);\n const d = argInt(ctx, args[2]!);\n const h = argInt(ctx, args[3]!);\n const min = argInt(ctx, args[4]!);\n const sec = argFloat(ctx, args[5]!);\n const days = makeDateDatum(y, mo, d);\n const tod = makeTimeDatum(h, min, sec);\n return tv(\"timestamp\", BigInt(days) * USECS_PER_DAY + tod);\n }),\n );\n m.set(\n \"make_timestamptz\",\n strict(\"timestamptz\", (ctx, args) => {\n const y = argInt(ctx, args[0]!);\n const mo = argInt(ctx, args[1]!);\n const d = argInt(ctx, args[2]!);\n const h = argInt(ctx, args[3]!);\n const min = argInt(ctx, args[4]!);\n const sec = argFloat(ctx, args[5]!);\n const days = makeDateDatum(y, mo, d);\n const tod = makeTimeDatum(h, min, sec);\n const naive = BigInt(days) * USECS_PER_DAY + tod;\n const zone = args.length > 6 ? argText(ctx, args[6]!) : ctx.timezone();\n const offset = zoneOffsetForNaive(zone, naive);\n return tv(\"timestamptz\", naive - BigInt(offset) * USECS_PER_SEC);\n }),\n );\n m.set(\"make_interval\", (ctx, args) => {\n // named-arg style not supported at parse level; positional: years, months, weeks, days, hours, mins, secs\n const get = (i: number): number => (args[i] === undefined || args[i]!.v === null ? 0 : argInt(ctx, args[i]!));\n if (args.some((a) => a.v === null)) return tv(\"interval\", null);\n const years = get(0);\n const months = get(1);\n const weeks = get(2);\n const days = get(3);\n const hours = get(4);\n const mins = get(5);\n const secs = args[6] === undefined ? 0 : argFloat(ctx, args[6]!);\n return tv(\n \"interval\",\n makeInterval(\n years * 12 + months,\n weeks * 7 + days,\n BigInt(hours) * USECS_PER_HOUR + BigInt(mins) * USECS_PER_MIN + BigInt(Math.round(secs * 1e6)),\n ),\n );\n });\n\n m.set(\n \"justify_hours\",\n strict(\"interval\", (_ctx, args) => tv(\"interval\", justifyHours(args[0]!.v as Interval))),\n );\n m.set(\n \"justify_days\",\n strict(\"interval\", (_ctx, args) => tv(\"interval\", justifyDays(args[0]!.v as Interval))),\n );\n m.set(\n \"justify_interval\",\n strict(\"interval\", (_ctx, args) => tv(\"interval\", justifyInterval(args[0]!.v as Interval))),\n );\n\n m.set(\n \"to_timestamp\",\n strict(\"timestamptz\", (ctx, args) => {\n if (args.length === 1) {\n const a = args[0]!;\n if (\n a.t === \"numeric\" ||\n a.t === \"float8\" ||\n a.t === \"float4\" ||\n a.t === \"int4\" ||\n a.t === \"int8\" ||\n a.t === \"int2\" ||\n a.t === \"unknown\"\n ) {\n const n = argNumeric(ctx, a);\n if (n.special === \"nan\") throw pgError(\"invalid_datetime\", \"timestamp cannot be NaN\", \"22008\");\n if (n.special === \"inf\") return tv(\"timestamptz\", TS_POS_INF);\n if (n.special === \"-inf\") return tv(\"timestamptz\", TS_NEG_INF);\n const micros = numericSecondsToMicros(n) - 946_684_800_000_000n;\n return tv(\"timestamptz\", micros);\n }\n }\n const input = argText(ctx, args[0]!);\n const fmt = argText(ctx, args[1]!);\n const f = parseByFormat(input, fmt);\n const frac = f.us > 0 ? `.${String(f.us).padStart(6, \"0\")}` : \"\";\n const iso = `${String(f.y).padStart(4, \"0\")}-${String(f.mo).padStart(2, \"0\")}-${String(f.d).padStart(2, \"0\")} ${String(f.h).padStart(2, \"0\")}:${String(f.mi).padStart(2, \"0\")}:${String(f.s).padStart(2, \"0\")}${frac}`;\n return tv(\"timestamptz\", datumFromText(\"timestamptz\", iso, ctx) as bigint);\n }),\n );\n\n m.set(\n \"timezone\",\n strict(\"timestamp\", (ctx, args) => {\n const zoneArg = args[0]!;\n const src = args[1]!;\n if (zoneArg.t === \"interval\") {\n const iv = zoneArg.v as Interval;\n const offsetSec = Number(intervalTotalMicros(iv) / USECS_PER_SEC);\n return timezoneConvertFixed(ctx, offsetSec, src);\n }\n const zone = argText(ctx, zoneArg);\n return timezoneConvert(ctx, zone, src);\n }),\n );\n\n m.set(\n \"date_bin\",\n strict(\"timestamp\", (ctx, args) => {\n const stride = args[0]!.v as Interval;\n const src = castTo(ctx, args[1]!, args[1]!.t === \"timestamptz\" ? \"timestamptz\" : \"timestamp\", { explicit: true });\n const origin = castTo(ctx, args[2]!, src.t, { explicit: true });\n if (stride.months !== 0) {\n throw pgError(\n \"feature_not_supported\",\n \"timestamps cannot be binned into intervals containing months or years\",\n \"0A000\",\n );\n }\n const strideMicros = BigInt(stride.days) * USECS_PER_DAY + stride.micros;\n if (strideMicros <= 0n) {\n throw pgError(\"invalid_parameter_value\", \"stride must be greater than zero\", \"22023\");\n }\n const s = src.v as bigint;\n const o = origin.v as bigint;\n const delta = s - o;\n let bins = delta / strideMicros;\n if (delta < 0n && delta % strideMicros !== 0n) bins -= 1n;\n return tv(src.t, o + bins * strideMicros);\n }),\n );\n\n m.set(\n \"to_char\",\n strict(\"text\", (ctx, args) => {\n const src = args[0]!;\n const fmt = argText(ctx, args[1]!);\n if (src.t === \"interval\") return tv(\"text\", toCharInterval(src.v as Interval, fmt));\n if (src.t === \"date\") {\n const days = src.v as number;\n return tv(\"text\", toCharTimestamp(ctx, BigInt(days) * USECS_PER_DAY, fmt, null));\n }\n if (src.t === \"timestamptz\") {\n const micros = src.v as bigint;\n const offset = ctx.zoneOffsetAt(micros);\n return tv(\"text\", toCharTimestamp(ctx, micros + BigInt(offset) * USECS_PER_SEC, fmt, offset));\n }\n if (src.t === \"timestamp\") {\n return tv(\"text\", toCharTimestamp(ctx, src.v as bigint, fmt, null));\n }\n if (src.t === \"time\") {\n return tv(\"text\", toCharTimestamp(ctx, src.v as bigint, fmt, null));\n }\n // numeric to_char\n return tv(\"text\", toCharNumeric(ctx, src, fmt));\n }),\n );\n\n m.set(\n \"to_date\",\n strict(\"date\", (ctx, args) => {\n const input = argText(ctx, args[0]!);\n const fmt = argText(ctx, args[1]!);\n const f = parseByFormat(input, fmt);\n return tv(\"date\", makeDateDatum(f.y, f.mo, f.d));\n }),\n );\n\n m.set(\n \"to_number\",\n strict(\"numeric\", (ctx, args) => {\n const input = argText(ctx, args[0]!);\n // subset: strip grouping/currency/space characters, keep digits, sign, decimal point\n const cleaned = input.replace(/[,\\s$]/g, \"\");\n const m2 = /^[+-]?\\d*(?:\\.\\d*)?/.exec(cleaned);\n if (!m2 || m2[0] === \"\" || m2[0] === \"+\" || m2[0] === \"-\") {\n throw pgError(\"invalid_text_representation\", `invalid input syntax for type numeric: \"${input}\"`, \"22P02\");\n }\n return castTo(ctx, tv(\"unknown\", m2[0]), \"numeric\", { explicit: true });\n }),\n );\n\n return m;\n}\n\nconst MONTH_NAMES = [\n \"january\",\n \"february\",\n \"march\",\n \"april\",\n \"may\",\n \"june\",\n \"july\",\n \"august\",\n \"september\",\n \"october\",\n \"november\",\n \"december\",\n];\n\n/** Minimal to_date/to_timestamp format parser: YYYY MM DD Mon Month HH24 HH12 MI SS MS US AM/PM. */\nfunction parseByFormat(\n input: string,\n fmt: string,\n): { y: number; mo: number; d: number; h: number; mi: number; s: number; us: number } {\n const res = { y: 1, mo: 1, d: 1, h: 0, mi: 0, s: 0, us: 0 };\n let pm: boolean | null = null;\n let i = 0;\n let j = 0;\n const skipInputSeparators = (): void => {\n while (i < input.length && /[^0-9A-Za-z]/.test(input[i]!)) i++;\n };\n const readNum = (maxLen: number): number => {\n skipInputSeparators();\n const start = i;\n while (i < input.length && /[0-9]/.test(input[i]!) && i - start < maxLen) i++;\n if (i === start) {\n throw pgError(\"invalid_datetime\", `invalid value for field in source string \"${input}\"`, \"22007\");\n }\n return Number(input.slice(start, i));\n };\n const readMonthName = (): number => {\n skipInputSeparators();\n const rest = input.slice(i).toLowerCase();\n for (let k = 0; k < MONTH_NAMES.length; k++) {\n const full = MONTH_NAMES[k]!;\n if (rest.startsWith(full)) {\n i += full.length;\n return k + 1;\n }\n if (rest.startsWith(full.slice(0, 3))) {\n i += 3;\n return k + 1;\n }\n }\n throw pgError(\"invalid_datetime\", `invalid value for month in source string \"${input}\"`, \"22007\");\n };\n const upperFmt = fmt.toUpperCase();\n while (j < fmt.length) {\n const rest = upperFmt.slice(j);\n if (rest.startsWith(\"FM\") || rest.startsWith(\"FX\")) {\n j += 2;\n } else if (rest.startsWith(\"YYYY\")) {\n res.y = readNum(4);\n j += 4;\n } else if (rest.startsWith(\"YY\")) {\n const v = readNum(2);\n res.y = v < 70 ? 2000 + v : 1900 + v;\n j += 2;\n } else if (rest.startsWith(\"MONTH\")) {\n res.mo = readMonthName();\n j += 5;\n } else if (rest.startsWith(\"MON\")) {\n res.mo = readMonthName();\n j += 3;\n } else if (rest.startsWith(\"MM\")) {\n res.mo = readNum(2);\n j += 2;\n } else if (rest.startsWith(\"DD\")) {\n res.d = readNum(2);\n j += 2;\n } else if (rest.startsWith(\"HH24\")) {\n res.h = readNum(2);\n j += 4;\n } else if (rest.startsWith(\"HH12\") || rest.startsWith(\"HH\")) {\n res.h = readNum(2);\n j += rest.startsWith(\"HH12\") ? 4 : 2;\n } else if (rest.startsWith(\"MI\")) {\n res.mi = readNum(2);\n j += 2;\n } else if (rest.startsWith(\"SS\")) {\n res.s = readNum(2);\n j += 2;\n } else if (rest.startsWith(\"MS\")) {\n res.us = readNum(3) * 1000;\n j += 2;\n } else if (rest.startsWith(\"US\")) {\n res.us = readNum(6);\n j += 2;\n } else if (rest.startsWith(\"A.M.\") || rest.startsWith(\"P.M.\")) {\n skipInputSeparators();\n pm = input\n .slice(i, i + 4)\n .toLowerCase()\n .startsWith(\"p\");\n i += 4;\n j += 4;\n } else if (rest.startsWith(\"AM\") || rest.startsWith(\"PM\")) {\n skipInputSeparators();\n pm = input\n .slice(i, i + 2)\n .toLowerCase()\n .startsWith(\"p\");\n i += 2;\n j += 2;\n } else {\n j++;\n }\n }\n if (pm !== null) {\n if (pm && res.h < 12) res.h += 12;\n if (!pm && res.h === 12) res.h = 0;\n }\n return res;\n}\n\n/** timezone(zone, ts): tz\u2192local timestamp; timestamp\u2192timestamptz interpreting in zone. */\nfunction timezoneConvert(ctx: EngineCtx, zone: string, src: TypedValue): TypedValue {\n if (src.t === \"timestamptz\" || src.t === \"unknown\") {\n const cast = castTo(ctx, src, \"timestamptz\", { explicit: true });\n const micros = cast.v as bigint;\n if (micros === TS_POS_INF || micros === TS_NEG_INF) return tv(\"timestamp\", micros);\n const offset = zoneOffsetAtUtc(zone, micros);\n return tv(\"timestamp\", micros + BigInt(offset) * USECS_PER_SEC);\n }\n if (src.t === \"timestamp\") {\n const micros = src.v as bigint;\n if (micros === TS_POS_INF || micros === TS_NEG_INF) return tv(\"timestamptz\", micros);\n const offset = zoneOffsetForNaive(zone, micros);\n return tv(\"timestamptz\", micros - BigInt(offset) * USECS_PER_SEC);\n }\n if (src.t === \"time\") {\n // time -> timetz using zone's current offset\n const offset = zoneOffsetAtUtc(zone, 0n);\n return tv(\"timetz\", { micros: src.v as bigint, offsetSec: offset } as never);\n }\n throw pgError(\"datatype_mismatch\", `function timezone(text, ${src.t}) does not exist`, \"42883\");\n}\n\nfunction timezoneConvertFixed(ctx: EngineCtx, offsetSec: number, src: TypedValue): TypedValue {\n if (src.t === \"timestamptz\" || src.t === \"unknown\") {\n const cast = castTo(ctx, src, \"timestamptz\", { explicit: true });\n return tv(\"timestamp\", (cast.v as bigint) + BigInt(offsetSec) * USECS_PER_SEC);\n }\n if (src.t === \"timestamp\") {\n return tv(\"timestamptz\", (src.v as bigint) - BigInt(offsetSec) * USECS_PER_SEC);\n }\n throw pgError(\"datatype_mismatch\", `function timezone(interval, ${src.t}) does not exist`, \"42883\");\n}\n\n// --- to_char ------------------------------------------------------------------\n\nconst MONTHS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\nconst DAYS = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n\nfunction toCharTimestamp(ctx: EngineCtx, localMicros: bigint, fmt: string, tzOffsetSec: number | null): string {\n void ctx;\n const { days, tod } = splitTs(localMicros);\n const { y, m, d } = daysToCivil(days);\n const hour24 = Number(tod / USECS_PER_HOUR);\n const minute = Number((tod / USECS_PER_MIN) % 60n);\n const second = Number((tod / USECS_PER_SEC) % 60n);\n const micros = Number(tod % USECS_PER_SEC);\n const hour12 = hour24 % 12 === 0 ? 12 : hour24 % 12;\n const dow = dayOfWeek(days);\n const doy = days - civilToDays(y, 1, 1) + 1;\n const iso = isoWeek(days);\n\n let out = \"\";\n let i = 0;\n const push = (s: string, fill: boolean): void => {\n out += s;\n void fill;\n };\n let fillMode = false;\n\n while (i < fmt.length) {\n const rest = fmt.slice(i);\n const tryPat = (pat: string): boolean => {\n if (rest.startsWith(pat)) {\n i += pat.length;\n return true;\n }\n return false;\n };\n if (tryPat(\"FM\")) {\n fillMode = !fillMode;\n continue;\n }\n if (tryPat('\"')) {\n // literal until closing quote\n let lit = \"\";\n while (i < fmt.length && fmt[i] !== '\"') {\n lit += fmt[i];\n i++;\n }\n i++;\n out += lit;\n continue;\n }\n const pad = (n: number, w: number): string => (fillMode ? String(n) : String(n).padStart(w, \"0\"));\n if (tryPat(\"HH24\")) push(pad(hour24, 2), fillMode);\n else if (tryPat(\"HH12\")) push(pad(hour12, 2), fillMode);\n else if (tryPat(\"HH\")) push(pad(hour12, 2), fillMode);\n else if (tryPat(\"MI\")) push(pad(minute, 2), fillMode);\n else if (tryPat(\"SSSS\") || tryPat(\"SSSSS\")) push(String(hour24 * 3600 + minute * 60 + second), fillMode);\n else if (tryPat(\"SS\")) push(pad(second, 2), fillMode);\n else if (tryPat(\"MS\")) push(String(Math.trunc(micros / 1000)).padStart(3, \"0\"), fillMode);\n else if (tryPat(\"US\")) push(String(micros).padStart(6, \"0\"), fillMode);\n else if (tryPat(\"AM\") || tryPat(\"PM\")) push(hour24 < 12 ? \"AM\" : \"PM\", fillMode);\n else if (tryPat(\"am\") || tryPat(\"pm\")) push(hour24 < 12 ? \"am\" : \"pm\", fillMode);\n else if (tryPat(\"A.M.\") || tryPat(\"P.M.\")) push(hour24 < 12 ? \"A.M.\" : \"P.M.\", fillMode);\n else if (tryPat(\"YYYY\")) push(fillMode ? String(y) : String(Math.abs(y)).padStart(4, \"0\"), fillMode);\n else if (tryPat(\"YYY\")) push(String(Math.abs(y) % 1000).padStart(3, \"0\"), fillMode);\n else if (tryPat(\"YY\")) push(String(Math.abs(y) % 100).padStart(2, \"0\"), fillMode);\n else if (tryPat(\"Y,YYY\")) push(commaYear(y), fillMode);\n else if (tryPat(\"Y\")) push(String(Math.abs(y) % 10), fillMode);\n else if (tryPat(\"IYYY\")) push(String(iso.year).padStart(4, \"0\"), fillMode);\n else if (tryPat(\"IW\")) push(pad(iso.week, 2), fillMode);\n else if (tryPat(\"MONTH\")) push(MONTHS[m - 1]!.toUpperCase().padEnd(fillMode ? 0 : 9), fillMode);\n else if (tryPat(\"Month\")) push(fillMode ? MONTHS[m - 1]! : MONTHS[m - 1]!.padEnd(9), fillMode);\n else if (tryPat(\"month\")) push((fillMode ? MONTHS[m - 1]! : MONTHS[m - 1]!.padEnd(9)).toLowerCase(), fillMode);\n else if (tryPat(\"MON\")) push(MONTHS[m - 1]!.slice(0, 3).toUpperCase(), fillMode);\n else if (tryPat(\"Mon\")) push(MONTHS[m - 1]!.slice(0, 3), fillMode);\n else if (tryPat(\"mon\")) push(MONTHS[m - 1]!.slice(0, 3).toLowerCase(), fillMode);\n else if (tryPat(\"MM\")) push(pad(m, 2), fillMode);\n else if (tryPat(\"DAY\")) push(DAYS[dow]!.toUpperCase().padEnd(fillMode ? 0 : 9), fillMode);\n else if (tryPat(\"Day\")) push(fillMode ? DAYS[dow]! : DAYS[dow]!.padEnd(9), fillMode);\n else if (tryPat(\"day\")) push((fillMode ? DAYS[dow]! : DAYS[dow]!.padEnd(9)).toLowerCase(), fillMode);\n else if (tryPat(\"DY\")) push(DAYS[dow]!.slice(0, 3).toUpperCase(), fillMode);\n else if (tryPat(\"Dy\")) push(DAYS[dow]!.slice(0, 3), fillMode);\n else if (tryPat(\"dy\")) push(DAYS[dow]!.slice(0, 3).toLowerCase(), fillMode);\n else if (tryPat(\"DDD\")) push(fillMode ? String(doy) : String(doy).padStart(3, \"0\"), fillMode);\n else if (tryPat(\"DD\")) push(pad(d, 2), fillMode);\n else if (tryPat(\"D\")) push(String(dow + 1), fillMode);\n else if (tryPat(\"WW\")) push(pad(Math.floor((doy - 1) / 7) + 1, 2), fillMode);\n else if (tryPat(\"W\")) push(String(Math.floor((d - 1) / 7) + 1), fillMode);\n else if (tryPat(\"Q\")) push(String(Math.floor((m - 1) / 3) + 1), fillMode);\n else if (tryPat(\"CC\")) push(String(Math.floor((y - 1) / 100) + 1).padStart(2, \"0\"), fillMode);\n else if (tryPat(\"J\")) push(String(days + 2451545), fillMode);\n else if (tryPat(\"BC\") || tryPat(\"AD\")) push(y > 0 ? \"AD\" : \"BC\", fillMode);\n else if (tryPat(\"bc\") || tryPat(\"ad\")) push(y > 0 ? \"ad\" : \"bc\", fillMode);\n else if (tryPat(\"TZ\")) push(tzOffsetSec === null ? \"\" : formatTzAbbrev(tzOffsetSec), fillMode);\n else if (tryPat(\"OF\")) push(tzOffsetSec === null ? \"+00\" : formatTzOf(tzOffsetSec), fillMode);\n else if (tryPat(\"TH\") || tryPat(\"th\")) {\n // ordinal suffix for the previous number\n const prev = /(\\d+)$/.exec(out);\n const n = prev ? Number.parseInt(prev[1]!, 10) : 0;\n const suffix = ordinalSuffix(n);\n out += rest.startsWith(\"TH\") ? suffix.toUpperCase() : suffix;\n } else {\n out += fmt[i];\n i++;\n }\n }\n return out;\n}\n\nfunction commaYear(y: number): string {\n const a = Math.abs(y);\n const thousands = Math.floor(a / 1000);\n const rem = a % 1000;\n return `${thousands},${String(rem).padStart(3, \"0\")}`;\n}\n\nfunction ordinalSuffix(n: number): string {\n const mod100 = n % 100;\n if (mod100 >= 11 && mod100 <= 13) return \"th\";\n switch (n % 10) {\n case 1:\n return \"st\";\n case 2:\n return \"nd\";\n case 3:\n return \"rd\";\n default:\n return \"th\";\n }\n}\n\nfunction formatTzOf(offsetSec: number): string {\n const sign = offsetSec >= 0 ? \"+\" : \"-\";\n const abs = Math.abs(offsetSec);\n const h = Math.floor(abs / 3600);\n const min = Math.floor((abs % 3600) / 60);\n return min === 0\n ? `${sign}${String(h).padStart(2, \"0\")}`\n : `${sign}${String(h).padStart(2, \"0\")}:${String(min).padStart(2, \"0\")}`;\n}\n\nfunction formatTzAbbrev(offsetSec: number): string {\n if (offsetSec === 0) return \"UTC\";\n return formatTzOf(offsetSec);\n}\n\nfunction toCharInterval(v: Interval, fmt: string): string {\n // reuse timestamp renderer on the interval's time part; day/month fields from months/days\n const totalMicros = v.micros;\n const hours = Number(totalMicros / USECS_PER_HOUR);\n const minutes = Number((totalMicros / USECS_PER_MIN) % 60n);\n const seconds = Number((totalMicros / USECS_PER_SEC) % 60n);\n let out = \"\";\n let i = 0;\n while (i < fmt.length) {\n const rest = fmt.slice(i);\n if (rest.startsWith(\"HH24\")) {\n out += String(hours).padStart(2, \"0\");\n i += 4;\n } else if (rest.startsWith(\"HH12\") || rest.startsWith(\"HH\")) {\n out += String(hours % 12 === 0 ? 12 : hours % 12).padStart(2, \"0\");\n i += rest.startsWith(\"HH12\") ? 4 : 2;\n } else if (rest.startsWith(\"MI\")) {\n out += String(minutes).padStart(2, \"0\");\n i += 2;\n } else if (rest.startsWith(\"SS\")) {\n out += String(seconds).padStart(2, \"0\");\n i += 2;\n } else if (rest.startsWith(\"DD\")) {\n out += String(v.days).padStart(2, \"0\");\n i += 2;\n } else if (rest.startsWith(\"MM\")) {\n out += String(v.months % 12).padStart(2, \"0\");\n i += 2;\n } else if (rest.startsWith(\"YYYY\")) {\n out += String(Math.trunc(v.months / 12)).padStart(4, \"0\");\n i += 4;\n } else {\n out += fmt[i];\n i++;\n }\n }\n void formatInterval;\n return out;\n}\n\nfunction toCharNumeric(ctx: EngineCtx, src: TypedValue, fmt: string): string {\n const n = argNumeric(ctx, src);\n const isNeg = n.coef < 0n || n.special === \"-inf\";\n const absText = isNumeric(n) ? numericAbsText(n) : \"0\";\n void numericToNumber;\n\n // parse format: count digit positions before/after decimal point\n const fm = fmt.includes(\"FM\");\n const clean = fmt.replaceAll(\"FM\", \"\");\n const dotIdx = clean.search(/[.D]/);\n const intFmt = dotIdx === -1 ? clean : clean.slice(0, dotIdx);\n const fracFmt = dotIdx === -1 ? \"\" : clean.slice(dotIdx + 1);\n const fracDigits = (fracFmt.match(/[09]/g) ?? []).length;\n\n const [intPartRaw, fracPartRaw = \"\"] = absText.split(\".\");\n let fracPart = fracPartRaw.slice(0, fracDigits).padEnd(fracDigits, \"0\");\n if (fracPartRaw.length > fracDigits && fracDigits >= 0) {\n // round\n const scaled = `${intPartRaw}${fracPartRaw}`;\n void scaled;\n const roundedNum = roundDecimalText(absText, fracDigits);\n const [ip, fp = \"\"] = roundedNum.split(\".\");\n fracPart = fp.padEnd(fracDigits, \"0\");\n return assembleToChar(ip!, fracPart, intFmt, fracFmt, isNeg, fm, clean);\n }\n return assembleToChar(intPartRaw!, fracPart, intFmt, fracFmt, isNeg, fm, clean);\n}\n\nfunction numericAbsText(n: { coef: bigint; dscale: number; special: string | null }): string {\n if (n.special === \"nan\") return \"NaN\";\n if (n.special) return \"Infinity\";\n const abs = n.coef < 0n ? -n.coef : n.coef;\n const s = abs.toString().padStart(n.dscale + 1, \"0\");\n if (n.dscale === 0) return s;\n return `${s.slice(0, -n.dscale)}.${s.slice(-n.dscale)}`;\n}\n\nfunction roundDecimalText(text: string, digits: number): string {\n const [ip = \"0\", fp = \"\"] = text.split(\".\");\n if (fp.length <= digits) return text;\n const keep = fp.slice(0, digits);\n const nextDigit = Number(fp[digits] ?? \"0\");\n let coef = BigInt(ip + keep);\n if (nextDigit >= 5) coef += 1n;\n const s = coef.toString().padStart(digits + 1, \"0\");\n if (digits === 0) return s;\n return `${s.slice(0, -digits)}.${s.slice(-digits)}`;\n}\n\nfunction assembleToChar(\n intPart: string,\n fracPart: string,\n intFmt: string,\n fracFmt: string,\n isNeg: boolean,\n fm: boolean,\n fullFmt: string,\n): string {\n const groups = intFmt.includes(\",\") || intFmt.includes(\"G\");\n const intDigitsAvail = (intFmt.match(/[09]/g) ?? []).length;\n let intStr = intPart.replace(/^0+(?=\\d)/, \"\");\n if (intStr.length > intDigitsAvail) {\n // overflow -> hash marks\n const width = fullFmt.replace(/[^09.,DG]/g, \"\").length + 1;\n return \"#\".repeat(Math.max(width, 1));\n }\n if (groups) {\n intStr = addThousands(intStr);\n }\n // zero-pad according to '0' positions\n const zeroPad = intFmt.indexOf(\"0\");\n if (zeroPad !== -1 && !fm) {\n const minDigits = (intFmt.slice(zeroPad).match(/[09]/g) ?? []).length;\n const digitsOnly = intStr.replaceAll(\",\", \"\");\n if (digitsOnly.length < minDigits) {\n const padded = digitsOnly.padStart(minDigits, \"0\");\n intStr = groups ? addThousands(padded) : padded;\n }\n }\n if (intStr === \"\" && (fracFmt === \"\" || fracPart === \"\")) intStr = \"0\";\n if (intStr === \"\" && intFmt.includes(\"9\") && !fm) intStr = \"0\";\n\n let body = intStr;\n if (fracFmt !== \"\") {\n let frac = fracPart;\n if (fm) frac = frac.replace(/0+$/, \"\");\n body = frac === \"\" && fm ? intStr : `${intStr}.${frac}`;\n }\n\n const hasMinusCap =\n fullFmt.includes(\"MI\") || fullFmt.includes(\"S\") || fullFmt.includes(\"PL\") || fullFmt.includes(\"SG\");\n let result: string;\n if (fullFmt.includes(\"MI\")) {\n result = body + (isNeg ? \"-\" : fm ? \"\" : \" \");\n } else if (fullFmt.includes(\"S\")) {\n result = (isNeg ? \"-\" : \"+\") + body;\n } else {\n result = (isNeg ? \"-\" : fm ? \"\" : \" \") + body;\n }\n void hasMinusCap;\n return result;\n}\n\nfunction addThousands(digits: string): string {\n let out = \"\";\n for (let i = 0; i < digits.length; i++) {\n const fromEnd = digits.length - i;\n out += digits[i];\n if (fromEnd > 1 && (fromEnd - 1) % 3 === 0) out += \",\";\n }\n return out;\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport type { EngineCtx } from \"../expressions/context.ts\";\nimport { castTo } from \"../types/cast.ts\";\nimport {\n JSONB_NULL,\n type JsonbValue,\n jsonbArr,\n jsonbBool,\n jsonbCompactText,\n jsonbNum,\n jsonbObj,\n jsonbStr,\n jsonbText,\n parseJsonText,\n validateJsonText,\n} from \"../types/jsonb.ts\";\nimport { type Numeric, numericFromBigInt, numericFromNumber } from \"../types/numeric.ts\";\nimport {\n arrayElemType,\n type Datum,\n datumFromText,\n isArrayType,\n isJsonbWrap,\n isPgArray,\n isPgRecord,\n type JsonbWrap,\n type PgArray,\n type PgRecord,\n type TypedValue,\n type TypeId,\n tv,\n UNKNOWN,\n UTC_INPUT,\n wrapJsonb,\n} from \"../types/value.ts\";\nimport { argText, type ScalarFn, strict } from \"./util.ts\";\n\n/** Convert an engine Datum to a JsonbValue tree (to_jsonb / jsonb_build_*). */\nexport function datumToJsonb(ctx: EngineCtx, t: TypeId, v: Datum): JsonbValue {\n if (v === null) return JSONB_NULL;\n if (isJsonbWrap(v)) return v.value;\n switch (t) {\n case \"bool\":\n return jsonbBool(v as boolean);\n case \"int2\":\n case \"int4\":\n return jsonbNum(numericFromBigInt(BigInt(v as number)));\n case \"int8\":\n return jsonbNum(numericFromBigInt(v as bigint));\n case \"numeric\":\n return jsonbNum(v as Numeric);\n case \"float4\":\n case \"float8\": {\n const f = v as number;\n if (!Number.isFinite(f)) {\n throw pgError(\"invalid_text_representation\", \"cannot convert non-finite float to jsonb\", \"22P02\");\n }\n return jsonbNum(numericFromNumber(f));\n }\n case \"json\": {\n return parseJsonText(v as string);\n }\n default:\n break;\n }\n if (isArrayType(t)) {\n const arr = v as PgArray;\n const elem = arrayElemType(t);\n return jsonbArr(arr.items.map((item) => datumToJsonb(ctx, elem, item)));\n }\n if (isPgRecord(v)) {\n const rec = v as PgRecord;\n const entries: Array<[string, JsonbValue]> = rec.values.map((f, i) => [\n rec.names?.[i] ?? `f${i + 1}`,\n datumToJsonb(ctx, rec.types[i]!, f),\n ]);\n return jsonbObj(entries);\n }\n // everything else renders through its text output\n const text = castTo(ctx, tv(t, v), \"text\", { explicit: true }).v as string;\n return jsonbStr(text);\n}\n\nfunction jsonArg(_ctx: EngineCtx, a: TypedValue): JsonbValue {\n if (a.t === \"jsonb\" || isJsonbWrap(a.v)) return (a.v as JsonbWrap).value;\n if (a.t === \"json\" || a.t === UNKNOWN || a.t === \"text\") {\n return parseJsonText(a.v as string);\n }\n throw pgError(\"datatype_mismatch\", `cannot use type ${a.t} as json`);\n}\n\nfunction _isJsonType(a: TypedValue): boolean {\n return a.t === \"json\";\n}\n\n/** Render a JsonbValue as `json` text (preserves nothing \u2014 we canonicalize like jsonb). */\nfunction outJson(v: JsonbValue): TypedValue {\n return tv(\"json\", jsonbCompactText(v));\n}\n\nfunction outJsonb(v: JsonbValue): TypedValue {\n return tv(\"jsonb\", wrapJsonb(v));\n}\n\nexport function getJsonFunctions(): Map<string, ScalarFn> {\n const m = new Map<string, ScalarFn>();\n\n m.set(\n \"to_json\",\n strict(\"json\", (ctx, args) => outJson(datumToJsonb(ctx, args[0]!.t, args[0]!.v))),\n );\n m.set(\n \"to_jsonb\",\n strict(\"jsonb\", (ctx, args) => outJsonb(datumToJsonb(ctx, args[0]!.t, args[0]!.v))),\n );\n m.set(\n \"row_to_json\",\n strict(\"json\", (ctx, args) => outJson(datumToJsonb(ctx, args[0]!.t, args[0]!.v))),\n );\n m.set(\n \"array_to_json\",\n strict(\"json\", (ctx, args) => outJson(datumToJsonb(ctx, args[0]!.t, args[0]!.v))),\n );\n\n // json_build_* renders with PG's `json_build` spacing at the top level: `[1, 2]`, `{\"a\" : 1}`.\n m.set(\"json_build_array\", (ctx, args) =>\n tv(\"json\", `[${args.map((a) => jsonbCompactText(datumToJsonb(ctx, a.t, a.v))).join(\", \")}]`),\n );\n m.set(\"jsonb_build_array\", (ctx, args) => outJsonb(jsonbArr(args.map((a) => datumToJsonb(ctx, a.t, a.v)))));\n m.set(\"json_build_object\", (ctx, args) => tv(\"json\", buildSpacedObjectText(buildObject(ctx, args))));\n m.set(\"jsonb_build_object\", (ctx, args) => outJsonb(buildObject(ctx, args)));\n\n m.set(\n \"json_object\",\n strict(\"json\", (ctx, args) => tv(\"json\", buildSpacedObjectText(jsonObjectFromArrays(ctx, args)))),\n );\n m.set(\n \"jsonb_object\",\n strict(\"jsonb\", (ctx, args) => outJsonb(jsonObjectFromArrays(ctx, args))),\n );\n\n const typeofFn = strict(\"text\", (ctx: EngineCtx, args: TypedValue[]) => {\n const v = jsonArg(ctx, args[0]!);\n switch (v.j) {\n case \"null\":\n return tv(\"text\", \"null\");\n case \"bool\":\n return tv(\"text\", \"boolean\");\n case \"num\":\n return tv(\"text\", \"number\");\n case \"str\":\n return tv(\"text\", \"string\");\n case \"arr\":\n return tv(\"text\", \"array\");\n case \"obj\":\n return tv(\"text\", \"object\");\n }\n });\n m.set(\"json_typeof\", typeofFn);\n m.set(\"jsonb_typeof\", typeofFn);\n\n m.set(\n \"json_array_length\",\n strict(\"int4\", (ctx, args) => {\n const v = jsonArg(ctx, args[0]!);\n if (v.j !== \"arr\") {\n throw pgError(\"invalid_parameter_value\", `cannot get array length of a non-array`, \"22023\");\n }\n return tv(\"int4\", v.v.length);\n }),\n );\n m.set(\"jsonb_array_length\", m.get(\"json_array_length\")!);\n\n m.set(\n \"jsonb_pretty\",\n strict(\"text\", (ctx, args) => {\n const v = jsonArg(ctx, args[0]!);\n return tv(\"text\", prettyJsonb(v, 0));\n }),\n );\n\n const extractPath = (asText: boolean, jsonOut: boolean): ScalarFn =>\n strict(asText ? \"text\" : jsonOut ? \"json\" : \"jsonb\", (ctx, args) => {\n let current: JsonbValue | null = jsonArg(ctx, args[0]!);\n for (const pathArg of args.slice(1)) {\n if (current === null) break;\n const key = argText(ctx, pathArg);\n if (current.j === \"obj\") {\n current = current.v.get(key) ?? null;\n } else if (current.j === \"arr\") {\n const idx = Number.parseInt(key, 10);\n if (Number.isNaN(idx)) {\n current = null;\n } else {\n const arr: JsonbValue[] = current.v;\n const i: number = idx < 0 ? arr.length + idx : idx;\n current = arr[i] ?? null;\n }\n } else {\n current = null;\n }\n }\n if (current === null) return tv(asText ? \"text\" : jsonOut ? \"json\" : \"jsonb\", null);\n if (asText) {\n if (current.j === \"null\") return tv(\"text\", null);\n if (current.j === \"str\") return tv(\"text\", current.v);\n return tv(\"text\", jsonbCompactText(current));\n }\n return jsonOut ? outJson(current) : outJsonb(current);\n });\n m.set(\"json_extract_path\", extractPath(false, true));\n m.set(\"jsonb_extract_path\", extractPath(false, false));\n m.set(\"json_extract_path_text\", extractPath(true, true));\n m.set(\"jsonb_extract_path_text\", extractPath(true, false));\n\n m.set(\n \"jsonb_set\",\n strict(\"jsonb\", (ctx, args) => {\n const target = jsonArg(ctx, args[0]!);\n const path = pathTexts(args[1]!);\n const newValue = jsonArg(ctx, args[2]!);\n const createMissing = args.length > 3 ? (castTo(ctx, args[3]!, \"bool\", {}).v as boolean) : true;\n return outJsonb(jsonbSetPath(target, path, newValue, createMissing, \"set\"));\n }),\n );\n m.set(\"jsonb_set_lax\", (ctx, args) => {\n if (args[0]!.v === null || args[1]!.v === null) return tv(\"jsonb\", null);\n const treatment = args.length > 4 && args[4]!.v !== null ? argText(ctx, args[4]!) : \"use_json_null\";\n if (args[2]!.v === null) {\n const target = jsonArg(ctx, args[0]!);\n const path = pathTexts(args[1]!);\n const createMissing =\n args.length > 3 && args[3]!.v !== null ? (castTo(ctx, args[3]!, \"bool\", {}).v as boolean) : true;\n switch (treatment) {\n case \"use_json_null\":\n return outJsonb(jsonbSetPath(target, path, JSONB_NULL, createMissing, \"set\"));\n case \"delete_key\":\n return outJsonb(jsonbSetPath(target, path, JSONB_NULL, false, \"delete\"));\n case \"return_target\":\n return outJsonb(target);\n case \"raise_exception\":\n throw pgError(\"null_value_not_allowed\", \"JSON value must not be null\", \"22004\");\n default:\n throw pgError(\n \"invalid_parameter_value\",\n `null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"`,\n );\n }\n }\n return m.get(\"jsonb_set\")!(ctx, args.slice(0, 4));\n });\n m.set(\n \"jsonb_insert\",\n strict(\"jsonb\", (ctx, args) => {\n const target = jsonArg(ctx, args[0]!);\n const path = pathTexts(args[1]!);\n const newValue = jsonArg(ctx, args[2]!);\n const after = args.length > 3 ? (castTo(ctx, args[3]!, \"bool\", {}).v as boolean) : false;\n return outJsonb(jsonbInsertPath(target, path, newValue, after));\n }),\n );\n m.set(\n \"jsonb_strip_nulls\",\n strict(\"jsonb\", (ctx, args) => outJsonb(stripNulls(jsonArg(ctx, args[0]!)))),\n );\n m.set(\n \"json_strip_nulls\",\n strict(\"json\", (ctx, args) => outJson(stripNulls(jsonArg(ctx, args[0]!)))),\n );\n\n m.set(\n \"jsonb_object_keys_check\",\n strict(\"bool\", () => tv(\"bool\", true)),\n );\n\n m.set(\n \"json_is_valid_check\",\n strict(\"bool\", (ctx, args) => {\n try {\n validateJsonText(argText(ctx, args[0]!));\n return tv(\"bool\", true);\n } catch {\n return tv(\"bool\", false);\n }\n }),\n );\n\n return m;\n}\n\n/** json_build_object / json_object output spacing: `{\"a\" : 1, \"b\" : 2}`. */\nfunction buildSpacedObjectText(obj: JsonbValue): string {\n if (obj.j !== \"obj\") return jsonbCompactText(obj);\n const body = [...obj.v.entries()].map(([k, x]) => `${JSON.stringify(k)} : ${jsonbCompactText(x)}`).join(\", \");\n return `{${body}}`;\n}\n\nfunction buildObject(ctx: EngineCtx, args: TypedValue[]): JsonbValue {\n if (args.length % 2 !== 0) {\n throw pgError(\"invalid_parameter_value\", \"argument list must have even number of elements\", \"22023\");\n }\n const entries: Array<[string, JsonbValue]> = [];\n for (let i = 0; i < args.length; i += 2) {\n const k = args[i]!;\n if (k.v === null) {\n throw pgError(\"invalid_parameter_value\", \"argument 1: key must not be null\", \"22004\");\n }\n const key = castTo(ctx, k, \"text\", { explicit: true }).v as string;\n entries.push([key, datumToJsonb(ctx, args[i + 1]!.t, args[i + 1]!.v)]);\n }\n return jsonbObj(entries);\n}\n\nfunction jsonObjectFromArrays(_ctx: EngineCtx, args: TypedValue[]): JsonbValue {\n if (args.length === 1) {\n const arr = args[0]!.v as PgArray;\n if (arr.dims.length === 2) {\n const entries: Array<[string, JsonbValue]> = [];\n for (let i = 0; i < arr.items.length; i += 2) {\n const k = arr.items[i];\n if (k === null || k === undefined)\n throw pgError(\"null_value_not_allowed\", \"null value not allowed for object key\", \"22004\");\n entries.push([String(k), arr.items[i + 1] == null ? JSONB_NULL : jsonbStr(String(arr.items[i + 1]))]);\n }\n return jsonbObj(entries);\n }\n if (arr.items.length % 2 !== 0) {\n throw pgError(\"invalid_parameter_value\", \"array must have even number of elements\", \"22023\");\n }\n const entries: Array<[string, JsonbValue]> = [];\n for (let i = 0; i < arr.items.length; i += 2) {\n const k = arr.items[i];\n if (k === null) throw pgError(\"null_value_not_allowed\", \"null value not allowed for object key\", \"22004\");\n entries.push([String(k), arr.items[i + 1] == null ? JSONB_NULL : jsonbStr(String(arr.items[i + 1]))]);\n }\n return jsonbObj(entries);\n }\n const keys = args[0]!.v as PgArray;\n const values = args[1]!.v as PgArray;\n if (keys.items.length !== values.items.length) {\n throw pgError(\"invalid_parameter_value\", \"mismatched array dimensions\", \"22023\");\n }\n const entries: Array<[string, JsonbValue]> = [];\n for (let i = 0; i < keys.items.length; i++) {\n const k = keys.items[i];\n if (k === null) throw pgError(\"null_value_not_allowed\", \"null value not allowed for object key\", \"22004\");\n entries.push([String(k), values.items[i] == null ? JSONB_NULL : jsonbStr(String(values.items[i]))]);\n }\n return jsonbObj(entries);\n}\n\nfunction pathTexts(pathArg: TypedValue): string[] {\n // untyped literals ('{a,b}') arrive as strings; parse them as text[]\n const v = isPgArray(pathArg.v) ? pathArg.v : (datumFromText(\"text[]\", String(pathArg.v), UTC_INPUT) as PgArray);\n return v.items.map((i) => {\n if (i === null) throw pgError(\"null_value_not_allowed\", \"path element cannot be null\", \"22004\");\n return String(i);\n });\n}\n\nfunction jsonbSetPath(\n target: JsonbValue,\n path: string[],\n newValue: JsonbValue,\n createMissing: boolean,\n mode: \"set\" | \"delete\",\n): JsonbValue {\n if (path.length === 0) return target;\n const [head, ...rest] = path as [string, ...string[]];\n if (target.j === \"obj\") {\n const map = new Map(target.v);\n const exists = map.has(head);\n if (rest.length === 0) {\n if (mode === \"delete\") {\n map.delete(head);\n } else if (exists || createMissing) {\n map.set(head, newValue);\n }\n } else {\n const child = map.get(head);\n if (child !== undefined) {\n map.set(head, jsonbSetPath(child, rest, newValue, createMissing, mode));\n }\n }\n return jsonbObj(map.entries());\n }\n if (target.j === \"arr\") {\n const idx = Number.parseInt(head, 10);\n if (Number.isNaN(idx)) {\n throw pgError(\"invalid_text_representation\", `path element at position 1 is not an integer: \"${head}\"`, \"22P02\");\n }\n const items = [...target.v];\n let i = idx < 0 ? items.length + idx : idx;\n if (rest.length === 0) {\n if (mode === \"delete\") {\n if (i >= 0 && i < items.length) items.splice(i, 1);\n } else if (i >= 0 && i < items.length) {\n items[i] = newValue;\n } else if (createMissing) {\n if (i < 0) items.unshift(newValue);\n else items.push(newValue);\n }\n } else {\n if (i < 0) i = 0;\n if (i < items.length) items[i] = jsonbSetPath(items[i]!, rest, newValue, createMissing, mode);\n }\n return jsonbArr(items);\n }\n throw pgError(\"invalid_parameter_value\", `cannot set path in scalar`, \"22023\");\n}\n\nfunction jsonbInsertPath(target: JsonbValue, path: string[], newValue: JsonbValue, after: boolean): JsonbValue {\n if (path.length === 0) return target;\n const [head, ...rest] = path as [string, ...string[]];\n if (target.j === \"obj\") {\n const map = new Map(target.v);\n if (rest.length === 0) {\n if (map.has(head)) {\n throw pgError(\"invalid_parameter_value\", \"cannot replace existing key\", \"22023\");\n }\n map.set(head, newValue);\n } else {\n const child = map.get(head);\n if (child !== undefined) map.set(head, jsonbInsertPath(child, rest, newValue, after));\n }\n return jsonbObj(map.entries());\n }\n if (target.j === \"arr\") {\n const idx = Number.parseInt(head, 10);\n if (Number.isNaN(idx)) {\n throw pgError(\"invalid_text_representation\", `path element at position 1 is not an integer: \"${head}\"`, \"22P02\");\n }\n const items = [...target.v];\n let i = idx < 0 ? items.length + idx : idx;\n if (rest.length === 0) {\n if (i < 0) i = 0;\n if (i > items.length) i = items.length;\n items.splice(after ? i + 1 : i, 0, newValue);\n } else {\n if (i >= 0 && i < items.length) items[i] = jsonbInsertPath(items[i]!, rest, newValue, after);\n }\n return jsonbArr(items);\n }\n throw pgError(\"invalid_parameter_value\", \"cannot insert path in scalar\", \"22023\");\n}\n\nfunction stripNulls(v: JsonbValue): JsonbValue {\n if (v.j === \"obj\") {\n const entries: Array<[string, JsonbValue]> = [];\n for (const [k, val] of v.v) {\n if (val.j === \"null\") continue;\n entries.push([k, stripNulls(val)]);\n }\n return jsonbObj(entries);\n }\n if (v.j === \"arr\") return jsonbArr(v.v.map(stripNulls));\n return v;\n}\n\nfunction prettyJsonb(v: JsonbValue, indent: number): string {\n const pad = \" \".repeat(indent);\n const padIn = \" \".repeat(indent + 1);\n switch (v.j) {\n case \"obj\": {\n if (v.v.size === 0) return \"{}\";\n const parts: string[] = [];\n for (const [k, val] of v.v) {\n parts.push(`${padIn}${JSON.stringify(k)}: ${prettyJsonb(val, indent + 1)}`);\n }\n return `{\\n${parts.join(\",\\n\")}\\n${pad}}`;\n }\n case \"arr\": {\n if (v.v.length === 0) return \"[]\";\n const parts = v.v.map((item) => `${padIn}${prettyJsonb(item, indent + 1)}`);\n return `[\\n${parts.join(\",\\n\")}\\n${pad}]`;\n }\n default:\n return jsonbText(v);\n }\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport { castTo, isNumericType } from \"../types/cast.ts\";\nimport {\n isNumeric,\n makeNumeric,\n type Numeric,\n numericAbs,\n numericCeil,\n numericCmp,\n numericDivScaled,\n numericDivTrunc,\n numericExp,\n numericFloor,\n numericFromBigInt,\n numericLn,\n numericLog10,\n numericLogBase,\n numericMod,\n numericMul,\n numericPower,\n numericRound,\n numericSign,\n numericSqrt,\n numericStripTrailingZeros,\n numericSub,\n numericToBigInt,\n numericTrunc,\n} from \"../types/numeric.ts\";\nimport { checkInt2, checkInt4, checkInt8, type TypedValue, tv } from \"../types/value.ts\";\nimport { argFloat, argInt, argNumeric, type ScalarFn, strict } from \"./util.ts\";\n\nfunction isFloatArg(v: TypedValue): boolean {\n return v.t === \"float4\" || v.t === \"float8\";\n}\n\nfunction isIntType(t: string): boolean {\n return t === \"int2\" || t === \"int4\" || t === \"int8\";\n}\n\nfunction checkFloat(v: number, _op: string): number {\n if (Number.isNaN(v)) return v;\n if (!Number.isFinite(v)) return v;\n return v;\n}\n\nfunction floatErr(v: number, allowInf: boolean): number {\n if (!allowInf && !Number.isFinite(v) && !Number.isNaN(v)) {\n throw pgError(\"numeric_value_out_of_range\", \"value out of range: overflow\");\n }\n return v;\n}\n\nexport function getMathFunctions(): Map<string, ScalarFn> {\n const m = new Map<string, ScalarFn>();\n\n m.set(\n \"abs\",\n strict(\"numeric\", (ctx, args) => {\n const a = args[0]!;\n switch (a.t) {\n case \"int2\":\n return tv(\"int2\", checkInt2(Math.abs(a.v as number)));\n case \"int4\":\n return tv(\"int4\", checkInt4(Math.abs(a.v as number)));\n case \"int8\": {\n const v = a.v as bigint;\n return tv(\"int8\", checkInt8(v < 0n ? -v : v));\n }\n case \"float4\":\n return tv(\"float4\", Math.abs(a.v as number));\n case \"float8\":\n return tv(\"float8\", Math.abs(a.v as number));\n default:\n return tv(\"numeric\", numericAbs(argNumeric(ctx, a)));\n }\n }),\n );\n\n const ceilFn = strict(\"numeric\", (ctx: Parameters<ScalarFn>[0], args: TypedValue[]) => {\n const a = args[0]!;\n if (isFloatArg(a)) return tv(\"float8\", Math.ceil(argFloat(ctx, a)));\n if (isIntType(a.t)) return tv(a.t, a.v);\n return tv(\"numeric\", numericCeil(argNumeric(ctx, a)));\n });\n m.set(\"ceil\", ceilFn);\n m.set(\"ceiling\", ceilFn);\n m.set(\n \"floor\",\n strict(\"numeric\", (ctx, args) => {\n const a = args[0]!;\n if (isFloatArg(a)) return tv(\"float8\", Math.floor(argFloat(ctx, a)));\n if (isIntType(a.t)) return tv(a.t, a.v);\n return tv(\"numeric\", numericFloor(argNumeric(ctx, a)));\n }),\n );\n m.set(\n \"round\",\n strict(\"numeric\", (ctx, args) => {\n const a = args[0]!;\n if (args.length === 1) {\n if (isFloatArg(a)) {\n // PG float round: round-half-away-from-zero\n const f = argFloat(ctx, a);\n const r = f >= 0 ? Math.round(f) : -Math.round(-f);\n return tv(\"float8\", Object.is(r, -0) ? 0 : r);\n }\n if (isIntType(a.t)) return tv(a.t, a.v);\n return tv(\"numeric\", numericRound(argNumeric(ctx, a), 0));\n }\n const s = argInt(ctx, args[1]!);\n return tv(\"numeric\", numericRound(argNumeric(ctx, a), s));\n }),\n );\n m.set(\n \"trunc\",\n strict(\"numeric\", (ctx, args) => {\n const a = args[0]!;\n if (args.length === 1) {\n if (isFloatArg(a)) return tv(\"float8\", Math.trunc(argFloat(ctx, a)));\n if (isIntType(a.t)) return tv(a.t, a.v);\n return tv(\"numeric\", numericTrunc(argNumeric(ctx, a), 0));\n }\n const s = argInt(ctx, args[1]!);\n return tv(\"numeric\", numericTrunc(argNumeric(ctx, a), s));\n }),\n );\n m.set(\n \"sign\",\n strict(\"numeric\", (ctx, args) => {\n const a = args[0]!;\n if (isFloatArg(a)) {\n const f = argFloat(ctx, a);\n return tv(\"float8\", f > 0 ? 1 : f < 0 ? -1 : Number.isNaN(f) ? Number.NaN : 0);\n }\n return tv(\"numeric\", numericFromBigInt(BigInt(numericSign(argNumeric(ctx, a)))));\n }),\n );\n m.set(\n \"sqrt\",\n strict(\"numeric\", (ctx, args) => {\n const a = args[0]!;\n if (isFloatArg(a)) {\n const f = argFloat(ctx, a);\n if (f < 0)\n throw pgError(\"invalid_argument_for_power_function\", \"cannot take square root of a negative number\", \"2201F\");\n return tv(\"float8\", Math.sqrt(f));\n }\n return tv(\"numeric\", numericSqrt(argNumeric(ctx, a)));\n }),\n );\n m.set(\n \"cbrt\",\n strict(\"float8\", (ctx, args) => tv(\"float8\", Math.cbrt(argFloat(ctx, args[0]!)))),\n );\n m.set(\n \"exp\",\n strict(\"numeric\", (ctx, args) => {\n const a = args[0]!;\n if (isFloatArg(a)) return tv(\"float8\", floatErr(Math.exp(argFloat(ctx, a)), true));\n return tv(\"numeric\", numericExp(argNumeric(ctx, a)));\n }),\n );\n m.set(\n \"ln\",\n strict(\"numeric\", (ctx, args) => {\n const a = args[0]!;\n if (isFloatArg(a)) {\n const f = argFloat(ctx, a);\n if (f === 0) throw pgError(\"invalid_argument_for_log\", \"cannot take logarithm of zero\", \"2201E\");\n if (f < 0) throw pgError(\"invalid_argument_for_log\", \"cannot take logarithm of a negative number\", \"2201E\");\n return tv(\"float8\", Math.log(f));\n }\n return tv(\"numeric\", numericLn(argNumeric(ctx, a)));\n }),\n );\n m.set(\n \"log\",\n strict(\"numeric\", (ctx, args) => {\n if (args.length === 2) {\n const base = argNumeric(ctx, args[0]!);\n const x = argNumeric(ctx, args[1]!);\n return tv(\"numeric\", numericLogBase(base, x));\n }\n const a = args[0]!;\n if (isFloatArg(a)) {\n const f = argFloat(ctx, a);\n if (f === 0) throw pgError(\"invalid_argument_for_log\", \"cannot take logarithm of zero\", \"2201E\");\n if (f < 0) throw pgError(\"invalid_argument_for_log\", \"cannot take logarithm of a negative number\", \"2201E\");\n return tv(\"float8\", Math.log10(f));\n }\n return tv(\"numeric\", numericLog10(argNumeric(ctx, a)));\n }),\n );\n m.set(\n \"log10\",\n strict(\"numeric\", (ctx, args) => {\n const a = args[0]!;\n if (isFloatArg(a)) return tv(\"float8\", Math.log10(argFloat(ctx, a)));\n return tv(\"numeric\", numericLog10(argNumeric(ctx, a)));\n }),\n );\n const powerFn = strict(\"numeric\", (ctx: Parameters<ScalarFn>[0], args: TypedValue[]) => {\n const a = args[0]!;\n const b = args[1]!;\n if (isFloatArg(a) || isFloatArg(b)) {\n return tv(\"float8\", floatErr(argFloat(ctx, a) ** argFloat(ctx, b), true));\n }\n return tv(\"numeric\", numericPower(argNumeric(ctx, a), argNumeric(ctx, b)));\n });\n m.set(\"power\", powerFn);\n m.set(\"pow\", powerFn);\n m.set(\n \"mod\",\n strict(\"numeric\", (ctx, args) => {\n const a = args[0]!;\n const b = args[1]!;\n if (isIntType(a.t) && isIntType(b.t)) {\n if (a.t === \"int8\" || b.t === \"int8\") {\n const x = castTo(ctx, a, \"int8\", {}).v as bigint;\n const y = castTo(ctx, b, \"int8\", {}).v as bigint;\n if (y === 0n) throw pgError(\"division_by_zero\", \"division by zero\");\n return tv(\"int8\", x % y);\n }\n const x = a.v as number;\n const y = b.v as number;\n if (y === 0) throw pgError(\"division_by_zero\", \"division by zero\");\n const r = x % y;\n return tv(a.t === \"int2\" && b.t === \"int2\" ? \"int2\" : \"int4\", r);\n }\n return tv(\"numeric\", numericMod(argNumeric(ctx, a), argNumeric(ctx, b)));\n }),\n );\n m.set(\n \"div\",\n strict(\"numeric\", (ctx, args) => {\n const a = argNumeric(ctx, args[0]!);\n const b = argNumeric(ctx, args[1]!);\n return tv(\"numeric\", numericDivTrunc(a, b));\n }),\n );\n m.set(\"pi\", (_ctx, _args) => tv(\"float8\", Math.PI));\n m.set(\n \"degrees\",\n strict(\"float8\", (ctx, args) => tv(\"float8\", (argFloat(ctx, args[0]!) * 180) / Math.PI)),\n );\n m.set(\n \"radians\",\n strict(\"float8\", (ctx, args) => tv(\"float8\", (argFloat(ctx, args[0]!) * Math.PI) / 180)),\n );\n\n const trig: Record<string, (x: number) => number> = {\n sin: Math.sin,\n cos: Math.cos,\n tan: Math.tan,\n cot: (x) => 1 / Math.tan(x),\n asin: Math.asin,\n acos: Math.acos,\n atan: Math.atan,\n sinh: Math.sinh,\n cosh: Math.cosh,\n tanh: Math.tanh,\n asinh: Math.asinh,\n acosh: Math.acosh,\n atanh: Math.atanh,\n };\n for (const [name, fn] of Object.entries(trig)) {\n m.set(\n name,\n strict(\"float8\", (ctx, args) => {\n const x = argFloat(ctx, args[0]!);\n if ((name === \"asin\" || name === \"acos\") && (x < -1 || x > 1)) {\n throw pgError(\"numeric_value_out_of_range\", \"input is out of range\");\n }\n if (name === \"acosh\" && x < 1) throw pgError(\"numeric_value_out_of_range\", \"input is out of range\");\n if (name === \"atanh\" && (x < -1 || x > 1)) throw pgError(\"numeric_value_out_of_range\", \"input is out of range\");\n return tv(\"float8\", checkFloat(fn(x), name));\n }),\n );\n }\n m.set(\n \"atan2\",\n strict(\"float8\", (ctx, args) => tv(\"float8\", Math.atan2(argFloat(ctx, args[0]!), argFloat(ctx, args[1]!)))),\n );\n\n // degree-based variants\n const degTrig: Record<string, (x: number) => number> = {\n sind: (x) => exactDegSin(x),\n cosd: (x) => exactDegCos(x),\n tand: (x) => exactDegTan(x),\n cotd: (x) => 1 / exactDegTan(x),\n asind: (x) => (Math.asin(x) * 180) / Math.PI,\n acosd: (x) => (Math.acos(x) * 180) / Math.PI,\n atand: (x) => (Math.atan(x) * 180) / Math.PI,\n };\n for (const [name, fn] of Object.entries(degTrig)) {\n m.set(\n name,\n strict(\"float8\", (ctx, args) => {\n const x = argFloat(ctx, args[0]!);\n if ((name === \"asind\" || name === \"acosd\") && (x < -1 || x > 1)) {\n throw pgError(\"numeric_value_out_of_range\", \"input is out of range\");\n }\n return tv(\"float8\", fn(x));\n }),\n );\n }\n m.set(\n \"atan2d\",\n strict(\"float8\", (ctx, args) =>\n tv(\"float8\", (Math.atan2(argFloat(ctx, args[0]!), argFloat(ctx, args[1]!)) * 180) / Math.PI),\n ),\n );\n\n m.set(\n \"gcd\",\n strict(\"numeric\", (ctx, args) => {\n const a = args[0]!;\n const b = args[1]!;\n if (a.t === \"int8\" || b.t === \"int8\") {\n const x = castTo(ctx, a, \"int8\", {}).v as bigint;\n const y = castTo(ctx, b, \"int8\", {}).v as bigint;\n return tv(\"int8\", checkInt8(bigintGcd(x, y)));\n }\n if (isIntType(a.t) && isIntType(b.t)) {\n const g = bigintGcd(BigInt(a.v as number), BigInt(b.v as number));\n return tv(\"int4\", checkInt4(Number(g)));\n }\n return tv(\"numeric\", numericGcd(argNumeric(ctx, a), argNumeric(ctx, b)));\n }),\n );\n m.set(\n \"lcm\",\n strict(\"numeric\", (ctx, args) => {\n const a = args[0]!;\n const b = args[1]!;\n if (a.t === \"int8\" || b.t === \"int8\") {\n const x = castTo(ctx, a, \"int8\", {}).v as bigint;\n const y = castTo(ctx, b, \"int8\", {}).v as bigint;\n if (x === 0n || y === 0n) return tv(\"int8\", 0n);\n const l = (x / bigintGcd(x, y)) * y;\n return tv(\"int8\", checkInt8(l < 0n ? -l : l));\n }\n if (isIntType(a.t) && isIntType(b.t)) {\n const x = BigInt(a.v as number);\n const y = BigInt(b.v as number);\n if (x === 0n || y === 0n) return tv(\"int4\", 0);\n const l = (x / bigintGcd(x, y)) * y;\n return tv(\"int4\", checkInt4(Number(l < 0n ? -l : l)));\n }\n const na = argNumeric(ctx, args[0]!);\n const nb = argNumeric(ctx, args[1]!);\n if (numericSign(na) === 0 || numericSign(nb) === 0) return tv(\"numeric\", makeNumeric(0n, 0));\n const g = numericGcd(na, nb);\n const l = numericMul(numericDivScaled(na, g, 0), nb);\n return tv(\"numeric\", numericAbs(l));\n }),\n );\n m.set(\n \"factorial\",\n strict(\"numeric\", (ctx, args) => {\n const n = castTo(ctx, args[0]!, \"int8\", {}).v as bigint;\n if (n < 0n) throw pgError(\"invalid_parameter_value\", \"factorial of a negative number is undefined\");\n let acc = 1n;\n for (let i = 2n; i <= n; i++) {\n acc *= i;\n if (acc > 10n ** 100000n) throw pgError(\"numeric_value_out_of_range\", \"value overflows numeric format\");\n }\n return tv(\"numeric\", numericFromBigInt(acc));\n }),\n );\n m.set(\n \"width_bucket\",\n strict(\"int4\", (ctx, args) => {\n const op = argNumeric(ctx, args[0]!);\n const b1 = argNumeric(ctx, args[1]!);\n const b2 = argNumeric(ctx, args[2]!);\n const count = argInt(ctx, args[3]!);\n if (count <= 0)\n throw pgError(\"invalid_argument_for_width_bucket_function\", \"count must be greater than zero\", \"2201G\");\n const cmp12 = numericCmp(b1, b2);\n if (cmp12 === 0)\n throw pgError(\"invalid_argument_for_width_bucket_function\", \"lower bound cannot equal upper bound\", \"2201G\");\n if (op.special === \"nan\" || b1.special === \"nan\" || b2.special === \"nan\") {\n throw pgError(\n \"invalid_argument_for_width_bucket_function\",\n \"operand, lower bound, and upper bound cannot be NaN\",\n \"2201G\",\n );\n }\n const ascending = cmp12 < 0;\n if (ascending) {\n if (numericCmp(op, b1) < 0) return tv(\"int4\", 0);\n if (numericCmp(op, b2) >= 0) return tv(\"int4\", count + 1);\n } else {\n if (numericCmp(op, b1) > 0) return tv(\"int4\", 0);\n if (numericCmp(op, b2) <= 0) return tv(\"int4\", count + 1);\n }\n // bucket = floor(count * (op - b1) / (b2 - b1)) + 1\n const num = numericMul(numericFromBigInt(BigInt(count)), numericSub(op, b1));\n const den = numericSub(b2, b1);\n const q = numericDivScaled(num, den, 20);\n const fl = numericToBigInt(numericFloor(q));\n return tv(\"int4\", checkInt4(Number(fl) + 1));\n }),\n );\n m.set(\n \"scale\",\n strict(\"int4\", (ctx, args) => {\n const n = argNumeric(ctx, args[0]!);\n if (n.special) return tv(\"int4\", null);\n return tv(\"int4\", n.dscale);\n }),\n );\n m.set(\n \"min_scale\",\n strict(\"int4\", (ctx, args) => {\n const n = argNumeric(ctx, args[0]!);\n if (n.special) throw pgError(\"numeric_value_out_of_range\", \"cannot take min_scale of special values\");\n return tv(\"int4\", numericStripTrailingZeros(n).dscale);\n }),\n );\n m.set(\n \"trim_scale\",\n strict(\"numeric\", (ctx, args) => {\n const n = argNumeric(ctx, args[0]!);\n if (n.special) return tv(\"numeric\", n);\n return tv(\"numeric\", numericStripTrailingZeros(n));\n }),\n );\n m.set(\"random\", (ctx, _args) => tv(\"float8\", ctx.state.prng.nextFloat()));\n m.set(\"setseed\", (ctx, args) => {\n const seed = argFloat(ctx, args[0]!);\n if (seed < -1 || seed > 1) {\n throw pgError(\"invalid_parameter_value\", `setseed parameter ${seed} is out of allowed range [-1,1]`, \"22023\");\n }\n ctx.state.prng.setSeedFloat(seed);\n return tv(\"void\", null);\n });\n m.set(\n \"erf\",\n strict(\"float8\", (ctx, args) => tv(\"float8\", erf(argFloat(ctx, args[0]!)))),\n );\n m.set(\n \"erfc\",\n strict(\"float8\", (ctx, args) => tv(\"float8\", 1 - erf(argFloat(ctx, args[0]!)))),\n );\n\n m.set(\n \"isfinite\",\n strict(\"bool\", (ctx, args) => {\n const a = args[0]!;\n void ctx;\n if (a.t === \"date\") {\n const d = a.v as number;\n return tv(\"bool\", d !== 2147483647 && d !== -2147483648);\n }\n if (a.t === \"timestamp\" || a.t === \"timestamptz\") {\n const t = a.v as bigint;\n return tv(\"bool\", t !== 9223372036854775807n && t !== -9223372036854775808n);\n }\n if (a.t === \"interval\") return tv(\"bool\", true);\n if (isNumericType(a.t)) {\n if (isNumeric(a.v)) return tv(\"bool\", a.v.special !== \"inf\" && a.v.special !== \"-inf\");\n if (typeof a.v === \"number\") return tv(\"bool\", Number.isFinite(a.v) || Number.isNaN(a.v));\n return tv(\"bool\", true);\n }\n throw pgError(\"datatype_mismatch\", `function isfinite(${a.t}) does not exist`, \"42883\");\n }),\n );\n\n m.set(\"num_nulls\", (_ctx, args) => tv(\"int4\", args.filter((a) => a.v === null).length));\n m.set(\"num_nonnulls\", (_ctx, args) => tv(\"int4\", args.filter((a) => a.v !== null).length));\n\n return m;\n}\n\nfunction bigintGcd(a: bigint, b: bigint): bigint {\n let x = a < 0n ? -a : a;\n let y = b < 0n ? -b : b;\n while (y !== 0n) {\n [x, y] = [y, x % y];\n }\n return x;\n}\n\nfunction numericGcd(a: Numeric, b: Numeric): Numeric {\n // scale both to common dscale and gcd the coefficients\n const ds = Math.max(a.dscale, b.dscale);\n let ca = a.coef;\n for (let i = a.dscale; i < ds; i++) ca *= 10n;\n let cb = b.coef;\n for (let i = b.dscale; i < ds; i++) cb *= 10n;\n const g = bigintGcd(ca, cb);\n return numericStripTrailingZeros(makeNumeric(g, ds));\n}\n\n/** Abramowitz & Stegun 7.1.26 is not precise enough; use the series/continued fraction combo. */\nfunction erf(x: number): number {\n if (Number.isNaN(x)) return Number.NaN;\n if (x === 0) return 0;\n const sign = x < 0 ? -1 : 1;\n const ax = Math.abs(x);\n if (ax > 6) return sign;\n // series expansion\n let sum = ax;\n let term = ax;\n for (let n = 1; n < 200; n++) {\n term *= (-ax * ax) / n;\n const add = term / (2 * n + 1);\n sum += add;\n if (Math.abs(add) < 1e-18 * Math.abs(sum)) break;\n }\n return (sign * 2 * sum) / Math.sqrt(Math.PI);\n}\n\nfunction exactDegSin(x: number): number {\n const mod = ((x % 360) + 360) % 360;\n if (mod === 0 || mod === 180) return 0;\n if (mod === 90) return 1;\n if (mod === 270) return -1;\n if (mod === 30 || mod === 150) return 0.5;\n if (mod === 210 || mod === 330) return -0.5;\n return Math.sin((x * Math.PI) / 180);\n}\n\nfunction exactDegCos(x: number): number {\n return exactDegSin(x + 90);\n}\n\nfunction exactDegTan(x: number): number {\n const mod = ((x % 360) + 360) % 360;\n if (mod === 0 || mod === 180) return 0;\n if (mod === 45 || mod === 225) return 1;\n if (mod === 135 || mod === 315) return -1;\n if (mod === 90 || mod === 270) return Number.POSITIVE_INFINITY * (mod === 90 ? 1 : -1);\n return Math.tan((x * Math.PI) / 180);\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport type { EngineCtx } from \"../expressions/context.ts\";\nimport type { SequenceData } from \"../storage/database-state.ts\";\nimport { castTo } from \"../types/cast.ts\";\nimport { makeArray, tv, typeDisplayName } from \"../types/value.ts\";\nimport { argBigInt, argInt, argText, type ScalarFn, strict } from \"./util.ts\";\n\nexport const PG_VERSION_TEXT = \"PostgreSQL 18.3 (postgres-mem) on TypeScript, in-memory engine\";\nexport const PG_SERVER_VERSION = \"18.3\";\nexport const PG_SERVER_VERSION_NUM = \"180003\";\n\nfunction findSequenceForCall(ctx: EngineCtx, name: string): SequenceData {\n const parts = parseQualifiedName(name);\n const seq = ctx.state.findSequence(parts);\n if (!seq) {\n throw pgError(\"undefined_table\", `relation \"${name}\" does not exist`, \"42P01\");\n }\n return seq;\n}\n\nfunction parseQualifiedName(name: string): string[] {\n // supports schema.name and quoted parts\n const parts: string[] = [];\n let current = \"\";\n let inQuote = false;\n for (let i = 0; i < name.length; i++) {\n const c = name[i]!;\n if (inQuote) {\n if (c === '\"') {\n if (name[i + 1] === '\"') {\n current += '\"';\n i++;\n } else inQuote = false;\n } else current += c;\n } else if (c === '\"') {\n inQuote = true;\n } else if (c === \".\") {\n parts.push(current);\n current = \"\";\n } else {\n current += c.toLowerCase();\n }\n }\n parts.push(current);\n return parts.map((p) => p.trim()).filter((p) => p.length > 0);\n}\n\nexport function sequenceNextval(ctx: EngineCtx, seq: SequenceData): bigint {\n let next: bigint;\n if (!seq.isCalled) {\n next = seq.lastValue;\n } else {\n next = seq.lastValue + seq.increment;\n if (seq.increment > 0n && next > seq.maxValue) {\n if (!seq.cycle) {\n throw pgError(\n \"sequence_generator_limit_exceeded\",\n `nextval: reached maximum value of sequence \"${seq.name}\" (${seq.maxValue})`,\n \"2200H\",\n );\n }\n next = seq.minValue;\n } else if (seq.increment < 0n && next < seq.minValue) {\n if (!seq.cycle) {\n throw pgError(\n \"sequence_generator_limit_exceeded\",\n `nextval: reached minimum value of sequence \"${seq.name}\" (${seq.minValue})`,\n \"2200H\",\n );\n }\n next = seq.maxValue;\n }\n }\n seq.lastValue = next;\n seq.isCalled = true;\n ctx.state.lastSequence = { schema: seq.schema, name: seq.name };\n return next;\n}\n\nexport function getMiscFunctions(): Map<string, ScalarFn> {\n const m = new Map<string, ScalarFn>();\n\n m.set(\"version\", () => tv(\"text\", PG_VERSION_TEXT));\n m.set(\"current_database\", () => tv(\"name\", \"postgres\"));\n m.set(\"current_catalog\", () => tv(\"name\", \"postgres\"));\n m.set(\"current_schema\", (ctx) => {\n const path = ctx.state.effectiveSearchPath();\n const first = path.find((s) => ctx.state.schemas.has(s));\n return tv(\"name\", first ?? null);\n });\n m.set(\"current_schemas\", (ctx, args) => {\n const includeImplicit = args.length > 0 ? args[0]!.v === true : false;\n const path = ctx.state.effectiveSearchPath().filter((s) => ctx.state.schemas.has(s));\n const schemas = includeImplicit ? [\"pg_catalog\", ...path] : path;\n return tv(\"name[]\", makeArray(\"name\", schemas));\n });\n m.set(\"current_user\", () => tv(\"name\", \"postgres\"));\n m.set(\"session_user\", () => tv(\"name\", \"postgres\"));\n m.set(\"current_role\", () => tv(\"name\", \"postgres\"));\n m.set(\"user\", () => tv(\"name\", \"postgres\"));\n m.set(\"pg_backend_pid\", () => tv(\"int4\", 1));\n m.set(\"txid_current\", () => tv(\"int8\", 1n));\n m.set(\"pg_current_xact_id\", () => tv(\"int8\", 1n));\n m.set(\"pg_sleep\", () => tv(\"void\", null));\n m.set(\"pg_typeof\", (_ctx, args) => tv(\"regtype\", typeDisplayName(args[0]!.t === \"unknown\" ? \"unknown\" : args[0]!.t)));\n m.set(\n \"pg_column_size\",\n strict(\"int4\", (ctx, args) => {\n const text = castTo(ctx, args[0]!, \"text\", { explicit: true }).v as string;\n return tv(\"int4\", new TextEncoder().encode(text).length + 4);\n }),\n );\n m.set(\"gen_random_uuid\", (ctx) => tv(\"uuid\", ctx.state.prng.nextUuid4()));\n m.set(\"uuidv4\", (ctx) => tv(\"uuid\", ctx.state.prng.nextUuid4()));\n m.set(\n \"uuid_extract_version\",\n strict(\"int2\", (ctx, args) => {\n const u = castTo(ctx, args[0]!, \"uuid\", { explicit: true }).v as string;\n return tv(\"int2\", Number.parseInt(u[14]!, 16));\n }),\n );\n\n m.set(\"current_setting\", (ctx, args) => {\n if (args[0]!.v === null) return tv(\"text\", null);\n const name = argText(ctx, args[0]!).toLowerCase();\n const missingOk = args.length > 1 && args[1]!.v === true;\n const value = ctx.state.getSetting(name);\n if (value === undefined) {\n if (missingOk) return tv(\"text\", null);\n throw pgError(\"undefined_object\", `unrecognized configuration parameter \"${name}\"`, \"42704\");\n }\n return tv(\"text\", value);\n });\n m.set(\"set_config\", (ctx, args) => {\n if (args[0]!.v === null) {\n throw pgError(\"null_value_not_allowed\", \"NULL value not allowed for parameter name\", \"22004\");\n }\n const name = argText(ctx, args[0]!).toLowerCase();\n const value = args[1]!.v === null ? \"\" : argText(ctx, args[1]!);\n ctx.state.settings.set(name, value);\n return tv(\"text\", value);\n });\n\n // --- sequences -------------------------------------------------------------\n m.set(\n \"nextval\",\n strict(\"int8\", (ctx, args) => {\n const seq = findSequenceForCall(ctx, argText(ctx, args[0]!));\n return tv(\"int8\", sequenceNextval(ctx, seq));\n }),\n );\n m.set(\n \"currval\",\n strict(\"int8\", (ctx, args) => {\n const seq = findSequenceForCall(ctx, argText(ctx, args[0]!));\n if (!seq.isCalled) {\n throw pgError(\n \"object_not_in_prerequisite_state\",\n `currval of sequence \"${seq.name}\" is not yet defined in this session`,\n \"55000\",\n );\n }\n return tv(\"int8\", seq.lastValue);\n }),\n );\n m.set(\"lastval\", (ctx) => {\n const last = ctx.state.lastSequence;\n if (!last) {\n throw pgError(\"object_not_in_prerequisite_state\", \"lastval is not yet defined in this session\", \"55000\");\n }\n const seq = ctx.state.findSequence([last.schema, last.name]);\n if (!seq?.isCalled) {\n throw pgError(\"object_not_in_prerequisite_state\", \"lastval is not yet defined in this session\", \"55000\");\n }\n return tv(\"int8\", seq.lastValue);\n });\n m.set(\n \"setval\",\n strict(\"int8\", (ctx, args) => {\n const seq = findSequenceForCall(ctx, argText(ctx, args[0]!));\n const value = argBigInt(ctx, args[1]!);\n const isCalled = args.length > 2 ? args[2]!.v === true : true;\n if (value < seq.minValue || value > seq.maxValue) {\n throw pgError(\n \"numeric_value_out_of_range\",\n `setval: value ${value} is out of bounds for sequence \"${seq.name}\" (${seq.minValue}..${seq.maxValue})`,\n \"22003\",\n );\n }\n seq.lastValue = value;\n seq.isCalled = isCalled;\n ctx.state.lastSequence = { schema: seq.schema, name: seq.name };\n return tv(\"int8\", value);\n }),\n );\n m.set(\n \"pg_get_serial_sequence\",\n strict(\"text\", (ctx, args) => {\n const tableName = argText(ctx, args[0]!);\n const column = argText(ctx, args[1]!).toLowerCase();\n const table = ctx.state.findTable(parseQualifiedName(tableName));\n if (!table) throw pgError(\"undefined_table\", `relation \"${tableName}\" does not exist`, \"42P01\");\n const col = table.columns.find((c) => c.name === column);\n if (!col)\n throw pgError(\"undefined_column\", `column \"${column}\" of relation \"${table.name}\" does not exist`, \"42703\");\n if (!col.identity) return tv(\"text\", null);\n return tv(\n \"text\",\n col.identity.sequence\n .split(\".\")\n .map((p) => p)\n .join(\".\"),\n );\n }),\n );\n\n m.set(\"format_type\", (ctx, args) => {\n if (args[0]!.v === null) return tv(\"text\", null);\n const oid = argInt(ctx, args[0]!);\n const name = ctx.state.typeNameForOid(oid);\n return tv(\"text\", name ?? \"???\");\n });\n m.set(\"pg_get_expr\", () => tv(\"text\", null));\n m.set(\"obj_description\", () => tv(\"text\", null));\n m.set(\"col_description\", () => tv(\"text\", null));\n m.set(\"shobj_description\", () => tv(\"text\", null));\n m.set(\"pg_get_userbyid\", () => tv(\"name\", \"postgres\"));\n m.set(\"pg_table_is_visible\", (_ctx, args) => tv(\"bool\", args[0]!.v !== null));\n m.set(\"pg_function_is_visible\", (_ctx, args) => tv(\"bool\", args[0]!.v !== null));\n m.set(\"pg_type_is_visible\", (_ctx, args) => tv(\"bool\", args[0]!.v !== null));\n m.set(\"has_table_privilege\", () => tv(\"bool\", true));\n m.set(\"has_schema_privilege\", () => tv(\"bool\", true));\n m.set(\"has_column_privilege\", () => tv(\"bool\", true));\n m.set(\"pg_encoding_to_char\", (_ctx, args) => tv(\"name\", args[0]!.v === null ? null : \"UTF8\"));\n m.set(\"pg_postmaster_start_time\", (ctx) => tv(\"timestamptz\", ctx.txNow));\n m.set(\"pg_conf_load_time\", (ctx) => tv(\"timestamptz\", ctx.txNow));\n m.set(\"inet_client_addr\", () => tv(\"text\", null));\n m.set(\"inet_server_addr\", () => tv(\"text\", null));\n m.set(\n \"pg_size_pretty\",\n strict(\"text\", (ctx, args) => {\n let size = Number(argBigInt(ctx, args[0]!));\n const units = [\"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", \"PB\"];\n let u = 0;\n while (Math.abs(size) >= 10240 && u < units.length - 1) {\n size /= 1024;\n u++;\n }\n return tv(\"text\", `${Math.round(size)} ${units[u]}`);\n }),\n );\n m.set(\"pg_total_relation_size\", () => tv(\"int8\", 8192n));\n m.set(\"pg_relation_size\", () => tv(\"int8\", 8192n));\n m.set(\"pg_table_size\", () => tv(\"int8\", 8192n));\n m.set(\"pg_indexes_size\", () => tv(\"int8\", 0n));\n m.set(\"pg_database_size\", () => tv(\"int8\", 8192n));\n\n m.set(\"pg_advisory_lock\", () => tv(\"void\", null));\n m.set(\"pg_advisory_unlock\", () => tv(\"bool\", true));\n m.set(\"pg_advisory_unlock_all\", () => tv(\"void\", null));\n m.set(\"pg_try_advisory_lock\", () => tv(\"bool\", true));\n\n m.set(\"pg_notification_queue_usage\", () => tv(\"float8\", 0));\n m.set(\"pg_listening_channels_check\", () => tv(\"bool\", true));\n m.set(\"pg_is_in_recovery\", () => tv(\"bool\", false));\n m.set(\"txid_current_if_assigned\", () => tv(\"int8\", null));\n\n return m;\n}\n", "import { pgError } from \"../errors/error.ts\";\n\n/** LIKE pattern \u2192 anchored RegExp source. */\nexport function likeToRegex(pattern: string, escape: string | null): string {\n const esc = escape === null ? \"\\\\\" : escape;\n if (esc.length > 1) throw pgError(\"invalid_parameter_value\", \"invalid escape string\", \"22025\");\n let out = \"^\";\n const chars = [...pattern];\n for (let i = 0; i < chars.length; i++) {\n const c = chars[i]!;\n if (esc !== \"\" && c === esc) {\n const next = chars[i + 1];\n if (next === undefined) {\n throw pgError(\"invalid_parameter_value\", \"LIKE pattern must not end with escape character\", \"22025\");\n }\n out += escapeRegexChar(next);\n i++;\n continue;\n }\n if (c === \"%\") {\n out += \"[\\\\s\\\\S]*\";\n continue;\n }\n if (c === \"_\") {\n out += \"[\\\\s\\\\S]\";\n continue;\n }\n out += escapeRegexChar(c);\n }\n return `${out}$`;\n}\n\nfunction escapeRegexChar(c: string): string {\n return /[.*+?^${}()|[\\]\\\\]/.test(c) ? `\\\\${c}` : c;\n}\n\nexport function likeMatch(text: string, pattern: string, escape: string | null, caseInsensitive: boolean): boolean {\n const re = new RegExp(likeToRegex(pattern, escape), caseInsensitive ? \"is\" : \"s\");\n return re.test(text);\n}\n\n/** SIMILAR TO pattern \u2192 anchored RegExp source (SQL regex dialect). */\nexport function similarToRegex(pattern: string, escape: string | null): string {\n const esc = escape === null ? \"\\\\\" : escape;\n let out = \"^(?:\";\n const chars = [...pattern];\n for (let i = 0; i < chars.length; i++) {\n const c = chars[i]!;\n if (esc !== \"\" && c === esc) {\n const next = chars[i + 1];\n if (next === undefined) {\n throw pgError(\n \"invalid_regular_expression\",\n \"invalid regular expression: pattern must not end with escape character\",\n \"2201B\",\n );\n }\n out += escapeRegexChar(next);\n i++;\n continue;\n }\n if (c === \"%\") {\n out += \"[\\\\s\\\\S]*\";\n continue;\n }\n if (c === \"_\") {\n out += \"[\\\\s\\\\S]\";\n continue;\n }\n // pass through SQL regex metacharacters\n if (\"|*+?{}()[]\".includes(c)) {\n out += c;\n continue;\n }\n out += escapeRegexChar(c);\n }\n return `${out})$`;\n}\n\nexport function similarToMatch(text: string, pattern: string, escape: string | null): boolean {\n let re: RegExp;\n try {\n re = new RegExp(similarToRegex(pattern, escape), \"s\");\n } catch {\n throw pgError(\"invalid_regular_expression\", \"invalid regular expression\", \"2201B\");\n }\n return re.test(text);\n}\n\n/**\n * Translate a POSIX ARE (PG regex flavor) to a JS RegExp source.\n * Covers the common surface: classes, quantifiers, anchors, \\m/\\M/\\y word\n * boundaries, [[:class:]] names. Exotic ARE features (\\A directors, back\n * refs into lookahead) are passed through and may diverge (documented).\n */\nexport function pgRegexToJs(pattern: string): string {\n let out = \"\";\n const chars = [...pattern];\n for (let i = 0; i < chars.length; i++) {\n const c = chars[i]!;\n if (c === \"\\\\\") {\n const next = chars[i + 1];\n i++;\n switch (next) {\n case \"m\":\n out += \"\\\\b(?=\\\\w)\";\n break;\n case \"M\":\n out += \"\\\\b(?<=\\\\w)\";\n break;\n case \"y\":\n out += \"\\\\b\";\n break;\n case \"Y\":\n out += \"\\\\B\";\n break;\n case \"A\":\n out += \"^\";\n break;\n case \"Z\":\n out += \"$\";\n break;\n case undefined:\n throw pgError(\n \"invalid_regular_expression\",\n \"invalid regular expression: invalid escape \\\\ sequence\",\n \"2201B\",\n );\n default:\n out += `\\\\${next}`;\n }\n continue;\n }\n if (c === \"[\") {\n // character class \u2014 translate [[:name:]] inside\n let cls = \"[\";\n let j = i + 1;\n if (chars[j] === \"^\") {\n cls += \"^\";\n j++;\n }\n if (chars[j] === \"]\") {\n cls += \"\\\\]\";\n j++;\n }\n for (; j < chars.length; j++) {\n const cc = chars[j]!;\n if (cc === \"[\" && chars[j + 1] === \":\") {\n const end = pattern.indexOf(\":]\", j);\n if (end === -1)\n throw pgError(\n \"invalid_regular_expression\",\n \"invalid regular expression: brackets [] not balanced\",\n \"2201B\",\n );\n const name = pattern.slice(j + 2, end);\n cls += posixClass(name);\n j = end + 1;\n continue;\n }\n if (cc === \"]\") break;\n if (cc === \"\\\\\") {\n cls += \"\\\\\\\\\";\n continue;\n }\n cls += cc;\n }\n if (chars[j] !== \"]\") {\n throw pgError(\"invalid_regular_expression\", \"invalid regular expression: brackets [] not balanced\", \"2201B\");\n }\n cls += \"]\";\n out += cls;\n i = j;\n continue;\n }\n if (\n c === \"(\" &&\n chars[i + 1] === \"?\" &&\n chars[i + 2] !== \":\" &&\n chars[i + 2] !== \"=\" &&\n chars[i + 2] !== \"!\" &&\n chars[i + 2] !== \"<\"\n ) {\n // inline options like (?i) \u2014 JS lacks these; approximate by ignoring\n const close = pattern.indexOf(\")\", i);\n if (close !== -1 && /^\\(\\?[a-z]+\\)$/.test(pattern.slice(i, close + 1))) {\n i = close;\n continue;\n }\n }\n out += c;\n }\n return out;\n}\n\nfunction posixClass(name: string): string {\n switch (name) {\n case \"alpha\":\n return \"a-zA-Z\";\n case \"digit\":\n return \"0-9\";\n case \"alnum\":\n return \"a-zA-Z0-9\";\n case \"upper\":\n return \"A-Z\";\n case \"lower\":\n return \"a-z\";\n case \"space\":\n return \" \\\\t\\\\n\\\\r\\\\f\\\\v\";\n case \"punct\":\n return \"!-/:-@\\\\[-`{-~\";\n case \"word\":\n return \"a-zA-Z0-9_\";\n case \"xdigit\":\n return \"0-9a-fA-F\";\n case \"blank\":\n return \" \\\\t\";\n case \"cntrl\":\n return \"\\\\x00-\\\\x1f\\\\x7f\";\n case \"graph\":\n return \"\\\\x21-\\\\x7e\";\n case \"print\":\n return \"\\\\x20-\\\\x7e\";\n default:\n throw pgError(\"invalid_regular_expression\", `invalid regular expression: invalid character class`, \"2201B\");\n }\n}\n\nexport function pgRegex(pattern: string, flags: string): RegExp {\n try {\n return new RegExp(pgRegexToJs(pattern), flags);\n } catch (e) {\n if (e instanceof Error && e.name === \"PostgresError\") throw e;\n throw pgError(\"invalid_regular_expression\", `invalid regular expression: ${(e as Error).message}`, \"2201B\");\n }\n}\n\nexport function regexMatch(text: string, pattern: string, caseInsensitive: boolean): boolean {\n return pgRegex(pattern, caseInsensitive ? \"is\" : \"s\").test(text);\n}\n\n/**\n * Translate PG regex option letters to JS RegExp flags. PG default is\n * newline-insensitive (JS `s`); `n`/`m` switch to newline-sensitive (`m`).\n */\nexport function regexFlags(pgFlags: string, dropGlobal = false): string {\n let insensitive = false;\n let global = false;\n let newlineSensitive = false;\n for (const f of pgFlags) {\n switch (f) {\n case \"i\":\n insensitive = true;\n break;\n case \"c\":\n insensitive = false;\n break;\n case \"g\":\n global = true;\n break;\n case \"n\":\n case \"m\":\n case \"p\":\n newlineSensitive = true;\n break;\n case \"s\":\n newlineSensitive = false;\n break;\n case \"w\":\n newlineSensitive = true;\n break;\n case \"x\":\n case \"q\":\n case \"t\":\n case \"b\":\n case \"e\":\n throw pgError(\"feature_not_supported\", `regexp option \"${f}\" is not supported`, \"0A000\");\n default:\n throw pgError(\"invalid_regular_expression\", `invalid regular expression option: \"${f}\"`, \"2201B\");\n }\n }\n let out = \"\";\n if (insensitive) out += \"i\";\n if (global && !dropGlobal) out += \"g\";\n out += newlineSensitive ? \"m\" : \"s\";\n return out;\n}\n", "import { pgError, unsupported } from \"../errors/error.ts\";\nimport type { EngineCtx } from \"../expressions/context.ts\";\nimport { pgRegexToJs, regexFlags, similarToRegex } from \"../expressions/pattern.ts\";\nimport { castTo } from \"../types/cast.ts\";\nimport { datumText, makeArray, type TypedValue, tv } from \"../types/value.ts\";\nimport { argInt, argText, type ScalarFn, strict } from \"./util.ts\";\n\nconst encoderUtf8 = new TextEncoder();\nconst decoderUtf8 = new TextDecoder(\"utf-8\", { fatal: false });\n\nfunction chars(s: string): string[] {\n return [...s];\n}\n\n/** PG substr semantics: 1-based, negative start shifts window. */\nexport function substrImpl(s: string, start: number, len?: number): string {\n const cs = chars(s);\n if (len === undefined) {\n const from = Math.max(start, 1);\n return cs.slice(from - 1).join(\"\");\n }\n if (len < 0) throw pgError(\"substring_error\", \"negative substring length not allowed\", \"22011\");\n const end = start + len; // exclusive, 1-based\n const from = Math.max(start, 1);\n const to = Math.max(end, 1);\n if (to <= from) return \"\";\n return cs.slice(from - 1, to - 1).join(\"\");\n}\n\nexport function getStringFunctions(): Map<string, ScalarFn> {\n const m = new Map<string, ScalarFn>();\n\n m.set(\n \"length\",\n strict(\"int4\", (ctx, args) => {\n const a = args[0]!;\n if (a.t === \"bytea\") return tv(\"int4\", (a.v as Uint8Array).length);\n if (a.t === \"tsvector\") {\n throw unsupported(\"length(tsvector) is registered in tsearch functions\");\n }\n return tv(\"int4\", chars(argText(ctx, a)).length);\n }),\n );\n m.set(\n \"char_length\",\n strict(\"int4\", (ctx, args) => tv(\"int4\", chars(argText(ctx, args[0]!)).length)),\n );\n m.set(\"character_length\", m.get(\"char_length\")!);\n m.set(\n \"octet_length\",\n strict(\"int4\", (ctx, args) => {\n const a = args[0]!;\n if (a.t === \"bytea\") return tv(\"int4\", (a.v as Uint8Array).length);\n return tv(\"int4\", encoderUtf8.encode(argText(ctx, a)).length);\n }),\n );\n m.set(\n \"bit_length\",\n strict(\"int4\", (ctx, args) => {\n const a = args[0]!;\n if (a.t === \"bit\" || a.t === \"varbit\") return tv(\"int4\", (a.v as string).length);\n if (a.t === \"bytea\") return tv(\"int4\", (a.v as Uint8Array).length * 8);\n return tv(\"int4\", encoderUtf8.encode(argText(ctx, a)).length * 8);\n }),\n );\n m.set(\n \"lower\",\n strict(\"text\", (ctx, args) => tv(\"text\", argText(ctx, args[0]!).toLowerCase())),\n );\n m.set(\n \"upper\",\n strict(\"text\", (ctx, args) => tv(\"text\", argText(ctx, args[0]!).toUpperCase())),\n );\n m.set(\n \"initcap\",\n strict(\"text\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n return tv(\n \"text\",\n s.replace(/[0-9A-Za-z\\u00c0-\\uffff]+/g, (w) => w[0]!.toUpperCase() + w.slice(1).toLowerCase()),\n );\n }),\n );\n m.set(\n \"substr\",\n strict(\"text\", (ctx, args) => {\n const a = args[0]!;\n if (a.t === \"bytea\") {\n const bytes = a.v as Uint8Array;\n const start = argInt(ctx, args[1]!);\n const len = args.length > 2 ? argInt(ctx, args[2]!) : undefined;\n return tv(\"bytea\", byteaSubstr(bytes, start, len));\n }\n const s = argText(ctx, a);\n const start = argInt(ctx, args[1]!);\n const len = args.length > 2 ? argInt(ctx, args[2]!) : undefined;\n return tv(\"text\", substrImpl(s, start, len));\n }),\n );\n // substring(string, pattern): 2-arg form with a non-numeric second arg is POSIX regex extraction\n m.set(\n \"substring\",\n strict(\"text\", (ctx, args) => {\n const isIntLike = (v: TypedValue): boolean => {\n if (v.t === \"int2\" || v.t === \"int4\" || v.t === \"int8\" || v.t === \"numeric\") return true;\n return v.t === \"unknown\" && /^\\s*[+-]?\\d+\\s*$/.test(String(v.v));\n };\n if (args.length === 2 && !isIntLike(args[1]!)) {\n const s = argText(ctx, args[0]!);\n const pattern = argText(ctx, args[1]!);\n const js = new RegExp(pgRegexToJs(pattern), regexFlags(\"\", true));\n const match = js.exec(s);\n if (!match) return tv(\"text\", null);\n return tv(\"text\", match[1] !== undefined ? match[1] : match[0]);\n }\n return m.get(\"substr\")!(ctx, args);\n }),\n );\n m.set(\n \"substring_similar\",\n strict(\"text\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n const pattern = argText(ctx, args[1]!);\n const escape = argText(ctx, args[2]!);\n return tv(\"text\", substringSimilar(s, pattern, escape));\n }),\n );\n m.set(\n \"strpos\",\n strict(\"int4\", (ctx, args) => {\n const hay = chars(argText(ctx, args[0]!));\n const needle = chars(argText(ctx, args[1]!));\n if (needle.length === 0) return tv(\"int4\", 1);\n outer: for (let i = 0; i + needle.length <= hay.length; i++) {\n for (let j = 0; j < needle.length; j++) {\n if (hay[i + j] !== needle[j]) continue outer;\n }\n return tv(\"int4\", i + 1);\n }\n return tv(\"int4\", 0);\n }),\n );\n m.set(\"position\", m.get(\"strpos\")!);\n m.set(\n \"left\",\n strict(\"text\", (ctx, args) => {\n const cs = chars(argText(ctx, args[0]!));\n const n = argInt(ctx, args[1]!);\n return tv(\"text\", n >= 0 ? cs.slice(0, n).join(\"\") : cs.slice(0, Math.max(cs.length + n, 0)).join(\"\"));\n }),\n );\n m.set(\n \"right\",\n strict(\"text\", (ctx, args) => {\n const cs = chars(argText(ctx, args[0]!));\n const n = argInt(ctx, args[1]!);\n return tv(\n \"text\",\n n >= 0 ? cs.slice(Math.max(cs.length - n, 0)).join(\"\") : cs.slice(Math.min(-n, cs.length)).join(\"\"),\n );\n }),\n );\n m.set(\n \"lpad\",\n strict(\"text\", (ctx, args) => {\n const s = chars(argText(ctx, args[0]!));\n const len = argInt(ctx, args[1]!);\n const fill = args.length > 2 ? chars(argText(ctx, args[2]!)) : [\" \"];\n return tv(\"text\", pad(s, len, fill, true));\n }),\n );\n m.set(\n \"rpad\",\n strict(\"text\", (ctx, args) => {\n const s = chars(argText(ctx, args[0]!));\n const len = argInt(ctx, args[1]!);\n const fill = args.length > 2 ? chars(argText(ctx, args[2]!)) : [\" \"];\n return tv(\"text\", pad(s, len, fill, false));\n }),\n );\n m.set(\n \"ltrim\",\n strict(\"text\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n const set = new Set(chars(args.length > 1 ? argText(ctx, args[1]!) : \" \"));\n const cs = chars(s);\n let i = 0;\n while (i < cs.length && set.has(cs[i]!)) i++;\n return tv(\"text\", cs.slice(i).join(\"\"));\n }),\n );\n m.set(\n \"rtrim\",\n strict(\"text\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n const set = new Set(chars(args.length > 1 ? argText(ctx, args[1]!) : \" \"));\n const cs = chars(s);\n let end = cs.length;\n while (end > 0 && set.has(cs[end - 1]!)) end--;\n return tv(\"text\", cs.slice(0, end).join(\"\"));\n }),\n );\n m.set(\n \"btrim\",\n strict(\"text\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n const set = new Set(chars(args.length > 1 ? argText(ctx, args[1]!) : \" \"));\n const cs = chars(s);\n let i = 0;\n let end = cs.length;\n while (i < end && set.has(cs[i]!)) i++;\n while (end > i && set.has(cs[end - 1]!)) end--;\n return tv(\"text\", cs.slice(i, end).join(\"\"));\n }),\n );\n m.set(\"trim\", m.get(\"btrim\")!);\n m.set(\n \"repeat\",\n strict(\"text\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n const n = argInt(ctx, args[1]!);\n return tv(\"text\", n > 0 ? s.repeat(n) : \"\");\n }),\n );\n m.set(\n \"replace\",\n strict(\"text\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n const from = argText(ctx, args[1]!);\n const to = argText(ctx, args[2]!);\n if (from === \"\") return tv(\"text\", s);\n return tv(\"text\", s.split(from).join(to));\n }),\n );\n m.set(\n \"reverse\",\n strict(\"text\", (ctx, args) => tv(\"text\", chars(argText(ctx, args[0]!)).reverse().join(\"\"))),\n );\n m.set(\n \"split_part\",\n strict(\"text\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n const delim = argText(ctx, args[1]!);\n const n = argInt(ctx, args[2]!);\n if (n === 0) throw pgError(\"invalid_parameter_value\", \"field position must not be zero\");\n const parts = delim === \"\" ? [s] : s.split(delim);\n const idx = n > 0 ? n - 1 : parts.length + n;\n return tv(\"text\", parts[idx] ?? \"\");\n }),\n );\n m.set(\n \"translate\",\n strict(\"text\", (ctx, args) => {\n const s = chars(argText(ctx, args[0]!));\n const from = chars(argText(ctx, args[1]!));\n const to = chars(argText(ctx, args[2]!));\n const map = new Map<string, string | null>();\n for (let i = 0; i < from.length; i++) map.set(from[i]!, to[i] ?? null);\n let out = \"\";\n for (const c of s) {\n if (map.has(c)) {\n const r = map.get(c);\n if (r !== null) out += r;\n } else out += c;\n }\n return tv(\"text\", out);\n }),\n );\n m.set(\n \"ascii\",\n strict(\"int4\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n if (s === \"\") return tv(\"int4\", 0);\n return tv(\"int4\", s.codePointAt(0)!);\n }),\n );\n m.set(\n \"chr\",\n strict(\"text\", (ctx, args) => {\n const n = argInt(ctx, args[0]!);\n if (n === 0) throw pgError(\"invalid_parameter_value\", \"null character not permitted\", \"54000\");\n if (n < 0 || n > 1114111 || (n >= 0xd800 && n <= 0xdfff)) {\n throw pgError(\"invalid_parameter_value\", `requested character too large for encoding: ${n}`);\n }\n return tv(\"text\", String.fromCodePoint(n));\n }),\n );\n // concat renders via typoutput (bool -> 't'/'f'), not the bool->text cast\n const outputText = (ctx: EngineCtx, a: TypedValue): string =>\n a.t === \"unknown\" ? String(a.v) : datumText(a.t, a.v as NonNullable<typeof a.v>, ctx);\n m.set(\"concat\", (ctx, args) => {\n let out = \"\";\n for (const a of args) {\n if (a.v === null) continue;\n out += outputText(ctx, a);\n }\n return tv(\"text\", out);\n });\n m.set(\"concat_ws\", (ctx, args) => {\n if (args.length === 0 || args[0]!.v === null) return tv(\"text\", null);\n const sep = argText(ctx, args[0]!);\n const parts: string[] = [];\n for (const a of args.slice(1)) {\n if (a.v === null) continue;\n parts.push(outputText(ctx, a));\n }\n return tv(\"text\", parts.join(sep));\n });\n m.set(\n \"starts_with\",\n strict(\"bool\", (ctx, args) => tv(\"bool\", argText(ctx, args[0]!).startsWith(argText(ctx, args[1]!)))),\n );\n m.set(\n \"md5\",\n strict(\"text\", (ctx, args) => {\n const a = args[0]!;\n const bytes = a.t === \"bytea\" ? (a.v as Uint8Array) : encoderUtf8.encode(argText(ctx, a));\n return tv(\"text\", md5Hex(bytes));\n }),\n );\n m.set(\n \"to_hex\",\n strict(\"text\", (ctx, args) => {\n const a = args[0]!;\n if (a.t === \"int8\") {\n const v = a.v as bigint;\n return tv(\"text\", (v < 0n ? (1n << 64n) + v : v).toString(16));\n }\n const n = argInt(ctx, a);\n return tv(\"text\", (n < 0 ? 0x100000000 + n : n).toString(16));\n }),\n );\n m.set(\n \"quote_ident\",\n strict(\"text\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n if (/^[a-z_][a-z0-9_$]*$/.test(s) && !QUOTE_KEYWORDS.has(s)) return tv(\"text\", s);\n return tv(\"text\", `\"${s.replaceAll('\"', '\"\"')}\"`);\n }),\n );\n m.set(\n \"quote_literal\",\n strict(\"text\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n return tv(\"text\", quoteLiteral(s));\n }),\n );\n m.set(\"quote_nullable\", (ctx, args) => {\n const a = args[0]!;\n if (a.v === null) return tv(\"text\", \"NULL\");\n return tv(\"text\", quoteLiteral(argText(ctx, a)));\n });\n m.set(\"format\", (ctx, args) => {\n if (args.length === 0 || args[0]!.v === null) return tv(\"text\", null);\n return tv(\"text\", formatImpl(ctx, argText(ctx, args[0]!), args.slice(1)));\n });\n\n // --- regex ---------------------------------------------------------------\n m.set(\n \"regexp_replace\",\n strict(\"text\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n const pattern = argText(ctx, args[1]!);\n const replacement = argText(ctx, args[2]!);\n const flags = args.length > 3 ? argText(ctx, args[3]!) : \"\";\n const js = new RegExp(pgRegexToJs(pattern), regexFlags(flags, !flags.includes(\"g\")));\n const rep = replacement.replace(/\\\\(\\d|&|\\\\)/g, (_, d: string) =>\n d === \"&\" ? \"$&\" : d === \"\\\\\" ? \"\\\\\" : `$${d}`,\n );\n return tv(\"text\", s.replace(js, rep));\n }),\n );\n m.set(\n \"regexp_match\",\n strict(\"text[]\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n const pattern = argText(ctx, args[1]!);\n const flags = args.length > 2 ? argText(ctx, args[2]!) : \"\";\n const js = new RegExp(pgRegexToJs(pattern), regexFlags(flags, true));\n const match = js.exec(s);\n if (!match) return tv(\"text[]\", null);\n const groups = match.length > 1 ? match.slice(1) : [match[0]];\n return tv(\n \"text[]\",\n makeArray(\n \"text\",\n groups.map((g) => (g === undefined ? null : g)),\n ),\n );\n }),\n );\n m.set(\n \"regexp_count\",\n strict(\"int4\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n const pattern = argText(ctx, args[1]!);\n const start = args.length > 2 ? argInt(ctx, args[2]!) : 1;\n const flags = args.length > 3 ? argText(ctx, args[3]!) : \"\";\n if (start < 1) throw pgError(\"invalid_parameter_value\", `invalid value for parameter \"start\": ${start}`);\n const js = new RegExp(pgRegexToJs(pattern), `${regexFlags(flags, true)}g`);\n const sub = chars(s)\n .slice(start - 1)\n .join(\"\");\n let count = 0;\n for (const _ of sub.matchAll(js)) count++;\n return tv(\"int4\", count);\n }),\n );\n m.set(\n \"regexp_like\",\n strict(\"bool\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n const pattern = argText(ctx, args[1]!);\n const flags = args.length > 2 ? argText(ctx, args[2]!) : \"\";\n const js = new RegExp(pgRegexToJs(pattern), regexFlags(flags, true));\n return tv(\"bool\", js.test(s));\n }),\n );\n m.set(\n \"regexp_substr\",\n strict(\"text\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n const pattern = argText(ctx, args[1]!);\n const start = args.length > 2 ? argInt(ctx, args[2]!) : 1;\n const nth = args.length > 3 ? argInt(ctx, args[3]!) : 1;\n const flags = args.length > 4 ? argText(ctx, args[4]!) : \"\";\n const js = new RegExp(pgRegexToJs(pattern), `${regexFlags(flags, true)}g`);\n const sub = chars(s)\n .slice(start - 1)\n .join(\"\");\n let i = 0;\n for (const match of sub.matchAll(js)) {\n i++;\n if (i === nth) return tv(\"text\", match[0]);\n }\n return tv(\"text\", null);\n }),\n );\n m.set(\n \"regexp_instr\",\n strict(\"int4\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n const pattern = argText(ctx, args[1]!);\n const start = args.length > 2 ? argInt(ctx, args[2]!) : 1;\n const nth = args.length > 3 ? argInt(ctx, args[3]!) : 1;\n const endoption = args.length > 4 ? argInt(ctx, args[4]!) : 0;\n const flags = args.length > 5 ? argText(ctx, args[5]!) : \"\";\n if (start < 1) throw pgError(\"invalid_parameter_value\", `invalid value for parameter \"start\": ${start}`);\n if (endoption !== 0 && endoption !== 1) {\n throw pgError(\"invalid_parameter_value\", `invalid value for parameter \"endoption\": ${endoption}`);\n }\n const js = new RegExp(pgRegexToJs(pattern), `${regexFlags(flags, true)}g`);\n const sub = chars(s)\n .slice(start - 1)\n .join(\"\");\n let i = 0;\n for (const match of sub.matchAll(js)) {\n i++;\n if (i === nth) {\n const base = start - 1 + chars(sub.slice(0, match.index)).length;\n return tv(\"int4\", endoption === 0 ? base + 1 : base + chars(match[0]).length + 1);\n }\n }\n return tv(\"int4\", 0);\n }),\n );\n m.set(\n \"regexp_split_to_array\",\n strict(\"text[]\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n const pattern = argText(ctx, args[1]!);\n const flags = args.length > 2 ? argText(ctx, args[2]!) : \"\";\n const js = new RegExp(pgRegexToJs(pattern), `${regexFlags(flags, true)}g`);\n const parts = regexpSplit(s, js);\n return tv(\"text[]\", makeArray(\"text\", parts));\n }),\n );\n\n m.set(\n \"string_to_array\",\n strict(\"text[]\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n const delim = args[1]!.v === null ? null : argText(ctx, args[1]!);\n const nullStr = args.length > 2 && args[2]!.v !== null ? argText(ctx, args[2]!) : null;\n let parts: string[];\n if (delim === null) parts = chars(s);\n else if (delim === \"\") parts = [s];\n else parts = s.split(delim);\n if (s === \"\" && delim !== null) parts = delim === \"\" ? [\"\"] : [\"\"];\n const items = parts.map((p) => (nullStr !== null && p === nullStr ? null : p));\n if (s === \"\")\n return tv(\n \"text[]\",\n makeArray(\"text\", items.length === 1 && items[0] === \"\" ? (nullStr === \"\" ? [null] : [\"\"]) : items),\n );\n return tv(\"text[]\", makeArray(\"text\", items));\n }),\n );\n\n m.set(\n \"encode\",\n strict(\"text\", (ctx, args) => {\n const bytes = castTo(ctx, args[0]!, \"bytea\", { explicit: true }).v as Uint8Array;\n const fmt = argText(ctx, args[1]!);\n return tv(\"text\", encodeBytes(bytes, fmt));\n }),\n );\n m.set(\n \"decode\",\n strict(\"bytea\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n const fmt = argText(ctx, args[1]!);\n return tv(\"bytea\", decodeBytes(s, fmt));\n }),\n );\n m.set(\n \"convert_to\",\n strict(\"bytea\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n const enc = argText(ctx, args[1]!).toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\");\n if (enc !== \"utf8\" && enc !== \"sqlascii\") throw unsupported(`convert_to encoding ${enc}`);\n return tv(\"bytea\", encoderUtf8.encode(s));\n }),\n );\n m.set(\n \"convert_from\",\n strict(\"text\", (ctx, args) => {\n const bytes = castTo(ctx, args[0]!, \"bytea\", { explicit: true }).v as Uint8Array;\n const enc = argText(ctx, args[1]!).toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\");\n if (enc !== \"utf8\" && enc !== \"sqlascii\") throw unsupported(`convert_from encoding ${enc}`);\n return tv(\"text\", decoderUtf8.decode(bytes));\n }),\n );\n m.set(\n \"get_byte\",\n strict(\"int4\", (ctx, args) => {\n const bytes = args[0]!.v as Uint8Array;\n const i = argInt(ctx, args[1]!);\n if (i < 0 || i >= bytes.length) throw pgError(\"array_subscript_error\", \"index out of range\", \"2202E\");\n return tv(\"int4\", bytes[i]!);\n }),\n );\n m.set(\n \"set_byte\",\n strict(\"bytea\", (ctx, args) => {\n const bytes = new Uint8Array(args[0]!.v as Uint8Array);\n const i = argInt(ctx, args[1]!);\n const b = argInt(ctx, args[2]!);\n if (i < 0 || i >= bytes.length) throw pgError(\"array_subscript_error\", \"index out of range\", \"2202E\");\n bytes[i] = b & 0xff;\n return tv(\"bytea\", bytes);\n }),\n );\n m.set(\n \"overlay\",\n strict(\"text\", (ctx, args) => {\n const s = chars(argText(ctx, args[0]!));\n const placing = argText(ctx, args[1]!);\n const from = argInt(ctx, args[2]!);\n const forLen = args.length > 3 ? argInt(ctx, args[3]!) : chars(placing).length;\n if (from <= 0) throw pgError(\"substring_error\", \"negative substring length not allowed\", \"22011\");\n const before = s.slice(0, from - 1).join(\"\");\n const after = s.slice(from - 1 + Math.max(forLen, 0)).join(\"\");\n return tv(\"text\", before + placing + after);\n }),\n );\n m.set(\n \"unistr\",\n strict(\"text\", (ctx, args) => {\n const s = argText(ctx, args[0]!);\n return tv(\"text\", unistrImpl(s));\n }),\n );\n\n return m;\n}\n\nfunction byteaSubstr(bytes: Uint8Array, start: number, len?: number): Uint8Array {\n if (len !== undefined && len < 0) throw pgError(\"substring_error\", \"negative substring length not allowed\", \"22011\");\n const from = Math.max(start, 1) - 1;\n const to = len === undefined ? bytes.length : Math.max(start + len - 1, 0);\n return bytes.slice(from, to);\n}\n\nfunction pad(s: string[], len: number, fill: string[], left: boolean): string {\n if (len <= 0) return \"\";\n if (s.length >= len) return s.slice(0, len).join(\"\");\n if (fill.length === 0) return s.join(\"\");\n const padLen = len - s.length;\n const padding: string[] = [];\n while (padding.length < padLen) padding.push(fill[padding.length % fill.length]!);\n return left ? padding.join(\"\") + s.join(\"\") : s.join(\"\") + padding.join(\"\");\n}\n\nfunction quoteLiteral(s: string): string {\n const escaped = s.replaceAll(\"'\", \"''\");\n if (escaped.includes(\"\\\\\")) return `E'${escaped.replaceAll(\"\\\\\", \"\\\\\\\\\")}'`;\n return `'${escaped}'`;\n}\n\nconst QUOTE_KEYWORDS = new Set([\n \"all\",\n \"analyse\",\n \"analyze\",\n \"and\",\n \"any\",\n \"array\",\n \"as\",\n \"asc\",\n \"asymmetric\",\n \"both\",\n \"case\",\n \"cast\",\n \"check\",\n \"collate\",\n \"column\",\n \"constraint\",\n \"create\",\n \"current_catalog\",\n \"current_date\",\n \"current_role\",\n \"current_time\",\n \"current_timestamp\",\n \"current_user\",\n \"default\",\n \"deferrable\",\n \"desc\",\n \"distinct\",\n \"do\",\n \"else\",\n \"end\",\n \"except\",\n \"false\",\n \"fetch\",\n \"for\",\n \"foreign\",\n \"from\",\n \"grant\",\n \"group\",\n \"having\",\n \"in\",\n \"initially\",\n \"intersect\",\n \"into\",\n \"lateral\",\n \"leading\",\n \"limit\",\n \"localtime\",\n \"localtimestamp\",\n \"not\",\n \"null\",\n \"offset\",\n \"on\",\n \"only\",\n \"or\",\n \"order\",\n \"placing\",\n \"primary\",\n \"references\",\n \"returning\",\n \"select\",\n \"session_user\",\n \"some\",\n \"symmetric\",\n \"table\",\n \"then\",\n \"to\",\n \"trailing\",\n \"true\",\n \"union\",\n \"unique\",\n \"user\",\n \"using\",\n \"variadic\",\n \"when\",\n \"where\",\n \"window\",\n \"with\",\n]);\n\nfunction formatImpl(ctx: Parameters<ScalarFn>[0], fmt: string, args: TypedValue[]): string {\n let out = \"\";\n let argIndex = 0;\n let i = 0;\n while (i < fmt.length) {\n const c = fmt[i]!;\n if (c !== \"%\") {\n out += c;\n i++;\n continue;\n }\n i++;\n if (fmt[i] === \"%\") {\n out += \"%\";\n i++;\n continue;\n }\n // %[position][flags][width]type\n const m = /^(\\d+\\$)?(-)?(\\d+)?([sIL])/.exec(fmt.slice(i));\n if (!m) throw pgError(\"invalid_parameter_value\", `unrecognized format() type specifier \"${fmt[i]}\"`);\n i += m[0].length;\n const pos = m[1] ? Number.parseInt(m[1], 10) - 1 : argIndex++;\n const arg = args[pos];\n if (arg === undefined) throw pgError(\"undefined_parameter\", \"too few arguments for format()\");\n let piece: string;\n if (m[4] === \"s\") {\n piece = arg.v === null ? \"\" : argText(ctx, arg);\n } else if (m[4] === \"I\") {\n if (arg.v === null)\n throw pgError(\"null_value_not_allowed\", \"null values cannot be formatted as an SQL identifier\", \"22004\");\n const s = argText(ctx, arg);\n piece = /^[a-z_][a-z0-9_$]*$/.test(s) && !QUOTE_KEYWORDS.has(s) ? s : `\"${s.replaceAll('\"', '\"\"')}\"`;\n } else {\n piece = arg.v === null ? \"NULL\" : quoteLiteral(argText(ctx, arg));\n }\n if (m[3]) {\n const width = Number.parseInt(m[3], 10);\n piece = m[2] ? piece.padEnd(width) : piece.padStart(width);\n }\n out += piece;\n }\n return out;\n}\n\nfunction regexpSplit(s: string, re: RegExp): string[] {\n const out: string[] = [];\n let last = 0;\n const global = new RegExp(re.source, re.flags.includes(\"g\") ? re.flags : `${re.flags}g`);\n for (const match of s.matchAll(global)) {\n if (match[0] === \"\") {\n if (match.index === last && match.index !== s.length) continue;\n }\n out.push(s.slice(last, match.index));\n last = match.index! + match[0].length;\n }\n out.push(s.slice(last));\n return out;\n}\n\nfunction unistrImpl(s: string): string {\n let out = \"\";\n let i = 0;\n while (i < s.length) {\n const c = s[i]!;\n if (c !== \"\\\\\") {\n out += c;\n i++;\n continue;\n }\n if (s[i + 1] === \"\\\\\") {\n out += \"\\\\\";\n i += 2;\n continue;\n }\n const next = s[i + 1];\n if (next === \"u\") {\n out += String.fromCodePoint(Number.parseInt(s.slice(i + 2, i + 6), 16));\n i += 6;\n } else if (next === \"U\") {\n out += String.fromCodePoint(Number.parseInt(s.slice(i + 2, i + 10), 16));\n i += 10;\n } else if (next === \"+\") {\n out += String.fromCodePoint(Number.parseInt(s.slice(i + 2, i + 8), 16));\n i += 8;\n } else if (next !== undefined && /[0-9a-fA-F]/.test(next)) {\n out += String.fromCodePoint(Number.parseInt(s.slice(i + 1, i + 5), 16));\n i += 5;\n } else {\n throw pgError(\"syntax\", \"invalid Unicode escape\");\n }\n }\n return out;\n}\n\n// --- base64 / hex / escape ---------------------------------------------------\n\nfunction encodeBytes(bytes: Uint8Array, fmt: string): string {\n switch (fmt.toLowerCase()) {\n case \"hex\": {\n let out = \"\";\n for (const b of bytes) out += b.toString(16).padStart(2, \"0\");\n return out;\n }\n case \"base64\": {\n // PG wraps base64 at 76 chars\n let bin = \"\";\n for (const b of bytes) bin += String.fromCharCode(b);\n const b64 = btoa(bin);\n const lines: string[] = [];\n for (let i = 0; i < b64.length; i += 76) lines.push(b64.slice(i, i + 76));\n return lines.join(\"\\n\");\n }\n case \"escape\": {\n let out = \"\";\n for (const b of bytes) {\n if (b === 92) out += \"\\\\\\\\\";\n else if (b < 32 || b > 126) out += `\\\\${b.toString(8).padStart(3, \"0\")}`;\n else out += String.fromCharCode(b);\n }\n return out;\n }\n default:\n throw pgError(\"invalid_parameter_value\", `unrecognized encoding: \"${fmt}\"`);\n }\n}\n\nfunction decodeBytes(s: string, fmt: string): Uint8Array {\n switch (fmt.toLowerCase()) {\n case \"hex\": {\n const clean = s.replaceAll(/\\s/g, \"\");\n if (clean.length % 2 !== 0)\n throw pgError(\"invalid_parameter_value\", \"invalid hexadecimal data: odd number of digits\");\n const out = new Uint8Array(clean.length / 2);\n for (let i = 0; i < out.length; i++) {\n const byte = Number.parseInt(clean.slice(i * 2, i * 2 + 2), 16);\n if (Number.isNaN(byte)) throw pgError(\"invalid_parameter_value\", `invalid hexadecimal digit`);\n out[i] = byte;\n }\n return out;\n }\n case \"base64\": {\n const clean = s.replaceAll(/\\s/g, \"\");\n const bin = atob(clean);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n }\n case \"escape\": {\n const out: number[] = [];\n let i = 0;\n while (i < s.length) {\n if (s[i] === \"\\\\\") {\n if (s[i + 1] === \"\\\\\") {\n out.push(92);\n i += 2;\n } else {\n out.push(Number.parseInt(s.slice(i + 1, i + 4), 8));\n i += 4;\n }\n } else {\n out.push(s.charCodeAt(i));\n i++;\n }\n }\n return new Uint8Array(out);\n }\n default:\n throw pgError(\"invalid_parameter_value\", `unrecognized encoding: \"${fmt}\"`);\n }\n}\n\n/** SUBSTRING(string SIMILAR pattern ESCAPE esc): SQL regex with %\" delimiters */\nfunction substringSimilar(s: string, pattern: string, escape: string): string | null {\n // Split pattern on escape-doublequote markers into three parts\n const marker = `${escape}\"`;\n const parts: string[] = [];\n let current = \"\";\n let i = 0;\n while (i < pattern.length) {\n if (escape !== \"\" && pattern.startsWith(marker, i) && escape !== '\"') {\n parts.push(current);\n current = \"\";\n i += marker.length;\n } else if (escape !== \"\" && pattern[i] === escape) {\n current += pattern.slice(i, i + 2);\n i += 2;\n } else {\n current += pattern[i];\n i++;\n }\n }\n parts.push(current);\n if (parts.length === 3) {\n const re = new RegExp(\n `^${stripAnchors(similarToRegex(parts[0]!, escape || null))}(${stripAnchors(similarToRegex(parts[1]!, escape || null))})${stripAnchors(similarToRegex(parts[2]!, escape || null))}$`,\n \"s\",\n );\n const match = re.exec(s);\n return match ? (match[1] ?? null) : null;\n }\n const re = new RegExp(similarToRegex(pattern, escape || null), \"s\");\n const match = re.exec(s);\n return match ? match[0] : null;\n}\n\nfunction stripAnchors(re: string): string {\n return re.replace(/^\\^/, \"\").replace(/\\$$/, \"\");\n}\n\n// --- MD5 (public domain style implementation) --------------------------------\n\nfunction md5Hex(bytes: Uint8Array): string {\n const s = [\n 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,\n 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15,\n 21,\n ];\n const K = new Uint32Array(64);\n for (let i = 0; i < 64; i++) K[i] = Math.floor(Math.abs(Math.sin(i + 1)) * 2 ** 32);\n\n const origLen = bytes.length;\n const bitLen = origLen * 8;\n const padded = new Uint8Array((((origLen + 8) >> 6) << 6) + 64);\n padded.set(bytes);\n padded[origLen] = 0x80;\n const dv = new DataView(padded.buffer);\n dv.setUint32(padded.length - 8, bitLen >>> 0, true);\n dv.setUint32(padded.length - 4, Math.floor(bitLen / 2 ** 32), true);\n\n let a0 = 0x67452301;\n let b0 = 0xefcdab89;\n let c0 = 0x98badcfe;\n let d0 = 0x10325476;\n\n const M = new Uint32Array(16);\n for (let chunk = 0; chunk < padded.length; chunk += 64) {\n for (let j = 0; j < 16; j++) M[j] = dv.getUint32(chunk + j * 4, true);\n let A = a0;\n let B = b0;\n let C = c0;\n let D = d0;\n for (let i = 0; i < 64; i++) {\n let F: number;\n let g: number;\n if (i < 16) {\n F = (B & C) | (~B & D);\n g = i;\n } else if (i < 32) {\n F = (D & B) | (~D & C);\n g = (5 * i + 1) % 16;\n } else if (i < 48) {\n F = B ^ C ^ D;\n g = (3 * i + 5) % 16;\n } else {\n F = C ^ (B | ~D);\n g = (7 * i) % 16;\n }\n F = (F + A + K[i]! + M[g]!) >>> 0;\n A = D;\n D = C;\n C = B;\n B = (B + ((F << s[i]!) | (F >>> (32 - s[i]!)))) >>> 0;\n }\n a0 = (a0 + A) >>> 0;\n b0 = (b0 + B) >>> 0;\n c0 = (c0 + C) >>> 0;\n d0 = (d0 + D) >>> 0;\n }\n\n const le = (n: number): string => {\n let out = \"\";\n for (let i = 0; i < 4; i++) out += ((n >>> (i * 8)) & 0xff).toString(16).padStart(2, \"0\");\n return out;\n };\n return le(a0) + le(b0) + le(c0) + le(d0);\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport {\n parseTsvector,\n phrasetoTsquery,\n plaintoTsquery,\n toTsquery,\n toTsvector,\n tsHeadline,\n tsRank,\n tsvectorLength,\n tsvectorMatches,\n tsvectorSetweight,\n tsvectorStrip,\n} from \"../tsearch/tsearch.ts\";\nimport { castTo } from \"../types/cast.ts\";\nimport { type PgArray, tv } from \"../types/value.ts\";\nimport { argText, type ScalarFn, strict } from \"./util.ts\";\n\nexport function getTsearchFunctions(): Map<string, ScalarFn> {\n const m = new Map<string, ScalarFn>();\n\n m.set(\n \"to_tsvector\",\n strict(\"tsvector\", (ctx, args) => {\n const config = args.length > 1 ? argText(ctx, args[0]!) : \"english\";\n const text = argText(ctx, args[args.length - 1]!);\n return tv(\"tsvector\", toTsvector(config, text));\n }),\n );\n m.set(\n \"to_tsquery\",\n strict(\"tsquery\", (ctx, args) => {\n const config = args.length > 1 ? argText(ctx, args[0]!) : \"english\";\n const text = argText(ctx, args[args.length - 1]!);\n return tv(\"tsquery\", toTsquery(config, text));\n }),\n );\n m.set(\n \"plainto_tsquery\",\n strict(\"tsquery\", (ctx, args) => {\n const config = args.length > 1 ? argText(ctx, args[0]!) : \"english\";\n const text = argText(ctx, args[args.length - 1]!);\n return tv(\"tsquery\", plaintoTsquery(config, text));\n }),\n );\n m.set(\n \"phraseto_tsquery\",\n strict(\"tsquery\", (ctx, args) => {\n const config = args.length > 1 ? argText(ctx, args[0]!) : \"english\";\n const text = argText(ctx, args[args.length - 1]!);\n return tv(\"tsquery\", phrasetoTsquery(config, text));\n }),\n );\n m.set(\n \"ts_rank\",\n strict(\"float4\", (ctx, args) => {\n // signatures: (v, q) | (w, v, q) | (v, q, norm) | (w, v, q, norm)\n let i = 0;\n let weights: number[] | undefined;\n if (args[0]!.t === \"float4[]\" || args[0]!.t === \"float8[]\" || args[0]!.t === \"numeric[]\") {\n const arr = castTo(ctx, args[0]!, \"float4[]\", { explicit: true }).v as PgArray;\n if (arr.items.length < 4) {\n throw pgError(\"array_subscript_error\", \"array of weight is too short\", \"2202E\");\n }\n weights = arr.items.map((x) => {\n if (x === null) throw pgError(\"null_value_not_allowed\", \"array of weight must not contain nulls\", \"22004\");\n return x as number;\n });\n i = 1;\n }\n const vec = castTo(ctx, args[i]!, \"tsvector\", { explicit: true }).v as string;\n const query = castTo(ctx, args[i + 1]!, \"tsquery\", { explicit: true }).v as string;\n const norm = args.length > i + 2 ? (castTo(ctx, args[i + 2]!, \"int4\", { explicit: true }).v as number) : 0;\n return tv(\"float4\", tsRank(vec, query, weights, norm));\n }),\n );\n m.set(\"ts_rank_cd\", m.get(\"ts_rank\")!);\n m.set(\n \"ts_headline\",\n strict(\"text\", (ctx, args) => {\n // ts_headline([config,] document, query [, options])\n let i = 0;\n let config = \"english\";\n const configForm = args.length === 4 || (args.length === 3 && args[2]!.t === \"tsquery\");\n if (configForm) {\n config = argText(ctx, args[0]!);\n i = 1;\n }\n const document = argText(ctx, args[i]!);\n const query = castTo(ctx, args[i + 1]!, \"tsquery\", { explicit: true }).v as string;\n const options = args.length > i + 2 ? argText(ctx, args[i + 2]!) : undefined;\n return tv(\"text\", tsHeadline(config, document, query, options));\n }),\n );\n m.set(\n \"setweight\",\n strict(\"tsvector\", (ctx, args) => {\n const vec = castTo(ctx, args[0]!, \"tsvector\", { explicit: true }).v as string;\n const w = argText(ctx, args[1]!);\n return tv(\"tsvector\", tsvectorSetweight(vec, w));\n }),\n );\n m.set(\n \"strip\",\n strict(\"tsvector\", (ctx, args) => {\n const vec = castTo(ctx, args[0]!, \"tsvector\", { explicit: true }).v as string;\n return tv(\"tsvector\", tsvectorStrip(vec));\n }),\n );\n m.set(\n \"numnode\",\n strict(\"int4\", (ctx, args) => {\n const q = castTo(ctx, args[0]!, \"tsquery\", { explicit: true }).v as string;\n // count lexemes + operators in canonical text\n let count = 0;\n const re = /'(?:[^']|'')*'|[&|!]|<\\d+>|<->/g;\n let match: RegExpExecArray | null;\n while ((match = re.exec(q)) !== null) {\n void match;\n count++;\n }\n return tv(\"int4\", count);\n }),\n );\n m.set(\n \"ts_match_vq\",\n strict(\"bool\", (ctx, args) => {\n const vec = castTo(ctx, args[0]!, \"tsvector\", { explicit: true }).v as string;\n const query = castTo(ctx, args[1]!, \"tsquery\", { explicit: true }).v as string;\n return tv(\"bool\", tsvectorMatches(vec, query));\n }),\n );\n m.set(\n \"tsvector_in_check\",\n strict(\"tsvector\", (ctx, args) => tv(\"tsvector\", parseTsvector(argText(ctx, args[0]!)))),\n );\n m.set(\n \"tsvector_length\",\n strict(\"int4\", (ctx, args) => {\n const vec = castTo(ctx, args[0]!, \"tsvector\", { explicit: true }).v as string;\n return tv(\"int4\", tsvectorLength(vec));\n }),\n );\n\n return m;\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport type { EngineCtx } from \"../expressions/context.ts\";\nimport type { TypedValue } from \"../types/value.ts\";\nimport { getArrayFunctions } from \"./array-fns.ts\";\nimport { getDatetimeFunctions } from \"./datetime-registry.ts\";\nimport { getJsonFunctions } from \"./json-fns.ts\";\nimport { getMathFunctions } from \"./math-fns.ts\";\nimport { getMiscFunctions } from \"./misc-fns.ts\";\nimport { getStringFunctions } from \"./string-fns.ts\";\nimport { getTsearchFunctions } from \"./tsearch-fns.ts\";\nimport type { ScalarFn } from \"./util.ts\";\n\nlet REGISTRY: Map<string, ScalarFn> | null = null;\n\n/**\n * All engine scalar builtins keyed by lowercase name. Built lazily once;\n * the inventory gate walks this map against the oracle's pg_proc.\n */\nexport function getScalarFunctions(): Map<string, ScalarFn> {\n if (REGISTRY) return REGISTRY;\n const registry = new Map<string, ScalarFn>();\n for (const source of [\n getStringFunctions(),\n getMathFunctions(),\n getDatetimeFunctions(),\n getJsonFunctions(),\n getArrayFunctions(),\n getTsearchFunctions(),\n getMiscFunctions(),\n ]) {\n for (const [name, fn] of source) {\n registry.set(name, fn);\n }\n }\n // `length(tsvector)` overload: dispatch by arg type over the string version\n const stringLength = registry.get(\"length\")!;\n const tsvectorLength = registry.get(\"tsvector_length\")!;\n registry.set(\"length\", (ctx, args) => {\n if (args[0] !== undefined && args[0].t === \"tsvector\") return tsvectorLength(ctx, args);\n return stringLength(ctx, args);\n });\n REGISTRY = registry;\n return registry;\n}\n\nexport function hasScalarFunction(name: string): boolean {\n return getScalarFunctions().has(name);\n}\n\nexport function callScalarFunction(ctx: EngineCtx, name: string, args: TypedValue[]): TypedValue {\n const fn = getScalarFunctions().get(name);\n if (!fn) {\n throw pgError(\"undefined_function\", `function ${name}(${args.map((a) => a.t).join(\", \")}) does not exist`, \"42883\");\n }\n return fn(ctx, args);\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport { tsqueryCombine, tsqueryNegate, tsvectorConcat, tsvectorMatches } from \"../tsearch/tsearch.ts\";\nimport { castTo, isTextType, unifyTypes } from \"../types/cast.ts\";\nimport { datumCompare, datumEquals } from \"../types/compare.ts\";\nimport {\n DATE_NEG_INF,\n DATE_POS_INF,\n type Interval,\n intervalAdd,\n intervalNeg,\n makeInterval,\n TS_NEG_INF,\n TS_POS_INF,\n timestampAddInterval,\n USECS_PER_DAY,\n} from \"../types/datetime.ts\";\nimport {\n type JsonbValue,\n jsonbArr,\n jsonbContains,\n jsonbText,\n parseJsonText as parseJsonbText,\n} from \"../types/jsonb.ts\";\nimport {\n isNumeric,\n makeNumeric,\n type Numeric,\n numericAbs,\n numericAdd,\n numericDiv,\n numericFromBigInt,\n numericMod,\n numericMul,\n numericNeg,\n numericPower,\n numericSqrt,\n numericSub,\n numericToNumber,\n parseNumeric,\n} from \"../types/numeric.ts\";\nimport {\n arrayElemType,\n arrayTypeOf,\n checkInt2,\n checkInt4,\n checkInt8,\n type Datum,\n datumText,\n float8Text,\n isArrayType,\n type JsonbWrap,\n makeArray,\n type PgArray,\n type TypedValue,\n type TypeId,\n tv,\n typeDisplayName,\n wrapJsonb,\n} from \"../types/value.ts\";\nimport type { EngineCtx } from \"./context.ts\";\nimport { likeMatch, regexMatch } from \"./pattern.ts\";\n\nconst NUM_LADDER = [\"int2\", \"int4\", \"int8\", \"numeric\", \"float4\", \"float8\"];\n\nfunction opNotExist(op: string, l: TypeId, r: TypeId): never {\n throw pgError(\"undefined_function\", `operator does not exist: ${typeDisplayName(l)} ${op} ${typeDisplayName(r)}`);\n}\n\nfunction isIntType(t: TypeId): boolean {\n return t === \"int2\" || t === \"int4\" || t === \"int8\";\n}\n\nfunction isNumType(t: TypeId): boolean {\n return NUM_LADDER.includes(t);\n}\n\nfunction toF8(t: TypeId, v: Datum): number {\n if (t === \"int8\") return Number(v as bigint);\n if (t === \"numeric\") return numericToNumber(v as Numeric);\n return v as number;\n}\n\nfunction toNumeric(t: TypeId, v: Datum): Numeric {\n if (t === \"numeric\") return v as Numeric;\n if (t === \"int8\") return numericFromBigInt(v as bigint);\n return numericFromBigInt(BigInt(v as number));\n}\n\nfunction toI8(t: TypeId, v: Datum): bigint {\n return t === \"int8\" ? (v as bigint) : BigInt(v as number);\n}\n\nconst COMPARISONS = new Set([\"=\", \"<>\", \"<\", \"<=\", \">\", \">=\"]);\n\n/** per-operator: types that have operator candidates an unknown can resolve against */\nconst ADD_CAPABLE = new Set([\n \"int2\",\n \"int4\",\n \"int8\",\n \"float4\",\n \"float8\",\n \"numeric\",\n \"money\",\n \"interval\",\n \"date\",\n \"time\",\n \"timetz\",\n \"timestamp\",\n \"timestamptz\",\n]);\nconst MOD_CAPABLE = new Set([\"int2\", \"int4\", \"int8\", \"numeric\"]);\nconst POW_CAPABLE = new Set([\"int2\", \"int4\", \"int8\", \"float4\", \"float8\", \"numeric\"]);\nconst BIT_CAPABLE = new Set([\"int2\", \"int4\", \"int8\", \"bit\", \"varbit\"]);\n\nfunction opCapable(op: string, t: TypeId): boolean {\n switch (op) {\n case \"+\":\n case \"-\":\n case \"*\":\n case \"/\":\n return ADD_CAPABLE.has(t);\n case \"%\":\n return MOD_CAPABLE.has(t);\n case \"^\":\n return POW_CAPABLE.has(t);\n case \"&\":\n case \"|\":\n case \"#\":\n case \"<<\":\n case \">>\":\n return BIT_CAPABLE.has(t);\n default:\n return true;\n }\n}\n\n/** resolve unknown-typed operands against the other side */\nfunction resolveUnknowns(ctx: EngineCtx, op: string, l: TypedValue, r: TypedValue): [TypedValue, TypedValue] {\n // numeric/bit operators have no candidates for e.g. bool \u2014 report original\n // types (\"operator does not exist: unknown + boolean\") instead of coercing\n // types whose || operator concatenates same-type operands; anything else pairs\n // with unknown via `text || anynonarray` (result is text)\n const concatsWithSelf = (t: TypeId): boolean =>\n isTextType(t) ||\n t === \"bytea\" ||\n t === \"bit\" ||\n t === \"varbit\" ||\n t === \"jsonb\" ||\n t === \"json\" ||\n t === \"tsvector\" ||\n t === \"tsquery\" ||\n isArrayType(t);\n // ^ has only float8 and numeric candidates: ints resolve to the preferred float8\n const unknownTarget = (known: TypeId): TypeId => {\n if (op === \"^\" && known !== \"numeric\") return \"float8\";\n if (op === \"||\" && !concatsWithSelf(known)) return \"text\";\n return known;\n };\n if (l.t === \"unknown\" && r.t !== \"unknown\") {\n if (!opCapable(op, r.t)) opNotExist(op, l.t, r.t);\n const target = unknownTarget(r.t);\n return [castTo(ctx, l, target), target === r.t ? r : castTo(ctx, r, target)];\n }\n if (r.t === \"unknown\" && l.t !== \"unknown\") {\n if (!opCapable(op, l.t)) opNotExist(op, l.t, r.t);\n const target = unknownTarget(l.t);\n return [target === l.t ? l : castTo(ctx, l, target), castTo(ctx, r, target)];\n }\n if (l.t === \"unknown\" && r.t === \"unknown\") {\n if (COMPARISONS.has(op) || op === \"||\" || op === \"~~\" || op === \"~\") {\n return [castTo(ctx, l, \"text\"), castTo(ctx, r, \"text\")];\n }\n // ^ has only numeric candidates, so the preferred type float8 wins\n if (op === \"^\") {\n return [castTo(ctx, l, \"float8\"), castTo(ctx, r, \"float8\")];\n }\n // other overloaded numeric/bit operators cannot pick a candidate from two unknowns\n if (AMBIGUOUS_ON_UNKNOWN.has(op)) {\n throw pgError(\"ambiguous_function\", `operator is not unique: unknown ${op} unknown`);\n }\n }\n return [l, r];\n}\n\n/** operators with multiple candidate signatures for (unknown, unknown) \u2014 PG raises 42725 */\nconst AMBIGUOUS_ON_UNKNOWN = new Set([\"+\", \"-\", \"*\", \"/\", \"%\", \"&\", \"|\", \"#\", \"<<\", \">>\"]);\n\nexport function evalBinary(ctx: EngineCtx, op: string, l0: TypedValue, r0: TypedValue): TypedValue {\n // jsonb/json extraction ops keep unknown on rhs as text\n const [l, r] = resolveJsonUnknowns(ctx, op, l0, r0);\n\n if (COMPARISONS.has(op)) {\n return evalComparison(ctx, op, l, r);\n }\n\n switch (op) {\n case \"+\":\n case \"-\":\n case \"*\":\n case \"/\":\n case \"%\":\n case \"^\":\n return evalArithmetic(ctx, op, l, r);\n case \"||\":\n return evalConcat(ctx, l, r);\n case \"&\":\n case \"|\":\n case \"#\":\n case \"<<\":\n case \">>\":\n return evalBitwise(ctx, op, l, r);\n case \"~~\":\n case \"~~*\":\n case \"!~~\":\n case \"!~~*\":\n return evalLikeOp(ctx, op, l, r);\n case \"~\":\n case \"~*\":\n case \"!~\":\n case \"!~*\":\n return evalRegexOp(ctx, op, l, r);\n case \"@>\":\n case \"<@\":\n case \"&&\":\n return evalContainment(ctx, op, l, r);\n case \"->\":\n case \"->>\":\n case \"#>\":\n case \"#>>\":\n return evalJsonExtract(ctx, op, l, r);\n case \"?\":\n case \"?|\":\n case \"?&\":\n return evalJsonbExists(ctx, op, l, r);\n case \"#-\":\n return evalJsonbDeletePath(ctx, l, r);\n case \"@@\":\n return evalTextSearchMatch(ctx, l, r);\n default:\n opNotExist(op, l.t, r.t);\n }\n}\n\nfunction resolveJsonUnknowns(ctx: EngineCtx, op: string, l: TypedValue, r: TypedValue): [TypedValue, TypedValue] {\n if ((op === \"->\" || op === \"->>\") && (l.t === \"json\" || l.t === \"jsonb\")) {\n if (r.t === \"unknown\") return [l, castTo(ctx, r, \"text\")];\n return [l, r];\n }\n if ((op === \"#>\" || op === \"#>>\") && (l.t === \"json\" || l.t === \"jsonb\")) {\n if (r.t === \"unknown\") return [l, castTo(ctx, r, \"text[]\")];\n return [l, r];\n }\n if ((op === \"?\" || op === \"-\") && l.t === \"jsonb\" && r.t === \"unknown\") {\n return [l, castTo(ctx, r, \"text\")];\n }\n if ((op === \"?|\" || op === \"?&\" || op === \"#-\") && l.t === \"jsonb\" && r.t === \"unknown\") {\n return [l, castTo(ctx, r, \"text[]\")];\n }\n if (op === \"@>\" || op === \"<@\") {\n if (l.t === \"jsonb\" && r.t === \"unknown\") return [l, castTo(ctx, r, \"jsonb\")];\n if (r.t === \"jsonb\" && l.t === \"unknown\") return [castTo(ctx, l, \"jsonb\"), r];\n }\n if (op === \"-\" && l.t === \"jsonb\" && (r.t === \"text\" || r.t === \"int4\" || r.t === \"text[]\")) {\n return [l, r];\n }\n return resolveUnknowns(ctx, op, l, r);\n}\n\nfunction evalComparison(ctx: EngineCtx, op: string, l: TypedValue, r: TypedValue): TypedValue {\n const unified = unifyTypes(l.t, r.t);\n if (unified === null) opNotExist(op, l.t, r.t);\n if (l.v === null || r.v === null) return tv(\"bool\", null);\n const lv = castTo(ctx, l, unified).v;\n const rv = castTo(ctx, r, unified).v;\n const c = datumCompare(unified, lv, rv, ctx);\n let result: boolean;\n switch (op) {\n case \"=\":\n result = c === 0;\n break;\n case \"<>\":\n result = c !== 0;\n break;\n case \"<\":\n result = c < 0;\n break;\n case \"<=\":\n result = c <= 0;\n break;\n case \">\":\n result = c > 0;\n break;\n default:\n result = c >= 0;\n }\n return tv(\"bool\", result);\n}\n\n// --- arithmetic --------------------------------------------------------------\n\nfunction addI(t: TypeId, a: bigint, b: bigint): Datum {\n const r = a + b;\n return checkIntRange(t, r);\n}\n\nfunction checkIntRange(t: TypeId, r: bigint): Datum {\n if (t === \"int2\") return checkInt2(Number(r));\n if (t === \"int4\") return checkInt4(Number(r));\n return checkInt8(r);\n}\n\nfunction evalArithmetic(ctx: EngineCtx, op: string, l: TypedValue, r: TypedValue): TypedValue {\n const lt = l.t;\n const rt = r.t;\n\n // jsonb - text / int / text[] (key, index, key-set deletion)\n if (op === \"-\" && lt === \"jsonb\") {\n return evalJsonbDelete(ctx, l, r);\n }\n\n // datetime / interval arithmetic\n const dt = tryDatetimeArith(ctx, op, l, r);\n if (dt) return dt;\n\n // money\n const money = tryMoneyArith(op, l, r);\n if (money) return money;\n\n if (!isNumType(lt) || !isNumType(rt)) opNotExist(op, lt, rt);\n if (l.v === null || r.v === null) {\n return tv(NUM_LADDER[Math.max(NUM_LADDER.indexOf(lt), NUM_LADDER.indexOf(rt))]!, null);\n }\n\n if (op === \"^\") {\n // numeric^numeric only when both non-float and at least one numeric\u2026 PG picks\n // float8 for int args, numeric when either side is numeric\n if (\n (lt === \"numeric\" || rt === \"numeric\") &&\n lt !== \"float4\" &&\n lt !== \"float8\" &&\n rt !== \"float4\" &&\n rt !== \"float8\"\n ) {\n return tv(\"numeric\", numericPower(toNumeric(lt, l.v), toNumeric(rt, r.v)));\n }\n const res = toF8(lt, l.v) ** toF8(rt, r.v);\n if (!Number.isFinite(res) && Number.isFinite(toF8(lt, l.v)) && Number.isFinite(toF8(rt, r.v))) {\n if (Number.isNaN(res)) {\n throw pgError(\n \"invalid_parameter_value\",\n \"a negative number raised to a non-integer power yields a complex result\",\n );\n }\n throw pgError(\"numeric_value_out_of_range\", \"value out of range: overflow\");\n }\n return tv(\"float8\", res);\n }\n\n const idx = Math.max(NUM_LADDER.indexOf(lt), NUM_LADDER.indexOf(rt));\n const resultType = NUM_LADDER[idx]!;\n\n if (resultType === \"float4\" || resultType === \"float8\") {\n const a = toF8(lt, l.v);\n const b = toF8(rt, r.v);\n let res: number;\n switch (op) {\n case \"+\":\n res = a + b;\n break;\n case \"-\":\n res = a - b;\n break;\n case \"*\":\n res = a * b;\n break;\n case \"/\":\n if (b === 0) throw pgError(\"division_by_zero\", \"division by zero\");\n res = a / b;\n break;\n default:\n opNotExist(op, lt, rt);\n }\n if (resultType === \"float4\") {\n const f = Math.fround(res);\n if (!Number.isFinite(f) && Number.isFinite(a) && Number.isFinite(b)) {\n throw pgError(\"numeric_value_out_of_range\", \"value out of range: overflow\");\n }\n return tv(\"float4\", f);\n }\n if (!Number.isFinite(res) && Number.isFinite(a) && Number.isFinite(b) && !Number.isNaN(res)) {\n throw pgError(\"numeric_value_out_of_range\", \"value out of range: overflow\");\n }\n return tv(\"float8\", res);\n }\n\n if (resultType === \"numeric\") {\n const a = toNumeric(lt, l.v);\n const b = toNumeric(rt, r.v);\n switch (op) {\n case \"+\":\n return tv(\"numeric\", numericAdd(a, b));\n case \"-\":\n return tv(\"numeric\", numericSub(a, b));\n case \"*\":\n return tv(\"numeric\", numericMul(a, b));\n case \"/\":\n return tv(\"numeric\", numericDiv(a, b));\n case \"%\":\n return tv(\"numeric\", numericMod(a, b));\n default:\n opNotExist(op, lt, rt);\n }\n }\n\n // integer arithmetic with overflow checks\n const a = toI8(lt, l.v);\n const b = toI8(rt, r.v);\n switch (op) {\n case \"+\":\n return tv(resultType, addI(resultType, a, b));\n case \"-\":\n return tv(resultType, checkIntRange(resultType, a - b));\n case \"*\":\n return tv(resultType, checkIntRange(resultType, a * b));\n case \"/\": {\n if (b === 0n) throw pgError(\"division_by_zero\", \"division by zero\");\n const q = a / b;\n // BigInt division truncates toward zero (matches PG)\n return tv(resultType, checkIntRange(resultType, q));\n }\n case \"%\": {\n if (b === 0n) throw pgError(\"division_by_zero\", \"division by zero\");\n return tv(resultType, checkIntRange(resultType, a % b));\n }\n default:\n opNotExist(op, lt, rt);\n }\n}\n\nfunction tryDatetimeArith(ctx: EngineCtx, op: string, l: TypedValue, r: TypedValue): TypedValue | null {\n const lt = l.t;\n const rt = r.t;\n const isDT = (t: TypeId): boolean => [\"date\", \"time\", \"timestamp\", \"timestamptz\", \"interval\"].includes(t);\n if (!isDT(lt) && !isDT(rt)) return null;\n\n const key = `${lt}${op}${rt}`;\n const nullOf = (t: TypeId): TypedValue => tv(t, null);\n\n switch (key) {\n case \"date+int4\":\n case \"date+int2\": {\n if (l.v === null || r.v === null) return nullOf(\"date\");\n return tv(\"date\", dateAddDays(l.v as number, Number(r.v)));\n }\n case \"int4+date\":\n case \"int2+date\": {\n if (l.v === null || r.v === null) return nullOf(\"date\");\n return tv(\"date\", dateAddDays(r.v as number, Number(l.v)));\n }\n case \"date-int4\":\n case \"date-int2\": {\n if (l.v === null || r.v === null) return nullOf(\"date\");\n return tv(\"date\", dateAddDays(l.v as number, -Number(r.v)));\n }\n case \"date-date\": {\n if (l.v === null || r.v === null) return nullOf(\"int4\");\n return tv(\"int4\", (l.v as number) - (r.v as number));\n }\n case \"date+interval\":\n case \"interval+date\": {\n const d = lt === \"date\" ? l : r;\n const iv = lt === \"date\" ? r : l;\n if (d.v === null || iv.v === null) return nullOf(\"timestamp\");\n const ts = BigInt(d.v as number) * USECS_PER_DAY;\n return tv(\"timestamp\", timestampAddInterval(ts, iv.v as Interval));\n }\n case \"date-interval\": {\n if (l.v === null || r.v === null) return nullOf(\"timestamp\");\n const ts = BigInt(l.v as number) * USECS_PER_DAY;\n return tv(\"timestamp\", timestampAddInterval(ts, intervalNeg(r.v as Interval)));\n }\n case \"date+time\":\n case \"time+date\": {\n const d = lt === \"date\" ? l : r;\n const t = lt === \"date\" ? r : l;\n if (d.v === null || t.v === null) return nullOf(\"timestamp\");\n return tv(\"timestamp\", BigInt(d.v as number) * USECS_PER_DAY + (t.v as bigint));\n }\n case \"timestamp+interval\":\n case \"interval+timestamp\": {\n const ts = lt === \"timestamp\" ? l : r;\n const iv = lt === \"timestamp\" ? r : l;\n if (ts.v === null || iv.v === null) return nullOf(\"timestamp\");\n return tv(\"timestamp\", timestampAddInterval(ts.v as bigint, iv.v as Interval));\n }\n case \"timestamp-interval\": {\n if (l.v === null || r.v === null) return nullOf(\"timestamp\");\n return tv(\"timestamp\", timestampAddInterval(l.v as bigint, intervalNeg(r.v as Interval)));\n }\n case \"timestamptz+interval\":\n case \"interval+timestamptz\": {\n const ts = lt === \"timestamptz\" ? l : r;\n const iv = lt === \"timestamptz\" ? r : l;\n if (ts.v === null || iv.v === null) return nullOf(\"timestamptz\");\n return tv(\"timestamptz\", timestamptzAddInterval(ctx, ts.v as bigint, iv.v as Interval));\n }\n case \"timestamptz-interval\": {\n if (l.v === null || r.v === null) return nullOf(\"timestamptz\");\n return tv(\"timestamptz\", timestamptzAddInterval(ctx, l.v as bigint, intervalNeg(r.v as Interval)));\n }\n case \"timestamp-timestamp\":\n case \"timestamptz-timestamptz\": {\n if (l.v === null || r.v === null) return nullOf(\"interval\");\n return tv(\"interval\", timestampDiff(l.v as bigint, r.v as bigint));\n }\n case \"time+interval\":\n case \"interval+time\": {\n const t = lt === \"time\" ? l : r;\n const iv = lt === \"time\" ? r : l;\n if (t.v === null || iv.v === null) return nullOf(\"time\");\n let micros = ((t.v as bigint) + (iv.v as Interval).micros) % USECS_PER_DAY;\n if (micros < 0n) micros += USECS_PER_DAY;\n return tv(\"time\", micros);\n }\n case \"time-interval\": {\n if (l.v === null || r.v === null) return nullOf(\"time\");\n let micros = ((l.v as bigint) - (r.v as Interval).micros) % USECS_PER_DAY;\n if (micros < 0n) micros += USECS_PER_DAY;\n return tv(\"time\", micros);\n }\n case \"time-time\": {\n if (l.v === null || r.v === null) return nullOf(\"interval\");\n return tv(\"interval\", makeInterval(0, 0, (l.v as bigint) - (r.v as bigint)));\n }\n case \"interval+interval\": {\n if (l.v === null || r.v === null) return nullOf(\"interval\");\n return tv(\"interval\", intervalAdd(l.v as Interval, r.v as Interval));\n }\n case \"interval-interval\": {\n if (l.v === null || r.v === null) return nullOf(\"interval\");\n return tv(\"interval\", intervalAdd(l.v as Interval, intervalNeg(r.v as Interval)));\n }\n default:\n break;\n }\n\n // interval * number / interval / number\n if (op === \"*\" && lt === \"interval\" && isNumType(rt)) {\n if (l.v === null || r.v === null) return nullOf(\"interval\");\n return tv(\"interval\", intervalScale(l.v as Interval, toF8(rt, r.v)));\n }\n if (op === \"*\" && rt === \"interval\" && isNumType(lt)) {\n if (l.v === null || r.v === null) return nullOf(\"interval\");\n return tv(\"interval\", intervalScale(r.v as Interval, toF8(lt, l.v)));\n }\n if (op === \"/\" && lt === \"interval\" && isNumType(rt)) {\n if (l.v === null || r.v === null) return nullOf(\"interval\");\n const f = toF8(rt, r.v);\n if (f === 0) throw pgError(\"division_by_zero\", \"division by zero\");\n return tv(\"interval\", intervalScale(l.v as Interval, 1 / f));\n }\n if (op === \"-\" && lt === \"interval\" && rt === \"interval\") {\n if (l.v === null || r.v === null) return nullOf(\"interval\");\n return tv(\"interval\", intervalAdd(l.v as Interval, intervalNeg(r.v as Interval)));\n }\n // unknown-side coercions: date + 'unknown'? let caller resolve; here try casting unknown\n if (lt === \"unknown\" || rt === \"unknown\") {\n const known = lt === \"unknown\" ? rt : lt;\n if (isDT(known)) {\n // interpret the unknown as interval for +/- with timestamps, else fail through\n const target = known === \"interval\" ? \"interval\" : \"interval\";\n try {\n const lc = lt === \"unknown\" ? castTo(ctx, l, target) : l;\n const rc = rt === \"unknown\" ? castTo(ctx, r, target) : r;\n return tryDatetimeArith(ctx, op, lc, rc) ?? null;\n } catch {\n return null;\n }\n }\n }\n return null;\n}\n\nfunction dateAddDays(d: number, days: number): number {\n if (d === DATE_POS_INF || d === DATE_NEG_INF) return d;\n const r = d + days;\n if (r >= DATE_POS_INF || r <= DATE_NEG_INF) {\n throw pgError(\"invalid_datetime\", \"date out of range\");\n }\n return r;\n}\n\nfunction timestamptzAddInterval(ctx: EngineCtx, ts: bigint, iv: Interval): bigint {\n if (ts === TS_POS_INF || ts === TS_NEG_INF) return ts;\n if (iv.months === 0 && iv.days === 0) return ts + iv.micros;\n // months/days arithmetic happens in local time\n const off1 = ctx.zoneOffsetAt(ts);\n const local = ts + BigInt(off1) * 1_000_000n;\n const localResult = timestampAddInterval(local, makeInterval(iv.months, iv.days, 0n));\n const off2 = ctx.zoneOffsetForNaive(localResult);\n return localResult - BigInt(off2) * 1_000_000n + iv.micros;\n}\n\nfunction timestampDiff(a: bigint, b: bigint): Interval {\n if (a === TS_POS_INF || a === TS_NEG_INF || b === TS_POS_INF || b === TS_NEG_INF) {\n throw pgError(\"invalid_datetime\", \"cannot subtract infinite timestamps\", \"22008\");\n }\n const micros = a - b;\n // PG justifies hours into days\n const days = Number(micros / USECS_PER_DAY);\n let rem = micros % USECS_PER_DAY;\n let d = days;\n if (d > 0 && rem < 0n) {\n d -= 1;\n rem += USECS_PER_DAY;\n } else if (d < 0 && rem > 0n) {\n d += 1;\n rem -= USECS_PER_DAY;\n }\n return makeInterval(0, d, rem);\n}\n\nfunction intervalScale(iv: Interval, factor: number): Interval {\n if (!Number.isFinite(factor)) throw pgError(\"invalid_parameter_value\", \"interval out of range\", \"22015\");\n const months = iv.months * factor;\n const wholeMonths = Math.trunc(months);\n const days = iv.days * factor + (months - wholeMonths) * 30;\n const wholeDays = Math.trunc(days);\n const micros = Number(iv.micros) * factor + (days - wholeDays) * 86_400_000_000;\n return makeInterval(wholeMonths, wholeDays, BigInt(Math.round(micros)));\n}\n\nfunction tryMoneyArith(op: string, l: TypedValue, r: TypedValue): TypedValue | null {\n const lt = l.t;\n const rt = r.t;\n if (lt !== \"money\" && rt !== \"money\") return null;\n const nullOf = (t: TypeId): TypedValue => tv(t, null);\n if (lt === \"money\" && rt === \"money\") {\n if (l.v === null || r.v === null) return nullOf(op === \"/\" ? \"float8\" : \"money\");\n const a = l.v as bigint;\n const b = r.v as bigint;\n switch (op) {\n case \"+\":\n return tv(\"money\", a + b);\n case \"-\":\n return tv(\"money\", a - b);\n case \"/\": {\n if (b === 0n) throw pgError(\"division_by_zero\", \"division by zero\");\n return tv(\"float8\", Number(a) / Number(b));\n }\n default:\n opNotExist(op, lt, rt);\n }\n }\n const m = lt === \"money\" ? l : r;\n const n = lt === \"money\" ? r : l;\n if (!isNumType(n.t)) opNotExist(op, lt, rt);\n if (m.v === null || n.v === null) return nullOf(\"money\");\n const cents = m.v as bigint;\n const f = toF8(n.t, n.v);\n switch (op) {\n case \"*\":\n return tv(\"money\", BigInt(Math.round(Number(cents) * f)));\n case \"/\": {\n if (lt !== \"money\") opNotExist(op, lt, rt);\n if (f === 0) throw pgError(\"division_by_zero\", \"division by zero\");\n return tv(\"money\", BigInt(Math.trunc(Number(cents) / f)));\n }\n default:\n opNotExist(op, lt, rt);\n }\n}\n\n// --- concat ------------------------------------------------------------------\n\nfunction evalConcat(ctx: EngineCtx, l: TypedValue, r: TypedValue): TypedValue {\n // array || array, array || elem, elem || array\n if (isArrayType(l.t) || isArrayType(r.t)) {\n return arrayConcat(ctx, l, r);\n }\n if (l.t === \"jsonb\" && r.t === \"jsonb\") {\n if (l.v === null || r.v === null) return tv(\"jsonb\", null);\n return tv(\"jsonb\", wrapJsonb(jsonbConcat((l.v as JsonbWrap).value, (r.v as JsonbWrap).value)));\n }\n if (l.t === \"jsonb\" && r.t === \"unknown\") {\n return evalConcat(ctx, l, castTo(ctx, r, \"jsonb\"));\n }\n if (r.t === \"jsonb\" && l.t === \"unknown\") {\n return evalConcat(ctx, castTo(ctx, l, \"jsonb\"), r);\n }\n if (l.t === \"bytea\" && (r.t === \"bytea\" || r.t === \"unknown\")) {\n const rb = r.t === \"unknown\" ? castTo(ctx, r, \"bytea\") : r;\n if (l.v === null || rb.v === null) return tv(\"bytea\", null);\n const a = l.v as Uint8Array;\n const b = rb.v as Uint8Array;\n const out = new Uint8Array(a.length + b.length);\n out.set(a, 0);\n out.set(b, a.length);\n return tv(\"bytea\", out);\n }\n if (r.t === \"bytea\" && l.t === \"unknown\") {\n return evalConcat(ctx, castTo(ctx, l, \"bytea\"), r);\n }\n if (l.t === \"tsvector\" && r.t === \"tsvector\") {\n if (l.v === null || r.v === null) return tv(\"tsvector\", null);\n return tv(\"tsvector\", tsvectorConcat(l.v as string, r.v as string));\n }\n if (l.t === \"tsquery\" && r.t === \"tsquery\") {\n if (l.v === null || r.v === null) return tv(\"tsquery\", null);\n return tv(\"tsquery\", tsqueryCombine(\"or\", l.v as string, r.v as string));\n }\n // text concat: at least one side must be a string type (or unknown)\n const textish = (t: TypeId): boolean => isTextType(t) || t === \"unknown\";\n if (!textish(l.t) && !textish(r.t)) opNotExist(\"||\", l.t, r.t);\n if (!textish(l.t) && l.t !== \"unknown\") {\n // anynonarray || text\n }\n if (l.v === null || r.v === null) return tv(\"text\", null);\n // bpchar -> text conversion strips trailing spaces (PG rtrim semantics)\n const sideText = (s: TypedValue): string => {\n if (s.t === \"bpchar\") return (s.v as string).replace(/ +$/, \"\");\n return textish(s.t) ? (s.v as string) : datumText(s.t, s.v, ctx);\n };\n return tv(\"text\", sideText(l) + sideText(r));\n}\n\nfunction arrayConcat(ctx: EngineCtx, l: TypedValue, r: TypedValue): TypedValue {\n if (isArrayType(l.t) && isArrayType(r.t)) {\n const elem = unifyTypes(arrayElemType(l.t), arrayElemType(r.t));\n if (elem === null) opNotExist(\"||\", l.t, r.t);\n const t = arrayTypeOf(elem);\n if (l.v === null) return r.v === null ? tv(t, null) : castTo(ctx, r, t);\n if (r.v === null) return castTo(ctx, l, t);\n const la = castTo(ctx, l, t).v as PgArray;\n const ra = castTo(ctx, r, t).v as PgArray;\n if (la.items.length === 0) return tv(t, ra);\n if (ra.items.length === 0) return tv(t, la);\n if (la.dims.length === ra.dims.length) {\n if (la.dims.length > 1) {\n // stack along first dimension\n return tv(t, makeArray(elem, [...la.items, ...ra.items], [la.dims[0]! + ra.dims[0]!, ...la.dims.slice(1)]));\n }\n return tv(t, makeArray(elem, [...la.items, ...ra.items]));\n }\n if (la.dims.length === ra.dims.length + 1) {\n return tv(t, makeArray(elem, [...la.items, ...ra.items], [la.dims[0]! + 1, ...la.dims.slice(1)]));\n }\n if (ra.dims.length === la.dims.length + 1) {\n return tv(t, makeArray(elem, [...la.items, ...ra.items], [ra.dims[0]! + 1, ...ra.dims.slice(1)]));\n }\n opNotExist(\"||\", l.t, r.t);\n }\n // elem || array / array || elem\n if (isArrayType(l.t)) {\n const elem = unifyTypes(arrayElemType(l.t), r.t === \"unknown\" ? arrayElemType(l.t) : r.t);\n if (elem === null) opNotExist(\"||\", l.t, r.t);\n const t = arrayTypeOf(elem);\n const la = l.v === null ? null : (castTo(ctx, l, t).v as PgArray);\n const rv = castTo(ctx, r, elem).v;\n if (la === null) return tv(t, makeArray(elem, [rv]));\n return tv(t, makeArray(elem, [...la.items, rv]));\n }\n const elem = unifyTypes(arrayElemType(r.t), l.t === \"unknown\" ? arrayElemType(r.t) : l.t);\n if (elem === null) opNotExist(\"||\", l.t, r.t);\n const t = arrayTypeOf(elem);\n const ra = r.v === null ? null : (castTo(ctx, r, t).v as PgArray);\n const lv = castTo(ctx, l, elem).v;\n if (ra === null) return tv(t, makeArray(elem, [lv]));\n return tv(\n t,\n makeArray(elem, [lv, ...ra.items], ra.dims.length <= 1 ? undefined : [ra.dims[0]! + 1, ...ra.dims.slice(1)]),\n );\n}\n\nfunction jsonbConcat(a: JsonbValue, b: JsonbValue): JsonbValue {\n if (a.j === \"obj\" && b.j === \"obj\") {\n const m = new Map(a.v);\n for (const [k, v] of b.v) m.set(k, v);\n return { j: \"obj\", v: m };\n }\n const arrOf = (x: JsonbValue): JsonbValue[] => (x.j === \"arr\" ? x.v : [x]);\n return jsonbArr([...arrOf(a), ...arrOf(b)]);\n}\n\n// --- bitwise ------------------------------------------------------------------\n\nfunction evalBitwise(ctx: EngineCtx, op: string, l0: TypedValue, r0: TypedValue): TypedValue {\n const [l, r] = resolveUnknowns(ctx, op, l0, r0);\n // bit-string ops: bit & bit / | / # (xor); shifts take an int rhs\n if ((l.t === \"bit\" || l.t === \"varbit\") && (op === \"<<\" || op === \">>\") && isIntType(r.t)) {\n if (l.v === null || r.v === null) return tv(l.t, null);\n const s = l.v as string;\n const n = Number(toI8(r.t, r.v));\n if (n <= 0) return op === \"<<\" && n < 0 ? evalBitwise(ctx, \">>\", l, tv(\"int4\", -n)) : l;\n const shifted =\n op === \"<<\"\n ? s.slice(Math.min(n, s.length)).padEnd(s.length, \"0\")\n : s.slice(0, Math.max(0, s.length - n)).padStart(s.length, \"0\");\n return tv(l.t, shifted);\n }\n if ((l.t === \"bit\" || l.t === \"varbit\") && (r.t === \"bit\" || r.t === \"varbit\")) {\n if (l.v === null || r.v === null) return tv(l.t, null);\n const a = l.v as string;\n const b = r.v as string;\n if (a.length !== b.length) {\n const word = op === \"&\" ? \"AND\" : op === \"|\" ? \"OR\" : \"XOR\";\n throw pgError(\"data_exception\", `cannot ${word} bit strings of different sizes`, \"22026\");\n }\n let out = \"\";\n for (let i = 0; i < a.length; i++) {\n const x = a[i] === \"1\";\n const y = b[i] === \"1\";\n out += (op === \"&\" ? x && y : op === \"|\" ? x || y : x !== y) ? \"1\" : \"0\";\n }\n return tv(l.t, out);\n }\n if (!isIntType(l.t) || !isIntType(r.t)) opNotExist(op, l.t, r.t);\n const t = NUM_LADDER[Math.max(NUM_LADDER.indexOf(l.t), NUM_LADDER.indexOf(r.t))]!;\n if (l.v === null || r.v === null) return tv(t, null);\n const a = toI8(l.t, l.v);\n const b = toI8(r.t, r.v);\n const bits = t === \"int2\" ? 16 : t === \"int4\" ? 32 : 64;\n let res: bigint;\n switch (op) {\n case \"&\":\n res = a & b;\n break;\n case \"|\":\n res = a | b;\n break;\n case \"#\":\n res = a ^ b;\n break;\n case \"<<\":\n res = BigInt.asIntN(bits, a << (b & BigInt(bits - 1)));\n break;\n case \">>\":\n res = a >> (b & BigInt(bits - 1));\n break;\n default:\n opNotExist(op, l.t, r.t);\n }\n res = BigInt.asIntN(bits, res);\n return tv(t, t === \"int8\" ? res : Number(res));\n}\n\n// --- pattern ops ---------------------------------------------------------------\n\nfunction evalLikeOp(ctx: EngineCtx, op: string, l0: TypedValue, r0: TypedValue): TypedValue {\n const l = l0.t === \"unknown\" ? castTo(ctx, l0, \"text\") : l0;\n const r = r0.t === \"unknown\" ? castTo(ctx, r0, \"text\") : r0;\n if (!isTextType(l.t) || !isTextType(r.t)) opNotExist(op, l0.t, r0.t);\n if (l.v === null || r.v === null) return tv(\"bool\", null);\n const ci = op.endsWith(\"*\");\n const negated = op.startsWith(\"!\");\n const m = likeMatch(l.v as string, r.v as string, null, ci);\n return tv(\"bool\", negated ? !m : m);\n}\n\nfunction evalRegexOp(ctx: EngineCtx, op: string, l0: TypedValue, r0: TypedValue): TypedValue {\n const l = l0.t === \"unknown\" ? castTo(ctx, l0, \"text\") : l0;\n const r = r0.t === \"unknown\" ? castTo(ctx, r0, \"text\") : r0;\n if (!isTextType(l.t) || !isTextType(r.t)) opNotExist(op, l0.t, r0.t);\n if (l.v === null || r.v === null) return tv(\"bool\", null);\n const ci = op.endsWith(\"*\");\n const negated = op.startsWith(\"!\");\n const m = regexMatch(l.v as string, r.v as string, ci);\n return tv(\"bool\", negated ? !m : m);\n}\n\n// --- containment ------------------------------------------------------------------\n\nfunction evalContainment(ctx: EngineCtx, op: string, l0: TypedValue, r0: TypedValue): TypedValue {\n let [l, r] = resolveJsonUnknowns(ctx, op, l0, r0);\n if (op === \"&&\" && l.t === \"tsquery\" && r.t === \"tsquery\") {\n if (l.v === null || r.v === null) return tv(\"tsquery\", null);\n return tv(\"tsquery\", tsqueryCombine(\"and\", l.v as string, r.v as string));\n }\n if (l.t === \"jsonb\" && r.t === \"jsonb\") {\n if (l.v === null || r.v === null) return tv(\"bool\", null);\n const a = (l.v as JsonbWrap).value;\n const b = (r.v as JsonbWrap).value;\n if (op === \"@>\") return tv(\"bool\", jsonbContains(a, b));\n if (op === \"<@\") return tv(\"bool\", jsonbContains(b, a));\n opNotExist(op, l.t, r.t);\n }\n if (isArrayType(l.t) || isArrayType(r.t)) {\n if (l.t === \"unknown\") l = castTo(ctx, l, r.t);\n if (r.t === \"unknown\") r = castTo(ctx, r, l.t);\n if (!isArrayType(l.t) || !isArrayType(r.t)) opNotExist(op, l.t, r.t);\n const elem = unifyTypes(arrayElemType(l.t), arrayElemType(r.t));\n if (elem === null) opNotExist(op, l.t, r.t);\n if (l.v === null || r.v === null) return tv(\"bool\", null);\n const la = castTo(ctx, l, arrayTypeOf(elem)).v as PgArray;\n const ra = castTo(ctx, r, arrayTypeOf(elem)).v as PgArray;\n if (op === \"&&\") {\n for (const x of la.items) {\n if (x === null) continue;\n for (const y of ra.items) {\n if (y !== null && datumEquals(elem, x, y, ctx)) return tv(\"bool\", true);\n }\n }\n return tv(\"bool\", false);\n }\n const contains = (outer: PgArray, inner: PgArray): boolean => {\n for (const y of inner.items) {\n if (y === null) return false; // NULL elements are never contained\n let found = false;\n for (const x of outer.items) {\n if (x !== null && datumEquals(elem, x, y, ctx)) {\n found = true;\n break;\n }\n }\n if (!found) return false;\n }\n return true;\n };\n if (op === \"@>\") return tv(\"bool\", contains(la, ra));\n return tv(\"bool\", contains(ra, la));\n }\n opNotExist(op, l.t, r.t);\n}\n\n// --- json extraction ------------------------------------------------------------\n\nfunction evalJsonExtract(_ctx: EngineCtx, op: string, l: TypedValue, r: TypedValue): TypedValue {\n const isJson = l.t === \"json\";\n const isJsonb = l.t === \"jsonb\";\n if (!isJson && !isJsonb) opNotExist(op, l.t, r.t);\n const resultType = op.endsWith(\">>\") ? \"text\" : l.t;\n if (l.v === null || r.v === null) return tv(resultType, null);\n\n const value: JsonbValue = isJsonb ? (l.v as JsonbWrap).value : parseJsonbText(l.v as string);\n\n let result: JsonbValue | null;\n if (op === \"->\" || op === \"->>\") {\n if (r.t === \"int4\" || r.t === \"int2\") {\n result = jsonGetIndex(value, Number(r.v));\n } else if (r.t === \"int8\") {\n result = jsonGetIndex(value, Number(r.v as bigint));\n } else if (isTextType(r.t)) {\n result = jsonGetKey(value, r.v as string);\n } else {\n opNotExist(op, l.t, r.t);\n }\n } else {\n // #> / #>>\n if (!isArrayType(r.t)) opNotExist(op, l.t, r.t);\n const path = (r.v as PgArray).items;\n result = value;\n for (const p of path) {\n if (result === null) break;\n if (p === null) {\n result = null;\n break;\n }\n const key = String(p);\n if (result.j === \"arr\" && /^-?\\d+$/.test(key)) {\n result = jsonGetIndex(result, Number(key));\n } else {\n result = jsonGetKey(result, key);\n }\n }\n }\n\n if (result === null) return tv(resultType, null);\n if (op.endsWith(\">>\")) {\n if (result.j === \"null\") return tv(\"text\", null);\n if (result.j === \"str\") return tv(\"text\", result.v);\n return tv(\"text\", jsonbText(result));\n }\n if (isJsonb) return tv(\"jsonb\", wrapJsonb(result));\n return tv(\"json\", jsonbText(result));\n}\n\nfunction jsonGetIndex(v: JsonbValue, idx: number): JsonbValue | null {\n if (v.j !== \"arr\") return null;\n const i = idx < 0 ? v.v.length + idx : idx;\n return v.v[i] ?? null;\n}\n\nfunction jsonGetKey(v: JsonbValue, key: string): JsonbValue | null {\n if (v.j !== \"obj\") return null;\n return v.v.get(key) ?? null;\n}\n\nfunction evalJsonbExists(_ctx: EngineCtx, op: string, l: TypedValue, r: TypedValue): TypedValue {\n if (l.t !== \"jsonb\") opNotExist(op, l.t, r.t);\n if (l.v === null || r.v === null) return tv(\"bool\", null);\n const value = (l.v as JsonbWrap).value;\n const has = (key: string): boolean => {\n if (value.j === \"obj\") return value.v.has(key);\n if (value.j === \"arr\") return value.v.some((x) => x.j === \"str\" && x.v === key);\n if (value.j === \"str\") return value.v === key;\n return false;\n };\n if (op === \"?\") {\n return tv(\"bool\", has(r.v as string));\n }\n const keys = (r.v as PgArray).items.filter((k): k is string => k !== null).map(String);\n if (op === \"?|\") return tv(\"bool\", keys.some(has));\n return tv(\"bool\", keys.every(has));\n}\n\n/** jsonb - text / jsonb - int / jsonb - text[] */\nexport function evalJsonbDelete(_ctx: EngineCtx, l: TypedValue, r: TypedValue): TypedValue {\n if (l.v === null || r.v === null) return tv(\"jsonb\", null);\n const value = (l.v as JsonbWrap).value;\n if (isTextType(r.t) || r.t === \"unknown\") {\n const key = r.v as string;\n if (value.j === \"obj\") {\n const m = new Map(value.v);\n m.delete(key);\n return tv(\"jsonb\", wrapJsonb({ j: \"obj\", v: m }));\n }\n if (value.j === \"arr\") {\n return tv(\"jsonb\", wrapJsonb(jsonbArr(value.v.filter((x) => !(x.j === \"str\" && x.v === key)))));\n }\n throw pgError(\"invalid_parameter_value\", \"cannot delete from scalar\", \"22023\");\n }\n if (r.t === \"int4\" || r.t === \"int2\" || r.t === \"int8\") {\n if (value.j !== \"arr\") {\n if (value.j === \"obj\")\n throw pgError(\"invalid_parameter_value\", \"cannot delete from object using integer index\", \"22023\");\n throw pgError(\"invalid_parameter_value\", \"cannot delete from scalar\", \"22023\");\n }\n let idx = Number(r.v);\n if (idx < 0) idx = value.v.length + idx;\n return tv(\"jsonb\", wrapJsonb(jsonbArr(value.v.filter((_, i) => i !== idx))));\n }\n if (isArrayType(r.t)) {\n const keys = new Set((r.v as PgArray).items.filter((k) => k !== null).map(String));\n if (value.j === \"obj\") {\n const m = new Map(value.v);\n for (const k of keys) m.delete(k);\n return tv(\"jsonb\", wrapJsonb({ j: \"obj\", v: m }));\n }\n if (value.j === \"arr\") {\n return tv(\"jsonb\", wrapJsonb(jsonbArr(value.v.filter((x) => !(x.j === \"str\" && keys.has(x.v))))));\n }\n throw pgError(\"invalid_parameter_value\", \"cannot delete from scalar\", \"22023\");\n }\n opNotExist(\"-\", l.t, r.t);\n}\n\nfunction evalJsonbDeletePath(ctx: EngineCtx, l: TypedValue, r0: TypedValue): TypedValue {\n const r = r0.t === \"unknown\" ? castTo(ctx, r0, \"text[]\") : r0;\n if (l.t !== \"jsonb\" || !isArrayType(r.t)) opNotExist(\"#-\", l.t, r0.t);\n if (l.v === null || r.v === null) return tv(\"jsonb\", null);\n const path = (r.v as PgArray).items.map((x) => (x === null ? null : String(x)));\n if (path.some((p) => p === null)) {\n throw pgError(\"invalid_parameter_value\", \"path element cannot be null\", \"22004\" as any);\n }\n const del = (v: JsonbValue, depth: number): JsonbValue => {\n const key = path[depth] as string;\n if (v.j === \"obj\") {\n if (!v.v.has(key)) return v;\n const m = new Map(v.v);\n if (depth === path.length - 1) {\n m.delete(key);\n } else {\n m.set(key, del(m.get(key)!, depth + 1));\n }\n return { j: \"obj\", v: m };\n }\n if (v.j === \"arr\") {\n if (!/^-?\\d+$/.test(key)) {\n return v;\n }\n let idx = Number(key);\n if (idx < 0) idx = v.v.length + idx;\n if (idx < 0 || idx >= v.v.length) return v;\n if (depth === path.length - 1) {\n return jsonbArr(v.v.filter((_, i) => i !== idx));\n }\n const copy = v.v.slice();\n copy[idx] = del(copy[idx]!, depth + 1);\n return jsonbArr(copy);\n }\n if (depth === 0) {\n throw pgError(\"invalid_parameter_value\", \"cannot delete path in scalar\", \"22023\");\n }\n return v;\n };\n if (path.length === 0) return tv(\"jsonb\", l.v);\n return tv(\"jsonb\", wrapJsonb(del((l.v as JsonbWrap).value, 0)));\n}\n\n// --- text search (minimal tsvector/tsquery) ---------------------------------------\n\nfunction evalTextSearchMatch(ctx: EngineCtx, l0: TypedValue, r0: TypedValue): TypedValue {\n let l = l0;\n let r = r0;\n if (l.t === \"unknown\") l = castTo(ctx, l, \"tsvector\");\n if (r.t === \"unknown\") r = castTo(ctx, r, \"tsquery\");\n if (l.t === \"tsquery\" && r.t === \"tsvector\") [l, r] = [r, l];\n if (l.t !== \"tsvector\" || r.t !== \"tsquery\") opNotExist(\"@@\", l0.t, r0.t);\n if (l.v === null || r.v === null) return tv(\"bool\", null);\n return tv(\"bool\", tsvectorMatches(l.v as string, r.v as string));\n}\n\n// --- unary --------------------------------------------------------------------------\n\nexport function evalUnary(ctx: EngineCtx, op: string, operand: TypedValue): TypedValue {\n const { t, v } = operand;\n switch (op) {\n case \"-\": {\n if (t === \"unknown\") throw pgError(\"ambiguous_function\", \"operator is not unique: - unknown\");\n if (v === null) return tv(t, null);\n if (t === \"int2\" || t === \"int4\") {\n const neg = -(v as number);\n return tv(t, t === \"int2\" ? checkInt2(neg) : checkInt4(neg));\n }\n if (t === \"int8\") return tv(t, checkInt8(-(v as bigint)));\n if (t === \"float4\" || t === \"float8\") return tv(t, -(v as number));\n if (t === \"numeric\") return tv(t, numericNeg(v as Numeric));\n if (t === \"interval\") return tv(t, intervalNeg(v as Interval));\n if (t === \"money\") return tv(t, -(v as bigint));\n throw pgError(\"undefined_function\", `operator does not exist: - ${typeDisplayName(t)}`);\n }\n case \"+\": {\n // all unary + candidates are numeric, so the preferred type float8 wins\n if (t === \"unknown\") return evalUnary(ctx, op, castTo(ctx, operand, \"float8\"));\n if (!isNumType(t) && t !== \"interval\" && t !== \"money\") {\n throw pgError(\"undefined_function\", `operator does not exist: + ${typeDisplayName(t)}`);\n }\n return operand;\n }\n case \"~\": {\n if (t === \"unknown\") throw pgError(\"ambiguous_function\", \"operator is not unique: ~ unknown\");\n if (!isIntType(t)) throw pgError(\"undefined_function\", `operator does not exist: ~ ${typeDisplayName(t)}`);\n if (v === null) return tv(t, null);\n const bits = t === \"int2\" ? 16 : t === \"int4\" ? 32 : 64;\n const res = BigInt.asIntN(bits, ~toI8(t, v));\n return tv(t, t === \"int8\" ? res : Number(res));\n }\n case \"@\": {\n if (t === \"unknown\") return evalUnary(ctx, op, castTo(ctx, operand, \"float8\"));\n if (v === null) return tv(t, null);\n if (t === \"numeric\") return tv(t, numericAbs(v as Numeric));\n if (t === \"int8\") return tv(t, (v as bigint) < 0n ? checkInt8(-(v as bigint)) : v);\n if (isIntType(t)) return tv(t, Math.abs(v as number));\n if (t === \"float4\" || t === \"float8\") return tv(t, Math.abs(v as number));\n throw pgError(\"undefined_function\", `operator does not exist: @ ${typeDisplayName(t)}`);\n }\n case \"|/\": {\n const f = castTo(ctx, operand, \"float8\");\n if (f.v === null) return tv(\"float8\", null);\n const x = f.v as number;\n if (x < 0) throw pgError(\"invalid_parameter_value\", \"cannot take square root of a negative number\");\n return tv(\"float8\", Math.sqrt(x));\n }\n case \"||/\": {\n const f = castTo(ctx, operand, \"float8\");\n if (f.v === null) return tv(\"float8\", null);\n return tv(\"float8\", Math.cbrt(f.v as number));\n }\n case \"not\": {\n if (t !== \"bool\" && t !== \"unknown\") {\n throw pgError(\"datatype_mismatch\", `argument of NOT must be type boolean, not type ${typeDisplayName(t)}`);\n }\n const b = t === \"bool\" ? operand : castTo(ctx, operand, \"bool\");\n if (b.v === null) return tv(\"bool\", null);\n return tv(\"bool\", !(b.v as boolean));\n }\n case \"!!\": {\n const q = t === \"tsquery\" ? operand : castTo(ctx, operand, \"tsquery\");\n if (q.v === null) return tv(\"tsquery\", null);\n return tv(\"tsquery\", tsqueryNegate(q.v as string));\n }\n default:\n throw pgError(\"undefined_function\", `operator does not exist: ${op} ${typeDisplayName(t)}`);\n }\n}\n\nexport { float8Text, isNumeric, makeNumeric, numericSqrt, parseNumeric };\n", "import type {\n ArrayCtor,\n BetweenExpr,\n CaseExpr,\n Expr,\n FuncCall,\n InExpr,\n LikeExpr,\n RowExpr,\n SelectStmt,\n SubqueryExpr,\n SubscriptExpr,\n TypeName,\n} from \"../ast/nodes.ts\";\nimport { pgError, unsupported } from \"../errors/error.ts\";\nimport { extractDatePart } from \"../functions/datetime-fns.ts\";\nimport { callScalarFunction, hasScalarFunction } from \"../functions/scalar.ts\";\nimport { castTo, isTextType, UTC_CAST_ENV as UTC_LIT_ENV, unifyTypes } from \"../types/cast.ts\";\nimport { datumCompare, datumEquals } from \"../types/compare.ts\";\nimport type { JsonbValue } from \"../types/jsonb.ts\";\nimport { resolveTypeName } from \"../types/resolve.ts\";\nimport {\n arrayElemType,\n arrayTypeOf,\n type Datum,\n INT4_MAX,\n INT4_MIN,\n isArrayType,\n isJsonbWrap,\n isPgArray,\n type JsonbWrap,\n makeArray,\n type PgArray,\n type PgRecord,\n type TypedValue,\n type TypeId,\n tv,\n typeDisplayName,\n UNKNOWN,\n wrapJsonb,\n} from \"../types/value.ts\";\nimport type { EngineCtx } from \"./context.ts\";\nimport { evalBinary, evalUnary } from \"./operators.ts\";\nimport { likeToRegex, similarToRegex } from \"./pattern.ts\";\n\n/**\n * Environment the executor provides for expression evaluation: column\n * resolution, parameter binding, subquery execution, aggregate / window\n * result lookup, and user-defined function invocation.\n */\nexport interface EvalScope {\n lookupColumn(parts: string[]): TypedValue | undefined;\n /**\n * Whole-expression interception (GROUP BY expression matching). Checked\n * before normal evaluation of every node.\n */\n exprOverride?(node: Expr): TypedValue | undefined;\n param?(index: number): TypedValue;\n execScalarSubquery?(q: SelectStmt): TypedValue;\n execExistsSubquery?(q: SelectStmt): boolean;\n /** rows with a single projected column for IN / ANY / ALL / ARRAY(...) */\n execColumnSubquery?(q: SelectStmt): { type: TypeId; values: Datum[] };\n /** precomputed aggregate results (keyed by AST node identity) */\n aggValue?(node: FuncCall): TypedValue | undefined;\n /** precomputed window function results */\n windowValue?(node: FuncCall): TypedValue | undefined;\n groupingValue?(node: Expr): TypedValue | undefined;\n callUserFunction?(name: string[], args: TypedValue[], node: FuncCall): TypedValue | undefined;\n /** sequence functions et al need state mutation; provided by executor */\n callStatefulFunction?(name: string, args: TypedValue[]): TypedValue | undefined;\n}\n\nexport function evalExpr(ctx: EngineCtx, scope: EvalScope, e: Expr): TypedValue {\n if (scope.exprOverride) {\n const o = scope.exprOverride(e);\n if (o !== undefined) return o;\n }\n switch (e.type) {\n case \"null_lit\":\n return tv(UNKNOWN, null);\n case \"string_lit\":\n return tv(UNKNOWN, e.value);\n case \"number_lit\":\n return numberLitValue(e.raw);\n case \"bool_lit\":\n return tv(\"bool\", e.value);\n case \"bitstring_lit\":\n return bitstringValue(e.value);\n case \"param\": {\n if (!scope.param) throw pgError(\"undefined_parameter\", `there is no parameter $${e.index}`);\n return scope.param(e.index);\n }\n case \"colref\": {\n const v = scope.lookupColumn(e.parts);\n if (v === undefined) {\n throw pgError(\"undefined_column\", `column \"${e.parts.join(\".\")}\" does not exist`);\n }\n return v;\n }\n case \"star\":\n throw pgError(\"syntax\", \"unexpected *\");\n case \"binop\":\n return evalBinaryNode(ctx, scope, e.op, e.left, e.right);\n case \"unop\": {\n if (e.op === \"not\") {\n const b = boolArg(ctx, \"NOT\", evalExpr(ctx, scope, e.operand));\n return tv(\"bool\", b === null ? null : !b);\n }\n return evalUnary(ctx, e.op, evalExpr(ctx, scope, e.operand));\n }\n case \"cast\":\n return evalCast(ctx, scope, e.expr, e.target);\n case \"collate\":\n return evalExpr(ctx, scope, e.expr);\n case \"func\":\n return evalFuncCall(ctx, scope, e);\n case \"case\":\n return evalCase(ctx, scope, e);\n case \"subquery_expr\":\n return evalSubquery(ctx, scope, e);\n case \"in_expr\":\n return evalIn(ctx, scope, e);\n case \"between\":\n return evalBetween(ctx, scope, e);\n case \"is_null\": {\n const v = evalExpr(ctx, scope, e.expr);\n const isNull = isPgRecordValue(v) ? recordAllNull(v.v as PgRecord, e.not) : v.v === null;\n return tv(\"bool\", e.not ? !isNull : isNull);\n }\n case \"bool_test\": {\n const v = toBool(ctx, evalExpr(ctx, scope, e.expr));\n const result = e.test === \"unknown\" ? v === null : v === (e.test === \"true\");\n return tv(\"bool\", e.not ? !result : result);\n }\n case \"is_distinct\": {\n const l = evalExpr(ctx, scope, e.left);\n const r = evalExpr(ctx, scope, e.right);\n const unified = unifyTypes(l.t, r.t);\n if (unified === null) {\n throw pgError(\n \"undefined_function\",\n `operator does not exist: ${typeDisplayName(l.t)} = ${typeDisplayName(r.t)}`,\n );\n }\n const t = unified;\n const lc = castTo(ctx, l, t, {});\n const rc = castTo(ctx, r, t, {});\n let distinct: boolean;\n if (lc.v === null && rc.v === null) distinct = false;\n else if (lc.v === null || rc.v === null) distinct = true;\n else distinct = !datumEquals(t, lc.v, rc.v, ctx);\n return tv(\"bool\", e.not ? !distinct : distinct);\n }\n case \"row\":\n return evalRow(ctx, scope, e);\n case \"array_ctor\":\n return evalArrayCtor(ctx, scope, e);\n case \"array_query\": {\n if (!scope.execColumnSubquery) throw unsupported(\"subqueries in this context\");\n const { type, values } = scope.execColumnSubquery(e.query);\n const elem = type === UNKNOWN ? \"text\" : type;\n return tv(`${elem}[]`, makeArray(elem, values));\n }\n case \"subscript\":\n return evalSubscript(ctx, scope, e);\n case \"field_select\": {\n const base = evalExpr(ctx, scope, e.base);\n return evalFieldSelect(ctx, base, e.field);\n }\n case \"at_time_zone\": {\n const v = evalExpr(ctx, scope, e.expr);\n const zone = evalExpr(ctx, scope, e.zone);\n return callScalarFunction(ctx, \"timezone\", [zone, v]);\n }\n case \"like\":\n return evalLike(ctx, scope, e);\n case \"position\": {\n const needle = evalExpr(ctx, scope, e.needle);\n const hay = evalExpr(ctx, scope, e.haystack);\n return callScalarFunction(ctx, \"strpos\", [hay, needle]);\n }\n case \"substring_sql\": {\n const src = evalExpr(ctx, scope, e.source);\n if (e.similar !== null) {\n const pat = evalExpr(ctx, scope, e.similar);\n const esc = e.escape ? evalExpr(ctx, scope, e.escape) : tv(\"text\", \"\\\\\");\n return callScalarFunction(ctx, \"substring_similar\", [src, pat, esc]);\n }\n const args = [src];\n if (e.from) args.push(evalExpr(ctx, scope, e.from));\n else args.push(tv(\"int4\", 1));\n if (e.forLen) args.push(evalExpr(ctx, scope, e.forLen));\n return callScalarFunction(ctx, \"substring\", [...args]);\n }\n case \"overlay\": {\n const args = [evalExpr(ctx, scope, e.source), evalExpr(ctx, scope, e.placing), evalExpr(ctx, scope, e.from)];\n if (e.forLen) args.push(evalExpr(ctx, scope, e.forLen));\n return callScalarFunction(ctx, \"overlay\", args);\n }\n case \"trim\": {\n const src = evalExpr(ctx, scope, e.source);\n const chars = e.chars ? evalExpr(ctx, scope, e.chars) : tv(\"text\", \" \");\n const name = e.side === \"leading\" ? \"ltrim\" : e.side === \"trailing\" ? \"rtrim\" : \"btrim\";\n return callScalarFunction(ctx, name, [src, chars]);\n }\n case \"extract\": {\n const src = evalExpr(ctx, scope, e.source);\n return extractDatePart(ctx, e.field, src, true);\n }\n case \"grouping_func\": {\n const v = scope.groupingValue?.(e);\n if (v === undefined) throw pgError(\"grouping_error\", \"GROUPING must appear in GROUP BY context\");\n return v;\n }\n case \"default_expr\":\n throw pgError(\"syntax\", \"DEFAULT is not allowed in this context\");\n }\n}\n\n// --- literals -------------------------------------------------------------------\n\nexport function numberLitValue(raw: string): TypedValue {\n let text = raw;\n let negative = false;\n if (text.startsWith(\"-\")) {\n negative = true;\n text = text.slice(1);\n }\n const isInteger =\n /^\\d+$/.test(text) || /^0[xX][0-9a-fA-F]+$/.test(text) || /^0[oO][0-7]+$/.test(text) || /^0[bB][01]+$/.test(text);\n if (isInteger) {\n const big = BigInt(text) * (negative ? -1n : 1n);\n if (big >= BigInt(INT4_MIN) && big <= BigInt(INT4_MAX)) return tv(\"int4\", Number(big));\n if (big >= -9223372036854775808n && big <= 9223372036854775807n) return tv(\"int8\", big);\n return castTo(UTC_LIT_ENV, tv(UNKNOWN, (negative ? \"-\" : \"\") + text), \"numeric\");\n }\n return castTo(UTC_LIT_ENV, tv(UNKNOWN, raw), \"numeric\");\n}\n\nfunction bitstringValue(value: string): TypedValue {\n const kind = value[0]!.toLowerCase();\n const digits = value.slice(1);\n if (kind === \"b\") {\n if (!/^[01]*$/.test(digits))\n throw pgError(\"invalid_text_representation\", `\"${digits}\" is not a valid binary digit`);\n return tv(\"bit\", digits);\n }\n // hex: expand each digit into 4 bits\n let bits = \"\";\n for (const c of digits) {\n const n = Number.parseInt(c, 16);\n if (Number.isNaN(n)) throw pgError(\"invalid_text_representation\", `\"${c}\" is not a valid hexadecimal digit`);\n bits += n.toString(2).padStart(4, \"0\");\n }\n return tv(\"bit\", bits);\n}\n\n// --- boolean logic --------------------------------------------------------------\n\nexport function toBool(ctx: EngineCtx, v: TypedValue): boolean | null {\n if (v.v === null) return null;\n if (v.t === \"bool\") return v.v as boolean;\n const cast = castTo(ctx, v, \"bool\", {});\n return cast.v as boolean | null;\n}\n\n/** AND/OR/NOT arguments must already be boolean (or unknown); PG raises 42804 otherwise */\nfunction boolArg(ctx: EngineCtx, kind: string, v: TypedValue): boolean | null {\n if (v.t !== \"bool\" && v.t !== \"unknown\") {\n throw pgError(\"datatype_mismatch\", `argument of ${kind} must be type boolean, not type ${typeDisplayName(v.t)}`);\n }\n return toBool(ctx, v);\n}\n\n/** side-effect-free expressions PG would type-check at plan time even when short-circuited */\nfunction isPureLiteral(e: Expr): boolean {\n switch (e.type) {\n case \"number_lit\":\n case \"string_lit\":\n case \"bool_lit\":\n case \"null_lit\":\n return true;\n case \"cast\":\n return isPureLiteral(e.expr);\n default:\n return false;\n }\n}\n\n/** mimic plan-time typing of a short-circuited operand: literals are checked anyway */\nfunction checkSkippedBoolArg(ctx: EngineCtx, scope: EvalScope, kind: string, e: Expr): void {\n if (isPureLiteral(e)) boolArg(ctx, kind, evalExpr(ctx, scope, e));\n}\n\nfunction evalBinaryNode(ctx: EngineCtx, scope: EvalScope, op: string, leftE: Expr, rightE: Expr): TypedValue {\n if (op === \"and\") {\n const l = boolArg(ctx, \"AND\", evalExpr(ctx, scope, leftE));\n if (l === false) {\n checkSkippedBoolArg(ctx, scope, \"AND\", rightE);\n return tv(\"bool\", false);\n }\n const r = boolArg(ctx, \"AND\", evalExpr(ctx, scope, rightE));\n if (r === false) return tv(\"bool\", false);\n return tv(\"bool\", l === null || r === null ? null : true);\n }\n if (op === \"or\") {\n const l = boolArg(ctx, \"OR\", evalExpr(ctx, scope, leftE));\n if (l === true) {\n checkSkippedBoolArg(ctx, scope, \"OR\", rightE);\n return tv(\"bool\", true);\n }\n const r = boolArg(ctx, \"OR\", evalExpr(ctx, scope, rightE));\n if (r === true) return tv(\"bool\", true);\n return tv(\"bool\", l === null || r === null ? null : false);\n }\n const l = evalExpr(ctx, scope, leftE);\n const r = evalExpr(ctx, scope, rightE);\n // row-wise comparison: (a,b) = (c,d)\n if (isPgRecordValue(l) && isPgRecordValue(r) && [\"=\", \"<>\", \"!=\", \"<\", \"<=\", \">\", \">=\"].includes(op)) {\n return rowCompare(ctx, op, l.v as PgRecord, r.v as PgRecord);\n }\n return evalBinary(ctx, op, l, r);\n}\n\nfunction isPgRecordValue(v: TypedValue): boolean {\n return v.t === \"record\" && v.v !== null;\n}\n\nfunction recordAllNull(rec: PgRecord, wantNotNull: boolean): boolean {\n // (r) IS NULL is true iff all fields null; IS NOT NULL iff all fields not null\n if (wantNotNull) return rec.values.some((f) => f === null);\n return rec.values.every((f) => f === null);\n}\n\nfunction rowCompare(ctx: EngineCtx, op: string, l: PgRecord, r: PgRecord): TypedValue {\n if (l.values.length !== r.values.length) {\n throw pgError(\"cardinality_violation\", \"unequal number of entries in row expressions\");\n }\n if (op === \"=\" || op === \"<>\" || op === \"!=\") {\n let sawNull = false;\n for (let i = 0; i < l.values.length; i++) {\n const t = unifyTypes(l.types[i]!, r.types[i]!) ?? \"text\";\n const a = l.values[i]!;\n const b = r.values[i]!;\n if (a === null || b === null) {\n sawNull = true;\n continue;\n }\n if (!datumEquals(t, a, b, ctx)) return tv(\"bool\", op !== \"=\");\n }\n if (sawNull) return tv(\"bool\", null);\n return tv(\"bool\", op === \"=\");\n }\n // ordering comparisons: lexicographic\n for (let i = 0; i < l.values.length; i++) {\n const t = unifyTypes(l.types[i]!, r.types[i]!) ?? \"text\";\n const a = l.values[i]!;\n const b = r.values[i]!;\n if (a === null || b === null) return tv(\"bool\", null);\n const c = datumCompare(t, a, b, ctx);\n if (c !== 0) {\n switch (op) {\n case \"<\":\n return tv(\"bool\", c < 0);\n case \"<=\":\n return tv(\"bool\", c < 0);\n case \">\":\n return tv(\"bool\", c > 0);\n case \">=\":\n return tv(\"bool\", c > 0);\n }\n }\n }\n return tv(\"bool\", op === \"<=\" || op === \">=\");\n}\n\n// --- CAST -----------------------------------------------------------------------\n\nfunction evalCast(ctx: EngineCtx, scope: EvalScope, inner: Expr, target: TypeName): TypedValue {\n const resolved = resolveTypeName(ctx.state, target);\n const v = evalExpr(ctx, scope, inner);\n const result = castTo(ctx, v, resolved.column.id, { explicit: true, mod: resolved.column.mod });\n if (resolved.domain !== null) {\n applyDomainChecks(ctx, resolved.domain, result);\n }\n return result;\n}\n\n/** Domain NOT NULL + CHECK constraints, with VALUE bound to the cast result. */\nexport function applyDomainChecks(ctx: EngineCtx, domainKey: string, value: TypedValue): void {\n const dot = domainKey.indexOf(\".\");\n const domain = ctx.state.findDomain(dot === -1 ? [domainKey] : [domainKey.slice(0, dot), domainKey.slice(dot + 1)]);\n if (!domain) return;\n if (domain.notNull && value.v === null) {\n throw pgError(\"not_null_violation\", `domain ${domain.name} does not allow null values`);\n }\n const scope: EvalScope = {\n lookupColumn: (parts) => (parts.length === 1 && parts[0] === \"value\" ? value : undefined),\n };\n for (const check of domain.checks) {\n const ok = toBool(ctx, evalExpr(ctx, scope, check.expr));\n if (ok === false) {\n throw pgError(\"check_violation\", `value for domain ${domain.name} violates check constraint \"${check.name}\"`);\n }\n }\n}\n\n// --- CASE -----------------------------------------------------------------------\n\nfunction evalCase(ctx: EngineCtx, scope: EvalScope, e: CaseExpr): TypedValue {\n let chosen: Expr | null = null;\n if (e.operand !== null) {\n const operand = evalExpr(ctx, scope, e.operand);\n for (const { when, then } of e.whens) {\n const w = evalExpr(ctx, scope, when);\n const cmp = evalBinary(ctx, \"=\", operand, w);\n if (cmp.v === true) {\n chosen = then;\n break;\n }\n }\n } else {\n for (const { when, then } of e.whens) {\n if (toBool(ctx, evalExpr(ctx, scope, when)) === true) {\n chosen = then;\n break;\n }\n }\n }\n const resultExpr = chosen ?? e.elseExpr;\n if (resultExpr === null) return tv(UNKNOWN, null);\n return evalExpr(ctx, scope, resultExpr);\n}\n\n// --- IN / BETWEEN ---------------------------------------------------------------\n\nfunction evalIn(ctx: EngineCtx, scope: EvalScope, e: InExpr): TypedValue {\n const left = evalExpr(ctx, scope, e.left);\n let sawNull = false;\n let found = false;\n if (e.list) {\n for (const item of e.list) {\n const r = evalExpr(ctx, scope, item);\n const cmp = evalBinary(ctx, \"=\", left, r);\n if (cmp.v === true) {\n found = true;\n break;\n }\n if (cmp.v === null) sawNull = true;\n }\n } else if (e.query) {\n if (!scope.execColumnSubquery) throw unsupported(\"subqueries in this context\");\n const { type, values } = scope.execColumnSubquery(e.query);\n for (const value of values) {\n const cmp = evalBinary(ctx, \"=\", left, tv(type, value));\n if (cmp.v === true) {\n found = true;\n break;\n }\n if (cmp.v === null) sawNull = true;\n }\n }\n let result: boolean | null;\n // an empty set makes IN false even for a NULL needle; a NULL needle over a\n // non-empty set yields NULL comparisons (sawNull) per element\n if (found) result = true;\n else if (sawNull) result = null;\n else result = false;\n if (e.not) result = result === null ? null : !result;\n return tv(\"bool\", result);\n}\n\nfunction evalBetween(ctx: EngineCtx, scope: EvalScope, e: BetweenExpr): TypedValue {\n const v = evalExpr(ctx, scope, e.left);\n let low = evalExpr(ctx, scope, e.low);\n let high = evalExpr(ctx, scope, e.high);\n if (e.symmetric) {\n const cmp = evalBinary(ctx, \">\", low, high);\n if (cmp.v === true) [low, high] = [high, low];\n }\n const geLow = toBool(ctx, evalBinary(ctx, \">=\", v, low));\n const leHigh = toBool(ctx, evalBinary(ctx, \"<=\", v, high));\n let result: boolean | null;\n if (geLow === false || leHigh === false) result = false;\n else if (geLow === null || leHigh === null) result = null;\n else result = true;\n if (e.not) result = result === null ? null : !result;\n return tv(\"bool\", result);\n}\n\n// --- subqueries -----------------------------------------------------------------\n\nfunction evalSubquery(ctx: EngineCtx, scope: EvalScope, e: SubqueryExpr): TypedValue {\n switch (e.kind) {\n case \"scalar\": {\n if (!scope.execScalarSubquery) throw unsupported(\"subqueries in this context\");\n return scope.execScalarSubquery(e.query);\n }\n case \"exists\": {\n if (!scope.execExistsSubquery) throw unsupported(\"subqueries in this context\");\n const exists = scope.execExistsSubquery(e.query);\n return tv(\"bool\", e.not ? !exists : exists);\n }\n case \"any\":\n case \"all\": {\n if (!scope.execColumnSubquery) throw unsupported(\"subqueries in this context\");\n const left = evalExpr(ctx, scope, e.left!);\n const { type, values } = scope.execColumnSubquery(e.query);\n return anyAllCompare(\n ctx,\n e.op ?? \"=\",\n left,\n values.map((v) => tv(type, v)),\n e.kind,\n );\n }\n }\n}\n\nexport function anyAllCompare(\n ctx: EngineCtx,\n op: string,\n left: TypedValue,\n rights: TypedValue[],\n kind: \"any\" | \"all\",\n): TypedValue {\n let sawNull = false;\n if (kind === \"any\") {\n for (const r of rights) {\n const cmp = toBool(ctx, evalBinary(ctx, op, left, r));\n if (cmp === true) return tv(\"bool\", true);\n if (cmp === null) sawNull = true;\n }\n return tv(\"bool\", sawNull ? null : false);\n }\n for (const r of rights) {\n const cmp = toBool(ctx, evalBinary(ctx, op, left, r));\n if (cmp === false) return tv(\"bool\", false);\n if (cmp === null) sawNull = true;\n }\n return tv(\"bool\", sawNull ? null : true);\n}\n\n// --- rows / arrays / subscripts ---------------------------------------------------\n\nfunction evalRow(ctx: EngineCtx, scope: EvalScope, e: RowExpr): TypedValue {\n const values: Datum[] = [];\n const types: TypeId[] = [];\n for (const item of e.items) {\n const v = evalExpr(ctx, scope, item);\n values.push(v.v);\n types.push(v.t);\n }\n const rec: PgRecord = { kind: \"pgrecord\", types, values };\n return tv(\"record\", rec);\n}\n\nfunction evalArrayCtor(ctx: EngineCtx, scope: EvalScope, e: ArrayCtor): TypedValue {\n const items = e.items.map((item) => evalExpr(ctx, scope, item));\n // nested ARRAY[ARRAY[..]] \u2192 multidimensional\n if (items.length > 0 && items.every((i) => isArrayType(i.t) && i.v !== null)) {\n const elem = items\n .map((i) => arrayElemType(i.t))\n .reduce<TypeId | null>((acc, t) => (acc === null ? t : (unifyTypes(acc, t) ?? acc)), null)!;\n const inner = items.map((i) => castTo(ctx, i, `${elem}[]`, {}).v as PgArray);\n const innerDims = inner[0]!.dims;\n for (const arr of inner) {\n if (arr.dims.join(\",\") !== innerDims.join(\",\")) {\n throw pgError(\n \"array_subscript_error\",\n \"multidimensional arrays must have array expressions with matching dimensions\",\n );\n }\n }\n const values: Datum[] = [];\n for (const arr of inner) values.push(...arr.items);\n return tv(`${elem}[]`, makeArray(elem, values, [items.length, ...innerDims], [1, ...inner[0]!.lbs]));\n }\n let elem: TypeId | null = null;\n for (const item of items) {\n if (item.t === UNKNOWN) continue;\n elem = elem === null ? item.t : (unifyTypes(elem, item.t) ?? elem);\n }\n const finalElem = elem ?? \"text\";\n const values = items.map((i) => castTo(ctx, i, finalElem, {}).v);\n return tv(`${finalElem}[]`, makeArray(finalElem, values));\n}\n\nfunction evalSubscript(ctx: EngineCtx, scope: EvalScope, e: SubscriptExpr): TypedValue {\n const base = evalExpr(ctx, scope, e.base);\n if (base.t === \"jsonb\" || (base.t === UNKNOWN && isJsonbWrap(base.v))) {\n return evalJsonbSubscript(ctx, scope, base, e);\n }\n if (!isArrayType(base.t)) {\n throw pgError(\"datatype_mismatch\", `cannot subscript type ${base.t} because it does not support subscripting`);\n }\n if (base.v === null) return tv(arrayElemType(base.t), null);\n const arr = base.v as PgArray;\n const anySlice = e.indexes.some((i) => i.slice);\n if (anySlice) {\n return evalArraySlice(ctx, scope, base.t, arr, e);\n }\n const idx: number[] = [];\n for (const sub of e.indexes) {\n const v = evalExpr(ctx, scope, sub.lower ?? sub.upper!);\n const cast = castTo(ctx, v, \"int4\", {});\n if (cast.v === null) return tv(arrayElemType(base.t), null);\n idx.push(cast.v as number);\n }\n const dims = arr.dims.length > 0 ? arr.dims : [arr.items.length];\n const lbs = arr.lbs.length > 0 ? arr.lbs : [1];\n if (idx.length !== dims.length) return tv(arrayElemType(base.t), null);\n let flat = 0;\n for (let d = 0; d < dims.length; d++) {\n const i = idx[d]! - lbs[d]!;\n if (i < 0 || i >= dims[d]!) return tv(arrayElemType(base.t), null);\n flat = flat * dims[d]! + i;\n }\n return tv(arrayElemType(base.t), arr.items[flat] ?? null);\n}\n\nfunction evalArraySlice(ctx: EngineCtx, scope: EvalScope, t: TypeId, arr: PgArray, e: SubscriptExpr): TypedValue {\n const dims = arr.dims.length > 0 ? arr.dims : [arr.items.length];\n const lbs = arr.lbs.length > 0 ? arr.lbs : [1];\n if (e.indexes.length !== dims.length) return tv(t, makeArray(arrayElemType(t), []));\n const ranges: Array<{ lo: number; hi: number }> = [];\n for (let d = 0; d < dims.length; d++) {\n const sub = e.indexes[d]!;\n let lo = lbs[d]!;\n let hi = lbs[d]! + dims[d]! - 1;\n if (sub.lower) {\n const v = castTo(ctx, evalExpr(ctx, scope, sub.lower), \"int4\", {});\n if (v.v === null) return tv(t, null);\n lo = Math.max(lo, v.v as number);\n }\n if (sub.upper && sub.slice) {\n const v = castTo(ctx, evalExpr(ctx, scope, sub.upper), \"int4\", {});\n if (v.v === null) return tv(t, null);\n hi = Math.min(hi, v.v as number);\n } else if (sub.upper && !sub.lower && !sub.slice) {\n const v = castTo(ctx, evalExpr(ctx, scope, sub.upper), \"int4\", {});\n if (v.v === null) return tv(t, null);\n lo = v.v as number;\n hi = v.v as number;\n }\n if (hi < lo) return tv(t, makeArray(arrayElemType(t), []));\n ranges.push({ lo, hi });\n }\n const outDims = ranges.map((r) => r.hi - r.lo + 1);\n const out: Datum[] = [];\n const walk = (d: number, offset: number): void => {\n const stride = dims.slice(d + 1).reduce((a, b) => a * b, 1);\n for (let i = ranges[d]!.lo - lbs[d]!; i <= ranges[d]!.hi - lbs[d]!; i++) {\n if (d === dims.length - 1) out.push(arr.items[offset + i] ?? null);\n else walk(d + 1, offset + i * stride);\n }\n };\n walk(0, 0);\n return tv(\n t,\n makeArray(\n arrayElemType(t),\n out,\n outDims,\n outDims.map(() => 1),\n ),\n );\n}\n\nfunction evalJsonbSubscript(ctx: EngineCtx, scope: EvalScope, base: TypedValue, e: SubscriptExpr): TypedValue {\n if (base.v === null) return tv(\"jsonb\", null);\n let current: JsonbValue | null = (base.v as JsonbWrap).value;\n for (const sub of e.indexes) {\n if (current === null) return tv(\"jsonb\", null);\n if (sub.slice) throw pgError(\"datatype_mismatch\", \"jsonb subscript does not support slices\");\n const k = evalExpr(ctx, scope, sub.lower ?? sub.upper!);\n if (k.v === null) return tv(\"jsonb\", null);\n if (current.j === \"obj\") {\n const key = String(castTo(ctx, k, \"text\", { explicit: true }).v);\n current = current.v.get(key) ?? null;\n } else if (current.j === \"arr\") {\n const cast = castTo(ctx, k, \"int4\", { explicit: true });\n let i = cast.v as number;\n if (i < 0) i += current.v.length;\n current = current.v[i] ?? null;\n } else {\n return tv(\"jsonb\", null);\n }\n }\n return current === null ? tv(\"jsonb\", null) : tv(\"jsonb\", wrapJsonb(current));\n}\n\nfunction evalFieldSelect(ctx: EngineCtx, base: TypedValue, field: string): TypedValue {\n void ctx;\n if (base.t === \"record\" && base.v !== null) {\n const rec = base.v as PgRecord;\n if (rec.names) {\n const idx = rec.names.indexOf(field);\n if (idx >= 0) return tv(rec.types[idx]!, rec.values[idx]!);\n }\n throw pgError(\"undefined_column\", `could not identify column \"${field}\" in record data type`);\n }\n if (base.v === null) return tv(UNKNOWN, null);\n throw pgError(\"undefined_column\", `column notation .${field} applied to type ${base.t}`);\n}\n\n// --- LIKE / SIMILAR --------------------------------------------------------------\n\nfunction evalLike(ctx: EngineCtx, scope: EvalScope, e: LikeExpr): TypedValue {\n const l0 = evalExpr(ctx, scope, e.left);\n const p0 = evalExpr(ctx, scope, e.pattern);\n // ~~ candidates are text-family only; non-text operands have no implicit path\n const likeable = (t: TypeId): boolean => t === \"unknown\" || isTextType(t) || t === \"bytea\";\n if (!likeable(l0.t) || !likeable(p0.t)) {\n const op = e.kind === \"ilike\" ? \"~~*\" : e.kind === \"similar\" ? \"~\" : \"~~\";\n throw pgError(\n \"undefined_function\",\n `operator does not exist: ${typeDisplayName(l0.t)} ${op} ${typeDisplayName(p0.t)}`,\n );\n }\n // bytea LIKE matches raw bytes, not the hex text form\n const byteaStr = (v: TypedValue): TypedValue =>\n v.t === \"bytea\" && v.v !== null ? tv(\"text\", String.fromCharCode(...(v.v as Uint8Array))) : v;\n const l = castTo(ctx, byteaStr(l0), \"text\", {});\n const p = castTo(ctx, byteaStr(p0), \"text\", {});\n const escTv = e.escape ? castTo(ctx, evalExpr(ctx, scope, e.escape), \"text\", {}) : null;\n if (l.v === null || p.v === null || (escTv !== null && escTv.v === null)) return tv(\"bool\", null);\n const esc = escTv === null ? \"\\\\\" : (escTv.v as string);\n if (esc.length > 1) throw pgError(\"invalid_escape_sequence\", \"invalid escape string\");\n let source: string;\n if (e.kind === \"similar\") {\n source = similarToRegex(p.v as string, esc === \"\" ? null : esc);\n } else {\n source = likeToRegex(p.v as string, esc === \"\" ? null : esc);\n }\n const re = new RegExp(source, e.kind === \"ilike\" ? \"is\" : \"s\");\n const match = re.test(l.v as string);\n return tv(\"bool\", e.not ? !match : match);\n}\n\n// --- function calls --------------------------------------------------------------\n\nconst LAZY_FUNCS = new Set([\"coalesce\", \"nullif\", \"greatest\", \"least\"]);\n\nfunction evalFuncCall(ctx: EngineCtx, scope: EvalScope, e: FuncCall): TypedValue {\n const agg = scope.aggValue?.(e);\n if (agg !== undefined) return agg;\n const win = scope.windowValue?.(e);\n if (win !== undefined) return win;\n if (e.over) {\n throw pgError(\"windowing_error\", \"window functions are not allowed in this context\");\n }\n\n const bare = e.name.length === 1 ? e.name[0]! : e.name.length === 2 && e.name[0] === \"pg_catalog\" ? e.name[1]! : null;\n\n if (bare !== null && LAZY_FUNCS.has(bare)) {\n return evalLazyFunc(ctx, scope, bare, e.args);\n }\n\n // parser-desugared `x op ANY(array)` / `x op ALL(array)`\n if (bare === \"__any_array\" || bare === \"__all_array\") {\n return evalAnyAllArray(ctx, scope, bare === \"__any_array\" ? \"any\" : \"all\", e.args);\n }\n // parser-desugared `(s1, e1) OVERLAPS (s2, e2)`\n if (bare === \"__overlaps\") {\n return evalOverlaps(ctx, scope, e.args);\n }\n\n let args = e.args.map((a) => evalExpr(ctx, scope, a));\n if (e.argNames && bare !== null) args = reorderNamedArgs(bare, args, e.argNames);\n\n if (bare !== null) {\n const stateful = scope.callStatefulFunction?.(bare, args);\n if (stateful !== undefined) return stateful;\n if (hasScalarFunction(bare)) {\n return callScalarFunction(ctx, bare, args);\n }\n }\n\n const user = scope.callUserFunction?.(e.name, args, e);\n if (user !== undefined) return user;\n\n throw pgError(\n \"undefined_function\",\n `function ${e.name.join(\".\")}(${args.map((a) => a.t).join(\", \")}) does not exist`,\n );\n}\n\n/** Builtin parameter-name signatures for named-notation calls (f(a => 1)). */\nconst NAMED_ARG_SIGNATURES = new Map<string, { params: string[]; defaults: TypedValue[] }>([\n [\n \"make_interval\",\n {\n params: [\"years\", \"months\", \"weeks\", \"days\", \"hours\", \"mins\", \"secs\"],\n defaults: [\n tv(\"int4\", 0),\n tv(\"int4\", 0),\n tv(\"int4\", 0),\n tv(\"int4\", 0),\n tv(\"int4\", 0),\n tv(\"int4\", 0),\n tv(\"float8\", 0),\n ],\n },\n ],\n]);\n\nfunction reorderNamedArgs(name: string, args: TypedValue[], argNames: (string | null)[]): TypedValue[] {\n const sig = NAMED_ARG_SIGNATURES.get(name);\n if (!sig) return args;\n const out = sig.defaults.slice();\n let pos = 0;\n for (let i = 0; i < args.length; i++) {\n const n = argNames[i];\n const idx = n === null || n === undefined ? pos++ : sig.params.indexOf(n);\n if (idx < 0) throw pgError(\"undefined_function\", `function ${name} has no parameter named \"${n}\"`);\n out[idx] = args[i]!;\n }\n return out;\n}\n\nfunction evalOverlaps(ctx: EngineCtx, scope: EvalScope, args: Expr[]): TypedValue {\n const pair = (e: Expr): [TypedValue, TypedValue] => {\n if (e.type === \"row\" && e.items.length === 2) {\n return [evalExpr(ctx, scope, e.items[0]!), evalExpr(ctx, scope, e.items[1]!)];\n }\n throw pgError(\"syntax\", \"OVERLAPS requires (start, end) pairs\");\n };\n const [s1r, e1r] = pair(args[0]!);\n const [s2r, e2r] = pair(args[1]!);\n // unify all four endpoints to a common datetime type; intervals mean start + interval\n const resolveEnd = (start: TypedValue, end: TypedValue): TypedValue =>\n end.t === \"interval\" ? evalBinary(ctx, \"+\", start, end) : end;\n const e1 = resolveEnd(s1r, e1r);\n const e2 = resolveEnd(s2r, e2r);\n const target = [s1r, e1, s2r, e2].map((x) => x.t).find((t) => t !== \"unknown\") ?? \"timestamp\";\n const vals = [s1r, e1, s2r, e2].map((x) => castTo(ctx, x, target, { explicit: true }));\n if (vals.some((x) => x.v === null)) return tv(\"bool\", null);\n const cmp = (a: TypedValue, b: TypedValue): number => datumCompare(target, a.v as Datum, b.v as Datum, ctx);\n let [s1, en1, s2, en2] = vals as [TypedValue, TypedValue, TypedValue, TypedValue];\n if (cmp(s1, en1) > 0) [s1, en1] = [en1, s1];\n if (cmp(s2, en2) > 0) [s2, en2] = [en2, s2];\n return tv(\"bool\", cmp(s1, en2) < 0 && cmp(s2, en1) < 0);\n}\n\nfunction evalAnyAllArray(ctx: EngineCtx, scope: EvalScope, kind: \"any\" | \"all\", args: Expr[]): TypedValue {\n const left = evalExpr(ctx, scope, args[0]!);\n const arrArg = args[1]!;\n const opArg = args[2]!;\n const op = opArg.type === \"string_lit\" ? opArg.value : \"=\";\n let arr = evalExpr(ctx, scope, arrArg);\n if (arr.v === null) return tv(\"bool\", null);\n if (arr.t === UNKNOWN || typeof arr.v === \"string\") {\n // untyped literal: infer element type from the left operand\n const elemT = left.t === UNKNOWN ? \"text\" : left.t;\n arr = castTo(ctx, arr, arrayTypeOf(elemT), {});\n }\n if (!isPgArray(arr.v)) {\n throw pgError(\"datatype_mismatch\", `op ${kind.toUpperCase()} requires an array`, \"42809\");\n }\n const elemType = arr.v.elem;\n const rights = arr.v.items.map((item) => tv(elemType, item));\n return anyAllCompare(ctx, op, left, rights, kind);\n}\n\nfunction evalLazyFunc(ctx: EngineCtx, scope: EvalScope, name: string, argExprs: Expr[]): TypedValue {\n switch (name) {\n case \"coalesce\": {\n let t: TypeId = UNKNOWN;\n for (const a of argExprs) {\n const v = evalExpr(ctx, scope, a);\n if (v.t !== UNKNOWN) t = t === UNKNOWN ? v.t : (unifyTypes(t, v.t) ?? t);\n if (v.v !== null) return t === UNKNOWN ? v : castTo(ctx, v, t, {});\n }\n return tv(t === UNKNOWN ? \"text\" : t, null);\n }\n case \"nullif\": {\n if (argExprs.length !== 2) throw pgError(\"undefined_function\", \"NULLIF requires 2 arguments\");\n const a = evalExpr(ctx, scope, argExprs[0]!);\n const b = evalExpr(ctx, scope, argExprs[1]!);\n const cmp = evalBinary(ctx, \"=\", a, b);\n if (cmp.v === true) return tv(a.t, null);\n return a;\n }\n case \"greatest\":\n case \"least\": {\n const op = name === \"greatest\" ? \">\" : \"<\";\n let best: TypedValue | null = null;\n let t: TypeId = UNKNOWN;\n const vals = argExprs.map((a) => evalExpr(ctx, scope, a));\n for (const v of vals) {\n if (v.t !== UNKNOWN) t = t === UNKNOWN ? v.t : (unifyTypes(t, v.t) ?? t);\n }\n const finalT = t === UNKNOWN ? \"text\" : t;\n for (const v0 of vals) {\n const v = castTo(ctx, v0, finalT, {});\n if (v.v === null) continue;\n if (best === null || evalBinary(ctx, op, v, best).v === true) best = v;\n }\n return best ?? tv(finalT, null);\n }\n default:\n throw pgError(\"internal\", `lazy function ${name} not handled`);\n }\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport type { EngineCtx } from \"../expressions/context.ts\";\nimport { castTo, unifyTypes } from \"../types/cast.ts\";\nimport { datumCompare } from \"../types/compare.ts\";\nimport { JSONB_NULL, type JsonbValue, jsonbArr, jsonbCompactText, jsonbObj } from \"../types/jsonb.ts\";\nimport {\n makeNumeric,\n type Numeric,\n numericAdd,\n numericCmp,\n numericDivScaled,\n numericFromBigInt,\n numericMul,\n numericSqrt,\n numericSub,\n selectDivScale,\n} from \"../types/numeric.ts\";\nimport {\n arrayTypeOf,\n type Datum,\n makeArray,\n type TypedValue,\n type TypeId,\n tv,\n UNKNOWN,\n wrapJsonb,\n} from \"../types/value.ts\";\nimport { datumToJsonb } from \"./json-fns.ts\";\nimport { numericAsNumber } from \"./util.ts\";\n\n/** Incremental accumulator; the executor feeds rows and reads the result. */\nexport interface AggregateAcc {\n step(args: TypedValue[]): void;\n result(): TypedValue;\n}\n\nexport type AggregateFactory = (ctx: EngineCtx, argTypes: TypeId[]) => AggregateAcc;\n\nconst INT_TYPES = new Set([\"int2\", \"int4\", \"int8\"]);\n\nfunction sumResultType(argT: TypeId): TypeId {\n if (argT === \"int8\" || argT === \"numeric\") return \"numeric\";\n if (argT === \"int2\" || argT === \"int4\") return \"int8\";\n if (argT === \"float4\") return \"float4\";\n if (argT === \"float8\") return \"float8\";\n if (argT === \"interval\") return \"interval\";\n if (argT === \"money\") return \"money\";\n return \"numeric\";\n}\n\nfunction avgResultType(argT: TypeId): TypeId {\n if (INT_TYPES.has(argT) || argT === \"numeric\") return \"numeric\";\n if (argT === \"interval\") return \"interval\";\n return \"float8\";\n}\n\nclass CountAcc implements AggregateAcc {\n private n = 0n;\n step(args: TypedValue[]): void {\n if (args.length === 0 || args[0]!.v !== null) this.n++;\n }\n result(): TypedValue {\n return tv(\"int8\", this.n);\n }\n}\n\nclass SumAcc implements AggregateAcc {\n private readonly resultT: TypeId;\n private numericSum: Numeric | null = null;\n private floatSum: number | null = null;\n private intervalSum: { months: number; days: number; micros: bigint } | null = null;\n constructor(\n private readonly ctx: EngineCtx,\n argT: TypeId,\n ) {\n this.resultT = sumResultType(argT === UNKNOWN ? \"numeric\" : argT);\n }\n step(args: TypedValue[]): void {\n const a = args[0]!;\n if (a.v === null) return;\n if (this.resultT === \"interval\") {\n const iv = a.v as { months: number; days: number; micros: bigint };\n if (!this.intervalSum) this.intervalSum = { months: 0, days: 0, micros: 0n };\n this.intervalSum.months += iv.months;\n this.intervalSum.days += iv.days;\n this.intervalSum.micros += iv.micros;\n return;\n }\n if (this.resultT === \"float4\" || this.resultT === \"float8\") {\n this.floatSum = (this.floatSum ?? 0) + (a.v as number);\n return;\n }\n const n = castTo(this.ctx, a, \"numeric\", { explicit: true }).v as Numeric;\n this.numericSum = this.numericSum === null ? n : numericAdd(this.numericSum, n);\n }\n result(): TypedValue {\n if (this.resultT === \"interval\") {\n if (!this.intervalSum) return tv(\"interval\", null);\n return tv(\"interval\", { kind: \"interval\", ...this.intervalSum } as never);\n }\n if (this.resultT === \"float4\" || this.resultT === \"float8\") {\n return tv(this.resultT, this.floatSum);\n }\n if (this.numericSum === null) return tv(this.resultT, null);\n if (this.resultT === \"int8\") {\n return castTo(this.ctx, tv(\"numeric\", this.numericSum), \"int8\", { explicit: true });\n }\n return tv(\"numeric\", this.numericSum);\n }\n}\n\nclass AvgAcc implements AggregateAcc {\n private n = 0n;\n private numericSum: Numeric = makeNumeric(0n, 0);\n private floatSum = 0;\n private intervalSum = { months: 0, days: 0, micros: 0n };\n private readonly resultT: TypeId;\n constructor(\n private readonly ctx: EngineCtx,\n readonly argT: TypeId,\n ) {\n this.resultT = avgResultType(argT === UNKNOWN ? \"numeric\" : argT);\n }\n step(args: TypedValue[]): void {\n const a = args[0]!;\n if (a.v === null) return;\n this.n++;\n if (this.resultT === \"float8\") {\n this.floatSum += castTo(this.ctx, a, \"float8\", { explicit: true }).v as number;\n } else if (this.resultT === \"interval\") {\n const iv = a.v as { months: number; days: number; micros: bigint };\n this.intervalSum.months += iv.months;\n this.intervalSum.days += iv.days;\n this.intervalSum.micros += iv.micros;\n } else {\n this.numericSum = numericAdd(this.numericSum, castTo(this.ctx, a, \"numeric\", { explicit: true }).v as Numeric);\n }\n }\n result(): TypedValue {\n if (this.n === 0n) return tv(this.resultT, null);\n if (this.resultT === \"float8\") return tv(\"float8\", this.floatSum / Number(this.n));\n if (this.resultT === \"interval\") {\n const totalMicros =\n (BigInt(this.intervalSum.months) * 2_629_800_000_000n +\n BigInt(this.intervalSum.days) * 86_400_000_000n +\n this.intervalSum.micros) /\n this.n;\n return tv(\"interval\", { kind: \"interval\", months: 0, days: 0, micros: totalMicros } as never);\n }\n // numeric avg divides sum/count with the standard division scale rule\n const divisor = numericFromBigInt(this.n);\n return tv(\"numeric\", numericDivScaled(this.numericSum, divisor, selectDivScale(this.numericSum, divisor)));\n }\n}\n\nclass MinMaxAcc implements AggregateAcc {\n private best: TypedValue | null = null;\n constructor(\n private readonly ctx: EngineCtx,\n private readonly isMax: boolean,\n private argT: TypeId,\n ) {}\n step(args: TypedValue[]): void {\n const a = args[0]!;\n if (a.v === null) return;\n if (this.argT === UNKNOWN && a.t !== UNKNOWN) this.argT = a.t;\n const t = this.argT === UNKNOWN ? \"text\" : this.argT;\n const v = castTo(this.ctx, a, t, {});\n if (this.best === null) {\n this.best = v;\n return;\n }\n const c = datumCompare(t, v.v, this.best.v, this.ctx);\n if (this.isMax ? c > 0 : c < 0) this.best = v;\n }\n result(): TypedValue {\n const t = this.argT === UNKNOWN ? \"text\" : this.argT;\n return this.best ?? tv(t, null);\n }\n}\n\nclass BoolAndOrAcc implements AggregateAcc {\n private acc: boolean | null = null;\n constructor(private readonly isAnd: boolean) {}\n step(args: TypedValue[]): void {\n const v = args[0]!.v;\n if (v === null) return;\n const b = v as boolean;\n if (this.acc === null) this.acc = b;\n else this.acc = this.isAnd ? this.acc && b : this.acc || b;\n }\n result(): TypedValue {\n return tv(\"bool\", this.acc);\n }\n}\n\nclass StringAggAcc implements AggregateAcc {\n private parts: string[] | null = null;\n private lastSep = \"\";\n private readonly isBytea: boolean;\n private byteaParts: Uint8Array[] | null = null;\n constructor(\n private readonly ctx: EngineCtx,\n argT: TypeId,\n ) {\n this.isBytea = argT === \"bytea\";\n }\n step(args: TypedValue[]): void {\n const a = args[0]!;\n if (a.v === null) return;\n const sep =\n args[1] === undefined || args[1].v === null\n ? \"\"\n : this.isBytea\n ? \"\"\n : (castTo(this.ctx, args[1], \"text\", { explicit: true }).v as string);\n if (this.isBytea) {\n if (!this.byteaParts) this.byteaParts = [];\n else if (args[1] !== undefined && args[1].v !== null) this.byteaParts.push(args[1].v as Uint8Array);\n this.byteaParts.push(a.v as Uint8Array);\n return;\n }\n const text = castTo(this.ctx, a, \"text\", { explicit: true }).v as string;\n if (this.parts === null) this.parts = [text];\n else {\n this.parts.push(sep);\n this.parts.push(text);\n }\n this.lastSep = sep;\n void this.lastSep;\n }\n result(): TypedValue {\n if (this.isBytea) {\n if (!this.byteaParts) return tv(\"bytea\", null);\n const total = this.byteaParts.reduce((acc, p) => acc + p.length, 0);\n const out = new Uint8Array(total);\n let off = 0;\n for (const p of this.byteaParts) {\n out.set(p, off);\n off += p.length;\n }\n return tv(\"bytea\", out);\n }\n return tv(\"text\", this.parts === null ? null : this.parts.join(\"\"));\n }\n}\n\nclass ArrayAggAcc implements AggregateAcc {\n private items: Datum[] = [];\n private any = false;\n constructor(\n private readonly ctx: EngineCtx,\n private argT: TypeId,\n ) {}\n step(args: TypedValue[]): void {\n const a = args[0]!;\n this.any = true;\n if (this.argT === UNKNOWN && a.t !== UNKNOWN) this.argT = a.t;\n const t = this.argT === UNKNOWN ? \"text\" : this.argT;\n this.items.push(a.v === null ? null : castTo(this.ctx, a, t, {}).v);\n }\n result(): TypedValue {\n const t = this.argT === UNKNOWN ? \"text\" : this.argT;\n if (!this.any) return tv(arrayTypeOf(t), null);\n return tv(arrayTypeOf(t), makeArray(t, this.items));\n }\n}\n\nclass JsonAggAcc implements AggregateAcc {\n private items: JsonbValue[] = [];\n private any = false;\n constructor(\n private readonly ctx: EngineCtx,\n private readonly jsonb: boolean,\n ) {}\n step(args: TypedValue[]): void {\n const a = args[0]!;\n this.any = true;\n this.items.push(a.v === null ? JSONB_NULL : datumToJsonb(this.ctx, a.t, a.v));\n }\n result(): TypedValue {\n if (!this.any) return tv(this.jsonb ? \"jsonb\" : \"json\", null);\n const arr = jsonbArr(this.items);\n if (this.jsonb) return tv(\"jsonb\", wrapJsonb(arr));\n // json_agg joins compact element renderings with \", \"\n return tv(\"json\", `[${this.items.map(jsonbCompactText).join(\", \")}]`);\n }\n}\n\nclass JsonObjectAggAcc implements AggregateAcc {\n private entries: Array<[string, JsonbValue]> = [];\n private any = false;\n constructor(\n private readonly ctx: EngineCtx,\n private readonly jsonb: boolean,\n ) {}\n step(args: TypedValue[]): void {\n const k = args[0]!;\n const v = args[1]!;\n this.any = true;\n if (k.v === null) {\n throw pgError(\"null_value_not_allowed\", \"field name must not be null\", \"22004\");\n }\n const key = castTo(this.ctx, k, \"text\", { explicit: true }).v as string;\n this.entries.push([key, v.v === null ? JSONB_NULL : datumToJsonb(this.ctx, v.t, v.v)]);\n }\n result(): TypedValue {\n if (!this.any) return tv(this.jsonb ? \"jsonb\" : \"json\", null);\n if (this.jsonb) return tv(\"jsonb\", wrapJsonb(jsonbObj(this.entries)));\n // json_object_agg spacing: `{ \"a\" : 1, \"b\" : 2 }`, insertion order (duplicates collapse \u2014 divergence)\n const obj = jsonbObj(this.entries);\n const entries = obj.j === \"obj\" ? [...obj.v.entries()] : [];\n const body = entries.map(([k, x]) => `${JSON.stringify(k)} : ${jsonbCompactText(x)}`).join(\", \");\n return tv(\"json\", `{ ${body} }`);\n }\n}\n\nclass BitwiseAcc implements AggregateAcc {\n private acc: bigint | null = null;\n private resultT: TypeId = \"int8\";\n constructor(\n private readonly op: \"and\" | \"or\" | \"xor\",\n readonly argT: TypeId,\n ) {\n this.resultT = argT === UNKNOWN ? \"int8\" : argT;\n }\n step(args: TypedValue[]): void {\n const a = args[0]!;\n if (a.v === null) return;\n const v = typeof a.v === \"bigint\" ? a.v : BigInt(a.v as number);\n if (this.acc === null) {\n this.acc = v;\n return;\n }\n this.acc = this.op === \"and\" ? this.acc & v : this.op === \"or\" ? this.acc | v : this.acc ^ v;\n }\n result(): TypedValue {\n if (this.acc === null) return tv(this.resultT, null);\n if (this.resultT === \"int8\") return tv(\"int8\", BigInt.asIntN(64, this.acc));\n return tv(this.resultT, Number(BigInt.asIntN(32, this.acc)));\n }\n}\n\n/** Welford-style accumulation over float8; numeric args use exact sums. */\nclass StatAcc implements AggregateAcc {\n private n = 0n;\n private sum: Numeric = makeNumeric(0n, 0);\n private sumSq: Numeric = makeNumeric(0n, 0);\n private useFloat: boolean;\n private fN = 0;\n private fSum = 0;\n private fSumSq = 0;\n constructor(\n private readonly ctx: EngineCtx,\n argT: TypeId,\n private readonly kind: \"var_samp\" | \"var_pop\" | \"stddev_samp\" | \"stddev_pop\",\n ) {\n this.useFloat = argT === \"float4\" || argT === \"float8\";\n }\n step(args: TypedValue[]): void {\n const a = args[0]!;\n if (a.v === null) return;\n if (this.useFloat) {\n const f = a.v as number;\n this.fN++;\n this.fSum += f;\n this.fSumSq += f * f;\n return;\n }\n const x = castTo(this.ctx, a, \"numeric\", { explicit: true }).v as Numeric;\n this.n++;\n this.sum = numericAdd(this.sum, x);\n this.sumSq = numericAdd(this.sumSq, numericMul(x, x));\n }\n result(): TypedValue {\n const resultT = this.useFloat ? \"float8\" : \"numeric\";\n const n = this.useFloat ? this.fN : Number(this.n);\n const isSamp = this.kind === \"var_samp\" || this.kind === \"stddev_samp\";\n if (n === 0 || (isSamp && n === 1)) return tv(resultT, null);\n if (this.useFloat) {\n const meanSq = (this.fSum * this.fSum) / this.fN;\n const ss = this.fSumSq - meanSq;\n const variance = ss / (isSamp ? this.fN - 1 : this.fN);\n const out = this.kind.startsWith(\"stddev\") ? Math.sqrt(Math.max(variance, 0)) : Math.max(variance, 0);\n return tv(\"float8\", out);\n }\n // numeric: variance = (n*sumSq - sum^2) / (n * (n or n-1))\n const nBig = numericFromBigInt(this.n);\n const numerator = numericSub(numericMul(nBig, this.sumSq), numericMul(this.sum, this.sum));\n const denomFactor = isSamp ? this.n - 1n : this.n;\n const denominator = numericMul(nBig, numericFromBigInt(denomFactor));\n const scale = Math.max(this.sum.dscale * 2 + 6, 16);\n let variance = numericDivScaled(numerator, denominator, scale);\n if (numericCmp(variance, makeNumeric(0n, 0)) < 0) variance = makeNumeric(0n, variance.dscale);\n if (this.kind.startsWith(\"stddev\")) {\n return tv(\"numeric\", numericSqrt(variance));\n }\n return tv(\"numeric\", variance);\n }\n}\n\n/** ordered-set aggregate: percentile_cont / percentile_disc / mode */\nclass PercentileAcc implements AggregateAcc {\n private values: TypedValue[] = [];\n private fraction: number | null = null;\n constructor(\n private readonly ctx: EngineCtx,\n private readonly kind: \"cont\" | \"disc\" | \"mode\",\n private argT: TypeId,\n ) {}\n step(args: TypedValue[]): void {\n // args[0] = direct arg (fraction), args[1] = within-group value\n if (this.kind !== \"mode\") {\n if (args[0]!.v !== null)\n this.fraction = numericAsNumber(castTo(this.ctx, args[0]!, \"float8\", { explicit: true }).v);\n const v = args[1]!;\n if (v.v === null) return;\n if (this.argT === UNKNOWN && v.t !== UNKNOWN) this.argT = v.t;\n this.values.push(v);\n return;\n }\n const v = args[0]!;\n if (v.v === null) return;\n if (this.argT === UNKNOWN && v.t !== UNKNOWN) this.argT = v.t;\n this.values.push(v);\n }\n result(): TypedValue {\n const t = this.argT === UNKNOWN ? \"float8\" : this.argT;\n if (this.values.length === 0 || (this.kind !== \"mode\" && this.fraction === null)) return tv(t, null);\n const sorted = [...this.values].sort((a, b) => datumCompare(t, a.v, b.v, this.ctx));\n if (this.kind === \"mode\") {\n let best = sorted[0]!;\n let bestCount = 1;\n let i = 0;\n while (i < sorted.length) {\n let j = i + 1;\n while (j < sorted.length && datumCompare(t, sorted[j]!.v, sorted[i]!.v, this.ctx) === 0) j++;\n if (j - i > bestCount) {\n best = sorted[i]!;\n bestCount = j - i;\n }\n i = j;\n }\n return best;\n }\n const frac = this.fraction!;\n if (frac < 0 || frac > 1 || Number.isNaN(frac)) {\n throw pgError(\"invalid_parameter_value\", \"percentile value must be between 0 and 1\", \"22023\");\n }\n if (this.kind === \"disc\") {\n const idx = Math.max(Math.ceil(frac * sorted.length) - 1, 0);\n return sorted[idx]!;\n }\n // continuous\n const pos = frac * (sorted.length - 1);\n const lo = Math.floor(pos);\n const hi = Math.ceil(pos);\n const loV = castTo(this.ctx, sorted[lo]!, \"float8\", { explicit: true }).v as number;\n if (lo === hi) {\n if (t === \"interval\" || INT_TYPES.has(t) || t === \"numeric\") return tv(\"float8\", loV);\n return tv(\"float8\", loV);\n }\n const hiV = castTo(this.ctx, sorted[hi]!, \"float8\", { explicit: true }).v as number;\n return tv(\"float8\", loV + (hiV - loV) * (pos - lo));\n }\n}\n\nclass CorrAcc implements AggregateAcc {\n n = 0;\n sumX = 0;\n sumY = 0;\n sumXY = 0;\n sumX2 = 0;\n sumY2 = 0;\n constructor(private readonly kind: string) {}\n step(args: TypedValue[]): void {\n const yArg = args[0]!;\n const xArg = args[1]!;\n if (yArg.v === null || xArg.v === null) return;\n const y = numericAsNumber(yArg.v);\n const x = numericAsNumber(xArg.v);\n this.n++;\n this.sumX += x;\n this.sumY += y;\n this.sumXY += x * y;\n this.sumX2 += x * x;\n this.sumY2 += y * y;\n }\n result(): TypedValue {\n const { n, sumX, sumY, sumXY, sumX2, sumY2 } = this;\n if (n === 0) return this.kind === \"regr_count\" ? tv(\"int8\", 0n) : tv(\"float8\", null);\n const sxx = sumX2 - (sumX * sumX) / n;\n const syy = sumY2 - (sumY * sumY) / n;\n const sxy = sumXY - (sumX * sumY) / n;\n switch (this.kind) {\n case \"corr\": {\n if (n < 2 || sxx === 0 || syy === 0) return tv(\"float8\", null);\n return tv(\"float8\", sxy / Math.sqrt(sxx * syy));\n }\n case \"covar_pop\":\n return tv(\"float8\", sxy / n);\n case \"covar_samp\":\n return n < 2 ? tv(\"float8\", null) : tv(\"float8\", sxy / (n - 1));\n case \"regr_slope\":\n return sxx === 0 ? tv(\"float8\", null) : tv(\"float8\", sxy / sxx);\n case \"regr_intercept\":\n return sxx === 0 ? tv(\"float8\", null) : tv(\"float8\", sumY / n - (sxy / sxx) * (sumX / n));\n case \"regr_r2\": {\n if (sxx === 0) return tv(\"float8\", null);\n if (syy === 0) return tv(\"float8\", 1);\n return tv(\"float8\", (sxy * sxy) / (sxx * syy));\n }\n case \"regr_count\":\n return tv(\"int8\", BigInt(n));\n case \"regr_avgx\":\n return tv(\"float8\", sumX / n);\n case \"regr_avgy\":\n return tv(\"float8\", sumY / n);\n case \"regr_sxx\":\n return tv(\"float8\", sxx);\n case \"regr_syy\":\n return tv(\"float8\", syy);\n case \"regr_sxy\":\n return tv(\"float8\", sxy);\n default:\n return tv(\"float8\", null);\n }\n }\n}\n\nconst FACTORIES = new Map<string, AggregateFactory>([\n [\"count\", (_ctx, _t) => new CountAcc()],\n [\"sum\", (ctx, t) => new SumAcc(ctx, t[0] ?? \"numeric\")],\n [\"avg\", (ctx, t) => new AvgAcc(ctx, t[0] ?? \"numeric\")],\n [\"min\", (ctx, t) => new MinMaxAcc(ctx, false, t[0] ?? UNKNOWN)],\n [\"max\", (ctx, t) => new MinMaxAcc(ctx, true, t[0] ?? UNKNOWN)],\n [\"bool_and\", () => new BoolAndOrAcc(true)],\n [\"bool_or\", () => new BoolAndOrAcc(false)],\n [\"every\", () => new BoolAndOrAcc(true)],\n [\"string_agg\", (ctx, t) => new StringAggAcc(ctx, t[0] ?? \"text\")],\n [\"array_agg\", (ctx, t) => new ArrayAggAcc(ctx, t[0] ?? UNKNOWN)],\n [\"json_agg\", (ctx) => new JsonAggAcc(ctx, false)],\n [\"jsonb_agg\", (ctx) => new JsonAggAcc(ctx, true)],\n [\"json_object_agg\", (ctx) => new JsonObjectAggAcc(ctx, false)],\n [\"jsonb_object_agg\", (ctx) => new JsonObjectAggAcc(ctx, true)],\n [\"bit_and\", (_ctx, t) => new BitwiseAcc(\"and\", t[0] ?? \"int8\")],\n [\"bit_or\", (_ctx, t) => new BitwiseAcc(\"or\", t[0] ?? \"int8\")],\n [\"bit_xor\", (_ctx, t) => new BitwiseAcc(\"xor\", t[0] ?? \"int8\")],\n [\"variance\", (ctx, t) => new StatAcc(ctx, t[0] ?? \"numeric\", \"var_samp\")],\n [\"var_samp\", (ctx, t) => new StatAcc(ctx, t[0] ?? \"numeric\", \"var_samp\")],\n [\"var_pop\", (ctx, t) => new StatAcc(ctx, t[0] ?? \"numeric\", \"var_pop\")],\n [\"stddev\", (ctx, t) => new StatAcc(ctx, t[0] ?? \"numeric\", \"stddev_samp\")],\n [\"stddev_samp\", (ctx, t) => new StatAcc(ctx, t[0] ?? \"numeric\", \"stddev_samp\")],\n [\"stddev_pop\", (ctx, t) => new StatAcc(ctx, t[0] ?? \"numeric\", \"stddev_pop\")],\n [\"percentile_cont\", (ctx, t) => new PercentileAcc(ctx, \"cont\", t[1] ?? UNKNOWN)],\n [\"percentile_disc\", (ctx, t) => new PercentileAcc(ctx, \"disc\", t[1] ?? UNKNOWN)],\n [\"mode\", (ctx, t) => new PercentileAcc(ctx, \"mode\", t[0] ?? UNKNOWN)],\n [\"corr\", () => new CorrAcc(\"corr\")],\n [\"covar_pop\", () => new CorrAcc(\"covar_pop\")],\n [\"covar_samp\", () => new CorrAcc(\"covar_samp\")],\n [\"regr_slope\", () => new CorrAcc(\"regr_slope\")],\n [\"regr_intercept\", () => new CorrAcc(\"regr_intercept\")],\n [\"regr_r2\", () => new CorrAcc(\"regr_r2\")],\n [\"regr_count\", () => new CorrAcc(\"regr_count\")],\n [\"regr_avgx\", () => new CorrAcc(\"regr_avgx\")],\n [\"regr_avgy\", () => new CorrAcc(\"regr_avgy\")],\n [\"regr_sxx\", () => new CorrAcc(\"regr_sxx\")],\n [\"regr_syy\", () => new CorrAcc(\"regr_syy\")],\n [\"regr_sxy\", () => new CorrAcc(\"regr_sxy\")],\n]);\n\nexport function getAggregateFactories(): Map<string, AggregateFactory> {\n return FACTORIES;\n}\n\nexport function isAggregateName(name: string): boolean {\n return FACTORIES.has(name);\n}\n\nexport function createAggregate(ctx: EngineCtx, name: string, argTypes: TypeId[]): AggregateAcc {\n const f = FACTORIES.get(name);\n if (!f) throw pgError(\"undefined_function\", `aggregate ${name} does not exist`, \"42883\");\n return f(ctx, argTypes);\n}\n\n/** true for aggregates whose arguments come from WITHIN GROUP (ORDER BY ...) */\nexport function isOrderedSetAggregate(name: string): boolean {\n return name === \"percentile_cont\" || name === \"percentile_disc\" || name === \"mode\";\n}\n\n/** unify agg arg type across rows (executor helper) */\nexport function unifyAggType(a: TypeId, b: TypeId): TypeId {\n if (a === UNKNOWN) return b;\n if (b === UNKNOWN) return a;\n return unifyTypes(a, b) ?? a;\n}\n\n/** result type helpers used by planner-ish code paths */\nexport function aggregateResultHint(name: string, argT: TypeId): TypeId {\n switch (name) {\n case \"count\":\n case \"regr_count\":\n return \"int8\";\n case \"sum\":\n return sumResultType(argT);\n case \"avg\":\n return avgResultType(argT);\n case \"array_agg\":\n return arrayTypeOf(argT === UNKNOWN ? \"text\" : argT);\n case \"string_agg\":\n return argT === \"bytea\" ? \"bytea\" : \"text\";\n case \"json_agg\":\n case \"json_object_agg\":\n return \"json\";\n case \"jsonb_agg\":\n case \"jsonb_object_agg\":\n return \"jsonb\";\n case \"bool_and\":\n case \"bool_or\":\n case \"every\":\n return \"bool\";\n default:\n return argT;\n }\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport type { EngineCtx } from \"../expressions/context.ts\";\nimport { pgRegexToJs, regexFlags } from \"../expressions/pattern.ts\";\nimport { castTo } from \"../types/cast.ts\";\nimport {\n civilToDays,\n daysInMonth,\n daysToCivil,\n intervalTotalMicros,\n isInterval,\n splitTs,\n USECS_PER_DAY,\n} from \"../types/datetime.ts\";\nimport { type JsonbValue, jsonbCompactText, parseJsonText } from \"../types/jsonb.ts\";\nimport { type Numeric, numericAdd, numericCmp, numericSign } from \"../types/numeric.ts\";\nimport {\n arrayElemType,\n type Datum,\n isArrayType,\n isJsonbWrap,\n type JsonbWrap,\n makeArray,\n type PgArray,\n type TypedValue,\n type TypeId,\n tv,\n UNKNOWN,\n wrapJsonb,\n} from \"../types/value.ts\";\nimport { argInt, argText } from \"./util.ts\";\n\nexport interface SrfResult {\n columns: Array<{ name: string; type: TypeId }>;\n rows: Datum[][];\n}\n\nexport type SrfFn = (ctx: EngineCtx, args: TypedValue[], alias: string) => SrfResult;\n\nfunction jsonInput(ctx: EngineCtx, a: TypedValue): JsonbValue {\n void ctx;\n if (a.t === \"jsonb\" || isJsonbWrap(a.v)) return (a.v as JsonbWrap).value;\n return parseJsonText(a.v as string);\n}\n\nconst SRFS = new Map<string, SrfFn>();\n\nSRFS.set(\"generate_series\", (ctx, args, alias) => {\n if (args.length < 2 || args.length > 3) {\n throw pgError(\n \"undefined_function\",\n `function generate_series(${args.map((a) => a.t).join(\", \")}) does not exist`,\n \"42883\",\n );\n }\n const a = args[0]!;\n const b = args[1]!;\n if (a.v === null || b.v === null || (args[2] !== undefined && args[2].v === null)) {\n return { columns: [{ name: alias, type: a.t === UNKNOWN ? \"int4\" : a.t }], rows: [] };\n }\n // timestamp series\n if (a.t === \"timestamp\" || a.t === \"timestamptz\" || b.t === \"timestamp\" || b.t === \"timestamptz\" || a.t === \"date\") {\n const t: TypeId = a.t === \"timestamptz\" || b.t === \"timestamptz\" ? \"timestamptz\" : \"timestamp\";\n const start = castTo(ctx, a, t, { explicit: true }).v as bigint;\n const stop = castTo(ctx, b, t, { explicit: true }).v as bigint;\n const stepArg = args[2];\n if (stepArg === undefined || !isInterval(stepArg.v)) {\n throw pgError(\n \"undefined_function\",\n \"function generate_series(timestamp, timestamp) requires an interval step\",\n \"42883\",\n );\n }\n const step = stepArg.v;\n const rows: Datum[][] = [];\n if (step.months !== 0) {\n // month-wise stepping\n let i = 0;\n for (;;) {\n const { days, tod } = splitTs(start);\n const c = daysToCivil(days);\n const totalMonths = c.y * 12 + (c.m - 1) + step.months * i;\n const y = Math.floor(totalMonths / 12);\n const mo = (totalMonths % 12) + 1;\n const d = Math.min(c.d, daysInMonth(y, mo));\n const cur = BigInt(civilToDays(y, mo, d) + step.days * i) * USECS_PER_DAY + tod + step.micros * BigInt(i);\n if (step.months > 0 || step.days > 0 || step.micros > 0n ? cur > stop : cur < stop) break;\n rows.push([cur]);\n i++;\n if (i > 10_000_000) throw pgError(\"program_limit_exceeded\", \"generate_series result set too large\", \"54000\");\n }\n return { columns: [{ name: alias, type: t }], rows };\n }\n const stepMicros = intervalTotalMicros(step);\n if (stepMicros === 0n) throw pgError(\"invalid_parameter_value\", \"step size cannot equal zero\", \"22023\");\n if (stepMicros > 0n) {\n for (let cur = start; cur <= stop; cur += stepMicros) rows.push([cur]);\n } else {\n for (let cur = start; cur >= stop; cur += stepMicros) rows.push([cur]);\n }\n return { columns: [{ name: alias, type: t }], rows };\n }\n // numeric series\n if (a.t === \"numeric\" || b.t === \"numeric\" || args[2]?.t === \"numeric\") {\n const start = castTo(ctx, a, \"numeric\", { explicit: true }).v as Numeric;\n const stop = castTo(ctx, b, \"numeric\", { explicit: true }).v as Numeric;\n const step = args[2]\n ? (castTo(ctx, args[2], \"numeric\", { explicit: true }).v as Numeric)\n : (castTo(ctx, tv(\"int4\", 1), \"numeric\", { explicit: true }).v as Numeric);\n if (numericSign(step) === 0) throw pgError(\"invalid_parameter_value\", \"step size cannot equal zero\", \"22023\");\n const rows: Datum[][] = [];\n let cur = start;\n const ascending = numericSign(step) > 0;\n while (ascending ? numericCmp(cur, stop) <= 0 : numericCmp(cur, stop) >= 0) {\n rows.push([cur]);\n cur = numericAdd(cur, step);\n if (rows.length > 10_000_000)\n throw pgError(\"program_limit_exceeded\", \"generate_series result set too large\", \"54000\");\n }\n return { columns: [{ name: alias, type: \"numeric\" }], rows };\n }\n const useBig = a.t === \"int8\" || b.t === \"int8\" || args[2]?.t === \"int8\";\n const t: TypeId = useBig ? \"int8\" : \"int4\";\n const start = castTo(ctx, a, \"int8\", {}).v as bigint;\n const stop = castTo(ctx, b, \"int8\", {}).v as bigint;\n const step = args[2] ? (castTo(ctx, args[2], \"int8\", {}).v as bigint) : 1n;\n if (step === 0n) throw pgError(\"invalid_parameter_value\", \"step size cannot equal zero\", \"22023\");\n const rows: Datum[][] = [];\n if (step > 0n) {\n for (let cur = start; cur <= stop; cur += step) {\n rows.push([useBig ? cur : Number(cur)]);\n if (rows.length > 10_000_000)\n throw pgError(\"program_limit_exceeded\", \"generate_series result set too large\", \"54000\");\n }\n } else {\n for (let cur = start; cur >= stop; cur += step) {\n rows.push([useBig ? cur : Number(cur)]);\n if (rows.length > 10_000_000)\n throw pgError(\"program_limit_exceeded\", \"generate_series result set too large\", \"54000\");\n }\n }\n return { columns: [{ name: alias, type: t }], rows };\n});\n\nSRFS.set(\"generate_subscripts\", (ctx, args, alias) => {\n const a = args[0]!;\n if (a.v === null || args[1]!.v === null) return { columns: [{ name: alias, type: \"int4\" }], rows: [] };\n if (!isArrayType(a.t)) throw pgError(\"datatype_mismatch\", \"generate_subscripts requires an array\", \"42804\");\n const arr = a.v as PgArray;\n const dim = argInt(ctx, args[1]!);\n const reverse = args.length > 2 && args[2]!.v === true;\n const dims = arr.dims.length > 0 ? arr.dims : arr.items.length === 0 ? [] : [arr.items.length];\n const lbs = arr.lbs.length === dims.length ? arr.lbs : dims.map(() => 1);\n if (dim < 1 || dim > dims.length) return { columns: [{ name: alias, type: \"int4\" }], rows: [] };\n const lo = lbs[dim - 1]!;\n const hi = lo + dims[dim - 1]! - 1;\n const rows: Datum[][] = [];\n if (reverse) {\n for (let i = hi; i >= lo; i--) rows.push([i]);\n } else {\n for (let i = lo; i <= hi; i++) rows.push([i]);\n }\n return { columns: [{ name: alias, type: \"int4\" }], rows };\n});\n\nSRFS.set(\"unnest\", (_ctx, args, alias) => {\n if (args.length === 1) {\n const a = args[0]!;\n if (a.v === null)\n return { columns: [{ name: alias, type: a.t === UNKNOWN ? \"text\" : arrayElemType(a.t) }], rows: [] };\n if (!isArrayType(a.t)) throw pgError(\"datatype_mismatch\", \"unnest requires an array\", \"42804\");\n const arr = a.v as PgArray;\n return {\n columns: [{ name: alias, type: arrayElemType(a.t) }],\n rows: arr.items.map((item) => [item]),\n };\n }\n // multi-array unnest: zip with nulls\n const arrays = args.map((a) => {\n if (a.v === null) return { elem: a.t === UNKNOWN ? \"text\" : arrayElemType(a.t), items: [] as Datum[] };\n if (!isArrayType(a.t)) throw pgError(\"datatype_mismatch\", \"unnest requires an array\", \"42804\");\n return { elem: arrayElemType(a.t), items: (a.v as PgArray).items };\n });\n const maxLen = Math.max(...arrays.map((a) => a.items.length));\n const rows: Datum[][] = [];\n for (let i = 0; i < maxLen; i++) {\n rows.push(arrays.map((a) => a.items[i] ?? null));\n }\n return {\n columns: arrays.map((a, i) => ({\n name: arrays.length === 1 ? alias : `unnest${i > 0 ? `_${i + 1}` : \"\"}`,\n type: a.elem,\n })),\n rows,\n };\n});\n\nSRFS.set(\"string_to_table\", (ctx, args, alias) => {\n const a = args[0]!;\n if (a.v === null) return { columns: [{ name: alias, type: \"text\" }], rows: [] };\n const s = argText(ctx, a);\n const delim = args[1]!.v === null ? null : argText(ctx, args[1]!);\n const nullStr = args.length > 2 && args[2]!.v !== null ? argText(ctx, args[2]!) : null;\n let parts: string[];\n if (delim === null) parts = [...s];\n else if (delim === \"\") parts = [s];\n else parts = s.split(delim);\n const rows = parts.map((p) => [nullStr !== null && p === nullStr ? null : p] as Datum[]);\n return { columns: [{ name: alias, type: \"text\" }], rows };\n});\n\nSRFS.set(\"regexp_split_to_table\", (ctx, args, alias) => {\n const s = args[0]!.v === null ? null : argText(ctx, args[0]!);\n if (s === null || args[1]!.v === null) return { columns: [{ name: alias, type: \"text\" }], rows: [] };\n const pattern = argText(ctx, args[1]!);\n const flags = args.length > 2 ? argText(ctx, args[2]!) : \"\";\n const re = new RegExp(pgRegexToJs(pattern), `${regexFlags(flags, true)}g`);\n const out: string[] = [];\n let last = 0;\n for (const match of s.matchAll(re)) {\n if (match[0] === \"\" && match.index === last && match.index !== s.length) continue;\n out.push(s.slice(last, match.index));\n last = match.index + match[0].length;\n }\n out.push(s.slice(last));\n return { columns: [{ name: alias, type: \"text\" }], rows: out.map((p) => [p]) };\n});\n\nSRFS.set(\"regexp_matches\", (ctx, args, alias) => {\n const s = args[0]!.v === null ? null : argText(ctx, args[0]!);\n if (s === null || args[1]!.v === null) return { columns: [{ name: alias, type: \"text[]\" }], rows: [] };\n const pattern = argText(ctx, args[1]!);\n const flags = args.length > 2 ? argText(ctx, args[2]!) : \"\";\n const global = flags.includes(\"g\");\n const re = new RegExp(pgRegexToJs(pattern), `${regexFlags(flags, true)}g`);\n const rows: Datum[][] = [];\n for (const match of s.matchAll(re)) {\n const groups = match.length > 1 ? match.slice(1) : [match[0]];\n rows.push([\n makeArray(\n \"text\",\n groups.map((g) => (g === undefined ? null : g)),\n ),\n ]);\n if (!global) break;\n }\n return { columns: [{ name: alias, type: \"text[]\" }], rows };\n});\n\nfunction jsonElementsSrf(asText: boolean, jsonOut: boolean): SrfFn {\n // declared with OUT value \u2014 the FROM-clause column is always \"value\"\n return (ctx, args, _alias) => {\n const t: TypeId = asText ? \"text\" : jsonOut ? \"json\" : \"jsonb\";\n if (args[0]!.v === null) return { columns: [{ name: \"value\", type: t }], rows: [] };\n const v = jsonInput(ctx, args[0]!);\n if (v.j !== \"arr\") {\n throw pgError(\n \"invalid_parameter_value\",\n `cannot extract elements from a ${v.j === \"obj\" ? \"object\" : \"scalar\"}`,\n \"22023\",\n );\n }\n const rows: Datum[][] = v.v.map((item) => {\n if (asText) return [item.j === \"null\" ? null : item.j === \"str\" ? item.v : jsonbCompactText(item)];\n if (jsonOut) return [jsonbCompactText(item)];\n return [wrapJsonb(item)];\n });\n return { columns: [{ name: \"value\", type: t }], rows };\n };\n}\nSRFS.set(\"json_array_elements\", jsonElementsSrf(false, true));\nSRFS.set(\"jsonb_array_elements\", jsonElementsSrf(false, false));\nSRFS.set(\"json_array_elements_text\", jsonElementsSrf(true, true));\nSRFS.set(\"jsonb_array_elements_text\", jsonElementsSrf(true, false));\n\nfunction jsonEachSrf(asText: boolean, jsonOut: boolean): SrfFn {\n return (ctx, args, _alias) => {\n const valT: TypeId = asText ? \"text\" : jsonOut ? \"json\" : \"jsonb\";\n const columns = [\n { name: \"key\", type: \"text\" as TypeId },\n { name: \"value\", type: valT },\n ];\n if (args[0]!.v === null) return { columns, rows: [] };\n const v = jsonInput(ctx, args[0]!);\n if (v.j !== \"obj\") {\n throw pgError(\"invalid_parameter_value\", \"cannot deconstruct a scalar\", \"22023\");\n }\n const rows: Datum[][] = [];\n for (const [k, val] of v.v) {\n if (asText) rows.push([k, val.j === \"null\" ? null : val.j === \"str\" ? val.v : jsonbCompactText(val)]);\n else if (jsonOut) rows.push([k, jsonbCompactText(val)]);\n else rows.push([k, wrapJsonb(val)]);\n }\n return { columns, rows };\n };\n}\nSRFS.set(\"json_each\", jsonEachSrf(false, true));\nSRFS.set(\"jsonb_each\", jsonEachSrf(false, false));\nSRFS.set(\"json_each_text\", jsonEachSrf(true, true));\nSRFS.set(\"jsonb_each_text\", jsonEachSrf(true, false));\n\nfunction jsonKeysSrf(): SrfFn {\n return (ctx, args, alias) => {\n if (args[0]!.v === null) return { columns: [{ name: alias, type: \"text\" }], rows: [] };\n const v = jsonInput(ctx, args[0]!);\n if (v.j !== \"obj\") {\n throw pgError(\n \"invalid_parameter_value\",\n `cannot call ${alias} on a ${v.j === \"arr\" ? \"array\" : \"scalar\"}`,\n \"22023\",\n );\n }\n return { columns: [{ name: alias, type: \"text\" }], rows: [...v.v.keys()].map((k) => [k]) };\n };\n}\nSRFS.set(\"json_object_keys\", jsonKeysSrf());\nSRFS.set(\"jsonb_object_keys\", jsonKeysSrf());\n\nexport function getSrfFunctions(): Map<string, SrfFn> {\n return SRFS;\n}\n\nexport function isSrfName(name: string): boolean {\n return SRFS.has(name);\n}\n", "/**\n * Window function surface. The executor's window module implements the\n * evaluation; this registry only classifies names so the parser/executor can\n * route OVER() calls, and the inventory gate can enumerate them.\n */\n\nexport const WINDOW_FUNCTION_NAMES = new Set([\n \"row_number\",\n \"rank\",\n \"dense_rank\",\n \"percent_rank\",\n \"cume_dist\",\n \"ntile\",\n \"lag\",\n \"lead\",\n \"first_value\",\n \"last_value\",\n \"nth_value\",\n]);\n\nexport function isWindowFunctionName(name: string): boolean {\n return WINDOW_FUNCTION_NAMES.has(name);\n}\n", "import type { Expr, FrameBound, FrameSpec, FuncCall, OrderByItem, WindowSpec } from \"../ast/nodes.ts\";\nimport { pgError } from \"../errors/error.ts\";\nimport type { EngineCtx } from \"../expressions/context.ts\";\nimport { evalBinary } from \"../expressions/operators.ts\";\nimport { createAggregate, isAggregateName } from \"../functions/aggregates.ts\";\nimport { isWindowFunctionName } from \"../functions/window.ts\";\nimport { castTo } from \"../types/cast.ts\";\nimport { datumCompare, datumKey } from \"../types/compare.ts\";\nimport { type Datum, type TypedValue, type TypeId, tv, UNKNOWN } from \"../types/value.ts\";\n\n/** Evaluator callback: evaluate `e` in the context of source row `rowIdx`. */\nexport type RowEval = (rowIdx: number, e: Expr) => TypedValue;\n\ninterface SortKey {\n values: Datum[];\n types: TypeId[];\n dirs: Array<\"asc\" | \"desc\">;\n nullsFirst: boolean[];\n}\n\nfunction compareKeys(ctx: EngineCtx, a: SortKey, b: SortKey): number {\n for (let i = 0; i < a.values.length; i++) {\n const av = a.values[i]!;\n const bv = b.values[i]!;\n const desc = a.dirs[i] === \"desc\";\n const nullsFirst = a.nullsFirst[i]!;\n if (av === null || bv === null) {\n if (av === null && bv === null) continue;\n const nullCmp = av === null ? -1 : 1;\n const cmp = nullsFirst ? nullCmp : -nullCmp;\n if (cmp !== 0) return cmp;\n continue;\n }\n let c = datumCompare(a.types[i]!, av, bv, ctx);\n if (desc) c = -c;\n if (c !== 0) return c;\n }\n return 0;\n}\n\n/**\n * Compute all window function results for one SELECT.\n * Returns per-call arrays indexed by source row.\n */\nexport function computeWindowValues(\n ctx: EngineCtx,\n calls: FuncCall[],\n rowCount: number,\n evalAt: RowEval,\n namedWindows: ReadonlyArray<{ name: string; spec: WindowSpec }>,\n): Map<FuncCall, TypedValue[]> {\n const out = new Map<FuncCall, TypedValue[]>();\n for (const call of calls) {\n const spec = resolveWindowSpec(call.over!, namedWindows);\n out.set(call, computeOneWindow(ctx, call, spec, rowCount, evalAt));\n }\n return out;\n}\n\nfunction resolveWindowSpec(spec: WindowSpec, named: ReadonlyArray<{ name: string; spec: WindowSpec }>): WindowSpec {\n if (!spec.name) return spec;\n const base = named.find((w) => w.name === spec.name);\n if (!base) throw pgError(\"undefined_object\", `window \"${spec.name}\" does not exist`, \"42704\");\n return {\n partitionBy: base.spec.partitionBy.length > 0 ? base.spec.partitionBy : spec.partitionBy,\n orderBy: base.spec.orderBy.length > 0 ? base.spec.orderBy : spec.orderBy,\n frame: spec.frame ?? base.spec.frame,\n };\n}\n\nfunction computeOneWindow(\n ctx: EngineCtx,\n call: FuncCall,\n spec: WindowSpec,\n rowCount: number,\n evalAt: RowEval,\n): TypedValue[] {\n // 1. partition rows\n const partitions = new Map<string, number[]>();\n const partitionOf: string[] = [];\n for (let i = 0; i < rowCount; i++) {\n const keyParts: string[] = [];\n for (const p of spec.partitionBy) {\n const v = evalAt(i, p);\n keyParts.push(v.v === null ? \"\\u0000N\" : datumKey(v.t === UNKNOWN ? \"text\" : v.t, v.v));\n }\n const key = keyParts.join(\"\\u0001\");\n partitionOf.push(key);\n const list = partitions.get(key) ?? [];\n list.push(i);\n partitions.set(key, list);\n }\n\n const results: TypedValue[] = new Array(rowCount);\n for (const rowIdxs of partitions.values()) {\n computePartition(ctx, call, spec, rowIdxs, evalAt, results);\n }\n return results;\n}\n\nfunction computePartition(\n ctx: EngineCtx,\n call: FuncCall,\n spec: WindowSpec,\n rowIdxs: number[],\n evalAt: RowEval,\n results: TypedValue[],\n): void {\n // 2. sort partition by ORDER BY\n const keys = new Map<number, SortKey>();\n if (spec.orderBy.length > 0) {\n for (const i of rowIdxs) {\n keys.set(i, sortKeyFor(ctx, spec.orderBy, i, evalAt));\n }\n rowIdxs = [...rowIdxs].sort((a, b) => compareKeys(ctx, keys.get(a)!, keys.get(b)!));\n }\n const n = rowIdxs.length;\n\n // peer groups (rows equal under ORDER BY)\n const peerGroup: number[] = new Array(n);\n let group = 0;\n for (let pos = 0; pos < n; pos++) {\n if (pos > 0) {\n const same =\n spec.orderBy.length === 0 || compareKeys(ctx, keys.get(rowIdxs[pos - 1]!)!, keys.get(rowIdxs[pos]!)!) === 0;\n if (!same) group++;\n }\n peerGroup[pos] = group;\n }\n const groupCount = n === 0 ? 0 : peerGroup[n - 1]! + 1;\n\n const name = call.name[call.name.length - 1]!;\n\n if (isWindowFunctionName(name)) {\n computeRankingFunction(ctx, name, call, rowIdxs, peerGroup, groupCount, evalAt, results, spec);\n return;\n }\n\n if (!isAggregateName(name)) {\n throw pgError(\"undefined_function\", `function ${name} does not exist as a window function`, \"42883\");\n }\n\n // 3. window aggregate over frames\n const frame = spec.frame ?? defaultFrame(spec);\n for (let pos = 0; pos < n; pos++) {\n const [lo, hi] = frameBounds(ctx, frame, pos, rowIdxs, peerGroup, keys, spec, evalAt);\n const included: number[] = [];\n for (let p = Math.max(lo, 0); p <= Math.min(hi, n - 1); p++) {\n if (excluded(frame, p, pos, peerGroup)) continue;\n included.push(p);\n }\n // evaluate agg over included rows\n const argRows: TypedValue[][] = [];\n for (const p of included) {\n if (call.filter) {\n const f = evalAt(rowIdxs[p]!, call.filter);\n if (f.v !== true) continue;\n }\n argRows.push(call.star ? [] : call.args.map((a) => evalAt(rowIdxs[p]!, a)));\n }\n const argTypes: TypeId[] = call.args.map((_, ai) => {\n for (const r of argRows) {\n const t = r[ai]!.t;\n if (t !== UNKNOWN) return t;\n }\n return UNKNOWN;\n });\n const acc = createAggregate(ctx, name, argTypes);\n for (const r of argRows) acc.step(r);\n results[rowIdxs[pos]!] = acc.result();\n }\n}\n\nfunction sortKeyFor(_ctx: EngineCtx, orderBy: OrderByItem[], rowIdx: number, evalAt: RowEval): SortKey {\n const values: Datum[] = [];\n const types: TypeId[] = [];\n const dirs: Array<\"asc\" | \"desc\"> = [];\n const nullsFirst: boolean[] = [];\n for (const ob of orderBy) {\n const v = evalAt(rowIdx, ob.expr);\n values.push(v.v);\n types.push(v.t === UNKNOWN ? \"text\" : v.t);\n const dir = ob.dir ?? \"asc\";\n dirs.push(dir);\n nullsFirst.push(ob.nulls ? ob.nulls === \"first\" : dir === \"desc\");\n }\n return { values, types, dirs, nullsFirst };\n}\n\nfunction defaultFrame(spec: WindowSpec): FrameSpec {\n return {\n mode: \"range\",\n start: { kind: \"unbounded_preceding\" },\n end: spec.orderBy.length > 0 ? { kind: \"current_row\" } : { kind: \"unbounded_following\" },\n exclusion: null,\n };\n}\n\nfunction excluded(frame: FrameSpec, pos: number, current: number, peerGroup: number[]): boolean {\n switch (frame.exclusion) {\n case \"current_row\":\n return pos === current;\n case \"group\":\n return peerGroup[pos] === peerGroup[current];\n case \"ties\":\n return peerGroup[pos] === peerGroup[current] && pos !== current;\n default:\n return false;\n }\n}\n\n/** [lo, hi] positions (inclusive) of the frame for row at `pos`. */\nfunction frameBounds(\n ctx: EngineCtx,\n frame: FrameSpec,\n pos: number,\n rowIdxs: number[],\n peerGroup: number[],\n keys: Map<number, SortKey>,\n spec: WindowSpec,\n evalAt: RowEval,\n): [number, number] {\n const n = rowIdxs.length;\n const end: FrameBound = frame.end ?? { kind: \"current_row\" };\n const lo = boundPos(ctx, frame.mode, frame.start, true, pos, rowIdxs, peerGroup, keys, spec, evalAt, n);\n const hi = boundPos(ctx, frame.mode, end, false, pos, rowIdxs, peerGroup, keys, spec, evalAt, n);\n return [lo, hi];\n}\n\nfunction boundPos(\n ctx: EngineCtx,\n mode: FrameSpec[\"mode\"],\n bound: FrameBound,\n isStart: boolean,\n pos: number,\n rowIdxs: number[],\n peerGroup: number[],\n _keys: Map<number, SortKey>,\n spec: WindowSpec,\n evalAt: RowEval,\n n: number,\n): number {\n switch (bound.kind) {\n case \"unbounded_preceding\":\n return 0;\n case \"unbounded_following\":\n return n - 1;\n case \"current_row\": {\n if (mode === \"rows\") return pos;\n // range/groups: start = first peer, end = last peer\n const g = peerGroup[pos]!;\n if (isStart) {\n let p = pos;\n while (p > 0 && peerGroup[p - 1] === g) p--;\n return p;\n }\n let p = pos;\n while (p < n - 1 && peerGroup[p + 1] === g) p++;\n return p;\n }\n case \"preceding\":\n case \"following\": {\n const offsetTv = evalAt(rowIdxs[pos]!, bound.offset!);\n if (offsetTv.v === null) {\n throw pgError(\"invalid_parameter_value\", \"frame starting offset must not be null\", \"22013\");\n }\n if (mode === \"rows\") {\n const k = Number(castTo(ctx, offsetTv, \"int8\", {}).v as bigint);\n if (k < 0) {\n throw pgError(\"invalid_parameter_value\", \"frame starting offset must not be negative\", \"22013\");\n }\n return bound.kind === \"preceding\" ? pos - k : pos + k;\n }\n if (mode === \"groups\") {\n const k = Number(castTo(ctx, offsetTv, \"int8\", {}).v as bigint);\n if (k < 0) {\n throw pgError(\"invalid_parameter_value\", \"frame starting offset must not be negative\", \"22013\");\n }\n const targetGroup = bound.kind === \"preceding\" ? peerGroup[pos]! - k : peerGroup[pos]! + k;\n if (isStart) {\n for (let p = 0; p < n; p++) {\n if (peerGroup[p]! >= targetGroup) return p;\n }\n return n;\n }\n for (let p = n - 1; p >= 0; p--) {\n if (peerGroup[p]! <= targetGroup) return p;\n }\n return -1;\n }\n // RANGE with offset: single ORDER BY key required\n if (spec.orderBy.length !== 1) {\n throw pgError(\n \"windowing_error\",\n \"RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column\",\n \"42P20\",\n );\n }\n const ob = spec.orderBy[0]!;\n const desc = (ob.dir ?? \"asc\") === \"desc\";\n const cur = evalAt(rowIdxs[pos]!, ob.expr);\n if (cur.v === null) {\n // null ordering group: frame covers the null peers\n const g = peerGroup[pos]!;\n if (isStart) {\n let p = pos;\n while (p > 0 && peerGroup[p - 1] === g) p--;\n return p;\n }\n let p = pos;\n while (p < n - 1 && peerGroup[p + 1] === g) p++;\n return p;\n }\n const back = bound.kind === \"preceding\" ? !desc : desc;\n const boundary = evalBinary(ctx, back ? \"-\" : \"+\", cur, offsetTv);\n // find range of rows whose key satisfies the comparison with boundary\n if (isStart) {\n for (let p = 0; p < n; p++) {\n const v = evalAt(rowIdxs[p]!, ob.expr);\n if (v.v === null) continue;\n const cmp = evalBinary(ctx, desc ? \"<=\" : \">=\", v, boundary);\n if (cmp.v === true) return p;\n }\n return n;\n }\n for (let p = n - 1; p >= 0; p--) {\n const v = evalAt(rowIdxs[p]!, ob.expr);\n if (v.v === null) continue;\n const cmp = evalBinary(ctx, desc ? \">=\" : \"<=\", v, boundary);\n if (cmp.v === true) return p;\n }\n return -1;\n }\n }\n}\n\nfunction computeRankingFunction(\n ctx: EngineCtx,\n name: string,\n call: FuncCall,\n rowIdxs: number[],\n peerGroup: number[],\n _groupCount: number,\n evalAt: RowEval,\n results: TypedValue[],\n spec: WindowSpec,\n): void {\n const n = rowIdxs.length;\n switch (name) {\n case \"row_number\": {\n for (let pos = 0; pos < n; pos++) results[rowIdxs[pos]!] = tv(\"int8\", BigInt(pos + 1));\n return;\n }\n case \"rank\": {\n const firstOfGroup: number[] = [];\n for (let pos = 0; pos < n; pos++) {\n if (pos === 0 || peerGroup[pos] !== peerGroup[pos - 1]) firstOfGroup[peerGroup[pos]!] = pos;\n }\n for (let pos = 0; pos < n; pos++) {\n results[rowIdxs[pos]!] = tv(\"int8\", BigInt(firstOfGroup[peerGroup[pos]!]! + 1));\n }\n return;\n }\n case \"dense_rank\": {\n for (let pos = 0; pos < n; pos++) {\n results[rowIdxs[pos]!] = tv(\"int8\", BigInt(peerGroup[pos]! + 1));\n }\n return;\n }\n case \"percent_rank\": {\n const firstOfGroup: number[] = [];\n for (let pos = 0; pos < n; pos++) {\n if (pos === 0 || peerGroup[pos] !== peerGroup[pos - 1]) firstOfGroup[peerGroup[pos]!] = pos;\n }\n for (let pos = 0; pos < n; pos++) {\n const rank = firstOfGroup[peerGroup[pos]!]! + 1;\n results[rowIdxs[pos]!] = tv(\"float8\", n <= 1 ? 0 : (rank - 1) / (n - 1));\n }\n return;\n }\n case \"cume_dist\": {\n const lastOfGroup: number[] = [];\n for (let pos = n - 1; pos >= 0; pos--) {\n if (pos === n - 1 || peerGroup[pos] !== peerGroup[pos + 1]) lastOfGroup[peerGroup[pos]!] = pos;\n }\n for (let pos = 0; pos < n; pos++) {\n results[rowIdxs[pos]!] = tv(\"float8\", (lastOfGroup[peerGroup[pos]!]! + 1) / n);\n }\n return;\n }\n case \"ntile\": {\n const arg = call.args[0];\n if (!arg) throw pgError(\"undefined_function\", \"ntile requires an argument\", \"42883\");\n const bucketsTv = evalAt(rowIdxs[0] ?? 0, arg);\n if (bucketsTv.v === null) {\n for (const i of rowIdxs) results[i] = tv(\"int4\", null);\n return;\n }\n const buckets = Number(castTo(ctx, bucketsTv, \"int4\", {}).v as number);\n if (buckets <= 0)\n throw pgError(\"invalid_parameter_value\", \"argument of ntile must be greater than zero\", \"22014\");\n const base = Math.floor(n / buckets);\n const extra = n % buckets;\n let pos = 0;\n for (let b = 1; b <= buckets && pos < n; b++) {\n const size = base + (b <= extra ? 1 : 0);\n for (let k = 0; k < size && pos < n; k++, pos++) {\n results[rowIdxs[pos]!] = tv(\"int4\", b);\n }\n }\n return;\n }\n case \"lag\":\n case \"lead\": {\n const dir = name === \"lag\" ? -1 : 1;\n for (let pos = 0; pos < n; pos++) {\n const cur = evalAt(rowIdxs[pos]!, call.args[0]!);\n const offset = call.args[1]\n ? Number(castTo(ctx, evalAt(rowIdxs[pos]!, call.args[1]), \"int4\", {}).v as number)\n : 1;\n const target = pos + dir * offset;\n if (target >= 0 && target < n) {\n results[rowIdxs[pos]!] = evalAt(rowIdxs[target]!, call.args[0]!);\n } else if (call.args[2]) {\n const dflt = evalAt(rowIdxs[pos]!, call.args[2]);\n results[rowIdxs[pos]!] = castTo(ctx, dflt, cur.t === UNKNOWN ? dflt.t : cur.t, {});\n } else {\n results[rowIdxs[pos]!] = tv(cur.t, null);\n }\n }\n return;\n }\n case \"first_value\":\n case \"last_value\":\n case \"nth_value\": {\n const frame = spec.frame ?? defaultFrame(spec);\n const keys = new Map<number, SortKey>();\n if (spec.orderBy.length > 0) {\n for (const i of rowIdxs) keys.set(i, sortKeyFor(ctx, spec.orderBy, i, evalAt));\n }\n for (let pos = 0; pos < n; pos++) {\n const [lo0, hi0] = frameBounds(ctx, frame, pos, rowIdxs, peerGroup, keys, spec, evalAt);\n const included: number[] = [];\n for (let p = Math.max(lo0, 0); p <= Math.min(hi0, n - 1); p++) {\n if (excluded(frame, p, pos, peerGroup)) continue;\n included.push(p);\n }\n const cur = evalAt(rowIdxs[pos]!, call.args[0]!);\n if (included.length === 0) {\n results[rowIdxs[pos]!] = tv(cur.t, null);\n continue;\n }\n let targetPos: number | null;\n if (name === \"first_value\") targetPos = included[0]!;\n else if (name === \"last_value\") targetPos = included[included.length - 1]!;\n else {\n const nth = Number(castTo(ctx, evalAt(rowIdxs[pos]!, call.args[1]!), \"int4\", {}).v as number);\n if (nth <= 0)\n throw pgError(\"invalid_parameter_value\", \"argument of nth_value must be greater than zero\", \"22016\");\n targetPos = included[nth - 1] ?? null;\n }\n results[rowIdxs[pos]!] = targetPos === null ? tv(cur.t, null) : evalAt(rowIdxs[targetPos]!, call.args[0]!);\n }\n return;\n }\n default:\n throw pgError(\"undefined_function\", `window function ${name} is not implemented`, \"42883\");\n }\n}\n", "import type {\n ColumnRef,\n CommonTableExpr,\n Expr,\n FromItem,\n FuncCall,\n GroupItem,\n OrderByItem,\n SelectBody,\n SelectCore,\n SelectStmt,\n SelectTarget,\n SetOp,\n Statement,\n ValuesBody,\n WithClause,\n} from \"../ast/nodes.ts\";\nimport { pgError } from \"../errors/error.ts\";\nimport type { EvalScope } from \"../expressions/eval.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { createAggregate, isAggregateName, isOrderedSetAggregate, unifyAggType } from \"../functions/aggregates.ts\";\nimport { getSrfFunctions, isSrfName } from \"../functions/srf.ts\";\nimport { catalogRelation } from \"../schema/catalog.ts\";\nimport type { FunctionData } from \"../storage/database-state.ts\";\nimport { castTo, unifyTypes } from \"../types/cast.ts\";\nimport { datumCompare, datumKey } from \"../types/compare.ts\";\nimport { type Datum, type TypedValue, type TypeId, tv, UNKNOWN } from \"../types/value.ts\";\nimport {\n childEnv,\n type ExecEnv,\n type ExecResult,\n inferColumnName,\n type Relation,\n RowScope,\n relationResult,\n} from \"./relation.ts\";\nimport { computeWindowValues } from \"./window.ts\";\n\n// ---------------------------------------------------------------------------\n// statement runner indirection (data-modifying CTEs, SQL function bodies)\n// execute.ts registers itself here to avoid import cycles.\n// ---------------------------------------------------------------------------\n\nexport type StatementRunner = (env: ExecEnv, stmt: Statement) => ExecResult;\nlet statementRunner: StatementRunner | null = null;\nexport function setStatementRunner(r: StatementRunner): void {\n statementRunner = r;\n}\nexport function runStatement(env: ExecEnv, stmt: Statement): ExecResult {\n if (!statementRunner) throw pgError(\"internal\", \"statement runner not initialized\");\n return statementRunner(env, stmt);\n}\n\n// ---------------------------------------------------------------------------\n// structural expression equality (GROUP BY matching)\n// ---------------------------------------------------------------------------\n\nexport function exprEq(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null || typeof a !== typeof b) return false;\n if (typeof a !== \"object\") return false;\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n return a.every((v, i) => exprEq(v, b[i]));\n }\n const ao = a as Record<string, unknown>;\n const bo = b as Record<string, unknown>;\n const keys = new Set([...Object.keys(ao), ...Object.keys(bo)]);\n for (const k of keys) {\n if (!exprEq(ao[k], bo[k])) return false;\n }\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// eval scope plumbing\n// ---------------------------------------------------------------------------\n\nexport interface ScopeExtras {\n aggMap?: Map<FuncCall, TypedValue> | null;\n windowAt?: (call: FuncCall) => TypedValue | undefined;\n exprOverride?: (e: Expr) => TypedValue | undefined;\n groupingValue?: (e: Expr) => TypedValue | undefined;\n /** grouped context: bare column refs that survive overrides are errors */\n strictGrouping?: boolean;\n}\n\nexport function makeEvalScope(env: ExecEnv, scope: RowScope | null, extras?: ScopeExtras): EvalScope {\n return {\n lookupColumn(parts) {\n const v = scope?.lookup(parts);\n if (v === undefined) return undefined;\n if (extras?.strictGrouping) {\n throw pgError(\n \"grouping_error\",\n `column \"${parts.join(\".\")}\" must appear in the GROUP BY clause or be used in an aggregate function`,\n \"42803\",\n );\n }\n return v;\n },\n exprOverride: extras?.exprOverride,\n param(index) {\n const p = env.params?.[index - 1];\n if (p === undefined) throw pgError(\"undefined_parameter\", `there is no parameter $${index}`, \"42P02\");\n return p;\n },\n execScalarSubquery(q) {\n const rel = executeSelectStmt(childEnv(env, scope), q);\n if (rel.columns.length !== 1) {\n throw pgError(\"cardinality_violation\", \"subquery must return only one column\", \"42601\");\n }\n if (rel.rows.length > 1) {\n throw pgError(\n \"cardinality_violation\",\n \"more than one row returned by a subquery used as an expression\",\n \"21000\",\n );\n }\n const t = rel.columns[0]!.type;\n return tv(t === UNKNOWN ? \"text\" : t, rel.rows[0]?.[0] ?? null);\n },\n execExistsSubquery(q) {\n const rel = executeSelectStmt(childEnv(env, scope), q);\n return rel.rows.length > 0;\n },\n execColumnSubquery(q) {\n const rel = executeSelectStmt(childEnv(env, scope), q);\n if (rel.columns.length !== 1) {\n throw pgError(\"cardinality_violation\", \"subquery has too many columns\", \"42601\");\n }\n const t = rel.columns[0]!.type;\n return { type: t === UNKNOWN ? \"text\" : t, values: rel.rows.map((r) => r[0] ?? null) };\n },\n aggValue(node) {\n return extras?.aggMap?.get(node);\n },\n windowValue(node) {\n if (!node.over) return undefined;\n return extras?.windowAt?.(node);\n },\n groupingValue(node) {\n return extras?.groupingValue?.(node);\n },\n callUserFunction(name, args, node) {\n void node;\n const fn = resolveUserFunction(env, name, args.length);\n if (!fn) return undefined;\n return callSqlFunctionScalar(env, fn, args);\n },\n callStatefulFunction: undefined,\n };\n}\n\nexport function evalScalar(env: ExecEnv, scope: RowScope | null, e: Expr, extras?: ScopeExtras): TypedValue {\n return evalExpr(env.ctx, makeEvalScope(env, scope, extras), e);\n}\n\n/** SQL three-valued predicate: null \u2192 false */\nexport function evalPredicate(env: ExecEnv, scope: RowScope | null, e: Expr, extras?: ScopeExtras): boolean {\n const v = evalScalar(env, scope, e, extras);\n if (v.v === null) return false;\n const b = castTo(env.ctx, v, \"bool\", {});\n return b.v === true;\n}\n\n// ---------------------------------------------------------------------------\n// user-defined LANGUAGE sql functions\n// ---------------------------------------------------------------------------\n\nexport function resolveUserFunction(env: ExecEnv, name: string[], argCount: number): FunctionData | null {\n const candidates = env.ctx.state.findFunctions(name);\n for (const fn of candidates) {\n const required = fn.argDefaults.filter((d) => d === null).length;\n if (argCount >= required && argCount <= fn.argTypes.length) return fn;\n }\n return null;\n}\n\nfunction functionEnv(env: ExecEnv, fn: FunctionData, args: TypedValue[]): ExecEnv {\n // cast args to declared types; fill defaults\n const bound: TypedValue[] = [];\n for (let i = 0; i < fn.argTypes.length; i++) {\n if (i < args.length) {\n bound.push(castTo(env.ctx, args[i]!, fn.argTypes[i]!, {}));\n } else {\n const dflt = fn.argDefaults[i];\n if (!dflt) throw pgError(\"undefined_function\", `function ${fn.name} argument ${i + 1} missing`, \"42883\");\n bound.push(castTo(env.ctx, evalScalar(env, null, dflt), fn.argTypes[i]!, {}));\n }\n }\n const fnEnv: ExecEnv = { ctx: env.ctx, params: bound, ctes: new Map(), outer: null };\n // named args resolve like columns of a phantom row\n const namedCols = fn.argNames.map((n, i) => ({ n, i })).filter((x): x is { n: string; i: number } => x.n !== null);\n if (namedCols.length > 0) {\n const cols = namedCols.map(({ n, i }) => ({ name: n, type: fn.argTypes[i] ?? \"text\", table: null }));\n const row = namedCols.map(({ i }) => bound[i]!.v);\n fnEnv.outer = new RowScope(cols, row, null);\n }\n return fnEnv;\n}\n\nfunction runFunctionBody(env: ExecEnv, fn: FunctionData, args: TypedValue[]): ExecResult | null {\n if (fn.strict && args.some((a) => a.v === null)) return null;\n if (!fn.body || fn.body.length === 0) {\n throw pgError(\"unsupported\", `function ${fn.name} has no executable body`);\n }\n const fnEnv = functionEnv(env, fn, args);\n let last: ExecResult | null = null;\n for (const stmt of fn.body) {\n last = runStatement(fnEnv, stmt);\n }\n return last;\n}\n\nexport function callSqlFunctionScalar(env: ExecEnv, fn: FunctionData, args: TypedValue[]): TypedValue {\n const retT = fn.returns ?? \"text\";\n const last = runFunctionBody(env, fn, args);\n if (last === null) return tv(retT, null);\n if (fn.returnsSet || fn.returnsTable) {\n throw pgError(\"feature_not_supported\", `set-returning function ${fn.name} called in scalar context`, \"0A000\");\n }\n const raw = last.rows[0]?.[0] ?? null;\n const rawT = last.columns[0]?.type ?? retT;\n if (raw === null) return tv(retT, null);\n return castTo(env.ctx, tv(rawT, raw), retT, {});\n}\n\nexport function callSqlFunctionSet(env: ExecEnv, fn: FunctionData, args: TypedValue[]): Relation {\n const last = runFunctionBody(env, fn, args);\n if (last === null) return { columns: [], rows: [] };\n if (fn.returnsTable) {\n const cols = fn.returnsTable.map((c) => ({ name: c.name, type: c.type, table: null }));\n const rows = last.rows.map((r) =>\n fn.returnsTable!.map((c, i) => {\n const raw = r[i] ?? null;\n if (raw === null) return null;\n const srcT = last.columns[i]?.type ?? c.type;\n return castTo(env.ctx, tv(srcT, raw), c.type, {}).v;\n }),\n );\n return { columns: cols, rows };\n }\n const retT = fn.returns ?? \"text\";\n const rows = last.rows.map((r) => {\n const raw = r[0] ?? null;\n if (raw === null) return [null];\n const srcT = last.columns[0]?.type ?? retT;\n return [castTo(env.ctx, tv(srcT, raw), retT, {}).v];\n });\n return { columns: [{ name: fn.name, type: retT, table: null }], rows };\n}\n\n// ---------------------------------------------------------------------------\n// WITH (CTEs)\n// ---------------------------------------------------------------------------\n\nfunction referencesRelation(node: unknown, name: string): boolean {\n if (!node || typeof node !== \"object\") return false;\n if (Array.isArray(node)) return node.some((n) => referencesRelation(n, name));\n const o = node as Record<string, unknown>;\n if (o.type === \"from_table\" && Array.isArray(o.name) && o.name.length === 1 && o.name[0] === name) return true;\n for (const k of Object.keys(o)) {\n if (referencesRelation(o[k], name)) return true;\n }\n return false;\n}\n\nfunction applyCteColumnNames(rel: Relation, cte: CommonTableExpr): Relation {\n const columns = rel.columns.map((c, i) => ({\n name: cte.columns?.[i] ?? c.name,\n type: c.type,\n table: null as string | null,\n }));\n if (cte.columns && cte.columns.length > rel.columns.length) {\n throw pgError(\n \"syntax\",\n `WITH query \"${cte.name}\" has ${rel.columns.length} columns available but ${cte.columns.length} columns specified`,\n \"42P10\",\n );\n }\n return { columns, rows: rel.rows };\n}\n\nexport function applyWith(env: ExecEnv, w: WithClause | null): ExecEnv {\n if (!w) return env;\n const ctes = new Map(env.ctes);\n for (const cte of w.ctes) {\n const scopedEnv: ExecEnv = { ctx: env.ctx, params: env.params, ctes, outer: env.outer };\n let rel: Relation;\n if (\n w.recursive &&\n cte.query.type === \"select\" &&\n cte.query.body.type === \"setop\" &&\n cte.query.body.op === \"union\" &&\n referencesRelation(cte.query.body.right, cte.name)\n ) {\n rel = executeRecursiveCte(scopedEnv, cte, cte.query);\n } else if (cte.query.type === \"select\") {\n rel = executeSelectStmt(scopedEnv, cte.query);\n } else {\n // data-modifying CTE\n const res = runStatement(scopedEnv, cte.query);\n rel = {\n columns: res.columns.map((c) => ({ name: c.name, type: c.type, table: null })),\n rows: res.rows,\n };\n }\n ctes.set(cte.name, applyCteColumnNames(rel, cte));\n }\n return { ctx: env.ctx, params: env.params, ctes, outer: env.outer };\n}\n\nconst MAX_RECURSION_ITERATIONS = 200_000;\nconst MAX_RECURSION_ROWS = 5_000_000;\n\nfunction executeRecursiveCte(env: ExecEnv, cte: CommonTableExpr, query: SelectStmt): Relation {\n const body = query.body as SetOp;\n const base = executeBody(env, body.left);\n const columns = base.columns.map((c, i) => ({\n name: cte.columns?.[i] ?? c.name,\n type: c.type === UNKNOWN ? (\"text\" as TypeId) : c.type,\n table: null as string | null,\n }));\n const seen = new Set<string>();\n const keyOf = (row: Datum[]) =>\n row.map((v, i) => (v === null ? \"\\u0000N\" : datumKey(columns[i]!.type, v))).join(\"\\u0001\");\n\n let result: Datum[][] = [];\n let working: Datum[][] = [];\n for (const row of base.rows) {\n if (!body.all) {\n const k = keyOf(row);\n if (seen.has(k)) continue;\n seen.add(k);\n }\n result.push(row);\n working.push(row);\n }\n\n let iterations = 0;\n while (working.length > 0) {\n if (++iterations > MAX_RECURSION_ITERATIONS) {\n throw pgError(\"program_limit_exceeded\", \"recursive query iteration limit exceeded\", \"54000\");\n }\n const iterCtes = new Map(env.ctes);\n iterCtes.set(cte.name, { columns, rows: working });\n const iterEnv: ExecEnv = { ctx: env.ctx, params: env.params, ctes: iterCtes, outer: env.outer };\n const step = executeBody(iterEnv, body.right);\n if (step.columns.length !== columns.length) {\n throw pgError(\"syntax\", \"each UNION query must have the same number of columns\", \"42601\");\n }\n const next: Datum[][] = [];\n for (const raw of step.rows) {\n const row = raw.map((v, i) => {\n if (v === null) return null;\n const srcT = step.columns[i]!.type;\n return castTo(env.ctx, tv(srcT === UNKNOWN ? \"text\" : srcT, v), columns[i]!.type, {}).v;\n });\n if (!body.all) {\n const k = keyOf(row);\n if (seen.has(k)) continue;\n seen.add(k);\n }\n next.push(row);\n }\n result = result.concat(next);\n if (result.length > MAX_RECURSION_ROWS) {\n throw pgError(\"program_limit_exceeded\", \"recursive query result too large\", \"54000\");\n }\n working = next;\n }\n\n let rel: Relation = { columns, rows: result };\n if (query.orderBy.length > 0 || query.limit || query.offset) {\n // outer ORDER BY / LIMIT of the recursive CTE query itself\n const sortSpecs = outputOrderSpecs(env, rel, query.orderBy);\n if (sortSpecs.length > 0) sortRows(env, rel, sortSpecs);\n rel = applyLimitOffset(env, rel, query.limit, query.offset);\n }\n return rel;\n}\n\n// ---------------------------------------------------------------------------\n// FROM clause\n// ---------------------------------------------------------------------------\n\ninterface Source {\n rel: Relation;\n rangeVars: Set<string>;\n}\n\nfunction renameWithAliases(rel: Relation, label: string | null, colAliases: string[] | null, what: string): Relation {\n if (colAliases && colAliases.length > rel.columns.length) {\n throw pgError(\n \"invalid_column_reference\",\n `table \"${what}\" has ${rel.columns.length} columns available but ${colAliases.length} columns specified`,\n \"42P10\",\n );\n }\n const columns = rel.columns.map((c, i) => ({\n name: colAliases?.[i] ?? c.name,\n type: c.type === UNKNOWN ? (\"text\" as TypeId) : c.type,\n table: label,\n }));\n return { columns, rows: rel.rows };\n}\n\nfunction materializeItem(env: ExecEnv, item: FromItem, scope: RowScope | null): Source {\n switch (item.type) {\n case \"from_table\": {\n const label = item.alias ?? item.name[item.name.length - 1]!;\n // CTE reference (single-part names only)\n if (item.name.length === 1) {\n const cteRel = env.ctes.get(item.name[0]!);\n if (cteRel) {\n return { rel: renameWithAliases(cteRel, label, item.colAliases, label), rangeVars: new Set([label]) };\n }\n }\n const state = env.ctx.state;\n const table = state.findTable(item.name);\n if (table) {\n const rel: Relation = {\n columns: table.columns.map((c) => ({ name: c.name, type: c.type.id, table: label })),\n rows: table.rows,\n };\n return { rel: renameWithAliases(rel, label, item.colAliases, label), rangeVars: new Set([label]) };\n }\n const view = state.findView(item.name);\n if (view) {\n let rel: Relation;\n if (view.materialized) {\n if (view.matRows === null || view.matColumns === null) {\n throw pgError(\n \"object_not_in_prerequisite_state\",\n `materialized view \"${view.name}\" has not been populated`,\n \"55000\",\n );\n }\n rel = {\n columns: view.matColumns.map((c) => ({ name: c.name, type: c.type, table: label })),\n rows: view.matRows,\n };\n } else {\n const viewEnv: ExecEnv = { ctx: env.ctx, params: null, ctes: new Map(), outer: null };\n rel = executeSelectStmt(viewEnv, view.query);\n rel = {\n columns: rel.columns.map((c, i) => ({\n name: view.columns?.[i] ?? c.name,\n type: c.type,\n table: label,\n })),\n rows: rel.rows,\n };\n }\n return { rel: renameWithAliases(rel, label, item.colAliases, label), rangeVars: new Set([label]) };\n }\n const resolved = state.resolveRelationSchema(item.name);\n if (resolved) {\n const cat = catalogRelation(env.ctx, resolved.schema, resolved.name);\n if (cat) {\n return { rel: renameWithAliases(cat, label, item.colAliases, label), rangeVars: new Set([label]) };\n }\n }\n throw pgError(\"undefined_table\", `relation \"${item.name.join(\".\")}\" does not exist`, \"42P01\");\n }\n case \"from_subquery\": {\n const subEnv = childEnv(env, item.lateral ? scope : env.outer);\n const rel = executeSelectStmt(subEnv, item.query);\n const label = item.alias ?? \"unnamed_subquery\";\n return { rel: renameWithAliases(rel, label, item.colAliases, label), rangeVars: new Set([label]) };\n }\n case \"from_func\":\n return materializeFunc(env, item, scope);\n case \"from_join\": {\n return joinSource(env, item, scope);\n }\n }\n}\n\nfunction srfCallRelation(env: ExecEnv, call: Expr, scope: RowScope | null, alias: string | null): Relation {\n if (call.type !== \"func\") {\n // e.g. FROM (expression) is not valid; parser shouldn't produce it\n throw pgError(\"syntax\", \"unexpected expression in FROM function position\");\n }\n const bare =\n call.name.length === 1\n ? call.name[0]!\n : call.name.length === 2 && call.name[0] === \"pg_catalog\"\n ? call.name[1]!\n : call.name[call.name.length - 1]!;\n const evalScope = makeEvalScope(env, scope);\n const args = call.args.map((a) => evalExpr(env.ctx, evalScope, a));\n const srf = getSrfFunctions().get(bare);\n if (srf) {\n const res = srf(env.ctx, args, alias ?? bare);\n return {\n columns: res.columns.map((c) => ({ name: c.name, type: c.type, table: null })),\n rows: res.rows,\n };\n }\n const userFn = resolveUserFunction(env, call.name, args.length);\n if (userFn) {\n if (userFn.returnsSet || userFn.returnsTable) {\n return callSqlFunctionSet(env, userFn, args);\n }\n const v = callSqlFunctionScalar(env, userFn, args);\n return { columns: [{ name: userFn.name, type: v.t === UNKNOWN ? \"text\" : v.t, table: null }], rows: [[v.v]] };\n }\n // scalar builtin in FROM: one row, one column\n const v = evalExpr(env.ctx, evalScope, call);\n return { columns: [{ name: bare, type: v.t === UNKNOWN ? \"text\" : v.t, table: null }], rows: [[v.v]] };\n}\n\nfunction materializeFunc(env: ExecEnv, item: Extract<FromItem, { type: \"from_func\" }>, scope: RowScope | null): Source {\n const effScope = scope ?? env.outer;\n let rel: Relation;\n if (item.rowsFrom) {\n const parts = item.rowsFrom.map((c) => srfCallRelation(env, c, effScope, null));\n const maxLen = Math.max(0, ...parts.map((p) => p.rows.length));\n const columns = parts.flatMap((p) => p.columns);\n const rows: Datum[][] = [];\n for (let i = 0; i < maxLen; i++) {\n const row: Datum[] = [];\n for (const p of parts) {\n for (let c = 0; c < p.columns.length; c++) {\n row.push(p.rows[i]?.[c] ?? null);\n }\n }\n rows.push(row);\n }\n rel = { columns, rows };\n } else {\n rel = srfCallRelation(env, item.call, effScope, item.alias);\n }\n if (item.withOrdinality) {\n rel = {\n columns: [...rel.columns, { name: \"ordinality\", type: \"int8\", table: null }],\n rows: rel.rows.map((r, i) => [...r, BigInt(i + 1)]),\n };\n }\n const label =\n item.alias ?? (item.call.type === \"func\" ? item.call.name[item.call.name.length - 1]! : \"unnamed_function\");\n return { rel: renameWithAliases(rel, label, item.colAliases, label), rangeVars: new Set([label]) };\n}\n\nfunction isLateralItem(item: FromItem): boolean {\n switch (item.type) {\n case \"from_subquery\":\n return item.lateral;\n case \"from_func\":\n return true; // functions in FROM may implicitly reference earlier items\n case \"from_join\":\n return isLateralItem(item.left) || isLateralItem(item.right);\n default:\n return false;\n }\n}\n\nfunction joinSource(env: ExecEnv, join: Extract<FromItem, { type: \"from_join\" }>, scope: RowScope | null): Source {\n const left = materializeItem(env, join.left, scope);\n\n let usingCols: string[] | null = join.using;\n const kind = join.kind;\n\n const rightIsLateral = isLateralItem(join.right);\n const buildRight = (leftScope: RowScope | null): Source => materializeItem(env, join.right, leftScope ?? scope);\n\n // natural join: common visible column names\n let right: Source | null = null;\n if (!rightIsLateral) right = buildRight(null);\n if (join.natural) {\n const r = right ?? buildRight(null);\n const leftNames = new Set(left.rel.columns.filter((c) => !c.hidden).map((c) => c.name));\n usingCols = r.rel.columns.filter((c) => !c.hidden && leftNames.has(c.name)).map((c) => c.name);\n right = r;\n }\n\n if (rightIsLateral && (kind === \"right\" || kind === \"full\")) {\n throw pgError(\"syntax\", `LATERAL is not allowed on the right side of a ${kind.toUpperCase()} JOIN`, \"42601\");\n }\n\n const rangeVars = new Set([...left.rangeVars, ...(right ? right.rangeVars : [])]);\n if (join.usingAlias) rangeVars.add(join.usingAlias);\n\n const combine = (rightSrc: Source): Relation =>\n combineJoin(env, kind, left.rel, rightSrc.rel, join.on, usingCols, join.usingAlias, rangeVars);\n\n if (!rightIsLateral) {\n const r = right ?? buildRight(null);\n for (const rv of r.rangeVars) rangeVars.add(rv);\n return { rel: combine(r), rangeVars };\n }\n\n // lateral: evaluate the right side per left row\n let outColumns: Relation[\"columns\"] | null = null;\n const rows: Datum[][] = [];\n let rvs: Set<string> | null = null;\n for (const lrow of left.rel.rows) {\n const lscope = new RowScope(left.rel.columns, lrow, env.outer, left.rangeVars);\n const r = buildRight(lscope);\n if (rvs === null) {\n rvs = r.rangeVars;\n for (const rv of r.rangeVars) rangeVars.add(rv);\n }\n const single: Relation = { columns: left.rel.columns, rows: [lrow] };\n const combined = combineJoin(env, kind, single, r.rel, join.on, usingCols, join.usingAlias, rangeVars);\n if (outColumns === null) outColumns = combined.columns;\n rows.push(...combined.rows);\n }\n if (outColumns === null) {\n // zero left rows: build the right shape once to know the columns\n const r = buildRight(\n new RowScope(\n left.rel.columns,\n left.rel.columns.map(() => null),\n env.outer,\n left.rangeVars,\n ),\n );\n for (const rv of r.rangeVars) rangeVars.add(rv);\n const combined = combineJoin(\n env,\n kind,\n { columns: left.rel.columns, rows: [] },\n r.rel,\n join.on,\n usingCols,\n join.usingAlias,\n rangeVars,\n );\n outColumns = combined.columns;\n }\n return { rel: { columns: outColumns, rows }, rangeVars };\n}\n\n/** Collect every colref in an expression subtree (descends into subqueries). */\nfunction collectColrefs(node: unknown, out: ColumnRef[]): void {\n if (Array.isArray(node)) {\n for (const item of node) collectColrefs(item, out);\n return;\n }\n if (node === null || typeof node !== \"object\") return;\n const rec = node as Record<string, unknown>;\n if (rec.type === \"colref\") {\n out.push(node as ColumnRef);\n return;\n }\n for (const value of Object.values(rec)) collectColrefs(value, out);\n}\n\ntype JoinSide = \"left\" | \"right\" | \"none\" | \"mixed\";\n\nfunction joinSideOf(expr: Expr, left: Relation, right: Relation): JoinSide {\n const refs: ColumnRef[] = [];\n collectColrefs(expr, refs);\n let side: JoinSide = \"none\";\n const fold = (s: \"left\" | \"right\" | \"mixed\"): void => {\n if (side === \"none\") side = s;\n else if (side !== s) side = \"mixed\";\n };\n for (const ref of refs) {\n const alias = ref.parts.length >= 2 ? ref.parts[ref.parts.length - 2]! : null;\n const name = ref.parts[ref.parts.length - 1]!;\n const inLeft = alias\n ? left.columns.some((c) => c.table === alias)\n : left.columns.some((c) => !c.hidden && c.name === name);\n const inRight = alias\n ? right.columns.some((c) => c.table === alias)\n : right.columns.some((c) => !c.hidden && c.name === name);\n if (inLeft && !inRight) fold(\"left\");\n else if (inRight && !inLeft) fold(\"right\");\n else fold(\"mixed\");\n }\n return side;\n}\n\n/**\n * PostgreSQL only executes FULL JOIN with merge/hash-joinable conditions:\n * a constant condition, or at least one top-level AND conjunct that is an\n * equality between a left-only and a right-only expression.\n */\nfunction checkFullJoinCondition(on: Expr, left: Relation, right: Relation): void {\n const conjuncts: Expr[] = [];\n const split = (e: Expr): void => {\n if (e.type === \"binop\" && e.op === \"and\") {\n split(e.left);\n split(e.right);\n return;\n }\n conjuncts.push(e);\n };\n split(on);\n let anyRefs = false;\n for (const c of conjuncts) {\n const refs: ColumnRef[] = [];\n collectColrefs(c, refs);\n if (refs.length > 0) anyRefs = true;\n if (c.type !== \"binop\" || c.op !== \"=\") continue;\n const ls = joinSideOf(c.left, left, right);\n const rs = joinSideOf(c.right, left, right);\n if ((ls === \"left\" && rs === \"right\") || (ls === \"right\" && rs === \"left\")) return;\n }\n if (!anyRefs) return;\n throw pgError(\n \"unsupported\",\n \"FULL JOIN is only supported with merge-joinable or hash-joinable join conditions\",\n \"0A000\",\n );\n}\n\nfunction combineJoin(\n env: ExecEnv,\n kind: \"inner\" | \"left\" | \"right\" | \"full\" | \"cross\",\n left: Relation,\n right: Relation,\n on: Expr | null,\n using: string[] | null,\n usingAlias: string | null,\n rangeVars: Set<string>,\n): Relation {\n const ctx = env.ctx;\n if (kind === \"full\" && on !== null) checkFullJoinCondition(on, left, right);\n let columns: Relation[\"columns\"];\n let usingLeftIdx: number[] = [];\n let usingRightIdx: number[] = [];\n\n if (using && using.length > 0) {\n usingLeftIdx = using.map((u) => {\n const i = left.columns.findIndex((c) => !c.hidden && c.name === u);\n if (i === -1) {\n throw pgError(\n \"undefined_column\",\n `column \"${u}\" specified in USING clause does not exist in left table`,\n \"42703\",\n );\n }\n return i;\n });\n usingRightIdx = using.map((u) => {\n const i = right.columns.findIndex((c) => !c.hidden && c.name === u);\n if (i === -1) {\n throw pgError(\n \"undefined_column\",\n `column \"${u}\" specified in USING clause does not exist in right table`,\n \"42703\",\n );\n }\n return i;\n });\n const merged = using.map((u, k) => {\n const lt = left.columns[usingLeftIdx[k]!]!.type;\n const rt = right.columns[usingRightIdx[k]!]!.type;\n const t = unifyTypes(lt, rt);\n if (t === null) {\n throw pgError(\"datatype_mismatch\", `JOIN/USING types ${lt} and ${rt} cannot be matched`, \"42804\");\n }\n return { name: u, type: t, table: usingAlias, hidden: false };\n });\n const usingSet = new Set(using);\n columns = [\n ...merged,\n ...left.columns.map((c) => ({ ...c, hidden: c.hidden || usingSet.has(c.name) })),\n ...right.columns.map((c) => ({ ...c, hidden: c.hidden || usingSet.has(c.name) })),\n ];\n } else {\n columns = [...left.columns, ...right.columns];\n }\n\n const mergedCount = using?.length ?? 0;\n const rows: Datum[][] = [];\n const rightMatched: boolean[] = new Array(right.rows.length).fill(false);\n\n const emit = (lrow: Datum[] | null, rrow: Datum[] | null) => {\n const row: Datum[] = [];\n for (let k = 0; k < mergedCount; k++) {\n const lv = lrow?.[usingLeftIdx[k]!] ?? null;\n const rv = rrow?.[usingRightIdx[k]!] ?? null;\n row.push(lrow !== null ? lv : rv);\n }\n for (let i = 0; i < left.columns.length; i++) row.push(lrow?.[i] ?? null);\n for (let i = 0; i < right.columns.length; i++) row.push(rrow?.[i] ?? null);\n rows.push(row);\n };\n\n const matchRows = (lrow: Datum[], rrow: Datum[]): boolean => {\n if (using && using.length > 0) {\n for (let k = 0; k < using.length; k++) {\n const lv = lrow[usingLeftIdx[k]!] ?? null;\n const rv = rrow[usingRightIdx[k]!] ?? null;\n if (lv === null || rv === null) return false;\n const t = columns[k]!.type;\n const lc = castTo(ctx, tv(left.columns[usingLeftIdx[k]!]!.type, lv), t, {}).v;\n const rc = castTo(ctx, tv(right.columns[usingRightIdx[k]!]!.type, rv), t, {}).v;\n if (lc === null || rc === null) return false;\n if (datumCompare(t, lc, rc, ctx) !== 0) return false;\n }\n return true;\n }\n if (on === null) return true; // cross join\n const row: Datum[] = [];\n for (let k = 0; k < mergedCount; k++) row.push(null);\n for (let i = 0; i < left.columns.length; i++) row.push(lrow[i] ?? null);\n for (let i = 0; i < right.columns.length; i++) row.push(rrow[i] ?? null);\n const jscope = new RowScope(columns, row, env.outer, rangeVars);\n return evalPredicate(env, jscope, on);\n };\n\n for (const lrow of left.rows) {\n let matched = false;\n for (let ri = 0; ri < right.rows.length; ri++) {\n const rrow = right.rows[ri]!;\n if (matchRows(lrow, rrow)) {\n matched = true;\n rightMatched[ri] = true;\n emit(lrow, rrow);\n }\n }\n if (!matched && (kind === \"left\" || kind === \"full\")) {\n emit(lrow, null);\n }\n }\n if (kind === \"right\" || kind === \"full\") {\n for (let ri = 0; ri < right.rows.length; ri++) {\n if (!rightMatched[ri]) emit(null, right.rows[ri]!);\n }\n }\n return { columns, rows };\n}\n\nexport function buildFrom(env: ExecEnv, items: FromItem[]): Source {\n if (items.length === 0) {\n return { rel: { columns: [], rows: [[]] }, rangeVars: new Set() };\n }\n let acc: Source | null = null;\n for (const item of items) {\n if (acc === null) {\n acc = materializeItem(env, item, env.outer);\n continue;\n }\n const accRel: Relation = acc.rel;\n const accVars: Set<string> = acc.rangeVars;\n if (isLateralItem(item)) {\n // per-row evaluation with the accumulated columns in scope\n let cols: Relation[\"columns\"] | null = null;\n const rows: Datum[][] = [];\n let vars: Set<string> = accVars;\n for (const lrow of accRel.rows) {\n const lscope = new RowScope(accRel.columns, lrow, env.outer, accVars);\n const src = materializeItem(env, item, lscope);\n vars = new Set([...accVars, ...src.rangeVars]);\n if (cols === null) cols = [...accRel.columns, ...src.rel.columns];\n for (const rrow of src.rel.rows) {\n rows.push([...lrow, ...rrow]);\n }\n }\n if (cols === null) {\n const probe = materializeItem(\n env,\n item,\n new RowScope(\n accRel.columns,\n accRel.columns.map(() => null),\n env.outer,\n accVars,\n ),\n );\n cols = [...accRel.columns, ...probe.rel.columns];\n vars = new Set([...accVars, ...probe.rangeVars]);\n }\n acc = { rel: { columns: cols, rows }, rangeVars: vars };\n } else {\n const src = materializeItem(env, item, env.outer);\n const cols = [...accRel.columns, ...src.rel.columns];\n const rows: Datum[][] = [];\n for (const lrow of accRel.rows) {\n for (const rrow of src.rel.rows) {\n rows.push([...lrow, ...rrow]);\n }\n }\n acc = { rel: { columns: cols, rows }, rangeVars: new Set([...accVars, ...src.rangeVars]) };\n }\n }\n return acc!;\n}\n\n// ---------------------------------------------------------------------------\n// aggregate / grouping machinery\n// ---------------------------------------------------------------------------\n\ninterface AggCollector {\n aggs: FuncCall[];\n windows: FuncCall[];\n groupings: Expr[];\n}\n\nfunction collectCalls(e: Expr | null | undefined, out: AggCollector): void {\n if (!e || typeof e !== \"object\") return;\n if (e.type === \"subquery_expr\") return; // separate query level\n if (e.type === \"func\") {\n const name = e.name[e.name.length - 1]!;\n if (e.over) {\n if (!out.windows.includes(e)) out.windows.push(e);\n // window args/spec may contain aggregates\n for (const a of e.args) collectCalls(a, out);\n if (e.filter) collectCalls(e.filter, out);\n for (const p of e.over.partitionBy ?? []) collectCalls(p, out);\n for (const ob of e.over.orderBy ?? []) collectCalls(ob.expr, out);\n return;\n }\n if (isAggregateName(name)) {\n if (!out.aggs.includes(e)) out.aggs.push(e);\n // do not descend into aggregate arguments\n if (e.filter) collectCalls(e.filter, out);\n return;\n }\n }\n if (e.type === \"grouping_func\") {\n out.groupings.push(e);\n return;\n }\n for (const value of Object.values(e as unknown as Record<string, unknown>)) {\n if (Array.isArray(value)) {\n for (const v of value) {\n if (v && typeof v === \"object\" && \"type\" in (v as object)) collectCalls(v as Expr, out);\n else if (v && typeof v === \"object\") {\n // OrderByItem / when-then pairs etc.\n for (const inner of Object.values(v as Record<string, unknown>)) {\n if (inner && typeof inner === \"object\" && \"type\" in (inner as object)) collectCalls(inner as Expr, out);\n }\n }\n }\n } else if (value && typeof value === \"object\" && \"type\" in (value as object)) {\n collectCalls(value as Expr, out);\n }\n }\n}\n\n/** expand GROUP BY items into grouping sets (lists of key expressions) */\nfunction expandGroupItems(\n items: GroupItem[],\n targets: SelectTarget[],\n canResolve: (parts: string[]) => boolean,\n): Expr[][] {\n const resolveExpr = (e: Expr): Expr => {\n if (e.type === \"number_lit\" && /^\\d+$/.test(e.raw)) {\n const k = Number(e.raw);\n const t = targets[k - 1];\n if (!t || t.expr.type === \"star\") {\n throw pgError(\"invalid_column_reference\", `GROUP BY position ${k} is not in select list`, \"42P10\");\n }\n return t.expr;\n }\n if (e.type === \"colref\" && e.parts.length === 1 && !canResolve(e.parts)) {\n const alias = e.parts[0]!;\n const matches = targets.filter((t) => t.alias === alias);\n if (matches.length === 1) return matches[0]!.expr;\n if (matches.length > 1) {\n throw pgError(\"ambiguous_column\", `column reference \"${alias}\" is ambiguous`, \"42702\");\n }\n }\n return e;\n };\n\n const setsOfItem = (item: GroupItem): Expr[][] => {\n switch (item.kind) {\n case \"expr\":\n return [[resolveExpr(item.expr)]];\n case \"empty\":\n return [[]];\n case \"rollup\": {\n const lists = item.items.map((group) => group.map(resolveExpr));\n const out: Expr[][] = [];\n for (let k = lists.length; k >= 0; k--) {\n out.push(lists.slice(0, k).flat());\n }\n return out;\n }\n case \"cube\": {\n const lists = item.items.map((group) => group.map(resolveExpr));\n const out: Expr[][] = [];\n const n = lists.length;\n for (let mask = (1 << n) - 1; mask >= 0; mask--) {\n const set: Expr[] = [];\n for (let i = 0; i < n; i++) {\n if (mask & (1 << (n - 1 - i))) set.push(...lists[i]!);\n }\n out.push(set);\n }\n return out;\n }\n case \"grouping_sets\": {\n const out: Expr[][] = [];\n for (const sub of item.sets) {\n // each element of GROUPING SETS is itself a list of group items\n let subSets: Expr[][] = [[]];\n for (const gi of sub) {\n const s = setsOfItem(gi);\n const next: Expr[][] = [];\n for (const a of subSets) {\n for (const b of s) next.push([...a, ...b]);\n }\n subSets = next;\n }\n out.push(...subSets);\n }\n return out;\n }\n }\n };\n\n // multiple top-level items combine via cartesian product\n let sets: Expr[][] = [[]];\n for (const item of items) {\n const s = setsOfItem(item);\n const next: Expr[][] = [];\n for (const a of sets) {\n for (const b of s) next.push([...a, ...b]);\n }\n sets = next;\n }\n return sets;\n}\n\ninterface GroupExprDef {\n expr: Expr;\n /** resolved source column index for plain column references */\n colIdx: number | null;\n}\n\nfunction resolveColIdx(columns: Relation[\"columns\"], parts: string[]): number | null {\n if (parts.length === 1) {\n const name = parts[0]!;\n let found = -1;\n for (let i = 0; i < columns.length; i++) {\n const c = columns[i]!;\n if (!c.hidden && c.name === name) {\n if (found !== -1) return null;\n found = i;\n }\n }\n return found === -1 ? null : found;\n }\n const table = parts[parts.length - 2]!;\n const name = parts[parts.length - 1]!;\n for (let i = 0; i < columns.length; i++) {\n const c = columns[i]!;\n if (c.table === table && c.name === name) return i;\n }\n return null;\n}\n\nfunction groupDefMatches(def: GroupExprDef, e: Expr, columns: Relation[\"columns\"]): boolean {\n if (def.colIdx !== null && e.type === \"colref\") {\n return resolveColIdx(columns, e.parts) === def.colIdx;\n }\n return exprEq(def.expr, e);\n}\n\n/** one output row context: either a plain source row or an aggregated group */\ninterface RowCtx {\n scope: RowScope;\n grouped: boolean;\n aggMap: Map<FuncCall, TypedValue> | null;\n /** values of all group exprs; null datum when expr not in the active set */\n groupValues: TypedValue[] | null;\n activeSet: boolean[] | null;\n}\n\nfunction computeAggregate(env: ExecEnv, call: FuncCall, rows: RowScope[]): TypedValue {\n const ctx = env.ctx;\n const name = call.name[call.name.length - 1]!;\n const orderedSet = isOrderedSetAggregate(name);\n\n interface Tuple {\n args: TypedValue[];\n sortKey: TypedValue[] | null;\n }\n const orderBy = orderedSet ? (call.withinGroupOrderBy ?? []) : (call.orderBy ?? []);\n const tuples: Tuple[] = [];\n\n for (const rscope of rows) {\n const scope = makeEvalScope(env, rscope);\n if (call.filter) {\n const f = evalExpr(ctx, scope, call.filter);\n if (f.v !== true) continue;\n }\n let args: TypedValue[];\n if (call.star) {\n args = [];\n } else if (orderedSet) {\n const direct = call.args.map((a) => evalExpr(ctx, scope, a));\n const value = evalExpr(ctx, scope, orderBy[0]!.expr);\n args = [...direct, value];\n } else {\n args = call.args.map((a) => evalExpr(ctx, scope, a));\n }\n const sortKey = orderBy.length > 0 && !orderedSet ? orderBy.map((ob) => evalExpr(ctx, scope, ob.expr)) : null;\n tuples.push({ args, sortKey });\n }\n\n // ORDER BY inside aggregate\n if (orderBy.length > 0 && !orderedSet) {\n tuples.sort((a, b) => {\n for (let i = 0; i < orderBy.length; i++) {\n const ob = orderBy[i]!;\n const av = a.sortKey![i]!;\n const bv = b.sortKey![i]!;\n const dir = ob.dir ?? \"asc\";\n const nullsFirst = ob.nulls ? ob.nulls === \"first\" : dir === \"desc\";\n if (av.v === null || bv.v === null) {\n if (av.v === null && bv.v === null) continue;\n const nullCmp = av.v === null ? -1 : 1;\n const c = nullsFirst ? nullCmp : -nullCmp;\n if (c !== 0) return c;\n continue;\n }\n const t = unifyAggType(av.t, bv.t);\n let c = datumCompare(t === UNKNOWN ? \"text\" : t, av.v, bv.v, ctx);\n if (dir === \"desc\") c = -c;\n if (c !== 0) return c;\n }\n return 0;\n });\n }\n\n // ordered-set aggregates sort by the within-group value\n if (orderedSet && tuples.length > 0) {\n const ob = orderBy[0]!;\n const dir = ob.dir ?? \"asc\";\n const nullsFirst = ob.nulls ? ob.nulls === \"first\" : dir === \"desc\";\n const vi = call.args.length;\n tuples.sort((a, b) => {\n const av = a.args[vi]!;\n const bv = b.args[vi]!;\n if (av.v === null || bv.v === null) {\n if (av.v === null && bv.v === null) return 0;\n const nullCmp = av.v === null ? -1 : 1;\n return nullsFirst ? nullCmp : -nullCmp;\n }\n const t = unifyAggType(av.t, bv.t);\n let c = datumCompare(t === UNKNOWN ? \"text\" : t, av.v, bv.v, ctx);\n if (dir === \"desc\") c = -c;\n return c;\n });\n // nulls in the within-group value are ignored by these aggregates\n }\n\n // DISTINCT\n let effective = tuples;\n if (call.distinct) {\n const seen = new Set<string>();\n effective = [];\n for (const t of tuples) {\n const key = t.args\n .map((a) => (a.v === null ? \"\\u0000N\" : datumKey(a.t === UNKNOWN ? \"text\" : a.t, a.v)))\n .join(\"\\u0001\");\n if (seen.has(key)) continue;\n seen.add(key);\n effective.push(t);\n }\n }\n\n const argCount = call.star ? 0 : orderedSet ? call.args.length + 1 : call.args.length;\n const argTypes: TypeId[] = [];\n for (let i = 0; i < argCount; i++) {\n let t: TypeId = UNKNOWN;\n for (const tuple of effective) {\n t = unifyAggType(t, tuple.args[i]!.t);\n }\n argTypes.push(t);\n }\n\n const acc = createAggregate(ctx, name, argTypes);\n for (const t of effective) acc.step(t.args);\n return acc.result();\n}\n\n// ---------------------------------------------------------------------------\n// sorting\n// ---------------------------------------------------------------------------\n\nexport interface SortSpec {\n colIdx: number;\n dir: \"asc\" | \"desc\";\n nullsFirst: boolean;\n}\n\nexport function sortRows(env: ExecEnv, rel: Relation, specs: SortSpec[]): void {\n const ctx = env.ctx;\n const indexed = rel.rows.map((row, i) => ({ row, i }));\n indexed.sort((a, b) => {\n for (const s of specs) {\n const av = a.row[s.colIdx] ?? null;\n const bv = b.row[s.colIdx] ?? null;\n if (av === null || bv === null) {\n if (av === null && bv === null) continue;\n const nullCmp = av === null ? -1 : 1;\n const c = s.nullsFirst ? nullCmp : -nullCmp;\n if (c !== 0) return c;\n continue;\n }\n const t = rel.columns[s.colIdx]!.type;\n let c = datumCompare(t === UNKNOWN ? \"text\" : t, av, bv, ctx);\n if (s.dir === \"desc\") c = -c;\n if (c !== 0) return c;\n }\n return a.i - b.i; // stable\n });\n rel.rows = indexed.map((x) => x.row);\n}\n\nfunction orderDirection(ob: OrderByItem): { dir: \"asc\" | \"desc\"; nullsFirst: boolean } {\n let dir: \"asc\" | \"desc\" = ob.dir ?? \"asc\";\n if (ob.using === \">\") dir = \"desc\";\n else if (ob.using === \"<\") dir = \"asc\";\n const nullsFirst = ob.nulls ? ob.nulls === \"first\" : dir === \"desc\";\n return { dir, nullsFirst };\n}\n\n/** ORDER BY over a set-op/VALUES output: names, positions, or exprs over output columns */\nfunction outputOrderSpecs(env: ExecEnv, rel: Relation, orderBy: OrderByItem[]): SortSpec[] {\n if (orderBy.length === 0) return [];\n const specs: SortSpec[] = [];\n const extraCols: Array<{ name: string; type: TypeId; table: null; hidden: true }> = [];\n const extraExprs: Expr[] = [];\n for (const ob of orderBy) {\n const { dir, nullsFirst } = orderDirection(ob);\n const pos = orderPosition(ob.expr, rel);\n if (pos !== null) {\n specs.push({ colIdx: pos, dir, nullsFirst });\n continue;\n }\n specs.push({ colIdx: rel.columns.length + extraCols.length, dir, nullsFirst });\n extraCols.push({ name: `__ord${extraCols.length}`, type: UNKNOWN, table: null, hidden: true });\n extraExprs.push(ob.expr);\n }\n if (extraExprs.length > 0) {\n const baseCols = rel.columns.slice();\n rel.columns = [...rel.columns, ...extraCols];\n rel.rows = rel.rows.map((row) => {\n const scope = new RowScope(baseCols, row, env.outer);\n const extras = extraExprs.map((e) => evalScalar(env, scope, e));\n for (let k = 0; k < extras.length; k++) {\n const col = rel.columns[baseCols.length + k]! as { type: TypeId };\n col.type = unifyAggType(col.type, extras[k]!.t);\n }\n return [...row, ...extras.map((x) => x.v)];\n });\n }\n return specs;\n}\n\nfunction orderPosition(e: Expr, rel: Relation): number | null {\n const visible = rel.columns.map((c, i) => ({ c, i })).filter(({ c }) => !c.hidden);\n if (e.type === \"number_lit\" && /^\\d+$/.test(e.raw)) {\n const k = Number(e.raw);\n const v = visible[k - 1];\n if (!v) {\n throw pgError(\"invalid_column_reference\", `ORDER BY position ${k} is not in select list`, \"42P10\");\n }\n return v.i;\n }\n if (e.type === \"colref\" && e.parts.length === 1) {\n const name = e.parts[0]!;\n const matches = visible.filter(({ c }) => c.name === name);\n if (matches.length === 1) return matches[0]!.i;\n if (matches.length > 1) {\n throw pgError(\"ambiguous_column\", `ORDER BY \"${name}\" is ambiguous`, \"42702\");\n }\n }\n return null;\n}\n\nfunction stripHidden(rel: Relation): Relation {\n if (!rel.columns.some((c) => c.hidden)) return rel;\n const keep = rel.columns.map((c, i) => ({ c, i })).filter(({ c }) => !c.hidden);\n return {\n columns: keep.map(({ c }) => c),\n rows: rel.rows.map((row) => keep.map(({ i }) => row[i] ?? null)),\n };\n}\n\nfunction applyLimitOffset(\n env: ExecEnv,\n rel: Relation,\n limit: Expr | null,\n offset: Expr | null,\n tieSpecs?: SortSpec[],\n): Relation {\n let rows = rel.rows;\n if (offset) {\n const v = evalScalar(env, env.outer, offset);\n if (v.v !== null) {\n const n = Number(castTo(env.ctx, v, \"int8\", {}).v as bigint);\n if (n < 0) throw pgError(\"invalid_row_count\", \"OFFSET must not be negative\", \"2201X\");\n rows = rows.slice(n);\n }\n }\n if (limit) {\n const v = evalScalar(env, env.outer, limit);\n if (v.v !== null) {\n const n = Number(castTo(env.ctx, v, \"int8\", {}).v as bigint);\n if (n < 0) throw pgError(\"invalid_row_count\", \"LIMIT must not be negative\", \"2201W\");\n let end = Math.min(n, rows.length);\n if (tieSpecs && end > 0 && end < rows.length) {\n // FETCH ... WITH TIES: extend past the limit while sort keys stay equal\n const boundary = rows[end - 1]!;\n while (end < rows.length && sortKeysEqual(env, rel, tieSpecs, boundary, rows[end]!)) end++;\n }\n rows = rows.slice(0, end);\n }\n }\n return { columns: rel.columns, rows };\n}\n\nfunction sortKeysEqual(env: ExecEnv, rel: Relation, specs: SortSpec[], a: Datum[], b: Datum[]): boolean {\n for (const s of specs) {\n const av = a[s.colIdx] ?? null;\n const bv = b[s.colIdx] ?? null;\n if (av === null || bv === null) {\n if (av !== bv) return false;\n continue;\n }\n const t = rel.columns[s.colIdx]!.type;\n if (datumCompare(t === UNKNOWN ? \"text\" : t, av, bv, env.ctx) !== 0) return false;\n }\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// set operations / VALUES\n// ---------------------------------------------------------------------------\n\nfunction executeValues(env: ExecEnv, body: ValuesBody): Relation {\n const width = body.rows[0]?.length ?? 0;\n const columns: Relation[\"columns\"] = [];\n for (let i = 0; i < width; i++) {\n columns.push({ name: `column${i + 1}`, type: UNKNOWN, table: null });\n }\n const rows: Datum[][] = [];\n const types: TypeId[] = new Array(width).fill(UNKNOWN);\n const rawRows: TypedValue[][] = [];\n for (const exprRow of body.rows) {\n if (exprRow.length !== width) {\n throw pgError(\"syntax\", \"VALUES lists must all be the same length\", \"42601\");\n }\n const vals = exprRow.map((e) => evalScalar(env, env.outer, e));\n for (let i = 0; i < width; i++) {\n const t = unifyTypes(types[i]!, vals[i]!.t);\n if (t !== null) types[i] = t;\n }\n rawRows.push(vals);\n }\n for (const vals of rawRows) {\n rows.push(\n vals.map((v, i) => {\n const t = types[i]!;\n if (v.v === null || t === UNKNOWN) return v.v;\n return castTo(env.ctx, v, t, {}).v;\n }),\n );\n }\n for (let i = 0; i < width; i++) {\n columns[i]!.type = types[i] === UNKNOWN ? \"text\" : types[i]!;\n }\n return { columns, rows };\n}\n\nfunction setOpRelation(env: ExecEnv, op: SetOp): Relation {\n const ctx = env.ctx;\n const left = executeBody(env, op.left);\n const right = executeBody(env, op.right);\n if (left.columns.length !== right.columns.length) {\n throw pgError(\"syntax\", `each ${op.op.toUpperCase()} query must have the same number of columns`, \"42601\");\n }\n const types: TypeId[] = left.columns.map((lc, i) => {\n const rc = right.columns[i]!;\n const t = unifyTypes(lc.type, rc.type);\n if (t === null) {\n throw pgError(\n \"datatype_mismatch\",\n `${op.op.toUpperCase()} types ${lc.type} and ${rc.type} cannot be matched`,\n \"42804\",\n );\n }\n return t === UNKNOWN ? \"text\" : t;\n });\n const columns = left.columns.map((c, i) => ({ name: c.name, type: types[i]!, table: null as string | null }));\n\n const normalize = (rel: Relation): Datum[][] =>\n rel.rows.map((row) =>\n row.map((v, i) => {\n if (v === null) return null;\n const srcT = rel.columns[i]!.type;\n if (srcT === types[i]) return v;\n return castTo(ctx, tv(srcT === UNKNOWN ? \"text\" : srcT, v), types[i]!, {}).v;\n }),\n );\n const lrows = normalize(left);\n const rrows = normalize(right);\n const keyOf = (row: Datum[]) => row.map((v, i) => (v === null ? \"\\u0000N\" : datumKey(types[i]!, v))).join(\"\\u0001\");\n\n let rows: Datum[][];\n switch (op.op) {\n case \"union\": {\n rows = [...lrows, ...rrows];\n if (!op.all) {\n const seen = new Set<string>();\n rows = rows.filter((r) => {\n const k = keyOf(r);\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n }\n break;\n }\n case \"intersect\": {\n const rightCounts = new Map<string, number>();\n for (const r of rrows) {\n const k = keyOf(r);\n rightCounts.set(k, (rightCounts.get(k) ?? 0) + 1);\n }\n rows = [];\n const emitted = new Set<string>();\n for (const r of lrows) {\n const k = keyOf(r);\n const avail = rightCounts.get(k) ?? 0;\n if (avail <= 0) continue;\n if (op.all) {\n rightCounts.set(k, avail - 1);\n rows.push(r);\n } else if (!emitted.has(k)) {\n emitted.add(k);\n rows.push(r);\n }\n }\n break;\n }\n case \"except\": {\n const rightCounts = new Map<string, number>();\n for (const r of rrows) {\n const k = keyOf(r);\n rightCounts.set(k, (rightCounts.get(k) ?? 0) + 1);\n }\n rows = [];\n const emitted = new Set<string>();\n for (const r of lrows) {\n const k = keyOf(r);\n if (op.all) {\n const avail = rightCounts.get(k) ?? 0;\n if (avail > 0) {\n rightCounts.set(k, avail - 1);\n continue;\n }\n rows.push(r);\n } else {\n if (rightCounts.has(k) || emitted.has(k)) continue;\n emitted.add(k);\n rows.push(r);\n }\n }\n break;\n }\n }\n return { columns, rows };\n}\n\nexport function executeBody(env: ExecEnv, body: SelectBody): Relation {\n switch (body.type) {\n case \"select_core\":\n return stripHidden(executeCore(env, body, []));\n case \"setop\":\n return setOpRelation(env, body);\n case \"values\":\n return executeValues(env, body);\n }\n}\n\n// ---------------------------------------------------------------------------\n// SELECT core\n// ---------------------------------------------------------------------------\n\ninterface ProjItem {\n name: string;\n kind: \"col\" | \"expr\" | \"srf\";\n colIdx: number;\n expr: Expr | null;\n hidden: boolean;\n}\n\nfunction expandTargets(core: SelectCore, columns: Relation[\"columns\"]): ProjItem[] {\n const items: ProjItem[] = [];\n for (const t of core.targets) {\n if (t.expr.type === \"star\") {\n if (t.expr.table) {\n const label = t.expr.table[t.expr.table.length - 1]!;\n let any = false;\n for (let i = 0; i < columns.length; i++) {\n const c = columns[i]!;\n if (c.table === label) {\n any = true;\n items.push({ name: c.name, kind: \"col\", colIdx: i, expr: null, hidden: false });\n }\n }\n if (!any) {\n throw pgError(\"undefined_table\", `missing FROM-clause entry for table \"${label}\"`, \"42P01\");\n }\n } else {\n for (let i = 0; i < columns.length; i++) {\n const c = columns[i]!;\n if (!c.hidden) {\n items.push({ name: c.name, kind: \"col\", colIdx: i, expr: null, hidden: false });\n }\n }\n }\n continue;\n }\n const name = t.alias ?? inferColumnName(t.expr);\n const isSrf =\n t.expr.type === \"func\" &&\n !t.expr.over &&\n t.expr.name.length === 1 &&\n isSrfName(t.expr.name[0]!) &&\n !isAggregateName(t.expr.name[0]!);\n items.push({ name, kind: isSrf ? \"srf\" : \"expr\", colIdx: -1, expr: t.expr, hidden: false });\n }\n return items;\n}\n\nexport function executeCore(env0: ExecEnv, core: SelectCore, orderBy: OrderByItem[]): Relation {\n const env = env0;\n const ctx = env.ctx;\n\n // 1. FROM\n const source = buildFrom(env, core.from);\n const srcCols = source.rel.columns;\n const rangeVars = source.rangeVars;\n\n const rowScope = (row: Datum[]) => new RowScope(srcCols, row, env.outer, rangeVars);\n\n // 2. WHERE\n let srcRows = source.rel.rows;\n if (core.where) {\n const where = core.where;\n srcRows = srcRows.filter((row) => evalPredicate(env, rowScope(row), where));\n }\n\n // 3. collect aggregate / window / grouping calls\n const collector: AggCollector = { aggs: [], windows: [], groupings: [] };\n for (const t of core.targets) collectCalls(t.expr.type === \"star\" ? null : t.expr, collector);\n collectCalls(core.having, collector);\n for (const ob of orderBy) collectCalls(ob.expr, collector);\n if (core.distinct?.on) {\n for (const e of core.distinct.on) collectCalls(e, collector);\n }\n\n const grouped = core.groupBy !== null || collector.aggs.length > 0 || core.having !== null;\n\n // 4. build row contexts\n let ctxs: RowCtx[];\n let groupDefs: GroupExprDef[] = [];\n\n if (!grouped) {\n ctxs = srcRows.map((row) => ({\n scope: rowScope(row),\n grouped: false,\n aggMap: null,\n groupValues: null,\n activeSet: null,\n }));\n } else {\n const canResolve = (parts: string[]) => resolveColIdx(srcCols, parts) !== null;\n let sets: Expr[][] = core.groupBy === null ? [[]] : expandGroupItems(core.groupBy, core.targets, canResolve);\n if (core.groupDistinct) {\n const sigs = new Set<string>();\n sets = sets.filter((s) => {\n const sig = JSON.stringify(s);\n if (sigs.has(sig)) return false;\n sigs.add(sig);\n return true;\n });\n }\n // all distinct group exprs across sets\n for (const set of sets) {\n for (const e of set) {\n if (!groupDefs.some((d) => exprEq(d.expr, e))) {\n groupDefs.push({ expr: e, colIdx: e.type === \"colref\" ? resolveColIdx(srcCols, e.parts) : null });\n }\n }\n }\n groupDefs = groupDefs.map((d) => ({\n expr: d.expr,\n colIdx: d.expr.type === \"colref\" ? resolveColIdx(srcCols, d.expr.parts) : null,\n }));\n\n ctxs = [];\n for (const set of sets) {\n const activeSet = groupDefs.map((d) => set.some((e) => exprEq(d.expr, e)));\n // group rows by key over this set\n const groups = new Map<string, Datum[][]>();\n if (set.length === 0) {\n groups.set(\"\", srcRows);\n } else {\n for (const row of srcRows) {\n const scope = rowScope(row);\n const key = set\n .map((e) => {\n const v = evalScalar(env, scope, e);\n return v.v === null ? \"\\u0000N\" : datumKey(v.t === UNKNOWN ? \"text\" : v.t, v.v);\n })\n .join(\"\\u0001\");\n const list = groups.get(key);\n if (list) list.push(row);\n else groups.set(key, [row]);\n }\n }\n for (const rows of groups.values()) {\n const repRow = rows[0] ?? srcCols.map(() => null);\n const repScope = rowScope(repRow);\n const groupValues: TypedValue[] = groupDefs.map((d, di) => {\n if (!activeSet[di]) {\n // probe the type from the representative row when possible\n if (rows.length > 0) {\n const probe = evalScalar(env, repScope, d.expr);\n return tv(probe.t, null);\n }\n return tv(UNKNOWN, null);\n }\n if (rows.length === 0) return tv(UNKNOWN, null);\n return evalScalar(env, repScope, d.expr);\n });\n const aggMap = new Map<FuncCall, TypedValue>();\n const groupScopes = rows.map((r) => rowScope(r));\n for (const agg of collector.aggs) {\n aggMap.set(agg, computeAggregate(env, agg, groupScopes));\n }\n ctxs.push({\n scope: repScope,\n grouped: true,\n aggMap,\n groupValues,\n activeSet,\n });\n }\n }\n }\n\n const extrasFor = (rc: RowCtx, windowAt?: (call: FuncCall) => TypedValue | undefined): ScopeExtras => ({\n aggMap: rc.aggMap,\n windowAt,\n strictGrouping: rc.grouped,\n exprOverride: rc.grouped\n ? (e) => {\n for (let di = 0; di < groupDefs.length; di++) {\n if (groupDefMatches(groupDefs[di]!, e, srcCols)) {\n return rc.groupValues![di]!;\n }\n }\n return undefined;\n }\n : undefined,\n groupingValue: rc.grouped\n ? (e) => {\n const g = e as Extract<Expr, { type: \"grouping_func\" }>;\n let mask = 0;\n for (const arg of g.args) {\n const di = groupDefs.findIndex((d) => groupDefMatches(d, arg, srcCols));\n if (di === -1) {\n throw pgError(\n \"grouping_error\",\n \"arguments to GROUPING must be grouping expressions of the associated query level\",\n \"42803\",\n );\n }\n mask = (mask << 1) | (rc.activeSet![di] ? 0 : 1);\n }\n return tv(\"int4\", mask);\n }\n : undefined,\n });\n\n // 5. HAVING\n if (core.having) {\n const having = core.having;\n ctxs = ctxs.filter((rc) => evalPredicate(env, rc.scope, having, extrasFor(rc)));\n }\n\n // 6. window functions\n const windowMaps = new Map<FuncCall, TypedValue[]>();\n if (collector.windows.length > 0) {\n const evalAt = (i: number, e: Expr): TypedValue => {\n const rc = ctxs[i]!;\n return evalScalar(env, rc.scope, e, extrasFor(rc));\n };\n const maps = computeWindowValues(ctx, collector.windows, ctxs.length, evalAt, core.windows);\n for (const [call, values] of maps) windowMaps.set(call, values);\n }\n\n // 7. projection plan\n const projItems = expandTargets(core, srcCols);\n const visibleCount = projItems.length;\n\n // ORDER BY resolution\n const sortSpecs: SortSpec[] = [];\n const orderExprs: Array<{ item: ProjItem; spec: SortSpec }> = [];\n for (const ob of orderBy) {\n const { dir, nullsFirst } = orderDirection(ob);\n // position\n if (ob.expr.type === \"number_lit\" && /^\\d+$/.test(ob.expr.raw)) {\n const k = Number(ob.expr.raw);\n if (k < 1 || k > visibleCount) {\n throw pgError(\"invalid_column_reference\", `ORDER BY position ${k} is not in select list`, \"42P10\");\n }\n sortSpecs.push({ colIdx: k - 1, dir, nullsFirst });\n continue;\n }\n // output name\n if (ob.expr.type === \"colref\" && ob.expr.parts.length === 1) {\n const name = ob.expr.parts[0]!;\n const matches = projItems.map((p, i) => ({ p, i })).filter(({ p }) => !p.hidden && p.name === name);\n if (matches.length === 1) {\n sortSpecs.push({ colIdx: matches[0]!.i, dir, nullsFirst });\n continue;\n }\n if (matches.length > 1) {\n // PG resolves ambiguous ORDER BY names against the FROM list instead\n const idx = resolveColIdx(srcCols, ob.expr.parts);\n if (idx === null) {\n throw pgError(\"ambiguous_column\", `ORDER BY \"${name}\" is ambiguous`, \"42702\");\n }\n }\n }\n const item: ProjItem = { name: `__ord${orderExprs.length}`, kind: \"expr\", colIdx: -1, expr: ob.expr, hidden: true };\n const spec: SortSpec = { colIdx: projItems.length, dir, nullsFirst };\n projItems.push(item);\n sortSpecs.push(spec);\n orderExprs.push({ item, spec });\n }\n\n // DISTINCT ON hidden columns\n const distinctOnIdx: number[] = [];\n if (core.distinct?.on) {\n for (const e of core.distinct.on) {\n // reuse an output column when the expression matches positionally/by name\n let matched: number | null = null;\n if (e.type === \"number_lit\" && /^\\d+$/.test(e.raw)) {\n const k = Number(e.raw);\n if (k >= 1 && k <= visibleCount) matched = k - 1;\n } else if (e.type === \"colref\" && e.parts.length === 1) {\n const ms = projItems\n .slice(0, visibleCount)\n .map((p, i) => ({ p, i }))\n .filter(({ p }) => p.name === e.parts[0]);\n if (ms.length === 1) {\n const cand = ms[0]!;\n if (cand.p.kind === \"col\" && resolveColIdx(srcCols, e.parts) === cand.p.colIdx) matched = cand.i;\n else if (cand.p.expr && exprEq(cand.p.expr, e)) matched = cand.i;\n }\n } else {\n const ms = projItems\n .slice(0, visibleCount)\n .map((p, i) => ({ p, i }))\n .filter(({ p }) => p.expr && exprEq(p.expr, e));\n if (ms.length > 0) matched = ms[0]!.i;\n }\n if (matched !== null) {\n distinctOnIdx.push(matched);\n } else {\n distinctOnIdx.push(projItems.length);\n projItems.push({ name: `__don${distinctOnIdx.length}`, kind: \"expr\", colIdx: -1, expr: e, hidden: true });\n }\n }\n }\n\n // 8. evaluate projection\n const outColumns: Relation[\"columns\"] = projItems.map((p) => ({\n name: p.name,\n type: p.kind === \"col\" ? srcCols[p.colIdx]!.type : UNKNOWN,\n table: null,\n hidden: p.hidden,\n }));\n\n const outRows: Datum[][] = [];\n // per emitted row, the cell types it was produced with (groups may disagree,\n // e.g. sum() over an empty filtered group defaults to numeric while a\n // non-empty group yields int8) \u2014 reconciled against the unified column types below\n const outRowTypes: TypeId[][] = [];\n for (let i = 0; i < ctxs.length; i++) {\n const rc = ctxs[i]!;\n const extras = extrasFor(rc, (call) => windowMaps.get(call)?.[i]);\n const cells: Array<{ values: Datum[]; type: TypeId }> = [];\n let expansion = 1;\n for (const p of projItems) {\n if (p.kind === \"col\") {\n if (rc.grouped) {\n // a bare source column in a grouped query must be a grouping column\n const c = srcCols[p.colIdx]!;\n const pseudo: Expr = { type: \"colref\", parts: c.table ? [c.table, c.name] : [c.name] };\n const v = evalScalar(env, rc.scope, pseudo, extras);\n cells.push({ values: [v.v], type: v.t });\n } else {\n cells.push({ values: [rc.scope.row[p.colIdx] ?? null], type: srcCols[p.colIdx]!.type });\n }\n continue;\n }\n if (p.kind === \"srf\") {\n const call = p.expr as FuncCall;\n const scope = makeEvalScope(env, rc.scope, extras);\n const args = call.args.map((a) => evalExpr(ctx, scope, a));\n const srf = getSrfFunctions().get(call.name[0]!)!;\n const res = srf(ctx, args, p.name);\n if (res.columns.length === 1) {\n cells.push({ values: res.rows.map((r) => r[0] ?? null), type: res.columns[0]!.type });\n } else {\n cells.push({\n values: res.rows.map((r) => ({\n kind: \"pgrecord\" as const,\n types: res.columns.map((c) => c.type),\n values: r.slice(),\n names: res.columns.map((c) => c.name),\n })),\n type: \"record\",\n });\n }\n expansion = Math.max(expansion, res.rows.length);\n if (res.rows.length === 0) expansion = Math.max(expansion, 0);\n continue;\n }\n const v = evalScalar(env, rc.scope, p.expr!, extras);\n cells.push({ values: [v.v], type: v.t });\n }\n const hasSrf = projItems.some((p) => p.kind === \"srf\");\n if (hasSrf) {\n const srfLens = projItems\n .map((p, k) => ({ p, k }))\n .filter(({ p }) => p.kind === \"srf\")\n .map(({ k }) => cells[k]!.values.length);\n const maxLen = Math.max(0, ...srfLens);\n expansion = maxLen;\n }\n const cellTypes = cells.map((c) => c.type);\n for (let e = 0; e < expansion; e++) {\n const row: Datum[] = [];\n for (let k = 0; k < projItems.length; k++) {\n const cell = cells[k]!;\n if (projItems[k]!.kind === \"srf\") {\n row.push(cell.values[e] ?? null);\n } else {\n row.push(cell.values[0] ?? null);\n }\n }\n outRows.push(row);\n outRowTypes.push(cellTypes);\n }\n // unify column types\n for (let k = 0; k < projItems.length; k++) {\n const col = outColumns[k]!;\n col.type = unifyAggType(col.type, cells[k]!.type);\n }\n }\n\n // resolve UNKNOWN output types via a null probe when there were no rows\n if (ctxs.length === 0) {\n for (let k = 0; k < projItems.length; k++) {\n const p = projItems[k]!;\n if (outColumns[k]!.type !== UNKNOWN || p.kind === \"col\") continue;\n try {\n const probeScope = new RowScope(\n srcCols,\n srcCols.map(() => null),\n env.outer,\n rangeVars,\n );\n const v = evalScalar(env, probeScope, p.expr!, {\n aggMap: new Map(),\n windowAt: () => tv(UNKNOWN, null),\n });\n outColumns[k]!.type = v.t;\n } catch {\n outColumns[k]!.type = \"text\";\n }\n }\n }\n for (const c of outColumns) {\n if (c.type === UNKNOWN) c.type = \"text\";\n }\n\n // re-cast datums produced under a different per-group type than the final\n // unified column type (sum/min/max defaults over empty groups, mixed branches)\n for (let r = 0; r < outRows.length; r++) {\n const types = outRowTypes[r]!;\n for (let k = 0; k < outColumns.length; k++) {\n const finalT = outColumns[k]!.type;\n const cellT = types[k] ?? finalT;\n const v = outRows[r]![k] ?? null;\n if (v === null || cellT === finalT || cellT === UNKNOWN || finalT === UNKNOWN) continue;\n outRows[r]![k] = castTo(ctx, tv(cellT, v), finalT, { explicit: true }).v;\n }\n }\n\n let rel: Relation = { columns: outColumns, rows: outRows };\n\n // 9. sort\n if (sortSpecs.length > 0) {\n sortRows(env, rel, sortSpecs);\n }\n\n // 10. DISTINCT / DISTINCT ON\n if (core.distinct) {\n if (core.distinct.on) {\n const seen = new Set<string>();\n rel.rows = rel.rows.filter((row) => {\n const k = distinctOnIdx\n .map((ci) => {\n const v = row[ci] ?? null;\n return v === null ? \"\\u0000N\" : datumKey(rel.columns[ci]!.type, v);\n })\n .join(\"\\u0001\");\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n } else {\n const visible = rel.columns.map((c, i) => ({ c, i })).filter(({ c }) => !c.hidden);\n const seen = new Set<string>();\n rel.rows = rel.rows.filter((row) => {\n const k = visible\n .map(({ c, i }) => {\n const v = row[i] ?? null;\n return v === null ? \"\\u0000N\" : datumKey(c.type, v);\n })\n .join(\"\\u0001\");\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n }\n }\n\n rel = stripHidden(rel);\n return rel;\n}\n\n// ---------------------------------------------------------------------------\n// top-level SELECT\n// ---------------------------------------------------------------------------\n\nexport function executeSelectStmt(env0: ExecEnv, stmt: SelectStmt): Relation {\n const env = applyWith(env0, stmt.with);\n let rel: Relation;\n if (stmt.body.type === \"select_core\") {\n rel = executeCore(env, stmt.body, stmt.orderBy);\n } else {\n rel = executeBody(env, stmt.body);\n const specs = outputOrderSpecs(env, rel, stmt.orderBy);\n if (specs.length > 0) sortRows(env, rel, specs);\n rel = stripHidden(rel);\n }\n if (stmt.limitWithTies) {\n if (stmt.orderBy.length === 0) {\n throw pgError(\"syntax\", \"WITH TIES cannot be specified without ORDER BY clause\", \"42601\");\n }\n // rows are already sorted; re-derive the sort key columns over the output\n const tieSpecs = outputOrderSpecs(env, rel, stmt.orderBy);\n return stripHidden(applyLimitOffset(env, rel, stmt.limit, stmt.offset, tieSpecs));\n }\n return applyLimitOffset(env, rel, stmt.limit, stmt.offset);\n}\n\nexport function selectResult(env: ExecEnv, stmt: SelectStmt): ExecResult {\n return relationResult(executeSelectStmt(env, stmt), \"SELECT\");\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport type { ExecEnv } from \"../executor/relation.ts\";\nimport { RowScope } from \"../executor/relation.ts\";\nimport { makeEvalScope } from \"../executor/select.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport type { IndexMeta, TableData } from \"../storage/database-state.ts\";\nimport { castTo } from \"../types/cast.ts\";\nimport { datumKey } from \"../types/compare.ts\";\nimport { type Datum, datumText, tv } from \"../types/value.ts\";\n\nfunction tableScope(table: TableData, row: Datum[]): RowScope {\n const cols = table.columns.map((c) => ({ name: c.name, type: c.type.id, table: table.name }));\n return new RowScope(cols, row, null, new Set([table.name]));\n}\n\n/** NOT NULL column constraints (23502). */\nexport function checkNotNull(env: ExecEnv, table: TableData, row: Datum[]): void {\n void env;\n for (let i = 0; i < table.columns.length; i++) {\n const c = table.columns[i]!;\n if (c.notNull && (row[i] ?? null) === null) {\n throw pgError(\n \"not_null_violation\",\n `null value in column \"${c.name}\" of relation \"${table.name}\" violates not-null constraint`,\n \"23502\",\n );\n }\n }\n}\n\n/** CHECK constraints (23514); NULL results pass. */\nexport function checkChecks(env: ExecEnv, table: TableData, row: Datum[]): void {\n for (const con of table.constraints) {\n if (con.kind !== \"check\") continue;\n const scope = makeEvalScope(env, tableScope(table, row));\n const v = evalExpr(env.ctx, scope, con.expr);\n if (v.v === null) continue;\n const b = castTo(env.ctx, v, \"bool\", {});\n if (b.v !== true) {\n throw pgError(\n \"check_violation\",\n `new row for relation \"${table.name}\" violates check constraint \"${con.name}\"`,\n \"23514\",\n );\n }\n }\n}\n\ninterface UniqueSpec {\n name: string;\n /** column indexes for plain column keys; -1 with expr set for expression keys */\n keys: Array<{ colIdx: number; expr: import(\"../ast/nodes.ts\").Expr | null }>;\n columnNames: string[];\n nullsNotDistinct: boolean;\n where: import(\"../ast/nodes.ts\").Expr | null;\n isPrimary: boolean;\n}\n\nexport function uniqueSpecsFor(env: ExecEnv, table: TableData): UniqueSpec[] {\n const specs: UniqueSpec[] = [];\n for (const con of table.constraints) {\n if (con.kind !== \"primary_key\" && con.kind !== \"unique\") continue;\n specs.push({\n name: con.name,\n keys: con.columns.map((c) => ({ colIdx: table.columnIndex(c), expr: null })),\n columnNames: con.columns,\n nullsNotDistinct: con.kind === \"unique\" ? con.nullsNotDistinct : false,\n where: null,\n isPrimary: con.kind === \"primary_key\",\n });\n }\n const schema = env.ctx.state.schemas.get(table.schema);\n if (schema) {\n for (const idx of schema.indexes.values()) {\n if (idx.table !== table.name || !idx.unique || idx.isConstraint) continue;\n specs.push({\n name: idx.name,\n keys: idx.columns.map((c) => ({\n colIdx: c.column !== null ? table.columnIndex(c.column) : -1,\n expr: c.expr,\n })),\n columnNames: idx.columns.map((c) => c.column ?? \"expr\"),\n nullsNotDistinct: idx.nullsNotDistinct,\n where: idx.where,\n isPrimary: false,\n });\n }\n }\n return specs;\n}\n\nfunction uniqueKeyOf(env: ExecEnv, table: TableData, spec: UniqueSpec, row: Datum[]): string | null {\n if (spec.where) {\n const scope = makeEvalScope(env, tableScope(table, row));\n const v = evalExpr(env.ctx, scope, spec.where);\n if (v.v !== true) return null; // partial index: row not covered\n }\n const parts: string[] = [];\n let hasNull = false;\n for (const k of spec.keys) {\n let value: Datum;\n let type: import(\"../types/value.ts\").TypeId;\n if (k.expr) {\n const scope = makeEvalScope(env, tableScope(table, row));\n const v = evalExpr(env.ctx, scope, k.expr);\n value = v.v;\n type = v.t === \"unknown\" ? \"text\" : v.t;\n } else {\n value = row[k.colIdx] ?? null;\n type = table.columns[k.colIdx]!.type.id;\n }\n if (value === null) {\n hasNull = true;\n parts.push(\"\\u0000N\");\n } else {\n parts.push(datumKey(type, value));\n }\n }\n if (hasNull && !spec.nullsNotDistinct) return null; // NULLs are distinct\n return parts.join(\"\\u0001\");\n}\n\nfunction _describeKey(env: ExecEnv, table: TableData, spec: UniqueSpec, row: Datum[]): string {\n const names = spec.columnNames.join(\", \");\n const values = spec.keys\n .map((k, _i) => {\n if (k.expr) return \"\u2026\";\n const v = row[k.colIdx] ?? null;\n if (v === null) return \"null\";\n return datumText(table.columns[k.colIdx]!.type.id, v, env.ctx);\n })\n .join(\", \");\n return `Key (${names})=(${values})`;\n}\n\n/**\n * Unique / primary key enforcement (23505). `selfIdx` is the row's own index\n * in table.rows (already inserted / updated in place).\n */\nexport function checkUnique(env: ExecEnv, table: TableData, row: Datum[], selfIdx: number): void {\n for (const spec of uniqueSpecsFor(env, table)) {\n const key = uniqueKeyOf(env, table, spec, row);\n if (key === null) continue;\n for (let i = 0; i < table.rows.length; i++) {\n if (i === selfIdx) continue;\n const other = uniqueKeyOf(env, table, spec, table.rows[i]!);\n if (other === key) {\n throw pgError(\n \"constraint_unique\",\n `duplicate key value violates unique constraint \"${spec.name}\"`,\n \"23505\",\n // PG adds a DETAIL line; kept in message for classification purposes\n );\n }\n }\n }\n}\n\n/** does `row` conflict with an existing row under `spec`? returns the row index */\nexport function findConflict(env: ExecEnv, table: TableData, spec: UniqueSpec, row: Datum[]): number | null {\n const key = uniqueKeyOf(env, table, spec, row);\n if (key === null) return null;\n for (let i = 0; i < table.rows.length; i++) {\n const other = uniqueKeyOf(env, table, spec, table.rows[i]!);\n if (other === key) return i;\n }\n return null;\n}\n\nexport type { IndexMeta, UniqueSpec };\n\n// ---------------------------------------------------------------------------\n// foreign keys\n// ---------------------------------------------------------------------------\n\n/** referencing-side FK enforcement: every non-null key must exist in the referenced table (23503) */\nexport function checkForeignKeys(env: ExecEnv, table: TableData, row: Datum[]): void {\n const state = env.ctx.state;\n for (const con of table.constraints) {\n if (con.kind !== \"foreign_key\") continue;\n const values = con.columns.map((c) => row[table.columnIndex(c)] ?? null);\n const nulls = values.filter((v) => v === null).length;\n if (con.match === \"simple\" && nulls > 0) continue;\n if (con.match === \"full\") {\n if (nulls === values.length) continue;\n if (nulls > 0) {\n throw pgError(\n \"constraint_foreign_key\",\n `insert or update on table \"${table.name}\" violates foreign key constraint \"${con.name}\"`,\n \"23503\",\n );\n }\n }\n const refTable = state.schemas.get(con.refSchema)?.tables.get(con.refTable);\n if (!refTable) {\n throw pgError(\"undefined_table\", `relation \"${con.refSchema}.${con.refTable}\" does not exist`, \"42P01\");\n }\n const refIdxs = con.refColumns.map((c) => refTable.columnIndex(c));\n const keyTypes = con.refColumns.map((_c, i) => refTable.columns[refIdxs[i]!]!.type.id);\n const wanted = values\n .map((v, i) => {\n const localT = table.columns[table.columnIndex(con.columns[i]!)]!.type.id;\n const cast = castTo(env.ctx, tv(localT, v), keyTypes[i]!, {});\n return cast.v === null ? \"\\u0000N\" : datumKey(keyTypes[i]!, cast.v);\n })\n .join(\"\\u0001\");\n const found = refTable.rows.some((r) => {\n const key = refIdxs\n .map((ri, i) => {\n const v = r[ri] ?? null;\n return v === null ? \"\\u0000N\" : datumKey(keyTypes[i]!, v);\n })\n .join(\"\\u0001\");\n return key === wanted;\n });\n if (!found) {\n throw pgError(\n \"constraint_foreign_key\",\n `insert or update on table \"${table.name}\" violates foreign key constraint \"${con.name}\"`,\n \"23503\",\n );\n }\n }\n}\n\nexport interface ReferencingConstraint {\n table: TableData;\n constraint: Extract<import(\"../storage/database-state.ts\").ConstraintMeta, { kind: \"foreign_key\" }>;\n}\n\n/** all FK constraints in the database that reference `table` */\nexport function referencingConstraints(env: ExecEnv, table: TableData): ReferencingConstraint[] {\n const out: ReferencingConstraint[] = [];\n for (const schema of env.ctx.state.schemas.values()) {\n for (const t of schema.tables.values()) {\n for (const con of t.constraints) {\n if (con.kind === \"foreign_key\" && con.refSchema === table.schema && con.refTable === table.name) {\n out.push({ table: t, constraint: con });\n }\n }\n }\n }\n return out;\n}\n\nexport function fullRowCheck(env: ExecEnv, table: TableData, row: Datum[], selfIdx: number): void {\n checkNotNull(env, table, row);\n checkChecks(env, table, row);\n checkUnique(env, table, row, selfIdx);\n checkForeignKeys(env, table, row);\n}\n", "import { unsupported } from \"../errors/error.ts\";\nimport type { TableData, TriggerMeta } from \"../storage/database-state.ts\";\nimport type { Datum } from \"../types/value.ts\";\nimport type { ExecEnv } from \"./relation.ts\";\n\nexport type TriggerEvent = \"insert\" | \"update\" | \"delete\";\n\nexport interface TriggerFireResult {\n /** null = row operation skipped (BEFORE trigger returned NULL) */\n row: Datum[] | null;\n}\n\nfunction matches(t: TriggerMeta, event: TriggerEvent): boolean {\n return t.events.some((e) => e.event === event);\n}\n\n/**\n * Fire row-level triggers for one row. Trigger function bodies execute via\n * the plpgsql-lite interpreter in triggers-exec.ts (registered lazily).\n */\nexport type TriggerExecutor = (\n env: ExecEnv,\n table: TableData,\n trigger: TriggerMeta,\n event: TriggerEvent,\n oldRow: Datum[] | null,\n newRow: Datum[] | null,\n) => Datum[] | null;\n\nlet executor: TriggerExecutor | null = null;\n\nexport function setTriggerExecutor(e: TriggerExecutor): void {\n executor = e;\n}\n\nexport function fireRowTriggers(\n env: ExecEnv,\n table: TableData,\n timing: \"before\" | \"after\" | \"instead_of\",\n event: TriggerEvent,\n oldRow: Datum[] | null,\n newRow: Datum[] | null,\n): TriggerFireResult {\n let row = newRow ?? oldRow;\n for (const t of table.triggers) {\n if (t.timing !== timing || !matches(t, event) || !t.forEachRow) continue;\n if (!executor) throw unsupported(`trigger \"${t.name}\" execution`);\n const result = executor(env, table, t, event, oldRow, timing === \"before\" ? row : newRow);\n if (timing === \"before\") {\n if (result === null) return { row: null };\n row = result;\n }\n }\n return { row };\n}\n\nexport function hasRowTriggers(\n table: TableData,\n timing: \"before\" | \"after\" | \"instead_of\",\n event: TriggerEvent,\n): boolean {\n return table.triggers.some((t) => t.timing === timing && matches(t, event) && t.forEachRow);\n}\n", "import type {\n DeleteStmt,\n Expr,\n InsertStmt,\n OnConflictClause,\n SelectStmt,\n SelectTarget,\n UpdateSet,\n UpdateStmt,\n} from \"../ast/nodes.ts\";\nimport {\n checkChecks,\n checkForeignKeys,\n checkNotNull,\n checkUnique,\n findConflict,\n referencingConstraints,\n uniqueSpecsFor,\n} from \"../constraints/enforce.ts\";\nimport { pgError, unsupported } from \"../errors/error.ts\";\nimport { applyDomainChecks } from \"../expressions/eval.ts\";\nimport { sequenceNextval } from \"../functions/misc-fns.ts\";\nimport type { ColumnMeta, TableData } from \"../storage/database-state.ts\";\nimport { castTo } from \"../types/cast.ts\";\nimport { datumKey } from \"../types/compare.ts\";\nimport { type Datum, type TypedValue, type TypeId, tv, UNKNOWN } from \"../types/value.ts\";\nimport { commandResult, type ExecEnv, type ExecResult, inferColumnName, type Relation, RowScope } from \"./relation.ts\";\nimport { applyWith, buildFrom, evalPredicate, evalScalar, executeSelectStmt } from \"./select.ts\";\nimport { fireRowTriggers } from \"./triggers.ts\";\n\n// ---------------------------------------------------------------------------\n// helpers\n// ---------------------------------------------------------------------------\n\nfunction requireTargetTable(env: ExecEnv, parts: string[], verb: string): TableData {\n const state = env.ctx.state;\n const table = state.findTable(parts);\n if (table) return table;\n const view = state.findView(parts);\n if (view) {\n throw pgError(\"wrong_object_type\", `cannot ${verb} view \"${view.name}\"`, \"42809\");\n }\n throw pgError(\"undefined_table\", `relation \"${parts.join(\".\")}\" does not exist`, \"42P01\");\n}\n\nfunction tableRowScope(env: ExecEnv, table: TableData, label: string, row: Datum[]): RowScope {\n const cols = table.columns.map((c) => ({ name: c.name, type: c.type.id, table: label }));\n return new RowScope(cols, row, env.outer, new Set([label]));\n}\n\n/** cast an expression result for assignment to a column */\nfunction coerceToColumn(env: ExecEnv, v: TypedValue, col: ColumnMeta): Datum {\n const ctx = env.ctx;\n const out = castTo(ctx, v, col.type.id, { assignment: true, mod: col.type.mod });\n if (col.domain) {\n applyDomainChecks(ctx, col.domain, out);\n }\n return out.v;\n}\n\nfunction columnDefault(env: ExecEnv, _table: TableData, col: ColumnMeta): Datum {\n if (col.identity) {\n const seq = env.ctx.state.findSequence(col.identity.sequence.split(\".\"));\n if (!seq) throw pgError(\"undefined_object\", `sequence for identity column \"${col.name}\" not found`, \"42704\");\n const next = sequenceNextval(env.ctx, seq);\n return castTo(env.ctx, tv(\"int8\", next), col.type.id, {}).v;\n }\n if (col.defaultExpr) {\n const v = evalScalar(env, null, col.defaultExpr);\n return coerceToColumn(env, v, col);\n }\n return null;\n}\n\nfunction computeGeneratedColumns(env: ExecEnv, table: TableData, row: Datum[]): void {\n for (let i = 0; i < table.columns.length; i++) {\n const col = table.columns[i]!;\n if (!col.generated) continue;\n const scope = tableRowScope(env, table, table.name, row);\n const v = evalScalar(env, scope, col.generated);\n row[i] = coerceToColumn(env, v, col);\n }\n}\n\nfunction evalReturning(\n env: ExecEnv,\n table: TableData,\n label: string,\n targets: SelectTarget[],\n rows: Datum[][],\n command: string,\n): ExecResult {\n // expand stars against the table's columns\n interface Item {\n name: string;\n expr: Expr | null;\n colIdx: number;\n }\n const items: Item[] = [];\n for (const t of targets) {\n if (t.expr.type === \"star\") {\n for (let i = 0; i < table.columns.length; i++) {\n items.push({ name: table.columns[i]!.name, expr: null, colIdx: i });\n }\n continue;\n }\n items.push({ name: t.alias ?? inferColumnName(t.expr), expr: t.expr, colIdx: -1 });\n }\n const columns = items.map((it) => ({\n name: it.name,\n type: it.colIdx >= 0 ? table.columns[it.colIdx]!.type.id : (UNKNOWN as TypeId),\n }));\n const outRows: Datum[][] = [];\n for (const row of rows) {\n const scope = tableRowScope(env, table, label, row);\n const out: Datum[] = [];\n for (let k = 0; k < items.length; k++) {\n const it = items[k]!;\n if (it.colIdx >= 0) {\n out.push(row[it.colIdx] ?? null);\n } else {\n const v = evalScalar(env, scope, it.expr!);\n if (columns[k]!.type === UNKNOWN) columns[k]!.type = v.t;\n out.push(v.v);\n }\n }\n outRows.push(out);\n }\n for (const c of columns) {\n if (c.type === UNKNOWN) c.type = \"text\";\n }\n return { columns, rows: outRows, command, rowCount: rows.length };\n}\n\n// ---------------------------------------------------------------------------\n// INSERT\n// ---------------------------------------------------------------------------\n\nfunction insertTargetColumns(env: ExecEnv, table: TableData, stmt: InsertStmt): number[] {\n if (stmt.columns) {\n const seen = new Set<string>();\n return stmt.columns.map((name) => {\n const i = table.columnIndex(name);\n if (i === -1) {\n throw pgError(\"undefined_column\", `column \"${name}\" of relation \"${table.name}\" does not exist`, \"42703\");\n }\n if (seen.has(name)) {\n throw pgError(\"duplicate_column\", `column \"${name}\" specified more than once`, \"42701\");\n }\n seen.add(name);\n const col = table.columns[i]!;\n if (col.generated) {\n throw pgError(\"generated_always\", `cannot insert a non-DEFAULT value into column \"${name}\"`, \"428C9\");\n }\n return i;\n });\n }\n void env;\n // all non-generated columns in table order\n const idxs: number[] = [];\n for (let i = 0; i < table.columns.length; i++) {\n if (!table.columns[i]!.generated) idxs.push(i);\n }\n return idxs;\n}\n\n/** DEFAULT keyword marker in a VALUES row */\nconst DEFAULT_MARKER = Symbol(\"default\");\ntype SourceCell = TypedValue | typeof DEFAULT_MARKER;\n\n/** source rows; handles bare VALUES lists so the DEFAULT keyword works */\nfunction insertSourceRows(env: ExecEnv, stmt: InsertStmt, colIdxs: number[]): SourceCell[][] {\n if (stmt.source === \"default_values\") {\n return [[]];\n }\n const src = stmt.source;\n const isBareValues = src.body.type === \"values\" && !src.with && src.orderBy.length === 0 && !src.limit && !src.offset;\n if (isBareValues && src.body.type === \"values\") {\n const rows: SourceCell[][] = [];\n for (const exprRow of src.body.rows) {\n if (exprRow.length > colIdxs.length) {\n throw pgError(\"syntax\", \"INSERT has more expressions than target columns\", \"42601\");\n }\n const vals: SourceCell[] = exprRow.map((e) => {\n if (e.type === \"default_expr\") return DEFAULT_MARKER;\n return evalScalar(env, env.outer, e);\n });\n rows.push(vals);\n }\n return rows;\n }\n const rel = executeSelectStmt(env, src);\n if (rel.columns.length > colIdxs.length) {\n throw pgError(\"syntax\", \"INSERT has more expressions than target columns\", \"42601\");\n }\n return rel.rows.map((r) =>\n r.map((v, i) => {\n const t = rel.columns[i]!.type;\n return tv(t === UNKNOWN ? \"text\" : t, v);\n }),\n );\n}\n\ninterface ArbiterMatch {\n spec: ReturnType<typeof uniqueSpecsFor>[number];\n}\n\nfunction resolveArbiters(env: ExecEnv, table: TableData, clause: OnConflictClause): ArbiterMatch[] {\n const specs = uniqueSpecsFor(env, table);\n if (!clause.target) {\n if (clause.action === \"nothing\") return specs.map((spec) => ({ spec }));\n throw pgError(\"syntax\", \"ON CONFLICT DO UPDATE requires inference specification or constraint name\", \"42601\");\n }\n if (\"constraint\" in clause.target) {\n const name = clause.target.constraint;\n const spec = specs.find((s) => s.name === name);\n if (!spec) {\n throw pgError(\"undefined_object\", `constraint \"${name}\" for table \"${table.name}\" does not exist`, \"42704\");\n }\n return [{ spec }];\n }\n const wanted = clause.target.columns.map((e) => {\n if (e.type === \"colref\" && e.parts.length === 1) return e.parts[0]!;\n throw unsupported(\"ON CONFLICT expression inference targets\");\n });\n const sorted = [...wanted].sort();\n const matches = specs.filter((s) => {\n const names = [...s.columnNames].sort();\n return names.length === sorted.length && names.every((n, i) => n === sorted[i]);\n });\n if (matches.length === 0) {\n throw pgError(\n \"invalid_column_reference\",\n \"there is no unique or exclusion constraint matching the ON CONFLICT specification\",\n \"42P10\",\n );\n }\n return matches.map((spec) => ({ spec }));\n}\n\nfunction applyOnConflictUpdate(\n env: ExecEnv,\n table: TableData,\n label: string,\n existingIdx: number,\n newRow: Datum[],\n sets: UpdateSet[],\n where: Expr | null,\n): boolean {\n const existing = table.rows[existingIdx]!;\n // scope: target table columns visible under its alias/name, plus excluded.*\n const cols = [\n ...table.columns.map((c) => ({ name: c.name, type: c.type.id, table: label })),\n ...table.columns.map((c) => ({ name: c.name, type: c.type.id, table: \"excluded\" })),\n ];\n const scope = new RowScope(cols, [...existing, ...newRow], env.outer, new Set([label, \"excluded\"]));\n if (where && !evalPredicate(env, scope, where)) return false;\n\n const updated = existing.slice();\n applyUpdateSets(env, table, sets, scope, updated);\n computeGeneratedColumns(env, table, updated);\n table.rows[existingIdx] = updated;\n checkNotNull(env, table, updated);\n checkChecks(env, table, updated);\n checkUnique(env, table, updated, existingIdx);\n checkForeignKeys(env, table, updated);\n handleReferencedUpdate(env, table, [existing], [updated]);\n return true;\n}\n\nexport function executeInsert(env0: ExecEnv, stmt: InsertStmt): ExecResult {\n const env = applyWith(env0, stmt.with);\n const table = requireTargetTable(env, stmt.table, \"insert into\");\n const label = stmt.alias ?? table.name;\n const colIdxs = insertTargetColumns(env, table, stmt);\n const sourceRows = insertSourceRows(env, stmt, colIdxs);\n\n const insertedRows: Datum[][] = [];\n let insertedCount = 0;\n\n for (const srcRow of sourceRows) {\n // assemble the full row\n const row: Datum[] = table.columns.map(() => null);\n const provided = new Set<number>();\n for (let k = 0; k < srcRow.length; k++) {\n const ci = colIdxs[k]!;\n const col = table.columns[ci]!;\n const cell = srcRow[k]!;\n if (cell === DEFAULT_MARKER) {\n row[ci] = columnDefault(env, table, col);\n provided.add(ci);\n continue;\n }\n if (col.identity?.always && stmt.overriding !== \"system\") {\n throw pgError(\"generated_always\", `cannot insert a non-DEFAULT value into column \"${col.name}\"`, \"428C9\");\n }\n row[ci] = coerceToColumn(env, cell, col);\n provided.add(ci);\n }\n for (let i = 0; i < table.columns.length; i++) {\n if (provided.has(i)) continue;\n const col = table.columns[i]!;\n if (col.generated) continue; // computed below\n row[i] = columnDefault(env, table, col);\n }\n\n // BEFORE triggers\n const fired = fireRowTriggers(env, table, \"before\", \"insert\", null, row);\n if (fired.row === null) continue;\n const newRow = fired.row;\n\n computeGeneratedColumns(env, table, newRow);\n\n // ON CONFLICT arbiter check\n if (stmt.onConflict) {\n const arbiters = resolveArbiters(env, table, stmt.onConflict);\n let conflictIdx: number | null = null;\n let conflictWhereOk = true;\n for (const a of arbiters) {\n if (\n \"columns\" in (stmt.onConflict.target ?? {}) &&\n stmt.onConflict.target &&\n \"columns\" in stmt.onConflict.target &&\n stmt.onConflict.target.where\n ) {\n // conflict_target WHERE clause constrains the arbiter (partial indexes)\n const scope = tableRowScope(env, table, label, newRow);\n conflictWhereOk = evalPredicate(env, scope, stmt.onConflict.target.where);\n }\n const idx = findConflict(env, table, a.spec, newRow);\n if (idx !== null) {\n conflictIdx = idx;\n break;\n }\n }\n if (conflictIdx !== null && conflictWhereOk) {\n if (stmt.onConflict.action === \"nothing\") continue;\n const did = applyOnConflictUpdate(\n env,\n table,\n label,\n conflictIdx,\n newRow,\n stmt.onConflict.action.sets,\n stmt.onConflict.action.where,\n );\n if (did) {\n insertedCount++;\n insertedRows.push(table.rows[conflictIdx]!);\n fireRowTriggers(env, table, \"after\", \"update\", null, table.rows[conflictIdx]!);\n }\n continue;\n }\n }\n\n checkNotNull(env, table, newRow);\n checkChecks(env, table, newRow);\n table.rows.push(newRow);\n try {\n checkUnique(env, table, newRow, table.rows.length - 1);\n checkForeignKeys(env, table, newRow);\n } catch (err) {\n table.rows.pop();\n throw err;\n }\n insertedCount++;\n insertedRows.push(newRow);\n fireRowTriggers(env, table, \"after\", \"insert\", null, newRow);\n }\n\n env.ctx.state.changes = insertedCount;\n if (stmt.returning) {\n const res = evalReturning(env, table, label, stmt.returning, insertedRows, \"INSERT\");\n return { ...res, rowCount: insertedCount };\n }\n return commandResult(\"INSERT\", insertedCount);\n}\n\n// ---------------------------------------------------------------------------\n// UPDATE\n// ---------------------------------------------------------------------------\n\nfunction applyUpdateSets(env: ExecEnv, table: TableData, sets: UpdateSet[], scope: RowScope, row: Datum[]): void {\n for (const set of sets) {\n if (set.columns.some((c) => c.subscripts !== null || c.fields.length > 0)) {\n throw unsupported(\"UPDATE with subscripted or field-qualified target columns\");\n }\n const colIdxs = set.columns.map((c) => {\n const i = table.columnIndex(c.name);\n if (i === -1) {\n throw pgError(\"undefined_column\", `column \"${c.name}\" of relation \"${table.name}\" does not exist`, \"42703\");\n }\n if (table.columns[i]!.generated) {\n throw pgError(\"generated_always\", `column \"${c.name}\" can only be updated to DEFAULT`, \"428C9\");\n }\n return i;\n });\n\n if (typeof set.value === \"object\" && \"kind\" in set.value && set.value.kind === \"row_subquery\") {\n const rel = executeSelectStmt(\n { ctx: env.ctx, params: env.params, ctes: env.ctes, outer: scope },\n set.value.query,\n );\n if (rel.rows.length > 1) {\n throw pgError(\n \"cardinality_violation\",\n \"more than one row returned by a subquery used as an expression\",\n \"21000\",\n );\n }\n const srcRow = rel.rows[0] ?? null;\n for (let k = 0; k < colIdxs.length; k++) {\n const col = table.columns[colIdxs[k]!]!;\n const v = srcRow === null ? tv(col.type.id, null) : tv(rel.columns[k]?.type ?? \"text\", srcRow[k] ?? null);\n row[colIdxs[k]!] = coerceToColumn(env, v.t === UNKNOWN ? tv(\"text\", v.v) : v, col);\n }\n continue;\n }\n if (typeof set.value === \"object\" && \"kind\" in set.value && set.value.kind === \"row_values\") {\n if (set.value.items.length !== colIdxs.length) {\n throw pgError(\"syntax\", \"number of columns does not match number of values\", \"42601\");\n }\n for (let k = 0; k < colIdxs.length; k++) {\n const col = table.columns[colIdxs[k]!]!;\n const e = set.value.items[k]!;\n if (e.type === \"default_expr\") {\n row[colIdxs[k]!] = columnDefault(env, table, col);\n } else {\n const v = evalScalar(env, scope, e);\n row[colIdxs[k]!] = coerceToColumn(env, v, col);\n }\n }\n continue;\n }\n // single expression\n const e = set.value as Expr;\n const col = table.columns[colIdxs[0]!]!;\n if (e.type === \"default_expr\") {\n row[colIdxs[0]!] = columnDefault(env, table, col);\n } else {\n const v = evalScalar(env, scope, e);\n row[colIdxs[0]!] = coerceToColumn(env, v, col);\n }\n }\n}\n\nexport function executeUpdate(env0: ExecEnv, stmt: UpdateStmt): ExecResult {\n if (stmt.whereCurrentOf) throw unsupported(\"WHERE CURRENT OF\");\n const env = applyWith(env0, stmt.with);\n const table = requireTargetTable(env, stmt.table, \"update\");\n const label = stmt.alias ?? table.name;\n\n // FROM items build an auxiliary relation each target row can join against\n const fromSource = stmt.from.length > 0 ? buildFrom(env, stmt.from) : null;\n\n const targetCols = table.columns.map((c) => ({ name: c.name, type: c.type.id, table: label }));\n const updatedRows: Datum[][] = [];\n let updateCount = 0;\n\n for (let ri = 0; ri < table.rows.length; ri++) {\n const oldRow = table.rows[ri]!;\n let matchScope: RowScope | null = null;\n\n if (fromSource) {\n // find the first FROM row satisfying WHERE\n let found = false;\n for (const frow of fromSource.rel.rows) {\n const cols = [...targetCols, ...fromSource.rel.columns];\n const scope = new RowScope(cols, [...oldRow, ...frow], env.outer, new Set([label, ...fromSource.rangeVars]));\n if (!stmt.where || evalPredicate(env, scope, stmt.where)) {\n matchScope = scope;\n found = true;\n break;\n }\n }\n if (!found) continue;\n } else {\n const scope = new RowScope(targetCols, oldRow, env.outer, new Set([label]));\n if (stmt.where && !evalPredicate(env, scope, stmt.where)) continue;\n matchScope = scope;\n }\n\n const newRow = oldRow.slice();\n applyUpdateSets(env, table, stmt.sets, matchScope!, newRow);\n\n const fired = fireRowTriggers(env, table, \"before\", \"update\", oldRow, newRow);\n if (fired.row === null) continue;\n const finalRow = fired.row;\n\n computeGeneratedColumns(env, table, finalRow);\n table.rows[ri] = finalRow;\n try {\n checkNotNull(env, table, finalRow);\n checkChecks(env, table, finalRow);\n checkUnique(env, table, finalRow, ri);\n checkForeignKeys(env, table, finalRow);\n } catch (err) {\n table.rows[ri] = oldRow;\n throw err;\n }\n handleReferencedUpdate(env, table, [oldRow], [finalRow]);\n updateCount++;\n updatedRows.push(finalRow);\n fireRowTriggers(env, table, \"after\", \"update\", oldRow, finalRow);\n }\n\n env.ctx.state.changes = updateCount;\n if (stmt.returning) {\n const res = evalReturning(env, table, label, stmt.returning, updatedRows, \"UPDATE\");\n return { ...res, rowCount: updateCount };\n }\n return commandResult(\"UPDATE\", updateCount);\n}\n\n// ---------------------------------------------------------------------------\n// DELETE\n// ---------------------------------------------------------------------------\n\nexport function executeDelete(env0: ExecEnv, stmt: DeleteStmt): ExecResult {\n const env = applyWith(env0, stmt.with);\n const table = requireTargetTable(env, stmt.table, \"delete from\");\n const label = stmt.alias ?? table.name;\n\n const usingSource = stmt.using.length > 0 ? buildFrom(env, stmt.using) : null;\n const targetCols = table.columns.map((c) => ({ name: c.name, type: c.type.id, table: label }));\n\n const toDelete: number[] = [];\n for (let ri = 0; ri < table.rows.length; ri++) {\n const row = table.rows[ri]!;\n let matched: boolean;\n if (usingSource) {\n matched = usingSource.rel.rows.some((urow) => {\n const cols = [...targetCols, ...usingSource.rel.columns];\n const scope = new RowScope(cols, [...row, ...urow], env.outer, new Set([label, ...usingSource.rangeVars]));\n return !stmt.where || evalPredicate(env, scope, stmt.where);\n });\n } else {\n const scope = new RowScope(targetCols, row, env.outer, new Set([label]));\n matched = !stmt.where || evalPredicate(env, scope, stmt.where);\n }\n if (matched) toDelete.push(ri);\n }\n\n const deletedRows: Datum[][] = [];\n // delete from the end to keep indexes stable\n const skipped = new Set<number>();\n for (const ri of toDelete) {\n const fired = fireRowTriggers(env, table, \"before\", \"delete\", table.rows[ri]!, null);\n if (fired.row === null) skipped.add(ri);\n }\n for (let k = toDelete.length - 1; k >= 0; k--) {\n const ri = toDelete[k]!;\n if (skipped.has(ri)) continue;\n const row = table.rows[ri]!;\n handleReferencedDelete(env, table, row, 0);\n table.rows.splice(ri, 1);\n deletedRows.unshift(row);\n }\n for (const row of deletedRows) {\n fireRowTriggers(env, table, \"after\", \"delete\", row, null);\n }\n\n env.ctx.state.changes = deletedRows.length;\n if (stmt.returning) {\n const res = evalReturning(env, table, label, stmt.returning, deletedRows, \"DELETE\");\n return { ...res, rowCount: deletedRows.length };\n }\n return commandResult(\"DELETE\", deletedRows.length);\n}\n\n// ---------------------------------------------------------------------------\n// referential actions\n// ---------------------------------------------------------------------------\n\nconst MAX_FK_DEPTH = 100;\n\nfunction rowKeyFor(table: TableData, row: Datum[], columns: string[]): string | null {\n const parts: string[] = [];\n for (const c of columns) {\n const i = table.columnIndex(c);\n const v = row[i] ?? null;\n if (v === null) return null;\n parts.push(datumKey(table.columns[i]!.type.id, v));\n }\n return parts.join(\"\\u0001\");\n}\n\n/** rows in `ref.table` whose FK points at `key` */\nfunction referencingRowIdxs(ref: ReturnType<typeof referencingConstraints>[number], key: string): number[] {\n const { table: rt, constraint: con } = ref;\n const out: number[] = [];\n for (let i = 0; i < rt.rows.length; i++) {\n const k = rowKeyFor(rt, rt.rows[i]!, con.columns);\n if (k === key) out.push(i);\n }\n return out;\n}\n\nexport function handleReferencedDelete(env: ExecEnv, table: TableData, row: Datum[], depth: number): void {\n if (depth > MAX_FK_DEPTH) {\n throw pgError(\"program_limit_exceeded\", \"foreign key cascade depth exceeded\", \"54001\");\n }\n for (const ref of referencingConstraints(env, table)) {\n const con = ref.constraint;\n const key = rowKeyFor(table, row, con.refColumns);\n if (key === null) continue;\n const idxs = referencingRowIdxs(ref, key);\n if (idxs.length === 0) continue;\n const action = con.onDelete ?? \"no_action\";\n switch (action) {\n case \"cascade\": {\n for (let k = idxs.length - 1; k >= 0; k--) {\n const childRow = ref.table.rows[idxs[k]!]!;\n handleReferencedDelete(env, ref.table, childRow, depth + 1);\n ref.table.rows.splice(idxs[k]!, 1);\n }\n break;\n }\n case \"set_null\": {\n for (const i of idxs) {\n const newRow = ref.table.rows[i]!.slice();\n for (const c of con.columns) {\n newRow[ref.table.columnIndex(c)] = null;\n }\n ref.table.rows[i] = newRow;\n checkNotNull(env, ref.table, newRow);\n checkChecks(env, ref.table, newRow);\n }\n break;\n }\n case \"set_default\": {\n for (const i of idxs) {\n const newRow = ref.table.rows[i]!.slice();\n for (const c of con.columns) {\n const ci = ref.table.columnIndex(c);\n newRow[ci] = columnDefault(env, ref.table, ref.table.columns[ci]!);\n }\n ref.table.rows[i] = newRow;\n checkNotNull(env, ref.table, newRow);\n checkChecks(env, ref.table, newRow);\n checkForeignKeys(env, ref.table, newRow);\n }\n break;\n }\n default:\n throw pgError(\n \"constraint_foreign_key\",\n `update or delete on table \"${table.name}\" violates foreign key constraint \"${con.name}\" on table \"${ref.table.name}\"`,\n \"23503\",\n );\n }\n }\n}\n\nexport function handleReferencedUpdate(env: ExecEnv, table: TableData, oldRows: Datum[][], newRows: Datum[][]): void {\n for (const ref of referencingConstraints(env, table)) {\n const con = ref.constraint;\n for (let r = 0; r < oldRows.length; r++) {\n const oldKey = rowKeyFor(table, oldRows[r]!, con.refColumns);\n const newKey = rowKeyFor(table, newRows[r]!, con.refColumns);\n if (oldKey === null || oldKey === newKey) continue;\n const idxs = referencingRowIdxs(ref, oldKey);\n if (idxs.length === 0) continue;\n const action = con.onUpdate ?? \"no_action\";\n switch (action) {\n case \"cascade\": {\n for (const i of idxs) {\n const newRow = ref.table.rows[i]!.slice();\n for (let c = 0; c < con.columns.length; c++) {\n const localIdx = ref.table.columnIndex(con.columns[c]!);\n const refIdx = table.columnIndex(con.refColumns[c]!);\n newRow[localIdx] = newRows[r]![refIdx] ?? null;\n }\n ref.table.rows[i] = newRow;\n checkChecks(env, ref.table, newRow);\n }\n break;\n }\n case \"set_null\": {\n for (const i of idxs) {\n const newRow = ref.table.rows[i]!.slice();\n for (const c of con.columns) newRow[ref.table.columnIndex(c)] = null;\n ref.table.rows[i] = newRow;\n checkNotNull(env, ref.table, newRow);\n }\n break;\n }\n case \"set_default\": {\n for (const i of idxs) {\n const newRow = ref.table.rows[i]!.slice();\n for (const c of con.columns) {\n const ci = ref.table.columnIndex(c);\n newRow[ci] = columnDefault(env, ref.table, ref.table.columns[ci]!);\n }\n ref.table.rows[i] = newRow;\n checkForeignKeys(env, ref.table, newRow);\n }\n break;\n }\n default:\n throw pgError(\n \"constraint_foreign_key\",\n `update or delete on table \"${table.name}\" violates foreign key constraint \"${con.name}\" on table \"${ref.table.name}\"`,\n \"23503\",\n );\n }\n }\n }\n}\n\nexport type { Relation, SelectStmt };\n", "import type {\n CopyStmt,\n DeallocateStmt,\n ExecuteStmt,\n ExplainStmt,\n Expr,\n InsertStmt,\n PrepareStmt,\n ResetStmt,\n SetStmt,\n ShowStmt,\n TransactionStmt,\n} from \"../ast/nodes.ts\";\nimport { pgError, unsupported } from \"../errors/error.ts\";\nimport { Prng } from \"../runtime/prng.ts\";\nimport { DatabaseState } from \"../storage/database-state.ts\";\nimport { TransactionManager } from \"../transactions/manager.ts\";\nimport { castTo } from \"../types/cast.ts\";\nimport { resolveTypeName } from \"../types/resolve.ts\";\nimport { type Datum, datumText, tv, UNKNOWN } from \"../types/value.ts\";\nimport { executeInsert } from \"./dml.ts\";\nimport { commandResult, type ExecEnv, type ExecResult } from \"./relation.ts\";\nimport { evalScalar, executeSelectStmt, runStatement } from \"./select.ts\";\n\n// ---------------------------------------------------------------------------\n// transaction manager registry (one per database state)\n// ---------------------------------------------------------------------------\n\nconst txManagers = new WeakMap<DatabaseState, TransactionManager>();\n\nexport function txManagerFor(state: DatabaseState): TransactionManager {\n let tx = txManagers.get(state);\n if (!tx) {\n tx = new TransactionManager(state);\n txManagers.set(state, tx);\n }\n return tx;\n}\n\nexport function executeTransaction(env: ExecEnv, stmt: TransactionStmt): ExecResult {\n const tx = txManagerFor(env.ctx.state);\n switch (stmt.action) {\n case \"begin\":\n tx.begin();\n return commandResult(\"BEGIN\", 0);\n case \"commit\":\n tx.commit();\n return commandResult(\"COMMIT\", 0);\n case \"rollback\":\n tx.rollback();\n return commandResult(\"ROLLBACK\", 0);\n case \"savepoint\":\n tx.savepoint(stmt.savepointName!);\n return commandResult(\"SAVEPOINT\", 0);\n case \"release\":\n tx.releaseSavepoint(stmt.savepointName!);\n return commandResult(\"RELEASE\", 0);\n case \"rollback_to\":\n tx.rollbackToSavepoint(stmt.savepointName!);\n return commandResult(\"ROLLBACK\", 0);\n }\n}\n\n// ---------------------------------------------------------------------------\n// SET / SHOW / RESET\n// ---------------------------------------------------------------------------\n\nlet defaultSettings: Map<string, string> | null = null;\n\nfunction getDefaultSettings(): Map<string, string> {\n if (!defaultSettings) {\n const probe = new DatabaseState(new Prng(1), () => new Date(0));\n defaultSettings = new Map(probe.settings);\n }\n return defaultSettings;\n}\n\nfunction canonicalGucName(name: string): string {\n const n = name.toLowerCase();\n if (n === \"time zone\" || n === \"timezone\") return \"timezone\";\n if (n === \"session characteristics as transaction isolation level\") return \"transaction_isolation\";\n return n;\n}\n\n/** display name PG uses in SHOW output */\nfunction showColumnName(guc: string): string {\n switch (guc) {\n case \"timezone\":\n return \"TimeZone\";\n case \"datestyle\":\n return \"DateStyle\";\n case \"intervalstyle\":\n return \"IntervalStyle\";\n default:\n return guc;\n }\n}\n\nfunction isKnownGuc(name: string): boolean {\n return getDefaultSettings().has(name) || name.includes(\".\");\n}\n\nexport function executeSet(env: ExecEnv, stmt: SetStmt): ExecResult {\n const state = env.ctx.state;\n const name = canonicalGucName(stmt.name);\n if (!isKnownGuc(name) && !state.settings.has(name)) {\n throw pgError(\"undefined_object\", `unrecognized configuration parameter \"${stmt.name}\"`, \"42704\");\n }\n const target = stmt.local ? state.localSettings : state.settings;\n if (stmt.local && !txManagerFor(state).inTransaction) {\n // SET LOCAL outside a transaction is a no-op with a warning in PG\n return commandResult(\"SET\", 0);\n }\n if (stmt.value === null) {\n // SET x TO DEFAULT\n const dflt = getDefaultSettings().get(name);\n if (dflt !== undefined) target.set(name, dflt);\n else target.delete(name);\n return commandResult(\"SET\", 0);\n }\n target.set(name, stmt.value);\n return commandResult(\"SET\", 0);\n}\n\nexport function executeShow(env: ExecEnv, stmt: ShowStmt): ExecResult {\n const state = env.ctx.state;\n const name = canonicalGucName(stmt.name);\n if (name === \"all\") {\n const rows: Datum[][] = [...state.settings.entries()]\n .sort((a, b) => (a[0] < b[0] ? -1 : 1))\n .map(([k, v]) => [k, state.localSettings.get(k) ?? v, \"\"]);\n return {\n columns: [\n { name: \"name\", type: \"text\" },\n { name: \"setting\", type: \"text\" },\n { name: \"description\", type: \"text\" },\n ],\n rows,\n command: \"SHOW\",\n rowCount: rows.length,\n };\n }\n const value = state.getSetting(name);\n if (value === undefined) {\n throw pgError(\"undefined_object\", `unrecognized configuration parameter \"${stmt.name}\"`, \"42704\");\n }\n return {\n columns: [{ name: showColumnName(name), type: \"text\" }],\n rows: [[value]],\n command: \"SHOW\",\n rowCount: 1,\n };\n}\n\nexport function executeReset(env: ExecEnv, stmt: ResetStmt): ExecResult {\n const state = env.ctx.state;\n const name = canonicalGucName(stmt.name);\n if (name === \"all\") {\n state.settings = new Map(getDefaultSettings());\n state.localSettings.clear();\n return commandResult(\"RESET\", 0);\n }\n if (!isKnownGuc(name) && !state.settings.has(name)) {\n throw pgError(\"undefined_object\", `unrecognized configuration parameter \"${stmt.name}\"`, \"42704\");\n }\n const dflt = getDefaultSettings().get(name);\n if (dflt !== undefined) state.settings.set(name, dflt);\n else state.settings.delete(name);\n state.localSettings.delete(name);\n return commandResult(\"RESET\", 0);\n}\n\n// ---------------------------------------------------------------------------\n// PREPARE / EXECUTE / DEALLOCATE\n// ---------------------------------------------------------------------------\n\nexport function executePrepare(env: ExecEnv, stmt: PrepareStmt): ExecResult {\n const state = env.ctx.state;\n if (state.prepared.has(stmt.name)) {\n throw pgError(\"duplicate_prepared_statement\", `prepared statement \"${stmt.name}\" already exists`, \"42P05\");\n }\n state.prepared.set(stmt.name, {\n name: stmt.name,\n argTypes: stmt.argTypes ? stmt.argTypes.map((t) => resolveTypeName(state, t).column.id) : null,\n stmt: stmt.query,\n });\n return commandResult(\"PREPARE\", 0);\n}\n\nexport function executeExecute(env: ExecEnv, stmt: ExecuteStmt): ExecResult {\n const state = env.ctx.state;\n const prep = state.prepared.get(stmt.name);\n if (!prep) {\n throw pgError(\"undefined_prepared_statement\", `prepared statement \"${stmt.name}\" does not exist`, \"26000\");\n }\n const params = stmt.params.map((e, i) => {\n const v = evalScalar(env, null, e);\n const t = prep.argTypes?.[i];\n if (t) return castTo(env.ctx, v, t, {});\n return v.t === UNKNOWN ? tv(\"text\", v.v) : v;\n });\n if (prep.argTypes && params.length !== prep.argTypes.length) {\n throw pgError(\"syntax\", `wrong number of parameters for prepared statement \"${stmt.name}\"`, \"42601\");\n }\n const execEnv: ExecEnv = { ctx: env.ctx, params, ctes: new Map(), outer: null };\n return runStatement(execEnv, prep.stmt);\n}\n\nexport function executeDeallocate(env: ExecEnv, stmt: DeallocateStmt): ExecResult {\n const state = env.ctx.state;\n if (stmt.name === null) {\n state.prepared.clear();\n return commandResult(\"DEALLOCATE ALL\", 0);\n }\n if (!state.prepared.delete(stmt.name)) {\n throw pgError(\"undefined_prepared_statement\", `prepared statement \"${stmt.name}\" does not exist`, \"26000\");\n }\n return commandResult(\"DEALLOCATE\", 0);\n}\n\n// ---------------------------------------------------------------------------\n// EXPLAIN (stub plans, documented divergence) / COPY\n// ---------------------------------------------------------------------------\n\nexport function executeExplain(env: ExecEnv, stmt: ExplainStmt): ExecResult {\n if (stmt.analyze) {\n runStatement(env, stmt.query);\n }\n const kind = stmt.query.type === \"select\" ? \"Seq Scan\" : \"ModifyTable\";\n const lines = [`${kind} (cost=0.00..0.00 rows=0 width=0)`];\n return {\n columns: [{ name: \"QUERY PLAN\", type: \"text\" }],\n rows: lines.map((l) => [l]),\n command: \"EXPLAIN\",\n rowCount: lines.length,\n };\n}\n\n/** text-format COPY escaping */\nfunction copyEscape(s: string): string {\n return s.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"\\n\", \"\\\\n\").replaceAll(\"\\r\", \"\\\\r\").replaceAll(\"\\t\", \"\\\\t\");\n}\n\nexport function executeCopy(env: ExecEnv, stmt: CopyStmt): ExecResult {\n const format = String(stmt.options.format ?? \"text\").toLowerCase();\n if (format !== \"text\" && format !== \"csv\") {\n throw unsupported(`COPY format ${format}`);\n }\n if (stmt.direction === \"to\") {\n let columns: Array<{ name: string; type: import(\"../types/value.ts\").TypeId }>;\n let rows: Datum[][];\n if (stmt.query) {\n const res = runStatement(env, stmt.query);\n columns = res.columns;\n rows = res.rows;\n } else {\n const table = env.ctx.state.findTable(stmt.table!);\n if (!table) {\n throw pgError(\"undefined_table\", `relation \"${stmt.table!.join(\".\")}\" does not exist`, \"42P01\");\n }\n const idxs = stmt.columns\n ? stmt.columns.map((c) => {\n const i = table.columnIndex(c);\n if (i === -1) {\n throw pgError(\"undefined_column\", `column \"${c}\" of relation \"${table.name}\" does not exist`, \"42703\");\n }\n return i;\n })\n : table.columns.map((_, i) => i);\n columns = idxs.map((i) => ({ name: table.columns[i]!.name, type: table.columns[i]!.type.id }));\n rows = table.rows.map((r) => idxs.map((i) => r[i] ?? null));\n }\n const delim = format === \"csv\" ? \",\" : \"\\t\";\n const nullStr = String(stmt.options.null ?? (format === \"csv\" ? \"\" : \"\\\\N\"));\n const lines = rows.map((r) =>\n r\n .map((v, i) => {\n if (v === null) return nullStr;\n const text = datumText(columns[i]!.type === UNKNOWN ? \"text\" : columns[i]!.type, v, env.ctx);\n if (format === \"csv\") {\n return /[\",\\n\\r]/.test(text) ? `\"${text.replaceAll('\"', '\"\"')}\"` : text;\n }\n return copyEscape(text);\n })\n .join(delim),\n );\n return {\n columns: [{ name: \"copy\", type: \"text\" }],\n rows: lines.map((l) => [l]),\n command: `COPY ${rows.length}`,\n rowCount: rows.length,\n };\n }\n // COPY FROM stdin: data arrives via the API-level hook (Database.copyFrom)\n throw unsupported(\"COPY FROM STDIN without api-provided data\");\n}\n\n/** Unescape one text-format COPY field. */\nfunction copyUnescape(s: string): string {\n let out = \"\";\n for (let i = 0; i < s.length; i++) {\n const c = s[i]!;\n if (c !== \"\\\\\") {\n out += c;\n continue;\n }\n const n = s[++i];\n switch (n) {\n case \"n\":\n out += \"\\n\";\n break;\n case \"t\":\n out += \"\\t\";\n break;\n case \"r\":\n out += \"\\r\";\n break;\n case \"b\":\n out += \"\\b\";\n break;\n case \"f\":\n out += \"\\f\";\n break;\n case \"v\":\n out += \"\\v\";\n break;\n case undefined:\n break;\n default:\n out += n;\n }\n }\n return out;\n}\n\nfunction parseCsvLine(line: string, delim: string, quote: string): (string | { quoted: string })[] {\n const fields: (string | { quoted: string })[] = [];\n let i = 0;\n while (true) {\n if (line[i] === quote) {\n let val = \"\";\n i++;\n for (;;) {\n if (i >= line.length) throw pgError(\"invalid_text_representation\", \"unterminated CSV quoted field\", \"22P04\");\n if (line[i] === quote) {\n if (line[i + 1] === quote) {\n val += quote;\n i += 2;\n } else {\n i++;\n break;\n }\n } else {\n val += line[i];\n i++;\n }\n }\n fields.push({ quoted: val });\n } else {\n let val = \"\";\n while (i < line.length && line[i] !== delim) {\n val += line[i];\n i++;\n }\n fields.push(val);\n }\n if (i >= line.length) break;\n i++; // skip delimiter\n }\n return fields;\n}\n\n/**\n * Execute COPY ... FROM STDIN with api-provided text/csv data by synthesizing\n * an INSERT (reuses defaults, identity, constraints, FK actions, triggers).\n */\nexport function executeCopyFromData(env: ExecEnv, stmt: CopyStmt, data: string): ExecResult {\n const format = String(stmt.options.format ?? \"text\").toLowerCase();\n if (format !== \"text\" && format !== \"csv\") throw unsupported(`COPY format ${format}`);\n if (stmt.direction !== \"from\" || stmt.table === null) {\n throw pgError(\"syntax\", \"COPY FROM requires a table\", \"42601\");\n }\n const delim = String(stmt.options.delimiter ?? (format === \"csv\" ? \",\" : \"\\t\"));\n const nullStr = String(stmt.options.null ?? (format === \"csv\" ? \"\" : \"\\\\N\"));\n const quote = String(stmt.options.quote ?? '\"');\n const header = stmt.options.header === true || String(stmt.options.header ?? \"\").toLowerCase() === \"true\";\n\n let lines = data.split(/\\r?\\n/);\n // trailing newline yields an empty last line; \"\\.\" terminates the stream\n const endMarker = lines.indexOf(\"\\\\.\");\n if (endMarker !== -1) lines = lines.slice(0, endMarker);\n if (lines.length > 0 && lines[lines.length - 1] === \"\") lines = lines.slice(0, -1);\n if (header && lines.length > 0) lines = lines.slice(1);\n\n const valueRows: Expr[][] = lines.map((line) => {\n let cells: Expr[];\n if (format === \"csv\") {\n cells = parseCsvLine(line, delim, quote).map((f) => {\n if (typeof f !== \"string\") return { type: \"string_lit\", value: f.quoted } as Expr;\n if (f === nullStr) return { type: \"null_lit\" } as Expr;\n return { type: \"string_lit\", value: f } as Expr;\n });\n } else {\n cells = line.split(delim).map((f) => {\n if (f === nullStr) return { type: \"null_lit\" } as Expr;\n return { type: \"string_lit\", value: copyUnescape(f) } as Expr;\n });\n }\n return cells;\n });\n\n const insert: InsertStmt = {\n type: \"insert\",\n with: null,\n table: stmt.table,\n alias: null,\n columns: stmt.columns,\n overriding: null,\n source: {\n type: \"select\",\n with: null,\n body: { type: \"values\", rows: valueRows },\n orderBy: [],\n limit: null,\n limitWithTies: false,\n offset: null,\n lockingClause: null,\n },\n onConflict: null,\n returning: null,\n };\n const res = executeInsert(env, insert);\n return {\n columns: [],\n rows: [],\n command: `COPY ${res.rowCount}`,\n rowCount: res.rowCount,\n };\n}\n\n// re-export for the api layer\nexport { executeSelectStmt };\n", "import { pgError } from \"../errors/error.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\nimport type { CastEnv } from \"../types/cast.ts\";\nimport type { CompareCtx } from \"../types/compare.ts\";\nimport { UNIX_EPOCH_MICROS_FROM_PG } from \"../types/datetime.ts\";\nimport { zoneOffsetAtUtc, zoneOffsetForNaive } from \"../types/timezone.ts\";\nimport { isEnumType, type TypeId } from \"../types/value.ts\";\n\n/**\n * Engine-wide evaluation context: database state plus per-statement clock\n * captures. One instance is created per top-level statement execution.\n */\nexport class EngineCtx implements CastEnv, CompareCtx {\n readonly state: DatabaseState;\n /** transaction timestamp (now(), current_timestamp) \u2014 UTC micros since PG epoch */\n readonly txNow: bigint;\n /** statement timestamp */\n readonly stmtNow: bigint;\n\n constructor(state: DatabaseState, txNow?: bigint) {\n this.state = state;\n const nowMs = state.clock().getTime();\n const nowMicros = BigInt(Math.round(nowMs)) * 1000n + UNIX_EPOCH_MICROS_FROM_PG;\n this.txNow = txNow ?? nowMicros;\n this.stmtNow = nowMicros;\n }\n\n timezone(): string {\n return this.state.getSetting(\"timezone\") ?? \"UTC\";\n }\n\n zoneOffsetAt(utcMicros: bigint): number {\n return zoneOffsetAtUtc(this.timezone(), utcMicros);\n }\n\n zoneOffsetForNaive(naiveMicros: bigint): number {\n return zoneOffsetForNaive(this.timezone(), naiveMicros);\n }\n\n enumLabels(enumType: TypeId): string[] | null {\n if (!isEnumType(enumType)) return null;\n const e = this.state.findEnumByKey(enumType.slice(5));\n return e?.labels ?? null;\n }\n\n enumHasLabel(enumType: TypeId, label: string): boolean {\n const labels = this.enumLabels(enumType);\n return labels === null ? true : labels.includes(label);\n }\n\n enumOrder(enumType: TypeId, label: string): number {\n const labels = this.enumLabels(enumType);\n if (!labels) return 0;\n const idx = labels.indexOf(label);\n return idx === -1 ? labels.length : idx;\n }\n\n requireEnum(enumType: TypeId): string[] {\n const labels = this.enumLabels(enumType);\n if (!labels) throw pgError(\"undefined_object\", `type \"${enumType.slice(5)}\" does not exist`);\n return labels;\n }\n}\n", "import { pgError } from \"../errors/error.ts\";\n\nexport type TokenType =\n | \"ident\" // unquoted identifier / keyword, value lowercased\n | \"quoted_ident\" // \"Quoted\" identifier, value as written (unescaped)\n | \"string\" // string literal, value unescaped\n | \"bitstring\" // B'...' or X'...' literal, value with leading b/x\n | \"number\" // numeric literal, raw text (underscores stripped)\n | \"param\" // $n positional parameter, value is n as string\n | \"op\" // operator, e.g. + - * / < <= <> = ~~ ::\n | \"punct\" // ( ) [ ] , ; .\n | \"eof\";\n\nexport interface Token {\n readonly type: TokenType;\n readonly value: string;\n /** byte offset in the source (for error positions) */\n readonly pos: number;\n}\n\nconst IDENT_START = /[A-Za-z_\\u0080-\\uffff]/;\nconst IDENT_CONT = /[A-Za-z0-9_$\\u0080-\\uffff]/;\n\n/** Characters that can form multi-char operators (PG lexer op charset). */\nconst OP_CHARS = new Set([\"+\", \"-\", \"*\", \"/\", \"<\", \">\", \"=\", \"~\", \"!\", \"@\", \"#\", \"%\", \"^\", \"&\", \"|\", \"`\", \"?\"]);\n\nfunction syntaxError(message: string): never {\n throw pgError(\"syntax\", message);\n}\n\nexport function tokenize(sql: string): Token[] {\n const tokens: Token[] = [];\n const n = sql.length;\n let i = 0;\n\n const push = (type: TokenType, value: string, pos: number): void => {\n tokens.push({ type, value, pos });\n };\n\n while (i < n) {\n const c = sql[i]!;\n\n // whitespace\n if (c === \" \" || c === \"\\t\" || c === \"\\n\" || c === \"\\r\" || c === \"\\f\" || c === \"\\v\") {\n i++;\n continue;\n }\n\n // line comment\n if (c === \"-\" && sql[i + 1] === \"-\") {\n while (i < n && sql[i] !== \"\\n\") i++;\n continue;\n }\n\n // block comment (nested)\n if (c === \"/\" && sql[i + 1] === \"*\") {\n let depth = 1;\n i += 2;\n while (i < n && depth > 0) {\n if (sql[i] === \"/\" && sql[i + 1] === \"*\") {\n depth++;\n i += 2;\n } else if (sql[i] === \"*\" && sql[i + 1] === \"/\") {\n depth--;\n i += 2;\n } else {\n i++;\n }\n }\n if (depth > 0) syntaxError(\"unterminated /* comment\");\n continue;\n }\n\n // dollar-quoted string: $$...$$ or $tag$...$tag$\n if (c === \"$\") {\n const m = /^\\$([A-Za-z_\\u0080-\\uffff][A-Za-z0-9_\\u0080-\\uffff]*)?\\$/.exec(sql.slice(i));\n if (m) {\n const open = m[0];\n const start = i + open.length;\n const end = sql.indexOf(open, start);\n if (end === -1) syntaxError(\"unterminated dollar-quoted string\");\n push(\"string\", sql.slice(start, end), i);\n i = end + open.length;\n continue;\n }\n // positional parameter $1\n const pm = /^\\$(\\d+)/.exec(sql.slice(i));\n if (pm) {\n push(\"param\", pm[1]!, i);\n i += pm[0].length;\n continue;\n }\n syntaxError(`syntax error at or near \"$\"`);\n }\n\n // quoted identifier\n if (c === '\"') {\n let out = \"\";\n let j = i + 1;\n for (;;) {\n if (j >= n) syntaxError(\"unterminated quoted identifier\");\n if (sql[j] === '\"') {\n if (sql[j + 1] === '\"') {\n out += '\"';\n j += 2;\n continue;\n }\n j++;\n break;\n }\n out += sql[j];\n j++;\n }\n if (out.length === 0) syntaxError('zero-length delimited identifier at or near \"\"\"\"');\n push(\"quoted_ident\", out, i);\n i = j;\n continue;\n }\n\n // string literals: '...', E'...', B'...', X'...'\n if (c === \"'\") {\n const { value, next } = scanStandardString(sql, i);\n push(\"string\", value, i);\n i = next;\n continue;\n }\n if ((c === \"e\" || c === \"E\") && sql[i + 1] === \"'\") {\n const { value, next } = scanEscapeString(sql, i + 1);\n push(\"string\", value, i);\n i = next;\n continue;\n }\n if ((c === \"b\" || c === \"B\") && sql[i + 1] === \"'\") {\n const { value, next } = scanStandardString(sql, i + 1);\n if (!/^[01]*$/.test(value)) syntaxError(`\"${value}\" is not a valid binary digit string`);\n push(\"bitstring\", `b${value}`, i);\n i = next;\n continue;\n }\n if ((c === \"x\" || c === \"X\") && sql[i + 1] === \"'\") {\n const { value, next } = scanStandardString(sql, i + 1);\n if (!/^[0-9a-fA-F]*$/.test(value)) syntaxError(`\"${value}\" is not a valid hexadecimal digit string`);\n push(\"bitstring\", `x${value}`, i);\n i = next;\n continue;\n }\n // U&'...' unicode strings\n if ((c === \"u\" || c === \"U\") && sql[i + 1] === \"&\" && sql[i + 2] === \"'\") {\n const { value, next } = scanStandardString(sql, i + 2);\n push(\"string\", decodeUnicodeEscapes(value), i);\n i = next;\n continue;\n }\n\n // numbers\n if (/\\d/.test(c) || (c === \".\" && /\\d/.test(sql[i + 1] ?? \"\"))) {\n const start = i;\n // 0x / 0o / 0b integer literals (PG16+)\n const radix = /^0[xX][0-9a-fA-F_]+|^0[oO][0-7_]+|^0[bB][01_]+/.exec(sql.slice(i));\n if (radix) {\n const raw = radix[0];\n i += raw.length;\n const clean = raw.replaceAll(\"_\", \"\");\n const v = BigInt(clean);\n push(\"number\", v.toString(), start);\n continue;\n }\n let j = i;\n while (j < n && /[\\d_]/.test(sql[j]!)) j++;\n if (sql[j] === \".\") {\n // avoid consuming `..` (not PG) or `.` followed by ident? In PG, 1.e5 valid.\n j++;\n while (j < n && /[\\d_]/.test(sql[j]!)) j++;\n }\n if (sql[j] === \"e\" || sql[j] === \"E\") {\n let k = j + 1;\n if (sql[k] === \"+\" || sql[k] === \"-\") k++;\n if (/\\d/.test(sql[k] ?? \"\")) {\n k++;\n while (k < n && /[\\d_]/.test(sql[k]!)) k++;\n j = k;\n }\n }\n const raw = sql.slice(i, j).replaceAll(\"_\", \"\");\n // trailing identifier chars directly after number are a syntax error in PG\n if (j < n && IDENT_START.test(sql[j]!)) {\n syntaxError(`trailing junk after numeric literal at or near \"${sql.slice(i, j + 1)}\"`);\n }\n push(\"number\", raw, start);\n i = j;\n continue;\n }\n\n // identifiers / keywords\n if (IDENT_START.test(c)) {\n let j = i + 1;\n while (j < n && IDENT_CONT.test(sql[j]!)) j++;\n push(\"ident\", sql.slice(i, j).toLowerCase(), i);\n i = j;\n continue;\n }\n\n // punctuation\n if (c === \"(\" || c === \")\" || c === \"[\" || c === \"]\" || c === \",\" || c === \";\") {\n push(\"punct\", c, i);\n i++;\n continue;\n }\n if (c === \".\") {\n push(\"punct\", \".\", i);\n i++;\n continue;\n }\n if (c === \":\") {\n if (sql[i + 1] === \":\") {\n push(\"op\", \"::\", i);\n i += 2;\n continue;\n }\n if (sql[i + 1] === \"=\") {\n push(\"op\", \":=\", i);\n i += 2;\n continue;\n }\n // array slice bound separator: a[1:3]\n push(\"op\", \":\", i);\n i++;\n continue;\n }\n\n // operators (PG rule: multi-char ops ending in + or - must contain ~!@#%^&|`?)\n if (OP_CHARS.has(c)) {\n let j = i;\n while (j < n && OP_CHARS.has(sql[j]!)) {\n // stop at comment starts\n if (sql[j] === \"-\" && sql[j + 1] === \"-\") break;\n if (sql[j] === \"/\" && sql[j + 1] === \"*\") break;\n j++;\n }\n let opText = sql.slice(i, j);\n // PG trims trailing +/- unless the op contains a \"special\" char\n const special = /[~!@#%^&|`?]/;\n while (opText.length > 1 && (opText.endsWith(\"+\") || opText.endsWith(\"-\")) && !special.test(opText)) {\n opText = opText.slice(0, -1);\n }\n if (opText.length === 0) syntaxError(`syntax error at or near \"${c}\"`);\n // split into known compound tokens greedily\n push(\"op\", opText, i);\n i += opText.length;\n continue;\n }\n\n syntaxError(`syntax error at or near \"${c}\"`);\n }\n\n push(\"eof\", \"\", i);\n return tokens;\n}\n\nfunction scanStandardString(sql: string, start: number): { value: string; next: number } {\n // start points at the opening quote\n let out = \"\";\n let i = start + 1;\n const n = sql.length;\n for (;;) {\n if (i >= n) syntaxError(\"unterminated quoted string\");\n const c = sql[i]!;\n if (c === \"'\") {\n if (sql[i + 1] === \"'\") {\n out += \"'\";\n i += 2;\n continue;\n }\n i++;\n // literal continuation across newline: '...' '...'\n let j = i;\n let sawNewline = false;\n while (j < n && /[ \\t\\r\\n\\f\\v]/.test(sql[j]!)) {\n if (sql[j] === \"\\n\") sawNewline = true;\n j++;\n }\n if (sawNewline && sql[j] === \"'\") {\n i = j + 1;\n continue;\n }\n return { value: out, next: i };\n }\n out += c;\n i++;\n }\n}\n\nfunction scanEscapeString(sql: string, start: number): { value: string; next: number } {\n let out = \"\";\n let i = start + 1;\n const n = sql.length;\n for (;;) {\n if (i >= n) syntaxError(\"unterminated quoted string\");\n const c = sql[i]!;\n if (c === \"'\") {\n if (sql[i + 1] === \"'\") {\n out += \"'\";\n i += 2;\n continue;\n }\n return { value: out, next: i + 1 };\n }\n if (c === \"\\\\\") {\n const e = sql[i + 1];\n i += 2;\n switch (e) {\n case \"b\":\n out += \"\\b\";\n break;\n case \"f\":\n out += \"\\f\";\n break;\n case \"n\":\n out += \"\\n\";\n break;\n case \"r\":\n out += \"\\r\";\n break;\n case \"t\":\n out += \"\\t\";\n break;\n case \"'\":\n out += \"'\";\n break;\n case '\"':\n out += '\"';\n break;\n case \"\\\\\":\n out += \"\\\\\";\n break;\n case \"x\": {\n const m = /^[0-9a-fA-F]{1,2}/.exec(sql.slice(i));\n if (m) {\n out += String.fromCharCode(Number.parseInt(m[0], 16));\n i += m[0].length;\n } else out += \"x\";\n break;\n }\n case \"u\": {\n const m = /^[0-9a-fA-F]{4}/.exec(sql.slice(i));\n if (!m) syntaxError(\"invalid Unicode escape\");\n out += String.fromCharCode(Number.parseInt(m[0], 16));\n i += 4;\n break;\n }\n case \"U\": {\n const m = /^[0-9a-fA-F]{8}/.exec(sql.slice(i));\n if (!m) syntaxError(\"invalid Unicode escape\");\n out += String.fromCodePoint(Number.parseInt(m[0], 16));\n i += 8;\n break;\n }\n default:\n if (e !== undefined && /[0-7]/.test(e)) {\n const m = /^[0-7]{1,3}/.exec(sql.slice(i - 1))!;\n out += String.fromCharCode(Number.parseInt(m[0], 8));\n i = i - 1 + m[0].length;\n } else {\n out += e ?? \"\";\n }\n }\n continue;\n }\n out += c;\n i++;\n }\n}\n\nfunction decodeUnicodeEscapes(value: string): string {\n return value.replaceAll(/\\\\(?:([0-9a-fA-F]{4})|\\+([0-9a-fA-F]{6})|\\\\)/g, (m, four, six) => {\n if (m === \"\\\\\\\\\") return \"\\\\\";\n const code = Number.parseInt(four ?? six, 16);\n return String.fromCodePoint(code);\n });\n}\n", "import type {\n AlterEnumStmt,\n AlterTableAction,\n AlterTableStmt,\n ColumnConstraint,\n ColumnDef,\n CommonTableExpr,\n CopyStmt,\n CreateFunctionStmt,\n CreateIndexStmt,\n CreateTriggerStmt,\n DeleteStmt,\n Expr,\n FrameBound,\n FrameSpec,\n FromItem,\n GroupItem,\n InsertStmt,\n OnConflictClause,\n OrderByItem,\n RefAction,\n SelectBody,\n SelectCore,\n SelectStmt,\n SelectTarget,\n SequenceOptions,\n SetOp,\n Statement,\n SubscriptExpr,\n TableConstraint,\n TypeName,\n UpdateSet,\n UpdateStmt,\n WindowSpec,\n WithClause,\n} from \"../ast/nodes.ts\";\nimport { pgError, unsupported } from \"../errors/error.ts\";\nimport { type Token, tokenize } from \"../lexer/tokenize.ts\";\n\n/** Fully reserved words: cannot be a bare identifier / alias. */\nconst RESERVED = new Set([\n \"all\",\n \"analyse\",\n \"analyze\",\n \"and\",\n \"any\",\n \"array\",\n \"as\",\n \"asc\",\n \"asymmetric\",\n \"both\",\n \"case\",\n \"cast\",\n \"check\",\n \"collate\",\n \"column\",\n \"constraint\",\n \"create\",\n \"current_catalog\",\n \"current_date\",\n \"current_role\",\n \"current_time\",\n \"current_timestamp\",\n \"current_user\",\n \"default\",\n \"deferrable\",\n \"desc\",\n \"distinct\",\n \"do\",\n \"else\",\n \"end\",\n \"except\",\n \"false\",\n \"fetch\",\n \"for\",\n \"foreign\",\n \"from\",\n \"grant\",\n \"group\",\n \"having\",\n \"in\",\n \"initially\",\n \"intersect\",\n \"into\",\n \"lateral\",\n \"leading\",\n \"limit\",\n \"localtime\",\n \"localtimestamp\",\n \"not\",\n \"null\",\n \"offset\",\n \"on\",\n \"only\",\n \"or\",\n \"order\",\n \"placing\",\n \"primary\",\n \"references\",\n \"returning\",\n \"select\",\n \"session_user\",\n \"some\",\n \"symmetric\",\n \"table\",\n \"then\",\n \"to\",\n \"trailing\",\n \"true\",\n \"union\",\n \"unique\",\n \"user\",\n \"using\",\n \"variadic\",\n \"when\",\n \"where\",\n \"window\",\n \"with\",\n]);\n\n/** Additionally cannot start a bare FROM alias (they continue the join syntax). */\nconst NO_ALIAS = new Set([\n ...RESERVED,\n \"cross\",\n \"full\",\n \"inner\",\n \"is\",\n \"isnull\",\n \"join\",\n \"left\",\n \"like\",\n \"ilike\",\n \"natural\",\n \"notnull\",\n \"outer\",\n \"overlaps\",\n \"right\",\n \"similar\",\n \"tablesample\",\n \"returning\",\n]);\n\nconst COMPARE_OPS = new Set([\"<\", \">\", \"=\", \"<=\", \">=\", \"<>\", \"!=\"]);\nconst ADDITIVE_OPS = new Set([\"+\", \"-\"]);\nconst MULTIPLICATIVE_OPS = new Set([\"*\", \"/\", \"%\"]);\n\n/** Known single-word type names usable in `TYPENAME 'literal'` syntax. */\nconst TYPE_LITERAL_NAMES = new Set([\n \"date\",\n \"time\",\n \"timestamp\",\n \"timestamptz\",\n \"interval\",\n \"numeric\",\n \"decimal\",\n \"boolean\",\n \"bool\",\n \"int2\",\n \"int4\",\n \"int8\",\n \"smallint\",\n \"integer\",\n \"int\",\n \"bigint\",\n \"real\",\n \"float4\",\n \"float8\",\n \"text\",\n \"varchar\",\n \"char\",\n \"bpchar\",\n \"bytea\",\n \"uuid\",\n \"json\",\n \"jsonb\",\n \"money\",\n \"name\",\n \"oid\",\n \"regclass\",\n \"regtype\",\n \"tsvector\",\n \"tsquery\",\n \"double\",\n \"character\",\n \"bit\",\n]);\n\n/** Second word of multi-word type names for TYPENAME 'literal' detection. */\nconst MULTIWORD_TYPE_SECOND = new Set([\"precision\", \"varying\", \"with\", \"without\"]);\n\nexport class Parser {\n private tokens: Token[];\n private pos = 0;\n\n constructor(sql: string) {\n this.tokens = tokenize(sql);\n }\n\n // --- token helpers -------------------------------------------------------\n\n private peek(offset = 0): Token {\n return this.tokens[Math.min(this.pos + offset, this.tokens.length - 1)]!;\n }\n\n private next(): Token {\n const t = this.tokens[this.pos]!;\n if (t.type !== \"eof\") this.pos++;\n return t;\n }\n\n private atKw(word: string, offset = 0): boolean {\n const t = this.peek(offset);\n return t.type === \"ident\" && t.value === word;\n }\n\n private eatKw(word: string): boolean {\n if (this.atKw(word)) {\n this.pos++;\n return true;\n }\n return false;\n }\n\n private expectKw(word: string): void {\n if (!this.eatKw(word)) this.errorAt(this.peek(), `expected ${word.toUpperCase()}`);\n }\n\n private atPunct(p: string, offset = 0): boolean {\n const t = this.peek(offset);\n return t.type === \"punct\" && t.value === p;\n }\n\n private eatPunct(p: string): boolean {\n if (this.atPunct(p)) {\n this.pos++;\n return true;\n }\n return false;\n }\n\n private expectPunct(p: string): void {\n if (!this.eatPunct(p)) this.errorAt(this.peek(), `expected \"${p}\"`);\n }\n\n private atOp(op: string, offset = 0): boolean {\n const t = this.peek(offset);\n return t.type === \"op\" && t.value === op;\n }\n\n private eatOp(op: string): boolean {\n if (this.atOp(op)) {\n this.pos++;\n return true;\n }\n return false;\n }\n\n private errorAt(token: Token, message: string): never {\n const near = token.type === \"eof\" ? \"end of input\" : `\"${token.value}\"`;\n throw pgError(\"syntax\", `syntax error at or near ${near} (${message})`);\n }\n\n /** identifier (unquoted non-reserved or quoted) */\n private ident(allowReserved = false): string {\n const t = this.peek();\n if (t.type === \"quoted_ident\") {\n this.pos++;\n return t.value;\n }\n if (t.type === \"ident\" && (allowReserved || !RESERVED.has(t.value))) {\n this.pos++;\n return t.value;\n }\n this.errorAt(t, \"expected identifier\");\n }\n\n private qualifiedName(): string[] {\n const parts = [this.ident()];\n while (this.atPunct(\".\")) {\n this.pos++;\n parts.push(this.ident(true));\n }\n return parts;\n }\n\n // --- entry ---------------------------------------------------------------\n\n parseStatements(): Statement[] {\n const out: Statement[] = [];\n while (this.peek().type !== \"eof\") {\n if (this.eatPunct(\";\")) continue;\n out.push(this.parseStatement());\n if (this.peek().type !== \"eof\" && !this.atPunct(\";\")) {\n this.errorAt(this.peek(), \"expected end of statement\");\n }\n }\n return out;\n }\n\n parseStatement(): Statement {\n const t = this.peek();\n if (t.type !== \"ident\" && !this.atPunct(\"(\")) {\n this.errorAt(t, \"expected statement\");\n }\n if (this.atPunct(\"(\")) return this.parseSelectStmt();\n switch (t.value) {\n case \"select\":\n case \"values\":\n case \"with\":\n return this.parseWithableStatement();\n case \"table\": {\n // TABLE name\n this.pos++;\n const name = this.qualifiedName();\n const core: SelectCore = {\n type: \"select_core\",\n distinct: null,\n targets: [{ expr: { type: \"star\" }, alias: null }],\n from: [{ type: \"from_table\", name, only: false, alias: null, colAliases: null }],\n where: null,\n groupBy: null,\n groupDistinct: false,\n having: null,\n windows: [],\n };\n const orderBy = this.parseOrderByClause();\n const { limit, offset, limitWithTies } = this.parseLimitOffset();\n return { type: \"select\", with: null, body: core, orderBy, limit, limitWithTies, offset, lockingClause: null };\n }\n case \"insert\":\n return this.parseInsert(null);\n case \"update\":\n return this.parseUpdate(null);\n case \"delete\":\n return this.parseDelete(null);\n case \"merge\":\n throw unsupported(\"MERGE\");\n case \"create\":\n return this.parseCreate();\n case \"alter\":\n return this.parseAlter();\n case \"drop\":\n return this.parseDrop();\n case \"truncate\":\n return this.parseTruncate();\n case \"refresh\": {\n this.pos++;\n this.expectKw(\"materialized\");\n this.expectKw(\"view\");\n this.eatKw(\"concurrently\");\n const name = this.qualifiedName();\n let withData = true;\n if (this.eatKw(\"with\")) {\n if (this.eatKw(\"no\")) withData = false;\n this.expectKw(\"data\");\n }\n return { type: \"refresh_materialized_view\", name, withData };\n }\n case \"begin\":\n case \"start\": {\n this.pos++;\n if (t.value === \"start\") this.expectKw(\"transaction\");\n else {\n this.eatKw(\"work\") || this.eatKw(\"transaction\");\n }\n const modes: string[] = [];\n for (;;) {\n if (this.eatKw(\"isolation\")) {\n this.expectKw(\"level\");\n let mode = \"isolation level \" + this.ident(true);\n if (this.atKw(\"read\") || this.atKw(\"committed\") || this.atKw(\"uncommitted\")) {\n mode += \" \" + this.ident(true);\n }\n modes.push(mode);\n } else if (this.eatKw(\"read\")) {\n if (this.eatKw(\"only\")) modes.push(\"read only\");\n else {\n this.expectKw(\"write\");\n modes.push(\"read write\");\n }\n } else if (this.eatKw(\"deferrable\")) {\n modes.push(\"deferrable\");\n } else if (this.atKw(\"not\")) {\n this.pos++;\n this.expectKw(\"deferrable\");\n modes.push(\"not deferrable\");\n } else break;\n this.eatPunct(\",\");\n }\n return { type: \"transaction\", action: \"begin\", modes };\n }\n case \"commit\":\n case \"end\": {\n this.pos++;\n this.eatKw(\"work\") || this.eatKw(\"transaction\");\n let chain = false;\n if (this.eatKw(\"and\")) {\n if (this.eatKw(\"no\")) {\n this.expectKw(\"chain\");\n } else {\n this.expectKw(\"chain\");\n chain = true;\n }\n }\n return { type: \"transaction\", action: \"commit\", chain };\n }\n case \"rollback\":\n case \"abort\": {\n this.pos++;\n this.eatKw(\"work\") || this.eatKw(\"transaction\");\n if (this.eatKw(\"to\")) {\n this.eatKw(\"savepoint\");\n const name = this.ident();\n return { type: \"transaction\", action: \"rollback_to\", savepointName: name };\n }\n let chain = false;\n if (this.eatKw(\"and\")) {\n if (this.eatKw(\"no\")) {\n this.expectKw(\"chain\");\n } else {\n this.expectKw(\"chain\");\n chain = true;\n }\n }\n return { type: \"transaction\", action: \"rollback\", chain };\n }\n case \"savepoint\": {\n this.pos++;\n const name = this.ident();\n return { type: \"transaction\", action: \"savepoint\", savepointName: name };\n }\n case \"release\": {\n this.pos++;\n this.eatKw(\"savepoint\");\n const name = this.ident();\n return { type: \"transaction\", action: \"release\", savepointName: name };\n }\n case \"set\":\n return this.parseSet();\n case \"show\": {\n this.pos++;\n if (this.eatKw(\"all\")) return { type: \"show\", name: \"all\" };\n const parts = [this.ident(true)];\n while (this.atPunct(\".\")) {\n this.pos++;\n parts.push(this.ident(true));\n }\n // SHOW TIME ZONE\n if (parts[0] === \"time\" && this.atKw(\"zone\")) {\n this.pos++;\n return { type: \"show\", name: \"timezone\" };\n }\n if (parts[0] === \"transaction\" && this.atKw(\"isolation\")) {\n this.pos++;\n this.expectKw(\"level\");\n return { type: \"show\", name: \"transaction_isolation\" };\n }\n return { type: \"show\", name: parts.join(\".\") };\n }\n case \"reset\": {\n this.pos++;\n if (this.eatKw(\"all\")) return { type: \"reset\", name: \"all\" };\n if (this.atKw(\"time\") && this.atKw(\"zone\", 1)) {\n this.pos += 2;\n return { type: \"reset\", name: \"timezone\" };\n }\n const parts = [this.ident(true)];\n while (this.atPunct(\".\")) {\n this.pos++;\n parts.push(this.ident(true));\n }\n return { type: \"reset\", name: parts.join(\".\") };\n }\n case \"prepare\": {\n this.pos++;\n const name = this.ident();\n let argTypes: TypeName[] | null = null;\n if (this.eatPunct(\"(\")) {\n argTypes = [];\n if (!this.atPunct(\")\")) {\n do {\n argTypes.push(this.parseTypeName());\n } while (this.eatPunct(\",\"));\n }\n this.expectPunct(\")\");\n }\n this.expectKw(\"as\");\n const query = this.parseStatement();\n return { type: \"prepare\", name, argTypes, query };\n }\n case \"execute\": {\n this.pos++;\n const name = this.ident();\n const params: Expr[] = [];\n if (this.eatPunct(\"(\")) {\n if (!this.atPunct(\")\")) {\n do {\n params.push(this.parseExpr());\n } while (this.eatPunct(\",\"));\n }\n this.expectPunct(\")\");\n }\n return { type: \"execute\", name, params };\n }\n case \"deallocate\": {\n this.pos++;\n this.eatKw(\"prepare\");\n if (this.eatKw(\"all\")) return { type: \"deallocate\", name: null };\n return { type: \"deallocate\", name: this.ident() };\n }\n case \"explain\":\n return this.parseExplain();\n case \"copy\":\n return this.parseCopy();\n case \"comment\": {\n this.pos++;\n this.expectKw(\"on\");\n const kind = this.ident(true);\n if (kind === \"column\" || kind === \"constraint\" || kind === \"trigger\") {\n // COLUMN t.c / CONSTRAINT c ON t\n const objectName = this.qualifiedName();\n if (this.eatKw(\"on\")) this.qualifiedName();\n this.expectKw(\"is\");\n let comment: string | null = null;\n if (this.peek().type === \"string\") comment = this.next().value;\n else this.expectKw(\"null\");\n return { type: \"comment\", objectKind: kind, objectName, comment };\n }\n // TABLE / VIEW / SCHEMA / etc.\n let extra = \"\";\n if (kind === \"materialized\") {\n this.expectKw(\"view\");\n extra = \" view\";\n }\n const objectName = this.qualifiedName();\n this.expectKw(\"is\");\n let comment: string | null = null;\n if (this.peek().type === \"string\") comment = this.next().value;\n else this.expectKw(\"null\");\n return { type: \"comment\", objectKind: kind + extra, objectName, comment };\n }\n case \"grant\":\n case \"revoke\": {\n // parse loosely to end of statement; execution is a no-op\n const what = t.value.toUpperCase();\n this.skipToStatementEnd();\n return { type: \"no_op\", what };\n }\n case \"vacuum\":\n case \"analyze\":\n case \"analyse\":\n case \"checkpoint\":\n case \"cluster\":\n case \"reindex\": {\n const what = t.value.toUpperCase();\n this.skipToStatementEnd();\n return { type: \"no_op\", what };\n }\n case \"listen\":\n case \"notify\":\n case \"unlisten\":\n throw unsupported(t.value.toUpperCase());\n case \"declare\":\n case \"fetch\":\n case \"move\":\n case \"close\":\n throw unsupported(\"cursors\");\n case \"lock\": {\n this.skipToStatementEnd();\n return { type: \"no_op\", what: \"LOCK\" };\n }\n case \"do\": {\n this.pos++;\n let language = \"plpgsql\";\n let body = \"\";\n if (this.eatKw(\"language\")) {\n language = this.ident(true);\n }\n if (this.peek().type === \"string\") {\n body = this.next().value;\n }\n if (this.eatKw(\"language\")) {\n language = this.ident(true);\n }\n return { type: \"do\", language, body };\n }\n case \"call\":\n throw unsupported(\"CALL\");\n case \"import\":\n throw unsupported(\"IMPORT FOREIGN SCHEMA\");\n case \"security\":\n case \"discard\": {\n this.skipToStatementEnd();\n return { type: \"no_op\", what: t.value.toUpperCase() };\n }\n default:\n this.errorAt(t, \"unrecognized statement\");\n }\n }\n\n private skipToStatementEnd(): void {\n while (this.peek().type !== \"eof\" && !this.atPunct(\";\")) this.pos++;\n }\n\n // --- WITH-able statements --------------------------------------------------\n\n private parseWithableStatement(): Statement {\n if (this.atKw(\"with\")) {\n const withClause = this.parseWithClause();\n const t = this.peek();\n if (t.type === \"ident\") {\n if (t.value === \"insert\") return this.parseInsert(withClause);\n if (t.value === \"update\") return this.parseUpdate(withClause);\n if (t.value === \"delete\") return this.parseDelete(withClause);\n }\n return this.parseSelectStmt(withClause);\n }\n const t = this.peek();\n if (t.type === \"ident\") {\n // data-modifying CTE bodies: WITH x AS (INSERT ... RETURNING ...)\n if (t.value === \"insert\") return this.parseInsert(null);\n if (t.value === \"update\") return this.parseUpdate(null);\n if (t.value === \"delete\") return this.parseDelete(null);\n }\n return this.parseSelectStmt();\n }\n\n private parseWithClause(): WithClause {\n this.expectKw(\"with\");\n const recursive = this.eatKw(\"recursive\");\n const ctes: CommonTableExpr[] = [];\n do {\n const name = this.ident();\n let columns: string[] | null = null;\n if (this.eatPunct(\"(\")) {\n columns = [];\n do {\n columns.push(this.ident());\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n }\n this.expectKw(\"as\");\n let materialized: boolean | null = null;\n if (this.eatKw(\"materialized\")) materialized = true;\n else if (this.atKw(\"not\") && this.atKw(\"materialized\", 1)) {\n this.pos += 2;\n materialized = false;\n }\n this.expectPunct(\"(\");\n const query = this.parseWithableStatement();\n this.expectPunct(\")\");\n if (this.atKw(\"search\") || this.atKw(\"cycle\")) throw unsupported(\"WITH ... SEARCH/CYCLE\");\n ctes.push({ name, columns, query, materialized });\n } while (this.eatPunct(\",\"));\n return { recursive, ctes };\n }\n\n // --- SELECT ------------------------------------------------------------------\n\n parseSelectStmt(withClause: WithClause | null = null): SelectStmt {\n let w = withClause;\n if (w === null && this.atKw(\"with\")) w = this.parseWithClause();\n const body = this.parseSelectBody();\n const orderBy = this.parseOrderByClause();\n const { limit, offset, limitWithTies } = this.parseLimitOffset();\n let lockingClause: string | null = null;\n while (this.atKw(\"for\")) {\n this.pos++;\n if (this.eatKw(\"update\")) lockingClause = \"update\";\n else if (this.eatKw(\"share\")) lockingClause = \"share\";\n else if (this.eatKw(\"no\")) {\n this.expectKw(\"key\");\n this.expectKw(\"update\");\n lockingClause = \"no key update\";\n } else if (this.eatKw(\"key\")) {\n this.expectKw(\"share\");\n lockingClause = \"key share\";\n } else this.errorAt(this.peek(), \"expected locking strength\");\n if (this.eatKw(\"of\")) {\n do {\n this.qualifiedName();\n } while (this.eatPunct(\",\"));\n }\n this.eatKw(\"nowait\");\n if (this.eatKw(\"skip\")) this.expectKw(\"locked\");\n }\n return { type: \"select\", with: w, body, orderBy, limit, limitWithTies, offset, lockingClause };\n }\n\n private parseSelectBody(): SelectBody {\n let left = this.parseSelectTerm();\n for (;;) {\n let op: SetOp[\"op\"] | null = null;\n if (this.atKw(\"union\")) op = \"union\";\n else if (this.atKw(\"except\")) op = \"except\";\n if (op === null) break;\n this.pos++;\n const all = this.eatKw(\"all\");\n if (!all) this.eatKw(\"distinct\");\n const right = this.parseSelectTerm();\n left = { type: \"setop\", op, all, left, right };\n }\n return left;\n }\n\n private parseSelectTerm(): SelectBody {\n let left = this.parseSelectPrimary();\n while (this.atKw(\"intersect\")) {\n this.pos++;\n const all = this.eatKw(\"all\");\n if (!all) this.eatKw(\"distinct\");\n const right = this.parseSelectPrimary();\n left = { type: \"setop\", op: \"intersect\", all, left, right };\n }\n return left;\n }\n\n private parseSelectPrimary(): SelectBody {\n if (this.atPunct(\"(\")) {\n this.pos++;\n // parenthesized select possibly with own order/limit \u2014 wrap as subquery core\n const inner = this.parseSelectStmt();\n this.expectPunct(\")\");\n if (inner.orderBy.length === 0 && inner.limit === null && inner.offset === null && inner.with === null) {\n return inner.body;\n }\n // keep ordering: represent as SELECT * FROM (inner) sub\n const core: SelectCore = {\n type: \"select_core\",\n distinct: null,\n targets: [{ expr: { type: \"star\" }, alias: null }],\n from: [{ type: \"from_subquery\", query: inner, lateral: false, alias: \"__paren\", colAliases: null }],\n where: null,\n groupBy: null,\n groupDistinct: false,\n having: null,\n windows: [],\n };\n return core;\n }\n if (this.atKw(\"values\")) {\n this.pos++;\n const rows: Expr[][] = [];\n do {\n this.expectPunct(\"(\");\n const row: Expr[] = [];\n do {\n if (this.atKw(\"default\")) {\n this.pos++;\n row.push({ type: \"default_expr\" });\n } else {\n row.push(this.parseExpr());\n }\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n rows.push(row);\n } while (this.eatPunct(\",\"));\n return { type: \"values\", rows };\n }\n return this.parseSelectCore();\n }\n\n private parseSelectCore(): SelectCore {\n this.expectKw(\"select\");\n let distinct: SelectCore[\"distinct\"] = null;\n if (this.eatKw(\"all\")) {\n // no-op\n } else if (this.eatKw(\"distinct\")) {\n if (this.eatKw(\"on\")) {\n this.expectPunct(\"(\");\n const on: Expr[] = [];\n do {\n on.push(this.parseExpr());\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n distinct = { on };\n } else {\n distinct = { on: null };\n }\n }\n const targets: SelectTarget[] = [];\n if (!this.atKw(\"from\") && !this.atPunct(\";\") && this.peek().type !== \"eof\" && !this.atKw(\"where\")) {\n do {\n targets.push(this.parseSelectTarget());\n } while (this.eatPunct(\",\"));\n }\n if (this.eatKw(\"into\")) throw unsupported(\"SELECT INTO\");\n const from: FromItem[] = [];\n if (this.eatKw(\"from\")) {\n do {\n from.push(this.parseFromItem());\n } while (this.eatPunct(\",\"));\n }\n const where = this.eatKw(\"where\") ? this.parseExpr() : null;\n let groupBy: GroupItem[] | null = null;\n let groupDistinct = false;\n if (this.eatKw(\"group\")) {\n this.expectKw(\"by\");\n if (this.eatKw(\"distinct\")) groupDistinct = true;\n else this.eatKw(\"all\");\n groupBy = [];\n do {\n groupBy.push(this.parseGroupItem());\n } while (this.eatPunct(\",\"));\n }\n const having = this.eatKw(\"having\") ? this.parseExpr() : null;\n const windows: Array<{ name: string; spec: WindowSpec }> = [];\n if (this.eatKw(\"window\")) {\n do {\n const name = this.ident();\n this.expectKw(\"as\");\n this.expectPunct(\"(\");\n const spec = this.parseWindowSpec();\n this.expectPunct(\")\");\n windows.push({ name, spec });\n } while (this.eatPunct(\",\"));\n }\n return { type: \"select_core\", distinct, targets, from, where, groupBy, groupDistinct, having, windows };\n }\n\n private parseGroupItem(): GroupItem {\n if (this.atKw(\"rollup\") || this.atKw(\"cube\")) {\n const kind = this.next().value as \"rollup\" | \"cube\";\n this.expectPunct(\"(\");\n const items: Expr[][] = [];\n do {\n if (this.atPunct(\"(\")) {\n this.pos++;\n const grp: Expr[] = [];\n if (!this.atPunct(\")\")) {\n do {\n grp.push(this.parseExpr());\n } while (this.eatPunct(\",\"));\n }\n this.expectPunct(\")\");\n items.push(grp);\n } else {\n items.push([this.parseExpr()]);\n }\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n return { kind, items };\n }\n if (this.atKw(\"grouping\") && this.atKw(\"sets\", 1)) {\n this.pos += 2;\n this.expectPunct(\"(\");\n const sets: GroupItem[][] = [];\n do {\n if (this.atPunct(\"(\") && this.atPunct(\")\", 1)) {\n this.pos += 2;\n sets.push([{ kind: \"empty\" }]);\n } else if (this.atPunct(\"(\")) {\n this.pos++;\n const grp: GroupItem[] = [];\n do {\n grp.push(this.parseGroupItem());\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n sets.push(grp);\n } else {\n sets.push([this.parseGroupItem()]);\n }\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n return { kind: \"grouping_sets\", sets };\n }\n if (this.atPunct(\"(\") && this.atPunct(\")\", 1)) {\n this.pos += 2;\n return { kind: \"empty\" };\n }\n return { kind: \"expr\", expr: this.parseExpr() };\n }\n\n private parseSelectTarget(): SelectTarget {\n if (this.atOp(\"*\")) {\n this.pos++;\n return { expr: { type: \"star\" }, alias: null };\n }\n const expr = this.parseExpr();\n let alias: string | null = null;\n if (this.eatKw(\"as\")) {\n alias = this.ident(true);\n if (this.peek(-1)!.type === \"ident\" && RESERVED.has(alias)) {\n // AS allows any keyword\n }\n } else {\n const t = this.peek();\n if (t.type === \"quoted_ident\" || (t.type === \"ident\" && !NO_ALIAS.has(t.value))) {\n alias = this.ident();\n }\n }\n return { expr, alias };\n }\n\n private parseOrderByClause(): OrderByItem[] {\n if (!this.atKw(\"order\")) return [];\n this.pos++;\n this.expectKw(\"by\");\n const items: OrderByItem[] = [];\n do {\n items.push(this.parseOrderByItem());\n } while (this.eatPunct(\",\"));\n return items;\n }\n\n private parseOrderByItem(): OrderByItem {\n const expr = this.parseExpr();\n let dir: \"asc\" | \"desc\" | null = null;\n let using: string | undefined;\n if (this.eatKw(\"asc\")) dir = \"asc\";\n else if (this.eatKw(\"desc\")) dir = \"desc\";\n else if (this.eatKw(\"using\")) {\n const t = this.next();\n using = t.value;\n dir = t.value === \">\" ? \"desc\" : \"asc\";\n }\n let nulls: \"first\" | \"last\" | null = null;\n if (this.eatKw(\"nulls\")) {\n if (this.eatKw(\"first\")) nulls = \"first\";\n else {\n this.expectKw(\"last\");\n nulls = \"last\";\n }\n }\n return { expr, dir, nulls, using };\n }\n\n private parseLimitOffset(): { limit: Expr | null; offset: Expr | null; limitWithTies: boolean } {\n let limit: Expr | null = null;\n let offset: Expr | null = null;\n let limitWithTies = false;\n for (;;) {\n if (this.eatKw(\"limit\")) {\n if (this.eatKw(\"all\")) limit = null;\n else limit = this.parseExpr();\n continue;\n }\n if (this.eatKw(\"offset\")) {\n offset = this.parseExpr();\n this.eatKw(\"row\") || this.eatKw(\"rows\");\n continue;\n }\n if (this.atKw(\"fetch\")) {\n this.pos++;\n if (!this.eatKw(\"first\")) this.expectKw(\"next\");\n if (this.atKw(\"row\") || this.atKw(\"rows\")) {\n limit = { type: \"number_lit\", raw: \"1\" };\n } else {\n limit = this.parseExpr();\n }\n this.eatKw(\"row\") || this.eatKw(\"rows\");\n if (this.eatKw(\"with\")) {\n this.expectKw(\"ties\");\n limitWithTies = true;\n } else {\n this.expectKw(\"only\");\n }\n continue;\n }\n break;\n }\n return { limit, offset, limitWithTies };\n }\n\n // --- FROM ------------------------------------------------------------------\n\n private parseFromItem(): FromItem {\n let item = this.parseFromPrimary();\n for (;;) {\n const join = this.tryParseJoin(item);\n if (join === null) break;\n item = join;\n }\n return item;\n }\n\n private tryParseJoin(left: FromItem): FromItem | null {\n let natural = false;\n let kind: \"inner\" | \"left\" | \"right\" | \"full\" | \"cross\" | null = null;\n const save = this.pos;\n if (this.eatKw(\"natural\")) natural = true;\n if (this.eatKw(\"cross\")) {\n this.expectKw(\"join\");\n kind = \"cross\";\n } else if (this.eatKw(\"inner\")) {\n this.expectKw(\"join\");\n kind = \"inner\";\n } else if (this.eatKw(\"left\")) {\n this.eatKw(\"outer\");\n this.expectKw(\"join\");\n kind = \"left\";\n } else if (this.eatKw(\"right\")) {\n this.eatKw(\"outer\");\n this.expectKw(\"join\");\n kind = \"right\";\n } else if (this.eatKw(\"full\")) {\n this.eatKw(\"outer\");\n this.expectKw(\"join\");\n kind = \"full\";\n } else if (this.eatKw(\"join\")) {\n kind = \"inner\";\n } else {\n this.pos = save;\n return null;\n }\n const right = this.parseFromPrimary();\n let on: Expr | null = null;\n let using: string[] | null = null;\n let usingAlias: string | null = null;\n if (kind !== \"cross\" && !natural) {\n if (this.eatKw(\"on\")) {\n on = this.parseExpr();\n } else if (this.eatKw(\"using\")) {\n this.expectPunct(\"(\");\n using = [];\n do {\n using.push(this.ident());\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n if (this.eatKw(\"as\")) usingAlias = this.ident();\n } else {\n this.errorAt(this.peek(), \"expected ON or USING\");\n }\n }\n return { type: \"from_join\", kind, left, right, on, using, usingAlias, natural };\n }\n\n private parseFromPrimary(): FromItem {\n const lateral = this.eatKw(\"lateral\");\n if (this.atPunct(\"(\")) {\n // subquery or parenthesized join\n const save = this.pos;\n this.pos++;\n if (this.atKw(\"select\") || this.atKw(\"with\") || this.atKw(\"values\") || this.atPunct(\"(\")) {\n // could be subquery \u2014 try\n try {\n const query = this.parseSelectStmt();\n this.expectPunct(\")\");\n const { alias, colAliases } = this.parseAliasClause();\n return { type: \"from_subquery\", query, lateral, alias, colAliases };\n } catch {\n this.pos = save;\n }\n } else {\n this.pos = save;\n }\n // parenthesized join\n this.expectPunct(\"(\");\n const inner = this.parseFromItem();\n this.expectPunct(\")\");\n const { alias, colAliases } = this.parseAliasClause();\n if (alias !== null && inner.type !== \"from_join\") {\n return { ...inner, alias, colAliases } as FromItem;\n }\n return inner;\n }\n if (this.atKw(\"rows\") && this.atKw(\"from\", 1)) {\n this.pos += 2;\n this.expectPunct(\"(\");\n const funcs: Expr[] = [];\n do {\n funcs.push(this.parseExpr());\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n const withOrdinality = this.parseWithOrdinality();\n const { alias, colAliases } = this.parseAliasClause();\n return { type: \"from_func\", call: funcs[0]!, lateral, withOrdinality, alias, colAliases, rowsFrom: funcs };\n }\n const only = this.eatKw(\"only\");\n // function call in FROM?\n const save = this.pos;\n const name = this.qualifiedName();\n if (this.atPunct(\"(\")) {\n // table function\n this.pos = save;\n const call = this.parseExpr();\n const withOrdinality = this.parseWithOrdinality();\n const { alias, colAliases } = this.parseAliasClause();\n return { type: \"from_func\", call, lateral, withOrdinality, alias, colAliases, rowsFrom: null };\n }\n if (this.eatOp(\"*\")) {\n // trailing * (inheritance marker) \u2014 accept and ignore\n }\n const { alias, colAliases } = this.parseAliasClause();\n if (this.atKw(\"tablesample\")) throw unsupported(\"TABLESAMPLE\");\n return { type: \"from_table\", name, only, alias, colAliases };\n }\n\n private parseWithOrdinality(): boolean {\n if (this.atKw(\"with\") && this.atKw(\"ordinality\", 1)) {\n this.pos += 2;\n return true;\n }\n return false;\n }\n\n private parseAliasClause(): { alias: string | null; colAliases: string[] | null } {\n let alias: string | null = null;\n if (this.eatKw(\"as\")) {\n alias = this.ident(true);\n } else {\n const t = this.peek();\n if (t.type === \"quoted_ident\" || (t.type === \"ident\" && !NO_ALIAS.has(t.value))) {\n alias = this.ident();\n }\n }\n let colAliases: string[] | null = null;\n if (alias !== null && this.atPunct(\"(\")) {\n // could be column aliases t(a, b) \u2014 only idents inside\n const save = this.pos;\n this.pos++;\n const cols: string[] = [];\n let ok = true;\n for (;;) {\n const t = this.peek();\n if (t.type === \"ident\" && !RESERVED.has(t.value)) {\n cols.push(t.value);\n this.pos++;\n } else if (t.type === \"quoted_ident\") {\n cols.push(t.value);\n this.pos++;\n } else {\n ok = false;\n break;\n }\n // optional type spec for record-returning fn aliases: name type\n if (this.peek().type === \"ident\" && !this.atPunct(\",\") && !this.atPunct(\")\")) {\n try {\n this.parseTypeName();\n } catch {\n ok = false;\n break;\n }\n }\n if (this.eatPunct(\",\")) continue;\n if (this.eatPunct(\")\")) break;\n ok = false;\n break;\n }\n if (ok) colAliases = cols;\n else this.pos = save;\n }\n return { alias, colAliases };\n }\n\n // --- INSERT / UPDATE / DELETE -----------------------------------------------\n\n private parseInsert(withClause: WithClause | null): InsertStmt {\n this.expectKw(\"insert\");\n this.expectKw(\"into\");\n const table = this.qualifiedName();\n let alias: string | null = null;\n if (this.eatKw(\"as\")) alias = this.ident();\n let columns: string[] | null = null;\n // Try to parse a column list; \"(\" could also start VALUES/(SELECT\n if (this.atPunct(\"(\")) {\n const save = this.pos;\n this.pos++;\n const cols: string[] = [];\n let ok = true;\n for (;;) {\n const t = this.peek();\n if (t.type === \"quoted_ident\" || (t.type === \"ident\" && !RESERVED.has(t.value))) {\n cols.push(this.ident());\n } else {\n ok = false;\n break;\n }\n if (this.eatPunct(\",\")) continue;\n if (this.eatPunct(\")\")) break;\n ok = false;\n break;\n }\n // must be followed by VALUES/SELECT/( to be a column list\n if (\n !ok ||\n !(\n this.atKw(\"values\") ||\n this.atKw(\"select\") ||\n this.atKw(\"with\") ||\n this.atPunct(\"(\") ||\n this.atKw(\"default\") ||\n this.atKw(\"overriding\") ||\n this.atKw(\"table\")\n )\n ) {\n this.pos = save;\n } else {\n columns = cols;\n }\n }\n let overriding: \"system\" | \"user\" | null = null;\n if (this.eatKw(\"overriding\")) {\n if (this.eatKw(\"system\")) overriding = \"system\";\n else {\n this.expectKw(\"user\");\n overriding = \"user\";\n }\n this.expectKw(\"value\");\n }\n let source: SelectStmt | \"default_values\";\n if (this.atKw(\"default\") && this.atKw(\"values\", 1)) {\n this.pos += 2;\n source = \"default_values\";\n } else {\n source = this.parseSelectStmt();\n }\n let onConflict: OnConflictClause | null = null;\n if (this.atKw(\"on\")) {\n this.pos++;\n this.expectKw(\"conflict\");\n let target: OnConflictClause[\"target\"] = null;\n if (this.atPunct(\"(\")) {\n this.pos++;\n const cols: Expr[] = [];\n do {\n cols.push(this.parseExpr());\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n const where = this.eatKw(\"where\") ? this.parseExpr() : null;\n target = { columns: cols, where };\n } else if (this.eatKw(\"on\")) {\n this.expectKw(\"constraint\");\n target = { constraint: this.ident() };\n }\n this.expectKw(\"do\");\n if (this.eatKw(\"nothing\")) {\n onConflict = { target, action: \"nothing\" };\n } else {\n this.expectKw(\"update\");\n this.expectKw(\"set\");\n const sets = this.parseUpdateSets();\n const where = this.eatKw(\"where\") ? this.parseExpr() : null;\n onConflict = { target, action: { sets, where } };\n }\n }\n const returning = this.parseReturning();\n return { type: \"insert\", with: withClause, table, alias, columns, overriding, source, onConflict, returning };\n }\n\n private parseReturning(): SelectTarget[] | null {\n if (!this.eatKw(\"returning\")) return null;\n const targets: SelectTarget[] = [];\n do {\n targets.push(this.parseSelectTarget());\n } while (this.eatPunct(\",\"));\n return targets;\n }\n\n private parseUpdateSets(): UpdateSet[] {\n const sets: UpdateSet[] = [];\n do {\n if (this.atPunct(\"(\")) {\n // multi-column: (a, b) = ROW(...) | (a, b) = (subquery)\n this.pos++;\n const cols: UpdateSet[\"columns\"][number][] = [];\n do {\n cols.push(this.parseSetColumn());\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n if (!this.eatOp(\"=\")) this.errorAt(this.peek(), \"expected =\");\n if (this.atPunct(\"(\") && (this.atKw(\"select\", 1) || this.atKw(\"with\", 1))) {\n this.pos++;\n const query = this.parseSelectStmt();\n this.expectPunct(\")\");\n sets.push({ columns: cols, value: { kind: \"row_subquery\", query } });\n } else if (this.eatKw(\"row\")) {\n this.expectPunct(\"(\");\n const items: Expr[] = [];\n do {\n if (this.atKw(\"default\")) {\n this.pos++;\n items.push({ type: \"default_expr\" });\n } else {\n items.push(this.parseExpr());\n }\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n sets.push({ columns: cols, value: { kind: \"row_values\", items } });\n } else {\n this.expectPunct(\"(\");\n const items: Expr[] = [];\n do {\n if (this.atKw(\"default\")) {\n this.pos++;\n items.push({ type: \"default_expr\" });\n } else {\n items.push(this.parseExpr());\n }\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n sets.push({ columns: cols, value: { kind: \"row_values\", items } });\n }\n } else {\n const col = this.parseSetColumn();\n if (!this.eatOp(\"=\")) this.errorAt(this.peek(), \"expected =\");\n let value: UpdateSet[\"value\"];\n if (this.atKw(\"default\")) {\n this.pos++;\n value = { type: \"default_expr\" };\n } else {\n value = this.parseExpr();\n }\n sets.push({ columns: [col], value });\n }\n } while (this.eatPunct(\",\"));\n return sets;\n }\n\n private parseSetColumn(): UpdateSet[\"columns\"][number] {\n const name = this.ident();\n let subscripts: SubscriptExpr[\"indexes\"] | null = null;\n const fields: string[] = [];\n while (this.atPunct(\"[\") || this.atPunct(\".\")) {\n if (this.atPunct(\"[\")) {\n this.pos++;\n let lower: Expr | null = null;\n let upper: Expr | null = null;\n let slice = false;\n if (!this.atOp(\":\")) lower = this.parseExpr();\n if (this.eatOp(\":\")) {\n slice = true;\n if (!this.atPunct(\"]\")) upper = this.parseExpr();\n }\n this.expectPunct(\"]\");\n subscripts = [...(subscripts ?? []), { lower, upper, slice }] as SubscriptExpr[\"indexes\"];\n } else {\n this.pos++;\n fields.push(this.ident(true));\n }\n }\n return { name, subscripts, fields };\n }\n\n private parseUpdate(withClause: WithClause | null): UpdateStmt {\n this.expectKw(\"update\");\n const only = this.eatKw(\"only\");\n const table = this.qualifiedName();\n let alias: string | null = null;\n if (this.eatKw(\"as\")) alias = this.ident();\n else {\n const t = this.peek();\n if (t.type === \"quoted_ident\" || (t.type === \"ident\" && !NO_ALIAS.has(t.value) && t.value !== \"set\")) {\n alias = this.ident();\n }\n }\n this.expectKw(\"set\");\n const sets = this.parseUpdateSets();\n const from: FromItem[] = [];\n if (this.eatKw(\"from\")) {\n do {\n from.push(this.parseFromItem());\n } while (this.eatPunct(\",\"));\n }\n let where: Expr | null = null;\n let whereCurrentOf: string | null = null;\n if (this.eatKw(\"where\")) {\n if (this.atKw(\"current\") && this.atKw(\"of\", 1)) {\n this.pos += 2;\n whereCurrentOf = this.ident();\n } else {\n where = this.parseExpr();\n }\n }\n const returning = this.parseReturning();\n return { type: \"update\", with: withClause, table, only, alias, sets, from, where, whereCurrentOf, returning };\n }\n\n private parseDelete(withClause: WithClause | null): DeleteStmt {\n this.expectKw(\"delete\");\n this.expectKw(\"from\");\n const only = this.eatKw(\"only\");\n const table = this.qualifiedName();\n let alias: string | null = null;\n if (this.eatKw(\"as\")) alias = this.ident();\n else {\n const t = this.peek();\n if (t.type === \"quoted_ident\" || (t.type === \"ident\" && !NO_ALIAS.has(t.value))) {\n alias = this.ident();\n }\n }\n const using: FromItem[] = [];\n if (this.eatKw(\"using\")) {\n do {\n using.push(this.parseFromItem());\n } while (this.eatPunct(\",\"));\n }\n const where = this.eatKw(\"where\") ? this.parseExpr() : null;\n const returning = this.parseReturning();\n return { type: \"delete\", with: withClause, table, only, alias, using, where, returning };\n }\n\n // --- CREATE -------------------------------------------------------------------\n\n private parseCreate(): Statement {\n this.expectKw(\"create\");\n let orReplace = false;\n if (this.atKw(\"or\") && this.atKw(\"replace\", 1)) {\n this.pos += 2;\n orReplace = true;\n }\n let temp = false;\n if (this.eatKw(\"temp\") || this.eatKw(\"temporary\")) temp = true;\n if (this.eatKw(\"global\") || this.eatKw(\"local\")) {\n this.eatKw(\"temp\") || this.eatKw(\"temporary\");\n temp = true;\n }\n const unlogged = this.eatKw(\"unlogged\");\n if (this.atKw(\"table\")) {\n this.pos++;\n return this.parseCreateTable(temp, unlogged);\n }\n if (this.atKw(\"unique\") || this.atKw(\"index\")) {\n const unique = this.eatKw(\"unique\");\n this.expectKw(\"index\");\n return this.parseCreateIndex(unique);\n }\n if (this.atKw(\"materialized\")) {\n this.pos++;\n this.expectKw(\"view\");\n return this.parseCreateView(orReplace, temp, true);\n }\n if (this.atKw(\"view\")) {\n this.pos++;\n return this.parseCreateView(orReplace, temp, false);\n }\n if (this.atKw(\"recursive\")) throw unsupported(\"CREATE RECURSIVE VIEW\");\n if (this.atKw(\"sequence\")) {\n this.pos++;\n const ifNotExists = this.parseIfNotExists();\n const name = this.qualifiedName();\n const options = this.parseSequenceOptions();\n return { type: \"create_sequence\", name, ifNotExists, temp, options };\n }\n if (this.atKw(\"schema\")) {\n this.pos++;\n const ifNotExists = this.parseIfNotExists();\n if (this.atKw(\"authorization\")) throw unsupported(\"CREATE SCHEMA AUTHORIZATION\");\n const name = this.ident();\n if (!this.atPunct(\";\") && this.peek().type !== \"eof\") throw unsupported(\"CREATE SCHEMA with elements\");\n return { type: \"create_schema\", name, ifNotExists };\n }\n if (this.atKw(\"type\")) {\n this.pos++;\n const name = this.qualifiedName();\n this.expectKw(\"as\");\n if (this.eatKw(\"enum\")) {\n this.expectPunct(\"(\");\n const labels: string[] = [];\n if (!this.atPunct(\")\")) {\n do {\n const t = this.next();\n if (t.type !== \"string\") this.errorAt(t, \"expected string literal\");\n labels.push(t.value);\n } while (this.eatPunct(\",\"));\n }\n this.expectPunct(\")\");\n return { type: \"create_enum\", name, labels };\n }\n throw unsupported(\"CREATE TYPE (non-enum)\");\n }\n if (this.atKw(\"domain\")) {\n this.pos++;\n const name = this.qualifiedName();\n this.eatKw(\"as\");\n const baseType = this.parseTypeName();\n let notNull = false;\n let defaultExpr: Expr | null = null;\n const checks: Array<{ name: string | null; expr: Expr }> = [];\n let collate: string[] | null = null;\n for (;;) {\n let cname: string | null = null;\n if (this.eatKw(\"constraint\")) cname = this.ident();\n if (this.eatKw(\"collate\")) {\n collate = this.qualifiedName();\n } else if (this.atKw(\"not\") && this.atKw(\"null\", 1)) {\n this.pos += 2;\n notNull = true;\n } else if (this.eatKw(\"null\")) {\n notNull = false;\n } else if (this.eatKw(\"default\")) {\n defaultExpr = this.parseExpr();\n } else if (this.eatKw(\"check\")) {\n this.expectPunct(\"(\");\n checks.push({ name: cname, expr: this.parseExpr() });\n this.expectPunct(\")\");\n } else {\n if (cname !== null) this.errorAt(this.peek(), \"expected domain constraint\");\n break;\n }\n }\n return { type: \"create_domain\", name, baseType, notNull, defaultExpr, checks, collate };\n }\n if (this.atKw(\"function\") || this.atKw(\"procedure\")) {\n const isProc = this.atKw(\"procedure\");\n this.pos++;\n if (isProc) throw unsupported(\"CREATE PROCEDURE\");\n return this.parseCreateFunction(orReplace);\n }\n if (this.atKw(\"trigger\") || (this.atKw(\"constraint\") && this.atKw(\"trigger\", 1))) {\n if (this.eatKw(\"constraint\")) {\n // constraint triggers behave like AFTER triggers here\n }\n this.expectKw(\"trigger\");\n return this.parseCreateTrigger(orReplace);\n }\n if (this.atKw(\"extension\")) {\n this.pos++;\n this.parseIfNotExists();\n const name = this.ident(true);\n while (!this.atPunct(\";\") && this.peek().type !== \"eof\") this.pos++;\n throw unsupported(`extension \"${name}\"`);\n }\n if (this.atKw(\"database\")) throw unsupported(\"CREATE DATABASE\");\n if (this.atKw(\"role\") || this.atKw(\"user\") || this.atKw(\"group\")) throw unsupported(\"roles\");\n if (this.atKw(\"rule\")) throw unsupported(\"CREATE RULE\");\n if (this.atKw(\"policy\")) throw unsupported(\"CREATE POLICY\");\n if (this.atKw(\"collation\")) throw unsupported(\"CREATE COLLATION\");\n if (this.atKw(\"cast\")) throw unsupported(\"CREATE CAST\");\n if (this.atKw(\"operator\")) throw unsupported(\"CREATE OPERATOR\");\n if (this.atKw(\"aggregate\")) throw unsupported(\"CREATE AGGREGATE\");\n if (this.atKw(\"publication\") || this.atKw(\"subscription\")) throw unsupported(\"replication\");\n if (this.atKw(\"server\") || this.atKw(\"foreign\")) throw unsupported(\"foreign data wrappers\");\n if (this.atKw(\"tablespace\")) throw unsupported(\"CREATE TABLESPACE\");\n if (this.atKw(\"statistics\")) throw unsupported(\"CREATE STATISTICS\");\n this.errorAt(this.peek(), \"unrecognized CREATE\");\n }\n\n private parseIfNotExists(): boolean {\n if (this.atKw(\"if\") && this.atKw(\"not\", 1) && this.atKw(\"exists\", 2)) {\n this.pos += 3;\n return true;\n }\n return false;\n }\n\n private parseIfExists(): boolean {\n if (this.atKw(\"if\") && this.atKw(\"exists\", 1)) {\n this.pos += 2;\n return true;\n }\n return false;\n }\n\n private parseCreateTable(temp: boolean, unlogged: boolean): Statement {\n const ifNotExists = this.parseIfNotExists();\n const name = this.qualifiedName();\n // CREATE TABLE AS\n if (this.atKw(\"as\") || (this.atPunct(\"(\") === false && this.atKw(\"as\"))) {\n this.pos++;\n const query = this.parseSelectStmt();\n let withData = true;\n if (this.eatKw(\"with\")) {\n if (this.eatKw(\"no\")) withData = false;\n this.expectKw(\"data\");\n }\n return { type: \"create_table_as\", name, ifNotExists, temp, columns: null, query, withData, materialized: false };\n }\n let ctasColumns: string[] | null = null;\n if (this.atPunct(\"(\")) {\n // could be column defs or CTAS column list \u2014 look ahead for \") AS\"\n const save = this.pos;\n this.pos++;\n const cols: string[] = [];\n let simpleList = true;\n for (;;) {\n const t = this.peek();\n if (t.type === \"quoted_ident\" || (t.type === \"ident\" && !RESERVED.has(t.value))) {\n cols.push(this.ident());\n } else {\n simpleList = false;\n break;\n }\n if (this.eatPunct(\",\")) continue;\n if (this.eatPunct(\")\")) break;\n simpleList = false;\n break;\n }\n if (simpleList && this.atKw(\"as\")) {\n ctasColumns = cols;\n this.pos++;\n const query = this.parseSelectStmt();\n let withData = true;\n if (this.eatKw(\"with\")) {\n if (this.eatKw(\"no\")) withData = false;\n this.expectKw(\"data\");\n }\n return {\n type: \"create_table_as\",\n name,\n ifNotExists,\n temp,\n columns: ctasColumns,\n query,\n withData,\n materialized: false,\n };\n }\n this.pos = save;\n }\n this.expectPunct(\"(\");\n const columns: ColumnDef[] = [];\n const constraints: TableConstraint[] = [];\n const likeClauses: Array<{ table: string[]; options: string[] }> = [];\n if (!this.atPunct(\")\")) {\n do {\n if (this.atKw(\"like\")) {\n this.pos++;\n const likeTable = this.qualifiedName();\n const options: string[] = [];\n while (this.atKw(\"including\") || this.atKw(\"excluding\")) {\n const mode = this.next().value;\n const what = this.ident(true);\n options.push(`${mode} ${what}`);\n }\n likeClauses.push({ table: likeTable, options });\n continue;\n }\n const tc = this.tryParseTableConstraint();\n if (tc) {\n constraints.push(tc);\n continue;\n }\n columns.push(this.parseColumnDef());\n } while (this.eatPunct(\",\"));\n }\n this.expectPunct(\")\");\n // storage/partition options\n if (this.eatKw(\"inherits\")) throw unsupported(\"table inheritance\");\n if (this.eatKw(\"partition\")) throw unsupported(\"table partitioning\");\n if (this.eatKw(\"using\")) this.ident(true);\n if (this.eatKw(\"with\")) {\n this.expectPunct(\"(\");\n let depth = 1;\n while (depth > 0 && this.peek().type !== \"eof\") {\n if (this.atPunct(\"(\")) depth++;\n if (this.atPunct(\")\")) depth--;\n this.pos++;\n }\n }\n if (this.eatKw(\"on\")) {\n this.expectKw(\"commit\");\n this.ident(true); // preserve / delete / drop \u2192 rows behavior: accept, treat as preserve\n if (this.peek(-1)!.value === \"delete\") this.expectKw(\"rows\");\n }\n if (this.eatKw(\"tablespace\")) this.ident(true);\n return { type: \"create_table\", name, ifNotExists, temp, unlogged, columns, constraints, likeClauses };\n }\n\n private tryParseTableConstraint(): TableConstraint | null {\n let name: string | null = null;\n const save = this.pos;\n if (this.eatKw(\"constraint\")) name = this.ident();\n if (this.atKw(\"primary\") && this.atKw(\"key\", 1)) {\n this.pos += 2;\n this.expectPunct(\"(\");\n const columns: string[] = [];\n do {\n columns.push(this.ident());\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n this.skipConstraintTail();\n return { kind: \"primary_key\", name, columns };\n }\n if (this.atKw(\"unique\") && (this.atPunct(\"(\", 1) || this.atKw(\"nulls\", 1))) {\n this.pos++;\n let nullsNotDistinct = false;\n if (this.eatKw(\"nulls\")) {\n this.expectKw(\"not\");\n this.expectKw(\"distinct\");\n nullsNotDistinct = true;\n }\n this.expectPunct(\"(\");\n const columns: string[] = [];\n do {\n columns.push(this.ident());\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n this.skipConstraintTail();\n return { kind: \"unique\", name, columns, nullsNotDistinct };\n }\n if (this.atKw(\"check\") && this.atPunct(\"(\", 1)) {\n this.pos++;\n this.expectPunct(\"(\");\n const expr = this.parseExpr();\n this.expectPunct(\")\");\n let noInherit = false;\n if (this.atKw(\"no\") && this.atKw(\"inherit\", 1)) {\n this.pos += 2;\n noInherit = true;\n }\n this.skipConstraintTail();\n return { kind: \"check\", name, expr, noInherit };\n }\n if (this.atKw(\"foreign\") && this.atKw(\"key\", 1)) {\n this.pos += 2;\n this.expectPunct(\"(\");\n const columns: string[] = [];\n do {\n columns.push(this.ident());\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n this.expectKw(\"references\");\n const refTable = this.qualifiedName();\n let refColumns: string[] | null = null;\n if (this.eatPunct(\"(\")) {\n refColumns = [];\n do {\n refColumns.push(this.ident());\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n }\n const { onDelete, onUpdate, match } = this.parseRefActions();\n this.skipConstraintTail();\n return { kind: \"foreign_key\", name, columns, refTable, refColumns, onDelete, onUpdate, match };\n }\n if (this.atKw(\"exclude\")) throw unsupported(\"EXCLUDE constraints\");\n this.pos = save;\n return null;\n }\n\n private skipConstraintTail(): void {\n for (;;) {\n if (this.eatKw(\"deferrable\")) continue;\n if (this.atKw(\"not\") && this.atKw(\"deferrable\", 1)) {\n this.pos += 2;\n continue;\n }\n if (this.eatKw(\"initially\")) {\n if (!this.eatKw(\"deferred\")) this.expectKw(\"immediate\");\n continue;\n }\n if (this.eatKw(\"using\")) {\n this.expectKw(\"index\");\n this.expectKw(\"tablespace\");\n this.ident(true);\n continue;\n }\n break;\n }\n }\n\n private parseRefActions(): { onDelete: RefAction; onUpdate: RefAction; match: \"full\" | \"partial\" | \"simple\" | null } {\n let onDelete: RefAction = null;\n let onUpdate: RefAction = null;\n let match: \"full\" | \"partial\" | \"simple\" | null = null;\n for (;;) {\n if (this.eatKw(\"match\")) {\n const m = this.ident(true);\n if (m !== \"full\" && m !== \"partial\" && m !== \"simple\") this.errorAt(this.peek(), \"bad MATCH type\");\n if (m === \"partial\") throw unsupported(\"MATCH PARTIAL\");\n match = m;\n continue;\n }\n if (this.atKw(\"on\") && this.atKw(\"delete\", 1)) {\n this.pos += 2;\n onDelete = this.parseRefAction();\n continue;\n }\n if (this.atKw(\"on\") && this.atKw(\"update\", 1)) {\n this.pos += 2;\n onUpdate = this.parseRefAction();\n continue;\n }\n break;\n }\n return { onDelete, onUpdate, match };\n }\n\n private parseRefAction(): RefAction {\n if (this.eatKw(\"cascade\")) return \"cascade\";\n if (this.eatKw(\"restrict\")) return \"restrict\";\n if (this.atKw(\"no\") && this.atKw(\"action\", 1)) {\n this.pos += 2;\n return \"no_action\";\n }\n if (this.atKw(\"set\") && this.atKw(\"null\", 1)) {\n this.pos += 2;\n return \"set_null\";\n }\n if (this.atKw(\"set\") && this.atKw(\"default\", 1)) {\n this.pos += 2;\n return \"set_default\";\n }\n this.errorAt(this.peek(), \"expected referential action\");\n }\n\n private parseColumnDef(): ColumnDef {\n const name = this.ident();\n const typeName = this.parseTypeName();\n const constraints: ColumnConstraint[] = [];\n for (;;) {\n let cname: string | null = null;\n if (this.eatKw(\"constraint\")) cname = this.ident();\n if (this.atKw(\"not\") && this.atKw(\"null\", 1)) {\n this.pos += 2;\n constraints.push({ kind: \"not_null\", name: cname });\n continue;\n }\n if (this.eatKw(\"null\")) {\n constraints.push({ kind: \"null\", name: cname });\n continue;\n }\n if (this.eatKw(\"default\")) {\n constraints.push({ kind: \"default\", expr: this.parseExpr(), name: cname });\n continue;\n }\n if (this.atKw(\"primary\") && this.atKw(\"key\", 1)) {\n this.pos += 2;\n this.skipConstraintTail();\n constraints.push({ kind: \"primary_key\", name: cname });\n continue;\n }\n if (this.eatKw(\"unique\")) {\n let nullsNotDistinct = false;\n if (this.eatKw(\"nulls\")) {\n this.expectKw(\"not\");\n this.expectKw(\"distinct\");\n nullsNotDistinct = true;\n }\n this.skipConstraintTail();\n constraints.push({ kind: \"unique\", name: cname, nullsNotDistinct });\n continue;\n }\n if (this.eatKw(\"check\")) {\n this.expectPunct(\"(\");\n const expr = this.parseExpr();\n this.expectPunct(\")\");\n let noInherit = false;\n if (this.atKw(\"no\") && this.atKw(\"inherit\", 1)) {\n this.pos += 2;\n noInherit = true;\n }\n constraints.push({ kind: \"check\", expr, name: cname, noInherit });\n continue;\n }\n if (this.eatKw(\"references\")) {\n const table = this.qualifiedName();\n let columns: string[] | null = null;\n if (this.eatPunct(\"(\")) {\n columns = [];\n do {\n columns.push(this.ident());\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n }\n const { onDelete, onUpdate, match } = this.parseRefActions();\n this.skipConstraintTail();\n constraints.push({ kind: \"references\", name: cname, table, columns, onDelete, onUpdate, match });\n continue;\n }\n if (this.eatKw(\"generated\")) {\n if (this.eatKw(\"always\")) {\n this.expectKw(\"as\");\n if (this.eatKw(\"identity\")) {\n const options = this.parseIdentityOptions();\n constraints.push({ kind: \"generated_identity\", always: true, name: cname, options });\n } else {\n this.expectPunct(\"(\");\n const expr = this.parseExpr();\n this.expectPunct(\")\");\n this.expectKw(\"stored\");\n constraints.push({ kind: \"generated_stored\", expr, name: cname });\n }\n } else {\n this.expectKw(\"by\");\n this.expectKw(\"default\");\n this.expectKw(\"as\");\n this.expectKw(\"identity\");\n const options = this.parseIdentityOptions();\n constraints.push({ kind: \"generated_identity\", always: false, name: cname, options });\n }\n continue;\n }\n if (this.eatKw(\"collate\")) {\n constraints.push({ kind: \"collate\", collation: this.qualifiedName() });\n continue;\n }\n if (\n this.eatKw(\"deferrable\") ||\n (this.atKw(\"initially\") && (this.atKw(\"deferred\", 1) || this.atKw(\"immediate\", 1)))\n ) {\n this.skipConstraintTail();\n continue;\n }\n if (this.eatKw(\"storage\")) {\n this.ident(true);\n continue;\n }\n if (this.eatKw(\"compression\")) {\n this.ident(true);\n continue;\n }\n if (cname !== null) this.errorAt(this.peek(), \"expected column constraint\");\n break;\n }\n return { name, typeName, constraints };\n }\n\n private parseIdentityOptions(): SequenceOptions {\n const options: SequenceOptions = {};\n if (this.eatPunct(\"(\")) {\n Object.assign(options, this.parseSequenceOptions());\n this.expectPunct(\")\");\n }\n return options;\n }\n\n private parseSequenceOptions(): SequenceOptions {\n const options: SequenceOptions = {};\n for (;;) {\n if (this.eatKw(\"increment\")) {\n this.eatKw(\"by\");\n options.increment = this.parseSignedBigInt();\n continue;\n }\n if (this.eatKw(\"minvalue\")) {\n options.minValue = this.parseSignedBigInt();\n continue;\n }\n if (this.eatKw(\"maxvalue\")) {\n options.maxValue = this.parseSignedBigInt();\n continue;\n }\n if (this.atKw(\"no\")) {\n if (this.atKw(\"minvalue\", 1)) {\n this.pos += 2;\n options.minValue = \"no\";\n continue;\n }\n if (this.atKw(\"maxvalue\", 1)) {\n this.pos += 2;\n options.maxValue = \"no\";\n continue;\n }\n if (this.atKw(\"cycle\", 1)) {\n this.pos += 2;\n options.cycle = false;\n continue;\n }\n break;\n }\n if (this.eatKw(\"start\")) {\n this.eatKw(\"with\");\n options.start = this.parseSignedBigInt();\n continue;\n }\n if (this.eatKw(\"restart\")) {\n if (this.eatKw(\"with\")) options.restart = this.parseSignedBigInt();\n else if (this.peek().type === \"number\" || this.atOp(\"-\")) options.restart = this.parseSignedBigInt();\n else options.restart = \"default\";\n continue;\n }\n if (this.eatKw(\"cache\")) {\n options.cache = this.parseSignedBigInt();\n continue;\n }\n if (this.eatKw(\"cycle\")) {\n options.cycle = true;\n continue;\n }\n if (this.eatKw(\"owned\")) {\n this.expectKw(\"by\");\n if (this.eatKw(\"none\")) options.ownedBy = \"none\";\n else options.ownedBy = this.qualifiedName();\n continue;\n }\n if (this.eatKw(\"as\")) {\n options.as = this.parseTypeName();\n continue;\n }\n break;\n }\n return options;\n }\n\n private parseSignedBigInt(): bigint {\n let neg = false;\n if (this.eatOp(\"-\")) neg = true;\n else this.eatOp(\"+\");\n const t = this.next();\n if (t.type !== \"number\") this.errorAt(t, \"expected number\");\n const v = BigInt(t.value);\n return neg ? -v : v;\n }\n\n private parseCreateIndex(unique: boolean): CreateIndexStmt {\n const concurrently = this.eatKw(\"concurrently\");\n let name: string | null = null;\n let ifNotExists = false;\n if (!this.atKw(\"on\")) {\n ifNotExists = this.parseIfNotExists();\n if (!this.atKw(\"on\")) name = this.ident();\n }\n this.expectKw(\"on\");\n this.eatKw(\"only\");\n const table = this.qualifiedName();\n let using: string | null = null;\n if (this.eatKw(\"using\")) using = this.ident(true);\n this.expectPunct(\"(\");\n const columns: CreateIndexStmt[\"columns\"][number][] = [];\n do {\n const expr = this.parseExpr();\n let opclass: string | null = null;\n const t = this.peek();\n if (\n t.type === \"ident\" &&\n !RESERVED.has(t.value) &&\n ![\"asc\", \"desc\", \"nulls\", \"with\", \"where\", \"include\"].includes(t.value)\n ) {\n opclass = this.ident();\n }\n let dir: \"asc\" | \"desc\" | null = null;\n if (this.eatKw(\"asc\")) dir = \"asc\";\n else if (this.eatKw(\"desc\")) dir = \"desc\";\n let nulls: \"first\" | \"last\" | null = null;\n if (this.eatKw(\"nulls\")) {\n if (this.eatKw(\"first\")) nulls = \"first\";\n else {\n this.expectKw(\"last\");\n nulls = \"last\";\n }\n }\n columns.push({ expr, dir, nulls, opclass });\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n const include: string[] = [];\n if (this.eatKw(\"include\")) {\n this.expectPunct(\"(\");\n do {\n include.push(this.ident());\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n }\n let nullsNotDistinct = false;\n if (this.eatKw(\"nulls\")) {\n this.expectKw(\"not\");\n this.expectKw(\"distinct\");\n nullsNotDistinct = true;\n }\n if (this.eatKw(\"with\")) {\n this.expectPunct(\"(\");\n let depth = 1;\n while (depth > 0 && this.peek().type !== \"eof\") {\n if (this.atPunct(\"(\")) depth++;\n if (this.atPunct(\")\")) depth--;\n this.pos++;\n }\n }\n if (this.eatKw(\"tablespace\")) this.ident(true);\n const where = this.eatKw(\"where\") ? this.parseExpr() : null;\n return {\n type: \"create_index\",\n unique,\n name,\n ifNotExists,\n table,\n using,\n columns,\n include,\n where,\n nullsNotDistinct,\n concurrently,\n };\n }\n\n private parseCreateView(orReplace: boolean, temp: boolean, materialized: boolean): Statement {\n const ifNotExists = materialized ? this.parseIfNotExists() : false;\n void ifNotExists;\n const name = this.qualifiedName();\n let columns: string[] | null = null;\n if (this.eatPunct(\"(\")) {\n columns = [];\n do {\n columns.push(this.ident());\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n }\n if (this.eatKw(\"with\")) {\n this.expectPunct(\"(\");\n let depth = 1;\n while (depth > 0 && this.peek().type !== \"eof\") {\n if (this.atPunct(\"(\")) depth++;\n if (this.atPunct(\")\")) depth--;\n this.pos++;\n }\n }\n if (this.eatKw(\"using\")) this.ident(true);\n if (this.eatKw(\"tablespace\")) this.ident(true);\n this.expectKw(\"as\");\n const query = this.parseSelectStmt();\n let withData = true;\n if (this.eatKw(\"with\")) {\n if (this.eatKw(\"no\")) {\n withData = false;\n this.expectKw(\"data\");\n } else if (this.eatKw(\"data\")) {\n withData = true;\n } else {\n // WITH CHECK OPTION\n this.eatKw(\"cascaded\") || this.eatKw(\"local\");\n this.expectKw(\"check\");\n this.expectKw(\"option\");\n }\n }\n return { type: \"create_view\", name, orReplace, temp, columns, query, materialized, withData };\n }\n\n private parseCreateFunction(orReplace: boolean): CreateFunctionStmt {\n const name = this.qualifiedName();\n this.expectPunct(\"(\");\n const args: CreateFunctionStmt[\"args\"][number][] = [];\n if (!this.atPunct(\")\")) {\n do {\n let mode: \"in\" | \"out\" | \"inout\" | \"variadic\" = \"in\";\n if (this.eatKw(\"in\")) mode = \"in\";\n else if (this.eatKw(\"out\")) mode = \"out\";\n else if (this.eatKw(\"inout\")) mode = \"inout\";\n else if (this.eatKw(\"variadic\")) mode = \"variadic\";\n // optional arg name then type\n let argName: string | null = null;\n const save = this.pos;\n const t = this.peek();\n if ((t.type === \"ident\" && !RESERVED.has(t.value)) || t.type === \"quoted_ident\") {\n const candidate = this.ident();\n // if next token starts a type, candidate was the name\n const nt = this.peek();\n if (nt.type === \"ident\" || nt.type === \"quoted_ident\") {\n argName = candidate;\n } else {\n this.pos = save;\n }\n }\n const typeName = this.parseTypeName();\n let defaultExpr: Expr | null = null;\n if (this.eatKw(\"default\") || this.eatOp(\"=\")) {\n defaultExpr = this.parseExpr();\n }\n args.push({ name: argName, typeName, mode, defaultExpr });\n } while (this.eatPunct(\",\"));\n }\n this.expectPunct(\")\");\n let returns: TypeName | null = null;\n let returnsTable: CreateFunctionStmt[\"returnsTable\"] = null;\n if (this.eatKw(\"returns\")) {\n if (this.eatKw(\"table\")) {\n this.expectPunct(\"(\");\n const cols: Array<{ name: string; typeName: TypeName }> = [];\n do {\n const cn = this.ident();\n const ct = this.parseTypeName();\n cols.push({ name: cn, typeName: ct });\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n returnsTable = cols;\n } else {\n returns = this.parseTypeName();\n }\n }\n let language = \"sql\";\n let body: string | null = null;\n let sqlBody: Statement[] | null = null;\n let volatility: \"immutable\" | \"stable\" | \"volatile\" | null = null;\n let strict = false;\n for (;;) {\n if (this.eatKw(\"language\")) {\n language = this.peek().type === \"string\" ? this.next().value : this.ident(true);\n continue;\n }\n if (this.eatKw(\"as\")) {\n const t = this.next();\n if (t.type !== \"string\") this.errorAt(t, \"expected function body string\");\n body = t.value;\n if (this.eatPunct(\",\")) {\n // C-style AS 'obj', 'link' \u2014 unsupported\n throw unsupported(\"C functions\");\n }\n continue;\n }\n if (this.eatKw(\"immutable\")) {\n volatility = \"immutable\";\n continue;\n }\n if (this.eatKw(\"stable\")) {\n volatility = \"stable\";\n continue;\n }\n if (this.eatKw(\"volatile\")) {\n volatility = \"volatile\";\n continue;\n }\n if (this.eatKw(\"strict\")) {\n strict = true;\n continue;\n }\n if (this.eatKw(\"called\")) {\n this.expectKw(\"on\");\n this.expectKw(\"null\");\n this.expectKw(\"input\");\n continue;\n }\n if (this.eatKw(\"returns\")) {\n this.expectKw(\"null\");\n this.expectKw(\"on\");\n this.expectKw(\"null\");\n this.expectKw(\"input\");\n strict = true;\n continue;\n }\n if (this.eatKw(\"parallel\")) {\n this.ident(true);\n continue;\n }\n if (this.eatKw(\"cost\") || this.eatKw(\"rows\")) {\n this.next();\n continue;\n }\n if (this.eatKw(\"security\")) {\n this.ident(true);\n continue;\n }\n if (this.eatKw(\"set\")) {\n // SET config = value\n this.ident(true);\n if (this.eatOp(\"=\") || this.eatKw(\"to\")) this.next();\n continue;\n }\n if (this.eatKw(\"window\")) throw unsupported(\"window functions via CREATE FUNCTION\");\n if (this.eatKw(\"return\")) {\n // SQL-standard body: RETURN expr\n const expr = this.parseExpr();\n const core: SelectCore = {\n type: \"select_core\",\n distinct: null,\n targets: [{ expr, alias: null }],\n from: [],\n where: null,\n groupBy: null,\n groupDistinct: false,\n having: null,\n windows: [],\n };\n sqlBody = [\n {\n type: \"select\",\n with: null,\n body: core,\n orderBy: [],\n limit: null,\n limitWithTies: false,\n offset: null,\n lockingClause: null,\n },\n ];\n continue;\n }\n if (this.eatKw(\"begin\")) {\n this.expectKw(\"atomic\");\n const stmts: Statement[] = [];\n while (!this.atKw(\"end\")) {\n if (this.eatPunct(\";\")) continue;\n if (this.eatKw(\"return\")) {\n const expr = this.parseExpr();\n const core: SelectCore = {\n type: \"select_core\",\n distinct: null,\n targets: [{ expr, alias: null }],\n from: [],\n where: null,\n groupBy: null,\n groupDistinct: false,\n having: null,\n windows: [],\n };\n stmts.push({\n type: \"select\",\n with: null,\n body: core,\n orderBy: [],\n limit: null,\n limitWithTies: false,\n offset: null,\n lockingClause: null,\n });\n } else {\n stmts.push(this.parseStatement());\n }\n }\n this.expectKw(\"end\");\n sqlBody = stmts;\n continue;\n }\n break;\n }\n return {\n type: \"create_function\",\n orReplace,\n name,\n args,\n returns,\n returnsTable,\n language,\n body,\n sqlBody,\n volatility,\n strict,\n };\n }\n\n private parseCreateTrigger(orReplace: boolean): CreateTriggerStmt {\n const name = this.ident();\n let timing: \"before\" | \"after\" | \"instead_of\";\n if (this.eatKw(\"before\")) timing = \"before\";\n else if (this.eatKw(\"after\")) timing = \"after\";\n else {\n this.expectKw(\"instead\");\n this.expectKw(\"of\");\n timing = \"instead_of\";\n }\n const events: CreateTriggerStmt[\"events\"][number][] = [];\n do {\n if (this.eatKw(\"insert\")) events.push({ event: \"insert\", columns: null });\n else if (this.eatKw(\"delete\")) events.push({ event: \"delete\", columns: null });\n else if (this.eatKw(\"truncate\")) events.push({ event: \"truncate\", columns: null });\n else {\n this.expectKw(\"update\");\n let columns: string[] | null = null;\n if (this.eatKw(\"of\")) {\n columns = [];\n do {\n columns.push(this.ident());\n } while (this.eatPunct(\",\"));\n }\n events.push({ event: \"update\", columns });\n }\n } while (this.eatKw(\"or\"));\n this.expectKw(\"on\");\n const table = this.qualifiedName();\n // referencing / deferrable clauses\n if (this.eatKw(\"referencing\")) throw unsupported(\"trigger transition tables\");\n while (this.atKw(\"not\") || this.atKw(\"deferrable\") || this.atKw(\"initially\")) {\n this.pos++;\n }\n let forEachRow = false;\n if (this.eatKw(\"for\")) {\n this.eatKw(\"each\");\n if (this.eatKw(\"row\")) forEachRow = true;\n else this.expectKw(\"statement\");\n }\n let when: Expr | null = null;\n if (this.eatKw(\"when\")) {\n this.expectPunct(\"(\");\n when = this.parseExpr();\n this.expectPunct(\")\");\n }\n this.expectKw(\"execute\");\n if (!this.eatKw(\"function\")) this.expectKw(\"procedure\");\n const funcName = this.qualifiedName();\n this.expectPunct(\"(\");\n const funcArgs: string[] = [];\n if (!this.atPunct(\")\")) {\n do {\n const t = this.next();\n funcArgs.push(t.value);\n } while (this.eatPunct(\",\"));\n }\n this.expectPunct(\")\");\n return { type: \"create_trigger\", orReplace, name, timing, events, table, forEachRow, when, funcName, funcArgs };\n }\n\n // --- ALTER --------------------------------------------------------------------\n\n private parseAlter(): Statement {\n this.expectKw(\"alter\");\n if (this.eatKw(\"table\")) {\n const ifExists = this.parseIfExists();\n const only = this.eatKw(\"only\");\n const table = this.qualifiedName();\n const actions: AlterTableAction[] = [];\n do {\n actions.push(this.parseAlterTableAction());\n } while (this.eatPunct(\",\"));\n return { type: \"alter_table\", table, ifExists, only, actions } satisfies AlterTableStmt;\n }\n if (this.eatKw(\"sequence\")) {\n const ifExists = this.parseIfExists();\n const name = this.qualifiedName();\n if (this.atKw(\"rename\")) {\n this.pos++;\n this.expectKw(\"to\");\n const to = this.ident();\n return {\n type: \"alter_sequence\",\n name,\n ifExists,\n options: { ownedBy: undefined } as SequenceOptions & { renameTo?: string },\n ...({ renameTo: to } as any),\n } as any;\n }\n const options = this.parseSequenceOptions();\n return { type: \"alter_sequence\", name, ifExists, options };\n }\n let isMatView = false;\n if (!this.atKw(\"view\") && this.atKw(\"materialized\") && this.atKw(\"view\", 1)) {\n this.pos += 2;\n isMatView = true;\n }\n if (isMatView || this.eatKw(\"view\")) {\n const ifExists = this.parseIfExists();\n const name = this.qualifiedName();\n if (this.eatKw(\"rename\")) {\n this.expectKw(\"to\");\n return { type: \"alter_view\", name, ifExists, action: { kind: \"rename_table\", to: this.ident() } };\n }\n if (this.eatKw(\"set\")) {\n this.expectKw(\"schema\");\n return { type: \"alter_view\", name, ifExists, action: { kind: \"set_schema\", to: this.ident() } };\n }\n if (this.eatKw(\"owner\")) {\n this.expectKw(\"to\");\n this.ident(true);\n return { type: \"no_op\", what: \"ALTER VIEW OWNER\" };\n }\n throw unsupported(\"this ALTER VIEW form\");\n }\n if (this.eatKw(\"index\")) {\n const ifExists = this.parseIfExists();\n const name = this.qualifiedName();\n if (this.eatKw(\"rename\")) {\n this.expectKw(\"to\");\n return { type: \"alter_index\", name, ifExists, action: { kind: \"rename_table\", to: this.ident() } };\n }\n throw unsupported(\"this ALTER INDEX form\");\n }\n if (this.eatKw(\"schema\")) {\n const name = this.ident();\n if (this.eatKw(\"rename\")) {\n this.expectKw(\"to\");\n return { type: \"alter_schema\", name, action: { kind: \"rename\", to: this.ident() } };\n }\n throw unsupported(\"this ALTER SCHEMA form\");\n }\n if (this.eatKw(\"type\")) {\n const name = this.qualifiedName();\n if (this.eatKw(\"add\")) {\n this.expectKw(\"value\");\n const ifNotExists = this.parseIfNotExists();\n const t = this.next();\n if (t.type !== \"string\") this.errorAt(t, \"expected string\");\n let before: string | null = null;\n let after: string | null = null;\n if (this.eatKw(\"before\")) {\n const b = this.next();\n before = b.value;\n } else if (this.eatKw(\"after\")) {\n const a = this.next();\n after = a.value;\n }\n return {\n type: \"alter_enum\",\n name,\n action: { kind: \"add_value\", label: t.value, ifNotExists, before, after },\n } satisfies AlterEnumStmt;\n }\n if (this.eatKw(\"rename\")) {\n this.expectKw(\"value\");\n const from = this.next();\n this.expectKw(\"to\");\n const to = this.next();\n return { type: \"alter_enum\", name, action: { kind: \"rename_value\", from: from.value, to: to.value } };\n }\n throw unsupported(\"this ALTER TYPE form\");\n }\n if (this.eatKw(\"function\")) {\n this.skipToStatementEnd();\n return { type: \"no_op\", what: \"ALTER FUNCTION\" };\n }\n if (\n this.eatKw(\"database\") ||\n this.eatKw(\"role\") ||\n this.eatKw(\"user\") ||\n this.eatKw(\"system\") ||\n this.eatKw(\"default\")\n ) {\n this.skipToStatementEnd();\n return { type: \"no_op\", what: \"ALTER (other)\" };\n }\n throw unsupported(\"this ALTER form\");\n }\n\n private parseAlterTableAction(): AlterTableAction {\n if (this.eatKw(\"add\")) {\n if (this.eatKw(\"column\")) {\n const ifNotExists = this.parseIfNotExists();\n return { kind: \"add_column\", column: this.parseColumnDef(), ifNotExists };\n }\n const constraint = this.tryParseTableConstraint();\n if (constraint) {\n let skipValidation = false;\n if (this.atKw(\"not\") && this.atKw(\"valid\", 1)) {\n this.pos += 2;\n skipValidation = true;\n }\n return { kind: \"add_constraint\", constraint, skipValidation };\n }\n // ADD colname type\n const ifNotExists = this.parseIfNotExists();\n return { kind: \"add_column\", column: this.parseColumnDef(), ifNotExists };\n }\n if (this.eatKw(\"drop\")) {\n if (this.eatKw(\"constraint\")) {\n const ifExists = this.parseIfExists();\n const name = this.ident();\n const cascade = this.eatKw(\"cascade\");\n if (!cascade) this.eatKw(\"restrict\");\n return { kind: \"drop_constraint\", name, ifExists, cascade };\n }\n this.eatKw(\"column\");\n const ifExists = this.parseIfExists();\n const name = this.ident();\n const cascade = this.eatKw(\"cascade\");\n if (!cascade) this.eatKw(\"restrict\");\n return { kind: \"drop_column\", name, ifExists, cascade };\n }\n if (this.eatKw(\"alter\")) {\n this.eatKw(\"column\");\n const column = this.ident();\n let alterType = this.eatKw(\"type\");\n if (!alterType && this.eatKw(\"set\") && this.atKw(\"data\")) {\n this.pos += 1;\n this.expectKw(\"type\");\n alterType = true;\n }\n if (alterType) {\n const typeName = this.parseTypeName();\n const using = this.eatKw(\"using\") ? this.parseExpr() : null;\n return { kind: \"alter_type\", column, typeName, using };\n }\n if (this.atKw(\"set\")) {\n // we already consumed SET in the branch above only when followed by DATA\n // handle here: SET DEFAULT / SET NOT NULL\n }\n if (this.eatKw(\"set\")) {\n if (this.eatKw(\"default\")) return { kind: \"set_default\", column, expr: this.parseExpr() };\n if (this.atKw(\"not\") && this.atKw(\"null\", 1)) {\n this.pos += 2;\n return { kind: \"set_not_null\", column };\n }\n if (this.eatKw(\"statistics\")) {\n this.next();\n return { kind: \"rename_column\", from: column, to: column }; // no-op-ish\n }\n throw unsupported(\"this ALTER COLUMN SET form\");\n }\n if (this.eatKw(\"drop\")) {\n if (this.eatKw(\"default\")) return { kind: \"drop_default\", column };\n if (this.atKw(\"not\") && this.atKw(\"null\", 1)) {\n this.pos += 2;\n return { kind: \"drop_not_null\", column };\n }\n if (this.eatKw(\"identity\")) {\n const ifExists = this.parseIfExists();\n return { kind: \"drop_identity\", column, ifExists };\n }\n if (this.eatKw(\"expression\")) {\n this.parseIfExists();\n throw unsupported(\"ALTER COLUMN DROP EXPRESSION\");\n }\n throw unsupported(\"this ALTER COLUMN DROP form\");\n }\n if (this.eatKw(\"add\")) {\n this.expectKw(\"generated\");\n const always = this.eatKw(\"always\");\n if (!always) {\n this.expectKw(\"by\");\n this.expectKw(\"default\");\n }\n this.expectKw(\"as\");\n this.expectKw(\"identity\");\n const options = this.parseIdentityOptions();\n return { kind: \"add_identity\", column, always, options };\n }\n throw unsupported(\"this ALTER COLUMN form\");\n }\n if (this.eatKw(\"rename\")) {\n if (this.eatKw(\"constraint\")) {\n const from = this.ident();\n this.expectKw(\"to\");\n return { kind: \"rename_constraint\", from, to: this.ident() };\n }\n if (this.eatKw(\"to\")) {\n return { kind: \"rename_table\", to: this.ident() };\n }\n this.eatKw(\"column\");\n const from = this.ident();\n this.expectKw(\"to\");\n return { kind: \"rename_column\", from, to: this.ident() };\n }\n if (this.eatKw(\"set\")) {\n if (this.eatKw(\"schema\")) return { kind: \"set_schema\", to: this.ident() };\n throw unsupported(\"this ALTER TABLE SET form\");\n }\n if (this.eatKw(\"owner\")) {\n this.expectKw(\"to\");\n return { kind: \"owner_to\", role: this.ident(true) };\n }\n if (this.eatKw(\"validate\")) {\n this.expectKw(\"constraint\");\n return { kind: \"validate_constraint\", name: this.ident() };\n }\n if (this.eatKw(\"enable\") || this.eatKw(\"disable\")) {\n this.skipToStatementEnd();\n return { kind: \"rename_table\", to: \"\" } as never; // unreachable in practice\n }\n throw unsupported(\"this ALTER TABLE action\");\n }\n\n // --- DROP / TRUNCATE ------------------------------------------------------------\n\n private parseDrop(): Statement {\n this.expectKw(\"drop\");\n let kind: Statement extends never ? never : import(\"../ast/nodes.ts\").DropStmt[\"kind\"];\n if (this.eatKw(\"table\")) kind = \"table\";\n else if (this.atKw(\"materialized\") && this.atKw(\"view\", 1)) {\n this.pos += 2;\n kind = \"materialized_view\";\n } else if (this.eatKw(\"view\")) kind = \"view\";\n else if (this.eatKw(\"index\")) {\n this.eatKw(\"concurrently\");\n kind = \"index\";\n } else if (this.eatKw(\"sequence\")) kind = \"sequence\";\n else if (this.eatKw(\"schema\")) kind = \"schema\";\n else if (this.eatKw(\"type\")) kind = \"type\";\n else if (this.eatKw(\"domain\")) kind = \"domain\";\n else if (this.eatKw(\"function\")) kind = \"function\";\n else if (this.eatKw(\"trigger\")) kind = \"trigger\";\n else if (this.eatKw(\"extension\")) kind = \"extension\";\n else if (this.eatKw(\"database\")) throw unsupported(\"DROP DATABASE\");\n else if (this.eatKw(\"role\") || this.eatKw(\"user\")) throw unsupported(\"roles\");\n else if (this.eatKw(\"rule\")) throw unsupported(\"DROP RULE\");\n else if (this.eatKw(\"policy\")) throw unsupported(\"DROP POLICY\");\n else if (this.eatKw(\"owned\")) throw unsupported(\"DROP OWNED\");\n else this.errorAt(this.peek(), \"unrecognized DROP\");\n const ifExists = this.parseIfExists();\n const names: string[][] = [];\n const funcArgs: TypeName[][] | null = kind === \"function\" ? [] : null;\n do {\n names.push(this.qualifiedName());\n if (kind === \"function\" && this.eatPunct(\"(\")) {\n const types: TypeName[] = [];\n if (!this.atPunct(\")\")) {\n do {\n // allow optional arg name\n const save = this.pos;\n try {\n const t = this.peek();\n if ((t.type === \"ident\" && !RESERVED.has(t.value)) || t.type === \"quoted_ident\") {\n this.ident();\n if (this.atPunct(\",\") || this.atPunct(\")\")) {\n this.pos = save;\n }\n }\n } catch {\n this.pos = save;\n }\n types.push(this.parseTypeName());\n } while (this.eatPunct(\",\"));\n }\n this.expectPunct(\")\");\n funcArgs!.push(types);\n } else if (funcArgs) {\n funcArgs.push([]);\n }\n } while (this.eatPunct(\",\"));\n let onTable: string[] | null = null;\n if (kind === \"trigger\") {\n this.expectKw(\"on\");\n onTable = this.qualifiedName();\n }\n let cascade = false;\n if (this.eatKw(\"cascade\")) cascade = true;\n else this.eatKw(\"restrict\");\n return { type: \"drop\", kind, names, onTable, funcArgs, ifExists, cascade };\n }\n\n private parseTruncate(): Statement {\n this.expectKw(\"truncate\");\n this.eatKw(\"table\");\n const tables: string[][] = [];\n do {\n this.eatKw(\"only\");\n tables.push(this.qualifiedName());\n this.eatOp(\"*\");\n } while (this.eatPunct(\",\"));\n let restartIdentity = false;\n if (this.eatKw(\"restart\")) {\n this.expectKw(\"identity\");\n restartIdentity = true;\n } else if (this.eatKw(\"continue\")) {\n this.expectKw(\"identity\");\n }\n let cascade = false;\n if (this.eatKw(\"cascade\")) cascade = true;\n else this.eatKw(\"restrict\");\n return { type: \"truncate\", tables, restartIdentity, cascade };\n }\n\n // --- SET / EXPLAIN / COPY -----------------------------------------------------\n\n private parseSet(): Statement {\n this.expectKw(\"set\");\n let local = false;\n if (this.eatKw(\"local\")) local = true;\n else this.eatKw(\"session\");\n if (this.atKw(\"transaction\")) {\n this.skipToStatementEnd();\n return { type: \"no_op\", what: \"SET TRANSACTION\" };\n }\n if (this.atKw(\"constraints\")) {\n this.skipToStatementEnd();\n return { type: \"no_op\", what: \"SET CONSTRAINTS\" };\n }\n if (this.atKw(\"role\") || (this.atKw(\"session\", 0) && this.atKw(\"authorization\", 1))) {\n this.skipToStatementEnd();\n return { type: \"no_op\", what: \"SET ROLE\" };\n }\n if (this.atKw(\"time\") && this.atKw(\"zone\", 1)) {\n this.pos += 2;\n if (this.eatKw(\"local\") || this.eatKw(\"default\")) {\n return { type: \"set\", name: \"timezone\", value: null, local };\n }\n const t = this.next();\n if (t.type === \"string\") return { type: \"set\", name: \"timezone\", value: t.value, local };\n if (t.type === \"ident\") return { type: \"set\", name: \"timezone\", value: t.value, local };\n if (t.type === \"number\") return { type: \"set\", name: \"timezone\", value: t.value, local };\n if (t.type === \"op\" && (t.value === \"-\" || t.value === \"+\")) {\n const n = this.next();\n return { type: \"set\", name: \"timezone\", value: `${t.value}${n.value}`, local };\n }\n this.errorAt(t, \"expected time zone\");\n }\n const parts = [this.ident(true)];\n while (this.atPunct(\".\")) {\n this.pos++;\n parts.push(this.ident(true));\n }\n const name = parts.join(\".\");\n if (!this.eatKw(\"to\") && !this.eatOp(\"=\")) this.errorAt(this.peek(), \"expected TO or =\");\n if (this.eatKw(\"default\")) return { type: \"set\", name, value: null, local };\n const values: string[] = [];\n do {\n const t = this.next();\n if (t.type === \"string\" || t.type === \"ident\" || t.type === \"number\" || t.type === \"quoted_ident\") {\n values.push(t.value);\n } else if (t.type === \"op\" && (t.value === \"-\" || t.value === \"+\") && this.peek().type === \"number\") {\n values.push(`${t.value}${this.next().value}`);\n } else {\n this.errorAt(t, \"expected value\");\n }\n } while (this.eatPunct(\",\"));\n return { type: \"set\", name, value: values.join(\", \"), local };\n }\n\n private parseExplain(): Statement {\n this.expectKw(\"explain\");\n let analyze = false;\n let verbose = false;\n if (this.atPunct(\"(\")) {\n this.pos++;\n let depth = 1;\n const opts: string[] = [];\n while (depth > 0 && this.peek().type !== \"eof\") {\n if (this.atPunct(\"(\")) depth++;\n if (this.atPunct(\")\")) depth--;\n if (depth > 0) opts.push(this.next().value);\n else this.pos++;\n }\n const joined = opts.join(\" \").toLowerCase();\n analyze = /\\banalyze\\b(?! (off|false|0))/.test(joined);\n verbose = /\\bverbose\\b(?! (off|false|0))/.test(joined);\n } else {\n if (this.eatKw(\"analyze\") || this.eatKw(\"analyse\")) analyze = true;\n if (this.eatKw(\"verbose\")) verbose = true;\n }\n const query = this.parseStatement();\n return { type: \"explain\", analyze, verbose, query };\n }\n\n private parseCopy(): CopyStmt {\n this.expectKw(\"copy\");\n let table: string[] | null = null;\n let columns: string[] | null = null;\n let query: Statement | null = null;\n if (this.atPunct(\"(\")) {\n this.pos++;\n query = this.parseWithableStatement();\n this.expectPunct(\")\");\n } else {\n table = this.qualifiedName();\n if (this.eatPunct(\"(\")) {\n columns = [];\n do {\n columns.push(this.ident());\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n }\n }\n let direction: \"from\" | \"to\";\n if (this.eatKw(\"from\")) direction = \"from\";\n else {\n this.expectKw(\"to\");\n direction = \"to\";\n }\n let target: \"stdin\" | \"stdout\";\n if (this.eatKw(\"stdin\")) target = \"stdin\";\n else if (this.eatKw(\"stdout\")) target = \"stdout\";\n else if (this.eatKw(\"program\")) throw unsupported(\"COPY PROGRAM\");\n else throw unsupported(\"COPY to/from files\");\n const options: Record<string, string | boolean> = {};\n if (this.eatKw(\"with\")) {\n // WITH (...) or legacy\n }\n if (this.atPunct(\"(\")) {\n this.pos++;\n if (!this.atPunct(\")\")) {\n do {\n const key = this.ident(true);\n if (this.atPunct(\",\") || this.atPunct(\")\")) {\n options[key] = true;\n } else {\n const v = this.next();\n options[key] = v.value;\n }\n } while (this.eatPunct(\",\"));\n }\n this.expectPunct(\")\");\n } else {\n // legacy options\n for (;;) {\n if (this.eatKw(\"csv\")) {\n options.format = \"csv\";\n continue;\n }\n if (this.eatKw(\"binary\")) {\n options.format = \"binary\";\n continue;\n }\n if (this.eatKw(\"delimiter\")) {\n this.eatKw(\"as\");\n options.delimiter = this.next().value;\n continue;\n }\n if (this.eatKw(\"null\")) {\n this.eatKw(\"as\");\n options.null = this.next().value;\n continue;\n }\n if (this.eatKw(\"header\")) {\n options.header = true;\n continue;\n }\n if (this.eatKw(\"quote\")) {\n this.eatKw(\"as\");\n options.quote = this.next().value;\n continue;\n }\n if (this.eatKw(\"escape\")) {\n this.eatKw(\"as\");\n options.escape = this.next().value;\n continue;\n }\n break;\n }\n }\n return { type: \"copy\", table, columns, query, direction, target, options };\n }\n\n // --- type names ------------------------------------------------------------------\n\n parseTypeName(): TypeName {\n const setof = this.eatKw(\"setof\");\n const t = this.peek();\n let parts: string[];\n let mods: number[] = [];\n if (t.type === \"ident\") {\n // multi-word types\n if (t.value === \"double\" && this.atKw(\"precision\", 1)) {\n this.pos += 2;\n parts = [\"double precision\"];\n } else if (t.value === \"character\" && this.atKw(\"varying\", 1)) {\n this.pos += 2;\n parts = [\"character varying\"];\n } else if (t.value === \"bit\" && this.atKw(\"varying\", 1)) {\n this.pos += 2;\n parts = [\"bit varying\"];\n } else if (\n (t.value === \"timestamp\" || t.value === \"time\") &&\n (this.atKw(\"with\", 1) || this.atKw(\"without\", 1) || this.atPunct(\"(\", 1))\n ) {\n this.pos++;\n // optional precision\n if (this.eatPunct(\"(\")) {\n const num = this.next();\n if (num.type !== \"number\") this.errorAt(num, \"expected precision\");\n mods.push(Number(num.value));\n this.expectPunct(\")\");\n }\n let withTz = false;\n if (this.eatKw(\"with\")) {\n this.expectKw(\"time\");\n this.expectKw(\"zone\");\n withTz = true;\n } else if (this.eatKw(\"without\")) {\n this.expectKw(\"time\");\n this.expectKw(\"zone\");\n }\n parts = [withTz ? `${t.value}tz` : t.value];\n // array suffix below\n let arrayDims = 0;\n while (this.atPunct(\"[\")) {\n this.pos++;\n if (this.peek().type === \"number\") this.next();\n this.expectPunct(\"]\");\n arrayDims++;\n }\n return { parts, mods, arrayDims, setof };\n } else if (t.value === \"interval\") {\n this.pos++;\n parts = [\"interval\"];\n // interval field qualifiers: YEAR TO MONTH etc. \u2014 accept and ignore fields\n const fieldWords = [\"year\", \"month\", \"day\", \"hour\", \"minute\", \"second\"];\n if (this.peek().type === \"ident\" && fieldWords.includes(this.peek().value)) {\n this.pos++;\n if (this.eatKw(\"to\")) {\n this.pos++;\n }\n }\n if (this.eatPunct(\"(\")) {\n const num = this.next();\n if (num.type !== \"number\") this.errorAt(num, \"expected precision\");\n mods.push(Number(num.value));\n this.expectPunct(\")\");\n }\n return { parts, mods, arrayDims: 0, setof };\n } else {\n parts = this.qualifiedName();\n }\n } else if (t.type === \"quoted_ident\") {\n parts = this.qualifiedName();\n } else {\n this.errorAt(t, \"expected type name\");\n }\n if (this.atPunct(\"(\")) {\n this.pos++;\n mods = [];\n do {\n let neg = false;\n if (this.eatOp(\"-\")) neg = true;\n const num = this.next();\n if (num.type !== \"number\") this.errorAt(num, \"expected typmod\");\n mods.push(neg ? -Number(num.value) : Number(num.value));\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n }\n let arrayDims = 0;\n if (this.atKw(\"array\")) {\n this.pos++;\n arrayDims = 1;\n if (this.atPunct(\"[\")) {\n this.pos++;\n if (this.peek().type === \"number\") this.next();\n this.expectPunct(\"]\");\n }\n }\n while (this.atPunct(\"[\")) {\n this.pos++;\n if (this.peek().type === \"number\") this.next();\n this.expectPunct(\"]\");\n arrayDims++;\n }\n return { parts, mods, arrayDims, setof };\n }\n\n // --- expressions ------------------------------------------------------------------\n\n parseExpr(): Expr {\n return this.parseOr();\n }\n\n private parseOr(): Expr {\n let left = this.parseAnd();\n while (this.eatKw(\"or\")) {\n const right = this.parseAnd();\n left = { type: \"binop\", op: \"or\", left, right };\n }\n return left;\n }\n\n private parseAnd(): Expr {\n let left = this.parseNot();\n while (this.eatKw(\"and\")) {\n const right = this.parseNot();\n left = { type: \"binop\", op: \"and\", left, right };\n }\n return left;\n }\n\n private parseNot(): Expr {\n if (this.eatKw(\"not\")) {\n const operand = this.parseNot();\n return { type: \"unop\", op: \"not\", operand };\n }\n return this.parseIs();\n }\n\n private parseIs(): Expr {\n let left = this.parseComparison();\n for (;;) {\n if (this.atKw(\"is\")) {\n this.pos++;\n const not = this.eatKw(\"not\");\n if (this.eatKw(\"null\")) {\n left = { type: \"is_null\", expr: left, not };\n continue;\n }\n if (this.eatKw(\"true\")) {\n left = { type: \"bool_test\", expr: left, test: \"true\", not };\n continue;\n }\n if (this.eatKw(\"false\")) {\n left = { type: \"bool_test\", expr: left, test: \"false\", not };\n continue;\n }\n if (this.eatKw(\"unknown\")) {\n left = { type: \"bool_test\", expr: left, test: \"unknown\", not };\n continue;\n }\n if (this.eatKw(\"distinct\")) {\n this.expectKw(\"from\");\n const right = this.parseComparison();\n left = { type: \"is_distinct\", left, right, not };\n continue;\n }\n if (this.eatKw(\"normalized\")) {\n left = { type: \"func\", name: [\"pg_catalog\", \"is_normalized\"], args: [left] };\n if (not) left = { type: \"unop\", op: \"not\", operand: left };\n continue;\n }\n if (this.eatKw(\"json\")) {\n throw unsupported(\"IS JSON\");\n }\n if (this.eatKw(\"document\")) throw unsupported(\"IS DOCUMENT\");\n this.errorAt(this.peek(), \"expected NULL/TRUE/FALSE/UNKNOWN/DISTINCT after IS\");\n }\n if (this.atKw(\"isnull\")) {\n this.pos++;\n left = { type: \"is_null\", expr: left, not: false };\n continue;\n }\n if (this.atKw(\"notnull\")) {\n this.pos++;\n left = { type: \"is_null\", expr: left, not: true };\n continue;\n }\n break;\n }\n return left;\n }\n\n private parseComparison(): Expr {\n const left = this.parseLikeBetweenIn();\n if (this.atKw(\"overlaps\")) {\n this.pos++;\n const right = this.parseLikeBetweenIn();\n return { type: \"func\", name: [\"__overlaps\"], args: [left, right] };\n }\n const t = this.peek();\n if (t.type === \"op\" && COMPARE_OPS.has(t.value)) {\n const op = t.value === \"!=\" ? \"<>\" : t.value;\n this.pos++;\n // ANY / ALL / SOME\n const sub = this.tryParseAnyAll(op, left);\n if (sub) return sub;\n const right = this.parseLikeBetweenIn();\n return { type: \"binop\", op, left, right };\n }\n return left;\n }\n\n private tryParseAnyAll(op: string, left: Expr): Expr | null {\n let kind: \"any\" | \"all\" | null = null;\n if (this.atKw(\"any\") || this.atKw(\"some\")) kind = \"any\";\n else if (this.atKw(\"all\")) kind = \"all\";\n if (kind === null) return null;\n this.pos++;\n this.expectPunct(\"(\");\n if (this.atKw(\"select\") || this.atKw(\"with\") || this.atKw(\"values\")) {\n const query = this.parseSelectStmt();\n this.expectPunct(\")\");\n return { type: \"subquery_expr\", kind, op, left, query };\n }\n // array form: op ANY(array_expr)\n const arr = this.parseExpr();\n this.expectPunct(\")\");\n return { type: \"func\", name: [`__${kind}_array`], args: [left, arr, { type: \"string_lit\", value: op }] };\n }\n\n private parseLikeBetweenIn(): Expr {\n let left = this.parseGenericOps();\n for (;;) {\n const not =\n this.atKw(\"not\") &&\n (this.atKw(\"like\", 1) ||\n this.atKw(\"ilike\", 1) ||\n this.atKw(\"in\", 1) ||\n this.atKw(\"between\", 1) ||\n this.atKw(\"similar\", 1));\n if (not) this.pos++;\n if (this.eatKw(\"like\") || (this.peek(-1)?.value === \"like\" && false)) {\n const pattern = this.parseGenericOps();\n const escape = this.eatKw(\"escape\") ? this.parseGenericOps() : null;\n left = { type: \"like\", kind: \"like\", left, pattern, escape, not };\n continue;\n }\n if (this.eatKw(\"ilike\")) {\n const pattern = this.parseGenericOps();\n const escape = this.eatKw(\"escape\") ? this.parseGenericOps() : null;\n left = { type: \"like\", kind: \"ilike\", left, pattern, escape, not };\n continue;\n }\n if (this.atKw(\"similar\") && this.atKw(\"to\", 1)) {\n this.pos += 2;\n const pattern = this.parseGenericOps();\n const escape = this.eatKw(\"escape\") ? this.parseGenericOps() : null;\n left = { type: \"like\", kind: \"similar\", left, pattern, escape, not };\n continue;\n }\n if (this.eatKw(\"between\")) {\n const symmetric = this.eatKw(\"symmetric\");\n if (!symmetric) this.eatKw(\"asymmetric\");\n const low = this.parseGenericOps();\n this.expectKw(\"and\");\n const high = this.parseGenericOps();\n left = { type: \"between\", left, low, high, not, symmetric };\n continue;\n }\n if (this.eatKw(\"in\")) {\n this.expectPunct(\"(\");\n if (this.atKw(\"select\") || this.atKw(\"with\") || this.atKw(\"values\")) {\n const query = this.parseSelectStmt();\n this.expectPunct(\")\");\n left = { type: \"in_expr\", left, not, query };\n } else {\n const list: Expr[] = [];\n do {\n list.push(this.parseExpr());\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n left = { type: \"in_expr\", left, not, list };\n }\n continue;\n }\n if (not) this.errorAt(this.peek(), \"expected LIKE/ILIKE/IN/BETWEEN/SIMILAR after NOT\");\n break;\n }\n return left;\n }\n\n /** all other binary operators: ||, &, |, #, <<, >>, @>, <@, ->, ->>, etc. */\n private parseGenericOps(): Expr {\n let left = this.parseAdditive();\n for (;;) {\n const t = this.peek();\n if (this.atKw(\"at\")) {\n // AT TIME ZONE / AT LOCAL\n const save = this.pos;\n this.pos++;\n if (this.eatKw(\"time\")) {\n this.expectKw(\"zone\");\n const zone = this.parseAdditive();\n left = { type: \"at_time_zone\", expr: left, zone };\n continue;\n }\n if (this.eatKw(\"local\")) {\n left = { type: \"at_time_zone\", expr: left, zone: { type: \"func\", name: [\"__session_timezone\"], args: [] } };\n continue;\n }\n this.pos = save;\n break;\n }\n if (this.atKw(\"collate\")) {\n this.pos++;\n const collation = this.qualifiedName();\n left = { type: \"collate\", expr: left, collation };\n continue;\n }\n if (this.atKw(\"operator\")) {\n this.pos++;\n this.expectPunct(\"(\");\n const parts: string[] = [];\n for (;;) {\n const nt = this.next();\n if (nt.type === \"punct\" && nt.value === \")\") break;\n if (nt.type === \"punct\" && nt.value === \".\") continue;\n parts.push(nt.value);\n }\n const op = parts[parts.length - 1]!;\n const sub = this.tryParseAnyAll(op, left);\n if (sub) return sub;\n const right = this.parseAdditive();\n left = { type: \"binop\", op, left, right };\n continue;\n }\n if (\n t.type === \"op\" &&\n !COMPARE_OPS.has(t.value) &&\n !ADDITIVE_OPS.has(t.value) &&\n !MULTIPLICATIVE_OPS.has(t.value) &&\n t.value !== \"^\" &&\n t.value !== \"::\" &&\n t.value !== \":\" // `:` is only valid inside array slice subscripts\n ) {\n this.pos++;\n const sub = this.tryParseAnyAll(t.value, left);\n if (sub) {\n left = sub;\n continue;\n }\n const right = this.parseAdditive();\n left = { type: \"binop\", op: t.value, left, right };\n continue;\n }\n break;\n }\n return left;\n }\n\n private parseAdditive(): Expr {\n let left = this.parseMultiplicative();\n for (;;) {\n const t = this.peek();\n if (t.type === \"op\" && ADDITIVE_OPS.has(t.value)) {\n this.pos++;\n const sub = this.tryParseAnyAll(t.value, left);\n if (sub) {\n left = sub;\n continue;\n }\n const right = this.parseMultiplicative();\n left = { type: \"binop\", op: t.value, left, right };\n continue;\n }\n break;\n }\n return left;\n }\n\n private parseMultiplicative(): Expr {\n let left = this.parseExponent();\n for (;;) {\n const t = this.peek();\n if (t.type === \"op\" && MULTIPLICATIVE_OPS.has(t.value)) {\n this.pos++;\n const right = this.parseExponent();\n left = { type: \"binop\", op: t.value, left, right };\n continue;\n }\n break;\n }\n return left;\n }\n\n private parseExponent(): Expr {\n let left = this.parseUnary();\n while (this.atOp(\"^\")) {\n this.pos++;\n const right = this.parseUnary();\n left = { type: \"binop\", op: \"^\", left, right };\n }\n return left;\n }\n\n private parseUnary(): Expr {\n const t = this.peek();\n if (t.type === \"op\") {\n if (t.value === \"-\" || t.value === \"+\") {\n this.pos++;\n const operand = this.parseUnary();\n if (operand.type === \"number_lit\") {\n return t.value === \"-\" ? { type: \"number_lit\", raw: `-${operand.raw}` } : operand;\n }\n return { type: \"unop\", op: t.value, operand };\n }\n // prefix operators: ~ @ |/ ||/ !!\n if ([\"~\", \"@\", \"|/\", \"||/\", \"!!\", \"@-@\", \"?-\", \"#\"].includes(t.value)) {\n this.pos++;\n const operand = this.parseUnary();\n return { type: \"unop\", op: t.value, operand };\n }\n }\n return this.parsePostfix();\n }\n\n private parsePostfix(): Expr {\n let expr = this.parsePrimary();\n for (;;) {\n if (this.atOp(\"::\")) {\n this.pos++;\n const target = this.parseTypeName();\n expr = { type: \"cast\", expr, target };\n continue;\n }\n if (this.atPunct(\"[\")) {\n const indexes: Array<{ lower: Expr | null; upper: Expr | null; slice: boolean }> = [];\n while (this.atPunct(\"[\")) {\n this.pos++;\n let lower: Expr | null = null;\n let upper: Expr | null = null;\n let slice = false;\n if (this.atOp(\":\")) {\n // [:x] or [:]\n this.pos++;\n slice = true;\n if (!this.atPunct(\"]\")) upper = this.parseExpr();\n } else {\n lower = this.parseExpr();\n if (this.eatOp(\":\")) {\n slice = true;\n if (!this.atPunct(\"]\")) upper = this.parseExpr();\n }\n }\n this.expectPunct(\"]\");\n indexes.push({ lower, upper, slice });\n }\n expr = { type: \"subscript\", base: expr, indexes };\n continue;\n }\n if (\n this.atPunct(\".\") &&\n (expr.type === \"row\" ||\n expr.type === \"field_select\" ||\n expr.type === \"func\" ||\n expr.type === \"subscript\" ||\n (expr.type === \"cast\" && true))\n ) {\n // (composite).field \u2014 only after parenthesized/func expressions.\n this.pos++;\n if (this.atOp(\"*\")) {\n this.pos++;\n expr = { type: \"field_select\", base: expr, field: \"*\" };\n } else {\n expr = { type: \"field_select\", base: expr, field: this.ident(true) };\n }\n continue;\n }\n break;\n }\n return expr;\n }\n\n private parsePrimary(): Expr {\n const t = this.peek();\n\n if (t.type === \"number\") {\n this.pos++;\n return { type: \"number_lit\", raw: t.value };\n }\n if (t.type === \"string\") {\n this.pos++;\n return { type: \"string_lit\", value: t.value };\n }\n if (t.type === \"bitstring\") {\n this.pos++;\n return { type: \"bitstring_lit\", value: t.value };\n }\n if (t.type === \"param\") {\n this.pos++;\n return { type: \"param\", index: Number(t.value) };\n }\n\n if (this.atPunct(\"(\")) {\n this.pos++;\n if (this.atKw(\"select\") || this.atKw(\"with\") || this.atKw(\"values\")) {\n const query = this.parseSelectStmt();\n this.expectPunct(\")\");\n return { type: \"subquery_expr\", kind: \"scalar\", query };\n }\n const first = this.parseExpr();\n if (this.atPunct(\",\")) {\n const items = [first];\n while (this.eatPunct(\",\")) items.push(this.parseExpr());\n this.expectPunct(\")\");\n return { type: \"row\", items, explicit: false };\n }\n this.expectPunct(\")\");\n // mark rows/parens for field selection\n if (first.type === \"colref\" || first.type === \"field_select\" || first.type === \"subquery_expr\") {\n // allow (t).field\n if (this.atPunct(\".\")) {\n let expr: Expr = { type: \"row\", items: [first], explicit: false };\n // treat as parenthesized reference: (t).f handled by field_select on base colref\n this.pos++;\n if (this.atOp(\"*\")) {\n this.pos++;\n expr = { type: \"field_select\", base: first, field: \"*\" };\n } else {\n expr = { type: \"field_select\", base: first, field: this.ident(true) };\n }\n return expr;\n }\n }\n return first;\n }\n\n if (t.type !== \"ident\" && t.type !== \"quoted_ident\") {\n this.errorAt(t, \"expected expression\");\n }\n\n if (t.type === \"ident\") {\n switch (t.value) {\n case \"null\":\n this.pos++;\n return { type: \"null_lit\" };\n case \"true\":\n this.pos++;\n return { type: \"bool_lit\", value: true };\n case \"false\":\n this.pos++;\n return { type: \"bool_lit\", value: false };\n case \"default\":\n this.pos++;\n return { type: \"default_expr\" };\n case \"case\":\n return this.parseCase();\n case \"cast\": {\n this.pos++;\n this.expectPunct(\"(\");\n const expr = this.parseExpr();\n this.expectKw(\"as\");\n const target = this.parseTypeName();\n this.expectPunct(\")\");\n return { type: \"cast\", expr, target };\n }\n case \"exists\": {\n if (!this.atPunct(\"(\", 1)) break;\n this.pos++;\n this.expectPunct(\"(\");\n const query = this.parseSelectStmt();\n this.expectPunct(\")\");\n return { type: \"subquery_expr\", kind: \"exists\", query };\n }\n case \"array\": {\n this.pos++;\n if (this.atPunct(\"(\")) {\n this.pos++;\n const query = this.parseSelectStmt();\n this.expectPunct(\")\");\n return { type: \"array_query\", query };\n }\n this.expectPunct(\"[\");\n const items: Expr[] = [];\n if (!this.atPunct(\"]\")) {\n do {\n if (this.atPunct(\"[\")) {\n // nested array literal \u2014 parse as nested ARRAY\n items.push(this.parseNestedArrayLiteral());\n } else {\n items.push(this.parseExpr());\n }\n } while (this.eatPunct(\",\"));\n }\n this.expectPunct(\"]\");\n return { type: \"array_ctor\", items };\n }\n case \"row\": {\n if (!this.atPunct(\"(\", 1)) break;\n this.pos++;\n this.expectPunct(\"(\");\n const items: Expr[] = [];\n if (!this.atPunct(\")\")) {\n do {\n items.push(this.parseExpr());\n } while (this.eatPunct(\",\"));\n }\n this.expectPunct(\")\");\n return { type: \"row\", items, explicit: true };\n }\n case \"grouping\": {\n if (!this.atPunct(\"(\", 1)) break;\n this.pos++;\n this.expectPunct(\"(\");\n const args: Expr[] = [];\n do {\n args.push(this.parseExpr());\n } while (this.eatPunct(\",\"));\n this.expectPunct(\")\");\n return { type: \"grouping_func\", args };\n }\n case \"position\": {\n if (!this.atPunct(\"(\", 1)) break;\n this.pos++;\n this.expectPunct(\"(\");\n const needle = this.parseGenericOps();\n this.expectKw(\"in\");\n const haystack = this.parseGenericOps();\n this.expectPunct(\")\");\n return { type: \"position\", needle, haystack };\n }\n case \"substring\": {\n if (!this.atPunct(\"(\", 1)) break;\n this.pos++;\n this.expectPunct(\"(\");\n const source = this.parseExpr();\n let from: Expr | null = null;\n let forLen: Expr | null = null;\n let similar: Expr | null = null;\n let escape: Expr | null = null;\n if (this.eatPunct(\",\")) {\n from = this.parseExpr();\n if (this.eatPunct(\",\")) forLen = this.parseExpr();\n } else {\n if (this.eatKw(\"from\")) from = this.parseExpr();\n if (this.eatKw(\"for\")) forLen = this.parseExpr();\n if (this.eatKw(\"similar\")) {\n similar = this.parseExpr();\n this.expectKw(\"escape\");\n escape = this.parseExpr();\n }\n }\n this.expectPunct(\")\");\n return { type: \"substring_sql\", source, from, forLen, similar, escape };\n }\n case \"overlay\": {\n if (!this.atPunct(\"(\", 1)) break;\n this.pos++;\n this.expectPunct(\"(\");\n const source = this.parseExpr();\n this.expectKw(\"placing\");\n const placing = this.parseExpr();\n this.expectKw(\"from\");\n const from = this.parseExpr();\n const forLen = this.eatKw(\"for\") ? this.parseExpr() : null;\n this.expectPunct(\")\");\n return { type: \"overlay\", source, placing, from, forLen };\n }\n case \"trim\": {\n if (!this.atPunct(\"(\", 1)) break;\n this.pos++;\n this.expectPunct(\"(\");\n let side: \"both\" | \"leading\" | \"trailing\" = \"both\";\n if (this.eatKw(\"leading\")) side = \"leading\";\n else if (this.eatKw(\"trailing\")) side = \"trailing\";\n else this.eatKw(\"both\");\n let chars: Expr | null = null;\n let source: Expr;\n if (this.atKw(\"from\")) {\n this.pos++;\n source = this.parseExpr();\n } else {\n const first = this.parseExpr();\n if (this.eatKw(\"from\")) {\n chars = first;\n source = this.parseExpr();\n } else if (this.eatPunct(\",\")) {\n source = first;\n chars = this.parseExpr();\n } else {\n source = first;\n }\n }\n this.expectPunct(\")\");\n return { type: \"trim\", side, chars, source };\n }\n case \"extract\": {\n if (!this.atPunct(\"(\", 1)) break;\n this.pos++;\n this.expectPunct(\"(\");\n const ft = this.next();\n let field: string;\n if (ft.type === \"ident\" || ft.type === \"string\") field = ft.value.toLowerCase();\n else this.errorAt(ft, \"expected extract field\");\n this.expectKw(\"from\");\n const source = this.parseExpr();\n this.expectPunct(\")\");\n return { type: \"extract\", field, source };\n }\n case \"current_date\":\n this.pos++;\n return { type: \"func\", name: [\"pg_catalog\", \"current_date\"], args: [] };\n case \"current_time\":\n this.pos++;\n this.maybePrecision();\n return { type: \"func\", name: [\"pg_catalog\", \"current_time\"], args: [] };\n case \"current_timestamp\":\n this.pos++;\n this.maybePrecision();\n return { type: \"func\", name: [\"pg_catalog\", \"current_timestamp\"], args: [] };\n case \"localtime\":\n this.pos++;\n this.maybePrecision();\n return { type: \"func\", name: [\"pg_catalog\", \"localtime\"], args: [] };\n case \"localtimestamp\":\n this.pos++;\n this.maybePrecision();\n return { type: \"func\", name: [\"pg_catalog\", \"localtimestamp\"], args: [] };\n case \"current_user\":\n case \"user\":\n this.pos++;\n return { type: \"func\", name: [\"pg_catalog\", \"current_user\"], args: [] };\n case \"session_user\":\n this.pos++;\n return { type: \"func\", name: [\"pg_catalog\", \"session_user\"], args: [] };\n case \"current_role\":\n this.pos++;\n return { type: \"func\", name: [\"pg_catalog\", \"current_user\"], args: [] };\n case \"current_catalog\":\n this.pos++;\n return { type: \"func\", name: [\"pg_catalog\", \"current_catalog\"], args: [] };\n case \"current_schema\":\n this.pos++;\n if (this.atPunct(\"(\")) {\n this.pos++;\n this.expectPunct(\")\");\n }\n return { type: \"func\", name: [\"pg_catalog\", \"current_schema\"], args: [] };\n case \"collation\": {\n if (this.atKw(\"for\", 1)) {\n this.pos += 2;\n this.expectPunct(\"(\");\n const arg = this.parseExpr();\n this.expectPunct(\")\");\n return { type: \"func\", name: [\"pg_catalog\", \"pg_collation_for\"], args: [arg] };\n }\n break;\n }\n case \"normalize\": {\n if (!this.atPunct(\"(\", 1)) break;\n this.pos++;\n this.expectPunct(\"(\");\n const arg = this.parseExpr();\n let form: Expr = { type: \"string_lit\", value: \"NFC\" };\n if (this.eatPunct(\",\")) {\n form = { type: \"string_lit\", value: this.ident(true).toUpperCase() };\n }\n this.expectPunct(\")\");\n return { type: \"func\", name: [\"pg_catalog\", \"normalize\"], args: [arg, form] };\n }\n case \"xmlelement\":\n case \"xmlforest\":\n case \"xmlparse\":\n case \"xmlpi\":\n case \"xmlroot\":\n case \"xmlserialize\":\n case \"xmlexists\":\n throw unsupported(\"XML functions\");\n case \"json_table\":\n throw unsupported(\"JSON_TABLE\");\n default:\n break;\n }\n }\n\n // TYPENAME 'literal'\n if (t.type === \"ident\" && TYPE_LITERAL_NAMES.has(t.value)) {\n // interval 'x' hour etc.\n if (this.peek(1).type === \"string\") {\n const typeName = this.parseTypeName();\n const st = this.next();\n if (st.type !== \"string\") this.errorAt(st, \"expected string\");\n return { type: \"cast\", expr: { type: \"string_lit\", value: st.value }, target: typeName };\n }\n // varchar(10) 'abc' / timestamp(3) '...' / timestamp with time zone '...' /\n // double precision '...' / character varying '...'\n const next1 = this.peek(1);\n if (this.atPunct(\"(\", 1) || (next1.type === \"ident\" && MULTIWORD_TYPE_SECOND.has(next1.value))) {\n const save = this.pos;\n try {\n const typeName = this.parseTypeName();\n if (this.peek().type === \"string\") {\n const st = this.next();\n return { type: \"cast\", expr: { type: \"string_lit\", value: st.value }, target: typeName };\n }\n } catch {\n // fall through\n }\n this.pos = save;\n }\n }\n\n // qualified name: column reference or function call\n const parts: string[] = [this.ident(true)];\n if (t.type === \"ident\" && RESERVED.has(t.value)) {\n this.errorAt(t, \"unexpected keyword\");\n }\n for (;;) {\n if (this.atPunct(\".\")) {\n if (this.atOp(\"*\", 1)) {\n this.pos += 2;\n return { type: \"star\", table: parts };\n }\n this.pos++;\n parts.push(this.ident(true));\n continue;\n }\n break;\n }\n if (this.atPunct(\"(\")) {\n return this.parseFuncCall(parts);\n }\n return { type: \"colref\", parts };\n }\n\n private parseCase(): Expr {\n this.expectKw(\"case\");\n let operand: Expr | null = null;\n if (!this.atKw(\"when\")) {\n operand = this.parseExpr();\n }\n const whens: Array<{ when: Expr; then: Expr }> = [];\n while (this.eatKw(\"when\")) {\n const when = this.parseExpr();\n this.expectKw(\"then\");\n const then = this.parseExpr();\n whens.push({ when, then });\n }\n if (whens.length === 0) this.errorAt(this.peek(), \"expected WHEN\");\n let elseExpr: Expr | null = null;\n if (this.eatKw(\"else\")) elseExpr = this.parseExpr();\n this.expectKw(\"end\");\n return { type: \"case\", operand, whens, elseExpr };\n }\n\n private maybePrecision(): void {\n if (this.atPunct(\"(\")) {\n this.pos++;\n this.next();\n this.expectPunct(\")\");\n }\n }\n\n private parseNestedArrayLiteral(): Expr {\n this.expectPunct(\"[\");\n const items: Expr[] = [];\n if (!this.atPunct(\"]\")) {\n do {\n if (this.atPunct(\"[\")) items.push(this.parseNestedArrayLiteral());\n else items.push(this.parseExpr());\n } while (this.eatPunct(\",\"));\n }\n this.expectPunct(\"]\");\n return { type: \"array_ctor\", items };\n }\n\n private parseFuncCall(name: string[]): Expr {\n this.expectPunct(\"(\");\n let star = false;\n let distinct = false;\n let variadic = false;\n const args: Expr[] = [];\n const argNames: Record<number, string> = {};\n let orderBy: OrderByItem[] | undefined;\n if (this.atOp(\"*\") && this.atPunct(\")\", 1)) {\n this.pos += 2;\n star = true;\n } else {\n if (this.eatKw(\"distinct\")) distinct = true;\n else this.eatKw(\"all\");\n if (!this.atPunct(\")\")) {\n do {\n if (this.eatKw(\"variadic\")) variadic = true;\n // named notation f(a => 1)\n const save = this.pos;\n const pt = this.peek();\n if ((pt.type === \"ident\" && !RESERVED.has(pt.value)) || pt.type === \"quoted_ident\") {\n const argName = pt.value.toLowerCase();\n this.pos++;\n if (this.atOp(\"=>\") || this.atOp(\":=\")) {\n this.pos++;\n argNames[args.length] = argName;\n args.push(this.parseExpr());\n continue;\n }\n this.pos = save;\n }\n args.push(this.parseExpr());\n } while (this.eatPunct(\",\"));\n }\n if (this.atKw(\"order\")) {\n orderBy = this.parseOrderByClause();\n }\n this.expectPunct(\")\");\n }\n if (star) {\n // already consumed \")\"\n }\n let withinGroupOrderBy: OrderByItem[] | undefined;\n if (this.atKw(\"within\")) {\n this.pos++;\n this.expectKw(\"group\");\n this.expectPunct(\"(\");\n withinGroupOrderBy = this.parseOrderByClause();\n this.expectPunct(\")\");\n }\n let filter: Expr | undefined;\n if (this.atKw(\"filter\")) {\n this.pos++;\n this.expectPunct(\"(\");\n this.expectKw(\"where\");\n filter = this.parseExpr();\n this.expectPunct(\")\");\n }\n let over: WindowSpec | null | undefined;\n if (this.atKw(\"over\")) {\n this.pos++;\n if (this.atPunct(\"(\")) {\n this.pos++;\n over = this.parseWindowSpec();\n this.expectPunct(\")\");\n } else {\n over = { name: this.ident(), partitionBy: [], orderBy: [], frame: null };\n }\n }\n const names = Object.keys(argNames).length > 0 ? args.map((_, i) => argNames[i] ?? null) : undefined;\n return {\n type: \"func\",\n name,\n args,\n star,\n distinct,\n orderBy,\n filter,\n withinGroupOrderBy,\n over: over ?? null,\n variadic,\n argNames: names,\n };\n }\n\n private parseWindowSpec(): WindowSpec {\n let name: string | undefined;\n const t = this.peek();\n if (\n (t.type === \"ident\" &&\n !RESERVED.has(t.value) &&\n ![\"partition\", \"order\", \"range\", \"rows\", \"groups\"].includes(t.value)) ||\n t.type === \"quoted_ident\"\n ) {\n name = this.ident();\n }\n const partitionBy: Expr[] = [];\n if (this.eatKw(\"partition\")) {\n this.expectKw(\"by\");\n do {\n partitionBy.push(this.parseExpr());\n } while (this.eatPunct(\",\"));\n }\n const orderBy = this.parseOrderByClause();\n let frame: FrameSpec | null = null;\n if (this.atKw(\"range\") || this.atKw(\"rows\") || this.atKw(\"groups\")) {\n const mode = this.next().value as \"range\" | \"rows\" | \"groups\";\n let start: FrameBound;\n let end: FrameBound | null = null;\n if (this.eatKw(\"between\")) {\n start = this.parseFrameBound();\n this.expectKw(\"and\");\n end = this.parseFrameBound();\n } else {\n start = this.parseFrameBound();\n }\n let exclusion: FrameSpec[\"exclusion\"] = null;\n if (this.eatKw(\"exclude\")) {\n if (this.eatKw(\"current\")) {\n this.expectKw(\"row\");\n exclusion = \"current_row\";\n } else if (this.eatKw(\"group\")) {\n exclusion = \"group\";\n } else if (this.eatKw(\"ties\")) {\n exclusion = \"ties\";\n } else {\n this.expectKw(\"no\");\n this.expectKw(\"others\");\n exclusion = \"no_others\";\n }\n }\n frame = { mode, start, end, exclusion };\n }\n return { name, partitionBy, orderBy, frame };\n }\n\n private parseFrameBound(): FrameBound {\n if (this.eatKw(\"unbounded\")) {\n if (this.eatKw(\"preceding\")) return { kind: \"unbounded_preceding\" };\n this.expectKw(\"following\");\n return { kind: \"unbounded_following\" };\n }\n if (this.eatKw(\"current\")) {\n this.expectKw(\"row\");\n return { kind: \"current_row\" };\n }\n const offset = this.parseExpr();\n if (this.eatKw(\"preceding\")) return { kind: \"preceding\", offset };\n this.expectKw(\"following\");\n return { kind: \"following\", offset };\n }\n}\n\n/** Parse SQL text into a list of statements. */\nexport function parse(sql: string): Statement[] {\n return new Parser(sql).parseStatements();\n}\n\n/** Parse exactly one statement; throws `misuse`-style errors handled by API layer. */\nexport function parseSingle(sql: string): Statement {\n const statements = parse(sql);\n if (statements.length === 0) {\n throw pgError(\"misuse\", \"empty statement\");\n }\n if (statements.length > 1) {\n throw pgError(\"misuse\", \"cannot prepare multiple statements at once\");\n }\n return statements[0]!;\n}\n", "/** Fixed reference instant used when callers do not supply a clock (`2000-01-01T00:00:00.000Z`). */\nexport const DEFAULT_NOW = new Date(\"2000-01-01T00:00:00.000Z\");\n\n/** Function that returns the current instant for `now()` and related builtins. */\nexport type Clock = () => Date;\n\n/**\n * Clock that always returns a copy of `instant` (default {@link DEFAULT_NOW}).\n *\n * @throws {RangeError} If `instant` is an invalid `Date`.\n */\nexport function fixedClock(instant: Date = DEFAULT_NOW): Clock {\n const ms = instant.getTime();\n if (Number.isNaN(ms)) throw new RangeError(\"invalid clock instant\");\n return () => new Date(ms);\n}\n\n/** Wall-clock `now()` matching PostgreSQL (`new Date()` each call). */\nexport function systemClock(): Clock {\n return () => new Date();\n}\n\n/** Normalize a `Date`, {@link Clock}, `\"system\"`, or `undefined` into a {@link Clock}. */\nexport function resolveClock(now?: Date | Clock | \"system\"): Clock {\n if (now === undefined) return fixedClock(DEFAULT_NOW);\n if (now === \"system\") return systemClock();\n if (typeof now === \"function\") return () => new Date(now().getTime());\n return fixedClock(now);\n}\n", "import type { Clock } from \"./clock.ts\";\n\n/** Entropy source for `random()` / `gen_random_uuid()`. Default is seeded xorshift64*. */\nexport type RandomMode = \"deterministic\" | \"os\";\n\n/** Options for {@link Database} construction. All fields are optional. */\nexport interface DatabaseOptions {\n /**\n * Seed for deterministic `random()` (and any other PRNG-backed builtins).\n * Defaults to {@link DEFAULT_DATABASE_SEED} (`1`). Ignored when {@link random} is `\"os\"`.\n */\n seed?: number | bigint;\n /**\n * Entropy for `random()` / `gen_random_uuid()`.\n * `\"deterministic\"` (default) uses {@link seed}. `\"os\"` uses CSPRNG like PostgreSQL\n * (not rolled back with transactions; not restored from snapshots).\n */\n random?: RandomMode;\n /**\n * Clock for `now()` / `current_timestamp` / etc.\n * Defaults to a fixed instant (`2000-01-01T00:00:00.000Z`).\n * Pass a `Date`, `() => Date`, or `\"system\"` for wall-clock `now()` like PostgreSQL.\n */\n now?: Date | Clock | \"system\";\n}\n\n/** Default {@link DatabaseOptions.seed} when constructing a {@link Database}. */\nexport const DEFAULT_DATABASE_SEED = 1;\n", "import type {\n AlterEnumStmt,\n AlterIndexStmt,\n AlterSchemaStmt,\n AlterSequenceStmt,\n AlterTableStmt,\n AlterViewStmt,\n ColumnDef,\n CreateDomainStmt,\n CreateEnumStmt,\n CreateFunctionStmt,\n CreateIndexStmt,\n CreateSchemaStmt,\n CreateSequenceStmt,\n CreateTableAsStmt,\n CreateTableStmt,\n CreateTriggerStmt,\n CreateViewStmt,\n DropStmt,\n Expr,\n RefAction,\n RefreshMaterializedViewStmt,\n SequenceOptions,\n TableConstraint,\n TruncateStmt,\n} from \"../ast/nodes.ts\";\nimport { checkChecks, checkForeignKeys, checkUnique, referencingConstraints } from \"../constraints/enforce.ts\";\nimport { pgError, unsupported } from \"../errors/error.ts\";\nimport { sequenceNextval } from \"../functions/misc-fns.ts\";\nimport { parse } from \"../parser/index.ts\";\nimport {\n type ColumnMeta,\n type ConstraintMeta,\n SchemaData,\n type SequenceData,\n TableData,\n} from \"../storage/database-state.ts\";\nimport { castTo } from \"../types/cast.ts\";\nimport { resolveTypeName } from \"../types/resolve.ts\";\nimport { type Datum, type TypeId, tv, UNKNOWN } from \"../types/value.ts\";\nimport { commandResult, type ExecEnv, type ExecResult, RowScope } from \"./relation.ts\";\nimport { evalScalar, executeSelectStmt } from \"./select.ts\";\n\n// ---------------------------------------------------------------------------\n// helpers\n// ---------------------------------------------------------------------------\n\nfunction targetSchema(env: ExecEnv, parts: string[]): { schema: SchemaData; name: string } {\n const state = env.ctx.state;\n if (parts.length >= 2) {\n return { schema: state.getSchema(parts[parts.length - 2]!), name: parts[parts.length - 1]! };\n }\n return { schema: state.getSchema(state.currentSchema()), name: parts[0]! };\n}\n\nfunction refActionText(a: RefAction): string | null {\n return a;\n}\n\nfunction constraintNames(table: TableData): Set<string> {\n return new Set(table.constraints.map((c) => c.name));\n}\n\nfunction makeName(base: string, taken: Set<string>): string {\n if (!taken.has(base)) return base;\n for (let i = 1; ; i++) {\n const candidate = `${base}${i}`;\n if (!taken.has(candidate)) return candidate;\n }\n}\n\nconst MAX_IDENT = 63;\n\nfunction truncIdent(s: string): string {\n return s.length > MAX_IDENT ? s.slice(0, MAX_IDENT) : s;\n}\n\n// ---------------------------------------------------------------------------\n// sequences\n// ---------------------------------------------------------------------------\n\nconst SEQ_LIMITS: Record<string, { min: bigint; max: bigint }> = {\n int2: { min: -32768n, max: 32767n },\n int4: { min: -2147483648n, max: 2147483647n },\n int8: { min: -9223372036854775808n, max: 9223372036854775807n },\n};\n\nexport function buildSequence(\n env: ExecEnv,\n schema: SchemaData,\n name: string,\n options: SequenceOptions,\n temp: boolean,\n): SequenceData {\n const state = env.ctx.state;\n let dataType: TypeId = \"int8\";\n if (options.as) {\n const resolved = resolveTypeName(state, options.as);\n if (resolved.column.id !== \"int2\" && resolved.column.id !== \"int4\" && resolved.column.id !== \"int8\") {\n throw pgError(\"invalid_parameter_value\", `sequence type must be smallint, integer, or bigint`, \"22023\");\n }\n dataType = resolved.column.id;\n }\n const limits = SEQ_LIMITS[dataType]!;\n const increment = options.increment ?? 1n;\n if (increment === 0n) {\n throw pgError(\"invalid_parameter_value\", \"INCREMENT must not be zero\", \"22023\");\n }\n const ascending = increment > 0n;\n const minValue =\n options.minValue === \"no\" || options.minValue === undefined ? (ascending ? 1n : limits.min) : options.minValue;\n const maxValue =\n options.maxValue === \"no\" || options.maxValue === undefined ? (ascending ? limits.max : -1n) : options.maxValue;\n const startValue = options.start ?? (ascending ? minValue : maxValue);\n if (startValue < minValue || startValue > maxValue) {\n throw pgError(\n \"invalid_parameter_value\",\n `START value (${startValue}) cannot be ${startValue < minValue ? \"less than MINVALUE\" : \"greater than MAXVALUE\"} (${startValue < minValue ? minValue : maxValue})`,\n \"22023\",\n );\n }\n return {\n name,\n schema: schema.name,\n increment,\n minValue,\n maxValue,\n startValue,\n cache: options.cache ?? 1n,\n cycle: options.cycle ?? false,\n lastValue: startValue,\n isCalled: false,\n ownedBy:\n options.ownedBy && options.ownedBy !== \"none\"\n ? {\n table: options.ownedBy[options.ownedBy.length - 2] ?? \"\",\n column: options.ownedBy[options.ownedBy.length - 1]!,\n }\n : null,\n dataType,\n temp,\n oid: state.nextOid(),\n };\n}\n\nexport function executeCreateSequence(env: ExecEnv, stmt: CreateSequenceStmt): ExecResult {\n const { schema, name } = targetSchema(env, stmt.name);\n if (schema.hasRelation(name)) {\n if (stmt.ifNotExists) return commandResult(\"CREATE SEQUENCE\", 0);\n throw pgError(\"duplicate_table\", `relation \"${name}\" already exists`, \"42P07\");\n }\n schema.sequences.set(name, buildSequence(env, schema, name, stmt.options, stmt.temp));\n return commandResult(\"CREATE SEQUENCE\", 0);\n}\n\nexport function executeAlterSequence(env: ExecEnv, stmt: AlterSequenceStmt): ExecResult {\n const state = env.ctx.state;\n const seq = state.findSequence(stmt.name);\n if (!seq) {\n if (stmt.ifExists) return commandResult(\"ALTER SEQUENCE\", 0);\n throw pgError(\"undefined_table\", `relation \"${stmt.name.join(\".\")}\" does not exist`, \"42P01\");\n }\n const o = stmt.options;\n if (o.increment !== undefined) seq.increment = o.increment;\n if (o.minValue !== undefined)\n seq.minValue = o.minValue === \"no\" ? (seq.increment > 0n ? 1n : SEQ_LIMITS[seq.dataType]!.min) : o.minValue;\n if (o.maxValue !== undefined)\n seq.maxValue = o.maxValue === \"no\" ? (seq.increment > 0n ? SEQ_LIMITS[seq.dataType]!.max : -1n) : o.maxValue;\n if (o.start !== undefined) seq.startValue = o.start;\n if (o.cache !== undefined) seq.cache = o.cache;\n if (o.cycle !== undefined) seq.cycle = o.cycle;\n if (o.ownedBy !== undefined) {\n seq.ownedBy =\n o.ownedBy === \"none\"\n ? null\n : { table: o.ownedBy[o.ownedBy.length - 2] ?? \"\", column: o.ownedBy[o.ownedBy.length - 1]! };\n }\n if (o.restart !== undefined) {\n seq.lastValue = o.restart === \"default\" ? seq.startValue : o.restart;\n seq.isCalled = false;\n }\n if (o.as) {\n const resolved = resolveTypeName(state, o.as);\n seq.dataType = resolved.column.id;\n }\n return commandResult(\"ALTER SEQUENCE\", 0);\n}\n\n// ---------------------------------------------------------------------------\n// CREATE TABLE\n// ---------------------------------------------------------------------------\n\ninterface BuiltColumns {\n columns: ColumnMeta[];\n constraints: ConstraintMeta[];\n /** sequences to create (serial / identity backing) */\n sequences: SequenceData[];\n}\n\nfunction buildColumn(\n env: ExecEnv,\n schema: SchemaData,\n tableName: string,\n def: ColumnDef,\n out: BuiltColumns,\n taken: Set<string>,\n): ColumnMeta {\n const state = env.ctx.state;\n const resolved = resolveTypeName(state, def.typeName);\n const col: ColumnMeta = {\n name: def.name,\n type: resolved.column,\n notNull: false,\n defaultExpr: null,\n identity: null,\n generated: null,\n collate: null,\n domain: resolved.domain,\n };\n if (resolved.domain) {\n const domain = state.findDomain(resolved.domain.split(\".\"));\n if (domain?.notNull) col.notNull = true;\n if (domain?.defaultExpr && !def.constraints.some((c) => c.kind === \"default\")) {\n col.defaultExpr = domain.defaultExpr;\n }\n }\n\n if (resolved.serial) {\n const seqName = truncIdent(`${tableName}_${def.name}_seq`);\n const seq = buildSequence(env, schema, seqName, {}, false);\n seq.dataType = resolved.serial;\n seq.maxValue = SEQ_LIMITS[resolved.serial]!.max;\n seq.ownedBy = { table: tableName, column: def.name };\n out.sequences.push(seq);\n col.notNull = true;\n col.defaultExpr = {\n type: \"func\",\n name: [\"nextval\"],\n args: [{ type: \"string_lit\", value: `${schema.name}.${seqName}` }],\n } as Expr;\n }\n\n for (const c of def.constraints) {\n switch (c.kind) {\n case \"not_null\":\n col.notNull = true;\n break;\n case \"null\":\n col.notNull = false;\n break;\n case \"default\":\n col.defaultExpr = c.expr;\n break;\n case \"primary_key\": {\n col.notNull = true;\n const name = makeName(truncIdent(`${tableName}_pkey`), taken);\n taken.add(name);\n out.constraints.push({ kind: \"primary_key\", name, columns: [def.name] });\n break;\n }\n case \"unique\": {\n const name = c.name ?? makeName(truncIdent(`${tableName}_${def.name}_key`), taken);\n taken.add(name);\n out.constraints.push({ kind: \"unique\", name, columns: [def.name], nullsNotDistinct: c.nullsNotDistinct });\n break;\n }\n case \"check\": {\n const name = c.name ?? makeName(truncIdent(`${tableName}_${def.name}_check`), taken);\n taken.add(name);\n out.constraints.push({ kind: \"check\", name, expr: c.expr });\n break;\n }\n case \"references\": {\n const refParts = c.table;\n const refTable = state.findTable(refParts);\n if (!refTable) {\n throw pgError(\"undefined_table\", `relation \"${refParts.join(\".\")}\" does not exist`, \"42P01\");\n }\n const refColumns = c.columns ?? primaryKeyColumns(refTable);\n const name = c.name ?? makeName(truncIdent(`${tableName}_${def.name}_fkey`), taken);\n taken.add(name);\n out.constraints.push({\n kind: \"foreign_key\",\n name,\n columns: [def.name],\n refSchema: refTable.schema,\n refTable: refTable.name,\n refColumns,\n onDelete: refActionText(c.onDelete),\n onUpdate: refActionText(c.onUpdate),\n match: c.match === \"full\" ? \"full\" : \"simple\",\n });\n break;\n }\n case \"generated_identity\": {\n const seqName = truncIdent(`${tableName}_${def.name}_seq`);\n const seq = buildSequence(env, schema, seqName, c.options, false);\n if (!c.options.as) {\n seq.dataType =\n col.type.id === \"int2\" || col.type.id === \"int4\" || col.type.id === \"int8\" ? col.type.id : \"int8\";\n const limits = SEQ_LIMITS[seq.dataType]!;\n if (c.options.maxValue === undefined) seq.maxValue = seq.increment > 0n ? limits.max : -1n;\n if (c.options.minValue === undefined) seq.minValue = seq.increment > 0n ? 1n : limits.min;\n }\n seq.ownedBy = { table: tableName, column: def.name };\n out.sequences.push(seq);\n col.identity = { always: c.always, sequence: `${schema.name}.${seqName}` };\n col.notNull = true;\n break;\n }\n case \"generated_stored\":\n col.generated = c.expr;\n break;\n case \"collate\":\n col.collate = c.collation.join(\".\");\n break;\n }\n }\n return col;\n}\n\nfunction primaryKeyColumns(table: TableData): string[] {\n const pk = table.constraints.find((c) => c.kind === \"primary_key\");\n if (!pk) {\n throw pgError(\n \"undefined_object\",\n `there is no unique constraint matching given keys for referenced table \"${table.name}\"`,\n \"42830\",\n );\n }\n return pk.columns;\n}\n\nfunction buildTableConstraint(\n env: ExecEnv,\n tableName: string,\n columns: ColumnMeta[],\n con: TableConstraint,\n taken: Set<string>,\n): ConstraintMeta {\n const state = env.ctx.state;\n const checkCols = (names: string[]) => {\n for (const n of names) {\n if (!columns.some((c) => c.name === n)) {\n throw pgError(\"undefined_column\", `column \"${n}\" named in key does not exist`, \"42703\");\n }\n }\n };\n switch (con.kind) {\n case \"primary_key\": {\n checkCols(con.columns);\n const name = con.name ?? makeName(truncIdent(`${tableName}_pkey`), taken);\n taken.add(name);\n return { kind: \"primary_key\", name, columns: con.columns };\n }\n case \"unique\": {\n checkCols(con.columns);\n const name = con.name ?? makeName(truncIdent(`${tableName}_${con.columns.join(\"_\")}_key`), taken);\n taken.add(name);\n return { kind: \"unique\", name, columns: con.columns, nullsNotDistinct: con.nullsNotDistinct };\n }\n case \"check\": {\n const name = con.name ?? makeName(truncIdent(`${tableName}_check`), taken);\n taken.add(name);\n return { kind: \"check\", name, expr: con.expr };\n }\n case \"foreign_key\": {\n checkCols(con.columns);\n const refTable = state.findTable(con.refTable);\n if (!refTable) {\n throw pgError(\"undefined_table\", `relation \"${con.refTable.join(\".\")}\" does not exist`, \"42P01\");\n }\n const refColumns = con.refColumns ?? primaryKeyColumns(refTable);\n const name = con.name ?? makeName(truncIdent(`${tableName}_${con.columns.join(\"_\")}_fkey`), taken);\n taken.add(name);\n return {\n kind: \"foreign_key\",\n name,\n columns: con.columns,\n refSchema: refTable.schema,\n refTable: refTable.name,\n refColumns,\n onDelete: refActionText(con.onDelete),\n onUpdate: refActionText(con.onUpdate),\n match: con.match === \"full\" ? \"full\" : \"simple\",\n };\n }\n case \"exclude\":\n throw unsupported(\"EXCLUDE constraints\");\n }\n}\n\nexport function executeCreateTable(env: ExecEnv, stmt: CreateTableStmt): ExecResult {\n const state = env.ctx.state;\n const { schema, name } = targetSchema(env, stmt.name);\n if (schema.hasRelation(name)) {\n if (stmt.ifNotExists) return commandResult(\"CREATE TABLE\", 0);\n throw pgError(\"duplicate_table\", `relation \"${name}\" already exists`, \"42P07\");\n }\n\n const built: BuiltColumns = { columns: [], constraints: [], sequences: [] };\n const taken = new Set<string>();\n\n // LIKE clauses first (columns come in order)\n for (const like of stmt.likeClauses) {\n const src = state.findTable(like.table);\n if (!src) {\n throw pgError(\"undefined_table\", `relation \"${like.table.join(\".\")}\" does not exist`, \"42P01\");\n }\n const all = like.options.includes(\"all\");\n const withDefaults = all || like.options.includes(\"defaults\");\n const withConstraints = all || like.options.includes(\"constraints\");\n for (const c of src.columns) {\n built.columns.push({\n ...c,\n defaultExpr: withDefaults ? c.defaultExpr : null,\n identity: null,\n generated: like.options.includes(\"generated\") || all ? c.generated : null,\n });\n }\n if (withConstraints) {\n for (const con of src.constraints) {\n if (con.kind === \"check\") {\n const cname = makeName(con.name, taken);\n taken.add(cname);\n built.constraints.push({ ...con, name: cname });\n }\n }\n }\n }\n\n const seen = new Set(built.columns.map((c) => c.name));\n for (const def of stmt.columns) {\n if (seen.has(def.name)) {\n throw pgError(\"duplicate_column\", `column \"${def.name}\" specified more than once`, \"42701\");\n }\n seen.add(def.name);\n built.columns.push(buildColumn(env, schema, name, def, built, taken));\n }\n for (const con of stmt.constraints) {\n built.constraints.push(buildTableConstraint(env, name, built.columns, con, taken));\n }\n\n // PK columns are NOT NULL\n for (const con of built.constraints) {\n if (con.kind === \"primary_key\") {\n for (const cn of con.columns) {\n const col = built.columns.find((c) => c.name === cn);\n if (col) col.notNull = true;\n }\n }\n }\n const pkCount = built.constraints.filter((c) => c.kind === \"primary_key\").length;\n if (pkCount > 1) {\n throw pgError(\"invalid_table_definition\", `multiple primary keys for table \"${name}\" are not allowed`, \"42P16\");\n }\n\n for (const seq of built.sequences) {\n if (schema.hasRelation(seq.name)) {\n throw pgError(\"duplicate_table\", `relation \"${seq.name}\" already exists`, \"42P07\");\n }\n schema.sequences.set(seq.name, seq);\n }\n const table = new TableData(schema.name, name, built.columns, state.nextOid(), stmt.temp);\n table.constraints = built.constraints;\n schema.tables.set(name, table);\n return commandResult(\"CREATE TABLE\", 0);\n}\n\nexport function executeCreateTableAs(env: ExecEnv, stmt: CreateTableAsStmt): ExecResult {\n const state = env.ctx.state;\n const { schema, name } = targetSchema(env, stmt.name);\n if (schema.hasRelation(name)) {\n if (stmt.ifNotExists) return commandResult(\"CREATE TABLE AS\", 0);\n throw pgError(\"duplicate_table\", `relation \"${name}\" already exists`, \"42P07\");\n }\n const rel = executeSelectStmt(env, stmt.query);\n const columns: ColumnMeta[] = rel.columns.map((c, i) => ({\n name: stmt.columns?.[i] ?? c.name,\n type: { id: c.type === UNKNOWN ? \"text\" : c.type, mod: null },\n notNull: false,\n defaultExpr: null,\n identity: null,\n generated: null,\n collate: null,\n domain: null,\n }));\n const table = new TableData(schema.name, name, columns, state.nextOid(), stmt.temp);\n if (stmt.withData) {\n table.rows = rel.rows.map((r) => r.slice());\n }\n schema.tables.set(name, table);\n const count = stmt.withData ? table.rows.length : 0;\n return { columns: [], rows: [], command: `SELECT ${count}`, rowCount: count };\n}\n\n// ---------------------------------------------------------------------------\n// CREATE INDEX / VIEW / SCHEMA / ENUM / DOMAIN / FUNCTION / TRIGGER\n// ---------------------------------------------------------------------------\n\nexport function executeCreateIndex(env: ExecEnv, stmt: CreateIndexStmt): ExecResult {\n const state = env.ctx.state;\n const table = state.findTable(stmt.table);\n if (!table) {\n throw pgError(\"undefined_table\", `relation \"${stmt.table.join(\".\")}\" does not exist`, \"42P01\");\n }\n const schema = state.getSchema(table.schema);\n const taken = new Set<string>([...schema.indexes.keys(), ...constraintNames(table)]);\n const colPart = stmt.columns\n .map((c) => (c.expr.type === \"colref\" ? c.expr.parts[c.expr.parts.length - 1]! : \"expr\"))\n .join(\"_\");\n const name = stmt.name ?? makeName(truncIdent(`${table.name}_${colPart}_idx`), taken);\n if (schema.indexes.has(name) || schema.hasRelation(name)) {\n if (stmt.ifNotExists) return commandResult(\"CREATE INDEX\", 0);\n throw pgError(\"duplicate_table\", `relation \"${name}\" already exists`, \"42P07\");\n }\n for (const c of stmt.columns) {\n if (c.expr.type === \"colref\" && c.expr.parts.length === 1) {\n if (table.columnIndex(c.expr.parts[0]!) === -1) {\n throw pgError(\"undefined_column\", `column \"${c.expr.parts[0]}\" does not exist`, \"42703\");\n }\n }\n }\n schema.indexes.set(name, {\n name,\n schema: schema.name,\n table: table.name,\n unique: stmt.unique,\n columns: stmt.columns.map((c) => ({\n column: c.expr.type === \"colref\" && c.expr.parts.length === 1 ? c.expr.parts[0]! : null,\n expr: c.expr.type === \"colref\" && c.expr.parts.length === 1 ? null : c.expr,\n dir: c.dir ?? \"asc\",\n nulls: c.nulls ?? ((c.dir ?? \"asc\") === \"desc\" ? \"first\" : \"last\"),\n })),\n where: stmt.where,\n nullsNotDistinct: stmt.nullsNotDistinct,\n isConstraint: false,\n });\n // unique index: validate existing rows\n if (stmt.unique) {\n try {\n for (let i = 0; i < table.rows.length; i++) {\n checkUnique(env, table, table.rows[i]!, i);\n }\n } catch (err) {\n schema.indexes.delete(name);\n throw err;\n }\n }\n return commandResult(\"CREATE INDEX\", 0);\n}\n\nexport function executeCreateView(env: ExecEnv, stmt: CreateViewStmt): ExecResult {\n const state = env.ctx.state;\n const { schema, name } = targetSchema(env, stmt.name);\n const existing = schema.views.get(name);\n if (schema.hasRelation(name) && !(existing && stmt.orReplace && !stmt.materialized)) {\n throw pgError(\"duplicate_table\", `relation \"${name}\" already exists`, \"42P07\");\n }\n if (existing && stmt.orReplace) {\n // OR REPLACE must keep the original column names/count prefix\n const oldRel = executeSelectStmt({ ctx: env.ctx, params: null, ctes: new Map(), outer: null }, existing.query);\n const newRel = executeSelectStmt({ ctx: env.ctx, params: null, ctes: new Map(), outer: null }, stmt.query);\n if (newRel.columns.length < oldRel.columns.length) {\n throw pgError(\"invalid_table_definition\", `cannot drop columns from view`, \"42P16\");\n }\n }\n let matRows: Datum[][] | null = null;\n let matColumns: Array<{ name: string; type: TypeId }> | null = null;\n if (stmt.materialized) {\n const rel = executeSelectStmt({ ctx: env.ctx, params: null, ctes: new Map(), outer: null }, stmt.query);\n matColumns = rel.columns.map((c, i) => ({\n name: stmt.columns?.[i] ?? c.name,\n type: c.type === UNKNOWN ? \"text\" : c.type,\n }));\n matRows = stmt.withData ? rel.rows : null;\n }\n schema.views.set(name, {\n name,\n schema: schema.name,\n query: stmt.query,\n columns: stmt.columns,\n materialized: stmt.materialized,\n matRows,\n matColumns,\n temp: stmt.temp,\n oid: existing?.oid ?? state.nextOid(),\n });\n return commandResult(stmt.materialized ? \"CREATE MATERIALIZED VIEW\" : \"CREATE VIEW\", 0);\n}\n\nexport function executeRefreshMatView(env: ExecEnv, stmt: RefreshMaterializedViewStmt): ExecResult {\n const view = env.ctx.state.findView(stmt.name);\n if (!view?.materialized) {\n throw pgError(\"undefined_table\", `materialized view \"${stmt.name.join(\".\")}\" does not exist`, \"42P01\");\n }\n const rel = executeSelectStmt({ ctx: env.ctx, params: null, ctes: new Map(), outer: null }, view.query);\n view.matColumns = rel.columns.map((c, i) => ({\n name: view.columns?.[i] ?? c.name,\n type: c.type === UNKNOWN ? \"text\" : c.type,\n }));\n view.matRows = stmt.withData ? rel.rows : null;\n return commandResult(\"REFRESH MATERIALIZED VIEW\", 0);\n}\n\nexport function executeCreateSchema(env: ExecEnv, stmt: CreateSchemaStmt): ExecResult {\n const state = env.ctx.state;\n if (state.schemas.has(stmt.name)) {\n if (stmt.ifNotExists) return commandResult(\"CREATE SCHEMA\", 0);\n throw pgError(\"duplicate_schema\", `schema \"${stmt.name}\" already exists`, \"42P06\");\n }\n state.schemas.set(stmt.name, new SchemaData(stmt.name, state.nextOid()));\n return commandResult(\"CREATE SCHEMA\", 0);\n}\n\nexport function executeCreateEnum(env: ExecEnv, stmt: CreateEnumStmt): ExecResult {\n const state = env.ctx.state;\n const { schema, name } = targetSchema(env, stmt.name);\n if (schema.enums.has(name) || schema.domains.has(name)) {\n throw pgError(\"duplicate_object\", `type \"${name}\" already exists`, \"42710\");\n }\n schema.enums.set(name, { name, schema: schema.name, labels: [...stmt.labels], oid: state.nextOid() });\n return commandResult(\"CREATE TYPE\", 0);\n}\n\nexport function executeAlterEnum(env: ExecEnv, stmt: AlterEnumStmt): ExecResult {\n const e = env.ctx.state.findEnum(stmt.name);\n if (!e) {\n throw pgError(\"undefined_object\", `type \"${stmt.name.join(\".\")}\" does not exist`, \"42704\");\n }\n const a = stmt.action;\n if (a.kind === \"add_value\") {\n if (e.labels.includes(a.label)) {\n if (a.ifNotExists) return commandResult(\"ALTER TYPE\", 0);\n throw pgError(\"duplicate_object\", `enum label \"${a.label}\" already exists`, \"42710\");\n }\n if (a.before) {\n const i = e.labels.indexOf(a.before);\n if (i === -1) throw pgError(\"undefined_object\", `\"${a.before}\" is not an existing enum label`, \"42704\");\n e.labels.splice(i, 0, a.label);\n } else if (a.after) {\n const i = e.labels.indexOf(a.after);\n if (i === -1) throw pgError(\"undefined_object\", `\"${a.after}\" is not an existing enum label`, \"42704\");\n e.labels.splice(i + 1, 0, a.label);\n } else {\n e.labels.push(a.label);\n }\n } else {\n const i = e.labels.indexOf(a.from);\n if (i === -1) throw pgError(\"undefined_object\", `\"${a.from}\" is not an existing enum label`, \"42704\");\n if (e.labels.includes(a.to)) {\n throw pgError(\"duplicate_object\", `enum label \"${a.to}\" already exists`, \"42710\");\n }\n e.labels[i] = a.to;\n }\n return commandResult(\"ALTER TYPE\", 0);\n}\n\nexport function executeCreateDomain(env: ExecEnv, stmt: CreateDomainStmt): ExecResult {\n const state = env.ctx.state;\n const { schema, name } = targetSchema(env, stmt.name);\n if (schema.domains.has(name) || schema.enums.has(name)) {\n throw pgError(\"duplicate_object\", `type \"${name}\" already exists`, \"42710\");\n }\n const resolved = resolveTypeName(state, stmt.baseType);\n let checkIdx = 0;\n schema.domains.set(name, {\n name,\n schema: schema.name,\n baseType: resolved.column,\n notNull: stmt.notNull,\n defaultExpr: stmt.defaultExpr,\n checks: stmt.checks.map((c) => ({\n name: c.name ?? `${name}_check${checkIdx++ === 0 ? \"\" : checkIdx - 1}`,\n expr: c.expr,\n })),\n oid: state.nextOid(),\n });\n return commandResult(\"CREATE DOMAIN\", 0);\n}\n\nexport function executeCreateFunction(env: ExecEnv, stmt: CreateFunctionStmt): ExecResult {\n const state = env.ctx.state;\n const { schema, name } = targetSchema(env, stmt.name);\n const lang = stmt.language.toLowerCase();\n if (lang !== \"sql\" && lang !== \"plpgsql\") {\n throw unsupported(`LANGUAGE ${stmt.language} functions`);\n }\n const argTypes = stmt.args\n .filter((a) => a.mode === \"in\" || a.mode === \"inout\" || a.mode === \"variadic\")\n .map((a) => resolveTypeName(state, a.typeName).column.id);\n const argNames = stmt.args\n .filter((a) => a.mode === \"in\" || a.mode === \"inout\" || a.mode === \"variadic\")\n .map((a) => a.name);\n const argDefaults = stmt.args\n .filter((a) => a.mode === \"in\" || a.mode === \"inout\" || a.mode === \"variadic\")\n .map((a) => a.defaultExpr);\n\n let returns: TypeId | null = null;\n let returnsSet = false;\n let returnsTable: Array<{ name: string; type: TypeId }> | null = null;\n if (stmt.returnsTable) {\n returnsTable = stmt.returnsTable.map((c) => ({ name: c.name, type: resolveTypeName(state, c.typeName).column.id }));\n returnsSet = true;\n } else if (stmt.returns) {\n const parts = stmt.returns.parts;\n const bare = parts.length === 1 ? parts[0]! : null;\n if (bare === \"trigger\") {\n returns = \"trigger\" as TypeId;\n } else if (bare === \"void\") {\n returns = \"void\";\n } else if (bare === \"setof\") {\n // handled by parser as setof flag \u2014 should not occur\n throw unsupported(\"RETURNS SETOF parse form\");\n } else {\n // RETURNS [SETOF] <table> \u2014 a table name is a composite row type\n const compositeTable = state.findTable(stmt.returns.parts);\n if (compositeTable) {\n returnsTable = compositeTable.columns.map((c) => ({ name: c.name, type: c.type.id }));\n returnsSet = stmt.returns.setof === true;\n } else {\n returns = resolveTypeName(state, stmt.returns).column.id;\n returnsSet = stmt.returns.setof === true;\n }\n }\n }\n\n let body: import(\"../ast/nodes.ts\").Statement[] | null = stmt.sqlBody;\n if (body === null && stmt.body !== null && lang === \"sql\") {\n body = parse(stmt.body);\n }\n\n const existing = schema.functions.get(name) ?? [];\n const sameSig = existing.findIndex((f) => f.argTypes.length === argTypes.length);\n if (sameSig !== -1 && !stmt.orReplace) {\n throw pgError(\"duplicate_function\", `function \"${name}\" already exists with same argument types`, \"42723\");\n }\n const fn = {\n name,\n schema: schema.name,\n argNames,\n argTypes,\n argDefaults,\n returns,\n returnsSet,\n returnsTable,\n language: lang,\n body,\n rawBody: stmt.body,\n strict: stmt.strict,\n oid: state.nextOid(),\n };\n if (sameSig !== -1) existing[sameSig] = fn;\n else existing.push(fn);\n schema.functions.set(name, existing);\n return commandResult(\"CREATE FUNCTION\", 0);\n}\n\nexport function executeCreateTrigger(env: ExecEnv, stmt: CreateTriggerStmt): ExecResult {\n const state = env.ctx.state;\n const table = state.findTable(stmt.table);\n if (!table) {\n throw pgError(\"undefined_table\", `relation \"${stmt.table.join(\".\")}\" does not exist`, \"42P01\");\n }\n const fnSchema = stmt.funcName.length >= 2 ? stmt.funcName[stmt.funcName.length - 2]! : null;\n const fnName = stmt.funcName[stmt.funcName.length - 1]!;\n const fns = state.findFunctions(stmt.funcName);\n if (fns.length === 0) {\n throw pgError(\"undefined_function\", `function ${stmt.funcName.join(\".\")}() does not exist`, \"42883\");\n }\n const existing = table.triggers.findIndex((t) => t.name === stmt.name);\n if (existing !== -1 && !stmt.orReplace) {\n throw pgError(\"duplicate_object\", `trigger \"${stmt.name}\" for relation \"${table.name}\" already exists`, \"42710\");\n }\n const meta = {\n name: stmt.name,\n timing: stmt.timing,\n events: stmt.events,\n forEachRow: stmt.forEachRow,\n when: stmt.when,\n funcSchema: fnSchema ?? fns[0]!.schema,\n funcName: fnName,\n funcArgs: stmt.funcArgs,\n };\n if (existing !== -1) table.triggers[existing] = meta;\n else table.triggers.push(meta);\n return commandResult(\"CREATE TRIGGER\", 0);\n}\n\n// ---------------------------------------------------------------------------\n// ALTER TABLE\n// ---------------------------------------------------------------------------\n\nexport function executeAlterTable(env: ExecEnv, stmt: AlterTableStmt): ExecResult {\n const state = env.ctx.state;\n const table = state.findTable(stmt.table);\n if (!table) {\n if (stmt.ifExists) return commandResult(\"ALTER TABLE\", 0);\n // maybe it's a view rename etc.\n throw pgError(\"undefined_table\", `relation \"${stmt.table.join(\".\")}\" does not exist`, \"42P01\");\n }\n const schema = state.getSchema(table.schema);\n\n for (const action of stmt.actions) {\n switch (action.kind) {\n case \"add_column\": {\n if (table.columnIndex(action.column.name) !== -1) {\n if (action.ifNotExists) break;\n throw pgError(\n \"duplicate_column\",\n `column \"${action.column.name}\" of relation \"${table.name}\" already exists`,\n \"42701\",\n );\n }\n const built: BuiltColumns = { columns: [], constraints: [], sequences: [] };\n const taken = constraintNames(table);\n const col = buildColumn(env, schema, table.name, action.column, built, taken);\n for (const seq of built.sequences) schema.sequences.set(seq.name, seq);\n table.columns.push(col);\n table.constraints.push(...built.constraints);\n // fill the new column for existing rows\n for (let i = 0; i < table.rows.length; i++) {\n const row = table.rows[i]!;\n let v: Datum = null;\n if (col.identity) {\n const seq = state.findSequence(col.identity.sequence.split(\".\"));\n if (seq) v = castTo(env.ctx, tv(\"int8\", seqNext(env, seq)), col.type.id, {}).v;\n } else if (col.defaultExpr) {\n v = castTo(env.ctx, evalScalar(env, null, col.defaultExpr), col.type.id, {\n assignment: true,\n mod: col.type.mod,\n }).v;\n }\n row.push(v);\n }\n if (col.generated) {\n for (const row of table.rows) {\n const idx = table.columnIndex(col.name);\n const scope = tableScopeFor(env, table, row);\n row[idx] = castTo(env.ctx, evalScalar(env, scope, col.generated), col.type.id, { assignment: true }).v;\n }\n }\n if (col.notNull) {\n for (const row of table.rows) {\n if ((row[table.columnIndex(col.name)] ?? null) === null) {\n throw pgError(\n \"not_null_violation\",\n `column \"${col.name}\" of relation \"${table.name}\" contains null values`,\n \"23502\",\n );\n }\n }\n }\n break;\n }\n case \"drop_column\": {\n const idx = table.columnIndex(action.name);\n if (idx === -1) {\n if (action.ifExists) break;\n throw pgError(\n \"undefined_column\",\n `column \"${action.name}\" of relation \"${table.name}\" does not exist`,\n \"42703\",\n );\n }\n const used = table.constraints.filter(\n (c) =>\n (c.kind === \"primary_key\" || c.kind === \"unique\" || c.kind === \"foreign_key\") &&\n c.columns.includes(action.name),\n );\n if (used.length > 0 && !action.cascade) {\n // PG drops single-column constraints silently; multi-column requires cascade\n const multi = used.filter((c) => (c as { columns: string[] }).columns.length > 1);\n if (multi.length > 0) {\n throw pgError(\n \"dependent_objects\",\n `cannot drop column ${action.name} of table ${table.name} because other objects depend on it`,\n \"2BP01\",\n );\n }\n }\n table.constraints = table.constraints.filter((c) => {\n if (\n (c.kind === \"primary_key\" || c.kind === \"unique\" || c.kind === \"foreign_key\") &&\n c.columns.includes(action.name)\n ) {\n return false;\n }\n return true;\n });\n table.columns.splice(idx, 1);\n for (const row of table.rows) row.splice(idx, 1);\n // drop indexes referencing the column\n for (const [iname, idxMeta] of [...schema.indexes]) {\n if (idxMeta.table === table.name && idxMeta.columns.some((c) => c.column === action.name)) {\n schema.indexes.delete(iname);\n }\n }\n break;\n }\n case \"alter_type\": {\n const idx = table.columnIndex(action.column);\n if (idx === -1) {\n throw pgError(\n \"undefined_column\",\n `column \"${action.column}\" of relation \"${table.name}\" does not exist`,\n \"42703\",\n );\n }\n const resolved = resolveTypeName(state, action.typeName);\n const col = table.columns[idx]!;\n for (let i = 0; i < table.rows.length; i++) {\n const row = table.rows[i]!;\n const old = row[idx] ?? null;\n let nv: Datum;\n if (action.using) {\n const scope = tableScopeFor(env, table, row);\n nv = castTo(env.ctx, evalScalar(env, scope, action.using), resolved.column.id, {\n explicit: true,\n mod: resolved.column.mod,\n }).v;\n } else if (old === null) {\n nv = null;\n } else {\n nv = castTo(env.ctx, tv(col.type.id, old), resolved.column.id, {\n explicit: false,\n assignment: true,\n mod: resolved.column.mod,\n }).v;\n }\n const next = row.slice();\n next[idx] = nv;\n table.rows[i] = next;\n }\n col.type = resolved.column;\n col.domain = resolved.domain;\n break;\n }\n case \"set_default\": {\n const idx = table.columnIndex(action.column);\n if (idx === -1) {\n throw pgError(\n \"undefined_column\",\n `column \"${action.column}\" of relation \"${table.name}\" does not exist`,\n \"42703\",\n );\n }\n table.columns[idx]!.defaultExpr = action.expr;\n break;\n }\n case \"drop_default\": {\n const idx = table.columnIndex(action.column);\n if (idx === -1) {\n throw pgError(\n \"undefined_column\",\n `column \"${action.column}\" of relation \"${table.name}\" does not exist`,\n \"42703\",\n );\n }\n table.columns[idx]!.defaultExpr = null;\n break;\n }\n case \"set_not_null\": {\n const idx = table.columnIndex(action.column);\n if (idx === -1) {\n throw pgError(\n \"undefined_column\",\n `column \"${action.column}\" of relation \"${table.name}\" does not exist`,\n \"42703\",\n );\n }\n for (const row of table.rows) {\n if ((row[idx] ?? null) === null) {\n throw pgError(\n \"not_null_violation\",\n `column \"${action.column}\" of relation \"${table.name}\" contains null values`,\n \"23502\",\n );\n }\n }\n table.columns[idx]!.notNull = true;\n break;\n }\n case \"drop_not_null\": {\n const idx = table.columnIndex(action.column);\n if (idx === -1) {\n throw pgError(\n \"undefined_column\",\n `column \"${action.column}\" of relation \"${table.name}\" does not exist`,\n \"42703\",\n );\n }\n table.columns[idx]!.notNull = false;\n break;\n }\n case \"add_constraint\": {\n const taken = constraintNames(table);\n const con = buildTableConstraint(env, table.name, table.columns, action.constraint, taken);\n if (con.kind === \"primary_key\") {\n if (table.constraints.some((c) => c.kind === \"primary_key\")) {\n throw pgError(\n \"invalid_table_definition\",\n `multiple primary keys for table \"${table.name}\" are not allowed`,\n \"42P16\",\n );\n }\n for (const cn of con.columns) {\n const col = table.columns[table.columnIndex(cn)]!;\n for (const row of table.rows) {\n if ((row[table.columnIndex(cn)] ?? null) === null) {\n throw pgError(\n \"not_null_violation\",\n `column \"${cn}\" of relation \"${table.name}\" contains null values`,\n \"23502\",\n );\n }\n }\n col.notNull = true;\n }\n }\n table.constraints.push(con);\n if (!action.skipValidation) {\n try {\n validateConstraint(env, table, con);\n } catch (err) {\n table.constraints.pop();\n throw err;\n }\n }\n break;\n }\n case \"drop_constraint\": {\n const idx = table.constraints.findIndex((c) => c.name === action.name);\n if (idx === -1) {\n if (action.ifExists) break;\n throw pgError(\n \"undefined_object\",\n `constraint \"${action.name}\" of relation \"${table.name}\" does not exist`,\n \"42704\",\n );\n }\n table.constraints.splice(idx, 1);\n break;\n }\n case \"rename_column\": {\n const idx = table.columnIndex(action.from);\n if (idx === -1) {\n throw pgError(\"undefined_column\", `column \"${action.from}\" does not exist`, \"42703\");\n }\n if (table.columnIndex(action.to) !== -1) {\n throw pgError(\n \"duplicate_column\",\n `column \"${action.to}\" of relation \"${table.name}\" already exists`,\n \"42701\",\n );\n }\n table.columns[idx]!.name = action.to;\n // update constraint column lists\n for (const con of table.constraints) {\n if (con.kind === \"primary_key\" || con.kind === \"unique\" || con.kind === \"foreign_key\") {\n con.columns = con.columns.map((c) => (c === action.from ? action.to : c));\n }\n }\n for (const idxMeta of schema.indexes.values()) {\n if (idxMeta.table === table.name) {\n for (const c of idxMeta.columns) {\n if (c.column === action.from) c.column = action.to;\n }\n }\n }\n break;\n }\n case \"rename_constraint\": {\n const con = table.constraints.find((c) => c.name === action.from);\n if (!con) {\n throw pgError(\n \"undefined_object\",\n `constraint \"${action.from}\" for table \"${table.name}\" does not exist`,\n \"42704\",\n );\n }\n con.name = action.to;\n break;\n }\n case \"rename_table\": {\n if (schema.hasRelation(action.to)) {\n throw pgError(\"duplicate_table\", `relation \"${action.to}\" already exists`, \"42P07\");\n }\n const oldName = table.name;\n schema.tables.delete(table.name);\n table.name = action.to;\n schema.tables.set(action.to, table);\n // update FK references\n for (const s of state.schemas.values()) {\n for (const t of s.tables.values()) {\n for (const con of t.constraints) {\n if (con.kind === \"foreign_key\" && con.refSchema === schema.name && con.refTable === oldName) {\n con.refTable = action.to;\n }\n }\n }\n }\n for (const idxMeta of schema.indexes.values()) {\n if (idxMeta.table === oldName) idxMeta.table = action.to;\n }\n break;\n }\n case \"set_schema\": {\n const dest = state.getSchema(action.to);\n if (dest.hasRelation(table.name)) {\n throw pgError(\"duplicate_table\", `relation \"${table.name}\" already exists in schema \"${action.to}\"`, \"42P07\");\n }\n schema.tables.delete(table.name);\n const oldSchema = table.schema;\n table.schema = action.to;\n dest.tables.set(table.name, table);\n for (const s of state.schemas.values()) {\n for (const t of s.tables.values()) {\n for (const con of t.constraints) {\n if (con.kind === \"foreign_key\" && con.refSchema === oldSchema && con.refTable === table.name) {\n con.refSchema = action.to;\n }\n }\n }\n }\n break;\n }\n case \"owner_to\":\n break; // no-op\n case \"add_identity\": {\n const idx = table.columnIndex(action.column);\n if (idx === -1) {\n throw pgError(\n \"undefined_column\",\n `column \"${action.column}\" of relation \"${table.name}\" does not exist`,\n \"42703\",\n );\n }\n const col = table.columns[idx]!;\n if (col.identity) {\n throw pgError(\n \"invalid_table_definition\",\n `column \"${action.column}\" of relation \"${table.name}\" is already an identity column`,\n \"42P16\",\n );\n }\n const seqName = truncIdent(`${table.name}_${action.column}_seq`);\n const seq = buildSequence(env, schema, seqName, action.options, false);\n seq.ownedBy = { table: table.name, column: action.column };\n schema.sequences.set(seqName, seq);\n col.identity = { always: true, sequence: `${schema.name}.${seqName}` };\n col.notNull = true;\n break;\n }\n case \"drop_identity\": {\n const idx = table.columnIndex(action.column);\n if (idx === -1) {\n throw pgError(\n \"undefined_column\",\n `column \"${action.column}\" of relation \"${table.name}\" does not exist`,\n \"42703\",\n );\n }\n const col = table.columns[idx]!;\n if (!col.identity) {\n if (action.ifExists) break;\n throw pgError(\n \"invalid_table_definition\",\n `column \"${action.column}\" of relation \"${table.name}\" is not an identity column`,\n \"42P16\",\n );\n }\n const seqParts = col.identity.sequence.split(\".\");\n state.schemas.get(seqParts[0]!)?.sequences.delete(seqParts[1]!);\n col.identity = null;\n break;\n }\n case \"validate_constraint\": {\n const con = table.constraints.find((c) => c.name === action.name);\n if (!con) {\n throw pgError(\n \"undefined_object\",\n `constraint \"${action.name}\" for table \"${table.name}\" does not exist`,\n \"42704\",\n );\n }\n validateConstraint(env, table, con);\n break;\n }\n }\n }\n return commandResult(\"ALTER TABLE\", 0);\n}\n\nfunction tableScopeFor(env: ExecEnv, table: TableData, row: Datum[]): RowScope {\n void env;\n const cols = table.columns.map((c) => ({ name: c.name, type: c.type.id, table: table.name }));\n return new RowScope(cols, row, null, new Set([table.name]));\n}\n\nfunction seqNext(env: ExecEnv, seq: SequenceData): bigint {\n return sequenceNextval(env.ctx, seq);\n}\n\nfunction validateConstraint(env: ExecEnv, table: TableData, con: ConstraintMeta): void {\n void con;\n for (let i = 0; i < table.rows.length; i++) {\n const row = table.rows[i]!;\n checkChecks(env, table, row);\n checkUnique(env, table, row, i);\n checkForeignKeys(env, table, row);\n }\n}\n\n// ---------------------------------------------------------------------------\n// ALTER VIEW / INDEX / SCHEMA\n// ---------------------------------------------------------------------------\n\nexport function executeAlterView(env: ExecEnv, stmt: AlterViewStmt): ExecResult {\n const state = env.ctx.state;\n const view = state.findView(stmt.name);\n if (!view) {\n if (stmt.ifExists) return commandResult(\"ALTER VIEW\", 0);\n throw pgError(\"undefined_table\", `relation \"${stmt.name.join(\".\")}\" does not exist`, \"42P01\");\n }\n const schema = state.getSchema(view.schema);\n if (stmt.action.kind === \"rename_table\") {\n if (schema.hasRelation(stmt.action.to)) {\n throw pgError(\"duplicate_table\", `relation \"${stmt.action.to}\" already exists`, \"42P07\");\n }\n schema.views.delete(view.name);\n view.name = stmt.action.to;\n schema.views.set(view.name, view);\n } else {\n const dest = state.getSchema(stmt.action.to);\n schema.views.delete(view.name);\n view.schema = stmt.action.to;\n dest.views.set(view.name, view);\n }\n return commandResult(\"ALTER VIEW\", 0);\n}\n\nexport function executeAlterIndex(env: ExecEnv, stmt: AlterIndexStmt): ExecResult {\n const state = env.ctx.state;\n const parts = stmt.name;\n const schemaName = parts.length >= 2 ? parts[parts.length - 2]! : null;\n const idxName = parts[parts.length - 1]!;\n let schema: SchemaData | null = null;\n if (schemaName) {\n schema = state.schemas.get(schemaName) ?? null;\n } else {\n for (const s of state.effectiveSearchPath()) {\n if (state.schemas.get(s)?.indexes.has(idxName)) {\n schema = state.schemas.get(s)!;\n break;\n }\n }\n }\n const idx = schema?.indexes.get(idxName);\n if (!schema || !idx) {\n if (stmt.ifExists) return commandResult(\"ALTER INDEX\", 0);\n throw pgError(\"undefined_table\", `relation \"${stmt.name.join(\".\")}\" does not exist`, \"42P01\");\n }\n schema.indexes.delete(idxName);\n idx.name = stmt.action.to;\n schema.indexes.set(idx.name, idx);\n return commandResult(\"ALTER INDEX\", 0);\n}\n\nexport function executeAlterSchema(env: ExecEnv, stmt: AlterSchemaStmt): ExecResult {\n const state = env.ctx.state;\n const schema = state.schemas.get(stmt.name);\n if (!schema) {\n throw pgError(\"undefined_object\", `schema \"${stmt.name}\" does not exist`, \"3F000\");\n }\n if (state.schemas.has(stmt.action.to)) {\n throw pgError(\"duplicate_schema\", `schema \"${stmt.action.to}\" already exists`, \"42P06\");\n }\n state.schemas.delete(stmt.name);\n schema.name = stmt.action.to;\n for (const t of schema.tables.values()) t.schema = stmt.action.to;\n for (const v of schema.views.values()) v.schema = stmt.action.to;\n for (const s of schema.sequences.values()) s.schema = stmt.action.to;\n state.schemas.set(stmt.action.to, schema);\n return commandResult(\"ALTER SCHEMA\", 0);\n}\n\n// ---------------------------------------------------------------------------\n// DROP / TRUNCATE\n// ---------------------------------------------------------------------------\n\nexport function executeDrop(env: ExecEnv, stmt: DropStmt): ExecResult {\n const state = env.ctx.state;\n for (const parts of stmt.names) {\n switch (stmt.kind) {\n case \"table\": {\n const table = state.findTable(parts);\n if (!table) {\n if (stmt.ifExists) break;\n throw pgError(\"undefined_table\", `table \"${parts.join(\".\")}\" does not exist`, \"42P01\");\n }\n const refs = referencingConstraints(env, table).filter((r) => r.table !== table);\n if (refs.length > 0 && !stmt.cascade) {\n throw pgError(\n \"dependent_objects\",\n `cannot drop table ${table.name} because other objects depend on it`,\n \"2BP01\",\n );\n }\n if (stmt.cascade) {\n for (const r of refs) {\n r.table.constraints = r.table.constraints.filter((c) => c !== r.constraint);\n }\n }\n const schema = state.getSchema(table.schema);\n schema.tables.delete(table.name);\n // drop owned sequences and indexes\n for (const [sname, seq] of [...schema.sequences]) {\n if (seq.ownedBy?.table === table.name) schema.sequences.delete(sname);\n }\n for (const [iname, idx] of [...schema.indexes]) {\n if (idx.table === table.name) schema.indexes.delete(iname);\n }\n break;\n }\n case \"view\":\n case \"materialized_view\": {\n const view = state.findView(parts);\n const wantMat = stmt.kind === \"materialized_view\";\n if (!view || view.materialized !== wantMat) {\n if (stmt.ifExists) break;\n throw pgError(\n \"undefined_table\",\n `${wantMat ? \"materialized view\" : \"view\"} \"${parts.join(\".\")}\" does not exist`,\n \"42P01\",\n );\n }\n state.getSchema(view.schema).views.delete(view.name);\n break;\n }\n case \"index\": {\n const idxName = parts[parts.length - 1]!;\n const schemaName = parts.length >= 2 ? parts[parts.length - 2]! : null;\n let found = false;\n const candidates = schemaName ? [schemaName] : state.effectiveSearchPath();\n for (const sn of candidates) {\n const s = state.schemas.get(sn);\n if (s?.indexes.has(idxName)) {\n s.indexes.delete(idxName);\n found = true;\n break;\n }\n }\n if (!found && !stmt.ifExists) {\n throw pgError(\"undefined_table\", `index \"${parts.join(\".\")}\" does not exist`, \"42P01\");\n }\n break;\n }\n case \"sequence\": {\n const seq = state.findSequence(parts);\n if (!seq) {\n if (stmt.ifExists) break;\n throw pgError(\"undefined_table\", `sequence \"${parts.join(\".\")}\" does not exist`, \"42P01\");\n }\n state.getSchema(seq.schema).sequences.delete(seq.name);\n break;\n }\n case \"schema\": {\n const name = parts[parts.length - 1]!;\n const schema = state.schemas.get(name);\n if (!schema) {\n if (stmt.ifExists) break;\n throw pgError(\"undefined_object\", `schema \"${name}\" does not exist`, \"3F000\");\n }\n const nonEmpty =\n schema.tables.size > 0 ||\n schema.views.size > 0 ||\n schema.sequences.size > 0 ||\n schema.enums.size > 0 ||\n schema.domains.size > 0 ||\n schema.functions.size > 0;\n if (nonEmpty && !stmt.cascade) {\n throw pgError(\"dependent_objects\", `cannot drop schema ${name} because other objects depend on it`, \"2BP01\");\n }\n state.schemas.delete(name);\n break;\n }\n case \"type\": {\n const e = state.findEnum(parts);\n if (e) {\n state.getSchema(e.schema).enums.delete(e.name);\n break;\n }\n const d = state.findDomain(parts);\n if (d) {\n state.getSchema(d.schema).domains.delete(d.name);\n break;\n }\n if (!stmt.ifExists) {\n throw pgError(\"undefined_object\", `type \"${parts.join(\".\")}\" does not exist`, \"42704\");\n }\n break;\n }\n case \"domain\": {\n const d = state.findDomain(parts);\n if (!d) {\n if (stmt.ifExists) break;\n throw pgError(\"undefined_object\", `type \"${parts.join(\".\")}\" does not exist`, \"42704\");\n }\n state.getSchema(d.schema).domains.delete(d.name);\n break;\n }\n case \"function\": {\n const fns = state.findFunctions(parts);\n if (fns.length === 0) {\n if (stmt.ifExists) break;\n throw pgError(\"undefined_function\", `function ${parts.join(\".\")} does not exist`, \"42883\");\n }\n const fn = fns[0]!;\n const schema = state.getSchema(fn.schema);\n const list = schema.functions.get(fn.name) ?? [];\n if (list.length <= 1) schema.functions.delete(fn.name);\n else schema.functions.set(fn.name, list.slice(1));\n break;\n }\n case \"trigger\": {\n if (!stmt.onTable) throw pgError(\"syntax\", \"DROP TRIGGER requires ON table\", \"42601\");\n const table = state.findTable(stmt.onTable);\n if (!table) {\n if (stmt.ifExists) break;\n throw pgError(\"undefined_table\", `relation \"${stmt.onTable.join(\".\")}\" does not exist`, \"42P01\");\n }\n const tname = parts[parts.length - 1]!;\n const idx = table.triggers.findIndex((t) => t.name === tname);\n if (idx === -1) {\n if (stmt.ifExists) break;\n throw pgError(\"undefined_object\", `trigger \"${tname}\" for table \"${table.name}\" does not exist`, \"42704\");\n }\n table.triggers.splice(idx, 1);\n break;\n }\n case \"extension\":\n break; // accepted no-op\n }\n }\n const label = stmt.kind === \"materialized_view\" ? \"MATERIALIZED VIEW\" : stmt.kind.toUpperCase();\n return commandResult(`DROP ${label.replaceAll(\"_\", \" \")}`, 0);\n}\n\nexport function executeTruncate(env: ExecEnv, stmt: TruncateStmt): ExecResult {\n const state = env.ctx.state;\n const tables: TableData[] = stmt.tables.map((parts) => {\n const t = state.findTable(parts);\n if (!t) throw pgError(\"undefined_table\", `relation \"${parts.join(\".\")}\" does not exist`, \"42P01\");\n return t;\n });\n const set = new Set(tables);\n if (stmt.cascade) {\n // add referencing tables transitively\n let grew = true;\n while (grew) {\n grew = false;\n for (const t of [...set]) {\n for (const r of referencingConstraints(env, t)) {\n if (!set.has(r.table)) {\n set.add(r.table);\n grew = true;\n }\n }\n }\n }\n } else {\n for (const t of set) {\n for (const r of referencingConstraints(env, t)) {\n if (!set.has(r.table) && r.table.rows.length >= 0) {\n throw pgError(\n \"feature_not_supported\",\n `cannot truncate a table referenced in a foreign key constraint`,\n \"0A000\",\n );\n }\n }\n }\n }\n for (const t of set) {\n t.rows = [];\n if (stmt.restartIdentity) {\n const schema = state.getSchema(t.schema);\n for (const seq of schema.sequences.values()) {\n if (seq.ownedBy?.table === t.name) {\n seq.lastValue = seq.startValue;\n seq.isCalled = false;\n }\n }\n }\n }\n return commandResult(\"TRUNCATE TABLE\", 0);\n}\n", "import type { Statement } from \"../ast/nodes.ts\";\nimport { pgError, unsupported } from \"../errors/error.ts\";\n// side effect: registers the pg_catalog / information_schema builder\nimport \"../schema/catalog-tables.ts\";\nimport \"./triggers-exec.ts\";\nimport { EngineCtx } from \"../expressions/context.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\nimport type { TypedValue } from \"../types/value.ts\";\nimport {\n executeAlterEnum,\n executeAlterIndex,\n executeAlterSchema,\n executeAlterSequence,\n executeAlterTable,\n executeAlterView,\n executeCreateDomain,\n executeCreateEnum,\n executeCreateFunction,\n executeCreateIndex,\n executeCreateSchema,\n executeCreateSequence,\n executeCreateTable,\n executeCreateTableAs,\n executeCreateTrigger,\n executeCreateView,\n executeDrop,\n executeRefreshMatView,\n executeTruncate,\n} from \"./ddl.ts\";\nimport { executeDelete, executeInsert, executeUpdate } from \"./dml.ts\";\nimport { commandResult, type ExecEnv, type ExecResult, relationResult } from \"./relation.ts\";\nimport { executeSelectStmt, setStatementRunner } from \"./select.ts\";\nimport {\n executeCopy,\n executeDeallocate,\n executeExecute,\n executeExplain,\n executePrepare,\n executeReset,\n executeSet,\n executeShow,\n executeTransaction,\n} from \"./session.ts\";\n\n/** Execute one parsed statement against `state`. */\nexport function executeStatement(env: ExecEnv, stmt: Statement): ExecResult {\n switch (stmt.type) {\n case \"select\":\n return relationResult(executeSelectStmt(env, stmt), \"SELECT\");\n case \"insert\":\n return executeInsert(env, stmt);\n case \"update\":\n return executeUpdate(env, stmt);\n case \"delete\":\n return executeDelete(env, stmt);\n case \"create_table\":\n return executeCreateTable(env, stmt);\n case \"create_table_as\":\n return executeCreateTableAs(env, stmt);\n case \"create_index\":\n return executeCreateIndex(env, stmt);\n case \"create_view\":\n return executeCreateView(env, stmt);\n case \"create_sequence\":\n return executeCreateSequence(env, stmt);\n case \"alter_sequence\":\n return executeAlterSequence(env, stmt);\n case \"create_schema\":\n return executeCreateSchema(env, stmt);\n case \"create_enum\":\n return executeCreateEnum(env, stmt);\n case \"alter_enum\":\n return executeAlterEnum(env, stmt);\n case \"create_domain\":\n return executeCreateDomain(env, stmt);\n case \"create_function\":\n return executeCreateFunction(env, stmt);\n case \"create_trigger\":\n return executeCreateTrigger(env, stmt);\n case \"alter_table\":\n return executeAlterTable(env, stmt);\n case \"alter_view\":\n return executeAlterView(env, stmt);\n case \"alter_index\":\n return executeAlterIndex(env, stmt);\n case \"alter_schema\":\n return executeAlterSchema(env, stmt);\n case \"drop\":\n return executeDrop(env, stmt);\n case \"truncate\":\n return executeTruncate(env, stmt);\n case \"refresh_materialized_view\":\n return executeRefreshMatView(env, stmt);\n case \"transaction\":\n return executeTransaction(env, stmt);\n case \"set\":\n return executeSet(env, stmt);\n case \"show\":\n return executeShow(env, stmt);\n case \"reset\":\n return executeReset(env, stmt);\n case \"prepare\":\n return executePrepare(env, stmt);\n case \"execute\":\n return executeExecute(env, stmt);\n case \"deallocate\":\n return executeDeallocate(env, stmt);\n case \"explain\":\n return executeExplain(env, stmt);\n case \"copy\":\n return executeCopy(env, stmt);\n case \"comment\":\n return commandResult(\"COMMENT\", 0);\n case \"no_op\":\n return commandResult(stmt.what.toUpperCase(), 0);\n case \"do\":\n throw unsupported(`DO blocks (language ${stmt.language})`);\n default: {\n const t: never = stmt;\n throw pgError(\"internal\", `unhandled statement type ${(t as { type: string }).type}`);\n }\n }\n}\n\nsetStatementRunner(executeStatement);\n\n/** Fresh execution environment for one top-level statement. */\nexport function makeEnv(state: DatabaseState, params: TypedValue[] | null = null): ExecEnv {\n return { ctx: new EngineCtx(state), params, ctes: new Map(), outer: null };\n}\n\nexport type { ExecEnv, ExecResult };\n", "import { pgError } from \"../errors/error.ts\";\nimport { UNIX_EPOCH_MICROS_FROM_PG } from \"../types/datetime.ts\";\nimport { type Datum, datumText, type OutputCtx, type TypedValue, type TypeId, tv, UNKNOWN } from \"../types/value.ts\";\n\n/** JavaScript values accepted as query parameters (`$1..$n`). */\nexport type BindValue = null | undefined | boolean | number | bigint | string | Uint8Array | Date;\n\n/** JavaScript values produced in query result rows. */\nexport type JsValue = null | boolean | number | bigint | string | Uint8Array;\n\n/** A result row keyed by column name. */\nexport type QueryRow = Record<string, JsValue>;\n\nconst INT4_MIN = -2147483648;\nconst INT4_MAX = 2147483647;\n\nexport function bindValueToTyped(value: BindValue, index: number): TypedValue {\n if (value === null || value === undefined) return tv(UNKNOWN, null);\n switch (typeof value) {\n case \"boolean\":\n return tv(\"bool\", value);\n case \"number\":\n if (Number.isInteger(value) && value >= INT4_MIN && value <= INT4_MAX) {\n return tv(\"int4\", value);\n }\n if (Number.isInteger(value) && Number.isSafeInteger(value)) {\n return tv(\"int8\", BigInt(value));\n }\n return tv(\"float8\", value);\n case \"bigint\":\n if (value < -9223372036854775808n || value > 9223372036854775807n) {\n throw pgError(\"numeric_value_out_of_range\", `bigint parameter $${index + 1} out of int8 range`, \"22003\");\n }\n return tv(\"int8\", value);\n case \"string\":\n // like an untyped literal: coerces by context\n return tv(UNKNOWN, value);\n case \"object\": {\n if (value instanceof Uint8Array) return tv(\"bytea\", value);\n if (value instanceof Date) {\n const ms = value.getTime();\n if (Number.isNaN(ms)) {\n throw pgError(\"invalid_datetime\", `invalid Date parameter $${index + 1}`, \"22008\");\n }\n return tv(\"timestamptz\", BigInt(Math.round(ms)) * 1000n + UNIX_EPOCH_MICROS_FROM_PG);\n }\n break;\n }\n default:\n break;\n }\n throw pgError(\"misuse\", `unsupported parameter type for $${index + 1}: ${typeof value}`, \"XX000\");\n}\n\n/** Convert an engine datum to the public JS value for result rows. */\nexport function datumToJs(t: TypeId, v: Datum, ctx: OutputCtx): JsValue {\n if (v === null) return null;\n switch (t) {\n case \"bool\":\n return v as boolean;\n case \"int2\":\n case \"int4\":\n case \"oid\":\n return typeof v === \"bigint\" ? Number(v) : (v as number);\n case \"int8\":\n return typeof v === \"bigint\" ? v : BigInt(v as number);\n case \"float4\":\n case \"float8\":\n return v as number;\n case \"bytea\":\n return v as Uint8Array;\n default:\n // numeric, text family, datetime, arrays, json(b), records, enums, \u2026\n // all surface as canonical PostgreSQL text\n return datumText(t === UNKNOWN ? \"text\" : t, v, ctx);\n }\n}\n", "import type { Statement as AstStatement } from \"../ast/nodes.ts\";\nimport { pgError } from \"../errors/error.ts\";\nimport { executeStatement } from \"../executor/execute.ts\";\nimport type { ExecEnv, ExecResult } from \"../executor/relation.ts\";\nimport { EngineCtx } from \"../expressions/context.ts\";\nimport { parse } from \"../parser/index.ts\";\nimport type { TypedValue } from \"../types/value.ts\";\nimport { datumText, UNKNOWN } from \"../types/value.ts\";\nimport { type BindValue, bindValueToTyped, datumToJs, type QueryRow } from \"./bind.ts\";\nimport type { Database } from \"./database.ts\";\n\n/** Row-count summary returned by {@link Statement.run}. */\nexport interface RunResult {\n /** Rows affected by the last statement (PostgreSQL command tag count). */\n rowCount: number;\n /** Command tag of the last statement, e.g. `\"INSERT\"`. */\n command: string;\n}\n\n/** {@link Statement.textResult}: rows as canonical PostgreSQL text. */\nexport interface TextResultSet {\n columns: string[];\n columnTypes: string[];\n rows: (string | null)[][];\n rowCount: number;\n command: string;\n}\n\n/** Full result including column metadata (useful for zero-row results). */\nexport interface ResultSet {\n columns: string[];\n /** canonical type names per column (PG internal names, e.g. \"int4\") */\n columnTypes: string[];\n rows: QueryRow[];\n rowCount: number;\n command: string;\n}\n\n/**\n * Prepared SQL statement bound to a {@link Database}. Parameters are\n * positional PostgreSQL placeholders `$1..$n`, passed per call (stateless).\n */\nexport class Statement {\n private statements: AstStatement[];\n\n /** The source SQL this statement was prepared from. */\n readonly sql: string;\n\n private constructor(\n private readonly database: Database,\n sql: string,\n statements: AstStatement[],\n ) {\n this.sql = sql;\n this.statements = statements;\n }\n\n /** @internal */\n static create(database: Database, sql: string, statements: AstStatement[]): Statement {\n return new Statement(database, sql, statements);\n }\n\n /** @internal */\n static createFromSql(database: Database, sql: string): Statement {\n return new Statement(database, sql, parse(sql));\n }\n\n /** Execute for side effects; returns the affected row count. */\n run(...params: BindValue[]): RunResult {\n const res = this.execute(params);\n return { rowCount: res.rowCount, command: res.command };\n }\n\n /** Execute and return all rows as objects keyed by column name. */\n all<T = QueryRow>(...params: BindValue[]): T[] {\n return this.toRows(this.execute(params)) as T[];\n }\n\n /** Execute and return the first row, or `undefined`. */\n get<T = QueryRow>(...params: BindValue[]): T | undefined {\n return (this.toRows(this.execute(params)) as T[])[0];\n }\n\n /**\n * Execute and return rows rendered as canonical PostgreSQL text (psql-style),\n * plus column metadata. NULLs stay `null`.\n */\n textResult(...params: BindValue[]): TextResultSet {\n const res = this.execute(params);\n const ctx = new EngineCtx(this.database.state);\n return {\n columns: res.columns.map((c) => c.name),\n columnTypes: res.columns.map((c) => (c.type === UNKNOWN ? \"text\" : c.type)),\n rows: res.rows.map((row) =>\n res.columns.map((c, i) => {\n const v = row[i] ?? null;\n return v === null ? null : datumText(c.type === UNKNOWN ? \"text\" : c.type, v, ctx);\n }),\n ),\n rowCount: res.rowCount,\n command: res.command,\n };\n }\n\n /** Execute and return the full {@link ResultSet} with column metadata. */\n result(...params: BindValue[]): ResultSet {\n const res = this.execute(params);\n return {\n columns: res.columns.map((c) => c.name),\n columnTypes: res.columns.map((c) => (c.type === UNKNOWN ? \"text\" : c.type)),\n rows: this.toRows(res),\n rowCount: res.rowCount,\n command: res.command,\n };\n }\n\n private execute(params: readonly BindValue[]): ExecResult {\n this.database.assertOpen();\n if (this.statements.length === 0) {\n throw pgError(\"misuse\", \"empty statement\", \"XX000\");\n }\n const typed: TypedValue[] = params.map((p, i) => bindValueToTyped(p, i));\n let last: ExecResult | null = null;\n for (const stmt of this.statements) {\n const env: ExecEnv = {\n ctx: new EngineCtx(this.database.state),\n params: typed,\n ctes: new Map(),\n outer: null,\n };\n last = executeStatement(env, stmt);\n }\n return last!;\n }\n\n private toRows(res: ExecResult): QueryRow[] {\n const ctx = new EngineCtx(this.database.state);\n return res.rows.map((row) => {\n const obj: QueryRow = {};\n for (let i = 0; i < res.columns.length; i++) {\n const c = res.columns[i]!;\n obj[c.name] = datumToJs(c.type, row[i] ?? null, ctx);\n }\n return obj;\n });\n }\n}\n", "import { PostgresError, pgError } from \"../errors/error.ts\";\nimport type { ExecEnv } from \"../executor/relation.ts\";\nimport { executeCopyFromData, txManagerFor } from \"../executor/session.ts\";\nimport { EngineCtx } from \"../expressions/context.ts\";\nimport { parse } from \"../parser/index.ts\";\nimport {\n type Clock,\n type DatabaseOptions,\n DEFAULT_DATABASE_SEED,\n OsEntropy,\n Prng,\n type RandomMode,\n resolveClock,\n} from \"../runtime/index.ts\";\nimport { DatabaseState } from \"../storage/database-state.ts\";\nimport type { TransactionManager } from \"../transactions/manager.ts\";\nimport type { BindValue, QueryRow } from \"./bind.ts\";\nimport { Statement } from \"./statement.ts\";\n\n/**\n * Pure TypeScript in-memory PostgreSQL database.\n *\n * Deterministic by default: `random()` / `gen_random_uuid()` use a seeded PRNG\n * (`seed` defaults to `1`) and `now()` / `current_timestamp` use a fixed clock\n * (`2000-01-01T00:00:00.000Z`). Pass `{ random: \"os\" }` and `{ now: \"system\" }`\n * for PostgreSQL-like entropy and wall-clock time. No filesystem, no WASM.\n *\n * @example\n * ```ts\n * import { Database } from \"@crvouga/postgres-mem\";\n *\n * const db = new Database();\n * db.exec(\"CREATE TABLE users (id serial PRIMARY KEY, name text NOT NULL)\");\n * db.prepare(\"INSERT INTO users (name) VALUES ($1)\").run(\"Alice\");\n * const users = db.query<{ id: number; name: string }>(\"SELECT * FROM users\");\n * ```\n */\nexport class Database {\n /** @internal Engine catalog, tables, session settings. */\n readonly state: DatabaseState;\n /** Seed used to construct the PRNG. Ignored when {@link randomMode} is `\"os\"`. */\n readonly seed: number | bigint;\n /** Entropy mode for `random()` / `gen_random_uuid()`. */\n readonly randomMode: RandomMode;\n /** @internal true when `now` follows the wall clock. */\n readonly systemClock: boolean;\n /** @internal PRNG backing `random()` and friends. */\n readonly prng: Prng;\n /** @internal Clock used by `now()` / `current_timestamp`. */\n now: Clock;\n /** @internal Transaction / savepoint manager. */\n readonly transactions: TransactionManager;\n private closed = false;\n private transactionSequence = 0;\n private apiTransactionDepth = 0;\n\n constructor(options: DatabaseOptions = {}) {\n this.seed = options.seed ?? DEFAULT_DATABASE_SEED;\n this.randomMode = options.random ?? \"deterministic\";\n this.systemClock = options.now === \"system\";\n this.prng = this.randomMode === \"os\" ? new OsEntropy() : new Prng(this.seed);\n this.now = resolveClock(options.now);\n this.state = new DatabaseState(this.prng, () => this.now());\n this.transactions = txManagerFor(this.state);\n }\n\n /**\n * Execute SQL for its side effects. Multiple semicolon-separated statements\n * are allowed. Does not accept bind parameters \u2014 use {@link prepare} / {@link query}.\n */\n exec(sql: string): void {\n this.assertOpen();\n // biome-ignore lint/complexity/noArguments: intentional arity check for the frozen exec(sql) signature\n if (arguments.length > 1) {\n throw pgError(\"misuse\", \"exec() does not accept parameters; use prepare() or query()\", \"XX000\");\n }\n Statement.createFromSql(this, sql).run();\n }\n\n /** Execute a single-statement query and return all rows keyed by column name. */\n query<T = QueryRow>(sql: string, params: readonly BindValue[] = []): T[] {\n this.assertOpen();\n return this.prepareSingle(sql).all<T>(...params);\n }\n\n /** Compile a single SQL statement into a reusable {@link Statement}. */\n prepare(sql: string): Statement {\n this.assertOpen();\n return this.prepareSingle(sql);\n }\n\n /**\n * Run `fn` inside a transaction. Commits on success; rolls back if `fn`\n * throws. Nested calls use savepoints.\n */\n transaction<T>(fn: () => T): T {\n this.assertOpen();\n this.apiTransactionDepth++;\n try {\n if (!this.transactions.inTransaction) {\n this.transactions.begin();\n try {\n const value = fn();\n this.transactions.commit();\n return value;\n } catch (error) {\n this.transactions.rollback();\n throw error;\n }\n }\n const name = `__api_transaction_${++this.transactionSequence}`;\n this.transactions.savepoint(name);\n try {\n const value = fn();\n this.transactions.releaseSavepoint(name);\n return value;\n } catch (error) {\n this.transactions.rollbackToSavepoint(name);\n this.transactions.releaseSavepoint(name);\n throw error;\n }\n } finally {\n this.apiTransactionDepth--;\n }\n }\n\n /**\n * Serialize schema, rows, PRNG state, and clock into a `PGMM` snapshot blob.\n * Restore with {@link restore}. Not an on-disk PostgreSQL format.\n */\n snapshot(): Uint8Array {\n this.assertOpen();\n const { encodeDatabaseState } = requireCodec();\n return encodeDatabaseState(this.state, {\n prngState: this.prng.getState(),\n nowMs: this.now().getTime(),\n });\n }\n\n /** Replace this database's contents with a blob from {@link snapshot}. */\n restore(snapshot: Uint8Array): void {\n this.assertOpen();\n if (this.transactions.inTransaction) {\n throw pgError(\"transaction_state\", \"cannot restore during a transaction\", \"25P01\");\n }\n const { decodeDatabaseState } = requireCodec();\n const decoded = decodeDatabaseState(snapshot, this.prng, () => this.now());\n this.state.restoreFrom(decoded.state);\n if (decoded.runtime) {\n this.prng.setState(decoded.runtime.prngState);\n if (!this.systemClock) {\n const ms = decoded.runtime.nowMs;\n this.now = () => new Date(ms);\n }\n }\n }\n\n /** Close the database. Further SQL throws. Idempotent. */\n close(): void {\n if (this.closed) return;\n if (this.apiTransactionDepth > 0) {\n throw pgError(\"misuse\", \"cannot close database inside transaction()\", \"XX000\");\n }\n if (this.transactions.inTransaction) this.transactions.rollback();\n this.closed = true;\n }\n\n /**\n * Execute `COPY table [(cols)] FROM STDIN` with the given text/csv payload\n * (the API-level analog of psql's `\\copy` / the wire-protocol copy-in stream).\n * Returns the number of rows copied.\n *\n * @example\n * ```ts\n * db.copyFrom(\"COPY t (a, b) FROM STDIN\", \"1\\tx\\n2\\ty\\n\");\n * ```\n */\n copyFrom(sql: string, data: string): number {\n this.assertOpen();\n const statements = parse(sql);\n const stmt = statements[0];\n if (statements.length !== 1 || !stmt || stmt.type !== \"copy\" || stmt.direction !== \"from\") {\n throw pgError(\"misuse\", \"copyFrom() requires a single COPY ... FROM STDIN statement\", \"XX000\");\n }\n const env: ExecEnv = { ctx: new EngineCtx(this.state), params: null, ctes: new Map(), outer: null };\n return executeCopyFromData(env, stmt, data).rowCount;\n }\n\n /** Rows affected by the most recent INSERT / UPDATE / DELETE. */\n get changes(): number {\n this.assertOpen();\n return this.state.changes;\n }\n\n /** @internal */\n assertOpen(): void {\n if (this.closed) throw pgError(\"misuse\", \"Database is closed\", \"XX000\");\n }\n\n private prepareSingle(sql: string): Statement {\n const statements = parse(sql);\n if (statements.length === 0) {\n throw pgError(\"misuse\", \"empty statement\", \"XX000\");\n }\n if (statements.length > 1) {\n throw pgError(\"misuse\", \"query()/prepare() accept a single statement only; use exec() for scripts\", \"XX000\");\n }\n return Statement.create(this, sql, statements);\n }\n}\n\n/**\n * Snapshot codec indirection: implemented by src/serialization/codec.ts\n * (registered at module load); throws until that module is present.\n * @internal\n */\ninterface CodecModule {\n encodeDatabaseState(state: DatabaseState, runtime: { prngState: bigint; nowMs: number }): Uint8Array;\n decodeDatabaseState(\n bytes: Uint8Array,\n prng: Prng,\n clock: Clock,\n ): { state: DatabaseState; runtime: { prngState: bigint; nowMs: number } | null };\n}\n\nlet codec: CodecModule | null = null;\n\n/** @internal registered by serialization/codec.ts */\nexport function registerCodec(m: CodecModule): void {\n codec = m;\n}\n\nfunction requireCodec(): CodecModule {\n if (!codec) {\n throw new PostgresError(\"unsupported\", \"snapshot codec not loaded\");\n }\n return codec;\n}\n\nconst disposeKey = (Symbol as unknown as { dispose?: symbol }).dispose;\nif (typeof disposeKey === \"symbol\") {\n Object.defineProperty(Database.prototype, disposeKey, {\n value: function (this: Database): void {\n this.close();\n },\n writable: true,\n configurable: true,\n });\n}\n\nexport type { DatabaseOptions };\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["matches", "zoneOffsetForNaive", "months", "days", "micros", "p", "rscale", "negate", "coef", "ws", "r", "digits", "bad", "name", "parsed", "chars", "name", "found", "count", "days", "matches", "cast", "micros", "b", "pad", "entries", "pad", "x", "y", "l", "chars", "chars", "from", "start", "len", "re", "match", "tsvectorLength", "isIntType", "a", "b", "elem", "t", "ra", "chars", "l", "r", "elem", "values", "variance", "v", "a", "t", "start", "stop", "step", "rows", "p", "rows", "v", "matches", "name", "c", "matches", "col", "e", "raw", "objectName", "comment", "t", "save", "alias", "colAliases", "strict", "ifNotExists", "ifExists", "name", "cascade", "from", "arrayDims", "chars", "INT4_MIN", "INT4_MAX"]
|
|
7
|
+
}
|