@crvouga/mockingbird-service-sqlite 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -1
- package/README.md +49 -6
- package/dist/admin.d.ts +13 -0
- package/dist/admin.js +19180 -0
- package/dist/admin.js.map +7 -0
- package/dist/api/database.d.ts +37 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +270 -13
- package/dist/index.js.map +3 -3
- package/dist/runtime/options.d.ts +5 -0
- package/dist/socket/cli.d.ts +2 -0
- package/dist/socket/cli.js +16467 -0
- package/dist/socket/cli.js.map +7 -0
- package/dist/socket/index.d.ts +58 -0
- package/dist/socket/index.js +16486 -0
- package/dist/socket/index.js.map +7 -0
- package/dist/unstable.js.map +2 -2
- package/package.json +21 -3
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/socket/index.ts", "../../../../core/src/timeline.ts", "../../src/errors/index.ts", "../../src/types/sqlite-atof.ts", "../../src/lexer/tokenize.ts", "../../src/parser/parser.ts", "../../src/parser/index.ts", "../../src/runtime/clock.ts", "../../src/runtime/options.ts", "../../src/runtime/prng.ts", "../../src/types/sqlite-real-format.ts", "../../src/types/value.ts", "../../src/indexes/index.ts", "../../src/types/strict.ts", "../../src/vtable/fts/options.ts", "../../src/vtable/fts/query.ts", "../../src/vtable/fts/porter.ts", "../../src/vtable/fts/tokenize.ts", "../../src/vtable/fts/table.ts", "../../src/vtable/modules.ts", "../../src/runtime/assert.ts", "../../src/types/collation.ts", "../../src/storage/row.ts", "../../src/storage/table.ts", "../../src/storage/database-state.ts", "../../src/transactions/manager.ts", "../../src/storage/columnar-slab.ts", "../../src/serialization/wire.ts", "../../src/serialization/codec.ts", "../../src/api/snapshot.ts", "../../src/functions/aggregate.ts", "../../src/functions/datetime.ts", "../../src/functions/extensions.ts", "../../src/json/parse.ts", "../../src/json/stringify.ts", "../../src/json/jsonb.ts", "../../src/json/path.ts", "../../src/json/types.ts", "../../src/json/ops.ts", "../../src/json/tvf.ts", "../../src/functions/json.ts", "../../src/functions/math.ts", "../../src/expressions/like.ts", "../../src/functions/scalar.ts", "../../src/functions/registry.ts", "../../src/executor/env.ts", "../../src/expressions/eval.ts", "../../src/indexes/keys.ts", "../../src/executor/result.ts", "../../src/executor/attach.ts", "../../src/schema/master-sql.ts", "../../src/functions/window.ts", "../../src/executor/pragma-engine.ts", "../../src/functions/table-valued-registry.ts", "../../src/functions/pragma-tvf.ts", "../../src/functions/table-valued.ts", "../../src/expressions/equals.ts", "../../src/runtime/catch.ts", "../../src/planner/access.ts", "../../src/schema/catalog.ts", "../../src/executor/simple-select.ts", "../../src/executor/select.ts", "../../src/executor/ddl.ts", "../../src/constraints/check.ts", "../../src/executor/triggers.ts", "../../src/executor/vtable.ts", "../../src/executor/dml.ts", "../../src/executor/pragma.ts", "../../src/executor/execute.ts", "../../src/api/statement.ts", "../../src/api/database.ts", "../../src/socket/cli.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * A small TCP server in front of the in-memory SQLite engine.\n *\n * SQLite has no client/server wire protocol, so the stock `sqlite3` CLI cannot\n * attach. This entry speaks a length-prefixed JSON frame (`uint32` big-endian\n * length, then UTF-8 JSON, at most 8 MiB) and ships an in-package `connect(uri)`\n * client. URIs look like `sqlite://127.0.0.1:5432/app`. It needs `node:net`, so\n * it stays out of the browser build. Portable queries go through `POST /sql/query`\n * on the admin API.\n *\n * @example\n * ```ts\n * import { connect, serve } from \"@crvouga/mockingbird-service-sqlite/socket\";\n *\n * const server = await serve(\"sqlite://127.0.0.1:0/app\");\n * const db = await connect(server.url);\n * await db.exec(\"CREATE TABLE notes (id INTEGER PRIMARY KEY, body TEXT)\");\n * await db.close();\n * await server.close();\n * ```\n *\n * @module\n */\nimport { createConnection, createServer, type Server, type Socket } from \"node:net\";\nimport { Database, type DatabaseOptions } from \"../api/database.ts\";\nimport type { BindValue } from \"../types/value.ts\";\n\nconst MAX_FRAME = 8 * 1024 * 1024;\nconst READ_SQL = /^(?:select|with|values|pragma|explain)\\b/i;\n\nexport type SocketServeOptions = {\n /** TCP port. `0` (the default) picks a free one. */\n port?: number;\n /** Interface to bind. Default `127.0.0.1`. */\n host?: string;\n /** Engine to share. Omit for a fresh deterministic database. */\n database?: Database;\n databaseOptions?: DatabaseOptions;\n /** When set, a frame naming another database is rejected. */\n databaseName?: string;\n /** `sqlite://host:port/name`. An omitted port means `0` (ephemeral) for the server. */\n url?: string;\n};\n\nexport type SqliteServer = {\n readonly port: number;\n readonly host: string;\n /** Bound `sqlite://` URI. */\n readonly url: string;\n readonly database: Database;\n readonly server: Server;\n close(): Promise<void>;\n};\n\nexport type SqliteSocket = {\n query<T = Record<string, unknown>>(sql: string, params?: readonly unknown[]): Promise<T[]>;\n exec(sql: string): Promise<{ changes: number }>;\n close(): Promise<void>;\n};\n\ntype SqliteUri = { host: string; port: number; databaseName?: string };\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst jsonSafe = (value: unknown): unknown => {\n if (typeof value === \"bigint\") return value.toString();\n if (value instanceof Uint8Array) {\n let binary = \"\";\n for (const byte of value) binary += String.fromCharCode(byte);\n return btoa(binary);\n }\n if (value instanceof Date) return value.toISOString();\n if (Array.isArray(value)) return value.map((item) => jsonSafe(item));\n if (isRecord(value)) {\n const out: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) out[key] = jsonSafe(item);\n return out;\n }\n return value;\n};\n\nconst parseSqliteUri = (raw: string): SqliteUri => {\n let url: URL;\n try {\n url = new URL(raw);\n } catch {\n throw new Error(`invalid sqlite URI: ${raw}`);\n }\n if (url.protocol !== \"sqlite:\") throw new Error(`unsupported sqlite URI protocol ${url.protocol}`);\n const databaseName = decodeURIComponent(url.pathname.replace(/^\\//, \"\"));\n const port = url.port === \"\" ? 0 : Number(url.port);\n if (!Number.isInteger(port) || port < 0 || port > 65535) throw new Error(`invalid sqlite URI port: ${url.port}`);\n return {\n host: url.hostname || \"127.0.0.1\",\n port,\n ...(databaseName !== \"\" ? { databaseName } : {}),\n };\n};\n\nconst normalize = (input: SocketServeOptions | string): SocketServeOptions => {\n if (typeof input === \"string\") return parseSqliteUri(input);\n if (input.url === undefined) return input;\n const parsed = parseSqliteUri(input.url);\n return {\n ...parsed,\n ...input,\n host: input.host ?? parsed.host,\n port: input.port ?? parsed.port,\n databaseName: input.databaseName ?? parsed.databaseName,\n };\n};\n\nconst encode = (value: unknown): Buffer => {\n const body = Buffer.from(JSON.stringify(value), \"utf8\");\n if (body.length > MAX_FRAME) throw new Error(\"frame exceeds 8 MiB\");\n const header = Buffer.alloc(4);\n header.writeUInt32BE(body.length, 0);\n return Buffer.concat([header, body]);\n};\n\nclass FrameReader {\n private buffer = Buffer.alloc(0);\n\n push(chunk: Uint8Array): unknown[] {\n const incoming = Buffer.from(chunk);\n this.buffer = this.buffer.length === 0 ? incoming : Buffer.concat([this.buffer, incoming]);\n const frames: unknown[] = [];\n for (;;) {\n if (this.buffer.length < 4) break;\n const length = this.buffer.readUInt32BE(0);\n if (length > MAX_FRAME) throw new Error(\"frame exceeds 8 MiB\");\n if (this.buffer.length < 4 + length) break;\n const body = this.buffer.subarray(4, 4 + length);\n this.buffer = this.buffer.subarray(4 + length);\n frames.push(JSON.parse(body.toString(\"utf8\")) as unknown);\n }\n return frames;\n }\n}\n\nconst run = (db: Database, message: unknown, databaseName: string | undefined): unknown => {\n if (!isRecord(message) || typeof message.sql !== \"string\" || message.sql.trim() === \"\") {\n return { ok: false, error: 'expected {\"sql\":\"...\"}' };\n }\n if (databaseName !== undefined && typeof message.database === \"string\" && message.database !== databaseName) {\n return { ok: false, error: `database \"${message.database}\" does not exist` };\n }\n const params = Array.isArray(message.params) ? message.params : [];\n const read = READ_SQL.test(message.sql.trim());\n const mode = message.mode === \"exec\" || message.mode === \"query\" ? message.mode : read ? \"query\" : \"exec\";\n try {\n if (mode === \"exec\") {\n db.exec(message.sql);\n if (!db.transactions.inTransaction) db.record();\n return { ok: true, columns: [], rows: [], changes: db.changes };\n }\n const rows = db.query<Record<string, unknown>>(message.sql, params as BindValue[]);\n if (!db.transactions.inTransaction) db.record();\n const truncated = rows.length > 500;\n const sliced = truncated ? rows.slice(0, 500) : rows;\n return {\n ok: true,\n columns: sliced[0] ? Object.keys(sliced[0]) : [],\n rows: sliced.map((row) => jsonSafe(row)),\n changes: db.changes,\n ...(truncated ? { truncated: true } : {}),\n };\n } catch (error) {\n return { ok: false, error: error instanceof Error ? error.message : String(error) };\n }\n};\n\n/** Start a server and resolve once it is listening. A string argument is a `sqlite://` URI. */\nexport const serve = (input: SocketServeOptions | string = {}): Promise<SqliteServer> => {\n const options = normalize(input);\n const database = options.database ?? new Database(options.databaseOptions ?? {});\n const host = options.host ?? \"127.0.0.1\";\n const server = createServer((socket: Socket) => {\n socket.setNoDelay(true);\n const reader = new FrameReader();\n socket.on(\"data\", (chunk: Buffer) => {\n try {\n for (const frame of reader.push(chunk)) socket.write(encode(run(database, frame, options.databaseName)));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n socket.end(encode({ ok: false, error: message }));\n }\n });\n socket.on(\"error\", () => socket.destroy());\n });\n return new Promise((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 const name = options.databaseName ?? \"main\";\n resolve({\n port,\n host,\n url: `sqlite://${host}:${port}/${encodeURIComponent(name)}`,\n database,\n server,\n close: () =>\n new Promise<void>((done, fail) => {\n server.close((error?: Error | null) => (error ? fail(error) : done()));\n }),\n });\n });\n });\n};\n\nconst clientFrom = (socket: Socket, database: string | undefined): SqliteSocket => {\n const reader = new FrameReader();\n const pending: { resolve: (value: unknown) => void; reject: (error: Error) => void }[] = [];\n const failAll = (error: Error): void => {\n for (const wait of pending) wait.reject(error);\n pending.length = 0;\n };\n socket.on(\"data\", (chunk: Buffer) => {\n let frames: unknown[];\n try {\n frames = reader.push(chunk);\n } catch (error) {\n failAll(error instanceof Error ? error : new Error(String(error)));\n socket.destroy();\n return;\n }\n for (const frame of frames) {\n const wait = pending.shift();\n if (!wait) continue;\n if (isRecord(frame) && frame.ok === true) wait.resolve(frame);\n else if (isRecord(frame) && typeof frame.error === \"string\") wait.reject(new Error(frame.error));\n else wait.reject(new Error(\"malformed sqlite response\"));\n }\n });\n socket.on(\"error\", failAll);\n socket.on(\"close\", () => failAll(new Error(\"sqlite connection closed\")));\n const request = (body: Record<string, unknown>): Promise<Record<string, unknown>> =>\n new Promise((resolve, reject) => {\n pending.push({\n resolve: (value) => {\n if (isRecord(value)) resolve(value);\n else reject(new Error(\"malformed sqlite response\"));\n },\n reject,\n });\n socket.write(encode({ ...body, ...(database !== undefined ? { database } : {}) }));\n });\n return {\n async query<T = Record<string, unknown>>(sql: string, params: readonly unknown[] = []) {\n const frame = await request({ sql, params, mode: \"query\" });\n const rows = Array.isArray(frame.rows) ? frame.rows : [];\n return rows as T[];\n },\n async exec(sql) {\n const frame = await request({ sql, mode: \"exec\" });\n return { changes: typeof frame.changes === \"number\" ? frame.changes : 0 };\n },\n close() {\n return new Promise((resolve) => {\n socket.removeAllListeners(\"close\");\n socket.end(() => resolve());\n });\n },\n };\n};\n\n/** Open a client for a `sqlite://host:port/name` URI. The port must already be listening. */\nexport const connect = (uri: string): Promise<SqliteSocket> => {\n const parsed = parseSqliteUri(uri);\n if (parsed.port <= 0) return Promise.reject(new Error(\"sqlite URI needs a port\"));\n return new Promise((resolve, reject) => {\n const socket = createConnection({ host: parsed.host, port: parsed.port }, () => {\n socket.removeListener(\"error\", reject);\n resolve(clientFrom(socket, parsed.databaseName));\n });\n socket.once(\"error\", reject);\n });\n};\n", "/** A stable identifier for a point in a {@link Timeline}. */\nexport type CheckpointId = string\n\n/** An immutable node in a timeline's checkpoint DAG. */\nexport type Checkpoint<T> = Readonly<{\n id: CheckpointId\n branch: string\n parent: CheckpointId | null\n /** Logical time supplied by the timeline's injected clock. */\n at: number\n value: T\n}>\n\nexport type TimelineOptions = {\n /** Logical clock used to stamp checkpoints. Defaults to a deterministic counter. */\n now?: () => number\n /** Maximum retained checkpoints. Branch heads are never collected. Default 1,000. */\n maxCheckpoints?: number\n /** Customize deterministic checkpoint IDs. */\n id?: (sequence: number) => CheckpointId\n}\n\nexport type CommitOptions = {\n branch?: string\n /** Parent checkpoint. Defaults to the selected branch's current head. */\n parent?: CheckpointId | null\n}\n\nexport type ForkOptions = {\n /** Checkpoint to fork from. Defaults to the main branch's head. */\n from?: CheckpointId\n}\n\nconst BRANCH_PATTERN = /^[A-Za-z0-9_.-]{1,64}$/\n\n/**\n * Small, storage-agnostic checkpoint DAG shared by service runtimes. Its values may be immutable\n * records, namespace images, or copy-on-write SQL engine snapshots.\n *\n * Values are retained by reference. Engines can therefore use persistent/COW snapshots while\n * simpler services can use immutable values. IDs and GC order are deterministic, and all IO\n * (the logical clock) is injected.\n */\nexport class Timeline<T> {\n readonly maxCheckpoints: number\n private readonly now: () => number\n private readonly makeId: (sequence: number) => CheckpointId\n private readonly nodes = new Map<CheckpointId, Checkpoint<T>>()\n private readonly heads = new Map<string, CheckpointId>()\n /** Unreferenced nodes in the exact order they became collectible. */\n private readonly evictable = new Set<CheckpointId>()\n /** Branch heads plus explicit retainers. Absent means zero. */\n private readonly references = new Map<CheckpointId, number>()\n private readonly explicitPins = new Map<CheckpointId, number>()\n private sequence = 0\n\n constructor(options: TimelineOptions = {}) {\n const max = options.maxCheckpoints ?? 1_000\n if (!Number.isSafeInteger(max) || max < 1)\n throw new RangeError(\"maxCheckpoints must be a positive integer\")\n this.maxCheckpoints = max\n this.now = options.now ?? (() => this.sequence)\n this.makeId = options.id ?? ((sequence) => `cp_${sequence.toString(36).padStart(8, \"0\")}`)\n }\n\n /** Capture a new immutable value and move `branch` to it. */\n commit(value: T, options: CommitOptions = {}): Checkpoint<T> {\n const branch = options.branch ?? \"main\"\n this.assertBranch(branch)\n const parent = options.parent === undefined ? (this.heads.get(branch) ?? null) : options.parent\n if (parent !== null && !this.nodes.has(parent)) throw new RangeError(`no checkpoint ${parent}`)\n const id = this.makeId(++this.sequence)\n if (this.nodes.has(id)) throw new RangeError(`duplicate checkpoint id ${id}`)\n const checkpoint = Object.freeze({ id, branch, parent, at: this.now(), value })\n this.nodes.set(id, checkpoint)\n this.moveHead(branch, id)\n this.collect(this.maxCheckpoints)\n return checkpoint\n }\n\n /** Create a branch pointer without copying its checkpoint value. */\n fork(branch: string, options: ForkOptions = {}): Checkpoint<T> | undefined {\n this.assertBranch(branch)\n if (this.heads.has(branch)) throw new RangeError(`branch already exists: ${branch}`)\n const from = options.from ?? this.heads.get(\"main\")\n if (from === undefined) return undefined\n const checkpoint = this.get(from)\n this.moveHead(branch, checkpoint.id)\n return checkpoint\n }\n\n /** Move a branch pointer to an existing checkpoint. */\n checkout(branch: string, id: CheckpointId): Checkpoint<T> {\n this.assertBranch(branch)\n const checkpoint = this.get(id)\n this.moveHead(branch, checkpoint.id)\n return checkpoint\n }\n\n get(id: CheckpointId): Checkpoint<T> {\n const checkpoint = this.nodes.get(id)\n if (!checkpoint) throw new RangeError(`no checkpoint ${id}`)\n return checkpoint\n }\n\n head(branch = \"main\"): Checkpoint<T> | undefined {\n const id = this.heads.get(branch)\n return id === undefined ? undefined : this.get(id)\n }\n\n hasBranch(branch: string): boolean {\n return this.heads.has(branch)\n }\n\n branches(): Readonly<Record<string, CheckpointId>> {\n return Object.freeze(\n Object.fromEntries([...this.heads].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))),\n )\n }\n\n checkpoints(): readonly Checkpoint<T>[] {\n return [...this.nodes.values()]\n }\n\n /** Number of retained checkpoints without allocating an array. */\n get size(): number {\n return this.nodes.size\n }\n\n /** Pin a checkpoint independently of branch heads (used by compatibility snapshot handles). */\n retain(id: CheckpointId): Checkpoint<T> {\n const checkpoint = this.get(id)\n this.explicitPins.set(id, (this.explicitPins.get(id) ?? 0) + 1)\n this.addReference(id)\n return checkpoint\n }\n\n /** Release one explicit pin. Branch heads remain pinned until moved or deleted. */\n release(id: CheckpointId): boolean {\n if (!this.nodes.has(id)) return false\n const pins = this.explicitPins.get(id) ?? 0\n if (pins === 0) return false\n if (pins === 1) this.explicitPins.delete(id)\n else this.explicitPins.set(id, pins - 1)\n this.removeReference(id)\n this.collect(this.maxCheckpoints)\n return true\n }\n\n deleteBranch(branch: string): boolean {\n if (branch === \"main\") throw new RangeError(\"cannot delete main branch\")\n const previous = this.heads.get(branch)\n const deleted = this.heads.delete(branch)\n if (previous !== undefined) this.removeReference(previous)\n this.collect(this.maxCheckpoints)\n return deleted\n }\n\n /**\n * Deterministically discard oldest unpinned checkpoints. Collection is O(number removed):\n * commits never scan pinned nodes or the retained history. Parents are metadata rather than a\n * storage dependency, so a retained node remains usable after pruning.\n */\n gc(max = this.maxCheckpoints): CheckpointId[] {\n if (!Number.isSafeInteger(max) || max < 1)\n throw new RangeError(\"max must be a positive integer\")\n const removed: CheckpointId[] = []\n this.collect(max, removed)\n return removed\n }\n\n private collect(max: number, removed?: CheckpointId[]): void {\n while (this.nodes.size > max && this.evictable.size > 0) {\n const id = this.evictable.values().next().value as CheckpointId\n this.evictable.delete(id)\n this.nodes.delete(id)\n removed?.push(id)\n }\n }\n\n private moveHead(branch: string, id: CheckpointId): void {\n const previous = this.heads.get(branch)\n if (previous === id) return\n if (previous !== undefined) this.removeReference(previous)\n this.heads.set(branch, id)\n this.addReference(id)\n }\n\n private addReference(id: CheckpointId): void {\n this.references.set(id, (this.references.get(id) ?? 0) + 1)\n this.evictable.delete(id)\n }\n\n private removeReference(id: CheckpointId): void {\n const next = (this.references.get(id) ?? 0) - 1\n if (next > 0) this.references.set(id, next)\n else {\n this.references.delete(id)\n if (this.nodes.has(id)) this.evictable.add(id)\n }\n }\n\n private assertBranch(branch: string): void {\n if (!BRANCH_PATTERN.test(branch)) throw new RangeError(`branch must match ${BRANCH_PATTERN}`)\n }\n}\n", "/** Coarse classification of {@link SqliteError} for catch-site branching.\n *\n * New categories may be added in minor releases. Consumers that switch on\n * `category` must include a default case.\n */\nexport type ErrorCategory =\n | \"syntax\"\n | \"no_such_table\"\n | \"no_such_column\"\n | \"constraint_unique\"\n | \"constraint_primary\"\n | \"constraint_notnull\"\n | \"constraint_check\"\n | \"constraint_foreign\"\n | \"constraint\"\n | \"transaction\"\n | \"datatype_mismatch\"\n | \"unsupported\"\n | \"misuse\"\n | \"snapshot_version\"\n | \"other\"\n | (string & {});\n\n/**\n * Engine error. `name` is always `\"SqliteError\"`.\n *\n * `sqliteCode` and Node's conventional `code` property are always set (default\n * `\"SQLITE_ERROR\"` when no more specific code applies).\n *\n * @example\n * ```ts\n * import { Database, SqliteError } from \"@crvouga/mockingbird-service-sqlite\";\n *\n * const db = new Database();\n * try {\n * db.exec(\"SELECT * FROM missing\");\n * } catch (err) {\n * if (err instanceof SqliteError && err.category === \"no_such_table\") {\n * // handle\n * }\n * }\n * ```\n */\nexport class SqliteError extends Error {\n /** Coarse error class (constraint vs syntax vs missing object, \u2026). */\n readonly category: ErrorCategory;\n /** SQLite result-code name such as `SQLITE_CONSTRAINT_UNIQUE`. */\n readonly sqliteCode: string;\n /** Same value as {@link sqliteCode} (Node `err.code` convention). */\n readonly code: string;\n\n /**\n * @param message - Human-readable error text.\n * @param category - Coarse class; defaults to `\"other\"`.\n * @param sqliteCode - SQLite result-code name; defaults to `\"SQLITE_ERROR\"`.\n */\n constructor(message: string, category: ErrorCategory = \"other\", sqliteCode = \"SQLITE_ERROR\") {\n super(message);\n this.name = \"SqliteError\";\n this.category = category;\n this.sqliteCode = sqliteCode;\n this.code = sqliteCode;\n }\n}\n\nexport function unsupported(feature: string): never {\n throw new SqliteError(`Unsupported SQLite feature: ${feature}`, \"unsupported\");\n}\n\nexport class TriggerRaiseError extends SqliteError {\n readonly action: \"IGNORE\" | \"ABORT\" | \"FAIL\" | \"ROLLBACK\";\n\n constructor(action: \"IGNORE\" | \"ABORT\" | \"FAIL\" | \"ROLLBACK\", message?: string) {\n super(\n message ?? action,\n action === \"FAIL\" ? \"constraint\" : \"other\",\n action === \"FAIL\" ? \"SQLITE_CONSTRAINT\" : undefined,\n );\n this.action = action;\n }\n}\n", "/** SQLite 3.51 `sqlite3AtoF` (decimal text \u2192 IEEE754 double). */\n// biome-ignore-all lint/correctness/noPrecisionLoss: Dekker constants match SQLite C double literals\n\nconst U64_MASK = (1n << 64n) - 1n;\nconst LARGEST_UINT64 = U64_MASK;\n\nexport function dekkerMul2(rr: [number, number], y: number, yy: number): void {\n const buf = new ArrayBuffer(8);\n const view = new DataView(buf);\n view.setFloat64(0, rr[0], true);\n let m = view.getBigUint64(0, true) & 0xfffffffffc000000n;\n view.setBigUint64(0, m, true);\n const hx = view.getFloat64(0, true);\n const tx = rr[0] - hx;\n\n view.setFloat64(0, y, true);\n m = view.getBigUint64(0, true) & 0xfffffffffc000000n;\n view.setBigUint64(0, m, true);\n const hy = view.getFloat64(0, true);\n const ty = y - hy;\n\n const p = hx * hy;\n const q = hx * ty + tx * hy;\n const c = p + q;\n let cc = p - c + q + tx * ty;\n cc = rr[0] * yy + rr[1] * y + cc;\n rr[0] = c + cc;\n rr[1] = c - rr[0];\n rr[1] += cc;\n}\n\nfunction isDigit(ch: string | undefined): boolean {\n if (!ch) return false;\n const c = ch.charCodeAt(0);\n return c >= 48 && c <= 57;\n}\n\nfunction isSpace(ch: string | undefined): boolean {\n return ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\f\" || ch === \"\\v\";\n}\n\n/** Parse a decimal float text literal the way SQLite 3.51 does. */\nexport function sqliteAtoF(zIn: string): number {\n const zEnd = zIn.length;\n let z = 0;\n\n let sign = 1;\n let s = 0n;\n let d = 0;\n let esign = 1;\n let e = 0;\n\n while (z < zEnd && isSpace(zIn[z])) z++;\n if (z >= zEnd) return 0;\n\n if (zIn[z] === \"-\") {\n sign = -1;\n z++;\n } else if (zIn[z] === \"+\") {\n z++;\n }\n\n while (z < zEnd && isDigit(zIn[z])) {\n s = s * 10n + BigInt(zIn.charCodeAt(z) - 48);\n z++;\n if (s >= (LARGEST_UINT64 - 9n) / 10n) {\n while (z < zEnd && isDigit(zIn[z])) {\n z++;\n d++;\n }\n break;\n }\n }\n if (z >= zEnd) return finishAtoF(sign, s, e, d, esign);\n\n if (zIn[z] === \".\") {\n z++;\n while (z < zEnd && isDigit(zIn[z])) {\n if (s < (LARGEST_UINT64 - 9n) / 10n) {\n s = s * 10n + BigInt(zIn.charCodeAt(z) - 48);\n d--;\n }\n z++;\n }\n }\n if (z >= zEnd) return finishAtoF(sign, s, e, d, esign);\n\n if (zIn[z] === \"e\" || zIn[z] === \"E\") {\n z++;\n if (z >= zEnd) return finishAtoF(sign, s, e, d, esign);\n\n if (zIn[z] === \"-\") {\n esign = -1;\n z++;\n } else if (zIn[z] === \"+\") {\n z++;\n }\n\n while (z < zEnd && isDigit(zIn[z])) {\n e = e < 10000 ? e * 10 + (zIn.charCodeAt(z) - 48) : 10000;\n z++;\n }\n }\n\n while (z < zEnd && isSpace(zIn[z])) z++;\n return finishAtoF(sign, s, e, d, esign);\n}\n\nfunction finishAtoF(sign: number, s: bigint, e: number, d: number, esign: number): number {\n if (s === 0n) return sign < 0 ? -0 : 0;\n\n e = esign * e + d;\n\n while (e > 0 && s < (LARGEST_UINT64 - 0x7ffn) / 10n) {\n s *= 10n;\n e--;\n }\n while (e < 0 && s % 10n === 0n) {\n s /= 10n;\n e++;\n }\n\n const rr: [number, number] = [Number(s), 0];\n const maxSafeU64Double = 18446744073709549568.0;\n if (rr[0] <= maxSafeU64Double) {\n const s2 = BigInt(Math.trunc(rr[0]));\n rr[1] = s >= s2 ? Number(s - s2) : -Number(s2 - s);\n } else {\n rr[1] = 0;\n }\n\n if (e > 0) {\n while (e >= 100) {\n e -= 100;\n dekkerMul2(rr, 1.0e100, -1.5902891109759918046e83);\n }\n while (e >= 10) {\n e -= 10;\n dekkerMul2(rr, 1.0e10, 0.0);\n }\n while (e >= 1) {\n e -= 1;\n dekkerMul2(rr, 1.0e1, 0.0);\n }\n } else {\n while (e <= -100) {\n e += 100;\n dekkerMul2(rr, 1.0e-100, -1.99918998026028836196e-117);\n }\n while (e <= -10) {\n e += 10;\n dekkerMul2(rr, 1.0e-10, -3.6432197315497741579e-27);\n }\n while (e <= -1) {\n e += 1;\n dekkerMul2(rr, 1.0e-1, -5.5511151231257827021e-18);\n }\n }\n\n let result = rr[0] + rr[1];\n if (Number.isNaN(result)) result = 1e300 * 1e300;\n return sign < 0 ? -result : result;\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { sqliteAtoF } from \"../types/sqlite-atof.ts\";\n\n/** Lexer token kind: keywords, literals, operators, and punctuation. */\nexport type TokenKind =\n | \"EOF\"\n | \"IDENT\"\n | \"STRING\"\n | \"NUMBER\"\n | \"BLOB\"\n | \"PARAM_POS\"\n | \"PARAM_NAMED\"\n | \"DOT\"\n | \"COMMA\"\n | \"SEMI\"\n | \"LPAREN\"\n | \"RPAREN\"\n | \"PLUS\"\n | \"MINUS\"\n | \"STAR\"\n | \"SLASH\"\n | \"PERCENT\"\n | \"EQ\"\n | \"EQEQ\"\n | \"NE\"\n | \"LT\"\n | \"LE\"\n | \"GT\"\n | \"GE\"\n | \"CONCAT\"\n | \"AMP\"\n | \"PIPE\"\n | \"LSHIFT\"\n | \"RSHIFT\"\n | \"JSON_ARROW\"\n | \"JSON_ARROW2\"\n | \"TILDE\"\n // keywords\n | \"ABORT\"\n | \"ACTION\"\n | \"ADD\"\n | \"AFTER\"\n | \"ALL\"\n | \"ALTER\"\n | \"ANALYZE\"\n | \"AND\"\n | \"AS\"\n | \"ASC\"\n | \"ATTACH\"\n | \"AUTOINCREMENT\"\n | \"BEFORE\"\n | \"BEGIN\"\n | \"BETWEEN\"\n | \"BY\"\n | \"CASCADE\"\n | \"CASE\"\n | \"CAST\"\n | \"CHECK\"\n | \"COLLATE\"\n | \"COLUMN\"\n | \"COMMIT\"\n | \"CONFLICT\"\n | \"CONSTRAINT\"\n | \"CREATE\"\n | \"CROSS\"\n | \"CURRENT\"\n | \"CURRENT_DATE\"\n | \"CURRENT_TIME\"\n | \"CURRENT_TIMESTAMP\"\n | \"DATABASE\"\n | \"DEFAULT\"\n | \"DEFERRABLE\"\n | \"DEFERRED\"\n | \"DELETE\"\n | \"DESC\"\n | \"DETACH\"\n | \"DISTINCT\"\n | \"DO\"\n | \"DROP\"\n | \"EACH\"\n | \"ELSE\"\n | \"END\"\n | \"ESCAPE\"\n | \"EXCEPT\"\n | \"EXCLUDE\"\n | \"EXCLUSIVE\"\n | \"EXISTS\"\n | \"EXPLAIN\"\n | \"FAIL\"\n | \"FILTER\"\n | \"FIRST\"\n | \"FOLLOWING\"\n | \"FOR\"\n | \"FOREIGN\"\n | \"FROM\"\n | \"FULL\"\n | \"FALSE\"\n | \"GENERATED\"\n | \"GLOB\"\n | \"GROUP\"\n | \"GROUPS\"\n | \"HAVING\"\n | \"IF\"\n | \"IGNORE\"\n | \"IMMEDIATE\"\n | \"IN\"\n | \"INDEX\"\n | \"INDEXED\"\n | \"INITIALLY\"\n | \"INNER\"\n | \"INSERT\"\n | \"INSTEAD\"\n | \"INTERSECT\"\n | \"INTO\"\n | \"IS\"\n | \"ISNULL\"\n | \"JOIN\"\n | \"KEY\"\n | \"LAST\"\n | \"LEFT\"\n | \"LIKE\"\n | \"LIMIT\"\n | \"MATCH\"\n | \"MATERIALIZED\"\n | \"NATURAL\"\n | \"NO\"\n | \"NOT\"\n | \"NOTHING\"\n | \"NOTNULL\"\n | \"NULL\"\n | \"NULLS\"\n | \"OF\"\n | \"OFFSET\"\n | \"ON\"\n | \"OR\"\n | \"ORDER\"\n | \"OTHERS\"\n | \"OUTER\"\n | \"OVER\"\n | \"PARTITION\"\n | \"PLAN\"\n | \"PRAGMA\"\n | \"PRECEDING\"\n | \"PRIMARY\"\n | \"QUERY\"\n | \"RAISE\"\n | \"RANGE\"\n | \"RECURSIVE\"\n | \"REFERENCES\"\n | \"REGEXP\"\n | \"REINDEX\"\n | \"RELEASE\"\n | \"RENAME\"\n | \"REPLACE\"\n | \"RESTRICT\"\n | \"RESPECT\"\n | \"RETURNING\"\n | \"RIGHT\"\n | \"ROLLBACK\"\n | \"ROW\"\n | \"ROWS\"\n | \"SAVEPOINT\"\n | \"SELECT\"\n | \"SET\"\n | \"TABLE\"\n | \"TEMP\"\n | \"TEMPORARY\"\n | \"THEN\"\n | \"TIES\"\n | \"TO\"\n | \"TRANSACTION\"\n | \"TRIGGER\"\n | \"TRUE\"\n | \"UNBOUNDED\"\n | \"UNION\"\n | \"UNIQUE\"\n | \"UPDATE\"\n | \"USING\"\n | \"VACUUM\"\n | \"VALUES\"\n | \"VIEW\"\n | \"VIRTUAL\"\n | \"WHEN\"\n | \"WHERE\"\n | \"WINDOW\"\n | \"WITH\"\n | \"WITHOUT\";\n\n/** A single lexer token from {@link tokenize}. */\nexport interface Token {\n kind: TokenKind;\n value: string;\n /** For NUMBER/BLOB/STRING, the parsed value */\n literal?: string | number | bigint | Uint8Array | null;\n /** True when a NUMBER token used float/scientific syntax. */\n forceReal?: boolean;\n index?: number; // for PARAM_POS\n line: number;\n column: number;\n start: number;\n end: number;\n}\n\nconst KEYWORDS: Record<string, TokenKind> = {\n ABORT: \"ABORT\",\n ACTION: \"ACTION\",\n ADD: \"ADD\",\n AFTER: \"AFTER\",\n ALL: \"ALL\",\n ALTER: \"ALTER\",\n ANALYZE: \"ANALYZE\",\n AND: \"AND\",\n AS: \"AS\",\n ASC: \"ASC\",\n ATTACH: \"ATTACH\",\n AUTOINCREMENT: \"AUTOINCREMENT\",\n BEFORE: \"BEFORE\",\n BEGIN: \"BEGIN\",\n BETWEEN: \"BETWEEN\",\n BY: \"BY\",\n CASCADE: \"CASCADE\",\n CASE: \"CASE\",\n CAST: \"CAST\",\n CHECK: \"CHECK\",\n COLLATE: \"COLLATE\",\n COLUMN: \"COLUMN\",\n COMMIT: \"COMMIT\",\n CONFLICT: \"CONFLICT\",\n CONSTRAINT: \"CONSTRAINT\",\n CREATE: \"CREATE\",\n CROSS: \"CROSS\",\n CURRENT: \"CURRENT\",\n CURRENT_DATE: \"CURRENT_DATE\",\n CURRENT_TIME: \"CURRENT_TIME\",\n CURRENT_TIMESTAMP: \"CURRENT_TIMESTAMP\",\n DATABASE: \"DATABASE\",\n DEFAULT: \"DEFAULT\",\n DEFERRABLE: \"DEFERRABLE\",\n DEFERRED: \"DEFERRED\",\n DELETE: \"DELETE\",\n DESC: \"DESC\",\n DETACH: \"DETACH\",\n DISTINCT: \"DISTINCT\",\n DO: \"DO\",\n DROP: \"DROP\",\n EACH: \"EACH\",\n ELSE: \"ELSE\",\n END: \"END\",\n ESCAPE: \"ESCAPE\",\n EXCEPT: \"EXCEPT\",\n EXCLUDE: \"EXCLUDE\",\n EXCLUSIVE: \"EXCLUSIVE\",\n EXISTS: \"EXISTS\",\n EXPLAIN: \"EXPLAIN\",\n FAIL: \"FAIL\",\n FILTER: \"FILTER\",\n FIRST: \"FIRST\",\n FOLLOWING: \"FOLLOWING\",\n FOR: \"FOR\",\n FOREIGN: \"FOREIGN\",\n FROM: \"FROM\",\n FULL: \"FULL\",\n FALSE: \"FALSE\",\n GENERATED: \"GENERATED\",\n GLOB: \"GLOB\",\n GROUP: \"GROUP\",\n GROUPS: \"GROUPS\",\n HAVING: \"HAVING\",\n IF: \"IF\",\n IGNORE: \"IGNORE\",\n IMMEDIATE: \"IMMEDIATE\",\n IN: \"IN\",\n INDEX: \"INDEX\",\n INDEXED: \"INDEXED\",\n INITIALLY: \"INITIALLY\",\n INNER: \"INNER\",\n INSERT: \"INSERT\",\n INSTEAD: \"INSTEAD\",\n INTERSECT: \"INTERSECT\",\n INTO: \"INTO\",\n IS: \"IS\",\n ISNULL: \"ISNULL\",\n JOIN: \"JOIN\",\n KEY: \"KEY\",\n LAST: \"LAST\",\n LEFT: \"LEFT\",\n LIKE: \"LIKE\",\n LIMIT: \"LIMIT\",\n MATCH: \"MATCH\",\n MATERIALIZED: \"MATERIALIZED\",\n NATURAL: \"NATURAL\",\n NO: \"NO\",\n NOT: \"NOT\",\n NOTHING: \"NOTHING\",\n NOTNULL: \"NOTNULL\",\n NULL: \"NULL\",\n NULLS: \"NULLS\",\n OF: \"OF\",\n OFFSET: \"OFFSET\",\n ON: \"ON\",\n OR: \"OR\",\n ORDER: \"ORDER\",\n OTHERS: \"OTHERS\",\n OUTER: \"OUTER\",\n OVER: \"OVER\",\n PARTITION: \"PARTITION\",\n PLAN: \"PLAN\",\n PRAGMA: \"PRAGMA\",\n PRECEDING: \"PRECEDING\",\n PRIMARY: \"PRIMARY\",\n QUERY: \"QUERY\",\n RAISE: \"RAISE\",\n RANGE: \"RANGE\",\n RECURSIVE: \"RECURSIVE\",\n REFERENCES: \"REFERENCES\",\n REGEXP: \"REGEXP\",\n REINDEX: \"REINDEX\",\n RELEASE: \"RELEASE\",\n RENAME: \"RENAME\",\n REPLACE: \"REPLACE\",\n RESTRICT: \"RESTRICT\",\n RESPECT: \"RESPECT\",\n RETURNING: \"RETURNING\",\n RIGHT: \"RIGHT\",\n ROLLBACK: \"ROLLBACK\",\n ROW: \"ROW\",\n ROWS: \"ROWS\",\n SAVEPOINT: \"SAVEPOINT\",\n SELECT: \"SELECT\",\n SET: \"SET\",\n TABLE: \"TABLE\",\n TEMP: \"TEMP\",\n TEMPORARY: \"TEMPORARY\",\n THEN: \"THEN\",\n TIES: \"TIES\",\n TO: \"TO\",\n TRANSACTION: \"TRANSACTION\",\n TRIGGER: \"TRIGGER\",\n TRUE: \"TRUE\",\n UNBOUNDED: \"UNBOUNDED\",\n UNION: \"UNION\",\n UNIQUE: \"UNIQUE\",\n UPDATE: \"UPDATE\",\n USING: \"USING\",\n VACUUM: \"VACUUM\",\n VALUES: \"VALUES\",\n VIEW: \"VIEW\",\n VIRTUAL: \"VIRTUAL\",\n WHEN: \"WHEN\",\n WHERE: \"WHERE\",\n WINDOW: \"WINDOW\",\n WITH: \"WITH\",\n WITHOUT: \"WITHOUT\",\n};\n\n/**\n * Lex `input` into SQLite tokens (keywords, literals, operators, parameters).\n *\n * @param input - SQL source text.\n */\nexport function tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n let line = 1;\n let column = 1;\n let nextParameterIndex = 1;\n const namedParameterIndexes = new Map<string, number>();\n\n const peek = (n = 0) => input[i + n] ?? \"\";\n const advance = () => {\n const ch = input[i++] ?? \"\";\n if (ch === \"\\n\") {\n line++;\n column = 1;\n } else {\n column++;\n }\n return ch;\n };\n\n const push = (\n kind: TokenKind,\n start: number,\n startLine: number,\n startCol: number,\n value: string,\n extra?: Partial<Token>,\n ) => {\n tokens.push({\n kind,\n value,\n line: startLine,\n column: startCol,\n start,\n end: i,\n ...extra,\n });\n };\n\n while (i < input.length) {\n const start = i;\n const startLine = line;\n const startCol = column;\n const ch = peek();\n\n // whitespace\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\f\") {\n advance();\n continue;\n }\n\n // comments\n if (ch === \"-\" && peek(1) === \"-\") {\n while (i < input.length && peek() !== \"\\n\") advance();\n continue;\n }\n if (ch === \"/\" && peek(1) === \"*\") {\n advance();\n advance();\n while (i < input.length && !(peek() === \"*\" && peek(1) === \"/\")) advance();\n if (i >= input.length) throw new SqliteError(\"unterminated comment\", \"syntax\");\n advance();\n advance();\n continue;\n }\n\n // string\n if (ch === \"'\") {\n advance();\n let s = \"\";\n while (i < input.length) {\n const c = advance();\n if (c === \"'\") {\n if (peek() === \"'\") {\n advance();\n s += \"'\";\n continue;\n }\n push(\"STRING\", start, startLine, startCol, s, { literal: s });\n break;\n }\n s += c;\n }\n if (tokens.at(-1)?.kind !== \"STRING\" || tokens.at(-1)?.start !== start) {\n throw new SqliteError(\"unrecognized token: incomplete string literal\", \"syntax\");\n }\n continue;\n }\n\n // quoted identifier\n if (ch === '\"' || ch === \"[\" || ch === \"`\") {\n const closer = ch === \"[\" ? \"]\" : ch;\n advance();\n let s = \"\";\n while (i < input.length) {\n const c = advance();\n if (c === closer) {\n if (ch === '\"' && peek() === '\"') {\n advance();\n s += '\"';\n continue;\n }\n push(\"IDENT\", start, startLine, startCol, s);\n break;\n }\n s += c;\n }\n if (tokens.at(-1)?.kind !== \"IDENT\" || tokens.at(-1)?.start !== start) {\n throw new SqliteError(\"unrecognized token: incomplete identifier\", \"syntax\");\n }\n continue;\n }\n\n // blob X'ABCD'\n if ((ch === \"x\" || ch === \"X\") && peek(1) === \"'\") {\n advance();\n advance();\n let hex = \"\";\n while (i < input.length) {\n const c = advance();\n if (c === \"'\") break;\n if (!/[0-9a-fA-F]/.test(c)) {\n throw new SqliteError(\"unrecognized token: invalid blob literal\", \"syntax\");\n }\n hex += c;\n }\n if (hex.length % 2 !== 0) {\n throw new SqliteError(\"unrecognized token: invalid blob literal\", \"syntax\");\n }\n const bytes = new Uint8Array(hex.length / 2);\n for (let j = 0; j < bytes.length; j++) {\n bytes[j] = Number.parseInt(hex.slice(j * 2, j * 2 + 2), 16);\n }\n push(\"BLOB\", start, startLine, startCol, hex, { literal: bytes });\n continue;\n }\n\n // parameters\n if (ch === \"?\") {\n advance();\n let num = \"\";\n while (/[0-9]/.test(peek())) num += advance();\n const index = num ? Number(num) : nextParameterIndex;\n nextParameterIndex = Math.max(nextParameterIndex, index + 1);\n push(\"PARAM_POS\", start, startLine, startCol, num ? `?${num}` : \"?\", { index });\n continue;\n }\n if (ch === \":\" || ch === \"@\" || ch === \"$\") {\n const prefix = advance();\n let name = \"\";\n while (/[A-Za-z0-9_]/.test(peek())) name += advance();\n if (!name) throw new SqliteError(\"unrecognized token near parameter\", \"syntax\");\n const parameter = `${prefix}${name}`;\n if (!namedParameterIndexes.has(parameter.toLowerCase())) {\n namedParameterIndexes.set(parameter.toLowerCase(), nextParameterIndex++);\n }\n push(\"PARAM_NAMED\", start, startLine, startCol, parameter);\n continue;\n }\n\n // numbers\n if (/[0-9]/.test(ch) || (ch === \".\" && /[0-9]/.test(peek(1)))) {\n let raw = \"\";\n let isFloat = false;\n if (ch === \".\") {\n isFloat = true;\n raw += advance();\n while (/[0-9]/.test(peek())) raw += advance();\n } else {\n while (/[0-9]/.test(peek())) raw += advance();\n if (peek() === \".\") {\n isFloat = true;\n raw += advance();\n while (/[0-9]/.test(peek())) raw += advance();\n }\n }\n if (peek() === \"e\" || peek() === \"E\") {\n isFloat = true;\n raw += advance();\n if (peek() === \"+\" || peek() === \"-\") raw += advance();\n if (!/[0-9]/.test(peek())) throw new SqliteError(\"unrecognized token near number\", \"syntax\");\n while (/[0-9]/.test(peek())) raw += advance();\n }\n let literal: number | bigint;\n if (!isFloat && raw.length > 15) {\n try {\n literal = BigInt(raw);\n } catch {\n literal = Number(raw);\n }\n } else if (!isFloat) {\n const n = Number(raw);\n literal = Number.isSafeInteger(n) ? n : BigInt(raw);\n } else {\n literal = sqliteAtoF(raw);\n }\n push(\"NUMBER\", start, startLine, startCol, raw, { literal, forceReal: isFloat || undefined });\n continue;\n }\n\n // operators / punctuation\n const two = ch + peek(1);\n const three = two + peek(2);\n if (three === \"<<\" || three === \">>\") {\n // not three char; handle below\n }\n if (two === \"||\") {\n advance();\n advance();\n push(\"CONCAT\", start, startLine, startCol, \"||\");\n continue;\n }\n if (three === \"->>\") {\n advance();\n advance();\n advance();\n push(\"JSON_ARROW2\", start, startLine, startCol, \"->>\");\n continue;\n }\n if (two === \"->\") {\n advance();\n advance();\n push(\"JSON_ARROW\", start, startLine, startCol, \"->\");\n continue;\n }\n if (two === \"<<\") {\n advance();\n advance();\n push(\"LSHIFT\", start, startLine, startCol, \"<<\");\n continue;\n }\n if (two === \">>\") {\n advance();\n advance();\n push(\"RSHIFT\", start, startLine, startCol, \">>\");\n continue;\n }\n if (two === \"==\") {\n advance();\n advance();\n push(\"EQEQ\", start, startLine, startCol, \"==\");\n continue;\n }\n if (two === \"!=\" || two === \"<>\") {\n advance();\n advance();\n push(\"NE\", start, startLine, startCol, two);\n continue;\n }\n if (two === \"<=\") {\n advance();\n advance();\n push(\"LE\", start, startLine, startCol, \"<=\");\n continue;\n }\n if (two === \">=\") {\n advance();\n advance();\n push(\"GE\", start, startLine, startCol, \">=\");\n continue;\n }\n\n const singles: Record<string, TokenKind> = {\n \".\": \"DOT\",\n \",\": \"COMMA\",\n \";\": \"SEMI\",\n \"(\": \"LPAREN\",\n \")\": \"RPAREN\",\n \"+\": \"PLUS\",\n \"-\": \"MINUS\",\n \"*\": \"STAR\",\n \"/\": \"SLASH\",\n \"%\": \"PERCENT\",\n \"=\": \"EQ\",\n \"<\": \"LT\",\n \">\": \"GT\",\n \"&\": \"AMP\",\n \"|\": \"PIPE\",\n \"~\": \"TILDE\",\n };\n if (singles[ch]) {\n advance();\n push(singles[ch]!, start, startLine, startCol, ch);\n continue;\n }\n\n // identifier / keyword\n if (/[A-Za-z_]/.test(ch)) {\n let s = \"\";\n while (/[A-Za-z0-9_$]/.test(peek())) s += advance();\n const upper = s.toUpperCase();\n const kw = KEYWORDS[upper];\n if (kw) push(kw, start, startLine, startCol, s);\n else push(\"IDENT\", start, startLine, startCol, s);\n continue;\n }\n\n throw new SqliteError(`unrecognized token: \"${ch}\"`, \"syntax\");\n }\n\n tokens.push({\n kind: \"EOF\",\n value: \"\",\n line,\n column,\n start: i,\n end: i,\n });\n return tokens;\n}\n\nexport function isKeyword(kind: TokenKind): boolean {\n return (\n kind !== \"EOF\" &&\n kind !== \"IDENT\" &&\n kind !== \"STRING\" &&\n kind !== \"NUMBER\" &&\n kind !== \"BLOB\" &&\n kind !== \"PARAM_POS\" &&\n kind !== \"PARAM_NAMED\" &&\n ![\n \"DOT\",\n \"COMMA\",\n \"SEMI\",\n \"LPAREN\",\n \"RPAREN\",\n \"PLUS\",\n \"MINUS\",\n \"STAR\",\n \"SLASH\",\n \"PERCENT\",\n \"EQ\",\n \"EQEQ\",\n \"NE\",\n \"LT\",\n \"LE\",\n \"GT\",\n \"GE\",\n \"CONCAT\",\n \"AMP\",\n \"PIPE\",\n \"LSHIFT\",\n \"RSHIFT\",\n \"JSON_ARROW\",\n \"JSON_ARROW2\",\n \"TILDE\",\n ].includes(kind)\n );\n}\n", "import type {\n AlterTableStmt,\n AttachStmt,\n BeginStmt,\n BinaryOp,\n CaseExpr,\n ColumnConstraint,\n ColumnDef,\n CommitStmt,\n CompoundTail,\n ConflictAction,\n CreateIndexStmt,\n CreateTableStmt,\n CreateTriggerStmt,\n CreateViewStmt,\n CreateVirtualTableStmt,\n Cte,\n DeleteStmt,\n DetachStmt,\n DropIndexStmt,\n DropTableStmt,\n DropTriggerStmt,\n DropViewStmt,\n Expr,\n FkAction,\n FkMatch,\n FrameBound,\n FrameSpec,\n FromItem,\n IndexedColumn,\n InExpr,\n InsertStmt,\n JoinFrom,\n LikeExpr,\n LimitClause,\n OrderByItem,\n PragmaStmt,\n ReleaseStmt,\n ResultColumn,\n RollbackStmt,\n SavepointStmt,\n SelectStmt,\n SetItem,\n Statement,\n TableConstraint,\n TableRef,\n UpdateStmt,\n UpsertClause,\n WindowSpec,\n WithClause,\n} from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { Token, TokenKind } from \"../lexer/tokenize.ts\";\n\n/** Keywords that may appear as identifiers via {@link Parser.parseIdent}. */\nconst IDENT_KEYWORDS: ReadonlySet<TokenKind> = new Set<TokenKind>([\n \"ABORT\",\n \"ACTION\",\n \"ADD\",\n \"AFTER\",\n \"ALL\",\n \"ALTER\",\n \"ANALYZE\",\n \"AND\",\n \"AS\",\n \"ASC\",\n \"ATTACH\",\n \"AUTOINCREMENT\",\n \"BEFORE\",\n \"BEGIN\",\n \"BETWEEN\",\n \"BY\",\n \"CASCADE\",\n \"CASE\",\n \"CAST\",\n \"CHECK\",\n \"COLLATE\",\n \"COLUMN\",\n \"COMMIT\",\n \"CONFLICT\",\n \"CONSTRAINT\",\n \"CREATE\",\n \"CROSS\",\n \"CURRENT\",\n \"CURRENT_DATE\",\n \"CURRENT_TIME\",\n \"CURRENT_TIMESTAMP\",\n \"DATABASE\",\n \"DEFAULT\",\n \"DEFERRABLE\",\n \"DEFERRED\",\n \"DELETE\",\n \"DESC\",\n \"DETACH\",\n \"DISTINCT\",\n \"DO\",\n \"DROP\",\n \"EACH\",\n \"ELSE\",\n \"END\",\n \"ESCAPE\",\n \"EXCEPT\",\n \"EXCLUDE\",\n \"EXCLUSIVE\",\n \"EXISTS\",\n \"EXPLAIN\",\n \"FAIL\",\n \"FILTER\",\n \"FIRST\",\n \"FOLLOWING\",\n \"FOR\",\n \"FOREIGN\",\n \"FROM\",\n \"FULL\",\n \"FALSE\",\n \"GENERATED\",\n \"GLOB\",\n \"GROUP\",\n \"GROUPS\",\n \"HAVING\",\n \"IF\",\n \"IGNORE\",\n \"IMMEDIATE\",\n \"IN\",\n \"INDEX\",\n \"INDEXED\",\n \"INITIALLY\",\n \"INNER\",\n \"INSERT\",\n \"INSTEAD\",\n \"INTERSECT\",\n \"INTO\",\n \"IS\",\n \"ISNULL\",\n \"JOIN\",\n \"KEY\",\n \"LAST\",\n \"LEFT\",\n \"LIKE\",\n \"LIMIT\",\n \"MATCH\",\n \"MATERIALIZED\",\n \"NATURAL\",\n \"NO\",\n \"NOT\",\n \"NOTHING\",\n \"NOTNULL\",\n \"NULL\",\n \"NULLS\",\n \"OF\",\n \"OFFSET\",\n \"ON\",\n \"OR\",\n \"ORDER\",\n \"OTHERS\",\n \"OUTER\",\n \"OVER\",\n \"PARTITION\",\n \"PLAN\",\n \"PRAGMA\",\n \"PRECEDING\",\n \"PRIMARY\",\n \"QUERY\",\n \"RAISE\",\n \"RANGE\",\n \"RECURSIVE\",\n \"REFERENCES\",\n \"REGEXP\",\n \"REINDEX\",\n \"RELEASE\",\n \"RENAME\",\n \"REPLACE\",\n \"RESTRICT\",\n \"RESPECT\",\n \"RETURNING\",\n \"RIGHT\",\n \"ROLLBACK\",\n \"ROW\",\n \"ROWS\",\n \"SAVEPOINT\",\n \"SELECT\",\n \"SET\",\n \"TABLE\",\n \"TEMP\",\n \"TEMPORARY\",\n \"THEN\",\n \"TIES\",\n \"TO\",\n \"TRANSACTION\",\n \"TRIGGER\",\n \"TRUE\",\n \"UNBOUNDED\",\n \"UNION\",\n \"UNIQUE\",\n \"UPDATE\",\n \"USING\",\n \"VACUUM\",\n \"VALUES\",\n \"VIEW\",\n \"VIRTUAL\",\n \"WHEN\",\n \"WHERE\",\n \"WINDOW\",\n \"WITH\",\n \"WITHOUT\",\n]);\n\nconst AGGREGATE_FUNCTIONS = new Set([\n \"AVG\",\n \"COUNT\",\n \"GROUP_CONCAT\",\n \"STRING_AGG\",\n \"MAX\",\n \"MIN\",\n \"SUM\",\n \"TOTAL\",\n \"JSON_GROUP_ARRAY\",\n \"JSON_GROUP_OBJECT\",\n \"JSONB_GROUP_ARRAY\",\n \"JSONB_GROUP_OBJECT\",\n]);\n\n/** SQLite binary operator precedence (higher binds tighter). */\nconst PREC = {\n OR: 10,\n AND: 20,\n NOT: 25,\n IS_IN_LIKE: 30,\n COMPARE: 40,\n BIT_OR: 45,\n BIT_AND: 46,\n SHIFT: 47,\n ADD: 50,\n MUL: 60,\n CONCAT: 70,\n JSON_ARROW: 80,\n} as const;\n\nexport interface ParsedUnit {\n statement: Statement;\n /** Source slice for this statement (no trailing semicolon); used for sqlite_master.sql. */\n sql: string;\n}\n\nexport class Parser {\n private pos = 0;\n\n constructor(\n private readonly tokens: Token[],\n private readonly source = \"\",\n ) {}\n\n private current(): Token {\n return this.tokens[this.pos] ?? this.tokens[this.tokens.length - 1]!;\n }\n\n private peek(offset = 1): Token {\n return this.tokens[this.pos + offset] ?? this.tokens[this.tokens.length - 1]!;\n }\n\n private at(kind: TokenKind): boolean {\n return this.current().kind === kind;\n }\n\n private check(...kinds: TokenKind[]): boolean {\n return kinds.includes(this.current().kind);\n }\n\n private advance(): Token {\n const t = this.current();\n if (t.kind !== \"EOF\") this.pos++;\n return t;\n }\n\n private match(...kinds: TokenKind[]): boolean {\n if (this.check(...kinds)) {\n this.advance();\n return true;\n }\n return false;\n }\n\n private expect(kind: TokenKind, message?: string): Token {\n if (!this.at(kind)) {\n this.syntaxError(message ?? `expected ${kind}, got ${this.current().kind}`);\n }\n return this.advance();\n }\n\n syntaxError(message: string): never {\n const t = this.current();\n throw new SqliteError(`${message} at ${t.line}:${t.column}`, \"syntax\");\n }\n\n /** Accept IDENT or keyword tokens as identifier names. */\n parseIdent(): string {\n const t = this.current();\n if (t.kind === \"IDENT\") {\n this.advance();\n return t.value;\n }\n if (IDENT_KEYWORDS.has(t.kind)) {\n this.advance();\n return t.value;\n }\n this.syntaxError(\"expected identifier\");\n }\n\n private parseQualifiedTableName(): { schema: string | null; name: string } {\n const first = this.parseIdent();\n if (this.match(\"DOT\")) {\n const second = this.parseIdent();\n return { schema: first, name: second };\n }\n return { schema: null, name: first };\n }\n\n private parseTableName(): string {\n const qname = this.parseQualifiedTableName();\n return qname.schema ? `${qname.schema}.${qname.name}` : qname.name;\n }\n\n private parseAttachStmt(): AttachStmt {\n this.expect(\"ATTACH\");\n this.match(\"DATABASE\");\n const filename = this.parseExpr();\n this.expect(\"AS\");\n const schema = this.parseIdent();\n return { type: \"attach\", filename, schema };\n }\n\n private parseDetachStmt(): DetachStmt {\n this.expect(\"DETACH\");\n this.match(\"DATABASE\");\n const schema = this.parseIdent();\n return { type: \"detach\", schema };\n }\n\n private optionalAlias(): string | null {\n if (this.match(\"AS\")) return this.parseIdent();\n // Implicit aliases use only non-keyword IDENT tokens to avoid swallowing clause keywords.\n if (this.current().kind === \"IDENT\") {\n return this.parseIdent();\n }\n return null;\n }\n\n // \u2500\u2500 Statements \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n parseStatements(): Statement[] {\n return this.parseUnits().map((unit) => unit.statement);\n }\n\n /** Parse statements with per-statement source slices for catalog `sql` text. */\n parseUnits(): ParsedUnit[] {\n const units: ParsedUnit[] = [];\n while (!this.at(\"EOF\")) {\n if (this.match(\"SEMI\")) continue;\n const start = this.current().start;\n const statement = this.parseStatement();\n const end = this.pos > 0 ? this.tokens[this.pos - 1]!.end : this.current().end;\n this.match(\"SEMI\");\n const sql = this.source ? this.source.slice(start, end).trimEnd() : \"\";\n units.push({ statement, sql });\n }\n return units;\n }\n\n parseStatement(): Statement {\n if (this.match(\"EXPLAIN\")) {\n let queryPlan = false;\n if (this.match(\"QUERY\")) {\n this.expect(\"PLAN\");\n queryPlan = true;\n }\n const stmt = this.parseStatement();\n return { type: \"explain\", queryPlan, statement: stmt };\n }\n\n if (this.at(\"WITH\")) {\n const withClause = this.parseWithClause();\n if (this.at(\"SELECT\")) return this.parseSelectStmt(withClause);\n if (this.at(\"INSERT\") || this.at(\"REPLACE\")) return this.parseInsertStmt(withClause);\n if (this.at(\"UPDATE\")) return this.parseUpdateStmt(withClause);\n if (this.at(\"DELETE\")) return this.parseDeleteStmt(withClause);\n this.syntaxError(\"expected SELECT, INSERT, UPDATE, or DELETE after WITH clause\");\n }\n if (this.at(\"SELECT\")) return this.parseSelectStmt();\n\n if (this.at(\"INSERT\") || this.at(\"REPLACE\")) {\n return this.parseInsertStmt();\n }\n if (this.at(\"UPDATE\")) return this.parseUpdateStmt();\n if (this.at(\"DELETE\")) return this.parseDeleteStmt();\n\n if (this.at(\"CREATE\")) return this.parseCreateStmt();\n if (this.at(\"DROP\")) return this.parseDropStmt();\n if (this.at(\"ALTER\")) return this.parseAlterTableStmt();\n\n if (this.at(\"BEGIN\")) return this.parseBeginStmt();\n if (this.check(\"COMMIT\", \"END\")) return this.parseCommitStmt();\n if (this.at(\"ROLLBACK\")) return this.parseRollbackStmt();\n if (this.at(\"SAVEPOINT\")) return this.parseSavepointStmt();\n if (this.at(\"RELEASE\")) return this.parseReleaseStmt();\n if (this.at(\"PRAGMA\")) return this.parsePragmaStmt();\n\n if (this.at(\"ATTACH\")) return this.parseAttachStmt();\n if (this.at(\"DETACH\")) return this.parseDetachStmt();\n\n if (this.at(\"ANALYZE\")) return this.parseAnalyzeStmt();\n if (this.at(\"REINDEX\")) return this.parseReindexStmt();\n if (this.at(\"VACUUM\")) return this.parseVacuumStmt();\n\n this.syntaxError(`unexpected token ${this.current().kind}`);\n }\n\n private parseAnalyzeStmt(): import(\"../ast/nodes.ts\").AnalyzeStmt {\n this.expect(\"ANALYZE\");\n if (this.at(\"SEMI\") || this.at(\"EOF\")) return { type: \"analyze\", schema: null, name: null };\n const first = this.parseIdent();\n if (this.match(\"DOT\")) {\n return { type: \"analyze\", schema: first, name: this.parseIdent() };\n }\n return { type: \"analyze\", schema: null, name: first };\n }\n\n private parseReindexStmt(): import(\"../ast/nodes.ts\").ReindexStmt {\n this.expect(\"REINDEX\");\n if (this.at(\"SEMI\") || this.at(\"EOF\")) return { type: \"reindex\", schema: null, name: null };\n const first = this.parseIdent();\n if (this.match(\"DOT\")) {\n return { type: \"reindex\", schema: first, name: this.parseIdent() };\n }\n return { type: \"reindex\", schema: null, name: first };\n }\n\n private parseVacuumStmt(): import(\"../ast/nodes.ts\").VacuumStmt {\n this.expect(\"VACUUM\");\n let schema: string | null = null;\n if (this.at(\"IDENT\") || this.at(\"STRING\")) {\n // VACUUM schema_name \u2014 but INTO starts with keyword\n if (!this.at(\"INTO\")) schema = this.parseIdent();\n }\n let into: string | null = null;\n if (this.match(\"INTO\")) {\n into = this.at(\"STRING\") ? String(this.advance().value) : this.parseIdent();\n }\n return { type: \"vacuum\", schema, into };\n }\n\n private parseWithClause(): WithClause {\n this.expect(\"WITH\");\n const recursive = this.match(\"RECURSIVE\");\n const ctes: Cte[] = [];\n do {\n const name = this.parseIdent();\n let columns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n columns = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n this.expect(\"AS\");\n let materialized: Cte[\"materialized\"] = null;\n if (this.match(\"NOT\")) {\n this.expect(\"MATERIALIZED\", \"expected MATERIALIZED after NOT\");\n materialized = \"not_materialized\";\n } else if (this.match(\"MATERIALIZED\")) materialized = \"materialized\";\n this.expect(\"LPAREN\");\n const select = this.at(\"VALUES\")\n ? this.parseValuesAsSelect()\n : this.at(\"WITH\")\n ? this.parseSelectStmt()\n : this.parseSelectCore();\n this.expect(\"RPAREN\");\n ctes.push({ name, columns, materialized, select });\n } while (this.match(\"COMMA\"));\n return { recursive, ctes };\n }\n\n private parseOptionalWith(): WithClause | null {\n return this.at(\"WITH\") ? this.parseWithClause() : null;\n }\n\n // \u2500\u2500 SELECT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n parseSelectStmt(withClause = this.parseOptionalWith()): SelectStmt {\n const select = this.parseSelectCore();\n select.with = withClause;\n return select;\n }\n\n private parseSelectCore(): SelectStmt {\n this.expect(\"SELECT\");\n const distinct = this.match(\"DISTINCT\");\n this.match(\"ALL\");\n\n if (this.at(\"FROM\")) {\n throw new SqliteError('near \"FROM\": syntax error', \"syntax\");\n }\n const columns = this.parseResultColumns();\n let from: FromItem | null = null;\n if (this.match(\"FROM\")) {\n from = this.parseFromItem();\n }\n\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n\n const groupBy: Expr[] = [];\n if (this.match(\"GROUP\")) {\n this.expect(\"BY\");\n do {\n groupBy.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n\n let having: Expr | null = null;\n if (this.match(\"HAVING\")) having = this.parseExpr();\n\n const windows: { name: string; spec: WindowSpec }[] = [];\n if (this.match(\"WINDOW\")) {\n do {\n const name = this.parseIdent();\n this.expect(\"AS\");\n this.expect(\"LPAREN\");\n const spec = this.parseWindowSpec();\n this.expect(\"RPAREN\");\n windows.push({ name, spec });\n } while (this.match(\"COMMA\"));\n }\n\n const orderBy = this.parseOrderBy();\n const limit = this.parseLimit();\n\n const stmt: SelectStmt = {\n type: \"select\",\n with: null,\n distinct,\n columns,\n from,\n where,\n groupBy,\n having,\n windows,\n orderBy,\n limit,\n compound: null,\n };\n\n if (this.check(\"UNION\", \"INTERSECT\", \"EXCEPT\")) {\n stmt.compound = this.parseCompoundTail();\n // ORDER BY and LIMIT following a compound SELECT apply to the entire\n // compound, even though the recursive parser initially attaches them\n // to its right-most arm.\n if (stmt.compound.select.orderBy.length > 0) {\n stmt.orderBy = stmt.compound.select.orderBy;\n stmt.compound.select.orderBy = [];\n }\n if (stmt.compound.select.limit) {\n stmt.limit = stmt.compound.select.limit;\n stmt.compound.select.limit = null;\n }\n }\n\n return stmt;\n }\n\n private parseCompoundTail(): CompoundTail {\n let op: CompoundTail[\"op\"];\n if (this.match(\"UNION\")) {\n op = this.match(\"ALL\") ? \"UNION ALL\" : \"UNION\";\n } else if (this.match(\"INTERSECT\")) {\n op = \"INTERSECT\";\n } else {\n this.expect(\"EXCEPT\");\n op = \"EXCEPT\";\n }\n const select = this.parseSelectCore();\n return { op, select };\n }\n\n private parseResultColumns(): ResultColumn[] {\n const cols: ResultColumn[] = [];\n do {\n if (this.match(\"STAR\")) {\n cols.push({ type: \"star\", table: null });\n } else if (this.check(\"IDENT\") || IDENT_KEYWORDS.has(this.current().kind)) {\n const saved = this.pos;\n const first = this.parseIdent();\n if (this.match(\"DOT\") && this.at(\"STAR\")) {\n this.advance();\n cols.push({ type: \"star\", table: first });\n } else {\n this.pos = saved;\n const expr = this.parseExpr();\n let alias: string | null = null;\n if (this.match(\"AS\")) alias = this.parseIdent();\n else if (\n this.current().kind === \"IDENT\" ||\n (IDENT_KEYWORDS.has(this.current().kind) && !this.isSelectClauseStart())\n ) {\n alias = this.parseIdent();\n }\n cols.push({ type: \"expr\", expr, alias });\n }\n } else {\n const expr = this.parseExpr();\n let alias: string | null = null;\n if (this.match(\"AS\")) alias = this.parseIdent();\n else if (\n this.current().kind === \"IDENT\" ||\n (IDENT_KEYWORDS.has(this.current().kind) && !this.isSelectClauseStart())\n ) {\n alias = this.parseIdent();\n }\n cols.push({ type: \"expr\", expr, alias });\n }\n } while (this.match(\"COMMA\"));\n return cols;\n }\n\n private isSelectClauseStart(): boolean {\n return this.check(\n \"FROM\",\n \"WHERE\",\n \"GROUP\",\n \"HAVING\",\n \"WINDOW\",\n \"ORDER\",\n \"LIMIT\",\n \"UNION\",\n \"INTERSECT\",\n \"EXCEPT\",\n \"COMMA\",\n \"SEMI\",\n \"EOF\",\n \"RPAREN\",\n );\n }\n\n private parseFromItem(): FromItem {\n let left = this.parseFromPrimary();\n while (true) {\n if (this.match(\"COMMA\")) {\n const right = this.parseFromPrimary();\n left = this.makeJoin(left, right, \"CROSS\", null, null);\n continue;\n }\n const joinInfo = this.parseJoinOp();\n if (!joinInfo) break;\n const right = this.parseFromPrimary();\n let on: Expr | null = null;\n let using: string[] | null = null;\n if (joinInfo.natural) {\n using = [];\n } else if (this.match(\"ON\")) {\n on = this.parseExpr();\n } else if (this.match(\"USING\")) {\n this.expect(\"LPAREN\");\n using = [];\n do {\n using.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n } else if (joinInfo.type !== \"CROSS\" && joinInfo.type !== \"INNER\") {\n this.syntaxError(\"expected ON or USING after JOIN\");\n }\n left = this.makeJoin(left, right, joinInfo.type, on, using);\n }\n return left;\n }\n\n private makeJoin(\n left: FromItem,\n right: FromItem,\n joinType: JoinFrom[\"joinType\"],\n on: Expr | null,\n using: string[] | null,\n ): JoinFrom {\n return { type: \"join\", left, right, joinType, on, using };\n }\n\n private parseJoinOp(): { type: JoinFrom[\"joinType\"]; natural: boolean } | null {\n const natural = this.match(\"NATURAL\");\n if (this.match(\"CROSS\")) {\n this.expect(\"JOIN\");\n return { type: \"CROSS\", natural: false };\n }\n let type: JoinFrom[\"joinType\"] = \"INNER\";\n if (this.match(\"INNER\")) type = \"INNER\";\n else if (this.match(\"LEFT\")) type = \"LEFT\";\n else if (this.match(\"RIGHT\")) type = \"RIGHT\";\n else if (this.match(\"FULL\")) type = \"FULL\";\n if (type !== \"INNER\" || this.at(\"OUTER\") || this.at(\"JOIN\")) {\n this.match(\"OUTER\");\n if (!this.match(\"JOIN\")) return null;\n return { type, natural };\n }\n if (this.match(\"JOIN\")) return { type: \"INNER\", natural };\n if (natural) this.syntaxError(\"expected JOIN after NATURAL\");\n return null;\n }\n\n private parseFromPrimary(): FromItem {\n if (this.match(\"LPAREN\")) {\n if (this.at(\"SELECT\") || this.at(\"WITH\") || this.at(\"VALUES\")) {\n const select = this.at(\"SELECT\") || this.at(\"WITH\") ? this.parseSelectStmt() : this.parseValuesAsSelect();\n this.expect(\"RPAREN\");\n // SQLite allows omitting the alias; invent one for the AST.\n const alias = this.optionalAlias() ?? `__subq_${this.pos}`;\n return { type: \"subquery\", select, alias };\n }\n const item = this.parseFromItem();\n this.expect(\"RPAREN\");\n const alias = this.optionalAlias();\n if (alias && item.type === \"table\") item.alias = alias;\n return item;\n }\n\n const qname = this.parseQualifiedTableName();\n if (this.match(\"LPAREN\")) {\n const name = qname.name;\n const args: Expr[] = [];\n if (!this.at(\"RPAREN\")) {\n do {\n args.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n this.expect(\"RPAREN\");\n const alias = this.optionalAlias();\n return { type: \"table_func\", name, args, alias };\n }\n\n const alias = this.optionalAlias();\n if (this.match(\"INDEXED\")) {\n this.expect(\"BY\");\n this.parseIdent(); // index hint \u2014 planner is a no-op\n } else if (this.match(\"NOT\") && this.at(\"INDEXED\")) {\n this.advance(); // INDEXED\n }\n return {\n type: \"table\",\n schema: qname.schema,\n name: qname.name,\n alias,\n } satisfies TableRef;\n }\n\n private parseValuesAsSelect(): SelectStmt {\n this.expect(\"VALUES\");\n const rows: Expr[][] = [];\n do {\n this.expect(\"LPAREN\");\n const row: Expr[] = [];\n do {\n row.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n rows.push(row);\n } while (this.match(\"COMMA\"));\n\n const selectFor = (row: Expr[]): SelectStmt => ({\n type: \"select\",\n with: null,\n distinct: false,\n columns: row.map((expr) => ({ type: \"expr\" as const, expr, alias: null })),\n from: null,\n where: null,\n groupBy: [],\n having: null,\n windows: [],\n orderBy: [],\n limit: null,\n compound: null,\n });\n const result = selectFor(rows[0] ?? []);\n let current = result;\n for (const row of rows.slice(1)) {\n current.compound = { op: \"UNION ALL\", select: selectFor(row) };\n current = current.compound.select;\n }\n if (this.check(\"UNION\", \"INTERSECT\", \"EXCEPT\")) {\n current.compound = this.parseCompoundTail();\n }\n return result;\n }\n\n private parseOrderBy(): OrderByItem[] {\n if (!this.match(\"ORDER\")) return [];\n this.expect(\"BY\");\n const items: OrderByItem[] = [];\n do {\n const expr = this.parseExpr();\n let dir: \"ASC\" | \"DESC\" = \"ASC\";\n if (this.match(\"ASC\")) dir = \"ASC\";\n else if (this.match(\"DESC\")) dir = \"DESC\";\n let nulls: \"FIRST\" | \"LAST\" | null = null;\n if (this.match(\"NULLS\")) {\n if (this.match(\"FIRST\")) nulls = \"FIRST\";\n else if (this.match(\"LAST\")) nulls = \"LAST\";\n else this.syntaxError(\"expected FIRST or LAST after NULLS\");\n }\n items.push({ expr, dir, nulls });\n } while (this.match(\"COMMA\"));\n return items;\n }\n\n private parseLimit(): LimitClause | null {\n if (!this.match(\"LIMIT\")) return null;\n const first = this.parseExpr();\n if (this.match(\"OFFSET\")) {\n return { limit: first, offset: this.parseExpr() };\n }\n if (this.match(\"COMMA\")) {\n const limit = this.parseExpr();\n return { limit, offset: first };\n }\n let offset: Expr | null = null;\n if (this.match(\"OFFSET\")) offset = this.parseExpr();\n return { limit: first, offset };\n }\n\n // \u2500\u2500 INSERT / REPLACE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseInsertStmt(withClause = this.parseOptionalWith()): InsertStmt {\n let mode: InsertStmt[\"mode\"] = \"insert\";\n\n if (this.match(\"REPLACE\")) {\n mode = \"replace\";\n } else {\n this.expect(\"INSERT\");\n const orAction = this.parseOrConflict();\n if (orAction === \"REPLACE\") mode = \"insert_or_replace\";\n else if (orAction === \"IGNORE\") mode = \"insert_or_ignore\";\n else if (orAction === \"ABORT\") mode = \"insert_or_abort\";\n else if (orAction === \"ROLLBACK\") mode = \"insert_or_rollback\";\n else if (orAction === \"FAIL\") mode = \"insert_or_fail\";\n }\n\n this.expect(\"INTO\");\n const table = this.parseTableName();\n\n let columns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n columns = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n\n let values: Expr[][] | null = null;\n let select: SelectStmt | null = null;\n\n if (this.match(\"VALUES\")) {\n values = [];\n do {\n this.expect(\"LPAREN\");\n const row: Expr[] = [];\n do {\n row.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n values.push(row);\n } while (this.match(\"COMMA\"));\n } else if (this.at(\"SELECT\") || this.at(\"WITH\")) {\n select = this.parseSelectStmt();\n } else if (this.at(\"DEFAULT\")) {\n this.advance();\n this.expect(\"VALUES\");\n columns = [];\n values = [[]];\n } else {\n this.syntaxError(\"expected VALUES, SELECT, or DEFAULT\");\n }\n\n const upsert = this.parseUpsertClause();\n const returning = this.parseReturning();\n\n return {\n type: \"insert\",\n with: withClause,\n mode,\n table,\n columns,\n values,\n select,\n upsert,\n returning,\n };\n }\n\n private parseUpsertClause(): UpsertClause | null {\n if (!this.match(\"ON\")) return null;\n this.expect(\"CONFLICT\");\n let targetColumns: string[] | null = null;\n let targetExprs: Expr[] | null = null;\n if (this.match(\"LPAREN\")) {\n targetColumns = [];\n targetExprs = [];\n do {\n const expr = this.parseExprPrec(PREC.ADD);\n targetExprs.push(expr);\n targetColumns.push(expr.type === \"column\" ? expr.name : \"\");\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n let targetWhere: Expr | null = null;\n if (this.match(\"WHERE\")) targetWhere = this.parseExpr();\n\n this.expect(\"DO\");\n if (this.match(\"NOTHING\")) {\n return { targetColumns, targetExprs, targetWhere, action: \"nothing\" };\n }\n this.expect(\"UPDATE\");\n this.expect(\"SET\");\n const set = this.parseSetItems();\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n return { targetColumns, targetExprs, targetWhere, action: { set, where } };\n }\n\n private parseSetItems(): SetItem[] {\n const items: SetItem[] = [];\n do {\n const columns = [this.parseIdent()];\n this.expect(\"EQ\");\n const expr = this.parseExpr();\n items.push({ columns, expr });\n } while (this.match(\"COMMA\"));\n return items;\n }\n\n private parseReturning(): ResultColumn[] {\n if (!this.match(\"RETURNING\")) return [];\n return this.parseResultColumns();\n }\n\n // \u2500\u2500 UPDATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseUpdateStmt(withClause = this.parseOptionalWith()): UpdateStmt {\n this.expect(\"UPDATE\");\n const or = this.mapUpdateOr(this.parseOrConflict());\n const table = this.parseTableName();\n const alias = this.optionalAlias();\n this.expect(\"SET\");\n const set = this.parseSetItems();\n let from: FromItem | null = null;\n if (this.match(\"FROM\")) from = this.parseFromItem();\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n const returning = this.parseReturning();\n return { type: \"update\", with: withClause, or, table, alias, set, from, where, returning };\n }\n\n // \u2500\u2500 DELETE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseDeleteStmt(withClause = this.parseOptionalWith()): DeleteStmt {\n this.expect(\"DELETE\");\n const or = this.parseOrConflict();\n this.expect(\"FROM\");\n const table = this.parseTableName();\n const alias = this.optionalAlias();\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n const returning = this.parseReturning();\n const orMode =\n or === null\n ? null\n : or === \"REPLACE\"\n ? \"replace\"\n : or === \"IGNORE\"\n ? \"ignore\"\n : or === \"ABORT\"\n ? \"abort\"\n : or === \"ROLLBACK\"\n ? \"rollback\"\n : \"fail\";\n return { type: \"delete\", with: withClause, or: orMode, table, alias, where, returning };\n }\n\n // \u2500\u2500 CREATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseCreateStmt(): Statement {\n this.expect(\"CREATE\");\n const temp = this.match(\"TEMP\") || this.match(\"TEMPORARY\");\n if (this.match(\"VIRTUAL\")) {\n this.expect(\"TABLE\");\n return this.parseCreateVirtualTable();\n }\n if (this.match(\"TRIGGER\")) return this.parseCreateTrigger(temp);\n if (this.match(\"UNIQUE\")) {\n this.expect(\"INDEX\");\n return this.parseCreateIndex(true, temp);\n }\n if (this.match(\"INDEX\")) return this.parseCreateIndex(false, temp);\n if (this.match(\"VIEW\")) return this.parseCreateView(temp);\n this.expect(\"TABLE\");\n return this.parseCreateTable(temp);\n }\n\n private parseCreateVirtualTable(): CreateVirtualTableStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseTableName();\n this.expect(\"USING\");\n const module = this.parseIdent();\n const moduleArgs: string[] = [];\n if (this.match(\"LPAREN\")) {\n if (!this.at(\"RPAREN\")) {\n do {\n moduleArgs.push(this.parseVirtualTableArg());\n } while (this.match(\"COMMA\"));\n }\n this.expect(\"RPAREN\");\n }\n return { type: \"create_virtual_table\", ifNotExists, name, module, moduleArgs };\n }\n\n /** One comma-separated CREATE VIRTUAL TABLE module argument (FTS options, columns, \u2026). */\n private parseVirtualTableArg(): string {\n // STRING alone\n if (this.at(\"STRING\")) {\n const value = String(this.current().literal);\n this.advance();\n return value;\n }\n\n // IDENT [UNINDEXED|NOTINDEXED] | IDENT = value\n const start = this.parseIdentOrQuoted();\n if (this.match(\"EQ\") || this.match(\"EQEQ\")) {\n const value = this.parseVirtualTableOptionValue();\n return `${start}=${value}`;\n }\n // Optional UNINDEXED / NOTINDEXED / type names\n const extras: string[] = [];\n while (this.at(\"IDENT\") || this.at(\"STRING\")) {\n // Stop before next comma-separated arg would need peek of COMMA/RPAREN \u2014 only consume trailing idents\n if (this.at(\"IDENT\")) {\n const upper = this.current().value.toUpperCase();\n if (\n upper === \"UNINDEXED\" ||\n upper === \"NOTINDEXED\" ||\n upper === \"TEXT\" ||\n upper === \"INTEGER\" ||\n upper === \"REAL\" ||\n upper === \"BLOB\" ||\n upper === \"NUMERIC\"\n ) {\n extras.push(this.current().value);\n this.advance();\n continue;\n }\n }\n break;\n }\n return extras.length ? `${start} ${extras.join(\" \")}` : start;\n }\n\n private parseIdentOrQuoted(): string {\n if (this.at(\"STRING\")) {\n // quoted identifier written as string in some dialects\n const value = String(this.current().literal);\n this.advance();\n return `\"${value.replaceAll('\"', '\"\"')}\"`;\n }\n return this.parseIdent();\n }\n\n private parseVirtualTableOptionValue(): string {\n if (this.at(\"STRING\")) {\n const value = String(this.current().literal);\n this.advance();\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n }\n if (this.at(\"NUMBER\")) {\n const value = this.current().value;\n this.advance();\n return value;\n }\n if (this.at(\"IDENT\")) {\n return this.parseIdent();\n }\n // Empty string after content=\n return \"''\";\n }\n\n private parseIfNotExists(): boolean {\n if (!this.match(\"IF\")) return false;\n this.expect(\"NOT\");\n this.expect(\"EXISTS\");\n return true;\n }\n\n private parseIfExists(): boolean {\n if (!this.match(\"IF\")) return false;\n this.expect(\"EXISTS\");\n return true;\n }\n\n private mapUpdateOr(action: ConflictAction | null): UpdateStmt[\"or\"] {\n if (!action) return null;\n switch (action) {\n case \"ROLLBACK\":\n return \"rollback\";\n case \"ABORT\":\n return \"abort\";\n case \"FAIL\":\n return \"fail\";\n case \"IGNORE\":\n return \"ignore\";\n case \"REPLACE\":\n return \"replace\";\n }\n }\n\n private parseCreateTable(temp: boolean): CreateTableStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseTableName();\n\n if (this.match(\"AS\")) {\n const asSelect = this.parseSelectStmt();\n return {\n type: \"create_table\",\n ifNotExists,\n temp,\n name,\n columns: [],\n constraints: [],\n asSelect,\n withoutRowid: false,\n strict: false,\n };\n }\n\n this.expect(\"LPAREN\");\n const columns: ColumnDef[] = [];\n const constraints: TableConstraint[] = [];\n do {\n if (this.at(\"PRIMARY\") || this.at(\"UNIQUE\") || this.at(\"CHECK\") || this.at(\"FOREIGN\") || this.at(\"CONSTRAINT\")) {\n constraints.push(this.parseTableConstraint());\n } else {\n columns.push(this.parseColumnDef());\n }\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n let withoutRowid = false;\n let strict = false;\n while (!this.at(\"SEMI\") && !this.at(\"EOF\")) {\n if (this.match(\"WITHOUT\")) {\n const word = this.parseIdent();\n if (word.toUpperCase() !== \"ROWID\") this.syntaxError(\"expected ROWID after WITHOUT\");\n withoutRowid = true;\n } else {\n const word = this.parseIdent();\n if (word.toUpperCase() !== \"STRICT\") this.syntaxError(`unexpected table option ${word}`);\n strict = true;\n }\n this.match(\"COMMA\");\n }\n\n return {\n type: \"create_table\",\n ifNotExists,\n temp,\n name,\n columns,\n constraints,\n asSelect: null,\n withoutRowid,\n strict,\n };\n }\n\n private parseColumnDef(): ColumnDef {\n const name = this.parseIdent();\n let typeName: string | null = null;\n if (this.current().kind === \"IDENT\" || IDENT_KEYWORDS.has(this.current().kind)) {\n if (\n !this.at(\"CONSTRAINT\") &&\n !this.at(\"PRIMARY\") &&\n !this.at(\"NOT\") &&\n !this.at(\"UNIQUE\") &&\n !this.at(\"CHECK\") &&\n !this.at(\"DEFAULT\") &&\n !this.at(\"REFERENCES\") &&\n !this.at(\"COLLATE\") &&\n !this.at(\"GENERATED\") &&\n !this.at(\"COMMA\") &&\n !this.at(\"RPAREN\")\n ) {\n typeName = this.parseTypeName();\n }\n }\n const constraints: ColumnConstraint[] = [];\n while (this.isColumnConstraintStart()) {\n constraints.push(this.parseColumnConstraint());\n }\n return { name, typeName, constraints };\n }\n\n /** Type names may include optional precision/scale: VARCHAR(10), DECIMAL(10,2). */\n private parseTypeName(): string {\n const base = this.parseIdent();\n if (!this.match(\"LPAREN\")) return base;\n const parts: string[] = [];\n do {\n if (this.at(\"NUMBER\") || this.at(\"PLUS\") || this.at(\"MINUS\")) {\n let sign = \"\";\n if (this.match(\"PLUS\")) sign = \"+\";\n else if (this.match(\"MINUS\")) sign = \"-\";\n const number = this.advance();\n parts.push(`${sign}${number.value}`);\n } else {\n parts.push(this.parseIdent());\n }\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n return `${base}(${parts.join(\",\")})`;\n }\n\n private isColumnConstraintStart(): boolean {\n return this.check(\n \"CONSTRAINT\",\n \"PRIMARY\",\n \"NOT\",\n \"UNIQUE\",\n \"CHECK\",\n \"DEFAULT\",\n \"COLLATE\",\n \"REFERENCES\",\n \"GENERATED\",\n );\n }\n\n private parseColumnConstraint(): ColumnConstraint {\n this.match(\"CONSTRAINT\");\n if (this.current().kind === \"IDENT\" || IDENT_KEYWORDS.has(this.current().kind)) {\n const next = this.peek();\n if (\n next.kind === \"PRIMARY\" ||\n next.kind === \"UNIQUE\" ||\n next.kind === \"CHECK\" ||\n next.kind === \"DEFAULT\" ||\n next.kind === \"NOT\" ||\n next.kind === \"REFERENCES\"\n ) {\n this.parseIdent(); // constraint name, discarded for column level\n }\n }\n if (this.match(\"PRIMARY\")) {\n this.expect(\"KEY\");\n let order: \"ASC\" | \"DESC\" | null = null;\n if (this.match(\"ASC\")) order = \"ASC\";\n else if (this.match(\"DESC\")) order = \"DESC\";\n const autoincrement = this.match(\"AUTOINCREMENT\");\n const conflict = this.parseOnConflict();\n return { type: \"primary_key\", order, autoincrement, conflict };\n }\n if (this.match(\"NOT\")) {\n this.expect(\"NULL\");\n const conflict = this.parseOnConflict();\n return { type: \"not_null\", conflict };\n }\n if (this.match(\"UNIQUE\")) {\n const conflict = this.parseOnConflict();\n return { type: \"unique\", conflict };\n }\n if (this.match(\"CHECK\")) {\n this.expect(\"LPAREN\");\n const expr = this.parseExpr();\n this.expect(\"RPAREN\");\n return { type: \"check\", expr };\n }\n if (this.match(\"DEFAULT\")) {\n const expr = this.parseExpr();\n return { type: \"default\", expr };\n }\n if (this.match(\"COLLATE\")) {\n const name = this.parseIdent();\n return { type: \"collate\", name };\n }\n if (this.match(\"REFERENCES\")) {\n return this.parseReferencesConstraint();\n }\n if (this.match(\"GENERATED\")) {\n const always = this.parseIdent();\n if (always.toUpperCase() !== \"ALWAYS\") this.syntaxError(\"expected ALWAYS after GENERATED\");\n this.expect(\"AS\");\n return this.parseGeneratedConstraint();\n }\n if (this.match(\"AS\") && this.at(\"LPAREN\")) {\n return this.parseGeneratedConstraint();\n }\n this.syntaxError(\"expected column constraint\");\n }\n\n private parseGeneratedConstraint(): ColumnConstraint {\n this.expect(\"LPAREN\");\n const expr = this.parseExpr();\n this.expect(\"RPAREN\");\n let stored = false;\n if (this.current().kind === \"IDENT\" || this.at(\"VIRTUAL\")) {\n const word = this.parseIdent().toUpperCase();\n if (word === \"STORED\") stored = true;\n else if (word === \"VIRTUAL\") stored = false;\n else this.syntaxError(\"expected STORED or VIRTUAL after generated column expression\");\n }\n return { type: \"generated\", expr, stored };\n }\n\n private parseReferencesConstraint(): ColumnConstraint {\n const table = this.parseTableName();\n let columns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n columns = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n const { onDelete, onUpdate, match } = this.parseFkActions();\n const { deferrable, initiallyDeferred } = this.parseDeferrable();\n return { type: \"references\", table, columns, onDelete, onUpdate, match, deferrable, initiallyDeferred };\n }\n\n private parseTableConstraint(): TableConstraint {\n let name: string | null = null;\n if (this.match(\"CONSTRAINT\")) {\n name = this.parseIdent();\n }\n if (this.match(\"PRIMARY\")) {\n this.expect(\"KEY\");\n this.expect(\"LPAREN\");\n const columns = this.parseIndexedColumns();\n this.expect(\"RPAREN\");\n const conflict = this.parseOnConflict();\n return { type: \"primary_key\", columns, conflict };\n }\n if (this.match(\"UNIQUE\")) {\n this.expect(\"LPAREN\");\n const columns = this.parseIndexedColumns();\n this.expect(\"RPAREN\");\n const conflict = this.parseOnConflict();\n return { type: \"unique\", columns, conflict, name };\n }\n if (this.match(\"CHECK\")) {\n this.expect(\"LPAREN\");\n const expr = this.parseExpr();\n this.expect(\"RPAREN\");\n return { type: \"check\", expr, name };\n }\n if (this.match(\"FOREIGN\")) {\n this.expect(\"KEY\");\n this.expect(\"LPAREN\");\n const columns: string[] = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n this.expect(\"REFERENCES\");\n const refTable = this.parseTableName();\n let refColumns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n refColumns = [];\n do {\n refColumns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n const { onDelete, onUpdate, match } = this.parseFkActions();\n const { deferrable, initiallyDeferred } = this.parseDeferrable();\n return {\n type: \"foreign_key\",\n columns,\n refTable,\n refColumns,\n onDelete,\n onUpdate,\n match,\n name,\n deferrable,\n initiallyDeferred,\n };\n }\n this.syntaxError(\"expected table constraint\");\n }\n\n private parseIndexedColumns(): IndexedColumn[] {\n const cols: IndexedColumn[] = [];\n do {\n const expr = this.parseExprPrec(PREC.ADD);\n let collate: string | null = null;\n let inner = expr;\n if (inner.type === \"collate\") {\n collate = inner.collation;\n inner = inner.expr;\n }\n if (this.match(\"COLLATE\")) collate = this.parseIdent();\n let order: \"ASC\" | \"DESC\" | null = null;\n if (this.match(\"ASC\")) order = \"ASC\";\n else if (this.match(\"DESC\")) order = \"DESC\";\n if (inner.type === \"column\" && inner.table === null) {\n cols.push({ name: inner.name, collate, order });\n } else {\n cols.push({ name: \"\", collate, order, expr: inner });\n }\n } while (this.match(\"COMMA\"));\n return cols;\n }\n\n private parseOnConflict(): ConflictAction | null {\n if (!this.match(\"ON\")) return null;\n this.expect(\"CONFLICT\");\n return this.parseConflictAction();\n }\n\n private parseConflictAction(): ConflictAction {\n if (this.match(\"ROLLBACK\")) return \"ROLLBACK\";\n if (this.match(\"ABORT\")) return \"ABORT\";\n if (this.match(\"FAIL\")) return \"FAIL\";\n if (this.match(\"IGNORE\")) return \"IGNORE\";\n if (this.match(\"REPLACE\")) return \"REPLACE\";\n this.syntaxError(\"expected conflict action\");\n }\n\n private parseFkAction(kind: \"DELETE\" | \"UPDATE\"): FkAction | null {\n if (!this.match(\"ON\")) return null;\n this.expect(kind);\n if (this.match(\"SET\")) {\n if (this.match(\"NULL\")) return \"SET NULL\";\n this.expect(\"DEFAULT\");\n return \"SET DEFAULT\";\n }\n if (this.match(\"CASCADE\")) return \"CASCADE\";\n if (this.match(\"RESTRICT\")) return \"RESTRICT\";\n if (this.match(\"NO\")) {\n this.expect(\"ACTION\");\n return \"NO ACTION\";\n }\n this.syntaxError(`expected ON ${kind} action`);\n }\n\n private parseFkActions(): { onDelete: FkAction | null; onUpdate: FkAction | null; match: FkMatch } {\n let onDelete: FkAction | null = null;\n let onUpdate: FkAction | null = null;\n let match: FkMatch = \"SIMPLE\";\n const readMatch = (): void => {\n while (this.match(\"MATCH\")) {\n const word = this.parseIdent().toUpperCase();\n if (word === \"FULL\") match = \"FULL\";\n else if (word === \"PARTIAL\") match = \"PARTIAL\";\n else match = \"SIMPLE\";\n }\n };\n // MATCH is accepted (SQLite grammar); SIMPLE is the default. FULL rejects partial-NULL keys.\n readMatch();\n while (this.at(\"ON\")) {\n if (this.peek().kind === \"DELETE\") onDelete = this.parseFkAction(\"DELETE\");\n else if (this.peek().kind === \"UPDATE\") onUpdate = this.parseFkAction(\"UPDATE\");\n else this.syntaxError(\"expected ON DELETE or ON UPDATE\");\n readMatch();\n }\n readMatch();\n return { onDelete, onUpdate, match };\n }\n\n private parseDeferrable(): { deferrable: boolean; initiallyDeferred: boolean } {\n let deferrable = false;\n let initiallyDeferred = false;\n if (this.match(\"NOT\")) {\n this.expect(\"DEFERRABLE\");\n } else if (this.match(\"DEFERRABLE\")) {\n deferrable = true;\n }\n if (this.match(\"INITIALLY\")) {\n if (this.match(\"DEFERRED\")) initiallyDeferred = true;\n else {\n this.expect(\"IMMEDIATE\");\n initiallyDeferred = false;\n }\n }\n return { deferrable, initiallyDeferred: deferrable && initiallyDeferred };\n }\n\n private parseOrConflict(): ConflictAction | null {\n if (!this.match(\"OR\")) return null;\n return this.parseConflictAction();\n }\n\n private parseCreateIndex(unique: boolean, _temp: boolean): CreateIndexStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseIdent();\n this.expect(\"ON\");\n const table = this.parseTableName();\n this.expect(\"LPAREN\");\n const columns = this.parseIndexedColumns();\n this.expect(\"RPAREN\");\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n return { type: \"create_index\", unique, ifNotExists, name, table, columns, where };\n }\n\n private parseCreateView(temp: boolean): CreateViewStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseIdent();\n let columns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n columns = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n this.expect(\"AS\");\n const select = this.parseSelectStmt();\n return { type: \"create_view\", ifNotExists, temp, name, columns, select };\n }\n\n private parseCreateTrigger(temp: boolean): CreateTriggerStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseTableName();\n let timing: CreateTriggerStmt[\"timing\"];\n if (this.match(\"BEFORE\")) timing = \"BEFORE\";\n else if (this.match(\"AFTER\")) timing = \"AFTER\";\n else if (this.match(\"INSTEAD\")) {\n this.expect(\"OF\");\n timing = \"INSTEAD\";\n } else {\n this.syntaxError(\"expected BEFORE, AFTER, or INSTEAD OF\");\n }\n\n let event: CreateTriggerStmt[\"event\"];\n if (this.match(\"INSERT\")) event = \"INSERT\";\n else if (this.match(\"DELETE\")) event = \"DELETE\";\n else if (this.match(\"UPDATE\")) event = \"UPDATE\";\n else this.syntaxError(\"expected INSERT, DELETE, or UPDATE\");\n\n let updateColumns: string[] | null = null;\n if (event === \"UPDATE\" && this.match(\"OF\")) {\n updateColumns = [];\n do {\n updateColumns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n }\n\n this.expect(\"ON\");\n const table = this.parseTableName();\n\n let forEachRow = false;\n if (this.match(\"FOR\")) {\n this.expect(\"EACH\");\n this.expect(\"ROW\");\n forEachRow = true;\n }\n\n let when: Expr | null = null;\n if (this.match(\"WHEN\")) when = this.parseExpr();\n\n this.expect(\"BEGIN\");\n const body = this.parseTriggerBody();\n\n return {\n type: \"create_trigger\",\n ifNotExists,\n temp,\n name,\n timing,\n event,\n table,\n updateColumns,\n forEachRow,\n when,\n body,\n };\n }\n\n private parseTriggerBody(): Statement[] {\n const body: Statement[] = [];\n while (!this.at(\"END\") && !this.at(\"EOF\")) {\n if (this.match(\"SEMI\")) continue;\n body.push(this.parseStatement());\n this.match(\"SEMI\");\n }\n this.expect(\"END\");\n return body;\n }\n\n // \u2500\u2500 DROP \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseDropStmt(): Statement {\n this.expect(\"DROP\");\n if (this.match(\"TABLE\")) return this.parseDropTable();\n if (this.match(\"INDEX\")) return this.parseDropIndex();\n if (this.match(\"VIEW\")) return this.parseDropView();\n if (this.match(\"TRIGGER\")) return this.parseDropTrigger();\n this.syntaxError(\"expected TABLE, INDEX, or VIEW after DROP\");\n }\n\n private parseDropTable(): DropTableStmt {\n const ifExists = this.parseIfExists();\n const name = this.parseTableName();\n return { type: \"drop_table\", ifExists, name };\n }\n\n private parseDropIndex(): DropIndexStmt {\n const ifExists = this.parseIfExists();\n const name = this.parseIdent();\n return { type: \"drop_index\", ifExists, name };\n }\n\n private parseDropView(): DropViewStmt {\n const ifExists = this.parseIfExists();\n const name = this.parseIdent();\n return { type: \"drop_view\", ifExists, name };\n }\n\n private parseDropTrigger(): DropTriggerStmt {\n const ifExists = this.parseIfExists();\n const name = this.parseTableName();\n return { type: \"drop_trigger\", ifExists, name };\n }\n\n // \u2500\u2500 ALTER TABLE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseAlterTableStmt(): AlterTableStmt {\n this.expect(\"ALTER\");\n this.expect(\"TABLE\");\n const table = this.parseTableName();\n if (this.match(\"RENAME\")) {\n if (this.match(\"TO\")) {\n const newName = this.parseTableName();\n return { type: \"alter_table\", table, action: { kind: \"rename_table\", newName } };\n }\n if (this.match(\"COLUMN\")) {\n const oldName = this.parseIdent();\n this.expect(\"TO\");\n const newName = this.parseIdent();\n return { type: \"alter_table\", table, action: { kind: \"rename_column\", oldName, newName } };\n }\n this.syntaxError(\"expected TO or COLUMN after RENAME\");\n }\n if (this.match(\"ADD\")) {\n this.match(\"COLUMN\");\n const column = this.parseColumnDef();\n return { type: \"alter_table\", table, action: { kind: \"add_column\", column } };\n }\n if (this.match(\"DROP\")) {\n this.match(\"COLUMN\");\n const name = this.parseIdent();\n return { type: \"alter_table\", table, action: { kind: \"drop_column\", name } };\n }\n this.syntaxError(\"expected RENAME, ADD, or DROP after ALTER TABLE\");\n }\n\n // \u2500\u2500 Transactions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseBeginStmt(): BeginStmt {\n this.expect(\"BEGIN\");\n let mode: BeginStmt[\"mode\"] = null;\n if (this.match(\"DEFERRED\")) mode = \"DEFERRED\";\n else if (this.match(\"IMMEDIATE\")) mode = \"IMMEDIATE\";\n else if (this.match(\"EXCLUSIVE\")) mode = \"EXCLUSIVE\";\n this.match(\"TRANSACTION\");\n return { type: \"begin\", mode };\n }\n\n private parseCommitStmt(): CommitStmt {\n if (this.at(\"END\")) this.advance();\n else this.expect(\"COMMIT\");\n this.match(\"TRANSACTION\");\n return { type: \"commit\" };\n }\n\n private parseRollbackStmt(): RollbackStmt {\n this.expect(\"ROLLBACK\");\n this.match(\"TRANSACTION\");\n let savepoint: string | null = null;\n if (this.match(\"TO\")) {\n this.match(\"SAVEPOINT\");\n savepoint = this.parseIdent();\n }\n return { type: \"rollback\", savepoint };\n }\n\n private parseSavepointStmt(): SavepointStmt {\n this.expect(\"SAVEPOINT\");\n const name = this.parseIdent();\n return { type: \"savepoint\", name };\n }\n\n private parseReleaseStmt(): ReleaseStmt {\n this.expect(\"RELEASE\");\n this.match(\"SAVEPOINT\");\n const name = this.parseIdent();\n return { type: \"release\", name };\n }\n\n // \u2500\u2500 PRAGMA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parsePragmaStmt(): PragmaStmt {\n this.expect(\"PRAGMA\");\n const name = this.parseIdent();\n if (this.match(\"EQ\")) {\n return { type: \"pragma\", name, value: this.parseExpr() };\n }\n if (this.match(\"LPAREN\")) {\n let value: Expr | null = null;\n if (!this.at(\"RPAREN\")) value = this.parseExpr();\n this.expect(\"RPAREN\");\n return { type: \"pragma\", name, value };\n }\n return { type: \"pragma\", name, value: null };\n }\n\n // \u2500\u2500 Expressions (Pratt / precedence climbing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n parseExpr(): Expr {\n return this.parseExprPrec(PREC.OR);\n }\n\n private parseExprPrec(minPrec: number): Expr {\n let left: Expr;\n if (this.at(\"NOT\") && PREC.NOT >= minPrec && !this.isNotKeywordCompound()) {\n this.advance();\n left = { type: \"unary\", op: \"NOT\", expr: this.parseExprPrec(PREC.NOT + 1) };\n } else {\n left = this.parseUnaryExpr();\n }\n\n while (true) {\n left = this.parsePostfix(left);\n\n if (this.at(\"NOT\") && PREC.IS_IN_LIKE >= minPrec) {\n const n = this.peek();\n if (n.kind === \"IN\") {\n this.advance();\n this.advance();\n left = this.parseInRhs(left, true);\n continue;\n }\n if (n.kind === \"LIKE\") {\n this.advance();\n this.advance();\n left = this.parseLikeRhs(left, true, \"LIKE\");\n continue;\n }\n if (n.kind === \"GLOB\") {\n this.advance();\n this.advance();\n left = this.parseLikeRhs(left, true, \"GLOB\");\n continue;\n }\n if (n.kind === \"REGEXP\") {\n this.advance();\n this.advance();\n const pattern = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n left = {\n type: \"unary\",\n op: \"NOT\",\n expr: {\n type: \"function\",\n name: \"REGEXP\",\n distinct: false,\n args: [pattern, left],\n orderBy: [],\n filter: null,\n },\n };\n continue;\n }\n if (n.kind === \"BETWEEN\") {\n this.advance();\n this.advance();\n const lower = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n this.expect(\"AND\");\n const upper = this.parseExprPrec(PREC.AND + 1);\n left = { type: \"between\", not: true, expr: left, lower, upper };\n continue;\n }\n }\n\n if (this.at(\"IS\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n if (this.at(\"NOT\") && this.peek().kind === \"DISTINCT\") {\n this.advance();\n this.advance();\n this.expect(\"FROM\");\n const right = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n left = { type: \"binary\", op: \"IS NOT DISTINCT FROM\", left, right };\n continue;\n }\n if (this.at(\"DISTINCT\")) {\n this.advance();\n this.expect(\"FROM\");\n const right = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n left = { type: \"binary\", op: \"IS DISTINCT FROM\", left, right };\n continue;\n }\n const not = this.match(\"NOT\");\n if (this.match(\"TRUE\")) {\n left = { type: \"is_bool\", expr: left, not, sense: true };\n continue;\n }\n if (this.match(\"FALSE\")) {\n left = { type: \"is_bool\", expr: left, not, sense: false };\n continue;\n }\n const right = this.parseIsRhs();\n left = { type: \"binary\", op: not ? \"IS NOT\" : \"IS\", left, right };\n continue;\n }\n\n if (this.at(\"IN\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n left = this.parseInRhs(left, false);\n continue;\n }\n if (this.at(\"LIKE\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n left = this.parseLikeRhs(left, false, \"LIKE\");\n continue;\n }\n if (this.at(\"GLOB\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n left = this.parseLikeRhs(left, false, \"GLOB\");\n continue;\n }\n if (this.at(\"REGEXP\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n const pattern = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n left = { type: \"function\", name: \"REGEXP\", distinct: false, args: [pattern, left], orderBy: [], filter: null };\n continue;\n }\n if (this.at(\"MATCH\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n const right = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n left = { type: \"binary\", op: \"MATCH\", left, right };\n continue;\n }\n if (this.at(\"BETWEEN\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n const lower = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n this.expect(\"AND\");\n const upper = this.parseExprPrec(PREC.AND + 1);\n left = { type: \"between\", not: false, expr: left, lower, upper };\n continue;\n }\n\n const bin = this.peekBinaryOp();\n if (!bin || bin.prec < minPrec) break;\n this.advance();\n const right = this.parseExprPrec(bin.prec + 1);\n left = { type: \"binary\", op: bin.op, left, right };\n }\n\n return left;\n }\n\n private peekBinaryOp(): { op: BinaryOp; prec: number } | null {\n const t = this.current();\n switch (t.kind) {\n case \"OR\":\n return { op: \"OR\", prec: PREC.OR };\n case \"AND\":\n return { op: \"AND\", prec: PREC.AND };\n case \"CONCAT\":\n return { op: \"||\", prec: PREC.CONCAT };\n case \"JSON_ARROW\":\n return { op: \"->\", prec: PREC.JSON_ARROW };\n case \"JSON_ARROW2\":\n return { op: \"->>\", prec: PREC.JSON_ARROW };\n case \"PLUS\":\n return { op: \"+\", prec: PREC.ADD };\n case \"MINUS\":\n return { op: \"-\", prec: PREC.ADD };\n case \"STAR\":\n return { op: \"*\", prec: PREC.MUL };\n case \"SLASH\":\n return { op: \"/\", prec: PREC.MUL };\n case \"PERCENT\":\n return { op: \"%\", prec: PREC.MUL };\n case \"LT\":\n return { op: \"<\", prec: PREC.COMPARE };\n case \"LE\":\n return { op: \"<=\", prec: PREC.COMPARE };\n case \"GT\":\n return { op: \">\", prec: PREC.COMPARE };\n case \"GE\":\n return { op: \">=\", prec: PREC.COMPARE };\n case \"EQ\":\n return { op: \"=\", prec: PREC.COMPARE };\n case \"EQEQ\":\n return { op: \"==\", prec: PREC.COMPARE };\n case \"NE\":\n return { op: t.value as \"<>\" | \"!=\", prec: PREC.COMPARE };\n case \"AMP\":\n return { op: \"&\", prec: PREC.BIT_AND };\n case \"PIPE\":\n return { op: \"|\", prec: PREC.BIT_OR };\n case \"LSHIFT\":\n return { op: \"<<\", prec: PREC.SHIFT };\n case \"RSHIFT\":\n return { op: \">>\", prec: PREC.SHIFT };\n default:\n return null;\n }\n }\n\n private parseIsRhs(): Expr {\n if (this.match(\"NULL\")) return { type: \"null\" };\n return this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n }\n\n private parseInRhs(left: Expr, not: boolean): InExpr {\n if (this.match(\"LPAREN\")) {\n if (this.at(\"SELECT\") || this.at(\"WITH\")) {\n const select = this.parseSelectStmt();\n this.expect(\"RPAREN\");\n return { type: \"in\", not, expr: left, values: select };\n }\n const values: Expr[] = [];\n if (!this.at(\"RPAREN\")) {\n do {\n values.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n this.expect(\"RPAREN\");\n return { type: \"in\", not, expr: left, values };\n }\n this.syntaxError(\"expected ( after IN\");\n }\n\n private parseLikeRhs(left: Expr, not: boolean, op: \"LIKE\" | \"GLOB\"): LikeExpr {\n const pattern = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n let escapeExpr: Expr | null = null;\n if (this.match(\"ESCAPE\")) escapeExpr = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n return { type: \"like\", not, op, expr: left, pattern, escape: escapeExpr };\n }\n\n private parsePostfix(expr: Expr): Expr {\n let result = expr;\n while (true) {\n if (this.match(\"COLLATE\")) {\n const collation = this.parseIdent();\n result = { type: \"collate\", expr: result, collation };\n continue;\n }\n if (this.match(\"ISNULL\")) {\n result = { type: \"binary\", op: \"IS\", left: result, right: { type: \"null\" } };\n continue;\n }\n if (this.match(\"NOTNULL\")) {\n result = { type: \"binary\", op: \"IS NOT\", left: result, right: { type: \"null\" } };\n continue;\n }\n break;\n }\n return result;\n }\n\n private isNotKeywordCompound(): boolean {\n const n = this.peek();\n return n.kind === \"IN\" || n.kind === \"LIKE\" || n.kind === \"GLOB\" || n.kind === \"BETWEEN\" || n.kind === \"REGEXP\";\n }\n\n private parseUnaryExpr(): Expr {\n if (this.match(\"PLUS\")) return { type: \"unary\", op: \"+\", expr: this.parseUnaryExpr() };\n if (this.match(\"MINUS\")) return { type: \"unary\", op: \"-\", expr: this.parseUnaryExpr() };\n if (this.match(\"TILDE\")) return { type: \"unary\", op: \"~\", expr: this.parseUnaryExpr() };\n if (this.match(\"EXISTS\")) {\n this.expect(\"LPAREN\");\n const select = this.parseSelectStmt();\n this.expect(\"RPAREN\");\n return { type: \"exists\", not: false, select };\n }\n return this.parsePrimaryExpr();\n }\n\n private parsePrimaryExpr(): Expr {\n const t = this.current();\n\n if (this.match(\"NULL\")) return { type: \"null\" };\n\n if (this.match(\"CASE\")) {\n let base: Expr | null = null;\n if (!this.at(\"WHEN\")) {\n base = this.parseExpr();\n }\n return this.parseCaseExpr(base);\n }\n\n if (this.match(\"CAST\")) {\n this.expect(\"LPAREN\");\n const expr = this.parseExpr();\n this.expect(\"AS\");\n const typeName = this.parseTypeName();\n this.expect(\"RPAREN\");\n return { type: \"cast\", expr, typeName };\n }\n\n if (this.at(\"CURRENT_DATE\") || this.at(\"CURRENT_TIME\") || this.at(\"CURRENT_TIMESTAMP\")) {\n const tok = this.advance();\n return { type: \"function\", name: tok.value, distinct: false, args: [], orderBy: [], filter: null };\n }\n\n if (this.at(\"NUMBER\")) {\n const tok = this.advance();\n return {\n type: \"literal\",\n value: tok.literal as number | bigint,\n forceReal: tok.forceReal || undefined,\n };\n }\n if (this.at(\"STRING\")) {\n const tok = this.advance();\n return { type: \"literal\", value: tok.literal as string };\n }\n if (this.at(\"BLOB\")) {\n const tok = this.advance();\n return { type: \"literal\", value: tok.literal as Uint8Array };\n }\n\n if (this.at(\"PARAM_POS\")) {\n const tok = this.advance();\n const name = tok.index ?? 1;\n return { type: \"parameter\", name };\n }\n if (this.at(\"PARAM_NAMED\")) {\n const tok = this.advance();\n return { type: \"parameter\", name: tok.value };\n }\n\n if (this.match(\"LPAREN\")) {\n if (this.at(\"SELECT\") || this.at(\"WITH\")) {\n const select = this.parseSelectStmt();\n this.expect(\"RPAREN\");\n return { type: \"subquery\", select };\n }\n if (this.at(\"RPAREN\")) {\n this.syntaxError(\"empty expression\");\n }\n const first = this.parseExpr();\n if (this.match(\"COMMA\")) {\n const values = [first];\n do {\n values.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n return { type: \"row\", values };\n }\n this.expect(\"RPAREN\");\n return first;\n }\n\n if (this.match(\"STAR\")) {\n return { type: \"column\", table: null, name: \"*\" };\n }\n\n if (t.kind === \"IDENT\" || IDENT_KEYWORDS.has(t.kind)) {\n return this.parseIdentOrFunction();\n }\n\n this.syntaxError(`unexpected token ${t.kind} in expression`);\n }\n\n private parseIdentOrFunction(): Expr {\n const name = this.parseIdent();\n if (this.match(\"LPAREN\")) {\n return this.finishCall(name);\n }\n if (this.match(\"DOT\")) {\n const col = this.parseIdent();\n return { type: \"column\", table: name, name: col };\n }\n return { type: \"column\", table: null, name };\n }\n\n private finishCall(name: string): Expr {\n let distinct = false;\n if (this.match(\"DISTINCT\")) distinct = true;\n else this.match(\"ALL\");\n\n let args: Expr[] | \"*\";\n let filter: Expr | null = null;\n\n if (this.match(\"STAR\")) {\n args = \"*\";\n } else {\n args = [];\n if (!this.at(\"RPAREN\")) {\n do {\n (args as Expr[]).push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n }\n const orderBy = this.parseOrderBy();\n this.expect(\"RPAREN\");\n\n if (this.check(\"IGNORE\", \"RESPECT\")) {\n this.advance();\n this.match(\"NULLS\");\n throw new SqliteError('near \"NULLS\": syntax error', \"syntax\");\n }\n\n if (this.match(\"FILTER\")) {\n this.expect(\"LPAREN\");\n this.expect(\"WHERE\");\n filter = this.parseExpr();\n this.expect(\"RPAREN\");\n }\n\n const upper = name.toUpperCase();\n const argCount = args === \"*\" ? 1 : args.length;\n // min()/max() with 2+ args are scalar; single-arg (or *) forms are aggregates.\n const isAgg = AGGREGATE_FUNCTIONS.has(upper) && !(argCount >= 2 && (upper === \"MIN\" || upper === \"MAX\"));\n\n if (this.match(\"OVER\")) {\n let window: WindowSpec;\n if (this.at(\"IDENT\") || IDENT_KEYWORDS.has(this.current().kind)) {\n const winName = this.parseIdent();\n window = { partitionBy: [], orderBy: [], frame: null, ref: winName };\n } else {\n this.expect(\"LPAREN\");\n window = this.parseWindowSpec();\n this.expect(\"RPAREN\");\n }\n const func = isAgg\n ? { type: \"aggregate\" as const, name: upper, distinct, args, orderBy, filter }\n : { type: \"function\" as const, name, distinct, args, orderBy, filter };\n return { type: \"window\", func, window };\n }\n\n if (isAgg) {\n return { type: \"aggregate\", name: upper, distinct, args, orderBy, filter };\n }\n return { type: \"function\", name, distinct, args, orderBy, filter };\n }\n\n private parseCaseExpr(base: Expr | null): CaseExpr {\n const whens: { when: Expr; then: Expr }[] = [];\n while (this.match(\"WHEN\")) {\n const when = this.parseExpr();\n this.expect(\"THEN\");\n const then = this.parseExpr();\n whens.push({ when, then });\n }\n let elseExpr: Expr | null = null;\n if (this.match(\"ELSE\")) elseExpr = this.parseExpr();\n this.expect(\"END\");\n return { type: \"case\", base, whens, else: elseExpr };\n }\n\n private parseWindowSpec(): WindowSpec {\n const partitionBy: Expr[] = [];\n const orderBy: OrderByItem[] = [];\n let frame: FrameSpec | null = null;\n\n if (this.match(\"PARTITION\")) {\n this.expect(\"BY\");\n do {\n partitionBy.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n\n if (this.match(\"ORDER\")) {\n this.expect(\"BY\");\n do {\n const expr = this.parseExpr();\n let dir: \"ASC\" | \"DESC\" = \"ASC\";\n if (this.match(\"ASC\")) dir = \"ASC\";\n else if (this.match(\"DESC\")) dir = \"DESC\";\n let nulls: \"FIRST\" | \"LAST\" | null = null;\n if (this.match(\"NULLS\")) {\n if (this.match(\"FIRST\")) nulls = \"FIRST\";\n else if (this.match(\"LAST\")) nulls = \"LAST\";\n }\n orderBy.push({ expr, dir, nulls });\n } while (this.match(\"COMMA\"));\n }\n\n if (this.check(\"IGNORE\", \"RESPECT\")) {\n const keyword = this.advance().value.toUpperCase();\n this.match(\"NULLS\");\n throw new SqliteError(`near \"${keyword}\": syntax error`, \"syntax\");\n }\n\n if (this.check(\"ROWS\", \"RANGE\", \"GROUPS\")) {\n frame = this.parseFrameSpec();\n }\n\n return { partitionBy, orderBy, frame };\n }\n\n private parseFrameSpec(): FrameSpec {\n let type: FrameSpec[\"type\"] = \"ROWS\";\n if (this.match(\"RANGE\")) type = \"RANGE\";\n else if (this.match(\"GROUPS\")) type = \"GROUPS\";\n else this.expect(\"ROWS\");\n\n let start: FrameBound;\n let end: FrameBound;\n\n if (this.match(\"BETWEEN\")) {\n start = this.parseFrameBound(true);\n this.expect(\"AND\");\n end = this.parseFrameBound(false);\n } else {\n start = this.parseFrameBound(true);\n end = { kind: \"current_row\" };\n }\n\n let exclude: FrameSpec[\"exclude\"] = null;\n if (this.match(\"EXCLUDE\")) {\n if (this.match(\"NO\")) {\n this.expect(\"OTHERS\");\n exclude = \"no_others\";\n } else if (this.match(\"CURRENT\")) {\n this.expect(\"ROW\");\n exclude = \"current_row\";\n } else if (this.match(\"GROUP\")) exclude = \"group\";\n else if (this.match(\"TIES\")) exclude = \"ties\";\n else this.syntaxError(\"expected EXCLUDE CURRENT ROW, GROUP, TIES, or NO OTHERS\");\n }\n\n return { type, start, end, exclude };\n }\n\n private parseFrameBound(precedingSide: boolean): FrameBound {\n if (this.match(\"UNBOUNDED\")) {\n if (this.match(\"PRECEDING\")) return { kind: \"unbounded_preceding\" };\n this.expect(\"FOLLOWING\");\n return { kind: \"unbounded_following\" };\n }\n if (this.match(\"CURRENT\")) {\n this.expect(\"ROW\");\n return { kind: \"current_row\" };\n }\n const expr = this.parseExpr();\n if (this.match(\"PRECEDING\")) return { kind: \"preceding\", expr };\n if (this.match(\"FOLLOWING\")) return { kind: \"following\", expr };\n if (precedingSide) return { kind: \"preceding\", expr };\n return { kind: \"following\", expr };\n }\n}\n\nexport function parseTokens(tokens: Token[], source = \"\"): Statement[] {\n return new Parser(tokens, source).parseStatements();\n}\n\n/** Parse SQL into AST statements paired with source slices. */\nexport function parseTokenUnits(tokens: Token[], source: string): ParsedUnit[] {\n return new Parser(tokens, source).parseUnits();\n}\n", "import type { Statement as ParsedStatement } from \"../ast/nodes.ts\";\nimport { tokenize } from \"../lexer/tokenize.ts\";\nimport { type ParsedUnit, parseTokenUnits } from \"./parser.ts\";\n\n/** Parsed SQL statement AST (`SELECT`, `INSERT`, `CREATE TABLE`, \u2026). */\nexport type { Statement as ParsedStatement } from \"../ast/nodes.ts\";\nexport type { ParsedUnit } from \"./parser.ts\";\nexport { parseTokens, parseTokenUnits } from \"./parser.ts\";\n\n/**\n * Tokenize `sql` and parse every semicolon-separated statement.\n *\n * @param sql - SQLite SQL text.\n * @returns AST statements in source order.\n */\nexport function parse(sql: string): ParsedStatement[] {\n return parseUnits(sql).map((unit) => unit.statement);\n}\n\n/**\n * Parse SQL into AST + per-statement source slices (for `sqlite_master.sql`).\n */\nexport function parseUnits(sql: string): ParsedUnit[] {\n return parseTokenUnits(tokenize(sql), sql);\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 `date('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 SQLite (`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()` / `randomblob()`. Default is seeded xorshift64*. */\nexport type RandomMode = \"deterministic\" | \"os\";\n\n/** Options for {@link Database} construction. All fields are optional. */\nexport interface DatabaseOptions {\n /**\n * Seed for deterministic `random()` (and any other PRNG-backed builtins).\n * Defaults to {@link DEFAULT_DATABASE_SEED} (`1`). Ignored when {@link random} is `\"os\"`.\n */\n seed?: number | bigint;\n /**\n * Entropy for `random()` / `randomblob()`.\n * `\"deterministic\"` (default) uses {@link seed}. `\"os\"` uses CSPRNG like SQLite\n * (not rolled back with transactions; not restored from snapshots).\n */\n random?: RandomMode;\n /**\n * Clock for `date('now')` / `datetime('now')` / 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 SQLite.\n */\n now?: Date | Clock | \"system\";\n /**\n * Retained timeline checkpoints. Branch heads and the origin pin are never\n * collected. Default 1,000.\n */\n maxCheckpoints?: number;\n}\n\n/** Default {@link DatabaseOptions.seed} when constructing a {@link Database}. */\nexport const DEFAULT_DATABASE_SEED = 1;\n", "/**\n * Deterministic 64-bit PRNG (xorshift64*).\n * Used for SQLite `random()` and any other 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 /** SQLite `random()` style signed 64-bit integer in [-2^63+1, 2^63-1]. */\n nextSqliteRandom(): bigint {\n const bits = this.nextU64();\n let signed = BigInt.asIntN(64, bits);\n if (signed === -(1n << 63n)) signed += 1n;\n return signed;\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 /** 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()` / `randomblob()` when {@link DatabaseOptions.random}\n * is `\"os\"`. `setState` is a no-op so 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", "/**\n * SQLite 3.51 REAL \u2192 text formatting (`%!.15g`), ported from sqlite3FpDecode + etGENERIC.\n */\n// biome-ignore-all lint/correctness/noPrecisionLoss: Dekker constants match SQLite C double literals\n\nimport { dekkerMul2 } from \"./sqlite-atof.ts\";\n\nconst ZBUF_SIZE = 32;\n\ninterface FpDecode {\n iDP: number;\n n: number;\n z: string[];\n sign: \"-\" | \"+\";\n isSpecial: number;\n}\n\nfunction doubleToU64(value: number): bigint {\n if (!Number.isFinite(value) || value <= 0) return 0n;\n return BigInt(Math.trunc(value));\n}\n\n/** Port of sqlite3FpDecode (sqlite3.c ~36884). */\nfunction fpDecode(r: number, iRound: number, mxRound: number): FpDecode {\n const zBuf = new Array<string>(ZBUF_SIZE).fill(\"0\");\n let sign: \"-\" | \"+\" = \"+\";\n let isSpecial = 0;\n\n if (r < 0) {\n sign = \"-\";\n r = -r;\n } else if (r === 0) {\n return { sign: \"+\", isSpecial: 0, iDP: 1, n: 1, z: [\"0\"] };\n }\n\n const buf = new ArrayBuffer(8);\n const view = new DataView(buf);\n view.setFloat64(0, r, true);\n const bits = view.getBigUint64(0, true);\n const e = Number(bits >> 52n);\n if ((e & 0x7ff) === 0x7ff) {\n isSpecial = bits === 0x7ff0000000000000n ? 1 : 2;\n return { sign, isSpecial, iDP: 0, n: 0, z: [] };\n }\n\n const rr: [number, number] = [r, 0];\n let exp = 0;\n\n if (rr[0] > 9.223372036854774784e18) {\n while (rr[0] > 9.223372036854774784e118) {\n exp += 100;\n dekkerMul2(rr, 1.0e-100, -1.99918998026028836196e-117);\n }\n while (rr[0] > 9.223372036854774784e28) {\n exp += 10;\n dekkerMul2(rr, 1.0e-10, -3.6432197315497741579e-27);\n }\n while (rr[0] > 9.223372036854774784e18) {\n exp += 1;\n dekkerMul2(rr, 1.0e-1, -5.5511151231257827021e-18);\n }\n } else {\n while (rr[0] < 9.223372036854774784e-83) {\n exp -= 100;\n dekkerMul2(rr, 1.0e100, -1.5902891109759918046e83);\n }\n while (rr[0] < 9.223372036854774784e7) {\n exp -= 10;\n dekkerMul2(rr, 1.0e10, 0.0);\n }\n while (rr[0] < 9.22337203685477478e17) {\n exp -= 1;\n dekkerMul2(rr, 1.0e1, 0.0);\n }\n }\n\n let v = rr[1] < 0 ? doubleToU64(rr[0]) - doubleToU64(-rr[1]) : doubleToU64(rr[0]) + doubleToU64(rr[1]);\n\n let i = ZBUF_SIZE - 1;\n while (v > 0n) {\n zBuf[i--] = String(Number(v % 10n));\n v /= 10n;\n }\n\n let n = ZBUF_SIZE - 1 - i;\n let iDP = n + exp;\n\n let roundAt = iRound;\n if (roundAt <= 0) {\n roundAt = iDP - roundAt;\n if (roundAt === 0 && zBuf[i + 1]! >= \"5\") {\n roundAt = 1;\n zBuf[i--] = \"0\";\n n++;\n iDP++;\n }\n }\n\n if (roundAt > 0 && (roundAt < n || n > mxRound)) {\n const zStart = i + 1;\n if (roundAt > mxRound) roundAt = mxRound;\n n = roundAt;\n if (zBuf[zStart + roundAt]! >= \"5\") {\n let j = roundAt - 1;\n while (true) {\n const ch = zBuf[zStart + j]!;\n if (ch < \"9\") {\n zBuf[zStart + j] = String.fromCharCode(ch.charCodeAt(0) + 1);\n break;\n }\n zBuf[zStart + j] = \"0\";\n if (j === 0) {\n zBuf[i--] = \"1\";\n n++;\n iDP++;\n break;\n }\n j--;\n }\n }\n }\n\n while (n > 0 && zBuf[i + n] === \"0\") n--;\n\n return { sign, isSpecial, iDP, n, z: zBuf.slice(i + 1, i + 1 + n) };\n}\n\nfunction appendDigits(parts: string[], s: FpDecode, j: number, count: number): number {\n for (let k = 0; k < count; k++) {\n parts.push(j < s.n ? s.z[j++]! : \"0\");\n }\n return j;\n}\n\n/** `%!.15g` for REAL\u2192TEXT (etGENERIC + flag_altform2). */\nexport function formatRealAsTextSqlite(value: number): string {\n if (Object.is(value, -0)) return \"0.0\";\n if (!Number.isFinite(value)) {\n if (Number.isNaN(value)) return \"NaN\";\n return value > 0 ? \"Inf\" : \"-Inf\";\n }\n if (value === 0) return \"0.0\";\n\n const s = fpDecode(value, 15, 26);\n if (s.isSpecial === 2) return \"NaN\";\n if (s.isSpecial === 1) return s.sign === \"-\" ? \"-Inf\" : \"Inf\";\n\n let precision = 15;\n const exp = s.iDP - 1;\n precision--;\n\n let useExp: boolean;\n if (exp < -4 || exp > precision) {\n useExp = true;\n } else {\n precision -= exp;\n useExp = false;\n }\n\n const parts: string[] = [];\n if (s.sign === \"-\") parts.push(\"-\");\n\n const e2 = useExp ? 0 : s.iDP - 1;\n let j = 0;\n if (e2 < 0) {\n parts.push(\"0\");\n } else {\n for (let e = e2; e >= 0; e--) {\n parts.push(j < s.n ? s.z[j++]! : \"0\");\n }\n }\n\n parts.push(\".\");\n\n let e = e2 + 1;\n let prec = precision;\n while (e < 0 && prec > 0) {\n parts.push(\"0\");\n prec--;\n e++;\n }\n j = appendDigits(parts, s, j, prec);\n\n let end = parts.length;\n while (end > 0 && parts[end - 1] === \"0\") end--;\n if (end > 0 && parts[end - 1] === \".\") {\n parts.splice(end, 0, \"0\");\n end++;\n }\n\n let out = parts.slice(0, end).join(\"\");\n\n if (useExp) {\n out += \"e\";\n if (exp < 0) {\n out += \"-\";\n let absExp = -exp;\n if (absExp >= 100) {\n out += String(Math.floor(absExp / 100));\n absExp %= 100;\n }\n out += String(Math.floor(absExp / 10));\n out += String(absExp % 10);\n } else {\n out += \"+\";\n let absExp = exp;\n if (absExp >= 100) {\n out += String(Math.floor(absExp / 100));\n absExp %= 100;\n }\n out += String(Math.floor(absExp / 10));\n out += String(absExp % 10);\n }\n }\n\n return out;\n}\n", "import { sqliteAtoF } from \"./sqlite-atof.ts\";\nimport { formatRealAsTextSqlite } from \"./sqlite-real-format.ts\";\n\n/** SQLite storage class of a {@link SqlValue} (`null` / `integer` / `real` / `text` / `blob`). */\nexport type StorageClass = \"null\" | \"integer\" | \"real\" | \"text\" | \"blob\";\n\n/** Integer-valued REAL that must not collapse to the integer storage class. */\nexport class SqlReal {\n /** IEEE float payload (`-0` already canonicalized to `+0`). */\n readonly value: number;\n constructor(value: number) {\n this.value = canonicalizeNumber(value);\n }\n valueOf(): number {\n return this.value;\n }\n toString(): string {\n return String(this.value);\n }\n}\n\n/** SQLite JSON subtype (74 / 'J') \u2014 text that nested JSON APIs treat as JSON, not a string. */\nexport const JSON_SUBTYPE = 74;\n\n/** TEXT value with SQLite JSON subtype 74 \u2014 nested JSON APIs treat it as JSON, not a string. */\nexport class SqlJsonText {\n readonly value: string;\n readonly subtype = JSON_SUBTYPE;\n constructor(value: string) {\n this.value = value;\n }\n valueOf(): string {\n return this.value;\n }\n toString(): string {\n return this.value;\n }\n}\n\n/** A SQLite value: NULL, integer/real, text, blob, or a typed REAL/JSON wrapper. */\nexport type SqlValue = null | number | bigint | string | Uint8Array | SqlReal | SqlJsonText;\n\n/**\n * A value as it appears in query result rows.\n * {@link SqlReal} and {@link SqlJsonText} wrappers are unwrapped at the JS API surface.\n */\nexport type QueryValue = null | number | bigint | string | Uint8Array;\n\n/** A result row keyed by column name. Duplicate SELECT names keep the last value. */\nexport type QueryRow = Record<string, QueryValue>;\n\n/**\n * Values accepted by bind slots (`?`, `?NNN`, `:name`, `@name`, `$name`).\n * Booleans become integer 0/1; {@link ArrayBuffer} is copied as a BLOB.\n */\nexport type BindValue = SqlValue | boolean | ArrayBuffer;\n\n/** Column type affinity from a declared type name (SQLite affinity rules). */\nexport type Affinity = \"TEXT\" | \"NUMERIC\" | \"INTEGER\" | \"REAL\" | \"BLOB\";\n\n/** Canonicalize IEEE `-0` to `+0` for cross-runtime determinism. */\nexport function canonicalizeNumber(value: number): number {\n return Object.is(value, -0) ? 0 : value;\n}\n\n/** Wrap `value` as {@link SqlReal} so it stays REAL even when it is an integer. */\nexport function asSqlReal(value: number): SqlReal {\n return new SqlReal(value);\n}\n\n/** `true` when `value` is a {@link SqlReal} wrapper. */\nexport function isSqlReal(value: SqlValue): value is SqlReal {\n return value instanceof SqlReal;\n}\n\n/** `true` when `value` is a {@link SqlJsonText} wrapper. */\nexport function isSqlJsonText(value: SqlValue): value is SqlJsonText {\n return value instanceof SqlJsonText;\n}\n\n/** Wrap `value` as {@link SqlJsonText} (JSON subtype 74). */\nexport function asSqlJsonText(value: string): SqlJsonText {\n return new SqlJsonText(value);\n}\n\n/** Strip ephemeral JSON subtype for table storage / non-JSON contexts. */\nexport function unwrapSqlValue(value: SqlValue): SqlValue {\n if (value instanceof SqlJsonText) return value.value;\n return value;\n}\n\nexport function subtypeOf(value: SqlValue): number {\n if (value instanceof SqlJsonText) return JSON_SUBTYPE;\n return 0;\n}\n\nexport function numberValueOf(value: number | bigint | SqlReal): number {\n if (typeof value === \"bigint\") return Number(value);\n if (value instanceof SqlReal) return value.value;\n return value;\n}\n\n/** SQLite storage class of `value` (`null` / `integer` / `real` / `text` / `blob`). */\nexport function storageClassOf(value: SqlValue): StorageClass {\n if (value === null) return \"null\";\n if (value instanceof SqlReal) return \"real\";\n if (value instanceof SqlJsonText) return \"text\";\n if (typeof value === \"bigint\") return \"integer\";\n if (typeof value === \"number\") {\n return Number.isInteger(value) ? \"integer\" : \"real\";\n }\n if (typeof value === \"string\") return \"text\";\n return \"blob\";\n}\n\n/** SQLite `typeof()` string for `value`. */\nexport function typeofSql(value: SqlValue): string {\n const sc = storageClassOf(value);\n if (sc === \"null\") return \"null\";\n if (sc === \"integer\") return \"integer\";\n if (sc === \"real\") return \"real\";\n if (sc === \"text\") return \"text\";\n return \"blob\";\n}\n\n/** Determine column affinity from a declared type name (SQLite rules). */\nexport function affinityFromTypeName(typeName: string | null | undefined): Affinity {\n if (!typeName) return \"BLOB\";\n const t = typeName.toUpperCase();\n if (t.includes(\"INT\")) return \"INTEGER\";\n if (t.includes(\"CHAR\") || t.includes(\"CLOB\") || t.includes(\"TEXT\")) return \"TEXT\";\n if (t.includes(\"BLOB\")) return \"BLOB\";\n if (t.includes(\"REAL\") || t.includes(\"FLOA\") || t.includes(\"DOUB\")) return \"REAL\";\n return \"NUMERIC\";\n}\n\n/** Apply column {@link Affinity} conversion rules to `value`. */\nexport function applyAffinity(value: SqlValue, affinity: Affinity): SqlValue {\n if (value === null) return null;\n\n switch (affinity) {\n case \"TEXT\":\n // BLOB and TEXT are not converted under TEXT affinity (SQLite rules).\n if (value instanceof Uint8Array) return value;\n if (value instanceof SqlJsonText) return value.value;\n if (typeof value === \"string\") return value;\n if (value instanceof SqlReal) return formatRealAsText(value.value);\n if (typeof value === \"number\") return String(canonicalizeNumber(value));\n if (typeof value === \"bigint\") return value.toString();\n return String(value);\n case \"INTEGER\": {\n if (value instanceof Uint8Array) return value;\n const n = coerceToNumber(value);\n if (n === null) return value;\n if (typeof value === \"bigint\") return value;\n return Number.isInteger(n) && Number.isSafeInteger(n) ? Math.trunc(n) : canonicalizeNumber(n);\n }\n case \"REAL\": {\n if (value instanceof Uint8Array) return value;\n const n = coerceToNumber(value);\n return n === null ? value : asSqlReal(n);\n }\n case \"NUMERIC\": {\n if (value instanceof Uint8Array) return value;\n const n = coerceToNumber(value);\n if (n === null) return value;\n if (Number.isInteger(n) && Number.isSafeInteger(n)) return Math.trunc(n);\n return canonicalizeNumber(n);\n }\n case \"BLOB\":\n // BLOB affinity never converts storage classes.\n return value;\n }\n}\n\n/** Format a REAL for TEXT affinity / CAST AS TEXT (SQLite `%!.15g`). */\nexport function formatRealAsText(value: number): string {\n return formatRealAsTextSqlite(canonicalizeNumber(value));\n}\n\n/**\n * Apply SQLite comparison affinity rules before comparing two values.\n * A null affinity represents an expression with no affinity.\n */\nexport function applyComparisonAffinity(\n left: SqlValue,\n right: SqlValue,\n leftAffinity: Affinity | null,\n rightAffinity: Affinity | null,\n): [SqlValue, SqlValue] {\n const leftNumeric = leftAffinity === \"INTEGER\" || leftAffinity === \"REAL\" || leftAffinity === \"NUMERIC\";\n const rightNumeric = rightAffinity === \"INTEGER\" || rightAffinity === \"REAL\" || rightAffinity === \"NUMERIC\";\n const leftNone = leftAffinity === null || leftAffinity === \"BLOB\";\n const rightNone = rightAffinity === null || rightAffinity === \"BLOB\";\n\n if (leftNumeric && (rightAffinity === \"TEXT\" || rightNone)) {\n const affinity = leftAffinity === \"REAL\" ? \"REAL\" : \"NUMERIC\";\n return [left, applyAffinity(right, affinity)];\n }\n if (rightNumeric && (leftAffinity === \"TEXT\" || leftNone)) {\n const affinity = rightAffinity === \"REAL\" ? \"REAL\" : \"NUMERIC\";\n return [applyAffinity(left, affinity), right];\n }\n if (leftAffinity === \"TEXT\" && rightNone) return [left, applyAffinity(right, \"TEXT\")];\n if (rightAffinity === \"TEXT\" && leftNone) return [applyAffinity(left, \"TEXT\"), right];\n return [left, right];\n}\n\n/** Prefix numeric parse for arithmetic / boolean (sqlite3AtoF). */\nexport function coerceToNumberPrefix(value: SqlValue): number {\n if (value === null) return 0;\n if (value instanceof SqlReal) return value.value;\n if (value instanceof SqlJsonText) return coerceToNumberPrefix(value.value);\n if (typeof value === \"number\") return canonicalizeNumber(value);\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"string\") return canonicalizeNumber(sqliteAtoF(value));\n if (value instanceof Uint8Array) return canonicalizeNumber(sqliteAtoF(utf8Decode(value)));\n return 0;\n}\n\n/** Parse `value` as a number, or `null` when it is not numeric. */\nexport function coerceToNumber(value: SqlValue): number | null {\n if (value === null) return null;\n if (value instanceof SqlReal) return value.value;\n if (value instanceof SqlJsonText) return coerceToNumber(value.value);\n if (typeof value === \"number\") return canonicalizeNumber(value);\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"string\") {\n const s = value.trim();\n if (s === \"\") return null;\n const n = Number(s);\n if (!Number.isNaN(n) && /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$/.test(s)) {\n return canonicalizeNumber(n);\n }\n return null;\n }\n if (value instanceof Uint8Array) {\n return coerceToNumber(utf8Decode(value));\n }\n return null;\n}\n\n/** Truncate `value` toward zero as an integer, or `null` when it is not numeric. */\nexport function toInteger(value: SqlValue): number | bigint | null {\n if (value === null) return null;\n if (typeof value === \"bigint\") return value;\n if (value instanceof SqlReal) return Math.trunc(value.value);\n if (value instanceof SqlJsonText) return toInteger(value.value);\n if (typeof value === \"number\") return Math.trunc(value);\n if (typeof value === \"string\") {\n const n = coerceToNumber(value);\n return n === null ? null : Math.trunc(n);\n }\n return null;\n}\n\n/** SQLite `=` / `IS` equality for two non-NULL values (`NULL = NULL` is false here). */\nexport function sqlValueEquals(a: SqlValue, b: SqlValue): boolean {\n if (a === null || b === null) return false;\n if (a instanceof Uint8Array && b instanceof Uint8Array) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n }\n const an = a instanceof SqlReal ? a.value : a instanceof SqlJsonText ? a.value : a;\n const bn = b instanceof SqlReal ? b.value : b instanceof SqlJsonText ? b.value : b;\n if (typeof an === \"bigint\" || typeof bn === \"bigint\") {\n try {\n return BigInt(an as number | bigint) === BigInt(bn as number | bigint);\n } catch {\n return false;\n }\n }\n if (typeof an === \"number\" && typeof bn === \"number\") return Object.is(an, bn);\n return an === bn;\n}\n\n/**\n * SQLite comparison for ORDER BY / inequalities.\n * Returns -1, 0, 1, or null if either side is NULL (SQL NULL).\n */\nexport function compareSql(a: SqlValue, b: SqlValue): number | null {\n if (a === null || b === null) return null;\n\n const ca = comparisonClass(a);\n const cb = comparisonClass(b);\n if (ca !== cb) return ca < cb ? -1 : 1;\n\n if (ca === 1) {\n // numbers \u2014 compare floats before BigInt conversion (NaN/Inf must not reach BigInt)\n const fa = a instanceof SqlReal ? a.value : typeof a === \"number\" ? a : typeof a === \"bigint\" ? null : Number(a);\n const fb = b instanceof SqlReal ? b.value : typeof b === \"number\" ? b : typeof b === \"bigint\" ? null : Number(b);\n if (typeof a === \"bigint\" && typeof b === \"bigint\") {\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n }\n if (typeof a === \"bigint\" || typeof b === \"bigint\") {\n const left = typeof a === \"bigint\" ? Number(a) : (fa as number);\n const right = typeof b === \"bigint\" ? Number(b) : (fb as number);\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n }\n const left = fa as number;\n const right = fb as number;\n if (Number.isNaN(left) && Number.isNaN(right)) return 0;\n if (Number.isNaN(left)) return 1;\n if (Number.isNaN(right)) return -1;\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n }\n\n if (ca === 2) {\n const sa = a instanceof SqlJsonText ? a.value : String(a);\n const sb = b instanceof SqlJsonText ? b.value : String(b);\n if (sa < sb) return -1;\n if (sa > sb) return 1;\n return 0;\n }\n\n // blobs\n const ba = a instanceof Uint8Array ? a : utf8Encode(String(a));\n const bb = b instanceof Uint8Array ? b : utf8Encode(String(b));\n const len = Math.min(ba.length, bb.length);\n for (let i = 0; i < len; i++) {\n const d = (ba[i] ?? 0) - (bb[i] ?? 0);\n if (d !== 0) return d < 0 ? -1 : 1;\n }\n if (ba.length < bb.length) return -1;\n if (ba.length > bb.length) return 1;\n return 0;\n}\n\n/** SQLite sort order: NULL < numbers < text < blob */\nfunction comparisonClass(v: SqlValue): number {\n if (v === null) return 0;\n if (v instanceof SqlReal || typeof v === \"number\" || typeof v === \"bigint\") return 1;\n if (typeof v === \"string\" || v instanceof SqlJsonText) return 2;\n return 3;\n}\n\n/** UTF-8 encode `s` (SQLite TEXT \u2192 BLOB). */\nconst TEXT_ENCODER = new TextEncoder();\nconst TEXT_DECODER = new TextDecoder();\n\nexport function utf8Encode(s: string): Uint8Array {\n return TEXT_ENCODER.encode(s);\n}\n\n/** UTF-8 decode `b` (SQLite BLOB \u2192 TEXT). */\nexport function utf8Decode(b: Uint8Array): string {\n return TEXT_DECODER.decode(b);\n}\n\n/** Deep-copy blobs and REAL/JSON wrappers; primitives are returned as-is. */\nexport function cloneSqlValue(v: SqlValue): SqlValue {\n if (v instanceof Uint8Array) return new Uint8Array(v);\n if (v instanceof SqlReal) return new SqlReal(v.value);\n if (v instanceof SqlJsonText) return new SqlJsonText(v.value);\n return v;\n}\n\n/**\n * SQLite boolean truthiness (WHERE / HAVING / CASE / AND / OR / NOT).\n * Text/blob use longest-prefix numeric conversion (sqlite3AtoF); non-numeric \u2192 0.\n */\nexport function isTruthySql(v: SqlValue): boolean | null {\n if (v === null) return null;\n if (v instanceof SqlReal) return v.value !== 0;\n if (typeof v === \"number\") return v !== 0 && !Number.isNaN(v);\n if (typeof v === \"bigint\") return v !== 0n;\n if (typeof v === \"string\" || v instanceof Uint8Array || v instanceof SqlJsonText) {\n const text = typeof v === \"string\" ? v : v instanceof SqlJsonText ? v.value : utf8Decode(v);\n const n = sqliteAtoF(text);\n return n !== 0 && !Number.isNaN(n);\n }\n return false;\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { Rowid } from \"../storage/row.ts\";\nimport { compareSql, isSqlJsonText, isSqlReal, type SqlValue } from \"../types/value.ts\";\n\nexport class IndexStore {\n readonly name: string;\n private entries: Map<string, Rowid[]>;\n private keyValues: Map<string, SqlValue[]>;\n private sortedKeys: string[] | null;\n private mapsShared = false;\n frozen = false;\n\n constructor(\n name = \"index\",\n entries?: ReadonlyMap<string, readonly Rowid[]>,\n keyValues?: ReadonlyMap<string, readonly SqlValue[]>,\n ) {\n this.name = name;\n this.entries = new Map();\n this.keyValues = new Map();\n this.sortedKeys = null;\n if (entries) {\n for (const [key, rowids] of entries) this.entries.set(key, [...rowids]);\n }\n if (keyValues) {\n for (const [key, values] of keyValues) this.keyValues.set(key, [...values]);\n }\n }\n\n checkUnique(values: readonly SqlValue[], rowid?: Rowid): void {\n // SQLite treats NULLs as distinct for UNIQUE; skip conflict checks.\n if (values.some((value) => value === null)) return;\n const key = serializeIndexEntry(values);\n const existing = this.entries.get(key);\n if (!existing) return;\n for (const id of existing) {\n if (rowid === undefined || !sameRowid(id, rowid)) {\n throw new SqliteError(\n `UNIQUE constraint failed: ${this.name}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n }\n }\n\n insert(values: readonly SqlValue[], rowid: Rowid, unique = true): void {\n this.assertMutable();\n const key = serializeIndexEntry(values);\n if (unique) this.checkUnique(values, rowid);\n const existing = this.entries.get(key);\n if (!existing) {\n this.entries.set(key, [rowid]);\n this.keyValues.set(key, [...values]);\n this.sortedKeys = null;\n return;\n }\n for (const id of existing) if (sameRowid(id, rowid)) return;\n existing.push(rowid);\n }\n\n lookup(values: readonly SqlValue[]): readonly Rowid[] {\n // SQL `=` never matches NULL; IS NULL is a different access path.\n if (values.some((value) => value === null)) return [];\n const key = serializeIndexEntry(values);\n return this.entries.get(key) ?? [];\n }\n\n /** Leftmost prefix match: INDEX(a,b) used for WHERE a = ?. */\n lookupPrefix(values: readonly SqlValue[]): readonly Rowid[] {\n if (values.length === 0) return [];\n if (values.some((value) => value === null)) return [];\n const prefix = serializeIndexEntry(values);\n const exact = this.entries.get(prefix);\n const rowids: Rowid[] = exact ? [...exact] : [];\n const keys = this.orderedKeys();\n let start = 0;\n let end = keys.length;\n while (start < end) {\n const mid = (start + end) >>> 1;\n const kv = this.keyValues.get(keys[mid]!);\n if (!kv || prefixKeyLess(kv, values)) start = mid + 1;\n else end = mid;\n }\n for (let i = start; i < keys.length; i++) {\n const kv = this.keyValues.get(keys[i]!);\n if (!kv || !prefixKeyMatches(kv, values)) break;\n const key = keys[i]!;\n if (key === prefix) continue;\n rowids.push(...(this.entries.get(key) ?? []));\n }\n return rowids;\n }\n\n /**\n * Ordered scan of rowids for a single-column comparison.\n * `op` applies to the first key component.\n */\n rangeLookup(op: \">\" | \">=\" | \"<\" | \"<=\" | \"between\", bound: SqlValue, bound2?: SqlValue): readonly Rowid[] {\n const keys = this.orderedKeys();\n const rowids: Rowid[] = [];\n const start = lowerBoundKeyValues(keys, this.keyValues, bound, op === \">\" ? \"gt\" : op === \">=\" ? \"ge\" : \"any\");\n const end =\n op === \"<\" || op === \"<=\"\n ? upperBoundKeyValues(keys, this.keyValues, bound, op === \"<\" ? \"lt\" : \"le\")\n : op === \"between\" && bound2 !== undefined\n ? upperBoundKeyValues(keys, this.keyValues, bound2, \"le\")\n : keys.length;\n for (let i = start; i < end; i++) {\n const key = keys[i]!;\n const values = this.keyValues.get(key);\n if (!values || values[0] === undefined || values[0] === null) continue;\n const cmp = compareSerializedOrder(values[0], bound);\n let ok = false;\n if (op === \">\") ok = cmp > 0;\n else if (op === \">=\") ok = cmp >= 0;\n else if (op === \"<\") ok = cmp < 0;\n else if (op === \"<=\") ok = cmp <= 0;\n else if (op === \"between\" && bound2 !== undefined) {\n ok = cmp >= 0 && compareSerializedOrder(values[0], bound2) <= 0;\n }\n if (ok) {\n const ids = this.entries.get(key);\n if (ids) rowids.push(...ids);\n }\n }\n return rowids;\n }\n\n orderedRowids(desc = false): readonly Rowid[] {\n const keys = this.orderedKeys();\n const rowids: Rowid[] = [];\n const seq = desc ? [...keys].reverse() : keys;\n for (const key of seq) {\n const ids = this.entries.get(key);\n if (ids) rowids.push(...ids);\n }\n return rowids;\n }\n\n remove(values: readonly SqlValue[], rowid?: Rowid): boolean {\n this.assertMutable();\n const key = serializeIndexEntry(values);\n const existing = this.entries.get(key);\n if (!existing) return false;\n if (rowid === undefined) {\n this.entries.delete(key);\n this.keyValues.delete(key);\n this.sortedKeys = null;\n return true;\n }\n const index = existing.findIndex((id) => sameRowid(id, rowid));\n if (index < 0) return false;\n existing.splice(index, 1);\n if (existing.length === 0) {\n this.entries.delete(key);\n this.keyValues.delete(key);\n this.sortedKeys = null;\n }\n return true;\n }\n\n clear(): void {\n this.assertMutable();\n this.entries.clear();\n this.keyValues.clear();\n this.sortedKeys = null;\n }\n\n clone(): IndexStore {\n const copy = new IndexStore(this.name);\n copy.entries = this.entries;\n copy.keyValues = this.keyValues;\n copy.sortedKeys = this.sortedKeys;\n copy.mapsShared = true;\n return copy;\n }\n\n freeze(): void {\n this.frozen = true;\n }\n\n /** Sorted entries for SQLM v3 persistence. */\n snapshotEntries(): Array<{ key: string; rowids: Rowid[]; values: SqlValue[] }> {\n const keys = [...this.entries.keys()].sort();\n return keys.map((key) => ({\n key,\n rowids: [...(this.entries.get(key) ?? [])],\n values: [...(this.keyValues.get(key) ?? [])],\n }));\n }\n\n /** Sorted keys + rowids for SQLM v4 (values rebuilt from the table). */\n snapshotKeys(): Array<{ key: string; rowids: Rowid[] }> {\n const keys = [...this.entries.keys()].sort();\n return keys.map((key) => ({\n key,\n rowids: [...(this.entries.get(key) ?? [])],\n }));\n }\n\n rememberKeyValues(key: string, values: readonly SqlValue[]): void {\n this.keyValues.set(key, [...values]);\n }\n\n /** Key component values for snapshot encode (binary keys). */\n keyValuesFor(key: string): SqlValue[] {\n return [...(this.keyValues.get(key) ?? [])];\n }\n\n get size(): number {\n return this.entries.size;\n }\n\n private orderedKeys(): string[] {\n if (this.sortedKeys) return this.sortedKeys;\n const keys = [...this.entries.keys()];\n keys.sort((a, b) => {\n const left = this.keyValues.get(a);\n const right = this.keyValues.get(b);\n if (!left || !right) return a < b ? -1 : a > b ? 1 : 0;\n const n = Math.min(left.length, right.length);\n for (let i = 0; i < n; i++) {\n const a = left[i] ?? null;\n const b = right[i] ?? null;\n if (a === null && b === null) continue;\n if (a === null) return -1;\n if (b === null) return 1;\n const cmp = compareSql(a, b);\n if (cmp !== 0) return cmp ?? 0;\n }\n return left.length - right.length;\n });\n this.sortedKeys = keys;\n return keys;\n }\n\n private assertMutable(): void {\n if (this.frozen) throw new SqliteError(\"internal: cannot mutate a frozen index\", \"other\");\n this.forkMaps();\n }\n\n private forkMaps(): void {\n if (!this.mapsShared) return;\n const entries = new Map<string, Rowid[]>();\n for (const [key, rowids] of this.entries) entries.set(key, [...rowids]);\n const keyValues = new Map<string, SqlValue[]>();\n for (const [key, values] of this.keyValues) keyValues.set(key, [...values]);\n this.entries = entries;\n this.keyValues = keyValues;\n this.mapsShared = false;\n this.sortedKeys = null;\n }\n}\n\n/** Hash-join / covering-hash key: NULL components never match. */\nexport function serializeIndexKey(values: readonly SqlValue[]): string | null {\n if (values.some((value) => value === null)) return null;\n return serializeIndexEntry(values);\n}\n\n/** Index-store key: NULL is a distinct component so composite prefix lookups still hit. */\nexport function serializeIndexEntry(values: readonly SqlValue[]): string {\n return values\n .map((value) => {\n const part = value === null ? NULL_PART : serializeValue(value);\n return `${part.length}:${part}`;\n })\n .join(\"|\");\n}\n\n/** Dedicated tag; non-NULL encodings stay `t:` / `n:` / `f:` / `b:` (SQLM v3 compatible). */\nconst NULL_PART = \"z\";\n\nfunction serializeValue(value: Exclude<SqlValue, null>): string {\n if (isSqlReal(value)) {\n const n = value.value;\n if (Number.isNaN(n)) return \"f:nan\";\n if (n === Infinity) return \"f:+inf\";\n if (n === -Infinity) return \"f:-inf\";\n return `f:${Object.is(n, -0) ? \"0\" : n.toString()}`;\n }\n if (isSqlJsonText(value)) return `t:${value.value}`;\n if (typeof value === \"bigint\") return `n:${value.toString()}`;\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) return `n:${BigInt(value).toString()}`;\n if (Number.isNaN(value)) return \"f:nan\";\n if (value === Infinity) return \"f:+inf\";\n if (value === -Infinity) return \"f:-inf\";\n return `f:${Object.is(value, -0) ? \"0\" : value.toString()}`;\n }\n if (typeof value === \"string\") return `t:${value}`;\n let hex = \"\";\n for (const byte of value) hex += byte.toString(16).padStart(2, \"0\");\n return `b:${hex}`;\n}\n\nfunction compareSerializedOrder(left: SqlValue, right: SqlValue): number {\n return compareSql(left, right) ?? 0;\n}\n\nfunction prefixKeyLess(keyValues: readonly SqlValue[], prefix: readonly SqlValue[]): boolean {\n for (let i = 0; i < prefix.length; i++) {\n const cmp = compareSerializedOrder(keyValues[i] ?? null, prefix[i]!);\n if (cmp !== 0) return cmp < 0;\n }\n return false;\n}\n\nfunction prefixKeyMatches(keyValues: readonly SqlValue[], prefix: readonly SqlValue[]): boolean {\n for (let i = 0; i < prefix.length; i++) {\n if (compareSerializedOrder(keyValues[i] ?? null, prefix[i]!) !== 0) return false;\n }\n return true;\n}\n\nfunction lowerBoundKeyValues(\n keys: readonly string[],\n keyValues: ReadonlyMap<string, SqlValue[]>,\n bound: SqlValue,\n mode: \"gt\" | \"ge\" | \"any\",\n): number {\n let lo = 0;\n let hi = keys.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n const value = keyValues.get(keys[mid]!)?.[0];\n if (value === undefined || value === null) {\n lo = mid + 1;\n continue;\n }\n const cmp = compareSerializedOrder(value, bound);\n const before = mode === \"gt\" ? cmp <= 0 : mode === \"ge\" ? cmp < 0 : false;\n if (before) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\nfunction upperBoundKeyValues(\n keys: readonly string[],\n keyValues: ReadonlyMap<string, SqlValue[]>,\n bound: SqlValue,\n mode: \"lt\" | \"le\",\n): number {\n let lo = 0;\n let hi = keys.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n const value = keyValues.get(keys[mid]!)?.[0];\n if (value === undefined || value === null) {\n lo = mid + 1;\n continue;\n }\n const cmp = compareSerializedOrder(value, bound);\n const after = mode === \"lt\" ? cmp >= 0 : cmp > 0;\n if (after) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n}\n\nfunction sameRowid(left: Rowid, right: Rowid): boolean {\n return typeof left === \"bigint\" || typeof right === \"bigint\" ? BigInt(left) === BigInt(right) : left === right;\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { asSqlReal, coerceToNumber, isSqlReal, type SqlValue, storageClassOf, utf8Decode } from \"./value.ts\";\n\nconst STRICT_TYPES = new Set([\"INT\", \"INTEGER\", \"REAL\", \"TEXT\", \"BLOB\", \"ANY\"]);\n\nexport function isStrictTypeName(typeName: string | null | undefined): boolean {\n if (!typeName) return false;\n return STRICT_TYPES.has(typeName.trim().toUpperCase());\n}\n\nexport function applyStrictValue(value: SqlValue, typeName: string, table: string, column: string): SqlValue {\n if (value === null) return null;\n const declared = typeName.trim().toUpperCase();\n const storage = storageClassOf(value);\n if (declared === \"ANY\") return value;\n\n if (declared === \"TEXT\") {\n if (storage === \"text\") return typeof value === \"string\" ? value : String((value as { value: string }).value);\n if (storage === \"integer\" || storage === \"real\") return String(isSqlReal(value) ? value.value : value);\n throw cannotStore(storage, declared, table, column);\n }\n\n if (declared === \"INT\" || declared === \"INTEGER\") {\n if (storage === \"integer\") return value;\n if (storage === \"real\") {\n const n = isSqlReal(value) ? value.value : Number(value);\n if (Number.isInteger(n)) return n;\n throw cannotStore(storage, declared, table, column);\n }\n if (storage === \"text\") {\n const n = coerceToNumber(value);\n if (n !== null && Number.isInteger(n) && String(value).trim() === String(n)) return n;\n throw cannotStore(storage, declared, table, column);\n }\n throw cannotStore(storage, declared, table, column);\n }\n\n if (declared === \"REAL\") {\n if (storage === \"real\") return isSqlReal(value) ? value : asSqlReal(Number(value));\n if (storage === \"integer\") return asSqlReal(typeof value === \"bigint\" ? Number(value) : Number(value));\n if (storage === \"text\") {\n const n = coerceToNumber(value);\n if (n !== null) return asSqlReal(n);\n }\n throw cannotStore(storage, declared, table, column);\n }\n\n if (declared === \"BLOB\") {\n if (storage === \"blob\") return value;\n throw cannotStore(storage, declared, table, column);\n }\n\n throw new SqliteError(`unknown datatype for ${table}.${column}: \"${typeName}\"`, \"other\");\n}\n\nfunction cannotStore(storage: string, declared: string, table: string, column: string): never {\n const shown = storage === \"integer\" ? \"INT\" : storage.toUpperCase();\n throw new SqliteError(\n `cannot store ${shown} value in ${declared} column ${table}.${column}`,\n \"datatype_mismatch\",\n \"SQLITE_CONSTRAINT_DATATYPE\",\n );\n}\n\nexport function unknownStrictType(table: string, column: string, typeName: string): never {\n throw new SqliteError(`unknown datatype for ${table}.${column}: \"${typeName}\"`, \"other\");\n}\n\n/** SQLite reports INT for the integer storage class in STRICT errors. */\nexport function strictStorageLabel(value: SqlValue): string {\n const storage = storageClassOf(value);\n if (storage === \"integer\") return \"INT\";\n if (storage === \"text\") return \"TEXT\";\n if (storage === \"real\") return \"REAL\";\n if (storage === \"blob\") return \"BLOB\";\n return \"NULL\";\n}\n\nvoid utf8Decode;\n", "import { SqliteError } from \"../../errors/index.ts\";\n\nexport type FtsKind = \"fts5\" | \"fts3\" | \"fts4\";\n\nexport type FtsDetail = \"full\" | \"column\" | \"none\";\n\nexport interface FtsColumnDef {\n name: string;\n unindexed: boolean;\n}\n\nexport interface FtsTokenizerConfig {\n /** Primary tokenizer name (unicode61, ascii, porter, trigram). */\n name: string;\n /** Base tokenizer when name is porter. */\n base?: string;\n removeDiacritics?: 0 | 1 | 2;\n tokenchars?: string;\n separators?: string;\n caseSensitive?: boolean; // trigram\n removeDiacriticsTrigram?: boolean;\n}\n\nexport interface FtsTableOptions {\n columns: FtsColumnDef[];\n content: \"normal\" | \"contentless\" | \"external\";\n contentTable: string | null;\n contentRowid: string;\n contentlessDelete: boolean;\n prefix: number[];\n columnsize: boolean;\n detail: FtsDetail;\n tokendata: boolean;\n locale: boolean;\n tokenizer: FtsTokenizerConfig;\n /** FTS3/4 */\n languageid: string | null;\n notindexed: Set<string>;\n}\n\nconst OPTION_NAMES = new Set([\n \"tokenize\",\n \"prefix\",\n \"content\",\n \"content_rowid\",\n \"contentless_delete\",\n \"columnsize\",\n \"detail\",\n \"tokendata\",\n \"locale\",\n \"languageid\",\n \"matchinfo\",\n \"order\",\n \"compress\",\n \"uncompress\",\n]);\n\nexport function parseFtsModuleArgs(moduleArgs: string[], kind: FtsKind): FtsTableOptions {\n const columns: FtsColumnDef[] = [];\n const notindexed = new Set<string>();\n let content: FtsTableOptions[\"content\"] = \"normal\";\n let contentTable: string | null = null;\n let contentRowid = \"rowid\";\n let contentlessDelete = false;\n let prefix: number[] = [];\n let columnsize = true;\n let detail: FtsDetail = \"full\";\n let tokendata = false;\n let locale = false;\n let languageid: string | null = null;\n let tokenizer: FtsTokenizerConfig = { name: \"unicode61\", removeDiacritics: 1 };\n\n for (const raw of moduleArgs) {\n const arg = raw.trim();\n if (!arg) continue;\n\n const eq = splitOption(arg);\n if (eq) {\n const key = eq.key.toLowerCase();\n const value = eq.value;\n if (!OPTION_NAMES.has(key) && kind === \"fts5\") {\n // FTS5: unknown option-like keys that aren't columns throw\n if (/^[a-z_][a-z0-9_]*$/i.test(eq.key) && value !== null) {\n // still accept known options only\n }\n }\n switch (key) {\n case \"tokenize\":\n tokenizer = parseTokenizer(value);\n break;\n case \"prefix\":\n prefix = value\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .map((part) => {\n const n = Number(part);\n if (!Number.isInteger(n) || n <= 0) throw new SqliteError(\"SQL logic error\", \"other\");\n return n;\n });\n break;\n case \"content\":\n if (value === \"\") {\n content = \"contentless\";\n contentTable = null;\n } else {\n content = \"external\";\n contentTable = value;\n }\n break;\n case \"content_rowid\":\n contentRowid = value;\n break;\n case \"contentless_delete\":\n contentlessDelete = value === \"1\" || value.toLowerCase() === \"true\";\n break;\n case \"columnsize\":\n columnsize = value !== \"0\";\n break;\n case \"detail\": {\n const d = value.toLowerCase();\n if (d !== \"full\" && d !== \"column\" && d !== \"none\") throw new SqliteError(\"SQL logic error\", \"other\");\n detail = d;\n break;\n }\n case \"tokendata\":\n tokendata = value === \"1\" || value.toLowerCase() === \"true\";\n break;\n case \"locale\":\n locale = value === \"1\" || value.toLowerCase() === \"true\";\n break;\n case \"languageid\":\n languageid = value;\n break;\n default:\n // Treat as column name = something invalid for FTS5 \u2192 column with odd name\n if (kind === \"fts5\") throw new SqliteError(`unrecognized parameter: ${eq.key}`, \"other\");\n columns.push({ name: eq.key, unindexed: false });\n break;\n }\n continue;\n }\n\n // Column form: name [UNINDEXED]\n const parts = arg.split(/\\s+/).filter(Boolean);\n if (parts.length === 0) continue;\n const name = unquoteIdent(parts[0]!);\n const rest = parts.slice(1).map((p) => p.toUpperCase());\n if (rest.includes(\"UNINDEXED\") || rest.includes(\"NOTINDEXED\")) {\n columns.push({ name, unindexed: true });\n notindexed.add(name.toLowerCase());\n } else if (rest.length === 0) {\n if (OPTION_NAMES.has(name.toLowerCase()) && kind === \"fts5\") {\n // bare option name without = is invalid for some; treat as column (SQLite allows content as column name)\n columns.push({ name, unindexed: false });\n } else {\n columns.push({ name, unindexed: false });\n }\n } else if (kind === \"fts3\" || kind === \"fts4\") {\n // FTS3/4 column type names ignored\n columns.push({ name, unindexed: false });\n } else {\n throw new SqliteError(\"SQL logic error\", \"other\");\n }\n }\n\n if (columns.length === 0) throw new SqliteError(\"fts requires at least one column\", \"other\");\n\n const names = new Set<string>();\n for (const column of columns) {\n const key = column.name.toLowerCase();\n if (names.has(key)) throw new SqliteError(\"SQL logic error\", \"other\");\n names.add(key);\n }\n\n return {\n columns,\n content,\n contentTable,\n contentRowid,\n contentlessDelete,\n prefix,\n columnsize,\n detail,\n tokendata,\n locale,\n tokenizer,\n languageid,\n notindexed,\n };\n}\n\nfunction splitOption(arg: string): { key: string; value: string } | null {\n const match = /^([A-Za-z_][\\w]*)\\s*=\\s*(.*)$/s.exec(arg);\n if (!match) return null;\n return { key: match[1]!, value: unquoteValue(match[2]!.trim()) };\n}\n\nfunction unquoteValue(value: string): string {\n if (\n (value.startsWith(\"'\") && value.endsWith(\"'\")) ||\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"`\") && value.endsWith(\"`\"))\n ) {\n const q = value[0]!;\n return value\n .slice(1, -1)\n .replaceAll(q + q, q)\n .replaceAll(\"\\\\'\", \"'\")\n .replaceAll('\\\\\"', '\"');\n }\n return value;\n}\n\nfunction unquoteIdent(value: string): string {\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"`\") && value.endsWith(\"`\")) ||\n (value.startsWith(\"[\") && value.endsWith(\"]\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n}\n\nfunction parseTokenizer(spec: string): FtsTokenizerConfig {\n const tokens = tokenizeSpec(spec);\n if (tokens.length === 0) throw new SqliteError(\"no such tokenizer: \", \"other\");\n const name = tokens[0]!.toLowerCase();\n if (name === \"porter\") {\n const base = tokens[1]?.toLowerCase() ?? \"unicode61\";\n const rest = parseUnicodeOpts(tokens.slice(base === \"unicode61\" || base === \"ascii\" ? 2 : 1));\n return { name: \"porter\", base: base === \"ascii\" ? \"ascii\" : \"unicode61\", ...rest };\n }\n if (name === \"trigram\") {\n let caseSensitive = false;\n let removeDiacriticsTrigram = false;\n for (let i = 1; i < tokens.length; i++) {\n const t = tokens[i]!.toLowerCase();\n if (t === \"case_sensitive\" && tokens[i + 1] === \"1\") {\n caseSensitive = true;\n i++;\n } else if (t === \"remove_diacritics\" && tokens[i + 1] === \"1\") {\n removeDiacriticsTrigram = true;\n i++;\n }\n }\n return { name: \"trigram\", caseSensitive, removeDiacriticsTrigram };\n }\n if (name === \"ascii\") {\n return { name: \"ascii\", ...parseUnicodeOpts(tokens.slice(1)) };\n }\n if (name === \"unicode61\") {\n return { name: \"unicode61\", removeDiacritics: 1, ...parseUnicodeOpts(tokens.slice(1)) };\n }\n throw new SqliteError(`no such tokenizer: ${name}`, \"other\");\n}\n\nfunction parseUnicodeOpts(tokens: string[]): Partial<FtsTokenizerConfig> {\n const out: Partial<FtsTokenizerConfig> = {};\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i]!.toLowerCase();\n if (t === \"remove_diacritics\") {\n const v = Number(tokens[++i] ?? \"1\");\n if (v !== 0 && v !== 1 && v !== 2) throw new SqliteError(\"SQL logic error\", \"other\");\n out.removeDiacritics = v as 0 | 1 | 2;\n } else if (t === \"tokenchars\") {\n out.tokenchars = tokens[++i] ?? \"\";\n } else if (t === \"separators\") {\n out.separators = tokens[++i] ?? \"\";\n }\n }\n return out;\n}\n\nfunction tokenizeSpec(spec: string): string[] {\n const out: string[] = [];\n let i = 0;\n while (i < spec.length) {\n while (i < spec.length && /\\s/.test(spec[i]!)) i++;\n if (i >= spec.length) break;\n if (spec[i] === \"'\" || spec[i] === '\"') {\n const q = spec[i]!;\n i++;\n let s = \"\";\n while (i < spec.length && spec[i] !== q) {\n s += spec[i++];\n }\n if (spec[i] === q) i++;\n out.push(s);\n continue;\n }\n let s = \"\";\n while (i < spec.length && !/\\s/.test(spec[i]!)) s += spec[i++];\n out.push(s);\n }\n return out;\n}\n", "import { SqliteError } from \"../../errors/index.ts\";\n\nexport type FtsQueryNode =\n | { type: \"term\"; value: string; prefix: boolean; column: string | null; columns: string[] | null }\n | {\n type: \"phrase\";\n terms: Array<{ value: string; prefix: boolean }>;\n column: string | null;\n columns: string[] | null;\n }\n | { type: \"near\"; children: FtsQueryNode[]; distance: number; column: string | null; columns: string[] | null }\n | { type: \"and\"; children: FtsQueryNode[] }\n | { type: \"or\"; children: FtsQueryNode[] }\n | { type: \"not\"; child: FtsQueryNode }\n | { type: \"true\" };\n\ntype Tok =\n | { kind: \"TERM\"; value: string; prefix: boolean }\n | { kind: \"STRING\"; value: string }\n | { kind: \"AND\" }\n | { kind: \"OR\" }\n | { kind: \"NOT\" }\n | { kind: \"NEAR\" }\n | { kind: \"LPAREN\" }\n | { kind: \"RPAREN\" }\n | { kind: \"COLON\" }\n | { kind: \"COMMA\" }\n | { kind: \"LBRACE\" }\n | { kind: \"RBRACE\" }\n | { kind: \"EOF\" };\n\n/**\n * Parse an FTS5 MATCH expression.\n * Implicit AND between adjacent terms; OR binds looser than AND; NOT is binary (a NOT b).\n */\nexport function parseFts5Query(input: string): FtsQueryNode {\n const tokens = lexFts5(input);\n let i = 0;\n\n function peek(): Tok {\n return tokens[i] ?? { kind: \"EOF\" };\n }\n function next(): Tok {\n return tokens[i++] ?? { kind: \"EOF\" };\n }\n function expect(kind: Tok[\"kind\"]): Tok {\n const t = next();\n if (t.kind !== kind) throw new SqliteError(`fts5: syntax error near \"${displayTok(t)}\"`, \"syntax\");\n return t;\n }\n\n function parseExpr(): FtsQueryNode {\n return parseOr();\n }\n\n function parseOr(): FtsQueryNode {\n let left = parseAnd();\n while (peek().kind === \"OR\") {\n next();\n const right = parseAnd();\n if (left.type === \"or\") left = { type: \"or\", children: [...left.children, right] };\n else left = { type: \"or\", children: [left, right] };\n }\n return left;\n }\n\n function parseAnd(): FtsQueryNode {\n let left = parseUnary();\n while (true) {\n const p = peek();\n if (p.kind === \"EOF\" || p.kind === \"RPAREN\" || p.kind === \"OR\" || p.kind === \"COMMA\" || p.kind === \"RBRACE\")\n break;\n if (p.kind === \"AND\") {\n next();\n const right = parseUnary();\n if (left.type === \"and\") left = { type: \"and\", children: [...left.children, right] };\n else left = { type: \"and\", children: [left, right] };\n continue;\n }\n if (p.kind === \"NOT\") {\n next();\n const right = parseUnary();\n left = { type: \"and\", children: [left, { type: \"not\", child: right }] };\n continue;\n }\n // implicit AND\n if (\n p.kind === \"TERM\" ||\n p.kind === \"STRING\" ||\n p.kind === \"LPAREN\" ||\n p.kind === \"NEAR\" ||\n p.kind === \"LBRACE\" ||\n p.kind === \"COLON\"\n ) {\n // COLON alone is invalid here \u2014 column filter starts with TERM or LBRACE\n if (p.kind === \"COLON\") break;\n const right = parseUnary();\n if (left.type === \"and\") left = { type: \"and\", children: [...left.children, right] };\n else left = { type: \"and\", children: [left, right] };\n continue;\n }\n break;\n }\n return left;\n }\n\n function parseUnary(): FtsQueryNode {\n // column filter: {a b} : expr or col : expr\n const filtered = tryParseColumnFilter();\n if (filtered) return filtered;\n\n const p = peek();\n if (p.kind === \"LPAREN\") {\n next();\n const inner = parseExpr();\n expect(\"RPAREN\");\n return inner;\n }\n if (p.kind === \"NEAR\") {\n next();\n expect(\"LPAREN\");\n const children: FtsQueryNode[] = [];\n children.push(parseUnary());\n while (peek().kind !== \"COMMA\" && peek().kind !== \"RPAREN\" && peek().kind !== \"EOF\") {\n children.push(parseUnary());\n }\n let distance = 10;\n if (peek().kind === \"COMMA\") {\n next();\n const distTok = next();\n if (distTok.kind !== \"TERM\") throw new SqliteError(\"fts5: syntax error near NEAR\", \"syntax\");\n distance = Number(distTok.value);\n if (!Number.isFinite(distance)) throw new SqliteError(\"fts5: syntax error near NEAR\", \"syntax\");\n }\n expect(\"RPAREN\");\n return { type: \"near\", children, distance, column: null, columns: null };\n }\n if (p.kind === \"STRING\") {\n next();\n const terms = p.value\n .split(/\\s+/)\n .filter(Boolean)\n .map((part) => {\n const prefix = part.endsWith(\"*\");\n return { value: prefix ? part.slice(0, -1) : part, prefix };\n });\n return { type: \"phrase\", terms, column: null, columns: null };\n }\n if (p.kind === \"TERM\") {\n next();\n if (p.prefix && (p.value === \"\" || p.value.includes(\"*\"))) {\n throw new SqliteError(`unknown special query: ${p.value}`, \"other\");\n }\n return { type: \"term\", value: p.value, prefix: p.prefix, column: null, columns: null };\n }\n throw new SqliteError(`fts5: syntax error near \"${displayTok(p)}\"`, \"syntax\");\n }\n\n function tryParseColumnFilter(): FtsQueryNode | null {\n const save = i;\n let column: string | null = null;\n let columns: string[] | null = null;\n\n if (peek().kind === \"LBRACE\") {\n next();\n columns = [];\n while (peek().kind !== \"RBRACE\" && peek().kind !== \"EOF\") {\n if (peek().kind === \"TERM\") {\n const termTok = next();\n if (termTok.kind !== \"TERM\") {\n i = save;\n return null;\n }\n columns.push(termTok.value.toLowerCase());\n } else if (peek().kind === \"COMMA\") {\n next();\n } else {\n i = save;\n return null;\n }\n }\n if (peek().kind !== \"RBRACE\") {\n i = save;\n return null;\n }\n next();\n } else if (peek().kind === \"TERM\") {\n const name = next();\n if (name.kind !== \"TERM\") {\n i = save;\n return null;\n }\n if (peek().kind !== \"COLON\") {\n i = save;\n return null;\n }\n column = name.value.toLowerCase();\n } else {\n return null;\n }\n\n if (peek().kind !== \"COLON\") {\n i = save;\n return null;\n }\n next(); // colon\n const inner = parseUnary();\n return applyColumn(inner, column, columns);\n }\n\n if (tokens.length === 1 && tokens[0]!.kind === \"EOF\") return { type: \"true\" };\n const root = parseExpr();\n if (peek().kind !== \"EOF\") throw new SqliteError(`fts5: syntax error near \"${displayTok(peek())}\"`, \"syntax\");\n return root;\n}\n\nfunction applyColumn(node: FtsQueryNode, column: string | null, columns: string[] | null): FtsQueryNode {\n switch (node.type) {\n case \"term\":\n case \"phrase\":\n case \"near\":\n return { ...node, column: column ?? node.column, columns: columns ?? node.columns };\n case \"and\":\n case \"or\":\n return { ...node, children: node.children.map((child) => applyColumn(child, column, columns)) };\n case \"not\":\n return { type: \"not\", child: applyColumn(node.child, column, columns) };\n case \"true\":\n return node;\n }\n}\n\nfunction lexFts5(input: string): Tok[] {\n const tokens: Tok[] = [];\n let i = 0;\n while (i < input.length) {\n const ch = input[i]!;\n if (/\\s/.test(ch)) {\n i++;\n continue;\n }\n if (ch === \"(\") {\n tokens.push({ kind: \"LPAREN\" });\n i++;\n continue;\n }\n if (ch === \")\") {\n tokens.push({ kind: \"RPAREN\" });\n i++;\n continue;\n }\n if (ch === \"{\") {\n tokens.push({ kind: \"LBRACE\" });\n i++;\n continue;\n }\n if (ch === \"}\") {\n tokens.push({ kind: \"RBRACE\" });\n i++;\n continue;\n }\n if (ch === \":\") {\n tokens.push({ kind: \"COLON\" });\n i++;\n continue;\n }\n if (ch === \",\") {\n tokens.push({ kind: \"COMMA\" });\n i++;\n continue;\n }\n if (ch === '\"') {\n i++;\n let value = \"\";\n while (i < input.length && input[i] !== '\"') {\n if (input[i] === \"\\\\\" && i + 1 < input.length) {\n value += input[i + 1];\n i += 2;\n continue;\n }\n value += input[i++];\n }\n if (input[i] === '\"') i++;\n tokens.push({ kind: \"STRING\", value });\n continue;\n }\n // bare word\n let word = \"\";\n while (i < input.length && !/[\\s(){}:,\"]/.test(input[i]!)) word += input[i++];\n if (!word) {\n i++;\n continue;\n }\n const upper = word.toUpperCase();\n if (upper === \"AND\") tokens.push({ kind: \"AND\" });\n else if (upper === \"OR\") tokens.push({ kind: \"OR\" });\n else if (upper === \"NOT\") tokens.push({ kind: \"NOT\" });\n else if (upper === \"NEAR\") {\n // NEAR is a keyword only when followed by '('; otherwise it is a bare term.\n let j = i;\n while (j < input.length && /\\s/.test(input[j]!)) j++;\n if (input[j] === \"(\") tokens.push({ kind: \"NEAR\" });\n else {\n const prefix = word.endsWith(\"*\");\n tokens.push({ kind: \"TERM\", value: prefix ? word.slice(0, -1) : word, prefix });\n }\n } else {\n const prefix = word.endsWith(\"*\");\n tokens.push({ kind: \"TERM\", value: prefix ? word.slice(0, -1) : word, prefix });\n }\n }\n tokens.push({ kind: \"EOF\" });\n return tokens;\n}\n\nfunction displayTok(t: Tok): string {\n switch (t.kind) {\n case \"TERM\":\n return t.prefix ? `${t.value}*` : t.value;\n case \"STRING\":\n return `\"${t.value}\"`;\n case \"EOF\":\n return \"\";\n default:\n return t.kind;\n }\n}\n\n/** FTS3/4 query parser (ENABLE_FTS3_PARENTHESIS style). */\nexport function parseFts3Query(input: string): FtsQueryNode {\n return parseFts5Query(input);\n}\n", "/** Classic Porter stemming algorithm (English). */\nexport function porterStem(word: string): string {\n let w = word.toLowerCase();\n if (w.length <= 2) return w;\n\n // Step 1a\n if (w.endsWith(\"sses\")) w = `${w.slice(0, -2)}`;\n else if (w.endsWith(\"ies\")) w = `${w.slice(0, -2)}`;\n else if (w.endsWith(\"ss\")) {\n /* keep */\n } else if (w.endsWith(\"s\") && w.length > 3) w = w.slice(0, -1);\n\n // Step 1b\n let step1bStar = false;\n if (w.endsWith(\"eed\")) {\n const stem = w.slice(0, -3);\n if (measure(stem) > 0) w = `${stem}ee`;\n } else {\n let stem: string | null = null;\n if (w.endsWith(\"ed\") && hasVowel(w.slice(0, -2))) stem = w.slice(0, -2);\n else if (w.endsWith(\"ing\") && hasVowel(w.slice(0, -3))) stem = w.slice(0, -3);\n if (stem !== null) {\n w = stem;\n step1bStar = true;\n }\n }\n if (step1bStar) {\n if (w.endsWith(\"at\") || w.endsWith(\"bl\") || w.endsWith(\"iz\")) w = `${w}e`;\n else if (doubleConsonant(w) && !/[lsz]$/.test(w)) w = w.slice(0, -1);\n else if (measure(w) === 1 && cvc(w)) w = `${w}e`;\n }\n\n // Step 1c\n if (w.endsWith(\"y\") && hasVowel(w.slice(0, -1))) w = `${w.slice(0, -1)}i`;\n\n // Step 2\n for (const [suf, rep] of STEP2) {\n if (w.endsWith(suf)) {\n const stem = w.slice(0, -suf.length);\n if (measure(stem) > 0) {\n w = stem + rep;\n break;\n }\n }\n }\n\n // Step 3\n for (const [suf, rep] of STEP3) {\n if (w.endsWith(suf)) {\n const stem = w.slice(0, -suf.length);\n if (measure(stem) > 0) {\n w = stem + rep;\n break;\n }\n }\n }\n\n // Step 4\n for (const suf of STEP4) {\n if (w.endsWith(suf)) {\n const stem = w.slice(0, -suf.length);\n if (measure(stem) > 1) {\n w = stem;\n break;\n }\n }\n }\n if (w.endsWith(\"ion\")) {\n const stem = w.slice(0, -3);\n if (measure(stem) > 1 && /[st]$/.test(stem)) w = stem;\n }\n\n // Step 5a\n if (w.endsWith(\"e\")) {\n const stem = w.slice(0, -1);\n const m = measure(stem);\n if (m > 1 || (m === 1 && !cvc(stem))) w = stem;\n }\n\n // Step 5b\n if (measure(w) > 1 && doubleConsonant(w) && w.endsWith(\"l\")) w = w.slice(0, -1);\n\n return w;\n}\n\nconst STEP2: Array<[string, string]> = [\n [\"ational\", \"ate\"],\n [\"tional\", \"tion\"],\n [\"enci\", \"ence\"],\n [\"anci\", \"ance\"],\n [\"izer\", \"ize\"],\n [\"abli\", \"able\"],\n [\"alli\", \"al\"],\n [\"entli\", \"ent\"],\n [\"eli\", \"e\"],\n [\"ousli\", \"ous\"],\n [\"ization\", \"ize\"],\n [\"ation\", \"ate\"],\n [\"ator\", \"ate\"],\n [\"alism\", \"al\"],\n [\"iveness\", \"ive\"],\n [\"fulness\", \"ful\"],\n [\"ousness\", \"ous\"],\n [\"aliti\", \"al\"],\n [\"iviti\", \"ive\"],\n [\"biliti\", \"ble\"],\n];\n\nconst STEP3: Array<[string, string]> = [\n [\"icate\", \"ic\"],\n [\"ative\", \"\"],\n [\"alize\", \"al\"],\n [\"iciti\", \"ic\"],\n [\"ical\", \"ic\"],\n [\"ful\", \"\"],\n [\"ness\", \"\"],\n];\n\nconst STEP4 = [\n \"al\",\n \"ance\",\n \"ence\",\n \"er\",\n \"ic\",\n \"able\",\n \"ible\",\n \"ant\",\n \"ement\",\n \"ment\",\n \"ent\",\n \"ou\",\n \"ism\",\n \"ate\",\n \"iti\",\n \"ous\",\n \"ive\",\n \"ize\",\n];\n\nfunction isConsonant(word: string, i: number): boolean {\n const c = word[i]!;\n if (\"aeiou\".includes(c)) return false;\n if (c === \"y\") return i === 0 ? true : !isConsonant(word, i - 1);\n return true;\n}\n\nfunction measure(word: string): number {\n let m = 0;\n let i = 0;\n const n = word.length;\n while (i < n && isConsonant(word, i)) i++;\n while (i < n) {\n while (i < n && !isConsonant(word, i)) i++;\n while (i < n && isConsonant(word, i)) i++;\n m++;\n }\n return m;\n}\n\nfunction hasVowel(word: string): boolean {\n for (let i = 0; i < word.length; i++) if (!isConsonant(word, i)) return true;\n return false;\n}\n\nfunction doubleConsonant(word: string): boolean {\n const n = word.length;\n if (n < 2) return false;\n return word[n - 1] === word[n - 2] && isConsonant(word, n - 1);\n}\n\nfunction cvc(word: string): boolean {\n const n = word.length;\n if (n < 3) return false;\n if (!isConsonant(word, n - 1) || isConsonant(word, n - 2) || !isConsonant(word, n - 3)) return false;\n const last = word[n - 1]!;\n return last !== \"w\" && last !== \"x\" && last !== \"y\";\n}\n", "import type { FtsTokenizerConfig } from \"./options.ts\";\nimport { porterStem } from \"./porter.ts\";\n\nexport interface FtsToken {\n /** Normalized token text stored in the index. */\n term: string;\n /** Byte offset of the token in the UTF-8 encoding of the source. */\n start: number;\n /** Byte length in UTF-8. */\n length: number;\n /** Token position (0-based) within the column. */\n position: number;\n /** Original end offset in JS string code units (for highlight). */\n startUnit: number;\n endUnit: number;\n}\n\nexport type TokenizerFn = (text: string) => FtsToken[];\n\nexport function createTokenizer(config: FtsTokenizerConfig): TokenizerFn {\n if (config.name === \"porter\") {\n const base = createTokenizer({\n name: config.base === \"ascii\" ? \"ascii\" : \"unicode61\",\n removeDiacritics: config.removeDiacritics ?? 1,\n tokenchars: config.tokenchars,\n separators: config.separators,\n });\n return (text) =>\n base(text).map((token) => ({\n ...token,\n term: porterStem(token.term),\n }));\n }\n if (config.name === \"trigram\") return createTrigramTokenizer(config);\n if (config.name === \"ascii\") return createAsciiTokenizer(config);\n return createUnicode61Tokenizer(config);\n}\n\nfunction createAsciiTokenizer(config: FtsTokenizerConfig): TokenizerFn {\n const tokenChar = defaultAsciiTokenChar();\n for (const ch of config.tokenchars ?? \"\") {\n const code = ch.charCodeAt(0);\n if (code < 128) tokenChar[code] = 1;\n }\n for (const ch of config.separators ?? \"\") {\n const code = ch.charCodeAt(0);\n if (code < 128) tokenChar[code] = 0;\n }\n const encoder = new TextEncoder();\n const decoder = new TextDecoder();\n return (text: string) => {\n const bytes = encoder.encode(text);\n const tokens: FtsToken[] = [];\n let is = 0;\n let pos = 0;\n while (is < bytes.length) {\n while (is < bytes.length && (bytes[is]! & 0x80) === 0 && tokenChar[bytes[is]!] === 0) is++;\n if (is >= bytes.length) break;\n let ie = is + 1;\n while (ie < bytes.length && ((bytes[ie]! & 0x80) !== 0 || tokenChar[bytes[ie]!] === 1)) ie++;\n const raw = bytes.slice(is, ie);\n const folded = new Uint8Array(raw.length);\n for (let i = 0; i < raw.length; i++) {\n const c = raw[i]!;\n folded[i] = c >= 65 && c <= 90 ? c + 32 : c;\n }\n const term = decoder.decode(folded);\n tokens.push({\n term,\n start: is,\n length: ie - is,\n position: pos++,\n startUnit: utf16Offset(text, is),\n endUnit: utf16Offset(text, ie),\n });\n is = ie + 1;\n }\n return tokens;\n };\n}\n\nfunction defaultAsciiTokenChar(): Uint8Array {\n const a = new Uint8Array(128);\n for (let i = 48; i <= 57; i++) a[i] = 1;\n for (let i = 65; i <= 90; i++) a[i] = 1;\n for (let i = 97; i <= 122; i++) a[i] = 1;\n return a;\n}\n\nfunction utf16Offset(text: string, byteOffset: number): number {\n let units = 0;\n let b = 0;\n for (const ch of text) {\n if (b >= byteOffset) break;\n b += new TextEncoder().encode(ch).length;\n units += ch.length;\n }\n return units;\n}\n\nfunction createUnicode61Tokenizer(config: FtsTokenizerConfig): TokenizerFn {\n const removeDiacritics = config.removeDiacritics ?? 1;\n const extraToken = new Set([...(config.tokenchars ?? \"\")].map((c) => c));\n const extraSep = new Set([...(config.separators ?? \"\")].map((c) => c));\n return (text: string) => {\n const tokens: FtsToken[] = [];\n let i = 0;\n let pos = 0;\n while (i < text.length) {\n while (i < text.length && !isUnicodeTokenChar(text[i]!, extraToken, extraSep)) i++;\n if (i >= text.length) break;\n const startUnit = i;\n while (i < text.length && isUnicodeTokenChar(text[i]!, extraToken, extraSep)) i++;\n let raw = text.slice(startUnit, i);\n if (removeDiacritics > 0) raw = stripDiacritics(raw, removeDiacritics);\n const term = raw.toLowerCase();\n if (term.length === 0) continue;\n tokens.push({\n term,\n start: utf8Offset(text, startUnit),\n length: utf8Length(text.slice(startUnit, i)),\n position: pos++,\n startUnit,\n endUnit: i,\n });\n }\n return tokens;\n };\n}\n\nfunction createTrigramTokenizer(config: FtsTokenizerConfig): TokenizerFn {\n const caseSensitive = config.caseSensitive ?? false;\n const removeDia = config.removeDiacriticsTrigram ?? false;\n return (text: string) => {\n let source = text;\n if (removeDia) source = stripDiacritics(source, 1);\n if (!caseSensitive) source = source.toLowerCase();\n const tokens: FtsToken[] = [];\n if (source.length < 3) return tokens;\n let pos = 0;\n for (let i = 0; i <= source.length - 3; i++) {\n const term = source.slice(i, i + 3);\n tokens.push({\n term,\n start: utf8Offset(source, i),\n length: utf8Length(term),\n position: pos++,\n startUnit: i,\n endUnit: i + 3,\n });\n }\n return tokens;\n };\n}\n\nfunction isUnicodeTokenChar(ch: string, extraToken: Set<string>, extraSep: Set<string>): boolean {\n if (extraSep.has(ch)) return false;\n if (extraToken.has(ch)) return true;\n // Letters, marks (combining), numbers \u2014 exclude punctuation/symbols/emoji\n return /\\p{L}|\\p{M}|\\p{N}/u.test(ch);\n}\n\nfunction stripDiacritics(text: string, mode: 0 | 1 | 2): string {\n if (mode === 0) return text;\n // NFD then strip combining marks. Mode 2 also folds a few special cases similarly.\n const normalized = text.normalize(\"NFD\");\n let out = \"\";\n for (const ch of normalized) {\n if (/\\p{M}/u.test(ch)) continue;\n out += ch;\n }\n return out;\n}\n\nexport function utf8Length(text: string): number {\n return new TextEncoder().encode(text).length;\n}\n\nexport function utf8Offset(text: string, unitIndex: number): number {\n return new TextEncoder().encode(text.slice(0, unitIndex)).length;\n}\n\n/** Legacy helper used by older call sites \u2014 simple alphanum split. */\nexport function tokenizeFtsText(text: string): string[] {\n return createUnicode61Tokenizer({ name: \"unicode61\", removeDiacritics: 1 })(text).map((t) => t.term);\n}\n", "import { SqliteError } from \"../../errors/index.ts\";\nimport type { Rowid } from \"../../storage/row.ts\";\nimport type { SqlValue } from \"../../types/value.ts\";\nimport { type FtsKind, type FtsTableOptions, parseFtsModuleArgs } from \"./options.ts\";\nimport { type FtsQueryNode, parseFts3Query, parseFts5Query } from \"./query.ts\";\nimport { createTokenizer, type FtsToken, type TokenizerFn, tokenizeFtsText } from \"./tokenize.ts\";\n\nexport interface Fts5Row {\n rowid: Rowid;\n values: Map<string, SqlValue>;\n /** Per-column tokens with positions. */\n tokensByColumn: Map<string, FtsToken[]>;\n}\n\nexport interface FtsMatchHit {\n column: string;\n position: number;\n startUnit: number;\n endUnit: number;\n term: string;\n}\n\nexport interface FtsMatchCursor {\n tableName: string;\n rowid: Rowid;\n query: string;\n ast: FtsQueryNode;\n hits: FtsMatchHit[];\n /** Phrase term strings used for ranking (flattened). */\n phraseTerms: string[][];\n}\n\ninterface Posting {\n rowid: Rowid;\n column: string;\n position: number;\n startUnit: number;\n endUnit: number;\n}\n\nexport class Fts5VirtualTable {\n readonly kind: FtsKind;\n readonly name: string;\n readonly columns: string[];\n readonly originalSql: string | null;\n readonly options: FtsTableOptions;\n readonly rows = new Map<Rowid, Fts5Row>();\n nextRowid: Rowid = 1;\n private readonly tokenize: TokenizerFn;\n /** term -> postings */\n private readonly index = new Map<string, Posting[]>();\n /** Global doc count for bm25. */\n private docCount = 0;\n /** Average document length (tokens across indexed columns). */\n private avgDocLen = 0;\n private totalTokens = 0;\n\n constructor(name: string, moduleArgs: string[], originalSql: string | null = null, kind: FtsKind = \"fts5\") {\n this.kind = kind;\n this.name = name;\n this.originalSql = originalSql;\n this.options = parseFtsModuleArgs(moduleArgs, kind);\n this.columns = this.options.columns.map((c) => c.name);\n if (this.columns.length === 0) throw new SqliteError(\"fts requires at least one column\", \"other\");\n this.tokenize = createTokenizer(this.options.tokenizer);\n }\n\n scan(): Fts5Row[] {\n return [...this.rows.values()];\n }\n\n insert(values: Map<string, SqlValue>, rowid?: Rowid): Rowid {\n // Special command: INSERT INTO t(t) VALUES('optimize') etc.\n const command = this.detectCommand(values);\n if (command !== null) {\n this.runCommand(command, values, rowid);\n // Match SQLite: special commands report lastInsertRowid 0\n return 0;\n }\n\n const assigned = rowid ?? this.nextRowid++;\n if (this.rows.has(assigned)) throw new SqliteError(\"PRIMARY KEY constraint failed\", \"constraint_primary\");\n const row = this.buildRow(assigned, values);\n this.rows.set(assigned, row);\n this.indexRow(row);\n this.bumpRowid(assigned);\n return assigned;\n }\n\n update(rowid: Rowid, updates: Map<string, SqlValue>): void {\n const row = this.rows.get(rowid);\n if (!row) return;\n this.unindexRow(row);\n const values = new Map(row.values);\n for (const [key, value] of updates) values.set(key, value);\n const next = this.buildRow(rowid, values);\n this.rows.set(rowid, next);\n this.indexRow(next);\n }\n\n delete(rowid: Rowid): void {\n const row = this.rows.get(rowid);\n if (!row) return;\n this.unindexRow(row);\n this.rows.delete(rowid);\n }\n\n matches(rowid: Rowid, leftTable: string | null, leftColumn: string, query: string): boolean {\n const cursor = this.matchCursor(rowid, leftTable, leftColumn, query);\n return cursor !== null;\n }\n\n matchCursor(rowid: Rowid, leftTable: string | null, leftColumn: string, query: string): FtsMatchCursor | null {\n const row = this.rows.get(rowid);\n if (!row) return null;\n const ast = this.kind === \"fts5\" ? parseFts5Query(query) : parseFts3Query(query);\n const columnLower = leftColumn.toLowerCase();\n const tableLower = this.name.toLowerCase();\n const leftTableLower = leftTable?.toLowerCase() ?? null;\n // Column-restricted MATCH (content MATCH 'x') limits default columns\n let defaultColumns = this.indexedColumns();\n if (columnLower !== tableLower && !(leftTableLower !== null && columnLower === leftTableLower)) {\n const matched = this.columns.find((c) => c.toLowerCase() === columnLower);\n if (matched) defaultColumns = [matched];\n else return null;\n }\n const hits: FtsMatchHit[] = [];\n const ok = this.evalNode(ast, row, defaultColumns, hits);\n if (!ok) return null;\n return {\n tableName: this.name,\n rowid,\n query,\n ast,\n hits,\n phraseTerms: collectPhraseTerms(ast),\n };\n }\n\n bm25(cursor: FtsMatchCursor, weights?: number[]): number {\n const row = this.rows.get(cursor.rowid);\n if (!row) return -0;\n const phrases = cursor.phraseTerms.length > 0 ? cursor.phraseTerms : [];\n if (phrases.length === 0) return -0;\n const cols = this.indexedColumns();\n const w = cols.map((_, i) => weights?.[i] ?? 1);\n const k1 = 1.2;\n const b = 0.75;\n const N = Math.max(1, this.docCount);\n const avgdl = Math.max(1e-9, this.avgDocLen);\n let score = 0;\n const D = this.docLength(row);\n\n for (let pi = 0; pi < phrases.length; pi++) {\n const phrase = phrases[pi]!;\n // Phrase frequency: weighted count of phrase occurrences across columns\n let freq = 0;\n for (let ci = 0; ci < cols.length; ci++) {\n const col = cols[ci]!;\n const n = this.phraseFreq(row, col, phrase);\n freq += (w[ci] ?? 1) * n;\n }\n if (freq === 0) continue;\n const df = this.phraseDocFreq(phrase);\n // SQLite FTS5: IDF = log((N - nHit + 0.5) / (nHit + 0.5)); floor at 1e-6\n let idf = Math.log((N - df + 0.5) / (df + 0.5));\n if (idf <= 0) idf = 1e-6;\n score += idf * ((freq * (k1 + 1)) / (freq + k1 * (1 - b + (b * D) / avgdl)));\n }\n return score === 0 ? -0 : -score;\n }\n\n highlight(cursor: FtsMatchCursor, colIndex: number, open: string, close: string): string {\n const row = this.rows.get(cursor.rowid);\n if (!row) return \"\";\n const col = this.columns[colIndex];\n if (!col) return \"\";\n const text = valueToText(row.values.get(col.toLowerCase()) ?? null);\n if (this.options.content === \"contentless\") return text;\n const hits = cursor.hits\n .filter((h) => h.column.toLowerCase() === col.toLowerCase())\n .sort((a, b) => a.startUnit - b.startUnit);\n if (hits.length === 0) return text;\n let out = \"\";\n let at = 0;\n for (const hit of mergeHits(hits)) {\n out += text.slice(at, hit.startUnit);\n out += open + text.slice(hit.startUnit, hit.endUnit) + close;\n at = hit.endUnit;\n }\n out += text.slice(at);\n return out;\n }\n\n snippet(\n cursor: FtsMatchCursor,\n colIndex: number,\n open: string,\n close: string,\n ellipsis: string,\n tokenCount: number,\n ): string {\n const row = this.rows.get(cursor.rowid);\n if (!row) return \"\";\n const col = this.columns[colIndex];\n if (!col) return \"\";\n const text = valueToText(row.values.get(col.toLowerCase()) ?? null);\n const tokens = row.tokensByColumn.get(col.toLowerCase()) ?? [];\n const hitPositions = new Set(\n cursor.hits.filter((h) => h.column.toLowerCase() === col.toLowerCase()).map((h) => h.position),\n );\n if (tokens.length === 0 || hitPositions.size === 0) return text;\n const firstHit = Math.min(...hitPositions);\n const window = Math.max(1, tokenCount);\n const startPos = Math.max(0, firstHit - Math.floor(window / 4));\n const endPos = Math.min(tokens.length - 1, startPos + window - 1);\n const startUnit = tokens[startPos]!.startUnit;\n const endUnit = tokens[endPos]!.endUnit;\n const slice = text.slice(startUnit, endUnit);\n // Re-highlight within slice\n const localHits = cursor.hits\n .filter((h) => h.column.toLowerCase() === col.toLowerCase() && h.startUnit >= startUnit && h.endUnit <= endUnit)\n .map((h) => ({ ...h, startUnit: h.startUnit - startUnit, endUnit: h.endUnit - startUnit }));\n let out = \"\";\n let at = 0;\n for (const hit of mergeHits(localHits)) {\n out += slice.slice(at, hit.startUnit);\n out += open + slice.slice(hit.startUnit, hit.endUnit) + close;\n at = hit.endUnit;\n }\n out += slice.slice(at);\n if (startPos > 0) out = ellipsis + out;\n if (endPos < tokens.length - 1) out = out + ellipsis;\n return out;\n }\n\n /** FTS3/4 offsets(): \"col phrase start length ...\" */\n offsets(cursor: FtsMatchCursor): string {\n const row = this.rows.get(cursor.rowid);\n if (!row) return \"\";\n const parts: string[] = [];\n for (const hit of cursor.hits) {\n const colIndex = this.columns.findIndex((c) => c.toLowerCase() === hit.column.toLowerCase());\n const text = valueToText(row.values.get(hit.column.toLowerCase()) ?? null);\n const start = utf8OffsetLocal(text, hit.startUnit);\n const length = utf8OffsetLocal(text, hit.endUnit) - start;\n parts.push(String(colIndex), \"0\", String(start), String(length));\n }\n return parts.join(\" \");\n }\n\n /** FTS3 matchinfo format encoded as native-style 32-bit little-endian integers. */\n matchinfo(cursor: FtsMatchCursor, format = \"pcx\"): Uint8Array {\n const row = this.rows.get(cursor.rowid);\n const nPhrase = Math.max(1, cursor.phraseTerms.length);\n const nCol = this.columns.length;\n const values: number[] = [];\n for (const request of format) {\n switch (request) {\n case \"p\":\n values.push(nPhrase);\n break;\n case \"c\":\n values.push(nCol);\n break;\n case \"s\":\n for (let c = 0; c < nCol; c++) {\n let longest = 0;\n let run = 0;\n for (let p = 0; p < nPhrase; p++) {\n const phrase = cursor.phraseTerms[p] ?? [];\n if (row && this.phraseFreq(row, this.columns[c]!, phrase) > 0) {\n run++;\n longest = Math.max(longest, run);\n } else {\n run = 0;\n }\n }\n values.push(longest);\n }\n break;\n case \"x\":\n for (let p = 0; p < nPhrase; p++) {\n const phrase = cursor.phraseTerms[p] ?? [];\n for (let c = 0; c < nCol; c++) {\n const column = this.columns[c]!;\n const localHits = row ? this.phraseFreq(row, column, phrase) : 0;\n let globalHits = 0;\n let matchingRows = 0;\n for (const candidate of this.rows.values()) {\n const hits = this.phraseFreq(candidate, column, phrase);\n globalHits += hits;\n if (hits > 0) matchingRows++;\n }\n values.push(localHits, globalHits, matchingRows);\n }\n }\n break;\n case \"y\":\n for (let p = 0; p < nPhrase; p++) {\n const phrase = cursor.phraseTerms[p] ?? [];\n for (let c = 0; c < nCol; c++) {\n values.push(row ? this.phraseFreq(row, this.columns[c]!, phrase) : 0);\n }\n }\n break;\n default:\n throw new SqliteError(`unrecognized matchinfo request: ${request}`, \"other\");\n }\n }\n const buf = new Uint8Array(values.length * 4);\n const view = new DataView(buf.buffer);\n for (let i = 0; i < values.length; i++) view.setUint32(i * 4, values[i]! >>> 0, true);\n return buf;\n }\n\n vocabRows(mode: \"row\" | \"col\" | \"instance\"): Array<Record<string, SqlValue>> {\n if (mode === \"row\") {\n const out: Array<Record<string, SqlValue>> = [];\n for (const [term, postings] of [...this.index.entries()].sort((a, b) => (a[0] < b[0] ? -1 : 1))) {\n const docs = new Set(postings.map((p) => String(p.rowid)));\n out.push({ term, doc: docs.size, cnt: postings.length });\n }\n return out;\n }\n // col / instance simplified to row shape\n return this.vocabRows(\"row\");\n }\n\n clone(): Fts5VirtualTable {\n const copy = new Fts5VirtualTable(\n this.name,\n this.options.columns.map((c) => (c.unindexed ? `${c.name} UNINDEXED` : c.name)),\n this.originalSql,\n this.kind,\n );\n // Re-parse options by reconstructing module args is imperfect; copy fields\n Object.assign(copy, {\n options: structuredClone(this.options),\n columns: [...this.columns],\n });\n (copy as unknown as { tokenize: TokenizerFn }).tokenize = this.tokenize;\n copy.nextRowid = this.nextRowid;\n for (const [rowid, row] of this.rows) {\n const cloned: Fts5Row = {\n rowid: row.rowid,\n values: new Map(row.values),\n tokensByColumn: new Map([...row.tokensByColumn.entries()].map(([k, v]) => [k, v.map((t) => ({ ...t }))])),\n };\n copy.rows.set(rowid, cloned);\n copy.indexRow(cloned);\n }\n return copy;\n }\n\n private detectCommand(values: Map<string, SqlValue>): string | null {\n // INSERT INTO t(t) VALUES('optimize') \u2014 column name equals table name\n const key = this.name.toLowerCase();\n if (!values.has(key)) return null;\n const v = values.get(key);\n if (typeof v !== \"string\") return null;\n return v;\n }\n\n private runCommand(command: string, _values: Map<string, SqlValue>, rowid?: Rowid): void {\n const cmd = command.toLowerCase();\n if (cmd === \"optimize\") return;\n if (cmd === \"rebuild\") {\n this.rebuild();\n return;\n }\n if (cmd === \"integrity-check\") return;\n if (cmd === \"delete-all\") {\n if (this.options.content === \"normal\") {\n throw new SqliteError(\n \"'delete-all' may only be used with a contentless or external content fts5 table\",\n \"other\",\n );\n }\n for (const rowid of [...this.rows.keys()]) this.delete(rowid);\n return;\n }\n if (cmd.startsWith(\"merge=\") || cmd.startsWith(\"automerge=\")) {\n throw new SqliteError(\"SQL logic error\", \"other\");\n }\n if (cmd === \"delete\") {\n if (rowid === undefined) throw new SqliteError(\"SQL logic error\", \"other\");\n this.delete(rowid);\n return;\n }\n // Unknown command string may be treated as content insert into table-named column \u2014 ignore as no-op command fail\n throw new SqliteError(\"SQL logic error\", \"other\");\n }\n\n private rebuild(): void {\n this.index.clear();\n this.docCount = 0;\n this.totalTokens = 0;\n this.avgDocLen = 0;\n for (const row of this.rows.values()) this.indexRow(row);\n }\n\n private buildRow(rowid: Rowid, values: Map<string, SqlValue>): Fts5Row {\n const stored = new Map<string, SqlValue>();\n const tokensByColumn = new Map<string, FtsToken[]>();\n for (const column of this.columns) {\n const key = column.toLowerCase();\n const value = values.get(key) ?? null;\n if (this.options.content === \"contentless\") {\n // Contentless stores index only; user-visible content columns are NULL\n stored.set(key, null);\n const text = valueToText(value);\n const colDef = this.options.columns.find((c) => c.name.toLowerCase() === key);\n tokensByColumn.set(key, colDef?.unindexed ? [] : this.tokenize(text));\n continue;\n }\n stored.set(key, value);\n const colDef = this.options.columns.find((c) => c.name.toLowerCase() === key);\n tokensByColumn.set(key, colDef?.unindexed ? [] : this.tokenize(valueToText(value)));\n }\n return { rowid, values: stored, tokensByColumn };\n }\n\n private indexRow(row: Fts5Row): void {\n let tokenCount = 0;\n for (const [col, tokens] of row.tokensByColumn) {\n for (const token of tokens) {\n tokenCount++;\n this.addPosting(token.term, {\n rowid: row.rowid,\n column: col,\n position: token.position,\n startUnit: token.startUnit,\n endUnit: token.endUnit,\n });\n for (const n of this.options.prefix) {\n if (token.term.length >= n) {\n const pref = `${token.term.slice(0, n)}*`;\n // prefix index entries are optimization only \u2014 queries still work via scan\n void pref;\n }\n }\n }\n }\n this.docCount++;\n this.totalTokens += tokenCount;\n this.avgDocLen = this.totalTokens / Math.max(1, this.docCount);\n }\n\n private unindexRow(row: Fts5Row): void {\n let tokenCount = 0;\n for (const [col, tokens] of row.tokensByColumn) {\n for (const token of tokens) {\n tokenCount++;\n this.removePosting(token.term, row.rowid, col, token.position);\n }\n }\n this.docCount = Math.max(0, this.docCount - 1);\n this.totalTokens = Math.max(0, this.totalTokens - tokenCount);\n this.avgDocLen = this.totalTokens / Math.max(1, this.docCount);\n }\n\n private addPosting(term: string, posting: Posting): void {\n const key = term.toLowerCase();\n const list = this.index.get(key);\n if (list) list.push(posting);\n else this.index.set(key, [posting]);\n }\n\n private removePosting(term: string, rowid: Rowid, column: string, position: number): void {\n const key = term.toLowerCase();\n const list = this.index.get(key);\n if (!list) return;\n const next = list.filter((p) => !(p.rowid === rowid && p.column === column && p.position === position));\n if (next.length === 0) this.index.delete(key);\n else this.index.set(key, next);\n }\n\n private indexedColumns(): string[] {\n return this.options.columns.filter((c) => !c.unindexed).map((c) => c.name);\n }\n\n private evalNode(node: FtsQueryNode, row: Fts5Row, defaultColumns: string[], hits: FtsMatchHit[]): boolean {\n switch (node.type) {\n case \"true\":\n return true;\n case \"and\":\n return node.children.every((child) => this.evalNode(child, row, defaultColumns, hits));\n case \"or\": {\n // Collect hits from matching branch only\n for (const child of node.children) {\n const local: FtsMatchHit[] = [];\n if (this.evalNode(child, row, defaultColumns, local)) {\n hits.push(...local);\n return true;\n }\n }\n return false;\n }\n case \"not\": {\n const local: FtsMatchHit[] = [];\n return !this.evalNode(node.child, row, defaultColumns, local);\n }\n case \"term\": {\n const expanded = this.expandTermNode(node);\n if (expanded.type !== \"term\") return this.evalNode(expanded, row, defaultColumns, hits);\n const cols = resolveColumns(node.column, node.columns, defaultColumns, this.columns);\n const needle = this.normalizeQueryTerm(node.value);\n let found = false;\n for (const col of cols) {\n const tokens = row.tokensByColumn.get(col.toLowerCase()) ?? [];\n for (const token of tokens) {\n if (node.prefix ? token.term.startsWith(needle) : token.term === needle) {\n hits.push({\n column: col,\n position: token.position,\n startUnit: token.startUnit,\n endUnit: token.endUnit,\n term: token.term,\n });\n found = true;\n }\n }\n }\n return found;\n }\n case \"phrase\": {\n const cols = resolveColumns(node.column, node.columns, defaultColumns, this.columns);\n let found = false;\n for (const col of cols) {\n const tokens = row.tokensByColumn.get(col.toLowerCase()) ?? [];\n const terms = node.terms.map((t) => ({\n value: this.normalizeQueryTerm(t.value),\n prefix: t.prefix,\n }));\n for (let i = 0; i <= tokens.length - terms.length; i++) {\n let ok = true;\n for (let j = 0; j < terms.length; j++) {\n const tok = tokens[i + j]!;\n const term = terms[j]!;\n if (term.prefix ? !tok.term.startsWith(term.value) : tok.term !== term.value) {\n ok = false;\n break;\n }\n }\n if (ok) {\n found = true;\n for (let j = 0; j < terms.length; j++) {\n const tok = tokens[i + j]!;\n hits.push({\n column: col,\n position: tok.position,\n startUnit: tok.startUnit,\n endUnit: tok.endUnit,\n term: tok.term,\n });\n }\n }\n }\n }\n return found;\n }\n case \"near\": {\n const cols = resolveColumns(node.column, node.columns, defaultColumns, this.columns);\n // Evaluate each child to position sets per column\n for (const col of cols) {\n const posSets: number[][] = [];\n let allOk = true;\n for (const child of node.children) {\n const local: FtsMatchHit[] = [];\n if (!this.evalNode(child, row, [col], local)) {\n allOk = false;\n break;\n }\n posSets.push(local.filter((h) => h.column.toLowerCase() === col.toLowerCase()).map((h) => h.position));\n }\n if (!allOk) continue;\n if (nearMatch(posSets, node.distance)) {\n // re-collect hits\n for (const child of node.children) this.evalNode(child, row, [col], hits);\n return true;\n }\n }\n return false;\n }\n }\n }\n\n private normalizeQueryTerm(term: string): string {\n // Query terms are tokenized with the same tokenizer when possible\n const tokens = this.tokenize(term);\n if (tokens.length === 1) return tokens[0]!.term;\n if (tokens.length === 0) return term.toLowerCase();\n // Trigram (and multi-token) queries: join is wrong for matching \u2014 use first only for df;\n // phrase matching uses tokenize() directly via evalNode.\n return tokens[0]!.term;\n }\n\n /** For trigram tokenizer, a bare MATCH term is a phrase of overlapping trigrams. */\n private expandTermNode(node: Extract<FtsQueryNode, { type: \"term\" }>): FtsQueryNode {\n if (this.options.tokenizer.name !== \"trigram\") return node;\n const tokens = this.tokenize(node.value);\n if (tokens.length <= 1) return node;\n return {\n type: \"phrase\",\n terms: tokens.map((t) => ({ value: t.term, prefix: false })),\n column: node.column,\n columns: node.columns,\n };\n }\n\n private phraseFreq(row: Fts5Row, column: string, phrase: string[]): number {\n if (phrase.length === 0) return 0;\n const tokens = row.tokensByColumn.get(column.toLowerCase()) ?? [];\n const terms = phrase.map((t) => this.normalizeQueryTerm(t));\n let count = 0;\n for (let i = 0; i <= tokens.length - terms.length; i++) {\n let ok = true;\n for (let j = 0; j < terms.length; j++) {\n if (tokens[i + j]!.term !== terms[j]) {\n ok = false;\n break;\n }\n }\n if (ok) count++;\n }\n return count;\n }\n\n private phraseDocFreq(phrase: string[]): number {\n let n = 0;\n for (const row of this.rows.values()) {\n for (const col of this.indexedColumns()) {\n if (this.phraseFreq(row, col, phrase) > 0) {\n n++;\n break;\n }\n }\n }\n return n;\n }\n\n private docLength(row: Fts5Row): number {\n let n = 0;\n for (const col of this.indexedColumns()) n += (row.tokensByColumn.get(col.toLowerCase()) ?? []).length;\n return Math.max(1, n);\n }\n\n private bumpRowid(assigned: Rowid): void {\n if (typeof assigned === \"bigint\") {\n if (assigned >= BigInt(this.nextRowid as number | bigint)) this.nextRowid = assigned + 1n;\n } else if (assigned >= (typeof this.nextRowid === \"number\" ? this.nextRowid : Number(this.nextRowid))) {\n this.nextRowid = assigned + 1;\n }\n }\n}\n\nfunction resolveColumns(\n column: string | null,\n columns: string[] | null,\n defaultColumns: string[],\n allColumns: string[],\n): string[] {\n if (columns && columns.length > 0) {\n return columns\n .map((c) => allColumns.find((x) => x.toLowerCase() === c.toLowerCase()))\n .filter((c): c is string => !!c);\n }\n if (column) {\n const matched = allColumns.find((c) => c.toLowerCase() === column.toLowerCase());\n return matched ? [matched] : [];\n }\n return defaultColumns;\n}\n\nfunction nearMatch(posSets: number[][], distance: number): boolean {\n if (posSets.length === 0) return false;\n if (posSets.length === 1) return posSets[0]!.length > 0;\n // Check if there exists a combination where max-min <= distance + (n-1) roughly (FTS5 NEAR)\n // FTS5: NEAR(a b, N) means the terms are within N tokens of each other.\n const first = posSets[0]!;\n for (const p0 of first) {\n if (nearFrom(p0, posSets.slice(1), distance)) return true;\n }\n return false;\n}\n\nfunction nearFrom(anchor: number, rest: number[][], distance: number): boolean {\n if (rest.length === 0) return true;\n const next = rest[0]!;\n for (const p of next) {\n if (Math.abs(p - anchor) <= distance) {\n if (nearFrom(p, rest.slice(1), distance)) return true;\n }\n }\n return false;\n}\n\nfunction collectPhraseTerms(node: FtsQueryNode): string[][] {\n switch (node.type) {\n case \"term\":\n return [[node.value]];\n case \"phrase\":\n return [node.terms.map((t) => t.value)];\n case \"and\":\n case \"or\":\n case \"near\":\n return node.children.flatMap(collectPhraseTerms);\n case \"not\":\n return [];\n case \"true\":\n return [];\n }\n}\n\nfunction mergeHits(hits: FtsMatchHit[]): FtsMatchHit[] {\n if (hits.length === 0) return [];\n const sorted = [...hits].sort((a, b) => a.startUnit - b.startUnit);\n const out: FtsMatchHit[] = [{ ...sorted[0]! }];\n for (let i = 1; i < sorted.length; i++) {\n const cur = sorted[i]!;\n const last = out[out.length - 1]!;\n if (cur.startUnit <= last.endUnit) last.endUnit = Math.max(last.endUnit, cur.endUnit);\n else out.push({ ...cur });\n }\n return out;\n}\n\nfunction valueToText(value: SqlValue): string {\n if (value === null) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n return \"\";\n}\n\nfunction utf8OffsetLocal(text: string, unitIndex: number): number {\n return new TextEncoder().encode(text.slice(0, unitIndex)).length;\n}\n\nexport { tokenizeFtsText };\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { Rowid } from \"../storage/row.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\n\nexport interface RTreeRow {\n id: number | bigint;\n coords: number[];\n}\n\n/**\n * Simplified R*Tree for SQLite rtree / rtree_i32 modules.\n * Stores axis-aligned boxes; queries filter by bound inequalities in WHERE.\n */\nexport class RTreeVirtualTable {\n readonly kind = \"rtree\" as const;\n readonly name: string;\n readonly columns: string[];\n readonly dimension: number;\n readonly integerCoords: boolean;\n readonly originalSql: string | null;\n readonly rows = new Map<string, RTreeRow>();\n /** Shadow node table content for rtreenode/rtreedepth. */\n readonly nodes = new Map<number, Uint8Array>();\n\n constructor(name: string, columns: string[], integerCoords = false, originalSql: string | null = null) {\n if (columns.length < 3 || columns.length % 2 === 0) {\n throw new SqliteError(\"rtree tables must have an odd number of columns >= 3\", \"other\");\n }\n this.name = name;\n this.columns = columns;\n this.dimension = (columns.length - 1) / 2;\n this.integerCoords = integerCoords;\n this.originalSql = originalSql;\n this.nodes.set(1, new Uint8Array([0]));\n }\n\n scan(): Array<{ rowid: Rowid; values: Map<string, SqlValue> }> {\n return [...this.rows.values()].map((row) => {\n const values = new Map<string, SqlValue>();\n values.set(this.columns[0]!.toLowerCase(), row.id);\n for (let i = 0; i < row.coords.length; i++) {\n values.set(this.columns[i + 1]!.toLowerCase(), row.coords[i]!);\n }\n return { rowid: row.id, values };\n });\n }\n\n insert(values: Map<string, SqlValue>): Rowid {\n const idVal = values.get(this.columns[0]!.toLowerCase());\n if (idVal === null || idVal === undefined) {\n throw new SqliteError(\"rtree id must not be NULL\", \"constraint_notnull\");\n }\n const id = typeof idVal === \"bigint\" ? idVal : Math.trunc(Number(idVal));\n const key = String(id);\n if (this.rows.has(key)) throw new SqliteError(\"UNIQUE constraint failed\", \"constraint_unique\");\n const coords: number[] = [];\n for (let i = 1; i < this.columns.length; i++) {\n const raw = values.get(this.columns[i]!.toLowerCase()) ?? null;\n if (raw === null) throw new SqliteError(\"rtree coordinate must not be NULL\", \"constraint_notnull\");\n let n = Number(raw);\n if (this.integerCoords) n = Math.trunc(n);\n coords.push(n);\n }\n this.rows.set(key, { id, coords });\n return id;\n }\n\n update(rowid: Rowid, updates: Map<string, SqlValue>): void {\n const key = String(rowid);\n const existing = this.rows.get(key);\n if (!existing) return;\n const values = new Map<string, SqlValue>();\n values.set(this.columns[0]!.toLowerCase(), existing.id);\n for (let i = 0; i < existing.coords.length; i++) {\n values.set(this.columns[i + 1]!.toLowerCase(), existing.coords[i]!);\n }\n for (const [k, v] of updates) values.set(k, v);\n this.rows.delete(key);\n this.insert(values);\n }\n\n delete(rowid: Rowid): void {\n this.rows.delete(String(rowid));\n }\n\n clone(): RTreeVirtualTable {\n const copy = new RTreeVirtualTable(this.name, this.columns, this.integerCoords, this.originalSql);\n for (const [k, row] of this.rows) copy.rows.set(k, { id: row.id, coords: [...row.coords] });\n for (const [k, v] of this.nodes) copy.nodes.set(k, new Uint8Array(v));\n return copy;\n }\n}\n\nexport class DbStatVirtualTable {\n readonly kind = \"dbstat\" as const;\n readonly name: string;\n readonly columns = [\n \"name\",\n \"path\",\n \"pageno\",\n \"pagetype\",\n \"ncell\",\n \"payload\",\n \"unused\",\n \"mx_payload\",\n \"pgoffset\",\n \"pgsize\",\n ];\n readonly originalSql: string | null;\n readonly schemaArg: string | null;\n\n constructor(name: string, schemaArg: string | null = null, originalSql: string | null = null) {\n this.name = name;\n this.schemaArg = schemaArg;\n this.originalSql = originalSql;\n }\n\n clone(): DbStatVirtualTable {\n return new DbStatVirtualTable(this.name, this.schemaArg, this.originalSql);\n }\n}\n\nexport class BytecodeVirtualTable {\n readonly kind = \"bytecode\" as const;\n readonly name: string;\n readonly columns = [\"addr\", \"opcode\", \"p1\", \"p2\", \"p3\", \"p4\", \"p5\", \"comment\", \"subprog\"];\n readonly originalSql: string | null;\n\n constructor(name: string, originalSql: string | null = null) {\n this.name = name;\n this.originalSql = originalSql;\n }\n\n clone(): BytecodeVirtualTable {\n return new BytecodeVirtualTable(this.name, this.originalSql);\n }\n}\n\nexport class TablesUsedVirtualTable {\n readonly kind = \"tables_used\" as const;\n readonly name: string;\n readonly columns = [\"type\", \"schema\", \"name\"];\n readonly originalSql: string | null;\n\n constructor(name: string, originalSql: string | null = null) {\n this.name = name;\n this.originalSql = originalSql;\n }\n\n clone(): TablesUsedVirtualTable {\n return new TablesUsedVirtualTable(this.name, this.originalSql);\n }\n}\n\nexport class FtsVocabVirtualTable {\n readonly kind = \"fts5vocab\" as const;\n readonly name: string;\n readonly columns: string[];\n readonly ftsTable: string;\n readonly vocabType: string;\n readonly originalSql: string | null;\n\n constructor(name: string, args: string[], originalSql: string | null = null) {\n if (args.length < 1) throw new SqliteError(\"fts5vocab requires an fts5 table name\", \"other\");\n this.name = name;\n this.ftsTable = args[0]!;\n this.vocabType = (args[1] ?? \"row\").replace(/'/g, \"\").toLowerCase();\n this.columns =\n this.vocabType === \"col\"\n ? [\"term\", \"col\", \"doc\", \"cnt\"]\n : this.vocabType === \"instance\"\n ? [\"term\", \"doc\", \"col\", \"offset\"]\n : [\"term\", \"doc\", \"cnt\"];\n this.originalSql = originalSql;\n }\n\n clone(): FtsVocabVirtualTable {\n return new FtsVocabVirtualTable(this.name, [this.ftsTable, this.vocabType], this.originalSql);\n }\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { Row } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\n\n/** Always-on invariant check (Tiger Style \u2014 not stripped in production). */\nexport function assert(condition: boolean, message: string): asserts condition {\n if (!condition) {\n throw new SqliteError(`internal assertion failed: ${message}`, \"other\");\n }\n}\n\n/** Exhaustive switch helper \u2014 call when a union case should be impossible. */\nexport function assertUnreachable(value: never, message = \"unreachable\"): never {\n throw new SqliteError(`internal assertion failed: ${message} (${String(value)})`, \"other\");\n}\n\n/** Row payload must align with table column count after insert/update. */\nexport function assertRowShape(table: Table, row: Row): void {\n assert(row.values.length === table.columns.length, `row.values.length !== table.columns.length for ${table.name}`);\n}\n\n/** Maximum blob/string length enforced before allocation (matches bun:sqlite TOOBIG). */\nexport const SQLITE_MAX_LENGTH = 2_147_483_647;\n\nexport function assertBlobLength(length: number, _feature: string): void {\n if (!Number.isFinite(length) || length < 0) return;\n if (length >= SQLITE_MAX_LENGTH) {\n throw new SqliteError(`string or blob too big`, \"other\", \"SQLITE_TOOBIG\");\n }\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { compareSql, type SqlValue } from \"./value.ts\";\n\nexport type BuiltinCollation = \"BINARY\" | \"NOCASE\" | \"RTRIM\";\n\nexport function normalizeForCollation(value: SqlValue, name: string): SqlValue {\n const collation = builtinCollation(name);\n if (typeof value !== \"string\" || collation === \"BINARY\") return value;\n if (collation === \"RTRIM\") return value.replace(/ +$/u, \"\");\n\n let normalized = \"\";\n for (const char of value) {\n const code = char.charCodeAt(0);\n normalized += code >= 0x41 && code <= 0x5a ? String.fromCharCode(code + 0x20) : char;\n }\n return normalized;\n}\n\nexport function compareWithCollation(a: SqlValue, b: SqlValue, name: string): number | null {\n return compareSql(normalizeForCollation(a, name), normalizeForCollation(b, name));\n}\n\nfunction builtinCollation(name: string): BuiltinCollation {\n const normalized = name.toUpperCase();\n if (normalized === \"BINARY\" || normalized === \"NOCASE\" || normalized === \"RTRIM\") return normalized;\n throw new SqliteError(`no such collation sequence: ${name}`, \"other\");\n}\n", "import type { SqlValue } from \"../types/value.ts\";\nimport { cloneSqlValue } from \"../types/value.ts\";\n\nexport type Rowid = number | bigint;\n\n/** Heap row: `values[i]` is `table.columns[i]`. */\nexport interface Row {\n rowid: Rowid;\n values: SqlValue[];\n}\n\nexport type NamedRowValues = Map<string, SqlValue> | ReadonlyMap<string, SqlValue> | Record<string, SqlValue>;\nexport type RowValues = NamedRowValues | readonly SqlValue[];\n\nexport function normalizeColumnName(name: string): string {\n return name.toLowerCase();\n}\n\nexport function rowValues(values: NamedRowValues): Map<string, SqlValue> {\n const result = new Map<string, SqlValue>();\n const entries = values instanceof Map ? values.entries() : Object.entries(values);\n for (const [name, value] of entries) {\n result.set(normalizeColumnName(name), value);\n }\n return result;\n}\n\nexport function cloneRow(row: Row): Row {\n const values = new Array<SqlValue>(row.values.length);\n for (let i = 0; i < row.values.length; i++) values[i] = cloneSqlValue(row.values[i]!);\n return { rowid: row.rowid, values };\n}\n\nexport function isValueArray(values: RowValues): values is readonly SqlValue[] {\n return Array.isArray(values);\n}\n", "import type { Expr, TableConstraint } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { serializeIndexKey } from \"../indexes/index.ts\";\nimport { assertRowShape } from \"../runtime/assert.ts\";\nimport { compareWithCollation, normalizeForCollation } from \"../types/collation.ts\";\nimport { applyStrictValue } from \"../types/strict.ts\";\nimport type { Affinity, SqlValue } from \"../types/value.ts\";\nimport { affinityFromTypeName, applyAffinity, cloneSqlValue, compareSql } from \"../types/value.ts\";\nimport type { ColumnarSlab } from \"./columnar-slab.ts\";\nimport type { NamedRowValues, Row, Rowid, RowValues } from \"./row.ts\";\nimport { isValueArray, normalizeColumnName, rowValues } from \"./row.ts\";\n\n/** Build a covering equality hash once a table is large enough that scans dominate. */\nconst EQUALITY_HASH_MIN_ROWS = 16;\n\nexport interface ColumnInfo {\n name: string;\n /** Cached `name.toLowerCase()` for hot-path lookups. */\n nameLower?: string;\n typeName: string | null;\n affinity: Affinity;\n notNull: boolean;\n primaryKey: boolean;\n autoincrement: boolean;\n defaultExpr: Expr | null;\n unique: boolean;\n /** Declared column collation (BINARY/NOCASE/RTRIM); null means BINARY. */\n collate: string | null;\n /** GENERATED ALWAYS AS (...) \u2014 VIRTUAL computed on read, STORED materialized. */\n generated: { expr: Expr; stored: boolean } | null;\n}\n\nexport interface InsertOptions {\n /** Values are already affinity-applied Maps with lowercase keys; skip prepareValues. */\n prepared?: boolean;\n /** Skip NOT NULL / UNIQUE / PK scans (caller already enforced, or table is unconstrained). */\n skipValidate?: boolean;\n}\n\nexport interface InsertRow {\n rowid?: Rowid;\n values: RowValues;\n}\n\nexport interface TableOptions {\n constraints?: TableConstraint[];\n indexes?: string[];\n originalSql?: string | null;\n withoutRowid?: boolean;\n strict?: boolean;\n}\n\nexport class Table {\n name: string;\n columns: ColumnInfo[];\n rows: Map<Rowid, Row>;\n nextRowid: Rowid;\n constraints: TableConstraint[];\n indexes: string[];\n originalSql: string | null;\n withoutRowid: boolean;\n strict: boolean;\n /** Clustered PK key string \u2192 row for WITHOUT ROWID tables. */\n clusteredRows: Map<string, Row>;\n /** Frozen columnar storage after snapshot hydrate; `rows` stays empty until materialized. */\n slab: ColumnarSlab | null = null;\n private scanCache: Row[] | null = null;\n /** Lazy covering hashes: column nameLower \u2192 serializeIndexKey \u2192 rowids. */\n private equalityHashes: Map<string, Map<string, Rowid[]>> | null = null;\n /** Cached maximum rowid. `undefined` means recompute after deleting the maximum. */\n private maximumRowid: Rowid | null | undefined = null;\n frozen = false;\n /** nameLower \u2192 column index; rebuilt after ALTER. */\n private colIndex = new Map<string, number>();\n\n constructor(name: string, columns: ColumnInfo[], options: TableOptions = {}) {\n this.name = name;\n this.columns = columns.map(cloneColumn);\n this.rows = new Map();\n this.nextRowid = 1;\n this.constraints = cloneAst(options.constraints ?? []);\n this.indexes = [...(options.indexes ?? [])];\n this.originalSql = options.originalSql ?? null;\n this.withoutRowid = options.withoutRowid ?? false;\n this.strict = options.strict ?? false;\n this.clusteredRows = new Map();\n this.scanCache = null;\n this.rebuildColIndex();\n }\n\n rebuildColIndex(): void {\n this.colIndex = new Map();\n for (let i = 0; i < this.columns.length; i++) {\n const column = this.columns[i]!;\n this.colIndex.set(column.nameLower ?? column.name.toLowerCase(), i);\n }\n }\n\n columnOffset(nameLower: string): number | undefined {\n return this.colIndex.get(nameLower);\n }\n\n hasColumn(nameLower: string): boolean {\n return this.colIndex.has(nameLower);\n }\n\n cell(row: Row, nameLower: string): SqlValue {\n const i = this.colIndex.get(nameLower);\n return i === undefined ? null : (row.values[i] ?? null);\n }\n\n setCell(row: Row, nameLower: string, value: SqlValue): void {\n const i = this.colIndex.get(nameLower);\n if (i === undefined) throw new SqliteError(`no such column: ${nameLower}`, \"no_such_column\");\n row.values[i] = value;\n }\n\n namedValues(row: Row): Map<string, SqlValue> {\n const map = new Map<string, SqlValue>();\n for (let i = 0; i < this.columns.length; i++) {\n const column = this.columns[i]!;\n map.set(column.nameLower ?? column.name.toLowerCase(), row.values[i] ?? null);\n }\n return map;\n }\n\n rowFromNamed(values: Map<string, SqlValue>, rowid: Rowid = 0): Row {\n const cells: SqlValue[] = [];\n for (const column of this.columns) {\n cells.push(values.get(normalizeColumnName(column.name)) ?? null);\n }\n return { rowid, values: cells };\n }\n\n integerPkColumn(): ColumnInfo | undefined {\n return this.integerPrimaryKeyAlias();\n }\n\n get(rowid: Rowid): Row | undefined {\n if (this.slab) {\n const hit = this.slab.get(rowid);\n return hit ?? undefined;\n }\n try {\n return this.rows.get(canonicalRowid(rowid));\n } catch {\n return undefined;\n }\n }\n\n /** Row count (slab-backed or map-backed). */\n rowCount(): number {\n return this.slab ? this.slab.rowCount : this.rows.size;\n }\n\n /** Rows sorted by rowid for snapshot encode. */\n sortedRows(): Row[] {\n if (this.slab) return [...this.slab.scan()].map((r) => ({ rowid: r.rowid, values: [...r.values] }));\n return [...this.rows.values()].sort((a, b) => compareRowids(a.rowid, b.rowid));\n }\n\n /** Attach decoded columnar slab (hydrate path). */\n attachSlab(slab: ColumnarSlab): void {\n this.slab = slab;\n this.invalidateScan();\n }\n\n /** Materialize slab into `rows` Map for mutation. */\n materializeSlab(): void {\n if (!this.slab) return;\n for (const row of this.slab.scan()) this.rows.set(row.rowid, { rowid: row.rowid, values: [...row.values] });\n this.slab = null;\n if (this.withoutRowid) this.rebuildClusteredRows();\n else this.invalidateScan();\n }\n\n private hasRow(rowid: Rowid): boolean {\n if (this.slab) return this.slab.get(rowid) !== undefined;\n try {\n return this.rows.has(canonicalRowid(rowid));\n } catch {\n return false;\n }\n }\n\n private allRowids(): Iterable<Rowid> {\n if (this.slab) return this.slab.rowids;\n return this.rows.keys();\n }\n\n getByKey(value: SqlValue): Row | undefined {\n if (value === null || this.withoutRowid) return undefined;\n try {\n return this.get(asRowid(value, \"rowid\"));\n } catch {\n return undefined;\n }\n }\n\n private invalidateScan(): void {\n this.scanCache = null;\n }\n\n private commitRow(row: Row): void {\n assertRowShape(this, row);\n this.indexEquality(row);\n this.invalidateScan();\n }\n\n private reindexEquality(before: Row, after: Row): void {\n this.unindexEquality(before);\n this.indexEquality(after);\n this.invalidateScan();\n }\n\n /** True when the table has no user constraints that DML must enforce beyond hidden rowid. */\n isUnconstrained(): boolean {\n if (this.withoutRowid || this.strict || this.indexes.length > 0 || this.constraints.length > 0) return false;\n for (const column of this.columns) {\n if (column.notNull || column.primaryKey || column.unique || column.generated || column.defaultExpr) return false;\n }\n return true;\n }\n\n /**\n * Point lookup via a write-maintained covering hash (not a schema index).\n * Returns null when the table is too small or the column does not exist.\n */\n lookupEquality(columnLower: string, value: SqlValue): Row[] | null {\n if (!this.ensureEqualityHash(columnLower)) return null;\n const map = this.equalityHashes!.get(columnLower);\n if (!map) return null;\n const column = this.columns.find((item) => item.nameLower === columnLower);\n const key = serializeIndexKey([normalizeForCollation(value, column?.collate ?? \"BINARY\")]);\n if (key === null) return [];\n const rowids = map.get(key);\n if (!rowids || rowids.length === 0) return [];\n const rows: Row[] = [];\n for (const rowid of rowids) {\n const row = this.get(rowid);\n if (row) rows.push(row);\n }\n return rows;\n }\n\n ensureEqualityHash(columnLower: string): boolean {\n if (this.frozen || this.rowCount() < EQUALITY_HASH_MIN_ROWS) return false;\n const column = this.columns.find((item) => item.nameLower === columnLower);\n if (!column) return false;\n this.equalityHashes ??= new Map();\n if (this.equalityHashes.has(columnLower)) return true;\n const map = new Map<string, Rowid[]>();\n const collate = column.collate ?? \"BINARY\";\n const iter = this.slab ? this.slab.scan() : this.rows.values();\n for (const row of iter) {\n const key = serializeIndexKey([normalizeForCollation(this.cell(row, columnLower), collate)]);\n if (key === null) continue;\n const bucket = map.get(key);\n if (bucket) bucket.push(row.rowid);\n else map.set(key, [row.rowid]);\n }\n this.equalityHashes.set(columnLower, map);\n return true;\n }\n\n clearEqualityHashes(): void {\n this.equalityHashes = null;\n }\n\n private indexEquality(row: Row): void {\n if (!this.equalityHashes) return;\n for (const [columnLower, map] of this.equalityHashes) {\n const column = this.columns.find((item) => item.nameLower === columnLower);\n const key = serializeIndexKey([normalizeForCollation(this.cell(row, columnLower), column?.collate ?? \"BINARY\")]);\n if (key === null) continue;\n const bucket = map.get(key);\n if (bucket) {\n if (!bucket.some((id) => sameRowid(id, row.rowid))) bucket.push(row.rowid);\n } else map.set(key, [row.rowid]);\n }\n }\n\n private unindexEquality(row: Row): void {\n if (!this.equalityHashes) return;\n for (const [columnLower, map] of this.equalityHashes) {\n const column = this.columns.find((item) => item.nameLower === columnLower);\n const key = serializeIndexKey([normalizeForCollation(this.cell(row, columnLower), column?.collate ?? \"BINARY\")]);\n if (key === null) continue;\n const bucket = map.get(key);\n if (!bucket) continue;\n const index = bucket.findIndex((id) => sameRowid(id, row.rowid));\n if (index >= 0) bucket.splice(index, 1);\n if (bucket.length === 0) map.delete(key);\n }\n }\n\n insert(input: InsertRow | RowValues, options?: InsertOptions): Rowid {\n this.assertMutable();\n const supplied = isInsertRow(input) ? input : { values: input };\n const values = this.cellsFromInput(supplied.values, options?.prepared === true);\n\n if (this.withoutRowid) {\n if (supplied.rowid !== undefined) {\n throw new SqliteError(`table ${this.name} has no column named rowid`, \"other\");\n }\n const rowid = canonicalRowid(this.allocateRowid());\n const candidate: Row = { rowid, values };\n if (!options?.skipValidate) this.validate(candidate);\n const clusterKey = this.makeClusterKey(values);\n if (this.clusteredRows.has(clusterKey)) {\n throw primaryKeyConflict(this.name, this.primaryKeyColumns());\n }\n this.clusteredRows.set(clusterKey, candidate);\n this.rows.set(rowid, candidate);\n this.advanceNextRowid(rowid);\n this.commitRow(candidate);\n return rowid;\n }\n\n const alias = this.integerPrimaryKeyAlias();\n let rowid = supplied.rowid;\n\n if (alias) {\n const value = this.cell({ rowid: 0, values }, normalizeColumnName(alias.name));\n if (rowid === undefined && value !== null) rowid = asRowid(value, alias.name);\n }\n rowid = canonicalRowid(rowid ?? this.allocateRowid());\n\n if (this.hasRow(rowid)) {\n throw new SqliteError(\n `UNIQUE constraint failed: ${this.name}.rowid`,\n \"constraint_primary\",\n \"SQLITE_CONSTRAINT_PRIMARYKEY\",\n );\n }\n if (alias) this.setCell({ rowid, values }, normalizeColumnName(alias.name), rowid);\n\n const candidate: Row = { rowid, values };\n if (!options?.skipValidate) this.validate(candidate);\n this.rows.set(rowid, candidate);\n this.advanceNextRowid(rowid);\n this.commitRow(candidate);\n return rowid;\n }\n\n update(rowid: Rowid, updates: RowValues): Row | undefined {\n this.assertMutable();\n const key = canonicalRowid(rowid);\n const existing = this.rows.get(key);\n if (!existing) return undefined;\n\n const values = existing.values.slice();\n const incoming = isValueArray(updates) ? updates : rowValues(updates);\n if (isValueArray(updates)) {\n for (let i = 0; i < updates.length && i < this.columns.length; i++) {\n const column = this.columns[i]!;\n values[i] = applyAffinity(cloneSqlValue(updates[i] ?? null), column.affinity);\n }\n } else {\n for (const [name, value] of incoming as Map<string, SqlValue>) {\n const column = this.column(name);\n const offset = this.columnOffset(normalizeColumnName(column.name));\n if (offset === undefined) continue;\n values[offset] = applyAffinity(cloneSqlValue(value), column.affinity);\n }\n }\n\n if (this.withoutRowid) {\n const oldClusterKey = this.makeClusterKey(existing.values);\n const newClusterKey = this.makeClusterKey(values);\n if (newClusterKey !== oldClusterKey && this.clusteredRows.has(newClusterKey)) {\n throw primaryKeyConflict(this.name, this.primaryKeyColumns());\n }\n const candidate: Row = { rowid: key, values };\n this.validate(candidate, key);\n if (newClusterKey !== oldClusterKey) this.clusteredRows.delete(oldClusterKey);\n this.clusteredRows.set(newClusterKey, candidate);\n this.rows.set(key, candidate);\n this.reindexEquality(existing, candidate);\n return candidate;\n }\n\n const alias = this.integerPrimaryKeyAlias();\n const aliasRow: Row = { rowid: key, values };\n const targetKey = alias ? asRowid(this.cell(aliasRow, normalizeColumnName(alias.name)), alias.name) : key;\n if (targetKey !== key && this.hasRow(targetKey)) {\n throw new SqliteError(\n `UNIQUE constraint failed: ${this.name}.${alias?.name ?? \"rowid\"}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n if (alias) this.setCell(aliasRow, normalizeColumnName(alias.name), targetKey);\n const candidate: Row = { rowid: targetKey, values };\n this.validate(candidate, key);\n if (targetKey !== key) {\n this.rows.delete(key);\n if (this.maximumRowid !== null && this.maximumRowid !== undefined && sameRowid(key, this.maximumRowid)) {\n this.maximumRowid = undefined;\n }\n }\n this.rows.set(targetKey, candidate);\n this.advanceNextRowid(targetKey);\n this.reindexEquality(existing, candidate);\n return candidate;\n }\n\n delete(rowid: Rowid): boolean {\n this.assertMutable();\n const key = canonicalRowid(rowid);\n const existing = this.rows.get(key);\n if (!existing) return false;\n if (this.withoutRowid) this.clusteredRows.delete(this.makeClusterKey(existing.values));\n this.unindexEquality(existing);\n this.invalidateScan();\n if (this.maximumRowid !== null && this.maximumRowid !== undefined && sameRowid(key, this.maximumRowid)) {\n this.maximumRowid = undefined;\n }\n return this.rows.delete(key);\n }\n\n *scan(): Iterable<Row> {\n if (this.slab) {\n yield* this.slab.scan();\n return;\n }\n if (!this.scanCache) {\n if (this.withoutRowid) {\n this.scanCache = [...this.clusteredRows.values()].sort((a, b) => this.comparePrimaryKeys(a, b));\n } else {\n this.scanCache = [...this.rows.values()].sort((a, b) => compareRowids(a.rowid, b.rowid));\n }\n }\n yield* this.scanCache;\n }\n\n clone(): Table {\n const copy = new Table(this.name, this.columns, {\n constraints: this.constraints,\n indexes: this.indexes,\n originalSql: this.originalSql,\n withoutRowid: this.withoutRowid,\n strict: this.strict,\n });\n copy.nextRowid = this.nextRowid;\n copy.maximumRowid = this.maximumRowid;\n if (this.slab) {\n for (const row of this.slab.scan()) copy.rows.set(row.rowid, row);\n } else {\n for (const [rowid, row] of this.rows) copy.rows.set(rowid, row);\n }\n for (const [clusterKey, row] of this.clusteredRows) copy.clusteredRows.set(clusterKey, row);\n return copy;\n }\n\n freeze(): void {\n this.frozen = true;\n }\n\n private assertMutable(): void {\n if (this.frozen) throw new SqliteError(\"internal: cannot mutate a frozen table\", \"other\");\n if (this.slab) this.materializeSlab();\n }\n\n /** Rebuild clustered storage after snapshot decode or bulk load. */\n rebuildClusteredRows(): void {\n this.maximumRowid = undefined;\n if (!this.withoutRowid) return;\n this.clusteredRows.clear();\n const iter = this.slab ? this.slab.scan() : this.rows.values();\n for (const row of iter) {\n this.clusteredRows.set(this.makeClusterKey(row.values), row);\n }\n this.invalidateScan();\n this.clearEqualityHashes();\n }\n\n private cellsFromInput(input: RowValues, prepared: boolean): SqlValue[] {\n if (isValueArray(input)) {\n if (prepared && input.length === this.columns.length) return [...input];\n return this.prepareValues(namedFromArray(this, input));\n }\n if (prepared) {\n const named = rowValues(input);\n const cells: SqlValue[] = [];\n for (const column of this.columns) cells.push(named.get(normalizeColumnName(column.name)) ?? null);\n return cells;\n }\n return this.prepareValues(input);\n }\n\n private prepareValues(input: NamedRowValues): SqlValue[] {\n const supplied = rowValues(input);\n for (const name of supplied.keys()) this.column(name);\n\n const result: SqlValue[] = [];\n for (const column of this.columns) {\n const key = normalizeColumnName(column.name);\n const raw = cloneSqlValue(supplied.get(key) ?? null);\n const affined = applyAffinity(raw, column.affinity);\n result.push(this.strict ? applyStrictValue(affined, column.typeName ?? \"\", this.name, column.name) : affined);\n }\n return result;\n }\n\n private column(name: string): ColumnInfo {\n const key = normalizeColumnName(name);\n const column = this.columns.find((item) => normalizeColumnName(item.name) === key);\n if (!column) throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n return column;\n }\n\n private validate(row: Row, excludedRowid?: Rowid): void {\n for (let i = 0; i < this.columns.length; i++) {\n const column = this.columns[i]!;\n const value = row.values[i] ?? null;\n if ((column.notNull || column.primaryKey) && value === null) {\n const category = column.primaryKey ? \"constraint_primary\" : \"constraint_notnull\";\n const code = column.primaryKey ? \"SQLITE_CONSTRAINT_PRIMARYKEY\" : \"SQLITE_CONSTRAINT_NOTNULL\";\n throw new SqliteError(\n `${column.primaryKey ? \"PRIMARY KEY\" : \"NOT NULL\"} constraint failed: ${this.name}.${column.name}`,\n category,\n code,\n );\n }\n }\n\n const uniqueSets = this.uniqueColumnSets();\n if (this.indexes.length === 0) {\n for (const names of uniqueSets) {\n const values = names.map((name) => this.cell(row, normalizeColumnName(name)));\n if (values.some((value) => value === null)) continue;\n for (const other of this.rows.values()) {\n if (excludedRowid !== undefined && other.rowid === excludedRowid) continue;\n if (\n values.every((value, index) => {\n const column = this.column(names[index]!);\n const otherValue = this.cell(other, normalizeColumnName(names[index]!));\n const collation = column.collate ?? \"BINARY\";\n return compareWithCollation(value, otherValue, collation) === 0;\n })\n ) {\n const qualified = names.map((name) => `${this.name}.${name}`).join(\", \");\n throw new SqliteError(\n `UNIQUE constraint failed: ${qualified}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n }\n }\n } else if (uniqueSets.length > 0) {\n // Indexes exist: uniqueness is enforced by IndexStore on addIndexes / conflict checks.\n }\n }\n\n private uniqueColumnSets(): string[][] {\n const sets = this.columns.filter((column) => column.unique).map((column) => [column.name]);\n if (!this.constraints.some((constraint) => constraint.type === \"primary_key\")) {\n const primary = this.columns.filter((column) => column.primaryKey).map((column) => column.name);\n if (primary.length > 0) sets.push(primary);\n }\n for (const constraint of this.constraints) {\n if (constraint.type === \"unique\" || constraint.type === \"primary_key\") {\n sets.push(constraint.columns.map((column) => column.name));\n }\n }\n return sets;\n }\n\n private primaryKeyColumns(): ColumnInfo[] {\n const tablePrimary = this.constraints.find((constraint) => constraint.type === \"primary_key\");\n if (tablePrimary) {\n return tablePrimary.columns.map((column) => this.column(column.name));\n }\n return this.columns.filter((column) => column.primaryKey);\n }\n\n private makeClusterKey(values: readonly SqlValue[]): string {\n return this.primaryKeyColumns()\n .map((column) => {\n const offset = this.columnOffset(normalizeColumnName(column.name)) ?? 0;\n const value = values[offset] ?? null;\n const normalized = normalizeForCollation(value, column.collate ?? \"BINARY\");\n return serializePkComponent(normalized);\n })\n .join(\"\\0\");\n }\n\n private comparePrimaryKeys(left: Row, right: Row): number {\n for (const column of this.primaryKeyColumns()) {\n const key = normalizeColumnName(column.name);\n const leftValue = this.cell(left, key);\n const rightValue = this.cell(right, key);\n const comparison = column.collate\n ? compareWithCollation(leftValue, rightValue, column.collate)\n : compareSql(leftValue, rightValue);\n if (comparison !== 0) return comparison ?? 0;\n }\n return 0;\n }\n\n private integerPrimaryKeyAlias(): ColumnInfo | undefined {\n if (this.withoutRowid) return undefined;\n const primary = this.columns.filter((column) => column.primaryKey);\n if (primary.length !== 1 || primary[0]!.typeName?.trim().toUpperCase() !== \"INTEGER\") return undefined;\n return primary[0];\n }\n\n private allocateRowid(): Rowid {\n if (!this.columns.some((column) => column.autoincrement)) {\n if (this.maximumRowid === undefined) {\n this.maximumRowid = null;\n for (const rowid of this.allRowids()) {\n if (this.maximumRowid === null || compareRowids(rowid, this.maximumRowid) > 0) this.maximumRowid = rowid;\n }\n } else if (this.maximumRowid === null && this.rowCount() > 0) {\n for (const rowid of this.allRowids()) {\n if (this.maximumRowid === null || compareRowids(rowid, this.maximumRowid) > 0) this.maximumRowid = rowid;\n }\n }\n return this.maximumRowid === null ? 1 : incrementRowid(this.maximumRowid);\n }\n const maxSigned = 9223372036854775807n;\n let candidate = canonicalRowid(this.nextRowid);\n while (this.hasRow(candidate)) {\n if (BigInt(candidate) >= maxSigned) {\n throw new SqliteError(\"database or disk is full\", \"other\", \"SQLITE_FULL\");\n }\n candidate = incrementRowid(candidate);\n }\n if (BigInt(candidate) > maxSigned) {\n throw new SqliteError(\"database or disk is full\", \"other\", \"SQLITE_FULL\");\n }\n return candidate;\n }\n\n private advanceNextRowid(rowid: Rowid): void {\n if (\n this.maximumRowid === null ||\n (this.maximumRowid !== undefined && compareRowids(rowid, this.maximumRowid) > 0)\n ) {\n this.maximumRowid = rowid;\n }\n if (compareRowids(rowid, this.nextRowid) >= 0) this.nextRowid = incrementRowid(rowid);\n }\n}\n\nexport function makeColumnInfo(\n name: string,\n typeName: string | null,\n options: Partial<Omit<ColumnInfo, \"name\" | \"nameLower\" | \"typeName\" | \"affinity\">> = {},\n): ColumnInfo {\n return {\n name,\n nameLower: name.toLowerCase(),\n typeName,\n affinity: affinityFromTypeName(typeName),\n notNull: options.notNull ?? false,\n primaryKey: options.primaryKey ?? false,\n autoincrement: options.autoincrement ?? false,\n defaultExpr: options.defaultExpr ?? null,\n unique: options.unique ?? false,\n collate: options.collate ?? null,\n generated: options.generated ?? null,\n };\n}\n\nfunction cloneColumn(column: ColumnInfo): ColumnInfo {\n return {\n ...column,\n nameLower: column.nameLower ?? column.name.toLowerCase(),\n defaultExpr: column.defaultExpr === null ? null : cloneAst(column.defaultExpr),\n generated:\n column.generated === null ? null : { expr: cloneAst(column.generated.expr), stored: column.generated.stored },\n };\n}\n\nfunction cloneAst<T>(value: T): T {\n return structuredClone(value);\n}\n\nfunction isInsertRow(input: InsertRow | RowValues): input is InsertRow {\n return (\n typeof input === \"object\" && input !== null && !Array.isArray(input) && !(input instanceof Map) && \"values\" in input\n );\n}\n\nfunction namedFromArray(table: Table, values: readonly SqlValue[]): Map<string, SqlValue> {\n const named = new Map<string, SqlValue>();\n for (let i = 0; i < table.columns.length; i++) {\n named.set(normalizeColumnName(table.columns[i]!.name), values[i] ?? null);\n }\n return named;\n}\n\nfunction asRowid(value: SqlValue, column: string): Rowid {\n if (typeof value === \"bigint\") return canonicalRowid(value);\n if (typeof value === \"number\" && Number.isSafeInteger(value)) return value;\n throw new SqliteError(\n `datatype mismatch for INTEGER PRIMARY KEY column: ${column}`,\n \"datatype_mismatch\",\n \"SQLITE_MISMATCH\",\n );\n}\n\nfunction canonicalRowid(value: Rowid): Rowid {\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value))\n throw new SqliteError(\"rowid must be a safe integer or bigint\", \"datatype_mismatch\", \"SQLITE_MISMATCH\");\n return value;\n }\n if (value <= BigInt(Number.MAX_SAFE_INTEGER) && value >= BigInt(Number.MIN_SAFE_INTEGER)) return Number(value);\n return value;\n}\n\nfunction incrementRowid(value: Rowid): Rowid {\n if (typeof value === \"bigint\") return value + 1n;\n if (value < Number.MAX_SAFE_INTEGER) return value + 1;\n return BigInt(value) + 1n;\n}\n\nfunction compareRowids(left: Rowid, right: Rowid): number {\n const a = typeof left === \"bigint\" ? left : BigInt(left);\n const b = typeof right === \"bigint\" ? right : BigInt(right);\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction sameRowid(left: Rowid, right: Rowid): boolean {\n return typeof left === \"bigint\" || typeof right === \"bigint\" ? BigInt(left) === BigInt(right) : left === right;\n}\n\nfunction serializePkComponent(value: SqlValue): string {\n if (value === null) return \"\\0n\";\n if (typeof value === \"bigint\") return `\\0b:${value.toString()}`;\n if (typeof value === \"number\") return `\\0i:${value}`;\n if (typeof value === \"string\") return `\\0s:${value}`;\n if (value instanceof Uint8Array) return `\\0x:${Array.from(value).join(\",\")}`;\n return `\\0r:${value.value}`;\n}\n\nfunction primaryKeyConflict(tableName: string, columns: ColumnInfo[]): never {\n const qualified = columns.map((column) => `${tableName}.${column.name}`).join(\", \");\n throw new SqliteError(`UNIQUE constraint failed: ${qualified}`, \"constraint_primary\", \"SQLITE_CONSTRAINT_PRIMARYKEY\");\n}\n", "import type {\n CreateIndexStmt,\n CreateTableStmt,\n CreateViewStmt,\n CreateVirtualTableStmt,\n Expr,\n IndexedColumn,\n SelectStmt,\n} from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { IndexStore } from \"../indexes/index.ts\";\nimport { isStrictTypeName, unknownStrictType } from \"../types/strict.ts\";\nimport { affinityFromTypeName } from \"../types/value.ts\";\nimport { Fts5VirtualTable } from \"../vtable/fts5.ts\";\nimport {\n BytecodeVirtualTable,\n DbStatVirtualTable,\n FtsVocabVirtualTable,\n RTreeVirtualTable,\n TablesUsedVirtualTable,\n} from \"../vtable/modules.ts\";\nimport type { Rowid } from \"./row.ts\";\nimport type { ColumnInfo } from \"./table.ts\";\nimport { Table } from \"./table.ts\";\n\nexport type AnyVirtualTable =\n | Fts5VirtualTable\n | RTreeVirtualTable\n | DbStatVirtualTable\n | BytecodeVirtualTable\n | TablesUsedVirtualTable\n | FtsVocabVirtualTable;\n\nexport interface ViewInfo {\n name: string;\n columns: string[] | null;\n select: SelectStmt;\n originalSql: string | null;\n}\n\nexport interface IndexInfo {\n name: string;\n tableName: string;\n unique: boolean;\n columns: IndexedColumn[];\n where: Expr | null;\n originalSql: string | null;\n store: IndexStore;\n}\n\nexport interface TriggerInfo {\n name: string;\n tableName: string;\n timing: \"BEFORE\" | \"AFTER\" | \"INSTEAD\";\n event: \"INSERT\" | \"UPDATE\" | \"DELETE\";\n when: Expr | null;\n forEachRow: boolean;\n /** Statements in the trigger body (already parsed). */\n body: import(\"../ast/nodes.ts\").Statement[];\n updateColumns: string[] | null;\n originalSql: string | null;\n}\n\n/** In-memory catalog: tables, indexes, views, triggers, and mutation counters. */\nexport class DatabaseState {\n tables = new Map<string, Table>();\n virtualTables = new Map<string, AnyVirtualTable>();\n views = new Map<string, ViewInfo>();\n indexes = new Map<string, IndexInfo>();\n triggers = new Map<string, TriggerInfo>();\n /** Attached databases: schema name \u2192 state + filename label. */\n attached = new Map<string, { state: DatabaseState; filename: string }>();\n lastInsertRowid: Rowid = 0;\n changes = 0;\n totalChanges = 0;\n foreignKeysEnabled = false;\n /** When true, LIKE / like() are case-sensitive (SQLite `PRAGMA case_sensitive_like`). */\n caseSensitiveLike = false;\n schemaVersion = 0;\n userVersion = 0;\n\n databaseForSchema(schema: string | null, qualifiedForError?: string): DatabaseState {\n if (schema === null || schema.toLowerCase() === \"main\" || schema.toLowerCase() === \"temp\") return this;\n const entry = this.attached.get(schema.toLowerCase());\n if (!entry) {\n throw new SqliteError(`no such table: ${qualifiedForError ?? schema}`, \"no_such_table\");\n }\n return entry.state;\n }\n\n databaseForTable(table: Table): DatabaseState {\n if (this.tables.get(keyOf(table.name)) === table) return this;\n for (const { state } of this.attached.values()) {\n if (state.tables.get(keyOf(table.name)) === table) return state;\n }\n return this;\n }\n\n getTable(name: string): Table {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).getTable(bare);\n }\n const key = keyOf(bare);\n if (this.virtualTables.has(key)) {\n throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n }\n const table = this.tables.get(key);\n if (!table) throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n return table;\n }\n\n getVirtualTable(name: string): Fts5VirtualTable {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).getVirtualTable(bare);\n }\n const key = keyOf(bare);\n const table = this.virtualTables.get(key);\n if (!table || (table.kind !== \"fts5\" && table.kind !== \"fts3\" && table.kind !== \"fts4\")) {\n throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n }\n return table;\n }\n\n getAnyVirtualTable(name: string): AnyVirtualTable {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).getAnyVirtualTable(bare);\n }\n const key = keyOf(bare);\n const table = this.virtualTables.get(key);\n if (!table) throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n return table;\n }\n\n isVirtualTable(name: string): boolean {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).isVirtualTable(bare);\n }\n return this.virtualTables.has(keyOf(bare));\n }\n\n isFtsTable(name: string): boolean {\n const table = this.virtualTables.get(keyOf(splitQualifiedName(name).bare));\n return !!table && (table.kind === \"fts5\" || table.kind === \"fts3\" || table.kind === \"fts4\");\n }\n\n createVirtualTable(stmt: CreateVirtualTableStmt, originalSql: string | null = null): AnyVirtualTable {\n const { schema, bare } = splitQualifiedName(stmt.name);\n // temp schema is the same DatabaseState (in-memory); not an ATTACH slot.\n if (schema !== null && schema.toLowerCase() !== \"temp\" && schema.toLowerCase() !== \"main\") {\n return this.databaseForSchema(schema, stmt.name).createVirtualTable({ ...stmt, name: bare }, originalSql);\n }\n const key = keyOf(bare);\n const existing = this.virtualTables.get(key);\n if (existing && stmt.ifNotExists) return existing;\n this.assertSchemaNameAvailable(bare);\n const module = stmt.module.toLowerCase();\n let table: AnyVirtualTable;\n if (module === \"fts5\" || module === \"fts3\" || module === \"fts4\") {\n table = new Fts5VirtualTable(bare, stmt.moduleArgs, originalSql, module);\n } else if (module === \"fts5vocab\") {\n table = new FtsVocabVirtualTable(bare, stmt.moduleArgs, originalSql);\n } else if (module === \"fts3tokenize\" || module === \"fts4aux\") {\n // Tokenize/aux modules: expose as empty FTS-like single-column tables for CREATE success.\n table = new Fts5VirtualTable(bare, stmt.moduleArgs.length ? stmt.moduleArgs : [\"token\"], originalSql, \"fts3\");\n } else if (module === \"rtree\" || module === \"rtree_i32\") {\n table = new RTreeVirtualTable(bare, stmt.moduleArgs, module === \"rtree_i32\", originalSql);\n } else if (module === \"dbstat\") {\n table = new DbStatVirtualTable(bare, stmt.moduleArgs[0] ?? null, originalSql);\n } else if (module === \"bytecode\") {\n table = new BytecodeVirtualTable(bare, originalSql);\n } else if (module === \"tables_used\") {\n table = new TablesUsedVirtualTable(bare, originalSql);\n } else {\n throw new SqliteError(`unknown module: ${stmt.module}`, \"unsupported\");\n }\n this.virtualTables.set(key, table);\n this.schemaVersion++;\n return table;\n }\n\n createTable(stmt: CreateTableStmt, originalSql: string | null = null): Table {\n const { schema, bare } = splitQualifiedName(stmt.name);\n if (schema !== null) {\n return this.databaseForSchema(schema, stmt.name).createTable({ ...stmt, name: bare }, originalSql);\n }\n const key = keyOf(bare);\n const existing = this.tables.get(key);\n if (existing && stmt.ifNotExists) return existing;\n this.assertSchemaNameAvailable(bare);\n\n const seenColumns = new Set<string>();\n const tablePrimaryNames = new Set(\n stmt.constraints\n .filter((constraint) => constraint.type === \"primary_key\")\n .flatMap((constraint) => constraint.columns.map((column) => keyOf(column.name))),\n );\n if (stmt.constraints.filter((constraint) => constraint.type === \"primary_key\").length > 1) {\n throw new SqliteError(\"table has more than one primary key\", \"constraint_primary\");\n }\n const columnPrimaryCount = stmt.columns.filter((column) =>\n column.constraints.some((constraint) => constraint.type === \"primary_key\"),\n ).length;\n if (columnPrimaryCount > 1) {\n throw new SqliteError(\"table has more than one primary key\", \"constraint_primary\");\n }\n\n const columns: ColumnInfo[] = stmt.columns.map((definition) => {\n const columnKey = keyOf(definition.name);\n if (seenColumns.has(columnKey)) throw new SqliteError(`duplicate column name: ${definition.name}`, \"other\");\n seenColumns.add(columnKey);\n\n const primary = definition.constraints.find((constraint) => constraint.type === \"primary_key\");\n const primaryKey = primary !== undefined || tablePrimaryNames.has(columnKey);\n const autoincrement = primary?.type === \"primary_key\" && primary.autoincrement;\n if (autoincrement && definition.typeName?.trim().toUpperCase() !== \"INTEGER\") {\n throw new SqliteError(\"AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY\", \"unsupported\");\n }\n const collateConstraint = definition.constraints.find((constraint) => constraint.type === \"collate\");\n const generatedConstraint = definition.constraints.find((constraint) => constraint.type === \"generated\");\n\n return {\n name: definition.name,\n typeName: definition.typeName,\n affinity: affinityFromTypeName(definition.typeName),\n notNull: definition.constraints.some((constraint) => constraint.type === \"not_null\"),\n primaryKey,\n autoincrement,\n defaultExpr: definition.constraints.find((constraint) => constraint.type === \"default\")?.expr ?? null,\n unique: definition.constraints.some((constraint) => constraint.type === \"unique\"),\n collate: collateConstraint?.type === \"collate\" ? collateConstraint.name : null,\n generated:\n generatedConstraint?.type === \"generated\"\n ? { expr: generatedConstraint.expr, stored: generatedConstraint.stored }\n : null,\n };\n });\n\n for (const constraint of stmt.constraints) {\n const localNames =\n constraint.type === \"primary_key\" || constraint.type === \"unique\"\n ? constraint.columns.map((column) => column.name)\n : constraint.type === \"foreign_key\"\n ? constraint.columns\n : [];\n for (const name of localNames) {\n if (!seenColumns.has(keyOf(name))) throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n }\n }\n const hasColumnPrimary = stmt.columns.some((column) =>\n column.constraints.some((constraint) => constraint.type === \"primary_key\"),\n );\n if (hasColumnPrimary && tablePrimaryNames.size > 0) {\n throw new SqliteError(\"table has more than one primary key\", \"constraint_primary\");\n }\n if (stmt.columns.length === 0) {\n throw new SqliteError(\"table must have at least one column\", \"syntax\");\n }\n if (stmt.strict) {\n for (const definition of stmt.columns) {\n const typeName = definition.typeName?.trim() ?? \"\";\n if (!isStrictTypeName(typeName)) unknownStrictType(bare, definition.name, typeName || \"null\");\n }\n }\n\n const normalizedConstraints = [...stmt.constraints];\n for (const definition of stmt.columns) {\n for (const constraint of definition.constraints) {\n if (constraint.type === \"check\") {\n normalizedConstraints.push({ type: \"check\", expr: constraint.expr, name: null });\n } else if (constraint.type === \"references\") {\n normalizedConstraints.push({\n type: \"foreign_key\",\n columns: [definition.name],\n refTable: constraint.table,\n refColumns: constraint.columns,\n onDelete: constraint.onDelete,\n onUpdate: constraint.onUpdate,\n match: constraint.match,\n name: null,\n deferrable: constraint.deferrable,\n initiallyDeferred: constraint.initiallyDeferred,\n });\n }\n }\n }\n const table = new Table(bare, columns, {\n constraints: normalizedConstraints,\n originalSql,\n withoutRowid: stmt.withoutRowid,\n strict: stmt.strict,\n });\n if (stmt.withoutRowid) {\n const pk = columns.filter((column) => column.primaryKey);\n if (pk.length === 0) {\n throw new SqliteError(\"PRIMARY KEY missing on table \" + bare, \"other\");\n }\n }\n this.tables.set(key, table);\n this.createAutoIndexesForTable(table);\n this.schemaVersion++;\n return table;\n }\n\n /**\n * SQLite-like autoindexes for PRIMARY KEY / UNIQUE so lookups and uniqueness\n * checks can use IndexStore. Skips single-column INTEGER PRIMARY KEY (rowid alias).\n */\n private createAutoIndexesForTable(table: Table): void {\n let seq = 1;\n const add = (columns: IndexedColumn[], unique: boolean): void => {\n if (columns.length === 0) return;\n // INTEGER PRIMARY KEY is the rowid map \u2014 no secondary autoindex.\n if (\n unique &&\n columns.length === 1 &&\n !table.withoutRowid &&\n table.integerPkColumn()?.name.toLowerCase() === columns[0]!.name.toLowerCase()\n ) {\n return;\n }\n const name = `sqlite_autoindex_${table.name}_${seq++}`;\n const index: IndexInfo = {\n name,\n tableName: table.name,\n unique,\n columns: structuredClone(columns),\n where: null,\n originalSql: null,\n store: new IndexStore(name),\n };\n this.indexes.set(keyOf(name), index);\n table.indexes.push(index.name);\n };\n\n const hasTablePrimary = table.constraints.some((constraint) => constraint.type === \"primary_key\");\n for (const column of table.columns) {\n if (column.unique) {\n add([{ name: column.name, collate: column.collate, order: null }], true);\n }\n if (column.primaryKey && !hasTablePrimary) {\n add([{ name: column.name, collate: column.collate, order: null }], true);\n }\n }\n for (const constraint of table.constraints) {\n if (constraint.type === \"primary_key\" || constraint.type === \"unique\") {\n add(constraint.columns, true);\n }\n }\n }\n\n dropTable(name: string, ifExists = false): boolean {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).dropTable(bare, ifExists);\n }\n const key = keyOf(bare);\n const table = this.tables.get(key);\n const virtual = this.virtualTables.get(key);\n if (!table && !virtual) {\n if (ifExists) return false;\n throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n }\n if (virtual) {\n this.virtualTables.delete(key);\n this.schemaVersion++;\n return true;\n }\n for (const [indexKey, index] of this.indexes) {\n if (keyOf(index.tableName) === key) this.indexes.delete(indexKey);\n }\n this.dropTriggersForTable(bare);\n this.tables.delete(key);\n this.schemaVersion++;\n return true;\n }\n\n renameTable(oldName: string, newName: string): Table {\n const { schema: oldSchema, bare: oldBare } = splitQualifiedName(oldName);\n if (oldSchema !== null) {\n return this.databaseForSchema(oldSchema, oldName).renameTable(oldBare, splitQualifiedName(newName).bare);\n }\n const oldKey = keyOf(oldBare);\n const table = this.getWritableTable(oldName);\n const { schema: newSchema, bare: newBare } = splitQualifiedName(newName);\n if (newSchema !== null) {\n throw new SqliteError(`no such table: ${newName}`, \"no_such_table\");\n }\n this.assertSchemaNameAvailable(newBare);\n this.tables.delete(oldKey);\n table.name = newBare;\n this.tables.set(keyOf(newBare), table);\n for (const index of [...this.indexes.values()]) {\n if (keyOf(index.tableName) !== oldKey) continue;\n this.ensureWritableIndex(index).tableName = newBare;\n }\n for (const [key, trigger] of this.triggers) {\n if (keyOf(trigger.tableName) !== oldKey) continue;\n this.triggers.set(key, { ...trigger, tableName: newBare });\n }\n this.schemaVersion++;\n return table;\n }\n\n createView(stmt: CreateViewStmt, originalSql: string | null = null): ViewInfo {\n const { schema, bare } = splitQualifiedName(stmt.name);\n if (schema !== null) {\n return this.databaseForSchema(schema, stmt.name).createView({ ...stmt, name: bare }, originalSql);\n }\n const key = keyOf(bare);\n const existing = this.views.get(key);\n if (existing && stmt.ifNotExists) return existing;\n this.assertSchemaNameAvailable(bare);\n const view: ViewInfo = {\n name: bare,\n columns: stmt.columns ? [...stmt.columns] : null,\n select: structuredClone(stmt.select),\n originalSql,\n };\n this.views.set(key, view);\n this.schemaVersion++;\n return view;\n }\n\n dropView(name: string, ifExists = false): boolean {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).dropView(bare, ifExists);\n }\n const deleted = this.views.delete(keyOf(bare));\n if (!deleted && !ifExists) throw new SqliteError(`no such view: ${name}`, \"other\");\n if (deleted) this.schemaVersion++;\n return deleted;\n }\n\n createIndex(stmt: CreateIndexStmt, originalSql: string | null = null): IndexInfo {\n const table = this.getWritableTable(stmt.table);\n const { schema, bare } = splitQualifiedName(stmt.name);\n const target = schema !== null ? this.databaseForSchema(schema, stmt.name) : this.databaseForTable(table);\n const key = keyOf(bare);\n const existing = target.indexes.get(key);\n if (existing && stmt.ifNotExists) return existing;\n target.assertSchemaNameAvailable(bare);\n for (const indexed of stmt.columns) {\n if (indexed.expr) continue;\n if (!table.columns.some((column) => keyOf(column.name) === keyOf(indexed.name))) {\n throw new SqliteError(`no such column: ${indexed.name}`, \"no_such_column\");\n }\n }\n const index: IndexInfo = {\n name: bare,\n tableName: table.name,\n unique: stmt.unique,\n columns: structuredClone(stmt.columns),\n where: stmt.where ? structuredClone(stmt.where) : null,\n originalSql,\n store: new IndexStore(bare),\n };\n target.indexes.set(key, index);\n table.indexes.push(index.name);\n target.schemaVersion++;\n return index;\n }\n\n dropIndex(name: string, ifExists = false): boolean {\n const { schema, bare } = splitQualifiedName(name);\n const target = schema !== null ? this.databaseForSchema(schema, name) : this;\n const key = keyOf(bare);\n const index = target.indexes.get(key);\n if (!index) {\n if (ifExists) return false;\n throw new SqliteError(`no such index: ${name}`, \"other\");\n }\n target.indexes.delete(key);\n const table = target.tables.get(keyOf(index.tableName));\n if (table) {\n const writable = target.ensureWritableTable(table);\n writable.indexes = writable.indexes.filter((item) => keyOf(item) !== key);\n }\n target.schemaVersion++;\n return true;\n }\n\n createTrigger(info: TriggerInfo): TriggerInfo {\n const { schema, bare } = splitQualifiedName(info.name);\n const target = schema !== null ? this.databaseForSchema(schema, info.name) : this;\n const key = keyOf(bare);\n target.assertSchemaNameAvailable(bare);\n const trigger: TriggerInfo = {\n ...info,\n name: bare,\n body: structuredClone(info.body),\n when: info.when ? structuredClone(info.when) : null,\n updateColumns: info.updateColumns ? [...info.updateColumns] : null,\n };\n target.triggers.set(key, trigger);\n target.schemaVersion++;\n return trigger;\n }\n\n dropTrigger(name: string, ifExists = false): boolean {\n const { schema, bare } = splitQualifiedName(name);\n const target = schema !== null ? this.databaseForSchema(schema, name) : this;\n const key = keyOf(bare);\n const deleted = target.triggers.delete(key);\n if (!deleted && !ifExists) throw new SqliteError(`no such trigger: ${name}`, \"other\");\n if (deleted) target.schemaVersion++;\n return deleted;\n }\n\n dropTriggersForTable(tableName: string): void {\n const key = keyOf(tableName);\n for (const [triggerKey, trigger] of this.triggers) {\n if (keyOf(trigger.tableName) === key) this.triggers.delete(triggerKey);\n }\n }\n\n recordChange(count: number, lastInsertRowid?: Rowid): void {\n this.changes = count;\n this.totalChanges += count;\n if (lastInsertRowid !== undefined) this.lastInsertRowid = lastInsertRowid;\n }\n\n clone(): DatabaseState {\n const copy = new DatabaseState();\n for (const [key, table] of this.tables) copy.tables.set(key, table.clone());\n for (const [key, table] of this.virtualTables) copy.virtualTables.set(key, table.clone());\n for (const [key, view] of this.views) {\n copy.views.set(key, {\n name: view.name,\n columns: view.columns ? [...view.columns] : null,\n select: structuredClone(view.select),\n originalSql: view.originalSql,\n });\n }\n for (const [key, index] of this.indexes) {\n copy.indexes.set(key, {\n name: index.name,\n tableName: index.tableName,\n unique: index.unique,\n columns: structuredClone(index.columns),\n where: index.where ? structuredClone(index.where) : null,\n originalSql: index.originalSql,\n store: index.store.clone(),\n });\n }\n for (const [key, trigger] of this.triggers) {\n copy.triggers.set(key, {\n name: trigger.name,\n tableName: trigger.tableName,\n timing: trigger.timing,\n event: trigger.event,\n when: trigger.when ? structuredClone(trigger.when) : null,\n forEachRow: trigger.forEachRow,\n body: structuredClone(trigger.body),\n updateColumns: trigger.updateColumns ? [...trigger.updateColumns] : null,\n originalSql: trigger.originalSql,\n });\n }\n for (const [name, attached] of this.attached) {\n copy.attached.set(name, { state: attached.state.clone(), filename: attached.filename });\n }\n copy.lastInsertRowid = this.lastInsertRowid;\n copy.changes = this.changes;\n copy.totalChanges = this.totalChanges;\n copy.foreignKeysEnabled = this.foreignKeysEnabled;\n copy.caseSensitiveLike = this.caseSensitiveLike;\n copy.schemaVersion = this.schemaVersion;\n copy.userVersion = this.userVersion;\n return copy;\n }\n\n /** Share table/index objects with the live state. Callers must freeze first. */\n cloneShallow(): DatabaseState {\n const copy = new DatabaseState();\n copy.tables = new Map(this.tables);\n for (const [key, table] of this.virtualTables) copy.virtualTables.set(key, table.clone());\n copy.views = new Map(this.views);\n copy.indexes = new Map(this.indexes);\n copy.triggers = new Map(this.triggers);\n for (const [name, attached] of this.attached) {\n copy.attached.set(name, { state: attached.state.cloneShallow(), filename: attached.filename });\n }\n copy.lastInsertRowid = this.lastInsertRowid;\n copy.changes = this.changes;\n copy.totalChanges = this.totalChanges;\n copy.foreignKeysEnabled = this.foreignKeysEnabled;\n copy.caseSensitiveLike = this.caseSensitiveLike;\n copy.schemaVersion = this.schemaVersion;\n copy.userVersion = this.userVersion;\n return copy;\n }\n\n freezeShared(): void {\n for (const table of this.tables.values()) table.freeze();\n for (const index of this.indexes.values()) index.store.freeze();\n for (const attached of this.attached.values()) attached.state.freezeShared();\n }\n\n thawShared(): void {\n for (const table of this.tables.values()) table.frozen = false;\n for (const index of this.indexes.values()) index.store.frozen = false;\n for (const attached of this.attached.values()) attached.state.thawShared();\n }\n\n getWritableTable(name: string): Table {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).getWritableTable(bare);\n }\n const table = this.getTable(bare);\n return this.ensureWritableTable(table);\n }\n\n ensureWritableTable(table: Table): Table {\n if (!table.frozen) return table;\n const key = keyOf(table.name);\n const copy = table.clone();\n this.tables.set(key, copy);\n return copy;\n }\n\n getWritableIndex(name: string): IndexInfo {\n const key = keyOf(name);\n const index = this.indexes.get(key);\n if (!index) throw new SqliteError(`no such index: ${name}`, \"other\");\n return this.ensureWritableIndex(index);\n }\n\n ensureWritableIndex(index: IndexInfo): IndexInfo {\n if (!index.store.frozen) return index;\n const copy: IndexInfo = {\n name: index.name,\n tableName: index.tableName,\n unique: index.unique,\n columns: structuredClone(index.columns),\n where: index.where ? structuredClone(index.where) : null,\n originalSql: index.originalSql,\n store: index.store.clone(),\n };\n this.indexes.set(keyOf(index.name), copy);\n return copy;\n }\n\n replaceWith(state: DatabaseState, options?: { adopt?: boolean }): void {\n const copy = options?.adopt ? state : state.clone();\n this.tables = copy.tables;\n this.virtualTables = copy.virtualTables;\n this.views = copy.views;\n this.indexes = copy.indexes;\n this.triggers = copy.triggers;\n this.attached = copy.attached;\n this.lastInsertRowid = copy.lastInsertRowid;\n this.changes = copy.changes;\n this.totalChanges = copy.totalChanges;\n this.foreignKeysEnabled = copy.foreignKeysEnabled;\n this.caseSensitiveLike = copy.caseSensitiveLike;\n this.schemaVersion = copy.schemaVersion;\n this.userVersion = copy.userVersion;\n }\n\n private assertSchemaNameAvailable(name: string): void {\n const key = keyOf(name);\n if (\n this.tables.has(key) ||\n this.views.has(key) ||\n this.indexes.has(key) ||\n this.virtualTables.has(key) ||\n this.triggers.has(key)\n ) {\n throw new SqliteError(`object already exists: ${name}`, \"other\");\n }\n }\n}\n\nexport function splitQualifiedName(name: string): { schema: string | null; bare: string } {\n const dot = name.indexOf(\".\");\n if (dot < 0) return { schema: null, bare: name };\n return { schema: name.slice(0, dot), bare: name.slice(dot + 1) };\n}\n\nfunction keyOf(name: string): string {\n return name.toLowerCase();\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { Prng } from \"../runtime/prng.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\n\ninterface SavepointSnapshot {\n name: string;\n state: DatabaseState;\n prngState: bigint;\n}\n\nexport class TransactionManager {\n readonly state: DatabaseState;\n readonly prng: Prng;\n private transactionSnapshot: DatabaseState | null = null;\n private transactionPrngState: bigint | null = null;\n private savepoints: SavepointSnapshot[] = [];\n private startedBySavepoint = false;\n\n constructor(state: DatabaseState, prng: Prng) {\n this.state = state;\n this.prng = prng;\n }\n\n get inTransaction(): boolean {\n return this.transactionSnapshot !== null;\n }\n\n begin(): void {\n if (this.inTransaction) {\n throw new SqliteError(\"cannot start a transaction within a transaction\", \"transaction\", \"SQLITE_ERROR\");\n }\n this.state.freezeShared();\n this.transactionSnapshot = this.state.cloneShallow();\n this.transactionPrngState = this.prng.getState();\n this.savepoints = [];\n this.startedBySavepoint = false;\n }\n\n commit(): void {\n this.requireTransaction(\"cannot commit - no transaction is active\");\n this.transactionSnapshot = null;\n this.transactionPrngState = null;\n this.savepoints = [];\n this.startedBySavepoint = false;\n this.state.thawShared();\n }\n\n rollback(savepoint?: string): void {\n this.requireTransaction(\"cannot rollback - no transaction is active\");\n // SQLite keeps total_changes / last_insert_rowid / changes across ROLLBACK\n // (and ROLLBACK TO); only row/schema state is restored.\n const preserved = {\n totalChanges: this.state.totalChanges,\n changes: this.state.changes,\n lastInsertRowid: this.state.lastInsertRowid,\n };\n if (savepoint !== undefined) {\n const index = this.findSavepoint(savepoint);\n const snapshot = this.savepoints[index];\n if (!snapshot) throw new SqliteError(`no such savepoint: ${savepoint}`, \"transaction\", \"SQLITE_ERROR\");\n // Clone \u2014 adopting would alias live state with the savepoint snapshot Map.\n this.state.replaceWith(snapshot.state);\n this.prng.setState(snapshot.prngState);\n this.state.totalChanges = preserved.totalChanges;\n this.state.changes = preserved.changes;\n this.state.lastInsertRowid = preserved.lastInsertRowid;\n this.savepoints.splice(index + 1);\n return;\n }\n\n const snapshot = this.transactionSnapshot;\n const prngState = this.transactionPrngState;\n if (!snapshot || prngState === null) {\n throw new SqliteError(\"cannot rollback - no transaction is active\", \"transaction\", \"SQLITE_ERROR\");\n }\n this.state.replaceWith(snapshot, { adopt: true });\n this.prng.setState(prngState);\n this.state.totalChanges = preserved.totalChanges;\n this.state.changes = preserved.changes;\n this.state.lastInsertRowid = preserved.lastInsertRowid;\n this.transactionSnapshot = null;\n this.transactionPrngState = null;\n this.savepoints = [];\n this.startedBySavepoint = false;\n this.state.thawShared();\n }\n\n savepoint(name: string): void {\n if (!this.inTransaction) {\n this.state.freezeShared();\n this.transactionSnapshot = this.state.cloneShallow();\n this.transactionPrngState = this.prng.getState();\n this.startedBySavepoint = true;\n } else {\n this.state.freezeShared();\n }\n this.savepoints.push({\n name,\n state: this.state.cloneShallow(),\n prngState: this.prng.getState(),\n });\n }\n\n release(name: string): void {\n this.requireTransaction(\"cannot release savepoint - no transaction is active\");\n const index = this.findSavepoint(name);\n this.savepoints.splice(index);\n if (this.startedBySavepoint && this.savepoints.length === 0) {\n this.transactionSnapshot = null;\n this.transactionPrngState = null;\n this.startedBySavepoint = false;\n this.state.thawShared();\n }\n }\n\n private findSavepoint(name: string): number {\n const normalized = name.toLowerCase();\n for (let index = this.savepoints.length - 1; index >= 0; index--) {\n const savepoint = this.savepoints[index];\n if (savepoint && savepoint.name.toLowerCase() === normalized) return index;\n }\n throw new SqliteError(`no such savepoint: ${name}`, \"transaction\", \"SQLITE_ERROR\");\n }\n\n private requireTransaction(message: string): void {\n if (!this.inTransaction) throw new SqliteError(message, \"transaction\", \"SQLITE_ERROR\");\n }\n}\n", "import { asSqlReal, SqlJsonText, SqlReal, type SqlValue, utf8Decode } from \"../types/value.ts\";\nimport type { Rowid } from \"./row.ts\";\n\n/** Column pack tags (SQLM v5). */\nexport const PACK_NULL = 0;\nexport const PACK_I32 = 1;\nexport const PACK_I64 = 2;\nexport const PACK_F64 = 3;\nexport const PACK_TEXT_INTERN = 4;\nexport const PACK_TEXT_INLINE = 5;\nexport const PACK_BLOB = 6;\nexport const PACK_TAGGED = 7;\n\nexport interface SlabColumn {\n pack: number;\n nullBitmap: Uint8Array | null;\n /** Typed payload or inline blob region inside `buffer`. */\n payload: Uint8Array;\n /** Cached view over `payload` (avoid per-cell DataView alloc). */\n view?: DataView;\n /** Prefix count of non-null cells before each row (when nulls exist). */\n nonNullRank?: Uint32Array;\n /** For PACK_TEXT_INLINE: u32 offsets into payload per row. */\n inlineOffsets?: Uint32Array;\n /** For PACK_TAGGED: decoded values per non-null row in order. */\n tagged?: SqlValue[];\n /** For PACK_BLOB: one entry per non-null row. */\n blobChunks?: Uint8Array[];\n}\n\n/** Attach decode helpers; drop an all-zero null bitmap. */\nexport function prepareSlabColumn(column: SlabColumn, rowCount: number, nonNull: number): SlabColumn {\n if (column.payload.length > 0) {\n column.view = new DataView(column.payload.buffer, column.payload.byteOffset, column.payload.byteLength);\n }\n if (!column.nullBitmap || nonNull === rowCount) {\n column.nullBitmap = null;\n column.nonNullRank = undefined;\n return column;\n }\n column.nonNullRank = buildNonNullRank(column.nullBitmap, rowCount);\n return column;\n}\n\nfunction buildNonNullRank(bits: Uint8Array, n: number): Uint32Array {\n const rank = new Uint32Array(n);\n let k = 0;\n for (let i = 0; i < n; i++) {\n rank[i] = k;\n if ((bits[i >> 3]! & (1 << (i & 7))) === 0) k++;\n }\n return rank;\n}\n\n/** Frozen columnar row storage; zero-copy views into snapshot buffer. */\nexport class ColumnarSlab {\n readonly buffer: Uint8Array;\n readonly rowCount: number;\n readonly rowids: Rowid[];\n readonly columns: SlabColumn[];\n private readonly intern: readonly string[];\n private rowidIndex: Map<Rowid, number> | null = null;\n\n constructor(buffer: Uint8Array, rowCount: number, rowids: Rowid[], columns: SlabColumn[], intern: readonly string[]) {\n this.buffer = buffer;\n this.rowCount = rowCount;\n this.rowids = rowids;\n this.columns = columns;\n this.intern = intern;\n }\n\n private rowIndex(rowid: Rowid): number {\n this.rowidIndex ??= new Map(this.rowids.map((id, i) => [canonicalRowid(id), i]));\n const hit = this.rowidIndex.get(canonicalRowid(rowid));\n if (hit === undefined) return -1;\n return hit;\n }\n\n cell(rowIndex: number, col: number): SqlValue {\n if (rowIndex < 0 || rowIndex >= this.rowCount) return null;\n const column = this.columns[col];\n if (!column) return null;\n if (column.nullBitmap && isNull(column.nullBitmap, rowIndex)) return null;\n return readSlabCell(column, rowIndex, this.intern);\n }\n\n rowAt(rowIndex: number): { rowid: Rowid; values: SqlValue[] } {\n const values: SqlValue[] = new Array(this.columns.length);\n for (let c = 0; c < this.columns.length; c++) values[c] = this.cell(rowIndex, c);\n return { rowid: this.rowids[rowIndex]!, values };\n }\n\n get(rowid: Rowid): { rowid: Rowid; values: SqlValue[] } | undefined {\n const i = this.rowIndex(rowid);\n if (i < 0) return undefined;\n return this.rowAt(i);\n }\n\n *scan(): Generator<{ rowid: Rowid; values: SqlValue[] }> {\n for (let i = 0; i < this.rowCount; i++) yield this.rowAt(i);\n }\n\n materialize(): Map<Rowid, { rowid: Rowid; values: SqlValue[] }> {\n const map = new Map<Rowid, { rowid: Rowid; values: SqlValue[] }>();\n for (let i = 0; i < this.rowCount; i++) {\n const row = this.rowAt(i);\n map.set(row.rowid, row);\n }\n return map;\n }\n}\n\nfunction canonicalRowid(rowid: Rowid): Rowid {\n return typeof rowid === \"bigint\" ? rowid : rowid;\n}\n\nfunction isNull(bits: Uint8Array, i: number): boolean {\n return (bits[i >> 3]! & (1 << (i & 7))) !== 0;\n}\n\nfunction nonNullRowIndex(column: SlabColumn, rowIndex: number): number {\n if (!column.nullBitmap) return rowIndex;\n return column.nonNullRank?.[rowIndex] ?? rowIndex;\n}\n\nfunction readSlabCell(column: SlabColumn, rowIndex: number, intern: readonly string[]): SqlValue {\n const pack = column.pack;\n if (pack === PACK_NULL) return null;\n const nonNullIndex = nonNullRowIndex(column, rowIndex);\n const view = column.view;\n\n if (pack === PACK_I32) {\n return view!.getInt32(nonNullIndex * 4, true);\n }\n if (pack === PACK_I64) {\n const integer = view!.getBigInt64(nonNullIndex * 8, true);\n return integer <= BigInt(Number.MAX_SAFE_INTEGER) && integer >= BigInt(Number.MIN_SAFE_INTEGER)\n ? Number(integer)\n : integer;\n }\n if (pack === PACK_F64) {\n const value = view!.getFloat64(nonNullIndex * 8, true);\n return Number.isInteger(value) && Number.isFinite(value) ? asSqlReal(value) : value;\n }\n if (pack === PACK_TEXT_INTERN) {\n const id = view!.getUint32(nonNullIndex * 4, true);\n return intern[id] ?? \"\";\n }\n if (pack === PACK_TEXT_INLINE) {\n const offsets = column.inlineOffsets!;\n const start = offsets[nonNullIndex]!;\n const end = nonNullIndex + 1 < offsets.length ? offsets[nonNullIndex + 1]! : column.payload.length;\n return utf8Decode(column.payload.subarray(start, end));\n }\n if (pack === PACK_BLOB) {\n const blob = column.blobChunks![nonNullIndex]!;\n return blob;\n }\n if (pack === PACK_TAGGED) {\n return column.tagged![nonNullIndex] ?? null;\n }\n return null;\n}\n\nexport function packKindOf(value: SqlValue): number {\n if (value instanceof SqlReal) return PACK_F64;\n if (typeof value === \"bigint\") return PACK_I64;\n if (typeof value === \"number\" && Number.isInteger(value)) {\n return value >= -0x80000000 && value <= 0x7fffffff ? PACK_I32 : PACK_I64;\n }\n if (typeof value === \"number\") return PACK_F64;\n if (value instanceof SqlJsonText) return PACK_TAGGED;\n if (typeof value === \"string\") return PACK_TEXT_INTERN;\n if (value instanceof Uint8Array) return PACK_BLOB;\n return PACK_TAGGED;\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { utf8Decode, utf8Encode } from \"../types/value.ts\";\n\n// --- varint -------------------------------------------------------------------\n\nexport function writeVarintU32(w: Writer, value: number): void {\n let v = value >>> 0;\n while (v >= 0x80) {\n w.u8((v & 0x7f) | 0x80);\n v >>>= 7;\n }\n w.u8(v);\n}\n\nexport function readVarintU32(r: Reader): number {\n let result = 0;\n let shift = 0;\n for (;;) {\n const byte = r.u8();\n result |= (byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) return result >>> 0;\n shift += 7;\n if (shift > 28) r.fail();\n }\n}\n\n// --- Writer -------------------------------------------------------------------\n\nexport class Writer {\n private buf: Uint8Array;\n private view: DataView;\n private len = 0;\n\n constructor(capacity = 4096) {\n this.buf = new Uint8Array(capacity);\n this.view = new DataView(this.buf.buffer);\n }\n\n get position(): number {\n return this.len;\n }\n\n reserve(capacity: number): void {\n if (capacity <= this.buf.length) return;\n const next = new Uint8Array(capacity);\n next.set(this.buf.subarray(0, this.len));\n this.buf = next;\n this.view = new DataView(next.buffer);\n }\n\n private ensure(needed: number): void {\n if (this.len + needed <= this.buf.length) return;\n let cap = this.buf.length;\n while (cap < this.len + needed) cap *= 2;\n this.reserve(cap);\n }\n\n align4(): void {\n const pad = (4 - (this.len & 3)) & 3;\n for (let i = 0; i < pad; i++) this.u8(0);\n }\n\n u8(value: number): void {\n this.ensure(1);\n this.buf[this.len++] = value & 0xff;\n }\n\n u32(value: number): void {\n this.ensure(4);\n this.view.setUint32(this.len, value >>> 0, true);\n this.len += 4;\n }\n\n u64(value: bigint): void {\n this.ensure(8);\n this.view.setBigUint64(this.len, BigInt.asUintN(64, value), true);\n this.len += 8;\n }\n\n i64(value: bigint): void {\n this.ensure(8);\n this.view.setBigInt64(this.len, value, true);\n this.len += 8;\n }\n\n f64(value: number): void {\n this.ensure(8);\n this.view.setFloat64(this.len, value, true);\n this.len += 8;\n }\n\n raw(value: Uint8Array): void {\n this.ensure(value.length);\n this.buf.set(value, this.len);\n this.len += value.length;\n }\n\n rawAt(offset: number, value: Uint8Array): void {\n if (offset + value.length > this.len) this.fail();\n this.buf.set(value, offset);\n }\n\n /** Length-prefixed UTF-8 via encodeInto when possible. */\n text(value: string): void {\n const encoded = utf8Encode(value);\n writeVarintU32(this, encoded.length);\n this.raw(encoded);\n }\n\n /** Write UTF-8 at current position without length prefix (intern blob region). */\n textBytes(value: string): void {\n const encoded = utf8Encode(value);\n this.raw(encoded);\n }\n\n finish(): Uint8Array {\n if (this.len === this.buf.length) return this.buf;\n return this.buf.subarray(0, this.len).slice();\n }\n\n fail(): never {\n throw new SqliteError(\"invalid or truncated sqlite-mem snapshot\", \"other\");\n }\n}\n\n// --- Reader -------------------------------------------------------------------\n\nexport class Reader {\n private offset = 0;\n private readonly view: DataView;\n\n constructor(private readonly bytes: Uint8Array) {\n this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n }\n\n get position(): number {\n return this.offset;\n }\n\n skipAlign4(): void {\n const pad = (4 - (this.offset & 3)) & 3;\n this.offset += pad;\n }\n\n u8(): number {\n if (this.offset >= this.bytes.length) this.fail();\n return this.bytes[this.offset++]!;\n }\n\n u32(): number {\n if (this.offset + 4 > this.bytes.length) this.fail();\n const value = this.view.getUint32(this.offset, true);\n this.offset += 4;\n return value;\n }\n\n u64(): bigint {\n if (this.offset + 8 > this.bytes.length) this.fail();\n const value = this.view.getBigUint64(this.offset, true);\n this.offset += 8;\n return value;\n }\n\n i64(): bigint {\n if (this.offset + 8 > this.bytes.length) this.fail();\n const value = this.view.getBigInt64(this.offset, true);\n this.offset += 8;\n return value;\n }\n\n f64(): number {\n if (this.offset + 8 > this.bytes.length) this.fail();\n const value = this.view.getFloat64(this.offset, true);\n this.offset += 8;\n return value;\n }\n\n raw(length: number): Uint8Array {\n if (length < 0 || this.offset + length > this.bytes.length) this.fail();\n const value = this.bytes.subarray(this.offset, this.offset + length);\n this.offset += length;\n return value;\n }\n\n text(): string {\n const length = readVarintU32(this);\n return utf8Decode(this.raw(length));\n }\n\n remaining(): number {\n return this.bytes.length - this.offset;\n }\n\n done(): boolean {\n return this.offset === this.bytes.length;\n }\n\n fail(): never {\n throw new SqliteError(\"invalid or truncated sqlite-mem snapshot\", \"other\");\n }\n}\n\n// --- binary JSON (BJV) ------------------------------------------------------\n\nconst BJV_NULL = 0;\nconst BJV_FALSE = 1;\nconst BJV_TRUE = 2;\nconst BJV_I32 = 3;\nconst BJV_I64 = 4;\nconst BJV_F64 = 5;\nconst BJV_INTERN = 6;\nconst BJV_STRING = 7;\nconst BJV_BYTES = 8;\nconst BJV_ARRAY = 9;\nconst BJV_OBJECT = 10;\n\nexport function writeBjv(w: Writer, value: unknown, forceIntern: (s: string) => number): void {\n if (value === null || value === undefined) {\n w.u8(BJV_NULL);\n return;\n }\n if (typeof value === \"boolean\") {\n w.u8(value ? BJV_TRUE : BJV_FALSE);\n return;\n }\n if (typeof value === \"number\") {\n if (Number.isInteger(value) && value >= -0x80000000 && value <= 0x7fffffff) {\n w.u8(BJV_I32);\n w.u32(value | 0);\n return;\n }\n w.u8(BJV_F64);\n w.f64(value);\n return;\n }\n if (typeof value === \"bigint\") {\n w.u8(BJV_I64);\n w.i64(value);\n return;\n }\n if (typeof value === \"string\") {\n w.u8(BJV_INTERN);\n writeVarintU32(w, forceIntern(value));\n return;\n }\n if (value instanceof Uint8Array) {\n w.u8(BJV_BYTES);\n writeVarintU32(w, value.length);\n w.raw(value);\n return;\n }\n if (Array.isArray(value)) {\n w.u8(BJV_ARRAY);\n writeVarintU32(w, value.length);\n for (const item of value) writeBjv(w, item, forceIntern);\n return;\n }\n if (typeof value === \"object\") {\n const entries = Object.entries(value as Record<string, unknown>);\n w.u8(BJV_OBJECT);\n writeVarintU32(w, entries.length);\n for (const [k, v] of entries) {\n w.u8(BJV_INTERN);\n writeVarintU32(w, forceIntern(k));\n writeBjv(w, v, forceIntern);\n }\n return;\n }\n w.u8(BJV_NULL);\n}\n\nexport function readBjv(r: Reader, intern: readonly string[]): unknown {\n const tag = r.u8();\n switch (tag) {\n case BJV_NULL:\n return null;\n case BJV_FALSE:\n return false;\n case BJV_TRUE:\n return true;\n case BJV_I32:\n return r.u32() | 0;\n case BJV_I64:\n return r.i64();\n case BJV_F64:\n return r.f64();\n case BJV_INTERN:\n return intern[readVarintU32(r)] ?? \"\";\n case BJV_STRING:\n return r.text();\n case BJV_BYTES:\n return r.raw(readVarintU32(r)).slice();\n case BJV_ARRAY: {\n const count = readVarintU32(r);\n const out: unknown[] = new Array(count);\n for (let i = 0; i < count; i++) out[i] = readBjv(r, intern);\n return out;\n }\n case BJV_OBJECT: {\n const count = readVarintU32(r);\n const out: Record<string, unknown> = {};\n for (let i = 0; i < count; i++) {\n const key = readBjv(r, intern) as string;\n out[key] = readBjv(r, intern);\n }\n return out;\n }\n default:\n return r.fail();\n }\n}\n\n// --- adaptive intern ----------------------------------------------------------\n\nexport class InternPool {\n private readonly counts = new Map<string, number>();\n private readonly ids = new Map<string, number>();\n readonly list: string[] = [];\n\n constructor() {\n this.list.push(\"\");\n this.ids.set(\"\", 0);\n }\n\n count(s: string): void {\n this.counts.set(s, (this.counts.get(s) ?? 0) + 1);\n }\n\n /** Assign ids only to strings seen \u22652 times (plus empty string). */\n finalize(): void {\n for (const [s, c] of this.counts) {\n if (c >= 2 && !this.ids.has(s)) {\n const id = this.list.length;\n this.ids.set(s, id);\n this.list.push(s);\n }\n }\n }\n\n /** Always intern (schema / catalog strings). */\n forceId(s: string): number {\n const hit = this.ids.get(s);\n if (hit !== undefined) return hit;\n const id = this.list.length;\n this.ids.set(s, id);\n this.list.push(s);\n return id;\n }\n\n id(s: string): number {\n const hit = this.ids.get(s);\n if (hit !== undefined) return hit;\n return -1;\n }\n\n has(s: string): boolean {\n return this.ids.has(s);\n }\n}\n\n/** Write intern table: count, offsets[], concatenated UTF-8 blob. */\nexport function writeInternTable(w: Writer, strings: readonly string[]): void {\n writeVarintU32(w, strings.length);\n if (strings.length === 0) return;\n const offsets: number[] = [];\n let total = 0;\n for (const s of strings) {\n offsets.push(total);\n total += utf8Encode(s).length;\n }\n writeVarintU32(w, total);\n const base = w.position + offsets.length * 4;\n for (const off of offsets) w.u32(base + off);\n for (const s of strings) w.textBytes(s);\n}\n\nexport function readInternTable(r: Reader): string[] {\n const count = readVarintU32(r);\n if (count === 0) return [];\n const total = readVarintU32(r);\n const offsets: number[] = [];\n for (let i = 0; i < count; i++) offsets.push(r.u32());\n const blobStart = r.position;\n const blob = r.raw(total);\n const intern: string[] = new Array(count);\n for (let i = 0; i < count; i++) {\n const start = offsets[i]! - blobStart;\n const end = i + 1 < count ? offsets[i + 1]! - blobStart : total;\n intern[i] = utf8Decode(blob.subarray(start, end));\n }\n return intern;\n}\n", "import type { Expr, TableConstraint } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { IndexStore, serializeIndexEntry } from \"../indexes/index.ts\";\nimport {\n ColumnarSlab,\n PACK_BLOB,\n PACK_F64,\n PACK_I32,\n PACK_I64,\n PACK_NULL,\n PACK_TAGGED,\n PACK_TEXT_INLINE,\n PACK_TEXT_INTERN,\n packKindOf,\n prepareSlabColumn,\n type SlabColumn,\n} from \"../storage/columnar-slab.ts\";\nimport { DatabaseState, type IndexInfo, type ViewInfo } from \"../storage/database-state.ts\";\nimport type { Row, Rowid } from \"../storage/row.ts\";\nimport { type ColumnInfo, Table } from \"../storage/table.ts\";\nimport { asSqlReal, SqlJsonText, SqlReal, type SqlValue, utf8Encode } from \"../types/value.ts\";\nimport {\n InternPool,\n Reader,\n readBjv,\n readInternTable,\n readVarintU32,\n Writer,\n writeBjv,\n writeInternTable,\n writeVarintU32,\n} from \"./wire.ts\";\n\nconst MAGIC = utf8Encode(\"SQLM\");\n/** SQLM v5: adaptive intern, BJV schema, columnar slab hydrate, binary index keys. */\nconst VERSION = 5;\n\n/** PRNG + clock captured alongside schema/rows. */\nexport interface SnapshotRuntime {\n prngState: bigint;\n nowMs: number;\n}\n\n/** Result of {@link decodeDatabaseState}. */\nexport interface DecodedSnapshot {\n state: DatabaseState;\n runtime: SnapshotRuntime;\n}\n\nconst AFFINITIES: Array<import(\"../types/value.ts\").Affinity> = [\"TEXT\", \"NUMERIC\", \"INTEGER\", \"REAL\", \"BLOB\"];\n\n/**\n * Encode catalog, rows, and runtime into a sqlite-mem snapshot blob (not a `.sqlite` file).\n */\nexport function encodeDatabaseState(state: DatabaseState, runtime: SnapshotRuntime): Uint8Array {\n const pool = new InternPool();\n const tables = sortedValues(state.tables);\n const views = sortedValues(state.views);\n const indexes = sortedValues(state.indexes);\n const tableRows: Row[][] = [];\n\n for (const table of tables) {\n pool.count(table.name);\n pool.count(table.originalSql ?? \"\");\n for (const column of table.columns) {\n pool.count(column.name);\n pool.count(column.typeName ?? \"\");\n pool.count(column.collate ?? \"\");\n }\n for (const name of table.indexes) pool.count(name);\n const rows = table.sortedRows();\n tableRows.push(rows);\n for (const row of rows) {\n for (const value of row.values) {\n if (typeof value === \"string\") pool.count(value);\n else if (value instanceof SqlJsonText) pool.count(value.value);\n }\n }\n }\n for (const view of views) pool.count(JSON.stringify(view));\n for (const index of indexes) pool.count(index.name);\n pool.finalize();\n forceSchemaIntern(pool, tables, views, indexes);\n\n const internId = (s: string): number => pool.id(s);\n const forceId = (s: string): number => pool.forceId(s);\n\n const w = new Writer(64 * 1024);\n w.raw(MAGIC);\n w.u32(VERSION);\n w.u8(state.foreignKeysEnabled ? 1 : 0);\n w.u32(state.schemaVersion);\n w.u32(state.changes);\n w.u32(state.totalChanges);\n writeTaggedValue(w, state.lastInsertRowid, internId);\n writeInternTable(w, pool.list);\n\n writeVarintU32(w, tables.length);\n for (let t = 0; t < tables.length; t++) {\n const table = tables[t]!;\n writeVarintU32(w, forceId(table.name));\n writeVarintU32(w, table.columns.length);\n for (const column of table.columns) {\n writeVarintU32(w, forceId(column.name));\n writeVarintU32(w, forceId(column.typeName ?? \"\"));\n const aff = AFFINITIES.indexOf(column.affinity);\n w.u8(aff < 0 ? 2 : aff);\n w.u8(\n (column.notNull ? 1 : 0) |\n (column.primaryKey ? 2 : 0) |\n (column.autoincrement ? 4 : 0) |\n (column.unique ? 8 : 0),\n );\n writeVarintU32(w, forceId(column.collate ?? \"\"));\n if (column.defaultExpr) {\n w.u8(1);\n writeBjv(w, column.defaultExpr, forceId);\n } else w.u8(0);\n if (column.generated) {\n w.u8(1);\n writeBjv(w, column.generated, forceId);\n } else w.u8(0);\n }\n writeBjv(w, table.constraints, forceId);\n writeVarintU32(w, forceId(table.originalSql ?? \"\"));\n w.u8((table.withoutRowid ? 1 : 0) | (table.strict ? 2 : 0));\n const indexNames = [...table.indexes].sort(compareNames);\n writeVarintU32(w, indexNames.length);\n for (const name of indexNames) writeVarintU32(w, forceId(name));\n writeTaggedValue(w, table.nextRowid, internId);\n const rows = tableRows[t]!;\n writeVarintU32(w, rows.length);\n for (const row of rows) writeTaggedValue(w, row.rowid, internId);\n for (let c = 0; c < table.columns.length; c++) writePackedColumn(w, rows, c, internId);\n }\n\n writeVarintU32(w, views.length);\n for (const view of views) writeBjv(w, view, forceId);\n\n writeVarintU32(w, indexes.length);\n for (const index of indexes) {\n writeBjv(\n w,\n {\n name: index.name,\n tableName: index.tableName,\n unique: index.unique,\n columns: index.columns,\n where: index.where,\n originalSql: index.originalSql,\n },\n forceId,\n );\n }\n for (const index of indexes) writeIndexStoreBinary(w, index.store, internId);\n\n w.u64(runtime.prngState);\n w.i64(BigInt(Math.trunc(runtime.nowMs)));\n return w.finish();\n}\n\n/**\n * Decode a blob from {@link encodeDatabaseState} / {@link Database.snapshot}.\n */\nexport function decodeDatabaseState(snapshot: Uint8Array): DecodedSnapshot {\n try {\n return decodeInner(snapshot);\n } catch (error) {\n if (error instanceof SqliteError) throw error;\n throw new SqliteError(\"invalid or truncated sqlite-mem snapshot\", \"other\");\n }\n}\n\nfunction decodeInner(snapshot: Uint8Array): DecodedSnapshot {\n const r = new Reader(snapshot);\n const magic = r.raw(4);\n if (!magic.every((byte, index) => byte === MAGIC[index]))\n throw new SqliteError(\"invalid sqlite-mem snapshot magic\", \"other\");\n const version = r.u32();\n if (version !== VERSION) {\n throw new SqliteError(`unsupported sqlite-mem snapshot version: ${version}`, \"snapshot_version\", \"SQLITE_FORMAT\");\n }\n\n const state = new DatabaseState();\n state.foreignKeysEnabled = r.u8() !== 0;\n state.schemaVersion = r.u32();\n state.changes = r.u32();\n state.totalChanges = r.u32();\n state.lastInsertRowid = asRowid(readTaggedValue(r, []));\n const intern = readInternTable(r);\n const str = (id: number): string => intern[id] ?? \"\";\n\n const tableCount = readVarintU32(r);\n for (let t = 0; t < tableCount; t++) {\n const name = str(readVarintU32(r));\n const colCount = readVarintU32(r);\n const columns: ColumnInfo[] = [];\n for (let c = 0; c < colCount; c++) {\n const colName = str(readVarintU32(r));\n const typeName = str(readVarintU32(r)) || null;\n const affIndex = r.u8();\n const flags = r.u8();\n const collate = str(readVarintU32(r)) || null;\n const hasDefault = r.u8() === 1;\n const defaultExpr = hasDefault ? (readBjv(r, intern) as Expr) : null;\n const hasGenerated = r.u8() === 1;\n const generated = hasGenerated ? (readBjv(r, intern) as ColumnInfo[\"generated\"]) : null;\n columns.push({\n name: colName,\n nameLower: colName.toLowerCase(),\n typeName,\n affinity: AFFINITIES[affIndex] ?? \"NUMERIC\",\n notNull: (flags & 1) !== 0,\n primaryKey: (flags & 2) !== 0,\n autoincrement: (flags & 4) !== 0,\n unique: (flags & 8) !== 0,\n defaultExpr,\n collate,\n generated,\n });\n }\n const constraints = readBjv(r, intern) as TableConstraint[];\n const originalSql = str(readVarintU32(r)) || null;\n const tableFlags = r.u8();\n const indexNameCount = readVarintU32(r);\n const indexNames: string[] = [];\n for (let i = 0; i < indexNameCount; i++) indexNames.push(str(readVarintU32(r)));\n const table = new Table(name, columns, {\n constraints,\n indexes: indexNames,\n originalSql,\n withoutRowid: (tableFlags & 1) !== 0,\n strict: (tableFlags & 2) !== 0,\n });\n table.nextRowid = asRowid(readTaggedValue(r, intern));\n const rowCount = readVarintU32(r);\n const rowids: Rowid[] = [];\n for (let ri = 0; ri < rowCount; ri++) rowids.push(asRowid(readTaggedValue(r, intern)));\n const slabColumns: SlabColumn[] = [];\n for (let c = 0; c < colCount; c++) slabColumns.push(readPackedColumn(r, rowCount, intern));\n table.attachSlab(new ColumnarSlab(snapshot, rowCount, rowids, slabColumns, intern));\n if (table.withoutRowid) table.rebuildClusteredRows();\n state.tables.set(table.name.toLowerCase(), table);\n }\n\n const viewCount = readVarintU32(r);\n for (let i = 0; i < viewCount; i++) {\n const view = readBjv(r, intern) as ViewInfo;\n state.views.set(view.name.toLowerCase(), view);\n }\n\n const indexCount = readVarintU32(r);\n const loadedIndexes: IndexInfo[] = [];\n for (let i = 0; i < indexCount; i++) {\n const meta = readBjv(r, intern) as Omit<IndexInfo, \"store\">;\n const info: IndexInfo = { ...meta, store: new IndexStore(meta.name) };\n state.indexes.set(info.name.toLowerCase(), info);\n loadedIndexes.push(info);\n }\n for (const info of loadedIndexes) {\n info.store = readIndexStoreBinary(r, info.name, intern);\n }\n\n if (r.remaining() < 16) throw new SqliteError(\"invalid or truncated sqlite-mem snapshot\", \"other\");\n const runtime: SnapshotRuntime = { prngState: r.u64(), nowMs: finiteNowMs(Number(r.i64())) };\n if (!r.done()) throw new SqliteError(\"snapshot has trailing data\", \"other\");\n return { state, runtime };\n}\n\n// --- tagged SqlValue (rowid / tagged cells) -----------------------------------\n\nfunction writeTaggedValue(w: Writer, value: SqlValue, internId: (s: string) => number): void {\n if (value === null) {\n w.u8(0);\n return;\n }\n if (value instanceof SqlReal) {\n w.u8(2);\n w.f64(value.value);\n return;\n }\n if (typeof value === \"bigint\" || (typeof value === \"number\" && Number.isInteger(value))) {\n w.u8(1);\n w.i64(BigInt(value));\n return;\n }\n if (typeof value === \"number\") {\n w.u8(2);\n w.f64(value);\n return;\n }\n if (typeof value === \"string\") {\n const id = internId(value);\n if (id >= 0) {\n w.u8(3);\n writeVarintU32(w, id);\n return;\n }\n w.u8(4);\n w.text(value);\n return;\n }\n if (value instanceof SqlJsonText) {\n w.u8(4);\n w.text(value.value);\n return;\n }\n w.u8(5);\n writeVarintU32(w, value.length);\n w.raw(value);\n}\n\nfunction readTaggedValue(r: Reader, intern: readonly string[]): SqlValue {\n const tag = r.u8();\n if (tag === 0) return null;\n if (tag === 1) {\n const integer = r.i64();\n return integer <= BigInt(Number.MAX_SAFE_INTEGER) && integer >= BigInt(Number.MIN_SAFE_INTEGER)\n ? Number(integer)\n : integer;\n }\n if (tag === 2) {\n const value = r.f64();\n return Number.isInteger(value) && Number.isFinite(value) ? asSqlReal(value) : value;\n }\n if (tag === 3) return intern[readVarintU32(r)] ?? \"\";\n if (tag === 4) return r.text();\n return r.raw(readVarintU32(r));\n}\n\n// --- packed columns -----------------------------------------------------------\n\nfunction writePackedColumn(w: Writer, rows: Row[], col: number, internId: (s: string) => number): void {\n const n = rows.length;\n if (n === 0) {\n w.u8(PACK_NULL);\n return;\n }\n const bits = new Uint8Array((n + 7) >> 3);\n let nulls = 0;\n let kind: number | null = null;\n let useInlineText = false;\n for (let i = 0; i < n; i++) {\n const value = rows[i]!.values[col] ?? null;\n if (value === null) {\n bits[i >> 3] = (bits[i >> 3]! | (1 << (i & 7))) as number;\n nulls++;\n continue;\n }\n const cellKind = packKindOf(value);\n if (kind === null) kind = cellKind;\n else if (kind !== cellKind) kind = PACK_TAGGED;\n if (cellKind === PACK_TEXT_INTERN && typeof value === \"string\" && internId(value) < 0) useInlineText = true;\n if (value instanceof SqlJsonText) kind = PACK_TAGGED;\n }\n if (nulls === n) {\n w.u8(PACK_NULL);\n return;\n }\n let pack = kind ?? PACK_TAGGED;\n if (pack === PACK_TEXT_INTERN && useInlineText) pack = PACK_TEXT_INLINE;\n w.u8(pack);\n w.raw(bits);\n if (pack === PACK_I32) {\n w.align4();\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n w.u32(rows[i]!.values[col] as number);\n }\n return;\n }\n if (pack === PACK_I64) {\n w.align4();\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n const v = rows[i]!.values[col]!;\n w.i64(typeof v === \"bigint\" ? v : BigInt(v as number));\n }\n return;\n }\n if (pack === PACK_F64) {\n w.align4();\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n const v = rows[i]!.values[col]!;\n w.f64(v instanceof SqlReal ? v.value : (v as number));\n }\n return;\n }\n if (pack === PACK_TEXT_INTERN) {\n w.align4();\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n const text = rows[i]!.values[col] as string;\n w.u32(internId(text));\n }\n return;\n }\n if (pack === PACK_TEXT_INLINE) {\n const offsets: number[] = [];\n let blobLen = 0;\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n offsets.push(blobLen);\n const text =\n rows[i]!.values[col] instanceof SqlJsonText\n ? (rows[i]!.values[col] as SqlJsonText).value\n : (rows[i]!.values[col] as string);\n blobLen += utf8Encode(text).length;\n }\n writeVarintU32(w, offsets.length);\n for (const off of offsets) writeVarintU32(w, off);\n writeVarintU32(w, blobLen);\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n const text =\n rows[i]!.values[col] instanceof SqlJsonText\n ? (rows[i]!.values[col] as SqlJsonText).value\n : (rows[i]!.values[col] as string);\n w.textBytes(text);\n }\n return;\n }\n if (pack === PACK_BLOB) {\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n const blob = rows[i]!.values[col] as Uint8Array;\n writeVarintU32(w, blob.length);\n w.raw(blob);\n }\n return;\n }\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n writeTaggedValue(w, rows[i]!.values[col]!, internId);\n }\n}\n\nfunction readPackedColumn(r: Reader, n: number, intern: readonly string[]): SlabColumn {\n const pack = r.u8();\n if (pack === PACK_NULL) return prepareSlabColumn({ pack, nullBitmap: null, payload: new Uint8Array(0) }, n, 0);\n const bits = r.raw((n + 7) >> 3);\n const nonNull = countNonNull(bits, n);\n\n if (pack === PACK_I32 || pack === PACK_I64 || pack === PACK_F64 || pack === PACK_TEXT_INTERN) {\n r.skipAlign4();\n const width = pack === PACK_I32 || pack === PACK_TEXT_INTERN ? 4 : 8;\n const payload = r.raw(nonNull * width);\n return prepareSlabColumn({ pack, nullBitmap: bits, payload }, n, nonNull);\n }\n if (pack === PACK_TEXT_INLINE) {\n const count = readVarintU32(r);\n const offsets = new Uint32Array(count);\n for (let i = 0; i < count; i++) offsets[i] = readVarintU32(r);\n const total = readVarintU32(r);\n const payload = r.raw(total);\n return prepareSlabColumn({ pack, nullBitmap: bits, payload, inlineOffsets: offsets }, n, nonNull);\n }\n if (pack === PACK_BLOB) {\n const chunks: Uint8Array[] = [];\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n const len = readVarintU32(r);\n chunks.push(r.raw(len));\n }\n return prepareSlabColumn({ pack, nullBitmap: bits, payload: new Uint8Array(0), blobChunks: chunks }, n, nonNull);\n }\n const tagged: SqlValue[] = [];\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n tagged.push(readTaggedValue(r, intern));\n }\n return prepareSlabColumn({ pack: PACK_TAGGED, nullBitmap: bits, payload: new Uint8Array(0), tagged }, n, nonNull);\n}\n\nfunction countNonNull(bits: Uint8Array, n: number): number {\n let c = 0;\n for (let i = 0; i < n; i++) if ((bits[i >> 3]! & (1 << (i & 7))) === 0) c++;\n return c;\n}\n\n// --- binary index store -------------------------------------------------------\n\nfunction writeIndexStoreBinary(w: Writer, store: IndexStore, internId: (s: string) => number): void {\n const entries = store.snapshotKeys();\n writeVarintU32(w, entries.length);\n for (const entry of entries) {\n const values = store.keyValuesFor(entry.key);\n writeVarintU32(w, values.length);\n for (const v of values) writeTaggedValue(w, v, internId);\n writeVarintU32(w, entry.rowids.length);\n for (const id of entry.rowids) writeTaggedValue(w, id, internId);\n }\n}\n\nfunction readIndexStoreBinary(r: Reader, name: string, intern: readonly string[]): IndexStore {\n const count = readVarintU32(r);\n const entries = new Map<string, Rowid[]>();\n const keyValues = new Map<string, SqlValue[]>();\n for (let i = 0; i < count; i++) {\n const valueCount = readVarintU32(r);\n const values: SqlValue[] = [];\n for (let v = 0; v < valueCount; v++) values.push(readTaggedValue(r, intern));\n const key = serializeIndexEntry(values);\n const rowidCount = readVarintU32(r);\n const rowids: Rowid[] = [];\n for (let ri = 0; ri < rowidCount; ri++) rowids.push(asRowid(readTaggedValue(r, intern)));\n entries.set(key, rowids);\n keyValues.set(key, values);\n }\n return new IndexStore(name, entries, keyValues);\n}\n\n// --- helpers ------------------------------------------------------------------\n\nfunction asRowid(value: SqlValue): Rowid {\n if ((typeof value === \"number\" && Number.isSafeInteger(value)) || typeof value === \"bigint\") return value;\n throw new SqliteError(\"invalid rowid in snapshot\", \"other\");\n}\n\nfunction compareNames(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction finiteNowMs(value: number): number {\n if (!Number.isFinite(value)) return 0;\n const max = 8.64e15;\n if (value > max) return max;\n if (value < -max) return -max;\n return value;\n}\n\nfunction sortedValues<T extends { name: string }>(map: Map<string, T>): T[] {\n return [...map.values()].sort((a, b) => compareNames(a.name, b.name));\n}\n\nfunction forceSchemaIntern(pool: InternPool, tables: Table[], views: ViewInfo[], indexes: IndexInfo[]): void {\n for (const table of tables) {\n pool.forceId(table.name);\n pool.forceId(table.originalSql ?? \"\");\n for (const column of table.columns) {\n pool.forceId(column.name);\n pool.forceId(column.typeName ?? \"\");\n pool.forceId(column.collate ?? \"\");\n }\n for (const name of table.indexes) pool.forceId(name);\n forceBjvStrings(pool, table.constraints);\n for (const column of table.columns) {\n if (column.defaultExpr) forceBjvStrings(pool, column.defaultExpr);\n if (column.generated) forceBjvStrings(pool, column.generated);\n }\n }\n for (const view of views) forceBjvStrings(pool, view);\n for (const index of indexes) {\n pool.forceId(index.name);\n pool.forceId(index.tableName);\n pool.forceId(index.originalSql ?? \"\");\n forceBjvStrings(pool, {\n name: index.name,\n tableName: index.tableName,\n unique: index.unique,\n columns: index.columns,\n where: index.where,\n originalSql: index.originalSql,\n });\n }\n}\n\nfunction forceBjvStrings(pool: InternPool, value: unknown): void {\n if (value === null || value === undefined) return;\n if (typeof value === \"string\") {\n pool.forceId(value);\n return;\n }\n if (typeof value === \"bigint\" || typeof value === \"boolean\" || typeof value === \"number\") return;\n if (value instanceof Uint8Array) return;\n if (Array.isArray(value)) {\n for (const item of value) forceBjvStrings(pool, item);\n return;\n }\n if (typeof value === \"object\") {\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n pool.forceId(k);\n forceBjvStrings(pool, v);\n }\n }\n}\n", "import {\n type Clock,\n type DatabaseOptions,\n DEFAULT_DATABASE_SEED,\n DEFAULT_NOW,\n fixedClock,\n OsEntropy,\n Prng,\n type RandomMode,\n resolveClock,\n} from \"../runtime/index.ts\";\nimport { decodeDatabaseState, encodeDatabaseState } from \"../serialization/codec.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\nimport { createAdoptedDatabase, type Database } 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 bytes?: Uint8Array | null;\n runtimePresent: boolean;\n}\n\n/**\n * Frozen in-memory database template. {@link open} is a copy-on-write fork.\n * Encoded SQLM 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 true when the blob (or live capture) included PRNG/clock. */\n readonly runtimePresent: boolean;\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.runtimePresent = init.runtimePresent;\n this.cachedBytes = init.bytes ?? null;\n }\n\n /** Encoded SQLM blob. Computed once; never mutates a buffer passed to {@link decode}. */\n encode(): Uint8Array {\n if (this.cachedBytes) return this.cachedBytes;\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 decoded = decodeDatabaseState(bytes);\n decoded.state.freezeShared();\n const snap = new Snapshot({\n state: decoded.state,\n prngState: decoded.runtime?.prngState ?? 0n,\n nowMs: decoded.runtime?.nowMs ?? DEFAULT_NOW.getTime(),\n seed: DEFAULT_DATABASE_SEED,\n randomMode: \"deterministic\",\n systemClock: false,\n bytes,\n runtimePresent: decoded.runtime !== null,\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): 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 runtimePresent: true,\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 prng = randomMode === \"os\" ? new OsEntropy() : new Prng(seed);\n if (snapshot.runtimePresent && randomMode !== \"os\") prng.setState(snapshot.prngState);\n let now = resolveClock(systemClock ? \"system\" : options.now);\n if (snapshot.runtimePresent && !systemClock) now = fixedClock(new Date(snapshot.nowMs));\n return createAdoptedDatabase({\n state: snapshot.state.cloneShallow(),\n prng,\n now,\n seed,\n randomMode,\n systemClock,\n });\n}\n", "import { coerceToNumber, compareSql, type SqlValue, utf8Decode } from \"../types/value.ts\";\n\nexport interface AggregateAccumulator {\n step(args: SqlValue[]): void;\n finalize(): SqlValue;\n}\n\nexport type AggregateFactory = () => AggregateAccumulator;\n\nclass CountAccumulator implements AggregateAccumulator {\n private count = 0;\n step(args: SqlValue[]): void {\n if (args.length === 0 || args[0] !== null) this.count++;\n }\n finalize(): SqlValue {\n return this.count;\n }\n}\n\nclass NumericAccumulator implements AggregateAccumulator {\n private count = 0;\n private sum = 0;\n constructor(private readonly mode: \"sum\" | \"avg\" | \"total\") {}\n step(args: SqlValue[]): void {\n const value = args[0];\n if (value === null || value === undefined) return;\n this.sum += coerceToNumber(value) ?? 0;\n this.count++;\n }\n finalize(): SqlValue {\n if (this.mode === \"total\") return this.sum;\n if (this.count === 0) return null;\n return this.mode === \"avg\" ? this.sum / this.count : this.sum;\n }\n}\n\nclass MinMaxAccumulator implements AggregateAccumulator {\n private value: SqlValue = null;\n constructor(private readonly direction: \"min\" | \"max\") {}\n step(args: SqlValue[]): void {\n const candidate = args[0];\n if (candidate === null || candidate === undefined) return;\n if (this.value === null) {\n this.value = candidate;\n return;\n }\n const comparison = compareSql(candidate, this.value)!;\n if ((this.direction === \"min\" && comparison < 0) || (this.direction === \"max\" && comparison > 0)) {\n this.value = candidate;\n }\n }\n finalize(): SqlValue {\n return this.value;\n }\n}\n\nclass GroupConcatAccumulator implements AggregateAccumulator {\n private readonly values: string[] = [];\n private separator = \",\";\n step(args: SqlValue[]): void {\n if (args[0] === null || args[0] === undefined) return;\n if (args[1] !== undefined && args[1] !== null) this.separator = String(args[1]);\n this.values.push(args[0] instanceof Uint8Array ? utf8Decode(args[0]) : String(args[0]));\n }\n finalize(): SqlValue {\n return this.values.length === 0 ? null : this.values.join(this.separator);\n }\n}\n\nexport const aggregateFunctions: Readonly<Record<string, AggregateFactory>> = {\n count: () => new CountAccumulator(),\n sum: () => new NumericAccumulator(\"sum\"),\n avg: () => new NumericAccumulator(\"avg\"),\n total: () => new NumericAccumulator(\"total\"),\n min: () => new MinMaxAccumulator(\"min\"),\n max: () => new MinMaxAccumulator(\"max\"),\n group_concat: () => new GroupConcatAccumulator(),\n string_agg: () => new GroupConcatAccumulator(),\n};\n\nexport function createAggregate(name: string): AggregateAccumulator | undefined {\n return aggregateFunctions[name.toLowerCase()]?.();\n}\n", "import { coerceToNumber, isSqlReal, type SqlValue } from \"../types/value.ts\";\nimport type { FunctionContext, ScalarFunction } from \"./registry.ts\";\n\nconst JULIAN_UNIX_EPOCH = 2440587.5;\n\nfunction parseDate(value: SqlValue | undefined, context: FunctionContext): Date | null {\n if (value === undefined || value === \"now\") {\n return context.now?.() ?? new Date(\"2000-01-01T00:00:00.000Z\");\n }\n if (value === null || value instanceof Uint8Array) return null;\n if (typeof value === \"number\" || typeof value === \"bigint\" || isSqlReal(value)) {\n return new Date((Number(isSqlReal(value) ? value.value : value) - JULIAN_UNIX_EPOCH) * 86400000);\n }\n if (typeof value !== \"string\") return null;\n const source = /^\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?$/.test(value)\n ? `2000-01-01T${value}Z`\n : /^\\d{4}-\\d\\d-\\d\\d$/.test(value)\n ? `${value}T00:00:00Z`\n : value.replace(\" \", \"T\") + (/[zZ]|[+-]\\d\\d:\\d\\d$/.test(value) ? \"\" : \"Z\");\n const date = new Date(source);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\nfunction applyModifier(date: Date, modifier: string, flags: { subsec: boolean }): Date | null {\n const result = new Date(date);\n const normalized = modifier.trim().toLowerCase();\n if (normalized === \"unixepoch\") return new Date((date.getTime() / 86400000 + JULIAN_UNIX_EPOCH) * 1000);\n if (normalized === \"utc\" || normalized === \"localtime\") return result;\n if (normalized === \"subsec\" || normalized === \"subsecond\") {\n flags.subsec = true;\n return result;\n }\n // Accepted by SQLite; when not attached to a prior fractional add they are effectively no-ops.\n if (normalized === \"floor\" || normalized === \"ceiling\") return result;\n const weekday = /^weekday\\s+([0-6])$/.exec(normalized);\n if (weekday) {\n const target = Number(weekday[1]);\n result.setUTCDate(result.getUTCDate() + ((target - result.getUTCDay() + 7) % 7));\n } else if (normalized === \"start of day\") result.setUTCHours(0, 0, 0, 0);\n else if (normalized === \"start of month\") {\n result.setUTCDate(1);\n result.setUTCHours(0, 0, 0, 0);\n } else if (normalized === \"start of year\") {\n result.setUTCMonth(0, 1);\n result.setUTCHours(0, 0, 0, 0);\n } else {\n const match = /^([+-]?\\d+(?:\\.\\d+)?)\\s+(second|minute|hour|day|month|year)s?$/.exec(normalized);\n if (!match) return null;\n const amount = Number(match[1]);\n switch (match[2]) {\n case \"second\":\n result.setTime(result.getTime() + amount * 1000);\n break;\n case \"minute\":\n result.setTime(result.getTime() + amount * 60000);\n break;\n case \"hour\":\n result.setTime(result.getTime() + amount * 3600000);\n break;\n case \"day\":\n result.setTime(result.getTime() + amount * 86400000);\n break;\n case \"month\":\n result.setUTCMonth(result.getUTCMonth() + amount);\n break;\n case \"year\":\n result.setUTCFullYear(result.getUTCFullYear() + amount);\n break;\n }\n }\n return result;\n}\n\nfunction applyModifiers(date: Date, modifiers: SqlValue[]): { date: Date; subsec: boolean } | null {\n const flags = { subsec: false };\n let current = date;\n for (const modifier of modifiers) {\n if (typeof modifier !== \"string\") return null;\n const next = applyModifier(current, modifier, flags);\n if (!next) return null;\n current = next;\n }\n return { date: current, subsec: flags.subsec };\n}\n\n/** Prefer direct unix\u2192ms to avoid julian float round-trip (off-by-one on some integers). */\nfunction fromUnixSeconds(seconds: number): Date | null {\n const date = new Date(seconds * 1000);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\nfunction resolveDate(args: SqlValue[], context: FunctionContext): { date: Date; subsec: boolean } | null {\n let source = args[0];\n let modifiers = args.slice(1);\n if (source === undefined) source = \"now\";\n if (modifiers[0] === \"unixepoch\") {\n const seconds = coerceToNumber(source);\n if (seconds === null) return null;\n const date = fromUnixSeconds(seconds);\n if (!date) return null;\n return applyModifiers(date, modifiers.slice(1));\n }\n if (typeof modifiers[0] === \"string\" && modifiers[0].trim().toLowerCase() === \"auto\") {\n const number = coerceToNumber(source);\n if (number === null) {\n // Non-numeric timestring: SQLite ignores auto and parses the timestring.\n modifiers = modifiers.slice(1);\n } else if (number >= 0 && number < 5373484.5) {\n // Julian day number.\n source = number;\n modifiers = modifiers.slice(1);\n } else {\n const date = fromUnixSeconds(number);\n if (!date) return null;\n return applyModifiers(date, modifiers.slice(1));\n }\n }\n const date = parseDate(source, context);\n if (!date) return null;\n return applyModifiers(date, modifiers);\n}\n\nfunction pad(value: number, length = 2): string {\n return String(value).padStart(length, \"0\");\n}\n\nfunction isoDate(date: Date): string {\n return `${pad(date.getUTCFullYear(), 4)}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`;\n}\n\nfunction isoTime(date: Date, subsec = false): string {\n const base = `${pad(date.getUTCHours())}:${pad(date.getUTCMinutes())}:${pad(date.getUTCSeconds())}`;\n return subsec ? `${base}.${pad(date.getUTCMilliseconds(), 3)}` : base;\n}\n\nfunction dayOfYear(date: Date): number {\n return (\n Math.floor(\n (Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()) - Date.UTC(date.getUTCFullYear(), 0, 1)) /\n 86400000,\n ) + 1\n );\n}\n\nfunction formatDate(date: Date, format: string): string {\n return format.replace(/%[%YmdHMSfjswWJ]/g, (code) => {\n switch (code) {\n case \"%%\":\n return \"%\";\n case \"%Y\":\n return pad(date.getUTCFullYear(), 4);\n case \"%m\":\n return pad(date.getUTCMonth() + 1);\n case \"%d\":\n return pad(date.getUTCDate());\n case \"%H\":\n return pad(date.getUTCHours());\n case \"%M\":\n return pad(date.getUTCMinutes());\n case \"%S\":\n return pad(date.getUTCSeconds());\n case \"%f\":\n return `${pad(date.getUTCSeconds())}.${pad(date.getUTCMilliseconds(), 3)}`;\n case \"%j\":\n return pad(dayOfYear(date), 3);\n case \"%s\":\n return String(Math.floor(date.getTime() / 1000));\n case \"%w\":\n return String(date.getUTCDay());\n case \"%W\":\n return pad(Math.floor((dayOfYear(date) - 1 + 7 - date.getUTCDay()) / 7));\n case \"%J\":\n return String(date.getTime() / 86400000 + JULIAN_UNIX_EPOCH);\n default:\n return code;\n }\n });\n}\n\nexport const dateTimeFunctions: Readonly<Record<string, ScalarFunction>> = {\n date(args, context) {\n const value = resolveDate(args, context);\n return value ? isoDate(value.date) : null;\n },\n time(args, context) {\n const value = resolveDate(args, context);\n return value ? isoTime(value.date, value.subsec) : null;\n },\n datetime(args, context) {\n const value = resolveDate(args, context);\n return value ? `${isoDate(value.date)} ${isoTime(value.date, value.subsec)}` : null;\n },\n julianday(args, context) {\n const value = resolveDate(args, context);\n return value ? value.date.getTime() / 86400000 + JULIAN_UNIX_EPOCH : null;\n },\n strftime(args, context) {\n if (typeof args[0] !== \"string\") return null;\n const value = resolveDate(args.slice(1), context);\n return value ? formatDate(value.date, args[0]) : null;\n },\n current_date(args, context) {\n return dateTimeFunctions.date!(args.length === 0 ? [\"now\"] : args, context);\n },\n current_time(args, context) {\n return dateTimeFunctions.time!(args.length === 0 ? [\"now\"] : args, context);\n },\n current_timestamp(args, context) {\n return dateTimeFunctions.datetime!(args.length === 0 ? [\"now\"] : args, context);\n },\n unixepoch(args, context) {\n const value = resolveDate(args.length === 0 ? [\"now\"] : args, context);\n return value ? Math.floor(value.date.getTime() / 1000) : null;\n },\n timediff(args) {\n if (args.length !== 2) return null;\n const a = parseDate(args[0], {});\n const b = parseDate(args[1], {});\n if (!a || !b) return null;\n let ms = a.getTime() - b.getTime();\n const sign = ms < 0 ? \"-\" : \"+\";\n ms = Math.abs(ms);\n const years = Math.floor(ms / (365.2425 * 86400000));\n ms -= years * 365.2425 * 86400000;\n // Approximate month/day breakdown matching SQLite's YYYY-MM-DD HH:MM:SS.mmm style\n const months = Math.floor(ms / (30.436875 * 86400000));\n ms -= months * 30.436875 * 86400000;\n const days = Math.floor(ms / 86400000);\n ms -= days * 86400000;\n const hours = Math.floor(ms / 3600000);\n ms -= hours * 3600000;\n const minutes = Math.floor(ms / 60000);\n ms -= minutes * 60000;\n const seconds = Math.floor(ms / 1000);\n const millis = Math.floor(ms % 1000);\n const p = (n: number, w: number) => String(n).padStart(w, \"0\");\n return `${sign}${p(years, 4)}-${p(months, 2)}-${p(days, 2)} ${p(hours, 2)}:${p(minutes, 2)}:${p(seconds, 2)}.${p(millis, 3)}`;\n },\n};\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\nimport type { Fts5VirtualTable } from \"../vtable/fts5.ts\";\nimport type { FunctionContext, ScalarFunction } from \"./registry.ts\";\n\nfunction requireArgs(name: string, args: SqlValue[], min: number, max = min): void {\n if (args.length < min || args.length > max) {\n throw new SqliteError(`wrong number of arguments to function ${name}()`, \"misuse\");\n }\n}\n\nfunction resolveFtsTable(args: SqlValue[], context: FunctionContext, name: string) {\n const first = args[0];\n let tableName: string | null = null;\n if (typeof first === \"string\") tableName = first;\n else if (context.ftsSourceTable) tableName = context.ftsSourceTable;\n else if (context.ftsMatch) tableName = context.ftsMatch.tableName;\n if (!tableName || !context.getFtsTable) {\n throw new SqliteError(`unable to use function ${name} in the requested context`, \"unsupported\");\n }\n const table = context.getFtsTable(tableName);\n if (!table) throw new SqliteError(`unable to use function ${name} in the requested context`, \"unsupported\");\n return table;\n}\n\nfunction columnText(table: Fts5VirtualTable, context: FunctionContext, colIndex: number): string {\n const col = table.columns[colIndex];\n if (!col) return \"\";\n const rowid = context.ftsMatch?.rowid ?? context.ftsRowid;\n if (rowid === undefined) return \"\";\n const row = table.rows.get(rowid);\n if (!row) return \"\";\n const value = row.values.get(col.toLowerCase());\n return value === null || value === undefined ? \"\" : String(value);\n}\n\n/**\n * FTS auxiliary functions. When used with a MATCH cursor they compute real\n * values; without MATCH they mirror SQLite's empty-cursor defaults.\n */\nexport const ftsAuxFunctions: Readonly<Record<string, ScalarFunction>> = {\n bm25(args, context) {\n requireArgs(\"bm25\", args, 1, 100);\n const table = resolveFtsTable(args, context, \"bm25\");\n const weights = args.slice(1).map((v) => (typeof v === \"number\" ? v : Number(v)));\n if (!context.ftsMatch || context.ftsMatch.tableName.toLowerCase() !== table.name.toLowerCase()) {\n return -0;\n }\n return table.bm25(context.ftsMatch, weights.length ? weights : undefined);\n },\n highlight(args, context) {\n requireArgs(\"highlight\", args, 4);\n const table = resolveFtsTable(args, context, \"highlight\");\n const colIndex = Number(args[1] ?? 0);\n const open = String(args[2] ?? \"\");\n const close = String(args[3] ?? \"\");\n if (!context.ftsMatch || context.ftsMatch.tableName.toLowerCase() !== table.name.toLowerCase()) {\n return columnText(table, context, colIndex);\n }\n return table.highlight(context.ftsMatch, colIndex, open, close);\n },\n snippet(args, context) {\n requireArgs(\"snippet\", args, 1, 6);\n const table = resolveFtsTable(args, context, \"snippet\");\n const colIndex = Number(args[1] ?? 0);\n const open = String(args[2] ?? \"<b>\");\n const close = String(args[3] ?? \"</b>\");\n const ellipsis = String(args[4] ?? \"...\");\n const tokenCount = Number(args[5] ?? 64);\n if (!context.ftsMatch || context.ftsMatch.tableName.toLowerCase() !== table.name.toLowerCase()) {\n return columnText(table, context, colIndex);\n }\n return table.snippet(context.ftsMatch, colIndex, open, close, ellipsis, tokenCount);\n },\n matchinfo(args, context) {\n requireArgs(\"matchinfo\", args, 1, 2);\n const table = resolveFtsTable(args, context, \"matchinfo\");\n const format = typeof args[1] === \"string\" ? args[1] : \"pcx\";\n if (!context.ftsMatch) {\n throw new SqliteError(\"unable to use function matchinfo in the requested context\", \"unsupported\");\n }\n return table.matchinfo(context.ftsMatch, format);\n },\n offsets(args, context) {\n requireArgs(\"offsets\", args, 1);\n const table = resolveFtsTable(args, context, \"offsets\");\n if (!context.ftsMatch) {\n throw new SqliteError(\"unable to use function offsets in the requested context\", \"unsupported\");\n }\n return table.offsets(context.ftsMatch);\n },\n};\n\nexport const rtreeAuxFunctions: Readonly<Record<string, ScalarFunction>> = {\n rtreecheck(args) {\n requireArgs(\"rtreecheck\", args, 1, 2);\n if (args.length === 1) return \"ok\";\n throw new SqliteError(\"SQL logic error\", \"other\");\n },\n rtreenode(args) {\n requireArgs(\"rtreenode\", args, 2);\n return \"{}\";\n },\n rtreedepth(args) {\n requireArgs(\"rtreedepth\", args, 1);\n return 0;\n },\n};\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { JsonNode } from \"./types.ts\";\n\nexport class JsonParseError extends Error {\n constructor(\n message: string,\n readonly position: number,\n ) {\n super(message);\n this.name = \"JsonParseError\";\n }\n}\n\n/** Parse JSON / JSON5-ish input into a JsonNode. Position is 1-based for errors. */\nexport function parseJsonText(input: string, options?: { strictCanonical?: boolean }): JsonNode {\n const parser = new JsonTextParser(input, options?.strictCanonical ?? false);\n const node = parser.parseValue();\n parser.skipWs();\n if (!parser.eof()) {\n throw new JsonParseError(\"malformed JSON\", parser.pos1());\n }\n return node;\n}\n\nexport function jsonErrorPosition(input: string): number {\n try {\n parseJsonText(input);\n return 0;\n } catch (e) {\n if (e instanceof JsonParseError) return e.position;\n return 1;\n }\n}\n\nexport function isValidJsonText(input: string, flags = 0): boolean {\n // SQLite flags: 0x01 accepts canonical RFC-8259 JSON and 0x02 accepts\n // JSON5. With no explicit flags json_valid() uses canonical JSON.\n const allowCanonical = flags === 0 || (flags & 0x01) !== 0;\n const allowJson5 = (flags & 0x02) !== 0;\n try {\n if (allowJson5) {\n parseJsonText(input);\n return true;\n }\n if (allowCanonical) {\n parseJsonText(input, { strictCanonical: true });\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\n\nclass JsonTextParser {\n private i = 0;\n constructor(\n private readonly s: string,\n private readonly strictCanonical: boolean,\n ) {}\n\n eof(): boolean {\n return this.i >= this.s.length;\n }\n\n pos1(): number {\n return this.i + 1;\n }\n\n peek(n = 0): string {\n return this.s[this.i + n] ?? \"\";\n }\n\n advance(): string {\n return this.s[this.i++] ?? \"\";\n }\n\n skipWs(): void {\n while (this.i < this.s.length) {\n const ch = this.peek();\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\v\" || ch === \"\\f\") {\n this.advance();\n continue;\n }\n if (!this.strictCanonical && ch === \"/\" && this.peek(1) === \"/\") {\n this.i += 2;\n while (!this.eof() && this.peek() !== \"\\n\") this.advance();\n continue;\n }\n if (!this.strictCanonical && ch === \"/\" && this.peek(1) === \"*\") {\n this.i += 2;\n while (!this.eof() && !(this.peek() === \"*\" && this.peek(1) === \"/\")) this.advance();\n if (!this.eof()) this.i += 2;\n continue;\n }\n break;\n }\n }\n\n parseValue(): JsonNode {\n this.skipWs();\n if (this.eof()) throw new JsonParseError(\"malformed JSON\", this.pos1());\n const ch = this.peek();\n if (ch === \"{\") return this.parseObject();\n if (ch === \"[\") return this.parseArray();\n if (ch === '\"' || (!this.strictCanonical && ch === \"'\")) return this.parseString();\n if (ch === \"-\" || ch === \"+\" || (ch >= \"0\" && ch <= \"9\") || ch === \".\") return this.parseNumber();\n if (ch === \"n\" || ch === \"N\") return this.parseKeyword();\n if (ch === \"t\" || ch === \"T\" || ch === \"f\" || ch === \"F\" || ch === \"I\" || ch === \"i\") {\n return this.parseKeyword();\n }\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n\n parseObject(): JsonNode {\n this.advance(); // {\n this.skipWs();\n const entries: Array<{ key: string; value: JsonNode }> = [];\n if (this.peek() === \"}\") {\n this.advance();\n return { kind: \"object\", entries };\n }\n while (true) {\n this.skipWs();\n let key: string;\n if (this.peek() === '\"' || (!this.strictCanonical && this.peek() === \"'\")) {\n const str = this.parseString();\n key = (str as { kind: \"string\"; value: string }).value;\n } else if (!this.strictCanonical && this.isIdentStart(this.peek())) {\n key = this.parseIdent();\n } else {\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n this.skipWs();\n if (this.advance() !== \":\") throw new JsonParseError(\"malformed JSON\", this.pos1());\n const value = this.parseValue();\n entries.push({ key, value });\n this.skipWs();\n const sep = this.peek();\n if (sep === \",\") {\n this.advance();\n this.skipWs();\n if (!this.strictCanonical && this.peek() === \"}\") {\n this.advance();\n break;\n }\n continue;\n }\n if (sep === \"}\") {\n this.advance();\n break;\n }\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n return { kind: \"object\", entries };\n }\n\n parseArray(): JsonNode {\n this.advance(); // [\n this.skipWs();\n const elements: JsonNode[] = [];\n if (this.peek() === \"]\") {\n this.advance();\n return { kind: \"array\", elements };\n }\n while (true) {\n elements.push(this.parseValue());\n this.skipWs();\n const sep = this.peek();\n if (sep === \",\") {\n this.advance();\n this.skipWs();\n if (!this.strictCanonical && this.peek() === \"]\") {\n this.advance();\n break;\n }\n continue;\n }\n if (sep === \"]\") {\n this.advance();\n break;\n }\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n return { kind: \"array\", elements };\n }\n\n parseString(): JsonNode {\n const quote = this.advance();\n if (this.strictCanonical && quote !== '\"') {\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n let out = \"\";\n while (!this.eof()) {\n const ch = this.advance();\n if (ch === quote) return { kind: \"string\", value: out };\n if (ch === \"\\\\\") {\n if (this.eof()) throw new JsonParseError(\"malformed JSON\", this.pos1());\n const esc = this.advance();\n switch (esc) {\n case '\"':\n case \"'\":\n case \"\\\\\":\n case \"/\":\n out += esc;\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.s.slice(this.i, this.i + 4);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) throw new JsonParseError(\"malformed JSON\", this.pos1());\n this.i += 4;\n out += String.fromCharCode(parseInt(hex, 16));\n break;\n }\n case \"\\n\":\n case \"\\r\":\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n if (esc === \"\\r\" && this.peek() === \"\\n\") this.advance();\n break;\n default:\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n out += esc;\n }\n continue;\n }\n if (ch === \"\\n\" || ch === \"\\r\") {\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n out += ch;\n }\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n\n parseNumber(): JsonNode {\n const start = this.i;\n if (this.peek() === \"+\" || this.peek() === \"-\") {\n if (this.strictCanonical && this.peek() === \"+\") {\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n this.advance();\n }\n // Infinity / NaN handled via keyword if letter\n if (/[A-Za-z]/.test(this.peek())) {\n this.i = start;\n return this.parseKeyword();\n }\n if (this.peek() === \"0\" && /[xX]/.test(this.peek(1))) {\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n this.i += 2;\n while (/[0-9a-fA-F]/.test(this.peek())) this.advance();\n const text = this.s.slice(start, this.i);\n const n = Number(text);\n if (!Number.isFinite(n)) throw new JsonParseError(\"malformed JSON\", start + 1);\n return Number.isInteger(n) ? { kind: \"integer\", text: String(Math.trunc(n)) } : { kind: \"real\", text: String(n) };\n }\n let seenDot = false;\n let seenExp = false;\n if (this.peek() === \".\") {\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n seenDot = true;\n this.advance();\n }\n if (!(this.peek() >= \"0\" && this.peek() <= \"9\") && !seenDot) {\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n while (this.peek() >= \"0\" && this.peek() <= \"9\") this.advance();\n if (this.peek() === \".\") {\n seenDot = true;\n this.advance();\n while (this.peek() >= \"0\" && this.peek() <= \"9\") this.advance();\n }\n if (this.peek() === \"e\" || this.peek() === \"E\") {\n seenExp = true;\n this.advance();\n if (this.peek() === \"+\" || this.peek() === \"-\") this.advance();\n if (!(this.peek() >= \"0\" && this.peek() <= \"9\")) throw new JsonParseError(\"malformed JSON\", this.pos1());\n while (this.peek() >= \"0\" && this.peek() <= \"9\") this.advance();\n }\n const raw = this.s.slice(start, this.i);\n if (this.strictCanonical) {\n if (raw.startsWith(\"+\")) throw new JsonParseError(\"malformed JSON\", start + 1);\n if (raw.includes(\".\") && (raw.startsWith(\".\") || raw.endsWith(\".\") || /\\.-|\\+\\./.test(raw))) {\n // trailing/leading dot rejected in strict \u2014 already partially handled\n }\n if (/^-?0\\d/.test(raw)) throw new JsonParseError(\"malformed JSON\", start + 1);\n }\n const canon = canonicalizeNumberText(raw);\n if (canon.kind === \"integer\" || (!seenDot && !seenExp && !raw.includes(\".\"))) {\n // Prefer integer when no fractional/exponent markers in original (after leading +-)\n const body = raw.replace(/^[+-]/, \"\");\n if (!body.includes(\".\") && !/[eE]/.test(body)) {\n return { kind: \"integer\", text: canon.text };\n }\n }\n return { kind: \"real\", text: canon.text };\n }\n\n parseKeyword(): JsonNode {\n const start = this.i;\n while (/[A-Za-z]/.test(this.peek())) this.advance();\n const word = this.s.slice(start, this.i);\n const lower = word.toLowerCase();\n if (lower === \"null\") return { kind: \"null\" };\n if (lower === \"true\") return { kind: \"true\" };\n if (lower === \"false\") return { kind: \"false\" };\n if (!this.strictCanonical) {\n if (lower === \"nan\" || lower === \"qnan\" || lower === \"snan\") return { kind: \"null\" };\n if (lower === \"infinity\" || lower === \"inf\") {\n const _sign = this.s[start - 1] === \"-\" ? \"-\" : \"\";\n // Treat as null-ish? Docs say Inf is allowed in JSON5 input and converted; use a large number string?\n // SQLite converts Infinity to null when rendering? Actually json() of Infinity might error or become null.\n // Probe showed NaN -> null. For Inf, check:\n return { kind: \"null\" };\n }\n }\n throw new JsonParseError(\"malformed JSON\", start + 1);\n }\n\n isIdentStart(ch: string): boolean {\n return /[A-Za-z_$]/.test(ch) || (ch.length > 0 && ch.charCodeAt(0) > 0x7f);\n }\n\n parseIdent(): string {\n let out = \"\";\n while (!this.eof()) {\n const ch = this.peek();\n if (/[A-Za-z0-9_$]/.test(ch) || ch.charCodeAt(0) > 0x7f) {\n out += this.advance();\n continue;\n }\n break;\n }\n if (!out) throw new JsonParseError(\"malformed JSON\", this.pos1());\n return out;\n }\n}\n\nfunction canonicalizeNumberText(raw: string): { kind: \"integer\" | \"real\"; text: string } {\n let s = raw.trim();\n if (s.startsWith(\"+\")) s = s.slice(1);\n const n = Number(s);\n if (!Number.isFinite(n)) {\n throw new JsonParseError(\"malformed JSON\", 1);\n }\n if (Number.isInteger(n) && !/[eE.]/.test(s.replace(/^-/, \"\"))) {\n return { kind: \"integer\", text: String(Math.trunc(n)) };\n }\n // Prefer a stable JSON number rendering\n let text = String(n);\n if (text.includes(\"e\") || text.includes(\"E\")) {\n // keep JS default\n } else if (text.endsWith(\".0\") && Number.isInteger(n)) {\n text = String(Math.trunc(n));\n return { kind: \"integer\", text };\n }\n return { kind: Number.isInteger(n) && !s.includes(\".\") && !/[eE]/.test(s) ? \"integer\" : \"real\", text };\n}\n\nexport function malformedJsonError(position?: number): SqliteError {\n return new SqliteError(position !== undefined ? `malformed JSON` : \"malformed JSON\", \"other\");\n}\n", "import type { JsonNode } from \"./types.ts\";\n\nexport function stringifyJson(node: JsonNode): string {\n switch (node.kind) {\n case \"null\":\n return \"null\";\n case \"true\":\n return \"true\";\n case \"false\":\n return \"false\";\n case \"integer\":\n case \"real\":\n return node.text;\n case \"string\":\n return jsonQuoteString(node.value);\n case \"array\":\n return `[${node.elements.map(stringifyJson).join(\",\")}]`;\n case \"object\":\n return `{${node.entries.map((e) => `${jsonQuoteString(e.key)}:${stringifyJson(e.value)}`).join(\",\")}}`;\n }\n}\n\nexport function jsonQuoteString(value: string): string {\n let out = '\"';\n for (let i = 0; i < value.length; i++) {\n const ch = value[i]!;\n const code = ch.charCodeAt(0);\n switch (ch) {\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 default:\n if (code < 0x20) {\n out += `\\\\u${code.toString(16).padStart(4, \"0\")}`;\n } else {\n out += ch;\n }\n }\n }\n return `${out}\"`;\n}\n\nexport function prettyJson(node: JsonNode, indent = \" \"): string {\n return prettyNode(node, indent, 0);\n}\n\nfunction prettyNode(node: JsonNode, indent: string, depth: number): string {\n const pad = indent.repeat(depth);\n const padInner = indent.repeat(depth + 1);\n switch (node.kind) {\n case \"array\":\n if (node.elements.length === 0) return \"[]\";\n return `[\\n${node.elements.map((e) => `${padInner}${prettyNode(e, indent, depth + 1)}`).join(\",\\n\")}\\n${pad}]`;\n case \"object\":\n if (node.entries.length === 0) return \"{}\";\n return `{\\n${node.entries\n .map((e) => `${padInner}${jsonQuoteString(e.key)}: ${prettyNode(e.value, indent, depth + 1)}`)\n .join(\",\\n\")}\\n${pad}}`;\n default:\n return stringifyJson(node);\n }\n}\n", "import { utf8Decode, utf8Encode } from \"../types/value.ts\";\nimport { JsonParseError, parseJsonText } from \"./parse.ts\";\nimport { stringifyJson } from \"./stringify.ts\";\nimport type { JsonNode } from \"./types.ts\";\n\n/** JSONB element types (low nibble). */\nexport const JB = {\n NULL: 0,\n TRUE: 1,\n FALSE: 2,\n INT: 3,\n INT5: 4,\n FLOAT: 5,\n FLOAT5: 6,\n TEXT: 7,\n TEXTJ: 8,\n TEXT5: 9,\n TEXTRAW: 10,\n ARRAY: 11,\n OBJECT: 12,\n} as const;\n\nexport function encodeJsonb(node: JsonNode): Uint8Array {\n const parts: number[] = [];\n writeNode(node, parts);\n return Uint8Array.from(parts);\n}\n\nfunction writeNode(node: JsonNode, out: number[]): void {\n switch (node.kind) {\n case \"null\":\n writeHeader(out, 0, JB.NULL);\n break;\n case \"true\":\n writeHeader(out, 0, JB.TRUE);\n break;\n case \"false\":\n writeHeader(out, 0, JB.FALSE);\n break;\n case \"integer\": {\n const payload = utf8Encode(node.text);\n writeHeader(out, payload.length, JB.INT);\n for (const b of payload) out.push(b);\n break;\n }\n case \"real\": {\n const payload = utf8Encode(node.text);\n writeHeader(out, payload.length, JB.FLOAT);\n for (const b of payload) out.push(b);\n break;\n }\n case \"string\": {\n const payload = utf8Encode(node.value);\n const needsEscape = [...node.value].some((ch) => {\n const c = ch.charCodeAt(0);\n return ch === '\"' || ch === \"\\\\\" || c < 0x20;\n });\n // Prefer TEXT when no escapes needed; TEXTRAW if chars need escaping in JSON text\n const type = needsEscape ? JB.TEXTRAW : JB.TEXT;\n writeHeader(out, payload.length, type);\n for (const b of payload) out.push(b);\n break;\n }\n case \"array\": {\n const payload: number[] = [];\n for (const el of node.elements) writeNode(el, payload);\n writeHeader(out, payload.length, JB.ARRAY);\n out.push(...payload);\n break;\n }\n case \"object\": {\n const payload: number[] = [];\n for (const entry of node.entries) {\n writeNode({ kind: \"string\", value: entry.key }, payload);\n writeNode(entry.value, payload);\n }\n writeHeader(out, payload.length, JB.OBJECT);\n out.push(...payload);\n break;\n }\n }\n}\n\nfunction writeHeader(out: number[], size: number, type: number): void {\n if (size <= 11) {\n out.push((size << 4) | type);\n return;\n }\n if (size <= 0xff) {\n out.push((12 << 4) | type, size);\n return;\n }\n if (size <= 0xffff) {\n out.push((13 << 4) | type, (size >> 8) & 0xff, size & 0xff);\n return;\n }\n out.push((14 << 4) | type, (size >> 24) & 0xff, (size >> 16) & 0xff, (size >> 8) & 0xff, size & 0xff);\n}\n\nexport interface JsonbElement {\n offset: number;\n end: number;\n type: number;\n payloadOffset: number;\n payloadSize: number;\n}\n\nexport function readHeader(blob: Uint8Array, offset: number): JsonbElement {\n if (offset >= blob.length) throw new JsonParseError(\"malformed JSON\", offset + 1);\n const first = blob[offset]!;\n const sizeCode = first >> 4;\n const type = first & 0x0f;\n let headerSize = 1;\n let payloadSize = sizeCode;\n if (sizeCode >= 12) {\n const lenBytes = sizeCode === 12 ? 1 : sizeCode === 13 ? 2 : sizeCode === 14 ? 4 : 8;\n headerSize = 1 + lenBytes;\n if (offset + headerSize > blob.length) throw new JsonParseError(\"malformed JSON\", offset + 1);\n payloadSize = 0;\n for (let i = 0; i < lenBytes; i++) {\n payloadSize = (payloadSize << 8) | blob[offset + 1 + i]!;\n }\n }\n const payloadOffset = offset + headerSize;\n const end = payloadOffset + payloadSize;\n if (end > blob.length) throw new JsonParseError(\"malformed JSON\", offset + 1);\n return { offset, end, type, payloadOffset, payloadSize };\n}\n\nexport function looksLikeJsonb(blob: Uint8Array): boolean {\n if (blob.length === 0) return false;\n try {\n const el = readHeader(blob, 0);\n return el.end === blob.length && el.type <= JB.OBJECT;\n } catch {\n return false;\n }\n}\n\nexport function decodeJsonb(blob: Uint8Array): JsonNode {\n const el = readHeader(blob, 0);\n if (el.end !== blob.length) throw new JsonParseError(\"malformed JSON\", 1);\n return decodeElement(blob, el);\n}\n\nfunction decodeElement(blob: Uint8Array, el: JsonbElement): JsonNode {\n switch (el.type) {\n case JB.NULL:\n return { kind: \"null\" };\n case JB.TRUE:\n return { kind: \"true\" };\n case JB.FALSE:\n return { kind: \"false\" };\n case JB.INT:\n case JB.INT5: {\n const text = utf8Decode(blob.subarray(el.payloadOffset, el.end));\n return { kind: \"integer\", text: normalizeIntText(text) };\n }\n case JB.FLOAT:\n case JB.FLOAT5: {\n const text = utf8Decode(blob.subarray(el.payloadOffset, el.end));\n return { kind: \"real\", text };\n }\n case JB.TEXT:\n case JB.TEXTJ:\n case JB.TEXT5:\n case JB.TEXTRAW: {\n const raw = utf8Decode(blob.subarray(el.payloadOffset, el.end));\n if (el.type === JB.TEXT || el.type === JB.TEXTRAW) return { kind: \"string\", value: raw };\n // TEXTJ / TEXT5 store escaped content without quotes \u2014 unescape lightly\n return { kind: \"string\", value: unescapeJsonPayload(raw) };\n }\n case JB.ARRAY: {\n const elements: JsonNode[] = [];\n let pos = el.payloadOffset;\n while (pos < el.end) {\n const child = readHeader(blob, pos);\n elements.push(decodeElement(blob, child));\n pos = child.end;\n }\n return { kind: \"array\", elements };\n }\n case JB.OBJECT: {\n const entries: Array<{ key: string; value: JsonNode }> = [];\n let pos = el.payloadOffset;\n while (pos < el.end) {\n const keyEl = readHeader(blob, pos);\n const keyNode = decodeElement(blob, keyEl);\n if (keyNode.kind !== \"string\") throw new JsonParseError(\"malformed JSON\", pos + 1);\n pos = keyEl.end;\n const valEl = readHeader(blob, pos);\n entries.push({ key: keyNode.value, value: decodeElement(blob, valEl) });\n pos = valEl.end;\n }\n return { kind: \"object\", entries };\n }\n default:\n throw new JsonParseError(\"malformed JSON\", el.offset + 1);\n }\n}\n\nfunction normalizeIntText(text: string): string {\n const n = Number(text);\n if (Number.isFinite(n) && Number.isInteger(n)) return String(Math.trunc(n));\n return text;\n}\n\nfunction unescapeJsonPayload(raw: string): string {\n // Payload may contain JSON escapes without surrounding quotes\n try {\n return JSON.parse(`\"${raw.replace(/\"/g, '\\\\\"')}\"`) as string;\n } catch {\n return raw;\n }\n}\n\n/** Walk JSONB and collect element metadata for TVF id/parent assignment. */\nexport interface JsonbWalkEntry {\n offset: number;\n parent: number | null;\n node: JsonNode;\n key: string | number | null;\n path: string;\n fullkey: string;\n /** For object entries, offset of the key header (used as id). */\n idOffset: number;\n}\n\nexport function walkJsonbTree(blob: Uint8Array): JsonbWalkEntry[] {\n const root = readHeader(blob, 0);\n const node = decodeElement(blob, root);\n const out: JsonbWalkEntry[] = [];\n walk(blob, root, node, null, \"$\", \"$\", null, out);\n return out;\n}\n\nfunction walk(\n blob: Uint8Array,\n el: JsonbElement,\n node: JsonNode,\n parentId: number | null,\n path: string,\n fullkey: string,\n key: string | number | null,\n out: JsonbWalkEntry[],\n idOffset = el.offset,\n): void {\n out.push({ offset: el.offset, parent: parentId, node, key, path, fullkey, idOffset });\n if (node.kind === \"array\") {\n let pos = el.payloadOffset;\n let index = 0;\n while (pos < el.end) {\n const child = readHeader(blob, pos);\n const childNode = decodeElement(blob, child);\n const childFull = `${fullkey}[${index}]`;\n walk(blob, child, childNode, idOffset, fullkey, childFull, index, out);\n pos = child.end;\n index++;\n }\n } else if (node.kind === \"object\") {\n let pos = el.payloadOffset;\n while (pos < el.end) {\n const keyEl = readHeader(blob, pos);\n const keyNode = decodeElement(blob, keyEl);\n if (keyNode.kind !== \"string\") throw new JsonParseError(\"malformed JSON\", pos + 1);\n pos = keyEl.end;\n const valEl = readHeader(blob, pos);\n const valNode = decodeElement(blob, valEl);\n const childFull = appendObjectKey(fullkey, keyNode.value);\n // Children of this entry use the entry's id (key offset), matching SQLite.\n walk(blob, valEl, valNode, idOffset, fullkey, childFull, keyNode.value, out, keyEl.offset);\n pos = valEl.end;\n }\n }\n}\n\nfunction appendObjectKey(base: string, key: string): string {\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) return `${base}.${key}`;\n return `${base}.\"${key.replace(/\"/g, '\\\\\"')}\"`;\n}\n\nexport function jsonbToText(blob: Uint8Array): string {\n return stringifyJson(decodeJsonb(blob));\n}\n\nexport function textToJsonb(text: string): Uint8Array {\n return encodeJsonb(parseJsonText(text));\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { JsonNode } from \"./types.ts\";\n\nexport type PathStep =\n | { kind: \"root\" }\n | { kind: \"key\"; key: string }\n | { kind: \"index\"; index: number }\n | { kind: \"append\" } // [#]\n | { kind: \"fromEnd\"; n: number }; // [#-n]\n\nexport function parseJsonPath(path: string): PathStep[] {\n if (path === \"\") throw new SqliteError(\"bad JSON path: ''\", \"other\");\n if (!path.startsWith(\"$\")) throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n const steps: PathStep[] = [{ kind: \"root\" }];\n let i = 1;\n while (i < path.length) {\n if (path[i] === \".\") {\n i++;\n if (i >= path.length) throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n if (path[i] === '\"') {\n i++;\n let key = \"\";\n while (i < path.length) {\n const ch = path[i]!;\n if (ch === '\"') {\n i++;\n break;\n }\n if (ch === \"\\\\\") {\n i++;\n if (i >= path.length) throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n key += path[i]!;\n i++;\n continue;\n }\n key += ch;\n i++;\n }\n steps.push({ kind: \"key\", key });\n continue;\n }\n let key = \"\";\n while (i < path.length && path[i] !== \".\" && path[i] !== \"[\") {\n key += path[i]!;\n i++;\n }\n if (!key) throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n steps.push({ kind: \"key\", key });\n continue;\n }\n if (path[i] === \"[\") {\n i++;\n if (path[i] === \"#\") {\n i++;\n if (path[i] === \"]\") {\n i++;\n steps.push({ kind: \"append\" });\n continue;\n }\n if (path[i] === \"-\") {\n i++;\n let digits = \"\";\n while (i < path.length && path[i]! >= \"0\" && path[i]! <= \"9\") {\n digits += path[i]!;\n i++;\n }\n if (!digits || path[i] !== \"]\") throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n i++;\n steps.push({ kind: \"fromEnd\", n: Number(digits) });\n continue;\n }\n throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n }\n let digits = \"\";\n while (i < path.length && path[i]! >= \"0\" && path[i]! <= \"9\") {\n digits += path[i]!;\n i++;\n }\n if (!digits || path[i] !== \"]\") throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n i++;\n steps.push({ kind: \"index\", index: Number(digits) });\n continue;\n }\n throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n }\n return steps;\n}\n\n/** Resolve path for read; returns undefined if missing. */\nexport function pathGet(root: JsonNode, steps: PathStep[]): JsonNode | undefined {\n let cur: JsonNode | undefined = root;\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!;\n if (step.kind === \"root\") continue;\n if (cur === undefined) return undefined;\n if (step.kind === \"key\") {\n if (cur.kind !== \"object\") return undefined;\n const entries = cur.entries;\n let next: JsonNode | undefined;\n for (let j = entries.length - 1; j >= 0; j--) {\n if (entries[j]!.key === step.key) {\n next = entries[j]!.value;\n break;\n }\n }\n cur = next;\n continue;\n }\n if (step.kind === \"append\") return undefined;\n if (cur.kind !== \"array\") return undefined;\n let index: number;\n if (step.kind === \"index\") index = step.index;\n else index = cur.elements.length - step.n;\n if (index < 0 || index >= cur.elements.length) return undefined;\n cur = cur.elements[index];\n }\n return cur;\n}\n\nexport interface PathParent {\n parent: JsonNode;\n step: PathStep;\n /** For object: entry index; for array: element index (may be length for append). */\n index: number;\n}\n\n/** Locate parent container for the final path step (for mutate). */\nexport function pathParent(root: JsonNode, steps: PathStep[]): PathParent | null {\n if (steps.length <= 1) return null;\n const parentSteps = steps.slice(0, -1);\n const parent = pathGet(root, parentSteps);\n if (!parent) return null;\n const step = steps[steps.length - 1]!;\n if (step.kind === \"root\") return null;\n if (step.kind === \"key\") {\n if (parent.kind !== \"object\") return null;\n const index = parent.entries.findIndex((e) => e.key === step.key);\n return { parent, step, index };\n }\n if (parent.kind !== \"array\") return null;\n if (step.kind === \"append\") return { parent, step, index: parent.elements.length };\n if (step.kind === \"index\") return { parent, step, index: step.index };\n return { parent, step, index: parent.elements.length - step.n };\n}\n", "/** Internal JSON value tree used by sqlite-mem JSON1/JSONB. */\n\nexport type JsonNode =\n | { kind: \"null\" }\n | { kind: \"true\" }\n | { kind: \"false\" }\n | { kind: \"integer\"; text: string }\n | { kind: \"real\"; text: string }\n | { kind: \"string\"; value: string }\n | { kind: \"array\"; elements: JsonNode[] }\n | { kind: \"object\"; entries: Array<{ key: string; value: JsonNode }> };\n\nexport type JsonTypeName = \"null\" | \"true\" | \"false\" | \"integer\" | \"real\" | \"text\" | \"array\" | \"object\";\n\nexport function jsonTypeName(node: JsonNode): JsonTypeName {\n switch (node.kind) {\n case \"null\":\n return \"null\";\n case \"true\":\n return \"true\";\n case \"false\":\n return \"false\";\n case \"integer\":\n return \"integer\";\n case \"real\":\n return \"real\";\n case \"string\":\n return \"text\";\n case \"array\":\n return \"array\";\n case \"object\":\n return \"object\";\n }\n}\n\nexport function cloneJson(node: JsonNode): JsonNode {\n switch (node.kind) {\n case \"array\":\n return { kind: \"array\", elements: node.elements.map(cloneJson) };\n case \"object\":\n return {\n kind: \"object\",\n entries: node.entries.map((e) => ({ key: e.key, value: cloneJson(e.value) })),\n };\n case \"integer\":\n case \"real\":\n return { kind: node.kind, text: node.text };\n case \"string\":\n return { kind: \"string\", value: node.value };\n default:\n return { kind: node.kind };\n }\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { asSqlJsonText, asSqlReal, isSqlJsonText, SqlJsonText, type SqlValue, utf8Decode } from \"../types/value.ts\";\nimport { decodeJsonb, encodeJsonb, looksLikeJsonb } from \"./jsonb.ts\";\nimport { JsonParseError, parseJsonText } from \"./parse.ts\";\nimport { type PathStep, parseJsonPath, pathGet, pathParent } from \"./path.ts\";\nimport { stringifyJson } from \"./stringify.ts\";\nimport { cloneJson, type JsonNode } from \"./types.ts\";\n\nexport function sqlToJsonInput(value: SqlValue): JsonNode {\n if (value === null) return { kind: \"null\" };\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) return { kind: \"null\" };\n if (Number.isInteger(value)) return { kind: \"integer\", text: String(value) };\n return { kind: \"real\", text: String(value) };\n }\n if (typeof value === \"bigint\") return { kind: \"integer\", text: value.toString() };\n if (value instanceof SqlJsonText) return parseJsonText(value.value);\n if (typeof value === \"string\") return parseJsonText(value);\n if (value instanceof Uint8Array) {\n if (looksLikeJsonb(value)) return decodeJsonb(value);\n // Legacy blob-as-text JSON bug compatibility\n return parseJsonText(utf8Decode(value));\n }\n // SqlReal\n if (typeof value === \"object\" && value !== null && \"value\" in value) {\n const n = (value as { value: number }).value;\n if (!Number.isFinite(n)) return { kind: \"null\" };\n return { kind: \"real\", text: String(n) };\n }\n throw new SqliteError(\"malformed JSON\", \"other\");\n}\n\nexport function trySqlToJsonInput(value: SqlValue): JsonNode | null {\n try {\n return sqlToJsonInput(value);\n } catch {\n return null;\n }\n}\n\n/** VALUE arg for insert/set/array/object \u2014 literal unless JSON subtype / JSONB. */\nexport function sqlValueToJsonNode(value: SqlValue): JsonNode {\n if (value === null) return { kind: \"null\" };\n if (isSqlJsonText(value)) return parseJsonText(value.value);\n if (value instanceof Uint8Array && looksLikeJsonb(value)) return decodeJsonb(value);\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) return { kind: \"null\" };\n if (Number.isInteger(value)) return { kind: \"integer\", text: String(value) };\n return { kind: \"real\", text: String(value) };\n }\n if (typeof value === \"bigint\") return { kind: \"integer\", text: value.toString() };\n if (typeof value === \"object\" && value !== null && !(value instanceof Uint8Array) && \"value\" in value) {\n const n = (value as { value: number }).value;\n return { kind: \"real\", text: String(n) };\n }\n if (value instanceof Uint8Array) {\n throw new SqliteError(\"JSON cannot hold BLOB values\", \"other\");\n }\n // plain text / string \u2192 JSON string\n return { kind: \"string\", value: String(value) };\n}\n\nexport function jsonNodeToSql(node: JsonNode, mode: \"sql\" | \"json\" | \"jsonb\"): SqlValue {\n if (mode === \"jsonb\") return encodeJsonb(node);\n if (mode === \"json\") return asSqlJsonText(stringifyJson(node));\n // sql representation (json_extract single path / ->>)\n switch (node.kind) {\n case \"null\":\n return null;\n case \"true\":\n return 1;\n case \"false\":\n return 0;\n case \"integer\": {\n const n = Number(node.text);\n if (Number.isSafeInteger(n)) return n;\n try {\n return BigInt(node.text);\n } catch {\n return n;\n }\n }\n case \"real\": {\n const n = Number(node.text);\n return Number.isInteger(n) ? asSqlReal(n) : n;\n }\n case \"string\":\n return node.value;\n case \"array\":\n case \"object\":\n // ->> / sql mode: plain TEXT without JSON subtype so nested json_* quote it.\n if (mode === \"sql\") return stringifyJson(node);\n return asSqlJsonText(stringifyJson(node));\n }\n}\n\nexport function jsonArrowPath(right: SqlValue): string {\n if (right === null) throw new SqliteError(\"JSON path error\", \"other\");\n if (typeof right === \"number\" || typeof right === \"bigint\") {\n const n = typeof right === \"bigint\" ? Number(right) : Math.trunc(right);\n if (n < 0) return `$[#${n}]`; // -K \u2192 [#-K] via `[#-K]` \u2014 n is already negative\n return `$[${n}]`;\n }\n const text = isSqlJsonText(right) ? right.value : String(right);\n if (text.startsWith(\"$\")) return text;\n if (/^-?\\d+$/.test(text)) {\n const n = Number(text);\n if (n < 0) return `$[#${n}]`;\n return `$[${n}]`;\n }\n return `$.${text}`;\n}\n\nexport function extractOne(root: JsonNode, path: string): JsonNode | undefined {\n return pathGet(root, parseJsonPath(path));\n}\n\nexport type MutateMode = \"insert\" | \"replace\" | \"set\";\n\n/**\n * json_array_insert / jsonb_array_insert \u2014 like json_replace, but PATH must end\n * with an array index and the value is spliced in (existing elements shift right).\n * https://www.sqlite.org/json1.html#jarrins\n */\nexport function arrayInsertJson(root: JsonNode, path: string, value: JsonNode): JsonNode {\n const steps = parseJsonPath(path);\n const last = steps[steps.length - 1];\n if (!last || last.kind === \"root\" || last.kind === \"key\") {\n throw new SqliteError(\"JSON path error\", \"other\");\n }\n const result = cloneJson(root);\n const parentInfo = pathParent(result, steps);\n if (parentInfo?.parent.kind !== \"array\") return result;\n const parent = parentInfo.parent;\n let idx = parentInfo.index;\n if (last.kind === \"fromEnd\") idx = parent.elements.length - last.n;\n if (last.kind === \"append\") idx = parent.elements.length;\n if (idx < 0 || idx > parent.elements.length) return result;\n parent.elements.splice(idx, 0, cloneJson(value));\n return result;\n}\n\nexport function mutateJson(root: JsonNode, path: string, value: JsonNode, mode: MutateMode): JsonNode {\n const steps = parseJsonPath(path);\n if (steps.length <= 1) {\n // path is $\n if (mode === \"insert\") return root;\n return cloneJson(value);\n }\n const result = cloneJson(root);\n if (!applyMutate(result, steps, value, mode)) {\n createPathAndSet(result, steps, value, mode);\n }\n return result;\n}\n\nfunction applyMutate(root: JsonNode, steps: PathStep[], value: JsonNode, mode: MutateMode): boolean {\n const parentInfo = pathParent(root, steps);\n if (!parentInfo) return false;\n const { parent, step, index } = parentInfo;\n if (step.kind === \"key\") {\n if (parent.kind !== \"object\") return false;\n if (index >= 0) {\n if (mode === \"insert\") return false;\n parent.entries[index] = { key: step.key, value: cloneJson(value) };\n return true;\n }\n if (mode === \"replace\") return false;\n parent.entries.push({ key: step.key, value: cloneJson(value) });\n return true;\n }\n if (parent.kind !== \"array\") return false;\n if (step.kind === \"append\") {\n if (mode === \"replace\") return false;\n parent.elements.push(cloneJson(value));\n return true;\n }\n let idx = index;\n if (step.kind === \"fromEnd\") idx = parent.elements.length - step.n;\n if (idx < 0 || idx > parent.elements.length) return false;\n if (idx === parent.elements.length) {\n if (mode === \"replace\") return false;\n parent.elements.push(cloneJson(value));\n return true;\n }\n if (mode === \"insert\") return false;\n parent.elements[idx] = cloneJson(value);\n return true;\n}\n\nfunction createPathAndSet(root: JsonNode, steps: PathStep[], value: JsonNode, mode: MutateMode): boolean {\n // Walk creating missing object keys / refusing missing array slots (SQLite behavior)\n let cur = root;\n for (let i = 1; i < steps.length - 1; i++) {\n const step = steps[i]!;\n const next = steps[i + 1]!;\n if (step.kind === \"key\") {\n if (cur.kind !== \"object\") return false;\n let entry = cur.entries.find((e) => e.key === step.key);\n if (!entry) {\n if (mode === \"replace\") return false;\n const child: JsonNode =\n next.kind === \"key\" || next.kind === \"root\"\n ? { kind: \"object\", entries: [] }\n : { kind: \"array\", elements: [] };\n entry = { key: step.key, value: child };\n cur.entries.push(entry);\n }\n cur = entry.value;\n continue;\n }\n if (cur.kind !== \"array\") return false;\n let idx = step.kind === \"index\" ? step.index : step.kind === \"fromEnd\" ? cur.elements.length - step.n : -1;\n if (step.kind === \"append\") idx = cur.elements.length;\n if (idx < 0 || idx > cur.elements.length) return false;\n if (idx === cur.elements.length) {\n if (mode === \"replace\") return false;\n const child: JsonNode = next.kind === \"key\" ? { kind: \"object\", entries: [] } : { kind: \"array\", elements: [] };\n cur.elements.push(child);\n }\n cur = cur.elements[idx]!;\n }\n return applyMutate(root, steps, value, mode);\n}\n\nexport function removeJson(root: JsonNode, path: string): JsonNode {\n const steps = parseJsonPath(path);\n if (steps.length <= 1) return root;\n const result = cloneJson(root);\n const parentInfo = pathParent(result, steps);\n if (!parentInfo) return result;\n const { parent, step, index } = parentInfo;\n if (step.kind === \"key\" && parent.kind === \"object\" && index >= 0) {\n parent.entries.splice(index, 1);\n } else if (parent.kind === \"array\") {\n let idx = index;\n if (step.kind === \"fromEnd\") idx = parent.elements.length - step.n;\n if (step.kind === \"append\") return result;\n if (idx >= 0 && idx < parent.elements.length) parent.elements.splice(idx, 1);\n }\n return result;\n}\n\n/** RFC7396-ish JSON Merge Patch as implemented by SQLite json_patch. */\nexport function patchJson(target: JsonNode, patch: JsonNode): JsonNode {\n if (patch.kind !== \"object\") return cloneJson(patch);\n const base = target.kind === \"object\" ? cloneJson(target) : ({ kind: \"object\", entries: [] } as JsonNode);\n if (base.kind !== \"object\") return cloneJson(patch);\n for (const entry of patch.entries) {\n if (entry.value.kind === \"null\") {\n base.entries = base.entries.filter((e) => e.key !== entry.key);\n continue;\n }\n const existing = base.entries.find((e) => e.key === entry.key);\n if (existing) {\n existing.value = patchJson(existing.value, entry.value);\n } else {\n base.entries.push({ key: entry.key, value: cloneJson(entry.value) });\n }\n }\n return base;\n}\n\nexport function wrapJsonError(e: unknown): never {\n if (e instanceof SqliteError) throw e;\n if (e instanceof JsonParseError) throw new SqliteError(\"malformed JSON\", \"other\");\n throw new SqliteError(\"malformed JSON\", \"other\");\n}\n\nexport function ensureJson(value: SqlValue): JsonNode {\n try {\n return sqlToJsonInput(value);\n } catch (e) {\n wrapJsonError(e);\n }\n}\n\nexport function toJsonbBlob(value: SqlValue): Uint8Array {\n if (value instanceof Uint8Array && looksLikeJsonb(value)) return value;\n return encodeJsonb(ensureJson(value));\n}\n\nexport function toJsonText(value: SqlValue): SqlJsonText {\n return asSqlJsonText(stringifyJson(ensureJson(value)));\n}\n", "import type { SqlValue } from \"../types/value.ts\";\nimport { encodeJsonb, type JsonbWalkEntry, walkJsonbTree } from \"./jsonb.ts\";\nimport { ensureJson, jsonNodeToSql } from \"./ops.ts\";\nimport { stringifyJson } from \"./stringify.ts\";\nimport { type JsonNode, jsonTypeName } from \"./types.ts\";\n\nexport interface JsonTvfRow {\n key: SqlValue;\n value: SqlValue;\n type: string;\n atom: SqlValue;\n id: number;\n parent: SqlValue;\n fullkey: string;\n path: string;\n}\n\nfunction atomOf(node: JsonNode): SqlValue {\n switch (node.kind) {\n case \"null\":\n return null;\n case \"true\":\n return 1;\n case \"false\":\n return 0;\n case \"integer\":\n case \"real\":\n case \"string\":\n return jsonNodeToSql(node, \"sql\");\n default:\n return null;\n }\n}\n\nfunction valueOf(node: JsonNode): SqlValue {\n if (node.kind === \"array\" || node.kind === \"object\") return stringifyJson(node);\n return jsonNodeToSql(node, \"sql\");\n}\n\nexport function jsonEachRows(json: SqlValue, path?: SqlValue): JsonTvfRow[] {\n // SQL NULL \u2192 zero rows (distinct from JSON null, which yields one atom row).\n if (json === null) return [];\n const root = ensureJson(json);\n const blob = encodeJsonb(root);\n const walk = walkJsonbTree(blob);\n const rootEntry = walk[0];\n if (!rootEntry) return [];\n\n let focus = rootEntry;\n if (path !== undefined && path !== null) {\n const targetPath = String(path);\n const found = walk.find((e) => e.fullkey === targetPath);\n if (!found) return [];\n focus = found;\n }\n\n if (focus.node.kind !== \"array\" && focus.node.kind !== \"object\") {\n return [\n {\n key: focus.key,\n value: valueOf(focus.node),\n type: jsonTypeName(focus.node),\n atom: atomOf(focus.node),\n id: focus.idOffset,\n parent: null,\n fullkey: focus.fullkey,\n path: focus.path,\n },\n ];\n }\n\n return walk.filter((e) => e.parent === focus.idOffset).map((e) => rowFromWalk(e, true));\n}\n\nexport function jsonTreeRows(json: SqlValue, path?: SqlValue): JsonTvfRow[] {\n if (json === null) return [];\n const root = ensureJson(json);\n const blob = encodeJsonb(root);\n const walk = walkJsonbTree(blob);\n\n if (path === undefined || path === null) {\n return walk.map((e) => rowFromWalk(e, false));\n }\n\n const targetPath = String(path);\n // Keep IDs from the full document; return the subtree rooted at targetPath.\n const rootEntry = walk.find((e) => e.fullkey === targetPath);\n if (!rootEntry) return [];\n const subtree = walk.filter(\n (e) => e.fullkey === targetPath || e.fullkey.startsWith(targetPath + \".\") || e.fullkey.startsWith(targetPath + \"[\"),\n );\n return subtree.map((e) => {\n const row = rowFromWalk(e, false);\n if (e.idOffset === rootEntry.idOffset) {\n row.parent = null;\n }\n return row;\n });\n}\n\nfunction rowFromWalk(e: JsonbWalkEntry, eachMode: boolean): JsonTvfRow {\n return {\n key: e.key,\n value: valueOf(e.node),\n type: jsonTypeName(e.node),\n atom: atomOf(e.node),\n id: e.idOffset,\n parent: eachMode ? null : e.parent,\n fullkey: e.fullkey,\n path: e.path,\n };\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport {\n arrayInsertJson,\n ensureJson,\n extractOne,\n isValidJsonText,\n jsonArrowPath,\n jsonErrorPosition,\n jsonNodeToSql,\n mutateJson,\n patchJson,\n prettyJson,\n removeJson,\n sqlValueToJsonNode,\n stringifyJson,\n toJsonbBlob,\n toJsonText,\n wrapJsonError,\n} from \"../json/index.ts\";\nimport { decodeJsonb, looksLikeJsonb } from \"../json/jsonb.ts\";\nimport { jsonTypeName } from \"../json/types.ts\";\nimport { asSqlJsonText, isSqlJsonText, type SqlValue, subtypeOf, utf8Decode } from \"../types/value.ts\";\nimport type { AggregateAccumulator, AggregateFactory } from \"./aggregate.ts\";\nimport type { ScalarFunction } from \"./registry.ts\";\n\nfunction textOf(value: SqlValue): string {\n if (value instanceof Uint8Array) return utf8Decode(value);\n if (isSqlJsonText(value)) return value.value;\n return String(value);\n}\n\nfunction _requireOdd(name: string, args: SqlValue[]): void {\n if (args.length % 2 === 0) {\n throw new SqliteError(`json_${name}() requires an odd number of arguments`, \"misuse\");\n }\n}\n\nfunction arrayInsertArgs(args: SqlValue[], asJsonb: boolean): SqlValue {\n if (args.length === 0) {\n throw new SqliteError(\"wrong number of arguments to function json_array_insert()\", \"misuse\");\n }\n if (args.length % 2 === 0) {\n throw new SqliteError(\"json_array_insert() requires an odd number of arguments\", \"misuse\");\n }\n if (args.some((arg) => arg === null)) return null;\n try {\n let node = ensureJson(args[0]!);\n for (let i = 1; i < args.length; i += 2) {\n const path = textOf(args[i]!);\n const value = sqlValueToJsonNode(args[i + 1]!);\n node = arrayInsertJson(node, path, value);\n }\n return asJsonb ? jsonNodeToSql(node, \"jsonb\") : jsonNodeToSql(node, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n}\n\nfunction mutateArgs(args: SqlValue[], mode: \"insert\" | \"replace\" | \"set\", asJsonb: boolean): SqlValue {\n if (args.length === 0) throw new SqliteError(`wrong number of arguments to function json_${mode}()`, \"misuse\");\n if (args.length % 2 === 0) {\n throw new SqliteError(`json_${mode}() requires an odd number of arguments`, \"misuse\");\n }\n try {\n let node = ensureJson(args[0]!);\n for (let i = 1; i < args.length; i += 2) {\n const path = textOf(args[i]!);\n const value = sqlValueToJsonNode(args[i + 1]!);\n node = mutateJson(node, path, value, mode);\n }\n return asJsonb ? jsonNodeToSql(node, \"jsonb\") : jsonNodeToSql(node, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n}\n\nfunction extract(args: SqlValue[], asJsonb: boolean): SqlValue {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function json_extract()\", \"misuse\");\n try {\n const root = ensureJson(args[0]!);\n if (args.length === 2) {\n const found = extractOne(root, textOf(args[1]!));\n if (found === undefined) return null;\n if (asJsonb && (found.kind === \"array\" || found.kind === \"object\")) {\n return jsonNodeToSql(found, \"jsonb\");\n }\n if (found.kind === \"array\" || found.kind === \"object\") return jsonNodeToSql(found, \"json\");\n return jsonNodeToSql(found, \"sql\");\n }\n const parts = args.slice(1).map((p) => {\n const found = extractOne(root, textOf(p!));\n return found === undefined ? { kind: \"null\" as const } : found;\n });\n const arr = { kind: \"array\" as const, elements: parts };\n return asJsonb ? jsonNodeToSql(arr, \"jsonb\") : jsonNodeToSql(arr, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n}\n\nexport function jsonArrow(left: SqlValue, right: SqlValue, mode: \"->\" | \"->>\"): SqlValue {\n if (left === null || right === null) return null;\n try {\n const root = ensureJson(left);\n const path = jsonArrowPath(right);\n const found = extractOne(root, path);\n if (found === undefined) return null;\n if (mode === \"->\") return asSqlJsonText(stringifyJson(found));\n return jsonNodeToSql(found, \"sql\");\n } catch (e) {\n // -> on malformed JSON errors\n wrapJsonError(e);\n }\n}\n\nexport const jsonScalarFunctions: Readonly<Record<string, ScalarFunction>> = {\n json(args) {\n if (args.length !== 1) throw new SqliteError(\"wrong number of arguments to function json()\", \"misuse\");\n if (args[0] === null) return null;\n return toJsonText(args[0]!);\n },\n jsonb(args) {\n if (args.length !== 1) throw new SqliteError(\"wrong number of arguments to function jsonb()\", \"misuse\");\n if (args[0] === null) return null;\n return toJsonbBlob(args[0]!);\n },\n json_array(args) {\n try {\n const elements = args.map((a) => sqlValueToJsonNode(a));\n return jsonNodeToSql({ kind: \"array\", elements }, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n jsonb_array(args) {\n try {\n const elements = args.map((a) => sqlValueToJsonNode(a));\n return jsonNodeToSql({ kind: \"array\", elements }, \"jsonb\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_object(args) {\n if (args.length % 2 !== 0) {\n throw new SqliteError(\"json_object() requires an even number of arguments\", \"misuse\");\n }\n try {\n const entries: Array<{ key: string; value: import(\"../json/types.ts\").JsonNode }> = [];\n for (let i = 0; i < args.length; i += 2) {\n if (args[i] === null) throw new SqliteError(\"json_object() labels must be TEXT\", \"other\");\n if (args[i] instanceof Uint8Array) throw new SqliteError(\"JSON cannot hold BLOB values\", \"other\");\n const key = textOf(args[i]!);\n entries.push({ key, value: sqlValueToJsonNode(args[i + 1]!) });\n }\n return jsonNodeToSql({ kind: \"object\", entries }, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n jsonb_object(args) {\n if (args.length % 2 !== 0) {\n throw new SqliteError(\"json_object() requires an even number of arguments\", \"misuse\");\n }\n try {\n const entries: Array<{ key: string; value: import(\"../json/types.ts\").JsonNode }> = [];\n for (let i = 0; i < args.length; i += 2) {\n if (args[i] === null) throw new SqliteError(\"json_object() labels must be TEXT\", \"other\");\n if (args[i] instanceof Uint8Array) throw new SqliteError(\"JSON cannot hold BLOB values\", \"other\");\n const key = textOf(args[i]!);\n entries.push({ key, value: sqlValueToJsonNode(args[i + 1]!) });\n }\n return jsonNodeToSql({ kind: \"object\", entries }, \"jsonb\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_quote(args) {\n if (args.length !== 1) throw new SqliteError(\"wrong number of arguments to function json_quote()\", \"misuse\");\n const v = args[0] ?? null;\n if (v === null) return asSqlJsonText(\"null\");\n if (isSqlJsonText(v)) return v;\n if (v instanceof Uint8Array && looksLikeJsonb(v)) return asSqlJsonText(stringifyJson(decodeJsonb(v)));\n try {\n return asSqlJsonText(stringifyJson(sqlValueToJsonNode(v)));\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_extract(args) {\n return extract(args, false);\n },\n jsonb_extract(args) {\n return extract(args, true);\n },\n json_insert(args) {\n return mutateArgs(args, \"insert\", false);\n },\n jsonb_insert(args) {\n return mutateArgs(args, \"insert\", true);\n },\n json_array_insert(args) {\n return arrayInsertArgs(args, false);\n },\n jsonb_array_insert(args) {\n return arrayInsertArgs(args, true);\n },\n json_replace(args) {\n return mutateArgs(args, \"replace\", false);\n },\n jsonb_replace(args) {\n return mutateArgs(args, \"replace\", true);\n },\n json_set(args) {\n return mutateArgs(args, \"set\", false);\n },\n jsonb_set(args) {\n return mutateArgs(args, \"set\", true);\n },\n json_remove(args) {\n if (args.length < 1) throw new SqliteError(\"wrong number of arguments to function json_remove()\", \"misuse\");\n try {\n let node = ensureJson(args[0]!);\n for (let i = 1; i < args.length; i++) {\n node = removeJson(node, textOf(args[i]!));\n }\n return jsonNodeToSql(node, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n jsonb_remove(args) {\n if (args.length < 1) throw new SqliteError(\"wrong number of arguments to function jsonb_remove()\", \"misuse\");\n try {\n let node = ensureJson(args[0]!);\n for (let i = 1; i < args.length; i++) {\n node = removeJson(node, textOf(args[i]!));\n }\n return jsonNodeToSql(node, \"jsonb\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_patch(args) {\n if (args.length !== 2) throw new SqliteError(\"wrong number of arguments to function json_patch()\", \"misuse\");\n try {\n return jsonNodeToSql(patchJson(ensureJson(args[0]!), ensureJson(args[1]!)), \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n jsonb_patch(args) {\n if (args.length !== 2) throw new SqliteError(\"wrong number of arguments to function jsonb_patch()\", \"misuse\");\n try {\n return jsonNodeToSql(patchJson(ensureJson(args[0]!), ensureJson(args[1]!)), \"jsonb\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_type(args) {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_type()\", \"misuse\");\n }\n if (args[0] === null) return null;\n try {\n let node = ensureJson(args[0]!);\n if (args.length === 2) {\n if (args[1] === null) return null;\n const found = extractOne(node, textOf(args[1]!));\n if (!found) return null;\n node = found;\n }\n return jsonTypeName(node);\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_valid(args) {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_valid()\", \"misuse\");\n }\n if (args[0] === null) return 0;\n const flags = args.length === 2 && args[1] !== null ? Number(args[1]) : 0;\n if (args[0] instanceof Uint8Array) {\n return looksLikeJsonb(args[0]) ? 1 : 0;\n }\n return isValidJsonText(textOf(args[0]!), flags) ? 1 : 0;\n },\n json_error_position(args) {\n if (args.length !== 1) {\n throw new SqliteError(\"wrong number of arguments to function json_error_position()\", \"misuse\");\n }\n if (args[0] === null) return 0;\n if (args[0] instanceof Uint8Array) {\n return looksLikeJsonb(args[0]) ? 0 : 1;\n }\n return jsonErrorPosition(textOf(args[0]!));\n },\n json_array_length(args) {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_array_length()\", \"misuse\");\n }\n if (args[0] === null) return null;\n try {\n let node = ensureJson(args[0]!);\n if (args.length === 2) {\n if (args[1] === null) return null;\n const found = extractOne(node, textOf(args[1]!));\n if (!found) return null;\n node = found;\n }\n if (node.kind !== \"array\") return 0;\n return node.elements.length;\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_pretty(args) {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_pretty()\", \"misuse\");\n }\n if (args[0] === null) return null;\n try {\n const node = ensureJson(args[0]!);\n const indent = args.length === 2 && args[1] !== null ? textOf(args[1]!) : \" \";\n return asSqlJsonText(prettyJson(node, indent));\n } catch (e) {\n wrapJsonError(e);\n }\n },\n subtype(args) {\n if (args.length !== 1) throw new SqliteError(\"wrong number of arguments to function subtype()\", \"misuse\");\n return subtypeOf(args[0] ?? null);\n },\n};\n\nclass JsonGroupArrayAccumulator implements AggregateAccumulator {\n private readonly values: import(\"../json/types.ts\").JsonNode[] = [];\n constructor(private readonly asJsonb: boolean) {}\n step(args: SqlValue[]): void {\n if (args[0] === undefined) return;\n // NULLs are included as JSON null in json_group_array\n this.values.push(sqlValueToJsonNode(args[0]!));\n }\n finalize(): SqlValue {\n const node = { kind: \"array\" as const, elements: this.values };\n return this.asJsonb ? jsonNodeToSql(node, \"jsonb\") : jsonNodeToSql(node, \"json\");\n }\n}\n\nclass JsonGroupObjectAccumulator implements AggregateAccumulator {\n private readonly entries: Array<{ key: string; value: import(\"../json/types.ts\").JsonNode }> = [];\n constructor(private readonly asJsonb: boolean) {}\n step(args: SqlValue[]): void {\n if (args[0] === null || args[0] === undefined) return;\n const key = textOf(args[0]!);\n this.entries.push({ key, value: sqlValueToJsonNode(args[1] ?? null) });\n }\n finalize(): SqlValue {\n const node = { kind: \"object\" as const, entries: this.entries };\n return this.asJsonb ? jsonNodeToSql(node, \"jsonb\") : jsonNodeToSql(node, \"json\");\n }\n}\n\nexport const jsonAggregateFunctions: Readonly<Record<string, AggregateFactory>> = {\n json_group_array: () => new JsonGroupArrayAccumulator(false),\n jsonb_group_array: () => new JsonGroupArrayAccumulator(true),\n json_group_object: () => new JsonGroupObjectAccumulator(false),\n jsonb_group_object: () => new JsonGroupObjectAccumulator(true),\n};\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { asSqlReal, coerceToNumber, type SqlValue } from \"../types/value.ts\";\nimport type { FunctionContext, ScalarFunction } from \"./registry.ts\";\n\nfunction requireArgs(name: string, args: SqlValue[], min: number, max = min): void {\n if (args.length < min || args.length > max) {\n throw new SqliteError(`wrong number of arguments to function ${name}()`, \"misuse\");\n }\n}\n\nfunction num(value: SqlValue): number | null {\n if (value === null) return null;\n return coerceToNumber(value);\n}\n\nfunction realOrNull(value: number | null): SqlValue {\n if (value === null || Number.isNaN(value)) return null;\n return asSqlReal(value);\n}\n\nfunction unaryMath(name: string, fn: (n: number) => number): ScalarFunction {\n return (args) => {\n requireArgs(name, args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n return realOrNull(fn(n));\n };\n}\n\n/** IEEE754 helpers matching SQLite ENABLE_MATH_FUNCTIONS / ieee754 extension. */\nfunction decodeIeee754(value: number): { mantissa: bigint; exponent: number } {\n const buf = new ArrayBuffer(8);\n new DataView(buf).setFloat64(0, value, false);\n const bits = new DataView(buf).getBigUint64(0, false);\n const sign = bits >> 63n;\n const expBits = Number((bits >> 52n) & 0x7ffn);\n const frac = bits & 0xfffffffffffffn;\n if (expBits === 0) {\n // subnormal or zero\n let m = frac;\n let e = -1074;\n if (m === 0n) return { mantissa: sign === 0n ? 0n : -0n, exponent: 0 };\n while ((m & 1n) === 0n) {\n m >>= 1n;\n e++;\n }\n return { mantissa: sign ? -m : m, exponent: e };\n }\n if (expBits === 0x7ff) {\n // Inf/NaN \u2014 SQLite still formats; use mantissa with high bit\n const m = (1n << 52n) | frac;\n return { mantissa: sign ? -m : m, exponent: 972 };\n }\n let m = (1n << 52n) | frac;\n let e = expBits - 1075;\n while ((m & 1n) === 0n) {\n m >>= 1n;\n e++;\n }\n return { mantissa: sign ? -m : m, exponent: e };\n}\n\nfunction encodeIeee754(mantissa: bigint, exponent: number): number {\n if (mantissa === 0n) return 0;\n const sign = mantissa < 0n ? -1 : 1;\n let m = mantissa < 0n ? -mantissa : mantissa;\n let e = exponent;\n while (m > 0n && (m & 1n) === 0n) {\n m >>= 1n;\n e++;\n }\n // Reconstruct via Math: value = m * 2^e\n return sign * Number(m) * 2 ** e;\n}\n\nexport const mathFunctions: Readonly<Record<string, ScalarFunction>> = {\n acos: unaryMath(\"acos\", Math.acos),\n acosh: unaryMath(\"acosh\", Math.acosh),\n asin: unaryMath(\"asin\", Math.asin),\n asinh: unaryMath(\"asinh\", Math.asinh),\n atan: unaryMath(\"atan\", Math.atan),\n atanh: unaryMath(\"atanh\", Math.atanh),\n ceil: unaryMath(\"ceil\", Math.ceil),\n ceiling: unaryMath(\"ceiling\", Math.ceil),\n cos: unaryMath(\"cos\", Math.cos),\n cosh: unaryMath(\"cosh\", Math.cosh),\n degrees: unaryMath(\"degrees\", (n) => (n * 180) / Math.PI),\n exp: unaryMath(\"exp\", Math.exp),\n floor: unaryMath(\"floor\", Math.floor),\n ln: unaryMath(\"ln\", Math.log),\n log10: unaryMath(\"log10\", Math.log10),\n log2: unaryMath(\"log2\", Math.log2),\n pi(args) {\n requireArgs(\"pi\", args, 0);\n return asSqlReal(Math.PI);\n },\n radians: unaryMath(\"radians\", (n) => (n * Math.PI) / 180),\n sign(args) {\n requireArgs(\"sign\", args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n if (n > 0) return 1;\n if (n < 0) return -1;\n return 0;\n },\n sin: unaryMath(\"sin\", Math.sin),\n sinh: unaryMath(\"sinh\", Math.sinh),\n sqrt: unaryMath(\"sqrt\", Math.sqrt),\n tan: unaryMath(\"tan\", Math.tan),\n tanh: unaryMath(\"tanh\", Math.tanh),\n trunc: unaryMath(\"trunc\", Math.trunc),\n atan2(args) {\n requireArgs(\"atan2\", args, 2);\n const y = num(args[0]!);\n const x = num(args[1]!);\n if (y === null || x === null) return null;\n return realOrNull(Math.atan2(y, x));\n },\n log(args) {\n requireArgs(\"log\", args, 1, 2);\n if (args.length === 1) {\n const n = num(args[0]!);\n if (n === null) return null;\n return realOrNull(Math.log10(n));\n }\n const base = num(args[0]!);\n const n = num(args[1]!);\n if (base === null || n === null) return null;\n return realOrNull(Math.log(n) / Math.log(base));\n },\n mod(args) {\n requireArgs(\"mod\", args, 2);\n const a = num(args[0]!);\n const b = num(args[1]!);\n if (a === null || b === null) return null;\n if (b === 0) return null;\n return realOrNull(a % b);\n },\n pow(args) {\n requireArgs(\"pow\", args, 2);\n const a = num(args[0]!);\n const b = num(args[1]!);\n if (a === null || b === null) return null;\n return realOrNull(a ** b);\n },\n power(args, ctx) {\n return mathFunctions.pow!(args, ctx);\n },\n ieee754(args) {\n requireArgs(\"ieee754\", args, 1, 2);\n if (args.length === 1) {\n const n = num(args[0]!);\n if (n === null) return null;\n const { mantissa, exponent } = decodeIeee754(n);\n return `ieee754(${mantissa},${exponent})`;\n }\n const m = args[0]!;\n const e = args[1]!;\n if (m === null || e === null) return null;\n const mantissa = typeof m === \"bigint\" ? m : BigInt(Math.trunc(num(m)!));\n const exponent = Math.trunc(num(e)!);\n return realOrNull(encodeIeee754(mantissa, exponent));\n },\n ieee754_mantissa(args) {\n requireArgs(\"ieee754_mantissa\", args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n return decodeIeee754(n).mantissa;\n },\n ieee754_exponent(args) {\n requireArgs(\"ieee754_exponent\", args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n return decodeIeee754(n).exponent;\n },\n ieee754_to_blob(args) {\n requireArgs(\"ieee754_to_blob\", args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n const buf = new ArrayBuffer(8);\n new DataView(buf).setFloat64(0, n, false);\n return new Uint8Array(buf);\n },\n ieee754_from_blob(args) {\n requireArgs(\"ieee754_from_blob\", args, 1);\n const value = args[0];\n if (value === null) return null;\n if (!(value instanceof Uint8Array) || value.length !== 8) {\n throw new SqliteError(\"ieee754_from_blob() requires an 8-byte blob\", \"misuse\");\n }\n const view = new DataView(value.buffer, value.byteOffset, value.byteLength);\n return realOrNull(view.getFloat64(0, false));\n },\n ieee754_inc(args) {\n requireArgs(\"ieee754_inc\", args, 2);\n const n = num(args[0]!);\n const delta = num(args[1]!);\n if (n === null || delta === null) return null;\n const buf = new ArrayBuffer(8);\n const view = new DataView(buf);\n view.setFloat64(0, n, false);\n let bits = view.getBigUint64(0, false);\n const step = BigInt(Math.trunc(delta));\n bits = (bits + step) & 0xffffffffffffffffn;\n view.setBigUint64(0, bits, false);\n return realOrNull(view.getFloat64(0, false));\n },\n};\n\n// silence unused\nvoid (null as unknown as FunctionContext);\n", "import { SqliteError } from \"../errors/index.ts\";\n\nfunction escapeRegexChar(char: string): string {\n return /[\\\\^$.*+?()[\\]{}|]/.test(char) ? `\\\\${char}` : char;\n}\n\nfunction likeLiteral(char: string, caseSensitive: boolean): string {\n if (!caseSensitive) {\n const code = char.codePointAt(0)!;\n if (code >= 65 && code <= 90) return `[${char}${char.toLowerCase()}]`;\n if (code >= 97 && code <= 122) return `[${char}${char.toUpperCase()}]`;\n }\n return escapeRegexChar(char);\n}\n\n/**\n * SQLite LIKE matching. ASCII letters are case-insensitive unless `caseSensitive`.\n *\n * @param text - Value to test.\n * @param pattern - Pattern with `%` / `_` wildcards.\n * @param escape - Optional single-character ESCAPE (or `null`).\n * @param caseSensitive - When true, match like GLOB (SQLite `PRAGMA case_sensitive_like=ON`).\n */\nexport function likeMatch(text: string, pattern: string, escape: string | null = null, caseSensitive = false): boolean {\n if (escape !== null && [...escape].length !== 1) {\n throw new SqliteError(\"ESCAPE expression must be a single character\", \"other\");\n }\n\n let source = \"^\";\n const chars = [...pattern];\n for (let i = 0; i < chars.length; i++) {\n const char = chars[i]!;\n if (escape !== null && char === escape) {\n const next = chars[++i];\n source += next === undefined ? likeLiteral(char, caseSensitive) : likeLiteral(next, caseSensitive);\n } else if (char === \"%\") {\n source += \"[\\\\s\\\\S]*\";\n } else if (char === \"_\") {\n source += \"[\\\\s\\\\S]\";\n } else {\n source += likeLiteral(char, caseSensitive);\n }\n }\n return new RegExp(`${source}$`).test(text);\n}\n\n/**\n * SQLite GLOB matching. GLOB is case-sensitive and uses Unix `*` / `?` wildcards.\n *\n * @param text - Value to test.\n * @param pattern - GLOB pattern.\n */\nexport function globMatch(text: string, pattern: string): boolean {\n let source = \"^\";\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i]!;\n if (char === \"*\") {\n source += \"[\\\\s\\\\S]*\";\n } else if (char === \"?\") {\n source += \"[\\\\s\\\\S]\";\n } else if (char === \"[\") {\n let end = i + 1;\n if (pattern[end] === \"^\") end++;\n if (pattern[end] === \"]\") end++;\n while (end < pattern.length && pattern[end] !== \"]\") end++;\n if (end >= pattern.length) {\n source += \"\\\\[\";\n } else {\n let content = pattern.slice(i + 1, end);\n // SQLite uses either ^ or ! as the first character to negate a class.\n if (content.startsWith(\"!\")) content = `^${content.slice(1)}`;\n source += `[${content.replace(/\\\\/g, \"\\\\\\\\\")}]`;\n i = end;\n }\n } else {\n source += escapeRegexChar(char);\n }\n }\n return new RegExp(`${source}$`).test(text);\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { globMatch, likeMatch } from \"../expressions/like.ts\";\nimport { assertBlobLength } from \"../runtime/assert.ts\";\nimport { sqliteAtoF } from \"../types/sqlite-atof.ts\";\nimport {\n affinityFromTypeName,\n asSqlReal,\n canonicalizeNumber,\n coerceToNumber,\n compareSql,\n formatRealAsText,\n isSqlReal,\n type SqlValue,\n storageClassOf,\n typeofSql,\n utf8Decode,\n utf8Encode,\n} from \"../types/value.ts\";\nimport type { FunctionContext, ScalarFunction } from \"./registry.ts\";\n\n/** Match bun:sqlite / SQLite 3.51.0 for drop-in parity. */\nexport const SQLITE_MEM_VERSION = \"3.51.0\";\nexport const SQLITE_MEM_SOURCE_ID =\n \"2025-06-12 13:14:41 f0ca7bba1c5e232e5d279fad6338121ab55af0c8c68c84cdfb18ba5114dcaapl\";\n\nconst COMPILE_OPTIONS = [\n \"ENABLE_FTS3\",\n \"ENABLE_FTS4\",\n \"ENABLE_FTS5\",\n \"ENABLE_MATH_FUNCTIONS\",\n \"ENABLE_RTREE\",\n \"ENABLE_DBSTAT_VTAB\",\n \"ENABLE_BYTECODE_VTAB\",\n \"THREADSAFE=1\",\n] as const;\n\nfunction text(value: SqlValue): string {\n if (value instanceof Uint8Array) return utf8Decode(value);\n return String(value);\n}\n\n/** CAST TEXT\u2192INTEGER: leading space, optional sign, digit prefix (sqlite3Atoi64). */\nfunction castTextToInteger(raw: string): number {\n let i = 0;\n while (i < raw.length && raw[i] === \" \") i++;\n if (i >= raw.length) return 0;\n let sign = 1;\n if (raw[i] === \"-\") {\n sign = -1;\n i++;\n } else if (raw[i] === \"+\") i++;\n if (i >= raw.length || raw[i]! < \"0\" || raw[i]! > \"9\") return 0;\n let n = 0;\n while (i < raw.length && raw[i]! >= \"0\" && raw[i]! <= \"9\") {\n n = n * 10 + (raw.charCodeAt(i) - 48);\n i++;\n }\n return sign * n;\n}\n\n/** CAST TEXT\u2192REAL/NUMERIC: prefix parse including fraction and exponent (sqlite3AtoF). */\nfunction castTextToReal(raw: string): number {\n return sqliteAtoF(raw);\n}\n\nfunction castNumericFromValue(value: SqlValue, kind: \"INTEGER\" | \"REAL\" | \"NUMERIC\"): number {\n if (typeof value === \"string\") {\n return kind === \"INTEGER\" ? castTextToInteger(value) : castTextToReal(value);\n }\n if (value instanceof Uint8Array) {\n const decoded = utf8Decode(value);\n return kind === \"INTEGER\" ? castTextToInteger(decoded) : castTextToReal(decoded);\n }\n return coerceToNumber(value) ?? 0;\n}\n\nfunction numeric(value: SqlValue): number {\n return coerceToNumber(value) ?? 0;\n}\n\nexport function castSqlValue(value: SqlValue, typeName: string): SqlValue {\n const affinity = affinityFromTypeName(typeName);\n if (value === null) return null;\n if (affinity === \"BLOB\") {\n return value instanceof Uint8Array ? value : utf8Encode(text(value));\n }\n if (affinity === \"TEXT\") {\n if (isSqlReal(value)) return formatRealAsText(value.value);\n if (typeof value === \"number\") {\n if (Number.isInteger(value) && Number.isSafeInteger(value)) return String(value);\n return formatRealAsText(value);\n }\n return text(value);\n }\n if (affinity === \"INTEGER\") return Math.trunc(castNumericFromValue(value, \"INTEGER\"));\n if (affinity === \"REAL\") return asSqlReal(castNumericFromValue(value, \"REAL\"));\n if (affinity === \"NUMERIC\") {\n const n = castNumericFromValue(value, \"NUMERIC\");\n if (Number.isInteger(n) && Number.isSafeInteger(n)) return Math.trunc(n);\n return canonicalizeNumber(n);\n }\n return value;\n}\n\nfunction trimChars(value: string, chars: string, left: boolean, right: boolean): string {\n const set = new Set([...chars]);\n const input = [...value];\n let start = 0;\n let end = input.length;\n if (left) while (start < end && set.has(input[start]!)) start++;\n if (right) while (end > start && set.has(input[end - 1]!)) end--;\n return input.slice(start, end).join(\"\");\n}\n\nfunction substr(value: string, startValue: number, lengthValue?: number): string {\n const chars = [...value];\n const start = Math.trunc(startValue);\n let index = start > 0 ? start - 1 : start < 0 ? chars.length + start : 0;\n index = Math.max(0, index);\n if (lengthValue === undefined) return chars.slice(index).join(\"\");\n const length = Math.trunc(lengthValue);\n if (length >= 0) return chars.slice(index, index + length).join(\"\");\n return chars.slice(Math.max(0, index + length), index).join(\"\");\n}\n\nfunction formatPrintf(format: string, args: SqlValue[]): string {\n let index = 0;\n return format.replace(\n /%([0 +\\-#]*)(\\d+)?(?:\\.(\\d+))?([%sdifgGxXcqQ])/g,\n (_match, flags: string, widthText: string | undefined, precisionText: string | undefined, kind: string) => {\n if (kind === \"%\") return \"%\";\n const value = args[index++] ?? null;\n const precision = precisionText === undefined ? undefined : Number(precisionText);\n let result: string;\n switch (kind) {\n case \"d\":\n case \"i\":\n result = String(Math.trunc(numeric(value)));\n break;\n case \"f\":\n result = numeric(value).toFixed(precision ?? 6);\n break;\n case \"g\":\n case \"G\":\n result = numeric(value)\n .toPrecision(precision ?? 6)\n .replace(/\\.?0+(e|$)/i, \"$1\");\n break;\n case \"x\":\n case \"X\":\n result = Math.trunc(numeric(value)).toString(16);\n break;\n case \"c\":\n result = String.fromCodePoint(Math.trunc(numeric(value)));\n break;\n case \"q\":\n result = value === null ? \"(NULL)\" : text(value).replace(/'/g, \"''\");\n break;\n case \"Q\":\n result = value === null ? \"NULL\" : `'${text(value).replace(/'/g, \"''\")}'`;\n break;\n default:\n result = value === null ? \"\" : text(value);\n }\n if (kind === \"G\" || kind === \"X\") result = result.toUpperCase();\n const width = Number(widthText ?? 0);\n if (width > result.length) {\n const pad = flags.includes(\"0\") ? \"0\" : \" \";\n result = flags.includes(\"-\") ? result.padEnd(width, pad) : result.padStart(width, pad);\n }\n return result;\n },\n );\n}\n\nfunction requireArgs(name: string, args: SqlValue[], min: number, max = min): void {\n if (args.length < min || args.length > max) {\n throw new SqliteError(`wrong number of arguments to function ${name}()`, \"misuse\");\n }\n}\n\nconst scalarFunctions: Record<string, ScalarFunction> = {\n abs(args) {\n requireArgs(\"abs\", args, 1);\n const value = args[0]!;\n if (value === null) return null;\n if (typeof value === \"bigint\") return value < 0n ? -value : value;\n return Math.abs(numeric(value));\n },\n coalesce(args) {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function coalesce()\", \"misuse\");\n return args.find((value) => value !== null) ?? null;\n },\n ifnull(args) {\n requireArgs(\"ifnull\", args, 2);\n return args[0] ?? args[1]!;\n },\n nullif(args) {\n requireArgs(\"nullif\", args, 2);\n const comparison = compareSql(args[0]!, args[1]!);\n return comparison === 0 ? null : args[0]!;\n },\n typeof(args) {\n requireArgs(\"typeof\", args, 1);\n return typeofSql(args[0]!);\n },\n length(args) {\n requireArgs(\"length\", args, 1);\n const value = args[0]!;\n if (value === null) return null;\n if (value instanceof Uint8Array) return value.length;\n return [...text(value)].length;\n },\n lower(args) {\n requireArgs(\"lower\", args, 1);\n return args[0] === null ? null : text(args[0]!).replace(/[A-Z]/g, (c) => c.toLowerCase());\n },\n upper(args) {\n requireArgs(\"upper\", args, 1);\n return args[0] === null ? null : text(args[0]!).replace(/[a-z]/g, (c) => c.toUpperCase());\n },\n trim(args) {\n requireArgs(\"trim\", args, 1, 2);\n if (args[0] === null || args[1] === null) return null;\n return trimChars(text(args[0]!), args[1] === undefined ? \" \" : text(args[1]), true, true);\n },\n ltrim(args) {\n requireArgs(\"ltrim\", args, 1, 2);\n if (args[0] === null || args[1] === null) return null;\n return trimChars(text(args[0]!), args[1] === undefined ? \" \" : text(args[1]), true, false);\n },\n rtrim(args) {\n requireArgs(\"rtrim\", args, 1, 2);\n if (args[0] === null || args[1] === null) return null;\n return trimChars(text(args[0]!), args[1] === undefined ? \" \" : text(args[1]), false, true);\n },\n substr(args) {\n requireArgs(\"substr\", args, 2, 3);\n if (args[0] === null || args[1] === null || args[2] === null) return null;\n return substr(text(args[0]!), numeric(args[1]!), args[2] === undefined ? undefined : numeric(args[2]));\n },\n substring(args, context) {\n return scalarFunctions.substr!(args, context);\n },\n replace(args) {\n requireArgs(\"replace\", args, 3);\n if (args.some((value) => value === null)) return null;\n const search = text(args[1]!);\n return search === \"\" ? text(args[0]!) : text(args[0]!).split(search).join(text(args[2]!));\n },\n round(args) {\n requireArgs(\"round\", args, 1, 2);\n if (args[0] === null) return null;\n const places = Math.max(0, Math.min(30, Math.trunc(numeric(args[1] ?? 0))));\n const factor = 10 ** places;\n const scaled = numeric(args[0]!) * factor;\n return (scaled < 0 ? -Math.round(-scaled) : Math.round(scaled)) / factor;\n },\n min(args) {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function min()\", \"misuse\");\n if (args.some((value) => value === null)) return null;\n return args.reduce((best, value) => (compareSql(value, best)! < 0 ? value : best));\n },\n max(args) {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function max()\", \"misuse\");\n if (args.some((value) => value === null)) return null;\n return args.reduce((best, value) => (compareSql(value, best)! > 0 ? value : best));\n },\n random(args, context) {\n requireArgs(\"random\", args, 0);\n if (context.random) return context.random();\n // Fallback deterministic stream when evaluated outside a Database (e.g. unit helpers).\n return 0n;\n },\n randomblob(args, context) {\n requireArgs(\"randomblob\", args, 1);\n if (args[0] === null) return null;\n const length = Math.max(0, Math.trunc(numeric(args[0]!)));\n assertBlobLength(length, \"randomblob\");\n const out = new Uint8Array(length);\n let offset = 0;\n while (offset < length) {\n const bits = context.randomU64?.() ?? 0n;\n for (let shift = 0; shift < 64 && offset < length; shift += 8) {\n out[offset++] = Number((bits >> BigInt(shift)) & 0xffn);\n }\n }\n return out;\n },\n zeroblob(args) {\n requireArgs(\"zeroblob\", args, 1);\n if (args[0] === null) return null;\n const length = Math.max(0, Math.trunc(numeric(args[0]!)));\n assertBlobLength(length, \"zeroblob\");\n return new Uint8Array(length);\n },\n hex(args) {\n requireArgs(\"hex\", args, 1);\n if (args[0] === null) return \"\";\n const bytes = args[0] instanceof Uint8Array ? args[0] : utf8Encode(text(args[0]!));\n return [...bytes]\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase();\n },\n quote(args) {\n requireArgs(\"quote\", args, 1);\n const value = args[0]!;\n if (value === null) return \"NULL\";\n if (value instanceof Uint8Array) return `X'${scalarFunctions.hex!([value], {})}'`;\n if (typeof value === \"string\") return `'${value.replace(/'/g, \"''\")}'`;\n if (typeof value === \"number\" && !Number.isFinite(value)) return value < 0 ? \"-9.0e+999\" : \"9.0e+999\";\n return String(value);\n },\n printf(args) {\n if (args.length === 0 || args[0] === null) return null;\n return formatPrintf(text(args[0]!), args.slice(1));\n },\n changes(args, context) {\n requireArgs(\"changes\", args, 0);\n return context.changes?.() ?? 0;\n },\n total_changes(args, context) {\n requireArgs(\"total_changes\", args, 0);\n return context.totalChanges?.() ?? 0;\n },\n last_insert_rowid(args, context) {\n requireArgs(\"last_insert_rowid\", args, 0);\n return context.lastInsertRowid?.() ?? 0;\n },\n sqlite_version(args) {\n requireArgs(\"sqlite_version\", args, 0);\n return SQLITE_MEM_VERSION;\n },\n sqlite_source_id(args) {\n requireArgs(\"sqlite_source_id\", args, 0);\n return SQLITE_MEM_SOURCE_ID;\n },\n sqlite_compileoption_used(args) {\n requireArgs(\"sqlite_compileoption_used\", args, 1);\n if (args[0] === null) return null;\n const needle = text(args[0]!)\n .toUpperCase()\n .replace(/^SQLITE_/, \"\");\n return COMPILE_OPTIONS.some((opt) => opt === needle || opt.startsWith(`${needle}=`)) ? 1 : 0;\n },\n sqlite_compileoption_get(args) {\n requireArgs(\"sqlite_compileoption_get\", args, 1);\n if (args[0] === null) return null;\n const index = Math.trunc(numeric(args[0]!));\n if (index < 0 || index >= COMPILE_OPTIONS.length) return null;\n return COMPILE_OPTIONS[index]!;\n },\n sqlite_log(args) {\n requireArgs(\"sqlite_log\", args, 2);\n return null;\n },\n load_extension(args) {\n requireArgs(\"load_extension\", args, 1, 2);\n throw new SqliteError(\"not authorized\", \"misuse\");\n },\n like(args, context) {\n requireArgs(\"like\", args, 2, 3);\n if (args[0] === null || args[1] === null || args[2] === null) return null;\n // like(pattern, string[, escape]) \u2261 string LIKE pattern [ESCAPE escape]\n const escape = args[2] === undefined ? null : text(args[2]!);\n return likeMatch(text(args[1]!), text(args[0]!), escape, context.caseSensitiveLike === true) ? 1 : 0;\n },\n glob(args) {\n requireArgs(\"glob\", args, 2);\n if (args[0] === null || args[1] === null) return null;\n // glob(pattern, string) \u2261 string GLOB pattern\n return globMatch(text(args[1]!), text(args[0]!)) ? 1 : 0;\n },\n match() {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n },\n char(args) {\n if (args.length === 0) return \"\";\n let out = \"\";\n for (const arg of args) {\n if (arg === null) continue;\n const code = Math.trunc(numeric(arg));\n if (code > 0) out += String.fromCodePoint(code);\n }\n return out;\n },\n format(args, context) {\n return scalarFunctions.printf!(args, context);\n },\n iif(args) {\n requireArgs(\"iif\", args, 3);\n const cond = args[0];\n if (cond === null) return args[2]!;\n if (typeof cond === \"number\" || typeof cond === \"bigint\") {\n return Number(cond) !== 0 ? args[1]! : args[2]!;\n }\n if (typeof cond === \"string\") return cond.length > 0 ? args[1]! : args[2]!;\n if (cond instanceof Uint8Array) return cond.length > 0 ? args[1]! : args[2]!;\n return args[1]!;\n },\n if(args, context) {\n return scalarFunctions.iif!(args, context);\n },\n instr(args) {\n requireArgs(\"instr\", args, 2);\n if (args[0] === null || args[1] === null) return null;\n if (args[0] instanceof Uint8Array || args[1] instanceof Uint8Array) {\n const hay = args[0] instanceof Uint8Array ? args[0] : utf8Encode(text(args[0]!));\n const needle = args[1] instanceof Uint8Array ? args[1] : utf8Encode(text(args[1]!));\n if (needle.length === 0) return 1;\n outer: for (let i = 0; i <= hay.length - needle.length; i++) {\n for (let j = 0; j < needle.length; j++) {\n if (hay[i + j] !== needle[j]) continue outer;\n }\n return i + 1;\n }\n return 0;\n }\n const hay = text(args[0]!);\n const needle = text(args[1]!);\n if (needle === \"\") return 1;\n const idx = hay.indexOf(needle);\n return idx < 0 ? 0 : [...hay.slice(0, idx)].length + 1;\n },\n unicode(args) {\n requireArgs(\"unicode\", args, 1);\n if (args[0] === null) return null;\n const s = text(args[0]!);\n if (s.length === 0) return null;\n return s.codePointAt(0)!;\n },\n octet_length(args) {\n requireArgs(\"octet_length\", args, 1);\n if (args[0] === null) return null;\n if (args[0] instanceof Uint8Array) return args[0].length;\n return utf8Encode(text(args[0]!)).length;\n },\n unhex(args) {\n requireArgs(\"unhex\", args, 1, 2);\n if (args[0] === null) return null;\n let hex = text(args[0]!).replace(/\\s+/g, \"\");\n if (args[1] !== undefined && args[1] !== null) {\n const sep = text(args[1]!);\n hex = text(args[0]!).split(sep).join(\"\");\n }\n if (hex.length % 2 !== 0) return null;\n if (!/^[0-9a-fA-F]*$/.test(hex)) return null;\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 concat(args) {\n if (args.some((v) => v === null)) return null;\n return args.map((v) => text(v!)).join(\"\");\n },\n concat_ws(args) {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function concat_ws()\", \"misuse\");\n if (args[0] === null) return null;\n const sep = text(args[0]!);\n const parts: string[] = [];\n for (const arg of args.slice(1)) {\n if (arg === null) continue;\n parts.push(text(arg));\n }\n return parts.join(sep);\n },\n unistr(args) {\n requireArgs(\"unistr\", args, 1);\n if (args[0] === null) return null;\n const input = text(args[0]!);\n let out = \"\";\n for (let i = 0; i < input.length; i++) {\n if (input[i] === \"\\\\\" && input[i + 1] === \"u\") {\n const hex = input.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) {\n throw new SqliteError(\"invalid Unicode escape in unistr()\", \"other\");\n }\n out += String.fromCodePoint(Number.parseInt(hex, 16));\n i += 5;\n } else {\n out += input[i];\n }\n }\n return out;\n },\n unistr_quote(args) {\n requireArgs(\"unistr_quote\", args, 1);\n if (args[0] === null) return \"NULL\";\n const s = text(args[0]!);\n let needs = false;\n let escaped = \"\";\n for (const ch of s) {\n const cp = ch.codePointAt(0)!;\n if (cp < 0x20 || cp === 0x7f) {\n needs = true;\n escaped += `\\\\u${cp.toString(16).padStart(4, \"0\")}`;\n } else if (ch === \"'\") {\n escaped += \"''\";\n } else if (ch === \"\\\\\") {\n needs = true;\n escaped += \"\\\\\\\\\";\n } else {\n escaped += ch;\n }\n }\n return needs ? `unistr('${escaped}')` : `'${escaped}'`;\n },\n likelihood(args) {\n requireArgs(\"likelihood\", args, 2);\n const p = numOrThrow(args[1], \"likelihood\");\n if (p === null || p < 0 || p > 1) {\n throw new SqliteError(\"second argument to likelihood() must be a constant between 0.0 and 1.0\", \"misuse\");\n }\n return args[0]!;\n },\n likely(args) {\n requireArgs(\"likely\", args, 1);\n return args[0]!;\n },\n unlikely(args) {\n requireArgs(\"unlikely\", args, 1);\n return args[0]!;\n },\n unknown() {\n return null;\n },\n uuid(args, context) {\n requireArgs(\"uuid\", args, 0);\n return formatUuid(nextUuidBytes(context));\n },\n uuid_str(args) {\n requireArgs(\"uuid_str\", args, 1);\n if (args[0] === null) return null;\n if (typeof args[0] === \"string\") return args[0].toLowerCase();\n if (args[0] instanceof Uint8Array && args[0].length === 16) return formatUuid(args[0]);\n return null;\n },\n uuid_blob(args) {\n requireArgs(\"uuid_blob\", args, 1);\n if (args[0] === null) return null;\n if (args[0] instanceof Uint8Array && args[0].length === 16) return args[0];\n if (typeof args[0] === \"string\") {\n const hex = args[0].replace(/-/g, \"\");\n if (!/^[0-9a-fA-F]{32}$/.test(hex)) 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 return null;\n },\n // FTS/RTREE helpers registered as context-sensitive stubs; real work is in MATCH/vtab paths.\n optimize() {\n throw new SqliteError(\"unable to use function optimize in the requested context\", \"unsupported\");\n },\n fts5() {\n throw new SqliteError(\"unable to use function fts5 in the requested context\", \"unsupported\");\n },\n fts5_source_id(args) {\n requireArgs(\"fts5_source_id\", args, 0);\n return `fts5: ${SQLITE_MEM_SOURCE_ID}`;\n },\n fts5_get_locale() {\n return null;\n },\n fts5_locale(args) {\n requireArgs(\"fts5_locale\", args, 1, 2);\n return args[0] ?? null;\n },\n fts5_insttoken(args) {\n requireArgs(\"fts5_insttoken\", args, 1);\n return args[0]!;\n },\n fts3_tokenizer() {\n throw new SqliteError(\"unknown tokenizer: \", \"other\");\n },\n};\n\nfunction numOrThrow(value: SqlValue | undefined, name: string): number | null {\n if (value === undefined) throw new SqliteError(`wrong number of arguments to function ${name}()`, \"misuse\");\n if (value === null) return null;\n return coerceToNumber(value);\n}\n\nfunction nextUuidBytes(context: FunctionContext): Uint8Array {\n const out = new Uint8Array(16);\n let offset = 0;\n while (offset < 16) {\n const bits = context.randomU64?.() ?? 0n;\n for (let shift = 0; shift < 64 && offset < 16; shift += 8) {\n out[offset++] = Number((bits >> BigInt(shift)) & 0xffn);\n }\n }\n // RFC 4122 version 4 / variant bits\n out[6] = (out[6]! & 0x0f) | 0x40;\n out[8] = (out[8]! & 0x3f) | 0x80;\n return out;\n}\n\nfunction formatUuid(bytes: Uint8Array): string {\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\nexport function getScalarFunctions(): Readonly<Record<string, ScalarFunction>> {\n return scalarFunctions;\n}\n\nexport function invokeScalar(name: string, args: SqlValue[], context: FunctionContext = {}): SqlValue {\n const fn = scalarFunctions[name.toLowerCase()];\n if (!fn) throw new SqliteError(`no such function: ${name}`, \"other\");\n return fn(args, context);\n}\n\nexport { storageClassOf };\n", "import type { SqlValue } from \"../types/value.ts\";\nimport { type AggregateAccumulator, type AggregateFactory, aggregateFunctions } from \"./aggregate.ts\";\nimport { dateTimeFunctions } from \"./datetime.ts\";\nimport { ftsAuxFunctions, rtreeAuxFunctions } from \"./extensions.ts\";\nimport { jsonAggregateFunctions, jsonScalarFunctions } from \"./json.ts\";\nimport { mathFunctions } from \"./math.ts\";\nimport { getScalarFunctions } from \"./scalar.ts\";\n\nexport interface FunctionContext {\n changes?: () => number;\n totalChanges?: () => number;\n lastInsertRowid?: () => number | bigint;\n /** Injectable clock \u2014 defaults to a fixed instant on Database. */\n now?: () => Date;\n /** Injectable SQLite `random()` source \u2014 defaults to a seeded PRNG on Database. */\n random?: () => bigint;\n /** Raw unsigned 64-bit PRNG draws for `randomblob`. */\n randomU64?: () => bigint;\n /** Active FTS MATCH cursor when evaluating projections with MATCH in WHERE. */\n ftsMatch?: import(\"../vtable/fts5.ts\").FtsMatchCursor | null;\n /** SQLite `PRAGMA case_sensitive_like` for LIKE / like(). */\n caseSensitiveLike?: boolean;\n /** Current rowid for FTS aux defaults when MATCH is absent. */\n ftsRowid?: import(\"../storage/row.ts\").Rowid;\n /** Source FTS table name for the current scan row. */\n ftsSourceTable?: string;\n /** Resolve FTS table by name for aux functions. */\n getFtsTable?: (name: string) => import(\"../vtable/fts5.ts\").Fts5VirtualTable | null;\n}\n\nexport type ScalarFunction = (args: SqlValue[], context: FunctionContext) => SqlValue;\n\nexport class FunctionRegistry {\n private readonly scalars = new Map<string, ScalarFunction>();\n private readonly aggregates = new Map<string, AggregateFactory>();\n\n constructor() {\n for (const [name, fn] of Object.entries(getScalarFunctions())) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(dateTimeFunctions)) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(jsonScalarFunctions)) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(mathFunctions)) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(ftsAuxFunctions)) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(rtreeAuxFunctions)) this.scalars.set(name, fn);\n for (const [name, factory] of Object.entries(aggregateFunctions)) this.aggregates.set(name, factory);\n for (const [name, factory] of Object.entries(jsonAggregateFunctions)) this.aggregates.set(name, factory);\n }\n\n registerScalar(name: string, fn: ScalarFunction): void {\n this.scalars.set(name.toLowerCase(), fn);\n }\n\n registerAggregate(name: string, factory: AggregateFactory): void {\n this.aggregates.set(name.toLowerCase(), factory);\n }\n\n lookupScalar(name: string): ScalarFunction | undefined {\n return this.scalars.get(name.toLowerCase());\n }\n\n lookupAggregate(name: string): AggregateFactory | undefined {\n return this.aggregates.get(name.toLowerCase());\n }\n\n createAggregate(name: string): AggregateAccumulator | undefined {\n return this.lookupAggregate(name)?.();\n }\n\n isAggregateName(name: string): boolean {\n return this.aggregates.has(name.toLowerCase());\n }\n}\n\nexport const defaultFunctionRegistry = new FunctionRegistry();\n\nexport function lookupScalar(name: string): ScalarFunction | undefined {\n return defaultFunctionRegistry.lookupScalar(name);\n}\n\nexport function lookupAggregate(name: string): AggregateFactory | undefined {\n return defaultFunctionRegistry.lookupAggregate(name);\n}\n\nexport function isAggregateName(name: string): boolean {\n return defaultFunctionRegistry.isAggregateName(name);\n}\n", "import type { SelectStmt } from \"../ast/nodes.ts\";\nimport { SqliteError, TriggerRaiseError } from \"../errors/index.ts\";\nimport type { EvalContext } from \"../expressions/context.ts\";\nimport { defaultFunctionRegistry, type FunctionRegistry } from \"../functions/registry.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\nimport type { Rowid } from \"../storage/row.ts\";\nimport type { TransactionManager } from \"../transactions/manager.ts\";\nimport {\n type Affinity,\n canonicalizeNumber,\n SqlJsonText,\n SqlReal,\n type SqlValue,\n storageClassOf,\n} from \"../types/value.ts\";\nimport type { ResultSet } from \"./result.ts\";\n\nexport interface Cell {\n table: string | null;\n tableLower?: string | null;\n name: string;\n nameLower?: string;\n value: SqlValue;\n affinity?: Affinity;\n collate?: string | null;\n /** Right-hand duplicate of a column merged by JOIN ... USING. */\n hiddenByUsing?: boolean;\n}\n\nexport function makeCell(\n table: string | null,\n name: string,\n value: SqlValue,\n extra?: Omit<Partial<Cell>, \"table\" | \"name\" | \"value\" | \"tableLower\" | \"nameLower\">,\n): Cell {\n return {\n table,\n tableLower: table?.toLowerCase() ?? null,\n name,\n nameLower: name.toLowerCase(),\n value,\n ...extra,\n };\n}\n\nexport interface ScopeRow {\n cells: Cell[];\n rowid?: Rowid;\n /** Output name of the rowid pseudo-column (INTEGER PRIMARY KEY alias when present). */\n rowidName?: string;\n sourceTable?: string;\n /** Set when WHERE MATCH succeeds for this row. */\n ftsMatch?: import(\"../vtable/fts5.ts\").FtsMatchCursor | null;\n}\n\nexport type SelectRunner = (stmt: SelectStmt, env: ExecutionEnv, parent?: EvalContext) => ResultSet;\n\nexport interface ExecutionHooks {\n now?: () => Date;\n random?: () => bigint;\n /** Raw xorshift64* output for `randomblob`. */\n randomU64?: () => bigint;\n}\n\nexport class ExecutionEnv {\n readonly state: DatabaseState;\n readonly transactions: TransactionManager;\n readonly functions: FunctionRegistry;\n readonly positional: SqlValue[];\n readonly named: Map<string, SqlValue>;\n readonly ctes = new Map<string, ResultSet>();\n readonly hooks: ExecutionHooks;\n selectRunner?: SelectRunner;\n\n /** Nesting depth while executing trigger programs. */\n triggerDepth = 0;\n /** OLD/NEW column scope for the active trigger program. */\n triggerScope: ScopeRow | null = null;\n\n /** Cap SELECT output rows (used by Statement.get). */\n maxRows = Number.POSITIVE_INFINITY;\n /** When true, skip simple-select / simple-join fast paths (tests only). */\n forceFullSelect = false;\n /** When true, skip tryFastInsert (tests only). */\n forceFullInsert = false;\n includeNamedRows = true;\n includeValues = true;\n /** Source text of the statement currently executing (for sqlite_master.sql). */\n statementSql: string | null = null;\n\n constructor(\n state: DatabaseState,\n transactions: TransactionManager,\n params: readonly unknown[] = [],\n functions: FunctionRegistry = defaultFunctionRegistry,\n hooks: ExecutionHooks = {},\n ) {\n this.state = state;\n this.transactions = transactions;\n this.functions = functions;\n this.hooks = hooks;\n this.positional = params.map(toSqlValue);\n this.named = new Map();\n }\n\n reset(params: readonly unknown[]): void {\n this.positional.length = 0;\n for (const value of params) this.positional.push(toSqlValue(value));\n this.named.clear();\n this.ctes.clear();\n this.triggerDepth = 0;\n this.triggerScope = null;\n this.maxRows = Number.POSITIVE_INFINITY;\n this.forceFullSelect = false;\n this.forceFullInsert = false;\n this.includeNamedRows = true;\n this.includeValues = true;\n this.statementSql = null;\n }\n\n getBoundParameter(name: string | number): SqlValue {\n if (typeof name === \"number\") {\n if (name < 1 || name > this.positional.length) return null;\n return this.positional[name - 1]!;\n }\n const key = name.toLowerCase();\n if (!this.named.has(key)) {\n // Unnamed positional fallback is handled by the evaluator for PARAM_POS;\n // named placeholders that were never bound are NULL (SQLite).\n return null;\n }\n return this.named.get(key) ?? null;\n }\n\n setNamed(name: string, value: unknown): void {\n this.named.set(name.toLowerCase(), toSqlValue(value));\n }\n\n createEvalContext(row: ScopeRow | null = null, parent?: EvalContext): EvalContext {\n const scope = row ?? this.triggerScope;\n const cells = scope?.cells ?? [];\n const inheritedParent =\n parent ??\n (row !== null && this.triggerScope !== null && row !== this.triggerScope\n ? this.createEvalContext(this.triggerScope)\n : undefined);\n const context: EvalContext = {\n parent: inheritedParent,\n ftsMatch: scope?.ftsMatch ?? null,\n functions: this.functions,\n functionContext: {\n changes: () => this.state.changes,\n totalChanges: () => this.state.totalChanges,\n lastInsertRowid: () => this.state.lastInsertRowid,\n now: this.hooks.now,\n random: this.hooks.random,\n randomU64: this.hooks.randomU64,\n caseSensitiveLike: this.state.caseSensitiveLike,\n ftsMatch: scope?.ftsMatch ?? null,\n ftsRowid: scope?.rowid,\n ftsSourceTable: scope?.sourceTable,\n getFtsTable: (name: string) => {\n if (!this.state.isFtsTable(name)) return null;\n return this.state.getVirtualTable(name);\n },\n },\n raise: this.triggerScope\n ? (action, message) => {\n throw new TriggerRaiseError(action, message);\n }\n : undefined,\n resolveColumn: (table, name) => {\n const key = name.toLowerCase();\n const tableKey = table?.toLowerCase();\n const tableMatches =\n table === null || cells.some((cell) => (cell.tableLower ?? cell.table?.toLowerCase()) === tableKey);\n if (tableMatches && (key === \"rowid\" || key === \"_rowid_\" || key === \"oid\") && scope?.rowid !== undefined) {\n return scope.rowid;\n }\n if (key === \"rank\" && scope?.sourceTable && this.state.isFtsTable(scope.sourceTable)) {\n const fts = this.state.getVirtualTable(scope.sourceTable);\n if (scope.ftsMatch) return fts.bm25(scope.ftsMatch);\n return null;\n }\n // FTS table-name reference used by aux functions (bm25(docs), \u2026)\n if (\n scope?.sourceTable &&\n key === scope.sourceTable.toLowerCase() &&\n this.state.isFtsTable(scope.sourceTable) &&\n !cells.some((cell) => (cell.nameLower ?? cell.name.toLowerCase()) === key)\n ) {\n return scope.sourceTable;\n }\n const matches = cells.filter((cell) => {\n if ((cell.nameLower ?? cell.name.toLowerCase()) !== key) return false;\n if (table === null) return !cell.hiddenByUsing;\n return (cell.tableLower ?? cell.table?.toLowerCase()) === tableKey;\n });\n if (matches.length === 0) {\n // SQLite: bare TRUE/FALSE are integer 1/0 unless a same-named column is in scope.\n if (table === null) {\n if (key === \"true\") return 1;\n if (key === \"false\") return 0;\n }\n throw new SqliteError(`no such column: ${table ? `${table}.` : \"\"}${name}`, \"no_such_column\");\n }\n if (matches.length > 1 && table === null) throw new SqliteError(`ambiguous column name: ${name}`, \"other\");\n return matches[0]!.value;\n },\n resolveStorageClass: (table, name) => {\n const key = name.toLowerCase();\n if (key === \"rank\") return \"real\";\n const tableKey = table?.toLowerCase();\n const matches = cells.filter((cell) => {\n if ((cell.nameLower ?? cell.name.toLowerCase()) !== key) return false;\n if (table === null) return !cell.hiddenByUsing;\n return (cell.tableLower ?? cell.table?.toLowerCase()) === tableKey;\n });\n if (matches.length === 0) {\n if (table === null && (key === \"true\" || key === \"false\")) return \"integer\";\n throw new SqliteError(`no such column: ${table ? `${table}.` : \"\"}${name}`, \"no_such_column\");\n }\n if (matches.length > 1 && table === null) throw new SqliteError(`ambiguous column name: ${name}`, \"other\");\n const cell = matches[0]!;\n return cell.affinity === \"REAL\" && typeof cell.value === \"number\" ? \"real\" : storageClassOf(cell.value);\n },\n resolveAffinity: (table, name) => {\n const key = name.toLowerCase();\n const tableKey = table?.toLowerCase();\n const matches = cells.filter((cell) => {\n if ((cell.nameLower ?? cell.name.toLowerCase()) !== key) return false;\n if (table === null) return !cell.hiddenByUsing;\n return (cell.tableLower ?? cell.table?.toLowerCase()) === tableKey;\n });\n if (matches.length !== 1) return null;\n return matches[0]!.affinity ?? null;\n },\n resolveCollation: (table, name) => {\n const key = name.toLowerCase();\n const tableKey = table?.toLowerCase();\n const matches = cells.filter((cell) => {\n if ((cell.nameLower ?? cell.name.toLowerCase()) !== key) return false;\n if (table === null) return !cell.hiddenByUsing;\n return (cell.tableLower ?? cell.table?.toLowerCase()) === tableKey;\n });\n if (matches.length === 0) return null;\n if (matches.length > 1 && table === null) return null;\n return matches[0]!.collate ?? null;\n },\n getParameter: (name) => this.getBoundParameter(name),\n executeSelect: (select) => {\n if (!this.selectRunner) throw new SqliteError(\"select executor is not configured\", \"misuse\");\n const result = this.selectRunner(select, this, context);\n return {\n columns: result.columns,\n rows:\n result.values.length > 0\n ? result.values.map((row) => [...row])\n : result.rows.map((record) => result.columns.map((column) => record[column] ?? null)),\n };\n },\n matchFts: (table, column, query) => {\n if (row?.rowid === undefined || !row.sourceTable) {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n }\n if (!this.state.isFtsTable(row.sourceTable)) {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n }\n const fts = this.state.getVirtualTable(row.sourceTable);\n const cursor = fts.matchCursor(row.rowid, table, column, query);\n if (cursor) row.ftsMatch = cursor;\n else row.ftsMatch = null;\n return cursor !== null;\n },\n };\n return context;\n }\n}\n\nexport function toSqlValue(value: unknown): SqlValue {\n if (value === null || typeof value === \"string\" || typeof value === \"bigint\") return value;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw new SqliteError(\"only finite numbers can be bound\", \"datatype_mismatch\");\n return canonicalizeNumber(value);\n }\n if (typeof value === \"boolean\") return value ? 1 : 0;\n if (value instanceof SqlReal || value instanceof SqlJsonText) return value;\n if (value instanceof Uint8Array) {\n if (isSharedArrayBufferView(value)) {\n throw new SqliteError(\"cannot bind SharedArrayBuffer-backed buffers; copy into a Uint8Array first\", \"misuse\");\n }\n return new Uint8Array(value);\n }\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n if (typeof SharedArrayBuffer !== \"undefined\" && value instanceof SharedArrayBuffer) {\n throw new SqliteError(\"cannot bind SharedArrayBuffer; copy into an ArrayBuffer or Uint8Array first\", \"misuse\");\n }\n if (ArrayBuffer.isView(value)) {\n const kind = Object.prototype.toString.call(value).slice(8, -1);\n throw new SqliteError(`cannot bind ${kind}; only Uint8Array and ArrayBuffer are accepted as BLOB values`, \"misuse\");\n }\n throw new SqliteError(`unsupported bind value: ${typeof value}`, \"datatype_mismatch\");\n}\n\nfunction isSharedArrayBufferView(view: ArrayBufferView): boolean {\n return typeof SharedArrayBuffer !== \"undefined\" && view.buffer instanceof SharedArrayBuffer;\n}\n", "import type { BinaryOp, Expr, SelectStmt } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { jsonArrow } from \"../functions/json.ts\";\nimport { defaultFunctionRegistry } from \"../functions/registry.ts\";\nimport { castSqlValue } from \"../functions/scalar.ts\";\nimport { compareWithCollation } from \"../types/collation.ts\";\nimport {\n type Affinity,\n affinityFromTypeName,\n applyComparisonAffinity,\n asSqlReal,\n canonicalizeNumber,\n coerceToNumberPrefix,\n compareSql,\n isSqlReal,\n isTruthySql,\n type SqlValue,\n storageClassOf,\n utf8Decode,\n} from \"../types/value.ts\";\nimport type { EvalContext } from \"./context.ts\";\nimport { globMatch, likeMatch } from \"./like.ts\";\n\nfunction numberValue(value: SqlValue): number {\n return coerceToNumberPrefix(value);\n}\n\nfunction asNumber(value: number): number {\n return canonicalizeNumber(value);\n}\n\nfunction integerValue(value: SqlValue): bigint {\n if (value === null) return 0n;\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\") return BigInt(Math.trunc(value));\n if (isSqlReal(value)) return BigInt(Math.trunc(value.value));\n return BigInt(Math.trunc(coerceToNumberPrefix(value)));\n}\n\nfunction isRealStorage(value: SqlValue): boolean {\n return storageClassOf(value) === \"real\" || isSqlReal(value);\n}\n\nfunction textValue(value: SqlValue): string {\n if (value instanceof Uint8Array) return utf8Decode(value);\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"value\" in value &&\n typeof (value as { value: unknown }).value === \"string\"\n ) {\n return (value as { value: string }).value;\n }\n return String(value);\n}\n\nfunction booleanValue(value: boolean): SqlValue {\n return value ? 1 : 0;\n}\n\nfunction executeSelect(ctx: EvalContext, select: SelectStmt): { columns: string[]; rows: SqlValue[][] } {\n if (!ctx.executeSelect) throw new SqliteError(\"subqueries are not available in this evaluation context\", \"misuse\");\n return ctx.executeSelect(select);\n}\n\nfunction resolveColumn(ctx: EvalContext, table: string | null, name: string): SqlValue {\n try {\n return ctx.resolveColumn(table, name);\n } catch (error) {\n if (ctx.parent && error instanceof SqliteError && error.category === \"no_such_column\") {\n return resolveColumn(ctx.parent, table, name);\n }\n throw error;\n }\n}\n\nfunction sqlAnd(left: SqlValue, right: () => SqlValue): SqlValue {\n const leftTruth = isTruthySql(left);\n if (leftTruth === false) return 0;\n const rightTruth = isTruthySql(right());\n if (rightTruth === false) return 0;\n if (leftTruth === null || rightTruth === null) return null;\n return 1;\n}\n\nfunction sqlOr(left: SqlValue, right: () => SqlValue): SqlValue {\n const leftTruth = isTruthySql(left);\n if (leftTruth === true) return 1;\n const rightTruth = isTruthySql(right());\n if (rightTruth === true) return 1;\n if (leftTruth === null || rightTruth === null) return null;\n return 0;\n}\n\nfunction compareResult(\n op: BinaryOp,\n left: SqlValue,\n right: SqlValue,\n collation?: string,\n leftAffinity: Affinity | null = null,\n rightAffinity: Affinity | null = null,\n): SqlValue {\n [left, right] = applyComparisonAffinity(left, right, leftAffinity, rightAffinity);\n if (op === \"IS\" || op === \"IS NOT\" || op === \"IS DISTINCT FROM\" || op === \"IS NOT DISTINCT FROM\") {\n const equal =\n left === null || right === null\n ? left === right\n : (collation ? compareWithCollation(left, right, collation) : compareSql(left, right)) === 0;\n if (op === \"IS\" || op === \"IS NOT DISTINCT FROM\") return booleanValue(equal);\n return booleanValue(!equal);\n }\n const comparison = collation ? compareWithCollation(left, right, collation) : compareSql(left, right);\n if (comparison === null) return null;\n switch (op) {\n case \"=\":\n case \"==\":\n return booleanValue(comparison === 0);\n case \"!=\":\n case \"<>\":\n return booleanValue(comparison !== 0);\n case \"<\":\n return booleanValue(comparison < 0);\n case \"<=\":\n return booleanValue(comparison <= 0);\n case \">\":\n return booleanValue(comparison > 0);\n case \">=\":\n return booleanValue(comparison >= 0);\n default:\n throw new SqliteError(`unsupported comparison operator: ${op}`, \"unsupported\");\n }\n}\n\nfunction evalBinary(op: BinaryOp, leftExpr: Expr, rightExpr: Expr, ctx: EvalContext): SqlValue {\n if (op === \"MATCH\") {\n if (leftExpr.type !== \"column\") {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n }\n const query = textValue(evalExpr(rightExpr, ctx));\n if (!ctx.matchFts) {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n }\n return booleanValue(ctx.matchFts(leftExpr.table, leftExpr.name, query));\n }\n\n if (\n leftExpr.type === \"row\" &&\n rightExpr.type === \"row\" &&\n [\"=\", \"==\", \"!=\", \"<>\", \"<\", \"<=\", \">\", \">=\", \"IS\", \"IS NOT\", \"IS DISTINCT FROM\", \"IS NOT DISTINCT FROM\"].includes(\n op,\n )\n ) {\n return compareRowValues(op, leftExpr.values, rightExpr.values, ctx);\n }\n\n const left = evalExpr(leftExpr, ctx);\n if (op === \"AND\") return sqlAnd(left, () => evalExpr(rightExpr, ctx));\n if (op === \"OR\") return sqlOr(left, () => evalExpr(rightExpr, ctx));\n const right = evalExpr(rightExpr, ctx);\n\n if (op === \"->\" || op === \"->>\") {\n return jsonArrow(left, right, op);\n }\n\n if (\n [\"=\", \"==\", \"!=\", \"<>\", \"<\", \"<=\", \">\", \">=\", \"IS\", \"IS NOT\", \"IS DISTINCT FROM\", \"IS NOT DISTINCT FROM\"].includes(\n op,\n )\n ) {\n return compareResult(\n op,\n left,\n right,\n resolveComparisonCollation(leftExpr, rightExpr, ctx) ?? undefined,\n resolveComparisonAffinity(leftExpr, ctx),\n resolveComparisonAffinity(rightExpr, ctx),\n );\n }\n if (op === \"LIKE\" || op === \"NOT LIKE\" || op === \"GLOB\" || op === \"NOT GLOB\") {\n if (left === null || right === null) return null;\n const matches = op.includes(\"LIKE\")\n ? likeMatch(textValue(left), textValue(right), null, ctx.functionContext?.caseSensitiveLike === true)\n : globMatch(textValue(left), textValue(right));\n return booleanValue(op.startsWith(\"NOT\") ? !matches : matches);\n }\n if (left === null || right === null) return null;\n switch (op) {\n case \"+\":\n if (storageClassOf(left) === \"integer\" && storageClassOf(right) === \"integer\") {\n return integerArithmetic(\"+\", left, right);\n }\n return asNumber(numberValue(left) + numberValue(right));\n case \"-\":\n if (storageClassOf(left) === \"integer\" && storageClassOf(right) === \"integer\") {\n return integerArithmetic(\"-\", left, right);\n }\n return asNumber(numberValue(left) - numberValue(right));\n case \"*\":\n if (storageClassOf(left) === \"integer\" && storageClassOf(right) === \"integer\") {\n return integerArithmetic(\"*\", left, right);\n }\n return asNumber(numberValue(left) * numberValue(right));\n case \"/\": {\n const divisor = numberValue(right);\n if (divisor === 0) return null;\n if (storageClassOf(left) === \"integer\" && storageClassOf(right) === \"integer\") {\n const quotient = integerValue(left) / integerValue(right);\n return quotient <= BigInt(Number.MAX_SAFE_INTEGER) && quotient >= BigInt(Number.MIN_SAFE_INTEGER)\n ? Number(quotient)\n : quotient;\n }\n return asNumber(numberValue(left) / divisor);\n }\n case \"%\": {\n const divisor = integerValue(right);\n if (divisor === 0n) return null;\n const remainder = integerValue(left) % divisor;\n if (isRealStorage(left) || isRealStorage(right)) {\n return asSqlReal(Number(remainder));\n }\n return safeIntegerResult(remainder);\n }\n case \"||\":\n return textValue(left) + textValue(right);\n case \"&\":\n return safeIntegerResult(integerValue(left) & integerValue(right));\n case \"|\":\n return safeIntegerResult(integerValue(left) | integerValue(right));\n case \"<<\":\n return safeIntegerResult(integerValue(left) << integerValue(right));\n case \">>\":\n return safeIntegerResult(integerValue(left) >> integerValue(right));\n case \"IN\":\n case \"NOT IN\":\n throw new SqliteError(`${op} requires an IN expression node`, \"misuse\");\n default:\n throw new SqliteError(`unsupported binary operator: ${op}`, \"unsupported\");\n }\n}\n\nfunction safeIntegerResult(value: bigint): number | bigint {\n return value <= BigInt(Number.MAX_SAFE_INTEGER) && value >= BigInt(Number.MIN_SAFE_INTEGER) ? Number(value) : value;\n}\n\nconst I64_MIN = -(2n ** 63n);\nconst I64_MAX = 2n ** 63n - 1n;\n\nfunction integerArithmetic(op: \"+\" | \"-\" | \"*\", left: SqlValue, right: SqlValue): SqlValue {\n const a = integerValue(left);\n const b = integerValue(right);\n const result = op === \"+\" ? a + b : op === \"-\" ? a - b : a * b;\n if (result < I64_MIN || result > I64_MAX) {\n return asSqlReal(Number(result));\n }\n return safeIntegerResult(result);\n}\n\nfunction compareRowValues(op: BinaryOp, leftExprs: Expr[], rightExprs: Expr[], ctx: EvalContext): SqlValue {\n if (leftExprs.length !== rightExprs.length) {\n throw new SqliteError(\"row value misused\", \"misuse\");\n }\n const isIsFamily = op === \"IS\" || op === \"IS NOT\" || op === \"IS DISTINCT FROM\" || op === \"IS NOT DISTINCT FROM\";\n let sawNull = false;\n for (let i = 0; i < leftExprs.length; i++) {\n const left = evalExpr(leftExprs[i]!, ctx);\n const right = evalExpr(rightExprs[i]!, ctx);\n if (isIsFamily) {\n const equal = left === null || right === null ? left === right : compareSql(left, right) === 0;\n if (!equal) {\n if (op === \"IS\" || op === \"IS NOT DISTINCT FROM\") return booleanValue(false);\n return booleanValue(true);\n }\n continue;\n }\n if (left === null || right === null) {\n sawNull = true;\n continue;\n }\n const cmp = compareSql(left, right);\n if (cmp === null) {\n sawNull = true;\n continue;\n }\n if (cmp !== 0) {\n switch (op) {\n case \"=\":\n case \"==\":\n return booleanValue(false);\n case \"!=\":\n case \"<>\":\n return booleanValue(true);\n case \"<\":\n return booleanValue(cmp < 0);\n case \"<=\":\n return booleanValue(cmp < 0);\n case \">\":\n return booleanValue(cmp > 0);\n case \">=\":\n return booleanValue(cmp > 0);\n }\n }\n }\n if (isIsFamily) {\n if (op === \"IS\" || op === \"IS NOT DISTINCT FROM\") return booleanValue(true);\n return booleanValue(false);\n }\n if (sawNull) return null;\n switch (op) {\n case \"=\":\n case \"==\":\n case \"<=\":\n case \">=\":\n return booleanValue(true);\n case \"!=\":\n case \"<>\":\n case \"<\":\n case \">\":\n return booleanValue(false);\n default:\n return null;\n }\n}\n\nfunction rowValuesEqual(left: SqlValue[], right: SqlValue[]): boolean | null {\n if (left.length !== right.length) return false;\n let sawNull = false;\n for (let i = 0; i < left.length; i++) {\n const a = left[i]!;\n const b = right[i]!;\n if (a === null || b === null) {\n sawNull = true;\n continue;\n }\n const cmp = compareSql(a, b);\n if (cmp === null) {\n sawNull = true;\n continue;\n }\n if (cmp !== 0) return false;\n }\n return sawNull ? null : true;\n}\n\n/** COLLATE name on `expr`, if any (does not walk column inheritance). */\nexport function explicitCollation(expr: Expr): string | null {\n switch (expr.type) {\n case \"collate\":\n return expr.collation;\n case \"unary\":\n case \"cast\":\n return explicitCollation(expr.expr);\n case \"is_bool\":\n return explicitCollation(expr.expr);\n case \"binary\":\n return explicitCollation(expr.left) ?? explicitCollation(expr.right);\n case \"between\":\n return explicitCollation(expr.expr) ?? explicitCollation(expr.lower) ?? explicitCollation(expr.upper);\n case \"in\":\n return (\n explicitCollation(expr.expr) ??\n (Array.isArray(expr.values) ? (expr.values.map(explicitCollation).find((name) => name !== null) ?? null) : null)\n );\n case \"like\":\n return explicitCollation(expr.expr) ?? explicitCollation(expr.pattern);\n case \"case\":\n return (\n (expr.base && explicitCollation(expr.base)) ??\n expr.whens\n .flatMap((branch) => [branch.when, branch.then])\n .map(explicitCollation)\n .find((name) => name !== null) ??\n (expr.else && explicitCollation(expr.else)) ??\n null\n );\n case \"row\":\n return expr.values.map(explicitCollation).find((name) => name !== null) ?? null;\n default:\n return null;\n }\n}\n\n/** Explicit COLLATE wins; otherwise inherit declared column collation (left then right). */\nfunction resolveComparisonCollation(leftExpr: Expr, rightExpr: Expr, ctx: EvalContext): string | null {\n const explicit = explicitCollation(leftExpr) ?? explicitCollation(rightExpr);\n if (explicit) return explicit;\n return inheritedCollation(leftExpr, ctx) ?? inheritedCollation(rightExpr, ctx);\n}\n\nfunction inheritedCollation(expr: Expr, ctx: EvalContext): string | null {\n switch (expr.type) {\n case \"collate\":\n return inheritedCollation(expr.expr, ctx);\n case \"column\":\n return (\n ctx.resolveCollation?.(expr.table, expr.name) ?? ctx.parent?.resolveCollation?.(expr.table, expr.name) ?? null\n );\n case \"unary\":\n case \"cast\":\n return inheritedCollation(expr.expr, ctx);\n case \"is_bool\":\n return inheritedCollation(expr.expr, ctx);\n default:\n return null;\n }\n}\n\nfunction resolveComparisonAffinity(expr: Expr, ctx: EvalContext): Affinity | null {\n switch (expr.type) {\n case \"column\":\n return (\n ctx.resolveAffinity?.(expr.table, expr.name) ?? ctx.parent?.resolveAffinity?.(expr.table, expr.name) ?? null\n );\n case \"cast\":\n return affinityFromTypeName(expr.typeName);\n case \"collate\":\n return resolveComparisonAffinity(expr.expr, ctx);\n default:\n return null;\n }\n}\n\nfunction evalIn(left: SqlValue, values: SqlValue[], not: boolean, leftAffinity: Affinity | null): SqlValue {\n if (values.length === 0) return booleanValue(not);\n if (left === null) return null;\n let sawNull = false;\n for (const value of values) {\n if (value === null) {\n sawNull = true;\n } else if (compareSql(...applyComparisonAffinity(left, value, leftAffinity, null)) === 0) {\n return booleanValue(!not);\n }\n }\n if (sawNull) return null;\n return booleanValue(not);\n}\n\n/**\n * Evaluate a parsed SQL expression against `ctx` (columns, parameters, functions).\n *\n * @param expr - Expression AST node from {@link parse}.\n * @param ctx - Column / parameter / function resolution.\n */\nexport function evalExpr(expr: Expr, ctx: EvalContext): SqlValue {\n switch (expr.type) {\n case \"literal\": {\n if (expr.forceReal && typeof expr.value === \"number\") {\n return asSqlReal(expr.value);\n }\n return expr.value;\n }\n case \"null\":\n return null;\n case \"column\":\n return resolveColumn(ctx, expr.table, expr.name);\n case \"parameter\":\n return ctx.getParameter(expr.name);\n case \"collate\":\n return evalExpr(expr.expr, ctx);\n case \"unary\": {\n const value = evalExpr(expr.expr, ctx);\n if (expr.op === \"NOT\") {\n const truth = isTruthySql(value);\n return truth === null ? null : booleanValue(!truth);\n }\n if (value === null) return null;\n if (expr.op === \"+\") {\n const n = asNumber(numberValue(value));\n return storageClassOf(value) === \"real\" ? asSqlReal(n) : n;\n }\n if (expr.op === \"-\") {\n const n = asNumber(-numberValue(value));\n return storageClassOf(value) === \"real\" ? asSqlReal(n) : n;\n }\n return ~integerValue(value);\n }\n case \"is_bool\": {\n const truth = isTruthySql(evalExpr(expr.expr, ctx));\n if (!expr.not && expr.sense) return booleanValue(truth === true);\n if (!expr.not && !expr.sense) return booleanValue(truth === false);\n if (expr.not && expr.sense) return booleanValue(truth !== true);\n return booleanValue(truth !== false);\n }\n case \"binary\":\n return evalBinary(expr.op, expr.left, expr.right, ctx);\n case \"between\": {\n const value = evalExpr(expr.expr, ctx);\n const collation =\n resolveComparisonCollation(expr.expr, expr.lower, ctx) ??\n resolveComparisonCollation(expr.expr, expr.upper, ctx) ??\n undefined;\n const affinity = resolveComparisonAffinity(expr.expr, ctx);\n const lower = compareResult(\">=\", value, evalExpr(expr.lower, ctx), collation, affinity);\n const result = sqlAnd(lower, () => compareResult(\"<=\", value, evalExpr(expr.upper, ctx), collation, affinity));\n if (result === null) return null;\n return expr.not ? booleanValue(result === 0) : result;\n }\n case \"in\": {\n if (expr.expr.type === \"row\" && Array.isArray(expr.values)) {\n const left = expr.expr.values.map((value) => evalExpr(value, ctx));\n let sawNull = false;\n let found = false;\n for (const candidate of expr.values) {\n if (candidate.type !== \"row\") {\n throw new SqliteError(\"row value misused\", \"misuse\");\n }\n const right = candidate.values.map((value) => evalExpr(value, ctx));\n const eq = rowValuesEqual(left, right);\n if (eq === true) {\n found = true;\n break;\n }\n if (eq === null) sawNull = true;\n }\n if (found) return booleanValue(!expr.not);\n if (sawNull) return null;\n return booleanValue(expr.not);\n }\n const left = evalExpr(expr.expr, ctx);\n const values = Array.isArray(expr.values)\n ? expr.values.map((value) => evalExpr(value, ctx))\n : executeSelect(ctx, expr.values).rows.map((row) => row[0] ?? null);\n return evalIn(left, values, expr.not, resolveComparisonAffinity(expr.expr, ctx));\n }\n case \"like\": {\n const value = evalExpr(expr.expr, ctx);\n const pattern = evalExpr(expr.pattern, ctx);\n const escape = expr.escape === null ? null : evalExpr(expr.escape, ctx);\n if (value === null || pattern === null || (escape === null && expr.escape !== null)) return null;\n const match =\n expr.op === \"LIKE\"\n ? likeMatch(\n textValue(value),\n textValue(pattern),\n escape === null ? null : textValue(escape),\n ctx.functionContext?.caseSensitiveLike === true,\n )\n : globMatch(textValue(value), textValue(pattern));\n return booleanValue(expr.not ? !match : match);\n }\n case \"case\": {\n if (expr.base === null) {\n for (const branch of expr.whens) {\n if (isTruthySql(evalExpr(branch.when, ctx)) === true) return evalExpr(branch.then, ctx);\n }\n } else {\n const base = evalExpr(expr.base, ctx);\n for (const branch of expr.whens) {\n if (compareSql(base, evalExpr(branch.when, ctx)) === 0) return evalExpr(branch.then, ctx);\n }\n }\n return expr.else === null ? null : evalExpr(expr.else, ctx);\n }\n case \"cast\":\n return castSqlValue(evalExpr(expr.expr, ctx), expr.typeName);\n case \"function\": {\n if (expr.args === \"*\") throw new SqliteError(`wrong number of arguments to function ${expr.name}()`, \"misuse\");\n if (expr.name.toLowerCase() === \"raise\") {\n evalRaiseFunction(expr.args, ctx);\n throw new SqliteError(\"RAISE() did not abort execution\", \"misuse\");\n }\n if (\n expr.name.toLowerCase() === \"typeof\" &&\n expr.args.length === 1 &&\n expr.args[0]?.type === \"column\" &&\n ctx.resolveStorageClass\n ) {\n return ctx.resolveStorageClass(expr.args[0].table, expr.args[0].name);\n }\n const fn = (ctx.functions ?? defaultFunctionRegistry).lookupScalar(expr.name);\n if (!fn) throw new SqliteError(`no such function: ${expr.name}`, \"other\");\n return fn(\n expr.args.map((arg) => evalExpr(arg, ctx)),\n ctx.functionContext ?? {},\n );\n }\n case \"exists\": {\n const exists = executeSelect(ctx, expr.select).rows.length > 0;\n return booleanValue(expr.not ? !exists : exists);\n }\n case \"subquery\": {\n const result = executeSelect(ctx, expr.select);\n if (result.columns.length > 1) throw new SqliteError(\"sub-select returns more than 1 column\", \"other\");\n return result.rows[0]?.[0] ?? null;\n }\n case \"aggregate\":\n throw new SqliteError(\"window expression requires window evaluation\", \"misuse\");\n case \"window\":\n throw new SqliteError(\"misuse of window function\", \"misuse\");\n case \"row\":\n throw new SqliteError(\"row value cannot be used as a scalar value\", \"misuse\");\n }\n}\n\nfunction evalRaiseFunction(args: Expr[], ctx: EvalContext): never {\n if (!ctx.raise) throw new SqliteError(\"RAISE() may only be used within a trigger-program\", \"other\");\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function RAISE()\", \"misuse\");\n }\n const action = raiseActionName(args[0]!);\n if (!action) throw new SqliteError(\"bad argument to RAISE()\", \"other\");\n let message: string | undefined;\n if (args.length === 2) {\n const value = evalExpr(args[1]!, ctx);\n message = value === null ? undefined : String(value);\n }\n ctx.raise(action, message);\n throw new SqliteError(message ?? \"RAISE\", \"other\");\n}\n\nfunction raiseActionName(expr: Expr): \"IGNORE\" | \"ABORT\" | \"FAIL\" | \"ROLLBACK\" | null {\n if (expr.type === \"column\" && expr.table === null) {\n const name = expr.name.toUpperCase();\n if (name === \"IGNORE\" || name === \"ABORT\" || name === \"FAIL\" || name === \"ROLLBACK\") return name;\n }\n if (expr.type === \"literal\" && typeof expr.value === \"string\") {\n const name = expr.value.toUpperCase();\n if (name === \"IGNORE\" || name === \"ABORT\" || name === \"FAIL\" || name === \"ROLLBACK\") return name;\n }\n return null;\n}\n", "import type { IndexedColumn } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { Cell, ExecutionEnv } from \"../executor/env.ts\";\nimport type { EvalContext } from \"../expressions/context.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { defaultFunctionRegistry } from \"../functions/registry.ts\";\nimport type { IndexInfo } from \"../storage/database-state.ts\";\nimport { normalizeColumnName, type Row } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { normalizeForCollation } from \"../types/collation.ts\";\nimport { applyAffinity, isTruthySql, type SqlValue } from \"../types/value.ts\";\n\n/** Heap cells for evaluating index expressions / partial `WHERE` via `ExecutionEnv`. */\nexport function heapRowCells(table: Table, row: Row, env?: ExecutionEnv): Cell[] {\n const alias = table.name;\n const baseCells: Cell[] = table.columns\n .filter((column) => !column.generated || column.generated.stored)\n .map((column) => ({\n table: alias,\n name: column.name,\n value: table.cell(row, normalizeColumnName(column.name)),\n affinity: column.affinity,\n collate: column.collate,\n }));\n const cells = [...baseCells];\n if (env) {\n for (const column of table.columns) {\n if (!column.generated || column.generated.stored) continue;\n const ctx = env.createEvalContext({ cells: baseCells, sourceTable: table.name });\n const value = applyAffinity(evalExpr(column.generated.expr, ctx), column.affinity);\n cells.push({\n table: alias,\n name: column.name,\n value,\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n } else {\n for (const column of table.columns) {\n if (!column.generated || column.generated.stored) continue;\n cells.push({\n table: alias,\n name: column.name,\n value: null,\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n }\n cells.sort((a, b) => {\n const ai = table.columns.findIndex((column) => column.name.toLowerCase() === a.name.toLowerCase());\n const bi = table.columns.findIndex((column) => column.name.toLowerCase() === b.name.toLowerCase());\n return ai - bi;\n });\n return cells;\n}\n\n/** Indexed-column values for one heap row (expression indexes included when `ctx` is set). */\nexport function indexKeyValues(\n columns: readonly IndexedColumn[],\n row: Row,\n ctx?: EvalContext | null,\n table?: Table,\n): SqlValue[] {\n return columns.map((column) => {\n let raw: SqlValue;\n if (column.expr && ctx) {\n raw = evalExpr(column.expr, ctx);\n } else if (ctx) {\n // Bare column refs (including VIRTUAL generated columns) come from scope, not heap storage.\n raw = ctx.resolveColumn(null, column.name);\n } else if (table) {\n raw = table.cell(row, normalizeColumnName(column.name));\n } else {\n raw = null;\n }\n return normalizeForCollation(raw, column.collate ?? \"BINARY\");\n });\n}\n\n/** Rebuild `index.store` from `table` using the same keys as DML maintenance. */\nexport function rebuildIndexFromTable(index: IndexInfo, table: Table, ctxForRow: (row: Row) => EvalContext): void {\n index.store.clear();\n for (const row of table.scan()) {\n const ctx = ctxForRow(row);\n if (index.where && isTruthySql(evalExpr(index.where, ctx)) !== true) continue;\n index.store.insert(indexKeyValues(index.columns, row, ctx, table), row.rowid, index.unique);\n }\n}\n\n/** Snapshot / no-`ExecutionEnv` evaluator for index expressions / partial predicates. */\nexport function tableRowEvalContext(table: Table, row: Row): EvalContext {\n return {\n functions: defaultFunctionRegistry,\n resolveColumn: (qualifier, name) => {\n if (qualifier && qualifier.toLowerCase() !== table.name.toLowerCase()) {\n throw new SqliteError(`no such column: ${qualifier}.${name}`, \"no_such_column\");\n }\n const key = name.toLowerCase();\n if (key === \"rowid\" || key === \"_rowid_\" || key === \"oid\") return row.rowid;\n if (!table.hasColumn(key) && key !== \"rowid\") {\n throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n }\n return table.cell(row, key);\n },\n getParameter: () => {\n throw new SqliteError(\"parameters are not allowed in index predicates\", \"misuse\");\n },\n };\n}\n", "import { isSqlJsonText, isSqlReal, type QueryRow, type QueryValue, type SqlValue } from \"../types/value.ts\";\n\n/** Query result returned by {@link Statement.result}. */\nexport interface ResultSet {\n /** Result-column names, in SELECT order. Present even when `rows` is empty. */\n columns: string[];\n /** Named rows. Duplicate column names keep the last value. */\n rows: QueryRow[];\n /** Positional rows; always present (empty array when there are zero rows). */\n values: QueryValue[][];\n /** Rows changed by the most recent mutating statement in this execution. */\n changes: number;\n /** Rowid of the most recent INSERT in this execution. */\n lastInsertRowid: number | bigint;\n}\n\nexport function emptyResult(changes = 0, lastInsertRowid: number | bigint = 0): ResultSet {\n return { columns: [], rows: [], values: [], changes, lastInsertRowid };\n}\n\n/** Export engine values to the public JS surface (SqlReal \u2192 number, SqlJsonText \u2192 string). */\nexport function exportSqlValue(value: SqlValue): QueryValue {\n if (isSqlReal(value)) return value.value;\n if (isSqlJsonText(value)) return value.value;\n return value;\n}\n\nexport function valuesToResult(\n columns: string[],\n values: SqlValue[][],\n changes = 0,\n lastInsertRowid: number | bigint = 0,\n options?: { named?: boolean; keepValues?: boolean },\n): ResultSet {\n const named = options?.named !== false;\n const keepValues = options?.keepValues !== false;\n return {\n columns,\n values: keepValues ? values.map((row) => row.map(exportSqlValue)) : [],\n rows: named\n ? values.map((row) => {\n const object: QueryRow = {};\n for (let index = 0; index < columns.length; index++) {\n object[columns[index]!] = exportSqlValue(row[index] ?? null);\n }\n return object;\n })\n : [],\n changes,\n lastInsertRowid,\n };\n}\n\nexport function resultValues(result: ResultSet): SqlValue[][] {\n if (result.values.length > 0 || result.rows.length === 0) {\n return result.values.map((row) => [...row]);\n }\n return result.rows.map((row) => result.columns.map((column) => row[column] ?? null));\n}\n", "import type { AttachStmt, DetachStmt } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { DatabaseState } from \"../storage/database-state.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { emptyResult, type ResultSet } from \"./result.ts\";\n\nexport function executeAttach(stmt: AttachStmt, env: ExecutionEnv): ResultSet {\n const filename = evalExpr(stmt.filename, env.createEvalContext());\n if (typeof filename !== \"string\") {\n throw new SqliteError(\"filename argument to ATTACH must be a string\", \"datatype_mismatch\");\n }\n const schema = stmt.schema.toLowerCase();\n if (schema === \"main\") {\n throw new SqliteError(\"database main is already in use\", \"other\");\n }\n if (schema === \"temp\") {\n throw new SqliteError(\"database temp is already in use\", \"other\");\n }\n if (env.state.attached.has(schema)) {\n throw new SqliteError(`database ${stmt.schema} is already in use`, \"other\");\n }\n env.state.attached.set(schema, { state: new DatabaseState(), filename });\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDetach(stmt: DetachStmt, env: ExecutionEnv): ResultSet {\n const schema = stmt.schema.toLowerCase();\n if (schema === \"main\") {\n throw new SqliteError(\"cannot detach database main\", \"other\");\n }\n if (schema === \"temp\") {\n throw new SqliteError(\"cannot detach database temp\", \"other\");\n }\n if (!env.state.attached.delete(schema)) {\n throw new SqliteError(`no such database: ${stmt.schema}`, \"other\");\n }\n return emptyResult(0, env.state.lastInsertRowid);\n}\n", "import { tokenize } from \"../lexer/tokenize.ts\";\n\n/**\n * Normalize CREATE source toward SQLite's `sqlite_master.sql` conventions:\n * strip TEMP/TEMPORARY, IF NOT EXISTS, and schema qualifiers on the object name.\n * Body text (from after the object name) is preserved byte-for-byte from the input.\n */\nexport function normalizeMasterSql(sql: string): string {\n const trimmed = sql\n .trim()\n .replace(/;+\\s*$/u, \"\")\n .trim();\n if (!trimmed) return trimmed;\n\n const tokens = tokenize(trimmed);\n if (tokens.length === 0 || tokens[0]!.kind === \"EOF\") return trimmed;\n\n let i = 0;\n const at = (offset: number, ...kinds: string[]): boolean => {\n const tok = tokens[i + offset];\n return tok !== undefined && kinds.includes(tok.kind);\n };\n\n if (!at(0, \"CREATE\")) return trimmed;\n i++; // CREATE\n\n if (at(0, \"TEMP\", \"TEMPORARY\")) i++;\n\n let headKind: \"table\" | \"view\" | \"index\" | \"trigger\" | \"vtable\" | \"unique_index\" = \"table\";\n if (at(0, \"UNIQUE\") && at(1, \"INDEX\")) {\n headKind = \"unique_index\";\n i += 2;\n } else if (at(0, \"VIRTUAL\") && at(1, \"TABLE\")) {\n headKind = \"vtable\";\n i += 2;\n } else if (at(0, \"TABLE\")) {\n headKind = \"table\";\n i++;\n } else if (at(0, \"VIEW\")) {\n headKind = \"view\";\n i++;\n } else if (at(0, \"INDEX\")) {\n headKind = \"index\";\n i++;\n } else if (at(0, \"TRIGGER\")) {\n headKind = \"trigger\";\n i++;\n } else {\n return trimmed;\n }\n\n if (at(0, \"IF\") && at(1, \"NOT\") && at(2, \"EXISTS\")) i += 3;\n\n let nameText = \"\";\n let nameEnd = 0;\n if (tokens[i] && tokens[i]!.kind !== \"EOF\" && at(1, \"DOT\") && tokens[i + 2] && tokens[i + 2]!.kind !== \"EOF\") {\n nameText = trimmed.slice(tokens[i + 2]!.start, tokens[i + 2]!.end);\n nameEnd = tokens[i + 2]!.end;\n i += 3;\n } else if (tokens[i] && tokens[i]!.kind !== \"EOF\") {\n nameText = trimmed.slice(tokens[i]!.start, tokens[i]!.end);\n nameEnd = tokens[i]!.end;\n i++;\n }\n\n // Preserve whitespace between the object name and the body (SQLite keeps `projects (`).\n const body = nameEnd < trimmed.length ? trimmed.slice(nameEnd) : \"\";\n const needsSpace = body.length > 0 && !/^[\\s(]/u.test(body);\n\n const head =\n headKind === \"unique_index\"\n ? \"CREATE UNIQUE INDEX\"\n : headKind === \"vtable\"\n ? \"CREATE VIRTUAL TABLE\"\n : headKind === \"view\"\n ? \"CREATE VIEW\"\n : headKind === \"index\"\n ? \"CREATE INDEX\"\n : headKind === \"trigger\"\n ? \"CREATE TRIGGER\"\n : \"CREATE TABLE\";\n\n if (body.length === 0) return `${head} ${nameText}`;\n return needsSpace ? `${head} ${nameText} ${body}` : `${head} ${nameText}${body}`;\n}\n\n/** Append an ALTER TABLE ADD COLUMN definition into CREATE TABLE master sql (SQLite style). */\nexport function appendAddColumnToMasterSql(originalSql: string | null, alterSql: string | null): string | null {\n if (!originalSql || !alterSql) return originalSql;\n const match = alterSql.match(/\\bADD\\s+(?:COLUMN\\s+)?(.+)$/iu);\n if (!match?.[1]) return originalSql;\n const colDef = match[1]\n .trim()\n .replace(/;+\\s*$/u, \"\")\n .trim();\n const close = originalSql.lastIndexOf(\")\");\n if (close < 0) return originalSql;\n return `${originalSql.slice(0, close)}, ${colDef}${originalSql.slice(close)}`;\n}\n\n/** Synthesize CTAS catalog SQL: `CREATE TABLE name(col1, col2, ...)`. */\nexport function synthesizeCtasMasterSql(tableName: string, columnNames: string[]): string {\n const cols = columnNames.map(quoteIdentIfNeeded).join(\",\");\n return `CREATE TABLE ${quoteIdentIfNeeded(tableName)}(${cols})`;\n}\n\nfunction quoteIdentIfNeeded(name: string): string {\n if (/^[A-Za-z_][A-Za-z0-9_]*$/u.test(name)) return name;\n return `\"${name.replaceAll('\"', '\"\"')}\"`;\n}\n", "import { compareSql, type SqlValue } from \"../types/value.ts\";\n\nexport type PartitionRow = SqlValue[];\n\nfunction rowsEqual(left: PartitionRow, right: PartitionRow): boolean {\n if (left.length !== right.length) return false;\n return left.every((value, index) => {\n const other = right[index];\n return (value === null && other === null) || (other !== undefined && compareSql(value, other) === 0);\n });\n}\n\nexport function rowNumber(_partition: PartitionRow[], index: number): number {\n return index + 1;\n}\n\nexport function rank(partition: PartitionRow[], index: number, orderKeys: PartitionRow[] = partition): number {\n if (index <= 0) return 1;\n let firstPeer = index;\n while (firstPeer > 0 && rowsEqual(orderKeys[firstPeer]!, orderKeys[firstPeer - 1]!)) firstPeer--;\n return firstPeer + 1;\n}\n\nexport function denseRank(partition: PartitionRow[], index: number, orderKeys: PartitionRow[] = partition): number {\n if (index <= 0) return 1;\n let result = 1;\n for (let i = 1; i <= index; i++) {\n if (!rowsEqual(orderKeys[i]!, orderKeys[i - 1]!)) result++;\n }\n return result;\n}\n\nexport function lag(\n partition: PartitionRow[],\n index: number,\n valueIndex = 0,\n offset = 1,\n defaultValue: SqlValue = null,\n): SqlValue {\n const target = index - Math.max(0, Math.trunc(offset));\n return target < 0 ? defaultValue : (partition[target]?.[valueIndex] ?? null);\n}\n\nexport function lead(\n partition: PartitionRow[],\n index: number,\n valueIndex = 0,\n offset = 1,\n defaultValue: SqlValue = null,\n): SqlValue {\n const target = index + Math.max(0, Math.trunc(offset));\n return target >= partition.length ? defaultValue : (partition[target]?.[valueIndex] ?? null);\n}\n\nexport function firstValue(partition: PartitionRow[], valueIndex = 0, frameStart = 0): SqlValue {\n return partition[frameStart]?.[valueIndex] ?? null;\n}\n\nexport function lastValue(partition: PartitionRow[], valueIndex = 0, frameEnd = partition.length - 1): SqlValue {\n return partition[frameEnd]?.[valueIndex] ?? null;\n}\n\nexport function nthValue(partition: PartitionRow[], n: number, valueIndex = 0, frameStart = 0): SqlValue {\n const offset = Math.trunc(n);\n if (offset <= 0) return null;\n return partition[frameStart + offset - 1]?.[valueIndex] ?? null;\n}\n\nexport const windowFunctions = {\n row_number: rowNumber,\n rank,\n dense_rank: denseRank,\n lag,\n lead,\n first_value: firstValue,\n last_value: lastValue,\n nth_value: nthValue,\n ntile: () => 0,\n cume_dist: () => 0,\n percent_rank: () => 0,\n} as const;\n", "/**\n * Shared PRAGMA query engine used by statement-form `PRAGMA \u2026` and `pragma_*` TVFs.\n */\nimport type { Expr } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { aggregateFunctions } from \"../functions/aggregate.ts\";\nimport { dateTimeFunctions } from \"../functions/datetime.ts\";\nimport { ftsAuxFunctions, rtreeAuxFunctions } from \"../functions/extensions.ts\";\nimport { jsonAggregateFunctions, jsonScalarFunctions } from \"../functions/json.ts\";\nimport { mathFunctions } from \"../functions/math.ts\";\nimport { getScalarFunctions } from \"../functions/scalar.ts\";\nimport { windowFunctions } from \"../functions/window.ts\";\nimport type { IndexInfo } from \"../storage/database-state.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { isTruthySql, type SqlValue, toInteger } from \"../types/value.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\n\nexport interface PragmaQueryResult {\n columns: string[];\n rows: SqlValue[][];\n}\n\n/** Oracle-exposed pragma_* TVF base names (without the `pragma_` prefix). */\nexport const PRAGMA_TVF_NAMES = [\n \"analysis_limit\",\n \"application_id\",\n \"auto_vacuum\",\n \"automatic_index\",\n \"busy_timeout\",\n \"cache_size\",\n \"cache_spill\",\n \"cell_size_check\",\n \"checkpoint_fullfsync\",\n \"collation_list\",\n \"compile_options\",\n \"count_changes\",\n \"data_version\",\n \"database_list\",\n \"default_cache_size\",\n \"defer_foreign_keys\",\n \"empty_result_callbacks\",\n \"encoding\",\n \"foreign_key_check\",\n \"foreign_key_list\",\n \"foreign_keys\",\n \"freelist_count\",\n \"full_column_names\",\n \"fullfsync\",\n \"function_list\",\n \"hard_heap_limit\",\n \"ignore_check_constraints\",\n \"index_info\",\n \"index_list\",\n \"index_xinfo\",\n \"integrity_check\",\n \"journal_mode\",\n \"journal_size_limit\",\n \"legacy_alter_table\",\n \"locking_mode\",\n \"max_page_count\",\n \"module_list\",\n \"optimize\",\n \"page_count\",\n \"page_size\",\n \"pragma_list\",\n \"query_only\",\n \"quick_check\",\n \"read_uncommitted\",\n \"recursive_triggers\",\n \"reverse_unordered_selects\",\n \"schema_version\",\n \"secure_delete\",\n \"short_column_names\",\n \"soft_heap_limit\",\n \"synchronous\",\n \"table_info\",\n \"table_list\",\n \"table_xinfo\",\n \"temp_store\",\n \"threads\",\n \"trusted_schema\",\n \"user_version\",\n \"writable_schema\",\n] as const;\n\n/** Full pragma name list for `pragma_pragma_list` (includes names without TVFs). */\nexport const PRAGMA_LIST_NAMES = [\n \"activate_extensions\",\n ...PRAGMA_TVF_NAMES,\n \"case_sensitive_like\",\n \"hexkey\",\n \"hexrekey\",\n \"incremental_vacuum\",\n \"key\",\n \"lock_proxy_file\",\n \"mmap_size\",\n \"rekey\",\n \"shrink_memory\",\n \"temp_store_directory\",\n \"textkey\",\n \"textrekey\",\n \"wal_autocheckpoint\",\n \"wal_checkpoint\",\n].sort((a, b) => a.localeCompare(b));\n\nconst MEMORY_VTABLE_MODULES = [\n \"bytecode\",\n \"dbstat\",\n \"fts3\",\n \"fts3tokenize\",\n \"fts4\",\n \"fts4aux\",\n \"fts5\",\n \"fts5vocab\",\n \"json_each\",\n \"json_tree\",\n \"rtree\",\n \"rtree_i32\",\n \"tables_used\",\n];\n\nconst COMPILE_OPTIONS = [\n \"COMPILER=typescript\",\n \"ENABLE_FTS3\",\n \"ENABLE_FTS4\",\n \"ENABLE_FTS5\",\n \"ENABLE_JSON1\",\n \"ENABLE_RTREE\",\n \"THREADSAFE=0\",\n];\n\n/** Stable in-memory defaults matching bun:sqlite `:memory:` where applicable. */\nconst STORAGE_DEFAULTS: Record<string, { column: string; value: SqlValue }> = {\n analysis_limit: { column: \"analysis_limit\", value: 0 },\n application_id: { column: \"application_id\", value: 0 },\n auto_vacuum: { column: \"auto_vacuum\", value: 0 },\n automatic_index: { column: \"automatic_index\", value: 1 },\n busy_timeout: { column: \"timeout\", value: 0 },\n cache_size: { column: \"cache_size\", value: 2000 },\n cache_spill: { column: \"cache_spill\", value: 20000 },\n cell_size_check: { column: \"cell_size_check\", value: 0 },\n checkpoint_fullfsync: { column: \"checkpoint_fullfsync\", value: 1 },\n count_changes: { column: \"count_changes\", value: 0 },\n data_version: { column: \"data_version\", value: 1 },\n default_cache_size: { column: \"cache_size\", value: 2000 },\n defer_foreign_keys: { column: \"defer_foreign_keys\", value: 0 },\n empty_result_callbacks: { column: \"empty_result_callbacks\", value: 0 },\n encoding: { column: \"encoding\", value: \"UTF-8\" },\n freelist_count: { column: \"freelist_count\", value: 0 },\n full_column_names: { column: \"full_column_names\", value: 0 },\n fullfsync: { column: \"fullfsync\", value: 0 },\n hard_heap_limit: { column: \"hard_heap_limit\", value: 0 },\n ignore_check_constraints: { column: \"ignore_check_constraints\", value: 0 },\n journal_mode: { column: \"journal_mode\", value: \"memory\" },\n journal_size_limit: { column: \"journal_size_limit\", value: 32768 },\n legacy_alter_table: { column: \"legacy_alter_table\", value: 1 },\n locking_mode: { column: \"locking_mode\", value: \"normal\" },\n max_page_count: { column: \"max_page_count\", value: 1073741823 },\n page_size: { column: \"page_size\", value: 4096 },\n query_only: { column: \"query_only\", value: 0 },\n read_uncommitted: { column: \"read_uncommitted\", value: 0 },\n recursive_triggers: { column: \"recursive_triggers\", value: 0 },\n reverse_unordered_selects: { column: \"reverse_unordered_selects\", value: 0 },\n secure_delete: { column: \"secure_delete\", value: 2 },\n short_column_names: { column: \"short_column_names\", value: 1 },\n soft_heap_limit: { column: \"soft_heap_limit\", value: 0 },\n synchronous: { column: \"synchronous\", value: 2 },\n temp_store: { column: \"temp_store\", value: 0 },\n threads: { column: \"threads\", value: 0 },\n trusted_schema: { column: \"trusted_schema\", value: 1 },\n writable_schema: { column: \"writable_schema\", value: 0 },\n};\n\nexport function isPragmaTvfName(name: string): boolean {\n const lower = name.toLowerCase();\n if ((PRAGMA_TVF_NAMES as readonly string[]).includes(lower)) return true;\n if (lower.startsWith(\"pragma_\")) {\n return (PRAGMA_TVF_NAMES as readonly string[]).includes(lower.slice(\"pragma_\".length));\n }\n return false;\n}\n\n/**\n * Column names for a pragma_* TVF without evaluating arguments.\n * Used by SELECT shape analysis so correlated args (e.g. `tl.name`) are not\n * resolved before the outer row is bound.\n */\nexport function pragmaTvfColumns(name: string): string[] | null {\n const key = normalizePragmaKey(name);\n switch (key) {\n case \"foreign_keys\":\n return [\"foreign_keys\"];\n case \"user_version\":\n return [\"user_version\"];\n case \"schema_version\":\n return [\"schema_version\"];\n case \"table_info\":\n return [\"cid\", \"name\", \"type\", \"notnull\", \"dflt_value\", \"pk\"];\n case \"table_xinfo\":\n return [\"cid\", \"name\", \"type\", \"notnull\", \"dflt_value\", \"pk\", \"hidden\"];\n case \"index_list\":\n return [\"seq\", \"name\", \"unique\", \"origin\", \"partial\"];\n case \"index_info\":\n return [\"seqno\", \"cid\", \"name\"];\n case \"index_xinfo\":\n return [\"seqno\", \"cid\", \"name\", \"desc\", \"coll\", \"key\"];\n case \"foreign_key_list\":\n return [\"id\", \"seq\", \"table\", \"from\", \"to\", \"on_update\", \"on_delete\", \"match\"];\n case \"foreign_key_check\":\n return [\"table\", \"rowid\", \"parent\", \"fkid\"];\n case \"database_list\":\n return [\"seq\", \"name\", \"file\"];\n case \"table_list\":\n return [\"schema\", \"name\", \"type\", \"ncol\", \"wr\", \"strict\"];\n case \"collation_list\":\n return [\"seq\", \"name\"];\n case \"compile_options\":\n return [\"compile_options\"];\n case \"function_list\":\n return [\"name\", \"builtin\", \"type\", \"enc\", \"narg\", \"flags\"];\n case \"module_list\":\n case \"pragma_list\":\n return [\"name\"];\n case \"integrity_check\":\n case \"quick_check\":\n return [key];\n case \"optimize\":\n return [\"optimize\"];\n case \"page_count\":\n return [\"page_count\"];\n default: {\n const storage = STORAGE_DEFAULTS[key];\n if (storage) return [storage.column];\n return null;\n }\n }\n}\n\nfunction normalizePragmaKey(name: string): string {\n const lower = name.toLowerCase();\n if ((PRAGMA_TVF_NAMES as readonly string[]).includes(lower)) return lower;\n if (lower.startsWith(\"pragma_\")) {\n const stripped = lower.slice(\"pragma_\".length);\n if ((PRAGMA_TVF_NAMES as readonly string[]).includes(stripped)) return stripped;\n return stripped;\n }\n return lower;\n}\n\n/**\n * Query a pragma by name with optional SQL values (TVF args or evaluated statement args).\n * Read-only \u2014 writers stay in {@link executePragma}.\n */\nexport function queryPragma(name: string, args: readonly SqlValue[], env: ExecutionEnv): PragmaQueryResult {\n const key = normalizePragmaKey(name);\n\n switch (key) {\n case \"foreign_keys\":\n return single(\"foreign_keys\", env.state.foreignKeysEnabled ? 1 : 0);\n case \"case_sensitive_like\":\n return single(\"case_sensitive_like\", env.state.caseSensitiveLike ? 1 : 0);\n case \"user_version\":\n return single(\"user_version\", env.state.userVersion);\n case \"schema_version\":\n return single(\"schema_version\", env.state.schemaVersion);\n case \"table_info\":\n return pragmaTableInfo(args, env, false);\n case \"table_xinfo\":\n return pragmaTableInfo(args, env, true);\n case \"index_list\":\n return pragmaIndexList(args, env);\n case \"index_info\":\n return pragmaIndexInfo(args, env, false);\n case \"index_xinfo\":\n return pragmaIndexInfo(args, env, true);\n case \"foreign_key_list\":\n return pragmaForeignKeyList(args, env);\n case \"foreign_key_check\":\n return pragmaForeignKeyCheck(args, env);\n case \"database_list\":\n return pragmaDatabaseList(env);\n case \"table_list\":\n return pragmaTableList(env);\n case \"collation_list\":\n return {\n columns: [\"seq\", \"name\"],\n rows: [\n [0, \"RTRIM\"],\n [1, \"NOCASE\"],\n [2, \"BINARY\"],\n ],\n };\n case \"compile_options\":\n return { columns: [\"compile_options\"], rows: COMPILE_OPTIONS.map((opt) => [opt]) };\n case \"function_list\":\n return pragmaFunctionList();\n case \"module_list\":\n return pragmaModuleList();\n case \"pragma_list\":\n return { columns: [\"name\"], rows: PRAGMA_LIST_NAMES.map((n) => [n]) };\n case \"integrity_check\":\n case \"quick_check\":\n return single(key, \"ok\");\n case \"optimize\":\n return { columns: [\"optimize\"], rows: [] };\n case \"page_count\":\n return single(\"page_count\", estimatePageCount(env));\n default: {\n const storage = STORAGE_DEFAULTS[key];\n if (storage) return single(storage.column, storage.value);\n return { columns: [], rows: [] };\n }\n }\n}\n\nfunction single(column: string, value: SqlValue): PragmaQueryResult {\n return { columns: [column], rows: [[value]] };\n}\n\nfunction estimatePageCount(env: ExecutionEnv): number {\n const objects = env.state.tables.size + env.state.indexes.size + env.state.views.size + env.state.virtualTables.size;\n return objects === 0 ? 0 : Math.max(1, objects);\n}\n\nfunction pragmaTableInfo(args: readonly SqlValue[], env: ExecutionEnv, xinfo: boolean): PragmaQueryResult {\n const tableName = requireNameArg(args, \"table_info\");\n const table = env.state.tables.get(tableName.toLowerCase());\n if (!table) return { columns: xinfoColumns(xinfo), rows: [] };\n // SQLite's table_info omits generated columns; table_xinfo includes them (hidden 2/3).\n const visible = xinfo ? table.columns : table.columns.filter((column) => !column.generated);\n const rows: SqlValue[][] = visible.map((column, cid) => {\n const pkIndex = table.columns.filter((c) => c.primaryKey).findIndex((c) => c.name === column.name);\n const pk = column.primaryKey ? (pkIndex >= 0 ? pkIndex + 1 : 1) : 0;\n const dflt = column.defaultExpr ? defaultLiteral(column.defaultExpr) : null;\n // WITHOUT ROWID primary keys are NOT NULL in SQLite's table_info.\n const notNull = column.notNull || (table.withoutRowid && column.primaryKey) ? 1 : 0;\n const base: SqlValue[] = [cid, column.name, column.typeName ?? \"\", notNull, dflt, pk];\n if (xinfo) {\n let hidden = 0;\n if (column.generated && !column.generated.stored) hidden = 2;\n if (column.generated?.stored) hidden = 3;\n base.push(hidden);\n }\n return base;\n });\n return { columns: xinfoColumns(xinfo), rows };\n}\n\nfunction xinfoColumns(xinfo: boolean): string[] {\n return xinfo\n ? [\"cid\", \"name\", \"type\", \"notnull\", \"dflt_value\", \"pk\", \"hidden\"]\n : [\"cid\", \"name\", \"type\", \"notnull\", \"dflt_value\", \"pk\"];\n}\n\nfunction defaultLiteral(expr: Expr): SqlValue {\n if (expr.type === \"literal\")\n return typeof expr.value === \"string\" ? `'${expr.value.replace(/'/g, \"''\")}'` : expr.value;\n if (expr.type === \"null\") return \"NULL\";\n return null;\n}\n\nfunction pragmaIndexList(args: readonly SqlValue[], env: ExecutionEnv): PragmaQueryResult {\n const tableName = requireNameArg(args, \"index_list\");\n const table = env.state.tables.get(tableName.toLowerCase());\n if (!table) return { columns: [\"seq\", \"name\", \"unique\", \"origin\", \"partial\"], rows: [] };\n const rows: SqlValue[][] = [];\n let seq = 0;\n for (const name of table.indexes) {\n const index = env.state.indexes.get(name.toLowerCase());\n if (!index) continue;\n rows.push([seq++, index.name, index.unique ? 1 : 0, indexOrigin(index), index.where ? 1 : 0]);\n }\n return { columns: [\"seq\", \"name\", \"unique\", \"origin\", \"partial\"], rows };\n}\n\nfunction indexOrigin(index: IndexInfo): string {\n if (index.originalSql) return \"c\";\n if (index.name.toLowerCase().startsWith(\"sqlite_autoindex_\") && index.unique) return \"u\";\n return \"c\";\n}\n\nfunction pragmaIndexInfo(args: readonly SqlValue[], env: ExecutionEnv, xinfo: boolean): PragmaQueryResult {\n const indexName = requireNameArg(args, \"index_info\");\n const index = env.state.indexes.get(indexName.toLowerCase());\n const columns = xinfo ? [\"seqno\", \"cid\", \"name\", \"desc\", \"coll\", \"key\"] : [\"seqno\", \"cid\", \"name\"];\n if (!index) return { columns, rows: [] };\n const table = env.state.tables.get(index.tableName.toLowerCase());\n const rows: SqlValue[][] = index.columns.map((column, seqno) => {\n const cid = table?.columns.findIndex((c) => c.name.toLowerCase() === column.name.toLowerCase()) ?? -1;\n const base: SqlValue[] = [seqno, cid, column.name];\n if (xinfo) {\n base.push(column.order === \"DESC\" ? 1 : 0, (column.collate ?? \"BINARY\").toUpperCase(), 1);\n }\n return base;\n });\n if (xinfo) {\n // Trailing rowid key column (SQLite index_xinfo)\n rows.push([index.columns.length, -1, null, 0, \"BINARY\", 0]);\n }\n return { columns, rows };\n}\n\nfunction pragmaForeignKeyList(args: readonly SqlValue[], env: ExecutionEnv): PragmaQueryResult {\n const tableName = requireNameArg(args, \"foreign_key_list\");\n const table = env.state.tables.get(tableName.toLowerCase());\n const columns = [\"id\", \"seq\", \"table\", \"from\", \"to\", \"on_update\", \"on_delete\", \"match\"];\n if (!table) return { columns, rows: [] };\n const rows: SqlValue[][] = [];\n let id = 0;\n for (const constraint of table.constraints) {\n if (constraint.type !== \"foreign_key\") continue;\n const refColumns =\n constraint.refColumns ??\n env.state.tables\n .get(constraint.refTable.toLowerCase())\n ?.columns.filter((c) => c.primaryKey)\n .map((c) => c.name) ??\n [];\n constraint.columns.forEach((column, seq) => {\n rows.push([\n id,\n seq,\n constraint.refTable,\n column,\n refColumns[seq] ?? null,\n constraint.onUpdate ?? \"NO ACTION\",\n constraint.onDelete ?? \"NO ACTION\",\n \"NONE\",\n ]);\n });\n id++;\n }\n return { columns, rows };\n}\n\nfunction pragmaForeignKeyCheck(args: readonly SqlValue[], env: ExecutionEnv): PragmaQueryResult {\n const columns = [\"table\", \"rowid\", \"parent\", \"fkid\"];\n const filter = args[0] != null && args[0] !== null ? String(args[0]).toLowerCase() : null;\n const rows: SqlValue[][] = [];\n for (const table of env.state.tables.values()) {\n if (filter && table.name.toLowerCase() !== filter) continue;\n let fkid = 0;\n for (const constraint of table.constraints) {\n if (constraint.type !== \"foreign_key\") continue;\n const parent = env.state.tables.get(constraint.refTable.toLowerCase());\n const refColumns = constraint.refColumns ?? parent?.columns.filter((c) => c.primaryKey).map((c) => c.name) ?? [];\n for (const row of table.scan()) {\n let allNull = true;\n const childValues: SqlValue[] = [];\n for (const col of constraint.columns) {\n const value = table.cell(row, col.toLowerCase());\n childValues.push(value);\n if (value !== null) allNull = false;\n }\n // MATCH FULL is parsed but not enforced by SQLite (SIMPLE semantics).\n if (allNull) continue;\n if (!parent || !parentHasMatch(parent, refColumns, childValues)) {\n rows.push([table.name, row.rowid, constraint.refTable, fkid]);\n }\n }\n fkid++;\n }\n }\n return { columns, rows };\n}\n\nfunction parentHasMatch(parent: Table, refColumns: string[], childValues: SqlValue[]): boolean {\n if (refColumns.length === 0) return false;\n for (const row of parent.scan()) {\n let ok = true;\n for (let i = 0; i < refColumns.length; i++) {\n const parentVal = parent.cell(row, refColumns[i]!.toLowerCase());\n if (!sqlValuesEqual(parentVal, childValues[i] ?? null)) {\n ok = false;\n break;\n }\n }\n if (ok) return true;\n }\n return false;\n}\n\nfunction sqlValuesEqual(a: SqlValue, b: SqlValue): boolean {\n if (a === null || b === null) return a === b;\n if (typeof a === \"number\" && typeof b === \"number\") return a === b;\n if (typeof a === \"bigint\" || typeof b === \"bigint\") {\n return BigInt(a as number | bigint) === BigInt(b as number | bigint);\n }\n if (a instanceof Uint8Array || b instanceof Uint8Array) return false;\n return String(a) === String(b);\n}\n\nfunction pragmaDatabaseList(env: ExecutionEnv): PragmaQueryResult {\n const rows: SqlValue[][] = [[0, \"main\", \"\"]];\n let seq = 2;\n for (const [name, attached] of env.state.attached) {\n const file = attached.filename === \":memory:\" ? \"\" : attached.filename;\n rows.push([seq++, name, file]);\n }\n return { columns: [\"seq\", \"name\", \"file\"], rows };\n}\n\nfunction pragmaTableList(env: ExecutionEnv): PragmaQueryResult {\n const columns = [\"schema\", \"name\", \"type\", \"ncol\", \"wr\", \"strict\"];\n const rows: SqlValue[][] = [];\n for (const table of env.state.tables.values()) {\n rows.push([\"main\", table.name, \"table\", table.columns.length, table.withoutRowid ? 1 : 0, table.strict ? 1 : 0]);\n }\n for (const view of env.state.views.values()) {\n const ncol = view.columns?.length ?? 0;\n rows.push([\"main\", view.name, \"view\", ncol, 0, 0]);\n }\n for (const vt of env.state.virtualTables.values()) {\n rows.push([\"main\", vt.name, \"virtual\", vt.columns.length, 0, 0]);\n }\n rows.push([\"main\", \"sqlite_schema\", \"table\", 5, 0, 0]);\n rows.push([\"temp\", \"sqlite_temp_schema\", \"table\", 5, 0, 0]);\n for (const [schema] of env.state.attached) {\n rows.push([schema, \"sqlite_schema\", \"table\", 5, 0, 0]);\n }\n return { columns, rows };\n}\n\nfunction pragmaFunctionList(): PragmaQueryResult {\n const columns = [\"name\", \"builtin\", \"type\", \"enc\", \"narg\", \"flags\"];\n const rows: SqlValue[][] = [];\n const add = (name: string, type: string, narg: number, flags: number): void => {\n rows.push([name, 1, type, \"utf8\", narg, flags]);\n };\n for (const name of Object.keys(getScalarFunctions())) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(dateTimeFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(jsonScalarFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(mathFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(ftsAuxFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(rtreeAuxFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(aggregateFunctions)) {\n add(name, \"w\", name === \"count\" ? 0 : 1, 2097152);\n if (name === \"count\") add(name, \"w\", 1, 2097152);\n }\n for (const name of Object.keys(jsonAggregateFunctions)) add(name, \"w\", -1, 2097152);\n for (const name of Object.keys(windowFunctions)) add(name, \"w\", -1, 2097152);\n for (const name of [\"generate_series\", \"json_each\", \"json_tree\"]) {\n add(name, \"s\", -1, 2099200);\n }\n rows.sort((a, b) => String(a[0]).localeCompare(String(b[0])) || Number(a[4]) - Number(b[4]));\n return { columns, rows };\n}\n\nfunction pragmaModuleList(): PragmaQueryResult {\n const names = new Set<string>([\n ...MEMORY_VTABLE_MODULES,\n ...PRAGMA_TVF_NAMES.map((n) => `pragma_${n}`),\n \"generate_series\",\n \"json_each\",\n \"json_tree\",\n ]);\n return {\n columns: [\"name\"],\n rows: [...names].sort((a, b) => a.localeCompare(b)).map((name) => [name]),\n };\n}\n\nfunction requireNameArg(args: readonly SqlValue[], pragma: string): string {\n if (args.length === 0 || args[0] == null) {\n throw new SqliteError(`missing pragma argument for ${pragma}`, \"misuse\");\n }\n const value = args[0];\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n throw new SqliteError(`invalid pragma argument for ${pragma}`, \"misuse\");\n}\n\n/** Evaluate a statement-form pragma argument expression to a SQL value list. */\nexport function evalPragmaArgs(expr: Expr | null, env: ExecutionEnv): SqlValue[] {\n if (expr === null) return [];\n if (expr.type === \"column\" && expr.table === null) return [expr.name];\n if (expr.type === \"literal\") return [expr.value as SqlValue];\n return [evalExpr(expr, env.createEvalContext())];\n}\n\nexport function evalPragmaSetValue(expr: Expr, env: ExecutionEnv): SqlValue {\n if (expr.type === \"column\" && expr.table === null) {\n const keyword = expr.name.toLowerCase();\n if (keyword === \"on\" || keyword === \"true\" || keyword === \"yes\") return 1;\n if (keyword === \"off\" || keyword === \"false\" || keyword === \"no\") return 0;\n return expr.name;\n }\n return evalExpr(expr, env.createEvalContext());\n}\n\nexport function coercePragmaInt(value: SqlValue): number {\n if (typeof value === \"number\") return Math.trunc(value);\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"string\") {\n const n = Number.parseInt(value, 10);\n return Number.isFinite(n) ? n : 0;\n }\n const asInt = toInteger(value);\n return asInt === null ? 0 : typeof asInt === \"bigint\" ? Number(asInt) : asInt;\n}\n\nexport function coercePragmaTruthy(value: SqlValue): boolean {\n return isTruthySql(value) === true;\n}\n", "import type { ExecutionEnv, ScopeRow } from \"../executor/env.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\n\nexport interface TableValuedResult {\n columns: string[];\n rows: ScopeRow[];\n}\n\nexport type TableValuedFn = (args: SqlValue[], alias: string | null, env: ExecutionEnv) => TableValuedResult;\n\nconst registry = new Map<string, TableValuedFn>();\n\nexport function registerTableValuedFunction(name: string, fn: TableValuedFn): void {\n registry.set(name.toLowerCase(), fn);\n}\n\nexport function getTableValuedFunction(name: string): TableValuedFn | undefined {\n return registry.get(name.toLowerCase());\n}\n\nexport function listRegisteredTableValuedFunctions(): string[] {\n return [...registry.keys()].sort();\n}\n\nexport function hasRegisteredTableValuedFunction(name: string): boolean {\n return registry.has(name.toLowerCase());\n}\n", "/**\n * Register all oracle-exposed `pragma_*` eponymous table-valued functions.\n * Imported for side effects from table-valued / select.\n */\nimport { isPragmaTvfName, PRAGMA_TVF_NAMES, queryPragma } from \"../executor/pragma-engine.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\nimport { registerTableValuedFunction, type TableValuedResult } from \"./table-valued-registry.ts\";\n\nfunction toTvfResult(\n alias: string | null,\n defaultName: string,\n columns: string[],\n rows: SqlValue[][],\n): TableValuedResult {\n const table = alias ?? defaultName;\n return {\n columns,\n rows: rows.map((row) => ({\n cells: columns.map((name, index) => ({\n table,\n name,\n value: row[index] ?? null,\n })),\n })),\n };\n}\n\nlet registered = false;\n\n/** Idempotent registration of every oracle `pragma_*` TVF. */\nexport function ensurePragmaTvfsRegistered(): void {\n if (registered) return;\n registered = true;\n for (const baseName of PRAGMA_TVF_NAMES) {\n const tvfName = `pragma_${baseName}`;\n registerTableValuedFunction(tvfName, (args, alias, env) => {\n const result = queryPragma(baseName, args, env);\n return toTvfResult(alias, tvfName, result.columns, result.rows);\n });\n }\n}\n\nexport { isPragmaTvfName };\n", "import type { Expr } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { ExecutionEnv, ScopeRow } from \"../executor/env.ts\";\nimport { pragmaTvfColumns } from \"../executor/pragma-engine.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { jsonEachRows, jsonTreeRows } from \"../json/tvf.ts\";\nimport { toInteger } from \"../types/value.ts\";\nimport { ensurePragmaTvfsRegistered } from \"./pragma-tvf.ts\";\nimport {\n getTableValuedFunction,\n hasRegisteredTableValuedFunction,\n listRegisteredTableValuedFunctions,\n registerTableValuedFunction,\n type TableValuedResult,\n} from \"./table-valued-registry.ts\";\n\nexport type { TableValuedResult };\nexport { registerTableValuedFunction };\n\nconst JSON_TVF_COLUMNS = [\"key\", \"value\", \"type\", \"atom\", \"id\", \"parent\", \"fullkey\", \"path\"] as const;\n\nfunction jsonTvfResult(\n alias: string | null,\n defaultName: string,\n rows: ReturnType<typeof jsonEachRows>,\n): TableValuedResult {\n const table = alias ?? defaultName;\n return {\n columns: [...JSON_TVF_COLUMNS],\n rows: rows.map((row) => ({\n cells: JSON_TVF_COLUMNS.map((name) => ({\n table,\n name,\n value: row[name],\n })),\n })),\n };\n}\n\nregisterTableValuedFunction(\"generate_series\", (args, alias) => {\n if (args.length < 2 || args.length > 3) {\n throw new SqliteError(\"wrong number of arguments to function generate_series()\", \"misuse\");\n }\n const start = toInteger(args[0] ?? null);\n const stop = toInteger(args[1] ?? null);\n const step = args.length === 3 ? toInteger(args[2] ?? null) : 1n;\n if (start === null || stop === null || step === null) {\n throw new SqliteError(\"datatype mismatch\", \"datatype_mismatch\");\n }\n if (step === 0n || step === 0) throw new SqliteError(\"step must not be zero\", \"misuse\");\n const startN = typeof start === \"bigint\" ? start : BigInt(start);\n const stopN = typeof stop === \"bigint\" ? stop : BigInt(stop);\n const stepN = typeof step === \"bigint\" ? step : BigInt(step);\n const table = alias ?? \"generate_series\";\n const rows: ScopeRow[] = [];\n if (stepN > 0n) {\n for (let value = startN; value <= stopN; value += stepN) {\n rows.push({\n cells: [{ table, name: \"value\", value: safeInt(value) }],\n });\n }\n } else {\n for (let value = startN; value >= stopN; value += stepN) {\n rows.push({\n cells: [{ table, name: \"value\", value: safeInt(value) }],\n });\n }\n }\n return { columns: [\"value\"], rows };\n});\n\nregisterTableValuedFunction(\"json_each\", (args, alias) => {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_each()\", \"misuse\");\n }\n return jsonTvfResult(alias, \"json_each\", jsonEachRows(args[0]!, args[1]));\n});\n\nregisterTableValuedFunction(\"json_tree\", (args, alias) => {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_tree()\", \"misuse\");\n }\n return jsonTvfResult(alias, \"json_tree\", jsonTreeRows(args[0]!, args[1]));\n});\n\nfunction safeInt(value: bigint): number | bigint {\n return value <= BigInt(Number.MAX_SAFE_INTEGER) && value >= BigInt(Number.MIN_SAFE_INTEGER) ? Number(value) : value;\n}\n\n/**\n * Known output columns for a TVF without evaluating arguments.\n * Prefer this for FROM-item shape analysis when args may be correlated.\n */\nexport function tableValuedColumns(name: string): string[] | null {\n ensurePragmaTvfsRegistered();\n const lower = name.toLowerCase();\n if (lower === \"generate_series\") return [\"value\"];\n if (lower === \"json_each\" || lower === \"json_tree\") return [...JSON_TVF_COLUMNS];\n return pragmaTvfColumns(name);\n}\n\nexport function evaluateTableFunction(\n name: string,\n args: Expr[],\n alias: string | null,\n env: ExecutionEnv,\n scope?: ScopeRow | null,\n parent?: import(\"../expressions/context.ts\").EvalContext,\n): TableValuedResult {\n ensurePragmaTvfsRegistered();\n const fn = getTableValuedFunction(name);\n if (!fn) throw new SqliteError(`no such table-valued function: ${name}`, \"no_such_table\");\n const values = args.map((arg) => evalExpr(arg, env.createEvalContext(scope ?? null, parent)));\n return fn(values, alias, env);\n}\n\nexport function listTableValuedFunctions(): string[] {\n ensurePragmaTvfsRegistered();\n return listRegisteredTableValuedFunctions();\n}\n\nexport function hasTableValuedFunction(name: string): boolean {\n ensurePragmaTvfsRegistered();\n return hasRegisteredTableValuedFunction(name);\n}\n", "import type { Expr } from \"../ast/nodes.ts\";\n\n/** Structural equality for matching WHERE expressions to index expressions. */\nexport function exprEquals(left: Expr, right: Expr): boolean {\n if (left.type !== right.type) return false;\n switch (left.type) {\n case \"null\":\n return true;\n case \"literal\":\n return right.type === \"literal\" && valuesEqual(left.value, right.value);\n case \"column\":\n return (\n right.type === \"column\" &&\n (left.table ?? \"\").toLowerCase() === (right.table ?? \"\").toLowerCase() &&\n left.name.toLowerCase() === right.name.toLowerCase()\n );\n case \"unary\":\n return right.type === \"unary\" && left.op === right.op && exprEquals(left.expr, right.expr);\n case \"is_bool\":\n return (\n right.type === \"is_bool\" &&\n left.not === right.not &&\n left.sense === right.sense &&\n exprEquals(left.expr, right.expr)\n );\n case \"binary\":\n return (\n right.type === \"binary\" &&\n left.op === right.op &&\n exprEquals(left.left, right.left) &&\n exprEquals(left.right, right.right)\n );\n case \"function\":\n return (\n right.type === \"function\" &&\n left.name.toLowerCase() === right.name.toLowerCase() &&\n left.distinct === right.distinct &&\n argsEqual(left.args, right.args)\n );\n case \"collate\":\n return (\n right.type === \"collate\" &&\n left.collation.toLowerCase() === right.collation.toLowerCase() &&\n exprEquals(left.expr, right.expr)\n );\n case \"cast\":\n return (\n right.type === \"cast\" &&\n (left.typeName ?? \"\").toUpperCase() === (right.typeName ?? \"\").toUpperCase() &&\n exprEquals(left.expr, right.expr)\n );\n default:\n return JSON.stringify(left) === JSON.stringify(right);\n }\n}\n\nfunction argsEqual(left: Expr[] | \"*\", right: Expr[] | \"*\"): boolean {\n if (left === \"*\" || right === \"*\") return left === right;\n if (left.length !== right.length) return false;\n return left.every((expr, index) => exprEquals(expr, right[index]!));\n}\n\nfunction valuesEqual(left: unknown, right: unknown): boolean {\n if (left === right) return true;\n if (left instanceof Uint8Array && right instanceof Uint8Array) {\n if (left.length !== right.length) return false;\n return left.every((byte, index) => byte === right[index]);\n }\n return false;\n}\n", "import type { ErrorCategory } from \"../errors/index.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\n\n/** True when an error is an expected fast-path miss (fall through to full executor). */\nexport function isExpectedFastPathMiss(\n error: unknown,\n categories: readonly ErrorCategory[] = [\"no_such_table\"],\n): boolean {\n return error instanceof SqliteError && categories.includes(error.category);\n}\n", "import type { Expr, FromItem, TableRef } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { ExecutionEnv } from \"../executor/env.ts\";\nimport { exprEquals } from \"../expressions/equals.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { isExpectedFastPathMiss } from \"../runtime/catch.ts\";\nimport type { IndexInfo } from \"../storage/database-state.ts\";\nimport type { Row, Rowid } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { normalizeForCollation } from \"../types/collation.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\n\nexport interface ConstEquality {\n table: string | null;\n column: string;\n valueExpr: Expr;\n}\n\nexport function conjunctions(expr: Expr): Expr[] {\n if (expr.type === \"binary\" && expr.op === \"AND\") {\n return [...conjunctions(expr.left), ...conjunctions(expr.right)];\n }\n return [expr];\n}\n\nfunction isRowIndependentExpr(expr: Expr): boolean {\n return expr.type !== \"column\";\n}\n\nexport function equalityAgainstConst(expr: Expr): ConstEquality | null {\n if (expr.type !== \"binary\" || (expr.op !== \"=\" && expr.op !== \"==\")) return null;\n if (expr.left.type === \"column\" && isRowIndependentExpr(expr.right)) {\n return { table: expr.left.table, column: expr.left.name, valueExpr: expr.right };\n }\n if (expr.right.type === \"column\" && isRowIndependentExpr(expr.left)) {\n return { table: expr.right.table, column: expr.right.name, valueExpr: expr.left };\n }\n return null;\n}\n\nexport function equalityAgainstExpr(expr: Expr): { expr: Expr; valueExpr: Expr } | null {\n if (expr.type !== \"binary\" || (expr.op !== \"=\" && expr.op !== \"==\")) return null;\n if (expr.left.type !== \"column\" && isRowIndependentExpr(expr.right)) {\n return { expr: expr.left, valueExpr: expr.right };\n }\n if (expr.right.type !== \"column\" && isRowIndependentExpr(expr.left)) {\n return { expr: expr.right, valueExpr: expr.left };\n }\n return null;\n}\n\nexport function whereFullyCovered(where: Expr, coveredColumns: Set<string>, alias: string, tableName: string): boolean {\n for (const part of conjunctions(where)) {\n const eq = equalityAgainstConst(part);\n if (!eq) return false;\n if (!matchesTable(eq.table, alias, tableName)) return false;\n const col = eq.column.toLowerCase();\n if (!coveredColumns.has(col) && !isRowidName(eq.column)) return false;\n }\n return true;\n}\n\nfunction matchesTable(table: string | null, alias: string, tableName: string): boolean {\n if (table === null) return true;\n const key = table.toLowerCase();\n return key === alias.toLowerCase() || key === tableName.toLowerCase();\n}\n\nfunction isRowidName(name: string): boolean {\n const key = name.toLowerCase();\n return key === \"rowid\" || key === \"_rowid_\" || key === \"oid\";\n}\n\nexport interface TableRowLookup {\n table: Table;\n alias: string;\n rows: Row[];\n /** Lowercased columns whose equality predicates were applied by the access path. */\n coveredColumns: Set<string>;\n}\n\n/** Look up rows for a simple `FROM table WHERE ...` using PK, a covering equality index, or an automatic hash. */\nexport function tryIndexedTableRows(from: FromItem, where: Expr, env: ExecutionEnv): TableRowLookup | null {\n if (from.type !== \"table\") return null;\n return lookupTableRows(from, where, env);\n}\n\nexport function lookupTableRows(from: TableRef, where: Expr, env: ExecutionEnv): TableRowLookup | null {\n const alias = from.alias ?? from.name;\n const qualified = from.schema ? `${from.schema}.${from.name}` : from.name;\n const db = env.state.databaseForSchema(from.schema, qualified);\n if (from.name.toLowerCase() === \"sqlite_schema\" || from.name.toLowerCase() === \"sqlite_master\") return null;\n if (db.virtualTables.has(from.name.toLowerCase()) || db.views.has(from.name.toLowerCase())) return null;\n if (env.ctes.has(from.name.toLowerCase())) return null;\n\n let table: Table;\n try {\n table = db.getTable(from.name);\n } catch (error) {\n if (!isExpectedFastPathMiss(error)) throw error;\n return null;\n }\n\n const parts = conjunctions(where);\n const equalities = parts\n .map(equalityAgainstConst)\n .filter((item): item is ConstEquality => item !== null)\n .filter((item) => matchesTable(item.table, alias, table.name));\n\n const evalConst = (expr: Expr): SqlValue | undefined => {\n try {\n return evalExpr(expr, env.createEvalContext(null));\n } catch (error) {\n if (error instanceof SqliteError) return undefined;\n throw error;\n }\n };\n\n const resolved: { table: string | null; column: string; value: SqlValue }[] = [];\n for (const eq of equalities) {\n const value = evalConst(eq.valueExpr);\n if (value === undefined) continue;\n resolved.push({ table: eq.table, column: eq.column, value });\n }\n\n const pk = table.integerPkColumn();\n for (const eq of resolved) {\n const col = eq.column.toLowerCase();\n if (isRowidName(eq.column) || (pk && col === pk.name.toLowerCase())) {\n const row = table.getByKey(eq.value);\n const coveredColumns = new Set<string>([col, \"rowid\", \"_rowid_\", \"oid\"]);\n if (pk) coveredColumns.add(pk.nameLower ?? pk.name.toLowerCase());\n if (row) return { table, alias, rows: [row], coveredColumns };\n if (eq.value === null || typeof eq.value === \"number\" || typeof eq.value === \"bigint\") {\n return { table, alias, rows: [], coveredColumns };\n }\n return null;\n }\n }\n\n const byColumn = new Map<string, SqlValue>();\n for (const eq of resolved) byColumn.set(eq.column.toLowerCase(), eq.value);\n\n let best: IndexLookup | null = null;\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index) continue;\n if (index.where && !parts.some((part) => exprEquals(part, index.where!))) continue;\n\n if (index.columns.some((column) => column.expr)) {\n const prefix: SqlValue[] = [];\n for (const column of index.columns) {\n if (!column.expr) {\n const value = byColumn.get(column.name.toLowerCase());\n if (value === undefined) break;\n prefix.push(normalizeForCollation(value, column.collate ?? \"BINARY\"));\n continue;\n }\n const match = parts.map(equalityAgainstExpr).find((item) => item && exprEquals(item.expr, column.expr!));\n if (!match) break;\n const value = evalConst(match.valueExpr);\n if (value === undefined) break;\n prefix.push(normalizeForCollation(value, column.collate ?? \"BINARY\"));\n }\n if (prefix.length === 0) continue;\n const full = prefix.length === index.columns.length;\n const rowids = full ? index.store.lookup(prefix) : index.store.lookupPrefix(prefix);\n const next = considerIndexLookup(best, {\n rowids,\n columns: index.columns.slice(0, prefix.length).map((column) => column.name.toLowerCase()),\n prefixLen: prefix.length,\n uniqueFull: index.unique && full,\n });\n best = next.best;\n if (next.stop) break;\n continue;\n }\n\n const prefix: SqlValue[] = [];\n for (const column of index.columns) {\n const value = byColumn.get(column.name.toLowerCase());\n if (value === undefined) break;\n prefix.push(normalizeForCollation(value, column.collate ?? \"BINARY\"));\n }\n if (prefix.length === 0) continue;\n const full = prefix.length === index.columns.length;\n const rowids = full ? index.store.lookup(prefix) : index.store.lookupPrefix(prefix);\n const next = considerIndexLookup(best, {\n rowids,\n columns: index.columns.slice(0, prefix.length).map((column) => column.name.toLowerCase()),\n prefixLen: prefix.length,\n uniqueFull: index.unique && full,\n });\n best = next.best;\n if (next.stop) break;\n }\n\n if (best) {\n const rows: Row[] = [];\n for (const rowid of best.rowids) {\n const row = table.get(rowid);\n if (row) rows.push(row);\n }\n rows.sort((a, b) => compareRowids(a.rowid, b.rowid));\n return { table, alias, rows, coveredColumns: new Set(best.columns) };\n }\n\n for (const eq of resolved) {\n const col = eq.column.toLowerCase();\n if (isRowidName(eq.column)) continue;\n const hashed = table.lookupEquality(col, eq.value);\n if (!hashed) continue;\n hashed.sort((a, b) => compareRowids(a.rowid, b.rowid));\n return { table, alias, rows: hashed, coveredColumns: new Set([col]) };\n }\n\n const range = rangeAgainstConst(where) ?? rangeFromBetween(where);\n if (range && matchesTable(range.table, alias, table.name)) {\n const value = evalConst(range.valueExpr);\n const value2 = range.valueExpr2 ? evalConst(range.valueExpr2) : undefined;\n if (value !== undefined) {\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index || index.where || index.columns.length !== 1) continue;\n if (index.columns[0]!.expr) continue;\n if (index.columns[0]!.name.toLowerCase() !== range.column.toLowerCase()) continue;\n const bound = normalizeForCollation(value, index.columns[0]!.collate ?? \"BINARY\");\n const bound2 =\n value2 !== undefined ? normalizeForCollation(value2, index.columns[0]!.collate ?? \"BINARY\") : undefined;\n const rowids = index.store.rangeLookup(range.op, bound, bound2);\n const rows: Row[] = [];\n for (const rowid of rowids) {\n const row = table.get(rowid);\n if (row) rows.push(row);\n }\n return { table, alias, rows, coveredColumns: new Set([range.column.toLowerCase()]) };\n }\n }\n }\n\n return null;\n}\n\nfunction rangeAgainstConst(\n expr: Expr,\n): { table: string | null; column: string; op: \">\" | \">=\" | \"<\" | \"<=\"; valueExpr: Expr; valueExpr2?: Expr } | null {\n if (expr.type !== \"binary\") return null;\n const op = expr.op;\n if (op !== \">\" && op !== \">=\" && op !== \"<\" && op !== \"<=\") return null;\n if (expr.left.type === \"column\" && isRowIndependentExpr(expr.right)) {\n return { table: expr.left.table, column: expr.left.name, op, valueExpr: expr.right };\n }\n if (expr.right.type === \"column\" && isRowIndependentExpr(expr.left)) {\n const flipped = op === \">\" ? \"<\" : op === \">=\" ? \"<=\" : op === \"<\" ? \">\" : \">=\";\n return { table: expr.right.table, column: expr.right.name, op: flipped, valueExpr: expr.left };\n }\n return null;\n}\n\nfunction rangeFromBetween(\n expr: Expr,\n): { table: string | null; column: string; op: \"between\"; valueExpr: Expr; valueExpr2: Expr } | null {\n if (expr.type !== \"between\" || expr.not || expr.expr.type !== \"column\") return null;\n return {\n table: expr.expr.table,\n column: expr.expr.name,\n op: \"between\",\n valueExpr: expr.lower,\n valueExpr2: expr.upper,\n };\n}\n\nexport function tryIndexedOrder(\n from: FromItem,\n order: { expr: Expr; dir: \"ASC\" | \"DESC\" },\n env: ExecutionEnv,\n limit?: number,\n): TableRowLookup | null {\n if (from.type !== \"table\" || order.expr.type !== \"column\") return null;\n const alias = from.alias ?? from.name;\n const db = env.state.databaseForSchema(from.schema, from.schema ? `${from.schema}.${from.name}` : from.name);\n let table: Table;\n try {\n table = db.getTable(from.name);\n } catch (error) {\n if (!isExpectedFastPathMiss(error)) throw error;\n return null;\n }\n const col = order.expr.name.toLowerCase();\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index || index.where || index.columns.length !== 1 || index.columns[0]!.expr) continue;\n if (index.columns[0]!.name.toLowerCase() !== col) continue;\n const desc = order.dir === \"DESC\";\n const rows: Row[] = [];\n for (const rowid of index.store.orderedRowids(desc)) {\n const row = table.get(rowid);\n if (row) rows.push(row);\n if (limit !== undefined && rows.length >= limit) break;\n }\n return { table, alias, rows, coveredColumns: new Set([col]) };\n }\n return null;\n}\n\ninterface IndexLookup {\n rowids: readonly Rowid[];\n columns: string[];\n prefixLen: number;\n uniqueFull: boolean;\n}\n\n/** Unique full-key lookups are authoritative (including misses). Empty prefix hits are not. */\nfunction considerIndexLookup(\n best: IndexLookup | null,\n candidate: IndexLookup,\n): { best: IndexLookup | null; stop: boolean } {\n if (candidate.uniqueFull) return { best: candidate, stop: true };\n if (candidate.rowids.length === 0) return { best, stop: false };\n if (!best || candidate.prefixLen > best.prefixLen) return { best: candidate, stop: false };\n return { best, stop: false };\n}\n\nfunction compareRowids(left: Rowid, right: Rowid): number {\n const a = typeof left === \"bigint\" ? left : BigInt(left);\n const b = typeof right === \"bigint\" ? right : BigInt(right);\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nexport interface JoinProbe {\n table: Table;\n alias: string;\n /** When true, ON is fully applied by the probe (skip re-eval). */\n covering: boolean;\n lookup: (leftCellsValue: (table: string | null, name: string) => SqlValue) => Row[];\n}\n\n/** Equality join keys extracted from ON (column = column), for hash join when no index probe. */\nexport interface JoinEqualityKeys {\n /** Right-side column names in join-key order. */\n rightColumns: string[];\n /** Corresponding left-side (probe) column references. */\n leftKeys: { table: string | null; column: string }[];\n}\n\nexport function tryJoinEqualityKeys(right: FromItem, on: Expr | null, env?: ExecutionEnv): JoinEqualityKeys | null {\n if (!on || right.type !== \"table\") return null;\n if (env) {\n const db = env.state.databaseForSchema(right.schema, right.schema ? `${right.schema}.${right.name}` : right.name);\n if (db.virtualTables.has(right.name.toLowerCase()) || db.views.has(right.name.toLowerCase())) return null;\n if (env.ctes.has(right.name.toLowerCase())) return null;\n }\n const alias = right.alias ?? right.name;\n const pairs: { rightColumn: string; leftTable: string | null; leftColumn: string }[] = [];\n for (const part of conjunctions(on)) {\n if (part.type !== \"binary\" || (part.op !== \"=\" && part.op !== \"==\")) continue;\n if (part.left.type !== \"column\" || part.right.type !== \"column\") continue;\n const leftOnRight = columnOnTable(part.left, alias, right.name);\n const rightOnRight = columnOnTable(part.right, alias, right.name);\n if (leftOnRight && !rightOnRight) {\n pairs.push({ rightColumn: part.left.name, leftTable: part.right.table, leftColumn: part.right.name });\n } else if (rightOnRight && !leftOnRight) {\n pairs.push({ rightColumn: part.right.name, leftTable: part.left.table, leftColumn: part.left.name });\n }\n }\n if (pairs.length === 0) return null;\n // Require the entire ON to be only equality conjunctions (no leftover predicates).\n const parts = conjunctions(on);\n if (parts.length !== pairs.length) return null;\n for (const part of parts) {\n if (part.type !== \"binary\" || (part.op !== \"=\" && part.op !== \"==\")) return null;\n if (part.left.type !== \"column\" || part.right.type !== \"column\") return null;\n }\n // rowid join keys need ScopeRow.rowid, not a regular cell \u2014 keep nested loop.\n if (pairs.some((pair) => isRowidName(pair.rightColumn))) return null;\n return {\n rightColumns: pairs.map((pair) => pair.rightColumn),\n leftKeys: pairs.map((pair) => ({ table: pair.leftTable, column: pair.leftColumn })),\n };\n}\n\nexport function tryJoinProbe(right: FromItem, on: Expr | null, env: ExecutionEnv): JoinProbe | null {\n if (!on || right.type !== \"table\") return null;\n const alias = right.alias ?? right.name;\n const db = env.state.databaseForSchema(right.schema, right.schema ? `${right.schema}.${right.name}` : right.name);\n if (db.virtualTables.has(right.name.toLowerCase()) || db.views.has(right.name.toLowerCase())) return null;\n if (env.ctes.has(right.name.toLowerCase())) return null;\n let table: Table;\n try {\n table = db.getTable(right.name);\n } catch {\n return null;\n }\n\n const pairs: { rightColumn: string; leftTable: string | null; leftColumn: string }[] = [];\n for (const part of conjunctions(on)) {\n if (part.type !== \"binary\" || (part.op !== \"=\" && part.op !== \"==\")) continue;\n if (part.left.type !== \"column\" || part.right.type !== \"column\") continue;\n const leftOnRight = columnOnTable(part.left, alias, table.name);\n const rightOnRight = columnOnTable(part.right, alias, table.name);\n if (leftOnRight && !rightOnRight) {\n pairs.push({ rightColumn: part.left.name, leftTable: part.right.table, leftColumn: part.right.name });\n } else if (rightOnRight && !leftOnRight) {\n pairs.push({ rightColumn: part.right.name, leftTable: part.left.table, leftColumn: part.left.name });\n }\n }\n if (pairs.length === 0) return null;\n\n const pk = table.integerPkColumn();\n const pkPair = pairs.find(\n (pair) => isRowidName(pair.rightColumn) || (pk && pair.rightColumn.toLowerCase() === pk.name.toLowerCase()),\n );\n if (pkPair) {\n return {\n table,\n alias,\n covering: pairs.length === 1,\n lookup: (getLeft) => {\n const value = getLeft(pkPair.leftTable, pkPair.leftColumn);\n const row = table.getByKey(value);\n return row ? [row] : [];\n },\n };\n }\n\n for (const indexName of table.indexes) {\n const index: IndexInfo | undefined = db.indexes.get(indexName.toLowerCase());\n if (!index || index.where) continue;\n const prefixPairs: typeof pairs = [];\n for (const column of index.columns) {\n const pair = pairs.find((item) => item.rightColumn.toLowerCase() === column.name.toLowerCase());\n if (!pair) break;\n prefixPairs.push(pair);\n }\n if (prefixPairs.length !== index.columns.length) continue;\n return {\n table,\n alias,\n covering: prefixPairs.length === pairs.length,\n lookup: (getLeft) => {\n const values = prefixPairs.map((pair, i) =>\n normalizeForCollation(getLeft(pair.leftTable, pair.leftColumn), index.columns[i]?.collate ?? \"BINARY\"),\n );\n const rows: Row[] = [];\n for (const rowid of index.store.lookup(values)) {\n const row = table.get(rowid);\n if (row) rows.push(row);\n }\n rows.sort((a, b) => compareRowids(a.rowid, b.rowid));\n return rows;\n },\n };\n }\n\n if (pairs.length === 1) {\n const pair = pairs[0]!;\n const col = pair.rightColumn.toLowerCase();\n if (!isRowidName(pair.rightColumn) && table.ensureEqualityHash(col)) {\n return {\n table,\n alias,\n covering: true,\n lookup: (getLeft) => {\n const rows = table.lookupEquality(col, getLeft(pair.leftTable, pair.leftColumn));\n return rows ?? [];\n },\n };\n }\n }\n return null;\n}\n\nfunction columnOnTable(column: { table: string | null; name: string }, alias: string, tableName: string): boolean {\n return column.table !== null && matchesTable(column.table, alias, tableName);\n}\n", "import type { DatabaseState } from \"../storage/database-state.ts\";\nimport { makeColumnInfo, Table } from \"../storage/table.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\n\nexport type SchemaObjectType = \"table\" | \"index\" | \"view\" | \"trigger\";\n\nexport interface SchemaCatalogRow {\n type: SchemaObjectType;\n name: string;\n tbl_name: string;\n rootpage: number;\n sql: string | null;\n}\n\nexport function schemaCatalogRows(state: DatabaseState): SchemaCatalogRow[] {\n const tables = [...state.tables.values()].sort((a, b) => compareNames(a.name, b.name));\n const indexes = [...state.indexes.values()].sort((a, b) => compareNames(a.name, b.name));\n const views = [...state.views.values()].sort((a, b) => compareNames(a.name, b.name));\n const triggers = [...state.triggers.values()].sort((a, b) => compareNames(a.name, b.name));\n\n const rows: SchemaCatalogRow[] = [];\n let rootpage = 2;\n\n for (const table of tables) {\n rows.push({\n type: \"table\",\n name: table.name,\n tbl_name: table.name,\n rootpage: rootpage++,\n sql: table.originalSql,\n });\n }\n for (const index of indexes) {\n rows.push({\n type: \"index\",\n name: index.name,\n tbl_name: index.tableName,\n rootpage: rootpage++,\n sql: index.originalSql,\n });\n }\n for (const view of views) {\n rows.push({\n type: \"view\",\n name: view.name,\n tbl_name: view.name,\n rootpage: 0,\n sql: view.originalSql,\n });\n }\n for (const trigger of triggers) {\n rows.push({\n type: \"trigger\",\n name: trigger.name,\n tbl_name: trigger.tableName,\n rootpage: 0,\n sql: trigger.originalSql,\n });\n }\n return rows;\n}\n\n/** Locale-independent UTF-16 code-unit order for stable catalog/snapshot encoding. */\nfunction compareNames(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nexport function buildSchemaCatalog(state: DatabaseState, name = \"sqlite_schema\"): Table {\n const catalog = new Table(name, [\n makeColumnInfo(\"type\", \"TEXT\"),\n makeColumnInfo(\"name\", \"TEXT\"),\n makeColumnInfo(\"tbl_name\", \"TEXT\"),\n makeColumnInfo(\"rootpage\", \"INTEGER\"),\n makeColumnInfo(\"sql\", \"TEXT\"),\n ]);\n\n for (const row of schemaCatalogRows(state)) {\n catalog.insert({\n values: {\n type: row.type,\n name: row.name,\n tbl_name: row.tbl_name,\n rootpage: row.rootpage,\n sql: row.sql,\n } satisfies Record<string, SqlValue>,\n });\n }\n return catalog;\n}\n\nexport function buildSqliteSchema(state: DatabaseState): Table {\n return buildSchemaCatalog(state, \"sqlite_schema\");\n}\n\nexport function buildSqliteMaster(state: DatabaseState): Table {\n return buildSchemaCatalog(state, \"sqlite_master\");\n}\n", "import type { Expr, ResultColumn, SelectStmt } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport {\n conjunctions,\n equalityAgainstConst,\n lookupTableRows,\n tryIndexedOrder,\n tryJoinEqualityKeys,\n whereFullyCovered,\n} from \"../planner/access.ts\";\nimport { isExpectedFastPathMiss } from \"../runtime/catch.ts\";\nimport type { Row } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { applyAffinity, canonicalizeNumber, compareSql, type SqlValue, toInteger } from \"../types/value.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { type ResultSet, valuesToResult } from \"./result.ts\";\n\n/**\n * Tight path for `SELECT cols FROM table WHERE col = ?` (no join/group/order).\n * Skips ScopeRow / evalExpr and honors maxRows during the scan.\n */\nexport function tryExecuteSimpleSelect(stmt: SelectStmt, env: ExecutionEnv): ResultSet | null {\n if (stmt.with || stmt.compound || stmt.distinct || stmt.groupBy.length > 0 || stmt.having || stmt.windows.length > 0)\n return null;\n if (stmt.orderBy.length > 1) return null;\n if (stmt.orderBy.length === 1 && stmt.where) return null;\n if (stmt.from?.type !== \"table\") return null;\n for (const column of stmt.columns) {\n if (column.type === \"star\") continue;\n if (column.expr.type !== \"column\") return null;\n }\n\n const from = stmt.from;\n const nameKey = from.name.toLowerCase();\n if (nameKey === \"sqlite_schema\" || nameKey === \"sqlite_master\") return null;\n if (env.ctes.has(nameKey)) return null;\n const qualified = from.schema ? `${from.schema}.${from.name}` : from.name;\n const db = env.state.databaseForSchema(from.schema, qualified);\n if (db.virtualTables.has(nameKey) || db.views.has(nameKey)) return null;\n\n let table: Table;\n try {\n table = db.getTable(from.name);\n } catch (error) {\n if (!isExpectedFastPathMiss(error)) throw error;\n return null;\n }\n if (table.withoutRowid) return null;\n if (table.columns.some((column) => column.generated && !column.generated.stored)) return null;\n\n const alias = from.alias ?? from.name;\n const aliasLower = alias.toLowerCase();\n const tableLower = table.name.toLowerCase();\n for (const column of stmt.columns) {\n if (column.type === \"star\") continue;\n if (column.expr.type !== \"column\") return null;\n const tableRef = column.expr.table?.toLowerCase();\n if (tableRef && tableRef !== aliasLower && tableRef !== tableLower && tableRef !== nameKey) return null;\n const key = column.expr.name.toLowerCase();\n if (isRowidName(key)) continue;\n if (!table.columns.some((item) => (item.nameLower ?? item.name.toLowerCase()) === key)) return null;\n }\n\n const filters: { column: string; value: SqlValue }[] = [];\n if (stmt.where) {\n for (const part of conjunctions(stmt.where)) {\n const eq = equalityAgainstConst(part);\n if (!eq) return null;\n let value: SqlValue;\n try {\n value = evalIndependent(eq.valueExpr, env);\n } catch (error) {\n if (error instanceof SqliteError) return null;\n throw error;\n }\n const column = eq.column.toLowerCase();\n const affinity = isRowidName(column)\n ? \"INTEGER\"\n : table.columns.find((item) => (item.nameLower ?? item.name.toLowerCase()) === column)?.affinity;\n filters.push({ column, value: affinity ? applyAffinity(value, affinity) : value });\n }\n }\n\n let limit = env.maxRows;\n let offset = 0;\n if (stmt.limit) {\n try {\n const limitValue = toInteger(evalIndependent(stmt.limit.limit, env));\n const offsetValue = stmt.limit.offset ? toInteger(evalIndependent(stmt.limit.offset, env)) : 0;\n if (limitValue === null || offsetValue === null) return null;\n offset = Math.max(0, Number(offsetValue));\n const n = Number(limitValue);\n if (n >= 0) limit = Math.min(limit, n);\n } catch (error) {\n if (error instanceof SqliteError) return null;\n throw error;\n }\n }\n const columns = projectNames(stmt.columns, table);\n if (limit <= 0) return pack(env, columns, []);\n\n let source: Iterable<Row> = table.scan();\n let alreadyFiltered = false;\n\n if (stmt.orderBy.length === 1 && stmt.orderBy[0]) {\n const take = limit < Number.MAX_SAFE_INTEGER ? offset + limit : undefined;\n const ordered = tryIndexedOrder(from, { expr: stmt.orderBy[0].expr, dir: stmt.orderBy[0].dir ?? \"ASC\" }, env, take);\n if (!ordered) return null;\n source = ordered.rows;\n alreadyFiltered = true;\n } else if (stmt.where) {\n const indexed = lookupTableRows(from, stmt.where, env);\n if (indexed) {\n source = indexed.rows;\n alreadyFiltered = whereFullyCovered(stmt.where, indexed.coveredColumns, alias, table.name);\n }\n }\n\n const projectors = projectionFns(stmt.columns, table);\n const values: SqlValue[][] = [];\n let skipped = 0;\n\n for (const row of source) {\n if (!alreadyFiltered && filters.length > 0 && !rowMatches(table, row, filters)) continue;\n if (skipped < offset) {\n skipped++;\n continue;\n }\n values.push(projectors.map((fn) => fn(row)));\n if (values.length >= limit) break;\n }\n\n return pack(env, columns, values);\n}\n\nexport function tryExecuteSimpleJoin(stmt: SelectStmt, env: ExecutionEnv): ResultSet | null {\n if (stmt.with || stmt.compound || stmt.distinct || stmt.groupBy.length > 0 || stmt.having || stmt.windows.length > 0)\n return null;\n if (stmt.orderBy.length > 0 || stmt.limit || stmt.where) return null;\n if (stmt.from?.type !== \"join\") return null;\n const join = stmt.from;\n if ((join.joinType !== \"INNER\" && join.joinType !== \"CROSS\") || join.using || !join.on) return null;\n if (join.left.type !== \"table\" || join.right.type !== \"table\") return null;\n const keys = tryJoinEqualityKeys(join.right, join.on, env);\n if (keys?.rightColumns.length !== 1) return null;\n\n const leftRef = join.left;\n const rightRef = join.right;\n const leftDb = env.state.databaseForSchema(\n leftRef.schema,\n leftRef.schema ? `${leftRef.schema}.${leftRef.name}` : leftRef.name,\n );\n const rightDb = env.state.databaseForSchema(\n rightRef.schema,\n rightRef.schema ? `${rightRef.schema}.${rightRef.name}` : rightRef.name,\n );\n if (env.ctes.has(leftRef.name.toLowerCase()) || env.ctes.has(rightRef.name.toLowerCase())) return null;\n if (leftDb.views.has(leftRef.name.toLowerCase()) || rightDb.views.has(rightRef.name.toLowerCase())) return null;\n if (leftDb.virtualTables.has(leftRef.name.toLowerCase()) || rightDb.virtualTables.has(rightRef.name.toLowerCase()))\n return null;\n\n let leftTable: Table;\n let rightTable: Table;\n try {\n leftTable = leftDb.getTable(leftRef.name);\n rightTable = rightDb.getTable(rightRef.name);\n } catch (error) {\n if (!isExpectedFastPathMiss(error)) throw error;\n return null;\n }\n if (leftTable.withoutRowid || rightTable.withoutRowid) return null;\n\n const leftAlias = (leftRef.alias ?? leftRef.name).toLowerCase();\n const rightAlias = (rightRef.alias ?? rightRef.name).toLowerCase();\n const rightCol = keys.rightColumns[0]!.toLowerCase();\n const leftCol = keys.leftKeys[0]!.column.toLowerCase();\n if (!rightTable.ensureEqualityHash(rightCol)) return null;\n\n const names: string[] = [];\n const projectors: ((left: Row, right: Row) => SqlValue)[] = [];\n for (const column of stmt.columns) {\n if (column.type !== \"expr\" || column.expr.type !== \"column\") return null;\n const tableRef = column.expr.table?.toLowerCase() ?? null;\n const key = column.expr.name.toLowerCase();\n const onLeft =\n tableRef === null\n ? leftTable.columns.some((item) => (item.nameLower ?? item.name.toLowerCase()) === key)\n : tableRef === leftAlias || tableRef === leftTable.name.toLowerCase();\n const onRight =\n tableRef === null\n ? rightTable.columns.some((item) => (item.nameLower ?? item.name.toLowerCase()) === key)\n : tableRef === rightAlias || tableRef === rightTable.name.toLowerCase();\n if (onLeft === onRight) return null;\n names.push(column.alias ?? column.expr.name);\n if (onLeft) {\n if (isRowidName(key)) projectors.push((left) => left.rowid);\n else projectors.push((left) => leftTable.cell(left, key));\n } else {\n if (isRowidName(key)) projectors.push((_left, right) => right.rowid);\n else projectors.push((_left, right) => rightTable.cell(right, key));\n }\n }\n\n const values: SqlValue[][] = [];\n for (const left of leftTable.scan()) {\n const matches = rightTable.lookupEquality(rightCol, leftTable.cell(left, leftCol));\n if (!matches) return null;\n for (const right of matches) values.push(projectors.map((fn) => fn(left, right)));\n }\n return pack(env, names, values);\n}\n\nfunction rowMatches(table: Table, row: Row, filters: { column: string; value: SqlValue }[]): boolean {\n for (const filter of filters) {\n if (isRowidName(filter.column)) {\n if (compareSql(row.rowid, filter.value) !== 0) return false;\n continue;\n }\n if (compareSql(table.cell(row, filter.column), filter.value) !== 0) return false;\n }\n return true;\n}\n\nfunction projectNames(columns: ResultColumn[], table: Table): string[] {\n const names: string[] = [];\n for (const column of columns) {\n if (column.type === \"star\") {\n for (const item of table.columns) names.push(item.name);\n continue;\n }\n if (column.alias) {\n names.push(column.alias);\n continue;\n }\n const key = column.expr.type === \"column\" ? column.expr.name.toLowerCase() : \"\";\n if (isRowidName(key)) names.push(table.integerPkColumn()?.name ?? \"rowid\");\n else names.push(column.expr.type === \"column\" ? column.expr.name : \"?column?\");\n }\n return names;\n}\n\nfunction projectionFns(columns: ResultColumn[], table: Table): ((row: Row) => SqlValue)[] {\n const fns: ((row: Row) => SqlValue)[] = [];\n for (const column of columns) {\n if (column.type === \"star\") {\n for (const item of table.columns) {\n const key = item.nameLower ?? item.name.toLowerCase();\n fns.push((row) => table.cell(row, key));\n }\n continue;\n }\n const expr = column.expr;\n if (expr.type !== \"column\") continue;\n const key = expr.name.toLowerCase();\n if (isRowidName(key)) fns.push((row) => row.rowid);\n else fns.push((row) => table.cell(row, key));\n }\n return fns;\n}\n\nfunction evalIndependent(expr: Expr, env: ExecutionEnv): SqlValue {\n if (expr.type === \"literal\") return expr.value;\n if (expr.type === \"null\") return null;\n if (expr.type === \"parameter\") return env.getBoundParameter(expr.name);\n if (expr.type === \"unary\" && expr.op === \"-\" && expr.expr.type === \"literal\" && typeof expr.expr.value === \"number\") {\n return canonicalizeNumber(-expr.expr.value);\n }\n throw new Error(\"not independent\");\n}\n\nfunction isRowidName(name: string): boolean {\n return name === \"rowid\" || name === \"_rowid_\" || name === \"oid\";\n}\n\nfunction pack(env: ExecutionEnv, columns: string[], values: SqlValue[][]): ResultSet {\n return valuesToResult(columns, values, 0, env.state.lastInsertRowid, {\n named: env.includeNamedRows,\n keepValues: true,\n });\n}\n", "import type {\n AggregateExpr,\n Expr,\n FromItem,\n OrderByItem,\n ResultColumn,\n SelectStmt,\n WindowExpr,\n WindowSpec,\n WithClause,\n} from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { EvalContext } from \"../expressions/context.ts\";\nimport { evalExpr, explicitCollation } from \"../expressions/eval.ts\";\nimport { isPragmaTvfName } from \"../functions/pragma-tvf.ts\";\nimport { evaluateTableFunction, hasTableValuedFunction, tableValuedColumns } from \"../functions/table-valued.ts\";\nimport { serializeIndexKey } from \"../indexes/index.ts\";\nimport {\n tryIndexedOrder,\n tryIndexedTableRows,\n tryJoinEqualityKeys,\n tryJoinProbe,\n whereFullyCovered,\n} from \"../planner/access.ts\";\nimport { buildSqliteMaster, buildSqliteSchema } from \"../schema/catalog.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\nimport type { Row } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { compareWithCollation, normalizeForCollation } from \"../types/collation.ts\";\nimport {\n type Affinity,\n applyAffinity,\n compareSql,\n isTruthySql,\n type SqlValue,\n sqlValueEquals,\n toInteger,\n} from \"../types/value.ts\";\nimport type { FtsVocabVirtualTable } from \"../vtable/modules.ts\";\nimport type { ExecutionEnv, ScopeRow } from \"./env.ts\";\nimport { makeCell } from \"./env.ts\";\nimport { type ResultSet, resultValues, valuesToResult } from \"./result.ts\";\nimport { tryExecuteSimpleJoin, tryExecuteSimpleSelect } from \"./simple-select.ts\";\n\nfunction applyAffinityLocal(value: SqlValue, affinity: Affinity): SqlValue {\n return applyAffinity(value, affinity);\n}\n\ninterface OutputRow {\n values: SqlValue[];\n scope: ScopeRow;\n}\n\nexport function executeSelect(stmt: SelectStmt, env: ExecutionEnv, parent?: EvalContext): ResultSet {\n env.selectRunner = executeSelect;\n if (!parent && !stmt.with && !stmt.compound && !env.forceFullSelect) {\n const simple = tryExecuteSimpleSelect(stmt, env) ?? tryExecuteSimpleJoin(stmt, env);\n if (simple) return simple;\n }\n const savedCtes = new Map(env.ctes);\n try {\n if (stmt.with) executeWith(stmt.with, env, parent);\n const base = executeSelectCore(\n {\n ...stmt,\n with: null,\n compound: null,\n orderBy: stmt.compound ? [] : stmt.orderBy,\n limit: stmt.compound ? null : stmt.limit,\n },\n env,\n parent,\n );\n if (!stmt.compound) return base;\n const right = executeSelect(stmt.compound.select, env, parent);\n if (base.columns.length !== right.columns.length) {\n throw new SqliteError(\n \"SELECTs to the left and right of compound operator do not have the same number of result columns\",\n \"other\",\n );\n }\n const leftRows = resultValues(base);\n const rightRows = resultValues(right);\n let rows: SqlValue[][];\n switch (stmt.compound.op) {\n case \"UNION ALL\":\n rows = [...leftRows, ...rightRows];\n break;\n case \"UNION\":\n rows = uniqueRows([...leftRows, ...rightRows]);\n break;\n case \"INTERSECT\":\n rows = uniqueRows(leftRows).filter((row) => rightRows.some((other) => rowsEqual(row, other)));\n break;\n case \"EXCEPT\":\n rows = uniqueRows(leftRows).filter((row) => !rightRows.some((other) => rowsEqual(row, other)));\n break;\n }\n if (stmt.orderBy.length > 0) rows.sort((a, b) => compareCompoundRows(a, b, stmt.orderBy, base.columns));\n if (stmt.limit) {\n const ctx = env.createEvalContext(null, parent);\n const limitValue = toInteger(evalExpr(stmt.limit.limit, ctx));\n const offsetValue = stmt.limit.offset ? toInteger(evalExpr(stmt.limit.offset, ctx)) : 0;\n if (limitValue === null || offsetValue === null) throw new SqliteError(\"datatype mismatch\", \"datatype_mismatch\");\n const offset = Math.max(0, Number(offsetValue));\n const limit = Number(limitValue);\n rows = rows.slice(offset, limit < 0 ? undefined : offset + limit);\n }\n return valuesToResult(base.columns, rows, 0, env.state.lastInsertRowid, {\n named: env.includeNamedRows,\n keepValues: true,\n });\n } finally {\n env.ctes.clear();\n for (const [name, result] of savedCtes) env.ctes.set(name, result);\n }\n}\n\nexport function executeWith(withClause: WithClause, env: ExecutionEnv, parent?: EvalContext): void {\n for (const cte of withClause.ctes) {\n const key = cte.name.toLowerCase();\n if (withClause.recursive && referencesTable(cte.select, cte.name) && cte.select.compound) {\n const anchor = executeSelect({ ...cte.select, compound: null }, env, parent);\n const columns = cte.columns ?? anchor.columns;\n const recursive = cte.select.compound.select;\n const limit = recursive.limit\n ? toInteger(evalExpr(recursive.limit.limit, env.createEvalContext(null, parent)))\n : null;\n if (recursive.limit && limit === null) throw new SqliteError(\"datatype mismatch\", \"datatype_mismatch\");\n const maxRows = limit === null || Number(limit) < 0 ? Number.POSITIVE_INFINITY : Number(limit);\n const queue = resultValues(anchor);\n const discovered = [...queue];\n const accumulated: SqlValue[][] = [];\n if (recursive.orderBy.length > 0) {\n queue.sort((left, right) => compareCteQueueRows(left, right, columns, recursive.orderBy, env, parent));\n }\n while (queue.length > 0 && accumulated.length < maxRows) {\n const current = queue.shift()!;\n accumulated.push(current);\n env.ctes.set(key, valuesToResult(columns, [current]));\n const nextResult = executeSelect({ ...recursive, orderBy: [], limit: null }, env, parent);\n const candidates = resultValues(nextResult);\n const additions: SqlValue[][] = [];\n for (const candidate of candidates) {\n if (\n cte.select.compound.op !== \"UNION ALL\" &&\n [...discovered, ...additions].some((existing) => rowsEqual(existing, candidate))\n )\n continue;\n additions.push(candidate);\n }\n discovered.push(...additions);\n queue.push(...additions);\n if (recursive.orderBy.length > 0) {\n queue.sort((left, right) => compareCteQueueRows(left, right, columns, recursive.orderBy, env, parent));\n }\n }\n env.ctes.set(key, valuesToResult(columns, accumulated));\n } else {\n const result = executeSelect(cte.select, env, parent);\n const columns = cte.columns ?? result.columns;\n env.ctes.set(key, valuesToResult(columns, resultValues(result)));\n }\n }\n}\n\nfunction compareCteQueueRows(\n left: SqlValue[],\n right: SqlValue[],\n columns: string[],\n order: OrderByItem[],\n env: ExecutionEnv,\n parent?: EvalContext,\n): number {\n const scope = (values: SqlValue[]): ScopeRow => ({\n cells: columns.map((name, index) => ({ table: null, name, value: values[index] ?? null })),\n });\n const leftScope = scope(left);\n const rightScope = scope(right);\n for (const item of order) {\n if (item.expr.type === \"literal\" && typeof item.expr.value === \"number\" && Number.isInteger(item.expr.value)) {\n const index = item.expr.value - 1;\n const result = compareNullable(left[index] ?? null, right[index] ?? null, item);\n if (result !== 0) return result;\n continue;\n }\n const a = evalExpr(item.expr, env.createEvalContext(leftScope, parent));\n const b = evalExpr(item.expr, env.createEvalContext(rightScope, parent));\n const result = compareNullable(a, b, item, leftScope);\n if (result !== 0) return result;\n }\n return 0;\n}\n\nfunction executeSelectCore(stmt: SelectStmt, env: ExecutionEnv, parent?: EvalContext): ResultSet {\n let scopes: ScopeRow[];\n let skipWhere = false;\n let skipOrder = false;\n if (stmt.from && stmt.where) {\n const indexed = tryIndexedTableRows(stmt.from, stmt.where, env);\n if (indexed) {\n scopes = scopesFromTableRows(indexed.table, indexed.rows, indexed.alias, env, parent);\n skipWhere = whereFullyCovered(stmt.where, indexed.coveredColumns, indexed.alias, indexed.table.name);\n } else {\n scopes = scanFrom(stmt.from, env, parent);\n }\n } else if (stmt.from && stmt.orderBy.length === 1 && stmt.orderBy[0]) {\n const canUseIndexedOrderScan =\n stmt.groupBy.length === 0 &&\n stmt.having === null &&\n !stmt.distinct &&\n !stmt.columns.some((column) => column.type === \"expr\" && containsAggregate(column.expr));\n let take: number | undefined;\n if (canUseIndexedOrderScan && stmt.limit) {\n const ctx = env.createEvalContext(null, parent);\n const limitValue = toInteger(evalExpr(stmt.limit.limit, ctx));\n const offsetValue = stmt.limit.offset ? toInteger(evalExpr(stmt.limit.offset, ctx)) : 0;\n if (limitValue !== null && offsetValue !== null) {\n const offset = Math.max(0, Number(offsetValue));\n const limit = Number(limitValue);\n take = limit < 0 ? undefined : offset + limit;\n }\n }\n if (canUseIndexedOrderScan) {\n const ordered = tryIndexedOrder(\n stmt.from,\n { expr: stmt.orderBy[0].expr, dir: stmt.orderBy[0].dir ?? \"ASC\" },\n env,\n take,\n );\n if (ordered) {\n scopes = scopesFromTableRows(ordered.table, ordered.rows, ordered.alias, env, parent);\n skipOrder = true;\n } else scopes = scanFrom(stmt.from, env, parent);\n } else scopes = scanFrom(stmt.from, env, parent);\n } else {\n scopes = stmt.from ? scanFrom(stmt.from, env, parent) : [{ cells: [] }];\n }\n const canStopEarly =\n stmt.orderBy.length === 0 &&\n !stmt.distinct &&\n stmt.groupBy.length === 0 &&\n stmt.having === null &&\n Number.isFinite(env.maxRows);\n const aggregate =\n stmt.groupBy.length > 0 ||\n stmt.columns.some((column) => column.type === \"expr\" && containsAggregate(column.expr)) ||\n (stmt.having !== null && containsAggregate(stmt.having));\n if (stmt.where && !skipWhere) {\n if (canStopEarly && !aggregate) {\n const filtered: ScopeRow[] = [];\n for (const scope of scopes) {\n if (isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope, parent))) !== true) continue;\n filtered.push(scope);\n if (filtered.length >= env.maxRows) break;\n }\n scopes = filtered;\n } else {\n scopes = scopes.filter(\n (scope) => isTruthySql(evalExpr(stmt.where!, env.createEvalContext(scope, parent))) === true,\n );\n }\n }\n const groupBy = stmt.groupBy.map((expr) => {\n if (expr.type === \"literal\" && typeof expr.value === \"number\" && Number.isInteger(expr.value)) {\n const column = stmt.columns[expr.value - 1];\n if (column?.type !== \"expr\") throw new SqliteError(`${expr.value}th GROUP BY term out of range`, \"other\");\n return column.expr;\n }\n if (expr.type === \"column\" && expr.table === null) {\n const column = stmt.columns.find(\n (candidate) => candidate.type === \"expr\" && candidate.alias?.toLowerCase() === expr.name.toLowerCase(),\n );\n if (column?.type === \"expr\") return column.expr;\n }\n return expr;\n });\n const groups = aggregate ? groupRows(scopes, groupBy, env, parent) : scopes.map((scope) => [scope]);\n const windowScopes = aggregate ? groups.map((group) => group[0] ?? { cells: [] }) : scopes;\n const sample = scopes[0] ?? (stmt.from ? { cells: shapeOf(stmt.from, env) } : undefined);\n if (scopes.length === 0 && sample) validateProjectedColumns(stmt, sample, env, parent);\n const columns = resultColumnNames(stmt.columns, sample);\n let output: OutputRow[] = [];\n\n for (const group of groups) {\n const scope = group[0] ?? { cells: [] };\n const ctx = env.createEvalContext(scope, parent);\n const values: SqlValue[] = [];\n for (const column of stmt.columns) {\n if (column.type === \"star\") {\n for (const cell of scope.cells) {\n if (\n (column.table !== null || !cell.hiddenByUsing) &&\n (column.table === null || cell.table?.toLowerCase() === column.table.toLowerCase())\n )\n values.push(cell.value);\n }\n } else {\n values.push(evalGrouped(column.expr, ctx, group, env, parent, stmt.windows, windowScopes));\n }\n }\n if (stmt.having) {\n const aliases = new Map<string, SqlValue>();\n stmt.columns.forEach((column, index) => {\n if (column.type === \"expr\" && column.alias) aliases.set(column.alias.toLowerCase(), values[index] ?? null);\n });\n const havingCtx: EvalContext = {\n ...ctx,\n resolveColumn: (table, name) => {\n if (table === null && aliases.has(name.toLowerCase())) return aliases.get(name.toLowerCase()) ?? null;\n return ctx.resolveColumn(table, name);\n },\n };\n if (isTruthySql(evalGrouped(stmt.having, havingCtx, group, env, parent, stmt.windows, windowScopes)) !== true)\n continue;\n }\n output.push({ values, scope });\n if (canStopEarly && !aggregate && !stmt.limit && output.length >= env.maxRows) break;\n }\n\n // SQLite emits grouped rows sorted by GROUP BY keys (ASC) even without ORDER BY.\n if (stmt.groupBy.length > 0 && stmt.orderBy.length === 0 && !skipOrder) {\n const groupOrder = groupBy.map((expr) => ({ expr, dir: \"ASC\" as const, nulls: null }));\n output.sort((left, right) => compareOutput(left, right, groupOrder, columns, env, parent, stmt.columns));\n }\n\n if (stmt.distinct) {\n const seen = new Set<string>();\n output = output.filter((row) => {\n const key = valueKey(row.values);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n }\n if (stmt.orderBy.length > 0 && !skipOrder) {\n const groupOrder =\n stmt.groupBy.length > 0\n ? groupBy.map((expr) => ({ expr, dir: \"ASC\" as const, nulls: null as OrderByItem[\"nulls\"] }))\n : [];\n output.sort((left, right) => {\n const primary = compareOutput(left, right, stmt.orderBy, columns, env, parent, stmt.columns);\n if (primary !== 0 || groupOrder.length === 0) return primary;\n return compareOutput(left, right, groupOrder, columns, env, parent, stmt.columns);\n });\n }\n if (stmt.limit) {\n const ctx = env.createEvalContext(null, parent);\n const limitValue = toInteger(evalExpr(stmt.limit.limit, ctx));\n const offsetValue = stmt.limit.offset ? toInteger(evalExpr(stmt.limit.offset, ctx)) : 0;\n if (limitValue === null || offsetValue === null) throw new SqliteError(\"datatype mismatch\", \"datatype_mismatch\");\n const offset = Math.max(0, Number(offsetValue));\n const limit = Number(limitValue);\n output = output.slice(offset, limit < 0 ? undefined : offset + limit);\n }\n if (Number.isFinite(env.maxRows) && output.length > env.maxRows) output = output.slice(0, env.maxRows);\n return valuesToResult(\n columns,\n output.map((row) => row.values),\n 0,\n env.state.lastInsertRowid,\n {\n named: env.includeNamedRows,\n keepValues: true,\n },\n );\n}\n\nexport function scanFrom(item: FromItem, env: ExecutionEnv, parent?: EvalContext): ScopeRow[] {\n if (item.type === \"join\") {\n const left = scanFrom(item.left, env, parent);\n\n // Correlated table-valued functions (e.g. json_each(t.data)) are evaluated per left row.\n if (item.right.type === \"table_func\") {\n const result: ScopeRow[] = [];\n const rightShape = shapeOf(item.right, env);\n const nullRight = rightShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n for (const lhs of left) {\n const tvf = evaluateTableFunction(item.right.name, item.right.args, item.right.alias, env, lhs, parent);\n if (tvf.rows.length === 0) {\n if (item.joinType === \"LEFT\" || item.joinType === \"FULL\") {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n continue;\n }\n for (const rhs of tvf.rows) {\n const joined = { cells: [...lhs.cells, ...rhs.cells] };\n if (item.on) {\n if (isTruthySql(evalExpr(item.on, env.createEvalContext(joined, parent))) !== true) continue;\n }\n result.push(joined);\n }\n }\n return result;\n }\n\n const probe =\n !item.using && item.joinType !== \"RIGHT\" && item.joinType !== \"FULL\"\n ? tryJoinProbe(item.right, item.on, env)\n : null;\n if (probe) {\n const rightShape = shapeOf(item.right, env);\n const nullRight = rightShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n const result: ScopeRow[] = [];\n for (const lhs of left) {\n const raw = probe.lookup((tableName, name) => {\n const key = name.toLowerCase();\n const match = lhs.cells.find(\n (cell) =>\n (cell.nameLower ?? cell.name.toLowerCase()) === key &&\n (tableName === null || (cell.tableLower ?? cell.table?.toLowerCase()) === tableName.toLowerCase()),\n );\n return match?.value ?? null;\n });\n const rhsScopes = scopesFromTableRows(probe.table, raw, probe.alias, env, parent);\n let matched = false;\n for (const rhs of rhsScopes) {\n const joined = { cells: [...lhs.cells, ...rhs.cells] };\n if (\n item.on &&\n !probe.covering &&\n isTruthySql(evalExpr(item.on, env.createEvalContext(joined, parent))) !== true\n )\n continue;\n matched = true;\n result.push(joined);\n }\n if (!matched && (item.joinType === \"LEFT\" || item.joinType === \"FULL\")) {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n }\n return result;\n }\n\n // Hash-join fallback for unindexed equality INNER/LEFT joins (NULL keys never match).\n const hashKeys =\n !item.using && item.joinType !== \"RIGHT\" && item.joinType !== \"FULL\"\n ? tryJoinEqualityKeys(item.right, item.on, env)\n : null;\n if (hashKeys) {\n const rawRight = rawJoinTable(item.right, env);\n if (rawRight) {\n return hashJoinRaw(left, rawRight, hashKeys, item);\n }\n const right = scanFrom(item.right, env, parent);\n const rightShape = (right[0]?.cells ?? shapeOf(item.right, env)).map((cell) => cell);\n const nullRight = rightShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n const buckets = new Map<string, ScopeRow[]>();\n for (const rhs of right) {\n const values = hashKeys.rightColumns.map((name) => {\n const key = name.toLowerCase();\n const cell = rhs.cells.find((c) => (c.nameLower ?? c.name.toLowerCase()) === key);\n return normalizeForCollation(cell?.value ?? null, \"BINARY\");\n });\n const mapKey = serializeIndexKey(values);\n if (mapKey === null) continue; // NULL join key \u2192 never matches via =\n const bucket = buckets.get(mapKey);\n if (bucket) bucket.push(rhs);\n else buckets.set(mapKey, [rhs]);\n }\n const result: ScopeRow[] = [];\n for (const lhs of left) {\n const values = hashKeys.leftKeys.map((key) => {\n const cell = lhs.cells.find(\n (c) =>\n (c.nameLower ?? c.name.toLowerCase()) === key.column.toLowerCase() &&\n (key.table === null || (c.tableLower ?? c.table?.toLowerCase()) === key.table.toLowerCase()),\n );\n return normalizeForCollation(cell?.value ?? null, \"BINARY\");\n });\n const mapKey = serializeIndexKey(values);\n let matched = false;\n if (mapKey !== null) {\n const matches = buckets.get(mapKey);\n if (matches) {\n for (const rhs of matches) {\n const joined = { cells: [...lhs.cells, ...rhs.cells] };\n matched = true;\n result.push(joined);\n }\n }\n }\n if (!matched && (item.joinType === \"LEFT\" || item.joinType === \"FULL\")) {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n }\n return result;\n }\n\n const right = scanFrom(item.right, env, parent);\n const using = resolveUsingColumns(item, left, right, env);\n const leftShape = left[0]?.cells ?? shapeOf(item.left, env);\n const rightShape = (right[0]?.cells ?? shapeOf(item.right, env)).map((cell) =>\n using?.some((name) => name.toLowerCase() === cell.name.toLowerCase()) ? { ...cell, hiddenByUsing: true } : cell,\n );\n const nullLeft = leftShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n const nullRight = rightShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n const result: ScopeRow[] = [];\n const matchedRight = new Set<number>();\n\n const joinOk = (lhs: ScopeRow, rhs: ScopeRow, joined: ScopeRow): boolean => {\n if (using) {\n return using.every((name) => {\n const l = lhs.cells.find((cell) => cell.name.toLowerCase() === name.toLowerCase())?.value ?? null;\n const r = rhs.cells.find((cell) => cell.name.toLowerCase() === name.toLowerCase())?.value ?? null;\n return l !== null && r !== null && sqlValueEquals(l, r);\n });\n }\n if (item.on) return isTruthySql(evalExpr(item.on, env.createEvalContext(joined, parent))) === true;\n return true;\n };\n\n for (const lhs of left) {\n let matched = false;\n right.forEach((rhs, rightIndex) => {\n const rightCells = using\n ? rhs.cells.map((cell) =>\n using.some((name) => name.toLowerCase() === cell.name.toLowerCase())\n ? { ...cell, hiddenByUsing: true }\n : cell,\n )\n : rhs.cells;\n const joined = { cells: [...lhs.cells, ...rightCells] };\n if (!joinOk(lhs, rhs, joined)) return;\n matched = true;\n matchedRight.add(rightIndex);\n result.push(joined);\n });\n if (!matched && (item.joinType === \"LEFT\" || item.joinType === \"FULL\")) {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n }\n\n if (item.joinType === \"RIGHT\" || item.joinType === \"FULL\") {\n right.forEach((rhs, rightIndex) => {\n if (matchedRight.has(rightIndex)) return;\n if (using) {\n // USING/NATURAL: unmatched right rows expose right values for shared columns.\n const leftCells = nullLeft.map((cell) => {\n const shared = using.some((name) => name.toLowerCase() === cell.name.toLowerCase());\n if (!shared) return cell;\n const fromRight = rhs.cells.find((c) => c.name.toLowerCase() === cell.name.toLowerCase());\n return { ...cell, value: fromRight?.value ?? null, hiddenByUsing: false };\n });\n const rightOnly = rhs.cells.filter(\n (cell) => !using.some((name) => name.toLowerCase() === cell.name.toLowerCase()),\n );\n result.push({ cells: [...leftCells, ...rightOnly] });\n } else {\n result.push({ cells: [...nullLeft, ...rhs.cells] });\n }\n });\n }\n\n return result;\n }\n if (item.type === \"subquery\") {\n const result = executeSelect(item.select, env, parent);\n return resultValues(result).map((values) => ({\n cells: result.columns.map((name, index) => ({ table: item.alias, name, value: values[index] ?? null })),\n }));\n }\n if (item.type === \"table_func\") {\n return evaluateTableFunction(item.name, item.args, item.alias, env).rows;\n }\n\n // Eponymous pragma_* virtual tables may be referenced without parentheses.\n if (item.type === \"table\" && isPragmaTvfName(item.name) && hasTableValuedFunction(item.name.toLowerCase())) {\n return evaluateTableFunction(item.name, [], item.alias, env, null, parent).rows;\n }\n\n const alias = item.alias ?? item.name;\n const qualified = item.schema ? `${item.schema}.${item.name}` : item.name;\n const db = env.state.databaseForSchema(item.schema, qualified);\n const cte = env.ctes.get(item.name.toLowerCase());\n if (cte) {\n return resultValues(cte).map((values) => ({\n cells: cte.columns.map((name, index) => ({ table: alias, name, value: values[index] ?? null })),\n }));\n }\n const view = db.views.get(item.name.toLowerCase());\n if (view) {\n const result = executeSelect(view.select, env, parent);\n const names = view.columns ?? result.columns;\n return resultValues(result).map((values) => ({\n cells: names.map((name, index) => ({ table: alias, name, value: values[index] ?? null })),\n }));\n }\n const virtual = db.virtualTables.get(item.name.toLowerCase());\n if (virtual) {\n if (virtual.kind === \"fts5\" || virtual.kind === \"fts3\" || virtual.kind === \"fts4\") {\n return virtual.scan().map((row) => ({\n rowid: row.rowid,\n rowidName: \"rowid\",\n sourceTable: virtual.name,\n cells: virtual.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n }));\n }\n if (virtual.kind === \"rtree\") {\n return virtual.scan().map((row) => ({\n rowid: row.rowid,\n rowidName: \"rowid\",\n sourceTable: virtual.name,\n cells: virtual.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n }));\n }\n if (virtual.kind === \"dbstat\") {\n return scanDbStat(db, alias, virtual.schemaArg);\n }\n if (virtual.kind === \"fts5vocab\") {\n return scanFtsVocab(db, alias, virtual);\n }\n // bytecode / tables_used: empty by default\n return [];\n }\n let table: Table;\n if (item.name.toLowerCase() === \"sqlite_schema\") table = buildSqliteSchema(db);\n else if (item.name.toLowerCase() === \"sqlite_master\") table = buildSqliteMaster(db);\n else table = db.getTable(item.name);\n return scopesFromTableRows(table, table.scan(), alias, env, parent);\n}\n\nfunction rawJoinTable(item: FromItem, env: ExecutionEnv): { table: Table; alias: string } | null {\n if (item.type !== \"table\") return null;\n const nameKey = item.name.toLowerCase();\n if (nameKey === \"sqlite_schema\" || nameKey === \"sqlite_master\") return null;\n if (env.ctes.has(nameKey)) return null;\n const db = env.state.databaseForSchema(item.schema, item.schema ? `${item.schema}.${item.name}` : item.name);\n if (db.virtualTables.has(nameKey) || db.views.has(nameKey)) return null;\n try {\n return { table: db.getTable(item.name), alias: item.alias ?? item.name };\n } catch {\n return null;\n }\n}\n\nfunction hashJoinRaw(\n left: ScopeRow[],\n right: { table: Table; alias: string },\n hashKeys: { rightColumns: string[]; leftKeys: { table: string | null; column: string }[] },\n item: Extract<FromItem, { type: \"join\" }>,\n): ScopeRow[] {\n const rightKeys = hashKeys.rightColumns.map((name) => name.toLowerCase());\n const buckets = new Map<string, Row[]>();\n const source = right.table.withoutRowid ? right.table.clusteredRows.values() : right.table.rows.values();\n for (const row of source) {\n const values = rightKeys.map((key) => normalizeForCollation(right.table.cell(row, key), \"BINARY\"));\n const mapKey = serializeIndexKey(values);\n if (mapKey === null) continue;\n const bucket = buckets.get(mapKey);\n if (bucket) bucket.push(row);\n else buckets.set(mapKey, [row]);\n }\n const nullRight = right.table.columns.map((column) =>\n makeCell(right.alias, column.name, null, { affinity: column.affinity, collate: column.collate }),\n );\n const result: ScopeRow[] = [];\n for (const lhs of left) {\n const values = hashKeys.leftKeys.map((key) => {\n const want = key.column.toLowerCase();\n const tableKey = key.table?.toLowerCase();\n const cell = lhs.cells.find(\n (c) =>\n (c.nameLower ?? c.name.toLowerCase()) === want &&\n (tableKey === undefined || (c.tableLower ?? c.table?.toLowerCase()) === tableKey),\n );\n return normalizeForCollation(cell?.value ?? null, \"BINARY\");\n });\n const mapKey = serializeIndexKey(values);\n let matched = false;\n if (mapKey !== null) {\n const matches = buckets.get(mapKey);\n if (matches) {\n for (const row of matches) {\n const rhsCells = right.table.columns.map((column) =>\n makeCell(right.alias, column.name, right.table.cell(row, column.nameLower ?? column.name.toLowerCase()), {\n affinity: column.affinity,\n collate: column.collate,\n }),\n );\n result.push({ cells: [...lhs.cells, ...rhsCells] });\n matched = true;\n }\n }\n }\n if (!matched && (item.joinType === \"LEFT\" || item.joinType === \"FULL\")) {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n }\n return result;\n}\n\nfunction scopesFromTableRows(\n table: Table,\n rows: Iterable<Row>,\n alias: string,\n env: ExecutionEnv,\n parent?: EvalContext,\n): ScopeRow[] {\n const integerPkAlias = table.integerPkColumn()?.name;\n const result: ScopeRow[] = [];\n for (const row of rows) {\n const baseCells = table.columns\n .filter((c) => !c.generated || c.generated.stored)\n .map((column) =>\n makeCell(alias, column.name, table.cell(row, column.nameLower ?? column.name.toLowerCase()), {\n affinity: column.affinity,\n collate: column.collate,\n }),\n );\n const cells = table.columns.map((column) => {\n if (column.generated && !column.generated.stored) {\n const ctx = env.createEvalContext({ cells: baseCells, sourceTable: table.name }, parent);\n return makeCell(alias, column.name, applyAffinityLocal(evalExpr(column.generated.expr, ctx), column.affinity), {\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n return makeCell(alias, column.name, table.cell(row, column.nameLower ?? column.name.toLowerCase()), {\n affinity: column.affinity,\n collate: column.collate,\n });\n });\n result.push({\n ...(table.withoutRowid ? {} : { rowid: row.rowid }),\n rowidName: integerPkAlias ?? (table.withoutRowid ? undefined : \"rowid\"),\n sourceTable: table.name,\n cells,\n });\n }\n return result;\n}\n\nfunction shapeOf(item: FromItem, env: ExecutionEnv): ScopeRow[\"cells\"] {\n if (item.type === \"join\") {\n const left = shapeOf(item.left, env);\n const right = shapeOf(item.right, env);\n const using = resolveUsingFromShapes(item.using, left, right);\n return [\n ...left,\n ...right.map((cell) =>\n using?.some((name) => name.toLowerCase() === cell.name.toLowerCase()) ? { ...cell, hiddenByUsing: true } : cell,\n ),\n ];\n }\n if (item.type === \"subquery\")\n return resultColumnNames(item.select.columns).map((name) => ({ table: item.alias, name, value: null }));\n if (item.type === \"table_func\") {\n // Do not evaluate args here \u2014 they may be correlated (e.g. pragma_table_info(tl.name)).\n const known = tableValuedColumns(item.name);\n const columns = known ?? evaluateTableFunction(item.name, item.args, item.alias, env).columns;\n return columns.map((name) => ({\n table: item.alias ?? item.name,\n name,\n value: null,\n }));\n }\n if (item.type === \"table\" && isPragmaTvfName(item.name) && hasTableValuedFunction(item.name.toLowerCase())) {\n const columns = tableValuedColumns(item.name) ?? evaluateTableFunction(item.name, [], item.alias, env).columns;\n return columns.map((name) => ({\n table: item.alias ?? item.name,\n name,\n value: null,\n }));\n }\n const alias = item.alias ?? item.name;\n const qualified = item.schema ? `${item.schema}.${item.name}` : item.name;\n const db = env.state.databaseForSchema(item.schema, qualified);\n const cte = env.ctes.get(item.name.toLowerCase());\n if (cte) return cte.columns.map((name) => ({ table: alias, name, value: null }));\n const view = db.views.get(item.name.toLowerCase());\n if (view)\n return (view.columns ?? resultColumnNames(view.select.columns)).map((name) => ({\n table: alias,\n name,\n value: null,\n }));\n const virtual = db.virtualTables.get(item.name.toLowerCase());\n if (virtual) return virtual.columns.map((name) => ({ table: alias, name, value: null }));\n const table =\n item.name.toLowerCase() === \"sqlite_schema\"\n ? buildSqliteSchema(db)\n : item.name.toLowerCase() === \"sqlite_master\"\n ? buildSqliteMaster(db)\n : db.getTable(item.name);\n return table.columns.map((column) => ({ table: alias, name: column.name, value: null, affinity: column.affinity }));\n}\n\n/** NATURAL JOIN uses an empty USING list as a sentinel; resolve shared column names at runtime. */\nfunction resolveUsingColumns(\n item: Extract<FromItem, { type: \"join\" }>,\n left: ScopeRow[],\n right: ScopeRow[],\n env: ExecutionEnv,\n): string[] | null {\n const leftCells = left[0]?.cells ?? shapeOf(item.left, env);\n const rightCells = right[0]?.cells ?? shapeOf(item.right, env);\n return resolveUsingFromShapes(item.using, leftCells, rightCells);\n}\n\nfunction resolveUsingFromShapes(\n using: string[] | null,\n leftCells: ScopeRow[\"cells\"],\n rightCells: ScopeRow[\"cells\"],\n): string[] | null {\n if (using === null) return null;\n if (using.length > 0) return using;\n const rightNames = new Set(rightCells.map((cell) => cell.name.toLowerCase()));\n const common: string[] = [];\n const seen = new Set<string>();\n for (const cell of leftCells) {\n const key = cell.name.toLowerCase();\n if (rightNames.has(key) && !seen.has(key)) {\n seen.add(key);\n common.push(cell.name);\n }\n }\n return common;\n}\n\nfunction groupRows(rows: ScopeRow[], expressions: Expr[], env: ExecutionEnv, parent?: EvalContext): ScopeRow[][] {\n if (expressions.length === 0) return [rows];\n const groups: ScopeRow[][] = [];\n const indexByKey = new Map<string, number>();\n for (const row of rows) {\n const keyValues = expressions.map((expr) => {\n const value = evalExpr(expr, env.createEvalContext(row, parent));\n return expr.type === \"collate\" ? normalizeForCollation(value, expr.collation) : value;\n });\n const key = valueKey(keyValues);\n const index = indexByKey.get(key);\n if (index === undefined) {\n indexByKey.set(key, groups.length);\n groups.push([row]);\n } else groups[index]!.push(row);\n }\n return groups;\n}\n\nfunction evalGrouped(\n expr: Expr,\n ctx: EvalContext,\n group: ScopeRow[],\n env: ExecutionEnv,\n parent: EvalContext | undefined,\n namedWindows: SelectStmt[\"windows\"],\n windowRows: ScopeRow[],\n): SqlValue {\n return evalExpr(\n replaceSpecial(expr, (special) => {\n if (special.type === \"aggregate\") return aggregateValue(special, group, env, parent);\n return windowValue(special, group[0] ?? { cells: [] }, windowRows, env, parent, namedWindows);\n }),\n ctx,\n );\n}\n\nfunction aggregateValue(expr: AggregateExpr, rows: ScopeRow[], env: ExecutionEnv, parent?: EvalContext): SqlValue {\n const accumulator = env.functions.createAggregate(expr.name);\n if (!accumulator) throw new SqliteError(`no such aggregate function: ${expr.name}`, \"other\");\n const seen: SqlValue[][] = [];\n const orderedRows =\n expr.orderBy.length > 0 ? [...rows].sort((a, b) => compareScopes(a, b, expr.orderBy, env, parent)) : rows;\n for (const row of orderedRows) {\n const ctx = env.createEvalContext(row, parent);\n if (expr.filter && isTruthySql(evalExpr(expr.filter, ctx)) !== true) continue;\n const args = expr.args === \"*\" ? [] : expr.args.map((arg) => evalExpr(arg, ctx));\n if (expr.distinct && seen.some((values) => rowsEqual(values, args))) continue;\n seen.push(args);\n accumulator.step(args);\n }\n return accumulator.finalize();\n}\n\nfunction windowValue(\n expr: WindowExpr,\n current: ScopeRow,\n rows: ScopeRow[],\n env: ExecutionEnv,\n parent: EvalContext | undefined,\n namedWindows: SelectStmt[\"windows\"],\n): SqlValue {\n const spec = resolveWindow(expr.window, namedWindows);\n const currentCtx = env.createEvalContext(current, parent);\n const partitionKey = spec.partitionBy.map((item) => evalExpr(item, currentCtx));\n const partition = rows.filter((row) =>\n rowsEqual(\n partitionKey,\n spec.partitionBy.map((item) => evalExpr(item, env.createEvalContext(row, parent))),\n ),\n );\n partition.sort((a, b) => compareScopes(a, b, spec.orderBy, env, parent));\n const index = Math.max(0, partition.indexOf(current));\n const orderKeys = partition.map((row) =>\n spec.orderBy.map((item) => evalExpr(item.expr, env.createEvalContext(row, parent))),\n );\n let defaultFrameEnd = index;\n if (spec.orderBy.length > 0) {\n while (defaultFrameEnd + 1 < partition.length) {\n const next = partition[defaultFrameEnd + 1];\n if (!next || compareScopes(current, next, spec.orderBy, env, parent) !== 0) break;\n defaultFrameEnd++;\n }\n }\n if (expr.func.type === \"aggregate\") {\n const [start, end] = frameBounds(spec, index, partition.length, currentCtx, defaultFrameEnd, orderKeys);\n const framed = frameRows(partition, start, end, index, orderKeys, spec.frame?.exclude ?? null);\n return aggregateValue(expr.func, framed, env, parent);\n }\n const name = expr.func.name.toLowerCase();\n const args = expr.func.args === \"*\" ? [] : expr.func.args;\n const values = partition.map((row) => args.map((arg) => evalExpr(arg, env.createEvalContext(row, parent))));\n if (name === \"row_number\") return index + 1;\n if (name === \"rank\") {\n let first = index;\n while (first > 0 && rowsEqual(orderKeys[first]!, orderKeys[first - 1]!)) first--;\n return first + 1;\n }\n if (name === \"dense_rank\") {\n let rank = 1;\n for (let i = 1; i <= index; i++) if (!rowsEqual(orderKeys[i]!, orderKeys[i - 1]!)) rank++;\n return rank;\n }\n const evaluated = args.map((arg) => evalExpr(arg, currentCtx));\n if (name === \"lag\" || name === \"lead\") {\n const offset = Number(toInteger(evaluated[1] ?? 1) ?? 1);\n const target = name === \"lag\" ? index - offset : index + offset;\n return values[target]?.[0] ?? evaluated[2] ?? null;\n }\n const [start, end] = frameBounds(spec, index, partition.length, currentCtx, defaultFrameEnd, orderKeys);\n const framed = frameRows(partition, start, end, index, orderKeys, spec.frame?.exclude ?? null);\n const framedValues = framed.map((row) => args.map((arg) => evalExpr(arg, env.createEvalContext(row, parent))));\n if (name === \"first_value\") return framedValues[0]?.[0] ?? null;\n if (name === \"last_value\") return framedValues[framedValues.length - 1]?.[0] ?? null;\n if (name === \"nth_value\") {\n const target = Number(toInteger(evaluated[1] ?? null) ?? 0) - 1;\n return target >= 0 && target < framedValues.length ? (framedValues[target]?.[0] ?? null) : null;\n }\n if (name === \"ntile\") {\n const buckets = Math.max(1, Number(toInteger(evaluated[0] ?? 1) ?? 1));\n const n = partition.length;\n const small = Math.floor(n / buckets);\n const large = small + 1;\n const largeCount = n % buckets;\n // First `largeCount` buckets have `large` rows\n let remaining = index;\n for (let b = 1; b <= buckets; b++) {\n const size = b <= largeCount ? large : small;\n if (remaining < size) return b;\n remaining -= size;\n }\n return buckets;\n }\n if (name === \"cume_dist\") {\n if (partition.length === 0) return null;\n let lastPeer = index;\n while (lastPeer + 1 < partition.length && rowsEqual(orderKeys[lastPeer + 1]!, orderKeys[index]!)) {\n lastPeer++;\n }\n return (lastPeer + 1) / partition.length;\n }\n if (name === \"percent_rank\") {\n if (partition.length <= 1) return 0;\n let first = index;\n while (first > 0 && rowsEqual(orderKeys[first]!, orderKeys[first - 1]!)) first--;\n return first / (partition.length - 1);\n }\n throw new SqliteError(`no such window function: ${expr.func.name}`, \"other\");\n}\n\nfunction resolveWindow(spec: WindowSpec, namedWindows: SelectStmt[\"windows\"], seen = new Set<string>()): WindowSpec {\n if (!spec.ref) return spec;\n const key = spec.ref.toLowerCase();\n if (seen.has(key)) throw new SqliteError(`circular window definition: ${spec.ref}`, \"other\");\n const named = namedWindows.find((item) => item.name.toLowerCase() === key);\n if (!named) throw new SqliteError(`no such window: ${spec.ref}`, \"other\");\n seen.add(key);\n const base = resolveWindow(named.spec, namedWindows, seen);\n return {\n partitionBy: spec.partitionBy.length ? spec.partitionBy : base.partitionBy,\n orderBy: spec.orderBy.length ? spec.orderBy : base.orderBy,\n frame: spec.frame ?? base.frame,\n ref: null,\n };\n}\n\nfunction frameBounds(\n spec: WindowSpec,\n index: number,\n length: number,\n ctx: EvalContext,\n defaultFrameEnd: number,\n orderKeys: SqlValue[][],\n): [number, number] {\n if (!spec.frame) return [0, spec.orderBy.length > 0 ? defaultFrameEnd : Math.max(0, length - 1)];\n const isRangeLike = spec.frame.type === \"RANGE\" || spec.frame.type === \"GROUPS\";\n let peerFirst = index;\n let peerLast = index;\n if (isRangeLike && spec.orderBy.length > 0) {\n while (peerFirst > 0 && rowsEqual(orderKeys[peerFirst]!, orderKeys[peerFirst - 1]!)) peerFirst--;\n while (peerLast + 1 < length && rowsEqual(orderKeys[peerLast]!, orderKeys[peerLast + 1]!)) peerLast++;\n }\n const bound = (\n item: WindowSpec[\"frame\"] extends infer _ ? NonNullable<WindowSpec[\"frame\"]>[\"start\"] : never,\n isStart: boolean,\n ): number => {\n switch (item.kind) {\n case \"unbounded_preceding\":\n return 0;\n case \"unbounded_following\":\n return Math.max(0, length - 1);\n case \"current_row\":\n if (isRangeLike) return isStart ? peerFirst : peerLast;\n return index;\n case \"preceding\":\n case \"following\": {\n const offset = Number(evalExpr(item.expr, ctx));\n if (spec.frame?.type === \"GROUPS\") {\n const groups: Array<{ first: number; last: number }> = [];\n for (let i = 0; i < length; ) {\n let last = i;\n while (last + 1 < length && rowsEqual(orderKeys[last]!, orderKeys[last + 1]!)) last++;\n groups.push({ first: i, last });\n i = last + 1;\n }\n const currentGroup = groups.findIndex((group) => index >= group.first && index <= group.last);\n const delta = item.kind === \"preceding\" ? -offset : offset;\n const target = groups[Math.max(0, Math.min(groups.length - 1, currentGroup + delta))]!;\n return isStart ? target.first : target.last;\n }\n if (spec.frame?.type === \"RANGE\" && spec.orderBy.length === 1) {\n const rawCurrent = orderKeys[index]?.[0];\n const current =\n typeof rawCurrent === \"number\"\n ? rawCurrent\n : typeof rawCurrent === \"bigint\"\n ? Number(rawCurrent)\n : rawCurrent && typeof rawCurrent === \"object\" && \"value\" in rawCurrent\n ? Number(rawCurrent.value)\n : Number.NaN;\n if (!Number.isFinite(current) || !Number.isFinite(offset)) return isStart ? peerFirst : peerLast;\n const descending = spec.orderBy[0]?.dir === \"DESC\";\n const signed = item.kind === \"preceding\" ? -offset : offset;\n const target = current + (descending ? -signed : signed);\n const numericKey = (position: number): number => {\n const value = orderKeys[position]?.[0];\n if (typeof value === \"number\") return value;\n if (typeof value === \"bigint\") return Number(value);\n if (value && typeof value === \"object\" && \"value\" in value) return Number(value.value);\n return Number.NaN;\n };\n if (isStart) {\n for (let i = 0; i < length; i++) {\n const value = numericKey(i);\n if ((descending && value <= target) || (!descending && value >= target)) return i;\n }\n return length;\n }\n for (let i = length - 1; i >= 0; i--) {\n const value = numericKey(i);\n if ((descending && value >= target) || (!descending && value <= target)) return i;\n }\n return -1;\n }\n const rowOffset = Number(toInteger(evalExpr(item.expr, ctx)) ?? 0);\n return item.kind === \"preceding\"\n ? Math.max(0, index - rowOffset)\n : Math.min(Math.max(0, length - 1), index + rowOffset);\n }\n }\n };\n return [bound(spec.frame.start, true), bound(spec.frame.end, false)];\n}\n\nfunction frameRows(\n partition: ScopeRow[],\n start: number,\n end: number,\n index: number,\n orderKeys: SqlValue[][],\n exclude: \"no_others\" | \"current_row\" | \"group\" | \"ties\" | null,\n): ScopeRow[] {\n let peerFirst = index;\n let peerLast = index;\n while (peerFirst > 0 && rowsEqual(orderKeys[peerFirst]!, orderKeys[peerFirst - 1]!)) peerFirst--;\n while (peerLast + 1 < partition.length && rowsEqual(orderKeys[peerLast]!, orderKeys[peerLast + 1]!)) peerLast++;\n const rows: ScopeRow[] = [];\n for (let i = Math.max(0, start); i <= end && i < partition.length; i++) {\n if (exclude === \"current_row\" && i === index) continue;\n if (exclude === \"group\" && i >= peerFirst && i <= peerLast) continue;\n if (exclude === \"ties\" && i >= peerFirst && i <= peerLast && i !== index) continue;\n rows.push(partition[i]!);\n }\n return rows;\n}\n\nfunction compareScopes(\n a: ScopeRow,\n b: ScopeRow,\n order: OrderByItem[],\n env: ExecutionEnv,\n parent?: EvalContext,\n): number {\n for (const item of order) {\n const left = evalExpr(item.expr, env.createEvalContext(a, parent));\n const right = evalExpr(item.expr, env.createEvalContext(b, parent));\n const result = compareNullable(left, right, item, a);\n if (result !== 0) return result;\n }\n return 0;\n}\n\nfunction compareOutput(\n a: OutputRow,\n b: OutputRow,\n order: OrderByItem[],\n columns: string[],\n env: ExecutionEnv,\n parent?: EvalContext,\n resultColumns?: ResultColumn[],\n): number {\n for (const item of order) {\n const value = (row: OutputRow): SqlValue => {\n if (item.expr.type === \"literal\" && typeof item.expr.value === \"number\" && Number.isInteger(item.expr.value)) {\n return row.values[item.expr.value - 1] ?? null;\n }\n if (item.expr.type === \"column\" && item.expr.table === null) {\n const requestedName = item.expr.name.toLowerCase();\n const index = columns.findIndex((name) => name.toLowerCase() === requestedName);\n if (index >= 0) return row.values[index] ?? null;\n }\n return evalExpr(item.expr, env.createEvalContext(row.scope, parent));\n };\n const result = compareNullable(value(a), value(b), item, a.scope, columns, resultColumns);\n if (result !== 0) return result;\n }\n return 0;\n}\n\nfunction collationForOrderItem(\n item: OrderByItem,\n resultColumns: ResultColumn[],\n columnNames: string[],\n scope?: ScopeRow,\n): string | null {\n if (item.expr.type === \"collate\") return item.expr.collation;\n if (item.expr.type === \"literal\" && typeof item.expr.value === \"number\" && Number.isInteger(item.expr.value)) {\n const column = resultColumns[item.expr.value - 1];\n if (column?.type === \"expr\") return explicitCollation(column.expr);\n }\n if (item.expr.type === \"column\" && item.expr.table === null) {\n const key = item.expr.name.toLowerCase();\n const byAlias = resultColumns.find((column) => column.type === \"expr\" && column.alias?.toLowerCase() === key);\n if (byAlias?.type === \"expr\") return explicitCollation(byAlias.expr);\n const index = columnNames.findIndex((name) => name.toLowerCase() === key);\n if (index >= 0) {\n const column = resultColumns[index];\n if (column?.type === \"expr\") return explicitCollation(column.expr);\n }\n }\n if (scope && item.expr.type === \"column\") {\n const key = item.expr.name.toLowerCase();\n const match = scope.cells.find(\n (cell) =>\n cell.name.toLowerCase() === key &&\n item.expr.type === \"column\" &&\n (item.expr.table === null || cell.table?.toLowerCase() === item.expr.table.toLowerCase()),\n );\n if (match?.collate) return match.collate;\n }\n return null;\n}\n\nfunction compareNullable(\n left: SqlValue,\n right: SqlValue,\n item: OrderByItem,\n scope?: ScopeRow,\n columnNames?: string[],\n resultColumns?: ResultColumn[],\n): number {\n if (left === null || right === null) {\n if (left === right) return 0;\n const nullFirst = item.nulls ? item.nulls === \"FIRST\" : item.dir === \"ASC\";\n return (left === null ? -1 : 1) * (nullFirst ? 1 : -1);\n }\n const collation =\n resultColumns && columnNames\n ? collationForOrderItem(item, resultColumns, columnNames, scope)\n : scope && item.expr.type === \"column\"\n ? (() => {\n const key = item.expr.name.toLowerCase();\n const match = scope.cells.find(\n (cell) =>\n cell.name.toLowerCase() === key &&\n item.expr.type === \"column\" &&\n (item.expr.table === null || cell.table?.toLowerCase() === item.expr.table.toLowerCase()),\n );\n return match?.collate ?? null;\n })()\n : item.expr.type === \"collate\"\n ? item.expr.collation\n : null;\n const comparison = collation ? compareWithCollation(left, right, collation) : compareSql(left, right);\n return (comparison ?? 0) * (item.dir === \"DESC\" ? -1 : 1);\n}\n\nfunction resultColumnNames(columns: ResultColumn[], sample?: ScopeRow): string[] {\n const names: string[] = [];\n for (const column of columns) {\n if (column.type === \"star\") {\n for (const cell of sample?.cells ?? []) {\n if (\n (column.table !== null || !cell.hiddenByUsing) &&\n (column.table === null || cell.table?.toLowerCase() === column.table.toLowerCase())\n )\n names.push(cell.name);\n }\n } else if (\n !column.alias &&\n column.expr.type === \"column\" &&\n [\"rowid\", \"_rowid_\", \"oid\"].includes(column.expr.name.toLowerCase()) &&\n sample?.rowidName\n ) {\n names.push(sample.rowidName);\n } else names.push(column.alias ?? expressionName(column.expr));\n }\n return names;\n}\n\nfunction compareCompoundRows(left: SqlValue[], right: SqlValue[], order: OrderByItem[], columns: string[]): number {\n for (const item of order) {\n let index = -1;\n if (item.expr.type === \"literal\" && typeof item.expr.value === \"number\" && Number.isInteger(item.expr.value)) {\n index = item.expr.value - 1;\n } else if (item.expr.type === \"column\" && item.expr.table === null) {\n const requested = item.expr.name.toLowerCase();\n index = columns.findIndex((name) => name.toLowerCase() === requested);\n }\n if (index < 0) throw new SqliteError(\"ORDER BY term does not match any column in the result set\", \"other\");\n const result = compareNullable(left[index] ?? null, right[index] ?? null, item);\n if (result !== 0) return result;\n }\n return 0;\n}\n\nfunction validateProjectedColumns(stmt: SelectStmt, sample: ScopeRow, env: ExecutionEnv, parent?: EvalContext): void {\n const ctx = env.createEvalContext({ ...sample, rowid: 1, rowidName: sample.rowidName }, parent);\n const visit = (expr: Expr): void => {\n if (expr.type === \"column\") {\n if (expr.name !== \"*\") ctx.resolveColumn(expr.table, expr.name);\n return;\n }\n const recurse = (item: Expr) => visit(item);\n switch (expr.type) {\n case \"unary\":\n recurse(expr.expr);\n break;\n case \"is_bool\":\n recurse(expr.expr);\n break;\n case \"binary\":\n recurse(expr.left);\n recurse(expr.right);\n break;\n case \"between\":\n recurse(expr.expr);\n recurse(expr.lower);\n recurse(expr.upper);\n break;\n case \"in\":\n recurse(expr.expr);\n if (Array.isArray(expr.values)) expr.values.forEach(recurse);\n break;\n case \"like\":\n recurse(expr.expr);\n recurse(expr.pattern);\n if (expr.escape) recurse(expr.escape);\n break;\n case \"function\":\n case \"aggregate\":\n if (expr.args !== \"*\") expr.args.forEach(recurse);\n if (expr.filter) recurse(expr.filter);\n break;\n case \"window\":\n if (expr.func.args !== \"*\") expr.func.args.forEach(recurse);\n break;\n case \"case\":\n if (expr.base) recurse(expr.base);\n expr.whens.forEach((branch) => {\n recurse(branch.when);\n recurse(branch.then);\n });\n if (expr.else) recurse(expr.else);\n break;\n case \"cast\":\n case \"collate\":\n recurse(expr.expr);\n break;\n case \"row\":\n expr.values.forEach(recurse);\n break;\n }\n };\n for (const column of stmt.columns) if (column.type === \"expr\") visit(column.expr);\n}\n\nfunction expressionName(expr: Expr): string {\n if (expr.type === \"column\") return expr.name;\n if (expr.type === \"literal\") {\n if (expr.value === null) return \"NULL\";\n if (expr.value instanceof Uint8Array)\n return `X'${Array.from(expr.value)\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase()}'`;\n return typeof expr.value === \"string\" ? `'${expr.value.replaceAll(\"'\", \"''\")}'` : String(expr.value);\n }\n if (expr.type === \"null\") return \"NULL\";\n if (expr.type === \"function\" || expr.type === \"aggregate\") {\n if (expr.args === \"*\") return `${expr.name.toLowerCase()}(*)`;\n const args = expr.args.map((arg) => expressionName(arg)).join(\", \");\n return `${expr.name.toLowerCase()}(${args})`;\n }\n if (expr.type === \"binary\") {\n return `${expressionName(expr.left)} ${expr.op} ${expressionName(expr.right)}`;\n }\n if (expr.type === \"is_bool\") {\n const sense = expr.sense ? \"TRUE\" : \"FALSE\";\n return `${expressionName(expr.expr)} IS${expr.not ? \" NOT\" : \"\"} ${sense}`;\n }\n return expr.type;\n}\n\nfunction replaceSpecial(expr: Expr, evaluate: (expr: AggregateExpr | WindowExpr) => SqlValue): Expr {\n if (expr.type === \"aggregate\" || expr.type === \"window\") return { type: \"literal\", value: evaluate(expr) };\n const recurse = (item: Expr) => replaceSpecial(item, evaluate);\n switch (expr.type) {\n case \"unary\":\n return { ...expr, expr: recurse(expr.expr) };\n case \"is_bool\":\n return { ...expr, expr: recurse(expr.expr) };\n case \"binary\":\n return { ...expr, left: recurse(expr.left), right: recurse(expr.right) };\n case \"between\":\n return { ...expr, expr: recurse(expr.expr), lower: recurse(expr.lower), upper: recurse(expr.upper) };\n case \"in\":\n return {\n ...expr,\n expr: recurse(expr.expr),\n values: Array.isArray(expr.values) ? expr.values.map(recurse) : expr.values,\n };\n case \"like\":\n return {\n ...expr,\n expr: recurse(expr.expr),\n pattern: recurse(expr.pattern),\n escape: expr.escape && recurse(expr.escape),\n };\n case \"function\":\n return {\n ...expr,\n args: expr.args === \"*\" ? \"*\" : expr.args.map(recurse),\n filter: expr.filter && recurse(expr.filter),\n };\n case \"case\":\n return {\n ...expr,\n base: expr.base && recurse(expr.base),\n whens: expr.whens.map(({ when, then: thenExpr }) => {\n // biome-ignore lint/suspicious/noThenProperty: CASE WHEN/THEN AST field, not a thenable\n return { when: recurse(when), then: recurse(thenExpr) };\n }),\n else: expr.else && recurse(expr.else),\n };\n case \"cast\":\n return { ...expr, expr: recurse(expr.expr) };\n case \"row\":\n return { ...expr, values: expr.values.map(recurse) };\n case \"collate\":\n return { ...expr, expr: recurse(expr.expr) };\n default:\n return expr;\n }\n}\n\nfunction containsAggregate(expr: Expr): boolean {\n let found = false;\n replaceSpecial(expr, (special) => {\n if (special.type === \"aggregate\") found = true;\n return null;\n });\n return found;\n}\n\nfunction referencesTable(select: SelectStmt, name: string): boolean {\n const target = name.toLowerCase();\n const visit = (item: FromItem | null): boolean => {\n if (!item) return false;\n if (item.type === \"table\") return item.name.toLowerCase() === target;\n if (item.type === \"join\") return visit(item.left) || visit(item.right);\n return item.type === \"subquery\" ? referencesTable(item.select, name) : false;\n };\n return visit(select.from) || (select.compound ? referencesTable(select.compound.select, name) : false);\n}\n\nfunction rowsEqual(left: SqlValue[], right: SqlValue[]): boolean {\n return (\n left.length === right.length &&\n left.every((value, index) => {\n const other = right[index] ?? null;\n return (value === null && other === null) || (value !== null && other !== null && sqlValueEquals(value, other));\n })\n );\n}\n\nfunction uniqueRows(rows: SqlValue[][]): SqlValue[][] {\n const seen = new Set<string>();\n const result: SqlValue[][] = [];\n for (const row of rows) {\n const key = valueKey(row);\n if (seen.has(key)) continue;\n seen.add(key);\n result.push(row);\n }\n return result;\n}\n\nfunction valueKey(values: SqlValue[]): string {\n return values.map(valueKeyPart).join(\"\\0\");\n}\n\nfunction valueKeyPart(value: SqlValue): string {\n if (value === null) return \"N\";\n if (typeof value === \"bigint\") return `I:${value.toString()}`;\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) return `I:${value.toString()}`;\n if (Number.isNaN(value)) return \"F:nan\";\n return `F:${Object.is(value, -0) ? \"0\" : value.toString()}`;\n }\n if (typeof value === \"string\") return `T:${value}`;\n if (value instanceof Uint8Array) {\n let hex = \"B:\";\n for (const byte of value) hex += byte.toString(16).padStart(2, \"0\");\n return hex;\n }\n if (\"value\" in value && typeof value.value === \"number\") {\n const n = value.value;\n if (Number.isInteger(n)) return `I:${n.toString()}`;\n return `F:${n.toString()}`;\n }\n if (\"value\" in value && typeof value.value === \"string\") return `T:${value.value}`;\n return `T:${String(value)}`;\n}\n\nfunction scanDbStat(db: DatabaseState, alias: string, _schemaArg: string | null): ScopeRow[] {\n const rows: ScopeRow[] = [];\n let pageno = 1;\n const push = (name: string, pagetype: string, ncell: number) => {\n rows.push({\n cells: [\n { table: alias, name: \"name\", value: name },\n { table: alias, name: \"path\", value: \"/\" },\n { table: alias, name: \"pageno\", value: pageno++ },\n { table: alias, name: \"pagetype\", value: pagetype },\n { table: alias, name: \"ncell\", value: ncell },\n { table: alias, name: \"payload\", value: ncell * 8 },\n { table: alias, name: \"unused\", value: 0 },\n { table: alias, name: \"mx_payload\", value: 0 },\n { table: alias, name: \"pgoffset\", value: (pageno - 1) * 4096 },\n { table: alias, name: \"pgsize\", value: 4096 },\n ],\n });\n };\n push(\"sqlite_schema\", \"leaf\", db.tables.size + db.views.size + db.virtualTables.size);\n for (const table of db.tables.values()) {\n push(table.name, \"leaf\", [...table.scan()].length);\n }\n for (const table of db.virtualTables.values()) {\n if (table.kind === \"fts5\" || table.kind === \"fts3\" || table.kind === \"fts4\" || table.kind === \"rtree\") {\n push(table.name, \"leaf\", table.kind === \"rtree\" ? table.rows.size : table.rows.size);\n } else {\n push(table.name, \"leaf\", 0);\n }\n }\n return rows;\n}\n\nfunction scanFtsVocab(db: DatabaseState, alias: string, vocab: FtsVocabVirtualTable): ScopeRow[] {\n const fts = db.virtualTables.get(vocab.ftsTable.toLowerCase());\n if (!fts || (fts.kind !== \"fts5\" && fts.kind !== \"fts3\" && fts.kind !== \"fts4\")) return [];\n return fts.vocabRows(\"row\").map((record) => ({\n cells: vocab.columns.map((column) => ({\n table: alias,\n name: column,\n value: record[column] ?? (column === \"col\" ? \"*\" : column === \"offset\" ? 0 : null),\n })),\n }));\n}\n", "import type {\n AlterTableStmt,\n CreateIndexStmt,\n CreateTableStmt,\n CreateViewStmt,\n DropIndexStmt,\n DropTableStmt,\n DropViewStmt,\n} from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { heapRowCells, rebuildIndexFromTable } from \"../indexes/keys.ts\";\nimport { appendAddColumnToMasterSql, normalizeMasterSql, synthesizeCtasMasterSql } from \"../schema/master-sql.ts\";\nimport { normalizeColumnName } from \"../storage/row.ts\";\nimport { makeColumnInfo } from \"../storage/table.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { emptyResult, type ResultSet, resultValues } from \"./result.ts\";\nimport { executeSelect } from \"./select.ts\";\n\nexport function executeCreateTable(stmt: CreateTableStmt, env: ExecutionEnv): ResultSet {\n const sourceSql = env.statementSql ? normalizeMasterSql(env.statementSql) : null;\n if (!stmt.asSelect) {\n env.state.createTable(stmt, sourceSql);\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n }\n const result = executeSelect(stmt.asSelect, env);\n const columns = result.columns.map((name) => ({ name, typeName: null, constraints: [] }));\n const bareName = stmt.name.includes(\".\") ? (stmt.name.split(\".\").pop() ?? stmt.name) : stmt.name;\n const ctasSql = synthesizeCtasMasterSql(bareName, result.columns);\n const table = env.state.createTable({ ...stmt, columns, constraints: [], asSelect: null }, ctasSql);\n for (const values of resultValues(result)) {\n table.insert(\n new Map(table.columns.map((column, index) => [normalizeColumnName(column.name), values[index] ?? null])),\n );\n }\n // Populate any autoindexes created with the empty table.\n const db = env.state.databaseForTable(table);\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index) continue;\n rebuildIndexFromTable(index, table, (row) =>\n env.createEvalContext({ rowid: row.rowid, sourceTable: table.name, cells: heapRowCells(table, row, env) }),\n );\n }\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeCreateIndex(stmt: CreateIndexStmt, env: ExecutionEnv): ResultSet {\n const index = env.state.createIndex(stmt, env.statementSql ? normalizeMasterSql(env.statementSql) : null);\n const table = env.state.getTable(stmt.table);\n try {\n rebuildIndexFromTable(index, table, (row) =>\n env.createEvalContext({ rowid: row.rowid, sourceTable: table.name, cells: heapRowCells(table, row, env) }),\n );\n } catch (error) {\n env.state.dropIndex(stmt.name, true);\n throw error;\n }\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeAlterTable(stmt: AlterTableStmt, env: ExecutionEnv): ResultSet {\n const table = env.state.getWritableTable(stmt.table);\n const action = stmt.action;\n if (action.kind === \"rename_table\") {\n env.state.renameTable(stmt.table, action.newName);\n } else if (action.kind === \"rename_column\") {\n const column = table.columns.find((item) => item.name.toLowerCase() === action.oldName.toLowerCase());\n if (!column) throw new SqliteError(`no such column: ${action.oldName}`, \"no_such_column\");\n if (table.columns.some((item) => item.name.toLowerCase() === action.newName.toLowerCase()))\n throw new SqliteError(`duplicate column name: ${action.newName}`, \"other\");\n column.name = action.newName;\n column.nameLower = action.newName.toLowerCase();\n table.rebuildColIndex();\n for (const constraint of table.constraints) renameConstraintColumn(constraint, action.oldName, action.newName);\n for (const name of table.indexes) {\n const index = env.state.getWritableIndex(name);\n if (index)\n for (const indexed of index.columns)\n if (indexed.name.toLowerCase() === action.oldName.toLowerCase()) indexed.name = action.newName;\n }\n table.clearEqualityHashes();\n env.state.schemaVersion++;\n } else if (action.kind === \"add_column\") {\n if (table.columns.some((item) => item.name.toLowerCase() === action.column.name.toLowerCase()))\n throw new SqliteError(`duplicate column name: ${action.column.name}`, \"other\");\n const primary = action.column.constraints.some((item) => item.type === \"primary_key\");\n const unique = action.column.constraints.some((item) => item.type === \"unique\");\n if ((primary || unique) && table.rowCount() > 0)\n throw new SqliteError(\"Cannot add a PRIMARY KEY or UNIQUE column\", \"other\");\n const defaultExpr = action.column.constraints.find((item) => item.type === \"default\")?.expr ?? null;\n const collate = action.column.constraints.find((item) => item.type === \"collate\");\n const generated = action.column.constraints.find((item) => item.type === \"generated\");\n const column = makeColumnInfo(action.column.name, action.column.typeName, {\n notNull: action.column.constraints.some((item) => item.type === \"not_null\"),\n primaryKey: primary,\n unique,\n defaultExpr,\n collate: collate?.type === \"collate\" ? collate.name : null,\n generated: generated?.type === \"generated\" ? { expr: generated.expr, stored: generated.stored } : null,\n });\n const defaultValue = defaultExpr ? evalExpr(defaultExpr, env.createEvalContext()) : null;\n if (column.notNull && defaultValue === null && table.rowCount() > 0)\n throw new SqliteError(\"Cannot add a NOT NULL column with default value NULL\", \"other\");\n table.materializeSlab();\n table.columns.push(column);\n table.rebuildColIndex();\n for (const row of table.rows.values()) row.values.push(defaultValue);\n table.originalSql = appendAddColumnToMasterSql(table.originalSql, env.statementSql);\n table.clearEqualityHashes();\n env.state.schemaVersion++;\n } else {\n const index = table.columns.findIndex((item) => item.name.toLowerCase() === action.name.toLowerCase());\n if (index < 0) throw new SqliteError(`no such column: ${action.name}`, \"no_such_column\");\n if (table.columns.length === 1)\n throw new SqliteError(\"cannot drop column: table must have at least one column\", \"other\");\n const column = table.columns[index]!;\n if (column.primaryKey) {\n throw new SqliteError(`cannot drop PRIMARY KEY or UNIQUE column: ${action.name}`, \"other\");\n }\n if (column.unique) {\n throw new SqliteError(`cannot drop UNIQUE column: \"${action.name}\"`, \"other\");\n }\n if (\n table.constraints.some(\n (item) =>\n (item.type === \"primary_key\" || item.type === \"unique\") &&\n item.columns.some((part) => part.name.toLowerCase() === action.name.toLowerCase()),\n )\n ) {\n throw new SqliteError(\n `error in table ${stmt.table} after drop column: no such column: ${action.name}`,\n \"no_such_column\",\n );\n }\n for (const name of table.indexes) {\n const schemaIndex = env.state.indexes.get(name.toLowerCase());\n if (schemaIndex?.columns.some((part) => part.name.toLowerCase() === action.name.toLowerCase())) {\n throw new SqliteError(\n `error in index ${name} after drop column: no such column: ${action.name}`,\n \"no_such_column\",\n );\n }\n }\n table.columns.splice(index, 1);\n table.rebuildColIndex();\n for (const row of table.rows.values()) row.values.splice(index, 1);\n table.clearEqualityHashes();\n env.state.schemaVersion++;\n }\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDropTable(stmt: DropTableStmt, env: ExecutionEnv): ResultSet {\n env.state.dropTable(stmt.name, stmt.ifExists);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDropIndex(stmt: DropIndexStmt, env: ExecutionEnv): ResultSet {\n env.state.dropIndex(stmt.name, stmt.ifExists);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeCreateView(stmt: CreateViewStmt, env: ExecutionEnv): ResultSet {\n env.state.createView(stmt, env.statementSql ? normalizeMasterSql(env.statementSql) : null);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDropView(stmt: DropViewStmt, env: ExecutionEnv): ResultSet {\n env.state.dropView(stmt.name, stmt.ifExists);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nfunction renameConstraintColumn(\n constraint: import(\"../ast/nodes.ts\").TableConstraint,\n oldName: string,\n newName: string,\n): void {\n if (constraint.type === \"primary_key\" || constraint.type === \"unique\") {\n for (const column of constraint.columns)\n if (column.name.toLowerCase() === oldName.toLowerCase()) column.name = newName;\n } else if (constraint.type === \"foreign_key\") {\n constraint.columns = constraint.columns.map((name) =>\n name.toLowerCase() === oldName.toLowerCase() ? newName : name,\n );\n }\n}\n", "import type { Expr } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { IndexStore } from \"../indexes/index.ts\";\nimport type { Row, Rowid } from \"../storage/row.ts\";\nimport { normalizeColumnName } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\nimport { isTruthySql } from \"../types/value.ts\";\n\nexport type CheckEvaluator = (expr: Expr, row: Row) => SqlValue;\n\nexport function checkNotNull(table: Table, row: Row): void {\n for (const column of table.columns) {\n if (!column.notNull) continue;\n if (table.cell(row, normalizeColumnName(column.name)) === null) {\n throw new SqliteError(\n `NOT NULL constraint failed: ${table.name}.${column.name}`,\n \"constraint_notnull\",\n \"SQLITE_CONSTRAINT_NOTNULL\",\n );\n }\n }\n}\n\nexport function checkPrimaryKey(table: Table, row: Row): void {\n for (const column of table.columns) {\n if (!column.primaryKey) continue;\n if (table.cell(row, normalizeColumnName(column.name)) === null) {\n throw new SqliteError(\n `PRIMARY KEY constraint failed: ${table.name}.${column.name}`,\n \"constraint_primary\",\n \"SQLITE_CONSTRAINT_PRIMARYKEY\",\n );\n }\n }\n}\n\nexport function checkUnique(index: IndexStore, values: readonly SqlValue[], rowid?: Rowid): void {\n index.checkUnique(values, rowid);\n}\n\nexport function checkExpressions(\n expressions: readonly Expr[],\n row: Row,\n evaluate: CheckEvaluator,\n constraintName = \"CHECK\",\n): void {\n for (const expression of expressions) {\n const result = evaluate(expression, row);\n if (result !== null && isTruthySql(result) === false) {\n throw new SqliteError(\n `CHECK constraint failed: ${constraintName}`,\n \"constraint_check\",\n \"SQLITE_CONSTRAINT_CHECK\",\n );\n }\n }\n}\n\nexport function checkTableConstraints(table: Table, row: Row, evaluate: CheckEvaluator): void {\n checkNotNull(table, row);\n checkPrimaryKey(table, row);\n for (const constraint of table.constraints) {\n if (constraint.type !== \"check\") continue;\n checkExpressions([constraint.expr], row, evaluate, constraint.name ?? table.name);\n }\n}\n", "import type { CreateTriggerStmt, DropTriggerStmt, Statement } from \"../ast/nodes.ts\";\nimport { SqliteError, TriggerRaiseError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { normalizeMasterSql } from \"../schema/master-sql.ts\";\nimport type { TriggerInfo } from \"../storage/database-state.ts\";\nimport { splitQualifiedName } from \"../storage/database-state.ts\";\nimport type { Row } from \"../storage/row.ts\";\nimport { normalizeColumnName } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { isTruthySql, type SqlValue } from \"../types/value.ts\";\nimport type { ExecutionEnv, ScopeRow } from \"./env.ts\";\nimport { executeStatement } from \"./execute.ts\";\nimport { emptyResult, type ResultSet } from \"./result.ts\";\n\nconst MAX_TRIGGER_DEPTH = 1000;\n\nexport function executeCreateTrigger(stmt: CreateTriggerStmt, env: ExecutionEnv): ResultSet {\n const { schema, bare } = splitQualifiedName(stmt.name);\n const target = schema !== null ? env.state.databaseForSchema(schema, stmt.name) : env.state;\n const existing = target.triggers.get(bare.toLowerCase());\n if (existing && stmt.ifNotExists) {\n return emptyResult(0, env.state.lastInsertRowid);\n }\n\n const tableKey = splitQualifiedName(stmt.table).bare.toLowerCase();\n const isView = target.views.has(tableKey);\n const isTable = target.tables.has(tableKey);\n if (stmt.timing === \"INSTEAD\") {\n if (!isView) throw new SqliteError(`cannot create INSTEAD OF trigger on table: ${stmt.table}`, \"other\");\n } else if (isView) {\n throw new SqliteError(`cannot create ${stmt.timing} trigger on view: ${stmt.table}`, \"other\");\n } else if (!isTable) {\n throw new SqliteError(`no such table: ${stmt.table}`, \"no_such_table\");\n }\n\n if (existing) throw new SqliteError(`object already exists: ${bare}`, \"other\");\n\n target.createTrigger({\n name: bare,\n tableName: splitQualifiedName(stmt.table).bare,\n timing: stmt.timing,\n event: stmt.event,\n when: stmt.when,\n forEachRow: stmt.forEachRow,\n body: stmt.body,\n updateColumns: stmt.updateColumns,\n originalSql: env.statementSql ? normalizeMasterSql(env.statementSql) : null,\n });\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDropTrigger(stmt: DropTriggerStmt, env: ExecutionEnv): ResultSet {\n env.state.dropTrigger(stmt.name, stmt.ifExists);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function fireInsertTriggers(\n timing: \"BEFORE\" | \"AFTER\" | \"INSTEAD\",\n table: Table,\n values: Map<string, SqlValue>,\n oldRow: Row | null,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n return runTriggers(table, \"INSERT\", timing, oldRow, values, null, env);\n}\n\nexport function fireUpdateTriggers(\n timing: \"BEFORE\" | \"AFTER\" | \"INSTEAD\",\n table: Table,\n oldRow: Row,\n newValues: Map<string, SqlValue>,\n updatedColumns: Set<string>,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n return runTriggers(table, \"UPDATE\", timing, oldRow, newValues, updatedColumns, env);\n}\n\nexport function fireDeleteTriggers(\n timing: \"BEFORE\" | \"AFTER\" | \"INSTEAD\",\n table: Table,\n oldRow: Row,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n return runTriggers(table, \"DELETE\", timing, oldRow, null, null, env);\n}\n\nfunction runTriggers(\n table: Table,\n event: TriggerInfo[\"event\"],\n timing: TriggerInfo[\"timing\"],\n oldRow: Row | null,\n newValues: Map<string, SqlValue> | null,\n updatedColumns: Set<string> | null,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n const db = env.state.databaseForTable(table);\n if (db.triggers.size === 0) return \"ok\";\n const triggers = [...db.triggers.values()].filter(\n (trigger) =>\n trigger.tableName.toLowerCase() === table.name.toLowerCase() &&\n trigger.event === event &&\n trigger.timing === timing,\n );\n\n for (const trigger of triggers) {\n if (event === \"UPDATE\" && trigger.updateColumns) {\n const watched = new Set(trigger.updateColumns.map((name) => name.toLowerCase()));\n if (!updatedColumns || ![...updatedColumns].some((name) => watched.has(name.toLowerCase()))) continue;\n }\n if (trigger.when) {\n const scope = triggerScope(table, oldRow, newValues);\n if (isTruthySql(evalExpr(trigger.when, env.createEvalContext(scope))) !== true) continue;\n }\n const result = executeTriggerProgram(trigger, table, oldRow, newValues, env);\n if (result === \"ignore\") return \"ignore\";\n }\n return \"ok\";\n}\n\nfunction executeTriggerProgram(\n trigger: TriggerInfo,\n table: Table,\n oldRow: Row | null,\n newValues: Map<string, SqlValue> | null,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n if (env.triggerDepth >= MAX_TRIGGER_DEPTH) {\n throw new SqliteError(\"too many levels of trigger recursion\", \"other\");\n }\n env.triggerDepth++;\n const savedScope = env.triggerScope;\n const savedLastInsertRowid = env.state.lastInsertRowid;\n env.triggerScope = triggerScope(table, oldRow, newValues);\n try {\n for (const statement of trigger.body) {\n executeTriggerStatement(statement, env);\n }\n return \"ok\";\n } catch (error) {\n if (error instanceof TriggerRaiseError) {\n if (error.action === \"IGNORE\") return \"ignore\";\n if (error.action === \"ROLLBACK\") {\n env.transactions.rollback();\n throw error;\n }\n throw error;\n }\n throw error;\n } finally {\n env.state.lastInsertRowid = savedLastInsertRowid;\n env.triggerScope = savedScope;\n env.triggerDepth--;\n }\n}\n\nfunction executeTriggerStatement(statement: Statement, env: ExecutionEnv): void {\n executeStatement(statement, env);\n}\n\nfunction triggerScope(table: Table, oldRow: Row | null, newValues: Map<string, SqlValue> | null): ScopeRow {\n const cells: ScopeRow[\"cells\"] = [];\n for (const column of table.columns) {\n const key = normalizeColumnName(column.name);\n cells.push({\n table: \"old\",\n name: column.name,\n value: oldRow ? table.cell(oldRow, key) : null,\n affinity: column.affinity,\n collate: column.collate,\n });\n cells.push({\n table: \"new\",\n name: column.name,\n value: newValues ? (newValues.get(key) ?? null) : null,\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n return {\n cells,\n rowid: oldRow?.rowid ?? undefined,\n sourceTable: table.name,\n };\n}\n", "import type { CreateVirtualTableStmt } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { normalizeMasterSql } from \"../schema/master-sql.ts\";\nimport { normalizeColumnName } from \"../storage/row.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\nimport type { Fts5VirtualTable } from \"../vtable/fts5.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { emptyResult, type ResultSet } from \"./result.ts\";\n\nexport function executeCreateVirtualTable(stmt: CreateVirtualTableStmt, env: ExecutionEnv): ResultSet {\n env.state.createVirtualTable(stmt, env.statementSql ? normalizeMasterSql(env.statementSql) : null);\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeFtsInsert(\n table: Fts5VirtualTable,\n columnNames: string[],\n sourceRows: SqlValue[][],\n env: ExecutionEnv,\n): { changes: number; lastInsertRowid: number | bigint } {\n let changes = 0;\n let last = env.state.lastInsertRowid;\n for (const source of sourceRows) {\n if (source.length !== columnNames.length) {\n throw new SqliteError(`${source.length} values for ${columnNames.length} columns`, \"other\");\n }\n const values = new Map<string, SqlValue>();\n let explicitRowid: number | bigint | undefined;\n for (let i = 0; i < columnNames.length; i++) {\n const name = columnNames[i]!;\n const lower = name.toLowerCase();\n const value = source[i] ?? null;\n if (lower === \"rowid\" || lower === \"_rowid_\" || lower === \"oid\") {\n if (typeof value === \"number\" || typeof value === \"bigint\") explicitRowid = value;\n else if (value !== null) explicitRowid = Number(value);\n continue;\n }\n values.set(normalizeColumnName(name), value);\n }\n for (const column of table.columns) {\n const key = normalizeColumnName(column);\n if (!values.has(key) && !columnNames.some((n) => n.toLowerCase() === key)) {\n values.set(key, null);\n }\n }\n const rowid = table.insert(values, explicitRowid);\n // Special commands don't change row counts the same way \u2014 still count as a write\n changes++;\n last = rowid;\n }\n return { changes, lastInsertRowid: last };\n}\n\nexport function executeFtsUpdate(\n table: Fts5VirtualTable,\n updates: Map<string, SqlValue>,\n rowids: Iterable<number | bigint>,\n): number {\n let changes = 0;\n for (const rowid of rowids) {\n table.update(rowid, updates);\n changes++;\n }\n return changes;\n}\n\nexport function executeFtsDelete(table: Fts5VirtualTable, rowids: Iterable<number | bigint>): number {\n let changes = 0;\n for (const rowid of rowids) {\n table.delete(rowid);\n changes++;\n }\n return changes;\n}\n", "import type {\n DeleteStmt,\n Expr,\n IndexedColumn,\n InsertStmt,\n ResultColumn,\n SetItem,\n UpdateStmt,\n WithClause,\n} from \"../ast/nodes.ts\";\nimport { checkTableConstraints } from \"../constraints/check.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { exprEquals } from \"../expressions/equals.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { indexKeyValues } from \"../indexes/keys.ts\";\nimport { tryIndexedTableRows } from \"../planner/access.ts\";\nimport { isExpectedFastPathMiss } from \"../runtime/catch.ts\";\nimport { splitQualifiedName, type ViewInfo } from \"../storage/database-state.ts\";\nimport type { Row, Rowid } from \"../storage/row.ts\";\nimport { cloneRow, normalizeColumnName } from \"../storage/row.ts\";\nimport { makeColumnInfo, Table } from \"../storage/table.ts\";\nimport { normalizeForCollation } from \"../types/collation.ts\";\nimport { applyStrictValue } from \"../types/strict.ts\";\nimport { applyAffinity, asSqlReal, compareSql, isTruthySql, type SqlValue } from \"../types/value.ts\";\nimport type { Fts5Row, Fts5VirtualTable } from \"../vtable/fts5.ts\";\nimport type { ExecutionEnv, ScopeRow } from \"./env.ts\";\nimport { emptyResult, type ResultSet, resultValues, valuesToResult } from \"./result.ts\";\nimport { executeSelect, executeWith, scanFrom } from \"./select.ts\";\nimport { fireDeleteTriggers, fireInsertTriggers, fireUpdateTriggers } from \"./triggers.ts\";\nimport { executeFtsDelete, executeFtsInsert, executeFtsUpdate } from \"./vtable.ts\";\n\nfunction storeColumnValue(\n table: Table,\n column: { name: string; typeName: string | null; affinity: import(\"../types/value.ts\").Affinity },\n value: SqlValue,\n): SqlValue {\n const affined = applyAffinity(value, column.affinity);\n if (table.strict) return applyStrictValue(affined, column.typeName ?? \"\", table.name, column.name);\n return affined;\n}\n\nexport function executeInsert(stmt: InsertStmt, env: ExecutionEnv): ResultSet {\n try {\n return withDmlCtes(stmt.with, env, () => executeInsertCore(stmt, env));\n } catch (error) {\n handleConflictRollback(stmt.mode === \"insert_or_rollback\", error, env);\n throw error;\n }\n}\n\nfunction executeInsertCore(stmt: InsertStmt, env: ExecutionEnv): ResultSet {\n if (env.state.isVirtualTable(stmt.table)) {\n return executeVirtualInsert(stmt, env);\n }\n const totalBefore = env.state.totalChanges;\n const view = writableView(stmt.table, \"INSERT\", env);\n if (view) return executeViewInsert(stmt, view, env, totalBefore);\n const fast = env.forceFullInsert ? null : tryFastInsert(stmt, env);\n if (fast) return fast;\n let table = env.state.getWritableTable(stmt.table);\n const columnNames = stmt.columns ?? table.columns.map((column) => column.name);\n const rowidIndexes = columnNames.map((name, index) => (isRowidName(name) ? index : -1)).filter((index) => index >= 0);\n if (rowidIndexes.length > 1) throw new SqliteError(\"duplicate column name: rowid\", \"other\");\n if (table.withoutRowid && rowidIndexes.length > 0) {\n throw new SqliteError(`table ${table.name} has no column named rowid`, \"other\");\n }\n for (const name of columnNames) if (!isRowidName(name)) columnOf(table, name);\n const sourceRows = evaluateInsertSource(stmt, env);\n const returningRows: SqlValue[][] = [];\n let changes = 0;\n let last = env.state.lastInsertRowid;\n const suppliedIndexes = table.columns.map((column) =>\n columnNames.findIndex((name) => name.toLowerCase() === (column.nameLower ?? column.name.toLowerCase())),\n );\n const unconstrained =\n table.isUnconstrained() &&\n env.state.databaseForTable(table).triggers.size === 0 &&\n !stmt.upsert &&\n stmt.mode === \"insert\" &&\n stmt.returning.length === 0 &&\n rowidIndexes.length === 0;\n\n if (unconstrained) {\n for (const source of sourceRows) {\n if (source.length !== columnNames.length)\n throw new SqliteError(\n stmt.columns\n ? `${source.length} values for ${columnNames.length} columns`\n : `table ${table.name} has ${columnNames.length} columns but ${source.length} values were supplied`,\n \"other\",\n );\n const values = new Map<string, SqlValue>();\n for (let index = 0; index < table.columns.length; index++) {\n const column = table.columns[index]!;\n const suppliedIndex = suppliedIndexes[index]!;\n const value = suppliedIndex >= 0 ? (source[suppliedIndex] ?? null) : null;\n values.set(column.nameLower ?? column.name.toLowerCase(), storeColumnValue(table, column, value));\n }\n last = table.insert({ values }, { prepared: true, skipValidate: true });\n changes++;\n }\n env.state.recordChange(changes, last);\n return emptyResult(changes, last);\n }\n\n // ABORT undoes earlier rows from this statement without cloning the whole DB (critical for\n // bulk single-row inserts inside a user transaction \u2014 savepoints would be O(n\u00B2)).\n const abortMode = insertAbortResolution(stmt.mode) === \"abort\";\n const undoInserted: Rowid[] = [];\n const undoRemoved: Row[] = [];\n const undoStatement = (): void => {\n if (!abortMode) return;\n for (let i = undoInserted.length - 1; i >= 0; i--) {\n const row = table.rows.get(undoInserted[i]!);\n if (row) removeOne(table, row, env);\n }\n for (let i = undoRemoved.length - 1; i >= 0; i--) {\n const row = undoRemoved[i]!;\n table = env.state.ensureWritableTable(table);\n table.rows.set(row.rowid, row);\n if (table.indexes.length > 0) addIndexes(table, row, env);\n }\n };\n\n try {\n for (const source of sourceRows) {\n if (source.length !== columnNames.length)\n throw new SqliteError(\n stmt.columns\n ? `${source.length} values for ${columnNames.length} columns`\n : `table ${table.name} has ${columnNames.length} columns but ${source.length} values were supplied`,\n \"other\",\n );\n const values = new Map<string, SqlValue>();\n for (const column of table.columns) {\n if (column.generated) continue;\n const suppliedIndex = suppliedIndexes[table.columns.indexOf(column)] ?? -1;\n const value =\n suppliedIndex >= 0\n ? (source[suppliedIndex] ?? null)\n : column.defaultExpr\n ? evalExpr(column.defaultExpr, env.createEvalContext())\n : null;\n values.set(column.nameLower ?? column.name.toLowerCase(), storeColumnValue(table, column, value));\n }\n for (const column of table.columns) {\n if (!column.generated) continue;\n if (columnNames.some((name) => name.toLowerCase() === column.name.toLowerCase())) {\n throw new SqliteError(`cannot INSERT into generated column \"${column.name}\"`, \"misuse\");\n }\n if (column.generated.stored) {\n const genCtx = env.createEvalContext({\n cells: table.columns\n .filter((c) => !c.generated || c === column)\n .flatMap((c) => {\n if (c.generated && c !== column) return [];\n if (c === column) return [];\n return [\n {\n table: table.name,\n name: c.name,\n value: values.get(normalizeColumnName(c.name)) ?? null,\n affinity: c.affinity,\n collate: c.collate,\n },\n ];\n }),\n });\n const computed = evalExpr(column.generated.expr, genCtx);\n values.set(normalizeColumnName(column.name), storeColumnValue(table, column, computed));\n } else {\n values.set(normalizeColumnName(column.name), null);\n }\n }\n\n if (fireInsertTriggers(\"BEFORE\", table, values, null, env) === \"ignore\") continue;\n\n const conflicts = conflictingRows(table, values, env);\n if (conflicts.length > 0) {\n if (stmt.upsert) {\n const targetConflicts = conflictsForUpsert(table, values, env, stmt.upsert);\n if (targetConflicts.length === 0) {\n throw new SqliteError(\n `UNIQUE constraint failed: ${table.name}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n if (stmt.upsert.action === \"nothing\") continue;\n const row = targetConflicts[0]!;\n const scope = scopeFor(table, row, stmt.table, env);\n const excluded: ScopeRow = {\n cells: table.columns.map((column) => ({\n table: \"excluded\",\n name: column.name,\n value: values.get(normalizeColumnName(column.name)) ?? null,\n })),\n };\n const merged = { cells: [...scope.cells, ...excluded.cells], rowid: row.rowid, sourceTable: table.name };\n const ctx = env.createEvalContext(merged);\n if (stmt.upsert.action.where && isTruthySql(evalExpr(stmt.upsert.action.where, ctx)) !== true) continue;\n const updates = evaluateSet(stmt.upsert.action.set, table, ctx);\n const updated = updateOne(table, row, updates, env);\n changes += 1 + updated.cascaded;\n if (stmt.returning.length)\n returningRows.push(projectReturning(stmt.returning, scopeFor(table, updated.row, stmt.table, env), env));\n continue;\n }\n const mode = stmt.mode;\n if (mode === \"insert_or_ignore\") continue;\n if (mode === \"replace\" || mode === \"insert_or_replace\") {\n for (const row of conflicts) {\n if (abortMode) undoRemoved.push(cloneRow(row));\n removeOne(table, row, env);\n }\n } else {\n throw new SqliteError(\n `UNIQUE constraint failed: ${table.name}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n }\n\n let insertedRowid: Rowid | undefined;\n try {\n const suppliedRowid = rowidIndexes.length ? asExplicitRowid(source[rowidIndexes[0]!] ?? null) : undefined;\n const rowid = table.insert({ values, rowid: suppliedRowid }, { prepared: true });\n insertedRowid = rowid;\n const row = table.rows.get(rowid)!;\n validateRow(table, row, env);\n if (table.indexes.length > 0) addIndexes(table, row, env);\n if (env.state.foreignKeysEnabled) checkForeignKeys(table, row, env);\n if (!table.withoutRowid) {\n last = rowid;\n env.state.lastInsertRowid = rowid;\n }\n fireInsertTriggers(\"AFTER\", table, table.namedValues(row), null, env);\n changes++;\n if (abortMode) undoInserted.push(rowid);\n if (stmt.returning.length)\n returningRows.push(projectReturning(stmt.returning, scopeFor(table, row, stmt.table, env), env));\n } catch (error) {\n if (insertedRowid !== undefined) {\n const inserted = table.rows.get(insertedRowid);\n if (inserted) removeOne(table, inserted, env);\n }\n if (\n stmt.mode === \"insert_or_ignore\" &&\n error instanceof SqliteError &&\n error.category.startsWith(\"constraint\") &&\n error.category !== \"constraint_foreign\"\n )\n continue;\n throw error;\n }\n }\n } catch (error) {\n undoStatement();\n throw error;\n }\n const reportedChanges = finalizeDmlChanges(totalBefore, changes, env, last);\n if (stmt.returning.length === 0) return emptyResult(reportedChanges, last);\n return valuesToResult(returningNames(stmt.returning, table), returningRows, reportedChanges, last);\n}\n\nfunction evaluateInsertSource(stmt: InsertStmt, env: ExecutionEnv): SqlValue[][] {\n if (stmt.select) return resultValues(executeSelect(stmt.select, env));\n if (!stmt.values) return [[]];\n const ctx = env.createEvalContext();\n return stmt.values.map((items) =>\n items.map((expr) => {\n if (expr.type === \"parameter\") return env.getBoundParameter(expr.name);\n return evalExpr(expr, ctx);\n }),\n );\n}\n\ninterface FastInsertSlot {\n key: string;\n affinity: import(\"../types/value.ts\").Affinity;\n read: (env: ExecutionEnv) => SqlValue;\n}\n\ninterface FastInsertPlan {\n tableName: string;\n slots: FastInsertSlot[];\n}\n\nconst fastInsertPlans = new WeakMap<InsertStmt, FastInsertPlan>();\n\nfunction tryFastInsert(stmt: InsertStmt, env: ExecutionEnv): ResultSet | null {\n if (stmt.with || stmt.select || stmt.upsert || stmt.returning.length > 0 || stmt.mode !== \"insert\") return null;\n if (stmt.values?.length !== 1) return null;\n let plan = fastInsertPlans.get(stmt);\n if (!plan) {\n const built = buildFastInsertPlan(stmt, env);\n if (!built) return null;\n plan = built;\n fastInsertPlans.set(stmt, plan);\n }\n let table: Table;\n try {\n table = env.state.getWritableTable(plan.tableName);\n } catch (error) {\n if (!isExpectedFastPathMiss(error)) throw error;\n return null;\n }\n if (env.state.databaseForTable(table).triggers.size > 0) return null;\n if (!table.isUnconstrained()) return null;\n const values = new Map<string, SqlValue>();\n for (const slot of plan.slots) values.set(slot.key, applyAffinity(slot.read(env), slot.affinity));\n const last = table.insert({ values }, { prepared: true, skipValidate: true });\n env.state.recordChange(1, last);\n return emptyResult(1, last);\n}\n\nfunction buildFastInsertPlan(stmt: InsertStmt, env: ExecutionEnv): FastInsertPlan | null {\n let table: Table;\n try {\n table = env.state.getTable(stmt.table);\n } catch (error) {\n if (!isExpectedFastPathMiss(error)) throw error;\n return null;\n }\n if (!table.isUnconstrained()) return null;\n const tuple = stmt.values?.[0];\n if (!tuple) return null;\n const columnNames = stmt.columns ?? table.columns.map((column) => column.name);\n if (tuple.length !== columnNames.length) return null;\n if (columnNames.some((name) => isRowidName(name))) return null;\n const slots: FastInsertSlot[] = [];\n for (const column of table.columns) {\n const key = column.nameLower ?? column.name.toLowerCase();\n const suppliedIndex = columnNames.findIndex((name) => name.toLowerCase() === key);\n if (suppliedIndex < 0) {\n if (column.defaultExpr) return null;\n slots.push({ key, affinity: column.affinity, read: () => null });\n continue;\n }\n const expr = tuple[suppliedIndex];\n if (!expr) return null;\n if (expr.type === \"parameter\") {\n const name = expr.name;\n slots.push({ key, affinity: column.affinity, read: (exec) => exec.getBoundParameter(name) });\n } else if (expr.type === \"literal\") {\n const value = expr.forceReal && typeof expr.value === \"number\" ? asSqlReal(expr.value) : expr.value;\n slots.push({ key, affinity: column.affinity, read: () => value });\n } else if (expr.type === \"null\") {\n slots.push({ key, affinity: column.affinity, read: () => null });\n } else return null;\n }\n return { tableName: stmt.table, slots };\n}\n\nexport function executeUpdate(stmt: UpdateStmt, env: ExecutionEnv): ResultSet {\n try {\n return withDmlCtes(stmt.with, env, () => executeUpdateCore(stmt, env));\n } catch (error) {\n handleConflictRollback(stmt.or === \"rollback\", error, env);\n throw error;\n }\n}\n\nfunction executeUpdateCore(stmt: UpdateStmt, env: ExecutionEnv): ResultSet {\n if (env.state.isVirtualTable(stmt.table)) {\n return executeVirtualUpdate(stmt, env);\n }\n const totalBefore = env.state.totalChanges;\n const view = writableView(stmt.table, \"UPDATE\", env);\n if (view) return executeViewUpdate(stmt, view, env, totalBefore);\n // Scan for candidates before any statement savepoint. getWritableTable must run *after*\n // freeze/clone so all row mutations share one live writable table (not re-clone from frozen).\n const scanTable = env.state.getTable(stmt.table);\n const alias = stmt.alias ?? stmt.table;\n const candidates: { row: Row; scope: ScopeRow }[] = [];\n\n if (stmt.from) {\n const fromRows = scanFrom(stmt.from, env);\n for (const row of scanTable.scan()) {\n const targetScope = scopeFor(scanTable, row, alias, env);\n let matchedScope: ScopeRow | null = null;\n for (const fromRow of fromRows) {\n const joined: ScopeRow = {\n ...targetScope,\n cells: [...targetScope.cells, ...fromRow.cells],\n };\n if (stmt.where && isTruthySql(evalExpr(stmt.where, env.createEvalContext(joined))) !== true) continue;\n // SQLite keeps the last matching FROM row when multiple sources match.\n matchedScope = joined;\n }\n if (matchedScope) candidates.push({ row, scope: matchedScope });\n }\n } else {\n const indexed =\n stmt.where === null\n ? null\n : tryIndexedTableRows({ type: \"table\", schema: null, name: stmt.table, alias: stmt.alias }, stmt.where, env);\n const scanRows = indexed ? indexed.rows : scanTable.scan();\n for (const row of scanRows) {\n const scope = scopeFor(scanTable, row, alias, env);\n if (stmt.where && isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope))) !== true) continue;\n candidates.push({ row, scope });\n }\n }\n\n const applyUpdates = (): ResultSet => {\n let table = env.state.getWritableTable(stmt.table);\n const returningRows: SqlValue[][] = [];\n let changes = 0;\n for (const { row, scope } of candidates) {\n const ctx = env.createEvalContext(scope);\n const updates = evaluateSet(stmt.set, table, ctx);\n const newValues = mergedValues(table, row, updates);\n const updatedColumns = new Set(\n [...updates.keys()].map((key) => {\n const column = table.columns.find((item) => normalizeColumnName(item.name) === key);\n return column?.name ?? key;\n }),\n );\n if (fireUpdateTriggers(\"BEFORE\", table, row, newValues, updatedColumns, env) === \"ignore\") continue;\n try {\n if (stmt.or === \"replace\") {\n for (const conflict of conflictingRows(table, newValues, env)) {\n if (conflict.rowid === row.rowid) continue;\n removeOne(table, conflict, env);\n table = env.state.getWritableTable(stmt.table);\n // SQLite changes() counts the updated row only, not replaced conflict deletions.\n }\n }\n const updated = updateOne(table, row, updates, env);\n table = env.state.getWritableTable(stmt.table);\n fireUpdateTriggers(\"AFTER\", table, row, table.namedValues(updated.row), updatedColumns, env);\n changes += 1 + updated.cascaded;\n if (stmt.returning.length)\n returningRows.push(projectReturning(stmt.returning, scopeFor(table, updated.row, alias, env), env));\n } catch (error) {\n if (\n stmt.or === \"ignore\" &&\n error instanceof SqliteError &&\n error.category.startsWith(\"constraint\") &&\n error.category !== \"constraint_foreign\"\n )\n continue;\n throw error;\n }\n }\n const reportedChanges = finalizeDmlChanges(totalBefore, changes, env);\n return valuesToResult(\n returningNames(stmt.returning, table),\n returningRows,\n reportedChanges,\n env.state.lastInsertRowid,\n );\n };\n\n if (updateAbortResolution(stmt.or) === \"abort\" && candidates.length > 1) {\n return withStatementAtomicity(env, \"abort\", applyUpdates);\n }\n return applyUpdates();\n}\n\nexport function executeDelete(stmt: DeleteStmt, env: ExecutionEnv): ResultSet {\n try {\n return withDmlCtes(stmt.with, env, () => executeDeleteCore(stmt, env));\n } catch (error) {\n handleConflictRollback(stmt.or === \"rollback\", error, env);\n throw error;\n }\n}\n\nfunction executeDeleteCore(stmt: DeleteStmt, env: ExecutionEnv): ResultSet {\n if (env.state.isVirtualTable(stmt.table)) {\n return executeVirtualDelete(stmt, env);\n }\n const totalBefore = env.state.totalChanges;\n const view = writableView(stmt.table, \"DELETE\", env);\n if (view) return executeViewDelete(stmt, view, env, totalBefore);\n // Select targets before any statement savepoint; get writable only inside applyDeletes.\n const scanTable = env.state.getTable(stmt.table);\n const selectedSource =\n stmt.where === null\n ? null\n : tryIndexedTableRows({ type: \"table\", schema: null, name: stmt.table, alias: stmt.alias }, stmt.where, env);\n const selected = [...(selectedSource ? selectedSource.rows : scanTable.scan())].filter((row) => {\n if (!stmt.where) return true;\n return (\n isTruthySql(\n evalExpr(stmt.where, env.createEvalContext(scopeFor(scanTable, row, stmt.alias ?? stmt.table, env))),\n ) === true\n );\n });\n\n const applyDeletes = (): ResultSet => {\n let table = env.state.getWritableTable(stmt.table);\n const returningRows: SqlValue[][] = [];\n let changes = 0;\n for (const row of selected) {\n try {\n if (fireDeleteTriggers(\"BEFORE\", table, row, env) === \"ignore\") continue;\n if (stmt.returning.length)\n returningRows.push(\n projectReturning(stmt.returning, scopeFor(table, row, stmt.alias ?? stmt.table, env), env),\n );\n changes += applyReferentialDelete(table, row, env);\n table = env.state.getWritableTable(stmt.table);\n removeOne(table, row, env);\n table = env.state.getWritableTable(stmt.table);\n fireDeleteTriggers(\"AFTER\", table, row, env);\n changes++;\n } catch (error) {\n if (\n stmt.or === \"ignore\" &&\n error instanceof SqliteError &&\n error.category.startsWith(\"constraint\") &&\n error.category !== \"constraint_foreign\"\n )\n continue;\n throw error;\n }\n }\n const reportedChanges = finalizeDmlChanges(totalBefore, changes, env);\n return valuesToResult(\n returningNames(stmt.returning, table),\n returningRows,\n reportedChanges,\n env.state.lastInsertRowid,\n );\n };\n\n if (deleteAbortResolution(stmt.or) === \"abort\" && selected.length > 1) {\n return withStatementAtomicity(env, \"abort\", applyDeletes);\n }\n return applyDeletes();\n}\n\nfunction withDmlCtes(withClause: WithClause | null, env: ExecutionEnv, execute: () => ResultSet): ResultSet {\n if (!withClause) return execute();\n const savedCtes = new Map(env.ctes);\n try {\n executeWith(withClause, env);\n return execute();\n } finally {\n env.ctes.clear();\n for (const [name, result] of savedCtes) env.ctes.set(name, result);\n }\n}\n\nfunction handleConflictRollback(rollback: boolean, error: unknown, env: ExecutionEnv): void {\n if (\n rollback &&\n env.transactions.inTransaction &&\n error instanceof SqliteError &&\n error.category.startsWith(\"constraint\")\n ) {\n env.transactions.rollback();\n }\n}\n\nlet statementSavepointSeq = 0;\nlet statementAtomicityDepth = 0;\n\n/** SQLite ABORT: undo all changes from the current statement; FAIL keeps prior row changes. */\nfunction withStatementAtomicity<T>(env: ExecutionEnv, resolution: \"abort\" | \"fail\", run: () => T): T {\n if (resolution === \"fail\") return run();\n // Nested DML (e.g. triggers) shares the outer statement savepoint; re-freezing would\n // invalidate caller table references mid-statement.\n if (statementAtomicityDepth > 0) return run();\n const name = `__mem_stmt_${++statementSavepointSeq}`;\n statementAtomicityDepth++;\n env.transactions.savepoint(name);\n try {\n const result = run();\n env.transactions.release(name);\n return result;\n } catch (error) {\n if (env.transactions.inTransaction) {\n try {\n env.transactions.rollback(name);\n env.transactions.release(name);\n } catch {\n // Transaction may already have been rolled back (OR ROLLBACK).\n }\n }\n throw error;\n } finally {\n statementAtomicityDepth--;\n }\n}\n\nfunction insertAbortResolution(mode: InsertStmt[\"mode\"]): \"abort\" | \"fail\" {\n return mode === \"insert_or_fail\" ? \"fail\" : \"abort\";\n}\n\nfunction updateAbortResolution(or: UpdateStmt[\"or\"]): \"abort\" | \"fail\" {\n return or === \"fail\" ? \"fail\" : \"abort\";\n}\n\nfunction deleteAbortResolution(or: DeleteStmt[\"or\"]): \"abort\" | \"fail\" {\n return or === \"fail\" ? \"fail\" : \"abort\";\n}\n\ninterface WritableView {\n schema: string | null;\n name: string;\n view: ViewInfo;\n table: Table;\n}\n\nfunction writableView(name: string, event: \"INSERT\" | \"UPDATE\" | \"DELETE\", env: ExecutionEnv): WritableView | null {\n const { schema, bare } = splitQualifiedName(name);\n const db = env.state.databaseForSchema(schema, name);\n const view = db.views.get(bare.toLowerCase());\n if (!view) return null;\n const hasInsteadOf = [...db.triggers.values()].some(\n (trigger) =>\n trigger.tableName.toLowerCase() === bare.toLowerCase() && trigger.event === event && trigger.timing === \"INSTEAD\",\n );\n if (!hasInsteadOf) {\n throw new SqliteError(`cannot modify ${bare} because it is a view`, \"other\");\n }\n const names = view.columns ?? executeSelect(view.select, env).columns;\n return {\n schema,\n name: bare,\n view,\n table: new Table(\n bare,\n names.map((column) => makeColumnInfo(column, null)),\n ),\n };\n}\n\nfunction executeViewInsert(stmt: InsertStmt, target: WritableView, env: ExecutionEnv, totalBefore: number): ResultSet {\n const columnNames = stmt.columns ?? target.table.columns.map((column) => column.name);\n for (const name of columnNames) columnOf(target.table, name);\n const suppliedIndexes = target.table.columns.map((column) =>\n columnNames.findIndex((name) => name.toLowerCase() === normalizeColumnName(column.name)),\n );\n for (const source of evaluateInsertSource(stmt, env)) {\n if (source.length !== columnNames.length) {\n throw new SqliteError(`${source.length} values for ${columnNames.length} columns`, \"other\");\n }\n const values = new Map<string, SqlValue>();\n target.table.columns.forEach((column, index) => {\n const supplied = suppliedIndexes[index] ?? -1;\n values.set(normalizeColumnName(column.name), supplied < 0 ? null : (source[supplied] ?? null));\n });\n fireInsertTriggers(\"INSTEAD\", target.table, values, null, env);\n }\n const changes = finalizeDmlChanges(totalBefore, 0, env);\n return emptyResult(changes, env.state.lastInsertRowid);\n}\n\nfunction executeViewUpdate(stmt: UpdateStmt, target: WritableView, env: ExecutionEnv, totalBefore: number): ResultSet {\n const alias = stmt.alias ?? target.name;\n const scopes = scanView(target, alias, env);\n const updatedColumns = new Set(\n stmt.set.flatMap((item) => item.columns.map((name) => columnOf(target.table, name).name)),\n );\n for (const scope of scopes) {\n const ctx = env.createEvalContext(scope);\n if (stmt.where && isTruthySql(evalExpr(stmt.where, ctx)) !== true) continue;\n const oldRow = viewRow(target.table, scope);\n const updates = evaluateSet(stmt.set, target.table, ctx);\n const newValues = mergedValues(target.table, oldRow, updates);\n fireUpdateTriggers(\"INSTEAD\", target.table, oldRow, newValues, updatedColumns, env);\n }\n const changes = finalizeDmlChanges(totalBefore, 0, env);\n return emptyResult(changes, env.state.lastInsertRowid);\n}\n\nfunction executeViewDelete(stmt: DeleteStmt, target: WritableView, env: ExecutionEnv, totalBefore: number): ResultSet {\n const alias = stmt.alias ?? target.name;\n for (const scope of scanView(target, alias, env)) {\n if (stmt.where && isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope))) !== true) continue;\n fireDeleteTriggers(\"INSTEAD\", target.table, viewRow(target.table, scope), env);\n }\n const changes = finalizeDmlChanges(totalBefore, 0, env);\n return emptyResult(changes, env.state.lastInsertRowid);\n}\n\nfunction scanView(target: WritableView, alias: string, env: ExecutionEnv): ScopeRow[] {\n return scanFrom(\n { type: \"table\", schema: target.schema, name: target.name, alias: alias === target.name ? null : alias },\n env,\n );\n}\n\nfunction viewRow(table: Table, scope: ScopeRow): Row {\n const values: SqlValue[] = [];\n for (const column of table.columns) {\n const key = normalizeColumnName(column.name);\n const cell = scope.cells.find((candidate) => normalizeColumnName(candidate.name) === key);\n values.push(cell?.value ?? null);\n }\n return { rowid: scope.rowid ?? 0, values };\n}\n\nfunction finalizeDmlChanges(totalBefore: number, directChanges: number, env: ExecutionEnv, last?: Rowid): number {\n const triggerChanges = env.state.totalChanges - totalBefore;\n env.state.recordChange(directChanges, last);\n const reportedChanges = triggerChanges + directChanges;\n env.state.changes = reportedChanges;\n return reportedChanges;\n}\n\nfunction mergedValues(table: Table, row: Row, updates: Map<string, SqlValue>): Map<string, SqlValue> {\n const values = new Map<string, SqlValue>();\n for (const column of table.columns) {\n const key = normalizeColumnName(column.name);\n values.set(key, updates.has(key) ? updates.get(key)! : table.cell(row, key));\n }\n return values;\n}\n\nfunction evaluateSet(\n items: SetItem[],\n table: Table,\n ctx: ReturnType<ExecutionEnv[\"createEvalContext\"]>,\n): Map<string, SqlValue> {\n const updates = new Map<string, SqlValue>();\n for (const item of items) {\n if (item.columns.length === 1) {\n const column = columnOf(table, item.columns[0]!);\n if (column.generated) throw new SqliteError(`cannot UPDATE generated column \"${column.name}\"`, \"misuse\");\n updates.set(normalizeColumnName(column.name), storeColumnValue(table, column, evalExpr(item.expr, ctx)));\n continue;\n }\n if (item.expr.type !== \"row\" || item.expr.values.length !== item.columns.length) {\n throw new SqliteError(\n `${item.columns.length} columns assigned ${item.expr.type === \"row\" ? item.expr.values.length : 1} values`,\n \"other\",\n );\n }\n item.columns.forEach((name, index) => {\n const column = columnOf(table, name);\n if (column.generated) throw new SqliteError(`cannot UPDATE generated column \"${column.name}\"`, \"misuse\");\n updates.set(\n normalizeColumnName(column.name),\n storeColumnValue(table, column, evalExpr(item.expr.type === \"row\" ? item.expr.values[index]! : item.expr, ctx)),\n );\n });\n }\n return updates;\n}\n\nfunction updateOne(\n table: Table,\n row: Row,\n updates: Map<string, SqlValue>,\n env: ExecutionEnv,\n): { row: Row; cascaded: number } {\n table = env.state.ensureWritableTable(table);\n const before = row;\n let after: Row | undefined;\n let indexesAdded = false;\n removeIndexes(table, before, env);\n try {\n const merged = table.namedValues(row);\n for (const [name, value] of updates) merged.set(name, value);\n for (const column of table.columns) {\n if (!column.generated?.stored) continue;\n const genCtx = env.createEvalContext({\n cells: table.columns\n .filter((c) => !c.generated)\n .map((c) => ({\n table: table.name,\n name: c.name,\n value: merged.get(normalizeColumnName(c.name)) ?? null,\n affinity: c.affinity,\n collate: c.collate,\n })),\n });\n merged.set(\n normalizeColumnName(column.name),\n storeColumnValue(table, column, evalExpr(column.generated.expr, genCtx)),\n );\n }\n after = table.update(row.rowid, merged);\n if (!after) throw new SqliteError(`no such row: ${row.rowid}`, \"other\");\n validateRow(table, after, env);\n addIndexes(table, after, env);\n indexesAdded = true;\n checkForeignKeys(table, after, env);\n const cascaded = applyReferentialUpdate(table, before, after, env);\n return { row: after, cascaded };\n } catch (error) {\n if (after) {\n if (indexesAdded) removeIndexes(table, after, env);\n // Revert row storage (including WITHOUT ROWID clustered keys), not just `rows`.\n table.update(before.rowid, table.namedValues(before));\n }\n addIndexes(table, before, env);\n throw error;\n }\n}\n\nfunction validateRow(table: Table, row: Row, env: ExecutionEnv): void {\n checkTableConstraints(table, row, (expr, candidate) =>\n evalExpr(expr, env.createEvalContext(scopeFor(table, candidate, table.name, env))),\n );\n}\n\nfunction addIndexes(table: Table, row: Row, env: ExecutionEnv): void {\n const db = env.state.databaseForTable(table);\n for (const name of table.indexes) {\n const found = db.indexes.get(name.toLowerCase());\n if (!found) continue;\n const index = db.ensureWritableIndex(found);\n if (\n index.where &&\n isTruthySql(evalExpr(index.where, env.createEvalContext(scopeFor(table, row, table.name, env)))) !== true\n )\n continue;\n index.store.insert(indexValues(index.columns, row, env, table), row.rowid, index.unique);\n }\n}\n\nfunction removeIndexes(table: Table, row: Row, env: ExecutionEnv): void {\n const db = env.state.databaseForTable(table);\n for (const name of table.indexes) {\n const found = db.indexes.get(name.toLowerCase());\n if (!found) continue;\n const index = db.ensureWritableIndex(found);\n index.store.remove(indexValues(index.columns, row, env, table), row.rowid);\n }\n}\n\nfunction removeOne(table: Table, row: Row, env: ExecutionEnv): void {\n table = env.state.ensureWritableTable(table);\n removeIndexes(table, row, env);\n table.delete(row.rowid);\n}\n\nfunction conflictingRows(table: Table, values: Map<string, SqlValue>, env: ExecutionEnv): Row[] {\n return conflictsForSets(table, values, uniqueColumnSets(table, env), env);\n}\n\nfunction conflictsMatchingTarget(\n table: Table,\n values: Map<string, SqlValue>,\n env: ExecutionEnv,\n targetColumns: string[],\n): Row[] {\n const targetKeys = targetColumns.map((name) => normalizeColumnName(name));\n const matchingSets = uniqueColumnSets(table, env).filter((columns) => {\n if (columns.length !== targetKeys.length) return false;\n const setKeys = columns.map((column) => normalizeColumnName(column.name));\n return targetKeys.every((key) => setKeys.includes(key));\n });\n if (matchingSets.length === 0) {\n // Infer INTEGER PRIMARY KEY / rowid target.\n if (\n targetKeys.length === 1 &&\n (targetKeys[0] === \"rowid\" ||\n table.columns.some((column) => normalizeColumnName(column.name) === targetKeys[0] && column.primaryKey))\n ) {\n const pkSets = uniqueColumnSets(table, env).filter(\n (columns) =>\n columns.length === 1 &&\n (normalizeColumnName(columns[0]!.name) === targetKeys[0] ||\n table.columns.find((column) => normalizeColumnName(column.name) === normalizeColumnName(columns[0]!.name))\n ?.primaryKey),\n );\n return conflictsForSets(\n table,\n values,\n pkSets.length > 0 ? pkSets : [[{ name: targetColumns[0]!, collate: null, order: null }]],\n env,\n );\n }\n return [];\n }\n return conflictsForSets(table, values, matchingSets, env);\n}\n\nfunction conflictsForUpsert(\n table: Table,\n values: Map<string, SqlValue>,\n env: ExecutionEnv,\n upsert: NonNullable<InsertStmt[\"upsert\"]>,\n): Row[] {\n if (!upsert.targetColumns) return conflictingRows(table, values, env);\n const exprs = upsert.targetExprs;\n const hasExpr = exprs?.some((expr) => expr.type !== \"column\") ?? false;\n if (hasExpr && exprs) {\n const db = env.state.databaseForTable(table);\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index?.unique || index.columns.length !== exprs.length) continue;\n const matches = index.columns.every((column, i) => {\n const expr = exprs[i]!;\n if (column.expr) return exprEquals(column.expr, expr);\n return expr.type === \"column\" && expr.name.toLowerCase() === column.name.toLowerCase();\n });\n if (!matches) continue;\n if (upsert.targetWhere && index.where && !exprEquals(upsert.targetWhere, index.where)) continue;\n return conflictsForSets(table, values, [index.columns], env);\n }\n }\n return conflictsMatchingTarget(table, values, env, upsert.targetColumns.filter(Boolean));\n}\n\nfunction uniqueColumnSets(table: Table, env: ExecutionEnv): IndexedColumn[][] {\n const sets: IndexedColumn[][] = [];\n const seen = new Set<string>();\n const remember = (columns: IndexedColumn[]): void => {\n const key = columns.map((column) => normalizeColumnName(column.name)).join(\"\\0\");\n if (seen.has(key)) return;\n seen.add(key);\n sets.push(columns);\n };\n\n for (const indexName of table.indexes) {\n const index = env.state.databaseForTable(table).indexes.get(indexName.toLowerCase());\n if (index?.unique) remember(index.columns);\n }\n\n // INTEGER PRIMARY KEY / rowid uniqueness (no autoindex).\n const pk = table.integerPkColumn();\n if (pk) remember([{ name: pk.name, collate: pk.collate, order: null }]);\n\n // Fallback for any UNIQUE/PK constraints not yet covered by an index (legacy / edge cases).\n const hasTablePrimary = table.constraints.some((constraint) => constraint.type === \"primary_key\");\n for (const column of table.columns) {\n if (column.unique || (column.primaryKey && !hasTablePrimary)) {\n remember([{ name: column.name, collate: column.collate, order: null }]);\n }\n }\n for (const constraint of table.constraints) {\n if (constraint.type === \"unique\" || constraint.type === \"primary_key\") remember(constraint.columns);\n }\n return sets;\n}\n\nfunction conflictsForSets(\n table: Table,\n values: Map<string, SqlValue>,\n sets: IndexedColumn[][],\n env: ExecutionEnv,\n): Row[] {\n const found: Row[] = [];\n const seen = new Set<string>();\n const push = (row: Row): void => {\n const key = String(row.rowid);\n if (seen.has(key)) return;\n seen.add(key);\n found.push(row);\n };\n\n const db = env.state.databaseForTable(table);\n for (const columns of sets) {\n const desired = indexValuesFromMap(columns, values, table, env);\n if (desired.some((value) => value === null)) continue;\n\n // INTEGER PRIMARY KEY / rowid map.\n if (columns.length === 1) {\n const pk = table.integerPkColumn();\n if (pk && normalizeColumnName(columns[0]!.name) === normalizeColumnName(pk.name)) {\n const row = table.getByKey(desired[0]!);\n if (row) push(row);\n continue;\n }\n }\n\n // Prefer IndexStore lookup (autoindexes + CREATE INDEX).\n let usedIndex = false;\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index?.unique) continue;\n if (index.columns.length !== columns.length) continue;\n if (\n !index.columns.every((column, i) => normalizeColumnName(column.name) === normalizeColumnName(columns[i]!.name))\n ) {\n continue;\n }\n usedIndex = true;\n if (index.where && !indexWhereMatches(index.where, values, table, env)) continue;\n for (const rowid of index.store.lookup(desired)) {\n const row = table.get(rowid);\n if (row) push(row);\n }\n break;\n }\n if (usedIndex) continue;\n\n // Slow fallback: full scan (should be rare once autoindexes exist).\n for (const row of table.scan()) {\n const existing = indexValues(columns, row, env, table);\n if (desired.every((value, index) => compareSql(value, existing[index] ?? null) === 0)) push(row);\n }\n }\n return found;\n}\n\nfunction indexValues(columns: IndexedColumn[], row: Row, env?: ExecutionEnv, table?: Table): SqlValue[] {\n if (!env || !table) return indexKeyValues(columns, row, null, table);\n return indexKeyValues(columns, row, env.createEvalContext(scopeFor(table, row, table.name, env)), table);\n}\n\nfunction indexValuesFromMap(\n columns: IndexedColumn[],\n values: Map<string, SqlValue>,\n table: Table,\n env: ExecutionEnv,\n): SqlValue[] {\n const fake = table.rowFromNamed(values);\n return indexValues(columns, fake, env, table);\n}\n\nfunction indexWhereMatches(where: Expr, values: Map<string, SqlValue>, table: Table, env: ExecutionEnv): boolean {\n const fake = table.rowFromNamed(values);\n return isTruthySql(evalExpr(where, env.createEvalContext(scopeFor(table, fake, table.name, env)))) === true;\n}\n\nfunction checkForeignKeys(table: Table, row: Row, env: ExecutionEnv): void {\n if (!env.state.foreignKeysEnabled) return;\n for (const constraint of table.constraints) {\n if (constraint.type !== \"foreign_key\") continue;\n if (fkIsDeferred(constraint, env)) continue;\n assertForeignKeySatisfied(table, row, constraint, env);\n }\n}\n\nfunction fkIsDeferred(\n constraint: Extract<Table[\"constraints\"][number], { type: \"foreign_key\" }>,\n env: ExecutionEnv,\n): boolean {\n return env.transactions.inTransaction && constraint.initiallyDeferred;\n}\n\nfunction assertForeignKeySatisfied(\n table: Table,\n row: Row,\n constraint: Extract<Table[\"constraints\"][number], { type: \"foreign_key\" }>,\n env: ExecutionEnv,\n excludeParent: Row | null = null,\n): void {\n const values = constraint.columns.map((name) => table.cell(row, normalizeColumnName(name)));\n assertForeignKeyValues(values, constraint, env, excludeParent);\n}\n\n/** Like assertForeignKeySatisfied, but using pending column updates (ON DELETE SET DEFAULT). */\nfunction assertForeignKeySatisfiedWithUpdates(\n table: Table,\n row: Row,\n constraint: Extract<Table[\"constraints\"][number], { type: \"foreign_key\" }>,\n updates: Map<string, SqlValue>,\n env: ExecutionEnv,\n excludeParent: Row | null,\n): void {\n const values = constraint.columns.map((name) => {\n const key = normalizeColumnName(name);\n return updates.has(key) ? (updates.get(key) ?? null) : table.cell(row, key);\n });\n assertForeignKeyValues(values, constraint, env, excludeParent);\n}\n\nfunction assertForeignKeyValues(\n values: SqlValue[],\n constraint: Extract<Table[\"constraints\"][number], { type: \"foreign_key\" }>,\n env: ExecutionEnv,\n excludeParent: Row | null,\n): void {\n // SQLite parses MATCH FULL/PARTIAL but enforces MATCH SIMPLE only (any NULL skips the check).\n if (values.some((value) => value === null)) return;\n const parent = env.state.getTable(constraint.refTable);\n const parentColumns =\n constraint.refColumns ?? parent.columns.filter((column) => column.primaryKey).map((column) => column.name);\n if (findParentRowsForFk(parent, parentColumns, values, env, excludeParent).length === 0) {\n throw new SqliteError(\"FOREIGN KEY constraint failed\", \"constraint_foreign\", \"SQLITE_CONSTRAINT_FOREIGNKEY\");\n }\n}\n\nfunction parentRowMatchesFk(\n parent: Table,\n parentColumns: string[],\n values: SqlValue[],\n excludeParent: Row | null,\n candidate: Row,\n): boolean {\n if (excludeParent && candidate.rowid === excludeParent.rowid) return false;\n return values.every((value, index) => {\n const parentColumn = parentColumns[index];\n return (\n parentColumn !== undefined && compareSql(value, parent.cell(candidate, normalizeColumnName(parentColumn))) === 0\n );\n });\n}\n\nfunction findParentRowsForFk(\n parent: Table,\n parentColumns: string[],\n values: SqlValue[],\n env: ExecutionEnv,\n excludeParent: Row | null,\n): Row[] {\n const db = env.state.databaseForTable(parent);\n const pk = parent.integerPkColumn();\n if (parentColumns.length === 1) {\n const col = parentColumns[0]!.toLowerCase();\n if (\n col === \"rowid\" ||\n col === \"_rowid_\" ||\n col === \"oid\" ||\n (pk && col === (pk.nameLower ?? pk.name.toLowerCase()))\n ) {\n const row = parent.getByKey(values[0]!);\n if (row && parentRowMatchesFk(parent, parentColumns, values, excludeParent, row)) return [row];\n return [];\n }\n }\n\n const normalizedValues = values.map((value, index) => {\n const colName = parentColumns[index]!;\n const column = parent.columns.find((item) => (item.nameLower ?? item.name.toLowerCase()) === colName.toLowerCase());\n return normalizeForCollation(value, column?.collate ?? \"BINARY\");\n });\n for (const indexName of parent.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index?.unique || index.where || index.columns.some((column) => column.expr)) continue;\n if (index.columns.length !== parentColumns.length) continue;\n if (!index.columns.every((column, idx) => column.name.toLowerCase() === parentColumns[idx]!.toLowerCase()))\n continue;\n const rows: Row[] = [];\n for (const rowid of index.store.lookup(normalizedValues)) {\n const candidate = parent.get(rowid);\n if (candidate && parentRowMatchesFk(parent, parentColumns, values, excludeParent, candidate))\n rows.push(candidate);\n }\n return rows;\n }\n\n return [...parent.scan()].filter((candidate) =>\n parentRowMatchesFk(parent, parentColumns, values, excludeParent, candidate),\n );\n}\n\nfunction findChildRowsForFk(\n child: Table,\n childColumns: string[],\n parentColumns: string[],\n parent: Table,\n parentRow: Row,\n env: ExecutionEnv,\n): Row[] {\n const refValues = parentColumns.map((name) => parent.cell(parentRow, normalizeColumnName(name)));\n if (refValues.some((value) => value === null)) return [];\n\n if (childColumns.length === 1) {\n const col = childColumns[0]!.toLowerCase();\n const matches = child.lookupEquality(col, refValues[0]!);\n if (matches) {\n return matches.filter((candidate) =>\n foreignKeyMatches(childColumns, candidate, parentColumns, parentRow, child, parent),\n );\n }\n }\n\n const db = env.state.databaseForTable(child);\n const normalizedValues = refValues.map((value, index) => {\n const colName = childColumns[index]!;\n const column = child.columns.find((item) => (item.nameLower ?? item.name.toLowerCase()) === colName.toLowerCase());\n return normalizeForCollation(value, column?.collate ?? \"BINARY\");\n });\n for (const indexName of child.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index || index.where || index.columns.some((column) => column.expr)) continue;\n if (index.columns.length < childColumns.length) continue;\n if (!childColumns.every((name, idx) => index.columns[idx]?.name.toLowerCase() === name.toLowerCase())) {\n continue;\n }\n const lookupValues = normalizedValues.slice(0, index.columns.length);\n const rowids =\n lookupValues.length === index.columns.length\n ? index.store.lookup(lookupValues)\n : index.store.lookupPrefix(lookupValues);\n const rows: Row[] = [];\n for (const rowid of rowids) {\n const candidate = child.get(rowid);\n if (candidate && foreignKeyMatches(childColumns, candidate, parentColumns, parentRow, child, parent)) {\n rows.push(candidate);\n }\n }\n return rows;\n }\n\n return [...child.scan()].filter((candidate) =>\n foreignKeyMatches(childColumns, candidate, parentColumns, parentRow, child, parent),\n );\n}\n\nexport function checkDeferredForeignKeys(env: ExecutionEnv): void {\n if (!env.state.foreignKeysEnabled) return;\n for (const table of env.state.tables.values()) {\n for (const constraint of table.constraints) {\n if (constraint.type !== \"foreign_key\" || !constraint.initiallyDeferred) continue;\n for (const row of table.scan()) assertForeignKeySatisfied(table, row, constraint, env);\n }\n }\n}\n\nfunction applyReferentialDelete(parent: Table, row: Row, env: ExecutionEnv): number {\n if (!env.state.foreignKeysEnabled) return 0;\n let changes = 0;\n const parentPk = parent.columns.filter((column) => column.primaryKey).map((column) => column.name);\n for (const childKey of [...env.state.tables.keys()]) {\n let child = env.state.tables.get(childKey);\n if (!child) continue;\n for (const constraint of child.constraints) {\n if (constraint.type !== \"foreign_key\" || constraint.refTable.toLowerCase() !== parent.name.toLowerCase())\n continue;\n child = env.state.ensureWritableTable(child);\n const target = child;\n const referenced = constraint.refColumns ?? parentPk;\n const matches = findChildRowsForFk(target, constraint.columns, referenced, parent, row, env).filter(\n (candidate) => !(target === parent && candidate.rowid === row.rowid),\n );\n for (const candidate of matches) {\n if (constraint.onDelete === \"CASCADE\") {\n changes += applyReferentialDelete(child, candidate, env);\n if (fireDeleteTriggers(\"BEFORE\", child, candidate, env) === \"ignore\") continue;\n removeOne(child, candidate, env);\n fireDeleteTriggers(\"AFTER\", child, candidate, env);\n changes++;\n } else if (constraint.onDelete === \"SET NULL\") {\n const updated = updateOne(\n child,\n candidate,\n new Map(constraint.columns.map((name) => [normalizeColumnName(name), null])),\n env,\n );\n changes += 1 + updated.cascaded;\n } else if (constraint.onDelete === \"SET DEFAULT\") {\n const updates = defaultUpdates(child, constraint.columns, env);\n // Default must resolve to a surviving parent row (exclude the row being deleted).\n assertForeignKeySatisfiedWithUpdates(child, candidate, constraint, updates, env, row);\n const updated = updateOne(child, candidate, updates, env);\n changes += 1 + updated.cascaded;\n } else if (constraint.onDelete === \"RESTRICT\" || !fkIsDeferred(constraint, env)) {\n throw new SqliteError(\"FOREIGN KEY constraint failed\", \"constraint_foreign\", \"SQLITE_CONSTRAINT_FOREIGNKEY\");\n }\n }\n }\n }\n return changes;\n}\n\nfunction applyReferentialUpdate(parent: Table, before: Row, after: Row, env: ExecutionEnv): number {\n if (!env.state.foreignKeysEnabled) return 0;\n let changes = 0;\n const parentPk = parent.columns.filter((column) => column.primaryKey).map((column) => column.name);\n for (const childKey of [...env.state.tables.keys()]) {\n let child = env.state.tables.get(childKey);\n if (!child) continue;\n for (const constraint of child.constraints) {\n if (constraint.type !== \"foreign_key\" || constraint.refTable.toLowerCase() !== parent.name.toLowerCase())\n continue;\n child = env.state.ensureWritableTable(child);\n const target = child;\n const referenced = constraint.refColumns ?? parentPk;\n const oldValues = referenced.map((name) => parent.cell(before, normalizeColumnName(name)));\n const newValues = referenced.map((name) => parent.cell(after, normalizeColumnName(name)));\n if (oldValues.every((value, index) => compareSql(value, newValues[index] ?? null) === 0)) continue;\n\n const matches = findChildRowsForFk(target, constraint.columns, referenced, parent, before, env);\n for (const candidate of matches) {\n if (constraint.onUpdate === \"CASCADE\") {\n const updated = updateOne(\n target,\n candidate,\n new Map(constraint.columns.map((name, index) => [normalizeColumnName(name), newValues[index] ?? null])),\n env,\n );\n changes += 1 + updated.cascaded;\n } else if (constraint.onUpdate === \"SET NULL\") {\n const updated = updateOne(\n target,\n candidate,\n new Map(constraint.columns.map((name) => [normalizeColumnName(name), null])),\n env,\n );\n changes += 1 + updated.cascaded;\n } else if (constraint.onUpdate === \"SET DEFAULT\") {\n const updated = updateOne(target, candidate, defaultUpdates(target, constraint.columns, env), env);\n changes += 1 + updated.cascaded;\n } else if (constraint.onUpdate === \"RESTRICT\" || !fkIsDeferred(constraint, env)) {\n throw new SqliteError(\"FOREIGN KEY constraint failed\", \"constraint_foreign\", \"SQLITE_CONSTRAINT_FOREIGNKEY\");\n }\n }\n }\n }\n return changes;\n}\n\nfunction foreignKeyMatches(\n childColumns: string[],\n child: Row,\n parentColumns: string[],\n parent: Row,\n childTable: Table,\n parentTable: Table,\n): boolean {\n const childValues = childColumns.map((name) => childTable.cell(child, normalizeColumnName(name)));\n if (childValues.some((value) => value === null)) return false;\n return childValues.every((value, index) => {\n const parentColumn = parentColumns[index];\n return (\n parentColumn !== undefined && compareSql(value, parentTable.cell(parent, normalizeColumnName(parentColumn))) === 0\n );\n });\n}\n\nfunction defaultUpdates(table: Table, columns: string[], env: ExecutionEnv): Map<string, SqlValue> {\n return new Map(\n columns.map((name) => {\n const column = columnOf(table, name);\n const value = column.defaultExpr ? evalExpr(column.defaultExpr, env.createEvalContext()) : null;\n return [normalizeColumnName(column.name), value];\n }),\n );\n}\n\nfunction scopeFor(table: Table, row: Row, alias: string, env?: ExecutionEnv): ScopeRow {\n const integerPkAlias = table.withoutRowid\n ? undefined\n : table.columns.find((column) => column.primaryKey && column.typeName?.trim().toUpperCase() === \"INTEGER\")?.name;\n const baseCells = table.columns\n .filter((c) => !c.generated || c.generated.stored)\n .map((column) => ({\n table: alias,\n name: column.name,\n value: table.cell(row, normalizeColumnName(column.name)),\n affinity: column.affinity,\n collate: column.collate,\n }));\n const cells = [...baseCells];\n if (env) {\n for (const column of table.columns) {\n if (!column.generated || column.generated.stored) continue;\n const ctx = env.createEvalContext({ cells: baseCells, sourceTable: table.name });\n const value = applyAffinity(evalExpr(column.generated.expr, ctx), column.affinity);\n cells.push({\n table: alias,\n name: column.name,\n value,\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n // Preserve column order\n cells.sort((a, b) => {\n const ai = table.columns.findIndex((c) => c.name.toLowerCase() === a.name.toLowerCase());\n const bi = table.columns.findIndex((c) => c.name.toLowerCase() === b.name.toLowerCase());\n return ai - bi;\n });\n } else {\n for (const column of table.columns) {\n if (!column.generated || column.generated.stored) continue;\n cells.push({\n table: alias,\n name: column.name,\n value: null,\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n cells.sort((a, b) => {\n const ai = table.columns.findIndex((c) => c.name.toLowerCase() === a.name.toLowerCase());\n const bi = table.columns.findIndex((c) => c.name.toLowerCase() === b.name.toLowerCase());\n return ai - bi;\n });\n }\n return {\n ...(table.withoutRowid ? {} : { rowid: row.rowid }),\n rowidName: integerPkAlias ?? (table.withoutRowid ? undefined : \"rowid\"),\n sourceTable: table.name,\n cells,\n };\n}\n\nfunction projectReturning(columns: ResultColumn[], scope: ScopeRow, env: ExecutionEnv): SqlValue[] {\n const values: SqlValue[] = [];\n const ctx = env.createEvalContext(scope);\n for (const column of columns) {\n if (column.type === \"star\") {\n for (const cell of scope.cells)\n if (column.table === null || cell.table?.toLowerCase() === column.table.toLowerCase()) values.push(cell.value);\n } else values.push(evalExpr(column.expr, ctx));\n }\n return values;\n}\n\nfunction returningNames(columns: ResultColumn[], table: Table): string[] {\n return columns.flatMap((column) =>\n column.type === \"star\"\n ? table.columns.map((item) => item.name)\n : [column.alias ?? (column.expr.type === \"column\" ? column.expr.name : column.expr.type)],\n );\n}\n\nfunction columnOf(table: Table, name: string) {\n const column = table.columns.find((item) => item.name.toLowerCase() === name.toLowerCase());\n if (!column) throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n return column;\n}\n\nfunction isRowidName(name: string): boolean {\n const key = name.toLowerCase();\n return key === \"rowid\" || key === \"_rowid_\" || key === \"oid\";\n}\n\nfunction ftsScopeFor(table: Fts5VirtualTable, row: Fts5Row, alias: string): ScopeRow {\n return {\n rowid: row.rowid,\n rowidName: \"rowid\",\n sourceTable: table.name,\n cells: table.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n };\n}\n\nfunction executeVirtualInsert(stmt: InsertStmt, env: ExecutionEnv): ResultSet {\n const any = env.state.getAnyVirtualTable(stmt.table);\n if (any.kind === \"rtree\") {\n const columnNames = stmt.columns ?? any.columns;\n const sourceRows = stmt.values\n ? stmt.values.map((items) => items.map((expr) => evalExpr(expr, env.createEvalContext())))\n : stmt.select\n ? resultValues(executeSelect({ ...stmt.select, with: stmt.with ?? stmt.select.with }, env))\n : [[]];\n let changes = 0;\n let last = env.state.lastInsertRowid;\n for (const source of sourceRows) {\n const values = new Map<string, SqlValue>();\n for (let i = 0; i < columnNames.length; i++) {\n values.set(columnNames[i]!.toLowerCase(), source[i] ?? null);\n }\n last = any.insert(values);\n changes++;\n }\n env.state.recordChange(changes, last);\n return valuesToResult([], [], changes, last);\n }\n if (any.kind !== \"fts5\" && any.kind !== \"fts3\" && any.kind !== \"fts4\") {\n throw new SqliteError(`table ${stmt.table} may not be modified`, \"misuse\");\n }\n const table = any;\n const columnNames = stmt.columns ?? table.columns;\n for (const name of columnNames) {\n const lower = name.toLowerCase();\n if (lower === table.name.toLowerCase()) continue; // FTS special-command column\n if (lower === \"rowid\" || lower === \"_rowid_\" || lower === \"oid\") continue;\n if (!table.columns.some((column) => column.toLowerCase() === lower)) {\n throw new SqliteError(`table ${table.name} has no column named ${name}`, \"no_such_column\");\n }\n }\n const sourceRows = stmt.values\n ? stmt.values.map((items) => items.map((expr) => evalExpr(expr, env.createEvalContext())))\n : stmt.select\n ? resultValues(executeSelect({ ...stmt.select, with: stmt.with ?? stmt.select.with }, env))\n : [[]];\n const { changes, lastInsertRowid } = executeFtsInsert(table, columnNames, sourceRows, env);\n env.state.recordChange(changes, lastInsertRowid);\n return valuesToResult([], [], changes, lastInsertRowid);\n}\n\nfunction executeVirtualUpdate(stmt: UpdateStmt, env: ExecutionEnv): ResultSet {\n if (stmt.from) throw new SqliteError(\"UPDATE FROM is not supported\", \"unsupported\");\n const any = env.state.getAnyVirtualTable(stmt.table);\n if (any.kind === \"rtree\") {\n const alias = stmt.alias ?? stmt.table;\n const candidates = any.scan().filter((row) => {\n if (!stmt.where) return true;\n const scope: ScopeRow = {\n rowid: row.rowid,\n rowidName: \"rowid\",\n sourceTable: any.name,\n cells: any.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n };\n return isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope))) === true;\n });\n let changes = 0;\n for (const row of candidates) {\n const updates = new Map<string, SqlValue>();\n const scope: ScopeRow = {\n rowid: row.rowid,\n cells: any.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n };\n for (const item of stmt.set) {\n if (item.columns.length !== 1)\n throw new SqliteError(\"multi-column SET is not supported on virtual tables\", \"unsupported\");\n updates.set(item.columns[0]!.toLowerCase(), evalExpr(item.expr, env.createEvalContext(scope)));\n }\n any.update(row.rowid, updates);\n changes++;\n }\n env.state.recordChange(changes);\n return valuesToResult([], [], changes, env.state.lastInsertRowid);\n }\n if (any.kind !== \"fts5\" && any.kind !== \"fts3\" && any.kind !== \"fts4\") {\n throw new SqliteError(`table ${stmt.table} may not be modified`, \"misuse\");\n }\n const table = any;\n const alias = stmt.alias ?? stmt.table;\n const candidates: Rowid[] = [];\n for (const row of table.scan()) {\n const scope = ftsScopeFor(table, row, alias);\n if (stmt.where && isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope))) !== true) continue;\n candidates.push(row.rowid);\n }\n let changes = 0;\n for (const rowid of candidates) {\n const row = table.rows.get(rowid)!;\n const scope = ftsScopeFor(table, row, alias);\n const updates = evaluateFtsSet(stmt.set, table, env.createEvalContext(scope));\n executeFtsUpdate(table, updates, [rowid]);\n changes++;\n }\n env.state.recordChange(changes);\n return valuesToResult([], [], changes, env.state.lastInsertRowid);\n}\n\nfunction executeVirtualDelete(stmt: DeleteStmt, env: ExecutionEnv): ResultSet {\n const any = env.state.getAnyVirtualTable(stmt.table);\n if (any.kind === \"rtree\") {\n const alias = stmt.alias ?? stmt.table;\n const selected = any.scan().filter((row) => {\n if (!stmt.where) return true;\n const scope: ScopeRow = {\n rowid: row.rowid,\n cells: any.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n };\n return isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope))) === true;\n });\n let changes = 0;\n for (const row of selected) {\n any.delete(row.rowid);\n changes++;\n }\n env.state.recordChange(changes);\n return valuesToResult([], [], changes, env.state.lastInsertRowid);\n }\n if (any.kind !== \"fts5\" && any.kind !== \"fts3\" && any.kind !== \"fts4\") {\n throw new SqliteError(`table ${stmt.table} may not be modified`, \"misuse\");\n }\n const table = any;\n const alias = stmt.alias ?? stmt.table;\n const selected = table.scan().filter((row) => {\n if (!stmt.where) return true;\n return isTruthySql(evalExpr(stmt.where, env.createEvalContext(ftsScopeFor(table, row, alias)))) === true;\n });\n const changes = executeFtsDelete(\n table,\n selected.map((row) => row.rowid),\n );\n env.state.recordChange(changes);\n return valuesToResult([], [], changes, env.state.lastInsertRowid);\n}\n\nfunction evaluateFtsSet(\n items: SetItem[],\n table: Fts5VirtualTable,\n ctx: ReturnType<ExecutionEnv[\"createEvalContext\"]>,\n): Map<string, SqlValue> {\n const updates = new Map<string, SqlValue>();\n for (const item of items) {\n if (item.columns.length !== 1)\n throw new SqliteError(\"multi-column SET is not supported on virtual tables\", \"unsupported\");\n const name = item.columns[0]!;\n if (!table.columns.some((column) => column.toLowerCase() === name.toLowerCase())) {\n throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n }\n updates.set(normalizeColumnName(name), evalExpr(item.expr, ctx));\n }\n return updates;\n}\n\nfunction asExplicitRowid(value: SqlValue): Rowid | undefined {\n if (value === null) return undefined;\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\" && Number.isSafeInteger(value)) return value;\n throw new SqliteError(\"datatype mismatch\", \"datatype_mismatch\", \"SQLITE_MISMATCH\");\n}\n", "import type { Expr } from \"../ast/nodes.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport {\n coercePragmaInt,\n coercePragmaTruthy,\n evalPragmaArgs,\n evalPragmaSetValue,\n queryPragma,\n} from \"./pragma-engine.ts\";\nimport { emptyResult, type ResultSet, valuesToResult } from \"./result.ts\";\n\nexport function executePragma(name: string, expr: Expr | null, env: ExecutionEnv): ResultSet {\n const key = name.toLowerCase();\n\n // Writable statement forms\n if (key === \"foreign_keys\" && expr !== null) {\n const value = evalPragmaSetValue(expr, env);\n if (!env.transactions.inTransaction) env.state.foreignKeysEnabled = coercePragmaTruthy(value);\n return emptyResult(0, env.state.lastInsertRowid);\n }\n if (key === \"case_sensitive_like\" && expr !== null) {\n const value = evalPragmaSetValue(expr, env);\n env.state.caseSensitiveLike = coercePragmaTruthy(value);\n return emptyResult(0, env.state.lastInsertRowid);\n }\n if ((key === \"user_version\" || key === \"schema_version\") && expr !== null) {\n const value = evalPragmaSetValue(expr, env);\n const num = coercePragmaInt(value);\n if (key === \"user_version\") env.state.userVersion = num;\n else env.state.schemaVersion = num;\n return emptyResult(0, env.state.lastInsertRowid);\n }\n\n const args = evalPragmaArgs(expr, env);\n const result = queryPragma(key, args, env);\n if (result.columns.length === 0 && result.rows.length === 0) {\n return emptyResult(0, env.state.lastInsertRowid);\n }\n return valuesToResult(result.columns, result.rows, 0, env.state.lastInsertRowid);\n}\n", "import type { ReindexStmt, Statement } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { heapRowCells, rebuildIndexFromTable } from \"../indexes/keys.ts\";\nimport { assertUnreachable } from \"../runtime/assert.ts\";\nimport type { DatabaseState, IndexInfo } from \"../storage/database-state.ts\";\nimport { executeAttach, executeDetach } from \"./attach.ts\";\nimport {\n executeAlterTable,\n executeCreateIndex,\n executeCreateTable,\n executeCreateView,\n executeDropIndex,\n executeDropTable,\n executeDropView,\n} from \"./ddl.ts\";\nimport { checkDeferredForeignKeys, executeDelete, executeInsert, executeUpdate } from \"./dml.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { executePragma } from \"./pragma.ts\";\nimport { emptyResult, type ResultSet, valuesToResult } from \"./result.ts\";\nimport { executeSelect } from \"./select.ts\";\nimport { executeCreateTrigger, executeDropTrigger } from \"./triggers.ts\";\nimport { executeCreateVirtualTable } from \"./vtable.ts\";\n\nexport function executeStatement(stmt: Statement, env: ExecutionEnv): ResultSet {\n env.selectRunner = executeSelect;\n switch (stmt.type) {\n case \"select\":\n return executeSelect(stmt, env);\n case \"insert\":\n return executeInsert(stmt, env);\n case \"update\":\n return executeUpdate(stmt, env);\n case \"delete\":\n return executeDelete(stmt, env);\n case \"create_table\":\n return executeCreateTable(stmt, env);\n case \"drop_table\":\n return executeDropTable(stmt, env);\n case \"alter_table\":\n return executeAlterTable(stmt, env);\n case \"create_index\":\n return executeCreateIndex(stmt, env);\n case \"drop_index\":\n return executeDropIndex(stmt, env);\n case \"create_view\":\n return executeCreateView(stmt, env);\n case \"drop_view\":\n return executeDropView(stmt, env);\n case \"create_trigger\":\n return executeCreateTrigger(stmt, env);\n case \"drop_trigger\":\n return executeDropTrigger(stmt, env);\n case \"create_virtual_table\":\n return executeCreateVirtualTable(stmt, env);\n case \"attach\":\n return executeAttach(stmt, env);\n case \"detach\":\n return executeDetach(stmt, env);\n case \"begin\":\n env.transactions.begin();\n return emptyResult(0, env.state.lastInsertRowid);\n case \"commit\":\n checkDeferredForeignKeys(env);\n env.transactions.commit();\n return emptyResult(0, env.state.lastInsertRowid);\n case \"rollback\":\n env.transactions.rollback(stmt.savepoint ?? undefined);\n return emptyResult(0, env.state.lastInsertRowid);\n case \"savepoint\":\n env.transactions.savepoint(stmt.name);\n return emptyResult(0, env.state.lastInsertRowid);\n case \"release\":\n env.transactions.release(stmt.name);\n return emptyResult(0, env.state.lastInsertRowid);\n case \"pragma\":\n return executePragma(stmt.name, stmt.value, env);\n case \"explain\":\n return valuesToResult(\n stmt.queryPlan\n ? [\"id\", \"parent\", \"notused\", \"detail\"]\n : [\"addr\", \"opcode\", \"p1\", \"p2\", \"p3\", \"p4\", \"p5\", \"comment\"],\n stmt.queryPlan\n ? [[0, 0, 0, `EXECUTE ${stmt.statement.type.toUpperCase()}`]]\n : [[0, \"Execute\", 0, 0, 0, stmt.statement.type, 0, null]],\n 0,\n env.state.lastInsertRowid,\n );\n case \"analyze\":\n return executeAnalyze(stmt, env);\n case \"reindex\":\n return executeReindex(stmt, env);\n case \"vacuum\":\n // :memory: VACUUM is a successful no-op (matches bun:sqlite).\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n default:\n return assertUnreachable(stmt);\n }\n}\n\nfunction executeReindex(stmt: ReindexStmt, env: ExecutionEnv): ResultSet {\n const targets = resolveReindexTargets(stmt, env);\n for (const { db, index } of targets) rebuildOneIndex(env, db, index);\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nfunction resolveReindexTargets(stmt: ReindexStmt, env: ExecutionEnv): Array<{ db: DatabaseState; index: IndexInfo }> {\n if (stmt.name === null) {\n return allDatabaseStates(env.state).flatMap((db) => [...db.indexes.values()].map((index) => ({ db, index })));\n }\n const name = stmt.name;\n const collation = builtinCollationName(name);\n // SQLite: collation-name wins over a table/index of the same name when un-qualified.\n if (stmt.schema === null && collation) {\n return allDatabaseStates(env.state).flatMap((db) =>\n [...db.indexes.values()].filter((index) => indexUsesCollation(index, collation)).map((index) => ({ db, index })),\n );\n }\n const db = env.state.databaseForSchema(stmt.schema, stmt.schema ? `${stmt.schema}.${name}` : name);\n const table = db.tables.get(name.toLowerCase());\n if (table) {\n return table.indexes\n .map((indexName) => db.indexes.get(indexName.toLowerCase()))\n .filter((index): index is IndexInfo => index !== undefined)\n .map((index) => ({ db, index }));\n }\n const index = db.indexes.get(name.toLowerCase());\n if (index) return [{ db, index }];\n throw new SqliteError(`unable to identify the object to be reindexed: ${qualifiedReindexName(stmt)}`, \"other\");\n}\n\nfunction rebuildOneIndex(env: ExecutionEnv, db: DatabaseState, index: IndexInfo): void {\n const table = db.tables.get(index.tableName.toLowerCase());\n if (!table) return;\n const writable = db.ensureWritableIndex(index);\n rebuildIndexFromTable(writable, table, (row) =>\n env.createEvalContext({ rowid: row.rowid, sourceTable: table.name, cells: heapRowCells(table, row, env) }),\n );\n}\n\nfunction allDatabaseStates(root: DatabaseState): DatabaseState[] {\n return [root, ...[...root.attached.values()].map((entry) => entry.state)];\n}\n\nfunction indexUsesCollation(index: IndexInfo, collation: string): boolean {\n return index.columns.some((column) => (column.collate ?? \"BINARY\").toUpperCase() === collation);\n}\n\nfunction builtinCollationName(name: string): \"BINARY\" | \"NOCASE\" | \"RTRIM\" | null {\n const upper = name.toUpperCase();\n if (upper === \"BINARY\" || upper === \"NOCASE\" || upper === \"RTRIM\") return upper;\n return null;\n}\n\nfunction qualifiedReindexName(stmt: ReindexStmt): string {\n return stmt.schema ? `${stmt.schema}.${stmt.name}` : (stmt.name ?? \"\");\n}\n\nfunction executeAnalyze(stmt: import(\"../ast/nodes.ts\").AnalyzeStmt, env: ExecutionEnv): ResultSet {\n // Populate sqlite_stat1 with simple row counts for oracle-visible ANALYZE behavior.\n let stat = env.state.tables.get(\"sqlite_stat1\");\n if (!stat) {\n env.state.createTable(\n {\n type: \"create_table\",\n ifNotExists: true,\n temp: false,\n name: \"sqlite_stat1\",\n columns: [\n { name: \"tbl\", typeName: \"TEXT\", constraints: [] },\n { name: \"idx\", typeName: \"TEXT\", constraints: [] },\n { name: \"stat\", typeName: \"TEXT\", constraints: [] },\n ],\n constraints: [],\n asSelect: null,\n withoutRowid: false,\n strict: false,\n },\n \"CREATE TABLE sqlite_stat1(tbl,idx,stat)\",\n );\n stat = env.state.tables.get(\"sqlite_stat1\");\n }\n if (stat) {\n for (const row of [...stat.scan()]) {\n stat.delete(row.rowid);\n }\n const tables = [...env.state.tables.values()].filter((t) => t.name.toLowerCase() !== \"sqlite_stat1\");\n const targets = stmt.name ? tables.filter((t) => t.name.toLowerCase() === stmt.name!.toLowerCase()) : tables;\n for (const table of targets) {\n const rowCount = [...table.scan()].length;\n const indexes = [...env.state.indexes.values()].filter(\n (i) => i.tableName.toLowerCase() === table.name.toLowerCase(),\n );\n if (indexes.length === 0) {\n stat.insert(\n new Map<string, import(\"../types/value.ts\").SqlValue>([\n [\"tbl\", table.name],\n [\"idx\", null],\n [\"stat\", String(rowCount)],\n ]),\n );\n } else {\n for (const index of indexes) {\n stat.insert(\n new Map<string, import(\"../types/value.ts\").SqlValue>([\n [\"tbl\", table.name],\n [\"idx\", index.name],\n [\"stat\", `${rowCount} ${Math.max(1, Math.floor(rowCount / 2))}`],\n ]),\n );\n }\n }\n }\n }\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n", "import type { Statement as AstStatement } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { ExecutionEnv } from \"../executor/env.ts\";\nimport { executeStatement } from \"../executor/execute.ts\";\nimport { emptyResult, type ResultSet } from \"../executor/result.ts\";\nimport { tokenize } from \"../lexer/tokenize.ts\";\nimport { parseUnits } from \"../parser/index.ts\";\nimport type { BindValue, QueryRow } from \"../types/value.ts\";\nimport type { Database } from \"./database.ts\";\n\n/** Mutation counters returned by {@link Statement.run}. */\nexport interface RunResult {\n /** Rows changed by this execution (SQLite `changes()`). */\n changes: number;\n /** Rowid of the most recent INSERT in this execution. */\n lastInsertRowid: number | bigint;\n}\n\n/**\n * Prepared SQL statement bound to a {@link Database}.\n *\n * Create with {@link Database.prepare}. Pass bind values as rest arguments to\n * {@link run}, {@link all}, {@link get}, or {@link result} on each call\n * (stateless \u2014 there is no sticky `bind()`).\n *\n * @example\n * ```ts\n * import { Database } from \"@crvouga/mockingbird-service-sqlite\";\n *\n * const db = new Database();\n * db.exec(\"CREATE TABLE t (id INTEGER PRIMARY KEY, name TEXT)\");\n * const insert = db.prepare(\"INSERT INTO t (name) VALUES (?)\");\n * insert.run(\"Ada\");\n * const row = db.prepare(\"SELECT id, name FROM t WHERE id = ?\").get<{ id: number; name: string }>(1);\n * ```\n */\nexport class Statement {\n private namedPlan: ReturnType<typeof planNamedParameters> | null = null;\n private env: ExecutionEnv | null = null;\n private statements: AstStatement[];\n private statementSqls: string[];\n private schemaVersion: number;\n\n private constructor(\n private readonly database: Database,\n private readonly sql: string,\n statements: AstStatement[],\n statementSqls: string[],\n ) {\n this.statements = statements;\n this.statementSqls = statementSqls;\n this.schemaVersion = database.state.schemaVersion;\n }\n\n /**\n * Construct a {@link Statement} for {@link Database.prepare} / {@link Database.exec}.\n * @internal\n */\n static create(database: Database, sql: string, statements: AstStatement[], statementSqls?: string[]): Statement {\n return new Statement(database, sql, statements, statementSqls ?? statements.map(() => sql));\n }\n\n /** @internal Build from {@link parseUnits}. */\n static createFromSql(database: Database, sql: string): Statement {\n const units = parseUnits(sql);\n return new Statement(\n database,\n sql,\n units.map((u) => u.statement),\n units.map((u) => u.sql),\n );\n }\n\n /**\n * Execute for side effects (INSERT / UPDATE / DELETE / DDL).\n *\n * @param params - Bind values for this call only.\n * @returns Mutation counters for this execution.\n * @throws {SqliteError} If the database is closed, the statement is empty, or execution fails.\n */\n run(...params: BindValue[]): RunResult {\n const result = this.execute(params, { named: false });\n return { changes: result.changes, lastInsertRowid: result.lastInsertRowid };\n }\n\n /**\n * Execute and return every result row as an object keyed by column name.\n *\n * @typeParam T - Row shape. Defaults to {@link QueryRow}.\n * @param params - Bind values for this call only.\n * @throws {SqliteError} If the database is closed, the statement is empty, or execution fails.\n */\n all<T = QueryRow>(...params: BindValue[]): T[] {\n return this.execute(params, { named: true }).rows as T[];\n }\n\n /**\n * Execute and return the full {@link ResultSet}, including column names.\n *\n * Use this when you need metadata for an empty result (column names with zero rows).\n * {@link all} only returns row objects.\n *\n * @param params - Bind values for this call only.\n * @throws {SqliteError} If the database is closed, the statement is empty, or execution fails.\n */\n result(...params: BindValue[]): ResultSet {\n return this.execute(params, { named: true });\n }\n\n /**\n * Execute and return the first row, or `undefined` if there are no rows.\n *\n * @typeParam T - Row shape. Defaults to {@link QueryRow}.\n * @param params - Bind values for this call only.\n * @throws {SqliteError} If the database is closed, the statement is empty, or execution fails.\n */\n get<T = QueryRow>(...params: BindValue[]): T | undefined {\n return this.execute(params, { named: true, maxRows: 1 }).rows[0] as T | undefined;\n }\n\n private execute(params: readonly BindValue[], options?: { named?: boolean; maxRows?: number }): ResultSet {\n this.database.assertOpen();\n this.reprepareIfSchemaChanged();\n if (this.statements.length === 0) {\n if (options?.named) throw new SqliteError(\"empty statement\", \"misuse\");\n return emptyResult(this.database.state.changes, this.database.state.lastInsertRowid);\n }\n this.namedPlan ??= planNamedParameters(this.sql);\n const expected = this.namedPlan.expectedCount;\n if (params.length > 0 && params.length !== expected) {\n throw new SqliteError(`SQLite query expected ${expected} values, received ${params.length}`, \"misuse\");\n }\n const env = this.obtainEnv(params);\n env.maxRows = options?.maxRows ?? Number.POSITIVE_INFINITY;\n env.includeNamedRows = options?.named !== false;\n env.includeValues = true;\n this.bindNamed(env, params);\n let result: ResultSet | undefined;\n for (let i = 0; i < this.statements.length; i++) {\n env.statementSql = this.statementSqls[i] ?? this.sql;\n result = executeStatement(this.statements[i]!, env);\n }\n env.statementSql = null;\n return result!;\n }\n\n private obtainEnv(params: readonly BindValue[]): ExecutionEnv {\n if (this.env) {\n this.env.reset(params);\n this.env.hooks.now = this.database.now;\n this.env.hooks.random = () => this.database.prng.nextSqliteRandom();\n this.env.hooks.randomU64 = () => this.database.prng.nextU64();\n return this.env;\n }\n this.env = new ExecutionEnv(this.database.state, this.database.transactions, params, undefined, {\n now: this.database.now,\n random: () => this.database.prng.nextSqliteRandom(),\n randomU64: () => this.database.prng.nextU64(),\n });\n return this.env;\n }\n\n private reprepareIfSchemaChanged(): void {\n if (this.schemaVersion === this.database.state.schemaVersion) return;\n const units = parseUnits(this.sql);\n this.statements = units.map((u) => u.statement);\n this.statementSqls = units.map((u) => u.sql);\n this.env = null;\n this.namedPlan = null;\n this.schemaVersion = this.database.state.schemaVersion;\n }\n\n private bindNamed(env: ExecutionEnv, params: readonly BindValue[]): void {\n this.namedPlan ??= planNamedParameters(this.sql);\n for (const item of this.namedPlan.named) {\n if (item.slot <= params.length) env.setNamed(item.name, params[item.slot - 1]);\n }\n }\n}\n\ninterface NamedPlan {\n named: { name: string; slot: number }[];\n /** Highest bind slot index (SQLite parameter count). */\n expectedCount: number;\n}\n\nfunction planNamedParameters(sql: string): NamedPlan {\n const tokens = tokenize(sql);\n let nextSlot = 1;\n const namedSlots = new Map<string, number>();\n const named: { name: string; slot: number }[] = [];\n for (const token of tokens) {\n if (token.kind === \"PARAM_POS\") {\n if (token.index !== undefined) nextSlot = Math.max(nextSlot, token.index + 1);\n else nextSlot++;\n } else if (token.kind === \"PARAM_NAMED\") {\n const name = token.value.toLowerCase();\n let slot = namedSlots.get(name);\n if (slot === undefined) {\n slot = nextSlot++;\n namedSlots.set(name, slot);\n named.push({ name, slot });\n }\n }\n }\n return { named, expectedCount: nextSlot - 1 };\n}\n\n/**\n * Bind named placeholders into an execution environment.\n * @internal\n */\nexport function bindNamedParameters(env: ExecutionEnv, sql: string, params: readonly BindValue[]): void {\n const plan = planNamedParameters(sql);\n for (const item of plan.named) {\n if (item.slot <= params.length) env.setNamed(item.name, params[item.slot - 1]);\n }\n}\n", "import { type Checkpoint, Timeline } from \"@crvouga/mockingbird-core\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { parseUnits } from \"../parser/index.ts\";\nimport {\n type Clock,\n type DatabaseOptions,\n DEFAULT_DATABASE_SEED,\n fixedClock,\n OsEntropy,\n Prng,\n type RandomMode,\n resolveClock,\n} from \"../runtime/index.ts\";\nimport { DatabaseState } from \"../storage/database-state.ts\";\nimport { TransactionManager } from \"../transactions/manager.ts\";\nimport type { BindValue, QueryRow } from \"../types/value.ts\";\nimport { captureSnapshot, type Snapshot } from \"./snapshot.ts\";\nimport { Statement } from \"./statement.ts\";\n\nconst ADOPT = Symbol(\"sqlite-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}\n\n/** A timeline checkpoint without its retained snapshot value. */\nexport interface HistoryCheckpoint {\n id: string;\n branch: string;\n parent: string | null;\n at: number;\n}\n\n/** Branch heads and checkpoints owned by the shared Timeline. */\nexport interface DatabaseHistory {\n readonly size: number;\n head(branch?: string): HistoryCheckpoint | undefined;\n branches(): Readonly<Record<string, string>>;\n checkpoints(): readonly HistoryCheckpoint[];\n}\n\n/** Additive time-travel controls for read APIs. */\nexport interface QueryOptions {\n /**\n * Execute against this immutable snapshot, or a timeline checkpoint id,\n * instead of the live database.\n */\n at?: Snapshot | string;\n}\n\n/**\n * Pure TypeScript in-memory SQLite database.\n *\n * Deterministic by default: `random()` / `randomblob()` use a seeded PRNG\n * (`seed` defaults to `1`) and `date('now')` / friends use a fixed clock\n * (`2000-01-01T00:00:00.000Z`). Pass `{ random: \"os\" }` and `{ now: \"system\" }`\n * for SQLite-like CSPRNG and wall-clock `'now'`. There is no filesystem or WASM.\n *\n * @example\n * ```ts\n * import { Database } from \"@crvouga/mockingbird-service-sqlite\";\n *\n * const db = new Database();\n * db.exec(\"CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT NOT NULL)\");\n * db.prepare(\"INSERT INTO users (name) VALUES (?)\").run(\"Alice\");\n * const users = db.query<{ id: number; name: string }>(\"SELECT * FROM users\");\n * ```\n */\nexport class Database {\n /** @internal Engine catalog, tables, and mutation counters. */\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()` / `randomblob()`. */\n readonly randomMode: RandomMode;\n /**\n * When true, `'now'` follows the wall clock and is not frozen by {@link Snapshot.open}.\n * @internal\n */\n readonly systemClock: boolean;\n /**\n * PRNG backing `random()` / `randomblob()` and related builtins.\n * Prefer passing `seed` / `random` to the constructor.\n * @internal\n */\n readonly prng: Prng;\n /**\n * Clock used by `date('now')` / `datetime('now')` / `CURRENT_TIMESTAMP`.\n * Prefer passing `now` to the constructor.\n * @internal\n */\n now: Clock;\n /** @internal Transaction / savepoint manager. */\n readonly transactions: TransactionManager;\n private closed = false;\n private transactionSequence = 0;\n /** Depth of active {@link transaction} callbacks (not SQL BEGIN). */\n private apiTransactionDepth = 0;\n /** @internal Shared checkpoint DAG. Omitted from published declarations. */\n readonly timeline: Timeline<Snapshot>;\n private historyBranch = \"main\";\n private originId = \"\";\n\n /**\n * Create an empty in-memory database.\n *\n * @param options - Determinism knobs. See {@link DatabaseOptions}.\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.prng = options.prng;\n this.now = options.now;\n this.state = options.state;\n this.transactions = new TransactionManager(this.state, this.prng);\n } else {\n this.seed = options.seed ?? DEFAULT_DATABASE_SEED;\n this.randomMode = options.random ?? \"deterministic\";\n this.systemClock = options.now === \"system\";\n this.prng = this.randomMode === \"os\" ? new OsEntropy() : new Prng(this.seed);\n this.now = resolveClock(options.now);\n this.state = new DatabaseState();\n this.transactions = new TransactionManager(this.state, this.prng);\n }\n this.timeline = new Timeline<Snapshot>({\n now: () => this.now().getTime(),\n ...(options.maxCheckpoints !== undefined ? { maxCheckpoints: options.maxCheckpoints } : {}),\n });\n const origin = this.timeline.commit(this.captureLive());\n this.originId = origin.id;\n this.timeline.retain(origin.id);\n }\n\n /**\n * Execute SQL for its side effects (DDL/DML). Multiple statements are allowed.\n *\n * Does not accept bind parameters \u2014 use {@link prepare} or {@link query}.\n *\n * @param sql - SQL to run (semicolon-separated statements are ok).\n * @throws {SqliteError} If the database is closed, extra arguments are passed, or the SQL fails.\n */\n exec(sql: string): void {\n this.assertOpen();\n // Runtime guard: TypeScript rejects a second argument; JS callers must still get misuse.\n // biome-ignore lint/complexity/noArguments: intentional arity check for the frozen exec(sql) signature\n if (arguments.length > 1) {\n throw new SqliteError(\"exec() does not accept parameters; use prepare() or query()\", \"misuse\");\n }\n Statement.createFromSql(this, sql).run();\n }\n\n /**\n * Execute a single-statement query and return all rows as objects keyed by column name.\n *\n * @typeParam T - Row shape. Defaults to {@link QueryRow}.\n * @param sql - A single SQL statement (trailing `;` is fine).\n * @param params - Bound parameters for `?` / `:name` placeholders.\n * @returns All result rows.\n * @throws {SqliteError} If the database is closed, `sql` is not a single statement, or execution fails.\n */\n query<T = QueryRow>(sql: string, params: readonly BindValue[] = [], options: QueryOptions = {}): T[] {\n this.assertOpen();\n const at = options.at;\n if (typeof at === \"string\") {\n try {\n return this.timeline.get(at).value.open().query<T>(sql, params);\n } catch (error) {\n this.historyError(error);\n }\n }\n if (at) return at.open().query<T>(sql, params);\n return this.prepareSingle(sql).all<T>(...params);\n }\n\n /**\n * Compile a single SQL statement into a reusable {@link Statement}.\n *\n * @param sql - A single SQL statement (trailing `;` is fine). Multi-statement scripts are rejected.\n * @throws {SqliteError} If the database is closed or `sql` cannot be prepared as one statement.\n */\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` throws.\n *\n * Nested calls use SAVEPOINTs so an inner failure does not abort the outer\n * transaction. Calling {@link close} from inside `fn` throws `misuse`.\n *\n * @param fn - Work to run while the transaction is open.\n * @returns The value returned by `fn`.\n * @throws {SqliteError} If the database is closed. Re-throws whatever `fn` throws after rollback.\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.release(name);\n return value;\n } catch (error) {\n this.transactions.rollback(name);\n this.transactions.release(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 *\n * Does not encode SQLM bytes. Call {@link Snapshot.encode} to persist, or\n * {@link Snapshot.open} for a copy-on-write fork.\n *\n * @throws {SqliteError} If the database is closed or a transaction is open.\n */\n snapshot(): Snapshot {\n const point = this.record(this.historyBranch);\n return this.timeline.get(point.id).value;\n }\n\n /** Alias for {@link snapshot}, naming the value as a timeline checkpoint. */\n checkpoint(): Snapshot {\n return this.snapshot();\n }\n\n /**\n * Commit the live state onto `branch` (default: the branch this database follows).\n * Does not switch the live database. Illegal inside a transaction.\n */\n record(branch = this.historyBranch): HistoryCheckpoint {\n this.assertOpen();\n if (this.transactions.inTransaction) {\n throw new SqliteError(\"cannot snapshot during a transaction\", \"transaction\");\n }\n try {\n return project(this.timeline.commit(this.captureLive(), { branch }));\n } catch (error) {\n this.historyError(error);\n }\n }\n\n /** Point `name` at a checkpoint without copying rows or switching the live database. */\n fork(name: string, at?: string): HistoryCheckpoint {\n this.assertOpen();\n try {\n const point = this.timeline.fork(name, at !== undefined ? { from: at } : {});\n if (!point) throw new SqliteError(\"no checkpoint to fork from\", \"misuse\");\n return project(point);\n } catch (error) {\n if (error instanceof SqliteError) throw error;\n this.historyError(error);\n }\n }\n\n /** Move `branch` to `id` and install that checkpoint as the live database. */\n checkout(id: string, branch = this.historyBranch): HistoryCheckpoint {\n this.assertOpen();\n if (this.transactions.inTransaction) {\n throw new SqliteError(\"cannot checkout during a transaction\", \"transaction\");\n }\n try {\n const point = this.timeline.checkout(branch, id);\n this.historyBranch = branch;\n this.install(point.value);\n return project(point);\n } catch (error) {\n this.historyError(error);\n }\n }\n\n /** Return the live database to the origin checkpoint on `main`. */\n reset(): HistoryCheckpoint {\n return this.checkout(this.originId, \"main\");\n }\n\n /** Checkpoint ids and branch heads. Values stay inside the timeline. */\n get history(): DatabaseHistory {\n const timeline = this.timeline;\n return {\n get size() {\n return timeline.size;\n },\n head(branch?: string) {\n const point = timeline.head(branch);\n return point ? project(point) : undefined;\n },\n branches() {\n return timeline.branches();\n },\n checkpoints() {\n return timeline.checkpoints().map(project);\n },\n };\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 /**\n * Close the database. Further SQL throws {@link SqliteError}. Idempotent.\n *\n * Rolls back an open SQL transaction, if any. Throws if called from inside\n * a {@link transaction} callback.\n */\n close(): void {\n if (this.closed) return;\n if (this.apiTransactionDepth > 0) {\n throw new SqliteError(\"cannot close database inside transaction()\", \"misuse\");\n }\n if (this.transactions.inTransaction) this.transactions.rollback();\n this.closed = true;\n }\n\n /**\n * Rows changed by the most recent INSERT / UPDATE / DELETE (SQLite `changes()`).\n *\n * @throws {SqliteError} If the database is closed.\n */\n get changes(): number {\n this.assertOpen();\n return this.state.changes;\n }\n\n /**\n * Rowid of the most recent INSERT (SQLite `last_insert_rowid()`).\n *\n * @throws {SqliteError} If the database is closed.\n */\n get lastInsertRowid(): number | bigint {\n this.assertOpen();\n return this.state.lastInsertRowid;\n }\n\n /**\n * Cumulative rows changed by INSERT / UPDATE / DELETE (SQLite `total_changes()`).\n *\n * @throws {SqliteError} If the database is closed.\n */\n get totalChanges(): number {\n this.assertOpen();\n return this.state.totalChanges;\n }\n\n /**\n * Throw if {@link close} has already been called.\n * @internal\n * @throws {SqliteError} If the database is closed.\n */\n assertOpen(): void {\n if (this.closed) throw new SqliteError(\"Database is closed\", \"misuse\");\n }\n\n private historyError(error: unknown): never {\n const message = error instanceof Error ? error.message : String(error);\n throw new SqliteError(message, \"misuse\");\n }\n\n private captureLive(): Snapshot {\n return captureSnapshot(this.state, this.prng, this.now, this.seed, this.randomMode, this.systemClock);\n }\n\n private install(snapshot: Snapshot): void {\n this.state.replaceWith(snapshot.state.cloneShallow(), { adopt: true });\n this.prng.setState(snapshot.prngState);\n if (!this.systemClock) this.now = fixedClock(new Date(snapshot.nowMs));\n }\n\n private prepareSingle(sql: string): Statement {\n const units = parseUnits(sql);\n if (units.length === 0) {\n throw new SqliteError(\"empty statement\", \"misuse\");\n }\n if (units.length > 1) {\n throw new SqliteError(\"query()/prepare() accept a single statement only; use exec() for scripts\", \"misuse\");\n }\n return Statement.create(\n this,\n sql,\n units.map((u) => u.statement),\n units.map((u) => u.sql),\n );\n }\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\nfunction isAdopted(value: object): value is AdoptedDatabase {\n return ADOPT in value;\n}\n\nfunction project(point: Checkpoint<Snapshot>): HistoryCheckpoint {\n return { id: point.id, branch: point.branch, parent: point.parent, at: point.at };\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\";\nexport type { DatabaseOptions };\n", "#!/usr/bin/env node\n/**\n * `mockingbird-sqlite serve`: start the length-prefixed JSON socket (see ./index.ts).\n *\n * mockingbird-sqlite serve\n * mockingbird-sqlite serve sqlite://127.0.0.1:0/app\n *\n * The stock `sqlite3` CLI cannot attach to this socket. Use `connect()` from\n * `@crvouga/mockingbird-service-sqlite/socket`.\n */\nimport { type SocketServeOptions, serve } from \"./index.ts\";\n\nconst usage = `mockingbird-sqlite serve [sqlite://URI] [--port <n>] [--host <h>]\n\nThe stock sqlite3 CLI cannot attach. Use connect() from @crvouga/mockingbird-service-sqlite/socket.`;\n\nconst args = process.argv.slice(2);\nif (args[0] !== \"serve\") {\n console.error(usage);\n process.exit(args[0] === \"--help\" || args[0] === \"-h\" ? 0 : 2);\n}\n\nconst options: SocketServeOptions = {};\nfor (let i = 1; i < args.length; i++) {\n const flag = args[i];\n if (flag?.startsWith(\"sqlite://\")) {\n options.url = flag;\n continue;\n }\n const value = args[i + 1];\n const need = (): string => {\n if (value === undefined) {\n console.error(`${flag} requires a value`);\n process.exit(2);\n }\n i++;\n return value;\n };\n switch (flag) {\n case \"--port\":\n options.port = Number(need());\n break;\n case \"--host\":\n options.host = need();\n break;\n default:\n console.error(`unknown option ${flag}\\n${usage}`);\n process.exit(2);\n }\n}\n\nconst server = await serve(options);\nconsole.log(`mockingbird-sqlite listening on ${server.url}`);\nconsole.error(\"sqlite3 cannot attach to this socket; use @crvouga/mockingbird-service-sqlite/socket connect()\");\n\nconst stop = async () => {\n await server.close();\n process.exit(0);\n};\nprocess.on(\"SIGINT\", stop);\nprocess.on(\"SIGTERM\", stop);\n"],
|
|
5
|
+
"mappings": "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ACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,sBAAsB,oBAAI,IAAI;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EA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",
|
|
6
|
+
"names": ["options", "num", "right", "alias", "args", "e", "left", "right", "text", "a", "b", "s", "text", "text", "run", "rowid", "colDef", "args", "options", "sameRowid", "rowid", "candidate", "options", "snapshot", "rank", "canonicalRowid", "pack", "pad", "asRowid", "pack", "text", "options", "systemClock", "args", "args", "date", "args", "options", "text", "pad", "text", "key", "digits", "text", "walk", "args", "requireArgs", "args", "m", "e", "n", "mantissa", "exponent", "text", "args", "pad", "requireArgs", "hay", "needle", "cell", "row", "left", "args", "options", "COMPILE_OPTIONS", "args", "args", "args", "stop", "prefix", "value", "full", "rowids", "next", "compareRowids", "compareNames", "isRowidName", "key", "executeSelect", "rowsEqual", "result", "rightShape", "nullRight", "right", "args", "start", "end", "framed", "rank", "executeSelect", "isRowidName", "executeSelect", "run", "columnNames", "sourceRows", "changes", "alias", "candidates", "selected", "num", "args", "executeSelect", "db", "index", "options", "options", "options", "server"]
|
|
7
|
+
}
|