@crvouga/sqlite-mem 1.4.0 → 1.5.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/errors/index.ts", "../src/types/value.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/functions/json.ts", "../src/functions/aggregate.ts", "../src/functions/datetime.ts", "../src/functions/extensions.ts", "../src/functions/math.ts", "../src/expressions/like.ts", "../src/functions/scalar.ts", "../src/functions/registry.ts", "../src/types/collation.ts", "../src/expressions/eval.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/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/storage/row.ts", "../src/storage/table.ts", "../src/storage/database-state.ts", "../src/serialization/codec.ts"],
4
- "sourcesContent": ["/** 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/sqlite-mem\";\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 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 if (value instanceof Uint8Array) return utf8Decode(value);\n if (value instanceof SqlJsonText) return value.value;\n if (typeof value === \"string\") return value;\n if (value instanceof SqlReal) return String(value.value);\n return String(value);\n case \"INTEGER\": {\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 const n = coerceToNumber(value);\n return n === null ? value : asSqlReal(n);\n }\n case \"NUMERIC\": {\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 if (typeof value === \"number\") return canonicalizeNumber(value);\n return value;\n }\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/** 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). */\nexport function utf8Encode(s: string): Uint8Array {\n return new TextEncoder().encode(s);\n}\n\n/** UTF-8 decode `b` (SQLite BLOB \u2192 TEXT). */\nexport function utf8Decode(b: Uint8Array): string {\n return new TextDecoder().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 * Non-NULL values are cast to numeric; non-numeric text/blob become 0 (false).\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 n = coerceToNumber(v instanceof SqlJsonText ? v.value : v);\n return n !== null && n !== 0 && !Number.isNaN(n);\n }\n return false;\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 { 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 { 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 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 source = seconds / 86400 + JULIAN_UNIX_EPOCH;\n modifiers = modifiers.slice(1);\n } else if (typeof modifiers[0] === \"string\" && modifiers[0].trim().toLowerCase() === \"auto\") {\n const number = coerceToNumber(source);\n if (number === null) return null;\n // SQLite: 0..5373484.499999 \u2192 julian day; otherwise unix timestamp.\n source = number >= 0 && number < 5373484.5 ? number : number / 86400 + JULIAN_UNIX_EPOCH;\n modifiers = modifiers.slice(1);\n }\n let date = parseDate(source, context);\n if (!date) return null;\n const flags = { subsec: false };\n for (const modifier of modifiers) {\n if (typeof modifier !== \"string\") return null;\n date = applyModifier(date, modifier, flags);\n if (!date) return null;\n }\n return { date, subsec: flags.subsec };\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 { 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(\n table: import(\"../vtable/fts5.ts\").Fts5VirtualTable,\n context: FunctionContext,\n colIndex: number,\n): 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 { 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 {\n affinityFromTypeName,\n applyAffinity,\n asSqlReal,\n coerceToNumber,\n compareSql,\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\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\") return text(value);\n if (affinity === \"INTEGER\") return Math.trunc(coerceToNumber(value) ?? 0);\n if (affinity === \"REAL\") return asSqlReal(coerceToNumber(value) ?? 0);\n return applyAffinity(value, \"NUMERIC\");\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 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 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 { 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 { 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 coerceToNumber,\n compareSql,\n isTruthySql,\n type SqlValue,\n storageClassOf,\n toInteger,\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 coerceToNumber(value) ?? 0;\n}\n\nfunction asNumber(value: number): number {\n return canonicalizeNumber(value);\n}\n\nfunction integerValue(value: SqlValue): bigint {\n const integer = toInteger(value);\n return typeof integer === \"bigint\" ? integer : BigInt(integer ?? 0);\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 return asNumber(numberValue(left) + numberValue(right));\n case \"-\":\n return asNumber(numberValue(left) - numberValue(right));\n case \"*\":\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 return remainder <= BigInt(Number.MAX_SAFE_INTEGER) && remainder >= BigInt(Number.MIN_SAFE_INTEGER)\n ? Number(remainder)\n : 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\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\nfunction 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 === \"+\") return asNumber(numberValue(value));\n if (expr.op === \"-\") return asNumber(-numberValue(value));\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 { SqliteError } from \"../errors/index.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 | \"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 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 = Number(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 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 \"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 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 const alias = this.optionalAlias() ?? (this.syntaxError(\"subquery in FROM requires an alias\") as never);\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 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 return { type: \"delete\", with: withClause, 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 } = this.parseFkActions();\n const { deferrable, initiallyDeferred } = this.parseDeferrable();\n return { type: \"references\", table, columns, onDelete, onUpdate, 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 } = 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 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 } {\n let onDelete: FkAction | null = null;\n let onUpdate: FkAction | null = null;\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 }\n return { onDelete, onUpdate };\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 = this.parseUnaryExpr();\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 parseUnaryExpr(): Expr {\n if (this.match(\"NOT\")) {\n const operand = this.parseUnaryExpr();\n if (operand.type === \"exists\") {\n return { ...operand, not: !operand.not };\n }\n return { type: \"unary\", op: \"NOT\", expr: operand };\n }\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.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(\"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\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", "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 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 const key = serializeIndexKey(values);\n if (key === null) return;\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 = serializeIndexKey(values);\n if (key === null) return;\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 const key = serializeIndexKey(values);\n if (key === null) return [];\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 const prefix = serializeIndexKey(values);\n if (prefix === null) return [];\n const exact = this.entries.get(prefix);\n const needle = `${prefix}|`;\n const rowids: Rowid[] = exact ? [...exact] : [];\n for (const [key, ids] of this.entries) {\n if (key.startsWith(needle)) rowids.push(...ids);\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 rowids: Rowid[] = [];\n const keys = this.orderedKeys();\n for (const key of keys) {\n const values = this.keyValues.get(key);\n if (!values || values[0] === undefined) 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 = serializeIndexKey(values);\n if (key === null) return false;\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 return new IndexStore(this.name, this.entries, this.keyValues);\n }\n\n freeze(): void {\n this.frozen = true;\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 cmp = compareSql(left[i] ?? null, right[i] ?? null);\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 }\n}\n\nexport function serializeIndexKey(values: readonly SqlValue[]): string | null {\n if (values.some((value) => value === null)) return null;\n return (values as readonly Exclude<SqlValue, null>[])\n .map(serializeValue)\n .map((part) => `${part.length}:${part}`)\n .join(\"|\");\n}\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 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, storageClassOf, type SqlValue, 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 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 // Reuse FTS5 parser with minor differences: column:term form already handled.\n // FTS3 uses OR/AND/NOT/NEAR similarly when parenthesis enabled.\n try {\n return parseFts5Query(input);\n } catch {\n // Fallback: treat as AND of terms (legacy)\n const terms = input\n .split(/\\s+/)\n .filter(Boolean)\n .filter((t) => !/^(AND|OR|NOT|NEAR)$/i.test(t));\n if (terms.length === 0) return { type: \"true\" };\n const nodes: FtsQueryNode[] = terms.map((t) => {\n const prefix = t.endsWith(\"*\");\n return { type: \"term\" as const, value: prefix ? t.slice(0, -1) : t, prefix, column: null, columns: null };\n });\n return nodes.length === 1 ? nodes[0]! : { type: \"and\", children: nodes };\n }\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 extraToken = new Set(config.tokenchars ?? \"\");\n const extraSep = new Set(config.separators ?? \"\");\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 && !isAsciiTokenChar(text[i]!, extraToken, extraSep)) i++;\n if (i >= text.length) break;\n const startUnit = i;\n while (i < text.length && isAsciiTokenChar(text[i]!, extraToken, extraSep)) i++;\n const raw = text.slice(startUnit, i);\n const term = raw.toLowerCase();\n if (term.length === 0) continue;\n tokens.push({\n term,\n start: utf8Offset(text, startUnit),\n length: utf8Length(raw),\n position: pos++,\n startUnit,\n endUnit: i,\n });\n }\n return tokens;\n };\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 isAsciiTokenChar(ch: string, extraToken: Set<string>, extraSep: Set<string>): boolean {\n if (extraSep.has(ch)) return false;\n if (extraToken.has(ch)) return true;\n const code = ch.charCodeAt(0);\n if (code > 127) return false;\n return (code >= 48 && code <= 57) || (code >= 65 && code <= 90) || (code >= 97 && code <= 122);\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 type { SqlValue } from \"../types/value.ts\";\nimport { cloneSqlValue } from \"../types/value.ts\";\n\nexport type Rowid = number | bigint;\n\nexport interface Row {\n rowid: Rowid;\n values: Map<string, SqlValue>;\n}\n\nexport type RowValues = Map<string, SqlValue> | ReadonlyMap<string, SqlValue> | Record<string, SqlValue>;\n\nexport function normalizeColumnName(name: string): string {\n return name.toLowerCase();\n}\n\nexport function rowValues(values: RowValues): 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 Map<string, SqlValue>();\n for (const [name, value] of row.values) {\n values.set(name, cloneSqlValue(value));\n }\n return { rowid: row.rowid, values };\n}\n", "import type { Expr, TableConstraint } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { serializeIndexKey } from \"../indexes/index.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 { Row, Rowid, RowValues } from \"./row.ts\";\nimport { cloneRow, 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 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\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 }\n\n integerPkColumn(): ColumnInfo | undefined {\n return this.integerPrimaryKeyAlias();\n }\n\n get(rowid: Rowid): Row | undefined {\n try {\n return this.rows.get(canonicalRowid(rowid));\n } catch {\n return undefined;\n }\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 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.rows.get(rowid);\n if (row) rows.push(row);\n }\n return rows;\n }\n\n ensureEqualityHash(columnLower: string): boolean {\n if (this.frozen || this.rows.size < 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 for (const row of this.rows.values()) {\n const key = serializeIndexKey([normalizeForCollation(row.values.get(columnLower) ?? null, 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([\n normalizeForCollation(row.values.get(columnLower) ?? null, column?.collate ?? \"BINARY\"),\n ]);\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([\n normalizeForCollation(row.values.get(columnLower) ?? null, column?.collate ?? \"BINARY\"),\n ]);\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 = options?.prepared\n ? supplied.values instanceof Map\n ? supplied.values\n : rowValues(supplied.values)\n : this.prepareValues(supplied.values);\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 = values.get(normalizeColumnName(alias.name)) ?? null;\n if (rowid === undefined && value !== null) rowid = asRowid(value, alias.name);\n }\n rowid = canonicalRowid(rowid ?? this.allocateRowid());\n\n if (this.rows.has(rowid)) {\n throw new SqliteError(\n `UNIQUE constraint failed: ${this.name}.rowid`,\n \"constraint_primary\",\n \"SQLITE_CONSTRAINT_PRIMARYKEY\",\n );\n }\n if (alias) values.set(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 = new Map(existing.values);\n const incoming = rowValues(updates);\n for (const [name, value] of incoming) {\n const column = this.column(name);\n values.set(normalizeColumnName(column.name), applyAffinity(cloneSqlValue(value), column.affinity));\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 targetKey = alias ? asRowid(values.get(normalizeColumnName(alias.name)) ?? null, alias.name) : key;\n if (targetKey !== key && this.rows.has(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) values.set(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.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 for (const [rowid, row] of this.rows) copy.rows.set(rowid, cloneRow(row));\n for (const [clusterKey, row] of this.clusteredRows) copy.clusteredRows.set(clusterKey, cloneRow(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 }\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 for (const row of this.rows.values()) {\n this.clusteredRows.set(this.makeClusterKey(row.values), row);\n }\n this.invalidateScan();\n this.clearEqualityHashes();\n }\n\n private prepareValues(input: RowValues): Map<string, SqlValue> {\n const supplied = rowValues(input);\n for (const name of supplied.keys()) this.column(name);\n\n const result = new Map<string, SqlValue>();\n for (const column of this.columns) {\n const key = normalizeColumnName(column.name);\n result.set(\n key,\n this.strict\n ? applyStrictValue(cloneSqlValue(supplied.get(key) ?? null), column.typeName ?? \"\", this.name, column.name)\n : applyAffinity(cloneSqlValue(supplied.get(key) ?? null), column.affinity),\n );\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 (const column of this.columns) {\n const value = row.values.get(normalizeColumnName(column.name)) ?? 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 // Prefer O(1)/O(k) enforcement via IndexStore in the DML path (autoindexes).\n // Keep a scan only when this table has no indexes registered yet.\n if (this.indexes.length === 0) {\n for (const names of uniqueSets) {\n const values = names.map((name) => row.values.get(normalizeColumnName(name)) ?? null);\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 = other.values.get(normalizeColumnName(names[index]!)) ?? null;\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 // Still guard INTEGER PRIMARY KEY collisions via the rowid map in insert/update.\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: Map<string, SqlValue>): string {\n return this.primaryKeyColumns()\n .map((column) => {\n const value = values.get(normalizeColumnName(column.name)) ?? 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 leftValue = left.values.get(normalizeColumnName(column.name)) ?? null;\n const rightValue = right.values.get(normalizeColumnName(column.name)) ?? null;\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.rows.keys()) {\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.rows.has(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 !(input instanceof Map) && \"values\" in input;\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 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 type { Expr, IndexedColumn, TableConstraint } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { defaultFunctionRegistry } from \"../functions/registry.ts\";\nimport { IndexStore } from \"../indexes/index.ts\";\nimport { DatabaseState, type IndexInfo, type ViewInfo } from \"../storage/database-state.ts\";\nimport type { Rowid } from \"../storage/row.ts\";\nimport { type ColumnInfo, Table } from \"../storage/table.ts\";\nimport { normalizeForCollation } from \"../types/collation.ts\";\nimport { asSqlReal, isTruthySql, SqlJsonText, SqlReal, type SqlValue, utf8Decode, utf8Encode } from \"../types/value.ts\";\n\nconst MAGIC = utf8Encode(\"SQLM\");\n/** Snapshot format: v1 = schema/rows only; v2 appends PRNG state + clock ms. */\nconst VERSION = 2;\nconst VERSION_V1 = 1;\n\n/** PRNG + clock captured alongside schema/rows in a v2 snapshot. */\nexport interface SnapshotRuntime {\n /** Unsigned 64-bit {@link Prng} state. */\n prngState: bigint;\n /** Clock instant as milliseconds since Unix epoch. */\n nowMs: number;\n}\n\n/** Result of {@link decodeDatabaseState}. */\nexport interface DecodedSnapshot {\n /** Restored catalog and table data. */\n state: DatabaseState;\n /** Present for v2 snapshots; `null` for v1 (schema/rows only). */\n runtime: SnapshotRuntime | null;\n}\n\nclass Writer {\n private buf = new Uint8Array(1024);\n private len = 0;\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 const next = new Uint8Array(cap);\n next.set(this.buf.subarray(0, this.len));\n this.buf = next;\n }\n\n u8(value: number): void {\n this.ensure(1);\n this.buf[this.len++] = value & 0xff;\n }\n u32(value: number): void {\n this.ensure(4);\n this.buf[this.len++] = value & 0xff;\n this.buf[this.len++] = (value >>> 8) & 0xff;\n this.buf[this.len++] = (value >>> 16) & 0xff;\n this.buf[this.len++] = (value >>> 24) & 0xff;\n }\n u64(value: bigint): void {\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setBigUint64(0, BigInt.asUintN(64, value), true);\n this.raw(bytes);\n }\n i64(value: bigint): void {\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setBigInt64(0, value, true);\n this.raw(bytes);\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 text(value: string): void {\n const bytes = utf8Encode(value);\n this.u32(bytes.length);\n this.raw(bytes);\n }\n json(value: unknown): void {\n this.text(JSON.stringify(value, jsonReplacer));\n }\n value(value: SqlValue): void {\n if (value === null) {\n this.u8(0);\n return;\n }\n if (value instanceof SqlReal) {\n this.u8(2);\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setFloat64(0, value.value, true);\n this.raw(bytes);\n return;\n }\n if (typeof value === \"bigint\" || (typeof value === \"number\" && Number.isInteger(value))) {\n this.u8(1);\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setBigInt64(0, BigInt(value), true);\n this.raw(bytes);\n return;\n }\n if (typeof value === \"number\") {\n this.u8(2);\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setFloat64(0, value, true);\n this.raw(bytes);\n return;\n }\n if (typeof value === \"string\") {\n this.u8(3);\n this.text(value);\n return;\n }\n if (value instanceof SqlJsonText) {\n this.u8(3);\n this.text(value.value);\n return;\n }\n this.u8(4);\n this.u32(value.length);\n this.raw(value);\n }\n finish(): Uint8Array {\n // Avoid retaining unused capacity when the buffer grew past the payload.\n if (this.len === this.buf.length) return this.buf;\n return this.buf.slice(0, this.len);\n }\n}\n\nclass Reader {\n private offset = 0;\n constructor(private readonly bytes: Uint8Array) {}\n u8(): number {\n if (this.offset >= this.bytes.length) this.fail();\n return this.bytes[this.offset++]!;\n }\n u32(): number {\n if (this.offset + 4 > this.bytes.length) this.fail();\n const value = new DataView(this.bytes.buffer, this.bytes.byteOffset + this.offset, 4).getUint32(0, true);\n this.offset += 4;\n return value;\n }\n u64(): bigint {\n const bytes = this.raw(8);\n return new DataView(bytes.buffer, bytes.byteOffset, 8).getBigUint64(0, true);\n }\n i64(): bigint {\n const bytes = this.raw(8);\n return new DataView(bytes.buffer, bytes.byteOffset, 8).getBigInt64(0, true);\n }\n raw(length: number): Uint8Array {\n if (length < 0 || this.offset + length > this.bytes.length) this.fail();\n const value = this.bytes.slice(this.offset, this.offset + length);\n this.offset += length;\n return value;\n }\n text(): string {\n return utf8Decode(this.raw(this.u32()));\n }\n json<T>(): T {\n return JSON.parse(this.text(), jsonReviver) as T;\n }\n value(): SqlValue {\n const tag = this.u8();\n if (tag === 0) return null;\n if (tag === 1) {\n const bytes = this.raw(8);\n const integer = new DataView(bytes.buffer, bytes.byteOffset, 8).getBigInt64(0, true);\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 bytes = this.raw(8);\n const value = new DataView(bytes.buffer, bytes.byteOffset, 8).getFloat64(0, true);\n // Preserve REAL storage class for integer-valued floats across snapshot restore.\n return Number.isInteger(value) && Number.isFinite(value) ? asSqlReal(value) : value;\n }\n if (tag === 3) return this.text();\n if (tag === 4) return this.raw(this.u32());\n this.fail();\n }\n remaining(): number {\n return this.bytes.length - this.offset;\n }\n done(): boolean {\n return this.offset === this.bytes.length;\n }\n private fail(): never {\n throw new SqliteError(\"invalid or truncated sqlite-mem snapshot\", \"other\");\n }\n}\n\ninterface TableMeta {\n name: string;\n columns: ColumnInfo[];\n constraints: TableConstraint[];\n indexes: string[];\n originalSql: string | null;\n withoutRowid?: boolean;\n strict?: boolean;\n}\n\ninterface IndexMeta {\n name: string;\n tableName: string;\n unique: boolean;\n columns: IndexedColumn[];\n where: Expr | null;\n originalSql: string | null;\n}\n\n/**\n * Encode catalog, rows, and runtime into a sqlite-mem snapshot blob (not a `.sqlite` file).\n *\n * Prefer {@link Database.snapshot} unless you are serializing engine state directly.\n */\nexport function encodeDatabaseState(state: DatabaseState, runtime: SnapshotRuntime): Uint8Array {\n const writer = new Writer();\n writer.raw(MAGIC);\n writer.u32(VERSION);\n writer.u8(state.foreignKeysEnabled ? 1 : 0);\n writer.u32(state.schemaVersion);\n writer.u32(state.changes);\n writer.u32(state.totalChanges);\n writer.value(state.lastInsertRowid);\n writer.u32(state.tables.size);\n for (const table of sortedValues(state.tables)) {\n writer.json({\n name: table.name,\n columns: table.columns,\n constraints: table.constraints,\n indexes: [...table.indexes].sort(compareNames),\n originalSql: table.originalSql,\n withoutRowid: table.withoutRowid || undefined,\n strict: table.strict || undefined,\n });\n writer.value(table.nextRowid);\n const rows = [...table.rows.values()].sort((a, b) => compareRowids(a.rowid, b.rowid));\n writer.u32(rows.length);\n for (const row of rows) {\n writer.value(row.rowid);\n writer.u32(table.columns.length);\n for (const column of table.columns) writer.value(row.values.get(column.name.toLowerCase()) ?? null);\n }\n }\n const views = sortedValues(state.views);\n writer.u32(views.length);\n for (const view of views) writer.json(view);\n const indexes = sortedValues(state.indexes);\n writer.u32(indexes.length);\n for (const index of indexes) {\n writer.json({\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 writer.u64(runtime.prngState);\n writer.i64(BigInt(Math.trunc(runtime.nowMs)));\n return writer.finish();\n}\n\n/**\n * Decode a blob from {@link encodeDatabaseState} / {@link Database.snapshot}.\n *\n * @throws {SqliteError} If the magic, version, or payload is invalid.\n */\nexport function decodeDatabaseState(snapshot: Uint8Array): DecodedSnapshot {\n const reader = new Reader(snapshot);\n const magic = reader.raw(4);\n if (!magic.every((byte, index) => byte === MAGIC[index]))\n throw new SqliteError(\"invalid sqlite-mem snapshot magic\", \"other\");\n const version = reader.u32();\n if (version !== VERSION && version !== VERSION_V1) {\n throw new SqliteError(`unsupported sqlite-mem snapshot version: ${version}`, \"snapshot_version\", \"SQLITE_FORMAT\");\n }\n const state = new DatabaseState();\n state.foreignKeysEnabled = reader.u8() !== 0;\n state.schemaVersion = reader.u32();\n state.changes = reader.u32();\n state.totalChanges = reader.u32();\n state.lastInsertRowid = asRowid(reader.value());\n const tableCount = reader.u32();\n for (let tableIndex = 0; tableIndex < tableCount; tableIndex++) {\n const meta = reader.json<TableMeta>();\n const table = new Table(meta.name, meta.columns, {\n constraints: meta.constraints,\n indexes: meta.indexes,\n originalSql: meta.originalSql,\n withoutRowid: meta.withoutRowid ?? false,\n strict: meta.strict ?? false,\n });\n table.nextRowid = asRowid(reader.value());\n const rowCount = reader.u32();\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n const rowid = asRowid(reader.value());\n const valueCount = reader.u32();\n if (valueCount !== table.columns.length) throw new SqliteError(\"snapshot row column count mismatch\", \"other\");\n const values = new Map<string, SqlValue>();\n for (const column of table.columns) values.set(column.name.toLowerCase(), reader.value());\n table.rows.set(rowid, { rowid, values });\n }\n table.rebuildClusteredRows();\n state.tables.set(table.name.toLowerCase(), table);\n }\n const viewCount = reader.u32();\n for (let index = 0; index < viewCount; index++) {\n const view = reader.json<ViewInfo>();\n state.views.set(view.name.toLowerCase(), view);\n }\n const indexCount = reader.u32();\n for (let indexPosition = 0; indexPosition < indexCount; indexPosition++) {\n const meta = reader.json<IndexMeta>();\n const info: IndexInfo = { ...meta, store: new IndexStore(meta.name) };\n state.indexes.set(info.name.toLowerCase(), info);\n const table = state.getTable(info.tableName);\n for (const row of table.scan()) {\n if (\n info.where &&\n isTruthySql(\n evalExpr(info.where, {\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 if (name.toLowerCase() === \"rowid\") return row.rowid;\n if (!row.values.has(name.toLowerCase()))\n throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n return row.values.get(name.toLowerCase()) ?? null;\n },\n getParameter: () => {\n throw new SqliteError(\"parameters are not allowed in index predicates\", \"misuse\");\n },\n }),\n ) !== true\n )\n continue;\n info.store.insert(\n info.columns.map((column) =>\n normalizeForCollation(row.values.get(column.name.toLowerCase()) ?? null, column.collate ?? \"BINARY\"),\n ),\n row.rowid,\n info.unique,\n );\n }\n }\n\n let runtime: SnapshotRuntime | null = null;\n if (version >= VERSION) {\n if (reader.remaining() < 16) throw new SqliteError(\"invalid or truncated sqlite-mem snapshot\", \"other\");\n runtime = {\n prngState: reader.u64(),\n nowMs: Number(reader.i64()),\n };\n }\n if (!reader.done()) throw new SqliteError(\"snapshot has trailing data\", \"other\");\n return { state, runtime };\n}\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\n/** Locale-independent UTF-16 code-unit order for stable snapshot encoding. */\nfunction compareNames(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction compareRowids(a: Rowid, b: Rowid): number {\n const left = typeof a === \"bigint\" ? a : BigInt(a);\n const right = typeof b === \"bigint\" ? b : BigInt(b);\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\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 jsonReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") return { $sqlm: \"bigint\", value: value.toString() };\n if (value instanceof Uint8Array) return { $sqlm: \"blob\", value: Array.from(value) };\n return value;\n}\n\nfunction jsonReviver(_key: string, value: unknown): unknown {\n if (!value || typeof value !== \"object\" || !(\"$sqlm\" in value)) return value;\n const tagged = value as { $sqlm: string; value: string | number[] };\n if (tagged.$sqlm === \"bigint\") return BigInt(tagged.value as string);\n if (tagged.$sqlm === \"blob\") return Uint8Array.from(tagged.value as number[]);\n return value;\n}\n"],
5
- "mappings": "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,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,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,OAAO;AAAA,EACX,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",
6
- "names": ["left", "right", "text", "pad", "text", "key", "digits", "text", "requireArgs", "m", "e", "n", "mantissa", "exponent", "text", "pad", "requireArgs", "hay", "needle", "left", "num", "right", "alias", "text", "s", "text", "text", "rowid", "colDef", "sameRowid", "rowid", "candidate", "sameRowid", "compareRowids", "asRowid"]
4
+ "sourcesContent": ["/** 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/sqlite-mem\";\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 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 if (value instanceof Uint8Array) return utf8Decode(value);\n if (value instanceof SqlJsonText) return value.value;\n if (typeof value === \"string\") return value;\n if (value instanceof SqlReal) return String(value.value);\n return String(value);\n case \"INTEGER\": {\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 const n = coerceToNumber(value);\n return n === null ? value : asSqlReal(n);\n }\n case \"NUMERIC\": {\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 if (typeof value === \"number\") return canonicalizeNumber(value);\n return value;\n }\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/** 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). */\nexport function utf8Encode(s: string): Uint8Array {\n return new TextEncoder().encode(s);\n}\n\n/** UTF-8 decode `b` (SQLite BLOB \u2192 TEXT). */\nexport function utf8Decode(b: Uint8Array): string {\n return new TextDecoder().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 * Non-NULL values are cast to numeric; non-numeric text/blob become 0 (false).\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 n = coerceToNumber(v instanceof SqlJsonText ? v.value : v);\n return n !== null && n !== 0 && !Number.isNaN(n);\n }\n return false;\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 { 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 { 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 { 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(\n table: import(\"../vtable/fts5.ts\").Fts5VirtualTable,\n context: FunctionContext,\n colIndex: number,\n): 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 { 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 {\n affinityFromTypeName,\n applyAffinity,\n asSqlReal,\n coerceToNumber,\n compareSql,\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\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\") return text(value);\n if (affinity === \"INTEGER\") return Math.trunc(coerceToNumber(value) ?? 0);\n if (affinity === \"REAL\") return asSqlReal(coerceToNumber(value) ?? 0);\n return applyAffinity(value, \"NUMERIC\");\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 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 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 { 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 { 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 coerceToNumber,\n compareSql,\n isTruthySql,\n type SqlValue,\n storageClassOf,\n toInteger,\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 coerceToNumber(value) ?? 0;\n}\n\nfunction asNumber(value: number): number {\n return canonicalizeNumber(value);\n}\n\nfunction integerValue(value: SqlValue): bigint {\n const integer = toInteger(value);\n return typeof integer === \"bigint\" ? integer : BigInt(integer ?? 0);\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 return asNumber(numberValue(left) + numberValue(right));\n case \"-\":\n return asNumber(numberValue(left) - numberValue(right));\n case \"*\":\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 return remainder <= BigInt(Number.MAX_SAFE_INTEGER) && remainder >= BigInt(Number.MIN_SAFE_INTEGER)\n ? Number(remainder)\n : 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\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\nfunction 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 === \"+\") return asNumber(numberValue(value));\n if (expr.op === \"-\") return asNumber(-numberValue(value));\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 { SqliteError } from \"../errors/index.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 | \"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 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 = Number(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 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 \"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 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 const alias = this.optionalAlias() ?? (this.syntaxError(\"subquery in FROM requires an alias\") as never);\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 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 return { type: \"delete\", with: withClause, 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 } = this.parseFkActions();\n const { deferrable, initiallyDeferred } = this.parseDeferrable();\n return { type: \"references\", table, columns, onDelete, onUpdate, 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 } = 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 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 } {\n let onDelete: FkAction | null = null;\n let onUpdate: FkAction | null = null;\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 }\n return { onDelete, onUpdate };\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 = this.parseUnaryExpr();\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 parseUnaryExpr(): Expr {\n if (this.match(\"NOT\")) {\n const operand = this.parseUnaryExpr();\n if (operand.type === \"exists\") {\n return { ...operand, not: !operand.not };\n }\n return { type: \"unary\", op: \"NOT\", expr: operand };\n }\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.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(\"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\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", "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 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 const key = serializeIndexKey(values);\n if (key === null) return;\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 = serializeIndexKey(values);\n if (key === null) return;\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 const key = serializeIndexKey(values);\n if (key === null) return [];\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 const prefix = serializeIndexKey(values);\n if (prefix === null) return [];\n const exact = this.entries.get(prefix);\n const needle = `${prefix}|`;\n const rowids: Rowid[] = exact ? [...exact] : [];\n for (const [key, ids] of this.entries) {\n if (key.startsWith(needle)) rowids.push(...ids);\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 rowids: Rowid[] = [];\n const keys = this.orderedKeys();\n for (const key of keys) {\n const values = this.keyValues.get(key);\n if (!values || values[0] === undefined) 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 = serializeIndexKey(values);\n if (key === null) return false;\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 return new IndexStore(this.name, this.entries, this.keyValues);\n }\n\n freeze(): void {\n this.frozen = true;\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 cmp = compareSql(left[i] ?? null, right[i] ?? null);\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 }\n}\n\nexport function serializeIndexKey(values: readonly SqlValue[]): string | null {\n if (values.some((value) => value === null)) return null;\n return (values as readonly Exclude<SqlValue, null>[])\n .map(serializeValue)\n .map((part) => `${part.length}:${part}`)\n .join(\"|\");\n}\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 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, storageClassOf, type SqlValue, 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 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 // Reuse FTS5 parser with minor differences: column:term form already handled.\n // FTS3 uses OR/AND/NOT/NEAR similarly when parenthesis enabled.\n try {\n return parseFts5Query(input);\n } catch {\n // Fallback: treat as AND of terms (legacy)\n const terms = input\n .split(/\\s+/)\n .filter(Boolean)\n .filter((t) => !/^(AND|OR|NOT|NEAR)$/i.test(t));\n if (terms.length === 0) return { type: \"true\" };\n const nodes: FtsQueryNode[] = terms.map((t) => {\n const prefix = t.endsWith(\"*\");\n return { type: \"term\" as const, value: prefix ? t.slice(0, -1) : t, prefix, column: null, columns: null };\n });\n return nodes.length === 1 ? nodes[0]! : { type: \"and\", children: nodes };\n }\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 extraToken = new Set(config.tokenchars ?? \"\");\n const extraSep = new Set(config.separators ?? \"\");\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 && !isAsciiTokenChar(text[i]!, extraToken, extraSep)) i++;\n if (i >= text.length) break;\n const startUnit = i;\n while (i < text.length && isAsciiTokenChar(text[i]!, extraToken, extraSep)) i++;\n const raw = text.slice(startUnit, i);\n const term = raw.toLowerCase();\n if (term.length === 0) continue;\n tokens.push({\n term,\n start: utf8Offset(text, startUnit),\n length: utf8Length(raw),\n position: pos++,\n startUnit,\n endUnit: i,\n });\n }\n return tokens;\n };\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 isAsciiTokenChar(ch: string, extraToken: Set<string>, extraSep: Set<string>): boolean {\n if (extraSep.has(ch)) return false;\n if (extraToken.has(ch)) return true;\n const code = ch.charCodeAt(0);\n if (code > 127) return false;\n return (code >= 48 && code <= 57) || (code >= 65 && code <= 90) || (code >= 97 && code <= 122);\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 type { SqlValue } from \"../types/value.ts\";\nimport { cloneSqlValue } from \"../types/value.ts\";\n\nexport type Rowid = number | bigint;\n\nexport interface Row {\n rowid: Rowid;\n values: Map<string, SqlValue>;\n}\n\nexport type RowValues = Map<string, SqlValue> | ReadonlyMap<string, SqlValue> | Record<string, SqlValue>;\n\nexport function normalizeColumnName(name: string): string {\n return name.toLowerCase();\n}\n\nexport function rowValues(values: RowValues): 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 Map<string, SqlValue>();\n for (const [name, value] of row.values) {\n values.set(name, cloneSqlValue(value));\n }\n return { rowid: row.rowid, values };\n}\n", "import type { Expr, TableConstraint } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { serializeIndexKey } from \"../indexes/index.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 { Row, Rowid, RowValues } from \"./row.ts\";\nimport { cloneRow, 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 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\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 }\n\n integerPkColumn(): ColumnInfo | undefined {\n return this.integerPrimaryKeyAlias();\n }\n\n get(rowid: Rowid): Row | undefined {\n try {\n return this.rows.get(canonicalRowid(rowid));\n } catch {\n return undefined;\n }\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 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.rows.get(rowid);\n if (row) rows.push(row);\n }\n return rows;\n }\n\n ensureEqualityHash(columnLower: string): boolean {\n if (this.frozen || this.rows.size < 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 for (const row of this.rows.values()) {\n const key = serializeIndexKey([normalizeForCollation(row.values.get(columnLower) ?? null, 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([\n normalizeForCollation(row.values.get(columnLower) ?? null, column?.collate ?? \"BINARY\"),\n ]);\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([\n normalizeForCollation(row.values.get(columnLower) ?? null, column?.collate ?? \"BINARY\"),\n ]);\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 = options?.prepared\n ? supplied.values instanceof Map\n ? supplied.values\n : rowValues(supplied.values)\n : this.prepareValues(supplied.values);\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 = values.get(normalizeColumnName(alias.name)) ?? null;\n if (rowid === undefined && value !== null) rowid = asRowid(value, alias.name);\n }\n rowid = canonicalRowid(rowid ?? this.allocateRowid());\n\n if (this.rows.has(rowid)) {\n throw new SqliteError(\n `UNIQUE constraint failed: ${this.name}.rowid`,\n \"constraint_primary\",\n \"SQLITE_CONSTRAINT_PRIMARYKEY\",\n );\n }\n if (alias) values.set(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 = new Map(existing.values);\n const incoming = rowValues(updates);\n for (const [name, value] of incoming) {\n const column = this.column(name);\n values.set(normalizeColumnName(column.name), applyAffinity(cloneSqlValue(value), column.affinity));\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 targetKey = alias ? asRowid(values.get(normalizeColumnName(alias.name)) ?? null, alias.name) : key;\n if (targetKey !== key && this.rows.has(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) values.set(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.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 for (const [rowid, row] of this.rows) copy.rows.set(rowid, cloneRow(row));\n for (const [clusterKey, row] of this.clusteredRows) copy.clusteredRows.set(clusterKey, cloneRow(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 }\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 for (const row of this.rows.values()) {\n this.clusteredRows.set(this.makeClusterKey(row.values), row);\n }\n this.invalidateScan();\n this.clearEqualityHashes();\n }\n\n private prepareValues(input: RowValues): Map<string, SqlValue> {\n const supplied = rowValues(input);\n for (const name of supplied.keys()) this.column(name);\n\n const result = new Map<string, SqlValue>();\n for (const column of this.columns) {\n const key = normalizeColumnName(column.name);\n result.set(\n key,\n this.strict\n ? applyStrictValue(cloneSqlValue(supplied.get(key) ?? null), column.typeName ?? \"\", this.name, column.name)\n : applyAffinity(cloneSqlValue(supplied.get(key) ?? null), column.affinity),\n );\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 (const column of this.columns) {\n const value = row.values.get(normalizeColumnName(column.name)) ?? 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 // Prefer O(1)/O(k) enforcement via IndexStore in the DML path (autoindexes).\n // Keep a scan only when this table has no indexes registered yet.\n if (this.indexes.length === 0) {\n for (const names of uniqueSets) {\n const values = names.map((name) => row.values.get(normalizeColumnName(name)) ?? null);\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 = other.values.get(normalizeColumnName(names[index]!)) ?? null;\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 // Still guard INTEGER PRIMARY KEY collisions via the rowid map in insert/update.\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: Map<string, SqlValue>): string {\n return this.primaryKeyColumns()\n .map((column) => {\n const value = values.get(normalizeColumnName(column.name)) ?? 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 leftValue = left.values.get(normalizeColumnName(column.name)) ?? null;\n const rightValue = right.values.get(normalizeColumnName(column.name)) ?? null;\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.rows.keys()) {\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.rows.has(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 !(input instanceof Map) && \"values\" in input;\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 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 type { Expr, IndexedColumn, TableConstraint } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { defaultFunctionRegistry } from \"../functions/registry.ts\";\nimport { IndexStore } from \"../indexes/index.ts\";\nimport { DatabaseState, type IndexInfo, type ViewInfo } from \"../storage/database-state.ts\";\nimport type { Rowid } from \"../storage/row.ts\";\nimport { type ColumnInfo, Table } from \"../storage/table.ts\";\nimport { normalizeForCollation } from \"../types/collation.ts\";\nimport { asSqlReal, isTruthySql, SqlJsonText, SqlReal, type SqlValue, utf8Decode, utf8Encode } from \"../types/value.ts\";\n\nconst MAGIC = utf8Encode(\"SQLM\");\n/** Snapshot format: v1 = schema/rows only; v2 appends PRNG state + clock ms. */\nconst VERSION = 2;\nconst VERSION_V1 = 1;\n\n/** PRNG + clock captured alongside schema/rows in a v2 snapshot. */\nexport interface SnapshotRuntime {\n /** Unsigned 64-bit {@link Prng} state. */\n prngState: bigint;\n /** Clock instant as milliseconds since Unix epoch. */\n nowMs: number;\n}\n\n/** Result of {@link decodeDatabaseState}. */\nexport interface DecodedSnapshot {\n /** Restored catalog and table data. */\n state: DatabaseState;\n /** Present for v2 snapshots; `null` for v1 (schema/rows only). */\n runtime: SnapshotRuntime | null;\n}\n\nclass Writer {\n private buf = new Uint8Array(1024);\n private len = 0;\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 const next = new Uint8Array(cap);\n next.set(this.buf.subarray(0, this.len));\n this.buf = next;\n }\n\n u8(value: number): void {\n this.ensure(1);\n this.buf[this.len++] = value & 0xff;\n }\n u32(value: number): void {\n this.ensure(4);\n this.buf[this.len++] = value & 0xff;\n this.buf[this.len++] = (value >>> 8) & 0xff;\n this.buf[this.len++] = (value >>> 16) & 0xff;\n this.buf[this.len++] = (value >>> 24) & 0xff;\n }\n u64(value: bigint): void {\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setBigUint64(0, BigInt.asUintN(64, value), true);\n this.raw(bytes);\n }\n i64(value: bigint): void {\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setBigInt64(0, value, true);\n this.raw(bytes);\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 text(value: string): void {\n const bytes = utf8Encode(value);\n this.u32(bytes.length);\n this.raw(bytes);\n }\n json(value: unknown): void {\n this.text(JSON.stringify(value, jsonReplacer));\n }\n value(value: SqlValue): void {\n if (value === null) {\n this.u8(0);\n return;\n }\n if (value instanceof SqlReal) {\n this.u8(2);\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setFloat64(0, value.value, true);\n this.raw(bytes);\n return;\n }\n if (typeof value === \"bigint\" || (typeof value === \"number\" && Number.isInteger(value))) {\n this.u8(1);\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setBigInt64(0, BigInt(value), true);\n this.raw(bytes);\n return;\n }\n if (typeof value === \"number\") {\n this.u8(2);\n const bytes = new Uint8Array(8);\n new DataView(bytes.buffer).setFloat64(0, value, true);\n this.raw(bytes);\n return;\n }\n if (typeof value === \"string\") {\n this.u8(3);\n this.text(value);\n return;\n }\n if (value instanceof SqlJsonText) {\n this.u8(3);\n this.text(value.value);\n return;\n }\n this.u8(4);\n this.u32(value.length);\n this.raw(value);\n }\n finish(): Uint8Array {\n // Avoid retaining unused capacity when the buffer grew past the payload.\n if (this.len === this.buf.length) return this.buf;\n return this.buf.slice(0, this.len);\n }\n}\n\nclass Reader {\n private offset = 0;\n constructor(private readonly bytes: Uint8Array) {}\n u8(): number {\n if (this.offset >= this.bytes.length) this.fail();\n return this.bytes[this.offset++]!;\n }\n u32(): number {\n if (this.offset + 4 > this.bytes.length) this.fail();\n const value = new DataView(this.bytes.buffer, this.bytes.byteOffset + this.offset, 4).getUint32(0, true);\n this.offset += 4;\n return value;\n }\n u64(): bigint {\n const bytes = this.raw(8);\n return new DataView(bytes.buffer, bytes.byteOffset, 8).getBigUint64(0, true);\n }\n i64(): bigint {\n const bytes = this.raw(8);\n return new DataView(bytes.buffer, bytes.byteOffset, 8).getBigInt64(0, true);\n }\n raw(length: number): Uint8Array {\n if (length < 0 || this.offset + length > this.bytes.length) this.fail();\n const value = this.bytes.slice(this.offset, this.offset + length);\n this.offset += length;\n return value;\n }\n text(): string {\n return utf8Decode(this.raw(this.u32()));\n }\n json<T>(): T {\n try {\n return JSON.parse(this.text(), jsonReviver) as T;\n } catch {\n throw new SqliteError(\"invalid or truncated sqlite-mem snapshot\", \"other\");\n }\n }\n value(): SqlValue {\n const tag = this.u8();\n if (tag === 0) return null;\n if (tag === 1) {\n const bytes = this.raw(8);\n const integer = new DataView(bytes.buffer, bytes.byteOffset, 8).getBigInt64(0, true);\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 bytes = this.raw(8);\n const value = new DataView(bytes.buffer, bytes.byteOffset, 8).getFloat64(0, true);\n // Preserve REAL storage class for integer-valued floats across snapshot restore.\n return Number.isInteger(value) && Number.isFinite(value) ? asSqlReal(value) : value;\n }\n if (tag === 3) return this.text();\n if (tag === 4) return this.raw(this.u32());\n this.fail();\n }\n remaining(): number {\n return this.bytes.length - this.offset;\n }\n done(): boolean {\n return this.offset === this.bytes.length;\n }\n private fail(): never {\n throw new SqliteError(\"invalid or truncated sqlite-mem snapshot\", \"other\");\n }\n}\n\ninterface TableMeta {\n name: string;\n columns: ColumnInfo[];\n constraints: TableConstraint[];\n indexes: string[];\n originalSql: string | null;\n withoutRowid?: boolean;\n strict?: boolean;\n}\n\ninterface IndexMeta {\n name: string;\n tableName: string;\n unique: boolean;\n columns: IndexedColumn[];\n where: Expr | null;\n originalSql: string | null;\n}\n\n/**\n * Encode catalog, rows, and runtime into a sqlite-mem snapshot blob (not a `.sqlite` file).\n *\n * Prefer {@link Database.snapshot} unless you are serializing engine state directly.\n */\nexport function encodeDatabaseState(state: DatabaseState, runtime: SnapshotRuntime): Uint8Array {\n const writer = new Writer();\n writer.raw(MAGIC);\n writer.u32(VERSION);\n writer.u8(state.foreignKeysEnabled ? 1 : 0);\n writer.u32(state.schemaVersion);\n writer.u32(state.changes);\n writer.u32(state.totalChanges);\n writer.value(state.lastInsertRowid);\n writer.u32(state.tables.size);\n for (const table of sortedValues(state.tables)) {\n writer.json({\n name: table.name,\n columns: table.columns,\n constraints: table.constraints,\n indexes: [...table.indexes].sort(compareNames),\n originalSql: table.originalSql,\n withoutRowid: table.withoutRowid || undefined,\n strict: table.strict || undefined,\n });\n writer.value(table.nextRowid);\n const rows = [...table.rows.values()].sort((a, b) => compareRowids(a.rowid, b.rowid));\n writer.u32(rows.length);\n for (const row of rows) {\n writer.value(row.rowid);\n writer.u32(table.columns.length);\n for (const column of table.columns) writer.value(row.values.get(column.name.toLowerCase()) ?? null);\n }\n }\n const views = sortedValues(state.views);\n writer.u32(views.length);\n for (const view of views) writer.json(view);\n const indexes = sortedValues(state.indexes);\n writer.u32(indexes.length);\n for (const index of indexes) {\n writer.json({\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 writer.u64(runtime.prngState);\n writer.i64(BigInt(Math.trunc(runtime.nowMs)));\n return writer.finish();\n}\n\n/**\n * Decode a blob from {@link encodeDatabaseState} / {@link Database.snapshot}.\n *\n * @throws {SqliteError} If the magic, version, or payload is invalid.\n */\nexport function decodeDatabaseState(snapshot: Uint8Array): DecodedSnapshot {\n try {\n return decodeDatabaseStateInner(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 decodeDatabaseStateInner(snapshot: Uint8Array): DecodedSnapshot {\n const reader = new Reader(snapshot);\n const magic = reader.raw(4);\n if (!magic.every((byte, index) => byte === MAGIC[index]))\n throw new SqliteError(\"invalid sqlite-mem snapshot magic\", \"other\");\n const version = reader.u32();\n if (version !== VERSION && version !== VERSION_V1) {\n throw new SqliteError(`unsupported sqlite-mem snapshot version: ${version}`, \"snapshot_version\", \"SQLITE_FORMAT\");\n }\n const state = new DatabaseState();\n state.foreignKeysEnabled = reader.u8() !== 0;\n state.schemaVersion = reader.u32();\n state.changes = reader.u32();\n state.totalChanges = reader.u32();\n state.lastInsertRowid = asRowid(reader.value());\n const tableCount = reader.u32();\n for (let tableIndex = 0; tableIndex < tableCount; tableIndex++) {\n const meta = reader.json<TableMeta>();\n const table = new Table(meta.name, meta.columns, {\n constraints: meta.constraints,\n indexes: meta.indexes,\n originalSql: meta.originalSql,\n withoutRowid: meta.withoutRowid ?? false,\n strict: meta.strict ?? false,\n });\n table.nextRowid = asRowid(reader.value());\n const rowCount = reader.u32();\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n const rowid = asRowid(reader.value());\n const valueCount = reader.u32();\n if (valueCount !== table.columns.length) throw new SqliteError(\"snapshot row column count mismatch\", \"other\");\n const values = new Map<string, SqlValue>();\n for (const column of table.columns) values.set(column.name.toLowerCase(), reader.value());\n table.rows.set(rowid, { rowid, values });\n }\n table.rebuildClusteredRows();\n state.tables.set(table.name.toLowerCase(), table);\n }\n const viewCount = reader.u32();\n for (let index = 0; index < viewCount; index++) {\n const view = reader.json<ViewInfo>();\n state.views.set(view.name.toLowerCase(), view);\n }\n const indexCount = reader.u32();\n for (let indexPosition = 0; indexPosition < indexCount; indexPosition++) {\n const meta = reader.json<IndexMeta>();\n const info: IndexInfo = { ...meta, store: new IndexStore(meta.name) };\n state.indexes.set(info.name.toLowerCase(), info);\n const table = state.getTable(info.tableName);\n for (const row of table.scan()) {\n if (\n info.where &&\n isTruthySql(\n evalExpr(info.where, {\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 if (name.toLowerCase() === \"rowid\") return row.rowid;\n if (!row.values.has(name.toLowerCase()))\n throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n return row.values.get(name.toLowerCase()) ?? null;\n },\n getParameter: () => {\n throw new SqliteError(\"parameters are not allowed in index predicates\", \"misuse\");\n },\n }),\n ) !== true\n )\n continue;\n info.store.insert(\n info.columns.map((column) =>\n normalizeForCollation(row.values.get(column.name.toLowerCase()) ?? null, column.collate ?? \"BINARY\"),\n ),\n row.rowid,\n info.unique,\n );\n }\n }\n\n let runtime: SnapshotRuntime | null = null;\n if (version >= VERSION) {\n if (reader.remaining() < 16) throw new SqliteError(\"invalid or truncated sqlite-mem snapshot\", \"other\");\n runtime = {\n prngState: reader.u64(),\n nowMs: Number(reader.i64()),\n };\n }\n if (!reader.done()) throw new SqliteError(\"snapshot has trailing data\", \"other\");\n return { state, runtime };\n}\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\n/** Locale-independent UTF-16 code-unit order for stable snapshot encoding. */\nfunction compareNames(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction compareRowids(a: Rowid, b: Rowid): number {\n const left = typeof a === \"bigint\" ? a : BigInt(a);\n const right = typeof b === \"bigint\" ? b : BigInt(b);\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\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 jsonReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") return { $sqlm: \"bigint\", value: value.toString() };\n if (value instanceof Uint8Array) return { $sqlm: \"blob\", value: Array.from(value) };\n return value;\n}\n\nfunction jsonReviver(_key: string, value: unknown): unknown {\n if (!value || typeof value !== \"object\" || !(\"$sqlm\" in value)) return value;\n const tagged = value as { $sqlm: string; value: string | number[] };\n if (tagged.$sqlm === \"bigint\") return BigInt(tagged.value as string);\n if (tagged.$sqlm === \"blob\") return Uint8Array.from(tagged.value as number[]);\n return value;\n}\n"],
5
+ "mappings": "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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;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;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",
6
+ "names": ["left", "right", "text", "pad", "text", "key", "digits", "text", "date", "requireArgs", "m", "e", "n", "mantissa", "exponent", "text", "pad", "requireArgs", "hay", "needle", "left", "num", "right", "alias", "text", "s", "text", "text", "rowid", "colDef", "sameRowid", "rowid", "candidate", "sameRowid", "compareRowids", "asRowid"]
7
7
  }