@crvouga/mockingbird-service-postgres 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/wire/index.ts", "../../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/runtime/assert.ts", "../../src/types/numeric.ts", "../../src/types/jsonb.ts", "../../src/types/jsonpath.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/api/bind.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/indexes/index.ts", "../../src/indexes/maintain.ts", "../../src/planner/access.ts", "../../src/lexer/tokenize.ts", "../../src/parser/parser.ts", "../../src/executor/plpgsql.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/runtime/clock.ts", "../../src/runtime/options.ts", "../../src/api/snapshot.ts", "../../src/schema/catalog-tables.ts", "../../src/executor/triggers-exec.ts", "../../src/executor/ddl.ts", "../../src/executor/execute.ts", "../../src/api/statement.ts", "../../src/api/database.ts", "../../src/wire/cluster.ts", "../../src/wire/protocol.ts", "../../src/wire/scram.ts", "../../src/wire/split.ts", "../../src/wire/connection.ts"],
4
+ "sourcesContent": ["/**\n * A PostgreSQL wire-protocol (frontend/backend 3.0) TCP server in front of the in-memory\n * engine, so a separate process can use it through a normal `postgres://` connection string:\n * `pg`, `postgres.js`, a JDBC client, `psql`. It runs in Node and Bun (it needs `node:net`),\n * not the browser.\n *\n * One {@link Database} is shared by every connection through a {@link Cluster}: the engine\n * runs one statement at a time, so a connection inside an explicit `BEGIN` block holds the\n * engine until it commits or rolls back and the others queue, which keeps read-committed\n * visibility (uncommitted rows never reach another connection) at the cost of serializing\n * transaction blocks. Advisory locks, `LISTEN`/`NOTIFY`, `CancelRequest` and per-connection\n * aborted-transaction state (`25P02`) are coordinated across connections.\n *\n * @example\n * ```ts\n * import { serve } from \"@crvouga/mockingbird-service-postgres/wire\";\n *\n * const server = await serve({ port: 0 });\n * // new pg.Pool({ connectionString: `postgres://postgres@127.0.0.1:${server.port}/db` })\n * await server.close();\n * ```\n *\n * @module\n */\nimport { createServer, type Server, type Socket } from \"node:net\";\nimport { Database } from \"../api/database.ts\";\nimport type { Snapshot } from \"../api/snapshot.ts\";\nimport { Cluster } from \"./cluster.ts\";\nimport { Connection, type ServerFaults, type ServerLog } from \"./connection.ts\";\n\nexport type ServeOptions = {\n /** TCP port; `0` (the default) picks a free one, reported as `server.port`. */\n port?: number;\n /** Interface to bind; default `127.0.0.1`. */\n host?: string;\n /**\n * The database to serve. Pass a {@link Database} to share an existing one, a {@link Snapshot}\n * to boot every server from one frozen template, or omit it for a fresh deterministic engine.\n */\n database?: Database | Snapshot;\n /** Require SCRAM-SHA-256 with this password; omitted means trust (AuthenticationOk). */\n password?: string;\n /** `server_version` reported at startup and by `SHOW server_version`. Default `18.3`. */\n serverVersion?: string;\n /** Extra `ParameterStatus` values sent at startup (override the defaults). */\n parameters?: Record<string, string>;\n /** Per-statement log sink, for tests and debugging. */\n onLog?: (entry: ServerLog) => void;\n};\n\nexport type PostgresServer = {\n /** The bound port. */\n readonly port: number;\n /** The bound host. */\n readonly host: string;\n /** The shared engine, for seeding, snapshotting or asserting from the test process. */\n readonly database: Database;\n /** The underlying `net.Server`. */\n readonly server: Server;\n /** Open connections right now. */\n readonly connections: number;\n /** Arm a fault preset for the next statement / connection (see {@link ServerFaults}). */\n fault(fault: ServerFaults): void;\n /** Freeze the live state (the admin `snapshot()` control). */\n snapshot(): Snapshot;\n /** Stop listening and close every connection. */\n close(): Promise<void>;\n};\n\nconst isSnapshot = (value: unknown): value is Snapshot =>\n typeof value === \"object\" && value !== null && \"open\" in value && typeof (value as Snapshot).open === \"function\";\n\n/** Start a server and resolve once it is listening. */\nexport const serve = (options: ServeOptions = {}): Promise<PostgresServer> => {\n const database = isSnapshot(options.database) ? options.database.open() : (options.database ?? new Database());\n const cluster = new Cluster(database);\n const faults: ServerFaults = {};\n const connections = new Set<Connection>();\n const host = options.host ?? \"127.0.0.1\";\n\n const server = createServer((socket: Socket) => {\n socket.setNoDelay(true);\n const connection = new Connection(socket, cluster, {\n ...(options.password !== undefined ? { password: options.password } : {}),\n serverVersion: options.serverVersion ?? \"18.3\",\n parameters: options.parameters ?? {},\n faults,\n ...(options.onLog ? { onLog: options.onLog } : {}),\n });\n connections.add(connection);\n socket.on(\"close\", () => connections.delete(connection));\n });\n\n return new Promise<PostgresServer>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(options.port ?? 0, host, () => {\n server.removeListener(\"error\", reject);\n const address = server.address();\n const port = typeof address === \"object\" && address !== null ? address.port : 0;\n resolve({\n port,\n host,\n database,\n server,\n get connections() {\n return connections.size;\n },\n fault(next) {\n Object.assign(faults, next);\n },\n snapshot() {\n return database.snapshot();\n },\n close() {\n for (const connection of connections) connection.destroy();\n connections.clear();\n return new Promise<void>((done, fail) => {\n server.close((error?: Error | null) => (error ? fail(error) : done()));\n });\n },\n });\n });\n });\n};\n\nexport { Cluster } from \"./cluster.ts\";\nexport type { ServerFaults, ServerLog } from \"./connection.ts\";\n", "/**\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/** Internal invariant failure \u2014 not a user SQL error. */\nexport function assert(condition: boolean, message: string): asserts condition {\n if (!condition) {\n throw pgError(\"internal\", message, \"XX000\");\n }\n}\n\nexport function assertDefined<T>(value: T | null | undefined, message: string): T {\n if (value === null || value === undefined) {\n throw pgError(\"internal\", message, \"XX000\");\n }\n return value;\n}\n\nexport function assertBounds(value: number, min: number, max: number, label: string): void {\n if (value < min || value > max) {\n throw pgError(\"internal\", `${label} out of bounds: ${value} not in [${min}, ${max}]`, \"XX000\");\n }\n}\n\nexport function assertNever(value: never, message = \"unreachable\"): never {\n throw pgError(\"internal\", `${message}: ${String(value)}`, \"XX000\");\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport { assertBounds } from \"../runtime/assert.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 assertBounds(dscale, 0, MAX_DISPLAY_SCALE, \"numeric dscale\");\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 let dscale = a.dscale + b.dscale;\n let coef = a.coef * b.coef;\n if (dscale > MAX_DISPLAY_SCALE) {\n coef = roundToScale(coef, dscale, MAX_DISPLAY_SCALE);\n dscale = MAX_DISPLAY_SCALE;\n }\n return makeNumeric(coef, 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 pgError(\"internal\", \"bigintSqrt: negative operand\", \"XX000\");\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 { assertNever } from \"../runtime/assert.ts\";\nimport { type Numeric, numericCmp, numericStripTrailingZeros, numericText, parseNumeric } from \"./numeric.ts\";\n\nconst MAX_JSON_PARSE_DEPTH = 512;\nconst JSON_TEXT_ENCODER = new TextEncoder();\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(0);\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(depth: number): JsonbValue {\n if (depth > MAX_JSON_PARSE_DEPTH) {\n throw pgError(\"program_limit_exceeded\", \"json nesting depth exceeds maximum\", \"54000\");\n }\n const c = this.text[this.pos];\n if (c === undefined) this.fail(\"unexpected end\");\n if (c === \"{\") return this.parseObject(depth + 1);\n if (c === \"[\") return this.parseArray(depth + 1);\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(depth: number): 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(depth);\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(depth: number): 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(depth));\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 = JSON_TEXT_ENCODER.encode(a);\n const eb = JSON_TEXT_ENCODER.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 return numericCmp(numericStripTrailingZeros(a.v), numericStripTrailingZeros(bb.v));\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 default:\n return assertNever(a);\n }\n}\n\n/** jsonb containment (@>). */\nexport function jsonbContains(a: JsonbValue, b: JsonbValue, opts?: { allowScalarInArray?: boolean }): boolean {\n const allowScalarInArray = opts?.allowScalarInArray ?? true;\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, { allowScalarInArray: false })) 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, opts)) {\n found = true;\n break;\n }\n }\n if (!found) return false;\n }\n return true;\n }\n if (allowScalarInArray && a.j === \"arr\" && b.j !== \"arr\" && b.j !== \"obj\") {\n // top-level only: '[1,2]' @> '1' \u2014 not '{\"a\":[1,2]}' @> '{\"a\":1}'\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 } from \"../errors/error.ts\";\nimport type { JsonbValue } from \"./jsonb.ts\";\n\ntype PathStep = { kind: \"member\"; name: string } | { kind: \"index\"; index: number };\n\nfunction invalidJsonpath(): never {\n throw pgError(\"invalid_text_representation\", \"invalid input syntax for type jsonpath\", \"22P02\");\n}\n\n/** Parse a SQL/JSON path subset: `$`, `.key`, `.\"key\"`, `[n]`. */\nexport function parseJsonpath(text: string): PathStep[] {\n const s = text.trim();\n if (s.length === 0 || s[0] !== \"$\") invalidJsonpath();\n let i = 1;\n const steps: PathStep[] = [];\n while (i < s.length) {\n const c = s[i]!;\n if (c === \" \" || c === \"\\t\" || c === \"\\n\" || c === \"\\r\") {\n i++;\n continue;\n }\n if (c === \".\") {\n i++;\n if (s[i] === '\"') {\n i++;\n let name = \"\";\n while (i < s.length && s[i] !== '\"') {\n if (s[i] === \"\\\\\" && i + 1 < s.length) {\n name += s[i + 1]!;\n i += 2;\n } else {\n name += s[i]!;\n i++;\n }\n }\n if (s[i] !== '\"') invalidJsonpath();\n i++;\n steps.push({ kind: \"member\", name });\n continue;\n }\n const m = /^[A-Za-z_][A-Za-z0-9_]*/.exec(s.slice(i));\n if (!m) invalidJsonpath();\n steps.push({ kind: \"member\", name: m[0] });\n i += m[0].length;\n continue;\n }\n if (c === \"[\") {\n const rest = s.slice(i);\n const m = /^\\[\\s*(\\d+)\\s*\\]/.exec(rest);\n if (!m) invalidJsonpath();\n steps.push({ kind: \"index\", index: Number(m[1]) });\n i += m[0].length;\n continue;\n }\n invalidJsonpath();\n }\n return steps;\n}\n\n/**\n * First match of a jsonpath against a jsonb document.\n * Missing path \u2192 SQL NULL (`null` return). JSON null is `{ j: \"null\" }`.\n */\nexport function jsonpathQueryFirst(doc: JsonbValue, pathText: string): JsonbValue | null {\n const steps = parseJsonpath(pathText);\n let cur: JsonbValue | null = doc;\n for (const step of steps) {\n if (cur === null) return null;\n if (step.kind === \"member\") {\n if (cur.j !== \"obj\") return null;\n cur = cur.v.get(step.name) ?? null;\n } else {\n if (cur.j !== \"arr\") return null;\n cur = cur.v[step.index] ?? null;\n }\n }\n return cur;\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 { parseJsonpath } from \"./jsonpath.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 jsonpath: \"jsonpath\",\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 jsonpath: 4072,\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 // PG keeps -0 for float literals (e.g. '-0.0'::float8).\n if (Number(t) === 0 && t.startsWith(\"-\")) return -0;\n return 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 \"jsonpath\":\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 \"jsonpath\":\n parseJsonpath(text);\n return 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\";\nimport type { ColumnarSlab } from \"./columnar-slab.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 /** Frozen columnar storage after snapshot hydrate; `rows` stays empty until materialized. */\n slab: ColumnarSlab | null = null;\n constraints: ConstraintMeta[];\n triggers: TriggerMeta[];\n temp: boolean;\n /** monotonically increasing oid-like id for catalog output */\n readonly oid: number;\n /** >0 while shared with a clone or transaction snapshot. */\n shareCount = 0;\n /** Derived unique/btree index maps; null until built or invalidated. */\n indexStores: Map<string, import(\"../indexes/index.ts\").IndexStore> | null = null;\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 rowCount(): number {\n return this.slab ? this.slab.rowCount : this.rows.length;\n }\n\n rowAt(index: number): Datum[] {\n if (this.slab) return this.slab.rowAt(index);\n return this.rows[index] ?? [];\n }\n\n /** All rows for scans; materializes slab once into `rows` when needed. */\n allRows(): Datum[][] {\n this.materializeSlab();\n return this.rows;\n }\n\n attachSlab(slab: ColumnarSlab): void {\n this.slab = slab;\n this.rows = [];\n }\n\n materializeSlab(): void {\n if (!this.slab) return;\n this.rows = this.slab.materialize();\n this.slab = null;\n this.indexStores = null;\n }\n\n /** Writable row storage; materializes slab if needed. */\n mutableRows(): Datum[][] {\n this.materializeSlab();\n return this.rows;\n }\n\n get frozen(): boolean {\n return this.shareCount > 0;\n }\n\n freeze(): void {\n this.shareCount++;\n }\n\n thaw(): void {\n if (this.shareCount > 0) this.shareCount--;\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 if (this.slab) {\n t.rows = this.slab.materialize().map((r) => r.slice());\n } else {\n t.rows = this.rows.map((r) => r.slice());\n }\n t.constraints = this.constraints.map((c) => ({ ...c }));\n t.triggers = this.triggers.map((tr) => ({ ...tr }));\n t.indexStores = this.indexStores ? new Map([...this.indexStores].map(([k, v]) => [k, v.clone()])) : null;\n return t;\n }\n\n /** Independent writable copy (row tuples copied so ALTER COLUMN is isolated). */\n cloneForWrite(): TableData {\n const t = this.clone();\n t.materializeSlab();\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 shareCount?: 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 shareCount?: number;\n}\n\nexport interface EnumData {\n name: string;\n schema: string;\n labels: string[];\n oid: number;\n shareCount?: 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 shareCount?: 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 jsImpl?: (\n ...args: Array<null | boolean | number | bigint | string | Uint8Array>\n ) => null | boolean | number | bigint | string | Uint8Array;\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 /** Share table/sequence objects; copy maps so CREATE/DROP is isolated. */\n cloneShallow(): SchemaData {\n const s = new SchemaData(this.name, this.oid);\n s.tables = new Map(this.tables);\n s.views = new Map(this.views);\n s.sequences = new Map(this.sequences);\n s.enums = new Map(this.enums);\n s.domains = new Map(this.domains);\n for (const [k, v] of this.functions) s.functions.set(k, v.slice());\n s.indexes = new Map(this.indexes);\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 /** Session currval per sequence; absent entry means currval is undefined. */\n sequenceCurrval = new Map<string, bigint>();\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 (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.sequenceCurrval = new Map(this.sequenceCurrval);\n s.oidCounter = this.oidCounter;\n return s;\n }\n\n /** Share frozen catalog objects; copy maps so CREATE/DROP is isolated. */\n cloneShallow(): 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.cloneShallow());\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.sequenceCurrval = new Map(this.sequenceCurrval);\n s.oidCounter = this.oidCounter;\n return s;\n }\n\n freezeShared(): void {\n for (const schema of this.schemas.values()) {\n for (const table of schema.tables.values()) table.freeze();\n for (const seq of schema.sequences.values()) seq.shareCount = (seq.shareCount ?? 0) + 1;\n for (const view of schema.views.values()) view.shareCount = (view.shareCount ?? 0) + 1;\n for (const en of schema.enums.values()) en.shareCount = (en.shareCount ?? 0) + 1;\n for (const domain of schema.domains.values()) domain.shareCount = (domain.shareCount ?? 0) + 1;\n }\n }\n\n thawShared(): void {\n for (const schema of this.schemas.values()) {\n for (const table of schema.tables.values()) table.thaw();\n for (const seq of schema.sequences.values()) {\n if ((seq.shareCount ?? 0) > 0) seq.shareCount = (seq.shareCount ?? 1) - 1;\n }\n for (const view of schema.views.values()) {\n if ((view.shareCount ?? 0) > 0) view.shareCount = (view.shareCount ?? 1) - 1;\n }\n for (const en of schema.enums.values()) {\n if ((en.shareCount ?? 0) > 0) en.shareCount = (en.shareCount ?? 1) - 1;\n }\n for (const domain of schema.domains.values()) {\n if ((domain.shareCount ?? 0) > 0) domain.shareCount = (domain.shareCount ?? 1) - 1;\n }\n }\n }\n\n ensureWritableTable(table: TableData): TableData {\n if (!table.frozen) return table;\n const schema = this.schemas.get(table.schema);\n const copy = table.cloneForWrite();\n schema?.tables.set(table.name, copy);\n return copy;\n }\n\n ensureWritableSequence(seq: SequenceData): SequenceData {\n if ((seq.shareCount ?? 0) === 0) return seq;\n const schema = this.schemas.get(seq.schema);\n const copy: SequenceData = { ...seq, shareCount: 0 };\n schema?.sequences.set(seq.name, copy);\n return copy;\n }\n\n ensureWritableView(view: ViewData): ViewData {\n if ((view.shareCount ?? 0) === 0) return view;\n const schema = this.schemas.get(view.schema);\n const copy: ViewData = {\n ...view,\n shareCount: 0,\n matRows: view.matRows ? view.matRows.map((r) => r.slice()) : null,\n matColumns: view.matColumns ? view.matColumns.map((c) => ({ ...c })) : null,\n };\n schema?.views.set(view.name, copy);\n return copy;\n }\n\n ensureWritableEnum(en: EnumData): EnumData {\n if ((en.shareCount ?? 0) === 0) return en;\n const schema = this.schemas.get(en.schema);\n const copy: EnumData = { ...en, labels: en.labels.slice(), shareCount: 0 };\n schema?.enums.set(en.name, copy);\n return copy;\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.sequenceCurrval = other.sequenceCurrval;\n this.oidCounter = other.oidCounter;\n }\n\n /** @internal Snapshot codec access to the oid allocator. */\n snapshotOidCounter(): number {\n return this.oidCounter;\n }\n\n /** @internal Snapshot codec restore of the oid allocator. */\n restoreOidCounter(value: number): void {\n this.oidCounter = value;\n }\n}\n", "import { pgError } from \"../errors/error.ts\";\nimport { assert } from \"../runtime/assert.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 with copy-on-write snapshots: BEGIN /\n * SAVEPOINT freeze shared catalog objects and capture a shallow clone; writes\n * copy-on-write via ensureWritableTable. ROLLBACK restores the snapshot.\n */\nexport class TransactionManager {\n private base: Snapshot | null = null;\n private savepoints: Array<{ name: string; snap: Snapshot }> = [];\n private freezeDepth = 0;\n\n constructor(private readonly state: DatabaseState) {}\n\n get inTransaction(): boolean {\n return this.base !== null;\n }\n\n private takeSnapshot(): Snapshot {\n this.state.freezeShared();\n this.freezeDepth++;\n return { state: this.state.cloneShallow(), 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 private thawOnce(): void {\n if (this.freezeDepth > 0) {\n this.state.thawShared();\n this.freezeDepth--;\n }\n }\n\n begin(): void {\n if (this.base !== null) {\n return;\n }\n this.base = this.takeSnapshot();\n this.state.inTransaction = true;\n assert(this.freezeDepth === 1, \"BEGIN freeze depth\");\n }\n\n commit(): void {\n this.base = null;\n this.savepoints = [];\n this.state.inTransaction = false;\n this.state.localSettings.clear();\n while (this.freezeDepth > 0) this.thawOnce();\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 while (this.freezeDepth > 0) this.thawOnce();\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 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 reset(): void {\n this.base = null;\n this.savepoints = [];\n this.state.inTransaction = false;\n this.freezeDepth = 0;\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 { Int8Mode } from \"../runtime/options.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, int8: Int8Mode = \"bigint\"): 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 const n = typeof v === \"bigint\" ? v : BigInt(v as number);\n if (int8 === \"string\") return n.toString();\n if (int8 === \"number\") return Number(n);\n return n;\n }\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 { 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\nfunction expectNumber(a: Datum, t: TypeId): number {\n if (typeof a !== \"number\") throw pgError(\"internal\", `invalid ${t} datum for comparison`, \"XX000\");\n return a;\n}\n\nfunction expectBigint(a: Datum, t: TypeId): bigint {\n if (typeof a !== \"bigint\") throw pgError(\"internal\", `invalid ${t} datum for comparison`, \"XX000\");\n return a;\n}\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 expectNumber(a, t) - expectNumber(b, t);\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 = expectBigint(a, t);\n const bb = expectBigint(b, t);\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 { jsonpathQueryFirst } from \"../types/jsonpath.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 const jsonpathArg = (ctx: EngineCtx, arg: TypedValue): string =>\n arg.t === \"jsonpath\" ? (arg.v as string) : argText(ctx, arg);\n\n m.set(\"jsonb_path_query_first\", (ctx, args) => {\n if (args.length < 2) {\n throw pgError(\n \"undefined_function\",\n `function jsonb_path_query_first(${args.map((a) => a.t).join(\", \")}) does not exist`,\n \"42883\",\n );\n }\n if (args[0]!.v === null || args[1]!.v === null) return tv(\"jsonb\", null);\n const doc = jsonArg(ctx, args[0]!);\n const found = jsonpathQueryFirst(doc, jsonpathArg(ctx, args[1]!));\n if (found === null) return tv(\"jsonb\", null);\n return outJsonb(found);\n });\n\n m.set(\"jsonb_path_exists\", (ctx, args) => {\n if (args.length < 2) {\n throw pgError(\n \"undefined_function\",\n `function jsonb_path_exists(${args.map((a) => a.t).join(\", \")}) does not exist`,\n \"42883\",\n );\n }\n if (args[0]!.v === null || args[1]!.v === null) return tv(\"bool\", null);\n const doc = jsonArg(ctx, args[0]!);\n return tv(\"bool\", jsonpathQueryFirst(doc, jsonpathArg(ctx, args[1]!)) !== null);\n });\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\", 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\nfunction sequenceSessionKey(seq: SequenceData): string {\n return `${seq.schema}\\0${seq.name}`;\n}\n\nfunction markSessionCurrval(ctx: EngineCtx, seq: SequenceData, value: bigint): void {\n ctx.state.sequenceCurrval.set(sequenceSessionKey(seq), value);\n}\n\nfunction sessionCurrvalDefined(ctx: EngineCtx, seq: SequenceData): boolean {\n return ctx.state.sequenceCurrval.has(sequenceSessionKey(seq));\n}\n\nfunction readSessionCurrval(ctx: EngineCtx, seq: SequenceData): bigint {\n return ctx.state.sequenceCurrval.get(sequenceSessionKey(seq))!;\n}\n\nexport function sequenceNextval(ctx: EngineCtx, seq: SequenceData): bigint {\n seq = ctx.state.ensureWritableSequence(seq);\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 markSessionCurrval(ctx, seq, next);\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 (!sessionCurrvalDefined(ctx, seq)) {\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\", readSessionCurrval(ctx, seq));\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 || !sessionCurrvalDefined(ctx, seq)) {\n throw pgError(\"object_not_in_prerequisite_state\", \"lastval is not yet defined in this session\", \"55000\");\n }\n return tv(\"int8\", readSessionCurrval(ctx, seq));\n });\n m.set(\n \"setval\",\n strict(\"int8\", (ctx, args) => {\n const seq = ctx.state.ensureWritableSequence(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 if (isCalled) markSessionCurrval(ctx, seq, value);\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 (t === \"int2\" || t === \"int4\") {\n if (v === null) return tv(t, null);\n const neg = -(v as number);\n return tv(t, t === \"int2\" ? checkInt2(neg) : checkInt4(neg));\n }\n if (t === \"int8\") {\n if (v === null) return tv(t, null);\n return tv(t, checkInt8(-(v as bigint)));\n }\n if (t === \"float4\" || t === \"float8\") {\n if (v === null) return tv(t, null);\n return tv(t, -(v as number));\n }\n if (t === \"numeric\") {\n if (v === null) return tv(t, null);\n return tv(t, numericNeg(v as Numeric));\n }\n if (t === \"interval\") {\n if (v === null) return tv(t, null);\n return tv(t, intervalNeg(v as Interval));\n }\n if (t === \"money\") {\n if (v === null) return tv(t, null);\n return tv(t, -(v as bigint));\n }\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/** WHERE/HAVING/ON/etc. predicates must already be boolean (or unknown); null \u2192 false. */\nexport function evalAsPredicate(ctx: EngineCtx, kind: string, v: TypedValue): boolean {\n return boolArg(ctx, kind, v) === true;\n}\n\n/** Plan-time: validate AND/OR/NOT operands are boolean (PG 42804), including short-circuited branches. */\nexport function checkBoolExprType(ctx: EngineCtx, scope: EvalScope, e: Expr, kind: string): void {\n if (e.type === \"binop\" && e.op === \"and\") {\n boolArg(ctx, \"AND\", evalExpr(ctx, scope, e.left));\n boolArg(ctx, \"AND\", evalExpr(ctx, scope, e.right));\n return;\n }\n if (e.type === \"binop\" && e.op === \"or\") {\n boolArg(ctx, \"OR\", evalExpr(ctx, scope, e.left));\n boolArg(ctx, \"OR\", evalExpr(ctx, scope, e.right));\n return;\n }\n if (e.type === \"unop\" && e.op === \"not\") {\n boolArg(ctx, \"NOT\", evalExpr(ctx, scope, e.operand));\n return;\n }\n if (e.type === \"cast\") {\n checkBoolExprType(ctx, scope, e.expr, kind);\n return;\n }\n if (e.type === \"case\") {\n validateSearchedCaseTree(ctx, scope, e);\n return;\n }\n const v = evalExpr(ctx, scope, e);\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}\n\n/** mimic plan-time typing of a short-circuited operand: PG type-checks every branch */\nfunction checkSkippedBoolArg(ctx: EngineCtx, scope: EvalScope, kind: string, e: Expr): void {\n 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\n/** Plan-time (PG 42804): every searched CASE/WHEN must be boolean before any branch runs. */\nfunction validateSearchedCaseTree(ctx: EngineCtx, scope: EvalScope, e: CaseExpr): void {\n if (e.operand !== null) return;\n for (const { when, then } of e.whens) {\n boolArg(ctx, \"CASE/WHEN\", evalExpr(ctx, scope, when));\n validateCaseSubExpr(ctx, scope, then);\n }\n if (e.elseExpr !== null) validateCaseSubExpr(ctx, scope, e.elseExpr);\n}\n\nfunction validateCaseSubExpr(ctx: EngineCtx, scope: EvalScope, e: Expr): void {\n switch (e.type) {\n case \"case\":\n validateSearchedCaseTree(ctx, scope, e);\n return;\n case \"binop\":\n if (e.op === \"and\") {\n boolArg(ctx, \"AND\", evalExpr(ctx, scope, e.left));\n boolArg(ctx, \"AND\", evalExpr(ctx, scope, e.right));\n } else if (e.op === \"or\") {\n boolArg(ctx, \"OR\", evalExpr(ctx, scope, e.left));\n boolArg(ctx, \"OR\", evalExpr(ctx, scope, e.right));\n }\n validateCaseSubExpr(ctx, scope, e.left);\n validateCaseSubExpr(ctx, scope, e.right);\n return;\n case \"unop\":\n if (e.op === \"not\") {\n boolArg(ctx, \"NOT\", evalExpr(ctx, scope, e.operand));\n }\n validateCaseSubExpr(ctx, scope, e.operand);\n return;\n case \"cast\":\n case \"collate\":\n validateCaseSubExpr(ctx, scope, e.expr);\n return;\n case \"func\":\n for (const arg of e.args) validateCaseSubExpr(ctx, scope, arg);\n return;\n case \"row\":\n for (const item of e.items) validateCaseSubExpr(ctx, scope, item);\n return;\n case \"array_ctor\":\n for (const item of e.items) validateCaseSubExpr(ctx, scope, item);\n return;\n default:\n return;\n }\n}\n\nfunction evalCase(ctx: EngineCtx, scope: EvalScope, e: CaseExpr): TypedValue {\n validateSearchedCaseTree(ctx, scope, e);\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 const w = evalExpr(ctx, scope, when);\n if (boolArg(ctx, \"CASE/WHEN\", w) === 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 }\n\n const user = scope.callUserFunction?.(e.name, args, e);\n if (user !== undefined) return user;\n\n if (bare !== null && hasScalarFunction(bare)) {\n return callScalarFunction(ctx, bare, args);\n }\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", "import { pgError } from \"../errors/error.ts\";\n\n/** Btree / hash index over row indices. Keys are pre-serialized (datumKey tuples). */\nexport class IndexStore {\n readonly name: string;\n readonly unique: boolean;\n private entries = new Map<string, number[]>();\n\n constructor(name: string, unique = false) {\n this.name = name;\n this.unique = unique;\n }\n\n get size(): number {\n return this.entries.size;\n }\n\n checkUnique(key: string, rowIdx?: number): void {\n const existing = this.entries.get(key);\n if (!existing) return;\n for (const i of existing) {\n if (rowIdx === undefined || i !== rowIdx) {\n throw pgError(\"constraint_unique\", `duplicate key value violates unique constraint \"${this.name}\"`, \"23505\");\n }\n }\n }\n\n insert(key: string, rowIdx: number): void {\n if (this.unique) this.checkUnique(key, rowIdx);\n const existing = this.entries.get(key);\n if (!existing) {\n this.entries.set(key, [rowIdx]);\n return;\n }\n if (existing.includes(rowIdx)) return;\n existing.push(rowIdx);\n }\n\n remove(key: string, rowIdx: number): void {\n const existing = this.entries.get(key);\n if (!existing) return;\n const at = existing.indexOf(rowIdx);\n if (at < 0) return;\n existing.splice(at, 1);\n if (existing.length === 0) this.entries.delete(key);\n }\n\n lookup(key: string): readonly number[] {\n return this.entries.get(key) ?? [];\n }\n\n clear(): void {\n this.entries.clear();\n }\n\n clone(): IndexStore {\n const copy = new IndexStore(this.name, this.unique);\n for (const [key, rowids] of this.entries) copy.entries.set(key, [...rowids]);\n return copy;\n }\n}\n", "import { type UniqueSpec, uniqueKeyOf, uniqueSpecsFor } from \"../constraints/enforce.ts\";\nimport type { ExecEnv } from \"../executor/relation.ts\";\nimport type { TableData } from \"../storage/database-state.ts\";\nimport type { Datum } from \"../types/value.ts\";\nimport { IndexStore } from \"./index.ts\";\n\nexport function invalidateTableIndexes(table: TableData): void {\n table.indexStores = null;\n}\n\nfunction ensureIndexStores(env: ExecEnv, table: TableData): Map<string, IndexStore> {\n if (table.indexStores) return table.indexStores;\n const stores = new Map<string, IndexStore>();\n for (const spec of uniqueSpecsFor(env, table)) {\n const store = new IndexStore(spec.name, true);\n for (let i = 0; i < table.rowCount(); i++) {\n const key = uniqueKeyOf(env, table, spec, table.rowAt(i));\n if (key !== null) store.insert(key, i);\n }\n stores.set(spec.name, store);\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) continue;\n stores.set(idx.name, new IndexStore(idx.name, false));\n }\n }\n table.indexStores = stores;\n return stores;\n}\n\nexport function indexStoreFor(env: ExecEnv, table: TableData, spec: UniqueSpec): IndexStore {\n const stores = ensureIndexStores(env, table);\n let store = stores.get(spec.name);\n if (!store) {\n store = new IndexStore(spec.name, true);\n for (let i = 0; i < table.rowCount(); i++) {\n const key = uniqueKeyOf(env, table, spec, table.rowAt(i));\n if (key !== null) store.insert(key, i);\n }\n stores.set(spec.name, store);\n }\n return store;\n}\n\nexport function indexInsertRow(env: ExecEnv, table: TableData, rowIdx: number, row: Datum[]): void {\n for (const spec of uniqueSpecsFor(env, table)) {\n const key = uniqueKeyOf(env, table, spec, row);\n if (key === null) continue;\n indexStoreFor(env, table, spec).insert(key, rowIdx);\n }\n}\n\nexport function indexRemoveRow(env: ExecEnv, table: TableData, rowIdx: number, row: Datum[]): void {\n if (!table.indexStores) return;\n for (const spec of uniqueSpecsFor(env, table)) {\n const key = uniqueKeyOf(env, table, spec, row);\n if (key === null) continue;\n table.indexStores.get(spec.name)?.remove(key, rowIdx);\n }\n}\n\nexport function indexUpdateRow(env: ExecEnv, table: TableData, rowIdx: number, oldRow: Datum[], newRow: Datum[]): void {\n indexRemoveRow(env, table, rowIdx, oldRow);\n indexInsertRow(env, table, rowIdx, newRow);\n}\n\nexport function rebuildTableIndexes(env: ExecEnv, table: TableData): void {\n table.indexStores = null;\n ensureIndexStores(env, table);\n}\n", "import type { Expr, FromItem } from \"../ast/nodes.ts\";\nimport { type UniqueSpec, uniqueKeyOf, uniqueSpecsFor } from \"../constraints/enforce.ts\";\nimport { type ExecEnv, RowScope } from \"../executor/relation.ts\";\nimport { makeEvalScope } from \"../executor/select.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { indexStoreFor } from \"../indexes/maintain.ts\";\nimport type { TableData } from \"../storage/database-state.ts\";\nimport { castTo } from \"../types/cast.ts\";\nimport { datumCompare, datumKey } from \"../types/compare.ts\";\nimport { type Datum, type TypeId, tv } from \"../types/value.ts\";\n\nfunction isRowIndependentExpr(expr: Expr): boolean {\n return expr.type !== \"colref\";\n}\n\nexport interface ConstEquality {\n column: string;\n valueExpr: Expr;\n}\n\nexport function equalityAgainstConst(expr: Expr): ConstEquality | null {\n if (expr.type !== \"binop\" || expr.op !== \"=\") return null;\n if (expr.left.type === \"colref\" && isRowIndependentExpr(expr.right)) {\n const parts = expr.left.parts;\n const column = parts[parts.length - 1]!;\n return { column, valueExpr: expr.right };\n }\n if (expr.right.type === \"colref\" && isRowIndependentExpr(expr.left)) {\n const parts = expr.right.parts;\n const column = parts[parts.length - 1]!;\n return { column, valueExpr: expr.left };\n }\n return null;\n}\n\nexport function conjunctions(expr: Expr): Expr[] {\n if (expr.type === \"binop\" && expr.op === \"and\") {\n return [...conjunctions(expr.left), ...conjunctions(expr.right)];\n }\n return [expr];\n}\n\n/** Single-table PK / unique equality lookup: returns matching rows or null to scan. */\nexport function tryIndexedTableRows(env: ExecEnv, table: TableData, alias: string, where: Expr): Datum[][] | null {\n const parts = conjunctions(where);\n const eqs: ConstEquality[] = [];\n for (const part of parts) {\n const eq = equalityAgainstConst(part);\n if (!eq) return null;\n eqs.push(eq);\n }\n if (eqs.length === 0) return null;\n\n let spec: UniqueSpec | null = null;\n for (const candidate of uniqueSpecsFor(env, table)) {\n if (candidate.keys.length !== eqs.length) continue;\n const names = candidate.columnNames;\n if (eqs.every((eq, i) => names[i] === eq.column)) {\n spec = candidate;\n break;\n }\n }\n if (!spec) return null;\n\n const probeRow: Datum[] = table.columns.map(() => null);\n const scope = new RowScope(\n table.columns.map((c) => ({ name: c.name, type: c.type.id, table: alias })),\n probeRow,\n env.outer,\n new Set([alias]),\n );\n for (let i = 0; i < eqs.length; i++) {\n const k = spec.keys[i]!;\n if (k.expr) return null;\n const colIdx = k.colIdx;\n const v = evalExpr(env.ctx, makeEvalScope(env, scope), eqs[i]!.valueExpr);\n probeRow[colIdx] = castTo(env.ctx, v, table.columns[colIdx]!.type.id, {}).v;\n }\n\n const key = uniqueKeyOf(env, table, spec, probeRow);\n if (key === null) return [];\n const hits = indexStoreFor(env, table, spec).lookup(key);\n return hits.map((i) => table.rowAt(i));\n}\n\nexport function tryIndexedFromItem(env: ExecEnv, item: FromItem, where: Expr | null): Datum[][] | null {\n if (!where || item.type !== \"from_table\") return null;\n const state = env.ctx.state;\n const table = state.findTable(item.name);\n if (!table) return null;\n const alias = item.alias ?? item.name[item.name.length - 1]!;\n table.materializeSlab();\n return tryIndexedTableRows(env, table, alias, where);\n}\n\nexport function joinKeyFromRow(\n row: Datum[],\n colIdxs: number[],\n srcTypes: TypeId[],\n unifiedTypes: TypeId[],\n ctx: import(\"../expressions/context.ts\").EngineCtx,\n): string | null {\n const parts: string[] = [];\n for (let i = 0; i < colIdxs.length; i++) {\n const v = row[colIdxs[i]!] ?? null;\n if (v === null) return null;\n const cast = castTo(ctx, tv(srcTypes[i]!, v), unifiedTypes[i]!, {}).v;\n if (cast === null) return null;\n parts.push(datumKey(unifiedTypes[i]!, cast));\n }\n return parts.join(\"\\u0001\");\n}\n\nexport function rowsMatchEqKeys(\n ctx: import(\"../expressions/context.ts\").EngineCtx,\n left: Datum[],\n right: Datum[],\n leftIdxs: number[],\n rightIdxs: number[],\n leftTypes: TypeId[],\n rightTypes: TypeId[],\n unifiedTypes: TypeId[],\n): boolean {\n for (let k = 0; k < leftIdxs.length; k++) {\n const lv = left[leftIdxs[k]!] ?? null;\n const rv = right[rightIdxs[k]!] ?? null;\n if (lv === null || rv === null) return false;\n const lc = castTo(ctx, tv(leftTypes[k]!, lv), unifiedTypes[k]!, {}).v;\n const rc = castTo(ctx, tv(rightTypes[k]!, rv), unifiedTypes[k]!, {}).v;\n if (lc === null || rc === null) return false;\n if (datumCompare(unifiedTypes[k]!, lc, rc, ctx) !== 0) return false;\n }\n return true;\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 \"jsonpath\",\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 /** Consume tokens until the matching `)` after an opening `(` already eaten. */\n private skipBalancedCloseParen(): void {\n let depth = 1;\n while (depth > 0) {\n const t = this.peek();\n if (t.type === \"eof\") throw pgError(\"syntax\", 'unterminated \"(\" in ALTER TABLE SET', \"42601\");\n if (this.eatPunct(\"(\")) {\n depth++;\n continue;\n }\n if (this.eatPunct(\")\")) {\n depth--;\n continue;\n }\n this.pos++;\n }\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 if (this.eatPunct(\"(\")) {\n this.skipBalancedCloseParen();\n return { kind: \"reloptions\" };\n }\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 if (t.value === \"+\") return operand;\n const raw = operand.raw;\n if (raw.startsWith(\"-\")) return { type: \"number_lit\", raw: raw.slice(1) };\n return { type: \"number_lit\", raw: `-${raw}` };\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", "import type { Expr, SelectStmt, Statement, TypeName } from \"../ast/nodes.ts\";\nimport { pgError, unsupported } from \"../errors/error.ts\";\nimport { tokenize } from \"../lexer/tokenize.ts\";\nimport { parse } from \"../parser/index.ts\";\nimport type { FunctionData } from \"../storage/database-state.ts\";\nimport { castTo } from \"../types/cast.ts\";\nimport { datumEquals } from \"../types/compare.ts\";\nimport { resolveTypeName } from \"../types/resolve.ts\";\nimport type { Datum, TypedValue, TypeId } from \"../types/value.ts\";\nimport { tv } from \"../types/value.ts\";\nimport { type ExecEnv, type Relation, RowScope } from \"./relation.ts\";\nimport { evalPredicate, evalScalar, executeSelectStmt, runStatement } from \"./select.ts\";\n\n/**\n * plpgsql-lite: DECLARE, nested BEGIN/EXCEPTION WHEN others, IF, CASE,\n * assignment, RETURN / RETURN NEXT, PERFORM, FOR-IN-SELECT.\n */\n\nexport type PlStmt =\n | { kind: \"assign\"; target: string[]; expr: Expr }\n | { kind: \"return_new\" }\n | { kind: \"return_old\" }\n | { kind: \"return_expr\"; expr: Expr }\n | { kind: \"return_empty\" }\n | { kind: \"return_next\" }\n | { kind: \"if\"; branches: Array<{ cond: Expr; body: PlStmt[] }>; elseBody: PlStmt[] }\n | {\n kind: \"case\";\n expr: Expr | null;\n branches: Array<{ cond: Expr; body: PlStmt[] }>;\n elseBody: PlStmt[];\n }\n | { kind: \"null\" }\n | { kind: \"raise\"; message: string }\n | { kind: \"perform\"; expr: Expr }\n | { kind: \"block\"; body: PlStmt[]; handler: PlStmt[] | null }\n | { kind: \"for\"; targets: string[]; query: SelectStmt; body: PlStmt[] }\n | { kind: \"sql\"; text: string };\n\nexport interface PlDecl {\n name: string;\n typeName: TypeName;\n init: Expr | null;\n}\n\nexport interface PlProgram {\n decls: PlDecl[];\n body: PlStmt[];\n}\n\ninterface Tok {\n type: string;\n value: string;\n pos: number;\n}\n\nclass PlParser {\n private tokens: Tok[];\n private pos = 0;\n constructor(private readonly src: string) {\n this.tokens = tokenize(src);\n }\n\n private peek(offset = 0): Tok {\n return this.tokens[Math.min(this.pos + offset, this.tokens.length - 1)]!;\n }\n private next(): Tok {\n const t = this.peek();\n if (t.type !== \"eof\") this.pos++;\n return t;\n }\n private atKw(kw: string, offset = 0): boolean {\n const t = this.peek(offset);\n return t.type === \"ident\" && t.value === kw;\n }\n private expectKw(kw: string): void {\n if (!this.atKw(kw)) throw unsupported(`plpgsql: expected \"${kw.toUpperCase()}\" near \"${this.peek().value}\"`);\n this.pos++;\n }\n private expectSemi(): void {\n const t = this.next();\n if (t.type !== \"punct\" || t.value !== \";\") throw unsupported(`plpgsql: expected \";\" near \"${t.value}\"`);\n }\n\n parseProgram(): PlProgram {\n const decls: PlDecl[] = [];\n if (this.atKw(\"declare\")) {\n this.pos++;\n while (!this.atKw(\"begin\") && this.peek().type !== \"eof\") {\n decls.push(this.parseDecl());\n }\n }\n const block = this.parseBlock();\n if (this.peek().type !== \"eof\") throw unsupported(`plpgsql: trailing content near \"${this.peek().value}\"`);\n return { decls, body: [block] };\n }\n\n /** Trigger bodies are a BEGIN block (no DECLARE). */\n parseTriggerBody(): PlStmt[] {\n if (this.atKw(\"declare\")) throw unsupported(\"trigger body: DECLARE section\");\n const block = this.parseBlock();\n if (this.peek().type !== \"eof\") throw unsupported(`trigger body: trailing content near \"${this.peek().value}\"`);\n return block.kind === \"block\" && block.handler === null ? block.body : [block];\n }\n\n private parseDecl(): PlDecl {\n const nameTok = this.next();\n if (nameTok.type !== \"ident\" && nameTok.type !== \"quoted_ident\") {\n throw unsupported(`plpgsql DECLARE near \"${nameTok.value}\"`);\n }\n const name = nameTok.value;\n const typeStart = this.peek().pos;\n while (\n !(this.peek().type === \"punct\" && this.peek().value === \";\") &&\n !(this.peek().type === \"op\" && (this.peek().value === \":=\" || this.peek().value === \"=\")) &&\n this.peek().type !== \"eof\"\n ) {\n this.pos++;\n }\n const typeText = this.src.slice(typeStart, this.peek().pos);\n const typeName = parseTypeNameText(typeText);\n let init: Expr | null = null;\n if (this.peek().type === \"op\" && (this.peek().value === \":=\" || this.peek().value === \"=\")) {\n this.pos++;\n init = this.parseExprUntilSemi();\n } else {\n this.expectSemi();\n }\n return { name, typeName, init };\n }\n\n private parseBlock(): Extract<PlStmt, { kind: \"block\" }> {\n this.expectKw(\"begin\");\n const body = this.parseStmts(new Set([\"end\", \"exception\"]));\n let handler: PlStmt[] | null = null;\n if (this.atKw(\"exception\")) {\n this.pos++;\n this.expectKw(\"when\");\n if (!this.atKw(\"others\")) throw unsupported(`plpgsql EXCEPTION WHEN ${this.peek().value}`);\n this.pos++;\n this.expectKw(\"then\");\n handler = this.parseStmts(new Set([\"end\", \"when\"]));\n while (this.atKw(\"when\")) {\n throw unsupported(\"plpgsql EXCEPTION WHEN (only OTHERS is implemented)\");\n }\n }\n this.expectKw(\"end\");\n if (this.peek().type === \"punct\" && this.peek().value === \";\") this.pos++;\n return { kind: \"block\", body, handler };\n }\n\n private parseStmts(stop: Set<string>): PlStmt[] {\n const out: PlStmt[] = [];\n while (this.peek().type !== \"eof\") {\n if (this.peek().type === \"ident\" && stop.has(this.peek().value)) break;\n out.push(this.parseStmt());\n }\n return out;\n }\n\n private parseStmt(): PlStmt {\n if (this.atKw(\"begin\")) return this.parseBlock();\n if (this.atKw(\"return\")) {\n this.pos++;\n if (this.atKw(\"next\")) {\n this.pos++;\n this.expectSemi();\n return { kind: \"return_next\" };\n }\n if (this.peek().type === \"punct\" && this.peek().value === \";\") {\n this.pos++;\n return { kind: \"return_empty\" };\n }\n if (\n this.peek().type === \"ident\" &&\n (this.peek().value === \"new\" || this.peek().value === \"old\") &&\n this.peek(1).type === \"punct\" &&\n this.peek(1).value === \";\"\n ) {\n const what = this.peek().value === \"new\" ? \"return_new\" : \"return_old\";\n this.pos += 2;\n return { kind: what };\n }\n return { kind: \"return_expr\", expr: this.parseExprUntilSemi() };\n }\n if (this.atKw(\"if\")) {\n this.pos++;\n const branches: Array<{ cond: Expr; body: PlStmt[] }> = [];\n let elseBody: PlStmt[] = [];\n const cond = this.parseExprUntilKw(\"then\");\n branches.push({ cond, body: this.parseStmts(new Set([\"end\", \"elsif\", \"else\"])) });\n while (this.atKw(\"elsif\")) {\n this.pos++;\n const c = this.parseExprUntilKw(\"then\");\n branches.push({ cond: c, body: this.parseStmts(new Set([\"end\", \"elsif\", \"else\"])) });\n }\n if (this.atKw(\"else\")) {\n this.pos++;\n elseBody = this.parseStmts(new Set([\"end\"]));\n }\n this.expectKw(\"end\");\n this.expectKw(\"if\");\n this.expectSemi();\n return { kind: \"if\", branches, elseBody };\n }\n if (this.atKw(\"case\")) {\n this.pos++;\n let expr: Expr | null = null;\n const branches: Array<{ cond: Expr; body: PlStmt[] }> = [];\n let elseBody: PlStmt[] = [];\n if (!this.atKw(\"when\")) {\n expr = this.parseExprUntilKw(\"when\");\n const cond = this.parseExprUntilKw(\"then\");\n branches.push({ cond, body: this.parseStmts(new Set([\"when\", \"else\", \"end\"])) });\n }\n while (this.atKw(\"when\")) {\n this.pos++;\n const cond = this.parseExprUntilKw(\"then\");\n branches.push({ cond, body: this.parseStmts(new Set([\"when\", \"else\", \"end\"])) });\n }\n if (this.atKw(\"else\")) {\n this.pos++;\n elseBody = this.parseStmts(new Set([\"end\"]));\n }\n this.expectKw(\"end\");\n this.expectKw(\"case\");\n this.expectSemi();\n return { kind: \"case\", expr, branches, elseBody };\n }\n if (this.atKw(\"null\")) {\n this.pos++;\n this.expectSemi();\n return { kind: \"null\" };\n }\n if (this.atKw(\"raise\")) {\n this.pos++;\n if (this.peek().type === \"ident\") this.pos++;\n let message = \"\";\n while (!(this.peek().type === \"punct\" && this.peek().value === \";\") && this.peek().type !== \"eof\") {\n const t = this.next();\n if (t.type === \"string\" && message === \"\") message = t.value;\n }\n this.expectSemi();\n return { kind: \"raise\", message: message || \"raised exception\" };\n }\n if (this.atKw(\"perform\")) {\n this.pos++;\n return { kind: \"perform\", expr: this.parseExprUntilSemi() };\n }\n if (this.atKw(\"for\")) {\n this.pos++;\n const targets: string[] = [];\n for (;;) {\n const t = this.next();\n if (t.type !== \"ident\" && t.type !== \"quoted_ident\") throw unsupported(`plpgsql FOR target near \"${t.value}\"`);\n targets.push(t.value);\n if (this.peek().type === \"punct\" && this.peek().value === \",\") {\n this.pos++;\n continue;\n }\n break;\n }\n this.expectKw(\"in\");\n const query = this.parseQueryUntilKw(\"loop\");\n const body = this.parseStmts(new Set([\"end\"]));\n this.expectKw(\"end\");\n this.expectKw(\"loop\");\n this.expectSemi();\n return { kind: \"for\", targets, query, body };\n }\n if (this.atKw(\"update\") || this.atKw(\"insert\") || this.atKw(\"delete\")) {\n return { kind: \"sql\", text: this.parseSqlTextUntilSemi() };\n }\n const target: string[] = [];\n const first = this.next();\n if (first.type !== \"ident\" && first.type !== \"quoted_ident\") {\n throw unsupported(`plpgsql statement near \"${first.value}\"`);\n }\n target.push(first.value);\n while (this.peek().type === \"punct\" && this.peek().value === \".\") {\n this.pos++;\n const f = this.next();\n target.push(f.value);\n }\n const opTok = this.next();\n if (!(opTok.type === \"op\" && (opTok.value === \":=\" || opTok.value === \"=\"))) {\n throw unsupported(`plpgsql: expected assignment near \"${opTok.value}\"`);\n }\n return { kind: \"assign\", target, expr: this.parseExprUntilSemi() };\n }\n\n private parseSqlTextUntilSemi(): string {\n const start = this.peek().pos;\n let depth = 0;\n for (;;) {\n const t = this.peek();\n if (t.type === \"eof\") throw unsupported(\"plpgsql: unterminated statement\");\n if (t.type === \"punct\" && t.value === \"(\") depth++;\n if (t.type === \"punct\" && t.value === \")\") depth--;\n if (t.type === \"punct\" && t.value === \";\" && depth === 0) {\n const text = this.src.slice(start, t.pos).trim();\n this.pos++;\n return text;\n }\n this.pos++;\n }\n }\n\n private parseExprUntilSemi(): Expr {\n const start = this.peek().pos;\n let depth = 0;\n for (;;) {\n const t = this.peek();\n if (t.type === \"eof\") throw unsupported(\"plpgsql: unterminated statement\");\n if (t.type === \"punct\" && t.value === \"(\") depth++;\n if (t.type === \"punct\" && t.value === \")\") depth--;\n if (t.type === \"punct\" && t.value === \";\" && depth === 0) {\n const text = this.src.slice(start, t.pos);\n this.pos++;\n return parseSqlExpr(text);\n }\n this.pos++;\n }\n }\n\n private parseExprUntilKw(kw: string): Expr {\n const start = this.peek().pos;\n let depth = 0;\n let caseDepth = 0;\n for (;;) {\n const t = this.peek();\n if (t.type === \"eof\") throw unsupported(`plpgsql: expected \"${kw.toUpperCase()}\"`);\n if (t.type === \"punct\" && t.value === \"(\") depth++;\n if (t.type === \"punct\" && t.value === \")\") depth--;\n if (t.type === \"ident\" && t.value === \"case\" && depth === 0) caseDepth++;\n if (t.type === \"ident\" && t.value === \"end\" && depth === 0 && caseDepth > 0) caseDepth--;\n if (t.type === \"ident\" && t.value === kw && depth === 0 && caseDepth === 0) {\n const text = this.src.slice(start, t.pos);\n this.pos++;\n return parseSqlExpr(text);\n }\n this.pos++;\n }\n }\n\n private parseQueryUntilKw(kw: string): SelectStmt {\n const start = this.peek().pos;\n let depth = 0;\n for (;;) {\n const t = this.peek();\n if (t.type === \"eof\") throw unsupported(`plpgsql: expected \"${kw.toUpperCase()}\"`);\n if (t.type === \"punct\" && t.value === \"(\") depth++;\n if (t.type === \"punct\" && t.value === \")\") depth--;\n if (t.type === \"ident\" && t.value === kw && depth === 0) {\n const text = this.src.slice(start, t.pos).trim();\n this.pos++;\n const stmts = parse(text);\n const q = stmts[0];\n if (q?.type !== \"select\") throw unsupported(`plpgsql FOR query: expected SELECT`);\n return q;\n }\n this.pos++;\n }\n }\n}\n\nfunction parseSqlExpr(text: string): Expr {\n const stmts = parse(`SELECT ${text}`);\n const sel = stmts[0] as SelectStmt;\n const body = sel.body as { targets?: Array<{ expr: Expr }> };\n const target = body.targets?.[0];\n if (!target) throw unsupported(`plpgsql expression \"${text}\"`);\n return target.expr;\n}\n\nfunction parseTypeNameText(text: string): TypeName {\n const stmts = parse(`SELECT NULL::${text.trim()}`);\n const sel = stmts[0] as SelectStmt;\n const body = sel.body as { targets?: Array<{ expr: Expr }> };\n const expr = body.targets?.[0]?.expr;\n if (expr?.type !== \"cast\") throw unsupported(`plpgsql type \"${text}\"`);\n return expr.target;\n}\n\nconst programCache = new Map<string, PlProgram>();\nconst triggerCache = new Map<string, PlStmt[]>();\n\nexport function compilePlpgsql(raw: string): PlProgram {\n let cached = programCache.get(raw);\n if (cached === undefined) {\n cached = new PlParser(raw).parseProgram();\n programCache.set(raw, cached);\n }\n return cached;\n}\n\nexport function compileTriggerBody(raw: string): PlStmt[] {\n let cached = triggerCache.get(raw);\n if (cached === undefined) {\n cached = new PlParser(raw).parseTriggerBody();\n triggerCache.set(raw, cached);\n }\n return cached;\n}\n\nclass PlReturn {\n constructor(\n readonly mode: \"value\" | \"empty\" | \"next\",\n readonly value: TypedValue | null,\n ) {}\n}\n\nclass PlVars {\n readonly names: string[] = [];\n readonly types: TypeId[] = [];\n readonly values: Datum[] = [];\n\n declare(name: string, type: TypeId, value: Datum): void {\n const i = this.names.indexOf(name);\n if (i === -1) {\n this.names.push(name);\n this.types.push(type);\n this.values.push(value);\n } else {\n this.types[i] = type;\n this.values[i] = value;\n }\n }\n\n set(name: string, v: TypedValue, env: ExecEnv): void {\n const i = this.names.indexOf(name);\n if (i === -1) throw pgError(\"undefined_column\", `\"${name}\" is not a known variable`, \"42703\");\n const casted = v.v === null ? tv(this.types[i]!, null) : castTo(env.ctx, v, this.types[i]!, { assignment: true });\n this.values[i] = casted.v;\n }\n\n get(name: string): TypedValue | undefined {\n const i = this.names.indexOf(name);\n if (i === -1) return undefined;\n return tv(this.types[i]!, this.values[i] ?? null);\n }\n\n scope(): RowScope {\n const cols = this.names.map((n, i) => ({ name: n, type: this.types[i]!, table: null as string | null }));\n return new RowScope(cols, this.values, null);\n }\n}\n\nfunction runStmts(\n env: ExecEnv,\n stmts: PlStmt[],\n vars: PlVars,\n emit: Datum[][] | null,\n tableNames: string[] | null,\n): void {\n for (const stmt of stmts) runStmt(env, stmt, vars, emit, tableNames);\n}\n\nfunction runStmt(env: ExecEnv, stmt: PlStmt, vars: PlVars, emit: Datum[][] | null, tableNames: string[] | null): void {\n const scope = () => vars.scope();\n switch (stmt.kind) {\n case \"assign\": {\n if (stmt.target.length !== 1) throw unsupported(`plpgsql assignment to \"${stmt.target.join(\".\")}\"`);\n const v = evalScalar(env, scope(), stmt.expr);\n vars.set(stmt.target[0]!, v, env);\n return;\n }\n case \"return_new\":\n case \"return_old\":\n throw unsupported(`plpgsql RETURN ${stmt.kind === \"return_new\" ? \"NEW\" : \"OLD\"} in a non-trigger function`);\n case \"return_expr\":\n throw new PlReturn(\"value\", evalScalar(env, scope(), stmt.expr));\n case \"return_empty\":\n throw new PlReturn(\"empty\", null);\n case \"return_next\": {\n if (emit === null) throw pgError(\"syntax\", \"RETURN NEXT cannot be used in a non-SETOF function\", \"42601\");\n if (tableNames) emit.push(tableNames.map((n) => vars.get(n)?.v ?? null));\n else emit.push([vars.values[0] ?? null]);\n return;\n }\n case \"if\": {\n for (const b of stmt.branches) {\n if (evalPredicate(env, scope(), b.cond)) {\n runStmts(env, b.body, vars, emit, tableNames);\n return;\n }\n }\n runStmts(env, stmt.elseBody, vars, emit, tableNames);\n return;\n }\n case \"case\": {\n if (stmt.expr === null) {\n for (const b of stmt.branches) {\n if (evalPredicate(env, scope(), b.cond)) {\n runStmts(env, b.body, vars, emit, tableNames);\n return;\n }\n }\n runStmts(env, stmt.elseBody, vars, emit, tableNames);\n return;\n }\n const head = evalScalar(env, scope(), stmt.expr);\n for (const b of stmt.branches) {\n const when = evalScalar(env, scope(), b.cond);\n if (head.v !== null && when.v !== null) {\n const rhs = when.t === head.t ? when : castTo(env.ctx, when, head.t, {});\n if (datumEquals(head.t, head.v, rhs.v)) {\n runStmts(env, b.body, vars, emit, tableNames);\n return;\n }\n }\n }\n runStmts(env, stmt.elseBody, vars, emit, tableNames);\n return;\n }\n case \"null\":\n return;\n case \"raise\":\n throw pgError(\"raise_exception\", stmt.message, \"P0001\");\n case \"perform\":\n evalScalar(env, scope(), stmt.expr);\n return;\n case \"block\": {\n try {\n runStmts(env, stmt.body, vars, emit, tableNames);\n } catch (e) {\n if (e instanceof PlReturn) throw e;\n if (stmt.handler === null) throw e;\n runStmts(env, stmt.handler, vars, emit, tableNames);\n }\n return;\n }\n case \"for\": {\n const forEnv: ExecEnv = { ctx: env.ctx, params: env.params, ctes: env.ctes, outer: vars.scope() };\n const rel = executeSelectStmt(forEnv, stmt.query);\n for (const row of rel.rows) {\n for (let i = 0; i < stmt.targets.length; i++) {\n const colT = rel.columns[i]?.type ?? \"text\";\n vars.set(stmt.targets[i]!, tv(colT, row[i] ?? null), env);\n }\n runStmts(env, stmt.body, vars, emit, tableNames);\n }\n return;\n }\n case \"sql\": {\n const stmts = parse(stmt.text);\n if (stmts.length !== 1) throw unsupported(`plpgsql SQL statement: ${stmt.text}`);\n runStatement(env, stmts[0]! as Statement);\n return;\n }\n }\n}\n\nfunction bindArgs(env: ExecEnv, fn: FunctionData, args: TypedValue[]): TypedValue[] {\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 return bound;\n}\n\nfunction initVars(env: ExecEnv, fn: FunctionData, bound: TypedValue[], program: PlProgram): PlVars {\n const vars = new PlVars();\n for (let i = 0; i < fn.argNames.length; i++) {\n const n = fn.argNames[i];\n if (n == null) continue;\n vars.declare(n, fn.argTypes[i]!, bound[i]?.v ?? null);\n }\n if (fn.returnsTable) {\n for (const c of fn.returnsTable) vars.declare(c.name, c.type, null);\n }\n const seed = (): ExecEnv => ({ ctx: env.ctx, params: bound, ctes: new Map(), outer: vars.scope() });\n for (const d of program.decls) {\n const id = resolveTypeName(env.ctx.state, d.typeName).column.id;\n let val: Datum = null;\n if (d.init) {\n const v = evalScalar(seed(), vars.scope(), d.init);\n val = v.v === null ? null : castTo(env.ctx, v, id, { assignment: true }).v;\n }\n vars.declare(d.name, id, val);\n }\n return vars;\n}\n\nfunction plpgsqlEnv(env: ExecEnv, bound: TypedValue[], vars: PlVars): ExecEnv {\n return { ctx: env.ctx, params: bound, ctes: new Map(), outer: vars.scope() };\n}\n\nexport function callPlpgsqlScalar(env: ExecEnv, fn: FunctionData, args: TypedValue[]): TypedValue {\n const retT = fn.returns ?? \"text\";\n if (fn.strict && args.some((a) => a.v === null)) return tv(retT, null);\n const raw = fn.rawBody;\n if (raw === null) throw pgError(\"unsupported\", `function ${fn.name} has no executable body`);\n const program = compilePlpgsql(raw);\n const bound = bindArgs(env, fn, args);\n const vars = initVars(env, fn, bound, program);\n const fnEnv = plpgsqlEnv(env, bound, vars);\n try {\n runStmts(fnEnv, program.body, vars, null, null);\n } catch (e) {\n if (e instanceof PlReturn) {\n if (e.mode === \"next\") {\n throw pgError(\"feature_not_supported\", `set-returning function ${fn.name} called in scalar context`, \"0A000\");\n }\n if (e.mode === \"empty\" || e.value === null || e.value.v === null) return tv(retT, null);\n return castTo(env.ctx, e.value, retT, {});\n }\n throw e;\n }\n return tv(retT, null);\n}\n\nexport function callPlpgsqlSet(env: ExecEnv, fn: FunctionData, args: TypedValue[]): Relation {\n const cols = fn.returnsTable\n ? fn.returnsTable.map((c) => ({ name: c.name, type: c.type, table: null as string | null }))\n : [{ name: fn.name, type: fn.returns ?? \"text\", table: null as string | null }];\n if (fn.strict && args.some((a) => a.v === null)) return { columns: cols, rows: [] };\n const raw = fn.rawBody;\n if (raw === null) throw pgError(\"unsupported\", `function ${fn.name} has no executable body`);\n const program = compilePlpgsql(raw);\n const bound = bindArgs(env, fn, args);\n const vars = initVars(env, fn, bound, program);\n const fnEnv = plpgsqlEnv(env, bound, vars);\n const emit: Datum[][] = [];\n const tableNames = fn.returnsTable?.map((c) => c.name) ?? null;\n try {\n runStmts(fnEnv, program.body, vars, emit, tableNames);\n } catch (e) {\n if (!(e instanceof PlReturn)) throw e;\n }\n if (fn.returnsTable) {\n const rows = emit.map((r) =>\n fn.returnsTable!.map((c, i) => {\n const raw = r[i] ?? null;\n if (raw === null) return null;\n const src = vars.get(c.name);\n return castTo(env.ctx, tv(src?.t ?? c.type, raw), c.type, {}).v;\n }),\n );\n return { columns: cols, rows };\n }\n return { columns: cols, rows: emit };\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 if (!call.filter && (name === \"sum\" || name === \"count\") && isRunningRowsFrame(frame, spec)) {\n computeRunningAgg(ctx, call, name, rowIdxs, evalAt, results);\n return;\n }\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 isRunningRowsFrame(frame: FrameSpec, spec: WindowSpec): boolean {\n if (frame.exclusion) return false;\n if (frame.mode !== \"rows\") return false;\n if (frame.start.kind !== \"unbounded_preceding\") return false;\n const end =\n frame.end ??\n (spec.orderBy.length > 0 ? { kind: \"current_row\" as const } : { kind: \"unbounded_following\" as const });\n return end.kind === \"current_row\";\n}\n\nfunction computeRunningAgg(\n ctx: EngineCtx,\n call: FuncCall,\n name: string,\n rowIdxs: number[],\n evalAt: RowEval,\n results: TypedValue[],\n): void {\n const argTypes: TypeId[] = call.args.map((_, ai) => {\n for (const rowIdx of rowIdxs) {\n const v = evalAt(rowIdx, call.args[ai]!);\n if (v.t !== UNKNOWN) return v.t;\n }\n return UNKNOWN;\n });\n const acc = createAggregate(ctx, name, argTypes);\n for (const rowIdx of rowIdxs) {\n const argRows = call.star ? [] : call.args.map((a) => evalAt(rowIdx, a));\n acc.step(argRows);\n results[rowIdx] = acc.result();\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 { bindValueToTyped, datumToJs } from \"../api/bind.ts\";\nimport 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 { checkBoolExprType, evalAsPredicate, evalExpr } from \"../expressions/eval.ts\";\nimport { createAggregate, isAggregateName, isOrderedSetAggregate, unifyAggType } from \"../functions/aggregates.ts\";\nimport { getSrfFunctions, isSrfName } from \"../functions/srf.ts\";\nimport { conjunctions, joinKeyFromRow, rowsMatchEqKeys, tryIndexedFromItem } from \"../planner/access.ts\";\nimport { catalogRelation } from \"../schema/catalog.ts\";\nimport type { FunctionData } from \"../storage/database-state.ts\";\nimport { canImplicitCast, castTo, unifyTypes } from \"../types/cast.ts\";\nimport { datumCompare, datumKey } from \"../types/compare.ts\";\nimport { resolveTypeName } from \"../types/resolve.ts\";\nimport { type Datum, type TypedValue, type TypeId, tv, UNKNOWN } from \"../types/value.ts\";\nimport { callPlpgsqlScalar, callPlpgsqlSet } from \"./plpgsql.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 const map = extras?.aggMap;\n if (!map) return undefined;\n const direct = map.get(node);\n if (direct !== undefined) return direct;\n for (const [call, value] of map) {\n if (exprEq(call, node)) return value;\n }\n return undefined;\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 = resolveUserFunctionForArgs(env, name, args);\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(\n env: ExecEnv,\n scope: RowScope | null,\n e: Expr,\n extras?: ScopeExtras,\n kind = \"WHERE\",\n): boolean {\n const v = evalScalar(env, scope, e, extras);\n return evalAsPredicate(env.ctx, kind, v);\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\n/** Prefer a UDF whose declared types accept the actual args via implicit cast. */\nexport function resolveUserFunctionForArgs(env: ExecEnv, name: string[], args: TypedValue[]): 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 (args.length < required || args.length > fn.argTypes.length) continue;\n let ok = true;\n for (let i = 0; i < args.length; i++) {\n if (!canImplicitCast(args[i]!.t, fn.argTypes[i]!)) {\n ok = false;\n break;\n }\n }\n if (ok) 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 if (fn.language === \"plpgsql\") {\n return callPlpgsqlScalar(env, fn, args);\n }\n if (fn.language === \"js\") {\n if (!fn.jsImpl) {\n throw pgError(\"undefined_function\", `JavaScript function ${fn.name} is not registered`, \"42883\");\n }\n if (fn.strict && args.some((a) => a.v === null)) return tv(retT, null);\n const jsArgs = args.map((a) => datumToJs(a.t, a.v, env.ctx));\n const out = fn.jsImpl(...jsArgs);\n if (out === null || out === undefined) return tv(retT, null);\n return castTo(env.ctx, bindValueToTyped(out, 0), retT, {});\n }\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 if (fn.language === \"plpgsql\") {\n return callPlpgsqlSet(env, fn, args);\n }\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 table.materializeSlab();\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 userFn = resolveUserFunctionForArgs(env, call.name, args);\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 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 // 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 extractOnEquijoinKeys(\n on: Expr,\n left: Relation,\n right: Relation,\n): { leftIdxs: number[]; rightIdxs: number[] } | null {\n const leftIdxs: number[] = [];\n const rightIdxs: number[] = [];\n for (const part of conjunctions(on)) {\n if (part.type !== \"binop\" || part.op !== \"=\") continue;\n const ls = joinSideOf(part.left, left, right);\n const rs = joinSideOf(part.right, left, right);\n let leftExpr: Expr;\n let rightExpr: Expr;\n if (ls === \"left\" && rs === \"right\") {\n leftExpr = part.left;\n rightExpr = part.right;\n } else if (ls === \"right\" && rs === \"left\") {\n leftExpr = part.right;\n rightExpr = part.left;\n } else {\n continue;\n }\n if (leftExpr.type !== \"colref\" || rightExpr.type !== \"colref\") continue;\n const li = resolveColIdx(left.columns, leftExpr.parts);\n const ri = resolveColIdx(right.columns, rightExpr.parts);\n if (li === null || ri === null) continue;\n leftIdxs.push(li);\n rightIdxs.push(ri);\n }\n if (leftIdxs.length === 0) return null;\n return { leftIdxs, rightIdxs };\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 equijoinOverride: { leftIdxs: number[]; rightIdxs: number[] } | null = null,\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 let hashLeftIdxs: number[] = [];\n let hashRightIdxs: number[] = [];\n let hashKeyTypes: TypeId[] = [];\n\n if (equijoinOverride) {\n hashLeftIdxs = equijoinOverride.leftIdxs;\n hashRightIdxs = equijoinOverride.rightIdxs;\n hashKeyTypes = hashLeftIdxs.map((li, k) => {\n const lt = left.columns[li]!.type;\n const rt = right.columns[hashRightIdxs[k]!]!.type;\n const t = unifyTypes(lt, rt);\n if (t === null) {\n throw pgError(\"datatype_mismatch\", `JOIN types ${lt} and ${rt} cannot be matched`, \"42804\");\n }\n return t;\n });\n } else if (using && using.length > 0) {\n hashLeftIdxs = usingLeftIdx;\n hashRightIdxs = usingRightIdx;\n hashKeyTypes = columns.slice(0, mergedCount).map((c) => c.type);\n } else if (on !== null && kind !== \"cross\") {\n const extracted = extractOnEquijoinKeys(on, left, right);\n if (extracted) {\n hashLeftIdxs = extracted.leftIdxs;\n hashRightIdxs = extracted.rightIdxs;\n hashKeyTypes = hashLeftIdxs.map((li, k) => {\n const lt = left.columns[li]!.type;\n const rt = right.columns[extracted.rightIdxs[k]!]!.type;\n const t = unifyTypes(lt, rt);\n if (t === null) {\n throw pgError(\"datatype_mismatch\", `JOIN types ${lt} and ${rt} cannot be matched`, \"42804\");\n }\n return t;\n });\n }\n }\n\n const matchRows = (lrow: Datum[], rrow: Datum[]): boolean => {\n if (using && using.length > 0) {\n const leftTypes = hashLeftIdxs.map((i) => left.columns[i]!.type);\n const rightTypes = hashRightIdxs.map((i) => right.columns[i]!.type);\n return rowsMatchEqKeys(ctx, lrow, rrow, hashLeftIdxs, hashRightIdxs, leftTypes, rightTypes, hashKeyTypes);\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, undefined, \"ON\");\n };\n\n const useHashJoin = kind !== \"cross\" && hashLeftIdxs.length > 0;\n\n if (useHashJoin) {\n const leftTypes = hashLeftIdxs.map((i) => left.columns[i]!.type);\n const rightTypes = hashRightIdxs.map((i) => right.columns[i]!.type);\n const buckets = new Map<string, number[]>();\n for (let ri = 0; ri < right.rows.length; ri++) {\n const key = joinKeyFromRow(right.rows[ri]!, hashRightIdxs, rightTypes, hashKeyTypes, ctx);\n if (key === null) continue;\n const bucket = buckets.get(key);\n if (bucket) bucket.push(ri);\n else buckets.set(key, [ri]);\n }\n for (const lrow of left.rows) {\n let matched = false;\n const key = joinKeyFromRow(lrow, hashLeftIdxs, leftTypes, hashKeyTypes, ctx);\n const candidates = key === null ? [] : (buckets.get(key) ?? []);\n for (const ri of candidates) {\n const rrow = right.rows[ri]!;\n if (!matchRows(lrow, rrow)) continue;\n matched = true;\n rightMatched[ri] = true;\n emit(lrow, rrow);\n }\n if (!matched && (kind === \"left\" || kind === \"full\")) {\n emit(lrow, null);\n }\n }\n } else {\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 }\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[], where: Expr | null = null): 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 rangeVars = new Set([...accVars, ...src.rangeVars]);\n const eq = where ? extractOnEquijoinKeys(where, accRel, src.rel) : null;\n if (eq) {\n acc = {\n rel: combineJoin(env, \"inner\", accRel, src.rel, null, null, null, rangeVars, eq),\n rangeVars,\n };\n } else {\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 };\n }\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 exprHasAggregateCall(e: Expr | null | undefined): boolean {\n const collector: AggCollector = { aggs: [], windows: [], groupings: [] };\n collectCalls(e, collector);\n return collector.aggs.length > 0;\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\nfunction groupingErrorForColref(parts: string[], columns: Relation[\"columns\"]): never {\n const idx = resolveColIdx(columns, parts);\n let label: string;\n if (idx !== null) {\n const c = columns[idx]!;\n label = c.table ? `${c.table}.${c.name}` : c.name;\n } else {\n label = parts.join(\".\");\n }\n throw pgError(\n \"grouping_error\",\n `column \"${label}\" must appear in the GROUP BY clause or be used in an aggregate function`,\n \"42803\",\n );\n}\n\nfunction isGroupingExpr(e: Expr, groupDefs: GroupExprDef[], columns: Relation[\"columns\"]): boolean {\n return groupDefs.some((d) => groupDefMatches(d, e, columns));\n}\n\n/** reject bare source columns outside GROUP BY / aggregates before execution */\nfunction validateGroupedExpr(\n e: Expr | null | undefined,\n groupDefs: GroupExprDef[],\n columns: Relation[\"columns\"],\n inAgg: boolean,\n): void {\n if (!e || typeof e !== \"object\") return;\n if (e.type === \"subquery_expr\") return;\n\n if (!inAgg && isGroupingExpr(e, groupDefs, columns)) return;\n\n switch (e.type) {\n case \"null_lit\":\n case \"string_lit\":\n case \"number_lit\":\n case \"bool_lit\":\n case \"bitstring_lit\":\n case \"param\":\n case \"default_expr\":\n return;\n case \"colref\":\n if (!inAgg) {\n if (resolveColIdx(columns, e.parts) === null) return;\n groupingErrorForColref(e.parts, columns);\n }\n return;\n case \"grouping_func\":\n for (const a of e.args) validateGroupedExpr(a, groupDefs, columns, inAgg);\n return;\n case \"func\": {\n const name = e.name[e.name.length - 1]!;\n if (e.over) {\n for (const a of e.args) validateGroupedExpr(a, groupDefs, columns, false);\n if (e.filter) validateGroupedExpr(e.filter, groupDefs, columns, false);\n for (const p of e.over.partitionBy ?? []) validateGroupedExpr(p, groupDefs, columns, false);\n for (const ob of e.over.orderBy ?? []) validateGroupedExpr(ob.expr, groupDefs, columns, false);\n return;\n }\n if (isAggregateName(name)) {\n for (const a of e.args) validateGroupedExpr(a, groupDefs, columns, true);\n if (e.filter) validateGroupedExpr(e.filter, groupDefs, columns, true);\n for (const ob of e.orderBy ?? []) validateGroupedExpr(ob.expr, groupDefs, columns, true);\n return;\n }\n for (const a of e.args) validateGroupedExpr(a, groupDefs, columns, inAgg);\n if (e.filter) validateGroupedExpr(e.filter, groupDefs, columns, inAgg);\n for (const ob of e.orderBy ?? []) validateGroupedExpr(ob.expr, groupDefs, columns, inAgg);\n return;\n }\n case \"binop\":\n validateGroupedExpr(e.left, groupDefs, columns, inAgg);\n validateGroupedExpr(e.right, groupDefs, columns, inAgg);\n return;\n case \"unop\":\n validateGroupedExpr(e.operand, groupDefs, columns, inAgg);\n return;\n case \"cast\":\n validateGroupedExpr(e.expr, groupDefs, columns, inAgg);\n return;\n case \"collate\":\n validateGroupedExpr(e.expr, groupDefs, columns, inAgg);\n return;\n case \"case\": {\n if (e.operand) validateGroupedExpr(e.operand, groupDefs, columns, inAgg);\n for (const w of e.whens) {\n validateGroupedExpr(w.when, groupDefs, columns, inAgg);\n validateGroupedExpr(w.then, groupDefs, columns, inAgg);\n }\n if (e.elseExpr) validateGroupedExpr(e.elseExpr, groupDefs, columns, inAgg);\n return;\n }\n case \"in_expr\":\n validateGroupedExpr(e.left, groupDefs, columns, inAgg);\n if (e.list) {\n for (const r of e.list) validateGroupedExpr(r, groupDefs, columns, inAgg);\n }\n return;\n case \"between\":\n validateGroupedExpr(e.left, groupDefs, columns, inAgg);\n validateGroupedExpr(e.low, groupDefs, columns, inAgg);\n validateGroupedExpr(e.high, groupDefs, columns, inAgg);\n return;\n case \"is_null\":\n case \"bool_test\":\n validateGroupedExpr(e.expr, groupDefs, columns, inAgg);\n return;\n case \"is_distinct\":\n validateGroupedExpr(e.left, groupDefs, columns, inAgg);\n validateGroupedExpr(e.right, groupDefs, columns, inAgg);\n return;\n case \"row\":\n for (const el of e.items) validateGroupedExpr(el, groupDefs, columns, inAgg);\n return;\n case \"array_ctor\":\n for (const el of e.items) validateGroupedExpr(el, groupDefs, columns, inAgg);\n return;\n case \"array_query\":\n return;\n case \"subscript\":\n validateGroupedExpr(e.base, groupDefs, columns, inAgg);\n for (const idx of e.indexes) {\n if (idx.lower) validateGroupedExpr(idx.lower, groupDefs, columns, inAgg);\n if (idx.upper) validateGroupedExpr(idx.upper, groupDefs, columns, inAgg);\n }\n return;\n case \"field_select\":\n validateGroupedExpr(e.base, groupDefs, columns, inAgg);\n return;\n case \"at_time_zone\":\n validateGroupedExpr(e.expr, groupDefs, columns, inAgg);\n validateGroupedExpr(e.zone, groupDefs, columns, inAgg);\n return;\n case \"like\":\n validateGroupedExpr(e.left, groupDefs, columns, inAgg);\n validateGroupedExpr(e.pattern, groupDefs, columns, inAgg);\n if (e.escape) validateGroupedExpr(e.escape, groupDefs, columns, inAgg);\n return;\n case \"position\":\n validateGroupedExpr(e.needle, groupDefs, columns, inAgg);\n validateGroupedExpr(e.haystack, groupDefs, columns, inAgg);\n return;\n case \"substring_sql\":\n validateGroupedExpr(e.source, groupDefs, columns, inAgg);\n if (e.from) validateGroupedExpr(e.from, groupDefs, columns, inAgg);\n if (e.forLen) validateGroupedExpr(e.forLen, groupDefs, columns, inAgg);\n if (e.similar) validateGroupedExpr(e.similar, groupDefs, columns, inAgg);\n if (e.escape) validateGroupedExpr(e.escape, groupDefs, columns, inAgg);\n return;\n case \"overlay\":\n validateGroupedExpr(e.source, groupDefs, columns, inAgg);\n validateGroupedExpr(e.placing, groupDefs, columns, inAgg);\n validateGroupedExpr(e.from, groupDefs, columns, inAgg);\n if (e.forLen) validateGroupedExpr(e.forLen, groupDefs, columns, inAgg);\n return;\n case \"trim\":\n validateGroupedExpr(e.source, groupDefs, columns, inAgg);\n if (e.chars) validateGroupedExpr(e.chars, groupDefs, columns, inAgg);\n return;\n case \"extract\":\n validateGroupedExpr(e.source, groupDefs, columns, inAgg);\n return;\n default:\n return;\n }\n}\n\nfunction validateGroupedTargets(\n targets: SelectTarget[],\n groupDefs: GroupExprDef[],\n columns: Relation[\"columns\"],\n): void {\n for (const t of targets) {\n if (t.expr.type === \"star\") {\n if (t.expr.table) {\n const label = t.expr.table[t.expr.table.length - 1]!;\n for (const c of columns) {\n if (c.table === label) {\n const parts: string[] = c.table ? [c.table, c.name] : [c.name];\n validateGroupedExpr({ type: \"colref\", parts }, groupDefs, columns, false);\n }\n }\n } else {\n for (const c of columns) {\n if (!c.hidden) {\n const parts: string[] = c.table ? [c.table, c.name] : [c.name];\n validateGroupedExpr({ type: \"colref\", parts }, groupDefs, columns, false);\n }\n }\n }\n continue;\n }\n validateGroupedExpr(t.expr, groupDefs, columns, false);\n }\n}\n\nfunction validateGroupedQuery(\n core: SelectCore,\n groupDefs: GroupExprDef[],\n columns: Relation[\"columns\"],\n orderBy: OrderByItem[] = [],\n): void {\n validateGroupedTargets(core.targets, groupDefs, columns);\n if (core.having) validateGroupedExpr(core.having, groupDefs, columns, false);\n for (const ob of orderBy) validateGroupedExpr(ob.expr, groupDefs, columns, false);\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[], probeScope: RowScope | null): 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 if (effective.length === 0 && probeScope !== null && argCount > 0) {\n const scope = makeEvalScope(env, probeScope);\n for (let i = 0; i < argCount; i++) {\n if (argTypes[i] !== UNKNOWN) continue;\n if (call.star) continue;\n const expr = orderedSet && i >= call.args.length ? orderBy[0]!.expr : (call.args[i] ?? orderBy[0]!.expr);\n if (!expr) continue;\n const v = evalExpr(ctx, scope, expr);\n argTypes[i] = v.t === UNKNOWN ? \"text\" : v.t;\n }\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\n/** Plan-time boolean typing for WHERE/HAVING (PostgreSQL rejects non-bool before scanning). */\nfunction checkPredicateType(\n env: ExecEnv,\n columns: Relation[\"columns\"],\n rangeVars: Set<string>,\n e: Expr,\n kind: string,\n extras?: ScopeExtras,\n): void {\n const probe = new RowScope(\n columns,\n columns.map(() => null),\n env.outer,\n rangeVars,\n );\n checkBoolExprType(env.ctx, makeEvalScope(env, probe, extras), e, kind);\n}\n\nexport function executeCore(\n env0: ExecEnv,\n core: SelectCore,\n orderBy: OrderByItem[],\n opts?: { hasLimit?: boolean },\n): Relation {\n const env = env0;\n const ctx = env.ctx;\n\n // 1. FROM\n const source = buildFrom(env, core.from, core.where);\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 checkPredicateType(env, srcCols, rangeVars, core.where, \"WHERE\");\n if (core.from.length === 1) {\n const indexed = tryIndexedFromItem(env, core.from[0]!, core.where);\n if (indexed !== null) {\n srcRows = indexed;\n } else {\n const where = core.where;\n srcRows = srcRows.filter((row) => evalPredicate(env, rowScope(row), where));\n }\n } else {\n const where = core.where;\n srcRows = srcRows.filter((row) => evalPredicate(env, rowScope(row), where));\n }\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, repScope));\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 if (core.having) {\n // Empty grouped input: aggregate HAVING is vacuous (PG returns 0 rows); literals still type-check.\n if (ctxs.length > 0) {\n checkPredicateType(env, srcCols, rangeVars, core.having, \"HAVING\", extrasFor(ctxs[0]!));\n } else if (!exprHasAggregateCall(core.having)) {\n checkPredicateType(env, srcCols, rangeVars, core.having, \"HAVING\");\n }\n }\n\n if (grouped) {\n validateGroupedQuery(core, groupDefs, srcCols, orderBy);\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), \"HAVING\"));\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 // Plain DISTINCT (no LIMIT): PG sorts by ORDER BY keys plus remaining select-list columns, then Unique.\n if (core.distinct && !core.distinct.on && sortSpecs.length > 0 && !opts?.hasLimit) {\n const used = new Set(sortSpecs.map((s) => s.colIdx));\n for (let i = 0; i < visibleCount; i++) {\n if (projItems[i]!.hidden || used.has(i)) continue;\n sortSpecs.push({ colIdx: i, dir: \"asc\", nullsFirst: false });\n used.add(i);\n }\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 const probeScope = new RowScope(\n srcCols,\n srcCols.map(() => null),\n env.outer,\n rangeVars,\n );\n const probeExtras = {\n aggMap: new Map(),\n windowAt: () => tv(UNKNOWN, null),\n };\n const probeType = (expr: Expr): TypeId => {\n if (expr.type === \"cast\") {\n return resolveTypeName(ctx.state, expr.target).column.id;\n }\n if (expr.type === \"func\") {\n const name = expr.name[expr.name.length - 1]!;\n if (isAggregateName(name)) {\n const argTypes: TypeId[] = expr.args.map((a) => probeType(a));\n return createAggregate(ctx, name, argTypes).result().t;\n }\n }\n return evalScalar(env, probeScope, expr, probeExtras).t;\n };\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 const t = probeType(p.expr!);\n outColumns[k]!.type = t === UNKNOWN ? \"text\" : t;\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, { hasLimit: stmt.limit !== null });\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 { indexStoreFor } from \"../indexes/maintain.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\nexport function 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 indexStoreFor(env, table, spec).checkUnique(key, selfIdx);\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 const hits = indexStoreFor(env, table, spec).lookup(key);\n return hits.length > 0 ? hits[0]! : 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 let found = false;\n for (let i = 0; i < refTable.rowCount(); i++) {\n const r = refTable.rowAt(i);\n const key = refIdxs\n .map((ri, j) => {\n const v = r[ri] ?? null;\n return v === null ? \"\\u0000N\" : datumKey(keyTypes[j]!, v);\n })\n .join(\"\\u0001\");\n if (key === wanted) {\n found = true;\n break;\n }\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 { indexInsertRow, indexUpdateRow, rebuildTableIndexes } from \"../indexes/maintain.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\n/** Roll back trigger/constraint side effects when a DML statement fails under autocommit. */\nfunction withStatementRollback<T>(env: ExecEnv, fn: () => T): T {\n if (env.ctx.state.inTransaction) return fn();\n const state = env.ctx.state;\n state.freezeShared();\n const snap = state.cloneShallow();\n const prngSnap = state.prng.getState();\n try {\n return fn();\n } catch (e) {\n state.restoreFrom(snap);\n state.prng.setState(prngSnap);\n throw e;\n } finally {\n state.thawShared();\n }\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 state.ensureWritableTable(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 rows = table.mutableRows();\n const existing = 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 rows[existingIdx] = updated;\n indexUpdateRow(env, table, existingIdx, existing, 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 rows = table.mutableRows();\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 return withStatementRollback(env, () => {\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(rows[conflictIdx]!);\n fireRowTriggers(env, table, \"after\", \"update\", null, rows[conflictIdx]!);\n }\n continue;\n }\n }\n\n checkNotNull(env, table, newRow);\n checkChecks(env, table, newRow);\n checkUnique(env, table, newRow, rows.length);\n checkForeignKeys(env, table, newRow);\n rows.push(newRow);\n indexInsertRow(env, table, rows.length - 1, newRow);\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// ---------------------------------------------------------------------------\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 rows = table.mutableRows();\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 < rows.length; ri++) {\n const oldRow = 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 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 rows[ri] = oldRow;\n throw err;\n }\n indexUpdateRow(env, table, ri, oldRow, finalRow);\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 rows = table.mutableRows();\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 < rows.length; ri++) {\n const row = 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\", 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 = rows[ri]!;\n handleReferencedDelete(env, table, row, 0);\n 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 if (deletedRows.length > 0) rebuildTableIndexes(env, table);\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.rowCount(); i++) {\n const k = rowKeyFor(rt, rt.rowAt(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 const child = env.ctx.state.ensureWritableTable(ref.table);\n const childRows = child.mutableRows();\n switch (action) {\n case \"cascade\": {\n for (let k = idxs.length - 1; k >= 0; k--) {\n const childRow = childRows[idxs[k]!]!;\n handleReferencedDelete(env, child, childRow, depth + 1);\n childRows.splice(idxs[k]!, 1);\n }\n break;\n }\n case \"set_null\": {\n for (const i of idxs) {\n const newRow = childRows[i]!.slice();\n for (const c of con.columns) {\n newRow[child.columnIndex(c)] = null;\n }\n childRows[i] = newRow;\n checkNotNull(env, child, newRow);\n checkChecks(env, child, newRow);\n }\n break;\n }\n case \"set_default\": {\n for (const i of idxs) {\n const newRow = childRows[i]!.slice();\n for (const c of con.columns) {\n const ci = child.columnIndex(c);\n newRow[ci] = columnDefault(env, child, child.columns[ci]!);\n }\n childRows[i] = newRow;\n checkNotNull(env, child, newRow);\n checkChecks(env, child, newRow);\n checkForeignKeys(env, child, 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 const child = env.ctx.state.ensureWritableTable(ref.table);\n const childRows = child.mutableRows();\n switch (action) {\n case \"cascade\": {\n for (const i of idxs) {\n const newRow = childRows[i]!.slice();\n for (let c = 0; c < con.columns.length; c++) {\n const localIdx = child.columnIndex(con.columns[c]!);\n const refIdx = table.columnIndex(con.refColumns[c]!);\n newRow[localIdx] = newRows[r]![refIdx] ?? null;\n }\n childRows[i] = newRow;\n checkChecks(env, child, newRow);\n }\n break;\n }\n case \"set_null\": {\n for (const i of idxs) {\n const newRow = childRows[i]!.slice();\n for (const c of con.columns) newRow[child.columnIndex(c)] = null;\n childRows[i] = newRow;\n checkNotNull(env, child, newRow);\n }\n break;\n }\n case \"set_default\": {\n for (const i of idxs) {\n const newRow = childRows[i]!.slice();\n for (const c of con.columns) {\n const ci = child.columnIndex(c);\n newRow[ci] = columnDefault(env, child, child.columns[ci]!);\n }\n childRows[i] = newRow;\n checkForeignKeys(env, child, 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 = Array.from({ length: table.rowCount() }, (_, i) => idxs.map((j) => table.rowAt(i)[j] ?? 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", "/** 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/** How `int8` columns surface in query row objects. Default `\"bigint\"`. */\nexport type Int8Mode = \"bigint\" | \"number\" | \"string\";\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 * How `int8` / `bigint` columns surface in query row objects.\n * Default `\"bigint\"` matches PostgreSQL's JS-unsafe 64-bit integers.\n * `\"number\"` uses IEEE number (unsafe beyond `Number.MAX_SAFE_INTEGER`).\n * `\"string\"` is JSON-safe.\n */\n int8?: Int8Mode;\n}\n\n/** Default {@link DatabaseOptions.seed} when constructing a {@link Database}. */\nexport const DEFAULT_DATABASE_SEED = 1;\n", "import { PostgresError } from \"../errors/error.ts\";\nimport {\n type Clock,\n type DatabaseOptions,\n DEFAULT_DATABASE_SEED,\n type Int8Mode,\n OsEntropy,\n Prng,\n type RandomMode,\n resolveClock,\n} from \"../runtime/index.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\nimport { createAdoptedDatabase, type Database, requireCodec } from \"./database.ts\";\n\nconst bytesCache = new WeakMap<Uint8Array, Snapshot>();\n\ninterface SnapshotInit {\n state: DatabaseState;\n prngState: bigint;\n nowMs: number;\n seed: number | bigint;\n randomMode: RandomMode;\n systemClock: boolean;\n int8Mode: Int8Mode;\n bytes?: Uint8Array | null;\n}\n\n/**\n * Frozen in-memory database template. {@link open} is a copy-on-write fork.\n * Encoded PGMM bytes are produced lazily via {@link encode}.\n */\nexport class Snapshot {\n /** @internal */\n readonly state: DatabaseState;\n /** @internal */\n readonly prngState: bigint;\n /** @internal */\n readonly nowMs: number;\n /** @internal */\n readonly seed: number | bigint;\n /** @internal */\n readonly randomMode: RandomMode;\n /** @internal */\n readonly systemClock: boolean;\n /** @internal */\n readonly int8Mode: Int8Mode;\n private cachedBytes: Uint8Array | null;\n\n /** @internal */\n constructor(init: SnapshotInit) {\n this.state = init.state;\n this.prngState = init.prngState;\n this.nowMs = init.nowMs;\n this.seed = init.seed;\n this.randomMode = init.randomMode;\n this.systemClock = init.systemClock;\n this.int8Mode = init.int8Mode;\n this.cachedBytes = init.bytes ?? null;\n }\n\n /** Encoded PGMM blob. Computed once; never mutates a buffer passed to {@link decode}. */\n encode(): Uint8Array {\n if (this.cachedBytes) return this.cachedBytes;\n const { encodeDatabaseState } = requireCodec();\n this.cachedBytes = encodeDatabaseState(this.state, {\n prngState: this.prngState,\n nowMs: this.nowMs,\n });\n return this.cachedBytes;\n }\n\n /**\n * Copy-on-write database from this frozen template. Does not re-encode or re-decode.\n */\n open(options: DatabaseOptions = {}): Database {\n return openSnapshot(this, options);\n }\n\n /**\n * Decode `bytes` once and freeze the result. The same `Uint8Array` object\n * returns the same {@link Snapshot} (WeakMap), so later {@link open} calls\n * are copy-on-write forks after the first hydrate.\n */\n static decode(bytes: Uint8Array): Snapshot {\n const hit = bytesCache.get(bytes);\n if (hit) return hit;\n const { decodeDatabaseState } = requireCodec();\n const prng = new Prng(DEFAULT_DATABASE_SEED);\n const decoded = decodeDatabaseState(bytes, prng, () => new Date(0));\n decoded.state.freezeShared();\n const runtime = decoded.runtime;\n if (!runtime) {\n throw new PostgresError(\"snapshot_format\", \"invalid or truncated postgres-mem snapshot\", \"XX000\");\n }\n const snap = new Snapshot({\n state: decoded.state,\n prngState: runtime.prngState,\n nowMs: runtime.nowMs,\n seed: DEFAULT_DATABASE_SEED,\n randomMode: \"deterministic\",\n systemClock: false,\n int8Mode: \"bigint\",\n bytes,\n });\n bytesCache.set(bytes, snap);\n return snap;\n }\n}\n\n/** @internal Capture live engine state without encoding. */\nexport function captureSnapshot(\n state: DatabaseState,\n prng: Prng,\n now: Clock,\n seed: number | bigint,\n randomMode: RandomMode,\n systemClock: boolean,\n int8Mode: Int8Mode,\n): Snapshot {\n state.freezeShared();\n return new Snapshot({\n state: state.cloneShallow(),\n prngState: prng.getState(),\n nowMs: now().getTime(),\n seed,\n randomMode,\n systemClock,\n int8Mode,\n });\n}\n\n/** @internal */\nexport function openSnapshot(snapshot: Snapshot, options: DatabaseOptions = {}): Database {\n const seed = options.seed ?? snapshot.seed;\n const randomMode = options.random ?? snapshot.randomMode;\n const systemClock = options.now === \"system\" || (options.now === undefined && snapshot.systemClock);\n const int8Mode = options.int8 ?? snapshot.int8Mode;\n const prng = randomMode === \"os\" ? new OsEntropy() : new Prng(seed);\n if (randomMode !== \"os\") prng.setState(snapshot.prngState);\n let now = resolveClock(systemClock ? \"system\" : options.now);\n if (!systemClock) {\n const ms = snapshot.nowMs;\n now = () => new Date(ms);\n }\n const state = snapshot.state.cloneShallow();\n state.prng = prng;\n state.clock = now;\n return createAdoptedDatabase({\n state,\n prng,\n now,\n seed,\n randomMode,\n systemClock,\n int8Mode,\n });\n}\n", "import type { Relation, RelColumn } from \"../executor/relation.ts\";\nimport type { EngineCtx } from \"../expressions/context.ts\";\nimport { getAggregateFactories } from \"../functions/aggregates.ts\";\nimport { getScalarFunctions } from \"../functions/scalar.ts\";\nimport { getSrfFunctions } from \"../functions/srf.ts\";\nimport { WINDOW_FUNCTION_NAMES } from \"../functions/window.ts\";\nimport type { DatabaseState, SequenceData, TableData } from \"../storage/database-state.ts\";\nimport {\n type Datum,\n isArrayType,\n isEnumType,\n TYPE_OIDS,\n type TypeId,\n typeDisplayName,\n typeOid,\n} from \"../types/value.ts\";\nimport { setCatalogBuilder } from \"./catalog.ts\";\n\n/**\n * On-demand materialization of pg_catalog / information_schema relations from\n * DatabaseState. Only user objects are listed plus enough builtin rows\n * (pg_type, pg_proc names) for common introspection queries; contents beyond\n * that are documented divergences.\n */\n\ntype ColSpec = readonly [name: string, type: TypeId];\n\nfunction rel(specs: readonly ColSpec[], rows: Datum[][], table: string): Relation {\n const columns: RelColumn[] = specs.map(([name, type]) => ({ name, type, table }));\n return { columns, rows };\n}\n\nconst OWNER = \"postgres\";\n\nfunction* allTables(state: DatabaseState): Generator<TableData> {\n for (const schema of state.schemas.values()) {\n for (const t of schema.tables.values()) yield t;\n }\n}\n\nfunction* allSequences(state: DatabaseState): Generator<SequenceData> {\n for (const schema of state.schemas.values()) {\n for (const s of schema.sequences.values()) yield s;\n }\n}\n\n// stable pseudo-oids for builtin namespaces\nconst NS_PG_CATALOG = 11;\nconst NS_INFORMATION_SCHEMA = 13212;\n\nfunction namespaceOid(state: DatabaseState, name: string): number {\n if (name === \"pg_catalog\") return NS_PG_CATALOG;\n if (name === \"information_schema\") return NS_INFORMATION_SCHEMA;\n return state.schemas.get(name)?.oid ?? 0;\n}\n\nfunction attTypmod(mod: { a?: number; b?: number } | null, type: TypeId): number {\n if (!mod || mod.a === undefined) return -1;\n if (type === \"numeric\") return ((mod.a << 16) | (mod.b ?? 0)) + 4;\n if (type === \"varchar\" || type === \"bpchar\") return mod.a + 4;\n return mod.a;\n}\n\nfunction enumOid(ctx: EngineCtx, t: TypeId): number {\n if (!isEnumType(t)) return typeOid(t);\n const e = ctx.state.findEnumByKey(t.slice(5));\n return e ? e.oid : 0;\n}\n\n// --- pg_catalog builders ---------------------------------------------------\n\nfunction pgNamespace(state: DatabaseState): Relation {\n const rows: Datum[][] = [\n [NS_PG_CATALOG, \"pg_catalog\", 10, null],\n [NS_INFORMATION_SCHEMA, \"information_schema\", 10, null],\n ];\n for (const s of state.schemas.values()) rows.push([s.oid, s.name, 10, null]);\n return rel(\n [\n [\"oid\", \"oid\"],\n [\"nspname\", \"name\"],\n [\"nspowner\", \"oid\"],\n [\"nspacl\", \"text[]\"],\n ],\n rows,\n \"pg_namespace\",\n );\n}\n\nfunction pgClass(ctx: EngineCtx): Relation {\n const state = ctx.state;\n const rows: Datum[][] = [];\n const push = (\n oid: number,\n name: string,\n schema: string,\n kind: string,\n natts: number,\n tuples: number,\n hasindex: boolean,\n populated: boolean,\n temp: boolean,\n ) => {\n rows.push([\n oid,\n name,\n namespaceOid(state, schema),\n 0,\n 10,\n kind === \"i\" ? 403 : kind === \"S\" || kind === \"v\" ? 0 : 2,\n oid,\n 0,\n 0,\n tuples,\n 0,\n 0,\n hasindex,\n false,\n temp ? \"t\" : \"p\",\n kind,\n natts,\n 0,\n false,\n false,\n false,\n false,\n false,\n populated,\n kind === \"r\" ? \"d\" : \"n\",\n false,\n 0,\n null,\n null,\n null,\n ]);\n };\n for (const schemaData of state.schemas.values()) {\n for (const t of schemaData.tables.values()) {\n const hasIndex =\n t.constraints.some((c) => c.kind === \"primary_key\" || c.kind === \"unique\") ||\n [...schemaData.indexes.values()].some((i) => i.table === t.name);\n push(t.oid, t.name, t.schema, \"r\", t.columns.length, t.rowCount(), hasIndex, true, t.temp);\n }\n for (const v of schemaData.views.values()) {\n push(\n v.oid,\n v.name,\n v.schema,\n v.materialized ? \"m\" : \"v\",\n v.columns?.length ?? 0,\n v.matRows?.length ?? 0,\n false,\n !v.materialized || v.matRows !== null,\n v.temp,\n );\n }\n for (const s of schemaData.sequences.values()) push(s.oid, s.name, s.schema, \"S\", 3, 1, false, true, s.temp);\n for (const i of schemaData.indexes.values()) {\n push(\n state.schemas.get(i.schema)?.tables.get(i.table)?.oid ?? 0,\n i.name,\n i.schema,\n \"i\",\n i.columns.length,\n 0,\n false,\n true,\n false,\n );\n }\n }\n return rel(\n [\n [\"oid\", \"oid\"],\n [\"relname\", \"name\"],\n [\"relnamespace\", \"oid\"],\n [\"reltype\", \"oid\"],\n [\"relowner\", \"oid\"],\n [\"relam\", \"oid\"],\n [\"relfilenode\", \"oid\"],\n [\"reltablespace\", \"oid\"],\n [\"relpages\", \"int4\"],\n [\"reltuples\", \"float4\"],\n [\"relallvisible\", \"int4\"],\n [\"reltoastrelid\", \"oid\"],\n [\"relhasindex\", \"bool\"],\n [\"relisshared\", \"bool\"],\n [\"relpersistence\", \"bpchar\"],\n [\"relkind\", \"bpchar\"],\n [\"relnatts\", \"int2\"],\n [\"relchecks\", \"int2\"],\n [\"relhasrules\", \"bool\"],\n [\"relhastriggers\", \"bool\"],\n [\"relhassubclass\", \"bool\"],\n [\"relrowsecurity\", \"bool\"],\n [\"relforcerowsecurity\", \"bool\"],\n [\"relispopulated\", \"bool\"],\n [\"relreplident\", \"bpchar\"],\n [\"relispartition\", \"bool\"],\n [\"relrewrite\", \"oid\"],\n [\"relacl\", \"text[]\"],\n [\"reloptions\", \"text[]\"],\n [\"relpartbound\", \"text\"],\n ],\n rows,\n \"pg_class\",\n );\n}\n\nfunction pgAttribute(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n for (const t of allTables(ctx.state)) {\n t.columns.forEach((c, i) => {\n rows.push([\n t.oid,\n c.name,\n enumOid(ctx, c.type.id),\n i + 1,\n attTypmod(c.type.mod, c.type.id),\n -1,\n c.notNull,\n c.defaultExpr !== null || c.identity !== null,\n false,\n c.identity ? (c.identity.always ? \"a\" : \"d\") : \"\",\n c.generated ? \"s\" : \"\",\n isArrayType(c.type.id) ? 1 : 0,\n ]);\n });\n }\n return rel(\n [\n [\"attrelid\", \"oid\"],\n [\"attname\", \"name\"],\n [\"atttypid\", \"oid\"],\n [\"attnum\", \"int2\"],\n [\"atttypmod\", \"int4\"],\n [\"attlen\", \"int2\"],\n [\"attnotnull\", \"bool\"],\n [\"atthasdef\", \"bool\"],\n [\"attisdropped\", \"bool\"],\n [\"attidentity\", \"bpchar\"],\n [\"attgenerated\", \"bpchar\"],\n [\"attndims\", \"int2\"],\n ],\n rows,\n \"pg_attribute\",\n );\n}\n\nfunction pgType(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n for (const [name, oid] of Object.entries(TYPE_OIDS)) {\n const isArr = name.startsWith(\"_\");\n rows.push([\n oid,\n name,\n NS_PG_CATALOG,\n \"b\",\n isArr ? \"A\" : \"U\",\n isArr ? (TYPE_OIDS[name.slice(1)] ?? 0) : 0,\n isArr ? 0 : (TYPE_OIDS[`_${name}`] ?? 0),\n 0,\n 0,\n -1,\n ]);\n }\n for (const schema of ctx.state.schemas.values()) {\n for (const e of schema.enums.values()) {\n rows.push([e.oid, e.name, namespaceOid(ctx.state, e.schema), \"e\", \"E\", 0, 0, 0, 0, 4]);\n }\n for (const d of schema.domains.values()) {\n rows.push([d.oid, d.name, namespaceOid(ctx.state, d.schema), \"d\", \"S\", 0, 0, typeOid(d.baseType.id), 0, -1]);\n }\n }\n return rel(\n [\n [\"oid\", \"oid\"],\n [\"typname\", \"name\"],\n [\"typnamespace\", \"oid\"],\n [\"typtype\", \"bpchar\"],\n [\"typcategory\", \"bpchar\"],\n [\"typelem\", \"oid\"],\n [\"typarray\", \"oid\"],\n [\"typbasetype\", \"oid\"],\n [\"typrelid\", \"oid\"],\n [\"typlen\", \"int2\"],\n ],\n rows,\n \"pg_type\",\n );\n}\n\nfunction pgProc(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n let oid = 1000;\n const seen = new Set<string>();\n const push = (name: string, ns: number, kind: string, retset: boolean, nargs: number, realOid?: number) => {\n rows.push([realOid ?? oid++, name, ns, kind, retset, nargs]);\n };\n for (const name of getScalarFunctions().keys()) {\n if (!seen.has(name)) {\n seen.add(name);\n push(name, NS_PG_CATALOG, \"f\", false, -1);\n }\n }\n for (const name of Object.keys(getAggregateFactories())) {\n if (!seen.has(`agg:${name}`)) {\n seen.add(`agg:${name}`);\n push(name, NS_PG_CATALOG, \"a\", false, -1);\n }\n }\n for (const name of WINDOW_FUNCTION_NAMES) push(name, NS_PG_CATALOG, \"w\", false, -1);\n for (const name of getSrfFunctions().keys()) push(name, NS_PG_CATALOG, \"f\", true, -1);\n for (const schema of ctx.state.schemas.values()) {\n for (const fns of schema.functions.values()) {\n for (const f of fns) {\n push(f.name, namespaceOid(ctx.state, f.schema), \"f\", f.returnsSet, f.argTypes.length, f.oid);\n }\n }\n }\n return rel(\n [\n [\"oid\", \"oid\"],\n [\"proname\", \"name\"],\n [\"pronamespace\", \"oid\"],\n [\"prokind\", \"bpchar\"],\n [\"proretset\", \"bool\"],\n [\"pronargs\", \"int2\"],\n ],\n rows,\n \"pg_proc\",\n );\n}\n\nfunction pgEnum(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n let oid = 20000;\n for (const schema of ctx.state.schemas.values()) {\n for (const e of schema.enums.values()) {\n e.labels.forEach((label, i) => {\n rows.push([oid++, e.oid, i + 1, label]);\n });\n }\n }\n return rel(\n [\n [\"oid\", \"oid\"],\n [\"enumtypid\", \"oid\"],\n [\"enumsortorder\", \"float4\"],\n [\"enumlabel\", \"name\"],\n ],\n rows,\n \"pg_enum\",\n );\n}\n\nfunction pgConstraint(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n let oid = 30000;\n for (const t of allTables(ctx.state)) {\n for (const c of t.constraints) {\n const contype = c.kind === \"primary_key\" ? \"p\" : c.kind === \"unique\" ? \"u\" : c.kind === \"check\" ? \"c\" : \"f\";\n const refTable =\n c.kind === \"foreign_key\" ? ctx.state.schemas.get(c.refSchema)?.tables.get(c.refTable) : undefined;\n rows.push([oid++, c.name, namespaceOid(ctx.state, t.schema), contype, false, false, t.oid, refTable?.oid ?? 0]);\n }\n for (const col of t.columns) {\n if (col.notNull) {\n rows.push([\n oid++,\n `${t.name}_${col.name}_not_null`,\n namespaceOid(ctx.state, t.schema),\n \"n\",\n false,\n false,\n t.oid,\n 0,\n ]);\n }\n }\n }\n return rel(\n [\n [\"oid\", \"oid\"],\n [\"conname\", \"name\"],\n [\"connamespace\", \"oid\"],\n [\"contype\", \"bpchar\"],\n [\"condeferrable\", \"bool\"],\n [\"condeferred\", \"bool\"],\n [\"conrelid\", \"oid\"],\n [\"confrelid\", \"oid\"],\n ],\n rows,\n \"pg_constraint\",\n );\n}\n\nfunction pgIndex(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n for (const schema of ctx.state.schemas.values()) {\n for (const i of schema.indexes.values()) {\n const table = schema.tables.get(i.table);\n const isPrimary =\n i.isConstraint && table?.constraints.some((c) => c.kind === \"primary_key\" && c.name === i.name) === true;\n rows.push([table?.oid ?? 0, table?.oid ?? 0, i.columns.length, i.unique, isPrimary, i.where !== null]);\n }\n }\n return rel(\n [\n [\"indexrelid\", \"oid\"],\n [\"indrelid\", \"oid\"],\n [\"indnatts\", \"int2\"],\n [\"indisunique\", \"bool\"],\n [\"indisprimary\", \"bool\"],\n [\"indpred\", \"bool\"],\n ],\n rows,\n \"pg_index\",\n );\n}\n\nfunction pgSequence(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n for (const s of allSequences(ctx.state)) {\n rows.push([s.oid, typeOid(s.dataType), s.startValue, s.increment, s.maxValue, s.minValue, s.cache, s.cycle]);\n }\n return rel(\n [\n [\"seqrelid\", \"oid\"],\n [\"seqtypid\", \"oid\"],\n [\"seqstart\", \"int8\"],\n [\"seqincrement\", \"int8\"],\n [\"seqmax\", \"int8\"],\n [\"seqmin\", \"int8\"],\n [\"seqcache\", \"int8\"],\n [\"seqcycle\", \"bool\"],\n ],\n rows,\n \"pg_sequence\",\n );\n}\n\nfunction pgSequencesView(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n for (const s of allSequences(ctx.state)) {\n rows.push([\n s.schema,\n s.name,\n OWNER,\n typeDisplayName(s.dataType),\n s.startValue,\n s.minValue,\n s.maxValue,\n s.increment,\n s.cycle,\n s.cache,\n s.isCalled ? s.lastValue : null,\n ]);\n }\n return rel(\n [\n [\"schemaname\", \"name\"],\n [\"sequencename\", \"name\"],\n [\"sequenceowner\", \"name\"],\n [\"data_type\", \"text\"],\n [\"start_value\", \"int8\"],\n [\"min_value\", \"int8\"],\n [\"max_value\", \"int8\"],\n [\"increment_by\", \"int8\"],\n [\"cycle\", \"bool\"],\n [\"cache_size\", \"int8\"],\n [\"last_value\", \"int8\"],\n ],\n rows,\n \"pg_sequences\",\n );\n}\n\nfunction pgTables(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n for (const t of allTables(ctx.state)) {\n const hasIndexes =\n t.constraints.some((c) => c.kind === \"primary_key\" || c.kind === \"unique\") ||\n [...(ctx.state.schemas.get(t.schema)?.indexes.values() ?? [])].some((i) => i.table === t.name);\n rows.push([t.schema, t.name, OWNER, null, hasIndexes, false, t.triggers.length > 0, false]);\n }\n return rel(\n [\n [\"schemaname\", \"name\"],\n [\"tablename\", \"name\"],\n [\"tableowner\", \"name\"],\n [\"tablespace\", \"name\"],\n [\"hasindexes\", \"bool\"],\n [\"hasrules\", \"bool\"],\n [\"hastriggers\", \"bool\"],\n [\"rowsecurity\", \"bool\"],\n ],\n rows,\n \"pg_tables\",\n );\n}\n\nfunction pgViews(ctx: EngineCtx, materialized: boolean): Relation {\n const rows: Datum[][] = [];\n for (const schema of ctx.state.schemas.values()) {\n for (const v of schema.views.values()) {\n if (v.materialized !== materialized) continue;\n if (materialized) rows.push([v.schema, v.name, OWNER, null, v.matRows !== null, null]);\n else rows.push([v.schema, v.name, OWNER, null]);\n }\n }\n if (materialized) {\n return rel(\n [\n [\"schemaname\", \"name\"],\n [\"matviewname\", \"name\"],\n [\"matviewowner\", \"name\"],\n [\"tablespace\", \"name\"],\n [\"ispopulated\", \"bool\"],\n [\"definition\", \"text\"],\n ],\n rows,\n \"pg_matviews\",\n );\n }\n return rel(\n [\n [\"schemaname\", \"name\"],\n [\"viewname\", \"name\"],\n [\"viewowner\", \"name\"],\n [\"definition\", \"text\"],\n ],\n rows,\n \"pg_views\",\n );\n}\n\nfunction pgIndexesView(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n for (const schema of ctx.state.schemas.values()) {\n for (const i of schema.indexes.values()) {\n rows.push([i.schema, i.table, i.name, null, null]);\n }\n }\n return rel(\n [\n [\"schemaname\", \"name\"],\n [\"tablename\", \"name\"],\n [\"indexname\", \"name\"],\n [\"tablespace\", \"name\"],\n [\"indexdef\", \"text\"],\n ],\n rows,\n \"pg_indexes\",\n );\n}\n\nfunction pgSettings(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n const keys = new Set([...ctx.state.settings.keys(), ...ctx.state.localSettings.keys()]);\n for (const name of [...keys].sort()) {\n rows.push([name, ctx.state.getSetting(name) ?? null]);\n }\n return rel(\n [\n [\"name\", \"text\"],\n [\"setting\", \"text\"],\n ],\n rows,\n \"pg_settings\",\n );\n}\n\nfunction pgDatabase(): Relation {\n return rel(\n [\n [\"oid\", \"oid\"],\n [\"datname\", \"name\"],\n [\"encoding\", \"int4\"],\n [\"datistemplate\", \"bool\"],\n [\"datallowconn\", \"bool\"],\n ],\n [[5, \"postgres\", 6, false, true]],\n \"pg_database\",\n );\n}\n\nfunction pgRoles(): Relation {\n return rel(\n [\n [\"oid\", \"oid\"],\n [\"rolname\", \"name\"],\n [\"rolsuper\", \"bool\"],\n [\"rolcanlogin\", \"bool\"],\n ],\n [[10, OWNER, true, true]],\n \"pg_roles\",\n );\n}\n\nfunction pgTrigger(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n let oid = 40000;\n for (const t of allTables(ctx.state)) {\n for (const tr of t.triggers) {\n rows.push([oid++, tr.name, t.oid, !tr.forEachRow]);\n }\n }\n return rel(\n [\n [\"oid\", \"oid\"],\n [\"tgname\", \"name\"],\n [\"tgrelid\", \"oid\"],\n [\"tgisinternal\", \"bool\"],\n ],\n rows,\n \"pg_trigger\",\n );\n}\n\n// --- information_schema builders -------------------------------------------\n\nconst CATALOG_NAME = \"postgres\";\n\nfunction infoSchemata(state: DatabaseState): Relation {\n const rows: Datum[][] = [\n [CATALOG_NAME, \"pg_catalog\", OWNER],\n [CATALOG_NAME, \"information_schema\", OWNER],\n ];\n for (const s of state.schemas.values()) rows.push([CATALOG_NAME, s.name, OWNER]);\n return rel(\n [\n [\"catalog_name\", \"name\"],\n [\"schema_name\", \"name\"],\n [\"schema_owner\", \"name\"],\n ],\n rows,\n \"schemata\",\n );\n}\n\nfunction infoTables(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n for (const schema of ctx.state.schemas.values()) {\n for (const t of schema.tables.values()) {\n rows.push([CATALOG_NAME, t.schema, t.name, t.temp ? \"LOCAL TEMPORARY\" : \"BASE TABLE\", \"YES\"]);\n }\n for (const v of schema.views.values()) {\n if (!v.materialized) rows.push([CATALOG_NAME, v.schema, v.name, \"VIEW\", \"NO\"]);\n }\n }\n return rel(\n [\n [\"table_catalog\", \"name\"],\n [\"table_schema\", \"name\"],\n [\"table_name\", \"name\"],\n [\"table_type\", \"text\"],\n [\"is_insertable_into\", \"text\"],\n ],\n rows,\n \"tables\",\n );\n}\n\nfunction infoColumns(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n for (const t of allTables(ctx.state)) {\n t.columns.forEach((c, i) => {\n const id = c.type.id;\n const isNumeric = id === \"numeric\";\n const isIntish = id === \"int2\" || id === \"int4\" || id === \"int8\";\n const charMax = (id === \"varchar\" || id === \"bpchar\") && c.type.mod?.a !== undefined ? c.type.mod.a : null;\n const dataType = isArrayType(id) ? \"ARRAY\" : isEnumType(id) ? \"USER-DEFINED\" : typeDisplayName(id);\n const udt = isArrayType(id) ? `_${arrayUdt(id)}` : isEnumType(id) ? id.slice(5).split(\".\").pop()! : id;\n rows.push([\n CATALOG_NAME,\n t.schema,\n t.name,\n c.name,\n i + 1,\n null,\n c.notNull ? \"NO\" : \"YES\",\n dataType,\n charMax,\n isNumeric ? (c.type.mod?.a ?? null) : isIntish ? (id === \"int2\" ? 16 : id === \"int4\" ? 32 : 64) : null,\n isNumeric ? (c.type.mod?.b ?? null) : isIntish ? 0 : null,\n udt,\n c.identity ? \"YES\" : \"NO\",\n c.generated ? \"ALWAYS\" : \"NEVER\",\n \"YES\",\n ]);\n });\n }\n return rel(\n [\n [\"table_catalog\", \"name\"],\n [\"table_schema\", \"name\"],\n [\"table_name\", \"name\"],\n [\"column_name\", \"name\"],\n [\"ordinal_position\", \"int4\"],\n [\"column_default\", \"text\"],\n [\"is_nullable\", \"text\"],\n [\"data_type\", \"text\"],\n [\"character_maximum_length\", \"int4\"],\n [\"numeric_precision\", \"int4\"],\n [\"numeric_scale\", \"int4\"],\n [\"udt_name\", \"name\"],\n [\"is_identity\", \"text\"],\n [\"is_generated\", \"text\"],\n [\"is_updatable\", \"text\"],\n ],\n rows,\n \"columns\",\n );\n}\n\nfunction arrayUdt(t: TypeId): string {\n const elem = t.slice(0, -2);\n return isEnumType(elem) ? elem.slice(5).split(\".\").pop()! : elem;\n}\n\nfunction infoViews(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n for (const schema of ctx.state.schemas.values()) {\n for (const v of schema.views.values()) {\n if (!v.materialized) rows.push([CATALOG_NAME, v.schema, v.name, null]);\n }\n }\n return rel(\n [\n [\"table_catalog\", \"name\"],\n [\"table_schema\", \"name\"],\n [\"table_name\", \"name\"],\n [\"view_definition\", \"text\"],\n ],\n rows,\n \"views\",\n );\n}\n\nfunction infoSequences(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n for (const s of allSequences(ctx.state)) {\n rows.push([\n CATALOG_NAME,\n s.schema,\n s.name,\n typeDisplayName(s.dataType),\n String(s.startValue),\n String(s.minValue),\n String(s.maxValue),\n String(s.increment),\n s.cycle ? \"YES\" : \"NO\",\n ]);\n }\n return rel(\n [\n [\"sequence_catalog\", \"name\"],\n [\"sequence_schema\", \"name\"],\n [\"sequence_name\", \"name\"],\n [\"data_type\", \"text\"],\n [\"start_value\", \"text\"],\n [\"minimum_value\", \"text\"],\n [\"maximum_value\", \"text\"],\n [\"increment\", \"text\"],\n [\"cycle_option\", \"text\"],\n ],\n rows,\n \"sequences\",\n );\n}\n\nfunction infoTableConstraints(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n for (const t of allTables(ctx.state)) {\n for (const c of t.constraints) {\n const type =\n c.kind === \"primary_key\"\n ? \"PRIMARY KEY\"\n : c.kind === \"unique\"\n ? \"UNIQUE\"\n : c.kind === \"check\"\n ? \"CHECK\"\n : \"FOREIGN KEY\";\n rows.push([CATALOG_NAME, t.schema, c.name, CATALOG_NAME, t.schema, t.name, type]);\n }\n }\n return rel(\n [\n [\"constraint_catalog\", \"name\"],\n [\"constraint_schema\", \"name\"],\n [\"constraint_name\", \"name\"],\n [\"table_catalog\", \"name\"],\n [\"table_schema\", \"name\"],\n [\"table_name\", \"name\"],\n [\"constraint_type\", \"text\"],\n ],\n rows,\n \"table_constraints\",\n );\n}\n\nfunction infoKeyColumnUsage(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n for (const t of allTables(ctx.state)) {\n for (const c of t.constraints) {\n if (c.kind !== \"primary_key\" && c.kind !== \"unique\" && c.kind !== \"foreign_key\") continue;\n c.columns.forEach((col, i) => {\n rows.push([CATALOG_NAME, t.schema, c.name, CATALOG_NAME, t.schema, t.name, col, i + 1]);\n });\n }\n }\n return rel(\n [\n [\"constraint_catalog\", \"name\"],\n [\"constraint_schema\", \"name\"],\n [\"constraint_name\", \"name\"],\n [\"table_catalog\", \"name\"],\n [\"table_schema\", \"name\"],\n [\"table_name\", \"name\"],\n [\"column_name\", \"name\"],\n [\"ordinal_position\", \"int4\"],\n ],\n rows,\n \"key_column_usage\",\n );\n}\n\nfunction infoRoutines(ctx: EngineCtx): Relation {\n const rows: Datum[][] = [];\n for (const schema of ctx.state.schemas.values()) {\n for (const fns of schema.functions.values()) {\n for (const f of fns) {\n rows.push([\n CATALOG_NAME,\n f.schema,\n f.name,\n \"FUNCTION\",\n f.returns ? typeDisplayName(f.returns) : null,\n f.language.toUpperCase(),\n ]);\n }\n }\n }\n return rel(\n [\n [\"routine_catalog\", \"name\"],\n [\"routine_schema\", \"name\"],\n [\"routine_name\", \"name\"],\n [\"routine_type\", \"text\"],\n [\"data_type\", \"text\"],\n [\"external_language\", \"text\"],\n ],\n rows,\n \"routines\",\n );\n}\n\n// --- dispatch ----------------------------------------------------------------\n\nfunction buildCatalogRelation(ctx: EngineCtx, schema: string, name: string): Relation | null {\n if (schema === \"pg_catalog\") {\n switch (name) {\n case \"pg_namespace\":\n return pgNamespace(ctx.state);\n case \"pg_class\":\n return pgClass(ctx);\n case \"pg_attribute\":\n return pgAttribute(ctx);\n case \"pg_type\":\n return pgType(ctx);\n case \"pg_proc\":\n return pgProc(ctx);\n case \"pg_enum\":\n return pgEnum(ctx);\n case \"pg_constraint\":\n return pgConstraint(ctx);\n case \"pg_index\":\n return pgIndex(ctx);\n case \"pg_sequence\":\n return pgSequence(ctx);\n case \"pg_sequences\":\n return pgSequencesView(ctx);\n case \"pg_tables\":\n return pgTables(ctx);\n case \"pg_views\":\n return pgViews(ctx, false);\n case \"pg_matviews\":\n return pgViews(ctx, true);\n case \"pg_indexes\":\n return pgIndexesView(ctx);\n case \"pg_settings\":\n return pgSettings(ctx);\n case \"pg_database\":\n return pgDatabase();\n case \"pg_roles\":\n case \"pg_user\":\n return pgRoles();\n case \"pg_trigger\":\n return pgTrigger(ctx);\n default:\n return null;\n }\n }\n switch (name) {\n case \"schemata\":\n return infoSchemata(ctx.state);\n case \"tables\":\n return infoTables(ctx);\n case \"columns\":\n return infoColumns(ctx);\n case \"views\":\n return infoViews(ctx);\n case \"sequences\":\n return infoSequences(ctx);\n case \"table_constraints\":\n return infoTableConstraints(ctx);\n case \"key_column_usage\":\n return infoKeyColumnUsage(ctx);\n case \"routines\":\n return infoRoutines(ctx);\n default:\n return null;\n }\n}\n\nsetCatalogBuilder(buildCatalogRelation);\n", "import type { Statement } from \"../ast/nodes.ts\";\nimport { pgError, unsupported } from \"../errors/error.ts\";\nimport { parse } from \"../parser/index.ts\";\nimport type { TableData, TriggerMeta } from \"../storage/database-state.ts\";\nimport { castTo } from \"../types/cast.ts\";\nimport type { Datum } from \"../types/value.ts\";\nimport { compileTriggerBody, type PlStmt } from \"./plpgsql.ts\";\nimport { type ExecEnv, RowScope } from \"./relation.ts\";\nimport { evalPredicate, evalScalar, runStatement } from \"./select.ts\";\nimport { setTriggerExecutor, type TriggerEvent } from \"./triggers.ts\";\n\n/**\n * Trigger executor: runs plpgsql-lite bodies against NEW/OLD rows.\n * Parsing is shared with UDF plpgsql in plpgsql.ts.\n */\n\nclass ReturnSignal {\n constructor(readonly row: Datum[] | null) {}\n}\n\nfunction runTriggerBody(\n env: ExecEnv,\n table: TableData,\n stmts: PlStmt[],\n vars: { newRow: Datum[] | null; oldRow: Datum[] | null },\n): void {\n const scope = (): RowScope => triggerScope(table, vars.newRow, vars.oldRow);\n\n for (const stmt of stmts) {\n switch (stmt.kind) {\n case \"assign\": {\n if (stmt.target.length !== 2 || stmt.target[0] !== \"new\") {\n throw unsupported(`trigger body: assignment to \"${stmt.target.join(\".\")}\"`);\n }\n if (vars.newRow === null) {\n throw pgError(\"object_not_in_prerequisite_state\", `record \"new\" is not assigned yet`, \"55000\");\n }\n const colName = stmt.target[1]!;\n const idx = table.columns.findIndex((c) => c.name === colName);\n if (idx === -1) {\n throw pgError(\"undefined_column\", `record \"new\" has no field \"${colName}\"`, \"42703\");\n }\n const v = evalScalar(env, scope(), stmt.expr);\n vars.newRow = vars.newRow.slice();\n vars.newRow[idx] =\n v.v === null ? null : castTo(env.ctx, v, table.columns[idx]!.type.id, { assignment: true }).v;\n break;\n }\n case \"return_new\":\n throw new ReturnSignal(vars.newRow);\n case \"return_old\":\n throw new ReturnSignal(vars.oldRow);\n case \"return_empty\":\n throw new ReturnSignal(null);\n case \"return_expr\": {\n const v = evalScalar(env, scope(), stmt.expr);\n if (v.v === null) throw new ReturnSignal(null);\n throw unsupported(\"trigger body: RETURN expression\");\n }\n case \"if\": {\n let taken = false;\n for (const b of stmt.branches) {\n if (evalPredicate(env, scope(), b.cond)) {\n runTriggerBody(env, table, b.body, vars);\n taken = true;\n break;\n }\n }\n if (!taken) runTriggerBody(env, table, stmt.elseBody, vars);\n break;\n }\n case \"null\":\n break;\n case \"raise\":\n throw pgError(\"raise_exception\", stmt.message, \"P0001\");\n case \"block\": {\n try {\n runTriggerBody(env, table, stmt.body, vars);\n } catch (e) {\n if (e instanceof ReturnSignal) throw e;\n if (stmt.handler === null) throw e;\n runTriggerBody(env, table, stmt.handler, vars);\n }\n break;\n }\n case \"sql\": {\n const stmts = parse(stmt.text);\n if (stmts.length !== 1) throw unsupported(`trigger body SQL: ${stmt.text}`);\n runStatement(env, stmts[0]! as Statement);\n break;\n }\n default:\n throw unsupported(`trigger body: ${stmt.kind}`);\n }\n }\n}\n\nfunction triggerScope(table: TableData, newRow: Datum[] | null, oldRow: Datum[] | null): RowScope {\n const cols: Array<{ name: string; type: import(\"../types/value.ts\").TypeId; table: string | null }> = [];\n const row: Datum[] = [];\n const rangeVars = new Set<string>();\n if (newRow) {\n rangeVars.add(\"new\");\n for (let i = 0; i < table.columns.length; i++) {\n cols.push({ name: table.columns[i]!.name, type: table.columns[i]!.type.id, table: \"new\" });\n row.push(newRow[i] ?? null);\n }\n }\n if (oldRow) {\n rangeVars.add(\"old\");\n for (let i = 0; i < table.columns.length; i++) {\n cols.push({ name: table.columns[i]!.name, type: table.columns[i]!.type.id, table: \"old\" });\n row.push(oldRow[i] ?? null);\n }\n }\n return new RowScope(cols, row, null, rangeVars);\n}\n\nfunction executeTrigger(\n env: ExecEnv,\n table: TableData,\n trigger: TriggerMeta,\n _event: TriggerEvent,\n oldRow: Datum[] | null,\n newRow: Datum[] | null,\n): Datum[] | null {\n const state = env.ctx.state;\n if (trigger.when !== null && !evalPredicate(env, triggerScope(table, newRow, oldRow), trigger.when)) {\n return newRow; // WHEN false: trigger does not fire; row passes through unchanged\n }\n const fns = state.schemas.get(trigger.funcSchema)?.functions.get(trigger.funcName);\n const fn = fns?.[0];\n if (!fn) {\n throw pgError(\"undefined_function\", `function ${trigger.funcSchema}.${trigger.funcName}() does not exist`, \"42883\");\n }\n const raw = fn.rawBody;\n if (raw === null) throw unsupported(`trigger function ${fn.name} has no body`);\n const stmts = compileTriggerBody(raw);\n const vars = { newRow: newRow ? newRow.slice() : null, oldRow };\n try {\n runTriggerBody(env, table, stmts, vars);\n } catch (e) {\n if (e instanceof ReturnSignal) return e.row;\n throw e;\n }\n throw pgError(\"invalid_function_definition\", `control reached end of trigger procedure without RETURN`, \"2F005\");\n}\n\nsetTriggerExecutor(executeTrigger);\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 for (const row of rel.rows) table.mutableRows().push(row.slice());\n }\n schema.tables.set(name, table);\n const count = stmt.withData ? table.rowCount() : 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.rowCount(); i++) {\n checkUnique(env, table, table.rowAt(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 found = env.ctx.state.findView(stmt.name);\n if (!found?.materialized) {\n throw pgError(\"undefined_table\", `materialized view \"${stmt.name.join(\".\")}\" does not exist`, \"42P01\");\n }\n const view = env.ctx.state.ensureWritableView(found);\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 found = env.ctx.state.findEnum(stmt.name);\n if (!found) {\n throw pgError(\"undefined_object\", `type \"${stmt.name.join(\".\")}\" does not exist`, \"42704\");\n }\n const e = env.ctx.state.ensureWritableEnum(found);\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 found = state.findTable(stmt.table);\n if (!found) {\n throw pgError(\"undefined_table\", `relation \"${stmt.table.join(\".\")}\" does not exist`, \"42P01\");\n }\n const table = state.ensureWritableTable(found);\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 found = state.findTable(stmt.table);\n if (!found) {\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 table = state.ensureWritableTable(found);\n const schema = state.getSchema(table.schema);\n\n for (const action of stmt.actions) {\n const rows = table.mutableRows();\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 < rows.length; i++) {\n const row = 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 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 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 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 < rows.length; i++) {\n const row = 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 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 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 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 case \"reloptions\":\n break;\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.rowCount(); i++) {\n const row = table.rowAt(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 state.ensureWritableTable(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.rowCount() >= 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 const writable = state.ensureWritableTable(t);\n writable.mutableRows().length = 0;\n if (stmt.restartIdentity) {\n const schema = state.getSchema(writable.schema);\n for (const seq of [...schema.sequences.values()]) {\n if (seq.ownedBy?.table === writable.name) {\n const wseq = state.ensureWritableSequence(seq);\n wseq.lastValue = wseq.startValue;\n wseq.isCalled = false;\n }\n }\n }\n }\n return commandResult(\"TRUNCATE TABLE\", 0);\n}\n", "import type { Statement } from \"../ast/nodes.ts\";\nimport { pgError } 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 return commandResult(\"DO\", 0);\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 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, this.database.int8Mode);\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 type Int8Mode,\n OsEntropy,\n Prng,\n type RandomMode,\n resolveClock,\n} from \"../runtime/index.ts\";\nimport type { FunctionData } from \"../storage/database-state.ts\";\nimport { DatabaseState } from \"../storage/database-state.ts\";\nimport type { TransactionManager } from \"../transactions/manager.ts\";\nimport { resolveTypeName } from \"../types/resolve.ts\";\nimport type { TypeId } from \"../types/value.ts\";\nimport type { BindValue, JsValue, QueryRow } from \"./bind.ts\";\nimport { captureSnapshot, type Snapshot } from \"./snapshot.ts\";\nimport { Statement } from \"./statement.ts\";\n\nconst ADOPT = Symbol(\"postgres-mem.adopt\");\n\ninterface AdoptedDatabase {\n readonly [ADOPT]: true;\n readonly state: DatabaseState;\n readonly prng: Prng;\n readonly now: Clock;\n readonly seed: number | bigint;\n readonly randomMode: RandomMode;\n readonly systemClock: boolean;\n readonly int8Mode: Int8Mode;\n}\n\n/** Additive time-travel controls for read APIs. */\nexport interface QueryOptions {\n /** Execute against this immutable checkpoint instead of the live database. */\n at?: Snapshot;\n}\n\nfunction isAdopted(value: object): value is AdoptedDatabase {\n return ADOPT in value;\n}\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/mockingbird-service-postgres\";\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 /** How `int8` columns surface in query rows. */\n readonly int8Mode: Int8Mode;\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 if (isAdopted(options)) {\n this.seed = options.seed;\n this.randomMode = options.randomMode;\n this.systemClock = options.systemClock;\n this.int8Mode = options.int8Mode;\n this.prng = options.prng;\n this.now = options.now;\n this.state = options.state;\n this.state.prng = this.prng;\n this.state.clock = () => this.now();\n this.transactions = txManagerFor(this.state);\n return;\n }\n this.seed = options.seed ?? DEFAULT_DATABASE_SEED;\n this.randomMode = options.random ?? \"deterministic\";\n this.systemClock = options.now === \"system\";\n this.int8Mode = options.int8 ?? \"bigint\";\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 /**\n * Register a JavaScript function callable from SQL. Not encoded in PGMM\n * snapshots \u2014 re-register after {@link Snapshot.decode} / {@link Snapshot.open}.\n * {@link Snapshot.open} copies the implementation by reference when opening\n * a live in-memory snapshot.\n */\n registerFunction(spec: RegisterFunctionOptions): void {\n this.assertOpen();\n const parts = spec.name\n .split(\".\")\n .map((p) => p.trim())\n .filter((p) => p.length > 0);\n if (parts.length === 0) throw pgError(\"syntax\", \"function name is required\", \"42601\");\n const schemaName = parts.length >= 2 ? parts[0]! : this.state.currentSchema();\n const name = parts[parts.length - 1]!.toLowerCase();\n const schema = this.state.getSchema(schemaName.toLowerCase());\n const argTypes: TypeId[] = spec.args.map((a) => resolveTypeName(this.state, parseTypeName(a)).column.id);\n const returns = resolveTypeName(this.state, parseTypeName(spec.returns)).column.id;\n const fn: FunctionData = {\n name,\n schema: schema.name,\n argNames: spec.args.map(() => null),\n argTypes,\n argDefaults: argTypes.map(() => null),\n returns,\n returnsSet: false,\n returnsTable: null,\n language: \"js\",\n body: null,\n rawBody: null,\n strict: spec.strict ?? true,\n oid: this.state.nextOid(),\n jsImpl: spec.fn,\n };\n const existing = schema.functions.get(name) ?? [];\n const sameSig = existing.findIndex(\n (f) => f.argTypes.length === argTypes.length && f.argTypes.every((t, i) => t === argTypes[i]),\n );\n if (sameSig !== -1) existing[sameSig] = fn;\n else existing.push(fn);\n schema.functions.set(name, existing);\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[] = [], options: QueryOptions = {}): T[] {\n this.assertOpen();\n if (options.at) return options.at.open().query<T>(sql, params);\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 * Freeze this database into a reusable {@link Snapshot} template.\n * Does not encode PGMM bytes. Call {@link Snapshot.encode} to persist, or\n * {@link Snapshot.open} for a copy-on-write fork.\n */\n snapshot(): Snapshot {\n this.assertOpen();\n if (this.transactions.inTransaction) {\n throw pgError(\"transaction_state\", \"cannot snapshot during a transaction\", \"25P01\");\n }\n return captureSnapshot(\n this.state,\n this.prng,\n this.now,\n this.seed,\n this.randomMode,\n this.systemClock,\n this.int8Mode,\n );\n }\n\n /** Alias for {@link snapshot}, naming the value as a timeline checkpoint. */\n checkpoint(): Snapshot {\n return this.snapshot();\n }\n\n /** Open a copy-on-write branch from `at`, or from the current state when omitted. */\n branch(at: Snapshot = this.snapshot()): Database {\n this.assertOpen();\n return at.open();\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\n/** @internal */\nexport function requireCodec(): CodecModule {\n if (!codec) {\n throw new PostgresError(\"unsupported\", \"snapshot codec not loaded\");\n }\n return codec;\n}\n\n/** @internal Used by {@link Snapshot.open}. */\nexport function createAdoptedDatabase(opts: Omit<AdoptedDatabase, typeof ADOPT>): Database {\n return new Database({\n [ADOPT]: true,\n ...opts,\n } as DatabaseOptions);\n}\n\nexport { Snapshot } from \"./snapshot.ts\";\n\n/** Options for {@link Database.registerFunction}. */\nexport interface RegisterFunctionOptions {\n name: string;\n args: string[];\n returns: string;\n strict?: boolean;\n fn: (...args: JsValue[]) => JsValue;\n}\n\nfunction parseTypeName(raw: string): { parts: string[]; mods: number[]; arrayDims: number } {\n let s = raw.trim().toLowerCase();\n let arrayDims = 0;\n while (s.endsWith(\"[]\")) {\n arrayDims++;\n s = s.slice(0, -2).trimEnd();\n }\n const parts = s\n .split(\".\")\n .map((p) => p.trim())\n .filter((p) => p.length > 0);\n return { parts, mods: [], arrayDims };\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", "import type { Database } from \"../api/database.ts\";\nimport { PostgresError } from \"../errors/error.ts\";\n\n/**\n * What every connection of one server shares: the engine, and the coordination the engine\n * (single-session, synchronous) does not do itself.\n *\n * - The **turn**: the engine holds one transaction at a time, so a connection inside an\n * explicit transaction block holds the turn until it commits or rolls back, and every other\n * connection's statement waits. A statement outside a block takes the turn for itself only.\n * Uncommitted rows are therefore never visible to another connection (read committed holds),\n * at the cost of running transaction blocks one at a time.\n * - **Advisory locks** per session, with waiters woken in order, and deadlock detection\n * between a lock and the turn (`40P01`).\n * - **LISTEN / NOTIFY** fan-out, delivered when a listening connection is idle.\n * - Which session's statement is executing, so the SQL functions registered on the engine\n * (`pg_backend_pid`, `pg_advisory_lock`, `pg_notify`, \u2026) know whom they serve.\n */\nexport class Cluster {\n turnHolder: Session | null = null;\n private readonly turnQueue: Waiter[] = [];\n readonly locks = new Map<string, { holder: Session; count: number; xact: boolean }>();\n private readonly lockQueues = new Map<string, Waiter[]>();\n readonly listeners = new Map<string, Set<Session>>();\n readonly sessions = new Map<number, Session>();\n current: Session | null = null;\n private nextPid = 1000;\n\n constructor(readonly db: Database) {\n registerSessionFunctions(this);\n }\n\n newPid(): number {\n return this.nextPid++;\n }\n\n /** Wait until this session may execute: at once when nobody holds the turn, or it does. */\n acquireTurn(session: Session): Promise<void> {\n if (this.turnHolder === null || this.turnHolder === session) {\n this.turnHolder = session;\n return Promise.resolve();\n }\n // The holder is waiting for a lock this session holds: neither can proceed.\n const holder = this.turnHolder;\n if (holder.waitingForLock !== null && this.locks.get(holder.waitingForLock)?.holder === session) {\n return Promise.reject(deadlock());\n }\n return new Promise<void>((resolve, reject) => {\n const waiter: Waiter = { session, resolve, reject };\n session.waitingForTurn = waiter;\n this.turnQueue.push(waiter);\n });\n }\n\n releaseTurn(session: Session): void {\n if (this.turnHolder !== session) return;\n this.turnHolder = null;\n const next = this.turnQueue.shift();\n if (next) {\n next.session.waitingForTurn = null;\n this.turnHolder = next.session;\n next.resolve();\n }\n }\n\n /** Take `key` for `session` now, or report that another session holds it. */\n tryLock(session: Session, key: string, xact: boolean): boolean {\n const held = this.locks.get(key);\n if (held && held.holder !== session) return false;\n if (held) held.count++;\n else this.locks.set(key, { holder: session, count: 1, xact });\n return true;\n }\n\n /** Wait until `key` is free for `session`; rejects with `40P01` when that can never happen. */\n waitLock(session: Session, key: string): Promise<void> {\n const holder = this.locks.get(key)?.holder;\n if (!holder) return Promise.resolve();\n // The lock's holder waits for the turn this session holds inside its transaction block.\n if (this.turnHolder === session && holder.waitingForTurn !== null) return Promise.reject(deadlock());\n if (holder.waitingForLock !== null && this.locks.get(holder.waitingForLock)?.holder === session) {\n return Promise.reject(deadlock());\n }\n return new Promise<void>((resolve, reject) => {\n const waiter: Waiter = { session, resolve, reject };\n session.waitingForLock = key;\n const queue = this.lockQueues.get(key) ?? [];\n queue.push(waiter);\n this.lockQueues.set(key, queue);\n });\n }\n\n unlock(session: Session, key: string): boolean {\n const held = this.locks.get(key);\n if (!held || held.holder !== session) return false;\n held.count--;\n if (held.count > 0) return true;\n this.locks.delete(key);\n const next = this.lockQueues.get(key)?.shift();\n if (next) {\n next.session.waitingForLock = null;\n next.resolve();\n }\n return true;\n }\n\n /** Release every lock `session` holds, or only its transaction-scoped ones. */\n unlockAll(session: Session, xactOnly = false): void {\n for (const [key, held] of [...this.locks]) {\n if (held.holder !== session || (xactOnly && !held.xact)) continue;\n held.count = 1;\n this.unlock(session, key);\n }\n }\n\n /** Forget a session: its transaction, turn, locks, waits and subscriptions. */\n drop(session: Session): void {\n this.sessions.delete(session.pid);\n for (const set of this.listeners.values()) set.delete(session);\n if (session.waitingForTurn) {\n const at = this.turnQueue.indexOf(session.waitingForTurn);\n if (at !== -1) this.turnQueue.splice(at, 1);\n session.waitingForTurn = null;\n }\n if (session.waitingForLock !== null) {\n const queue = this.lockQueues.get(session.waitingForLock) ?? [];\n const at = queue.findIndex((w) => w.session === session);\n if (at !== -1) queue.splice(at, 1);\n session.waitingForLock = null;\n }\n this.unlockAll(session);\n if (this.turnHolder === session) {\n if (this.db.transactions.inTransaction) this.db.transactions.rollback();\n this.releaseTurn(session);\n }\n }\n\n /** Run `fn` as `session`'s statement, so registered functions can tell who is calling. */\n as<T>(session: Session, fn: () => T): T {\n const previous = this.current;\n this.current = session;\n try {\n return fn();\n } finally {\n this.current = previous;\n }\n }\n\n notify(from: Session, channel: string, payload: string): void {\n for (const listener of this.listeners.get(channel) ?? []) listener.queueNotification(from.pid, channel, payload);\n }\n}\n\ntype Waiter = { session: Session; resolve: () => void; reject: (error: Error) => void };\n\nconst deadlock = () =>\n new PostgresError(\n \"internal\",\n \"deadlock detected: a transaction block is waiting for an advisory lock held by a session waiting for it\",\n \"40P01\",\n );\n\n/** A statement stopped by a lock another session holds; the session waits, then runs it again. */\nexport class LockWait extends Error {\n constructor(readonly key: string) {\n super(`waiting for advisory lock ${key}`);\n this.name = \"LockWait\";\n }\n}\n\n/** What the cluster needs from a connection. */\nexport interface Session {\n readonly pid: number;\n waitingForTurn: Waiter | null;\n waitingForLock: string | null;\n /** NOTIFYs issued inside the current transaction block, sent at commit. */\n pendingNotifies: { channel: string; payload: string }[];\n queueNotification(pid: number, channel: string, payload: string): void;\n}\n\nconst lockKey = (args: unknown[]): string => args.map((a) => String(a)).join(\":\");\n\n/** The session-aware SQL functions, replacing the engine's single-session stubs. */\nconst registerSessionFunctions = (cluster: Cluster): void => {\n const db = cluster.db;\n const me = (): Session => {\n if (!cluster.current) throw new PostgresError(\"internal\", \"no session is executing\", \"XX000\");\n return cluster.current;\n };\n db.registerFunction({ name: \"pg_backend_pid\", args: [], returns: \"int4\", fn: () => me().pid });\n const lock =\n (xact: boolean) =>\n (...args: unknown[]) => {\n const key = lockKey(args);\n if (!cluster.tryLock(me(), key, xact)) throw new LockWait(key);\n return null;\n };\n const tryLock =\n (xact: boolean) =>\n (...args: unknown[]) =>\n cluster.tryLock(me(), lockKey(args), xact);\n const unlock = (...args: unknown[]) => cluster.unlock(me(), lockKey(args));\n for (const args of [[\"int8\"], [\"int4\", \"int4\"]]) {\n db.registerFunction({ name: \"pg_advisory_lock\", args, returns: \"void\", fn: lock(false) });\n db.registerFunction({ name: \"pg_advisory_xact_lock\", args, returns: \"void\", fn: lock(true) });\n db.registerFunction({ name: \"pg_try_advisory_lock\", args, returns: \"bool\", fn: tryLock(false) });\n db.registerFunction({ name: \"pg_try_advisory_xact_lock\", args, returns: \"bool\", fn: tryLock(true) });\n db.registerFunction({ name: \"pg_advisory_unlock\", args, returns: \"bool\", fn: unlock });\n }\n db.registerFunction({\n name: \"pg_advisory_unlock_all\",\n args: [],\n returns: \"void\",\n fn: () => {\n cluster.unlockAll(me());\n return null;\n },\n });\n const notify = (channel: unknown, payload: unknown) => {\n me().pendingNotifies.push({ channel: String(channel), payload: payload === null ? \"\" : String(payload) });\n return null;\n };\n db.registerFunction({ name: \"pg_notify\", args: [\"text\", \"text\"], returns: \"void\", strict: false, fn: notify });\n db.registerFunction({\n name: \"pg_listening_channels\",\n args: [],\n returns: \"text\",\n fn: () => [...cluster.listeners].find(([, set]) => set.has(me()))?.[0] ?? null,\n });\n};\n", "/**\n * PostgreSQL frontend/backend protocol 3.0 message framing: the byte codec only, no behavior.\n * https://www.postgresql.org/docs/18/protocol-message-formats.html\n */\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder(\"utf-8\");\n\nexport const SSL_REQUEST_CODE = 80877103;\nexport const GSSENC_REQUEST_CODE = 80877104;\nexport const CANCEL_REQUEST_CODE = 80877102;\nexport const PROTOCOL_3_0 = 196608;\n\n/** Growable big-endian byte builder for one or more backend messages. */\nexport class ByteWriter {\n private buf = new Uint8Array(1024);\n private view = new DataView(this.buf.buffer);\n private len = 0;\n\n private ensure(extra: number): void {\n if (this.len + extra <= this.buf.length) return;\n let size = this.buf.length * 2;\n while (size < this.len + extra) size *= 2;\n const next = new Uint8Array(size);\n next.set(this.buf.subarray(0, this.len));\n this.buf = next;\n this.view = new DataView(next.buffer);\n }\n\n u8(value: number): this {\n this.ensure(1);\n this.buf[this.len++] = value & 0xff;\n return this;\n }\n\n i16(value: number): this {\n this.ensure(2);\n this.view.setInt16(this.len, value);\n this.len += 2;\n return this;\n }\n\n i32(value: number): this {\n this.ensure(4);\n this.view.setInt32(this.len, value);\n this.len += 4;\n return this;\n }\n\n bytes(value: Uint8Array): this {\n this.ensure(value.byteLength);\n this.buf.set(value, this.len);\n this.len += value.byteLength;\n return this;\n }\n\n /** A NUL-terminated string. */\n cstring(value: string): this {\n return this.bytes(encoder.encode(value)).u8(0);\n }\n\n get length(): number {\n return this.len;\n }\n\n take(): Uint8Array {\n const out = this.buf.slice(0, this.len);\n this.len = 0;\n return out;\n }\n}\n\n/** One backend message: type byte, int32 length (including itself), body. */\nexport const message = (type: string, body: (w: ByteWriter) => void): Uint8Array => {\n const w = new ByteWriter();\n w.u8(type.charCodeAt(0));\n w.i32(0);\n body(w);\n const out = w.take();\n new DataView(out.buffer, out.byteOffset, out.byteLength).setInt32(1, out.byteLength - 1);\n return out;\n};\n\nexport type FieldDescription = {\n name: string;\n tableOid?: number;\n columnAttr?: number;\n typeOid: number;\n typeLen: number;\n typeMod?: number;\n /** 0 text, 1 binary. */\n format: 0 | 1;\n};\n\nexport type ErrorFields = {\n severity?: \"ERROR\" | \"FATAL\" | \"PANIC\" | \"WARNING\" | \"NOTICE\";\n code: string;\n message: string;\n detail?: string;\n hint?: string;\n position?: number;\n constraint?: string;\n table?: string;\n column?: string;\n schema?: string;\n};\n\nconst errorBody = (fields: ErrorFields) => (w: ByteWriter) => {\n const severity = fields.severity ?? \"ERROR\";\n w.u8(0x53).cstring(severity); // S\n w.u8(0x56).cstring(severity); // V\n w.u8(0x43).cstring(fields.code); // C\n w.u8(0x4d).cstring(fields.message); // M\n if (fields.detail !== undefined) w.u8(0x44).cstring(fields.detail); // D\n if (fields.hint !== undefined) w.u8(0x48).cstring(fields.hint); // H\n if (fields.position !== undefined) w.u8(0x50).cstring(String(fields.position)); // P\n if (fields.schema !== undefined) w.u8(0x73).cstring(fields.schema); // s\n if (fields.table !== undefined) w.u8(0x74).cstring(fields.table); // t\n if (fields.column !== undefined) w.u8(0x63).cstring(fields.column); // c\n if (fields.constraint !== undefined) w.u8(0x6e).cstring(fields.constraint); // n\n w.u8(0);\n};\n\nexport const backend = {\n authenticationOk: () => message(\"R\", (w) => w.i32(0)),\n authenticationSASL: (mechanisms: string[]) =>\n message(\"R\", (w) => {\n w.i32(10);\n for (const m of mechanisms) w.cstring(m);\n w.u8(0);\n }),\n authenticationSASLContinue: (data: string) => message(\"R\", (w) => w.i32(11).bytes(encoder.encode(data))),\n authenticationSASLFinal: (data: string) => message(\"R\", (w) => w.i32(12).bytes(encoder.encode(data))),\n parameterStatus: (name: string, value: string) => message(\"S\", (w) => w.cstring(name).cstring(value)),\n backendKeyData: (pid: number, key: number) => message(\"K\", (w) => w.i32(pid).i32(key)),\n readyForQuery: (status: \"I\" | \"T\" | \"E\") => message(\"Z\", (w) => w.u8(status.charCodeAt(0))),\n rowDescription: (fields: FieldDescription[]) =>\n message(\"T\", (w) => {\n w.i16(fields.length);\n for (const f of fields) {\n w.cstring(f.name)\n .i32(f.tableOid ?? 0)\n .i16(f.columnAttr ?? 0)\n .i32(f.typeOid)\n .i16(f.typeLen)\n .i32(f.typeMod ?? -1)\n .i16(f.format);\n }\n }),\n dataRow: (values: (Uint8Array | null)[]) =>\n message(\"D\", (w) => {\n w.i16(values.length);\n for (const v of values) {\n if (v === null) w.i32(-1);\n else w.i32(v.byteLength).bytes(v);\n }\n }),\n commandComplete: (tag: string) => message(\"C\", (w) => w.cstring(tag)),\n emptyQueryResponse: () => message(\"I\", () => {}),\n errorResponse: (fields: ErrorFields) => message(\"E\", errorBody(fields)),\n noticeResponse: (fields: ErrorFields) => message(\"N\", errorBody({ severity: \"NOTICE\", ...fields })),\n parseComplete: () => message(\"1\", () => {}),\n bindComplete: () => message(\"2\", () => {}),\n closeComplete: () => message(\"3\", () => {}),\n noData: () => message(\"n\", () => {}),\n portalSuspended: () => message(\"s\", () => {}),\n parameterDescription: (oids: number[]) =>\n message(\"t\", (w) => {\n w.i16(oids.length);\n for (const oid of oids) w.i32(oid);\n }),\n notificationResponse: (pid: number, channel: string, payload: string) =>\n message(\"A\", (w) => w.i32(pid).cstring(channel).cstring(payload)),\n /** The one-byte answers to SSLRequest / GSSENCRequest: no encryption here. */\n no: () => new Uint8Array([0x4e]),\n};\n\n/** Sequential reader over one message body. */\nexport class ByteReader {\n private pos: number;\n private readonly view: DataView;\n\n constructor(\n readonly bytes: Uint8Array,\n start = 0,\n ) {\n this.pos = start;\n this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n }\n\n get remaining(): number {\n return this.bytes.byteLength - this.pos;\n }\n\n u8(): number {\n if (this.remaining < 1) throw new ProtocolError(\"message ended early\");\n return this.bytes[this.pos++] as number;\n }\n\n i16(): number {\n if (this.remaining < 2) throw new ProtocolError(\"message ended early\");\n const v = this.view.getInt16(this.pos);\n this.pos += 2;\n return v;\n }\n\n i32(): number {\n if (this.remaining < 4) throw new ProtocolError(\"message ended early\");\n const v = this.view.getInt32(this.pos);\n this.pos += 4;\n return v;\n }\n\n take(n: number): Uint8Array {\n if (n < 0 || this.remaining < n) throw new ProtocolError(\"message ended early\");\n const out = this.bytes.subarray(this.pos, this.pos + n);\n this.pos += n;\n return out;\n }\n\n cstring(): string {\n const end = this.bytes.indexOf(0, this.pos);\n if (end === -1) throw new ProtocolError(\"unterminated string\");\n const s = decoder.decode(this.bytes.subarray(this.pos, end));\n this.pos = end + 1;\n return s;\n }\n\n rest(): Uint8Array {\n return this.take(this.remaining);\n }\n}\n\nexport class ProtocolError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ProtocolError\";\n }\n}\n\nexport type FrontendMessage =\n | { kind: \"ssl\" }\n | { kind: \"gssenc\" }\n | { kind: \"cancel\"; pid: number; key: number }\n | { kind: \"startup\"; protocol: number; parameters: Record<string, string> }\n | { kind: \"typed\"; type: string; body: ByteReader };\n\n/**\n * Splits a byte stream into frontend messages. Before the startup message is seen, frames have\n * no type byte (StartupMessage, SSLRequest, GSSENCRequest, CancelRequest).\n */\nexport class FrameParser {\n private pending: Uint8Array = new Uint8Array(0);\n private started = false;\n\n push(chunk: Uint8Array): FrontendMessage[] {\n if (this.pending.byteLength === 0) this.pending = chunk;\n else {\n const next = new Uint8Array(this.pending.byteLength + chunk.byteLength);\n next.set(this.pending);\n next.set(chunk, this.pending.byteLength);\n this.pending = next;\n }\n const out: FrontendMessage[] = [];\n for (;;) {\n const frame = this.next();\n if (!frame) return out;\n out.push(frame);\n }\n }\n\n private next(): FrontendMessage | undefined {\n const buf = this.pending;\n if (!this.started) {\n if (buf.byteLength < 8) return undefined;\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n const length = view.getInt32(0);\n if (length < 8 || length > 10_000) throw new ProtocolError(`invalid startup packet length ${length}`);\n if (buf.byteLength < length) return undefined;\n const code = view.getInt32(4);\n this.pending = buf.subarray(length);\n if (code === SSL_REQUEST_CODE) return { kind: \"ssl\" };\n if (code === GSSENC_REQUEST_CODE) return { kind: \"gssenc\" };\n if (code === CANCEL_REQUEST_CODE) {\n return { kind: \"cancel\", pid: view.getInt32(8), key: view.getInt32(12) };\n }\n const r = new ByteReader(buf.subarray(8, length));\n const parameters: Record<string, string> = {};\n while (r.remaining > 1) {\n const key = r.cstring();\n if (key === \"\") break;\n parameters[key] = r.cstring();\n }\n this.started = true;\n return { kind: \"startup\", protocol: code, parameters };\n }\n if (buf.byteLength < 5) return undefined;\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n const length = view.getInt32(1);\n if (length < 4) throw new ProtocolError(`invalid message length ${length}`);\n if (buf.byteLength < length + 1) return undefined;\n const type = String.fromCharCode(buf[0] as number);\n const body = new ByteReader(buf.subarray(5, length + 1));\n this.pending = buf.subarray(length + 1);\n return { kind: \"typed\", type, body };\n }\n}\n\nexport const utf8 = {\n encode: (s: string): Uint8Array => encoder.encode(s),\n decode: (b: Uint8Array): string => decoder.decode(b),\n};\n", "import { createHash, createHmac, pbkdf2Sync, randomBytes, timingSafeEqual } from \"node:crypto\";\n\n/**\n * Server side of SCRAM-SHA-256 (RFC 7677) as PostgreSQL speaks it: one round trip after the\n * client's first message, channel binding declined (`n` or `y`; no TLS here).\n */\nexport class ScramServer {\n private clientFirstBare = \"\";\n private serverFirst = \"\";\n private nonce = \"\";\n private readonly salt = randomBytes(16);\n private readonly iterations = 4096;\n\n constructor(private readonly password: string) {}\n\n /** The server-first-message for a client-first-message; null when the client message is malformed. */\n first(clientFirst: string): string | null {\n const m = /^([nyp])(=[^,]*)?,([^,]*),(.*)$/s.exec(clientFirst);\n if (!m) return null;\n const bare = m[4] as string;\n const nonce = /(?:^|,)r=([^,]+)/.exec(bare)?.[1];\n if (!nonce) return null;\n this.clientFirstBare = bare;\n this.nonce = nonce + randomBytes(18).toString(\"base64\");\n this.serverFirst = `r=${this.nonce},s=${this.salt.toString(\"base64\")},i=${this.iterations}`;\n return this.serverFirst;\n }\n\n /** The server-final-message (`v=\u2026`) when the client's proof is right; null otherwise. */\n final(clientFinal: string): string | null {\n const proofAt = clientFinal.lastIndexOf(\",p=\");\n if (proofAt === -1) return null;\n const withoutProof = clientFinal.slice(0, proofAt);\n const proof = Buffer.from(clientFinal.slice(proofAt + 3), \"base64\");\n const nonce = /(?:^|,)r=([^,]+)/.exec(withoutProof)?.[1];\n if (nonce !== this.nonce) return null;\n const salted = pbkdf2Sync(this.password, this.salt, this.iterations, 32, \"sha256\");\n const clientKey = createHmac(\"sha256\", salted).update(\"Client Key\").digest();\n const storedKey = createHash(\"sha256\").update(clientKey).digest();\n const authMessage = `${this.clientFirstBare},${this.serverFirst},${withoutProof}`;\n const clientSignature = createHmac(\"sha256\", storedKey).update(authMessage).digest();\n if (proof.byteLength !== clientSignature.byteLength) return null;\n const recovered = Buffer.alloc(clientKey.byteLength);\n for (let i = 0; i < recovered.byteLength; i++) {\n recovered[i] = (proof[i] as number) ^ (clientSignature[i] as number);\n }\n const recoveredStored = createHash(\"sha256\").update(recovered).digest();\n if (!timingSafeEqual(recoveredStored, storedKey)) return null;\n const serverKey = createHmac(\"sha256\", salted).update(\"Server Key\").digest();\n const serverSignature = createHmac(\"sha256\", serverKey).update(authMessage).digest();\n return `v=${serverSignature.toString(\"base64\")}`;\n }\n}\n", "/**\n * Split a simple-query script into statements at top-level semicolons, the way the server's\n * lexer would: quoted strings (`'\u2026'`, `E'\u2026'` with backslashes, `\"\u2026\"`), dollar quoting\n * (`$tag$\u2026$tag$`), line and (nested) block comments never split. Empty statements are dropped.\n */\nexport const splitStatements = (script: string): string[] => {\n const out: string[] = [];\n let start = 0;\n let i = 0;\n const n = script.length;\n const push = (end: number) => {\n const text = script.slice(start, end).trim();\n if (text.length > 0) out.push(text);\n };\n while (i < n) {\n const c = script[i] as string;\n const next = script[i + 1];\n if (c === \"-\" && next === \"-\") {\n const end = script.indexOf(\"\\n\", i);\n i = end === -1 ? n : end + 1;\n continue;\n }\n if (c === \"/\" && next === \"*\") {\n let depth = 1;\n i += 2;\n while (i < n && depth > 0) {\n if (script[i] === \"/\" && script[i + 1] === \"*\") {\n depth++;\n i += 2;\n } else if (script[i] === \"*\" && script[i + 1] === \"/\") {\n depth--;\n i += 2;\n } else i++;\n }\n continue;\n }\n if (c === \"'\" || c === '\"') {\n const escaped = c === \"'\" && /[eE]/.test(script[i - 1] ?? \"\") && !/[\\w$]/.test(script[i - 2] ?? \"\");\n i++;\n while (i < n) {\n if (escaped && script[i] === \"\\\\\") {\n i += 2;\n continue;\n }\n if (script[i] === c) {\n if (script[i + 1] === c) {\n i += 2;\n continue;\n }\n break;\n }\n i++;\n }\n i++;\n continue;\n }\n if (c === \"$\") {\n const m = /^\\$([A-Za-z_][A-Za-z0-9_]*)?\\$/.exec(script.slice(i, i + 64));\n if (m) {\n const tag = m[0];\n const end = script.indexOf(tag, i + tag.length);\n i = end === -1 ? n : end + tag.length;\n continue;\n }\n }\n if (c === \";\") {\n push(i);\n start = i + 1;\n }\n i++;\n }\n push(n);\n return out;\n};\n", "import type { Socket } from \"node:net\";\nimport type { BindValue } from \"../api/bind.ts\";\nimport type { TextResultSet } from \"../api/statement.ts\";\nimport { PostgresError } from \"../errors/error.ts\";\nimport { typeOid } from \"../types/value.ts\";\nimport { type Cluster, LockWait, type Session } from \"./cluster.ts\";\nimport {\n type ByteReader,\n backend,\n type ErrorFields,\n type FieldDescription,\n FrameParser,\n type FrontendMessage,\n PROTOCOL_3_0,\n ProtocolError,\n utf8,\n} from \"./protocol.ts\";\nimport { ScramServer } from \"./scram.ts\";\nimport { splitStatements } from \"./split.ts\";\n\n/** One statement's outcome, before it is written to the wire. */\ntype Outcome = { empty: true } | { empty: false; result: TextResultSet; tag: string };\n\ntype Prepared = { name: string; sql: string; paramOids: number[] };\ntype Portal = {\n name: string;\n prepared: Prepared;\n params: BindValue[];\n resultFormats: number[];\n /** Set once executed (by Describe or Execute); rows are handed out from `cursor`. */\n outcome?: Outcome;\n cursor: number;\n};\n\nexport type ServerFaults = {\n /** Destroy the socket of the next connection that runs a statement inside a transaction block. */\n dropConnection?: boolean;\n /** Hold the next statement this long before it runs. */\n delayStatementMs?: number;\n /** Fail the next COMMIT with this SQLSTATE (`40001` serialization failure) after rolling back. */\n failCommit?: string;\n};\n\nexport type ServerLog = {\n pid: number;\n sql: string;\n durationMs: number;\n /** `ok`, or the SQLSTATE of the error. */\n status: string;\n};\n\nexport type ConnectionOptions = {\n password?: string;\n serverVersion: string;\n parameters: Record<string, string>;\n faults: ServerFaults;\n onLog?: (entry: ServerLog) => void;\n};\n\nconst TX_CONTROL = /^(begin|start\\s+transaction|commit|end|rollback|abort|savepoint|release)\\b/i;\nconst COMMIT = /^(commit|end)\\b/i;\nconst LISTEN = /^listen\\s+(\"?)([A-Za-z_][\\w$]*)\\1\\s*$/i;\nconst UNLISTEN = /^unlisten\\s+(\\*|\"?[A-Za-z_][\\w$]*\"?)\\s*$/i;\nconst NOTIFY = /^notify\\s+(\"?)([A-Za-z_][\\w$]*)\\1\\s*(?:,\\s*'((?:[^']|'')*)')?\\s*$/i;\nconst RETURNS_ROWS = /^(select|with|values|show|table|explain)\\b/i;\n\nconst TYPLEN: Record<string, number> = {\n bool: 1,\n int2: 2,\n int4: 4,\n int8: 8,\n oid: 4,\n float4: 4,\n float8: 8,\n date: 4,\n time: 8,\n timestamp: 8,\n timestamptz: 8,\n uuid: 16,\n};\n\nconst TEXT_TYPES = new Set([\"text\", \"varchar\", \"bpchar\", \"name\", \"json\", \"xml\", \"unknown\"]);\nconst PG_EPOCH_MS = 946_684_800_000;\n\nconst pgError = (category: \"internal\" | \"syntax\", message: string, code: string) =>\n new PostgresError(category, message, code);\n\n/** ErrorResponse fields for an engine error, with what the message names (constraint, table, column). */\nconst errorFields = (error: unknown): ErrorFields => {\n if (error instanceof PostgresError) {\n const message = error.message;\n const fields: ErrorFields = { code: error.sqlState, message };\n const constraint = /constraint \"([^\"]+)\"/.exec(message)?.[1];\n const table = /(?:relation|table) \"([^\"]+)\"/.exec(message)?.[1];\n const column = /column \"([^\"]+)\"/.exec(message)?.[1];\n if (constraint) fields.constraint = constraint;\n if (table) fields.table = table;\n if (column) fields.column = column;\n return fields;\n }\n if (error instanceof ProtocolError) return { code: \"08P01\", message: error.message, severity: \"FATAL\" };\n return { code: \"XX000\", message: error instanceof Error ? error.message : String(error) };\n};\n\nconst commandTag = (result: TextResultSet): string => {\n const command = result.command;\n if (command === \"INSERT\") return `INSERT 0 ${result.rowCount}`;\n if ([\"SELECT\", \"UPDATE\", \"DELETE\", \"MOVE\", \"FETCH\", \"COPY\", \"MERGE\"].includes(command))\n return `${command} ${result.rowCount}`;\n return command;\n};\n\n/** Binary result encoding for the types clients ask for in binary; null when only text is offered. */\nconst binaryValue = (type: string, text: string): Uint8Array | null => {\n const dv = (n: number) => {\n const b = new Uint8Array(n);\n return { b, v: new DataView(b.buffer) };\n };\n switch (type) {\n case \"bool\":\n return new Uint8Array([text === \"t\" ? 1 : 0]);\n case \"int2\": {\n const { b, v } = dv(2);\n v.setInt16(0, Number(text));\n return b;\n }\n case \"int4\":\n case \"oid\": {\n const { b, v } = dv(4);\n v.setInt32(0, Number(text));\n return b;\n }\n case \"int8\": {\n const { b, v } = dv(8);\n v.setBigInt64(0, BigInt(text));\n return b;\n }\n case \"float4\": {\n const { b, v } = dv(4);\n v.setFloat32(0, Number(text));\n return b;\n }\n case \"float8\": {\n const { b, v } = dv(8);\n v.setFloat64(0, Number(text));\n return b;\n }\n case \"bytea\": {\n const hex = text.startsWith(\"\\\\x\") ? text.slice(2) : null;\n if (hex === null || hex.length % 2 !== 0) return null;\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < out.length; i++) out[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n return out;\n }\n case \"uuid\": {\n const hex = text.replaceAll(\"-\", \"\");\n if (hex.length !== 32) return null;\n const out = new Uint8Array(16);\n for (let i = 0; i < 16; i++) out[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n return out;\n }\n default:\n return TEXT_TYPES.has(type) ? utf8.encode(text) : null;\n }\n};\n\nconst binaryEncodable = (type: string): boolean =>\n TEXT_TYPES.has(type) || [\"bool\", \"int2\", \"int4\", \"oid\", \"int8\", \"float4\", \"float8\", \"bytea\", \"uuid\"].includes(type);\n\n/** A bound parameter as the engine takes it: text binds as an untyped literal, binary by its OID. */\nconst decodeParam = (oid: number, format: number, bytes: Uint8Array | null): BindValue => {\n if (bytes === null) return null;\n if (format === 0) return utf8.decode(bytes);\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n switch (oid) {\n case 16:\n return bytes[0] !== 0;\n case 21:\n return view.getInt16(0);\n case 23:\n case 26:\n return view.getInt32(0);\n case 20:\n return view.getBigInt64(0);\n case 700:\n return view.getFloat32(0);\n case 701:\n return view.getFloat64(0);\n case 17:\n return new Uint8Array(bytes);\n case 2950: {\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 case 1114:\n case 1184:\n return new Date(Number(view.getBigInt64(0) / 1000n) + PG_EPOCH_MS);\n case 1082: {\n const date = new Date(PG_EPOCH_MS + view.getInt32(0) * 86_400_000);\n return date.toISOString().slice(0, 10);\n }\n case 0:\n case 19:\n case 25:\n case 114:\n case 1042:\n case 1043:\n case 3802:\n return utf8.decode(bytes);\n default:\n throw pgError(\"internal\", `binary parameter format is not supported for type oid ${oid}`, \"0A000\");\n }\n};\n\n/**\n * One client connection: the protocol state machine over the shared {@link Cluster}.\n * Statements run one at a time per connection; between connections the cluster decides.\n */\nexport class Connection implements Session {\n readonly pid: number;\n readonly secret: number;\n waitingForTurn: Session[\"waitingForTurn\"] = null;\n waitingForLock: string | null = null;\n pendingNotifies: { channel: string; payload: string }[] = [];\n\n private readonly frames = new FrameParser();\n private readonly inbox: FrontendMessage[] = [];\n private pumping = false;\n private started = false;\n private scram: ScramServer | null = null;\n private user = \"postgres\";\n /** After an error inside a transaction block: `25P02` until ROLLBACK (`E` in ReadyForQuery). */\n private aborted = false;\n /** A query is in flight (a CancelRequest applies to it). */\n private busy = false;\n private cancelled = false;\n /** Extended protocol: an error was sent, so messages are ignored until Sync. */\n private skipUntilSync = false;\n private readonly prepared = new Map<string, Prepared>();\n private readonly portals = new Map<string, Portal>();\n private readonly notifications: Uint8Array[] = [];\n private closed = false;\n\n constructor(\n private readonly socket: Socket,\n private readonly cluster: Cluster,\n private readonly options: ConnectionOptions,\n ) {\n this.pid = cluster.newPid();\n this.secret = Math.floor(Math.random() * 0x7fffffff);\n cluster.sessions.set(this.pid, this);\n socket.on(\"data\", (chunk: Buffer) => this.receive(chunk));\n socket.on(\"close\", () => this.dispose());\n socket.on(\"error\", () => this.dispose());\n }\n\n private receive(chunk: Buffer): void {\n let messages: FrontendMessage[];\n try {\n messages = this.frames.push(new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength));\n } catch (error) {\n this.write(backend.errorResponse(errorFields(error)));\n this.socket.end();\n return;\n }\n this.inbox.push(...messages);\n if (!this.pumping) void this.pump();\n }\n\n private async pump(): Promise<void> {\n this.pumping = true;\n try {\n while (this.inbox.length > 0 && !this.closed) {\n const next = this.inbox.shift() as FrontendMessage;\n await this.handle(next);\n }\n } finally {\n this.pumping = false;\n }\n }\n\n private write(bytes: Uint8Array): void {\n if (!this.closed) this.socket.write(bytes);\n }\n\n private dispose(): void {\n if (this.closed) return;\n this.closed = true;\n this.cluster.drop(this);\n }\n\n /** Terminate from the server side (close, or the drop-connection fault). */\n destroy(): void {\n this.socket.destroy();\n this.dispose();\n }\n\n queueNotification(pid: number, channel: string, payload: string): void {\n this.notifications.push(backend.notificationResponse(pid, channel, payload));\n if (!this.busy) this.flushNotifications();\n }\n\n private flushNotifications(): void {\n for (const bytes of this.notifications.splice(0)) this.write(bytes);\n }\n\n /** A CancelRequest with this connection's key: the query in flight fails with `57014`. */\n cancel(): void {\n if (!this.busy) return;\n this.cancelled = true;\n const error = pgError(\"internal\", \"canceling statement due to user request\", \"57014\");\n if (this.waitingForTurn) this.waitingForTurn.reject(error);\n if (this.lockWaiter) this.lockWaiter(error);\n }\n\n private lockWaiter: ((error: Error) => void) | null = null;\n\n // --- startup ------------------------------------------------------------------------------\n\n private async handle(message: FrontendMessage): Promise<void> {\n if (message.kind === \"ssl\" || message.kind === \"gssenc\") {\n this.write(backend.no());\n return;\n }\n if (message.kind === \"cancel\") {\n const target = this.cluster.sessions.get(message.pid) as Connection | undefined;\n if (target && target.secret === message.key) target.cancel();\n this.socket.end();\n return;\n }\n if (message.kind === \"startup\") {\n this.startup(message.protocol, message.parameters);\n return;\n }\n if (!this.started) {\n if (message.type === \"p\") {\n this.authenticate(message.body);\n return;\n }\n this.fatal(\"08P01\", \"expected startup or password message\");\n return;\n }\n if (this.skipUntilSync && message.type !== \"S\" && message.type !== \"X\") return;\n try {\n switch (message.type) {\n case \"Q\":\n await this.query(message.body.cstring());\n return;\n case \"P\":\n await this.parse(message.body);\n return;\n case \"B\":\n this.bind(message.body);\n return;\n case \"D\":\n await this.describe(message.body);\n return;\n case \"E\":\n await this.executePortal(message.body);\n return;\n case \"C\":\n this.close(message.body);\n return;\n case \"H\":\n return;\n case \"S\":\n this.sync();\n return;\n case \"X\":\n this.socket.end();\n this.dispose();\n return;\n default:\n this.fatal(\"08P01\", `unsupported frontend message type ${JSON.stringify(message.type)}`);\n }\n } catch (error) {\n this.write(backend.errorResponse(errorFields(error)));\n this.skipUntilSync = true;\n }\n }\n\n private fatal(code: string, message: string): void {\n this.write(backend.errorResponse({ severity: \"FATAL\", code, message }));\n this.socket.end();\n this.dispose();\n }\n\n private startup(protocol: number, parameters: Record<string, string>): void {\n if (protocol >> 16 !== PROTOCOL_3_0 >> 16) {\n this.fatal(\"0A000\", `unsupported frontend protocol ${protocol >> 16}.${protocol & 0xffff}: server supports 3.0`);\n return;\n }\n this.user = parameters.user ?? \"postgres\";\n if (this.options.password !== undefined) {\n this.scram = new ScramServer(this.options.password);\n this.write(backend.authenticationSASL([\"SCRAM-SHA-256\"]));\n return;\n }\n this.ready(parameters);\n }\n\n private authenticate(body: ByteReader): void {\n if (!this.scram) {\n this.fatal(\"08P01\", \"unexpected password message\");\n return;\n }\n if (!this.scramStarted) {\n const mechanism = body.cstring();\n const length = body.i32();\n const clientFirst = utf8.decode(body.take(length));\n const serverFirst = mechanism === \"SCRAM-SHA-256\" ? this.scram.first(clientFirst) : null;\n if (serverFirst === null) {\n this.fatal(\"28000\", `SASL authentication with ${mechanism} is not supported or malformed`);\n return;\n }\n this.scramStarted = true;\n this.write(backend.authenticationSASLContinue(serverFirst));\n return;\n }\n const serverFinal = this.scram.final(utf8.decode(body.rest()));\n if (serverFinal === null) {\n this.fatal(\"28P01\", `password authentication failed for user \"${this.user}\"`);\n return;\n }\n this.write(backend.authenticationSASLFinal(serverFinal));\n this.ready(this.startupParameters);\n }\n\n private scramStarted = false;\n private startupParameters: Record<string, string> = {};\n\n private ready(parameters: Record<string, string>): void {\n this.startupParameters = parameters;\n if (this.scram && !this.scramStarted) return;\n this.started = true;\n this.write(backend.authenticationOk());\n const status: Record<string, string> = {\n server_version: this.options.serverVersion,\n server_encoding: \"UTF8\",\n client_encoding: \"UTF8\",\n application_name: parameters.application_name ?? \"\",\n DateStyle: \"ISO, MDY\",\n IntervalStyle: \"postgres\",\n TimeZone: \"UTC\",\n integer_datetimes: \"on\",\n standard_conforming_strings: \"on\",\n is_superuser: \"on\",\n session_authorization: this.user,\n default_transaction_read_only: \"off\",\n in_hot_standby: \"off\",\n scram_iterations: \"4096\",\n ...this.options.parameters,\n };\n for (const [name, value] of Object.entries(status)) this.write(backend.parameterStatus(name, value));\n this.write(backend.backendKeyData(this.pid, this.secret));\n this.write(backend.readyForQuery(\"I\"));\n }\n\n // --- execution ----------------------------------------------------------------------------\n\n private get inTransaction(): boolean {\n return this.cluster.turnHolder === this && this.cluster.db.transactions.inTransaction;\n }\n\n private status(): \"I\" | \"T\" | \"E\" {\n if (this.aborted) return \"E\";\n return this.inTransaction ? \"T\" : \"I\";\n }\n\n private readyForQuery(): void {\n this.busy = false;\n this.cancelled = false;\n this.write(backend.readyForQuery(this.status()));\n this.flushNotifications();\n }\n\n /** Run one statement against the engine, honoring the turn, locks, aborted state and faults. */\n private async execute(sql: string, params: BindValue[] = []): Promise<Outcome> {\n const text = sql.trim();\n if (text === \"\") return { empty: true };\n const started = performance.now();\n try {\n const outcome = await this.executeInner(text, params);\n this.options.onLog?.({ pid: this.pid, sql: text, durationMs: performance.now() - started, status: \"ok\" });\n return outcome;\n } catch (error) {\n if (this.inTransaction) this.aborted = true;\n const status = error instanceof PostgresError ? error.sqlState : \"XX000\";\n this.options.onLog?.({ pid: this.pid, sql: text, durationMs: performance.now() - started, status });\n throw error;\n }\n }\n\n private async executeInner(text: string, params: BindValue[]): Promise<Outcome> {\n const control = TX_CONTROL.test(text);\n if (this.aborted && !control) {\n throw pgError(\n \"internal\",\n \"current transaction is aborted, commands ignored until end of transaction block\",\n \"25P02\",\n );\n }\n const listen = LISTEN.exec(text);\n if (listen) return this.listen(listen[2] as string);\n const unlisten = UNLISTEN.exec(text);\n if (unlisten) return this.unlisten((unlisten[1] as string).replaceAll('\"', \"\"));\n const notify = NOTIFY.exec(text);\n if (notify) {\n this.pendingNotifies.push({ channel: notify[2] as string, payload: (notify[3] ?? \"\").replaceAll(\"''\", \"'\") });\n if (!this.inTransaction) this.flushNotifies();\n return command(\"NOTIFY\");\n }\n const db = this.cluster.db;\n for (;;) {\n if (this.cancelled) throw pgError(\"internal\", \"canceling statement due to user request\", \"57014\");\n await this.cluster.acquireTurn(this);\n const faults = this.options.faults;\n if (faults.delayStatementMs !== undefined) {\n const ms = faults.delayStatementMs;\n faults.delayStatementMs = undefined;\n await new Promise((resolve) => setTimeout(resolve, ms));\n }\n if (faults.dropConnection && db.transactions.inTransaction) {\n faults.dropConnection = undefined;\n this.destroy();\n throw new ConnectionDropped();\n }\n try {\n const outcome = this.runStatement(text, params, control);\n this.afterStatement();\n return outcome;\n } catch (error) {\n if (error instanceof LockWait) {\n const key = error.key;\n if (!db.transactions.inTransaction) this.cluster.releaseTurn(this);\n await this.waitForLock(key);\n continue;\n }\n this.afterStatement();\n throw error;\n }\n }\n }\n\n private waitForLock(key: string): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.lockWaiter = (error) => {\n this.lockWaiter = null;\n this.waitingForLock = null;\n reject(error);\n };\n this.cluster.waitLock(this, key).then(\n () => {\n this.lockWaiter = null;\n resolve();\n },\n (error: Error) => {\n this.lockWaiter = null;\n reject(error);\n },\n );\n });\n }\n\n /** The engine call itself: statement-atomic, and transaction control handled as the server sees it. */\n private runStatement(text: string, params: BindValue[], control: boolean): Outcome {\n const db = this.cluster.db;\n const tx = db.transactions;\n const faults = this.options.faults;\n if (control && COMMIT.test(text)) {\n if (this.aborted) {\n tx.rollback();\n this.aborted = false;\n return command(\"ROLLBACK\");\n }\n if (faults.failCommit !== undefined) {\n const code = faults.failCommit;\n faults.failCommit = undefined;\n tx.rollback();\n throw pgError(\"internal\", \"could not serialize access due to concurrent update\", code);\n }\n }\n if (control && this.aborted && /^(rollback|abort)\\b/i.test(text) && !/\\bto\\b/i.test(text)) {\n tx.rollback();\n this.aborted = false;\n return command(\"ROLLBACK\");\n }\n const run = () => {\n const result = this.cluster.as(this, () => db.prepare(text).textResult(...params));\n return { empty: false as const, result, tag: commandTag(result) };\n };\n if (control) return run();\n if (tx.inTransaction) {\n const name = `__wire_${this.pid}`;\n tx.savepoint(name);\n try {\n const outcome = run();\n tx.releaseSavepoint(name);\n return outcome;\n } catch (error) {\n tx.rollbackToSavepoint(name);\n tx.releaseSavepoint(name);\n throw error;\n }\n }\n return db.transaction(run);\n }\n\n /** Release the turn and transaction-scoped locks once no block is open; deliver NOTIFYs at commit. */\n private afterStatement(): void {\n if (this.cluster.db.transactions.inTransaction) return;\n this.cluster.unlockAll(this, true);\n this.cluster.releaseTurn(this);\n this.flushNotifies();\n }\n\n private flushNotifies(): void {\n for (const { channel, payload } of this.pendingNotifies.splice(0)) this.cluster.notify(this, channel, payload);\n }\n\n private listen(channel: string): Outcome {\n const set = this.cluster.listeners.get(channel) ?? new Set<Session>();\n set.add(this);\n this.cluster.listeners.set(channel, set);\n return command(\"LISTEN\");\n }\n\n private unlisten(channel: string): Outcome {\n if (channel === \"*\") for (const set of this.cluster.listeners.values()) set.delete(this);\n else this.cluster.listeners.get(channel)?.delete(this);\n return command(\"UNLISTEN\");\n }\n\n // --- simple query -------------------------------------------------------------------------\n\n private async query(script: string): Promise<void> {\n this.busy = true;\n const statements = splitStatements(script);\n if (statements.length === 0) {\n this.write(backend.emptyQueryResponse());\n this.readyForQuery();\n return;\n }\n // Several statements in one message run as one implicit transaction block, unless the\n // script manages transactions itself or one is already open.\n const implicit = statements.length > 1 && !this.inTransaction && !statements.some((s) => TX_CONTROL.test(s));\n let failed = false;\n try {\n if (implicit) await this.execute(\"BEGIN\");\n for (const statement of statements) {\n const outcome = await this.execute(statement);\n this.sendOutcome(outcome, [], { rowDescription: true });\n }\n if (implicit) await this.execute(\"COMMIT\");\n } catch (error) {\n if (error instanceof ConnectionDropped) return;\n failed = true;\n this.write(backend.errorResponse(errorFields(error)));\n if (implicit && this.inTransaction) {\n await this.execute(\"ROLLBACK\").catch(() => undefined);\n }\n }\n if (failed && this.inTransaction) this.aborted = true;\n this.readyForQuery();\n }\n\n private sendOutcome(\n outcome: Outcome,\n resultFormats: number[],\n opts: { rowDescription: boolean; from?: number; limit?: number } = { rowDescription: false },\n ): \"done\" | \"suspended\" {\n const from = opts.from ?? 0;\n const limit = opts.limit ?? 0;\n if (outcome.empty) {\n this.write(backend.emptyQueryResponse());\n return \"done\";\n }\n const { result } = outcome;\n if (from === 0 && result.columns.length > 0 && opts.rowDescription) {\n this.write(backend.rowDescription(this.fields(result, resultFormats)));\n }\n const formats = this.columnFormats(result, resultFormats);\n const end = limit > 0 ? Math.min(result.rows.length, from + limit) : result.rows.length;\n for (let i = from; i < end; i++) {\n const row = result.rows[i] as (string | null)[];\n this.write(\n backend.dataRow(\n row.map((value, c) => {\n if (value === null) return null;\n const type = result.columnTypes[c] as string;\n return formats[c] === 1 ? (binaryValue(type, value) ?? utf8.encode(value)) : utf8.encode(value);\n }),\n ),\n );\n }\n if (limit > 0 && end < result.rows.length) {\n this.write(backend.portalSuspended());\n return \"suspended\";\n }\n this.write(backend.commandComplete(outcome.tag));\n return \"done\";\n }\n\n private columnFormats(result: TextResultSet, requested: number[]): (0 | 1)[] {\n return result.columnTypes.map((type, i) => {\n const want = requested.length === 0 ? 0 : requested.length === 1 ? requested[0] : requested[i];\n return want === 1 && binaryEncodable(type) ? 1 : 0;\n });\n }\n\n private fields(result: TextResultSet, requested: number[]): FieldDescription[] {\n const formats = this.columnFormats(result, requested);\n return result.columns.map((name, i) => {\n const type = result.columnTypes[i] as string;\n return { name, typeOid: typeOid(type), typeLen: TYPLEN[type] ?? -1, format: formats[i] as 0 | 1 };\n });\n }\n\n // --- extended query -----------------------------------------------------------------------\n\n private async parse(body: ByteReader): Promise<void> {\n const name = body.cstring();\n const sql = body.cstring();\n const count = body.i16();\n const paramOids: number[] = [];\n for (let i = 0; i < count; i++) paramOids.push(body.i32());\n const text = sql.trim();\n if (text !== \"\" && !LISTEN.test(text) && !UNLISTEN.test(text) && !NOTIFY.test(text) && !TX_CONTROL.test(text)) {\n // Syntax is checked now (a parse error belongs to Parse), the statement runs at Execute.\n this.cluster.db.prepare(text);\n }\n if (name !== \"\" && this.prepared.has(name)) {\n throw pgError(\"internal\", `prepared statement \"${name}\" already exists`, \"42P05\");\n }\n this.prepared.set(name, { name, sql: text, paramOids });\n this.write(backend.parseComplete());\n }\n\n private bind(body: ByteReader): void {\n const portalName = body.cstring();\n const statementName = body.cstring();\n const prepared = this.prepared.get(statementName);\n if (!prepared) throw pgError(\"internal\", `prepared statement \"${statementName}\" does not exist`, \"26000\");\n const formatCount = body.i16();\n const paramFormats: number[] = [];\n for (let i = 0; i < formatCount; i++) paramFormats.push(body.i16());\n const paramCount = body.i16();\n const params: BindValue[] = [];\n for (let i = 0; i < paramCount; i++) {\n const length = body.i32();\n const bytes = length === -1 ? null : body.take(length);\n const format = paramFormats.length === 0 ? 0 : paramFormats.length === 1 ? paramFormats[0] : paramFormats[i];\n params.push(decodeParam(prepared.paramOids[i] ?? 0, format ?? 0, bytes));\n }\n const resultCount = body.i16();\n const resultFormats: number[] = [];\n for (let i = 0; i < resultCount; i++) resultFormats.push(body.i16());\n if (portalName !== \"\" && this.portals.has(portalName)) {\n throw pgError(\"internal\", `portal \"${portalName}\" already exists`, \"42P03\");\n }\n this.portals.set(portalName, { name: portalName, prepared, params, resultFormats, cursor: 0 });\n this.write(backend.bindComplete());\n }\n\n private async describe(body: ByteReader): Promise<void> {\n const kind = String.fromCharCode(body.u8());\n const name = body.cstring();\n if (kind === \"S\") {\n const prepared = this.prepared.get(name);\n if (!prepared) throw pgError(\"internal\", `prepared statement \"${name}\" does not exist`, \"26000\");\n this.write(backend.parameterDescription(prepared.paramOids.map((oid) => (oid === 0 ? 25 : oid))));\n const shape = await this.shapeOf(prepared);\n this.write(shape ? backend.rowDescription(this.fields(shape, [])) : backend.noData());\n return;\n }\n const portal = this.portals.get(name);\n if (!portal) throw pgError(\"internal\", `portal \"${name}\" does not exist`, \"34000\");\n this.busy = true;\n portal.outcome ??= await this.execute(portal.prepared.sql, portal.params);\n const outcome = portal.outcome;\n if (outcome.empty || outcome.result.columns.length === 0) this.write(backend.noData());\n else this.write(backend.rowDescription(this.fields(outcome.result, portal.resultFormats)));\n }\n\n /**\n * The row shape of a statement that returns rows, for Describe on a statement: a trial run with\n * null parameters inside a transaction that is rolled back. Anything else (or a trial that\n * fails) is described as returning no data.\n */\n private async shapeOf(prepared: Prepared): Promise<TextResultSet | null> {\n if (!RETURNS_ROWS.test(prepared.sql)) return null;\n const db = this.cluster.db;\n await this.cluster.acquireTurn(this);\n try {\n const params = prepared.paramOids.map(() => null);\n if (db.transactions.inTransaction) {\n const name = `__describe_${this.pid}`;\n db.transactions.savepoint(name);\n try {\n return this.cluster.as(this, () => db.prepare(prepared.sql).textResult(...params));\n } finally {\n db.transactions.rollbackToSavepoint(name);\n db.transactions.releaseSavepoint(name);\n }\n }\n db.transactions.begin();\n try {\n return this.cluster.as(this, () => db.prepare(prepared.sql).textResult(...params));\n } finally {\n db.transactions.rollback();\n }\n } catch {\n return null;\n } finally {\n if (!db.transactions.inTransaction) this.cluster.releaseTurn(this);\n }\n }\n\n private async executePortal(body: ByteReader): Promise<void> {\n const name = body.cstring();\n const maxRows = body.i32();\n const portal = this.portals.get(name);\n if (!portal) throw pgError(\"internal\", `portal \"${name}\" does not exist`, \"34000\");\n this.busy = true;\n try {\n portal.outcome ??= await this.execute(portal.prepared.sql, portal.params);\n } catch (error) {\n if (error instanceof ConnectionDropped) return;\n throw error;\n }\n const state = this.sendOutcome(portal.outcome, portal.resultFormats, {\n rowDescription: false,\n from: portal.cursor,\n limit: maxRows,\n });\n if (state === \"suspended\") portal.cursor += maxRows;\n else portal.cursor = portal.outcome.empty ? 0 : portal.outcome.result.rows.length;\n }\n\n private close(body: ByteReader): void {\n const kind = String.fromCharCode(body.u8());\n const name = body.cstring();\n if (kind === \"S\") {\n this.prepared.delete(name);\n for (const [portalName, portal] of [...this.portals])\n if (portal.prepared.name === name) this.portals.delete(portalName);\n } else this.portals.delete(name);\n this.write(backend.closeComplete());\n }\n\n private sync(): void {\n this.skipUntilSync = false;\n if (!this.inTransaction) this.portals.clear();\n this.readyForQuery();\n }\n}\n\nconst command = (tag: string): Outcome => ({\n empty: false,\n result: { columns: [], columnTypes: [], rows: [], rowCount: 0, command: tag },\n tag,\n});\n\nclass ConnectionDropped extends Error {\n constructor() {\n super(\"connection dropped by fault\");\n this.name = \"ConnectionDropped\";\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["message", "matches", "zoneOffsetForNaive", "months", "days", "micros", "message", "message", "p", "rscale", "negate", "coef", "ws", "r", "digits", "bad", "name", "parsed", "chars", "name", "found", "count", "rel", "command", "INT4_MIN", "INT4_MAX", "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", "message", "raw", "message", "objectName", "comment", "t", "save", "alias", "colAliases", "strict", "ifNotExists", "ifExists", "name", "cascade", "from", "arrayDims", "chars", "message", "rel", "raw", "p", "rel", "rows", "rel", "v", "matches", "name", "c", "command", "rel", "matches", "col", "e", "systemClock", "isNumeric", "stmts", "rel", "encoder", "message", "view", "length", "utf8", "TEXT_TYPES", "pgError", "message", "command", "utf8"]
7
+ }