@crvouga/mockingbird-service-sqlite 1.2.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../ui/src/reset.ts", "../../core/src/admin-client.ts", "../../core/src/control.ts", "../../core/src/surface.ts", "../../core/src/admin-ui.ts", "../../core/src/clock.ts", "../../core/src/credentials.ts", "../../core/src/rng.ts", "../../core/src/faults.ts", "../../core/src/journal.ts", "../../core/src/metrics.ts", "../../core/src/engine-admin.ts", "../../../core/src/timeline.ts", "../src/errors/index.ts", "../src/types/sqlite-atof.ts", "../src/lexer/tokenize.ts", "../src/parser/parser.ts", "../src/parser/index.ts", "../src/runtime/clock.ts", "../src/runtime/options.ts", "../src/runtime/prng.ts", "../src/types/sqlite-real-format.ts", "../src/types/value.ts", "../src/indexes/index.ts", "../src/types/strict.ts", "../src/vtable/fts/options.ts", "../src/vtable/fts/query.ts", "../src/vtable/fts/porter.ts", "../src/vtable/fts/tokenize.ts", "../src/vtable/fts/table.ts", "../src/vtable/modules.ts", "../src/runtime/assert.ts", "../src/types/collation.ts", "../src/storage/row.ts", "../src/storage/table.ts", "../src/storage/database-state.ts", "../src/transactions/manager.ts", "../src/storage/columnar-slab.ts", "../src/serialization/wire.ts", "../src/serialization/codec.ts", "../src/api/snapshot.ts", "../src/functions/aggregate.ts", "../src/functions/datetime.ts", "../src/functions/extensions.ts", "../src/json/parse.ts", "../src/json/stringify.ts", "../src/json/jsonb.ts", "../src/json/path.ts", "../src/json/types.ts", "../src/json/ops.ts", "../src/json/tvf.ts", "../src/functions/json.ts", "../src/functions/math.ts", "../src/expressions/like.ts", "../src/functions/scalar.ts", "../src/functions/registry.ts", "../src/executor/env.ts", "../src/expressions/eval.ts", "../src/indexes/keys.ts", "../src/executor/result.ts", "../src/executor/attach.ts", "../src/schema/master-sql.ts", "../src/functions/window.ts", "../src/executor/pragma-engine.ts", "../src/functions/table-valued-registry.ts", "../src/functions/pragma-tvf.ts", "../src/functions/table-valued.ts", "../src/expressions/equals.ts", "../src/runtime/catch.ts", "../src/planner/access.ts", "../src/schema/catalog.ts", "../src/executor/simple-select.ts", "../src/executor/select.ts", "../src/executor/ddl.ts", "../src/constraints/check.ts", "../src/executor/triggers.ts", "../src/executor/vtable.ts", "../src/executor/dml.ts", "../src/executor/pragma.ts", "../src/executor/execute.ts", "../src/api/statement.ts", "../src/api/database.ts", "../src/admin.ts"],
4
+ "sourcesContent": ["/**\n * Cross-browser baseline for every HTML surface this repo serves.\n *\n * `CSS_RESET` is the document sheet. `scopeReset(root)` is the same sheet\n * limited to a widget (`:where` so later component rules still win) and with\n * viewport heights rewritten to the widget's own box.\n *\n * `reset.css` is this string as a stylesheet. The package test fails when the\n * two drift.\n */\nexport const CSS_RESET = `*,\n*::before,\n*::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\n* {\n scrollbar-width: thin;\n scrollbar-color: color-mix(in srgb, CanvasText 35%, Canvas) Canvas;\n}\n\n*::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n}\n\n*::-webkit-scrollbar-track,\n*::-webkit-scrollbar-corner {\n background: Canvas;\n}\n\n*::-webkit-scrollbar-thumb {\n background: color-mix(in srgb, CanvasText 35%, Canvas);\n border: 3px solid Canvas;\n border-radius: 999px;\n}\n\nhtml {\n hanging-punctuation: first allow-end last;\n -webkit-text-size-adjust: none;\n text-size-adjust: none;\n tab-size: 4;\n font-family:\n ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI Variable\", \"Segoe UI\",\n \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n font-size: 16px;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n text-rendering: optimizeLegibility;\n -webkit-tap-highlight-color: transparent;\n scroll-behavior: smooth;\n background: Canvas;\n color: CanvasText;\n}\n\nbody {\n min-height: 100svh;\n line-height: 1.5;\n background: Canvas;\n color: CanvasText;\n}\n\nh1 {\n font-size: 2em;\n}\n\nh2 {\n font-size: 1.5em;\n}\n\nh3 {\n font-size: 1.17em;\n}\n\nh4 {\n font-size: 1em;\n}\n\nh5 {\n font-size: 0.83em;\n}\n\nh6 {\n font-size: 0.67em;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-weight: 700;\n line-height: 1.2;\n text-wrap: balance;\n overflow-wrap: break-word;\n}\n\np,\nli,\nfigcaption,\ndd,\ndt,\nblockquote {\n overflow-wrap: break-word;\n}\n\np,\nli,\nfigcaption,\nblockquote {\n text-wrap: pretty;\n}\n\nul,\nol,\nmenu {\n list-style: none;\n}\n\na {\n color: inherit;\n text-decoration: underline;\n text-decoration-thickness: 1px;\n text-underline-offset: 0.15em;\n text-decoration-skip-ink: auto;\n}\n\nb,\nstrong {\n font-weight: 700;\n}\n\nsmall {\n font-size: 0.875em;\n}\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, \"SF Mono\", SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 1em;\n}\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\nabbr[title] {\n text-decoration: underline dotted;\n text-underline-offset: 0.15em;\n}\n\nmark {\n background: Mark;\n color: MarkText;\n}\n\nhr {\n height: 0;\n border: 0;\n border-top: 1px solid color-mix(in srgb, CanvasText 20%, transparent);\n color: inherit;\n}\n\nimg,\npicture,\nvideo,\ncanvas {\n display: block;\n max-width: 100%;\n}\n\nimg,\nvideo {\n height: auto;\n}\n\nsvg {\n overflow: hidden;\n}\n\niframe {\n border: 0;\n max-width: 100%;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\nfieldset {\n border: 0;\n min-inline-size: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nbutton,\ninput,\nselect,\ntextarea,\noptgroup {\n font: inherit;\n letter-spacing: inherit;\n color: inherit;\n margin: 0;\n vertical-align: middle;\n}\n\nbutton,\ninput[type=\"button\"],\ninput[type=\"submit\"],\ninput[type=\"reset\"] {\n appearance: none;\n background: none;\n border: 0;\n padding: 0;\n cursor: pointer;\n text-align: center;\n}\n\ninput,\ntextarea,\nselect {\n background-color: Canvas;\n border: 1px solid color-mix(in srgb, CanvasText 28%, transparent);\n border-radius: 0;\n padding: 0.5em 0.65em;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"],\ninput[type=\"range\"],\ninput[type=\"file\"],\ninput[type=\"color\"],\ninput[type=\"button\"],\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"image\"],\ninput[type=\"hidden\"] {\n background: none;\n border: 0;\n padding: 0;\n border-radius: 0;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n accent-color: CanvasText;\n}\n\ninput[type=\"search\"] {\n appearance: none;\n background-color: Canvas;\n border: 1px solid color-mix(in srgb, CanvasText 28%, transparent);\n}\n\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-results-button,\ninput[type=\"search\"]::-webkit-search-results-decoration {\n -webkit-appearance: none;\n display: none;\n}\n\ninput[type=\"number\"] {\n appearance: textfield;\n background-color: Canvas;\n border: 1px solid color-mix(in srgb, CanvasText 28%, transparent);\n}\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\ntextarea {\n resize: vertical;\n}\n\n::placeholder {\n opacity: 1;\n color: color-mix(in srgb, CanvasText 45%, transparent);\n}\n\n:focus-visible {\n outline: 2px solid CanvasText;\n outline-offset: 2px;\n}\n\n:focus:not(:focus-visible) {\n outline: none;\n}\n\n:disabled,\n[disabled] {\n cursor: default;\n opacity: 0.6;\n}\n\nlabel,\nsummary,\nselect,\n[role=\"button\"] {\n cursor: pointer;\n}\n\nsummary {\n display: list-item;\n}\n\ndetails {\n display: block;\n}\n\ndialog {\n margin: auto;\n padding: 1rem;\n border: 1px solid color-mix(in srgb, CanvasText 20%, transparent);\n background: Canvas;\n color: CanvasText;\n max-width: calc(100vw - 2rem);\n max-height: calc(100svh - 2rem);\n}\n\ndialog:not([open]) {\n display: none;\n}\n\n::backdrop {\n background: color-mix(in srgb, CanvasText 40%, transparent);\n}\n\n[hidden] {\n display: none !important;\n}\n\n::selection {\n background: Highlight;\n color: HighlightText;\n}\n\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n scroll-behavior: auto !important;\n }\n}\n\n@media (pointer: coarse) {\n input,\n select,\n textarea {\n font-size: max(16px, 1em);\n }\n}`\n\n/** Scope the reset to `root` without raising specificity above a single element. */\nexport function scopeReset(root: string): string {\n return scopeStylesheet(CSS_RESET, root)\n .replaceAll(\"100dvh\", \"100%\")\n .replaceAll(\"100svh\", \"100%\")\n .replaceAll(\"100vh\", \"100%\")\n}\n\nfunction scopeStylesheet(css: string, root: string): string {\n let out = \"\"\n let cursor = 0\n while (cursor < css.length) {\n const brace = css.indexOf(\"{\", cursor)\n if (brace === -1) {\n out += css.slice(cursor)\n break\n }\n const prelude = css.slice(cursor, brace)\n const trimmed = prelude.trimStart()\n if (trimmed.startsWith(\"@media\") || trimmed.startsWith(\"@supports\")) {\n const end = skipBlock(css, brace)\n const body = css.slice(brace + 1, end - 1)\n out += `${css.slice(cursor, brace + 1)}${scopeStylesheet(body, root)}}`\n cursor = end\n continue\n }\n if (trimmed.startsWith(\"@\")) {\n const end = skipBlock(css, brace)\n out += css.slice(cursor, end)\n cursor = end\n continue\n }\n const close = prelude.lastIndexOf(\"}\")\n const head = close === -1 ? \"\" : prelude.slice(0, close + 1)\n const selector = close === -1 ? prelude : prelude.slice(close + 1)\n out += `${head}${scopeSelectorList(selector, root)}{`\n cursor = brace + 1\n }\n return out\n}\n\nfunction scopeSelectorList(selector: string, root: string): string {\n const where = `:where(${root})`\n return splitSelectors(selector)\n .map((part) => scopeOne(part.trim(), where))\n .filter((part) => part !== \"\")\n .join(\",\\n\")\n}\n\nfunction scopeOne(selector: string, where: string): string {\n if (selector === \"html\" || selector === \"body\" || selector === \":root\") return where\n if (selector.startsWith(\"*\")) {\n const rest = selector.slice(1)\n return `${where}${rest},\\n${where} ${selector}`\n }\n if (selector.startsWith(\":\")) return `${where}${selector},\\n${where} ${selector}`\n return `${where} ${selector}`\n}\n\n/** Split a selector list on commas that are not inside parentheses. */\nfunction splitSelectors(selector: string): string[] {\n const parts: string[] = []\n let current = \"\"\n let depth = 0\n for (const char of selector) {\n if (char === \"(\") depth++\n else if (char === \")\") depth = Math.max(0, depth - 1)\n if (char === \",\" && depth === 0) {\n parts.push(current)\n current = \"\"\n continue\n }\n current += char\n }\n parts.push(current)\n return parts\n}\n\nfunction skipBlock(css: string, openBrace: number): number {\n let depth = 0\n for (let index = openBrace; index < css.length; index++) {\n const char = css[index]\n if (char === \"{\") depth++\n else if (char === \"}\") {\n depth--\n if (depth === 0) return index + 1\n }\n }\n return css.length\n}\n", "import type { ClockState } from \"./clock.js\"\nimport type { FaultPresetList } from \"./faults.js\"\nimport type { StateCollectionView, StateField, StateFieldKind, StateView } from \"./state-view.js\"\n\n/**\n * Admin page behavior. `adminClientSource` inlines these functions into the document.\n * They run in the browser, so they cannot close over module bindings \u2014 configuration\n * arrives as the argument to `bootAdmin`.\n */\nexport type AdminBootConfig = {\n standardRoutes: readonly string[]\n adminPrefix: string\n adminKeyHeader: string\n brandsUrl: string\n service: string\n}\n\nexport type AdminBrandEnv = {\n document: Document\n $: (id: string) => HTMLElement | null\n params: URLSearchParams\n location: { href: string; origin: string }\n fetch: typeof fetch\n brandsUrl: string\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\n/**\n * Highlight already-serialized JSON without trusting any of its contents as markup.\n * Kept dependency-free because this function is inlined into every mock's admin page.\n */\nexport function highlightJsonText(text: string): string {\n const escapeToken = (value: string): string =>\n value.replace(/[&<>\"']/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&amp;\"\n case \"<\":\n return \"&lt;\"\n case \">\":\n return \"&gt;\"\n case '\"':\n return \"&quot;\"\n default:\n return \"&#39;\"\n }\n })\n const token =\n /(\"(?:\\\\u[\\da-fA-F]{4}|\\\\[^u]|[^\\\\\"])*\"\\s*:|\"(?:\\\\u[\\da-fA-F]{4}|\\\\[^u]|[^\\\\\"])*\"|\\b(?:true|false)\\b|\\bnull\\b|-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)/g\n let cursor = 0\n let html = \"\"\n for (const match of text.matchAll(token)) {\n const index = match.index ?? 0\n const value = match[0]\n html += escapeToken(text.slice(cursor, index))\n const kind = value.startsWith('\"')\n ? value.trimEnd().endsWith(\":\")\n ? \"key\"\n : \"string\"\n : value === \"true\" || value === \"false\"\n ? \"boolean\"\n : value === \"null\"\n ? \"null\"\n : \"number\"\n html += `<span class=\"json-${kind}\">${escapeToken(value)}</span>`\n cursor = index + value.length\n }\n return html + escapeToken(text.slice(cursor))\n}\n\n/** Paint the header chip from a brands catalog. Hostile URLs and markup are dropped. */\nexport function mountAdminBrand(\n doc: Document,\n host: HTMLElement,\n service: string,\n catalog: unknown,\n): void {\n const clip = (value: unknown, max: number): string | null => {\n if (typeof value !== \"string\") return null\n const trimmed = value.trim()\n if (trimmed === \"\") return null\n return trimmed.length > max ? trimmed.slice(0, max) : trimmed\n }\n const httpUrl = (value: unknown): string | null => {\n if (typeof value !== \"string\" || value.length > 2000) return null\n try {\n const url = new URL(value)\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") return null\n return url.href\n } catch {\n return null\n }\n }\n const hexColor = (value: unknown): string | null => {\n if (typeof value !== \"string\") return null\n const raw = value.trim()\n return /^#[0-9a-fA-F]{3,8}$/.test(raw) ? raw : null\n }\n const hostname = (value: string): string => {\n try {\n return new URL(value).hostname.replace(/^www\\./, \"\")\n } catch {\n return value\n }\n }\n host.replaceChildren()\n host.hidden = true\n if (!isRecord(catalog) || !Object.hasOwn(catalog, service)) return\n const row = catalog[service]\n if (!isRecord(row)) return\n const vendor = clip(row.vendor, 80)\n const website = httpUrl(row.website)\n const guide = httpUrl(row.guide)\n const docs = httpUrl(row.docs)\n const logo = httpUrl(row.logo)\n const color = hexColor(row.color)\n const description = clip(row.description, 280)\n if (vendor === null || (website === null && guide === null && docs === null)) return\n const add = <T extends Node>(node: T): T => {\n host.append(node)\n return node\n }\n if (logo !== null) {\n const img = doc.createElement(\"img\")\n img.alt = \"\"\n img.src = logo\n img.width = 16\n img.height = 16\n img.decoding = \"async\"\n img.referrerPolicy = \"no-referrer\"\n if (color !== null) img.style.borderColor = color\n add(img)\n }\n const name = doc.createElement(\"span\")\n name.className = \"vendor-name\"\n name.textContent = vendor\n if (description !== null) name.title = description\n add(name)\n const sep = (): HTMLSpanElement => {\n const node = doc.createElement(\"span\")\n node.className = \"vendor-sep\"\n node.setAttribute(\"aria-hidden\", \"true\")\n node.textContent = \"\u00B7\"\n return node\n }\n const link = (href: string, label: string, title: string): HTMLAnchorElement => {\n const node = doc.createElement(\"a\")\n node.className = \"vendor-link\"\n node.href = href\n node.target = \"_blank\"\n node.rel = \"noopener noreferrer\"\n node.referrerPolicy = \"no-referrer\"\n node.textContent = label\n node.title = title\n return node\n }\n if (website !== null) {\n add(sep())\n add(link(website, hostname(website), `${vendor} website`))\n }\n if (guide !== null) {\n add(sep())\n add(link(guide, \"Docs\", `Docs for ${vendor}`))\n }\n if (docs !== null) {\n add(sep())\n add(link(docs, \"API\", `${vendor} API reference`))\n }\n host.removeAttribute(\"hidden\")\n host.hidden = false\n}\n\n/** Fetch the brands catalog and paint `#vendor`. `?brands=` may name a local copy. */\nexport function startAdminBrand(env: AdminBrandEnv): void {\n const requested = env.params.get(\"brands\")\n let brandsUrl = env.brandsUrl\n if (requested) {\n try {\n const url = new URL(requested, env.location.href)\n const local =\n url.hostname === \"localhost\" ||\n url.hostname === \"127.0.0.1\" ||\n url.hostname === \"::1\" ||\n url.hostname === \"[::1]\" ||\n url.origin === env.location.origin\n if ((url.protocol === \"https:\" || url.protocol === \"http:\") && local) brandsUrl = url.href\n } catch {\n brandsUrl = env.brandsUrl\n }\n }\n const vendorHost = env.$(\"vendor\")\n const brandRoot = env.document.querySelector(\"[data-mockingbird-admin]\")\n const brandService = brandRoot?.getAttribute(\"data-service\") || \"\"\n if (vendorHost === null) return\n env\n .fetch(brandsUrl, {\n headers: { accept: \"application/json\" },\n signal: AbortSignal.timeout(5000),\n })\n .then(async (response) => {\n if (!response.ok) return null\n const catalog: unknown = await response.json()\n return catalog\n })\n .then((catalog) => {\n mountAdminBrand(env.document, vendorHost, brandService, catalog)\n })\n .catch(() => {})\n}\n\n/**\n * Names from `GET /__admin/faults/presets`.\n * The payload's `presets` field is a list. A record keyed by preset name is rejected\n * here, which is also a type error at the handler that builds a {@link FaultPresetList}.\n */\nexport function faultPresetList(value: unknown): FaultPresetList {\n if (!isRecord(value)) throw new Error(\"Fault presets response was not an object\")\n if (!Object.hasOwn(value, \"presets\") || value.presets === undefined || value.presets === null) {\n return { presets: [] }\n }\n if (!Array.isArray(value.presets)) throw new Error(\"Fault presets response was not a list\")\n return {\n presets: value.presets.flatMap((item) => {\n if (!isRecord(item) || typeof item.name !== \"string\") return []\n return [{ name: item.name }]\n }),\n }\n}\n\n/**\n * Table list and query box for a `sql` admin extension.\n * Inlined into the page; do not close over module bindings. Use `root` for every\n * lookup so two documents can boot in one page.\n */\nexport function mountSqlExplorer(\n root: HTMLElement,\n api: {\n get: (path: string) => Promise<unknown>\n send: (method: string, path: string, body?: unknown) => Promise<unknown>\n namespace: () => string\n },\n): void {\n const cell = (value: unknown): string => {\n if (value === null || value === undefined) return \"\"\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value)\n }\n return JSON.stringify(value) ?? \"\"\n }\n root.replaceChildren()\n const layout = document.createElement(\"div\")\n layout.className = \"sql-layout\"\n const tables = document.createElement(\"div\")\n tables.className = \"sql-tables\"\n const stack = document.createElement(\"div\")\n stack.className = \"stack\"\n const banner = document.createElement(\"p\")\n banner.className = \"banner\"\n const grid = document.createElement(\"div\")\n const input = document.createElement(\"textarea\")\n input.className = \"sql-input\"\n input.spellcheck = false\n input.placeholder = \"SELECT * FROM ...\"\n const actions = document.createElement(\"div\")\n actions.className = \"row-actions\"\n const run = document.createElement(\"button\")\n run.type = \"button\"\n run.textContent = \"Run\"\n actions.append(run)\n const result = document.createElement(\"pre\")\n stack.append(banner, grid, input, actions, result)\n layout.append(tables, stack)\n root.append(layout)\n\n const showError = (error: unknown): void => {\n banner.textContent = error instanceof Error ? error.message : String(error)\n banner.classList.add(\"show\")\n }\n const clearError = (): void => {\n banner.textContent = \"\"\n banner.classList.remove(\"show\")\n }\n const renderGrid = (\n columns: readonly string[],\n rows: readonly Record<string, unknown>[],\n ): void => {\n grid.replaceChildren()\n if (columns.length === 0) {\n const empty = document.createElement(\"p\")\n empty.className = \"empty\"\n empty.textContent = \"No rows.\"\n grid.append(empty)\n return\n }\n const table = document.createElement(\"table\")\n const head = document.createElement(\"thead\")\n const headRow = document.createElement(\"tr\")\n for (const column of columns) {\n const th = document.createElement(\"th\")\n th.textContent = column\n headRow.append(th)\n }\n head.append(headRow)\n const body = document.createElement(\"tbody\")\n for (const row of rows) {\n const tr = document.createElement(\"tr\")\n for (const column of columns) {\n const td = document.createElement(\"td\")\n td.dataset.label = column\n td.textContent = cell(row[column])\n tr.append(td)\n }\n body.append(tr)\n }\n table.append(head, body)\n grid.append(table)\n }\n const rowsOf = (value: unknown): Record<string, unknown>[] => {\n if (!isRecord(value) || !Array.isArray(value.rows)) return []\n return value.rows.flatMap((row) => (isRecord(row) ? [row] : []))\n }\n const columnsOf = (value: unknown, rows: readonly Record<string, unknown>[]): string[] => {\n if (isRecord(value) && Array.isArray(value.columns)) {\n const named = value.columns.flatMap((column) => (typeof column === \"string\" ? [column] : []))\n if (named.length > 0) return named\n }\n const first = rows[0]\n return first === undefined ? [] : Object.keys(first)\n }\n let selected = \"\"\n const loadPage = async (schema: string, name: string): Promise<void> => {\n selected = `${schema}.${name}`\n const page = await api.get(\n `/sql/tables/${encodeURIComponent(schema)}/${encodeURIComponent(name)}?limit=50`,\n )\n const rows = rowsOf(page)\n renderGrid(columnsOf(page, rows), rows)\n const total = isRecord(page) && typeof page.total === \"number\" ? page.total : rows.length\n result.textContent = `${selected} \u00B7 ${total} rows`\n for (const button of tables.querySelectorAll(\"button\")) {\n if (!(button instanceof HTMLButtonElement)) continue\n button.setAttribute(\n \"aria-current\",\n button.dataset.schema === schema && button.dataset.table === name ? \"true\" : \"false\",\n )\n }\n }\n const loadTables = async (): Promise<void> => {\n const payload = await api.get(\"/sql/tables\")\n const listed = isRecord(payload) && Array.isArray(payload.tables) ? payload.tables : []\n tables.replaceChildren()\n if (listed.length === 0) {\n const empty = document.createElement(\"p\")\n empty.className = \"empty\"\n empty.textContent = \"No tables.\"\n tables.append(empty)\n return\n }\n for (const item of listed) {\n if (!isRecord(item) || typeof item.schema !== \"string\" || typeof item.name !== \"string\")\n continue\n const button = document.createElement(\"button\")\n button.type = \"button\"\n button.dataset.schema = item.schema\n button.dataset.table = item.name\n button.textContent = `${item.schema}.${item.name}`\n tables.append(button)\n }\n }\n tables.addEventListener(\"click\", (event) => {\n const target = event.target\n if (!(target instanceof Element)) return\n const button = target.closest(\"button\")\n if (!(button instanceof HTMLButtonElement)) return\n const schema = button.dataset.schema\n const name = button.dataset.table\n if (schema === undefined || name === undefined) return\n clearError()\n loadPage(schema, name).catch(showError)\n })\n run.addEventListener(\"click\", () => {\n const sql = input.value.trim()\n if (sql === \"\") {\n showError(new Error(\"Enter a statement\"))\n return\n }\n clearError()\n api\n .send(\"POST\", \"/sql/query\", { sql })\n .then((payload) => {\n const rows = rowsOf(payload)\n renderGrid(columnsOf(payload, rows), rows)\n const count =\n isRecord(payload) && typeof payload.rowCount === \"number\" ? payload.rowCount : rows.length\n const truncated = isRecord(payload) && payload.truncated === true ? \" (truncated)\" : \"\"\n result.textContent = `${count} rows${truncated}`\n })\n .catch(showError)\n })\n const namespace = document.getElementById(\"namespace\")\n if (namespace) {\n namespace.addEventListener(\"change\", () => {\n clearError()\n loadTables().catch(showError)\n })\n }\n loadTables().catch(showError)\n}\n\n/** Boot the admin document. Inlined into the page; do not close over module bindings. */\nexport function bootAdmin(config: AdminBootConfig): void {\n const fieldKinds = [\"string\", \"number\", \"boolean\", \"null\", \"object\", \"array\", \"unknown\"] as const\n const sources = [\"declared\", \"inferred\", \"mixed\"] as const\n const isFieldKind = (value: unknown): value is StateFieldKind =>\n typeof value === \"string\" && fieldKinds.some((kind) => kind === value)\n const isSource = (value: unknown): value is StateCollectionView[\"source\"] =>\n typeof value === \"string\" && sources.some((source) => source === value)\n const readJson = (text: string): unknown => {\n const value: unknown = JSON.parse(text)\n return value\n }\n const esc = (value: unknown): string =>\n String(value ?? \"\").replace(/[&<>\"']/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&amp;\"\n case \"<\":\n return \"&lt;\"\n case \">\":\n return \"&gt;\"\n case '\"':\n return \"&quot;\"\n default:\n return \"&#39;\"\n }\n })\n const el = <T extends HTMLElement>(id: string, kind: new () => T): T => {\n const node = document.getElementById(id)\n if (!(node instanceof kind)) throw new Error(`admin shell is missing #${id}`)\n return node\n }\n const errorMessage = (data: unknown, fallback: string): string => {\n if (!isRecord(data)) return fallback\n const error = data.error\n if (!isRecord(error) || typeof error.message !== \"string\" || error.message === \"\") {\n return fallback\n }\n return error.message\n }\n const requireList = (value: unknown, label: string): unknown[] => {\n if (value === undefined || value === null) return []\n if (!Array.isArray(value)) throw new Error(`${label} was not a list`)\n return value\n }\n\n const state: {\n namespace: string\n key: string\n view: string\n collection: string\n shape: StateView | null\n route: string | null\n routes: string[]\n editing: string | null\n } = {\n namespace: \"default\",\n key: sessionStorage.getItem(\"mockingbird-admin-key\") || \"\",\n view: [\"overview\", \"state\", \"clock\", \"faults\", \"journal\", \"routes\"].includes(\n location.hash.slice(1),\n )\n ? location.hash.slice(1)\n : \"overview\",\n collection: \"\",\n shape: null,\n route: null,\n routes: [],\n editing: null,\n }\n const standard = new Set(config.standardRoutes)\n const banner = el(\"banner\", HTMLElement)\n const bannerMessage = el(\"banner-message\", HTMLElement)\n const keyInput = el(\"admin-key\", HTMLInputElement)\n keyInput.value = state.key\n const params = new URLSearchParams(location.search)\n const queryKey = params.get(\"key\")\n if (queryKey) {\n state.key = queryKey\n keyInput.value = state.key\n sessionStorage.setItem(\"mockingbird-admin-key\", state.key)\n params.delete(\"key\")\n const next = params.toString()\n history.replaceState(null, \"\", location.pathname + (next ? `?${next}` : \"\") + location.hash)\n }\n const queryNamespace = params.get(\"namespace\")\n if (queryNamespace) state.namespace = queryNamespace\n\n const showError = (error: unknown): void => {\n bannerMessage.textContent = error instanceof Error ? error.message : String(error)\n banner.classList.add(\"show\")\n banner.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" })\n }\n const clearError = (): void => {\n banner.classList.remove(\"show\")\n bannerMessage.textContent = \"\"\n }\n el(\"banner-dismiss\", HTMLButtonElement).addEventListener(\"click\", clearError)\n\n const api = async (method: string, path: string, body?: unknown): Promise<unknown> => {\n const headers: Record<string, string> = { accept: \"application/json\" }\n if (state.key !== \"\") headers[config.adminKeyHeader] = state.key\n if (state.namespace !== \"\") headers[\"x-mockingbird-namespace\"] = state.namespace\n if (body !== undefined) headers[\"content-type\"] = \"application/json\"\n const init: RequestInit = { method, headers }\n if (body !== undefined) init.body = JSON.stringify(body)\n const response = await fetch(config.adminPrefix + path, init)\n const text = await response.text()\n let data: unknown = null\n if (text !== \"\") {\n try {\n data = readJson(text)\n } catch {\n data = { raw: text }\n }\n }\n if (response.status === 401) {\n keyInput.focus()\n throw new Error(errorMessage(data, \"Admin key required\"))\n }\n if (!response.ok) {\n throw new Error(errorMessage(data, `${response.status} ${method} ${path}`))\n }\n return data\n }\n const originGet = async (path: string): Promise<unknown> => {\n const response = await fetch(path, { headers: { accept: \"application/json\" } })\n if (!response.ok) throw new Error(`${response.status} ${path}`)\n const value: unknown = await response.json()\n return value\n }\n type PanelApi = {\n get: (path: string) => Promise<unknown>\n send: (method: string, path: string, body?: unknown) => Promise<unknown>\n namespace: () => string\n }\n const panelApi: PanelApi = {\n get: (path) => api(\"GET\", path),\n send: (method, path, body) => api(method, path, body),\n namespace: () => state.namespace,\n }\n const isPanelScript = (value: unknown): value is (root: HTMLElement, api: PanelApi) => void =>\n typeof value === \"function\"\n\n const themeButton = el(\"theme\", HTMLButtonElement)\n const setTheme = (theme: string | null): void => {\n if (theme) document.documentElement.dataset.theme = theme\n else delete document.documentElement.dataset.theme\n const dark = theme ? theme === \"dark\" : matchMedia(\"(prefers-color-scheme: dark)\").matches\n themeButton.innerHTML = dark\n ? '<svg viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\"><circle cx=\"10\" cy=\"10\" r=\"3.2\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M10 2v1.5M10 16.5V18M18 10h-1.5M3.5 10H2M15.7 4.3l-1 1M5.3 14.7l-1 1M15.7 15.7l-1-1M5.3 5.3l-1-1\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>'\n : '<svg viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\"><path d=\"M16.8 12.2A7 7 0 0 1 7.8 3.2a7 7 0 1 0 9 9Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/></svg>'\n const label = dark ? \"Use light theme\" : \"Use dark theme\"\n themeButton.setAttribute(\"aria-label\", label)\n themeButton.title = label\n }\n const storedTheme = localStorage.getItem(\"mockingbird-admin-theme\")\n setTheme(storedTheme === \"dark\" || storedTheme === \"light\" ? storedTheme : null)\n themeButton.addEventListener(\"click\", () => {\n const current = document.documentElement.dataset.theme\n const dark = current ? current === \"dark\" : matchMedia(\"(prefers-color-scheme: dark)\").matches\n const next = dark ? \"light\" : \"dark\"\n localStorage.setItem(\"mockingbird-admin-theme\", next)\n setTheme(next)\n })\n\n const show = (view: string): void => {\n state.view = view\n for (const button of document.querySelectorAll(\"#nav button\")) {\n if (!(button instanceof HTMLButtonElement)) continue\n button.setAttribute(\"aria-current\", button.dataset.view === view ? \"true\" : \"false\")\n }\n for (const section of document.querySelectorAll(\"main .view\")) {\n if (!(section instanceof HTMLElement)) continue\n section.hidden = section.id !== `view-${view}`\n }\n history.replaceState(\n null,\n \"\",\n `${location.pathname}${location.search}#${encodeURIComponent(view)}`,\n )\n }\n el(\"nav\", HTMLElement).addEventListener(\"click\", (event) => {\n const target = event.target\n if (!(target instanceof Element)) return\n const button = target.closest(\"button[data-view]\")\n if (!(button instanceof HTMLButtonElement)) return\n const view = button.dataset.view\n if (view === undefined) return\n show(view)\n refresh().catch(showError)\n })\n\n const cards = (items: readonly { k: string; v: string }[]): string =>\n `<div class=\"grid\">${items\n .map(\n (item) =>\n `<article class=\"card stat-card\"><div class=\"k\">${item.k}</div><div class=\"v\">${item.v}</div></article>`,\n )\n .join(\"\")}</div>`\n const table = <Row extends object>(\n columns: readonly { label: string; cell: (row: Row) => string }[],\n rows: readonly Row[],\n ): string => {\n if (rows.length === 0) return '<p class=\"empty\">Nothing here yet.</p>'\n const head = `<tr>${columns.map((column) => `<th>${column.label}</th>`).join(\"\")}</tr>`\n const body = rows\n .map((row) => {\n const cells = columns\n .map((column) => `<td data-label=\"${column.label}\">${column.cell(row)}</td>`)\n .join(\"\")\n const attrs = \"attrs\" in row && typeof row.attrs === \"string\" ? row.attrs : \"\"\n return `<tr${attrs}>${cells}</tr>`\n })\n .join(\"\")\n return `<div class=\"table-shell\"><table><thead>${head}</thead><tbody>${body}</tbody></table></div>`\n }\n const preview = (value: unknown): string => {\n const text = JSON.stringify(value) ?? \"null\"\n const clipped = text.length > 180 ? `${text.slice(0, 180)}\u2026` : text\n return `<code class=\"json-inline\">${highlightJsonText(clipped)}</code>`\n }\n const when = (epoch: number): string => {\n const date = new Date(epoch)\n return Number.isNaN(date.getTime()) ? String(epoch) : date.toISOString()\n }\n const journalWhen = (value: string): string => {\n const numeric = value.trim() === \"\" ? Number.NaN : Number(value)\n const epoch = Number.isFinite(numeric) ? numeric : Date.parse(value)\n return Number.isFinite(epoch) ? when(epoch) : value\n }\n const clockCard = (epoch: number): string => {\n const date = new Date(epoch)\n if (Number.isNaN(date.getTime())) return esc(String(epoch))\n const iso = date.toISOString()\n return `${esc(iso.slice(0, 10))}<span class=\"clock-time\">${esc(iso.slice(11, 19))} UTC</span>`\n }\n const decodeClock = (value: unknown): ClockState => {\n if (\n !isRecord(value) ||\n typeof value.now !== \"number\" ||\n typeof value.offsetMs !== \"number\" ||\n typeof value.frozen !== \"boolean\"\n ) {\n throw new Error(\"Clock response was not a clock\")\n }\n return { now: value.now, offsetMs: value.offsetMs, frozen: value.frozen }\n }\n const decodeField = (value: unknown): StateField | undefined => {\n if (!isRecord(value) || typeof value.name !== \"string\" || !isFieldKind(value.kind)) {\n return undefined\n }\n const field: StateField = {\n name: value.name,\n kind: value.kind,\n optional: value.optional === true,\n }\n if (typeof value.description === \"string\") field.description = value.description\n if (Array.isArray(value.fields)) {\n field.fields = value.fields.flatMap((item) => {\n const child = decodeField(item)\n return child === undefined ? [] : [child]\n })\n }\n return field\n }\n const decodeCollection = (value: unknown): StateCollectionView | undefined => {\n if (!isRecord(value) || typeof value.name !== \"string\") return undefined\n const fields = Array.isArray(value.fields)\n ? value.fields.flatMap((item) => {\n const field = decodeField(item)\n return field === undefined ? [] : [field]\n })\n : []\n const collection: StateCollectionView = {\n name: value.name,\n label: typeof value.label === \"string\" ? value.label : value.name,\n count: typeof value.count === \"number\" ? value.count : 0,\n source: isSource(value.source) ? value.source : \"inferred\",\n fields,\n }\n if (typeof value.description === \"string\") collection.description = value.description\n return collection\n }\n const decodeState = (value: unknown): StateView => {\n if (!isRecord(value) || !Array.isArray(value.collections)) {\n throw new Error(\"State response has no collection list\")\n }\n return {\n namespace: typeof value.namespace === \"string\" ? value.namespace : state.namespace,\n storageNamespace: typeof value.storageNamespace === \"string\" ? value.storageNamespace : \"\",\n collections: value.collections.flatMap((item) => {\n const collection = decodeCollection(item)\n return collection === undefined ? [] : [collection]\n }),\n }\n }\n type RecordRow = { id: string; seq: number; value: unknown; attrs: string }\n const decodeRecords = (value: unknown): RecordRow[] =>\n requireList(isRecord(value) ? value.records : undefined, \"Records\").flatMap((item) => {\n if (!isRecord(item) || typeof item.id !== \"string\") return []\n return [\n {\n id: item.id,\n seq: typeof item.seq === \"number\" ? item.seq : 0,\n value: item.value,\n attrs: ` class=\"clickable\" data-id=\"${esc(item.id)}\"`,\n },\n ]\n })\n type JournalRow = {\n at: string\n method: string\n path: string\n status: string\n durationMs: string\n operationId: string\n }\n const textOf = (value: unknown): string =>\n typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\"\n ? String(value)\n : \"\"\n const decodeJournal = (value: unknown): JournalRow[] =>\n requireList(isRecord(value) ? value.requests : undefined, \"Journal\").flatMap((item) => {\n if (!isRecord(item)) return []\n return [\n {\n at: textOf(item.at),\n method: textOf(item.method),\n path: textOf(item.path),\n status: textOf(item.status),\n durationMs: textOf(item.durationMs),\n operationId: textOf(item.operationId),\n },\n ]\n })\n type FaultRow = {\n id: string\n method: string | undefined\n pathPrefix: string | undefined\n operationId: string | undefined\n status: number | undefined\n effect: string | undefined\n drop: boolean | undefined\n latencyMs: number | undefined\n }\n const decodeFaults = (value: unknown): FaultRow[] =>\n requireList(isRecord(value) ? value.faults : undefined, \"Faults\").flatMap((item) => {\n if (!isRecord(item)) return []\n return [\n {\n id: textOf(item.id),\n method: typeof item.method === \"string\" ? item.method : undefined,\n pathPrefix: typeof item.pathPrefix === \"string\" ? item.pathPrefix : undefined,\n operationId: typeof item.operationId === \"string\" ? item.operationId : undefined,\n status: typeof item.status === \"number\" ? item.status : undefined,\n effect: typeof item.effect === \"string\" ? item.effect : undefined,\n drop: typeof item.drop === \"boolean\" ? item.drop : undefined,\n latencyMs: typeof item.latencyMs === \"number\" ? item.latencyMs : undefined,\n },\n ]\n })\n\n const loadNamespaces = async (): Promise<void> => {\n const data = await api(\"GET\", \"/namespaces\")\n const select = el(\"namespace\", HTMLSelectElement)\n const listed = requireList(isRecord(data) ? data.namespaces : undefined, \"Namespaces\")\n const fallback =\n isRecord(data) && typeof data.default === \"string\" && data.default !== \"\"\n ? data.default\n : \"default\"\n const names = (listed.length > 0 ? listed.map((name) => String(name)) : [fallback]).slice()\n if (!names.includes(state.namespace)) names.unshift(state.namespace)\n select.innerHTML = names\n .map((name) => `<option value=\"${esc(name)}\">${esc(name)}</option>`)\n .join(\"\")\n select.value = state.namespace\n }\n\n const renderOverview = async (): Promise<void> => {\n const [health, shape, clock, journal] = await Promise.all([\n originGet(`${config.adminPrefix}/health`),\n api(\"GET\", \"/state\"),\n api(\"GET\", \"/clock\"),\n api(\"GET\", \"/requests?limit=8\"),\n ])\n if (!isRecord(health)) throw new Error(\"Health response was not an object\")\n const decoded = decodeState(shape)\n state.shape = decoded\n const time = decodeClock(clock)\n el(\"overview-cards\", HTMLElement).innerHTML = cards([\n {\n k: \"Service\",\n v: esc(\n typeof health.service === \"string\" && health.service !== \"\"\n ? health.service\n : config.service,\n ),\n },\n {\n k: \"Status\",\n v: `<span class=\"badge ok\">${esc(\n typeof health.status === \"string\" && health.status !== \"\" ? health.status : \"ok\",\n )}</span>`,\n },\n { k: \"Namespace\", v: esc(state.namespace) },\n { k: \"Collections\", v: String(decoded.collections.length) },\n {\n k: \"Records\",\n v: String(decoded.collections.reduce((sum, item) => sum + item.count, 0)),\n },\n { k: \"Clock\", v: clockCard(time.now) },\n ])\n el(\"overview-requests\", HTMLElement).innerHTML = table(\n [\n { label: \"Method\", cell: (row: JournalRow) => esc(row.method) },\n { label: \"Path\", cell: (row: JournalRow) => esc(row.path) },\n {\n label: \"Status\",\n cell: (row: JournalRow) =>\n `<span class=\"status-${row.status.charAt(0)}\">${esc(row.status)}</span>`,\n },\n { label: \"Operation\", cell: (row: JournalRow) => esc(row.operationId) },\n ],\n decodeJournal(journal),\n )\n }\n\n const schemaChips = (collection: StateCollectionView): string => {\n if (collection.fields.length === 0) {\n return '<p class=\"empty\">No fields yet. Add a record or declare the collection on the service.</p>'\n }\n return `<div class=\"chips\">${collection.fields\n .map(\n (field) =>\n `<span class=\"chip\">${esc(field.name)} <i>${esc(field.kind)}${field.optional ? \"?\" : \"\"}</i></span>`,\n )\n .join(\"\")}</div>`\n }\n\n const renderState = async (): Promise<void> => {\n const shape = decodeState(await api(\"GET\", \"/state\"))\n state.shape = shape\n const host = el(\"collections\", HTMLElement)\n if (shape.collections.length === 0) {\n host.innerHTML = '<p class=\"empty\">This namespace has no collections yet.</p>'\n el(\"schema\", HTMLElement).innerHTML = \"\"\n el(\"records\", HTMLElement).innerHTML = \"\"\n return\n }\n if (!shape.collections.some((item) => item.name === state.collection)) {\n const first = shape.collections[0]\n if (first === undefined) return\n state.collection = first.name\n }\n host.innerHTML = shape.collections\n .map(\n (item) =>\n `<button type=\"button\" class=\"collection\" data-collection=\"${esc(item.name)}\" aria-current=\"${\n item.name === state.collection ? \"true\" : \"false\"\n }\"><strong>${esc(item.label)}</strong><small>${esc(item.count)} \u00B7 ${esc(item.source)}</small></button>`,\n )\n .join(\"\")\n const selected = shape.collections.find((item) => item.name === state.collection)\n if (selected === undefined) return\n const description = selected.description\n ? `<p class=\"lede\">${esc(selected.description)}</p>`\n : \"\"\n el(\"schema\", HTMLElement).innerHTML =\n `<h3>${esc(selected.label)}</h3>${description}${schemaChips(selected)}`\n const page = await api(\"GET\", `/state/${encodeURIComponent(state.collection)}?limit=50`)\n el(\"records\", HTMLElement).innerHTML = table(\n [\n { label: \"Id\", cell: (row: RecordRow) => `<code>${esc(row.id)}</code>` },\n { label: \"Seq\", cell: (row: RecordRow) => esc(row.seq) },\n { label: \"Value\", cell: (row: RecordRow) => preview(row.value) },\n ],\n decodeRecords(page),\n )\n }\n\n const renderClock = async (): Promise<void> => {\n const clock = decodeClock(await api(\"GET\", \"/clock\"))\n el(\"clock-readout\", HTMLElement).innerHTML =\n `<div class=\"k\">Now</div><div class=\"v\">${esc(when(clock.now))}</div><p>${esc(clock.now)} ms \u00B7 offset ${esc(\n clock.offsetMs,\n )} ms ${\n clock.frozen\n ? \"<span class='badge warn'>frozen</span>\"\n : \"<span class='badge ok'>live</span>\"\n }</p>`\n const freeze = el(\"freeze\", HTMLButtonElement)\n freeze.textContent = clock.frozen ? \"Unfreeze\" : \"Freeze\"\n freeze.dataset.frozen = clock.frozen ? \"1\" : \"0\"\n }\n\n const renderFaults = async (): Promise<void> => {\n const [faults, presets] = await Promise.all([\n api(\"GET\", \"/faults\"),\n api(\"GET\", \"/faults/presets\").catch((): unknown => ({ presets: [] })),\n ])\n const select = el(\"fault-preset\", HTMLSelectElement)\n const current = select.value\n const list = faultPresetList(presets).presets\n select.innerHTML = `<option value=\"\">Custom rule</option>${list\n .map((preset) => `<option value=\"${esc(preset.name)}\">${esc(preset.name)}</option>`)\n .join(\"\")}`\n select.value = current\n el(\"fault-list\", HTMLElement).innerHTML = table(\n [\n { label: \"Id\", cell: (row: FaultRow) => esc(row.id) },\n {\n label: \"Match\",\n cell: (row: FaultRow) =>\n esc(\n [row.method, row.pathPrefix, row.operationId]\n .filter((part): part is string => Boolean(part))\n .join(\" \") || \"all\",\n ),\n },\n {\n label: \"Effect\",\n cell: (row: FaultRow) =>\n esc(row.status ?? row.effect ?? (row.drop ? \"drop\" : row.latencyMs || \"\")),\n },\n ],\n decodeFaults(faults),\n )\n }\n\n const renderJournal = async (): Promise<void> => {\n const journal = await api(\"GET\", \"/requests?limit=100\")\n el(\"journal\", HTMLElement).innerHTML = table(\n [\n { label: \"When\", cell: (row: JournalRow) => esc(journalWhen(row.at)) },\n {\n label: \"Method\",\n cell: (row: JournalRow) => `<span class=\"method\">${esc(row.method)}</span>`,\n },\n { label: \"Path\", cell: (row: JournalRow) => esc(row.path) },\n {\n label: \"Status\",\n cell: (row: JournalRow) =>\n `<span class=\"badge ${row.status.startsWith(\"2\") ? \"ok\" : row.status.startsWith(\"4\") || row.status.startsWith(\"5\") ? \"warn\" : \"\"}\">${esc(row.status)}</span>`,\n },\n { label: \"ms\", cell: (row: JournalRow) => esc(row.durationMs) },\n ],\n decodeJournal(journal),\n )\n }\n\n const paintRoutes = (): void => {\n const query = el(\"route-search\", HTMLInputElement).value.trim().toLocaleLowerCase()\n const routes = state.routes.filter((route) => route.toLocaleLowerCase().includes(query))\n el(\"route-count\", HTMLElement).textContent = `${routes.length} of ${state.routes.length}`\n if (state.routes.length === 0) {\n el(\"route-list\", HTMLElement).innerHTML =\n '<p class=\"empty\">No admin routes are available.</p>'\n return\n }\n if (routes.length === 0) {\n el(\"route-list\", HTMLElement).innerHTML = '<p class=\"empty\">No routes match this filter.</p>'\n return\n }\n el(\"route-list\", HTMLElement).innerHTML = routes\n .map((route) => {\n const extra = standard.has(route) ? \"\" : \" <span class='badge'>extension</span>\"\n const parts = route.split(\" \")\n const method = parts[0] ?? \"\"\n const path = parts.slice(1).join(\" \")\n return `<div class=\"route\"><span class=\"method\">${esc(method)}</span><span>${esc(path)}${extra}</span><button class=\"btn\" type=\"button\" data-route=\"${esc(route)}\" aria-label=\"Use ${esc(route)}\">Use</button></div>`\n })\n .join(\"\")\n }\n const renderRoutes = async (): Promise<void> => {\n const data = await api(\"GET\", \"/\")\n if (!isRecord(data)) throw new Error(\"Route list was not an object\")\n state.routes = requireList(data.routes, \"Routes\").map((route) => String(route))\n paintRoutes()\n }\n\n const renderers: Record<string, () => Promise<void>> = {\n overview: renderOverview,\n state: renderState,\n clock: renderClock,\n faults: renderFaults,\n journal: renderJournal,\n routes: renderRoutes,\n }\n let refreshToken = 0\n async function refresh(): Promise<void> {\n const token = ++refreshToken\n clearError()\n const main = el(\"views\", HTMLElement)\n const sync = el(\"sync-status\", HTMLElement)\n main.setAttribute(\"aria-busy\", \"true\")\n sync.classList.add(\"busy\")\n sync.textContent = \"Updating\"\n const render = renderers[state.view]\n try {\n if (render) await render()\n if (token === refreshToken) sync.textContent = \"Up to date\"\n } finally {\n if (token === refreshToken) {\n main.removeAttribute(\"aria-busy\")\n sync.classList.remove(\"busy\")\n }\n }\n }\n\n const delay = (ms: number): Promise<void> =>\n new Promise((resolve) => {\n window.setTimeout(resolve, ms)\n })\n /**\n * Keep the button pressed through the request, then show `done` before the\n * label returns. An action that leaves the screen unchanged still reads as finished.\n */\n const confirmAction = async (\n button: HTMLButtonElement,\n pending: string,\n done: string,\n work: () => Promise<unknown>,\n confirmLabel?: string,\n ): Promise<void> => {\n if (button.dataset.pending === \"1\") return\n const label = button.textContent ?? \"\"\n if (confirmLabel !== undefined && button.dataset.confirming !== \"1\") {\n button.dataset.confirming = \"1\"\n button.classList.add(\"confirming\")\n button.textContent = confirmLabel\n window.setTimeout(() => {\n if (button.dataset.confirming !== \"1\") return\n button.textContent = label\n button.classList.remove(\"confirming\")\n delete button.dataset.confirming\n }, 3000)\n return\n }\n button.classList.remove(\"confirming\")\n delete button.dataset.confirming\n const width = button.offsetWidth\n button.dataset.pending = \"1\"\n button.classList.add(\"pressed\")\n button.setAttribute(\"aria-busy\", \"true\")\n button.style.minWidth = `${width}px`\n button.textContent = pending\n try {\n await work()\n button.textContent = done\n await delay(1000)\n } catch (error) {\n showError(error)\n } finally {\n button.textContent = label\n button.style.minWidth = \"\"\n button.classList.remove(\"pressed\")\n button.removeAttribute(\"aria-busy\")\n delete button.dataset.pending\n }\n }\n\n const wireJsonEditor = (\n textareaId: string,\n highlightId: string,\n statusId: string,\n shellId: string,\n allowEmpty: boolean,\n ): (() => void) => {\n const textarea = el(textareaId, HTMLTextAreaElement)\n const highlight = el(highlightId, HTMLElement)\n const status = el(statusId, HTMLElement)\n const shell = el(shellId, HTMLElement)\n const sync = (): void => {\n const text = textarea.value\n highlight.innerHTML = `${highlightJsonText(text)}\\n`\n let valid = true\n let message = \"Valid JSON\"\n if (allowEmpty && text.trim() === \"\") message = \"No body\"\n else {\n try {\n readJson(text)\n } catch {\n valid = false\n message = \"Invalid JSON\"\n }\n }\n shell.classList.toggle(\"invalid\", !valid)\n status.classList.toggle(\"invalid\", !valid)\n status.textContent = message\n textarea.setAttribute(\"aria-invalid\", valid ? \"false\" : \"true\")\n }\n const syncScroll = (): void => {\n const preview = highlight.parentElement\n if (!(preview instanceof HTMLElement)) return\n preview.scrollTop = textarea.scrollTop\n preview.scrollLeft = textarea.scrollLeft\n }\n textarea.addEventListener(\"input\", sync)\n textarea.addEventListener(\"scroll\", syncScroll)\n sync()\n return sync\n }\n const syncRouteEditor = wireJsonEditor(\n \"route-body\",\n \"route-highlight\",\n \"route-json-status\",\n \"route-editor\",\n true,\n )\n const syncRecordEditor = wireJsonEditor(\n \"editor-value\",\n \"editor-highlight\",\n \"editor-json-status\",\n \"record-editor\",\n false,\n )\n for (const button of document.querySelectorAll(\"[data-format]\")) {\n if (!(button instanceof HTMLButtonElement)) continue\n button.addEventListener(\"click\", () => {\n const target = button.dataset.format\n if (target === undefined) return\n const textarea = document.getElementById(target)\n if (!(textarea instanceof HTMLTextAreaElement) || textarea.value.trim() === \"\") return\n try {\n textarea.value = JSON.stringify(readJson(textarea.value), null, 2) ?? \"\"\n textarea.dispatchEvent(new Event(\"input\"))\n textarea.focus()\n } catch {\n showError(new Error(\"Fix the JSON before formatting it\"))\n }\n })\n }\n document.addEventListener(\"click\", (event) => {\n const target = event.target\n if (!(target instanceof Element)) return\n const button = target.closest(\"button\")\n if (!(button instanceof HTMLButtonElement) || button.dataset.pending === \"1\") return\n button.classList.add(\"pressed\")\n const token = String(Date.now())\n button.dataset.press = token\n window.setTimeout(() => {\n if (button.dataset.press !== token || button.dataset.pending === \"1\") return\n button.classList.remove(\"pressed\")\n delete button.dataset.press\n }, 450)\n })\n\n el(\"namespace\", HTMLSelectElement).addEventListener(\"change\", () => {\n state.namespace = el(\"namespace\", HTMLSelectElement).value\n refresh().catch(showError)\n })\n keyInput.addEventListener(\"change\", () => {\n state.key = keyInput.value.trim()\n sessionStorage.setItem(\"mockingbird-admin-key\", state.key)\n refresh().catch(showError)\n })\n el(\"refresh\", HTMLButtonElement).addEventListener(\"click\", () => {\n confirmAction(el(\"refresh\", HTMLButtonElement), \"Refreshing...\", \"Updated\", () =>\n refresh(),\n ).catch(showError)\n })\n\n el(\"collections\", HTMLElement).addEventListener(\"click\", (event) => {\n const target = event.target\n if (!(target instanceof Element)) return\n const button = target.closest(\"[data-collection]\")\n if (!(button instanceof HTMLElement)) return\n const collection = button.dataset.collection\n if (collection === undefined) return\n state.collection = collection\n renderState().catch(showError)\n })\n el(\"records\", HTMLElement).addEventListener(\"click\", (event) => {\n const target = event.target\n if (!(target instanceof Element)) return\n const row = target.closest(\"[data-id]\")\n if (!(row instanceof HTMLElement)) return\n const id = row.dataset.id\n if (id === undefined) return\n openEditor(id).catch(showError)\n })\n\n const editor = el(\"editor\", HTMLDialogElement)\n const editorId = el(\"editor-id\", HTMLInputElement)\n const editorValue = el(\"editor-value\", HTMLTextAreaElement)\n const editorDelete = el(\"editor-delete\", HTMLButtonElement)\n async function openEditor(id: string | null): Promise<void> {\n state.editing = id\n el(\"editor-title\", HTMLElement).textContent = id ? \"Edit record\" : \"New record\"\n editorId.value = id ?? \"\"\n editorId.readOnly = id !== null\n editorDelete.hidden = id === null\n if (id) {\n const record = await api(\n \"GET\",\n `/state/${encodeURIComponent(state.collection)}/${encodeURIComponent(id)}`,\n )\n if (!isRecord(record)) throw new Error(\"Record response was not an object\")\n editorValue.value = JSON.stringify(record.value, null, 2) ?? \"\"\n } else {\n editorValue.value = \"{\\n \\n}\"\n }\n syncRecordEditor()\n editor.showModal()\n }\n el(\"new-record\", HTMLButtonElement).addEventListener(\"click\", () => {\n openEditor(null).catch(showError)\n })\n el(\"editor-form\", HTMLFormElement).addEventListener(\"submit\", (event) => {\n const submitter = event.submitter\n if (!(submitter instanceof HTMLButtonElement) || submitter.value !== \"save\") return\n event.preventDefault()\n let value: unknown\n try {\n value = readJson(editorValue.value)\n } catch {\n showError(new Error(\"Value is not JSON\"))\n return\n }\n const id = editorId.value.trim()\n const path = `/state/${encodeURIComponent(state.collection)}`\n const request = state.editing\n ? api(\"PUT\", `${path}/${encodeURIComponent(id)}`, { value })\n : api(\"POST\", path, { id: id || undefined, value })\n request\n .then(() => {\n editor.close()\n return renderState()\n })\n .catch(showError)\n })\n editorDelete.addEventListener(\"click\", () => {\n const id = state.editing\n if (!id) return\n confirmAction(\n editorDelete,\n \"Deleting...\",\n \"Deleted\",\n () =>\n api(\n \"DELETE\",\n `/state/${encodeURIComponent(state.collection)}/${encodeURIComponent(id)}`,\n ).then(() => {\n editor.close()\n return renderState()\n }),\n \"Confirm delete\",\n ).catch(showError)\n })\n\n for (const button of document.querySelectorAll(\"[data-advance]\")) {\n if (!(button instanceof HTMLButtonElement)) continue\n button.addEventListener(\"click\", () => {\n const raw = button.dataset.advance\n if (raw === undefined) return\n api(\"POST\", \"/clock\", { advance: Number(raw) })\n .then(() => renderClock())\n .catch(showError)\n })\n }\n el(\"freeze\", HTMLButtonElement).addEventListener(\"click\", () => {\n const frozen = el(\"freeze\", HTMLButtonElement).dataset.frozen === \"1\"\n api(\"POST\", \"/clock\", { freeze: !frozen })\n .then(() => renderClock())\n .catch(showError)\n })\n el(\"clock-reset\", HTMLButtonElement).addEventListener(\"click\", () => {\n api(\"POST\", \"/clock\", { reset: true })\n .then(() => renderClock())\n .catch(showError)\n })\n el(\"clock-set\", HTMLFormElement).addEventListener(\"submit\", (event) => {\n event.preventDefault()\n const raw = el(\"clock-instant\", HTMLInputElement).value.trim()\n const set = /^-?\\d+$/.test(raw) ? Number(raw) : raw\n api(\"POST\", \"/clock\", { set })\n .then(() => renderClock())\n .catch(showError)\n })\n\n el(\"fault-form\", HTMLFormElement).addEventListener(\"submit\", (event) => {\n event.preventDefault()\n const preset = el(\"fault-preset\", HTMLSelectElement).value\n if (preset !== \"\") {\n api(\"POST\", \"/faults\", { preset })\n .then(() => renderFaults())\n .catch(showError)\n return\n }\n const status = Number(el(\"fault-status\", HTMLInputElement).value)\n if (!Number.isFinite(status)) {\n showError(new Error(\"Status must be a number, or choose a preset\"))\n return\n }\n const path = el(\"fault-path\", HTMLInputElement).value\n const method = el(\"fault-method\", HTMLInputElement).value\n api(\"POST\", \"/faults\", {\n status,\n ...(path !== \"\" ? { pathPrefix: path } : {}),\n ...(method !== \"\" ? { method } : {}),\n })\n .then(() => renderFaults())\n .catch(showError)\n })\n el(\"fault-clear\", HTMLButtonElement).addEventListener(\"click\", () => {\n confirmAction(\n el(\"fault-clear\", HTMLButtonElement),\n \"Clearing...\",\n \"Cleared\",\n () => api(\"DELETE\", \"/faults\").then(() => renderFaults()),\n \"Confirm clear\",\n ).catch(showError)\n })\n el(\"journal-clear\", HTMLButtonElement).addEventListener(\"click\", () => {\n confirmAction(\n el(\"journal-clear\", HTMLButtonElement),\n \"Clearing...\",\n \"Cleared\",\n () => api(\"DELETE\", \"/requests\").then(() => renderJournal()),\n \"Confirm clear\",\n ).catch(showError)\n })\n\n el(\"route-list\", HTMLElement).addEventListener(\"click\", (event) => {\n const target = event.target\n if (!(target instanceof Element)) return\n const button = target.closest(\"[data-route]\")\n if (!(button instanceof HTMLElement)) return\n const route = button.dataset.route\n if (route === undefined) return\n state.route = route\n el(\"route-title\", HTMLElement).textContent = route\n el(\"route-send\", HTMLButtonElement).disabled = false\n const method = route.split(\" \")[0] ?? \"\"\n const routeBody = el(\"route-body\", HTMLTextAreaElement)\n routeBody.disabled = method === \"GET\" || method === \"DELETE\"\n el(\"route-editor\", HTMLElement).hidden = routeBody.disabled\n el(\"route-json-status\", HTMLElement).parentElement?.toggleAttribute(\n \"hidden\",\n routeBody.disabled,\n )\n syncRouteEditor()\n })\n el(\"route-search\", HTMLInputElement).addEventListener(\"input\", paintRoutes)\n el(\"route-form\", HTMLFormElement).addEventListener(\"submit\", (event) => {\n event.preventDefault()\n const send = async (): Promise<void> => {\n if (state.route === null) throw new Error(\"Choose a route first\")\n const parts = state.route.split(\" \")\n const method = parts[0]\n const path = parts.slice(1).join(\" \")\n if (method === undefined) throw new Error(\"Choose a route first\")\n const concrete = path.replace(\n /:([A-Za-z0-9_]+)/g,\n (_match, key: string) => prompt(`Value for ${key}`) || \"\",\n )\n let body: unknown\n const routeBody = el(\"route-body\", HTMLTextAreaElement)\n if (method !== \"GET\" && method !== \"DELETE\" && routeBody.value.trim() !== \"\") {\n try {\n body = readJson(routeBody.value)\n } catch {\n throw new Error(\"Body is not JSON\")\n }\n }\n const data = await api(method, concrete, body)\n const text = JSON.stringify(data, null, 2) ?? \"null\"\n el(\"route-result\", HTMLElement).innerHTML = `<code>${highlightJsonText(text)}</code>`\n }\n send().catch(showError)\n })\n\n type Panel = { id: string; title: string; description: string; html: string; script?: string }\n const decodePanel = (value: unknown): Panel | undefined => {\n if (!isRecord(value) || typeof value.id !== \"string\" || typeof value.title !== \"string\") {\n return undefined\n }\n const panel: Panel = {\n id: value.id,\n title: value.title,\n description: typeof value.description === \"string\" ? value.description : \"\",\n html: typeof value.html === \"string\" ? value.html : \"\",\n }\n if (typeof value.script === \"string\") panel.script = value.script\n return panel\n }\n type Extension =\n | (Panel & { kind: \"panel\" })\n | { kind: \"sql\"; id: string; title: string; description: string }\n const decodeExtension = (value: unknown): Extension | undefined => {\n if (!isRecord(value)) return undefined\n if (value.kind === \"sql\") {\n return {\n kind: \"sql\",\n id: typeof value.id === \"string\" && value.id !== \"\" ? value.id : \"sql\",\n title: typeof value.title === \"string\" && value.title !== \"\" ? value.title : \"SQL\",\n description:\n typeof value.description === \"string\"\n ? value.description\n : \"Browse tables and run queries.\",\n }\n }\n if (value.kind !== \"panel\") return undefined\n const panel = decodePanel(value)\n return panel === undefined ? undefined : { kind: \"panel\", ...panel }\n }\n const mountPanels = (panels: readonly Panel[]): void => {\n const nav = el(\"nav\", HTMLElement)\n const views = el(\"views\", HTMLElement)\n for (const panel of panels) {\n const button = document.createElement(\"button\")\n button.type = \"button\"\n button.dataset.view = panel.id\n button.textContent = panel.title\n nav.append(button)\n const section = document.createElement(\"section\")\n section.className = \"view\"\n section.id = `view-${panel.id}`\n section.hidden = true\n const title = document.createElement(\"h2\")\n title.textContent = panel.title\n const lede = document.createElement(\"p\")\n lede.className = \"lede\"\n lede.textContent = panel.description\n const body = document.createElement(\"div\")\n body.className = \"panel-body\"\n body.id = `panel-${panel.id}`\n body.innerHTML = panel.html\n section.append(title, lede, body)\n views.append(section)\n if (panel.script === undefined) continue\n try {\n const compiled: unknown = new Function(\"root\", \"api\", panel.script)\n if (!isPanelScript(compiled)) throw new Error(\"panel script did not compile\")\n compiled(body, panelApi)\n } catch (error) {\n const note = document.createElement(\"p\")\n note.className = \"banner show\"\n note.textContent = error instanceof Error ? error.message : String(error)\n body.append(note)\n }\n }\n }\n\n startAdminBrand({\n document,\n $: (id) => document.getElementById(id),\n params,\n location: { href: location.href, origin: location.origin },\n fetch,\n brandsUrl: config.brandsUrl,\n })\n loadNamespaces()\n .then(() => api(\"GET\", \"/ui/manifest\"))\n .then((manifest) => {\n const panels = requireList(\n isRecord(manifest) ? manifest.panels : undefined,\n \"Panels\",\n ).flatMap((panel) => {\n const decoded = decodePanel(panel)\n return decoded === undefined ? [] : [decoded]\n })\n mountPanels(panels)\n const extensions = requireList(\n isRecord(manifest) ? manifest.extensions : undefined,\n \"Extensions\",\n ).flatMap((extension) => {\n const decoded = decodeExtension(extension)\n return decoded === undefined ? [] : [decoded]\n })\n const extensionPanels = extensions.flatMap((extension) =>\n extension.kind === \"panel\" ? [extension] : [],\n )\n mountPanels(extensionPanels)\n for (const extension of extensions) {\n if (extension.kind !== \"sql\") continue\n const nav = el(\"nav\", HTMLElement)\n const views = el(\"views\", HTMLElement)\n const button = document.createElement(\"button\")\n button.type = \"button\"\n button.dataset.view = extension.id\n button.textContent = extension.title\n nav.append(button)\n const section = document.createElement(\"section\")\n section.className = \"view\"\n section.id = `view-${extension.id}`\n section.hidden = true\n const title = document.createElement(\"h2\")\n title.textContent = extension.title\n const lede = document.createElement(\"p\")\n lede.className = \"lede\"\n lede.textContent = extension.description\n const body = document.createElement(\"div\")\n body.className = \"panel-body\"\n section.append(title, lede, body)\n views.append(section)\n mountSqlExplorer(body, panelApi)\n }\n show(document.getElementById(`view-${state.view}`) === null ? \"overview\" : state.view)\n return refresh()\n })\n .catch(showError)\n}\n\nconst clientPrelude = [\n isRecord,\n highlightJsonText,\n mountAdminBrand,\n startAdminBrand,\n faultPresetList,\n mountSqlExplorer,\n bootAdmin,\n]\n .map((fn) => fn.toString())\n .join(\"\\n\")\n\n/**\n * The `<script>` embedded in the admin document, typechecked as {@link bootAdmin}.\n * The call uses `bootAdmin.name` because a bundle that includes this module once per\n * mock renames later copies (`bootAdmin2`, \u2026). `toString()` follows the rename, so a\n * literal `bootAdmin(` throws before the section buttons are wired.\n */\nexport const adminClientSource = (config: AdminBootConfig): string => {\n const payload = JSON.stringify(config).replace(/</g, \"\\\\u003c\")\n const entry = bootAdmin.name\n if (!/^[A-Za-z_$][\\w$]*$/.test(entry)) {\n throw new Error(\"admin client cannot call its boot function\")\n }\n return `<script>\\n${clientPrelude}\\n${entry}(${payload});\\n</script>`\n}\n", "import type { Clock } from \"./clock.js\"\nimport type { FaultRegistry, FaultRule } from \"./faults.js\"\nimport type { Journal } from \"./journal.js\"\nimport type { Metrics } from \"./metrics.js\"\n\n/** Unauthenticated readiness probe, served ahead of every vendor auth gate. */\nexport const HEALTH_PATH = \"/__admin/health\"\n/** Prefix of every control-plane route; never part of a vendor contract. */\nexport const ADMIN_PREFIX = \"/__admin\"\n/** Resolve once at construction; ambiguous URL forms are never accepted. */\nexport const resolveAdminPrefix = (prefix: string = ADMIN_PREFIX): string => {\n if (!/^\\/[A-Za-z0-9_-]+(?:\\/[A-Za-z0-9_-]+)*$/.test(prefix)) {\n throw new Error(\n \"adminPrefix must be an absolute non-root path of literal segments, without a trailing slash\",\n )\n }\n return prefix\n}\n\n/** Segment-boundary matching prevents /__administer from entering the control plane. */\nexport const isAdminPath = (path: string, prefix: string): boolean =>\n path === prefix || path.startsWith(`${prefix}/`)\n\n/** SDK base URL namespace carrier, entirely inside the configured internal route tree. */\nexport const matchNamespacePath = (path: string, prefix: string): RegExpExecArray | null =>\n /^\\/ns\\/([^/]+)(\\/.*)?$/.exec(isAdminPath(path, prefix) ? path.slice(prefix.length) : \"\")\n\n/** Fail before serving when the declared vendor contract overlaps the reserved tree. */\nexport const assertAdminPrefixAvailable = (prefix: string, paths: readonly string[]): void => {\n const reserved = prefix.split(\"/\").slice(1)\n for (const path of paths) {\n const segments = path.split(\"/\").slice(1)\n // Catch-all vendor roots (e.g. S3 /{bucket}/{key}) share the listener.\n // The internal tree is reserved before vendor dispatch, regardless of the wildcard.\n if (segments.length < reserved.length || /^\\{[^}]+\\}$/.test(segments[0] ?? \"\")) continue\n if (\n reserved.every((part, i) => segments[i] === part || /^\\{[^}]+\\}$/.test(segments[i] ?? \"\"))\n ) {\n throw new Error(\n `vendor route ${path} collides with adminPrefix ${prefix}; choose a different adminPrefix`,\n )\n }\n }\n}\n\n/** Carries the admin key, which is separate from any vendor credential. */\nexport const ADMIN_KEY_HEADER = \"x-mockingbird-admin-key\"\n/** Selects the isolated namespace a request reads and writes. */\nexport const NAMESPACE_HEADER = \"x-mockingbird-namespace\"\n\nexport type AdminRequest = {\n request: Request\n url: URL\n /** `:param` segments of the matched route. */\n params: Record<string, string>\n /** Namespace the request targets: `?namespace=`, then the header, then the default. */\n namespace: string\n /** Parsed JSON body, or `undefined` when there is none. */\n body: unknown\n}\n\nexport type AdminRoute = (request: AdminRequest) => Response | Promise<Response>\n\n/**\n * Service-specific admin routes, keyed `METHOD /path` relative to `/__admin`, with\n * `:param` segments \u2014 e.g. `\"POST /orders/:id/transition\"`.\n */\nexport type AdminRoutes = Record<string, AdminRoute>\n\nexport type ControlContext = {\n name: string\n startedAt: number\n wallNow: () => number\n clock: Clock\n namespaceClock?(namespace: string): Clock\n faults: FaultRegistry\n metrics: Metrics\n journal: Journal\n defaultNamespace: string\n namespaces(): string[]\n reset(namespace: string | \"*\"): Promise<void>\n timeTravel: {\n checkpoint(\n namespace: string,\n branch: string,\n ): { id: string; branch: string; parent: string | null; at: number; records?: number }\n branch(\n name: string,\n options: { namespace: string; at?: string },\n ): { id: string; branch: string; parent: string | null; at: number }\n checkout(checkpoint: string, options: { namespace: string; branch: string }): void\n retain(namespace: string, checkpoint: string): void\n release(namespace: string, checkpoint: string): boolean\n inspect(namespace: string): {\n branches: Readonly<Record<string, string>>\n checkpoints: readonly { id: string; branch: string; parent: string | null; at: number }[]\n }\n }\n /** Extra fields for `GET /__admin/health`, such as the loaded corpus version. */\n describe(): Record<string, unknown>\n routes: AdminRoutes\n adminPrefix?: string\n adminKey: string | undefined\n /** Expand a named fault preset; enables `POST /faults {\"preset\": \"<name>\"}`. */\n applyPreset?(name: string, namespace: string, overrides: Partial<FaultRule>): FaultRule[]\n}\n\nexport type ControlPlane = {\n /** The control-plane response for `request`, or `undefined` for a vendor request. */\n handle(request: Request): Promise<Response | undefined>\n /**\n * Namespace a vendor request targets, from {@link NAMESPACE_HEADER}. Only admin routes\n * also accept `?namespace=`, so a vendor query parameter of that name can never\n * silently reroute a request.\n */\n namespaceOf(request: Request): string\n}\n\nconst json = (status: number, body: unknown): Response =>\n new Response(JSON.stringify(body), {\n status,\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n })\n\n/** Admin errors use one documented shape, distinct from any vendor's error body. */\nconst adminError = (status: number, message: string): Response =>\n json(status, { error: { type: \"mockingbird_admin\", message } })\n\nconst UNITS: Record<string, number> = {\n ms: 1,\n s: 1000,\n m: 60_000,\n h: 3_600_000,\n d: 86_400_000,\n}\n\n/** Milliseconds from a number, or a duration like `\"90s\"`, `\"15m\"`, `\"2h\"`, `\"3d\"`. */\nexport const parseDuration = (value: unknown): number | undefined => {\n if (typeof value === \"number\" && Number.isFinite(value)) return value\n if (typeof value !== \"string\") return undefined\n const match = /^(-?\\d+(?:\\.\\d+)?)\\s*(ms|s|m|h|d)$/.exec(value.trim())\n if (!match) return undefined\n return Number(match[1]) * (UNITS[match[2] as string] as number)\n}\n\n/** Epoch milliseconds from a number or an ISO-8601 string. */\nconst parseInstant = (value: unknown): number | undefined => {\n if (typeof value === \"number\" && Number.isFinite(value)) return value\n if (typeof value !== \"string\") return undefined\n const parsed = Date.parse(value)\n return Number.isNaN(parsed) ? undefined : parsed\n}\n\nconst matchRoute = (pattern: string, path: string): Record<string, string> | undefined => {\n const want = pattern.split(\"/\").filter(Boolean)\n const have = path.split(\"/\").filter(Boolean)\n if (want.length !== have.length) return undefined\n const params: Record<string, string> = {}\n for (let i = 0; i < want.length; i++) {\n const segment = want[i] as string\n const actual = have[i] as string\n if (segment.startsWith(\":\")) params[segment.slice(1)] = decodeURIComponent(actual)\n else if (segment !== actual) return undefined\n }\n return params\n}\n\nconst readJson = async (request: Request): Promise<unknown> => {\n const text = await request.text()\n if (text.trim() === \"\") return undefined\n return JSON.parse(text) as unknown\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nexport const createControlPlane = (context: ControlContext): ControlPlane => {\n const adminPrefix = resolveAdminPrefix(context.adminPrefix)\n // Legacy snapshot ids are opaque aliases to pinned Timeline checkpoints. Timeline remains the\n // only history owner; this map carries no state value and can be removed with the alias.\n const snapshots = new Map<string, { namespace: string; checkpoint: string }>()\n let snapshotCounter = 0\n\n const headerNamespace = (request: Request): string =>\n request.headers.get(NAMESPACE_HEADER) ?? context.defaultNamespace\n const adminNamespace = (request: Request, url: URL): string =>\n url.searchParams.get(\"namespace\") ?? headerNamespace(request)\n\n const health = (): Response => {\n return json(200, {\n ...context.describe(),\n status: \"ok\",\n service: context.name,\n uptimeMs: context.wallNow() - context.startedAt,\n clock: context.clock.state(),\n namespaces: context.namespaces().length,\n adminPrefix,\n adminUi: `${adminPrefix}/ui`,\n })\n }\n\n const builtin: AdminRoutes = {\n \"GET /health\": health,\n \"GET /\": () =>\n json(200, {\n service: context.name,\n routes: [...Object.keys(builtin), ...Object.keys(context.routes)].sort(),\n }),\n\n \"POST /reset\": async ({ url, namespace }) => {\n const target = url.searchParams.get(\"all\") === \"1\" ? \"*\" : namespace\n await context.reset(target)\n return json(200, { status: \"ok\", reset: target === \"*\" ? context.namespaces() : [target] })\n },\n\n \"GET /namespaces\": () =>\n json(200, { default: context.defaultNamespace, namespaces: context.namespaces() }),\n\n \"GET /clock\": ({ namespace }) =>\n json(200, (context.namespaceClock?.(namespace) ?? context.clock).state()),\n \"POST /clock\": ({ body, namespace }) => {\n const clock = context.namespaceClock?.(namespace) ?? context.clock\n if (!isRecord(body)) return adminError(400, \"expected a JSON object\")\n if (body.reset === true) clock.reset()\n // Freeze before applying mutations so a compound `{ set, freeze: true }` request is\n // atomic. Setting a live clock adjusts its offset; freezing it afterward would read the\n // wall clock again and could pin it a millisecond past the requested instant.\n if (body.freeze === true) clock.freeze()\n if (body.set !== undefined) {\n const instant = parseInstant(body.set)\n if (instant === undefined) return adminError(400, \"set: expected epoch ms or ISO-8601\")\n clock.set(instant)\n }\n if (body.advance !== undefined) {\n const delta = parseDuration(body.advance)\n if (delta === undefined) return adminError(400, 'advance: expected ms or \"15m\"-style')\n clock.advance(delta)\n }\n if (body.freeze === false) clock.unfreeze()\n return json(200, clock.state())\n },\n\n \"GET /faults\": () => json(200, { faults: context.faults.list() }),\n \"POST /faults\": ({ body, namespace }) => {\n if (isRecord(body) && typeof body.preset === \"string\") {\n if (!context.applyPreset) return adminError(400, `${context.name} has no fault presets`)\n const { preset, ...overrides } = body\n try {\n return json(201, {\n preset,\n rules: context.applyPreset(preset, namespace, overrides as Partial<FaultRule>),\n })\n } catch (error) {\n return adminError(404, error instanceof Error ? error.message : String(error))\n }\n }\n if (\n !isRecord(body) ||\n (typeof body.status !== \"number\" &&\n typeof body.delayMs !== \"number\" &&\n typeof body.latencyMs !== \"number\" &&\n body.drop !== true &&\n typeof body.effect !== \"string\")\n ) {\n return adminError(\n 400,\n \"a fault needs a numeric status, a delayMs/latencyMs, drop: true, an effect, or a preset\",\n )\n }\n const rule = {\n // Scoped to the caller's namespace unless it asks for every one, so one worker's\n // injected failure never lands on another's request.\n namespace,\n ...body,\n id: typeof body.id === \"string\" ? body.id : `fault_${context.faults.list().length + 1}`,\n } as FaultRule\n return json(201, context.faults.add(rule))\n },\n \"DELETE /faults\": ({ url }) => {\n const id = url.searchParams.get(\"id\")\n if (id === null) {\n context.faults.clear()\n return json(200, { status: \"ok\" })\n }\n return context.faults.remove(id)\n ? json(200, { status: \"ok\" })\n : adminError(404, `no fault ${id}`)\n },\n\n \"POST /snapshots\": ({ namespace }) => {\n const point = context.timeTravel.checkpoint(namespace, \"main\")\n context.timeTravel.retain(namespace, point.id)\n snapshotCounter++\n const id = `snap_${snapshotCounter}`\n snapshots.set(id, { namespace, checkpoint: point.id })\n return json(201, { id, namespace, records: point.records ?? 0 })\n },\n \"POST /snapshots/:id/restore\": ({ params, namespace }) => {\n const alias = snapshots.get(params.id as string)\n if (!alias) return adminError(404, `no snapshot ${params.id}`)\n if (alias.namespace !== namespace) {\n return adminError(409, `snapshot ${params.id} belongs to namespace ${alias.namespace}`)\n }\n context.timeTravel.checkout(alias.checkpoint, { namespace, branch: \"main\" })\n return json(200, { status: \"ok\", id: params.id, namespace })\n },\n \"DELETE /snapshots/:id\": ({ params }) => {\n const id = params.id as string\n const alias = snapshots.get(id)\n if (!alias) return adminError(404, `no snapshot ${id}`)\n snapshots.delete(id)\n context.timeTravel.release(alias.namespace, alias.checkpoint)\n return json(200, { status: \"ok\" })\n },\n\n \"GET /timeline\": ({ namespace }) => json(200, context.timeTravel.inspect(namespace)),\n \"POST /checkpoints\": ({ body, namespace }) => {\n const branch = isRecord(body) && typeof body.branch === \"string\" ? body.branch : \"main\"\n try {\n return json(201, context.timeTravel.checkpoint(namespace, branch))\n } catch (error) {\n return adminError(409, error instanceof Error ? error.message : String(error))\n }\n },\n \"POST /branches/:name\": ({ params, body, namespace }) => {\n const at = isRecord(body) && typeof body.at === \"string\" ? body.at : undefined\n try {\n return json(\n 201,\n context.timeTravel.branch(params.name as string, {\n namespace,\n ...(at !== undefined ? { at } : {}),\n }),\n )\n } catch (error) {\n return adminError(409, error instanceof Error ? error.message : String(error))\n }\n },\n \"POST /branches/:name/checkout\": ({ params, body, namespace }) => {\n if (!isRecord(body) || typeof body.checkpoint !== \"string\") {\n return adminError(400, 'expected {\"checkpoint\":\"cp_...\"}')\n }\n try {\n context.timeTravel.checkout(body.checkpoint, {\n namespace,\n branch: params.name as string,\n })\n return json(200, { status: \"ok\", branch: params.name, checkpoint: body.checkpoint })\n } catch (error) {\n return adminError(409, error instanceof Error ? error.message : String(error))\n }\n },\n\n \"GET /requests\": ({ url, namespace }) => {\n const status = url.searchParams.get(\"status\")\n const since = url.searchParams.get(\"since\")\n const limit = url.searchParams.get(\"limit\")\n const sinceMs =\n since === null ? undefined : parseInstant(/^\\d+$/.test(since) ? Number(since) : since)\n if (since !== null && sinceMs === undefined) {\n return adminError(400, \"since: expected epoch ms or ISO-8601\")\n }\n if (status !== null && !/^\\d{3}$/.test(status))\n return adminError(400, \"status: expected an HTTP status\")\n if (limit !== null && !/^\\d+$/.test(limit)) return adminError(400, \"limit: expected a count\")\n const operationId = url.searchParams.get(\"operationId\")\n const everyNamespace = url.searchParams.get(\"all\") === \"1\"\n return json(200, {\n size: context.journal.size,\n requests: context.journal.list({\n ...(everyNamespace ? {} : { namespace }),\n ...(operationId !== null ? { operationId } : {}),\n ...(status !== null ? { status: Number(status) } : {}),\n ...(sinceMs !== undefined ? { since: sinceMs } : {}),\n ...(limit !== null ? { limit: Number(limit) } : {}),\n }),\n })\n },\n \"DELETE /requests\": ({ url, namespace }) => {\n context.journal.clear(url.searchParams.get(\"all\") === \"1\" ? undefined : namespace)\n return json(200, { status: \"ok\" })\n },\n\n \"GET /metrics\": () => json(200, context.metrics.report()),\n \"DELETE /metrics\": () => {\n context.metrics.reset()\n return json(200, { status: \"ok\" })\n },\n }\n\n for (const key of Object.keys(context.routes)) {\n if (Object.hasOwn(builtin, key)) throw new Error(`admin route ${key} overrides a shared route`)\n const path = key.slice(key.indexOf(\" \") + 1)\n if (isAdminPath(path, \"/ns\") || isAdminPath(path, \"/blobs\"))\n throw new Error(`admin route ${key} overlaps an internal transport`)\n }\n const routes = [...Object.entries(builtin), ...Object.entries(context.routes)].map(\n ([key, handler]) => {\n const space = key.indexOf(\" \")\n return { method: key.slice(0, space), pattern: key.slice(space + 1), handler }\n },\n )\n\n return {\n namespaceOf: headerNamespace,\n async handle(request) {\n const url = new URL(request.url)\n if (url.pathname === `${adminPrefix}/health` && request.method === \"GET\") {\n return health()\n }\n if (!isAdminPath(url.pathname, adminPrefix)) {\n return undefined\n }\n const path = url.pathname.slice(adminPrefix.length) || \"/\"\n // The shell has no data. Panel markup stays on GET /ui/manifest, which is locked.\n const shell = request.method === \"GET\" && (path === \"/ui\" || path === \"/ui/\")\n if (\n !shell &&\n context.adminKey !== undefined &&\n request.headers.get(ADMIN_KEY_HEADER) !== context.adminKey\n ) {\n return adminError(401, `missing or wrong ${ADMIN_KEY_HEADER}`)\n }\n for (const route of routes) {\n if (route.method !== request.method) continue\n let params: Record<string, string> | undefined\n try {\n params = matchRoute(route.pattern, path)\n } catch {\n return adminError(400, \"invalid path encoding\")\n }\n if (!params) continue\n let body: unknown\n try {\n body = await readJson(request)\n } catch {\n return adminError(400, \"request body is not valid JSON\")\n }\n const namespace = adminNamespace(request, url)\n if (!/^[A-Za-z0-9_.-]{1,64}$/.test(namespace)) return adminError(400, \"invalid namespace\")\n return route.handler({\n request,\n url,\n params,\n namespace,\n body,\n })\n }\n return adminError(\n 404,\n `no admin route ${request.method} ${path}; GET ${adminPrefix} lists them`,\n )\n },\n }\n}\n", "import type { SqliteClient } from \"@crvouga/mockingbird-sqlite\"\nimport type { Clock, ClockState } from \"./clock.js\"\nimport type { CredentialRegistry } from \"./credentials.js\"\nimport type { FaultRegistry, FaultRule } from \"./faults.js\"\nimport type { Journal } from \"./journal.js\"\nimport type { Metrics } from \"./metrics.js\"\nimport type { Rng } from \"./rng.js\"\nimport type { NamespaceSnapshot } from \"./snapshot.js\"\nimport type { StateView } from \"./state-view.js\"\n\n/**\n * What every mock can be called with. A service may accept more fields \u2014 accounts,\n * catalogs, webhook endpoints \u2014 and those stay optional so `createRuntime()` and\n * `createRuntime({ seed, adminKey })` work everywhere.\n */\nexport type MockCreateOptions = {\n sqlite?: SqliteClient\n clock?: Clock\n seed?: number | string\n /** All internal HTTP paths live below this prefix. Default /__admin. */\n adminPrefix?: string\n adminKey?: string\n}\n\n/** A checkpoint head the admin client can show. Services may return a richer object. */\nexport type MockCheckpoint = {\n readonly id: string\n readonly branch: string\n readonly parent: string | null\n readonly at: number\n}\n\n/** The instance behind one namespace. Vendor methods sit beside these, not instead of them. */\nexport type MockInstanceSurface = {\n fetch(request: Request): Promise<Response>\n reset(): Promise<void>\n}\n\n/**\n * The interface every mock runtime implements.\n *\n * Assignability is one way: a service may add methods (`tick`, a typed webhook hub,\n * account directories) and narrower property types. Removing or renaming a member\n * fails the typecheck. The HTTP control plane (`/__admin/health`, `/__admin/*`) is the same\n * contract on the wire; {@link STANDARD_ADMIN_ROUTES} is that list.\n */\nexport type MockSurface = {\n readonly name: string\n fetch(request: Request): Promise<Response>\n readonly clock: Clock\n readonly faults: FaultRegistry\n readonly metrics: Metrics\n readonly journal: Journal\n readonly rng: Rng\n readonly credentials: CredentialRegistry\n /** Present on every runtime. `undefined` when the service has no outbound webhooks. */\n readonly webhooks: unknown\n applyPreset(name: string, namespace?: string, overrides?: Partial<FaultRule>): FaultRule[]\n instance(namespace?: string): MockInstanceSurface\n namespaces(): string[]\n reset(namespace?: string): Promise<void>\n snapshot(namespace?: string): NamespaceSnapshot\n restore(snapshot: NamespaceSnapshot, namespace?: string): void\n checkpoint(namespace?: string, branch?: string): MockCheckpoint\n branch(name: string, options?: { namespace?: string; at?: string }): MockCheckpoint\n checkout(checkpoint: string, options?: { namespace?: string; branch?: string }): void\n timeline(namespace?: string): {\n head(branch?: string): { readonly id: string } | undefined\n branches(): Readonly<Record<string, string>>\n }\n /** Collections in `namespace`, declared by the service and inferred from stored rows. */\n state(namespace?: string): StateView\n readonly sqlite: SqliteClient\n}\n\n/**\n * Keep a service's own runtime type while proving it is a {@link MockSurface}.\n * Extra members stay. A missing member is a type error at the definition.\n */\nexport const defineMock = <T extends MockSurface>(runtime: T): T => runtime\n\n/** Clock state is part of the surface so admin clients can render it without a cast. */\nexport type MockClockState = ClockState\n\n/**\n * Admin routes every mock answers. A service adds its own keys beside these.\n * A key in this list keeps the shared handler, so the state API and the admin UI\n * stay the same when a service also ships vendor-specific controls.\n */\nexport const STANDARD_ADMIN_ROUTES = [\n \"GET /\",\n \"GET /health\",\n \"POST /reset\",\n \"GET /namespaces\",\n \"GET /clock\",\n \"POST /clock\",\n \"GET /faults\",\n \"POST /faults\",\n \"DELETE /faults\",\n \"POST /snapshots\",\n \"POST /snapshots/:id/restore\",\n \"DELETE /snapshots/:id\",\n \"GET /timeline\",\n \"POST /checkpoints\",\n \"POST /branches/:name\",\n \"POST /branches/:name/checkout\",\n \"GET /requests\",\n \"DELETE /requests\",\n \"GET /metrics\",\n \"DELETE /metrics\",\n \"GET /credentials\",\n \"PUT /credentials\",\n \"DELETE /credentials\",\n \"GET /state\",\n \"GET /state/:collection\",\n \"GET /state/:collection/:id\",\n \"POST /state/:collection\",\n \"PUT /state/:collection/:id\",\n \"PATCH /state/:collection/:id\",\n \"DELETE /state/:collection/:id\",\n \"GET /ui\",\n \"GET /ui/\",\n \"GET /ui/manifest\",\n] as const\n\nexport type StandardAdminRoute = (typeof STANDARD_ADMIN_ROUTES)[number]\n\n/**\n * A contribution the admin shell mounts beside the shared views.\n * `panel` is author-owned markup. `sql` turns on the built-in table explorer\n * and query runner, which call `GET /sql/tables` and `POST /sql/query`.\n */\nexport type AdminExtension =\n | {\n kind: \"panel\"\n id: string\n title: string\n description?: string\n html: string\n script?: string\n }\n | {\n kind: \"sql\"\n /** DOM id suffix. Default `sql`. */\n id?: string\n title?: string\n description?: string\n }\n\n/** A panel the default admin shell mounts after the shared views. */\nexport type AdminPanel = {\n /** DOM id suffix. Lowercase letters, digits, and hyphens. */\n id: string\n title: string\n description?: string\n /** Markup placed inside the panel body. The service author owns it. */\n html: string\n /**\n * Function body called as `(root, api) => void` once the shell has loaded.\n * `root` is the panel body. `api` is `{ get, send, namespace }` against `/__admin`.\n */\n script?: string\n}\n\n/**\n * How a service customizes the admin UI without leaving the shared shell.\n * `panels` add views. `render` replaces the document and can call `defaultHtml()`\n * to wrap the shared shell instead of discarding it.\n */\nexport type AdminUi = {\n panels?: readonly AdminPanel[]\n /** First-class shell contributions. `sql` mounts the shared database explorer. */\n extensions?: readonly AdminExtension[]\n render?: (input: { service: string; defaultHtml: () => string }) => string\n}\n\nconst PANEL_ID = /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/\nconst RESERVED_VIEWS = new Set([\"overview\", \"state\", \"clock\", \"faults\", \"journal\", \"routes\"])\n\nconst checkPanel = (\n panel: { id: string; title: string },\n seen: Set<string>,\n label: string,\n): void => {\n if (!PANEL_ID.test(panel.id)) {\n throw new RangeError(`${label} id must match ${PANEL_ID}: ${JSON.stringify(panel.id)}`)\n }\n if (RESERVED_VIEWS.has(panel.id)) {\n throw new RangeError(`${label} id ${panel.id} is reserved by the admin shell`)\n }\n if (seen.has(panel.id)) throw new RangeError(`duplicate admin view id ${panel.id}`)\n seen.add(panel.id)\n if (panel.title.trim() === \"\") throw new RangeError(`${label} ${panel.id} needs a title`)\n}\n\n/** Reject a panel or extension the shell cannot mount. Called when the runtime is created. */\nexport const assertAdminUi = (ui: AdminUi | undefined): void => {\n if (!ui) return\n const seen = new Set<string>()\n for (const panel of ui.panels ?? []) checkPanel(panel, seen, \"admin panel\")\n for (const extension of ui.extensions ?? []) {\n if (extension.kind === \"panel\") {\n checkPanel(extension, seen, \"admin extension\")\n continue\n }\n const id = extension.id ?? \"sql\"\n checkPanel({ id, title: extension.title ?? \"SQL\" }, seen, \"admin extension\")\n }\n}\n", "import { CSS_RESET } from \"@crvouga/mockingbird-ui\"\nimport { adminClientSource } from \"./admin-client.js\"\nimport type { AdminRoutes } from \"./control.js\"\nimport { ADMIN_KEY_HEADER, ADMIN_PREFIX } from \"./control.js\"\nimport type { AdminExtension, AdminUi } from \"./surface.js\"\nimport { STANDARD_ADMIN_ROUTES } from \"./surface.js\"\n\nconst escapeHtml = (value: string): string =>\n value.replace(/[&<>\"']/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&amp;\"\n case \"<\":\n return \"&lt;\"\n case \">\":\n return \"&gt;\"\n case '\"':\n return \"&quot;\"\n default:\n return \"&#39;\"\n }\n })\n\n/**\n * Docs-site record of each service's logo, website, vendor API reference, and guide.\n * This address is the only brand data in the bundle. The payload is fetched when the\n * page opens, so a docs deploy updates every already-published admin.\n * `?brands=` may name a localhost or same-origin copy of that JSON.\n */\nexport const ADMIN_BRANDS_URL = \"https://mockingbird.chrisvouga.dev/brands.json\"\n\n/**\n * The default admin document. It talks only to `/__admin/*`, so every mock can serve it.\n * Bespoke panels arrive later from `GET /ui/manifest`, which stays behind the admin key.\n * The header chip is filled from {@link ADMIN_BRANDS_URL}; nothing about a vendor is inlined.\n */\nexport const renderAdminDocument = (service: string, adminPrefix = ADMIN_PREFIX): string => {\n const name = escapeHtml(service)\n const script = adminClientSource({\n standardRoutes: STANDARD_ADMIN_ROUTES,\n adminPrefix,\n adminKeyHeader: ADMIN_KEY_HEADER,\n brandsUrl: ADMIN_BRANDS_URL,\n service,\n })\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta name=\"color-scheme\" content=\"light dark\">\n<link rel=\"icon\" href=\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Crect width='16' height='16' rx='2' fill='%2327272a'/%3E%3C/svg%3E\">\n<title>${name} admin</title>\n<style>\n ${CSS_RESET}\n :root {\n color-scheme: light;\n --bg: #f7f8fb;\n --bg-elev: #ffffff;\n --bg-muted: #f1f3f7;\n --bg-inset: #f8f9fc;\n --line: #e4e7ec;\n --line-strong: #cfd4dc;\n --ink: #101828;\n --muted: #475467;\n --faint: #667085;\n --accent: #6941c6;\n --accent-hover: #5933b4;\n --accent-ink: #ffffff;\n --accent-soft: #f4f0ff;\n --ok: #067647;\n --ok-soft: #ecfdf3;\n --warn: #b54708;\n --warn-soft: #fffaeb;\n --err: #b42318;\n --err-soft: #fef3f2;\n --code-key: #6941c6;\n --code-string: #067647;\n --code-number: #175cd3;\n --code-boolean: #c11574;\n --code-null: #667085;\n --shadow-xs: 0 1px 2px rgb(16 24 40 / 0.05);\n --shadow-sm: 0 1px 3px rgb(16 24 40 / 0.08), 0 1px 2px rgb(16 24 40 / 0.04);\n --shadow-lg: 0 18px 48px rgb(16 24 40 / 0.16), 0 4px 12px rgb(16 24 40 / 0.08);\n --sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n --mono: ui-monospace, \"SF Mono\", SFMono-Regular, Menlo, Consolas, monospace;\n --radius: 12px;\n --header: 72px;\n --nav: 224px;\n }\n :root[data-theme=\"dark\"] {\n color-scheme: dark;\n --bg: #0c0e14;\n --bg-elev: #151821;\n --bg-muted: #20232e;\n --bg-inset: #11141c;\n --line: #2b303d;\n --line-strong: #414858;\n --ink: #f5f7fa;\n --muted: #b6bdc9;\n --faint: #8d96a7;\n --accent: #9e77ed;\n --accent-hover: #b692f6;\n --accent-ink: #ffffff;\n --accent-soft: #2b2142;\n --ok: #75e0a7;\n --ok-soft: #102a20;\n --warn: #fec84b;\n --warn-soft: #302611;\n --err: #fda29b;\n --err-soft: #321817;\n --code-key: #c3a6ff;\n --code-string: #75e0a7;\n --code-number: #84adff;\n --code-boolean: #f9a8d4;\n --code-null: #98a2b3;\n --shadow-xs: 0 1px 2px rgb(0 0 0 / 0.24);\n --shadow-sm: 0 4px 12px rgb(0 0 0 / 0.2);\n --shadow-lg: 0 20px 56px rgb(0 0 0 / 0.45);\n }\n @media (prefers-color-scheme: dark) {\n :root:not([data-theme=\"light\"]) {\n color-scheme: dark;\n --bg: #0c0e14;\n --bg-elev: #151821;\n --bg-muted: #20232e;\n --bg-inset: #11141c;\n --line: #2b303d;\n --line-strong: #414858;\n --ink: #f5f7fa;\n --muted: #b6bdc9;\n --faint: #8d96a7;\n --accent: #9e77ed;\n --accent-hover: #b692f6;\n --accent-ink: #ffffff;\n --accent-soft: #2b2142;\n --ok: #75e0a7;\n --ok-soft: #102a20;\n --warn: #fec84b;\n --warn-soft: #302611;\n --err: #fda29b;\n --err-soft: #321817;\n --code-key: #c3a6ff;\n --code-string: #75e0a7;\n --code-number: #84adff;\n --code-boolean: #f9a8d4;\n --code-null: #98a2b3;\n --shadow-xs: 0 1px 2px rgb(0 0 0 / 0.24);\n --shadow-sm: 0 4px 12px rgb(0 0 0 / 0.2);\n --shadow-lg: 0 20px 56px rgb(0 0 0 / 0.45);\n }\n }\n /* Fill the viewport, then grow with the content so the background covers the scroll. */\n html { height: 100%; }\n body {\n margin: 0;\n min-height: 100%;\n display: flex;\n flex-direction: column;\n font-family: var(--sans);\n background: var(--bg);\n color: var(--ink);\n line-height: 1.45;\n padding-left: env(safe-area-inset-left);\n padding-right: env(safe-area-inset-right);\n -webkit-text-size-adjust: 100%;\n }\n ::selection { background: color-mix(in srgb, var(--accent) 28%, transparent); }\n :focus-visible { outline: 3px solid color-mix(in srgb, var(--accent) 45%, transparent); outline-offset: 2px; }\n button, input, select, textarea { transition: border-color 140ms ease, box-shadow 140ms ease, transform 100ms ease; }\n button:disabled, input:disabled, select:disabled, textarea:disabled { cursor: not-allowed; opacity: 0.55; }\n .app { flex: 1 0 auto; display: flex; flex-direction: column; min-width: 0; width: 100%; }\n header.top {\n position: sticky; top: 0; z-index: 20;\n display: flex; align-items: center; gap: 12px;\n min-height: var(--header); padding: 12px 20px;\n background: color-mix(in srgb, var(--bg-elev) 92%, transparent);\n backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);\n border-bottom: 1px solid var(--line);\n min-width: 0; max-width: 100%;\n }\n .brand {\n display: flex; flex-flow: row wrap; align-items: center; gap: 14px;\n min-width: 0; max-width: 100%; margin-right: auto;\n }\n .brand-lockup { display: flex; align-items: center; gap: 10px; min-width: 0; }\n .brand-mark {\n width: 38px; height: 38px; display: grid; place-items: center; flex: none;\n border-radius: 11px; color: #fff;\n background: linear-gradient(145deg, #7f56d9 0%, #53389e 100%);\n box-shadow: 0 6px 16px rgb(105 65 198 / 0.24), inset 0 1px 0 rgb(255 255 255 / 0.25);\n }\n .brand-mark svg { width: 22px; height: 22px; }\n .brand-id { display: flex; flex-direction: column; min-width: 0; flex: none; line-height: 1.25; }\n .brand-id strong { font-size: 15px; letter-spacing: -0.015em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .brand-id span { color: var(--faint); font-size: 12px; }\n .vendor {\n display: flex; flex-wrap: wrap; align-items: center; gap: 6px;\n min-width: 0; max-width: 100%; font-size: 12px; color: var(--muted);\n padding: 5px 8px; border: 1px solid var(--line); border-radius: 999px; background: var(--bg-inset);\n }\n .vendor[hidden] { display: none; }\n /* Logos are drawn for a light tile, same as the docs site, so the plate stays white. */\n .vendor img {\n width: 16px; height: 16px; padding: 2px; box-sizing: content-box;\n border-radius: 4px; border: 1px solid var(--line); background: #fff; object-fit: contain;\n }\n .vendor-name { color: var(--ink); font-weight: 600; }\n .vendor-sep { color: var(--faint); }\n .vendor-link { color: inherit; text-decoration: none; }\n .vendor-link:hover { color: var(--ink); text-decoration: underline; }\n .controls { display: flex; flex-wrap: wrap; gap: 8px; align-items: flex-end; }\n .sync-status { align-self: center; display: flex; align-items: center; gap: 6px; color: var(--faint); font-size: 12px; white-space: nowrap; }\n .sync-status::before { content: \"\"; width: 7px; height: 7px; border-radius: 50%; background: var(--ok); box-shadow: 0 0 0 3px var(--ok-soft); }\n .sync-status.busy::before { background: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); animation: pulse 1.2s ease-in-out infinite; }\n label.field { display: flex; flex-direction: column; gap: 4px; font-size: 11px; font-weight: 600; color: var(--faint); }\n label.field input, label.field select, .controls input[type=\"password\"] {\n background-color: var(--bg-elev); border: 1px solid var(--line-strong); border-radius: 9px;\n padding: 8px 10px; min-height: 38px; line-height: 1.2; box-shadow: var(--shadow-xs);\n }\n label.field input:hover, label.field select:hover, textarea:hover { border-color: color-mix(in srgb, var(--accent) 38%, var(--line-strong)); }\n label.field input:focus, label.field select:focus, textarea:focus { border-color: var(--accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 15%, transparent); outline: none; }\n /* A native menu ignores min-height, so Preset rendered about half as tall as\n the text fields in the same form. Paint it like those fields. */\n label.field select {\n -webkit-appearance: none; appearance: none;\n padding-right: 28px;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='none' stroke='%2371717a' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' d='M2.5 4.5 6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat; background-position: right 10px center; background-size: 12px 12px;\n }\n .stack > .field > input,\n .stack > .field > select,\n .stack > .field > textarea,\n dialog .field > input,\n dialog .field > select,\n dialog .field > textarea { width: 100%; }\n .icon-btn, .btn, .btn-primary, .btn-quiet, .btn-danger, nav.side button { cursor: pointer; }\n .icon-btn, .btn, .btn-primary, .btn-quiet, .btn-danger {\n display: inline-flex; align-items: center; justify-content: center; gap: 7px;\n border-radius: 9px; min-height: 38px; padding: 0 13px; border: 1px solid var(--line-strong);\n background: var(--bg-elev); color: var(--ink); font-size: 13px; font-weight: 600; line-height: 1;\n box-shadow: var(--shadow-xs);\n }\n .icon-btn { width: 38px; padding: 0; }\n .icon-btn svg, .btn svg, .btn-primary svg { width: 16px; height: 16px; }\n .icon-btn:hover, .btn:hover { background: var(--bg-muted); border-color: var(--line-strong); }\n .btn-primary { background: var(--accent); color: var(--accent-ink); border-color: var(--accent); box-shadow: 0 1px 2px rgb(16 24 40 / 0.08), 0 0 0 1px rgb(255 255 255 / 0.08) inset; }\n .btn-primary:hover { background: var(--accent-hover); border-color: var(--accent-hover); }\n .btn-quiet { background: transparent; border-color: transparent; box-shadow: none; }\n .btn-quiet:hover { background: var(--bg-muted); }\n .btn-danger { color: var(--err); border-color: color-mix(in srgb, var(--err) 25%, var(--line)); }\n .btn-danger:hover, .btn-danger.confirming { background: var(--err-soft); border-color: color-mix(in srgb, var(--err) 45%, var(--line)); }\n /* Held after mouseup. Clearing an empty journal changes nothing on screen,\n so the press itself has to stay visible. */\n .icon-btn:active, .btn:active, .btn-quiet:active, .btn-danger:active, nav.side button:active,\n .icon-btn.pressed, .btn.pressed, .btn-quiet.pressed, .btn-danger.pressed, nav.side button.pressed {\n background: var(--bg-inset); border-color: var(--line-strong); color: var(--ink);\n }\n .btn-danger:active, .btn-danger.pressed { background: var(--err-soft); color: var(--err); }\n .btn-primary:active, .btn-primary.pressed { filter: brightness(0.88); color: var(--accent-ink); }\n /* minmax(0, 1fr): a 1fr column will not shrink below its content, so a long\n record or the full nav row would widen the page past the viewport. */\n .layout {\n display: grid; grid-template-columns: var(--nav) minmax(0, 1fr);\n flex: 1 0 auto; min-width: 0;\n }\n nav.side {\n position: sticky; top: var(--header); align-self: start; height: calc(100vh - var(--header));\n border-right: 1px solid var(--line); padding: 18px 12px;\n display: flex; flex-direction: column; gap: 4px;\n background: var(--bg-elev); overflow-y: auto;\n }\n .nav-label { padding: 0 10px 8px; color: var(--faint); font-size: 10px; font-weight: 700; letter-spacing: 0.09em; text-transform: uppercase; }\n nav.side button {\n position: relative; display: flex; align-items: center; gap: 10px; width: 100%;\n text-align: left; border: 0; background: transparent; border-radius: 9px;\n padding: 9px 10px; min-height: 42px; color: var(--muted); font-size: 13px; font-weight: 550;\n }\n nav.side button:hover { background: var(--bg-muted); color: var(--ink); }\n nav.side button[aria-current=\"true\"] { background: var(--accent-soft); color: var(--accent); font-weight: 650; }\n nav.side button[aria-current=\"true\"]::before { content: \"\"; position: absolute; left: -12px; width: 3px; height: 22px; border-radius: 0 4px 4px 0; background: var(--accent); }\n .nav-icon { width: 18px; height: 18px; display: grid; place-items: center; flex: none; }\n .nav-icon svg { width: 18px; height: 18px; }\n main { padding: 32px clamp(20px, 4vw, 48px) 64px; max-width: 1320px; width: 100%; min-width: 0; }\n main[aria-busy=\"true\"] .view { opacity: 0.62; }\n .view { animation: view-in 180ms ease-out; }\n .view[hidden] { display: none; }\n .view-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 22px; }\n .view h2 { margin: 0 0 5px; font-size: clamp(24px, 3vw, 30px); line-height: 1.2; letter-spacing: -0.035em; }\n .view h3 { margin: 24px 0 10px; font-size: 15px; letter-spacing: -0.01em; }\n .lede { margin: 0; color: var(--muted); max-width: 72ch; font-size: 14px; }\n .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 175px), 1fr)); gap: 14px; }\n .card {\n background: var(--bg-elev); border: 1px solid var(--line); border-radius: var(--radius);\n padding: 18px; box-shadow: var(--shadow-sm);\n }\n .stat-card { position: relative; overflow: hidden; }\n .stat-card::after { content: \"\"; position: absolute; inset: 0 0 auto; height: 2px; background: linear-gradient(90deg, var(--accent), transparent 78%); opacity: 0.7; }\n .card .k { color: var(--faint); font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em; }\n .card .v { display: flex; flex-direction: column; gap: 2px; font-size: 24px; font-weight: 650; margin-top: 7px; font-variant-numeric: tabular-nums; overflow-wrap: anywhere; letter-spacing: -0.025em; }\n .card .v .clock-time { font-size: 14px; color: var(--muted); }\n .section-card { background: var(--bg-elev); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow-xs); overflow: hidden; }\n .section-title { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 16px 18px; border-bottom: 1px solid var(--line); }\n .section-title h3 { margin: 0; }\n .split { display: grid; grid-template-columns: minmax(0, 250px) minmax(0, 1fr); gap: 18px; align-items: start; }\n #collections { padding: 6px; border: 1px solid var(--line); border-radius: var(--radius); background: var(--bg-elev); box-shadow: var(--shadow-xs); }\n .collection {\n width: 100%; text-align: left; border: 1px solid transparent; background: transparent;\n border-radius: 9px; padding: 10px 11px; min-height: 48px; color: var(--ink); cursor: pointer;\n }\n .collection:hover { background: var(--bg-muted); }\n .collection[aria-current=\"true\"] { background: var(--accent-soft); border-color: color-mix(in srgb, var(--accent) 18%, var(--line)); color: var(--accent); }\n .collection small { display: block; color: var(--faint); }\n .chips { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0 14px; }\n .chip { font-family: var(--mono); font-size: 11px; background: var(--bg-muted); border: 1px solid var(--line); border-radius: 999px; padding: 4px 8px; }\n .chip i { color: var(--faint); font-style: normal; }\n .sql-layout {\n display: grid; grid-template-columns: minmax(10rem, 16rem) minmax(0, 1fr); gap: 16px;\n }\n .sql-tables { display: flex; flex-direction: column; gap: 4px; max-height: 28rem; overflow: auto; padding: 6px; border: 1px solid var(--line); border-radius: var(--radius); background: var(--bg-elev); }\n .sql-tables button { text-align: left; border: 0; border-radius: 8px; padding: 9px 10px; background: transparent; color: var(--muted); cursor: pointer; }\n .sql-tables button:hover, .sql-tables button[aria-current=\"true\"] { background: var(--accent-soft); color: var(--accent); }\n .sql-input { font-family: var(--mono); min-height: 7rem; width: 100%; }\n .table-shell { width: 100%; overflow-x: auto; border: 1px solid var(--line); border-radius: var(--radius); background: var(--bg-elev); box-shadow: var(--shadow-xs); }\n table { width: 100%; border-collapse: collapse; font-size: 13px; }\n th, td { text-align: left; padding: 11px 13px; border-bottom: 1px solid var(--line); vertical-align: top; }\n th { color: var(--faint); background: var(--bg-inset); font-weight: 650; font-size: 11px; text-transform: uppercase; letter-spacing: 0.045em; }\n tbody tr:last-child td { border-bottom: 0; }\n tr.clickable { cursor: pointer; }\n tr.clickable:hover { background: var(--accent-soft); }\n pre, code, .mono { font-family: var(--mono); overflow-wrap: anywhere; }\n pre {\n margin: 0; white-space: pre-wrap; word-break: break-word;\n background: var(--bg-inset); border: 1px solid var(--line); border-radius: 10px; padding: 14px; font-size: 12px; line-height: 1.65;\n }\n .json-key { color: var(--code-key); }\n .json-string { color: var(--code-string); }\n .json-number { color: var(--code-number); }\n .json-boolean { color: var(--code-boolean); }\n .json-null { color: var(--code-null); font-style: italic; }\n .json-inline { display: block; max-width: 44rem; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }\n .json-view { position: relative; max-height: 26rem; overflow: auto; }\n .json-editor { position: relative; min-height: 190px; border: 1px solid var(--line-strong); border-radius: 10px; background: var(--bg-inset); overflow: hidden; }\n .json-editor:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 15%, transparent); }\n .json-editor.invalid { border-color: var(--err); }\n .json-editor pre, .json-editor textarea { margin: 0; padding: 12px; border: 0; border-radius: 0; min-height: 190px; width: 100%; font: 12px/1.65 var(--mono); tab-size: 2; white-space: pre; overflow: auto; }\n .json-editor pre { position: absolute; inset: 0; pointer-events: none; background: transparent; }\n .json-editor textarea { position: relative; z-index: 1; resize: vertical; background: transparent; color: transparent; caret-color: var(--ink); -webkit-text-fill-color: transparent; }\n .json-editor textarea::selection { background: color-mix(in srgb, var(--accent) 32%, transparent); }\n .editor-meta { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-top: 7px; }\n .json-status { display: inline-flex; align-items: center; gap: 6px; color: var(--ok); font-size: 11px; }\n .json-status::before { content: \"\"; width: 6px; height: 6px; border-radius: 50%; background: currentColor; }\n .json-status.invalid { color: var(--err); }\n .format-json { border: 0; padding: 3px 5px; background: transparent; color: var(--accent); font-size: 11px; font-weight: 650; cursor: pointer; }\n .row-actions { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 8px; margin: 14px 0; }\n .banner {\n display: none; position: sticky; top: calc(var(--header) + 12px); z-index: 15;\n align-items: center; gap: 10px; margin: 0 0 16px; padding: 11px 12px 11px 14px;\n border: 1px solid color-mix(in srgb, var(--err) 30%, var(--line)); border-radius: 10px;\n background: var(--err-soft); color: var(--err); box-shadow: var(--shadow-sm); font-size: 13px;\n }\n .banner.show { display: flex; }\n .banner span { flex: 1; }\n .banner button { width: 28px; height: 28px; display: grid; place-items: center; border: 0; border-radius: 7px; background: transparent; color: currentColor; cursor: pointer; }\n .banner button:hover { background: color-mix(in srgb, var(--err) 10%, transparent); }\n .empty { color: var(--muted); padding: 34px 18px; text-align: center; border: 1px dashed var(--line-strong); border-radius: var(--radius); background: color-mix(in srgb, var(--bg-elev) 55%, transparent); }\n dialog {\n border: 1px solid var(--line); border-radius: 16px; padding: 0; background: var(--bg-elev);\n color: var(--ink); width: min(720px, calc(100% - 24px)); max-width: calc(100vw - 24px); box-shadow: var(--shadow-lg);\n }\n dialog[open] { animation: dialog-in 160ms ease-out; }\n dialog::backdrop { background: rgb(12 14 20 / 0.58); backdrop-filter: blur(3px); }\n dialog form, .dialog-body { padding: 22px; display: flex; flex-direction: column; gap: 14px; }\n .dialog-heading { display: flex; justify-content: space-between; gap: 16px; padding-bottom: 12px; border-bottom: 1px solid var(--line); }\n .dialog-heading strong { font-size: 18px; letter-spacing: -0.02em; }\n .dialog-heading span { color: var(--muted); font-size: 12px; }\n textarea {\n width: 100%; min-height: 180px; resize: vertical; border-radius: 10px;\n border: 1px solid var(--line); background: var(--bg-inset); padding: 10px;\n font-family: var(--mono); font-size: 12px;\n }\n .dialog-actions { display: flex; justify-content: flex-end; align-items: center; gap: 8px; padding-top: 4px; }\n .dialog-actions .btn-danger { margin-right: auto; }\n .badge { display: inline-flex; align-items: center; font-size: 10px; font-weight: 700; letter-spacing: 0.03em; border: 1px solid var(--line); border-radius: 999px; padding: 3px 7px; background: var(--bg-muted); color: var(--muted); }\n .badge.ok { background: var(--ok-soft); color: var(--ok); }\n .badge.warn { background: var(--warn-soft); color: var(--warn); }\n .status-2 { color: var(--ok); }\n .status-4, .status-5, .status-0 { color: var(--err); }\n .stack { display: flex; flex-direction: column; gap: 12px; }\n .form-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; }\n .form-grid .wide { grid-column: span 2; }\n .route {\n display: grid; grid-template-columns: 84px minmax(0, 1fr) auto; gap: 10px; align-items: center;\n padding: 10px 12px; border-bottom: 1px solid var(--line); background: var(--bg-elev);\n }\n .route:first-child { border-radius: var(--radius) var(--radius) 0 0; }\n .route:last-child { border-bottom: 0; border-radius: 0 0 var(--radius) var(--radius); }\n .route-tools { display: flex; align-items: flex-end; gap: 12px; margin-bottom: 12px; }\n .route-tools .field { flex: 1; }\n .route-tools input { width: 100%; }\n .route-count { padding-bottom: 10px; color: var(--faint); font-size: 12px; white-space: nowrap; }\n #route-list { max-height: 34rem; border: 1px solid var(--line); border-radius: var(--radius); overflow: auto; box-shadow: var(--shadow-xs); }\n .method { width: fit-content; font-family: var(--mono); font-size: 11px; font-weight: 750; color: var(--accent); background: var(--accent-soft); border-radius: 6px; padding: 4px 6px; }\n @keyframes view-in { from { transform: translateY(3px); } to { transform: translateY(0); } }\n @keyframes dialog-in { from { transform: translateY(8px) scale(0.99); } to { transform: translateY(0) scale(1); } }\n @keyframes pulse { 50% { opacity: 0.45; } }\n @media (prefers-reduced-motion: reduce) { *, *::before, *::after { scroll-behavior: auto !important; animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; } }\n @media (forced-colors: active) { .json-editor pre { display: none; } .json-editor textarea { color: CanvasText; -webkit-text-fill-color: CanvasText; } }\n @media (max-width: 800px) {\n :root { --header: 0px; }\n header.top {\n position: relative; align-items: stretch; flex-direction: column;\n padding: max(12px, env(safe-area-inset-top)) 14px 12px;\n }\n input, select, textarea { font-size: 16px; }\n .brand, .vendor, .controls { width: 100%; }\n .brand { gap: 10px; }\n .vendor { order: 2; border-radius: 9px; }\n label.field, label.field select, label.field input { flex: 1; min-width: 0; }\n .sync-status { display: none; }\n /* The layout fills the screen. A single-column grid stretches every auto\n row, so the tab bar grew with the leftover height and the buttons floated\n in the middle of it. The bar stays one row; the page below takes the rest. */\n .layout {\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: auto minmax(0, 1fr);\n align-content: start;\n }\n nav.side {\n position: sticky; top: 0; z-index: 12; align-self: start; height: auto;\n flex-direction: row; align-items: center; overflow-x: auto; min-width: 0;\n border-right: 0; border-bottom: 1px solid var(--line);\n padding: 8px; box-shadow: var(--shadow-xs);\n }\n .nav-label { display: none; }\n nav.side button { width: auto; white-space: nowrap; flex: none; }\n nav.side button[aria-current=\"true\"]::before { inset: auto 9px -8px; width: auto; height: 3px; border-radius: 3px 3px 0 0; }\n .split, .sql-layout { grid-template-columns: minmax(0, 1fr); }\n .form-grid { grid-template-columns: minmax(0, 1fr); }\n .form-grid .wide { grid-column: auto; }\n main { padding: 22px 14px 48px; }\n .view-head { margin-bottom: 18px; }\n .grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }\n .card { padding: 14px; }\n .card .v { font-size: 20px; }\n .table-shell { border: 0; background: transparent; box-shadow: none; overflow: visible; }\n table, thead, tbody, tr, th, td { display: block; }\n thead { display: none; }\n tr {\n border: 1px solid var(--line); border-radius: 12px; margin-bottom: 8px; padding: 6px;\n background: var(--bg-elev); min-width: 0;\n }\n td {\n border: 0; display: flex; flex-wrap: wrap; justify-content: space-between; gap: 4px 12px;\n min-width: 0; overflow-wrap: anywhere;\n }\n td::before { content: attr(data-label); color: var(--faint); font-size: 12px; flex: none; }\n .route { grid-template-columns: 72px 1fr; }\n .route button { grid-column: 1 / -1; }\n }\n @media (max-width: 460px) {\n .controls label.field { min-width: calc(50% - 4px); }\n .controls .icon-btn, .controls .btn { flex: 1; }\n .grid { grid-template-columns: minmax(0, 1fr); }\n .dialog-actions { flex-wrap: wrap; }\n .dialog-actions button { flex: 1; }\n .dialog-actions .btn-danger { flex-basis: 100%; margin-right: 0; }\n }\n</style>\n</head>\n<body>\n<div class=\"app\" data-service=\"${name}\" data-mockingbird-admin>\n <header class=\"top\">\n <div class=\"brand\">\n <div class=\"brand-lockup\">\n <div class=\"brand-mark\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M5 17.5V7l7 5 7-5v10.5\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M8 15.5 12 18l4-2.5\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n <div class=\"brand-id\">\n <strong>${name}</strong>\n <span>Mock admin</span>\n </div>\n </div>\n <div class=\"vendor\" id=\"vendor\" hidden></div>\n </div>\n <div class=\"controls\">\n <span class=\"sync-status\" id=\"sync-status\" role=\"status\" aria-live=\"polite\">Ready</span>\n <label class=\"field\">Namespace\n <select id=\"namespace\" aria-label=\"Namespace\"></select>\n </label>\n <label class=\"field\">Admin key\n <input id=\"admin-key\" type=\"password\" autocomplete=\"off\" spellcheck=\"false\" aria-label=\"Admin key\">\n </label>\n <button class=\"icon-btn\" id=\"theme\" type=\"button\" aria-label=\"Use dark theme\" title=\"Use dark theme\"></button>\n <button class=\"btn\" id=\"refresh\" type=\"button\"><svg viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\"><path d=\"M15.8 7.2A6.2 6.2 0 1 0 16 12\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\"/><path d=\"M12.8 7.2h3v-3\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>Refresh</button>\n </div>\n </header>\n <div class=\"layout\">\n <nav class=\"side\" id=\"nav\" aria-label=\"Admin sections\">\n <span class=\"nav-label\">Workspace</span>\n <button type=\"button\" data-view=\"overview\" aria-current=\"true\"><span class=\"nav-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 20 20\" fill=\"none\"><rect x=\"2.5\" y=\"2.5\" width=\"6\" height=\"6\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/><rect x=\"11.5\" y=\"2.5\" width=\"6\" height=\"6\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/><rect x=\"2.5\" y=\"11.5\" width=\"6\" height=\"6\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/><rect x=\"11.5\" y=\"11.5\" width=\"6\" height=\"6\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/></svg></span>Overview</button>\n <button type=\"button\" data-view=\"state\"><span class=\"nav-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 20 20\" fill=\"none\"><ellipse cx=\"10\" cy=\"5\" rx=\"6.5\" ry=\"2.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M3.5 5v5c0 1.4 2.9 2.5 6.5 2.5s6.5-1.1 6.5-2.5V5M3.5 10v5c0 1.4 2.9 2.5 6.5 2.5s6.5-1.1 6.5-2.5v-5\" stroke=\"currentColor\" stroke-width=\"1.5\"/></svg></span>State</button>\n <button type=\"button\" data-view=\"clock\"><span class=\"nav-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 20 20\" fill=\"none\"><circle cx=\"10\" cy=\"10\" r=\"7.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M10 5.8v4.6l3 1.8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg></span>Clock</button>\n <button type=\"button\" data-view=\"faults\"><span class=\"nav-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 20 20\" fill=\"none\"><path d=\"m11.2 2.8-6.5 9h5.1l-1 5.4 6.5-9h-5.1l1-5.4Z\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/></svg></span>Faults</button>\n <button type=\"button\" data-view=\"journal\"><span class=\"nav-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 20 20\" fill=\"none\"><path d=\"M5 3.5h10a1.5 1.5 0 0 1 1.5 1.5v12l-2.2-1.4-2.2 1.4-2.1-1.4L7.8 17l-2.2-1.4L3.5 17V5A1.5 1.5 0 0 1 5 3.5Z\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M6.7 7h6.6M6.7 10h6.6M6.7 13h3.8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg></span>Journal</button>\n <button type=\"button\" data-view=\"routes\"><span class=\"nav-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 20 20\" fill=\"none\"><path d=\"M6.5 4.5h7a2 2 0 0 1 2 2v7M13 11l2.5 2.5L18 11M13.5 15.5h-7a2 2 0 0 1-2-2v-7M7 9 4.5 6.5 2 9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></span>Routes</button>\n </nav>\n <main id=\"views\">\n <div class=\"banner\" id=\"banner\" role=\"alert\"><span id=\"banner-message\"></span><button id=\"banner-dismiss\" type=\"button\" aria-label=\"Dismiss error\">\u00D7</button></div>\n <section class=\"view\" id=\"view-overview\">\n <div class=\"view-head\"><div><h2>Overview</h2><p class=\"lede\">Health, clock, and the collections this namespace is holding.</p></div></div>\n <div class=\"grid\" id=\"overview-cards\"></div>\n <h3>Recent requests</h3>\n <div id=\"overview-requests\"></div>\n </section>\n <section class=\"view\" id=\"view-state\" hidden>\n <div class=\"view-head\"><div><h2>State</h2><p class=\"lede\">Inspect and edit every collection in this namespace.</p></div></div>\n <div class=\"split\">\n <div id=\"collections\"></div>\n <div>\n <div id=\"schema\"></div>\n <div class=\"row-actions\">\n <button class=\"btn-primary\" id=\"new-record\" type=\"button\">New record</button>\n </div>\n <div id=\"records\"></div>\n </div>\n </div>\n </section>\n <section class=\"view\" id=\"view-clock\" hidden>\n <div class=\"view-head\"><div><h2>Clock</h2><p class=\"lede\">Control the source of time used by every timestamp in this mock.</p></div></div>\n <div class=\"card\" id=\"clock-readout\"></div>\n <div class=\"row-actions\">\n <button class=\"btn\" type=\"button\" data-advance=\"60000\">+1m</button>\n <button class=\"btn\" type=\"button\" data-advance=\"900000\">+15m</button>\n <button class=\"btn\" type=\"button\" data-advance=\"3600000\">+1h</button>\n <button class=\"btn\" type=\"button\" data-advance=\"86400000\">+1d</button>\n <button class=\"btn\" type=\"button\" data-advance=\"-3600000\">\u22121h</button>\n <button class=\"btn\" id=\"freeze\" type=\"button\">Freeze</button>\n <button class=\"btn-quiet\" id=\"clock-reset\" type=\"button\">Reset</button>\n </div>\n <form id=\"clock-set\" class=\"row-actions\">\n <label class=\"field\">Set instant\n <input id=\"clock-instant\" type=\"text\" placeholder=\"2026-01-01T00:00:00Z or epoch ms\" size=\"32\">\n </label>\n <button class=\"btn-primary\" type=\"submit\">Set</button>\n </form>\n </section>\n <section class=\"view\" id=\"view-faults\" hidden>\n <div class=\"view-head\"><div><h2>Faults</h2><p class=\"lede\">Test unhappy paths with a response, delay, or named preset scoped to this namespace.</p></div></div>\n <form id=\"fault-form\" class=\"card stack\">\n <div class=\"form-grid\">\n <label class=\"field wide\">Preset\n <select id=\"fault-preset\"><option value=\"\">Custom rule</option></select>\n </label>\n <label class=\"field\">Status\n <input id=\"fault-status\" inputmode=\"numeric\" placeholder=\"503\">\n </label>\n <label class=\"field wide\">Path prefix\n <input id=\"fault-path\" placeholder=\"/v1\">\n </label>\n <label class=\"field\">Method\n <input id=\"fault-method\" placeholder=\"GET\">\n </label>\n </div>\n <div class=\"dialog-actions\">\n <button class=\"btn-primary\" type=\"submit\">Add fault</button>\n <button class=\"btn-danger\" id=\"fault-clear\" type=\"button\">Clear all</button>\n </div>\n </form>\n <div id=\"fault-list\"></div>\n </section>\n <section class=\"view\" id=\"view-journal\" hidden>\n <div class=\"view-head\"><div><h2>Journal</h2><p class=\"lede\">Requests this namespace has seen. Bodies are never stored.</p></div><button class=\"btn-danger\" id=\"journal-clear\" type=\"button\">Clear journal</button></div>\n <div id=\"journal\"></div>\n </section>\n <section class=\"view\" id=\"view-routes\" hidden>\n <div class=\"view-head\"><div><h2>Routes</h2><p class=\"lede\">Explore shared controls and service-specific admin endpoints.</p></div></div>\n <div class=\"route-tools\">\n <label class=\"field\">Filter routes\n <input id=\"route-search\" type=\"search\" placeholder=\"Method, path, or extension\" autocomplete=\"off\">\n </label>\n <span class=\"route-count\" id=\"route-count\"></span>\n </div>\n <div id=\"route-list\"></div>\n <form id=\"route-form\" class=\"card stack\" style=\"margin-top: 18px\">\n <strong id=\"route-title\">Select a route</strong>\n <label class=\"field\">JSON body\n <div class=\"json-editor\" id=\"route-editor\" hidden>\n <pre aria-hidden=\"true\"><code id=\"route-highlight\"></code></pre>\n <textarea id=\"route-body\" placeholder=\"{ }\" spellcheck=\"false\" aria-describedby=\"route-json-status\" disabled></textarea>\n </div>\n <span class=\"editor-meta\" hidden><span class=\"json-status\" id=\"route-json-status\">Valid JSON</span><button class=\"format-json\" type=\"button\" data-format=\"route-body\">Format JSON</button></span>\n </label>\n <div class=\"dialog-actions\">\n <button class=\"btn-primary\" id=\"route-send\" type=\"submit\" disabled>Send request</button>\n </div>\n <pre class=\"json-view\" id=\"route-result\"><code>Response will show here.</code></pre>\n </form>\n </section>\n </main>\n </div>\n</div>\n<dialog id=\"editor\">\n <form method=\"dialog\" id=\"editor-form\">\n <div class=\"dialog-heading\"><div><strong id=\"editor-title\">Record</strong><br><span>Edit the ID and JSON value stored in this collection.</span></div></div>\n <label class=\"field\">Id\n <input id=\"editor-id\" required>\n </label>\n <label class=\"field\">JSON value\n <div class=\"json-editor\" id=\"record-editor\">\n <pre aria-hidden=\"true\"><code id=\"editor-highlight\"></code></pre>\n <textarea id=\"editor-value\" spellcheck=\"false\" aria-describedby=\"editor-json-status\"></textarea>\n </div>\n <span class=\"editor-meta\"><span class=\"json-status\" id=\"editor-json-status\">Valid JSON</span><button class=\"format-json\" type=\"button\" data-format=\"editor-value\">Format JSON</button></span>\n </label>\n <div class=\"dialog-actions\">\n <button class=\"btn-danger\" id=\"editor-delete\" type=\"button\" value=\"delete\">Delete</button>\n <button class=\"btn-quiet\" type=\"submit\" value=\"cancel\">Cancel</button>\n <button class=\"btn-primary\" type=\"submit\" value=\"save\">Save</button>\n </div>\n </form>\n</dialog>\n${script}\n</body>\n</html>`\n}\n\nconst htmlResponse = (body: string): Response =>\n new Response(body, {\n status: 200,\n headers: {\n \"content-type\": \"text/html; charset=utf-8\",\n \"cache-control\": \"no-store\",\n },\n })\n\nconst json = (body: unknown): Response =>\n new Response(JSON.stringify(body), {\n status: 200,\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n })\n\nconst describeExtension = (extension: AdminExtension): Record<string, unknown> => {\n if (extension.kind === \"sql\") {\n return {\n kind: \"sql\",\n id: extension.id ?? \"sql\",\n title: extension.title ?? \"SQL\",\n ...(extension.description !== undefined ? { description: extension.description } : {}),\n }\n }\n return {\n kind: \"panel\",\n id: extension.id,\n title: extension.title,\n ...(extension.description !== undefined ? { description: extension.description } : {}),\n html: extension.html,\n ...(extension.script !== undefined ? { script: extension.script } : {}),\n }\n}\n\n/** `GET /__admin/ui` plus the manifest a bespoke panel list is read from. */\nexport const adminUiRoutes = (\n service: string,\n ui: AdminUi | undefined,\n adminPrefix = ADMIN_PREFIX,\n): AdminRoutes => {\n const shell = () => renderAdminDocument(service, adminPrefix)\n const document = () => (ui?.render ? ui.render({ service, defaultHtml: shell }) : shell())\n return {\n \"GET /ui\": () => htmlResponse(document()),\n \"GET /ui/\": () => htmlResponse(document()),\n \"GET /ui/manifest\": () =>\n json({\n service,\n panels: (ui?.panels ?? []).map((panel) => ({\n id: panel.id,\n title: panel.title,\n ...(panel.description !== undefined ? { description: panel.description } : {}),\n html: panel.html,\n ...(panel.script !== undefined ? { script: panel.script } : {}),\n })),\n extensions: (ui?.extensions ?? []).map(describeExtension),\n }),\n }\n}\n", "/**\n * The single source of time for a service.\n *\n * Every timestamp a mock writes reads from here, so a suite moves time instead of\n * sleeping: appointment windows, result delays and expiries become reachable in\n * milliseconds. A frozen clock also makes timestamps reproducible from a seed.\n */\nexport type ClockState = {\n /** Current epoch milliseconds. */\n now: number\n /** True while time does not advance on its own. */\n frozen: boolean\n /** Milliseconds this clock adds to its underlying source. */\n offsetMs: number\n}\n\nexport type Clock = {\n now(): number\n /** Pin the clock to an exact instant, keeping it frozen if it already was. */\n set(epochMs: number): void\n /** Move the clock forward, or back with a negative delta. */\n advance(deltaMs: number): void\n /** Stop time at the current instant. */\n freeze(): void\n /** Resume from the current instant. */\n unfreeze(): void\n /** Drop back to the underlying source, live. */\n reset(): void\n state(): ClockState\n}\n\n/** A {@link Clock} over `source` (default `Date.now`), live and unfrozen. */\nexport const createClock = (source: () => number = Date.now): Clock => {\n let offsetMs = 0\n let frozenAt: number | undefined\n const now = () => frozenAt ?? source() + offsetMs\n return {\n now,\n set: (epochMs) => {\n if (frozenAt !== undefined) frozenAt = epochMs\n else offsetMs = epochMs - source()\n },\n advance: (deltaMs) => {\n if (frozenAt !== undefined) frozenAt += deltaMs\n else offsetMs += deltaMs\n },\n freeze: () => {\n frozenAt = now()\n },\n unfreeze: () => {\n if (frozenAt === undefined) return\n offsetMs = frozenAt - source()\n frozenAt = undefined\n },\n reset: () => {\n offsetMs = 0\n frozenAt = undefined\n },\n state: () => ({ now: now(), frozen: frozenAt !== undefined, offsetMs }),\n }\n}\n", "/**\n * Reading the vendor credential a request carries.\n *\n * Several vendor SDKs (Stripe, AWS, PostHog, Twilio) cannot add a namespace header, so a\n * runtime can also pick a request's namespace from its credential: a suite maps each\n * worker's API key, token or account SID to a namespace through `PUT /__admin/credentials`.\n * These helpers pull the credential out of the usual carriers.\n */\n\n/** The token after `Bearer `, or `undefined`. */\nexport const bearerToken = (request: Request): string | undefined => {\n const header = request.headers.get(\"authorization\")\n if (!header) return undefined\n const match = /^Bearer\\s+(.+)$/i.exec(header.trim())\n return match?.[1]?.trim() || undefined\n}\n\nexport type BasicCredentials = { username: string; password: string }\n\n/** `{ username, password }` from `Authorization: Basic \u2026`, or `undefined`. */\nexport const basicAuth = (request: Request): BasicCredentials | undefined => {\n const header = request.headers.get(\"authorization\")\n if (!header) return undefined\n const match = /^Basic\\s+(.+)$/i.exec(header.trim())\n if (!match?.[1]) return undefined\n let decoded: string\n try {\n decoded = atob(match[1].trim())\n } catch {\n return undefined\n }\n const colon = decoded.indexOf(\":\")\n if (colon < 0) return { username: decoded, password: \"\" }\n return { username: decoded.slice(0, colon), password: decoded.slice(colon + 1) }\n}\n\n/**\n * The access key id of an AWS SigV4-signed request (`Credential=AKID/date/region/service/\u2026`),\n * from the `Authorization` header or a presigned `X-Amz-Credential` query parameter.\n */\nexport const sigV4AccessKeyId = (request: Request): string | undefined => {\n const header = request.headers.get(\"authorization\")\n const fromHeader = header ? /Credential=([^/,\\s]+)\\//.exec(header)?.[1] : undefined\n if (fromHeader) return fromHeader\n const query = new URL(request.url).searchParams.get(\"X-Amz-Credential\")\n return query ? (query.split(\"/\")[0] ?? undefined) : undefined\n}\n\n/** The credential in any of the common carriers: Bearer, Basic username, SigV4, or `x-api-key`. */\nexport const anyCredential = (request: Request): string | undefined =>\n bearerToken(request) ??\n basicAuth(request)?.username ??\n sigV4AccessKeyId(request) ??\n request.headers.get(\"x-api-key\") ??\n undefined\n\n/** Credential \u2192 namespace mapping behind `PUT /__admin/credentials`. */\nexport type CredentialRegistry = {\n set(credential: string, namespace: string): void\n get(credential: string): string | undefined\n remove(credential: string): boolean\n clear(): void\n entries(): { credential: string; namespace: string }[]\n}\n\nexport const createCredentialRegistry = (): CredentialRegistry => {\n const map = new Map<string, string>()\n return {\n set: (credential, namespace) => {\n map.set(credential, namespace)\n },\n get: (credential) => map.get(credential),\n remove: (credential) => map.delete(credential),\n clear: () => map.clear(),\n entries: () =>\n [...map]\n .map(([credential, namespace]) => ({ credential, namespace }))\n .sort((a, b) => a.credential.localeCompare(b.credential)),\n }\n}\n\n/** A credential shown in admin output: enough to recognise it, never the whole secret. */\nexport const maskCredential = (credential: string): string =>\n credential.length <= 8\n ? `${credential.slice(0, 2)}\u2026`\n : `${credential.slice(0, 6)}\u2026${credential.slice(-2)}`\n", "/**\n * Seeded pseudo-random numbers, so anything a mock invents \u2014 ids, jitter, which\n * request a percentage fault hits \u2014 is reproducible from a seed.\n *\n * mulberry32: small, fast, and stable across runtimes, which matters more here\n * than statistical quality.\n */\nexport type Rng = {\n /** Next value in `[0, 1)`. */\n next(): number\n /** Next integer in `[min, max]`. */\n int(min: number, max: number): number\n /** Restart the stream from its seed. */\n reset(): void\n /** Serializable engine state used by deterministic checkpoints. */\n state(): number\n /** Restore a state previously returned by {@link state}. */\n setState(state: number): void\n seed: number\n}\n\n/** Hash an arbitrary string into a 32-bit seed, so callers can seed by name. */\nexport const seedFrom = (value: string): number => {\n let hash = 2166136261\n for (let i = 0; i < value.length; i++) {\n hash ^= value.charCodeAt(i)\n hash = Math.imul(hash, 16777619)\n }\n return hash >>> 0\n}\n\nexport const createRng = (seed: number | string = 0): Rng => {\n const numeric = typeof seed === \"string\" ? seedFrom(seed) : seed >>> 0\n let state = numeric\n const next = () => {\n state = (state + 0x6d2b79f5) >>> 0\n let t = state\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n return {\n next,\n int: (min, max) => min + Math.floor(next() * (max - min + 1)),\n reset: () => {\n state = numeric\n },\n state: () => state,\n setState: (next) => {\n if (!Number.isSafeInteger(next) || next < 0 || next > 0xffffffff) {\n throw new RangeError(\"rng state must be an unsigned 32-bit integer\")\n }\n state = next >>> 0\n },\n seed: numeric,\n }\n}\n", "import { createRng, type Rng } from \"./rng.js\"\n\n/**\n * A deliberate failure injected in front of an operation.\n *\n * This is how a suite reaches the vendor's failure modes without the vendor: the\n * quota error that only appears when a shared sandbox is full, the 429 that only\n * appears under load, the 5xx that proves a retry path works.\n */\nexport type FaultRule = {\n /** Stable id, so a suite can retire exactly the rule it added. */\n id: string\n /** Fault only this operation. Omit to match every operation. */\n operationId?: string\n /** Fault only this HTTP method, case-insensitive. Omit to match every method. */\n method?: string\n /** Fault only paths starting with this prefix. Omit to match every path. */\n pathPrefix?: string\n /**\n * Fault only this namespace. Omit (or `\"*\"`) to fault every namespace \u2014 which is what\n * an in-process caller usually wants, and what a parallel worker usually does not:\n * rules added through `POST /__admin/faults` default to the calling namespace.\n */\n namespace?: string\n /**\n * Status of the injected response. Omit for a rule that only delays (`delayMs` /\n * `latencyMs`), only drops the connection (`drop`), or only switches on an `effect`:\n * the request then still reaches the service.\n */\n status?: number\n /** Response body, serialized as JSON. A string is sent as-is. */\n body?: unknown\n headers?: Record<string, string>\n /** Retire the rule after this many faults. Omit to keep it until removed. */\n count?: number\n /** Fault this fraction of matching requests, `0`\u2013`1`. Default `1`. */\n rate?: number\n /** Hold the response back this long, to exercise timeouts. */\n delayMs?: number\n /** Alias of `delayMs`. */\n latencyMs?: number\n /**\n * Drop the connection instead of answering: an in-process `fetch` rejects with a\n * `TypeError`, and a served mock destroys the socket. Models \"unknown outcome\" failures.\n */\n drop?: boolean\n /**\n * A named service behaviour to switch on for the matching request instead of (or\n * before) a canned response, e.g. `created_but_500` or `numeric_tracking_id`. Services\n * read it with `faultEffects(request)`.\n */\n effect?: string\n /** Parameters for `effect`. */\n params?: Record<string, unknown>\n /** From the preset this rule was expanded from, if any. */\n preset?: string\n}\n\n/** A fault that fired for one request. */\nexport type FaultHit = {\n id: string\n /** The injected response; absent when the rule only delays, drops, or sets an effect. */\n response?: Response\n drop?: boolean\n effect?: { name: string; params: Record<string, unknown> }\n}\n\n/**\n * A named, documented fault a suite switches on by name\n * (`POST /__admin/faults {\"preset\": \"rate_limited\"}`): one or more rules, and optionally a\n * webhook delivery fault.\n */\nexport type FaultPreset = {\n description: string\n rules?: Omit<FaultRule, \"id\">[]\n webhook?: { mode: \"duplicate\" | \"reorder\" | \"drop\"; count?: number }\n}\n\n/**\n * Body of `GET /__admin/faults/presets`.\n * `presets` is a list of named presets. A record keyed by name is not this type:\n * the admin page maps the list.\n */\nexport type FaultPresetList = {\n presets: readonly { name: string }[]\n}\n\ntype _AssertFaultPresetList<T extends FaultPresetList> = T\n// @ts-expect-error presets is a list of { name }, not a record keyed by name\ntype _RecordIsNotAPresetList = _AssertFaultPresetList<{ presets: Record<string, { name: string }> }>\n\n/** What a request looks like to the fault matcher. */\nexport type FaultCandidate = {\n operationId: string | undefined\n method: string\n path: string\n namespace: string\n}\n\nexport type FaultRegistry = {\n isolateNamespaces(): void\n snapshot(namespace: string): {\n rules: (FaultRule & { remaining: number | null; hits: number; position: number })[]\n rngState: number\n }\n add(rule: FaultRule): FaultRule\n list(): (FaultRule & { remaining: number | null; hits: number })[]\n remove(id: string): boolean\n clear(): void\n restore(\n namespace: string,\n state: {\n rules: (FaultRule & { remaining: number | null; hits: number; position: number })[]\n rngState: number\n },\n ): void\n /**\n * Every fault this request should get, in rule order, stopping at the first that answers\n * or drops (effect-only and delay-only rules let later rules match too). Consumes one of\n * each matching rule's remaining uses.\n */\n take(candidate: FaultCandidate): Promise<FaultHit[]>\n}\n\ntype Entry = { rule: FaultRule; remaining: number | null; hits: number }\n\nconst matches = (rule: FaultRule, candidate: FaultCandidate): boolean => {\n if (\n rule.namespace !== undefined &&\n rule.namespace !== \"*\" &&\n rule.namespace !== candidate.namespace\n ) {\n return false\n }\n if (rule.operationId !== undefined && rule.operationId !== candidate.operationId) return false\n if (rule.method !== undefined && rule.method.toUpperCase() !== candidate.method.toUpperCase()) {\n return false\n }\n if (rule.pathPrefix !== undefined && !candidate.path.startsWith(rule.pathPrefix)) return false\n return true\n}\n\nconst faultResponse = (rule: FaultRule): Response => {\n const status = rule.status ?? 500\n const headers = { \"content-type\": \"application/json\", ...rule.headers }\n if (typeof rule.body === \"string\") return new Response(rule.body, { status, headers })\n if (rule.body === null) return new Response(null, { status, headers: rule.headers ?? {} })\n const body = rule.body === undefined ? { detail: \"Injected by Mockingbird\" } : rule.body\n return new Response(JSON.stringify(body), { status, headers })\n}\n\n/**\n * Rules are matched in the order they were added, so a narrow rule added first\n * wins over a later catch-all. `rate` draws from `rng`, which is seeded, so a\n * partial-failure run replays identically.\n */\nexport const createFaultRegistry = (\n rng: Rng = createRng(0),\n sleep: (ms: number) => Promise<void> = (ms) => new Promise((resolve) => setTimeout(resolve, ms)),\n): FaultRegistry => {\n const entries: Entry[] = []\n let isolated = false\n const scopedRngs = new Map<string, Rng>()\n const random = (namespace: string) => {\n if (!isolated || namespace === \"default\") return rng\n let scoped = scopedRngs.get(namespace)\n if (!scoped) {\n scoped = createRng(rng.seed)\n scopedRngs.set(namespace, scoped)\n }\n return scoped\n }\n return {\n isolateNamespaces() {\n isolated = true\n },\n snapshot(namespace) {\n return {\n rules: structuredClone(\n entries\n .map((entry, position) => ({\n ...entry.rule,\n remaining: entry.remaining,\n hits: entry.hits,\n position,\n }))\n .filter((entry) => entry.namespace === namespace),\n ),\n rngState: random(namespace).state(),\n }\n },\n add(rule) {\n const existing = entries.findIndex((e) => e.rule.id === rule.id)\n const entry: Entry = { rule, remaining: rule.count ?? null, hits: 0 }\n if (existing >= 0) entries[existing] = entry\n else entries.push(entry)\n return rule\n },\n list: () => entries.map((e) => ({ ...e.rule, remaining: e.remaining, hits: e.hits })),\n remove(id) {\n const index = entries.findIndex((e) => e.rule.id === id)\n if (index < 0) return false\n entries.splice(index, 1)\n return true\n },\n clear() {\n entries.length = 0\n rng.reset()\n scopedRngs.clear()\n },\n restore(namespace, state) {\n for (let i = entries.length - 1; i >= 0; i--)\n if (entries[i]?.rule.namespace === namespace) entries.splice(i, 1)\n for (const { remaining, hits, position, ...rule } of state.rules)\n entries.splice(Math.min(position, entries.length), 0, { rule, remaining, hits })\n random(namespace).setState(state.rngState)\n },\n async take(candidate) {\n const hits: FaultHit[] = []\n for (const entry of entries) {\n if (entry.remaining === 0) continue\n if (!matches(entry.rule, candidate)) continue\n const rate = entry.rule.rate ?? 1\n // Draw even when the rule always fires, so a seeded stream stays aligned.\n if (random(candidate.namespace).next() >= rate) continue\n entry.hits++\n if (entry.remaining !== null) entry.remaining--\n const delay = entry.rule.delayMs ?? entry.rule.latencyMs\n if (delay !== undefined && delay > 0) {\n await sleep(delay)\n }\n const hit: FaultHit = { id: entry.rule.id }\n if (entry.rule.effect !== undefined) {\n hit.effect = { name: entry.rule.effect, params: entry.rule.params ?? {} }\n }\n if (entry.rule.drop === true) hit.drop = true\n else if (entry.rule.status !== undefined) hit.response = faultResponse(entry.rule)\n hits.push(hit)\n if (hit.drop || hit.response) break\n }\n return hits\n },\n }\n}\n", "import type { RequestLog } from \"./metrics.js\"\nimport type { BodyIssue } from \"./validation.js\"\n\n/** One journal entry: a request log stamped with when (on the mock clock) it was handled. */\nexport type JournalEntry = RequestLog & { at: string }\n\nexport type JournalQuery = {\n /** Only this namespace. Omit for every namespace, oldest first across all of them. */\n namespace?: string\n operationId?: string\n status?: number\n /** Only entries at or after this instant (epoch ms). */\n since?: number\n /** At most this many, the most recent kept. */\n limit?: number\n}\n\nexport type Journal = {\n readonly size: number\n record(entry: JournalEntry): void\n list(query?: JournalQuery): JournalEntry[]\n /** Forget one namespace's entries, or every namespace's. */\n clear(namespace?: string): void\n}\n\n/** Default number of entries each namespace keeps. */\nexport const DEFAULT_JOURNAL_SIZE = 1000\n\n/**\n * The last `size` requests per namespace, in a ring buffer: what the mock actually saw,\n * so a test can prove a request arrived (or never did) without reading logs.\n */\nexport const createJournal = (size: number = DEFAULT_JOURNAL_SIZE): Journal => {\n const capacity = Math.max(0, Math.floor(size))\n const rings = new Map<string, { entries: JournalEntry[]; next: number }>()\n let sequence = 0\n const order = new WeakMap<JournalEntry, number>()\n const inOrder = (ring: { entries: JournalEntry[]; next: number }): JournalEntry[] =>\n ring.entries.length < capacity\n ? ring.entries\n : [...ring.entries.slice(ring.next), ...ring.entries.slice(0, ring.next)]\n return {\n size: capacity,\n record(entry) {\n if (capacity === 0) return\n order.set(entry, sequence++)\n let ring = rings.get(entry.namespace)\n if (!ring) {\n ring = { entries: [], next: 0 }\n rings.set(entry.namespace, ring)\n }\n if (ring.entries.length < capacity) ring.entries.push(entry)\n else {\n ring.entries[ring.next] = entry\n ring.next = (ring.next + 1) % capacity\n }\n },\n list(query = {}) {\n const source =\n query.namespace !== undefined\n ? inOrder(rings.get(query.namespace) ?? { entries: [], next: 0 })\n : [...rings.values()]\n .flatMap(inOrder)\n .sort((a, b) => (order.get(a) ?? 0) - (order.get(b) ?? 0))\n const matched = source.filter(\n (entry) =>\n (query.operationId === undefined || entry.operationId === query.operationId) &&\n (query.status === undefined || entry.status === query.status) &&\n (query.since === undefined || Date.parse(entry.at) >= query.since),\n )\n return query.limit !== undefined ? matched.slice(-Math.max(0, query.limit)) : matched\n },\n clear(namespace) {\n if (namespace === undefined) rings.clear()\n else rings.delete(namespace)\n },\n }\n}\n\n/** What a service knows about a request that the runtime cannot see from outside. */\nexport type ResponseNotes = {\n /** Resource ids the handler touched, e.g. `{ userId, orderId }`. */\n ids?: Record<string, string>\n /** Set when the handler created a resource the request referred to but did not exist. */\n adopted?: boolean\n /** The body validation issues behind a rejection; the runtime logs them, never the body. */\n issues?: BodyIssue[]\n}\n\nconst notes = new WeakMap<Response, ResponseNotes>()\n\n/**\n * Attach notes to a response for the request journal and structured log. They travel\n * beside the response, never in it, so nothing the vendor would not send reaches a client.\n */\nexport const annotateResponse = (response: Response, extra: ResponseNotes): Response => {\n const existing = notes.get(response)\n notes.set(response, {\n ...existing,\n ...extra,\n ...(existing?.ids || extra.ids ? { ids: { ...existing?.ids, ...extra.ids } } : {}),\n })\n return response\n}\n\nexport const responseNotes = (response: Response): ResponseNotes | undefined => notes.get(response)\n", "import type { BodyIssue } from \"./validation.js\"\n\n/**\n * What the mock received from a request it rejected, so a 4xx can be attributed after the\n * fact (an empty body, a missing `content-type`, a schema violation) without logging the body.\n */\nexport type RejectedRequest = {\n /** The raw `content-type` header, or `null` when the request sent none. */\n contentType: string | null\n /** Bytes of body received from `content-length` (`0` for none), or `null` when the client sent no length (a streamed / chunked body). */\n bodyBytes: number | null\n /** The raw `transfer-encoding` header (`chunked`), or `null`. */\n transferEncoding: string | null\n}\n\n/** One handled request, as the structured log sees it. */\nexport type RequestLog = {\n service: string\n namespace: string\n operationId: string | undefined\n method: string\n path: string\n status: number\n durationMs: number\n /** True when the path matched no operation in the contract. */\n unmatched: boolean\n /** Set when a fault rule produced the response. */\n faultId?: string\n /** Resource ids the handler touched (`userId`, `orderId`, \u2026), when the service reports them. */\n ids?: Record<string, string>\n /** Set when the service created a resource the request referred to but that did not exist. */\n adopted?: boolean\n /** Set on a rejection (status \u2265 400) the mock produced itself, never on a scripted fault. */\n request?: RejectedRequest\n /** The validation issues behind a rejection, when the service found any. */\n issues?: BodyIssue[]\n}\n\nexport type MetricsReport = {\n requests: number\n /** Counts keyed `<operationId> <status>`. */\n byOperation: Record<string, number>\n /**\n * Paths that matched no operation, most frequent first.\n *\n * This is the early-warning signal: a consumer calling something the mock does\n * not implement shows up here as a count, before it fails a suite as a 404.\n */\n unmatched: { method: string; path: string; count: number }[]\n faults: number\n totalDurationMs: number\n}\n\nexport type Metrics = {\n record(entry: RequestLog): void\n report(namespace?: string): MetricsReport\n reset(namespace?: string): void\n}\n\nexport const createMetrics = (partition = true): Metrics => {\n const namespaces = new Map<string, Metrics>()\n let requests = 0\n let faults = 0\n let totalDurationMs = 0\n const byOperation = new Map<string, number>()\n const unmatched = new Map<string, number>()\n return {\n record(entry) {\n if (partition) {\n let scoped = namespaces.get(entry.namespace)\n if (!scoped) {\n scoped = createMetrics(false)\n namespaces.set(entry.namespace, scoped)\n }\n scoped.record(entry)\n }\n requests++\n totalDurationMs += entry.durationMs\n if (entry.faultId !== undefined) faults++\n const key = `${entry.operationId ?? \"(unmatched)\"} ${entry.status}`\n byOperation.set(key, (byOperation.get(key) ?? 0) + 1)\n if (entry.unmatched) {\n const route = `${entry.method} ${entry.path}`\n unmatched.set(route, (unmatched.get(route) ?? 0) + 1)\n }\n },\n report: (namespace) =>\n namespace !== undefined\n ? (namespaces.get(namespace) ?? createMetrics(false)).report()\n : {\n requests,\n byOperation: Object.fromEntries(\n [...byOperation].sort(([a], [b]) => a.localeCompare(b)),\n ),\n unmatched: [...unmatched]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .map(([route, count]) => {\n const space = route.indexOf(\" \")\n return { method: route.slice(0, space), path: route.slice(space + 1), count }\n }),\n faults,\n totalDurationMs,\n },\n reset(namespace) {\n if (namespace !== undefined) {\n namespaces.delete(namespace)\n return\n }\n namespaces.clear()\n requests = 0\n faults = 0\n totalDurationMs = 0\n byOperation.clear()\n unmatched.clear()\n },\n }\n}\n", "import { adminUiRoutes } from \"./admin-ui.js\"\nimport { createClock } from \"./clock.js\"\nimport {\n type AdminRoutes,\n type ControlPlane,\n createControlPlane,\n resolveAdminPrefix,\n} from \"./control.js\"\nimport { type CredentialRegistry, createCredentialRegistry, maskCredential } from \"./credentials.js\"\nimport { createFaultRegistry } from \"./faults.js\"\nimport { createJournal } from \"./journal.js\"\nimport { createMetrics } from \"./metrics.js\"\nimport { createRng } from \"./rng.js\"\nimport type { StateField, StateFieldKind, StatePage, StateRecord, StateView } from \"./state-view.js\"\nimport type { AdminExtension } from \"./surface.js\"\n\n/** Turns on the built-in table explorer and query runner. */\nexport const SQL_ADMIN_EXTENSION: AdminExtension = {\n kind: \"sql\",\n id: \"sql\",\n title: \"SQL\",\n description: \"Browse tables and run queries.\",\n}\n\n/**\n * One in-memory SQL database, seen through the shared admin routes.\n * Postgres and SQLite each adapt their `Database` to this shape.\n */\nexport type SqlColumn = {\n name: string\n type: string\n primaryKey?: boolean\n}\n\nexport type SqlTable = {\n schema: string\n name: string\n kind: \"table\" | \"view\"\n columns: readonly SqlColumn[]\n}\n\nexport type SqlPage = {\n columns: string[]\n rows: Record<string, unknown>[]\n total: number\n}\n\nexport type SqlResult = {\n columns: string[]\n rows: Record<string, unknown>[]\n rowCount: number\n truncated?: boolean\n}\n\nexport type SqlCheckpoint = {\n id: string\n branch: string\n parent: string | null\n at: number\n records?: number\n}\n\nexport type SqlEngine = {\n tables(): readonly SqlTable[]\n page(schema: string, table: string, limit: number, offset: number): SqlPage\n query(sql: string, params: readonly unknown[]): SqlResult\n exec(sql: string): { rowCount: number }\n checkpoint(branch: string): SqlCheckpoint\n fork(name: string, at?: string): SqlCheckpoint\n checkout(id: string, branch: string): void\n retain(id: string): void\n release(id: string): boolean\n inspect(): {\n branches: Readonly<Record<string, string>>\n checkpoints: readonly { id: string; branch: string; parent: string | null; at: number }[]\n }\n reset(): void\n}\n\nexport type EngineAdminOptions = {\n name: string\n adminPrefix?: string\n adminKey?: string\n dialect?: string\n /** Open the database for a namespace. Called once per namespace, including `default`. */\n open(namespace: string): SqlEngine\n}\n\nexport type EngineAdmin = {\n fetch(request: Request): Promise<Response>\n}\n\nconst NAMESPACE = /^[A-Za-z0-9_.-]{1,64}$/\nconst COLLECTION_NAME = /^[A-Za-z0-9_.@:-]{1,200}$/\nconst READ_SQL = /^(?:select|with|values|show|pragma|explain|table)\\b/i\nconst PAGE_DEFAULT = 50\nconst PAGE_MAX = 200\n\nconst json = (status: number, body: unknown): Response =>\n new Response(JSON.stringify(body), {\n status,\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n })\n\nconst adminError = (status: number, message: string): Response =>\n json(status, { error: { type: \"mockingbird_admin\", message } })\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\n/** Values `Response.json` would reject, turned into JSON text. */\nexport const jsonSafe = (value: unknown): unknown => {\n if (typeof value === \"bigint\") return value.toString()\n if (value instanceof Uint8Array) {\n let binary = \"\"\n for (const byte of value) binary += String.fromCharCode(byte)\n return btoa(binary)\n }\n if (value instanceof Date) return value.toISOString()\n if (Array.isArray(value)) return value.map((item) => jsonSafe(item))\n if (isRecord(value)) {\n const out: Record<string, unknown> = {}\n for (const [key, item] of Object.entries(value)) out[key] = jsonSafe(item)\n return out\n }\n return value\n}\n\nconst kindOf = (value: unknown): StateFieldKind => {\n if (value === null) return \"null\"\n if (Array.isArray(value)) return \"array\"\n switch (typeof value) {\n case \"string\":\n return \"string\"\n case \"number\":\n return \"number\"\n case \"boolean\":\n return \"boolean\"\n case \"object\":\n return \"object\"\n default:\n return \"unknown\"\n }\n}\n\nconst kindFromType = (type: string): StateFieldKind => {\n const text = type.toLowerCase()\n if (/(int|serial|numeric|decimal|real|float|double|number)/.test(text)) return \"number\"\n if (text.includes(\"bool\")) return \"boolean\"\n if (text.includes(\"json\")) return \"object\"\n if (text === \"\") return \"unknown\"\n return \"string\"\n}\n\nconst countParam = (value: string | null, fallback: number, max: number): number | undefined => {\n if (value === null) return fallback\n if (!/^\\d+$/.test(value)) return undefined\n return Math.min(max, Number(value))\n}\n\nconst locate = (tables: readonly SqlTable[], collection: string): SqlTable | undefined => {\n const exact = tables.filter((table) => `${table.schema}.${table.name}` === collection)\n if (exact.length === 1) return exact[0]\n if (collection.includes(\".\")) return undefined\n const byName = tables.filter((table) => table.name === collection)\n return byName.length === 1 ? byName[0] : undefined\n}\n\nconst fieldsOf = (table: SqlTable, sample: Record<string, unknown> | undefined): StateField[] =>\n table.columns.map((column) => {\n const sampleValue = sample?.[column.name]\n const field: StateField = {\n name: column.name,\n kind:\n sampleValue === undefined || sampleValue === null\n ? kindFromType(column.type)\n : kindOf(sampleValue),\n optional: sampleValue === null || sampleValue === undefined,\n }\n return field\n })\n\nconst recordId = (row: Record<string, unknown>, table: SqlTable, seq: number): string => {\n const keys = table.columns.filter((column) => column.primaryKey).map((column) => column.name)\n if (keys.length === 0) return String(seq)\n const parts = keys.map((key) => row[key])\n if (parts.every((part) => part === null || part === undefined)) return String(seq)\n return parts.map((part) => String(part)).join(\"|\")\n}\n\nconst credentialRoutes = (registry: CredentialRegistry): AdminRoutes => ({\n \"GET /credentials\": () =>\n json(200, {\n credentials: registry.entries().map(({ credential, namespace }) => ({\n credential: maskCredential(credential),\n namespace,\n })),\n }),\n \"PUT /credentials\": ({ body, namespace }) => {\n const pairs: [string, string][] = []\n const list = Array.isArray(body) ? body : isRecord(body) ? body.credentials : undefined\n if (Array.isArray(list)) {\n for (const each of list) {\n if (typeof each === \"string\") pairs.push([each, namespace])\n else if (isRecord(each) && typeof each.credential === \"string\") {\n pairs.push([\n each.credential,\n typeof each.namespace === \"string\" ? each.namespace : namespace,\n ])\n } else\n return adminError(400, \"each entry is a credential string or {credential, namespace}\")\n }\n } else if (isRecord(list)) {\n for (const [credential, target] of Object.entries(list)) {\n if (typeof target !== \"string\")\n return adminError(400, `namespace for ${credential} must be a string`)\n pairs.push([credential, target])\n }\n } else if (isRecord(body) && typeof body.credential === \"string\") {\n pairs.push([body.credential, typeof body.namespace === \"string\" ? body.namespace : namespace])\n } else {\n return adminError(400, 'expected {\"credentials\": {\"<credential>\": \"<namespace>\"}}')\n }\n for (const [credential, target] of pairs) {\n if (!NAMESPACE.test(target)) return adminError(400, `bad namespace ${JSON.stringify(target)}`)\n registry.set(credential, target)\n }\n return json(200, { mapped: pairs.length })\n },\n \"DELETE /credentials\": ({ url }) => {\n const credential = url.searchParams.get(\"credential\")\n if (credential === null) registry.clear()\n else registry.remove(credential)\n return json(200, { status: \"ok\" })\n },\n})\n\nconst stateRoutes = (engine: (namespace: string) => SqlEngine): AdminRoutes => {\n const view = (namespace: string): StateView => {\n const tables = engine(namespace).tables()\n return {\n namespace,\n storageNamespace: namespace,\n collections: tables.map((table) => {\n const page = engine(namespace).page(table.schema, table.name, 1, 0)\n const sample = page.rows[0]\n return {\n name: `${table.schema}.${table.name}`,\n label: table.name,\n count: page.total,\n source: \"inferred\" as const,\n fields: fieldsOf(table, sample),\n }\n }),\n }\n }\n const pageOf = (\n namespace: string,\n collection: string,\n limit: number,\n offset: number,\n ): StatePage | Response => {\n if (!COLLECTION_NAME.test(collection))\n return adminError(400, `bad collection ${JSON.stringify(collection)}`)\n const table = locate(engine(namespace).tables(), collection)\n if (!table) return adminError(404, `no collection ${collection}`)\n const page = engine(namespace).page(table.schema, table.name, limit, offset)\n const records: StateRecord[] = page.rows.map((row, index) => {\n const seq = offset + index + 1\n return { id: recordId(row, table, seq), seq, value: jsonSafe(row) }\n })\n const next = offset + records.length < page.total ? offset + records.length : null\n return { collection, count: page.total, records, next }\n }\n const readOnly = (): Response => adminError(400, \"state writes go through POST /sql/query\")\n return {\n \"GET /state\": ({ namespace }) => json(200, view(namespace)),\n \"GET /state/:collection\": ({ params, url, namespace }) => {\n const limit = countParam(url.searchParams.get(\"limit\"), PAGE_DEFAULT, PAGE_MAX)\n const offset = countParam(url.searchParams.get(\"offset\"), 0, Number.MAX_SAFE_INTEGER)\n if (limit === undefined) return adminError(400, \"limit: expected a count\")\n if (offset === undefined) return adminError(400, \"offset: expected a count\")\n const page = pageOf(namespace, params.collection ?? \"\", limit, offset)\n return page instanceof Response ? page : json(200, page)\n },\n \"GET /state/:collection/:id\": ({ params, namespace }) => {\n const collection = params.collection ?? \"\"\n const id = params.id ?? \"\"\n if (!COLLECTION_NAME.test(collection))\n return adminError(400, `bad collection ${JSON.stringify(collection)}`)\n let offset = 0\n for (;;) {\n const page = pageOf(namespace, collection, PAGE_MAX, offset)\n if (page instanceof Response) return page\n const found = page.records.find((record) => record.id === id)\n if (found) return json(200, found)\n if (page.next === null) return adminError(404, `no record ${id}`)\n offset = page.next\n }\n },\n \"POST /state/:collection\": readOnly,\n \"PUT /state/:collection/:id\": readOnly,\n \"PATCH /state/:collection/:id\": readOnly,\n \"DELETE /state/:collection/:id\": readOnly,\n }\n}\n\nconst sqlRoutes = (engine: (namespace: string) => SqlEngine): AdminRoutes => ({\n \"GET /sql/tables\": ({ namespace }) => {\n try {\n return json(200, { tables: jsonSafe(engine(namespace).tables()) })\n } catch (error) {\n return adminError(400, error instanceof Error ? error.message : String(error))\n }\n },\n \"GET /sql/tables/:schema/:table\": ({ params, url, namespace }) => {\n const limit = countParam(url.searchParams.get(\"limit\"), PAGE_DEFAULT, PAGE_MAX)\n const offset = countParam(url.searchParams.get(\"offset\"), 0, Number.MAX_SAFE_INTEGER)\n if (limit === undefined) return adminError(400, \"limit: expected a count\")\n if (offset === undefined) return adminError(400, \"offset: expected a count\")\n try {\n const page = engine(namespace).page(params.schema ?? \"\", params.table ?? \"\", limit, offset)\n const safe = jsonSafe(page)\n return json(200, {\n ...(isRecord(safe) ? safe : {}),\n schema: params.schema,\n name: params.table,\n limit,\n offset,\n })\n } catch (error) {\n return adminError(400, error instanceof Error ? error.message : String(error))\n }\n },\n \"POST /sql/query\": ({ body, namespace }) => {\n if (!isRecord(body) || typeof body.sql !== \"string\" || body.sql.trim() === \"\") {\n return adminError(400, 'expected {\"sql\":\"...\"}')\n }\n const params = Array.isArray(body.params) ? body.params : []\n const sql = body.sql.trim()\n try {\n const current = engine(namespace)\n const result = READ_SQL.test(sql)\n ? current.query(sql, params)\n : { ...current.exec(sql), columns: [], rows: [] }\n return json(200, jsonSafe(result))\n } catch (error) {\n return adminError(400, error instanceof Error ? error.message : String(error))\n }\n },\n})\n\n/** Shared `/__admin/health` and `/__admin` surface for the SQL engines. */\nexport const createEngineAdmin = (options: EngineAdminOptions): EngineAdmin => {\n const adminPrefix = resolveAdminPrefix(options.adminPrefix)\n const engines = new Map<string, SqlEngine>()\n const engine = (namespace: string): SqlEngine => {\n const existing = engines.get(namespace)\n if (existing) return existing\n const created = options.open(namespace)\n engines.set(namespace, created)\n return created\n }\n engine(\"default\")\n\n const routes: AdminRoutes = {\n ...credentialRoutes(createCredentialRegistry()),\n ...stateRoutes(engine),\n ...sqlRoutes(engine),\n ...adminUiRoutes(options.name, { extensions: [SQL_ADMIN_EXTENSION] }, adminPrefix),\n }\n const startedAt = Date.now()\n const plane: ControlPlane = createControlPlane({\n name: options.name,\n startedAt,\n wallNow: () => Date.now(),\n clock: createClock(),\n faults: createFaultRegistry(createRng(0)),\n metrics: createMetrics(),\n journal: createJournal(),\n defaultNamespace: \"default\",\n namespaces: () => [...engines.keys()].sort(),\n reset: async (namespace) => {\n if (namespace === \"*\") {\n for (const each of engines.values()) each.reset()\n return\n }\n engine(namespace).reset()\n },\n timeTravel: {\n checkpoint: (namespace, branch) => engine(namespace).checkpoint(branch),\n branch: (name, input) =>\n input.at !== undefined\n ? engine(input.namespace).fork(name, input.at)\n : engine(input.namespace).fork(name),\n checkout: (checkpoint, input) => engine(input.namespace).checkout(checkpoint, input.branch),\n retain: (namespace, checkpoint) => engine(namespace).retain(checkpoint),\n release: (namespace, checkpoint) => engine(namespace).release(checkpoint),\n inspect: (namespace) => engine(namespace).inspect(),\n },\n describe: () => (options.dialect === undefined ? {} : { dialect: options.dialect }),\n routes,\n adminPrefix,\n adminKey: options.adminKey,\n })\n\n return {\n async fetch(request) {\n const response = await plane.handle(request)\n return response ?? adminError(404, \"not found\")\n },\n }\n}\n", "/** A stable identifier for a point in a {@link Timeline}. */\nexport type CheckpointId = string\n\n/** An immutable node in a timeline's checkpoint DAG. */\nexport type Checkpoint<T> = Readonly<{\n id: CheckpointId\n branch: string\n parent: CheckpointId | null\n /** Logical time supplied by the timeline's injected clock. */\n at: number\n value: T\n}>\n\nexport type TimelineOptions = {\n /** Logical clock used to stamp checkpoints. Defaults to a deterministic counter. */\n now?: () => number\n /** Maximum retained checkpoints. Branch heads are never collected. Default 1,000. */\n maxCheckpoints?: number\n /** Customize deterministic checkpoint IDs. */\n id?: (sequence: number) => CheckpointId\n}\n\nexport type CommitOptions = {\n branch?: string\n /** Parent checkpoint. Defaults to the selected branch's current head. */\n parent?: CheckpointId | null\n}\n\nexport type ForkOptions = {\n /** Checkpoint to fork from. Defaults to the main branch's head. */\n from?: CheckpointId\n}\n\nconst BRANCH_PATTERN = /^[A-Za-z0-9_.-]{1,64}$/\n\n/**\n * Small, storage-agnostic checkpoint DAG shared by service runtimes. Its values may be immutable\n * records, namespace images, or copy-on-write SQL engine snapshots.\n *\n * Values are retained by reference. Engines can therefore use persistent/COW snapshots while\n * simpler services can use immutable values. IDs and GC order are deterministic, and all IO\n * (the logical clock) is injected.\n */\nexport class Timeline<T> {\n readonly maxCheckpoints: number\n private readonly now: () => number\n private readonly makeId: (sequence: number) => CheckpointId\n private readonly nodes = new Map<CheckpointId, Checkpoint<T>>()\n private readonly heads = new Map<string, CheckpointId>()\n /** Unreferenced nodes in the exact order they became collectible. */\n private readonly evictable = new Set<CheckpointId>()\n /** Branch heads plus explicit retainers. Absent means zero. */\n private readonly references = new Map<CheckpointId, number>()\n private readonly explicitPins = new Map<CheckpointId, number>()\n private sequence = 0\n\n constructor(options: TimelineOptions = {}) {\n const max = options.maxCheckpoints ?? 1_000\n if (!Number.isSafeInteger(max) || max < 1)\n throw new RangeError(\"maxCheckpoints must be a positive integer\")\n this.maxCheckpoints = max\n this.now = options.now ?? (() => this.sequence)\n this.makeId = options.id ?? ((sequence) => `cp_${sequence.toString(36).padStart(8, \"0\")}`)\n }\n\n /** Capture a new immutable value and move `branch` to it. */\n commit(value: T, options: CommitOptions = {}): Checkpoint<T> {\n const branch = options.branch ?? \"main\"\n this.assertBranch(branch)\n const parent = options.parent === undefined ? (this.heads.get(branch) ?? null) : options.parent\n if (parent !== null && !this.nodes.has(parent)) throw new RangeError(`no checkpoint ${parent}`)\n const id = this.makeId(++this.sequence)\n if (this.nodes.has(id)) throw new RangeError(`duplicate checkpoint id ${id}`)\n const checkpoint = Object.freeze({ id, branch, parent, at: this.now(), value })\n this.nodes.set(id, checkpoint)\n this.moveHead(branch, id)\n this.collect(this.maxCheckpoints)\n return checkpoint\n }\n\n /** Create a branch pointer without copying its checkpoint value. */\n fork(branch: string, options: ForkOptions = {}): Checkpoint<T> | undefined {\n this.assertBranch(branch)\n if (this.heads.has(branch)) throw new RangeError(`branch already exists: ${branch}`)\n const from = options.from ?? this.heads.get(\"main\")\n if (from === undefined) return undefined\n const checkpoint = this.get(from)\n this.moveHead(branch, checkpoint.id)\n return checkpoint\n }\n\n /** Move a branch pointer to an existing checkpoint. */\n checkout(branch: string, id: CheckpointId): Checkpoint<T> {\n this.assertBranch(branch)\n const checkpoint = this.get(id)\n this.moveHead(branch, checkpoint.id)\n return checkpoint\n }\n\n get(id: CheckpointId): Checkpoint<T> {\n const checkpoint = this.nodes.get(id)\n if (!checkpoint) throw new RangeError(`no checkpoint ${id}`)\n return checkpoint\n }\n\n head(branch = \"main\"): Checkpoint<T> | undefined {\n const id = this.heads.get(branch)\n return id === undefined ? undefined : this.get(id)\n }\n\n hasBranch(branch: string): boolean {\n return this.heads.has(branch)\n }\n\n branches(): Readonly<Record<string, CheckpointId>> {\n return Object.freeze(\n Object.fromEntries([...this.heads].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))),\n )\n }\n\n checkpoints(): readonly Checkpoint<T>[] {\n return [...this.nodes.values()]\n }\n\n /** Number of retained checkpoints without allocating an array. */\n get size(): number {\n return this.nodes.size\n }\n\n /** Pin a checkpoint independently of branch heads (used by compatibility snapshot handles). */\n retain(id: CheckpointId): Checkpoint<T> {\n const checkpoint = this.get(id)\n this.explicitPins.set(id, (this.explicitPins.get(id) ?? 0) + 1)\n this.addReference(id)\n return checkpoint\n }\n\n /** Release one explicit pin. Branch heads remain pinned until moved or deleted. */\n release(id: CheckpointId): boolean {\n if (!this.nodes.has(id)) return false\n const pins = this.explicitPins.get(id) ?? 0\n if (pins === 0) return false\n if (pins === 1) this.explicitPins.delete(id)\n else this.explicitPins.set(id, pins - 1)\n this.removeReference(id)\n this.collect(this.maxCheckpoints)\n return true\n }\n\n deleteBranch(branch: string): boolean {\n if (branch === \"main\") throw new RangeError(\"cannot delete main branch\")\n const previous = this.heads.get(branch)\n const deleted = this.heads.delete(branch)\n if (previous !== undefined) this.removeReference(previous)\n this.collect(this.maxCheckpoints)\n return deleted\n }\n\n /**\n * Deterministically discard oldest unpinned checkpoints. Collection is O(number removed):\n * commits never scan pinned nodes or the retained history. Parents are metadata rather than a\n * storage dependency, so a retained node remains usable after pruning.\n */\n gc(max = this.maxCheckpoints): CheckpointId[] {\n if (!Number.isSafeInteger(max) || max < 1)\n throw new RangeError(\"max must be a positive integer\")\n const removed: CheckpointId[] = []\n this.collect(max, removed)\n return removed\n }\n\n private collect(max: number, removed?: CheckpointId[]): void {\n while (this.nodes.size > max && this.evictable.size > 0) {\n const id = this.evictable.values().next().value as CheckpointId\n this.evictable.delete(id)\n this.nodes.delete(id)\n removed?.push(id)\n }\n }\n\n private moveHead(branch: string, id: CheckpointId): void {\n const previous = this.heads.get(branch)\n if (previous === id) return\n if (previous !== undefined) this.removeReference(previous)\n this.heads.set(branch, id)\n this.addReference(id)\n }\n\n private addReference(id: CheckpointId): void {\n this.references.set(id, (this.references.get(id) ?? 0) + 1)\n this.evictable.delete(id)\n }\n\n private removeReference(id: CheckpointId): void {\n const next = (this.references.get(id) ?? 0) - 1\n if (next > 0) this.references.set(id, next)\n else {\n this.references.delete(id)\n if (this.nodes.has(id)) this.evictable.add(id)\n }\n }\n\n private assertBranch(branch: string): void {\n if (!BRANCH_PATTERN.test(branch)) throw new RangeError(`branch must match ${BRANCH_PATTERN}`)\n }\n}\n", "/** Coarse classification of {@link SqliteError} for catch-site branching.\n *\n * New categories may be added in minor releases. Consumers that switch on\n * `category` must include a default case.\n */\nexport type ErrorCategory =\n | \"syntax\"\n | \"no_such_table\"\n | \"no_such_column\"\n | \"constraint_unique\"\n | \"constraint_primary\"\n | \"constraint_notnull\"\n | \"constraint_check\"\n | \"constraint_foreign\"\n | \"constraint\"\n | \"transaction\"\n | \"datatype_mismatch\"\n | \"unsupported\"\n | \"misuse\"\n | \"snapshot_version\"\n | \"other\"\n | (string & {});\n\n/**\n * Engine error. `name` is always `\"SqliteError\"`.\n *\n * `sqliteCode` and Node's conventional `code` property are always set (default\n * `\"SQLITE_ERROR\"` when no more specific code applies).\n *\n * @example\n * ```ts\n * import { Database, SqliteError } from \"@crvouga/mockingbird-service-sqlite\";\n *\n * const db = new Database();\n * try {\n * db.exec(\"SELECT * FROM missing\");\n * } catch (err) {\n * if (err instanceof SqliteError && err.category === \"no_such_table\") {\n * // handle\n * }\n * }\n * ```\n */\nexport class SqliteError extends Error {\n /** Coarse error class (constraint vs syntax vs missing object, \u2026). */\n readonly category: ErrorCategory;\n /** SQLite result-code name such as `SQLITE_CONSTRAINT_UNIQUE`. */\n readonly sqliteCode: string;\n /** Same value as {@link sqliteCode} (Node `err.code` convention). */\n readonly code: string;\n\n /**\n * @param message - Human-readable error text.\n * @param category - Coarse class; defaults to `\"other\"`.\n * @param sqliteCode - SQLite result-code name; defaults to `\"SQLITE_ERROR\"`.\n */\n constructor(message: string, category: ErrorCategory = \"other\", sqliteCode = \"SQLITE_ERROR\") {\n super(message);\n this.name = \"SqliteError\";\n this.category = category;\n this.sqliteCode = sqliteCode;\n this.code = sqliteCode;\n }\n}\n\nexport function unsupported(feature: string): never {\n throw new SqliteError(`Unsupported SQLite feature: ${feature}`, \"unsupported\");\n}\n\nexport class TriggerRaiseError extends SqliteError {\n readonly action: \"IGNORE\" | \"ABORT\" | \"FAIL\" | \"ROLLBACK\";\n\n constructor(action: \"IGNORE\" | \"ABORT\" | \"FAIL\" | \"ROLLBACK\", message?: string) {\n super(\n message ?? action,\n action === \"FAIL\" ? \"constraint\" : \"other\",\n action === \"FAIL\" ? \"SQLITE_CONSTRAINT\" : undefined,\n );\n this.action = action;\n }\n}\n", "/** SQLite 3.51 `sqlite3AtoF` (decimal text \u2192 IEEE754 double). */\n// biome-ignore-all lint/correctness/noPrecisionLoss: Dekker constants match SQLite C double literals\n\nconst U64_MASK = (1n << 64n) - 1n;\nconst LARGEST_UINT64 = U64_MASK;\n\nexport function dekkerMul2(rr: [number, number], y: number, yy: number): void {\n const buf = new ArrayBuffer(8);\n const view = new DataView(buf);\n view.setFloat64(0, rr[0], true);\n let m = view.getBigUint64(0, true) & 0xfffffffffc000000n;\n view.setBigUint64(0, m, true);\n const hx = view.getFloat64(0, true);\n const tx = rr[0] - hx;\n\n view.setFloat64(0, y, true);\n m = view.getBigUint64(0, true) & 0xfffffffffc000000n;\n view.setBigUint64(0, m, true);\n const hy = view.getFloat64(0, true);\n const ty = y - hy;\n\n const p = hx * hy;\n const q = hx * ty + tx * hy;\n const c = p + q;\n let cc = p - c + q + tx * ty;\n cc = rr[0] * yy + rr[1] * y + cc;\n rr[0] = c + cc;\n rr[1] = c - rr[0];\n rr[1] += cc;\n}\n\nfunction isDigit(ch: string | undefined): boolean {\n if (!ch) return false;\n const c = ch.charCodeAt(0);\n return c >= 48 && c <= 57;\n}\n\nfunction isSpace(ch: string | undefined): boolean {\n return ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\f\" || ch === \"\\v\";\n}\n\n/** Parse a decimal float text literal the way SQLite 3.51 does. */\nexport function sqliteAtoF(zIn: string): number {\n const zEnd = zIn.length;\n let z = 0;\n\n let sign = 1;\n let s = 0n;\n let d = 0;\n let esign = 1;\n let e = 0;\n\n while (z < zEnd && isSpace(zIn[z])) z++;\n if (z >= zEnd) return 0;\n\n if (zIn[z] === \"-\") {\n sign = -1;\n z++;\n } else if (zIn[z] === \"+\") {\n z++;\n }\n\n while (z < zEnd && isDigit(zIn[z])) {\n s = s * 10n + BigInt(zIn.charCodeAt(z) - 48);\n z++;\n if (s >= (LARGEST_UINT64 - 9n) / 10n) {\n while (z < zEnd && isDigit(zIn[z])) {\n z++;\n d++;\n }\n break;\n }\n }\n if (z >= zEnd) return finishAtoF(sign, s, e, d, esign);\n\n if (zIn[z] === \".\") {\n z++;\n while (z < zEnd && isDigit(zIn[z])) {\n if (s < (LARGEST_UINT64 - 9n) / 10n) {\n s = s * 10n + BigInt(zIn.charCodeAt(z) - 48);\n d--;\n }\n z++;\n }\n }\n if (z >= zEnd) return finishAtoF(sign, s, e, d, esign);\n\n if (zIn[z] === \"e\" || zIn[z] === \"E\") {\n z++;\n if (z >= zEnd) return finishAtoF(sign, s, e, d, esign);\n\n if (zIn[z] === \"-\") {\n esign = -1;\n z++;\n } else if (zIn[z] === \"+\") {\n z++;\n }\n\n while (z < zEnd && isDigit(zIn[z])) {\n e = e < 10000 ? e * 10 + (zIn.charCodeAt(z) - 48) : 10000;\n z++;\n }\n }\n\n while (z < zEnd && isSpace(zIn[z])) z++;\n return finishAtoF(sign, s, e, d, esign);\n}\n\nfunction finishAtoF(sign: number, s: bigint, e: number, d: number, esign: number): number {\n if (s === 0n) return sign < 0 ? -0 : 0;\n\n e = esign * e + d;\n\n while (e > 0 && s < (LARGEST_UINT64 - 0x7ffn) / 10n) {\n s *= 10n;\n e--;\n }\n while (e < 0 && s % 10n === 0n) {\n s /= 10n;\n e++;\n }\n\n const rr: [number, number] = [Number(s), 0];\n const maxSafeU64Double = 18446744073709549568.0;\n if (rr[0] <= maxSafeU64Double) {\n const s2 = BigInt(Math.trunc(rr[0]));\n rr[1] = s >= s2 ? Number(s - s2) : -Number(s2 - s);\n } else {\n rr[1] = 0;\n }\n\n if (e > 0) {\n while (e >= 100) {\n e -= 100;\n dekkerMul2(rr, 1.0e100, -1.5902891109759918046e83);\n }\n while (e >= 10) {\n e -= 10;\n dekkerMul2(rr, 1.0e10, 0.0);\n }\n while (e >= 1) {\n e -= 1;\n dekkerMul2(rr, 1.0e1, 0.0);\n }\n } else {\n while (e <= -100) {\n e += 100;\n dekkerMul2(rr, 1.0e-100, -1.99918998026028836196e-117);\n }\n while (e <= -10) {\n e += 10;\n dekkerMul2(rr, 1.0e-10, -3.6432197315497741579e-27);\n }\n while (e <= -1) {\n e += 1;\n dekkerMul2(rr, 1.0e-1, -5.5511151231257827021e-18);\n }\n }\n\n let result = rr[0] + rr[1];\n if (Number.isNaN(result)) result = 1e300 * 1e300;\n return sign < 0 ? -result : result;\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { sqliteAtoF } from \"../types/sqlite-atof.ts\";\n\n/** Lexer token kind: keywords, literals, operators, and punctuation. */\nexport type TokenKind =\n | \"EOF\"\n | \"IDENT\"\n | \"STRING\"\n | \"NUMBER\"\n | \"BLOB\"\n | \"PARAM_POS\"\n | \"PARAM_NAMED\"\n | \"DOT\"\n | \"COMMA\"\n | \"SEMI\"\n | \"LPAREN\"\n | \"RPAREN\"\n | \"PLUS\"\n | \"MINUS\"\n | \"STAR\"\n | \"SLASH\"\n | \"PERCENT\"\n | \"EQ\"\n | \"EQEQ\"\n | \"NE\"\n | \"LT\"\n | \"LE\"\n | \"GT\"\n | \"GE\"\n | \"CONCAT\"\n | \"AMP\"\n | \"PIPE\"\n | \"LSHIFT\"\n | \"RSHIFT\"\n | \"JSON_ARROW\"\n | \"JSON_ARROW2\"\n | \"TILDE\"\n // keywords\n | \"ABORT\"\n | \"ACTION\"\n | \"ADD\"\n | \"AFTER\"\n | \"ALL\"\n | \"ALTER\"\n | \"ANALYZE\"\n | \"AND\"\n | \"AS\"\n | \"ASC\"\n | \"ATTACH\"\n | \"AUTOINCREMENT\"\n | \"BEFORE\"\n | \"BEGIN\"\n | \"BETWEEN\"\n | \"BY\"\n | \"CASCADE\"\n | \"CASE\"\n | \"CAST\"\n | \"CHECK\"\n | \"COLLATE\"\n | \"COLUMN\"\n | \"COMMIT\"\n | \"CONFLICT\"\n | \"CONSTRAINT\"\n | \"CREATE\"\n | \"CROSS\"\n | \"CURRENT\"\n | \"CURRENT_DATE\"\n | \"CURRENT_TIME\"\n | \"CURRENT_TIMESTAMP\"\n | \"DATABASE\"\n | \"DEFAULT\"\n | \"DEFERRABLE\"\n | \"DEFERRED\"\n | \"DELETE\"\n | \"DESC\"\n | \"DETACH\"\n | \"DISTINCT\"\n | \"DO\"\n | \"DROP\"\n | \"EACH\"\n | \"ELSE\"\n | \"END\"\n | \"ESCAPE\"\n | \"EXCEPT\"\n | \"EXCLUDE\"\n | \"EXCLUSIVE\"\n | \"EXISTS\"\n | \"EXPLAIN\"\n | \"FAIL\"\n | \"FILTER\"\n | \"FIRST\"\n | \"FOLLOWING\"\n | \"FOR\"\n | \"FOREIGN\"\n | \"FROM\"\n | \"FULL\"\n | \"FALSE\"\n | \"GENERATED\"\n | \"GLOB\"\n | \"GROUP\"\n | \"GROUPS\"\n | \"HAVING\"\n | \"IF\"\n | \"IGNORE\"\n | \"IMMEDIATE\"\n | \"IN\"\n | \"INDEX\"\n | \"INDEXED\"\n | \"INITIALLY\"\n | \"INNER\"\n | \"INSERT\"\n | \"INSTEAD\"\n | \"INTERSECT\"\n | \"INTO\"\n | \"IS\"\n | \"ISNULL\"\n | \"JOIN\"\n | \"KEY\"\n | \"LAST\"\n | \"LEFT\"\n | \"LIKE\"\n | \"LIMIT\"\n | \"MATCH\"\n | \"MATERIALIZED\"\n | \"NATURAL\"\n | \"NO\"\n | \"NOT\"\n | \"NOTHING\"\n | \"NOTNULL\"\n | \"NULL\"\n | \"NULLS\"\n | \"OF\"\n | \"OFFSET\"\n | \"ON\"\n | \"OR\"\n | \"ORDER\"\n | \"OTHERS\"\n | \"OUTER\"\n | \"OVER\"\n | \"PARTITION\"\n | \"PLAN\"\n | \"PRAGMA\"\n | \"PRECEDING\"\n | \"PRIMARY\"\n | \"QUERY\"\n | \"RAISE\"\n | \"RANGE\"\n | \"RECURSIVE\"\n | \"REFERENCES\"\n | \"REGEXP\"\n | \"REINDEX\"\n | \"RELEASE\"\n | \"RENAME\"\n | \"REPLACE\"\n | \"RESTRICT\"\n | \"RESPECT\"\n | \"RETURNING\"\n | \"RIGHT\"\n | \"ROLLBACK\"\n | \"ROW\"\n | \"ROWS\"\n | \"SAVEPOINT\"\n | \"SELECT\"\n | \"SET\"\n | \"TABLE\"\n | \"TEMP\"\n | \"TEMPORARY\"\n | \"THEN\"\n | \"TIES\"\n | \"TO\"\n | \"TRANSACTION\"\n | \"TRIGGER\"\n | \"TRUE\"\n | \"UNBOUNDED\"\n | \"UNION\"\n | \"UNIQUE\"\n | \"UPDATE\"\n | \"USING\"\n | \"VACUUM\"\n | \"VALUES\"\n | \"VIEW\"\n | \"VIRTUAL\"\n | \"WHEN\"\n | \"WHERE\"\n | \"WINDOW\"\n | \"WITH\"\n | \"WITHOUT\";\n\n/** A single lexer token from {@link tokenize}. */\nexport interface Token {\n kind: TokenKind;\n value: string;\n /** For NUMBER/BLOB/STRING, the parsed value */\n literal?: string | number | bigint | Uint8Array | null;\n /** True when a NUMBER token used float/scientific syntax. */\n forceReal?: boolean;\n index?: number; // for PARAM_POS\n line: number;\n column: number;\n start: number;\n end: number;\n}\n\nconst KEYWORDS: Record<string, TokenKind> = {\n ABORT: \"ABORT\",\n ACTION: \"ACTION\",\n ADD: \"ADD\",\n AFTER: \"AFTER\",\n ALL: \"ALL\",\n ALTER: \"ALTER\",\n ANALYZE: \"ANALYZE\",\n AND: \"AND\",\n AS: \"AS\",\n ASC: \"ASC\",\n ATTACH: \"ATTACH\",\n AUTOINCREMENT: \"AUTOINCREMENT\",\n BEFORE: \"BEFORE\",\n BEGIN: \"BEGIN\",\n BETWEEN: \"BETWEEN\",\n BY: \"BY\",\n CASCADE: \"CASCADE\",\n CASE: \"CASE\",\n CAST: \"CAST\",\n CHECK: \"CHECK\",\n COLLATE: \"COLLATE\",\n COLUMN: \"COLUMN\",\n COMMIT: \"COMMIT\",\n CONFLICT: \"CONFLICT\",\n CONSTRAINT: \"CONSTRAINT\",\n CREATE: \"CREATE\",\n CROSS: \"CROSS\",\n CURRENT: \"CURRENT\",\n CURRENT_DATE: \"CURRENT_DATE\",\n CURRENT_TIME: \"CURRENT_TIME\",\n CURRENT_TIMESTAMP: \"CURRENT_TIMESTAMP\",\n DATABASE: \"DATABASE\",\n DEFAULT: \"DEFAULT\",\n DEFERRABLE: \"DEFERRABLE\",\n DEFERRED: \"DEFERRED\",\n DELETE: \"DELETE\",\n DESC: \"DESC\",\n DETACH: \"DETACH\",\n DISTINCT: \"DISTINCT\",\n DO: \"DO\",\n DROP: \"DROP\",\n EACH: \"EACH\",\n ELSE: \"ELSE\",\n END: \"END\",\n ESCAPE: \"ESCAPE\",\n EXCEPT: \"EXCEPT\",\n EXCLUDE: \"EXCLUDE\",\n EXCLUSIVE: \"EXCLUSIVE\",\n EXISTS: \"EXISTS\",\n EXPLAIN: \"EXPLAIN\",\n FAIL: \"FAIL\",\n FILTER: \"FILTER\",\n FIRST: \"FIRST\",\n FOLLOWING: \"FOLLOWING\",\n FOR: \"FOR\",\n FOREIGN: \"FOREIGN\",\n FROM: \"FROM\",\n FULL: \"FULL\",\n FALSE: \"FALSE\",\n GENERATED: \"GENERATED\",\n GLOB: \"GLOB\",\n GROUP: \"GROUP\",\n GROUPS: \"GROUPS\",\n HAVING: \"HAVING\",\n IF: \"IF\",\n IGNORE: \"IGNORE\",\n IMMEDIATE: \"IMMEDIATE\",\n IN: \"IN\",\n INDEX: \"INDEX\",\n INDEXED: \"INDEXED\",\n INITIALLY: \"INITIALLY\",\n INNER: \"INNER\",\n INSERT: \"INSERT\",\n INSTEAD: \"INSTEAD\",\n INTERSECT: \"INTERSECT\",\n INTO: \"INTO\",\n IS: \"IS\",\n ISNULL: \"ISNULL\",\n JOIN: \"JOIN\",\n KEY: \"KEY\",\n LAST: \"LAST\",\n LEFT: \"LEFT\",\n LIKE: \"LIKE\",\n LIMIT: \"LIMIT\",\n MATCH: \"MATCH\",\n MATERIALIZED: \"MATERIALIZED\",\n NATURAL: \"NATURAL\",\n NO: \"NO\",\n NOT: \"NOT\",\n NOTHING: \"NOTHING\",\n NOTNULL: \"NOTNULL\",\n NULL: \"NULL\",\n NULLS: \"NULLS\",\n OF: \"OF\",\n OFFSET: \"OFFSET\",\n ON: \"ON\",\n OR: \"OR\",\n ORDER: \"ORDER\",\n OTHERS: \"OTHERS\",\n OUTER: \"OUTER\",\n OVER: \"OVER\",\n PARTITION: \"PARTITION\",\n PLAN: \"PLAN\",\n PRAGMA: \"PRAGMA\",\n PRECEDING: \"PRECEDING\",\n PRIMARY: \"PRIMARY\",\n QUERY: \"QUERY\",\n RAISE: \"RAISE\",\n RANGE: \"RANGE\",\n RECURSIVE: \"RECURSIVE\",\n REFERENCES: \"REFERENCES\",\n REGEXP: \"REGEXP\",\n REINDEX: \"REINDEX\",\n RELEASE: \"RELEASE\",\n RENAME: \"RENAME\",\n REPLACE: \"REPLACE\",\n RESTRICT: \"RESTRICT\",\n RESPECT: \"RESPECT\",\n RETURNING: \"RETURNING\",\n RIGHT: \"RIGHT\",\n ROLLBACK: \"ROLLBACK\",\n ROW: \"ROW\",\n ROWS: \"ROWS\",\n SAVEPOINT: \"SAVEPOINT\",\n SELECT: \"SELECT\",\n SET: \"SET\",\n TABLE: \"TABLE\",\n TEMP: \"TEMP\",\n TEMPORARY: \"TEMPORARY\",\n THEN: \"THEN\",\n TIES: \"TIES\",\n TO: \"TO\",\n TRANSACTION: \"TRANSACTION\",\n TRIGGER: \"TRIGGER\",\n TRUE: \"TRUE\",\n UNBOUNDED: \"UNBOUNDED\",\n UNION: \"UNION\",\n UNIQUE: \"UNIQUE\",\n UPDATE: \"UPDATE\",\n USING: \"USING\",\n VACUUM: \"VACUUM\",\n VALUES: \"VALUES\",\n VIEW: \"VIEW\",\n VIRTUAL: \"VIRTUAL\",\n WHEN: \"WHEN\",\n WHERE: \"WHERE\",\n WINDOW: \"WINDOW\",\n WITH: \"WITH\",\n WITHOUT: \"WITHOUT\",\n};\n\n/**\n * Lex `input` into SQLite tokens (keywords, literals, operators, parameters).\n *\n * @param input - SQL source text.\n */\nexport function tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n let line = 1;\n let column = 1;\n let nextParameterIndex = 1;\n const namedParameterIndexes = new Map<string, number>();\n\n const peek = (n = 0) => input[i + n] ?? \"\";\n const advance = () => {\n const ch = input[i++] ?? \"\";\n if (ch === \"\\n\") {\n line++;\n column = 1;\n } else {\n column++;\n }\n return ch;\n };\n\n const push = (\n kind: TokenKind,\n start: number,\n startLine: number,\n startCol: number,\n value: string,\n extra?: Partial<Token>,\n ) => {\n tokens.push({\n kind,\n value,\n line: startLine,\n column: startCol,\n start,\n end: i,\n ...extra,\n });\n };\n\n while (i < input.length) {\n const start = i;\n const startLine = line;\n const startCol = column;\n const ch = peek();\n\n // whitespace\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\f\") {\n advance();\n continue;\n }\n\n // comments\n if (ch === \"-\" && peek(1) === \"-\") {\n while (i < input.length && peek() !== \"\\n\") advance();\n continue;\n }\n if (ch === \"/\" && peek(1) === \"*\") {\n advance();\n advance();\n while (i < input.length && !(peek() === \"*\" && peek(1) === \"/\")) advance();\n if (i >= input.length) throw new SqliteError(\"unterminated comment\", \"syntax\");\n advance();\n advance();\n continue;\n }\n\n // string\n if (ch === \"'\") {\n advance();\n let s = \"\";\n while (i < input.length) {\n const c = advance();\n if (c === \"'\") {\n if (peek() === \"'\") {\n advance();\n s += \"'\";\n continue;\n }\n push(\"STRING\", start, startLine, startCol, s, { literal: s });\n break;\n }\n s += c;\n }\n if (tokens.at(-1)?.kind !== \"STRING\" || tokens.at(-1)?.start !== start) {\n throw new SqliteError(\"unrecognized token: incomplete string literal\", \"syntax\");\n }\n continue;\n }\n\n // quoted identifier\n if (ch === '\"' || ch === \"[\" || ch === \"`\") {\n const closer = ch === \"[\" ? \"]\" : ch;\n advance();\n let s = \"\";\n while (i < input.length) {\n const c = advance();\n if (c === closer) {\n if (ch === '\"' && peek() === '\"') {\n advance();\n s += '\"';\n continue;\n }\n push(\"IDENT\", start, startLine, startCol, s);\n break;\n }\n s += c;\n }\n if (tokens.at(-1)?.kind !== \"IDENT\" || tokens.at(-1)?.start !== start) {\n throw new SqliteError(\"unrecognized token: incomplete identifier\", \"syntax\");\n }\n continue;\n }\n\n // blob X'ABCD'\n if ((ch === \"x\" || ch === \"X\") && peek(1) === \"'\") {\n advance();\n advance();\n let hex = \"\";\n while (i < input.length) {\n const c = advance();\n if (c === \"'\") break;\n if (!/[0-9a-fA-F]/.test(c)) {\n throw new SqliteError(\"unrecognized token: invalid blob literal\", \"syntax\");\n }\n hex += c;\n }\n if (hex.length % 2 !== 0) {\n throw new SqliteError(\"unrecognized token: invalid blob literal\", \"syntax\");\n }\n const bytes = new Uint8Array(hex.length / 2);\n for (let j = 0; j < bytes.length; j++) {\n bytes[j] = Number.parseInt(hex.slice(j * 2, j * 2 + 2), 16);\n }\n push(\"BLOB\", start, startLine, startCol, hex, { literal: bytes });\n continue;\n }\n\n // parameters\n if (ch === \"?\") {\n advance();\n let num = \"\";\n while (/[0-9]/.test(peek())) num += advance();\n const index = num ? Number(num) : nextParameterIndex;\n nextParameterIndex = Math.max(nextParameterIndex, index + 1);\n push(\"PARAM_POS\", start, startLine, startCol, num ? `?${num}` : \"?\", { index });\n continue;\n }\n if (ch === \":\" || ch === \"@\" || ch === \"$\") {\n const prefix = advance();\n let name = \"\";\n while (/[A-Za-z0-9_]/.test(peek())) name += advance();\n if (!name) throw new SqliteError(\"unrecognized token near parameter\", \"syntax\");\n const parameter = `${prefix}${name}`;\n if (!namedParameterIndexes.has(parameter.toLowerCase())) {\n namedParameterIndexes.set(parameter.toLowerCase(), nextParameterIndex++);\n }\n push(\"PARAM_NAMED\", start, startLine, startCol, parameter);\n continue;\n }\n\n // numbers\n if (/[0-9]/.test(ch) || (ch === \".\" && /[0-9]/.test(peek(1)))) {\n let raw = \"\";\n let isFloat = false;\n if (ch === \".\") {\n isFloat = true;\n raw += advance();\n while (/[0-9]/.test(peek())) raw += advance();\n } else {\n while (/[0-9]/.test(peek())) raw += advance();\n if (peek() === \".\") {\n isFloat = true;\n raw += advance();\n while (/[0-9]/.test(peek())) raw += advance();\n }\n }\n if (peek() === \"e\" || peek() === \"E\") {\n isFloat = true;\n raw += advance();\n if (peek() === \"+\" || peek() === \"-\") raw += advance();\n if (!/[0-9]/.test(peek())) throw new SqliteError(\"unrecognized token near number\", \"syntax\");\n while (/[0-9]/.test(peek())) raw += advance();\n }\n let literal: number | bigint;\n if (!isFloat && raw.length > 15) {\n try {\n literal = BigInt(raw);\n } catch {\n literal = Number(raw);\n }\n } else if (!isFloat) {\n const n = Number(raw);\n literal = Number.isSafeInteger(n) ? n : BigInt(raw);\n } else {\n literal = sqliteAtoF(raw);\n }\n push(\"NUMBER\", start, startLine, startCol, raw, { literal, forceReal: isFloat || undefined });\n continue;\n }\n\n // operators / punctuation\n const two = ch + peek(1);\n const three = two + peek(2);\n if (three === \"<<\" || three === \">>\") {\n // not three char; handle below\n }\n if (two === \"||\") {\n advance();\n advance();\n push(\"CONCAT\", start, startLine, startCol, \"||\");\n continue;\n }\n if (three === \"->>\") {\n advance();\n advance();\n advance();\n push(\"JSON_ARROW2\", start, startLine, startCol, \"->>\");\n continue;\n }\n if (two === \"->\") {\n advance();\n advance();\n push(\"JSON_ARROW\", start, startLine, startCol, \"->\");\n continue;\n }\n if (two === \"<<\") {\n advance();\n advance();\n push(\"LSHIFT\", start, startLine, startCol, \"<<\");\n continue;\n }\n if (two === \">>\") {\n advance();\n advance();\n push(\"RSHIFT\", start, startLine, startCol, \">>\");\n continue;\n }\n if (two === \"==\") {\n advance();\n advance();\n push(\"EQEQ\", start, startLine, startCol, \"==\");\n continue;\n }\n if (two === \"!=\" || two === \"<>\") {\n advance();\n advance();\n push(\"NE\", start, startLine, startCol, two);\n continue;\n }\n if (two === \"<=\") {\n advance();\n advance();\n push(\"LE\", start, startLine, startCol, \"<=\");\n continue;\n }\n if (two === \">=\") {\n advance();\n advance();\n push(\"GE\", start, startLine, startCol, \">=\");\n continue;\n }\n\n const singles: Record<string, TokenKind> = {\n \".\": \"DOT\",\n \",\": \"COMMA\",\n \";\": \"SEMI\",\n \"(\": \"LPAREN\",\n \")\": \"RPAREN\",\n \"+\": \"PLUS\",\n \"-\": \"MINUS\",\n \"*\": \"STAR\",\n \"/\": \"SLASH\",\n \"%\": \"PERCENT\",\n \"=\": \"EQ\",\n \"<\": \"LT\",\n \">\": \"GT\",\n \"&\": \"AMP\",\n \"|\": \"PIPE\",\n \"~\": \"TILDE\",\n };\n if (singles[ch]) {\n advance();\n push(singles[ch]!, start, startLine, startCol, ch);\n continue;\n }\n\n // identifier / keyword\n if (/[A-Za-z_]/.test(ch)) {\n let s = \"\";\n while (/[A-Za-z0-9_$]/.test(peek())) s += advance();\n const upper = s.toUpperCase();\n const kw = KEYWORDS[upper];\n if (kw) push(kw, start, startLine, startCol, s);\n else push(\"IDENT\", start, startLine, startCol, s);\n continue;\n }\n\n throw new SqliteError(`unrecognized token: \"${ch}\"`, \"syntax\");\n }\n\n tokens.push({\n kind: \"EOF\",\n value: \"\",\n line,\n column,\n start: i,\n end: i,\n });\n return tokens;\n}\n\nexport function isKeyword(kind: TokenKind): boolean {\n return (\n kind !== \"EOF\" &&\n kind !== \"IDENT\" &&\n kind !== \"STRING\" &&\n kind !== \"NUMBER\" &&\n kind !== \"BLOB\" &&\n kind !== \"PARAM_POS\" &&\n kind !== \"PARAM_NAMED\" &&\n ![\n \"DOT\",\n \"COMMA\",\n \"SEMI\",\n \"LPAREN\",\n \"RPAREN\",\n \"PLUS\",\n \"MINUS\",\n \"STAR\",\n \"SLASH\",\n \"PERCENT\",\n \"EQ\",\n \"EQEQ\",\n \"NE\",\n \"LT\",\n \"LE\",\n \"GT\",\n \"GE\",\n \"CONCAT\",\n \"AMP\",\n \"PIPE\",\n \"LSHIFT\",\n \"RSHIFT\",\n \"JSON_ARROW\",\n \"JSON_ARROW2\",\n \"TILDE\",\n ].includes(kind)\n );\n}\n", "import type {\n AlterTableStmt,\n AttachStmt,\n BeginStmt,\n BinaryOp,\n CaseExpr,\n ColumnConstraint,\n ColumnDef,\n CommitStmt,\n CompoundTail,\n ConflictAction,\n CreateIndexStmt,\n CreateTableStmt,\n CreateTriggerStmt,\n CreateViewStmt,\n CreateVirtualTableStmt,\n Cte,\n DeleteStmt,\n DetachStmt,\n DropIndexStmt,\n DropTableStmt,\n DropTriggerStmt,\n DropViewStmt,\n Expr,\n FkAction,\n FkMatch,\n FrameBound,\n FrameSpec,\n FromItem,\n IndexedColumn,\n InExpr,\n InsertStmt,\n JoinFrom,\n LikeExpr,\n LimitClause,\n OrderByItem,\n PragmaStmt,\n ReleaseStmt,\n ResultColumn,\n RollbackStmt,\n SavepointStmt,\n SelectStmt,\n SetItem,\n Statement,\n TableConstraint,\n TableRef,\n UpdateStmt,\n UpsertClause,\n WindowSpec,\n WithClause,\n} from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { Token, TokenKind } from \"../lexer/tokenize.ts\";\n\n/** Keywords that may appear as identifiers via {@link Parser.parseIdent}. */\nconst IDENT_KEYWORDS: ReadonlySet<TokenKind> = new Set<TokenKind>([\n \"ABORT\",\n \"ACTION\",\n \"ADD\",\n \"AFTER\",\n \"ALL\",\n \"ALTER\",\n \"ANALYZE\",\n \"AND\",\n \"AS\",\n \"ASC\",\n \"ATTACH\",\n \"AUTOINCREMENT\",\n \"BEFORE\",\n \"BEGIN\",\n \"BETWEEN\",\n \"BY\",\n \"CASCADE\",\n \"CASE\",\n \"CAST\",\n \"CHECK\",\n \"COLLATE\",\n \"COLUMN\",\n \"COMMIT\",\n \"CONFLICT\",\n \"CONSTRAINT\",\n \"CREATE\",\n \"CROSS\",\n \"CURRENT\",\n \"CURRENT_DATE\",\n \"CURRENT_TIME\",\n \"CURRENT_TIMESTAMP\",\n \"DATABASE\",\n \"DEFAULT\",\n \"DEFERRABLE\",\n \"DEFERRED\",\n \"DELETE\",\n \"DESC\",\n \"DETACH\",\n \"DISTINCT\",\n \"DO\",\n \"DROP\",\n \"EACH\",\n \"ELSE\",\n \"END\",\n \"ESCAPE\",\n \"EXCEPT\",\n \"EXCLUDE\",\n \"EXCLUSIVE\",\n \"EXISTS\",\n \"EXPLAIN\",\n \"FAIL\",\n \"FILTER\",\n \"FIRST\",\n \"FOLLOWING\",\n \"FOR\",\n \"FOREIGN\",\n \"FROM\",\n \"FULL\",\n \"FALSE\",\n \"GENERATED\",\n \"GLOB\",\n \"GROUP\",\n \"GROUPS\",\n \"HAVING\",\n \"IF\",\n \"IGNORE\",\n \"IMMEDIATE\",\n \"IN\",\n \"INDEX\",\n \"INDEXED\",\n \"INITIALLY\",\n \"INNER\",\n \"INSERT\",\n \"INSTEAD\",\n \"INTERSECT\",\n \"INTO\",\n \"IS\",\n \"ISNULL\",\n \"JOIN\",\n \"KEY\",\n \"LAST\",\n \"LEFT\",\n \"LIKE\",\n \"LIMIT\",\n \"MATCH\",\n \"MATERIALIZED\",\n \"NATURAL\",\n \"NO\",\n \"NOT\",\n \"NOTHING\",\n \"NOTNULL\",\n \"NULL\",\n \"NULLS\",\n \"OF\",\n \"OFFSET\",\n \"ON\",\n \"OR\",\n \"ORDER\",\n \"OTHERS\",\n \"OUTER\",\n \"OVER\",\n \"PARTITION\",\n \"PLAN\",\n \"PRAGMA\",\n \"PRECEDING\",\n \"PRIMARY\",\n \"QUERY\",\n \"RAISE\",\n \"RANGE\",\n \"RECURSIVE\",\n \"REFERENCES\",\n \"REGEXP\",\n \"REINDEX\",\n \"RELEASE\",\n \"RENAME\",\n \"REPLACE\",\n \"RESTRICT\",\n \"RESPECT\",\n \"RETURNING\",\n \"RIGHT\",\n \"ROLLBACK\",\n \"ROW\",\n \"ROWS\",\n \"SAVEPOINT\",\n \"SELECT\",\n \"SET\",\n \"TABLE\",\n \"TEMP\",\n \"TEMPORARY\",\n \"THEN\",\n \"TIES\",\n \"TO\",\n \"TRANSACTION\",\n \"TRIGGER\",\n \"TRUE\",\n \"UNBOUNDED\",\n \"UNION\",\n \"UNIQUE\",\n \"UPDATE\",\n \"USING\",\n \"VACUUM\",\n \"VALUES\",\n \"VIEW\",\n \"VIRTUAL\",\n \"WHEN\",\n \"WHERE\",\n \"WINDOW\",\n \"WITH\",\n \"WITHOUT\",\n]);\n\nconst AGGREGATE_FUNCTIONS = new Set([\n \"AVG\",\n \"COUNT\",\n \"GROUP_CONCAT\",\n \"STRING_AGG\",\n \"MAX\",\n \"MIN\",\n \"SUM\",\n \"TOTAL\",\n \"JSON_GROUP_ARRAY\",\n \"JSON_GROUP_OBJECT\",\n \"JSONB_GROUP_ARRAY\",\n \"JSONB_GROUP_OBJECT\",\n]);\n\n/** SQLite binary operator precedence (higher binds tighter). */\nconst PREC = {\n OR: 10,\n AND: 20,\n NOT: 25,\n IS_IN_LIKE: 30,\n COMPARE: 40,\n BIT_OR: 45,\n BIT_AND: 46,\n SHIFT: 47,\n ADD: 50,\n MUL: 60,\n CONCAT: 70,\n JSON_ARROW: 80,\n} as const;\n\nexport interface ParsedUnit {\n statement: Statement;\n /** Source slice for this statement (no trailing semicolon); used for sqlite_master.sql. */\n sql: string;\n}\n\nexport class Parser {\n private pos = 0;\n\n constructor(\n private readonly tokens: Token[],\n private readonly source = \"\",\n ) {}\n\n private current(): Token {\n return this.tokens[this.pos] ?? this.tokens[this.tokens.length - 1]!;\n }\n\n private peek(offset = 1): Token {\n return this.tokens[this.pos + offset] ?? this.tokens[this.tokens.length - 1]!;\n }\n\n private at(kind: TokenKind): boolean {\n return this.current().kind === kind;\n }\n\n private check(...kinds: TokenKind[]): boolean {\n return kinds.includes(this.current().kind);\n }\n\n private advance(): Token {\n const t = this.current();\n if (t.kind !== \"EOF\") this.pos++;\n return t;\n }\n\n private match(...kinds: TokenKind[]): boolean {\n if (this.check(...kinds)) {\n this.advance();\n return true;\n }\n return false;\n }\n\n private expect(kind: TokenKind, message?: string): Token {\n if (!this.at(kind)) {\n this.syntaxError(message ?? `expected ${kind}, got ${this.current().kind}`);\n }\n return this.advance();\n }\n\n syntaxError(message: string): never {\n const t = this.current();\n throw new SqliteError(`${message} at ${t.line}:${t.column}`, \"syntax\");\n }\n\n /** Accept IDENT or keyword tokens as identifier names. */\n parseIdent(): string {\n const t = this.current();\n if (t.kind === \"IDENT\") {\n this.advance();\n return t.value;\n }\n if (IDENT_KEYWORDS.has(t.kind)) {\n this.advance();\n return t.value;\n }\n this.syntaxError(\"expected identifier\");\n }\n\n private parseQualifiedTableName(): { schema: string | null; name: string } {\n const first = this.parseIdent();\n if (this.match(\"DOT\")) {\n const second = this.parseIdent();\n return { schema: first, name: second };\n }\n return { schema: null, name: first };\n }\n\n private parseTableName(): string {\n const qname = this.parseQualifiedTableName();\n return qname.schema ? `${qname.schema}.${qname.name}` : qname.name;\n }\n\n private parseAttachStmt(): AttachStmt {\n this.expect(\"ATTACH\");\n this.match(\"DATABASE\");\n const filename = this.parseExpr();\n this.expect(\"AS\");\n const schema = this.parseIdent();\n return { type: \"attach\", filename, schema };\n }\n\n private parseDetachStmt(): DetachStmt {\n this.expect(\"DETACH\");\n this.match(\"DATABASE\");\n const schema = this.parseIdent();\n return { type: \"detach\", schema };\n }\n\n private optionalAlias(): string | null {\n if (this.match(\"AS\")) return this.parseIdent();\n // Implicit aliases use only non-keyword IDENT tokens to avoid swallowing clause keywords.\n if (this.current().kind === \"IDENT\") {\n return this.parseIdent();\n }\n return null;\n }\n\n // \u2500\u2500 Statements \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n parseStatements(): Statement[] {\n return this.parseUnits().map((unit) => unit.statement);\n }\n\n /** Parse statements with per-statement source slices for catalog `sql` text. */\n parseUnits(): ParsedUnit[] {\n const units: ParsedUnit[] = [];\n while (!this.at(\"EOF\")) {\n if (this.match(\"SEMI\")) continue;\n const start = this.current().start;\n const statement = this.parseStatement();\n const end = this.pos > 0 ? this.tokens[this.pos - 1]!.end : this.current().end;\n this.match(\"SEMI\");\n const sql = this.source ? this.source.slice(start, end).trimEnd() : \"\";\n units.push({ statement, sql });\n }\n return units;\n }\n\n parseStatement(): Statement {\n if (this.match(\"EXPLAIN\")) {\n let queryPlan = false;\n if (this.match(\"QUERY\")) {\n this.expect(\"PLAN\");\n queryPlan = true;\n }\n const stmt = this.parseStatement();\n return { type: \"explain\", queryPlan, statement: stmt };\n }\n\n if (this.at(\"WITH\")) {\n const withClause = this.parseWithClause();\n if (this.at(\"SELECT\")) return this.parseSelectStmt(withClause);\n if (this.at(\"INSERT\") || this.at(\"REPLACE\")) return this.parseInsertStmt(withClause);\n if (this.at(\"UPDATE\")) return this.parseUpdateStmt(withClause);\n if (this.at(\"DELETE\")) return this.parseDeleteStmt(withClause);\n this.syntaxError(\"expected SELECT, INSERT, UPDATE, or DELETE after WITH clause\");\n }\n if (this.at(\"SELECT\")) return this.parseSelectStmt();\n\n if (this.at(\"INSERT\") || this.at(\"REPLACE\")) {\n return this.parseInsertStmt();\n }\n if (this.at(\"UPDATE\")) return this.parseUpdateStmt();\n if (this.at(\"DELETE\")) return this.parseDeleteStmt();\n\n if (this.at(\"CREATE\")) return this.parseCreateStmt();\n if (this.at(\"DROP\")) return this.parseDropStmt();\n if (this.at(\"ALTER\")) return this.parseAlterTableStmt();\n\n if (this.at(\"BEGIN\")) return this.parseBeginStmt();\n if (this.check(\"COMMIT\", \"END\")) return this.parseCommitStmt();\n if (this.at(\"ROLLBACK\")) return this.parseRollbackStmt();\n if (this.at(\"SAVEPOINT\")) return this.parseSavepointStmt();\n if (this.at(\"RELEASE\")) return this.parseReleaseStmt();\n if (this.at(\"PRAGMA\")) return this.parsePragmaStmt();\n\n if (this.at(\"ATTACH\")) return this.parseAttachStmt();\n if (this.at(\"DETACH\")) return this.parseDetachStmt();\n\n if (this.at(\"ANALYZE\")) return this.parseAnalyzeStmt();\n if (this.at(\"REINDEX\")) return this.parseReindexStmt();\n if (this.at(\"VACUUM\")) return this.parseVacuumStmt();\n\n this.syntaxError(`unexpected token ${this.current().kind}`);\n }\n\n private parseAnalyzeStmt(): import(\"../ast/nodes.ts\").AnalyzeStmt {\n this.expect(\"ANALYZE\");\n if (this.at(\"SEMI\") || this.at(\"EOF\")) return { type: \"analyze\", schema: null, name: null };\n const first = this.parseIdent();\n if (this.match(\"DOT\")) {\n return { type: \"analyze\", schema: first, name: this.parseIdent() };\n }\n return { type: \"analyze\", schema: null, name: first };\n }\n\n private parseReindexStmt(): import(\"../ast/nodes.ts\").ReindexStmt {\n this.expect(\"REINDEX\");\n if (this.at(\"SEMI\") || this.at(\"EOF\")) return { type: \"reindex\", schema: null, name: null };\n const first = this.parseIdent();\n if (this.match(\"DOT\")) {\n return { type: \"reindex\", schema: first, name: this.parseIdent() };\n }\n return { type: \"reindex\", schema: null, name: first };\n }\n\n private parseVacuumStmt(): import(\"../ast/nodes.ts\").VacuumStmt {\n this.expect(\"VACUUM\");\n let schema: string | null = null;\n if (this.at(\"IDENT\") || this.at(\"STRING\")) {\n // VACUUM schema_name \u2014 but INTO starts with keyword\n if (!this.at(\"INTO\")) schema = this.parseIdent();\n }\n let into: string | null = null;\n if (this.match(\"INTO\")) {\n into = this.at(\"STRING\") ? String(this.advance().value) : this.parseIdent();\n }\n return { type: \"vacuum\", schema, into };\n }\n\n private parseWithClause(): WithClause {\n this.expect(\"WITH\");\n const recursive = this.match(\"RECURSIVE\");\n const ctes: Cte[] = [];\n do {\n const name = this.parseIdent();\n let columns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n columns = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n this.expect(\"AS\");\n let materialized: Cte[\"materialized\"] = null;\n if (this.match(\"NOT\")) {\n this.expect(\"MATERIALIZED\", \"expected MATERIALIZED after NOT\");\n materialized = \"not_materialized\";\n } else if (this.match(\"MATERIALIZED\")) materialized = \"materialized\";\n this.expect(\"LPAREN\");\n const select = this.at(\"VALUES\")\n ? this.parseValuesAsSelect()\n : this.at(\"WITH\")\n ? this.parseSelectStmt()\n : this.parseSelectCore();\n this.expect(\"RPAREN\");\n ctes.push({ name, columns, materialized, select });\n } while (this.match(\"COMMA\"));\n return { recursive, ctes };\n }\n\n private parseOptionalWith(): WithClause | null {\n return this.at(\"WITH\") ? this.parseWithClause() : null;\n }\n\n // \u2500\u2500 SELECT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n parseSelectStmt(withClause = this.parseOptionalWith()): SelectStmt {\n const select = this.parseSelectCore();\n select.with = withClause;\n return select;\n }\n\n private parseSelectCore(): SelectStmt {\n this.expect(\"SELECT\");\n const distinct = this.match(\"DISTINCT\");\n this.match(\"ALL\");\n\n if (this.at(\"FROM\")) {\n throw new SqliteError('near \"FROM\": syntax error', \"syntax\");\n }\n const columns = this.parseResultColumns();\n let from: FromItem | null = null;\n if (this.match(\"FROM\")) {\n from = this.parseFromItem();\n }\n\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n\n const groupBy: Expr[] = [];\n if (this.match(\"GROUP\")) {\n this.expect(\"BY\");\n do {\n groupBy.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n\n let having: Expr | null = null;\n if (this.match(\"HAVING\")) having = this.parseExpr();\n\n const windows: { name: string; spec: WindowSpec }[] = [];\n if (this.match(\"WINDOW\")) {\n do {\n const name = this.parseIdent();\n this.expect(\"AS\");\n this.expect(\"LPAREN\");\n const spec = this.parseWindowSpec();\n this.expect(\"RPAREN\");\n windows.push({ name, spec });\n } while (this.match(\"COMMA\"));\n }\n\n const orderBy = this.parseOrderBy();\n const limit = this.parseLimit();\n\n const stmt: SelectStmt = {\n type: \"select\",\n with: null,\n distinct,\n columns,\n from,\n where,\n groupBy,\n having,\n windows,\n orderBy,\n limit,\n compound: null,\n };\n\n if (this.check(\"UNION\", \"INTERSECT\", \"EXCEPT\")) {\n stmt.compound = this.parseCompoundTail();\n // ORDER BY and LIMIT following a compound SELECT apply to the entire\n // compound, even though the recursive parser initially attaches them\n // to its right-most arm.\n if (stmt.compound.select.orderBy.length > 0) {\n stmt.orderBy = stmt.compound.select.orderBy;\n stmt.compound.select.orderBy = [];\n }\n if (stmt.compound.select.limit) {\n stmt.limit = stmt.compound.select.limit;\n stmt.compound.select.limit = null;\n }\n }\n\n return stmt;\n }\n\n private parseCompoundTail(): CompoundTail {\n let op: CompoundTail[\"op\"];\n if (this.match(\"UNION\")) {\n op = this.match(\"ALL\") ? \"UNION ALL\" : \"UNION\";\n } else if (this.match(\"INTERSECT\")) {\n op = \"INTERSECT\";\n } else {\n this.expect(\"EXCEPT\");\n op = \"EXCEPT\";\n }\n const select = this.parseSelectCore();\n return { op, select };\n }\n\n private parseResultColumns(): ResultColumn[] {\n const cols: ResultColumn[] = [];\n do {\n if (this.match(\"STAR\")) {\n cols.push({ type: \"star\", table: null });\n } else if (this.check(\"IDENT\") || IDENT_KEYWORDS.has(this.current().kind)) {\n const saved = this.pos;\n const first = this.parseIdent();\n if (this.match(\"DOT\") && this.at(\"STAR\")) {\n this.advance();\n cols.push({ type: \"star\", table: first });\n } else {\n this.pos = saved;\n const expr = this.parseExpr();\n let alias: string | null = null;\n if (this.match(\"AS\")) alias = this.parseIdent();\n else if (\n this.current().kind === \"IDENT\" ||\n (IDENT_KEYWORDS.has(this.current().kind) && !this.isSelectClauseStart())\n ) {\n alias = this.parseIdent();\n }\n cols.push({ type: \"expr\", expr, alias });\n }\n } else {\n const expr = this.parseExpr();\n let alias: string | null = null;\n if (this.match(\"AS\")) alias = this.parseIdent();\n else if (\n this.current().kind === \"IDENT\" ||\n (IDENT_KEYWORDS.has(this.current().kind) && !this.isSelectClauseStart())\n ) {\n alias = this.parseIdent();\n }\n cols.push({ type: \"expr\", expr, alias });\n }\n } while (this.match(\"COMMA\"));\n return cols;\n }\n\n private isSelectClauseStart(): boolean {\n return this.check(\n \"FROM\",\n \"WHERE\",\n \"GROUP\",\n \"HAVING\",\n \"WINDOW\",\n \"ORDER\",\n \"LIMIT\",\n \"UNION\",\n \"INTERSECT\",\n \"EXCEPT\",\n \"COMMA\",\n \"SEMI\",\n \"EOF\",\n \"RPAREN\",\n );\n }\n\n private parseFromItem(): FromItem {\n let left = this.parseFromPrimary();\n while (true) {\n if (this.match(\"COMMA\")) {\n const right = this.parseFromPrimary();\n left = this.makeJoin(left, right, \"CROSS\", null, null);\n continue;\n }\n const joinInfo = this.parseJoinOp();\n if (!joinInfo) break;\n const right = this.parseFromPrimary();\n let on: Expr | null = null;\n let using: string[] | null = null;\n if (joinInfo.natural) {\n using = [];\n } else if (this.match(\"ON\")) {\n on = this.parseExpr();\n } else if (this.match(\"USING\")) {\n this.expect(\"LPAREN\");\n using = [];\n do {\n using.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n } else if (joinInfo.type !== \"CROSS\" && joinInfo.type !== \"INNER\") {\n this.syntaxError(\"expected ON or USING after JOIN\");\n }\n left = this.makeJoin(left, right, joinInfo.type, on, using);\n }\n return left;\n }\n\n private makeJoin(\n left: FromItem,\n right: FromItem,\n joinType: JoinFrom[\"joinType\"],\n on: Expr | null,\n using: string[] | null,\n ): JoinFrom {\n return { type: \"join\", left, right, joinType, on, using };\n }\n\n private parseJoinOp(): { type: JoinFrom[\"joinType\"]; natural: boolean } | null {\n const natural = this.match(\"NATURAL\");\n if (this.match(\"CROSS\")) {\n this.expect(\"JOIN\");\n return { type: \"CROSS\", natural: false };\n }\n let type: JoinFrom[\"joinType\"] = \"INNER\";\n if (this.match(\"INNER\")) type = \"INNER\";\n else if (this.match(\"LEFT\")) type = \"LEFT\";\n else if (this.match(\"RIGHT\")) type = \"RIGHT\";\n else if (this.match(\"FULL\")) type = \"FULL\";\n if (type !== \"INNER\" || this.at(\"OUTER\") || this.at(\"JOIN\")) {\n this.match(\"OUTER\");\n if (!this.match(\"JOIN\")) return null;\n return { type, natural };\n }\n if (this.match(\"JOIN\")) return { type: \"INNER\", natural };\n if (natural) this.syntaxError(\"expected JOIN after NATURAL\");\n return null;\n }\n\n private parseFromPrimary(): FromItem {\n if (this.match(\"LPAREN\")) {\n if (this.at(\"SELECT\") || this.at(\"WITH\") || this.at(\"VALUES\")) {\n const select = this.at(\"SELECT\") || this.at(\"WITH\") ? this.parseSelectStmt() : this.parseValuesAsSelect();\n this.expect(\"RPAREN\");\n // SQLite allows omitting the alias; invent one for the AST.\n const alias = this.optionalAlias() ?? `__subq_${this.pos}`;\n return { type: \"subquery\", select, alias };\n }\n const item = this.parseFromItem();\n this.expect(\"RPAREN\");\n const alias = this.optionalAlias();\n if (alias && item.type === \"table\") item.alias = alias;\n return item;\n }\n\n const qname = this.parseQualifiedTableName();\n if (this.match(\"LPAREN\")) {\n const name = qname.name;\n const args: Expr[] = [];\n if (!this.at(\"RPAREN\")) {\n do {\n args.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n this.expect(\"RPAREN\");\n const alias = this.optionalAlias();\n return { type: \"table_func\", name, args, alias };\n }\n\n const alias = this.optionalAlias();\n if (this.match(\"INDEXED\")) {\n this.expect(\"BY\");\n this.parseIdent(); // index hint \u2014 planner is a no-op\n } else if (this.match(\"NOT\") && this.at(\"INDEXED\")) {\n this.advance(); // INDEXED\n }\n return {\n type: \"table\",\n schema: qname.schema,\n name: qname.name,\n alias,\n } satisfies TableRef;\n }\n\n private parseValuesAsSelect(): SelectStmt {\n this.expect(\"VALUES\");\n const rows: Expr[][] = [];\n do {\n this.expect(\"LPAREN\");\n const row: Expr[] = [];\n do {\n row.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n rows.push(row);\n } while (this.match(\"COMMA\"));\n\n const selectFor = (row: Expr[]): SelectStmt => ({\n type: \"select\",\n with: null,\n distinct: false,\n columns: row.map((expr) => ({ type: \"expr\" as const, expr, alias: null })),\n from: null,\n where: null,\n groupBy: [],\n having: null,\n windows: [],\n orderBy: [],\n limit: null,\n compound: null,\n });\n const result = selectFor(rows[0] ?? []);\n let current = result;\n for (const row of rows.slice(1)) {\n current.compound = { op: \"UNION ALL\", select: selectFor(row) };\n current = current.compound.select;\n }\n if (this.check(\"UNION\", \"INTERSECT\", \"EXCEPT\")) {\n current.compound = this.parseCompoundTail();\n }\n return result;\n }\n\n private parseOrderBy(): OrderByItem[] {\n if (!this.match(\"ORDER\")) return [];\n this.expect(\"BY\");\n const items: OrderByItem[] = [];\n do {\n const expr = this.parseExpr();\n let dir: \"ASC\" | \"DESC\" = \"ASC\";\n if (this.match(\"ASC\")) dir = \"ASC\";\n else if (this.match(\"DESC\")) dir = \"DESC\";\n let nulls: \"FIRST\" | \"LAST\" | null = null;\n if (this.match(\"NULLS\")) {\n if (this.match(\"FIRST\")) nulls = \"FIRST\";\n else if (this.match(\"LAST\")) nulls = \"LAST\";\n else this.syntaxError(\"expected FIRST or LAST after NULLS\");\n }\n items.push({ expr, dir, nulls });\n } while (this.match(\"COMMA\"));\n return items;\n }\n\n private parseLimit(): LimitClause | null {\n if (!this.match(\"LIMIT\")) return null;\n const first = this.parseExpr();\n if (this.match(\"OFFSET\")) {\n return { limit: first, offset: this.parseExpr() };\n }\n if (this.match(\"COMMA\")) {\n const limit = this.parseExpr();\n return { limit, offset: first };\n }\n let offset: Expr | null = null;\n if (this.match(\"OFFSET\")) offset = this.parseExpr();\n return { limit: first, offset };\n }\n\n // \u2500\u2500 INSERT / REPLACE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseInsertStmt(withClause = this.parseOptionalWith()): InsertStmt {\n let mode: InsertStmt[\"mode\"] = \"insert\";\n\n if (this.match(\"REPLACE\")) {\n mode = \"replace\";\n } else {\n this.expect(\"INSERT\");\n const orAction = this.parseOrConflict();\n if (orAction === \"REPLACE\") mode = \"insert_or_replace\";\n else if (orAction === \"IGNORE\") mode = \"insert_or_ignore\";\n else if (orAction === \"ABORT\") mode = \"insert_or_abort\";\n else if (orAction === \"ROLLBACK\") mode = \"insert_or_rollback\";\n else if (orAction === \"FAIL\") mode = \"insert_or_fail\";\n }\n\n this.expect(\"INTO\");\n const table = this.parseTableName();\n\n let columns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n columns = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n\n let values: Expr[][] | null = null;\n let select: SelectStmt | null = null;\n\n if (this.match(\"VALUES\")) {\n values = [];\n do {\n this.expect(\"LPAREN\");\n const row: Expr[] = [];\n do {\n row.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n values.push(row);\n } while (this.match(\"COMMA\"));\n } else if (this.at(\"SELECT\") || this.at(\"WITH\")) {\n select = this.parseSelectStmt();\n } else if (this.at(\"DEFAULT\")) {\n this.advance();\n this.expect(\"VALUES\");\n columns = [];\n values = [[]];\n } else {\n this.syntaxError(\"expected VALUES, SELECT, or DEFAULT\");\n }\n\n const upsert = this.parseUpsertClause();\n const returning = this.parseReturning();\n\n return {\n type: \"insert\",\n with: withClause,\n mode,\n table,\n columns,\n values,\n select,\n upsert,\n returning,\n };\n }\n\n private parseUpsertClause(): UpsertClause | null {\n if (!this.match(\"ON\")) return null;\n this.expect(\"CONFLICT\");\n let targetColumns: string[] | null = null;\n let targetExprs: Expr[] | null = null;\n if (this.match(\"LPAREN\")) {\n targetColumns = [];\n targetExprs = [];\n do {\n const expr = this.parseExprPrec(PREC.ADD);\n targetExprs.push(expr);\n targetColumns.push(expr.type === \"column\" ? expr.name : \"\");\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n let targetWhere: Expr | null = null;\n if (this.match(\"WHERE\")) targetWhere = this.parseExpr();\n\n this.expect(\"DO\");\n if (this.match(\"NOTHING\")) {\n return { targetColumns, targetExprs, targetWhere, action: \"nothing\" };\n }\n this.expect(\"UPDATE\");\n this.expect(\"SET\");\n const set = this.parseSetItems();\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n return { targetColumns, targetExprs, targetWhere, action: { set, where } };\n }\n\n private parseSetItems(): SetItem[] {\n const items: SetItem[] = [];\n do {\n const columns = [this.parseIdent()];\n this.expect(\"EQ\");\n const expr = this.parseExpr();\n items.push({ columns, expr });\n } while (this.match(\"COMMA\"));\n return items;\n }\n\n private parseReturning(): ResultColumn[] {\n if (!this.match(\"RETURNING\")) return [];\n return this.parseResultColumns();\n }\n\n // \u2500\u2500 UPDATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseUpdateStmt(withClause = this.parseOptionalWith()): UpdateStmt {\n this.expect(\"UPDATE\");\n const or = this.mapUpdateOr(this.parseOrConflict());\n const table = this.parseTableName();\n const alias = this.optionalAlias();\n this.expect(\"SET\");\n const set = this.parseSetItems();\n let from: FromItem | null = null;\n if (this.match(\"FROM\")) from = this.parseFromItem();\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n const returning = this.parseReturning();\n return { type: \"update\", with: withClause, or, table, alias, set, from, where, returning };\n }\n\n // \u2500\u2500 DELETE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseDeleteStmt(withClause = this.parseOptionalWith()): DeleteStmt {\n this.expect(\"DELETE\");\n const or = this.parseOrConflict();\n this.expect(\"FROM\");\n const table = this.parseTableName();\n const alias = this.optionalAlias();\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n const returning = this.parseReturning();\n const orMode =\n or === null\n ? null\n : or === \"REPLACE\"\n ? \"replace\"\n : or === \"IGNORE\"\n ? \"ignore\"\n : or === \"ABORT\"\n ? \"abort\"\n : or === \"ROLLBACK\"\n ? \"rollback\"\n : \"fail\";\n return { type: \"delete\", with: withClause, or: orMode, table, alias, where, returning };\n }\n\n // \u2500\u2500 CREATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseCreateStmt(): Statement {\n this.expect(\"CREATE\");\n const temp = this.match(\"TEMP\") || this.match(\"TEMPORARY\");\n if (this.match(\"VIRTUAL\")) {\n this.expect(\"TABLE\");\n return this.parseCreateVirtualTable();\n }\n if (this.match(\"TRIGGER\")) return this.parseCreateTrigger(temp);\n if (this.match(\"UNIQUE\")) {\n this.expect(\"INDEX\");\n return this.parseCreateIndex(true, temp);\n }\n if (this.match(\"INDEX\")) return this.parseCreateIndex(false, temp);\n if (this.match(\"VIEW\")) return this.parseCreateView(temp);\n this.expect(\"TABLE\");\n return this.parseCreateTable(temp);\n }\n\n private parseCreateVirtualTable(): CreateVirtualTableStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseTableName();\n this.expect(\"USING\");\n const module = this.parseIdent();\n const moduleArgs: string[] = [];\n if (this.match(\"LPAREN\")) {\n if (!this.at(\"RPAREN\")) {\n do {\n moduleArgs.push(this.parseVirtualTableArg());\n } while (this.match(\"COMMA\"));\n }\n this.expect(\"RPAREN\");\n }\n return { type: \"create_virtual_table\", ifNotExists, name, module, moduleArgs };\n }\n\n /** One comma-separated CREATE VIRTUAL TABLE module argument (FTS options, columns, \u2026). */\n private parseVirtualTableArg(): string {\n // STRING alone\n if (this.at(\"STRING\")) {\n const value = String(this.current().literal);\n this.advance();\n return value;\n }\n\n // IDENT [UNINDEXED|NOTINDEXED] | IDENT = value\n const start = this.parseIdentOrQuoted();\n if (this.match(\"EQ\") || this.match(\"EQEQ\")) {\n const value = this.parseVirtualTableOptionValue();\n return `${start}=${value}`;\n }\n // Optional UNINDEXED / NOTINDEXED / type names\n const extras: string[] = [];\n while (this.at(\"IDENT\") || this.at(\"STRING\")) {\n // Stop before next comma-separated arg would need peek of COMMA/RPAREN \u2014 only consume trailing idents\n if (this.at(\"IDENT\")) {\n const upper = this.current().value.toUpperCase();\n if (\n upper === \"UNINDEXED\" ||\n upper === \"NOTINDEXED\" ||\n upper === \"TEXT\" ||\n upper === \"INTEGER\" ||\n upper === \"REAL\" ||\n upper === \"BLOB\" ||\n upper === \"NUMERIC\"\n ) {\n extras.push(this.current().value);\n this.advance();\n continue;\n }\n }\n break;\n }\n return extras.length ? `${start} ${extras.join(\" \")}` : start;\n }\n\n private parseIdentOrQuoted(): string {\n if (this.at(\"STRING\")) {\n // quoted identifier written as string in some dialects\n const value = String(this.current().literal);\n this.advance();\n return `\"${value.replaceAll('\"', '\"\"')}\"`;\n }\n return this.parseIdent();\n }\n\n private parseVirtualTableOptionValue(): string {\n if (this.at(\"STRING\")) {\n const value = String(this.current().literal);\n this.advance();\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n }\n if (this.at(\"NUMBER\")) {\n const value = this.current().value;\n this.advance();\n return value;\n }\n if (this.at(\"IDENT\")) {\n return this.parseIdent();\n }\n // Empty string after content=\n return \"''\";\n }\n\n private parseIfNotExists(): boolean {\n if (!this.match(\"IF\")) return false;\n this.expect(\"NOT\");\n this.expect(\"EXISTS\");\n return true;\n }\n\n private parseIfExists(): boolean {\n if (!this.match(\"IF\")) return false;\n this.expect(\"EXISTS\");\n return true;\n }\n\n private mapUpdateOr(action: ConflictAction | null): UpdateStmt[\"or\"] {\n if (!action) return null;\n switch (action) {\n case \"ROLLBACK\":\n return \"rollback\";\n case \"ABORT\":\n return \"abort\";\n case \"FAIL\":\n return \"fail\";\n case \"IGNORE\":\n return \"ignore\";\n case \"REPLACE\":\n return \"replace\";\n }\n }\n\n private parseCreateTable(temp: boolean): CreateTableStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseTableName();\n\n if (this.match(\"AS\")) {\n const asSelect = this.parseSelectStmt();\n return {\n type: \"create_table\",\n ifNotExists,\n temp,\n name,\n columns: [],\n constraints: [],\n asSelect,\n withoutRowid: false,\n strict: false,\n };\n }\n\n this.expect(\"LPAREN\");\n const columns: ColumnDef[] = [];\n const constraints: TableConstraint[] = [];\n do {\n if (this.at(\"PRIMARY\") || this.at(\"UNIQUE\") || this.at(\"CHECK\") || this.at(\"FOREIGN\") || this.at(\"CONSTRAINT\")) {\n constraints.push(this.parseTableConstraint());\n } else {\n columns.push(this.parseColumnDef());\n }\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n let withoutRowid = false;\n let strict = false;\n while (!this.at(\"SEMI\") && !this.at(\"EOF\")) {\n if (this.match(\"WITHOUT\")) {\n const word = this.parseIdent();\n if (word.toUpperCase() !== \"ROWID\") this.syntaxError(\"expected ROWID after WITHOUT\");\n withoutRowid = true;\n } else {\n const word = this.parseIdent();\n if (word.toUpperCase() !== \"STRICT\") this.syntaxError(`unexpected table option ${word}`);\n strict = true;\n }\n this.match(\"COMMA\");\n }\n\n return {\n type: \"create_table\",\n ifNotExists,\n temp,\n name,\n columns,\n constraints,\n asSelect: null,\n withoutRowid,\n strict,\n };\n }\n\n private parseColumnDef(): ColumnDef {\n const name = this.parseIdent();\n let typeName: string | null = null;\n if (this.current().kind === \"IDENT\" || IDENT_KEYWORDS.has(this.current().kind)) {\n if (\n !this.at(\"CONSTRAINT\") &&\n !this.at(\"PRIMARY\") &&\n !this.at(\"NOT\") &&\n !this.at(\"UNIQUE\") &&\n !this.at(\"CHECK\") &&\n !this.at(\"DEFAULT\") &&\n !this.at(\"REFERENCES\") &&\n !this.at(\"COLLATE\") &&\n !this.at(\"GENERATED\") &&\n !this.at(\"COMMA\") &&\n !this.at(\"RPAREN\")\n ) {\n typeName = this.parseTypeName();\n }\n }\n const constraints: ColumnConstraint[] = [];\n while (this.isColumnConstraintStart()) {\n constraints.push(this.parseColumnConstraint());\n }\n return { name, typeName, constraints };\n }\n\n /** Type names may include optional precision/scale: VARCHAR(10), DECIMAL(10,2). */\n private parseTypeName(): string {\n const base = this.parseIdent();\n if (!this.match(\"LPAREN\")) return base;\n const parts: string[] = [];\n do {\n if (this.at(\"NUMBER\") || this.at(\"PLUS\") || this.at(\"MINUS\")) {\n let sign = \"\";\n if (this.match(\"PLUS\")) sign = \"+\";\n else if (this.match(\"MINUS\")) sign = \"-\";\n const number = this.advance();\n parts.push(`${sign}${number.value}`);\n } else {\n parts.push(this.parseIdent());\n }\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n return `${base}(${parts.join(\",\")})`;\n }\n\n private isColumnConstraintStart(): boolean {\n return this.check(\n \"CONSTRAINT\",\n \"PRIMARY\",\n \"NOT\",\n \"UNIQUE\",\n \"CHECK\",\n \"DEFAULT\",\n \"COLLATE\",\n \"REFERENCES\",\n \"GENERATED\",\n );\n }\n\n private parseColumnConstraint(): ColumnConstraint {\n this.match(\"CONSTRAINT\");\n if (this.current().kind === \"IDENT\" || IDENT_KEYWORDS.has(this.current().kind)) {\n const next = this.peek();\n if (\n next.kind === \"PRIMARY\" ||\n next.kind === \"UNIQUE\" ||\n next.kind === \"CHECK\" ||\n next.kind === \"DEFAULT\" ||\n next.kind === \"NOT\" ||\n next.kind === \"REFERENCES\"\n ) {\n this.parseIdent(); // constraint name, discarded for column level\n }\n }\n if (this.match(\"PRIMARY\")) {\n this.expect(\"KEY\");\n let order: \"ASC\" | \"DESC\" | null = null;\n if (this.match(\"ASC\")) order = \"ASC\";\n else if (this.match(\"DESC\")) order = \"DESC\";\n const autoincrement = this.match(\"AUTOINCREMENT\");\n const conflict = this.parseOnConflict();\n return { type: \"primary_key\", order, autoincrement, conflict };\n }\n if (this.match(\"NOT\")) {\n this.expect(\"NULL\");\n const conflict = this.parseOnConflict();\n return { type: \"not_null\", conflict };\n }\n if (this.match(\"UNIQUE\")) {\n const conflict = this.parseOnConflict();\n return { type: \"unique\", conflict };\n }\n if (this.match(\"CHECK\")) {\n this.expect(\"LPAREN\");\n const expr = this.parseExpr();\n this.expect(\"RPAREN\");\n return { type: \"check\", expr };\n }\n if (this.match(\"DEFAULT\")) {\n const expr = this.parseExpr();\n return { type: \"default\", expr };\n }\n if (this.match(\"COLLATE\")) {\n const name = this.parseIdent();\n return { type: \"collate\", name };\n }\n if (this.match(\"REFERENCES\")) {\n return this.parseReferencesConstraint();\n }\n if (this.match(\"GENERATED\")) {\n const always = this.parseIdent();\n if (always.toUpperCase() !== \"ALWAYS\") this.syntaxError(\"expected ALWAYS after GENERATED\");\n this.expect(\"AS\");\n return this.parseGeneratedConstraint();\n }\n if (this.match(\"AS\") && this.at(\"LPAREN\")) {\n return this.parseGeneratedConstraint();\n }\n this.syntaxError(\"expected column constraint\");\n }\n\n private parseGeneratedConstraint(): ColumnConstraint {\n this.expect(\"LPAREN\");\n const expr = this.parseExpr();\n this.expect(\"RPAREN\");\n let stored = false;\n if (this.current().kind === \"IDENT\" || this.at(\"VIRTUAL\")) {\n const word = this.parseIdent().toUpperCase();\n if (word === \"STORED\") stored = true;\n else if (word === \"VIRTUAL\") stored = false;\n else this.syntaxError(\"expected STORED or VIRTUAL after generated column expression\");\n }\n return { type: \"generated\", expr, stored };\n }\n\n private parseReferencesConstraint(): ColumnConstraint {\n const table = this.parseTableName();\n let columns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n columns = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n const { onDelete, onUpdate, match } = this.parseFkActions();\n const { deferrable, initiallyDeferred } = this.parseDeferrable();\n return { type: \"references\", table, columns, onDelete, onUpdate, match, deferrable, initiallyDeferred };\n }\n\n private parseTableConstraint(): TableConstraint {\n let name: string | null = null;\n if (this.match(\"CONSTRAINT\")) {\n name = this.parseIdent();\n }\n if (this.match(\"PRIMARY\")) {\n this.expect(\"KEY\");\n this.expect(\"LPAREN\");\n const columns = this.parseIndexedColumns();\n this.expect(\"RPAREN\");\n const conflict = this.parseOnConflict();\n return { type: \"primary_key\", columns, conflict };\n }\n if (this.match(\"UNIQUE\")) {\n this.expect(\"LPAREN\");\n const columns = this.parseIndexedColumns();\n this.expect(\"RPAREN\");\n const conflict = this.parseOnConflict();\n return { type: \"unique\", columns, conflict, name };\n }\n if (this.match(\"CHECK\")) {\n this.expect(\"LPAREN\");\n const expr = this.parseExpr();\n this.expect(\"RPAREN\");\n return { type: \"check\", expr, name };\n }\n if (this.match(\"FOREIGN\")) {\n this.expect(\"KEY\");\n this.expect(\"LPAREN\");\n const columns: string[] = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n this.expect(\"REFERENCES\");\n const refTable = this.parseTableName();\n let refColumns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n refColumns = [];\n do {\n refColumns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n const { onDelete, onUpdate, match } = this.parseFkActions();\n const { deferrable, initiallyDeferred } = this.parseDeferrable();\n return {\n type: \"foreign_key\",\n columns,\n refTable,\n refColumns,\n onDelete,\n onUpdate,\n match,\n name,\n deferrable,\n initiallyDeferred,\n };\n }\n this.syntaxError(\"expected table constraint\");\n }\n\n private parseIndexedColumns(): IndexedColumn[] {\n const cols: IndexedColumn[] = [];\n do {\n const expr = this.parseExprPrec(PREC.ADD);\n let collate: string | null = null;\n let inner = expr;\n if (inner.type === \"collate\") {\n collate = inner.collation;\n inner = inner.expr;\n }\n if (this.match(\"COLLATE\")) collate = this.parseIdent();\n let order: \"ASC\" | \"DESC\" | null = null;\n if (this.match(\"ASC\")) order = \"ASC\";\n else if (this.match(\"DESC\")) order = \"DESC\";\n if (inner.type === \"column\" && inner.table === null) {\n cols.push({ name: inner.name, collate, order });\n } else {\n cols.push({ name: \"\", collate, order, expr: inner });\n }\n } while (this.match(\"COMMA\"));\n return cols;\n }\n\n private parseOnConflict(): ConflictAction | null {\n if (!this.match(\"ON\")) return null;\n this.expect(\"CONFLICT\");\n return this.parseConflictAction();\n }\n\n private parseConflictAction(): ConflictAction {\n if (this.match(\"ROLLBACK\")) return \"ROLLBACK\";\n if (this.match(\"ABORT\")) return \"ABORT\";\n if (this.match(\"FAIL\")) return \"FAIL\";\n if (this.match(\"IGNORE\")) return \"IGNORE\";\n if (this.match(\"REPLACE\")) return \"REPLACE\";\n this.syntaxError(\"expected conflict action\");\n }\n\n private parseFkAction(kind: \"DELETE\" | \"UPDATE\"): FkAction | null {\n if (!this.match(\"ON\")) return null;\n this.expect(kind);\n if (this.match(\"SET\")) {\n if (this.match(\"NULL\")) return \"SET NULL\";\n this.expect(\"DEFAULT\");\n return \"SET DEFAULT\";\n }\n if (this.match(\"CASCADE\")) return \"CASCADE\";\n if (this.match(\"RESTRICT\")) return \"RESTRICT\";\n if (this.match(\"NO\")) {\n this.expect(\"ACTION\");\n return \"NO ACTION\";\n }\n this.syntaxError(`expected ON ${kind} action`);\n }\n\n private parseFkActions(): { onDelete: FkAction | null; onUpdate: FkAction | null; match: FkMatch } {\n let onDelete: FkAction | null = null;\n let onUpdate: FkAction | null = null;\n let match: FkMatch = \"SIMPLE\";\n const readMatch = (): void => {\n while (this.match(\"MATCH\")) {\n const word = this.parseIdent().toUpperCase();\n if (word === \"FULL\") match = \"FULL\";\n else if (word === \"PARTIAL\") match = \"PARTIAL\";\n else match = \"SIMPLE\";\n }\n };\n // MATCH is accepted (SQLite grammar); SIMPLE is the default. FULL rejects partial-NULL keys.\n readMatch();\n while (this.at(\"ON\")) {\n if (this.peek().kind === \"DELETE\") onDelete = this.parseFkAction(\"DELETE\");\n else if (this.peek().kind === \"UPDATE\") onUpdate = this.parseFkAction(\"UPDATE\");\n else this.syntaxError(\"expected ON DELETE or ON UPDATE\");\n readMatch();\n }\n readMatch();\n return { onDelete, onUpdate, match };\n }\n\n private parseDeferrable(): { deferrable: boolean; initiallyDeferred: boolean } {\n let deferrable = false;\n let initiallyDeferred = false;\n if (this.match(\"NOT\")) {\n this.expect(\"DEFERRABLE\");\n } else if (this.match(\"DEFERRABLE\")) {\n deferrable = true;\n }\n if (this.match(\"INITIALLY\")) {\n if (this.match(\"DEFERRED\")) initiallyDeferred = true;\n else {\n this.expect(\"IMMEDIATE\");\n initiallyDeferred = false;\n }\n }\n return { deferrable, initiallyDeferred: deferrable && initiallyDeferred };\n }\n\n private parseOrConflict(): ConflictAction | null {\n if (!this.match(\"OR\")) return null;\n return this.parseConflictAction();\n }\n\n private parseCreateIndex(unique: boolean, _temp: boolean): CreateIndexStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseIdent();\n this.expect(\"ON\");\n const table = this.parseTableName();\n this.expect(\"LPAREN\");\n const columns = this.parseIndexedColumns();\n this.expect(\"RPAREN\");\n let where: Expr | null = null;\n if (this.match(\"WHERE\")) where = this.parseExpr();\n return { type: \"create_index\", unique, ifNotExists, name, table, columns, where };\n }\n\n private parseCreateView(temp: boolean): CreateViewStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseIdent();\n let columns: string[] | null = null;\n if (this.match(\"LPAREN\")) {\n columns = [];\n do {\n columns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n }\n this.expect(\"AS\");\n const select = this.parseSelectStmt();\n return { type: \"create_view\", ifNotExists, temp, name, columns, select };\n }\n\n private parseCreateTrigger(temp: boolean): CreateTriggerStmt {\n const ifNotExists = this.parseIfNotExists();\n const name = this.parseTableName();\n let timing: CreateTriggerStmt[\"timing\"];\n if (this.match(\"BEFORE\")) timing = \"BEFORE\";\n else if (this.match(\"AFTER\")) timing = \"AFTER\";\n else if (this.match(\"INSTEAD\")) {\n this.expect(\"OF\");\n timing = \"INSTEAD\";\n } else {\n this.syntaxError(\"expected BEFORE, AFTER, or INSTEAD OF\");\n }\n\n let event: CreateTriggerStmt[\"event\"];\n if (this.match(\"INSERT\")) event = \"INSERT\";\n else if (this.match(\"DELETE\")) event = \"DELETE\";\n else if (this.match(\"UPDATE\")) event = \"UPDATE\";\n else this.syntaxError(\"expected INSERT, DELETE, or UPDATE\");\n\n let updateColumns: string[] | null = null;\n if (event === \"UPDATE\" && this.match(\"OF\")) {\n updateColumns = [];\n do {\n updateColumns.push(this.parseIdent());\n } while (this.match(\"COMMA\"));\n }\n\n this.expect(\"ON\");\n const table = this.parseTableName();\n\n let forEachRow = false;\n if (this.match(\"FOR\")) {\n this.expect(\"EACH\");\n this.expect(\"ROW\");\n forEachRow = true;\n }\n\n let when: Expr | null = null;\n if (this.match(\"WHEN\")) when = this.parseExpr();\n\n this.expect(\"BEGIN\");\n const body = this.parseTriggerBody();\n\n return {\n type: \"create_trigger\",\n ifNotExists,\n temp,\n name,\n timing,\n event,\n table,\n updateColumns,\n forEachRow,\n when,\n body,\n };\n }\n\n private parseTriggerBody(): Statement[] {\n const body: Statement[] = [];\n while (!this.at(\"END\") && !this.at(\"EOF\")) {\n if (this.match(\"SEMI\")) continue;\n body.push(this.parseStatement());\n this.match(\"SEMI\");\n }\n this.expect(\"END\");\n return body;\n }\n\n // \u2500\u2500 DROP \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseDropStmt(): Statement {\n this.expect(\"DROP\");\n if (this.match(\"TABLE\")) return this.parseDropTable();\n if (this.match(\"INDEX\")) return this.parseDropIndex();\n if (this.match(\"VIEW\")) return this.parseDropView();\n if (this.match(\"TRIGGER\")) return this.parseDropTrigger();\n this.syntaxError(\"expected TABLE, INDEX, or VIEW after DROP\");\n }\n\n private parseDropTable(): DropTableStmt {\n const ifExists = this.parseIfExists();\n const name = this.parseTableName();\n return { type: \"drop_table\", ifExists, name };\n }\n\n private parseDropIndex(): DropIndexStmt {\n const ifExists = this.parseIfExists();\n const name = this.parseIdent();\n return { type: \"drop_index\", ifExists, name };\n }\n\n private parseDropView(): DropViewStmt {\n const ifExists = this.parseIfExists();\n const name = this.parseIdent();\n return { type: \"drop_view\", ifExists, name };\n }\n\n private parseDropTrigger(): DropTriggerStmt {\n const ifExists = this.parseIfExists();\n const name = this.parseTableName();\n return { type: \"drop_trigger\", ifExists, name };\n }\n\n // \u2500\u2500 ALTER TABLE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseAlterTableStmt(): AlterTableStmt {\n this.expect(\"ALTER\");\n this.expect(\"TABLE\");\n const table = this.parseTableName();\n if (this.match(\"RENAME\")) {\n if (this.match(\"TO\")) {\n const newName = this.parseTableName();\n return { type: \"alter_table\", table, action: { kind: \"rename_table\", newName } };\n }\n if (this.match(\"COLUMN\")) {\n const oldName = this.parseIdent();\n this.expect(\"TO\");\n const newName = this.parseIdent();\n return { type: \"alter_table\", table, action: { kind: \"rename_column\", oldName, newName } };\n }\n this.syntaxError(\"expected TO or COLUMN after RENAME\");\n }\n if (this.match(\"ADD\")) {\n this.match(\"COLUMN\");\n const column = this.parseColumnDef();\n return { type: \"alter_table\", table, action: { kind: \"add_column\", column } };\n }\n if (this.match(\"DROP\")) {\n this.match(\"COLUMN\");\n const name = this.parseIdent();\n return { type: \"alter_table\", table, action: { kind: \"drop_column\", name } };\n }\n this.syntaxError(\"expected RENAME, ADD, or DROP after ALTER TABLE\");\n }\n\n // \u2500\u2500 Transactions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parseBeginStmt(): BeginStmt {\n this.expect(\"BEGIN\");\n let mode: BeginStmt[\"mode\"] = null;\n if (this.match(\"DEFERRED\")) mode = \"DEFERRED\";\n else if (this.match(\"IMMEDIATE\")) mode = \"IMMEDIATE\";\n else if (this.match(\"EXCLUSIVE\")) mode = \"EXCLUSIVE\";\n this.match(\"TRANSACTION\");\n return { type: \"begin\", mode };\n }\n\n private parseCommitStmt(): CommitStmt {\n if (this.at(\"END\")) this.advance();\n else this.expect(\"COMMIT\");\n this.match(\"TRANSACTION\");\n return { type: \"commit\" };\n }\n\n private parseRollbackStmt(): RollbackStmt {\n this.expect(\"ROLLBACK\");\n this.match(\"TRANSACTION\");\n let savepoint: string | null = null;\n if (this.match(\"TO\")) {\n this.match(\"SAVEPOINT\");\n savepoint = this.parseIdent();\n }\n return { type: \"rollback\", savepoint };\n }\n\n private parseSavepointStmt(): SavepointStmt {\n this.expect(\"SAVEPOINT\");\n const name = this.parseIdent();\n return { type: \"savepoint\", name };\n }\n\n private parseReleaseStmt(): ReleaseStmt {\n this.expect(\"RELEASE\");\n this.match(\"SAVEPOINT\");\n const name = this.parseIdent();\n return { type: \"release\", name };\n }\n\n // \u2500\u2500 PRAGMA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private parsePragmaStmt(): PragmaStmt {\n this.expect(\"PRAGMA\");\n const name = this.parseIdent();\n if (this.match(\"EQ\")) {\n return { type: \"pragma\", name, value: this.parseExpr() };\n }\n if (this.match(\"LPAREN\")) {\n let value: Expr | null = null;\n if (!this.at(\"RPAREN\")) value = this.parseExpr();\n this.expect(\"RPAREN\");\n return { type: \"pragma\", name, value };\n }\n return { type: \"pragma\", name, value: null };\n }\n\n // \u2500\u2500 Expressions (Pratt / precedence climbing) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n parseExpr(): Expr {\n return this.parseExprPrec(PREC.OR);\n }\n\n private parseExprPrec(minPrec: number): Expr {\n let left: Expr;\n if (this.at(\"NOT\") && PREC.NOT >= minPrec && !this.isNotKeywordCompound()) {\n this.advance();\n left = { type: \"unary\", op: \"NOT\", expr: this.parseExprPrec(PREC.NOT + 1) };\n } else {\n left = this.parseUnaryExpr();\n }\n\n while (true) {\n left = this.parsePostfix(left);\n\n if (this.at(\"NOT\") && PREC.IS_IN_LIKE >= minPrec) {\n const n = this.peek();\n if (n.kind === \"IN\") {\n this.advance();\n this.advance();\n left = this.parseInRhs(left, true);\n continue;\n }\n if (n.kind === \"LIKE\") {\n this.advance();\n this.advance();\n left = this.parseLikeRhs(left, true, \"LIKE\");\n continue;\n }\n if (n.kind === \"GLOB\") {\n this.advance();\n this.advance();\n left = this.parseLikeRhs(left, true, \"GLOB\");\n continue;\n }\n if (n.kind === \"REGEXP\") {\n this.advance();\n this.advance();\n const pattern = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n left = {\n type: \"unary\",\n op: \"NOT\",\n expr: {\n type: \"function\",\n name: \"REGEXP\",\n distinct: false,\n args: [pattern, left],\n orderBy: [],\n filter: null,\n },\n };\n continue;\n }\n if (n.kind === \"BETWEEN\") {\n this.advance();\n this.advance();\n const lower = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n this.expect(\"AND\");\n const upper = this.parseExprPrec(PREC.AND + 1);\n left = { type: \"between\", not: true, expr: left, lower, upper };\n continue;\n }\n }\n\n if (this.at(\"IS\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n if (this.at(\"NOT\") && this.peek().kind === \"DISTINCT\") {\n this.advance();\n this.advance();\n this.expect(\"FROM\");\n const right = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n left = { type: \"binary\", op: \"IS NOT DISTINCT FROM\", left, right };\n continue;\n }\n if (this.at(\"DISTINCT\")) {\n this.advance();\n this.expect(\"FROM\");\n const right = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n left = { type: \"binary\", op: \"IS DISTINCT FROM\", left, right };\n continue;\n }\n const not = this.match(\"NOT\");\n if (this.match(\"TRUE\")) {\n left = { type: \"is_bool\", expr: left, not, sense: true };\n continue;\n }\n if (this.match(\"FALSE\")) {\n left = { type: \"is_bool\", expr: left, not, sense: false };\n continue;\n }\n const right = this.parseIsRhs();\n left = { type: \"binary\", op: not ? \"IS NOT\" : \"IS\", left, right };\n continue;\n }\n\n if (this.at(\"IN\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n left = this.parseInRhs(left, false);\n continue;\n }\n if (this.at(\"LIKE\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n left = this.parseLikeRhs(left, false, \"LIKE\");\n continue;\n }\n if (this.at(\"GLOB\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n left = this.parseLikeRhs(left, false, \"GLOB\");\n continue;\n }\n if (this.at(\"REGEXP\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n const pattern = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n left = { type: \"function\", name: \"REGEXP\", distinct: false, args: [pattern, left], orderBy: [], filter: null };\n continue;\n }\n if (this.at(\"MATCH\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n const right = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n left = { type: \"binary\", op: \"MATCH\", left, right };\n continue;\n }\n if (this.at(\"BETWEEN\") && PREC.IS_IN_LIKE >= minPrec) {\n this.advance();\n const lower = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n this.expect(\"AND\");\n const upper = this.parseExprPrec(PREC.AND + 1);\n left = { type: \"between\", not: false, expr: left, lower, upper };\n continue;\n }\n\n const bin = this.peekBinaryOp();\n if (!bin || bin.prec < minPrec) break;\n this.advance();\n const right = this.parseExprPrec(bin.prec + 1);\n left = { type: \"binary\", op: bin.op, left, right };\n }\n\n return left;\n }\n\n private peekBinaryOp(): { op: BinaryOp; prec: number } | null {\n const t = this.current();\n switch (t.kind) {\n case \"OR\":\n return { op: \"OR\", prec: PREC.OR };\n case \"AND\":\n return { op: \"AND\", prec: PREC.AND };\n case \"CONCAT\":\n return { op: \"||\", prec: PREC.CONCAT };\n case \"JSON_ARROW\":\n return { op: \"->\", prec: PREC.JSON_ARROW };\n case \"JSON_ARROW2\":\n return { op: \"->>\", prec: PREC.JSON_ARROW };\n case \"PLUS\":\n return { op: \"+\", prec: PREC.ADD };\n case \"MINUS\":\n return { op: \"-\", prec: PREC.ADD };\n case \"STAR\":\n return { op: \"*\", prec: PREC.MUL };\n case \"SLASH\":\n return { op: \"/\", prec: PREC.MUL };\n case \"PERCENT\":\n return { op: \"%\", prec: PREC.MUL };\n case \"LT\":\n return { op: \"<\", prec: PREC.COMPARE };\n case \"LE\":\n return { op: \"<=\", prec: PREC.COMPARE };\n case \"GT\":\n return { op: \">\", prec: PREC.COMPARE };\n case \"GE\":\n return { op: \">=\", prec: PREC.COMPARE };\n case \"EQ\":\n return { op: \"=\", prec: PREC.COMPARE };\n case \"EQEQ\":\n return { op: \"==\", prec: PREC.COMPARE };\n case \"NE\":\n return { op: t.value as \"<>\" | \"!=\", prec: PREC.COMPARE };\n case \"AMP\":\n return { op: \"&\", prec: PREC.BIT_AND };\n case \"PIPE\":\n return { op: \"|\", prec: PREC.BIT_OR };\n case \"LSHIFT\":\n return { op: \"<<\", prec: PREC.SHIFT };\n case \"RSHIFT\":\n return { op: \">>\", prec: PREC.SHIFT };\n default:\n return null;\n }\n }\n\n private parseIsRhs(): Expr {\n if (this.match(\"NULL\")) return { type: \"null\" };\n return this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n }\n\n private parseInRhs(left: Expr, not: boolean): InExpr {\n if (this.match(\"LPAREN\")) {\n if (this.at(\"SELECT\") || this.at(\"WITH\")) {\n const select = this.parseSelectStmt();\n this.expect(\"RPAREN\");\n return { type: \"in\", not, expr: left, values: select };\n }\n const values: Expr[] = [];\n if (!this.at(\"RPAREN\")) {\n do {\n values.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n this.expect(\"RPAREN\");\n return { type: \"in\", not, expr: left, values };\n }\n this.syntaxError(\"expected ( after IN\");\n }\n\n private parseLikeRhs(left: Expr, not: boolean, op: \"LIKE\" | \"GLOB\"): LikeExpr {\n const pattern = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n let escapeExpr: Expr | null = null;\n if (this.match(\"ESCAPE\")) escapeExpr = this.parseExprPrec(PREC.IS_IN_LIKE + 1);\n return { type: \"like\", not, op, expr: left, pattern, escape: escapeExpr };\n }\n\n private parsePostfix(expr: Expr): Expr {\n let result = expr;\n while (true) {\n if (this.match(\"COLLATE\")) {\n const collation = this.parseIdent();\n result = { type: \"collate\", expr: result, collation };\n continue;\n }\n if (this.match(\"ISNULL\")) {\n result = { type: \"binary\", op: \"IS\", left: result, right: { type: \"null\" } };\n continue;\n }\n if (this.match(\"NOTNULL\")) {\n result = { type: \"binary\", op: \"IS NOT\", left: result, right: { type: \"null\" } };\n continue;\n }\n break;\n }\n return result;\n }\n\n private isNotKeywordCompound(): boolean {\n const n = this.peek();\n return n.kind === \"IN\" || n.kind === \"LIKE\" || n.kind === \"GLOB\" || n.kind === \"BETWEEN\" || n.kind === \"REGEXP\";\n }\n\n private parseUnaryExpr(): Expr {\n if (this.match(\"PLUS\")) return { type: \"unary\", op: \"+\", expr: this.parseUnaryExpr() };\n if (this.match(\"MINUS\")) return { type: \"unary\", op: \"-\", expr: this.parseUnaryExpr() };\n if (this.match(\"TILDE\")) return { type: \"unary\", op: \"~\", expr: this.parseUnaryExpr() };\n if (this.match(\"EXISTS\")) {\n this.expect(\"LPAREN\");\n const select = this.parseSelectStmt();\n this.expect(\"RPAREN\");\n return { type: \"exists\", not: false, select };\n }\n return this.parsePrimaryExpr();\n }\n\n private parsePrimaryExpr(): Expr {\n const t = this.current();\n\n if (this.match(\"NULL\")) return { type: \"null\" };\n\n if (this.match(\"CASE\")) {\n let base: Expr | null = null;\n if (!this.at(\"WHEN\")) {\n base = this.parseExpr();\n }\n return this.parseCaseExpr(base);\n }\n\n if (this.match(\"CAST\")) {\n this.expect(\"LPAREN\");\n const expr = this.parseExpr();\n this.expect(\"AS\");\n const typeName = this.parseTypeName();\n this.expect(\"RPAREN\");\n return { type: \"cast\", expr, typeName };\n }\n\n if (this.at(\"CURRENT_DATE\") || this.at(\"CURRENT_TIME\") || this.at(\"CURRENT_TIMESTAMP\")) {\n const tok = this.advance();\n return { type: \"function\", name: tok.value, distinct: false, args: [], orderBy: [], filter: null };\n }\n\n if (this.at(\"NUMBER\")) {\n const tok = this.advance();\n return {\n type: \"literal\",\n value: tok.literal as number | bigint,\n forceReal: tok.forceReal || undefined,\n };\n }\n if (this.at(\"STRING\")) {\n const tok = this.advance();\n return { type: \"literal\", value: tok.literal as string };\n }\n if (this.at(\"BLOB\")) {\n const tok = this.advance();\n return { type: \"literal\", value: tok.literal as Uint8Array };\n }\n\n if (this.at(\"PARAM_POS\")) {\n const tok = this.advance();\n const name = tok.index ?? 1;\n return { type: \"parameter\", name };\n }\n if (this.at(\"PARAM_NAMED\")) {\n const tok = this.advance();\n return { type: \"parameter\", name: tok.value };\n }\n\n if (this.match(\"LPAREN\")) {\n if (this.at(\"SELECT\") || this.at(\"WITH\")) {\n const select = this.parseSelectStmt();\n this.expect(\"RPAREN\");\n return { type: \"subquery\", select };\n }\n if (this.at(\"RPAREN\")) {\n this.syntaxError(\"empty expression\");\n }\n const first = this.parseExpr();\n if (this.match(\"COMMA\")) {\n const values = [first];\n do {\n values.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n this.expect(\"RPAREN\");\n return { type: \"row\", values };\n }\n this.expect(\"RPAREN\");\n return first;\n }\n\n if (this.match(\"STAR\")) {\n return { type: \"column\", table: null, name: \"*\" };\n }\n\n if (t.kind === \"IDENT\" || IDENT_KEYWORDS.has(t.kind)) {\n return this.parseIdentOrFunction();\n }\n\n this.syntaxError(`unexpected token ${t.kind} in expression`);\n }\n\n private parseIdentOrFunction(): Expr {\n const name = this.parseIdent();\n if (this.match(\"LPAREN\")) {\n return this.finishCall(name);\n }\n if (this.match(\"DOT\")) {\n const col = this.parseIdent();\n return { type: \"column\", table: name, name: col };\n }\n return { type: \"column\", table: null, name };\n }\n\n private finishCall(name: string): Expr {\n let distinct = false;\n if (this.match(\"DISTINCT\")) distinct = true;\n else this.match(\"ALL\");\n\n let args: Expr[] | \"*\";\n let filter: Expr | null = null;\n\n if (this.match(\"STAR\")) {\n args = \"*\";\n } else {\n args = [];\n if (!this.at(\"RPAREN\")) {\n do {\n (args as Expr[]).push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n }\n const orderBy = this.parseOrderBy();\n this.expect(\"RPAREN\");\n\n if (this.check(\"IGNORE\", \"RESPECT\")) {\n this.advance();\n this.match(\"NULLS\");\n throw new SqliteError('near \"NULLS\": syntax error', \"syntax\");\n }\n\n if (this.match(\"FILTER\")) {\n this.expect(\"LPAREN\");\n this.expect(\"WHERE\");\n filter = this.parseExpr();\n this.expect(\"RPAREN\");\n }\n\n const upper = name.toUpperCase();\n const argCount = args === \"*\" ? 1 : args.length;\n // min()/max() with 2+ args are scalar; single-arg (or *) forms are aggregates.\n const isAgg = AGGREGATE_FUNCTIONS.has(upper) && !(argCount >= 2 && (upper === \"MIN\" || upper === \"MAX\"));\n\n if (this.match(\"OVER\")) {\n let window: WindowSpec;\n if (this.at(\"IDENT\") || IDENT_KEYWORDS.has(this.current().kind)) {\n const winName = this.parseIdent();\n window = { partitionBy: [], orderBy: [], frame: null, ref: winName };\n } else {\n this.expect(\"LPAREN\");\n window = this.parseWindowSpec();\n this.expect(\"RPAREN\");\n }\n const func = isAgg\n ? { type: \"aggregate\" as const, name: upper, distinct, args, orderBy, filter }\n : { type: \"function\" as const, name, distinct, args, orderBy, filter };\n return { type: \"window\", func, window };\n }\n\n if (isAgg) {\n return { type: \"aggregate\", name: upper, distinct, args, orderBy, filter };\n }\n return { type: \"function\", name, distinct, args, orderBy, filter };\n }\n\n private parseCaseExpr(base: Expr | null): CaseExpr {\n const whens: { when: Expr; then: Expr }[] = [];\n while (this.match(\"WHEN\")) {\n const when = this.parseExpr();\n this.expect(\"THEN\");\n const then = this.parseExpr();\n whens.push({ when, then });\n }\n let elseExpr: Expr | null = null;\n if (this.match(\"ELSE\")) elseExpr = this.parseExpr();\n this.expect(\"END\");\n return { type: \"case\", base, whens, else: elseExpr };\n }\n\n private parseWindowSpec(): WindowSpec {\n const partitionBy: Expr[] = [];\n const orderBy: OrderByItem[] = [];\n let frame: FrameSpec | null = null;\n\n if (this.match(\"PARTITION\")) {\n this.expect(\"BY\");\n do {\n partitionBy.push(this.parseExpr());\n } while (this.match(\"COMMA\"));\n }\n\n if (this.match(\"ORDER\")) {\n this.expect(\"BY\");\n do {\n const expr = this.parseExpr();\n let dir: \"ASC\" | \"DESC\" = \"ASC\";\n if (this.match(\"ASC\")) dir = \"ASC\";\n else if (this.match(\"DESC\")) dir = \"DESC\";\n let nulls: \"FIRST\" | \"LAST\" | null = null;\n if (this.match(\"NULLS\")) {\n if (this.match(\"FIRST\")) nulls = \"FIRST\";\n else if (this.match(\"LAST\")) nulls = \"LAST\";\n }\n orderBy.push({ expr, dir, nulls });\n } while (this.match(\"COMMA\"));\n }\n\n if (this.check(\"IGNORE\", \"RESPECT\")) {\n const keyword = this.advance().value.toUpperCase();\n this.match(\"NULLS\");\n throw new SqliteError(`near \"${keyword}\": syntax error`, \"syntax\");\n }\n\n if (this.check(\"ROWS\", \"RANGE\", \"GROUPS\")) {\n frame = this.parseFrameSpec();\n }\n\n return { partitionBy, orderBy, frame };\n }\n\n private parseFrameSpec(): FrameSpec {\n let type: FrameSpec[\"type\"] = \"ROWS\";\n if (this.match(\"RANGE\")) type = \"RANGE\";\n else if (this.match(\"GROUPS\")) type = \"GROUPS\";\n else this.expect(\"ROWS\");\n\n let start: FrameBound;\n let end: FrameBound;\n\n if (this.match(\"BETWEEN\")) {\n start = this.parseFrameBound(true);\n this.expect(\"AND\");\n end = this.parseFrameBound(false);\n } else {\n start = this.parseFrameBound(true);\n end = { kind: \"current_row\" };\n }\n\n let exclude: FrameSpec[\"exclude\"] = null;\n if (this.match(\"EXCLUDE\")) {\n if (this.match(\"NO\")) {\n this.expect(\"OTHERS\");\n exclude = \"no_others\";\n } else if (this.match(\"CURRENT\")) {\n this.expect(\"ROW\");\n exclude = \"current_row\";\n } else if (this.match(\"GROUP\")) exclude = \"group\";\n else if (this.match(\"TIES\")) exclude = \"ties\";\n else this.syntaxError(\"expected EXCLUDE CURRENT ROW, GROUP, TIES, or NO OTHERS\");\n }\n\n return { type, start, end, exclude };\n }\n\n private parseFrameBound(precedingSide: boolean): FrameBound {\n if (this.match(\"UNBOUNDED\")) {\n if (this.match(\"PRECEDING\")) return { kind: \"unbounded_preceding\" };\n this.expect(\"FOLLOWING\");\n return { kind: \"unbounded_following\" };\n }\n if (this.match(\"CURRENT\")) {\n this.expect(\"ROW\");\n return { kind: \"current_row\" };\n }\n const expr = this.parseExpr();\n if (this.match(\"PRECEDING\")) return { kind: \"preceding\", expr };\n if (this.match(\"FOLLOWING\")) return { kind: \"following\", expr };\n if (precedingSide) return { kind: \"preceding\", expr };\n return { kind: \"following\", expr };\n }\n}\n\nexport function parseTokens(tokens: Token[], source = \"\"): Statement[] {\n return new Parser(tokens, source).parseStatements();\n}\n\n/** Parse SQL into AST statements paired with source slices. */\nexport function parseTokenUnits(tokens: Token[], source: string): ParsedUnit[] {\n return new Parser(tokens, source).parseUnits();\n}\n", "import type { Statement as ParsedStatement } from \"../ast/nodes.ts\";\nimport { tokenize } from \"../lexer/tokenize.ts\";\nimport { type ParsedUnit, parseTokenUnits } from \"./parser.ts\";\n\n/** Parsed SQL statement AST (`SELECT`, `INSERT`, `CREATE TABLE`, \u2026). */\nexport type { Statement as ParsedStatement } from \"../ast/nodes.ts\";\nexport type { ParsedUnit } from \"./parser.ts\";\nexport { parseTokens, parseTokenUnits } from \"./parser.ts\";\n\n/**\n * Tokenize `sql` and parse every semicolon-separated statement.\n *\n * @param sql - SQLite SQL text.\n * @returns AST statements in source order.\n */\nexport function parse(sql: string): ParsedStatement[] {\n return parseUnits(sql).map((unit) => unit.statement);\n}\n\n/**\n * Parse SQL into AST + per-statement source slices (for `sqlite_master.sql`).\n */\nexport function parseUnits(sql: string): ParsedUnit[] {\n return parseTokenUnits(tokenize(sql), sql);\n}\n", "/** Fixed reference instant used when callers do not supply a clock (`2000-01-01T00:00:00.000Z`). */\nexport const DEFAULT_NOW = new Date(\"2000-01-01T00:00:00.000Z\");\n\n/** Function that returns the current instant for `date('now')` and related builtins. */\nexport type Clock = () => Date;\n\n/**\n * Clock that always returns a copy of `instant` (default {@link DEFAULT_NOW}).\n *\n * @throws {RangeError} If `instant` is an invalid `Date`.\n */\nexport function fixedClock(instant: Date = DEFAULT_NOW): Clock {\n const ms = instant.getTime();\n if (Number.isNaN(ms)) throw new RangeError(\"invalid clock instant\");\n return () => new Date(ms);\n}\n\n/** Wall-clock `'now'` matching SQLite (`new Date()` each call). */\nexport function systemClock(): Clock {\n return () => new Date();\n}\n\n/** Normalize a `Date`, {@link Clock}, `\"system\"`, or `undefined` into a {@link Clock}. */\nexport function resolveClock(now?: Date | Clock | \"system\"): Clock {\n if (now === undefined) return fixedClock(DEFAULT_NOW);\n if (now === \"system\") return systemClock();\n if (typeof now === \"function\") return () => new Date(now().getTime());\n return fixedClock(now);\n}\n", "import type { Clock } from \"./clock.ts\";\n\n/** Entropy source for `random()` / `randomblob()`. Default is seeded xorshift64*. */\nexport type RandomMode = \"deterministic\" | \"os\";\n\n/** Options for {@link Database} construction. All fields are optional. */\nexport interface DatabaseOptions {\n /**\n * Seed for deterministic `random()` (and any other PRNG-backed builtins).\n * Defaults to {@link DEFAULT_DATABASE_SEED} (`1`). Ignored when {@link random} is `\"os\"`.\n */\n seed?: number | bigint;\n /**\n * Entropy for `random()` / `randomblob()`.\n * `\"deterministic\"` (default) uses {@link seed}. `\"os\"` uses CSPRNG like SQLite\n * (not rolled back with transactions; not restored from snapshots).\n */\n random?: RandomMode;\n /**\n * Clock for `date('now')` / `datetime('now')` / etc.\n * Defaults to a fixed instant (`2000-01-01T00:00:00.000Z`).\n * Pass a `Date`, `() => Date`, or `\"system\"` for wall-clock `'now'` like SQLite.\n */\n now?: Date | Clock | \"system\";\n /**\n * Retained timeline checkpoints. Branch heads and the origin pin are never\n * collected. Default 1,000.\n */\n maxCheckpoints?: number;\n}\n\n/** Default {@link DatabaseOptions.seed} when constructing a {@link Database}. */\nexport const DEFAULT_DATABASE_SEED = 1;\n", "/**\n * Deterministic 64-bit PRNG (xorshift64*).\n * Used for SQLite `random()` and any other nondeterministic builtins.\n */\nexport class Prng {\n private state: bigint;\n\n /**\n * @param seed - Engine seed. `0` is replaced with a non-zero constant.\n */\n constructor(seed: number | bigint = 1) {\n let s = typeof seed === \"bigint\" ? seed : BigInt(seed | 0);\n if (s === 0n) s = 0x9e3779b97f4a7c15n;\n this.state = BigInt.asUintN(64, s);\n }\n\n /** Next unsigned 64-bit value. */\n nextU64(): bigint {\n let x = this.state;\n x ^= BigInt.asUintN(64, x >> 12n);\n x ^= BigInt.asUintN(64, x << 25n);\n x ^= BigInt.asUintN(64, x >> 27n);\n this.state = BigInt.asUintN(64, x);\n return BigInt.asUintN(64, x * 0x2545f4914f6cdd1dn);\n }\n\n /** SQLite `random()` style signed 64-bit integer in [-2^63+1, 2^63-1]. */\n nextSqliteRandom(): bigint {\n const bits = this.nextU64();\n let signed = BigInt.asIntN(64, bits);\n if (signed === -(1n << 63n)) signed += 1n;\n return signed;\n }\n\n /** Next float in `[0, 1)` from 53 bits of {@link nextU64}. */\n nextFloat(): number {\n const bits = this.nextU64();\n return Number(bits >> 11n) / Number(1n << 53n);\n }\n\n /**\n * Next integer in `[min, max]` (inclusive).\n *\n * @throws {RangeError} If `max < min`.\n */\n nextInt(min: number, max: number): number {\n if (max < min) throw new RangeError(\"max < min\");\n const span = max - min + 1;\n return min + Number(this.nextU64() % BigInt(span));\n }\n\n /** Current unsigned 64-bit engine state (for snapshot / transaction rollback). */\n getState(): bigint {\n return this.state;\n }\n\n /** Restore unsigned 64-bit engine state from {@link getState}. */\n setState(state: bigint): void {\n this.state = BigInt.asUintN(64, state);\n }\n\n /** Independent copy with the same engine state. */\n clone(): Prng {\n const copy = new Prng(1);\n copy.state = this.state;\n return copy;\n }\n}\n\n/**\n * CSPRNG-backed entropy for `random()` / `randomblob()` when {@link DatabaseOptions.random}\n * is `\"os\"`. `setState` is a no-op so ROLLBACK / snapshot restore do not rewind draws.\n */\nexport class OsEntropy extends Prng {\n constructor() {\n super(1);\n }\n\n override nextU64(): bigint {\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n let value = 0n;\n for (let i = 0; i < 8; i++) {\n value |= BigInt(bytes[i]!) << BigInt(i * 8);\n }\n return BigInt.asUintN(64, value);\n }\n\n override getState(): bigint {\n return 0n;\n }\n\n override setState(_state: bigint): void {}\n\n override clone(): Prng {\n return new OsEntropy();\n }\n}\n\n/** FNV-1a hash of `parts` as a signed 32-bit seed (for tests and custom PRNGs). */\nexport function deriveSeed(...parts: Array<number | string | bigint>): number {\n let hash = 2166136261;\n for (const part of parts) {\n const text = String(part);\n for (let i = 0; i < text.length; i++) {\n hash ^= text.charCodeAt(i)!;\n hash = Math.imul(hash, 16777619);\n }\n }\n return hash | 0;\n}\n", "/**\n * SQLite 3.51 REAL \u2192 text formatting (`%!.15g`), ported from sqlite3FpDecode + etGENERIC.\n */\n// biome-ignore-all lint/correctness/noPrecisionLoss: Dekker constants match SQLite C double literals\n\nimport { dekkerMul2 } from \"./sqlite-atof.ts\";\n\nconst ZBUF_SIZE = 32;\n\ninterface FpDecode {\n iDP: number;\n n: number;\n z: string[];\n sign: \"-\" | \"+\";\n isSpecial: number;\n}\n\nfunction doubleToU64(value: number): bigint {\n if (!Number.isFinite(value) || value <= 0) return 0n;\n return BigInt(Math.trunc(value));\n}\n\n/** Port of sqlite3FpDecode (sqlite3.c ~36884). */\nfunction fpDecode(r: number, iRound: number, mxRound: number): FpDecode {\n const zBuf = new Array<string>(ZBUF_SIZE).fill(\"0\");\n let sign: \"-\" | \"+\" = \"+\";\n let isSpecial = 0;\n\n if (r < 0) {\n sign = \"-\";\n r = -r;\n } else if (r === 0) {\n return { sign: \"+\", isSpecial: 0, iDP: 1, n: 1, z: [\"0\"] };\n }\n\n const buf = new ArrayBuffer(8);\n const view = new DataView(buf);\n view.setFloat64(0, r, true);\n const bits = view.getBigUint64(0, true);\n const e = Number(bits >> 52n);\n if ((e & 0x7ff) === 0x7ff) {\n isSpecial = bits === 0x7ff0000000000000n ? 1 : 2;\n return { sign, isSpecial, iDP: 0, n: 0, z: [] };\n }\n\n const rr: [number, number] = [r, 0];\n let exp = 0;\n\n if (rr[0] > 9.223372036854774784e18) {\n while (rr[0] > 9.223372036854774784e118) {\n exp += 100;\n dekkerMul2(rr, 1.0e-100, -1.99918998026028836196e-117);\n }\n while (rr[0] > 9.223372036854774784e28) {\n exp += 10;\n dekkerMul2(rr, 1.0e-10, -3.6432197315497741579e-27);\n }\n while (rr[0] > 9.223372036854774784e18) {\n exp += 1;\n dekkerMul2(rr, 1.0e-1, -5.5511151231257827021e-18);\n }\n } else {\n while (rr[0] < 9.223372036854774784e-83) {\n exp -= 100;\n dekkerMul2(rr, 1.0e100, -1.5902891109759918046e83);\n }\n while (rr[0] < 9.223372036854774784e7) {\n exp -= 10;\n dekkerMul2(rr, 1.0e10, 0.0);\n }\n while (rr[0] < 9.22337203685477478e17) {\n exp -= 1;\n dekkerMul2(rr, 1.0e1, 0.0);\n }\n }\n\n let v = rr[1] < 0 ? doubleToU64(rr[0]) - doubleToU64(-rr[1]) : doubleToU64(rr[0]) + doubleToU64(rr[1]);\n\n let i = ZBUF_SIZE - 1;\n while (v > 0n) {\n zBuf[i--] = String(Number(v % 10n));\n v /= 10n;\n }\n\n let n = ZBUF_SIZE - 1 - i;\n let iDP = n + exp;\n\n let roundAt = iRound;\n if (roundAt <= 0) {\n roundAt = iDP - roundAt;\n if (roundAt === 0 && zBuf[i + 1]! >= \"5\") {\n roundAt = 1;\n zBuf[i--] = \"0\";\n n++;\n iDP++;\n }\n }\n\n if (roundAt > 0 && (roundAt < n || n > mxRound)) {\n const zStart = i + 1;\n if (roundAt > mxRound) roundAt = mxRound;\n n = roundAt;\n if (zBuf[zStart + roundAt]! >= \"5\") {\n let j = roundAt - 1;\n while (true) {\n const ch = zBuf[zStart + j]!;\n if (ch < \"9\") {\n zBuf[zStart + j] = String.fromCharCode(ch.charCodeAt(0) + 1);\n break;\n }\n zBuf[zStart + j] = \"0\";\n if (j === 0) {\n zBuf[i--] = \"1\";\n n++;\n iDP++;\n break;\n }\n j--;\n }\n }\n }\n\n while (n > 0 && zBuf[i + n] === \"0\") n--;\n\n return { sign, isSpecial, iDP, n, z: zBuf.slice(i + 1, i + 1 + n) };\n}\n\nfunction appendDigits(parts: string[], s: FpDecode, j: number, count: number): number {\n for (let k = 0; k < count; k++) {\n parts.push(j < s.n ? s.z[j++]! : \"0\");\n }\n return j;\n}\n\n/** `%!.15g` for REAL\u2192TEXT (etGENERIC + flag_altform2). */\nexport function formatRealAsTextSqlite(value: number): string {\n if (Object.is(value, -0)) return \"0.0\";\n if (!Number.isFinite(value)) {\n if (Number.isNaN(value)) return \"NaN\";\n return value > 0 ? \"Inf\" : \"-Inf\";\n }\n if (value === 0) return \"0.0\";\n\n const s = fpDecode(value, 15, 26);\n if (s.isSpecial === 2) return \"NaN\";\n if (s.isSpecial === 1) return s.sign === \"-\" ? \"-Inf\" : \"Inf\";\n\n let precision = 15;\n const exp = s.iDP - 1;\n precision--;\n\n let useExp: boolean;\n if (exp < -4 || exp > precision) {\n useExp = true;\n } else {\n precision -= exp;\n useExp = false;\n }\n\n const parts: string[] = [];\n if (s.sign === \"-\") parts.push(\"-\");\n\n const e2 = useExp ? 0 : s.iDP - 1;\n let j = 0;\n if (e2 < 0) {\n parts.push(\"0\");\n } else {\n for (let e = e2; e >= 0; e--) {\n parts.push(j < s.n ? s.z[j++]! : \"0\");\n }\n }\n\n parts.push(\".\");\n\n let e = e2 + 1;\n let prec = precision;\n while (e < 0 && prec > 0) {\n parts.push(\"0\");\n prec--;\n e++;\n }\n j = appendDigits(parts, s, j, prec);\n\n let end = parts.length;\n while (end > 0 && parts[end - 1] === \"0\") end--;\n if (end > 0 && parts[end - 1] === \".\") {\n parts.splice(end, 0, \"0\");\n end++;\n }\n\n let out = parts.slice(0, end).join(\"\");\n\n if (useExp) {\n out += \"e\";\n if (exp < 0) {\n out += \"-\";\n let absExp = -exp;\n if (absExp >= 100) {\n out += String(Math.floor(absExp / 100));\n absExp %= 100;\n }\n out += String(Math.floor(absExp / 10));\n out += String(absExp % 10);\n } else {\n out += \"+\";\n let absExp = exp;\n if (absExp >= 100) {\n out += String(Math.floor(absExp / 100));\n absExp %= 100;\n }\n out += String(Math.floor(absExp / 10));\n out += String(absExp % 10);\n }\n }\n\n return out;\n}\n", "import { sqliteAtoF } from \"./sqlite-atof.ts\";\nimport { formatRealAsTextSqlite } from \"./sqlite-real-format.ts\";\n\n/** SQLite storage class of a {@link SqlValue} (`null` / `integer` / `real` / `text` / `blob`). */\nexport type StorageClass = \"null\" | \"integer\" | \"real\" | \"text\" | \"blob\";\n\n/** Integer-valued REAL that must not collapse to the integer storage class. */\nexport class SqlReal {\n /** IEEE float payload (`-0` already canonicalized to `+0`). */\n readonly value: number;\n constructor(value: number) {\n this.value = canonicalizeNumber(value);\n }\n valueOf(): number {\n return this.value;\n }\n toString(): string {\n return String(this.value);\n }\n}\n\n/** SQLite JSON subtype (74 / 'J') \u2014 text that nested JSON APIs treat as JSON, not a string. */\nexport const JSON_SUBTYPE = 74;\n\n/** TEXT value with SQLite JSON subtype 74 \u2014 nested JSON APIs treat it as JSON, not a string. */\nexport class SqlJsonText {\n readonly value: string;\n readonly subtype = JSON_SUBTYPE;\n constructor(value: string) {\n this.value = value;\n }\n valueOf(): string {\n return this.value;\n }\n toString(): string {\n return this.value;\n }\n}\n\n/** A SQLite value: NULL, integer/real, text, blob, or a typed REAL/JSON wrapper. */\nexport type SqlValue = null | number | bigint | string | Uint8Array | SqlReal | SqlJsonText;\n\n/**\n * A value as it appears in query result rows.\n * {@link SqlReal} and {@link SqlJsonText} wrappers are unwrapped at the JS API surface.\n */\nexport type QueryValue = null | number | bigint | string | Uint8Array;\n\n/** A result row keyed by column name. Duplicate SELECT names keep the last value. */\nexport type QueryRow = Record<string, QueryValue>;\n\n/**\n * Values accepted by bind slots (`?`, `?NNN`, `:name`, `@name`, `$name`).\n * Booleans become integer 0/1; {@link ArrayBuffer} is copied as a BLOB.\n */\nexport type BindValue = SqlValue | boolean | ArrayBuffer;\n\n/** Column type affinity from a declared type name (SQLite affinity rules). */\nexport type Affinity = \"TEXT\" | \"NUMERIC\" | \"INTEGER\" | \"REAL\" | \"BLOB\";\n\n/** Canonicalize IEEE `-0` to `+0` for cross-runtime determinism. */\nexport function canonicalizeNumber(value: number): number {\n return Object.is(value, -0) ? 0 : value;\n}\n\n/** Wrap `value` as {@link SqlReal} so it stays REAL even when it is an integer. */\nexport function asSqlReal(value: number): SqlReal {\n return new SqlReal(value);\n}\n\n/** `true` when `value` is a {@link SqlReal} wrapper. */\nexport function isSqlReal(value: SqlValue): value is SqlReal {\n return value instanceof SqlReal;\n}\n\n/** `true` when `value` is a {@link SqlJsonText} wrapper. */\nexport function isSqlJsonText(value: SqlValue): value is SqlJsonText {\n return value instanceof SqlJsonText;\n}\n\n/** Wrap `value` as {@link SqlJsonText} (JSON subtype 74). */\nexport function asSqlJsonText(value: string): SqlJsonText {\n return new SqlJsonText(value);\n}\n\n/** Strip ephemeral JSON subtype for table storage / non-JSON contexts. */\nexport function unwrapSqlValue(value: SqlValue): SqlValue {\n if (value instanceof SqlJsonText) return value.value;\n return value;\n}\n\nexport function subtypeOf(value: SqlValue): number {\n if (value instanceof SqlJsonText) return JSON_SUBTYPE;\n return 0;\n}\n\nexport function numberValueOf(value: number | bigint | SqlReal): number {\n if (typeof value === \"bigint\") return Number(value);\n if (value instanceof SqlReal) return value.value;\n return value;\n}\n\n/** SQLite storage class of `value` (`null` / `integer` / `real` / `text` / `blob`). */\nexport function storageClassOf(value: SqlValue): StorageClass {\n if (value === null) return \"null\";\n if (value instanceof SqlReal) return \"real\";\n if (value instanceof SqlJsonText) return \"text\";\n if (typeof value === \"bigint\") return \"integer\";\n if (typeof value === \"number\") {\n return Number.isInteger(value) ? \"integer\" : \"real\";\n }\n if (typeof value === \"string\") return \"text\";\n return \"blob\";\n}\n\n/** SQLite `typeof()` string for `value`. */\nexport function typeofSql(value: SqlValue): string {\n const sc = storageClassOf(value);\n if (sc === \"null\") return \"null\";\n if (sc === \"integer\") return \"integer\";\n if (sc === \"real\") return \"real\";\n if (sc === \"text\") return \"text\";\n return \"blob\";\n}\n\n/** Determine column affinity from a declared type name (SQLite rules). */\nexport function affinityFromTypeName(typeName: string | null | undefined): Affinity {\n if (!typeName) return \"BLOB\";\n const t = typeName.toUpperCase();\n if (t.includes(\"INT\")) return \"INTEGER\";\n if (t.includes(\"CHAR\") || t.includes(\"CLOB\") || t.includes(\"TEXT\")) return \"TEXT\";\n if (t.includes(\"BLOB\")) return \"BLOB\";\n if (t.includes(\"REAL\") || t.includes(\"FLOA\") || t.includes(\"DOUB\")) return \"REAL\";\n return \"NUMERIC\";\n}\n\n/** Apply column {@link Affinity} conversion rules to `value`. */\nexport function applyAffinity(value: SqlValue, affinity: Affinity): SqlValue {\n if (value === null) return null;\n\n switch (affinity) {\n case \"TEXT\":\n // BLOB and TEXT are not converted under TEXT affinity (SQLite rules).\n if (value instanceof Uint8Array) return value;\n if (value instanceof SqlJsonText) return value.value;\n if (typeof value === \"string\") return value;\n if (value instanceof SqlReal) return formatRealAsText(value.value);\n if (typeof value === \"number\") return String(canonicalizeNumber(value));\n if (typeof value === \"bigint\") return value.toString();\n return String(value);\n case \"INTEGER\": {\n if (value instanceof Uint8Array) return value;\n const n = coerceToNumber(value);\n if (n === null) return value;\n if (typeof value === \"bigint\") return value;\n return Number.isInteger(n) && Number.isSafeInteger(n) ? Math.trunc(n) : canonicalizeNumber(n);\n }\n case \"REAL\": {\n if (value instanceof Uint8Array) return value;\n const n = coerceToNumber(value);\n return n === null ? value : asSqlReal(n);\n }\n case \"NUMERIC\": {\n if (value instanceof Uint8Array) return value;\n const n = coerceToNumber(value);\n if (n === null) return value;\n if (Number.isInteger(n) && Number.isSafeInteger(n)) return Math.trunc(n);\n return canonicalizeNumber(n);\n }\n case \"BLOB\":\n // BLOB affinity never converts storage classes.\n return value;\n }\n}\n\n/** Format a REAL for TEXT affinity / CAST AS TEXT (SQLite `%!.15g`). */\nexport function formatRealAsText(value: number): string {\n return formatRealAsTextSqlite(canonicalizeNumber(value));\n}\n\n/**\n * Apply SQLite comparison affinity rules before comparing two values.\n * A null affinity represents an expression with no affinity.\n */\nexport function applyComparisonAffinity(\n left: SqlValue,\n right: SqlValue,\n leftAffinity: Affinity | null,\n rightAffinity: Affinity | null,\n): [SqlValue, SqlValue] {\n const leftNumeric = leftAffinity === \"INTEGER\" || leftAffinity === \"REAL\" || leftAffinity === \"NUMERIC\";\n const rightNumeric = rightAffinity === \"INTEGER\" || rightAffinity === \"REAL\" || rightAffinity === \"NUMERIC\";\n const leftNone = leftAffinity === null || leftAffinity === \"BLOB\";\n const rightNone = rightAffinity === null || rightAffinity === \"BLOB\";\n\n if (leftNumeric && (rightAffinity === \"TEXT\" || rightNone)) {\n const affinity = leftAffinity === \"REAL\" ? \"REAL\" : \"NUMERIC\";\n return [left, applyAffinity(right, affinity)];\n }\n if (rightNumeric && (leftAffinity === \"TEXT\" || leftNone)) {\n const affinity = rightAffinity === \"REAL\" ? \"REAL\" : \"NUMERIC\";\n return [applyAffinity(left, affinity), right];\n }\n if (leftAffinity === \"TEXT\" && rightNone) return [left, applyAffinity(right, \"TEXT\")];\n if (rightAffinity === \"TEXT\" && leftNone) return [applyAffinity(left, \"TEXT\"), right];\n return [left, right];\n}\n\n/** Prefix numeric parse for arithmetic / boolean (sqlite3AtoF). */\nexport function coerceToNumberPrefix(value: SqlValue): number {\n if (value === null) return 0;\n if (value instanceof SqlReal) return value.value;\n if (value instanceof SqlJsonText) return coerceToNumberPrefix(value.value);\n if (typeof value === \"number\") return canonicalizeNumber(value);\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"string\") return canonicalizeNumber(sqliteAtoF(value));\n if (value instanceof Uint8Array) return canonicalizeNumber(sqliteAtoF(utf8Decode(value)));\n return 0;\n}\n\n/** Parse `value` as a number, or `null` when it is not numeric. */\nexport function coerceToNumber(value: SqlValue): number | null {\n if (value === null) return null;\n if (value instanceof SqlReal) return value.value;\n if (value instanceof SqlJsonText) return coerceToNumber(value.value);\n if (typeof value === \"number\") return canonicalizeNumber(value);\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"string\") {\n const s = value.trim();\n if (s === \"\") return null;\n const n = Number(s);\n if (!Number.isNaN(n) && /^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$/.test(s)) {\n return canonicalizeNumber(n);\n }\n return null;\n }\n if (value instanceof Uint8Array) {\n return coerceToNumber(utf8Decode(value));\n }\n return null;\n}\n\n/** Truncate `value` toward zero as an integer, or `null` when it is not numeric. */\nexport function toInteger(value: SqlValue): number | bigint | null {\n if (value === null) return null;\n if (typeof value === \"bigint\") return value;\n if (value instanceof SqlReal) return Math.trunc(value.value);\n if (value instanceof SqlJsonText) return toInteger(value.value);\n if (typeof value === \"number\") return Math.trunc(value);\n if (typeof value === \"string\") {\n const n = coerceToNumber(value);\n return n === null ? null : Math.trunc(n);\n }\n return null;\n}\n\n/** SQLite `=` / `IS` equality for two non-NULL values (`NULL = NULL` is false here). */\nexport function sqlValueEquals(a: SqlValue, b: SqlValue): boolean {\n if (a === null || b === null) return false;\n if (a instanceof Uint8Array && b instanceof Uint8Array) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n }\n const an = a instanceof SqlReal ? a.value : a instanceof SqlJsonText ? a.value : a;\n const bn = b instanceof SqlReal ? b.value : b instanceof SqlJsonText ? b.value : b;\n if (typeof an === \"bigint\" || typeof bn === \"bigint\") {\n try {\n return BigInt(an as number | bigint) === BigInt(bn as number | bigint);\n } catch {\n return false;\n }\n }\n if (typeof an === \"number\" && typeof bn === \"number\") return Object.is(an, bn);\n return an === bn;\n}\n\n/**\n * SQLite comparison for ORDER BY / inequalities.\n * Returns -1, 0, 1, or null if either side is NULL (SQL NULL).\n */\nexport function compareSql(a: SqlValue, b: SqlValue): number | null {\n if (a === null || b === null) return null;\n\n const ca = comparisonClass(a);\n const cb = comparisonClass(b);\n if (ca !== cb) return ca < cb ? -1 : 1;\n\n if (ca === 1) {\n // numbers \u2014 compare floats before BigInt conversion (NaN/Inf must not reach BigInt)\n const fa = a instanceof SqlReal ? a.value : typeof a === \"number\" ? a : typeof a === \"bigint\" ? null : Number(a);\n const fb = b instanceof SqlReal ? b.value : typeof b === \"number\" ? b : typeof b === \"bigint\" ? null : Number(b);\n if (typeof a === \"bigint\" && typeof b === \"bigint\") {\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n }\n if (typeof a === \"bigint\" || typeof b === \"bigint\") {\n const left = typeof a === \"bigint\" ? Number(a) : (fa as number);\n const right = typeof b === \"bigint\" ? Number(b) : (fb as number);\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n }\n const left = fa as number;\n const right = fb as number;\n if (Number.isNaN(left) && Number.isNaN(right)) return 0;\n if (Number.isNaN(left)) return 1;\n if (Number.isNaN(right)) return -1;\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n }\n\n if (ca === 2) {\n const sa = a instanceof SqlJsonText ? a.value : String(a);\n const sb = b instanceof SqlJsonText ? b.value : String(b);\n if (sa < sb) return -1;\n if (sa > sb) return 1;\n return 0;\n }\n\n // blobs\n const ba = a instanceof Uint8Array ? a : utf8Encode(String(a));\n const bb = b instanceof Uint8Array ? b : utf8Encode(String(b));\n const len = Math.min(ba.length, bb.length);\n for (let i = 0; i < len; i++) {\n const d = (ba[i] ?? 0) - (bb[i] ?? 0);\n if (d !== 0) return d < 0 ? -1 : 1;\n }\n if (ba.length < bb.length) return -1;\n if (ba.length > bb.length) return 1;\n return 0;\n}\n\n/** SQLite sort order: NULL < numbers < text < blob */\nfunction comparisonClass(v: SqlValue): number {\n if (v === null) return 0;\n if (v instanceof SqlReal || typeof v === \"number\" || typeof v === \"bigint\") return 1;\n if (typeof v === \"string\" || v instanceof SqlJsonText) return 2;\n return 3;\n}\n\n/** UTF-8 encode `s` (SQLite TEXT \u2192 BLOB). */\nconst TEXT_ENCODER = new TextEncoder();\nconst TEXT_DECODER = new TextDecoder();\n\nexport function utf8Encode(s: string): Uint8Array {\n return TEXT_ENCODER.encode(s);\n}\n\n/** UTF-8 decode `b` (SQLite BLOB \u2192 TEXT). */\nexport function utf8Decode(b: Uint8Array): string {\n return TEXT_DECODER.decode(b);\n}\n\n/** Deep-copy blobs and REAL/JSON wrappers; primitives are returned as-is. */\nexport function cloneSqlValue(v: SqlValue): SqlValue {\n if (v instanceof Uint8Array) return new Uint8Array(v);\n if (v instanceof SqlReal) return new SqlReal(v.value);\n if (v instanceof SqlJsonText) return new SqlJsonText(v.value);\n return v;\n}\n\n/**\n * SQLite boolean truthiness (WHERE / HAVING / CASE / AND / OR / NOT).\n * Text/blob use longest-prefix numeric conversion (sqlite3AtoF); non-numeric \u2192 0.\n */\nexport function isTruthySql(v: SqlValue): boolean | null {\n if (v === null) return null;\n if (v instanceof SqlReal) return v.value !== 0;\n if (typeof v === \"number\") return v !== 0 && !Number.isNaN(v);\n if (typeof v === \"bigint\") return v !== 0n;\n if (typeof v === \"string\" || v instanceof Uint8Array || v instanceof SqlJsonText) {\n const text = typeof v === \"string\" ? v : v instanceof SqlJsonText ? v.value : utf8Decode(v);\n const n = sqliteAtoF(text);\n return n !== 0 && !Number.isNaN(n);\n }\n return false;\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { Rowid } from \"../storage/row.ts\";\nimport { compareSql, isSqlJsonText, isSqlReal, type SqlValue } from \"../types/value.ts\";\n\nexport class IndexStore {\n readonly name: string;\n private entries: Map<string, Rowid[]>;\n private keyValues: Map<string, SqlValue[]>;\n private sortedKeys: string[] | null;\n private mapsShared = false;\n frozen = false;\n\n constructor(\n name = \"index\",\n entries?: ReadonlyMap<string, readonly Rowid[]>,\n keyValues?: ReadonlyMap<string, readonly SqlValue[]>,\n ) {\n this.name = name;\n this.entries = new Map();\n this.keyValues = new Map();\n this.sortedKeys = null;\n if (entries) {\n for (const [key, rowids] of entries) this.entries.set(key, [...rowids]);\n }\n if (keyValues) {\n for (const [key, values] of keyValues) this.keyValues.set(key, [...values]);\n }\n }\n\n checkUnique(values: readonly SqlValue[], rowid?: Rowid): void {\n // SQLite treats NULLs as distinct for UNIQUE; skip conflict checks.\n if (values.some((value) => value === null)) return;\n const key = serializeIndexEntry(values);\n const existing = this.entries.get(key);\n if (!existing) return;\n for (const id of existing) {\n if (rowid === undefined || !sameRowid(id, rowid)) {\n throw new SqliteError(\n `UNIQUE constraint failed: ${this.name}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n }\n }\n\n insert(values: readonly SqlValue[], rowid: Rowid, unique = true): void {\n this.assertMutable();\n const key = serializeIndexEntry(values);\n if (unique) this.checkUnique(values, rowid);\n const existing = this.entries.get(key);\n if (!existing) {\n this.entries.set(key, [rowid]);\n this.keyValues.set(key, [...values]);\n this.sortedKeys = null;\n return;\n }\n for (const id of existing) if (sameRowid(id, rowid)) return;\n existing.push(rowid);\n }\n\n lookup(values: readonly SqlValue[]): readonly Rowid[] {\n // SQL `=` never matches NULL; IS NULL is a different access path.\n if (values.some((value) => value === null)) return [];\n const key = serializeIndexEntry(values);\n return this.entries.get(key) ?? [];\n }\n\n /** Leftmost prefix match: INDEX(a,b) used for WHERE a = ?. */\n lookupPrefix(values: readonly SqlValue[]): readonly Rowid[] {\n if (values.length === 0) return [];\n if (values.some((value) => value === null)) return [];\n const prefix = serializeIndexEntry(values);\n const exact = this.entries.get(prefix);\n const rowids: Rowid[] = exact ? [...exact] : [];\n const keys = this.orderedKeys();\n let start = 0;\n let end = keys.length;\n while (start < end) {\n const mid = (start + end) >>> 1;\n const kv = this.keyValues.get(keys[mid]!);\n if (!kv || prefixKeyLess(kv, values)) start = mid + 1;\n else end = mid;\n }\n for (let i = start; i < keys.length; i++) {\n const kv = this.keyValues.get(keys[i]!);\n if (!kv || !prefixKeyMatches(kv, values)) break;\n const key = keys[i]!;\n if (key === prefix) continue;\n rowids.push(...(this.entries.get(key) ?? []));\n }\n return rowids;\n }\n\n /**\n * Ordered scan of rowids for a single-column comparison.\n * `op` applies to the first key component.\n */\n rangeLookup(op: \">\" | \">=\" | \"<\" | \"<=\" | \"between\", bound: SqlValue, bound2?: SqlValue): readonly Rowid[] {\n const keys = this.orderedKeys();\n const rowids: Rowid[] = [];\n const start = lowerBoundKeyValues(keys, this.keyValues, bound, op === \">\" ? \"gt\" : op === \">=\" ? \"ge\" : \"any\");\n const end =\n op === \"<\" || op === \"<=\"\n ? upperBoundKeyValues(keys, this.keyValues, bound, op === \"<\" ? \"lt\" : \"le\")\n : op === \"between\" && bound2 !== undefined\n ? upperBoundKeyValues(keys, this.keyValues, bound2, \"le\")\n : keys.length;\n for (let i = start; i < end; i++) {\n const key = keys[i]!;\n const values = this.keyValues.get(key);\n if (!values || values[0] === undefined || values[0] === null) continue;\n const cmp = compareSerializedOrder(values[0], bound);\n let ok = false;\n if (op === \">\") ok = cmp > 0;\n else if (op === \">=\") ok = cmp >= 0;\n else if (op === \"<\") ok = cmp < 0;\n else if (op === \"<=\") ok = cmp <= 0;\n else if (op === \"between\" && bound2 !== undefined) {\n ok = cmp >= 0 && compareSerializedOrder(values[0], bound2) <= 0;\n }\n if (ok) {\n const ids = this.entries.get(key);\n if (ids) rowids.push(...ids);\n }\n }\n return rowids;\n }\n\n orderedRowids(desc = false): readonly Rowid[] {\n const keys = this.orderedKeys();\n const rowids: Rowid[] = [];\n const seq = desc ? [...keys].reverse() : keys;\n for (const key of seq) {\n const ids = this.entries.get(key);\n if (ids) rowids.push(...ids);\n }\n return rowids;\n }\n\n remove(values: readonly SqlValue[], rowid?: Rowid): boolean {\n this.assertMutable();\n const key = serializeIndexEntry(values);\n const existing = this.entries.get(key);\n if (!existing) return false;\n if (rowid === undefined) {\n this.entries.delete(key);\n this.keyValues.delete(key);\n this.sortedKeys = null;\n return true;\n }\n const index = existing.findIndex((id) => sameRowid(id, rowid));\n if (index < 0) return false;\n existing.splice(index, 1);\n if (existing.length === 0) {\n this.entries.delete(key);\n this.keyValues.delete(key);\n this.sortedKeys = null;\n }\n return true;\n }\n\n clear(): void {\n this.assertMutable();\n this.entries.clear();\n this.keyValues.clear();\n this.sortedKeys = null;\n }\n\n clone(): IndexStore {\n const copy = new IndexStore(this.name);\n copy.entries = this.entries;\n copy.keyValues = this.keyValues;\n copy.sortedKeys = this.sortedKeys;\n copy.mapsShared = true;\n return copy;\n }\n\n freeze(): void {\n this.frozen = true;\n }\n\n /** Sorted entries for SQLM v3 persistence. */\n snapshotEntries(): Array<{ key: string; rowids: Rowid[]; values: SqlValue[] }> {\n const keys = [...this.entries.keys()].sort();\n return keys.map((key) => ({\n key,\n rowids: [...(this.entries.get(key) ?? [])],\n values: [...(this.keyValues.get(key) ?? [])],\n }));\n }\n\n /** Sorted keys + rowids for SQLM v4 (values rebuilt from the table). */\n snapshotKeys(): Array<{ key: string; rowids: Rowid[] }> {\n const keys = [...this.entries.keys()].sort();\n return keys.map((key) => ({\n key,\n rowids: [...(this.entries.get(key) ?? [])],\n }));\n }\n\n rememberKeyValues(key: string, values: readonly SqlValue[]): void {\n this.keyValues.set(key, [...values]);\n }\n\n /** Key component values for snapshot encode (binary keys). */\n keyValuesFor(key: string): SqlValue[] {\n return [...(this.keyValues.get(key) ?? [])];\n }\n\n get size(): number {\n return this.entries.size;\n }\n\n private orderedKeys(): string[] {\n if (this.sortedKeys) return this.sortedKeys;\n const keys = [...this.entries.keys()];\n keys.sort((a, b) => {\n const left = this.keyValues.get(a);\n const right = this.keyValues.get(b);\n if (!left || !right) return a < b ? -1 : a > b ? 1 : 0;\n const n = Math.min(left.length, right.length);\n for (let i = 0; i < n; i++) {\n const a = left[i] ?? null;\n const b = right[i] ?? null;\n if (a === null && b === null) continue;\n if (a === null) return -1;\n if (b === null) return 1;\n const cmp = compareSql(a, b);\n if (cmp !== 0) return cmp ?? 0;\n }\n return left.length - right.length;\n });\n this.sortedKeys = keys;\n return keys;\n }\n\n private assertMutable(): void {\n if (this.frozen) throw new SqliteError(\"internal: cannot mutate a frozen index\", \"other\");\n this.forkMaps();\n }\n\n private forkMaps(): void {\n if (!this.mapsShared) return;\n const entries = new Map<string, Rowid[]>();\n for (const [key, rowids] of this.entries) entries.set(key, [...rowids]);\n const keyValues = new Map<string, SqlValue[]>();\n for (const [key, values] of this.keyValues) keyValues.set(key, [...values]);\n this.entries = entries;\n this.keyValues = keyValues;\n this.mapsShared = false;\n this.sortedKeys = null;\n }\n}\n\n/** Hash-join / covering-hash key: NULL components never match. */\nexport function serializeIndexKey(values: readonly SqlValue[]): string | null {\n if (values.some((value) => value === null)) return null;\n return serializeIndexEntry(values);\n}\n\n/** Index-store key: NULL is a distinct component so composite prefix lookups still hit. */\nexport function serializeIndexEntry(values: readonly SqlValue[]): string {\n return values\n .map((value) => {\n const part = value === null ? NULL_PART : serializeValue(value);\n return `${part.length}:${part}`;\n })\n .join(\"|\");\n}\n\n/** Dedicated tag; non-NULL encodings stay `t:` / `n:` / `f:` / `b:` (SQLM v3 compatible). */\nconst NULL_PART = \"z\";\n\nfunction serializeValue(value: Exclude<SqlValue, null>): string {\n if (isSqlReal(value)) {\n const n = value.value;\n if (Number.isNaN(n)) return \"f:nan\";\n if (n === Infinity) return \"f:+inf\";\n if (n === -Infinity) return \"f:-inf\";\n return `f:${Object.is(n, -0) ? \"0\" : n.toString()}`;\n }\n if (isSqlJsonText(value)) return `t:${value.value}`;\n if (typeof value === \"bigint\") return `n:${value.toString()}`;\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) return `n:${BigInt(value).toString()}`;\n if (Number.isNaN(value)) return \"f:nan\";\n if (value === Infinity) return \"f:+inf\";\n if (value === -Infinity) return \"f:-inf\";\n return `f:${Object.is(value, -0) ? \"0\" : value.toString()}`;\n }\n if (typeof value === \"string\") return `t:${value}`;\n let hex = \"\";\n for (const byte of value) hex += byte.toString(16).padStart(2, \"0\");\n return `b:${hex}`;\n}\n\nfunction compareSerializedOrder(left: SqlValue, right: SqlValue): number {\n return compareSql(left, right) ?? 0;\n}\n\nfunction prefixKeyLess(keyValues: readonly SqlValue[], prefix: readonly SqlValue[]): boolean {\n for (let i = 0; i < prefix.length; i++) {\n const cmp = compareSerializedOrder(keyValues[i] ?? null, prefix[i]!);\n if (cmp !== 0) return cmp < 0;\n }\n return false;\n}\n\nfunction prefixKeyMatches(keyValues: readonly SqlValue[], prefix: readonly SqlValue[]): boolean {\n for (let i = 0; i < prefix.length; i++) {\n if (compareSerializedOrder(keyValues[i] ?? null, prefix[i]!) !== 0) return false;\n }\n return true;\n}\n\nfunction lowerBoundKeyValues(\n keys: readonly string[],\n keyValues: ReadonlyMap<string, SqlValue[]>,\n bound: SqlValue,\n mode: \"gt\" | \"ge\" | \"any\",\n): number {\n let lo = 0;\n let hi = keys.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n const value = keyValues.get(keys[mid]!)?.[0];\n if (value === undefined || value === null) {\n lo = mid + 1;\n continue;\n }\n const cmp = compareSerializedOrder(value, bound);\n const before = mode === \"gt\" ? cmp <= 0 : mode === \"ge\" ? cmp < 0 : false;\n if (before) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\nfunction upperBoundKeyValues(\n keys: readonly string[],\n keyValues: ReadonlyMap<string, SqlValue[]>,\n bound: SqlValue,\n mode: \"lt\" | \"le\",\n): number {\n let lo = 0;\n let hi = keys.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n const value = keyValues.get(keys[mid]!)?.[0];\n if (value === undefined || value === null) {\n lo = mid + 1;\n continue;\n }\n const cmp = compareSerializedOrder(value, bound);\n const after = mode === \"lt\" ? cmp >= 0 : cmp > 0;\n if (after) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n}\n\nfunction sameRowid(left: Rowid, right: Rowid): boolean {\n return typeof left === \"bigint\" || typeof right === \"bigint\" ? BigInt(left) === BigInt(right) : left === right;\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { asSqlReal, coerceToNumber, isSqlReal, type SqlValue, storageClassOf, utf8Decode } from \"./value.ts\";\n\nconst STRICT_TYPES = new Set([\"INT\", \"INTEGER\", \"REAL\", \"TEXT\", \"BLOB\", \"ANY\"]);\n\nexport function isStrictTypeName(typeName: string | null | undefined): boolean {\n if (!typeName) return false;\n return STRICT_TYPES.has(typeName.trim().toUpperCase());\n}\n\nexport function applyStrictValue(value: SqlValue, typeName: string, table: string, column: string): SqlValue {\n if (value === null) return null;\n const declared = typeName.trim().toUpperCase();\n const storage = storageClassOf(value);\n if (declared === \"ANY\") return value;\n\n if (declared === \"TEXT\") {\n if (storage === \"text\") return typeof value === \"string\" ? value : String((value as { value: string }).value);\n if (storage === \"integer\" || storage === \"real\") return String(isSqlReal(value) ? value.value : value);\n throw cannotStore(storage, declared, table, column);\n }\n\n if (declared === \"INT\" || declared === \"INTEGER\") {\n if (storage === \"integer\") return value;\n if (storage === \"real\") {\n const n = isSqlReal(value) ? value.value : Number(value);\n if (Number.isInteger(n)) return n;\n throw cannotStore(storage, declared, table, column);\n }\n if (storage === \"text\") {\n const n = coerceToNumber(value);\n if (n !== null && Number.isInteger(n) && String(value).trim() === String(n)) return n;\n throw cannotStore(storage, declared, table, column);\n }\n throw cannotStore(storage, declared, table, column);\n }\n\n if (declared === \"REAL\") {\n if (storage === \"real\") return isSqlReal(value) ? value : asSqlReal(Number(value));\n if (storage === \"integer\") return asSqlReal(typeof value === \"bigint\" ? Number(value) : Number(value));\n if (storage === \"text\") {\n const n = coerceToNumber(value);\n if (n !== null) return asSqlReal(n);\n }\n throw cannotStore(storage, declared, table, column);\n }\n\n if (declared === \"BLOB\") {\n if (storage === \"blob\") return value;\n throw cannotStore(storage, declared, table, column);\n }\n\n throw new SqliteError(`unknown datatype for ${table}.${column}: \"${typeName}\"`, \"other\");\n}\n\nfunction cannotStore(storage: string, declared: string, table: string, column: string): never {\n const shown = storage === \"integer\" ? \"INT\" : storage.toUpperCase();\n throw new SqliteError(\n `cannot store ${shown} value in ${declared} column ${table}.${column}`,\n \"datatype_mismatch\",\n \"SQLITE_CONSTRAINT_DATATYPE\",\n );\n}\n\nexport function unknownStrictType(table: string, column: string, typeName: string): never {\n throw new SqliteError(`unknown datatype for ${table}.${column}: \"${typeName}\"`, \"other\");\n}\n\n/** SQLite reports INT for the integer storage class in STRICT errors. */\nexport function strictStorageLabel(value: SqlValue): string {\n const storage = storageClassOf(value);\n if (storage === \"integer\") return \"INT\";\n if (storage === \"text\") return \"TEXT\";\n if (storage === \"real\") return \"REAL\";\n if (storage === \"blob\") return \"BLOB\";\n return \"NULL\";\n}\n\nvoid utf8Decode;\n", "import { SqliteError } from \"../../errors/index.ts\";\n\nexport type FtsKind = \"fts5\" | \"fts3\" | \"fts4\";\n\nexport type FtsDetail = \"full\" | \"column\" | \"none\";\n\nexport interface FtsColumnDef {\n name: string;\n unindexed: boolean;\n}\n\nexport interface FtsTokenizerConfig {\n /** Primary tokenizer name (unicode61, ascii, porter, trigram). */\n name: string;\n /** Base tokenizer when name is porter. */\n base?: string;\n removeDiacritics?: 0 | 1 | 2;\n tokenchars?: string;\n separators?: string;\n caseSensitive?: boolean; // trigram\n removeDiacriticsTrigram?: boolean;\n}\n\nexport interface FtsTableOptions {\n columns: FtsColumnDef[];\n content: \"normal\" | \"contentless\" | \"external\";\n contentTable: string | null;\n contentRowid: string;\n contentlessDelete: boolean;\n prefix: number[];\n columnsize: boolean;\n detail: FtsDetail;\n tokendata: boolean;\n locale: boolean;\n tokenizer: FtsTokenizerConfig;\n /** FTS3/4 */\n languageid: string | null;\n notindexed: Set<string>;\n}\n\nconst OPTION_NAMES = new Set([\n \"tokenize\",\n \"prefix\",\n \"content\",\n \"content_rowid\",\n \"contentless_delete\",\n \"columnsize\",\n \"detail\",\n \"tokendata\",\n \"locale\",\n \"languageid\",\n \"matchinfo\",\n \"order\",\n \"compress\",\n \"uncompress\",\n]);\n\nexport function parseFtsModuleArgs(moduleArgs: string[], kind: FtsKind): FtsTableOptions {\n const columns: FtsColumnDef[] = [];\n const notindexed = new Set<string>();\n let content: FtsTableOptions[\"content\"] = \"normal\";\n let contentTable: string | null = null;\n let contentRowid = \"rowid\";\n let contentlessDelete = false;\n let prefix: number[] = [];\n let columnsize = true;\n let detail: FtsDetail = \"full\";\n let tokendata = false;\n let locale = false;\n let languageid: string | null = null;\n let tokenizer: FtsTokenizerConfig = { name: \"unicode61\", removeDiacritics: 1 };\n\n for (const raw of moduleArgs) {\n const arg = raw.trim();\n if (!arg) continue;\n\n const eq = splitOption(arg);\n if (eq) {\n const key = eq.key.toLowerCase();\n const value = eq.value;\n if (!OPTION_NAMES.has(key) && kind === \"fts5\") {\n // FTS5: unknown option-like keys that aren't columns throw\n if (/^[a-z_][a-z0-9_]*$/i.test(eq.key) && value !== null) {\n // still accept known options only\n }\n }\n switch (key) {\n case \"tokenize\":\n tokenizer = parseTokenizer(value);\n break;\n case \"prefix\":\n prefix = value\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .map((part) => {\n const n = Number(part);\n if (!Number.isInteger(n) || n <= 0) throw new SqliteError(\"SQL logic error\", \"other\");\n return n;\n });\n break;\n case \"content\":\n if (value === \"\") {\n content = \"contentless\";\n contentTable = null;\n } else {\n content = \"external\";\n contentTable = value;\n }\n break;\n case \"content_rowid\":\n contentRowid = value;\n break;\n case \"contentless_delete\":\n contentlessDelete = value === \"1\" || value.toLowerCase() === \"true\";\n break;\n case \"columnsize\":\n columnsize = value !== \"0\";\n break;\n case \"detail\": {\n const d = value.toLowerCase();\n if (d !== \"full\" && d !== \"column\" && d !== \"none\") throw new SqliteError(\"SQL logic error\", \"other\");\n detail = d;\n break;\n }\n case \"tokendata\":\n tokendata = value === \"1\" || value.toLowerCase() === \"true\";\n break;\n case \"locale\":\n locale = value === \"1\" || value.toLowerCase() === \"true\";\n break;\n case \"languageid\":\n languageid = value;\n break;\n default:\n // Treat as column name = something invalid for FTS5 \u2192 column with odd name\n if (kind === \"fts5\") throw new SqliteError(`unrecognized parameter: ${eq.key}`, \"other\");\n columns.push({ name: eq.key, unindexed: false });\n break;\n }\n continue;\n }\n\n // Column form: name [UNINDEXED]\n const parts = arg.split(/\\s+/).filter(Boolean);\n if (parts.length === 0) continue;\n const name = unquoteIdent(parts[0]!);\n const rest = parts.slice(1).map((p) => p.toUpperCase());\n if (rest.includes(\"UNINDEXED\") || rest.includes(\"NOTINDEXED\")) {\n columns.push({ name, unindexed: true });\n notindexed.add(name.toLowerCase());\n } else if (rest.length === 0) {\n if (OPTION_NAMES.has(name.toLowerCase()) && kind === \"fts5\") {\n // bare option name without = is invalid for some; treat as column (SQLite allows content as column name)\n columns.push({ name, unindexed: false });\n } else {\n columns.push({ name, unindexed: false });\n }\n } else if (kind === \"fts3\" || kind === \"fts4\") {\n // FTS3/4 column type names ignored\n columns.push({ name, unindexed: false });\n } else {\n throw new SqliteError(\"SQL logic error\", \"other\");\n }\n }\n\n if (columns.length === 0) throw new SqliteError(\"fts requires at least one column\", \"other\");\n\n const names = new Set<string>();\n for (const column of columns) {\n const key = column.name.toLowerCase();\n if (names.has(key)) throw new SqliteError(\"SQL logic error\", \"other\");\n names.add(key);\n }\n\n return {\n columns,\n content,\n contentTable,\n contentRowid,\n contentlessDelete,\n prefix,\n columnsize,\n detail,\n tokendata,\n locale,\n tokenizer,\n languageid,\n notindexed,\n };\n}\n\nfunction splitOption(arg: string): { key: string; value: string } | null {\n const match = /^([A-Za-z_][\\w]*)\\s*=\\s*(.*)$/s.exec(arg);\n if (!match) return null;\n return { key: match[1]!, value: unquoteValue(match[2]!.trim()) };\n}\n\nfunction unquoteValue(value: string): string {\n if (\n (value.startsWith(\"'\") && value.endsWith(\"'\")) ||\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"`\") && value.endsWith(\"`\"))\n ) {\n const q = value[0]!;\n return value\n .slice(1, -1)\n .replaceAll(q + q, q)\n .replaceAll(\"\\\\'\", \"'\")\n .replaceAll('\\\\\"', '\"');\n }\n return value;\n}\n\nfunction unquoteIdent(value: string): string {\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"`\") && value.endsWith(\"`\")) ||\n (value.startsWith(\"[\") && value.endsWith(\"]\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n}\n\nfunction parseTokenizer(spec: string): FtsTokenizerConfig {\n const tokens = tokenizeSpec(spec);\n if (tokens.length === 0) throw new SqliteError(\"no such tokenizer: \", \"other\");\n const name = tokens[0]!.toLowerCase();\n if (name === \"porter\") {\n const base = tokens[1]?.toLowerCase() ?? \"unicode61\";\n const rest = parseUnicodeOpts(tokens.slice(base === \"unicode61\" || base === \"ascii\" ? 2 : 1));\n return { name: \"porter\", base: base === \"ascii\" ? \"ascii\" : \"unicode61\", ...rest };\n }\n if (name === \"trigram\") {\n let caseSensitive = false;\n let removeDiacriticsTrigram = false;\n for (let i = 1; i < tokens.length; i++) {\n const t = tokens[i]!.toLowerCase();\n if (t === \"case_sensitive\" && tokens[i + 1] === \"1\") {\n caseSensitive = true;\n i++;\n } else if (t === \"remove_diacritics\" && tokens[i + 1] === \"1\") {\n removeDiacriticsTrigram = true;\n i++;\n }\n }\n return { name: \"trigram\", caseSensitive, removeDiacriticsTrigram };\n }\n if (name === \"ascii\") {\n return { name: \"ascii\", ...parseUnicodeOpts(tokens.slice(1)) };\n }\n if (name === \"unicode61\") {\n return { name: \"unicode61\", removeDiacritics: 1, ...parseUnicodeOpts(tokens.slice(1)) };\n }\n throw new SqliteError(`no such tokenizer: ${name}`, \"other\");\n}\n\nfunction parseUnicodeOpts(tokens: string[]): Partial<FtsTokenizerConfig> {\n const out: Partial<FtsTokenizerConfig> = {};\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i]!.toLowerCase();\n if (t === \"remove_diacritics\") {\n const v = Number(tokens[++i] ?? \"1\");\n if (v !== 0 && v !== 1 && v !== 2) throw new SqliteError(\"SQL logic error\", \"other\");\n out.removeDiacritics = v as 0 | 1 | 2;\n } else if (t === \"tokenchars\") {\n out.tokenchars = tokens[++i] ?? \"\";\n } else if (t === \"separators\") {\n out.separators = tokens[++i] ?? \"\";\n }\n }\n return out;\n}\n\nfunction tokenizeSpec(spec: string): string[] {\n const out: string[] = [];\n let i = 0;\n while (i < spec.length) {\n while (i < spec.length && /\\s/.test(spec[i]!)) i++;\n if (i >= spec.length) break;\n if (spec[i] === \"'\" || spec[i] === '\"') {\n const q = spec[i]!;\n i++;\n let s = \"\";\n while (i < spec.length && spec[i] !== q) {\n s += spec[i++];\n }\n if (spec[i] === q) i++;\n out.push(s);\n continue;\n }\n let s = \"\";\n while (i < spec.length && !/\\s/.test(spec[i]!)) s += spec[i++];\n out.push(s);\n }\n return out;\n}\n", "import { SqliteError } from \"../../errors/index.ts\";\n\nexport type FtsQueryNode =\n | { type: \"term\"; value: string; prefix: boolean; column: string | null; columns: string[] | null }\n | {\n type: \"phrase\";\n terms: Array<{ value: string; prefix: boolean }>;\n column: string | null;\n columns: string[] | null;\n }\n | { type: \"near\"; children: FtsQueryNode[]; distance: number; column: string | null; columns: string[] | null }\n | { type: \"and\"; children: FtsQueryNode[] }\n | { type: \"or\"; children: FtsQueryNode[] }\n | { type: \"not\"; child: FtsQueryNode }\n | { type: \"true\" };\n\ntype Tok =\n | { kind: \"TERM\"; value: string; prefix: boolean }\n | { kind: \"STRING\"; value: string }\n | { kind: \"AND\" }\n | { kind: \"OR\" }\n | { kind: \"NOT\" }\n | { kind: \"NEAR\" }\n | { kind: \"LPAREN\" }\n | { kind: \"RPAREN\" }\n | { kind: \"COLON\" }\n | { kind: \"COMMA\" }\n | { kind: \"LBRACE\" }\n | { kind: \"RBRACE\" }\n | { kind: \"EOF\" };\n\n/**\n * Parse an FTS5 MATCH expression.\n * Implicit AND between adjacent terms; OR binds looser than AND; NOT is binary (a NOT b).\n */\nexport function parseFts5Query(input: string): FtsQueryNode {\n const tokens = lexFts5(input);\n let i = 0;\n\n function peek(): Tok {\n return tokens[i] ?? { kind: \"EOF\" };\n }\n function next(): Tok {\n return tokens[i++] ?? { kind: \"EOF\" };\n }\n function expect(kind: Tok[\"kind\"]): Tok {\n const t = next();\n if (t.kind !== kind) throw new SqliteError(`fts5: syntax error near \"${displayTok(t)}\"`, \"syntax\");\n return t;\n }\n\n function parseExpr(): FtsQueryNode {\n return parseOr();\n }\n\n function parseOr(): FtsQueryNode {\n let left = parseAnd();\n while (peek().kind === \"OR\") {\n next();\n const right = parseAnd();\n if (left.type === \"or\") left = { type: \"or\", children: [...left.children, right] };\n else left = { type: \"or\", children: [left, right] };\n }\n return left;\n }\n\n function parseAnd(): FtsQueryNode {\n let left = parseUnary();\n while (true) {\n const p = peek();\n if (p.kind === \"EOF\" || p.kind === \"RPAREN\" || p.kind === \"OR\" || p.kind === \"COMMA\" || p.kind === \"RBRACE\")\n break;\n if (p.kind === \"AND\") {\n next();\n const right = parseUnary();\n if (left.type === \"and\") left = { type: \"and\", children: [...left.children, right] };\n else left = { type: \"and\", children: [left, right] };\n continue;\n }\n if (p.kind === \"NOT\") {\n next();\n const right = parseUnary();\n left = { type: \"and\", children: [left, { type: \"not\", child: right }] };\n continue;\n }\n // implicit AND\n if (\n p.kind === \"TERM\" ||\n p.kind === \"STRING\" ||\n p.kind === \"LPAREN\" ||\n p.kind === \"NEAR\" ||\n p.kind === \"LBRACE\" ||\n p.kind === \"COLON\"\n ) {\n // COLON alone is invalid here \u2014 column filter starts with TERM or LBRACE\n if (p.kind === \"COLON\") break;\n const right = parseUnary();\n if (left.type === \"and\") left = { type: \"and\", children: [...left.children, right] };\n else left = { type: \"and\", children: [left, right] };\n continue;\n }\n break;\n }\n return left;\n }\n\n function parseUnary(): FtsQueryNode {\n // column filter: {a b} : expr or col : expr\n const filtered = tryParseColumnFilter();\n if (filtered) return filtered;\n\n const p = peek();\n if (p.kind === \"LPAREN\") {\n next();\n const inner = parseExpr();\n expect(\"RPAREN\");\n return inner;\n }\n if (p.kind === \"NEAR\") {\n next();\n expect(\"LPAREN\");\n const children: FtsQueryNode[] = [];\n children.push(parseUnary());\n while (peek().kind !== \"COMMA\" && peek().kind !== \"RPAREN\" && peek().kind !== \"EOF\") {\n children.push(parseUnary());\n }\n let distance = 10;\n if (peek().kind === \"COMMA\") {\n next();\n const distTok = next();\n if (distTok.kind !== \"TERM\") throw new SqliteError(\"fts5: syntax error near NEAR\", \"syntax\");\n distance = Number(distTok.value);\n if (!Number.isFinite(distance)) throw new SqliteError(\"fts5: syntax error near NEAR\", \"syntax\");\n }\n expect(\"RPAREN\");\n return { type: \"near\", children, distance, column: null, columns: null };\n }\n if (p.kind === \"STRING\") {\n next();\n const terms = p.value\n .split(/\\s+/)\n .filter(Boolean)\n .map((part) => {\n const prefix = part.endsWith(\"*\");\n return { value: prefix ? part.slice(0, -1) : part, prefix };\n });\n return { type: \"phrase\", terms, column: null, columns: null };\n }\n if (p.kind === \"TERM\") {\n next();\n if (p.prefix && (p.value === \"\" || p.value.includes(\"*\"))) {\n throw new SqliteError(`unknown special query: ${p.value}`, \"other\");\n }\n return { type: \"term\", value: p.value, prefix: p.prefix, column: null, columns: null };\n }\n throw new SqliteError(`fts5: syntax error near \"${displayTok(p)}\"`, \"syntax\");\n }\n\n function tryParseColumnFilter(): FtsQueryNode | null {\n const save = i;\n let column: string | null = null;\n let columns: string[] | null = null;\n\n if (peek().kind === \"LBRACE\") {\n next();\n columns = [];\n while (peek().kind !== \"RBRACE\" && peek().kind !== \"EOF\") {\n if (peek().kind === \"TERM\") {\n const termTok = next();\n if (termTok.kind !== \"TERM\") {\n i = save;\n return null;\n }\n columns.push(termTok.value.toLowerCase());\n } else if (peek().kind === \"COMMA\") {\n next();\n } else {\n i = save;\n return null;\n }\n }\n if (peek().kind !== \"RBRACE\") {\n i = save;\n return null;\n }\n next();\n } else if (peek().kind === \"TERM\") {\n const name = next();\n if (name.kind !== \"TERM\") {\n i = save;\n return null;\n }\n if (peek().kind !== \"COLON\") {\n i = save;\n return null;\n }\n column = name.value.toLowerCase();\n } else {\n return null;\n }\n\n if (peek().kind !== \"COLON\") {\n i = save;\n return null;\n }\n next(); // colon\n const inner = parseUnary();\n return applyColumn(inner, column, columns);\n }\n\n if (tokens.length === 1 && tokens[0]!.kind === \"EOF\") return { type: \"true\" };\n const root = parseExpr();\n if (peek().kind !== \"EOF\") throw new SqliteError(`fts5: syntax error near \"${displayTok(peek())}\"`, \"syntax\");\n return root;\n}\n\nfunction applyColumn(node: FtsQueryNode, column: string | null, columns: string[] | null): FtsQueryNode {\n switch (node.type) {\n case \"term\":\n case \"phrase\":\n case \"near\":\n return { ...node, column: column ?? node.column, columns: columns ?? node.columns };\n case \"and\":\n case \"or\":\n return { ...node, children: node.children.map((child) => applyColumn(child, column, columns)) };\n case \"not\":\n return { type: \"not\", child: applyColumn(node.child, column, columns) };\n case \"true\":\n return node;\n }\n}\n\nfunction lexFts5(input: string): Tok[] {\n const tokens: Tok[] = [];\n let i = 0;\n while (i < input.length) {\n const ch = input[i]!;\n if (/\\s/.test(ch)) {\n i++;\n continue;\n }\n if (ch === \"(\") {\n tokens.push({ kind: \"LPAREN\" });\n i++;\n continue;\n }\n if (ch === \")\") {\n tokens.push({ kind: \"RPAREN\" });\n i++;\n continue;\n }\n if (ch === \"{\") {\n tokens.push({ kind: \"LBRACE\" });\n i++;\n continue;\n }\n if (ch === \"}\") {\n tokens.push({ kind: \"RBRACE\" });\n i++;\n continue;\n }\n if (ch === \":\") {\n tokens.push({ kind: \"COLON\" });\n i++;\n continue;\n }\n if (ch === \",\") {\n tokens.push({ kind: \"COMMA\" });\n i++;\n continue;\n }\n if (ch === '\"') {\n i++;\n let value = \"\";\n while (i < input.length && input[i] !== '\"') {\n if (input[i] === \"\\\\\" && i + 1 < input.length) {\n value += input[i + 1];\n i += 2;\n continue;\n }\n value += input[i++];\n }\n if (input[i] === '\"') i++;\n tokens.push({ kind: \"STRING\", value });\n continue;\n }\n // bare word\n let word = \"\";\n while (i < input.length && !/[\\s(){}:,\"]/.test(input[i]!)) word += input[i++];\n if (!word) {\n i++;\n continue;\n }\n const upper = word.toUpperCase();\n if (upper === \"AND\") tokens.push({ kind: \"AND\" });\n else if (upper === \"OR\") tokens.push({ kind: \"OR\" });\n else if (upper === \"NOT\") tokens.push({ kind: \"NOT\" });\n else if (upper === \"NEAR\") {\n // NEAR is a keyword only when followed by '('; otherwise it is a bare term.\n let j = i;\n while (j < input.length && /\\s/.test(input[j]!)) j++;\n if (input[j] === \"(\") tokens.push({ kind: \"NEAR\" });\n else {\n const prefix = word.endsWith(\"*\");\n tokens.push({ kind: \"TERM\", value: prefix ? word.slice(0, -1) : word, prefix });\n }\n } else {\n const prefix = word.endsWith(\"*\");\n tokens.push({ kind: \"TERM\", value: prefix ? word.slice(0, -1) : word, prefix });\n }\n }\n tokens.push({ kind: \"EOF\" });\n return tokens;\n}\n\nfunction displayTok(t: Tok): string {\n switch (t.kind) {\n case \"TERM\":\n return t.prefix ? `${t.value}*` : t.value;\n case \"STRING\":\n return `\"${t.value}\"`;\n case \"EOF\":\n return \"\";\n default:\n return t.kind;\n }\n}\n\n/** FTS3/4 query parser (ENABLE_FTS3_PARENTHESIS style). */\nexport function parseFts3Query(input: string): FtsQueryNode {\n return parseFts5Query(input);\n}\n", "/** Classic Porter stemming algorithm (English). */\nexport function porterStem(word: string): string {\n let w = word.toLowerCase();\n if (w.length <= 2) return w;\n\n // Step 1a\n if (w.endsWith(\"sses\")) w = `${w.slice(0, -2)}`;\n else if (w.endsWith(\"ies\")) w = `${w.slice(0, -2)}`;\n else if (w.endsWith(\"ss\")) {\n /* keep */\n } else if (w.endsWith(\"s\") && w.length > 3) w = w.slice(0, -1);\n\n // Step 1b\n let step1bStar = false;\n if (w.endsWith(\"eed\")) {\n const stem = w.slice(0, -3);\n if (measure(stem) > 0) w = `${stem}ee`;\n } else {\n let stem: string | null = null;\n if (w.endsWith(\"ed\") && hasVowel(w.slice(0, -2))) stem = w.slice(0, -2);\n else if (w.endsWith(\"ing\") && hasVowel(w.slice(0, -3))) stem = w.slice(0, -3);\n if (stem !== null) {\n w = stem;\n step1bStar = true;\n }\n }\n if (step1bStar) {\n if (w.endsWith(\"at\") || w.endsWith(\"bl\") || w.endsWith(\"iz\")) w = `${w}e`;\n else if (doubleConsonant(w) && !/[lsz]$/.test(w)) w = w.slice(0, -1);\n else if (measure(w) === 1 && cvc(w)) w = `${w}e`;\n }\n\n // Step 1c\n if (w.endsWith(\"y\") && hasVowel(w.slice(0, -1))) w = `${w.slice(0, -1)}i`;\n\n // Step 2\n for (const [suf, rep] of STEP2) {\n if (w.endsWith(suf)) {\n const stem = w.slice(0, -suf.length);\n if (measure(stem) > 0) {\n w = stem + rep;\n break;\n }\n }\n }\n\n // Step 3\n for (const [suf, rep] of STEP3) {\n if (w.endsWith(suf)) {\n const stem = w.slice(0, -suf.length);\n if (measure(stem) > 0) {\n w = stem + rep;\n break;\n }\n }\n }\n\n // Step 4\n for (const suf of STEP4) {\n if (w.endsWith(suf)) {\n const stem = w.slice(0, -suf.length);\n if (measure(stem) > 1) {\n w = stem;\n break;\n }\n }\n }\n if (w.endsWith(\"ion\")) {\n const stem = w.slice(0, -3);\n if (measure(stem) > 1 && /[st]$/.test(stem)) w = stem;\n }\n\n // Step 5a\n if (w.endsWith(\"e\")) {\n const stem = w.slice(0, -1);\n const m = measure(stem);\n if (m > 1 || (m === 1 && !cvc(stem))) w = stem;\n }\n\n // Step 5b\n if (measure(w) > 1 && doubleConsonant(w) && w.endsWith(\"l\")) w = w.slice(0, -1);\n\n return w;\n}\n\nconst STEP2: Array<[string, string]> = [\n [\"ational\", \"ate\"],\n [\"tional\", \"tion\"],\n [\"enci\", \"ence\"],\n [\"anci\", \"ance\"],\n [\"izer\", \"ize\"],\n [\"abli\", \"able\"],\n [\"alli\", \"al\"],\n [\"entli\", \"ent\"],\n [\"eli\", \"e\"],\n [\"ousli\", \"ous\"],\n [\"ization\", \"ize\"],\n [\"ation\", \"ate\"],\n [\"ator\", \"ate\"],\n [\"alism\", \"al\"],\n [\"iveness\", \"ive\"],\n [\"fulness\", \"ful\"],\n [\"ousness\", \"ous\"],\n [\"aliti\", \"al\"],\n [\"iviti\", \"ive\"],\n [\"biliti\", \"ble\"],\n];\n\nconst STEP3: Array<[string, string]> = [\n [\"icate\", \"ic\"],\n [\"ative\", \"\"],\n [\"alize\", \"al\"],\n [\"iciti\", \"ic\"],\n [\"ical\", \"ic\"],\n [\"ful\", \"\"],\n [\"ness\", \"\"],\n];\n\nconst STEP4 = [\n \"al\",\n \"ance\",\n \"ence\",\n \"er\",\n \"ic\",\n \"able\",\n \"ible\",\n \"ant\",\n \"ement\",\n \"ment\",\n \"ent\",\n \"ou\",\n \"ism\",\n \"ate\",\n \"iti\",\n \"ous\",\n \"ive\",\n \"ize\",\n];\n\nfunction isConsonant(word: string, i: number): boolean {\n const c = word[i]!;\n if (\"aeiou\".includes(c)) return false;\n if (c === \"y\") return i === 0 ? true : !isConsonant(word, i - 1);\n return true;\n}\n\nfunction measure(word: string): number {\n let m = 0;\n let i = 0;\n const n = word.length;\n while (i < n && isConsonant(word, i)) i++;\n while (i < n) {\n while (i < n && !isConsonant(word, i)) i++;\n while (i < n && isConsonant(word, i)) i++;\n m++;\n }\n return m;\n}\n\nfunction hasVowel(word: string): boolean {\n for (let i = 0; i < word.length; i++) if (!isConsonant(word, i)) return true;\n return false;\n}\n\nfunction doubleConsonant(word: string): boolean {\n const n = word.length;\n if (n < 2) return false;\n return word[n - 1] === word[n - 2] && isConsonant(word, n - 1);\n}\n\nfunction cvc(word: string): boolean {\n const n = word.length;\n if (n < 3) return false;\n if (!isConsonant(word, n - 1) || isConsonant(word, n - 2) || !isConsonant(word, n - 3)) return false;\n const last = word[n - 1]!;\n return last !== \"w\" && last !== \"x\" && last !== \"y\";\n}\n", "import type { FtsTokenizerConfig } from \"./options.ts\";\nimport { porterStem } from \"./porter.ts\";\n\nexport interface FtsToken {\n /** Normalized token text stored in the index. */\n term: string;\n /** Byte offset of the token in the UTF-8 encoding of the source. */\n start: number;\n /** Byte length in UTF-8. */\n length: number;\n /** Token position (0-based) within the column. */\n position: number;\n /** Original end offset in JS string code units (for highlight). */\n startUnit: number;\n endUnit: number;\n}\n\nexport type TokenizerFn = (text: string) => FtsToken[];\n\nexport function createTokenizer(config: FtsTokenizerConfig): TokenizerFn {\n if (config.name === \"porter\") {\n const base = createTokenizer({\n name: config.base === \"ascii\" ? \"ascii\" : \"unicode61\",\n removeDiacritics: config.removeDiacritics ?? 1,\n tokenchars: config.tokenchars,\n separators: config.separators,\n });\n return (text) =>\n base(text).map((token) => ({\n ...token,\n term: porterStem(token.term),\n }));\n }\n if (config.name === \"trigram\") return createTrigramTokenizer(config);\n if (config.name === \"ascii\") return createAsciiTokenizer(config);\n return createUnicode61Tokenizer(config);\n}\n\nfunction createAsciiTokenizer(config: FtsTokenizerConfig): TokenizerFn {\n const tokenChar = defaultAsciiTokenChar();\n for (const ch of config.tokenchars ?? \"\") {\n const code = ch.charCodeAt(0);\n if (code < 128) tokenChar[code] = 1;\n }\n for (const ch of config.separators ?? \"\") {\n const code = ch.charCodeAt(0);\n if (code < 128) tokenChar[code] = 0;\n }\n const encoder = new TextEncoder();\n const decoder = new TextDecoder();\n return (text: string) => {\n const bytes = encoder.encode(text);\n const tokens: FtsToken[] = [];\n let is = 0;\n let pos = 0;\n while (is < bytes.length) {\n while (is < bytes.length && (bytes[is]! & 0x80) === 0 && tokenChar[bytes[is]!] === 0) is++;\n if (is >= bytes.length) break;\n let ie = is + 1;\n while (ie < bytes.length && ((bytes[ie]! & 0x80) !== 0 || tokenChar[bytes[ie]!] === 1)) ie++;\n const raw = bytes.slice(is, ie);\n const folded = new Uint8Array(raw.length);\n for (let i = 0; i < raw.length; i++) {\n const c = raw[i]!;\n folded[i] = c >= 65 && c <= 90 ? c + 32 : c;\n }\n const term = decoder.decode(folded);\n tokens.push({\n term,\n start: is,\n length: ie - is,\n position: pos++,\n startUnit: utf16Offset(text, is),\n endUnit: utf16Offset(text, ie),\n });\n is = ie + 1;\n }\n return tokens;\n };\n}\n\nfunction defaultAsciiTokenChar(): Uint8Array {\n const a = new Uint8Array(128);\n for (let i = 48; i <= 57; i++) a[i] = 1;\n for (let i = 65; i <= 90; i++) a[i] = 1;\n for (let i = 97; i <= 122; i++) a[i] = 1;\n return a;\n}\n\nfunction utf16Offset(text: string, byteOffset: number): number {\n let units = 0;\n let b = 0;\n for (const ch of text) {\n if (b >= byteOffset) break;\n b += new TextEncoder().encode(ch).length;\n units += ch.length;\n }\n return units;\n}\n\nfunction createUnicode61Tokenizer(config: FtsTokenizerConfig): TokenizerFn {\n const removeDiacritics = config.removeDiacritics ?? 1;\n const extraToken = new Set([...(config.tokenchars ?? \"\")].map((c) => c));\n const extraSep = new Set([...(config.separators ?? \"\")].map((c) => c));\n return (text: string) => {\n const tokens: FtsToken[] = [];\n let i = 0;\n let pos = 0;\n while (i < text.length) {\n while (i < text.length && !isUnicodeTokenChar(text[i]!, extraToken, extraSep)) i++;\n if (i >= text.length) break;\n const startUnit = i;\n while (i < text.length && isUnicodeTokenChar(text[i]!, extraToken, extraSep)) i++;\n let raw = text.slice(startUnit, i);\n if (removeDiacritics > 0) raw = stripDiacritics(raw, removeDiacritics);\n const term = raw.toLowerCase();\n if (term.length === 0) continue;\n tokens.push({\n term,\n start: utf8Offset(text, startUnit),\n length: utf8Length(text.slice(startUnit, i)),\n position: pos++,\n startUnit,\n endUnit: i,\n });\n }\n return tokens;\n };\n}\n\nfunction createTrigramTokenizer(config: FtsTokenizerConfig): TokenizerFn {\n const caseSensitive = config.caseSensitive ?? false;\n const removeDia = config.removeDiacriticsTrigram ?? false;\n return (text: string) => {\n let source = text;\n if (removeDia) source = stripDiacritics(source, 1);\n if (!caseSensitive) source = source.toLowerCase();\n const tokens: FtsToken[] = [];\n if (source.length < 3) return tokens;\n let pos = 0;\n for (let i = 0; i <= source.length - 3; i++) {\n const term = source.slice(i, i + 3);\n tokens.push({\n term,\n start: utf8Offset(source, i),\n length: utf8Length(term),\n position: pos++,\n startUnit: i,\n endUnit: i + 3,\n });\n }\n return tokens;\n };\n}\n\nfunction isUnicodeTokenChar(ch: string, extraToken: Set<string>, extraSep: Set<string>): boolean {\n if (extraSep.has(ch)) return false;\n if (extraToken.has(ch)) return true;\n // Letters, marks (combining), numbers \u2014 exclude punctuation/symbols/emoji\n return /\\p{L}|\\p{M}|\\p{N}/u.test(ch);\n}\n\nfunction stripDiacritics(text: string, mode: 0 | 1 | 2): string {\n if (mode === 0) return text;\n // NFD then strip combining marks. Mode 2 also folds a few special cases similarly.\n const normalized = text.normalize(\"NFD\");\n let out = \"\";\n for (const ch of normalized) {\n if (/\\p{M}/u.test(ch)) continue;\n out += ch;\n }\n return out;\n}\n\nexport function utf8Length(text: string): number {\n return new TextEncoder().encode(text).length;\n}\n\nexport function utf8Offset(text: string, unitIndex: number): number {\n return new TextEncoder().encode(text.slice(0, unitIndex)).length;\n}\n\n/** Legacy helper used by older call sites \u2014 simple alphanum split. */\nexport function tokenizeFtsText(text: string): string[] {\n return createUnicode61Tokenizer({ name: \"unicode61\", removeDiacritics: 1 })(text).map((t) => t.term);\n}\n", "import { SqliteError } from \"../../errors/index.ts\";\nimport type { Rowid } from \"../../storage/row.ts\";\nimport type { SqlValue } from \"../../types/value.ts\";\nimport { type FtsKind, type FtsTableOptions, parseFtsModuleArgs } from \"./options.ts\";\nimport { type FtsQueryNode, parseFts3Query, parseFts5Query } from \"./query.ts\";\nimport { createTokenizer, type FtsToken, type TokenizerFn, tokenizeFtsText } from \"./tokenize.ts\";\n\nexport interface Fts5Row {\n rowid: Rowid;\n values: Map<string, SqlValue>;\n /** Per-column tokens with positions. */\n tokensByColumn: Map<string, FtsToken[]>;\n}\n\nexport interface FtsMatchHit {\n column: string;\n position: number;\n startUnit: number;\n endUnit: number;\n term: string;\n}\n\nexport interface FtsMatchCursor {\n tableName: string;\n rowid: Rowid;\n query: string;\n ast: FtsQueryNode;\n hits: FtsMatchHit[];\n /** Phrase term strings used for ranking (flattened). */\n phraseTerms: string[][];\n}\n\ninterface Posting {\n rowid: Rowid;\n column: string;\n position: number;\n startUnit: number;\n endUnit: number;\n}\n\nexport class Fts5VirtualTable {\n readonly kind: FtsKind;\n readonly name: string;\n readonly columns: string[];\n readonly originalSql: string | null;\n readonly options: FtsTableOptions;\n readonly rows = new Map<Rowid, Fts5Row>();\n nextRowid: Rowid = 1;\n private readonly tokenize: TokenizerFn;\n /** term -> postings */\n private readonly index = new Map<string, Posting[]>();\n /** Global doc count for bm25. */\n private docCount = 0;\n /** Average document length (tokens across indexed columns). */\n private avgDocLen = 0;\n private totalTokens = 0;\n\n constructor(name: string, moduleArgs: string[], originalSql: string | null = null, kind: FtsKind = \"fts5\") {\n this.kind = kind;\n this.name = name;\n this.originalSql = originalSql;\n this.options = parseFtsModuleArgs(moduleArgs, kind);\n this.columns = this.options.columns.map((c) => c.name);\n if (this.columns.length === 0) throw new SqliteError(\"fts requires at least one column\", \"other\");\n this.tokenize = createTokenizer(this.options.tokenizer);\n }\n\n scan(): Fts5Row[] {\n return [...this.rows.values()];\n }\n\n insert(values: Map<string, SqlValue>, rowid?: Rowid): Rowid {\n // Special command: INSERT INTO t(t) VALUES('optimize') etc.\n const command = this.detectCommand(values);\n if (command !== null) {\n this.runCommand(command, values, rowid);\n // Match SQLite: special commands report lastInsertRowid 0\n return 0;\n }\n\n const assigned = rowid ?? this.nextRowid++;\n if (this.rows.has(assigned)) throw new SqliteError(\"PRIMARY KEY constraint failed\", \"constraint_primary\");\n const row = this.buildRow(assigned, values);\n this.rows.set(assigned, row);\n this.indexRow(row);\n this.bumpRowid(assigned);\n return assigned;\n }\n\n update(rowid: Rowid, updates: Map<string, SqlValue>): void {\n const row = this.rows.get(rowid);\n if (!row) return;\n this.unindexRow(row);\n const values = new Map(row.values);\n for (const [key, value] of updates) values.set(key, value);\n const next = this.buildRow(rowid, values);\n this.rows.set(rowid, next);\n this.indexRow(next);\n }\n\n delete(rowid: Rowid): void {\n const row = this.rows.get(rowid);\n if (!row) return;\n this.unindexRow(row);\n this.rows.delete(rowid);\n }\n\n matches(rowid: Rowid, leftTable: string | null, leftColumn: string, query: string): boolean {\n const cursor = this.matchCursor(rowid, leftTable, leftColumn, query);\n return cursor !== null;\n }\n\n matchCursor(rowid: Rowid, leftTable: string | null, leftColumn: string, query: string): FtsMatchCursor | null {\n const row = this.rows.get(rowid);\n if (!row) return null;\n const ast = this.kind === \"fts5\" ? parseFts5Query(query) : parseFts3Query(query);\n const columnLower = leftColumn.toLowerCase();\n const tableLower = this.name.toLowerCase();\n const leftTableLower = leftTable?.toLowerCase() ?? null;\n // Column-restricted MATCH (content MATCH 'x') limits default columns\n let defaultColumns = this.indexedColumns();\n if (columnLower !== tableLower && !(leftTableLower !== null && columnLower === leftTableLower)) {\n const matched = this.columns.find((c) => c.toLowerCase() === columnLower);\n if (matched) defaultColumns = [matched];\n else return null;\n }\n const hits: FtsMatchHit[] = [];\n const ok = this.evalNode(ast, row, defaultColumns, hits);\n if (!ok) return null;\n return {\n tableName: this.name,\n rowid,\n query,\n ast,\n hits,\n phraseTerms: collectPhraseTerms(ast),\n };\n }\n\n bm25(cursor: FtsMatchCursor, weights?: number[]): number {\n const row = this.rows.get(cursor.rowid);\n if (!row) return -0;\n const phrases = cursor.phraseTerms.length > 0 ? cursor.phraseTerms : [];\n if (phrases.length === 0) return -0;\n const cols = this.indexedColumns();\n const w = cols.map((_, i) => weights?.[i] ?? 1);\n const k1 = 1.2;\n const b = 0.75;\n const N = Math.max(1, this.docCount);\n const avgdl = Math.max(1e-9, this.avgDocLen);\n let score = 0;\n const D = this.docLength(row);\n\n for (let pi = 0; pi < phrases.length; pi++) {\n const phrase = phrases[pi]!;\n // Phrase frequency: weighted count of phrase occurrences across columns\n let freq = 0;\n for (let ci = 0; ci < cols.length; ci++) {\n const col = cols[ci]!;\n const n = this.phraseFreq(row, col, phrase);\n freq += (w[ci] ?? 1) * n;\n }\n if (freq === 0) continue;\n const df = this.phraseDocFreq(phrase);\n // SQLite FTS5: IDF = log((N - nHit + 0.5) / (nHit + 0.5)); floor at 1e-6\n let idf = Math.log((N - df + 0.5) / (df + 0.5));\n if (idf <= 0) idf = 1e-6;\n score += idf * ((freq * (k1 + 1)) / (freq + k1 * (1 - b + (b * D) / avgdl)));\n }\n return score === 0 ? -0 : -score;\n }\n\n highlight(cursor: FtsMatchCursor, colIndex: number, open: string, close: string): string {\n const row = this.rows.get(cursor.rowid);\n if (!row) return \"\";\n const col = this.columns[colIndex];\n if (!col) return \"\";\n const text = valueToText(row.values.get(col.toLowerCase()) ?? null);\n if (this.options.content === \"contentless\") return text;\n const hits = cursor.hits\n .filter((h) => h.column.toLowerCase() === col.toLowerCase())\n .sort((a, b) => a.startUnit - b.startUnit);\n if (hits.length === 0) return text;\n let out = \"\";\n let at = 0;\n for (const hit of mergeHits(hits)) {\n out += text.slice(at, hit.startUnit);\n out += open + text.slice(hit.startUnit, hit.endUnit) + close;\n at = hit.endUnit;\n }\n out += text.slice(at);\n return out;\n }\n\n snippet(\n cursor: FtsMatchCursor,\n colIndex: number,\n open: string,\n close: string,\n ellipsis: string,\n tokenCount: number,\n ): string {\n const row = this.rows.get(cursor.rowid);\n if (!row) return \"\";\n const col = this.columns[colIndex];\n if (!col) return \"\";\n const text = valueToText(row.values.get(col.toLowerCase()) ?? null);\n const tokens = row.tokensByColumn.get(col.toLowerCase()) ?? [];\n const hitPositions = new Set(\n cursor.hits.filter((h) => h.column.toLowerCase() === col.toLowerCase()).map((h) => h.position),\n );\n if (tokens.length === 0 || hitPositions.size === 0) return text;\n const firstHit = Math.min(...hitPositions);\n const window = Math.max(1, tokenCount);\n const startPos = Math.max(0, firstHit - Math.floor(window / 4));\n const endPos = Math.min(tokens.length - 1, startPos + window - 1);\n const startUnit = tokens[startPos]!.startUnit;\n const endUnit = tokens[endPos]!.endUnit;\n const slice = text.slice(startUnit, endUnit);\n // Re-highlight within slice\n const localHits = cursor.hits\n .filter((h) => h.column.toLowerCase() === col.toLowerCase() && h.startUnit >= startUnit && h.endUnit <= endUnit)\n .map((h) => ({ ...h, startUnit: h.startUnit - startUnit, endUnit: h.endUnit - startUnit }));\n let out = \"\";\n let at = 0;\n for (const hit of mergeHits(localHits)) {\n out += slice.slice(at, hit.startUnit);\n out += open + slice.slice(hit.startUnit, hit.endUnit) + close;\n at = hit.endUnit;\n }\n out += slice.slice(at);\n if (startPos > 0) out = ellipsis + out;\n if (endPos < tokens.length - 1) out = out + ellipsis;\n return out;\n }\n\n /** FTS3/4 offsets(): \"col phrase start length ...\" */\n offsets(cursor: FtsMatchCursor): string {\n const row = this.rows.get(cursor.rowid);\n if (!row) return \"\";\n const parts: string[] = [];\n for (const hit of cursor.hits) {\n const colIndex = this.columns.findIndex((c) => c.toLowerCase() === hit.column.toLowerCase());\n const text = valueToText(row.values.get(hit.column.toLowerCase()) ?? null);\n const start = utf8OffsetLocal(text, hit.startUnit);\n const length = utf8OffsetLocal(text, hit.endUnit) - start;\n parts.push(String(colIndex), \"0\", String(start), String(length));\n }\n return parts.join(\" \");\n }\n\n /** FTS3 matchinfo format encoded as native-style 32-bit little-endian integers. */\n matchinfo(cursor: FtsMatchCursor, format = \"pcx\"): Uint8Array {\n const row = this.rows.get(cursor.rowid);\n const nPhrase = Math.max(1, cursor.phraseTerms.length);\n const nCol = this.columns.length;\n const values: number[] = [];\n for (const request of format) {\n switch (request) {\n case \"p\":\n values.push(nPhrase);\n break;\n case \"c\":\n values.push(nCol);\n break;\n case \"s\":\n for (let c = 0; c < nCol; c++) {\n let longest = 0;\n let run = 0;\n for (let p = 0; p < nPhrase; p++) {\n const phrase = cursor.phraseTerms[p] ?? [];\n if (row && this.phraseFreq(row, this.columns[c]!, phrase) > 0) {\n run++;\n longest = Math.max(longest, run);\n } else {\n run = 0;\n }\n }\n values.push(longest);\n }\n break;\n case \"x\":\n for (let p = 0; p < nPhrase; p++) {\n const phrase = cursor.phraseTerms[p] ?? [];\n for (let c = 0; c < nCol; c++) {\n const column = this.columns[c]!;\n const localHits = row ? this.phraseFreq(row, column, phrase) : 0;\n let globalHits = 0;\n let matchingRows = 0;\n for (const candidate of this.rows.values()) {\n const hits = this.phraseFreq(candidate, column, phrase);\n globalHits += hits;\n if (hits > 0) matchingRows++;\n }\n values.push(localHits, globalHits, matchingRows);\n }\n }\n break;\n case \"y\":\n for (let p = 0; p < nPhrase; p++) {\n const phrase = cursor.phraseTerms[p] ?? [];\n for (let c = 0; c < nCol; c++) {\n values.push(row ? this.phraseFreq(row, this.columns[c]!, phrase) : 0);\n }\n }\n break;\n default:\n throw new SqliteError(`unrecognized matchinfo request: ${request}`, \"other\");\n }\n }\n const buf = new Uint8Array(values.length * 4);\n const view = new DataView(buf.buffer);\n for (let i = 0; i < values.length; i++) view.setUint32(i * 4, values[i]! >>> 0, true);\n return buf;\n }\n\n vocabRows(mode: \"row\" | \"col\" | \"instance\"): Array<Record<string, SqlValue>> {\n if (mode === \"row\") {\n const out: Array<Record<string, SqlValue>> = [];\n for (const [term, postings] of [...this.index.entries()].sort((a, b) => (a[0] < b[0] ? -1 : 1))) {\n const docs = new Set(postings.map((p) => String(p.rowid)));\n out.push({ term, doc: docs.size, cnt: postings.length });\n }\n return out;\n }\n // col / instance simplified to row shape\n return this.vocabRows(\"row\");\n }\n\n clone(): Fts5VirtualTable {\n const copy = new Fts5VirtualTable(\n this.name,\n this.options.columns.map((c) => (c.unindexed ? `${c.name} UNINDEXED` : c.name)),\n this.originalSql,\n this.kind,\n );\n // Re-parse options by reconstructing module args is imperfect; copy fields\n Object.assign(copy, {\n options: structuredClone(this.options),\n columns: [...this.columns],\n });\n (copy as unknown as { tokenize: TokenizerFn }).tokenize = this.tokenize;\n copy.nextRowid = this.nextRowid;\n for (const [rowid, row] of this.rows) {\n const cloned: Fts5Row = {\n rowid: row.rowid,\n values: new Map(row.values),\n tokensByColumn: new Map([...row.tokensByColumn.entries()].map(([k, v]) => [k, v.map((t) => ({ ...t }))])),\n };\n copy.rows.set(rowid, cloned);\n copy.indexRow(cloned);\n }\n return copy;\n }\n\n private detectCommand(values: Map<string, SqlValue>): string | null {\n // INSERT INTO t(t) VALUES('optimize') \u2014 column name equals table name\n const key = this.name.toLowerCase();\n if (!values.has(key)) return null;\n const v = values.get(key);\n if (typeof v !== \"string\") return null;\n return v;\n }\n\n private runCommand(command: string, _values: Map<string, SqlValue>, rowid?: Rowid): void {\n const cmd = command.toLowerCase();\n if (cmd === \"optimize\") return;\n if (cmd === \"rebuild\") {\n this.rebuild();\n return;\n }\n if (cmd === \"integrity-check\") return;\n if (cmd === \"delete-all\") {\n if (this.options.content === \"normal\") {\n throw new SqliteError(\n \"'delete-all' may only be used with a contentless or external content fts5 table\",\n \"other\",\n );\n }\n for (const rowid of [...this.rows.keys()]) this.delete(rowid);\n return;\n }\n if (cmd.startsWith(\"merge=\") || cmd.startsWith(\"automerge=\")) {\n throw new SqliteError(\"SQL logic error\", \"other\");\n }\n if (cmd === \"delete\") {\n if (rowid === undefined) throw new SqliteError(\"SQL logic error\", \"other\");\n this.delete(rowid);\n return;\n }\n // Unknown command string may be treated as content insert into table-named column \u2014 ignore as no-op command fail\n throw new SqliteError(\"SQL logic error\", \"other\");\n }\n\n private rebuild(): void {\n this.index.clear();\n this.docCount = 0;\n this.totalTokens = 0;\n this.avgDocLen = 0;\n for (const row of this.rows.values()) this.indexRow(row);\n }\n\n private buildRow(rowid: Rowid, values: Map<string, SqlValue>): Fts5Row {\n const stored = new Map<string, SqlValue>();\n const tokensByColumn = new Map<string, FtsToken[]>();\n for (const column of this.columns) {\n const key = column.toLowerCase();\n const value = values.get(key) ?? null;\n if (this.options.content === \"contentless\") {\n // Contentless stores index only; user-visible content columns are NULL\n stored.set(key, null);\n const text = valueToText(value);\n const colDef = this.options.columns.find((c) => c.name.toLowerCase() === key);\n tokensByColumn.set(key, colDef?.unindexed ? [] : this.tokenize(text));\n continue;\n }\n stored.set(key, value);\n const colDef = this.options.columns.find((c) => c.name.toLowerCase() === key);\n tokensByColumn.set(key, colDef?.unindexed ? [] : this.tokenize(valueToText(value)));\n }\n return { rowid, values: stored, tokensByColumn };\n }\n\n private indexRow(row: Fts5Row): void {\n let tokenCount = 0;\n for (const [col, tokens] of row.tokensByColumn) {\n for (const token of tokens) {\n tokenCount++;\n this.addPosting(token.term, {\n rowid: row.rowid,\n column: col,\n position: token.position,\n startUnit: token.startUnit,\n endUnit: token.endUnit,\n });\n for (const n of this.options.prefix) {\n if (token.term.length >= n) {\n const pref = `${token.term.slice(0, n)}*`;\n // prefix index entries are optimization only \u2014 queries still work via scan\n void pref;\n }\n }\n }\n }\n this.docCount++;\n this.totalTokens += tokenCount;\n this.avgDocLen = this.totalTokens / Math.max(1, this.docCount);\n }\n\n private unindexRow(row: Fts5Row): void {\n let tokenCount = 0;\n for (const [col, tokens] of row.tokensByColumn) {\n for (const token of tokens) {\n tokenCount++;\n this.removePosting(token.term, row.rowid, col, token.position);\n }\n }\n this.docCount = Math.max(0, this.docCount - 1);\n this.totalTokens = Math.max(0, this.totalTokens - tokenCount);\n this.avgDocLen = this.totalTokens / Math.max(1, this.docCount);\n }\n\n private addPosting(term: string, posting: Posting): void {\n const key = term.toLowerCase();\n const list = this.index.get(key);\n if (list) list.push(posting);\n else this.index.set(key, [posting]);\n }\n\n private removePosting(term: string, rowid: Rowid, column: string, position: number): void {\n const key = term.toLowerCase();\n const list = this.index.get(key);\n if (!list) return;\n const next = list.filter((p) => !(p.rowid === rowid && p.column === column && p.position === position));\n if (next.length === 0) this.index.delete(key);\n else this.index.set(key, next);\n }\n\n private indexedColumns(): string[] {\n return this.options.columns.filter((c) => !c.unindexed).map((c) => c.name);\n }\n\n private evalNode(node: FtsQueryNode, row: Fts5Row, defaultColumns: string[], hits: FtsMatchHit[]): boolean {\n switch (node.type) {\n case \"true\":\n return true;\n case \"and\":\n return node.children.every((child) => this.evalNode(child, row, defaultColumns, hits));\n case \"or\": {\n // Collect hits from matching branch only\n for (const child of node.children) {\n const local: FtsMatchHit[] = [];\n if (this.evalNode(child, row, defaultColumns, local)) {\n hits.push(...local);\n return true;\n }\n }\n return false;\n }\n case \"not\": {\n const local: FtsMatchHit[] = [];\n return !this.evalNode(node.child, row, defaultColumns, local);\n }\n case \"term\": {\n const expanded = this.expandTermNode(node);\n if (expanded.type !== \"term\") return this.evalNode(expanded, row, defaultColumns, hits);\n const cols = resolveColumns(node.column, node.columns, defaultColumns, this.columns);\n const needle = this.normalizeQueryTerm(node.value);\n let found = false;\n for (const col of cols) {\n const tokens = row.tokensByColumn.get(col.toLowerCase()) ?? [];\n for (const token of tokens) {\n if (node.prefix ? token.term.startsWith(needle) : token.term === needle) {\n hits.push({\n column: col,\n position: token.position,\n startUnit: token.startUnit,\n endUnit: token.endUnit,\n term: token.term,\n });\n found = true;\n }\n }\n }\n return found;\n }\n case \"phrase\": {\n const cols = resolveColumns(node.column, node.columns, defaultColumns, this.columns);\n let found = false;\n for (const col of cols) {\n const tokens = row.tokensByColumn.get(col.toLowerCase()) ?? [];\n const terms = node.terms.map((t) => ({\n value: this.normalizeQueryTerm(t.value),\n prefix: t.prefix,\n }));\n for (let i = 0; i <= tokens.length - terms.length; i++) {\n let ok = true;\n for (let j = 0; j < terms.length; j++) {\n const tok = tokens[i + j]!;\n const term = terms[j]!;\n if (term.prefix ? !tok.term.startsWith(term.value) : tok.term !== term.value) {\n ok = false;\n break;\n }\n }\n if (ok) {\n found = true;\n for (let j = 0; j < terms.length; j++) {\n const tok = tokens[i + j]!;\n hits.push({\n column: col,\n position: tok.position,\n startUnit: tok.startUnit,\n endUnit: tok.endUnit,\n term: tok.term,\n });\n }\n }\n }\n }\n return found;\n }\n case \"near\": {\n const cols = resolveColumns(node.column, node.columns, defaultColumns, this.columns);\n // Evaluate each child to position sets per column\n for (const col of cols) {\n const posSets: number[][] = [];\n let allOk = true;\n for (const child of node.children) {\n const local: FtsMatchHit[] = [];\n if (!this.evalNode(child, row, [col], local)) {\n allOk = false;\n break;\n }\n posSets.push(local.filter((h) => h.column.toLowerCase() === col.toLowerCase()).map((h) => h.position));\n }\n if (!allOk) continue;\n if (nearMatch(posSets, node.distance)) {\n // re-collect hits\n for (const child of node.children) this.evalNode(child, row, [col], hits);\n return true;\n }\n }\n return false;\n }\n }\n }\n\n private normalizeQueryTerm(term: string): string {\n // Query terms are tokenized with the same tokenizer when possible\n const tokens = this.tokenize(term);\n if (tokens.length === 1) return tokens[0]!.term;\n if (tokens.length === 0) return term.toLowerCase();\n // Trigram (and multi-token) queries: join is wrong for matching \u2014 use first only for df;\n // phrase matching uses tokenize() directly via evalNode.\n return tokens[0]!.term;\n }\n\n /** For trigram tokenizer, a bare MATCH term is a phrase of overlapping trigrams. */\n private expandTermNode(node: Extract<FtsQueryNode, { type: \"term\" }>): FtsQueryNode {\n if (this.options.tokenizer.name !== \"trigram\") return node;\n const tokens = this.tokenize(node.value);\n if (tokens.length <= 1) return node;\n return {\n type: \"phrase\",\n terms: tokens.map((t) => ({ value: t.term, prefix: false })),\n column: node.column,\n columns: node.columns,\n };\n }\n\n private phraseFreq(row: Fts5Row, column: string, phrase: string[]): number {\n if (phrase.length === 0) return 0;\n const tokens = row.tokensByColumn.get(column.toLowerCase()) ?? [];\n const terms = phrase.map((t) => this.normalizeQueryTerm(t));\n let count = 0;\n for (let i = 0; i <= tokens.length - terms.length; i++) {\n let ok = true;\n for (let j = 0; j < terms.length; j++) {\n if (tokens[i + j]!.term !== terms[j]) {\n ok = false;\n break;\n }\n }\n if (ok) count++;\n }\n return count;\n }\n\n private phraseDocFreq(phrase: string[]): number {\n let n = 0;\n for (const row of this.rows.values()) {\n for (const col of this.indexedColumns()) {\n if (this.phraseFreq(row, col, phrase) > 0) {\n n++;\n break;\n }\n }\n }\n return n;\n }\n\n private docLength(row: Fts5Row): number {\n let n = 0;\n for (const col of this.indexedColumns()) n += (row.tokensByColumn.get(col.toLowerCase()) ?? []).length;\n return Math.max(1, n);\n }\n\n private bumpRowid(assigned: Rowid): void {\n if (typeof assigned === \"bigint\") {\n if (assigned >= BigInt(this.nextRowid as number | bigint)) this.nextRowid = assigned + 1n;\n } else if (assigned >= (typeof this.nextRowid === \"number\" ? this.nextRowid : Number(this.nextRowid))) {\n this.nextRowid = assigned + 1;\n }\n }\n}\n\nfunction resolveColumns(\n column: string | null,\n columns: string[] | null,\n defaultColumns: string[],\n allColumns: string[],\n): string[] {\n if (columns && columns.length > 0) {\n return columns\n .map((c) => allColumns.find((x) => x.toLowerCase() === c.toLowerCase()))\n .filter((c): c is string => !!c);\n }\n if (column) {\n const matched = allColumns.find((c) => c.toLowerCase() === column.toLowerCase());\n return matched ? [matched] : [];\n }\n return defaultColumns;\n}\n\nfunction nearMatch(posSets: number[][], distance: number): boolean {\n if (posSets.length === 0) return false;\n if (posSets.length === 1) return posSets[0]!.length > 0;\n // Check if there exists a combination where max-min <= distance + (n-1) roughly (FTS5 NEAR)\n // FTS5: NEAR(a b, N) means the terms are within N tokens of each other.\n const first = posSets[0]!;\n for (const p0 of first) {\n if (nearFrom(p0, posSets.slice(1), distance)) return true;\n }\n return false;\n}\n\nfunction nearFrom(anchor: number, rest: number[][], distance: number): boolean {\n if (rest.length === 0) return true;\n const next = rest[0]!;\n for (const p of next) {\n if (Math.abs(p - anchor) <= distance) {\n if (nearFrom(p, rest.slice(1), distance)) return true;\n }\n }\n return false;\n}\n\nfunction collectPhraseTerms(node: FtsQueryNode): string[][] {\n switch (node.type) {\n case \"term\":\n return [[node.value]];\n case \"phrase\":\n return [node.terms.map((t) => t.value)];\n case \"and\":\n case \"or\":\n case \"near\":\n return node.children.flatMap(collectPhraseTerms);\n case \"not\":\n return [];\n case \"true\":\n return [];\n }\n}\n\nfunction mergeHits(hits: FtsMatchHit[]): FtsMatchHit[] {\n if (hits.length === 0) return [];\n const sorted = [...hits].sort((a, b) => a.startUnit - b.startUnit);\n const out: FtsMatchHit[] = [{ ...sorted[0]! }];\n for (let i = 1; i < sorted.length; i++) {\n const cur = sorted[i]!;\n const last = out[out.length - 1]!;\n if (cur.startUnit <= last.endUnit) last.endUnit = Math.max(last.endUnit, cur.endUnit);\n else out.push({ ...cur });\n }\n return out;\n}\n\nfunction valueToText(value: SqlValue): string {\n if (value === null) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n return \"\";\n}\n\nfunction utf8OffsetLocal(text: string, unitIndex: number): number {\n return new TextEncoder().encode(text.slice(0, unitIndex)).length;\n}\n\nexport { tokenizeFtsText };\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { Rowid } from \"../storage/row.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\n\nexport interface RTreeRow {\n id: number | bigint;\n coords: number[];\n}\n\n/**\n * Simplified R*Tree for SQLite rtree / rtree_i32 modules.\n * Stores axis-aligned boxes; queries filter by bound inequalities in WHERE.\n */\nexport class RTreeVirtualTable {\n readonly kind = \"rtree\" as const;\n readonly name: string;\n readonly columns: string[];\n readonly dimension: number;\n readonly integerCoords: boolean;\n readonly originalSql: string | null;\n readonly rows = new Map<string, RTreeRow>();\n /** Shadow node table content for rtreenode/rtreedepth. */\n readonly nodes = new Map<number, Uint8Array>();\n\n constructor(name: string, columns: string[], integerCoords = false, originalSql: string | null = null) {\n if (columns.length < 3 || columns.length % 2 === 0) {\n throw new SqliteError(\"rtree tables must have an odd number of columns >= 3\", \"other\");\n }\n this.name = name;\n this.columns = columns;\n this.dimension = (columns.length - 1) / 2;\n this.integerCoords = integerCoords;\n this.originalSql = originalSql;\n this.nodes.set(1, new Uint8Array([0]));\n }\n\n scan(): Array<{ rowid: Rowid; values: Map<string, SqlValue> }> {\n return [...this.rows.values()].map((row) => {\n const values = new Map<string, SqlValue>();\n values.set(this.columns[0]!.toLowerCase(), row.id);\n for (let i = 0; i < row.coords.length; i++) {\n values.set(this.columns[i + 1]!.toLowerCase(), row.coords[i]!);\n }\n return { rowid: row.id, values };\n });\n }\n\n insert(values: Map<string, SqlValue>): Rowid {\n const idVal = values.get(this.columns[0]!.toLowerCase());\n if (idVal === null || idVal === undefined) {\n throw new SqliteError(\"rtree id must not be NULL\", \"constraint_notnull\");\n }\n const id = typeof idVal === \"bigint\" ? idVal : Math.trunc(Number(idVal));\n const key = String(id);\n if (this.rows.has(key)) throw new SqliteError(\"UNIQUE constraint failed\", \"constraint_unique\");\n const coords: number[] = [];\n for (let i = 1; i < this.columns.length; i++) {\n const raw = values.get(this.columns[i]!.toLowerCase()) ?? null;\n if (raw === null) throw new SqliteError(\"rtree coordinate must not be NULL\", \"constraint_notnull\");\n let n = Number(raw);\n if (this.integerCoords) n = Math.trunc(n);\n coords.push(n);\n }\n this.rows.set(key, { id, coords });\n return id;\n }\n\n update(rowid: Rowid, updates: Map<string, SqlValue>): void {\n const key = String(rowid);\n const existing = this.rows.get(key);\n if (!existing) return;\n const values = new Map<string, SqlValue>();\n values.set(this.columns[0]!.toLowerCase(), existing.id);\n for (let i = 0; i < existing.coords.length; i++) {\n values.set(this.columns[i + 1]!.toLowerCase(), existing.coords[i]!);\n }\n for (const [k, v] of updates) values.set(k, v);\n this.rows.delete(key);\n this.insert(values);\n }\n\n delete(rowid: Rowid): void {\n this.rows.delete(String(rowid));\n }\n\n clone(): RTreeVirtualTable {\n const copy = new RTreeVirtualTable(this.name, this.columns, this.integerCoords, this.originalSql);\n for (const [k, row] of this.rows) copy.rows.set(k, { id: row.id, coords: [...row.coords] });\n for (const [k, v] of this.nodes) copy.nodes.set(k, new Uint8Array(v));\n return copy;\n }\n}\n\nexport class DbStatVirtualTable {\n readonly kind = \"dbstat\" as const;\n readonly name: string;\n readonly columns = [\n \"name\",\n \"path\",\n \"pageno\",\n \"pagetype\",\n \"ncell\",\n \"payload\",\n \"unused\",\n \"mx_payload\",\n \"pgoffset\",\n \"pgsize\",\n ];\n readonly originalSql: string | null;\n readonly schemaArg: string | null;\n\n constructor(name: string, schemaArg: string | null = null, originalSql: string | null = null) {\n this.name = name;\n this.schemaArg = schemaArg;\n this.originalSql = originalSql;\n }\n\n clone(): DbStatVirtualTable {\n return new DbStatVirtualTable(this.name, this.schemaArg, this.originalSql);\n }\n}\n\nexport class BytecodeVirtualTable {\n readonly kind = \"bytecode\" as const;\n readonly name: string;\n readonly columns = [\"addr\", \"opcode\", \"p1\", \"p2\", \"p3\", \"p4\", \"p5\", \"comment\", \"subprog\"];\n readonly originalSql: string | null;\n\n constructor(name: string, originalSql: string | null = null) {\n this.name = name;\n this.originalSql = originalSql;\n }\n\n clone(): BytecodeVirtualTable {\n return new BytecodeVirtualTable(this.name, this.originalSql);\n }\n}\n\nexport class TablesUsedVirtualTable {\n readonly kind = \"tables_used\" as const;\n readonly name: string;\n readonly columns = [\"type\", \"schema\", \"name\"];\n readonly originalSql: string | null;\n\n constructor(name: string, originalSql: string | null = null) {\n this.name = name;\n this.originalSql = originalSql;\n }\n\n clone(): TablesUsedVirtualTable {\n return new TablesUsedVirtualTable(this.name, this.originalSql);\n }\n}\n\nexport class FtsVocabVirtualTable {\n readonly kind = \"fts5vocab\" as const;\n readonly name: string;\n readonly columns: string[];\n readonly ftsTable: string;\n readonly vocabType: string;\n readonly originalSql: string | null;\n\n constructor(name: string, args: string[], originalSql: string | null = null) {\n if (args.length < 1) throw new SqliteError(\"fts5vocab requires an fts5 table name\", \"other\");\n this.name = name;\n this.ftsTable = args[0]!;\n this.vocabType = (args[1] ?? \"row\").replace(/'/g, \"\").toLowerCase();\n this.columns =\n this.vocabType === \"col\"\n ? [\"term\", \"col\", \"doc\", \"cnt\"]\n : this.vocabType === \"instance\"\n ? [\"term\", \"doc\", \"col\", \"offset\"]\n : [\"term\", \"doc\", \"cnt\"];\n this.originalSql = originalSql;\n }\n\n clone(): FtsVocabVirtualTable {\n return new FtsVocabVirtualTable(this.name, [this.ftsTable, this.vocabType], this.originalSql);\n }\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { Row } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\n\n/** Always-on invariant check (Tiger Style \u2014 not stripped in production). */\nexport function assert(condition: boolean, message: string): asserts condition {\n if (!condition) {\n throw new SqliteError(`internal assertion failed: ${message}`, \"other\");\n }\n}\n\n/** Exhaustive switch helper \u2014 call when a union case should be impossible. */\nexport function assertUnreachable(value: never, message = \"unreachable\"): never {\n throw new SqliteError(`internal assertion failed: ${message} (${String(value)})`, \"other\");\n}\n\n/** Row payload must align with table column count after insert/update. */\nexport function assertRowShape(table: Table, row: Row): void {\n assert(row.values.length === table.columns.length, `row.values.length !== table.columns.length for ${table.name}`);\n}\n\n/** Maximum blob/string length enforced before allocation (matches bun:sqlite TOOBIG). */\nexport const SQLITE_MAX_LENGTH = 2_147_483_647;\n\nexport function assertBlobLength(length: number, _feature: string): void {\n if (!Number.isFinite(length) || length < 0) return;\n if (length >= SQLITE_MAX_LENGTH) {\n throw new SqliteError(`string or blob too big`, \"other\", \"SQLITE_TOOBIG\");\n }\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { compareSql, type SqlValue } from \"./value.ts\";\n\nexport type BuiltinCollation = \"BINARY\" | \"NOCASE\" | \"RTRIM\";\n\nexport function normalizeForCollation(value: SqlValue, name: string): SqlValue {\n const collation = builtinCollation(name);\n if (typeof value !== \"string\" || collation === \"BINARY\") return value;\n if (collation === \"RTRIM\") return value.replace(/ +$/u, \"\");\n\n let normalized = \"\";\n for (const char of value) {\n const code = char.charCodeAt(0);\n normalized += code >= 0x41 && code <= 0x5a ? String.fromCharCode(code + 0x20) : char;\n }\n return normalized;\n}\n\nexport function compareWithCollation(a: SqlValue, b: SqlValue, name: string): number | null {\n return compareSql(normalizeForCollation(a, name), normalizeForCollation(b, name));\n}\n\nfunction builtinCollation(name: string): BuiltinCollation {\n const normalized = name.toUpperCase();\n if (normalized === \"BINARY\" || normalized === \"NOCASE\" || normalized === \"RTRIM\") return normalized;\n throw new SqliteError(`no such collation sequence: ${name}`, \"other\");\n}\n", "import type { SqlValue } from \"../types/value.ts\";\nimport { cloneSqlValue } from \"../types/value.ts\";\n\nexport type Rowid = number | bigint;\n\n/** Heap row: `values[i]` is `table.columns[i]`. */\nexport interface Row {\n rowid: Rowid;\n values: SqlValue[];\n}\n\nexport type NamedRowValues = Map<string, SqlValue> | ReadonlyMap<string, SqlValue> | Record<string, SqlValue>;\nexport type RowValues = NamedRowValues | readonly SqlValue[];\n\nexport function normalizeColumnName(name: string): string {\n return name.toLowerCase();\n}\n\nexport function rowValues(values: NamedRowValues): Map<string, SqlValue> {\n const result = new Map<string, SqlValue>();\n const entries = values instanceof Map ? values.entries() : Object.entries(values);\n for (const [name, value] of entries) {\n result.set(normalizeColumnName(name), value);\n }\n return result;\n}\n\nexport function cloneRow(row: Row): Row {\n const values = new Array<SqlValue>(row.values.length);\n for (let i = 0; i < row.values.length; i++) values[i] = cloneSqlValue(row.values[i]!);\n return { rowid: row.rowid, values };\n}\n\nexport function isValueArray(values: RowValues): values is readonly SqlValue[] {\n return Array.isArray(values);\n}\n", "import type { Expr, TableConstraint } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { serializeIndexKey } from \"../indexes/index.ts\";\nimport { assertRowShape } from \"../runtime/assert.ts\";\nimport { compareWithCollation, normalizeForCollation } from \"../types/collation.ts\";\nimport { applyStrictValue } from \"../types/strict.ts\";\nimport type { Affinity, SqlValue } from \"../types/value.ts\";\nimport { affinityFromTypeName, applyAffinity, cloneSqlValue, compareSql } from \"../types/value.ts\";\nimport type { ColumnarSlab } from \"./columnar-slab.ts\";\nimport type { NamedRowValues, Row, Rowid, RowValues } from \"./row.ts\";\nimport { isValueArray, normalizeColumnName, rowValues } from \"./row.ts\";\n\n/** Build a covering equality hash once a table is large enough that scans dominate. */\nconst EQUALITY_HASH_MIN_ROWS = 16;\n\nexport interface ColumnInfo {\n name: string;\n /** Cached `name.toLowerCase()` for hot-path lookups. */\n nameLower?: string;\n typeName: string | null;\n affinity: Affinity;\n notNull: boolean;\n primaryKey: boolean;\n autoincrement: boolean;\n defaultExpr: Expr | null;\n unique: boolean;\n /** Declared column collation (BINARY/NOCASE/RTRIM); null means BINARY. */\n collate: string | null;\n /** GENERATED ALWAYS AS (...) \u2014 VIRTUAL computed on read, STORED materialized. */\n generated: { expr: Expr; stored: boolean } | null;\n}\n\nexport interface InsertOptions {\n /** Values are already affinity-applied Maps with lowercase keys; skip prepareValues. */\n prepared?: boolean;\n /** Skip NOT NULL / UNIQUE / PK scans (caller already enforced, or table is unconstrained). */\n skipValidate?: boolean;\n}\n\nexport interface InsertRow {\n rowid?: Rowid;\n values: RowValues;\n}\n\nexport interface TableOptions {\n constraints?: TableConstraint[];\n indexes?: string[];\n originalSql?: string | null;\n withoutRowid?: boolean;\n strict?: boolean;\n}\n\nexport class Table {\n name: string;\n columns: ColumnInfo[];\n rows: Map<Rowid, Row>;\n nextRowid: Rowid;\n constraints: TableConstraint[];\n indexes: string[];\n originalSql: string | null;\n withoutRowid: boolean;\n strict: boolean;\n /** Clustered PK key string \u2192 row for WITHOUT ROWID tables. */\n clusteredRows: Map<string, Row>;\n /** Frozen columnar storage after snapshot hydrate; `rows` stays empty until materialized. */\n slab: ColumnarSlab | null = null;\n private scanCache: Row[] | null = null;\n /** Lazy covering hashes: column nameLower \u2192 serializeIndexKey \u2192 rowids. */\n private equalityHashes: Map<string, Map<string, Rowid[]>> | null = null;\n /** Cached maximum rowid. `undefined` means recompute after deleting the maximum. */\n private maximumRowid: Rowid | null | undefined = null;\n frozen = false;\n /** nameLower \u2192 column index; rebuilt after ALTER. */\n private colIndex = new Map<string, number>();\n\n constructor(name: string, columns: ColumnInfo[], options: TableOptions = {}) {\n this.name = name;\n this.columns = columns.map(cloneColumn);\n this.rows = new Map();\n this.nextRowid = 1;\n this.constraints = cloneAst(options.constraints ?? []);\n this.indexes = [...(options.indexes ?? [])];\n this.originalSql = options.originalSql ?? null;\n this.withoutRowid = options.withoutRowid ?? false;\n this.strict = options.strict ?? false;\n this.clusteredRows = new Map();\n this.scanCache = null;\n this.rebuildColIndex();\n }\n\n rebuildColIndex(): void {\n this.colIndex = new Map();\n for (let i = 0; i < this.columns.length; i++) {\n const column = this.columns[i]!;\n this.colIndex.set(column.nameLower ?? column.name.toLowerCase(), i);\n }\n }\n\n columnOffset(nameLower: string): number | undefined {\n return this.colIndex.get(nameLower);\n }\n\n hasColumn(nameLower: string): boolean {\n return this.colIndex.has(nameLower);\n }\n\n cell(row: Row, nameLower: string): SqlValue {\n const i = this.colIndex.get(nameLower);\n return i === undefined ? null : (row.values[i] ?? null);\n }\n\n setCell(row: Row, nameLower: string, value: SqlValue): void {\n const i = this.colIndex.get(nameLower);\n if (i === undefined) throw new SqliteError(`no such column: ${nameLower}`, \"no_such_column\");\n row.values[i] = value;\n }\n\n namedValues(row: Row): Map<string, SqlValue> {\n const map = new Map<string, SqlValue>();\n for (let i = 0; i < this.columns.length; i++) {\n const column = this.columns[i]!;\n map.set(column.nameLower ?? column.name.toLowerCase(), row.values[i] ?? null);\n }\n return map;\n }\n\n rowFromNamed(values: Map<string, SqlValue>, rowid: Rowid = 0): Row {\n const cells: SqlValue[] = [];\n for (const column of this.columns) {\n cells.push(values.get(normalizeColumnName(column.name)) ?? null);\n }\n return { rowid, values: cells };\n }\n\n integerPkColumn(): ColumnInfo | undefined {\n return this.integerPrimaryKeyAlias();\n }\n\n get(rowid: Rowid): Row | undefined {\n if (this.slab) {\n const hit = this.slab.get(rowid);\n return hit ?? undefined;\n }\n try {\n return this.rows.get(canonicalRowid(rowid));\n } catch {\n return undefined;\n }\n }\n\n /** Row count (slab-backed or map-backed). */\n rowCount(): number {\n return this.slab ? this.slab.rowCount : this.rows.size;\n }\n\n /** Rows sorted by rowid for snapshot encode. */\n sortedRows(): Row[] {\n if (this.slab) return [...this.slab.scan()].map((r) => ({ rowid: r.rowid, values: [...r.values] }));\n return [...this.rows.values()].sort((a, b) => compareRowids(a.rowid, b.rowid));\n }\n\n /** Attach decoded columnar slab (hydrate path). */\n attachSlab(slab: ColumnarSlab): void {\n this.slab = slab;\n this.invalidateScan();\n }\n\n /** Materialize slab into `rows` Map for mutation. */\n materializeSlab(): void {\n if (!this.slab) return;\n for (const row of this.slab.scan()) this.rows.set(row.rowid, { rowid: row.rowid, values: [...row.values] });\n this.slab = null;\n if (this.withoutRowid) this.rebuildClusteredRows();\n else this.invalidateScan();\n }\n\n private hasRow(rowid: Rowid): boolean {\n if (this.slab) return this.slab.get(rowid) !== undefined;\n try {\n return this.rows.has(canonicalRowid(rowid));\n } catch {\n return false;\n }\n }\n\n private allRowids(): Iterable<Rowid> {\n if (this.slab) return this.slab.rowids;\n return this.rows.keys();\n }\n\n getByKey(value: SqlValue): Row | undefined {\n if (value === null || this.withoutRowid) return undefined;\n try {\n return this.get(asRowid(value, \"rowid\"));\n } catch {\n return undefined;\n }\n }\n\n private invalidateScan(): void {\n this.scanCache = null;\n }\n\n private commitRow(row: Row): void {\n assertRowShape(this, row);\n this.indexEquality(row);\n this.invalidateScan();\n }\n\n private reindexEquality(before: Row, after: Row): void {\n this.unindexEquality(before);\n this.indexEquality(after);\n this.invalidateScan();\n }\n\n /** True when the table has no user constraints that DML must enforce beyond hidden rowid. */\n isUnconstrained(): boolean {\n if (this.withoutRowid || this.strict || this.indexes.length > 0 || this.constraints.length > 0) return false;\n for (const column of this.columns) {\n if (column.notNull || column.primaryKey || column.unique || column.generated || column.defaultExpr) return false;\n }\n return true;\n }\n\n /**\n * Point lookup via a write-maintained covering hash (not a schema index).\n * Returns null when the table is too small or the column does not exist.\n */\n lookupEquality(columnLower: string, value: SqlValue): Row[] | null {\n if (!this.ensureEqualityHash(columnLower)) return null;\n const map = this.equalityHashes!.get(columnLower);\n if (!map) return null;\n const column = this.columns.find((item) => item.nameLower === columnLower);\n const key = serializeIndexKey([normalizeForCollation(value, column?.collate ?? \"BINARY\")]);\n if (key === null) return [];\n const rowids = map.get(key);\n if (!rowids || rowids.length === 0) return [];\n const rows: Row[] = [];\n for (const rowid of rowids) {\n const row = this.get(rowid);\n if (row) rows.push(row);\n }\n return rows;\n }\n\n ensureEqualityHash(columnLower: string): boolean {\n if (this.frozen || this.rowCount() < EQUALITY_HASH_MIN_ROWS) return false;\n const column = this.columns.find((item) => item.nameLower === columnLower);\n if (!column) return false;\n this.equalityHashes ??= new Map();\n if (this.equalityHashes.has(columnLower)) return true;\n const map = new Map<string, Rowid[]>();\n const collate = column.collate ?? \"BINARY\";\n const iter = this.slab ? this.slab.scan() : this.rows.values();\n for (const row of iter) {\n const key = serializeIndexKey([normalizeForCollation(this.cell(row, columnLower), collate)]);\n if (key === null) continue;\n const bucket = map.get(key);\n if (bucket) bucket.push(row.rowid);\n else map.set(key, [row.rowid]);\n }\n this.equalityHashes.set(columnLower, map);\n return true;\n }\n\n clearEqualityHashes(): void {\n this.equalityHashes = null;\n }\n\n private indexEquality(row: Row): void {\n if (!this.equalityHashes) return;\n for (const [columnLower, map] of this.equalityHashes) {\n const column = this.columns.find((item) => item.nameLower === columnLower);\n const key = serializeIndexKey([normalizeForCollation(this.cell(row, columnLower), column?.collate ?? \"BINARY\")]);\n if (key === null) continue;\n const bucket = map.get(key);\n if (bucket) {\n if (!bucket.some((id) => sameRowid(id, row.rowid))) bucket.push(row.rowid);\n } else map.set(key, [row.rowid]);\n }\n }\n\n private unindexEquality(row: Row): void {\n if (!this.equalityHashes) return;\n for (const [columnLower, map] of this.equalityHashes) {\n const column = this.columns.find((item) => item.nameLower === columnLower);\n const key = serializeIndexKey([normalizeForCollation(this.cell(row, columnLower), column?.collate ?? \"BINARY\")]);\n if (key === null) continue;\n const bucket = map.get(key);\n if (!bucket) continue;\n const index = bucket.findIndex((id) => sameRowid(id, row.rowid));\n if (index >= 0) bucket.splice(index, 1);\n if (bucket.length === 0) map.delete(key);\n }\n }\n\n insert(input: InsertRow | RowValues, options?: InsertOptions): Rowid {\n this.assertMutable();\n const supplied = isInsertRow(input) ? input : { values: input };\n const values = this.cellsFromInput(supplied.values, options?.prepared === true);\n\n if (this.withoutRowid) {\n if (supplied.rowid !== undefined) {\n throw new SqliteError(`table ${this.name} has no column named rowid`, \"other\");\n }\n const rowid = canonicalRowid(this.allocateRowid());\n const candidate: Row = { rowid, values };\n if (!options?.skipValidate) this.validate(candidate);\n const clusterKey = this.makeClusterKey(values);\n if (this.clusteredRows.has(clusterKey)) {\n throw primaryKeyConflict(this.name, this.primaryKeyColumns());\n }\n this.clusteredRows.set(clusterKey, candidate);\n this.rows.set(rowid, candidate);\n this.advanceNextRowid(rowid);\n this.commitRow(candidate);\n return rowid;\n }\n\n const alias = this.integerPrimaryKeyAlias();\n let rowid = supplied.rowid;\n\n if (alias) {\n const value = this.cell({ rowid: 0, values }, normalizeColumnName(alias.name));\n if (rowid === undefined && value !== null) rowid = asRowid(value, alias.name);\n }\n rowid = canonicalRowid(rowid ?? this.allocateRowid());\n\n if (this.hasRow(rowid)) {\n throw new SqliteError(\n `UNIQUE constraint failed: ${this.name}.rowid`,\n \"constraint_primary\",\n \"SQLITE_CONSTRAINT_PRIMARYKEY\",\n );\n }\n if (alias) this.setCell({ rowid, values }, normalizeColumnName(alias.name), rowid);\n\n const candidate: Row = { rowid, values };\n if (!options?.skipValidate) this.validate(candidate);\n this.rows.set(rowid, candidate);\n this.advanceNextRowid(rowid);\n this.commitRow(candidate);\n return rowid;\n }\n\n update(rowid: Rowid, updates: RowValues): Row | undefined {\n this.assertMutable();\n const key = canonicalRowid(rowid);\n const existing = this.rows.get(key);\n if (!existing) return undefined;\n\n const values = existing.values.slice();\n const incoming = isValueArray(updates) ? updates : rowValues(updates);\n if (isValueArray(updates)) {\n for (let i = 0; i < updates.length && i < this.columns.length; i++) {\n const column = this.columns[i]!;\n values[i] = applyAffinity(cloneSqlValue(updates[i] ?? null), column.affinity);\n }\n } else {\n for (const [name, value] of incoming as Map<string, SqlValue>) {\n const column = this.column(name);\n const offset = this.columnOffset(normalizeColumnName(column.name));\n if (offset === undefined) continue;\n values[offset] = applyAffinity(cloneSqlValue(value), column.affinity);\n }\n }\n\n if (this.withoutRowid) {\n const oldClusterKey = this.makeClusterKey(existing.values);\n const newClusterKey = this.makeClusterKey(values);\n if (newClusterKey !== oldClusterKey && this.clusteredRows.has(newClusterKey)) {\n throw primaryKeyConflict(this.name, this.primaryKeyColumns());\n }\n const candidate: Row = { rowid: key, values };\n this.validate(candidate, key);\n if (newClusterKey !== oldClusterKey) this.clusteredRows.delete(oldClusterKey);\n this.clusteredRows.set(newClusterKey, candidate);\n this.rows.set(key, candidate);\n this.reindexEquality(existing, candidate);\n return candidate;\n }\n\n const alias = this.integerPrimaryKeyAlias();\n const aliasRow: Row = { rowid: key, values };\n const targetKey = alias ? asRowid(this.cell(aliasRow, normalizeColumnName(alias.name)), alias.name) : key;\n if (targetKey !== key && this.hasRow(targetKey)) {\n throw new SqliteError(\n `UNIQUE constraint failed: ${this.name}.${alias?.name ?? \"rowid\"}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n if (alias) this.setCell(aliasRow, normalizeColumnName(alias.name), targetKey);\n const candidate: Row = { rowid: targetKey, values };\n this.validate(candidate, key);\n if (targetKey !== key) {\n this.rows.delete(key);\n if (this.maximumRowid !== null && this.maximumRowid !== undefined && sameRowid(key, this.maximumRowid)) {\n this.maximumRowid = undefined;\n }\n }\n this.rows.set(targetKey, candidate);\n this.advanceNextRowid(targetKey);\n this.reindexEquality(existing, candidate);\n return candidate;\n }\n\n delete(rowid: Rowid): boolean {\n this.assertMutable();\n const key = canonicalRowid(rowid);\n const existing = this.rows.get(key);\n if (!existing) return false;\n if (this.withoutRowid) this.clusteredRows.delete(this.makeClusterKey(existing.values));\n this.unindexEquality(existing);\n this.invalidateScan();\n if (this.maximumRowid !== null && this.maximumRowid !== undefined && sameRowid(key, this.maximumRowid)) {\n this.maximumRowid = undefined;\n }\n return this.rows.delete(key);\n }\n\n *scan(): Iterable<Row> {\n if (this.slab) {\n yield* this.slab.scan();\n return;\n }\n if (!this.scanCache) {\n if (this.withoutRowid) {\n this.scanCache = [...this.clusteredRows.values()].sort((a, b) => this.comparePrimaryKeys(a, b));\n } else {\n this.scanCache = [...this.rows.values()].sort((a, b) => compareRowids(a.rowid, b.rowid));\n }\n }\n yield* this.scanCache;\n }\n\n clone(): Table {\n const copy = new Table(this.name, this.columns, {\n constraints: this.constraints,\n indexes: this.indexes,\n originalSql: this.originalSql,\n withoutRowid: this.withoutRowid,\n strict: this.strict,\n });\n copy.nextRowid = this.nextRowid;\n copy.maximumRowid = this.maximumRowid;\n if (this.slab) {\n for (const row of this.slab.scan()) copy.rows.set(row.rowid, row);\n } else {\n for (const [rowid, row] of this.rows) copy.rows.set(rowid, row);\n }\n for (const [clusterKey, row] of this.clusteredRows) copy.clusteredRows.set(clusterKey, row);\n return copy;\n }\n\n freeze(): void {\n this.frozen = true;\n }\n\n private assertMutable(): void {\n if (this.frozen) throw new SqliteError(\"internal: cannot mutate a frozen table\", \"other\");\n if (this.slab) this.materializeSlab();\n }\n\n /** Rebuild clustered storage after snapshot decode or bulk load. */\n rebuildClusteredRows(): void {\n this.maximumRowid = undefined;\n if (!this.withoutRowid) return;\n this.clusteredRows.clear();\n const iter = this.slab ? this.slab.scan() : this.rows.values();\n for (const row of iter) {\n this.clusteredRows.set(this.makeClusterKey(row.values), row);\n }\n this.invalidateScan();\n this.clearEqualityHashes();\n }\n\n private cellsFromInput(input: RowValues, prepared: boolean): SqlValue[] {\n if (isValueArray(input)) {\n if (prepared && input.length === this.columns.length) return [...input];\n return this.prepareValues(namedFromArray(this, input));\n }\n if (prepared) {\n const named = rowValues(input);\n const cells: SqlValue[] = [];\n for (const column of this.columns) cells.push(named.get(normalizeColumnName(column.name)) ?? null);\n return cells;\n }\n return this.prepareValues(input);\n }\n\n private prepareValues(input: NamedRowValues): SqlValue[] {\n const supplied = rowValues(input);\n for (const name of supplied.keys()) this.column(name);\n\n const result: SqlValue[] = [];\n for (const column of this.columns) {\n const key = normalizeColumnName(column.name);\n const raw = cloneSqlValue(supplied.get(key) ?? null);\n const affined = applyAffinity(raw, column.affinity);\n result.push(this.strict ? applyStrictValue(affined, column.typeName ?? \"\", this.name, column.name) : affined);\n }\n return result;\n }\n\n private column(name: string): ColumnInfo {\n const key = normalizeColumnName(name);\n const column = this.columns.find((item) => normalizeColumnName(item.name) === key);\n if (!column) throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n return column;\n }\n\n private validate(row: Row, excludedRowid?: Rowid): void {\n for (let i = 0; i < this.columns.length; i++) {\n const column = this.columns[i]!;\n const value = row.values[i] ?? null;\n if ((column.notNull || column.primaryKey) && value === null) {\n const category = column.primaryKey ? \"constraint_primary\" : \"constraint_notnull\";\n const code = column.primaryKey ? \"SQLITE_CONSTRAINT_PRIMARYKEY\" : \"SQLITE_CONSTRAINT_NOTNULL\";\n throw new SqliteError(\n `${column.primaryKey ? \"PRIMARY KEY\" : \"NOT NULL\"} constraint failed: ${this.name}.${column.name}`,\n category,\n code,\n );\n }\n }\n\n const uniqueSets = this.uniqueColumnSets();\n if (this.indexes.length === 0) {\n for (const names of uniqueSets) {\n const values = names.map((name) => this.cell(row, normalizeColumnName(name)));\n if (values.some((value) => value === null)) continue;\n for (const other of this.rows.values()) {\n if (excludedRowid !== undefined && other.rowid === excludedRowid) continue;\n if (\n values.every((value, index) => {\n const column = this.column(names[index]!);\n const otherValue = this.cell(other, normalizeColumnName(names[index]!));\n const collation = column.collate ?? \"BINARY\";\n return compareWithCollation(value, otherValue, collation) === 0;\n })\n ) {\n const qualified = names.map((name) => `${this.name}.${name}`).join(\", \");\n throw new SqliteError(\n `UNIQUE constraint failed: ${qualified}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n }\n }\n } else if (uniqueSets.length > 0) {\n // Indexes exist: uniqueness is enforced by IndexStore on addIndexes / conflict checks.\n }\n }\n\n private uniqueColumnSets(): string[][] {\n const sets = this.columns.filter((column) => column.unique).map((column) => [column.name]);\n if (!this.constraints.some((constraint) => constraint.type === \"primary_key\")) {\n const primary = this.columns.filter((column) => column.primaryKey).map((column) => column.name);\n if (primary.length > 0) sets.push(primary);\n }\n for (const constraint of this.constraints) {\n if (constraint.type === \"unique\" || constraint.type === \"primary_key\") {\n sets.push(constraint.columns.map((column) => column.name));\n }\n }\n return sets;\n }\n\n private primaryKeyColumns(): ColumnInfo[] {\n const tablePrimary = this.constraints.find((constraint) => constraint.type === \"primary_key\");\n if (tablePrimary) {\n return tablePrimary.columns.map((column) => this.column(column.name));\n }\n return this.columns.filter((column) => column.primaryKey);\n }\n\n private makeClusterKey(values: readonly SqlValue[]): string {\n return this.primaryKeyColumns()\n .map((column) => {\n const offset = this.columnOffset(normalizeColumnName(column.name)) ?? 0;\n const value = values[offset] ?? null;\n const normalized = normalizeForCollation(value, column.collate ?? \"BINARY\");\n return serializePkComponent(normalized);\n })\n .join(\"\\0\");\n }\n\n private comparePrimaryKeys(left: Row, right: Row): number {\n for (const column of this.primaryKeyColumns()) {\n const key = normalizeColumnName(column.name);\n const leftValue = this.cell(left, key);\n const rightValue = this.cell(right, key);\n const comparison = column.collate\n ? compareWithCollation(leftValue, rightValue, column.collate)\n : compareSql(leftValue, rightValue);\n if (comparison !== 0) return comparison ?? 0;\n }\n return 0;\n }\n\n private integerPrimaryKeyAlias(): ColumnInfo | undefined {\n if (this.withoutRowid) return undefined;\n const primary = this.columns.filter((column) => column.primaryKey);\n if (primary.length !== 1 || primary[0]!.typeName?.trim().toUpperCase() !== \"INTEGER\") return undefined;\n return primary[0];\n }\n\n private allocateRowid(): Rowid {\n if (!this.columns.some((column) => column.autoincrement)) {\n if (this.maximumRowid === undefined) {\n this.maximumRowid = null;\n for (const rowid of this.allRowids()) {\n if (this.maximumRowid === null || compareRowids(rowid, this.maximumRowid) > 0) this.maximumRowid = rowid;\n }\n } else if (this.maximumRowid === null && this.rowCount() > 0) {\n for (const rowid of this.allRowids()) {\n if (this.maximumRowid === null || compareRowids(rowid, this.maximumRowid) > 0) this.maximumRowid = rowid;\n }\n }\n return this.maximumRowid === null ? 1 : incrementRowid(this.maximumRowid);\n }\n const maxSigned = 9223372036854775807n;\n let candidate = canonicalRowid(this.nextRowid);\n while (this.hasRow(candidate)) {\n if (BigInt(candidate) >= maxSigned) {\n throw new SqliteError(\"database or disk is full\", \"other\", \"SQLITE_FULL\");\n }\n candidate = incrementRowid(candidate);\n }\n if (BigInt(candidate) > maxSigned) {\n throw new SqliteError(\"database or disk is full\", \"other\", \"SQLITE_FULL\");\n }\n return candidate;\n }\n\n private advanceNextRowid(rowid: Rowid): void {\n if (\n this.maximumRowid === null ||\n (this.maximumRowid !== undefined && compareRowids(rowid, this.maximumRowid) > 0)\n ) {\n this.maximumRowid = rowid;\n }\n if (compareRowids(rowid, this.nextRowid) >= 0) this.nextRowid = incrementRowid(rowid);\n }\n}\n\nexport function makeColumnInfo(\n name: string,\n typeName: string | null,\n options: Partial<Omit<ColumnInfo, \"name\" | \"nameLower\" | \"typeName\" | \"affinity\">> = {},\n): ColumnInfo {\n return {\n name,\n nameLower: name.toLowerCase(),\n typeName,\n affinity: affinityFromTypeName(typeName),\n notNull: options.notNull ?? false,\n primaryKey: options.primaryKey ?? false,\n autoincrement: options.autoincrement ?? false,\n defaultExpr: options.defaultExpr ?? null,\n unique: options.unique ?? false,\n collate: options.collate ?? null,\n generated: options.generated ?? null,\n };\n}\n\nfunction cloneColumn(column: ColumnInfo): ColumnInfo {\n return {\n ...column,\n nameLower: column.nameLower ?? column.name.toLowerCase(),\n defaultExpr: column.defaultExpr === null ? null : cloneAst(column.defaultExpr),\n generated:\n column.generated === null ? null : { expr: cloneAst(column.generated.expr), stored: column.generated.stored },\n };\n}\n\nfunction cloneAst<T>(value: T): T {\n return structuredClone(value);\n}\n\nfunction isInsertRow(input: InsertRow | RowValues): input is InsertRow {\n return (\n typeof input === \"object\" && input !== null && !Array.isArray(input) && !(input instanceof Map) && \"values\" in input\n );\n}\n\nfunction namedFromArray(table: Table, values: readonly SqlValue[]): Map<string, SqlValue> {\n const named = new Map<string, SqlValue>();\n for (let i = 0; i < table.columns.length; i++) {\n named.set(normalizeColumnName(table.columns[i]!.name), values[i] ?? null);\n }\n return named;\n}\n\nfunction asRowid(value: SqlValue, column: string): Rowid {\n if (typeof value === \"bigint\") return canonicalRowid(value);\n if (typeof value === \"number\" && Number.isSafeInteger(value)) return value;\n throw new SqliteError(\n `datatype mismatch for INTEGER PRIMARY KEY column: ${column}`,\n \"datatype_mismatch\",\n \"SQLITE_MISMATCH\",\n );\n}\n\nfunction canonicalRowid(value: Rowid): Rowid {\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value))\n throw new SqliteError(\"rowid must be a safe integer or bigint\", \"datatype_mismatch\", \"SQLITE_MISMATCH\");\n return value;\n }\n if (value <= BigInt(Number.MAX_SAFE_INTEGER) && value >= BigInt(Number.MIN_SAFE_INTEGER)) return Number(value);\n return value;\n}\n\nfunction incrementRowid(value: Rowid): Rowid {\n if (typeof value === \"bigint\") return value + 1n;\n if (value < Number.MAX_SAFE_INTEGER) return value + 1;\n return BigInt(value) + 1n;\n}\n\nfunction compareRowids(left: Rowid, right: Rowid): number {\n const a = typeof left === \"bigint\" ? left : BigInt(left);\n const b = typeof right === \"bigint\" ? right : BigInt(right);\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction sameRowid(left: Rowid, right: Rowid): boolean {\n return typeof left === \"bigint\" || typeof right === \"bigint\" ? BigInt(left) === BigInt(right) : left === right;\n}\n\nfunction serializePkComponent(value: SqlValue): string {\n if (value === null) return \"\\0n\";\n if (typeof value === \"bigint\") return `\\0b:${value.toString()}`;\n if (typeof value === \"number\") return `\\0i:${value}`;\n if (typeof value === \"string\") return `\\0s:${value}`;\n if (value instanceof Uint8Array) return `\\0x:${Array.from(value).join(\",\")}`;\n return `\\0r:${value.value}`;\n}\n\nfunction primaryKeyConflict(tableName: string, columns: ColumnInfo[]): never {\n const qualified = columns.map((column) => `${tableName}.${column.name}`).join(\", \");\n throw new SqliteError(`UNIQUE constraint failed: ${qualified}`, \"constraint_primary\", \"SQLITE_CONSTRAINT_PRIMARYKEY\");\n}\n", "import type {\n CreateIndexStmt,\n CreateTableStmt,\n CreateViewStmt,\n CreateVirtualTableStmt,\n Expr,\n IndexedColumn,\n SelectStmt,\n} from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { IndexStore } from \"../indexes/index.ts\";\nimport { isStrictTypeName, unknownStrictType } from \"../types/strict.ts\";\nimport { affinityFromTypeName } from \"../types/value.ts\";\nimport { Fts5VirtualTable } from \"../vtable/fts5.ts\";\nimport {\n BytecodeVirtualTable,\n DbStatVirtualTable,\n FtsVocabVirtualTable,\n RTreeVirtualTable,\n TablesUsedVirtualTable,\n} from \"../vtable/modules.ts\";\nimport type { Rowid } from \"./row.ts\";\nimport type { ColumnInfo } from \"./table.ts\";\nimport { Table } from \"./table.ts\";\n\nexport type AnyVirtualTable =\n | Fts5VirtualTable\n | RTreeVirtualTable\n | DbStatVirtualTable\n | BytecodeVirtualTable\n | TablesUsedVirtualTable\n | FtsVocabVirtualTable;\n\nexport interface ViewInfo {\n name: string;\n columns: string[] | null;\n select: SelectStmt;\n originalSql: string | null;\n}\n\nexport interface IndexInfo {\n name: string;\n tableName: string;\n unique: boolean;\n columns: IndexedColumn[];\n where: Expr | null;\n originalSql: string | null;\n store: IndexStore;\n}\n\nexport interface TriggerInfo {\n name: string;\n tableName: string;\n timing: \"BEFORE\" | \"AFTER\" | \"INSTEAD\";\n event: \"INSERT\" | \"UPDATE\" | \"DELETE\";\n when: Expr | null;\n forEachRow: boolean;\n /** Statements in the trigger body (already parsed). */\n body: import(\"../ast/nodes.ts\").Statement[];\n updateColumns: string[] | null;\n originalSql: string | null;\n}\n\n/** In-memory catalog: tables, indexes, views, triggers, and mutation counters. */\nexport class DatabaseState {\n tables = new Map<string, Table>();\n virtualTables = new Map<string, AnyVirtualTable>();\n views = new Map<string, ViewInfo>();\n indexes = new Map<string, IndexInfo>();\n triggers = new Map<string, TriggerInfo>();\n /** Attached databases: schema name \u2192 state + filename label. */\n attached = new Map<string, { state: DatabaseState; filename: string }>();\n lastInsertRowid: Rowid = 0;\n changes = 0;\n totalChanges = 0;\n foreignKeysEnabled = false;\n /** When true, LIKE / like() are case-sensitive (SQLite `PRAGMA case_sensitive_like`). */\n caseSensitiveLike = false;\n schemaVersion = 0;\n userVersion = 0;\n\n databaseForSchema(schema: string | null, qualifiedForError?: string): DatabaseState {\n if (schema === null || schema.toLowerCase() === \"main\" || schema.toLowerCase() === \"temp\") return this;\n const entry = this.attached.get(schema.toLowerCase());\n if (!entry) {\n throw new SqliteError(`no such table: ${qualifiedForError ?? schema}`, \"no_such_table\");\n }\n return entry.state;\n }\n\n databaseForTable(table: Table): DatabaseState {\n if (this.tables.get(keyOf(table.name)) === table) return this;\n for (const { state } of this.attached.values()) {\n if (state.tables.get(keyOf(table.name)) === table) return state;\n }\n return this;\n }\n\n getTable(name: string): Table {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).getTable(bare);\n }\n const key = keyOf(bare);\n if (this.virtualTables.has(key)) {\n throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n }\n const table = this.tables.get(key);\n if (!table) throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n return table;\n }\n\n getVirtualTable(name: string): Fts5VirtualTable {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).getVirtualTable(bare);\n }\n const key = keyOf(bare);\n const table = this.virtualTables.get(key);\n if (!table || (table.kind !== \"fts5\" && table.kind !== \"fts3\" && table.kind !== \"fts4\")) {\n throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n }\n return table;\n }\n\n getAnyVirtualTable(name: string): AnyVirtualTable {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).getAnyVirtualTable(bare);\n }\n const key = keyOf(bare);\n const table = this.virtualTables.get(key);\n if (!table) throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n return table;\n }\n\n isVirtualTable(name: string): boolean {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).isVirtualTable(bare);\n }\n return this.virtualTables.has(keyOf(bare));\n }\n\n isFtsTable(name: string): boolean {\n const table = this.virtualTables.get(keyOf(splitQualifiedName(name).bare));\n return !!table && (table.kind === \"fts5\" || table.kind === \"fts3\" || table.kind === \"fts4\");\n }\n\n createVirtualTable(stmt: CreateVirtualTableStmt, originalSql: string | null = null): AnyVirtualTable {\n const { schema, bare } = splitQualifiedName(stmt.name);\n // temp schema is the same DatabaseState (in-memory); not an ATTACH slot.\n if (schema !== null && schema.toLowerCase() !== \"temp\" && schema.toLowerCase() !== \"main\") {\n return this.databaseForSchema(schema, stmt.name).createVirtualTable({ ...stmt, name: bare }, originalSql);\n }\n const key = keyOf(bare);\n const existing = this.virtualTables.get(key);\n if (existing && stmt.ifNotExists) return existing;\n this.assertSchemaNameAvailable(bare);\n const module = stmt.module.toLowerCase();\n let table: AnyVirtualTable;\n if (module === \"fts5\" || module === \"fts3\" || module === \"fts4\") {\n table = new Fts5VirtualTable(bare, stmt.moduleArgs, originalSql, module);\n } else if (module === \"fts5vocab\") {\n table = new FtsVocabVirtualTable(bare, stmt.moduleArgs, originalSql);\n } else if (module === \"fts3tokenize\" || module === \"fts4aux\") {\n // Tokenize/aux modules: expose as empty FTS-like single-column tables for CREATE success.\n table = new Fts5VirtualTable(bare, stmt.moduleArgs.length ? stmt.moduleArgs : [\"token\"], originalSql, \"fts3\");\n } else if (module === \"rtree\" || module === \"rtree_i32\") {\n table = new RTreeVirtualTable(bare, stmt.moduleArgs, module === \"rtree_i32\", originalSql);\n } else if (module === \"dbstat\") {\n table = new DbStatVirtualTable(bare, stmt.moduleArgs[0] ?? null, originalSql);\n } else if (module === \"bytecode\") {\n table = new BytecodeVirtualTable(bare, originalSql);\n } else if (module === \"tables_used\") {\n table = new TablesUsedVirtualTable(bare, originalSql);\n } else {\n throw new SqliteError(`unknown module: ${stmt.module}`, \"unsupported\");\n }\n this.virtualTables.set(key, table);\n this.schemaVersion++;\n return table;\n }\n\n createTable(stmt: CreateTableStmt, originalSql: string | null = null): Table {\n const { schema, bare } = splitQualifiedName(stmt.name);\n if (schema !== null) {\n return this.databaseForSchema(schema, stmt.name).createTable({ ...stmt, name: bare }, originalSql);\n }\n const key = keyOf(bare);\n const existing = this.tables.get(key);\n if (existing && stmt.ifNotExists) return existing;\n this.assertSchemaNameAvailable(bare);\n\n const seenColumns = new Set<string>();\n const tablePrimaryNames = new Set(\n stmt.constraints\n .filter((constraint) => constraint.type === \"primary_key\")\n .flatMap((constraint) => constraint.columns.map((column) => keyOf(column.name))),\n );\n if (stmt.constraints.filter((constraint) => constraint.type === \"primary_key\").length > 1) {\n throw new SqliteError(\"table has more than one primary key\", \"constraint_primary\");\n }\n const columnPrimaryCount = stmt.columns.filter((column) =>\n column.constraints.some((constraint) => constraint.type === \"primary_key\"),\n ).length;\n if (columnPrimaryCount > 1) {\n throw new SqliteError(\"table has more than one primary key\", \"constraint_primary\");\n }\n\n const columns: ColumnInfo[] = stmt.columns.map((definition) => {\n const columnKey = keyOf(definition.name);\n if (seenColumns.has(columnKey)) throw new SqliteError(`duplicate column name: ${definition.name}`, \"other\");\n seenColumns.add(columnKey);\n\n const primary = definition.constraints.find((constraint) => constraint.type === \"primary_key\");\n const primaryKey = primary !== undefined || tablePrimaryNames.has(columnKey);\n const autoincrement = primary?.type === \"primary_key\" && primary.autoincrement;\n if (autoincrement && definition.typeName?.trim().toUpperCase() !== \"INTEGER\") {\n throw new SqliteError(\"AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY\", \"unsupported\");\n }\n const collateConstraint = definition.constraints.find((constraint) => constraint.type === \"collate\");\n const generatedConstraint = definition.constraints.find((constraint) => constraint.type === \"generated\");\n\n return {\n name: definition.name,\n typeName: definition.typeName,\n affinity: affinityFromTypeName(definition.typeName),\n notNull: definition.constraints.some((constraint) => constraint.type === \"not_null\"),\n primaryKey,\n autoincrement,\n defaultExpr: definition.constraints.find((constraint) => constraint.type === \"default\")?.expr ?? null,\n unique: definition.constraints.some((constraint) => constraint.type === \"unique\"),\n collate: collateConstraint?.type === \"collate\" ? collateConstraint.name : null,\n generated:\n generatedConstraint?.type === \"generated\"\n ? { expr: generatedConstraint.expr, stored: generatedConstraint.stored }\n : null,\n };\n });\n\n for (const constraint of stmt.constraints) {\n const localNames =\n constraint.type === \"primary_key\" || constraint.type === \"unique\"\n ? constraint.columns.map((column) => column.name)\n : constraint.type === \"foreign_key\"\n ? constraint.columns\n : [];\n for (const name of localNames) {\n if (!seenColumns.has(keyOf(name))) throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n }\n }\n const hasColumnPrimary = stmt.columns.some((column) =>\n column.constraints.some((constraint) => constraint.type === \"primary_key\"),\n );\n if (hasColumnPrimary && tablePrimaryNames.size > 0) {\n throw new SqliteError(\"table has more than one primary key\", \"constraint_primary\");\n }\n if (stmt.columns.length === 0) {\n throw new SqliteError(\"table must have at least one column\", \"syntax\");\n }\n if (stmt.strict) {\n for (const definition of stmt.columns) {\n const typeName = definition.typeName?.trim() ?? \"\";\n if (!isStrictTypeName(typeName)) unknownStrictType(bare, definition.name, typeName || \"null\");\n }\n }\n\n const normalizedConstraints = [...stmt.constraints];\n for (const definition of stmt.columns) {\n for (const constraint of definition.constraints) {\n if (constraint.type === \"check\") {\n normalizedConstraints.push({ type: \"check\", expr: constraint.expr, name: null });\n } else if (constraint.type === \"references\") {\n normalizedConstraints.push({\n type: \"foreign_key\",\n columns: [definition.name],\n refTable: constraint.table,\n refColumns: constraint.columns,\n onDelete: constraint.onDelete,\n onUpdate: constraint.onUpdate,\n match: constraint.match,\n name: null,\n deferrable: constraint.deferrable,\n initiallyDeferred: constraint.initiallyDeferred,\n });\n }\n }\n }\n const table = new Table(bare, columns, {\n constraints: normalizedConstraints,\n originalSql,\n withoutRowid: stmt.withoutRowid,\n strict: stmt.strict,\n });\n if (stmt.withoutRowid) {\n const pk = columns.filter((column) => column.primaryKey);\n if (pk.length === 0) {\n throw new SqliteError(\"PRIMARY KEY missing on table \" + bare, \"other\");\n }\n }\n this.tables.set(key, table);\n this.createAutoIndexesForTable(table);\n this.schemaVersion++;\n return table;\n }\n\n /**\n * SQLite-like autoindexes for PRIMARY KEY / UNIQUE so lookups and uniqueness\n * checks can use IndexStore. Skips single-column INTEGER PRIMARY KEY (rowid alias).\n */\n private createAutoIndexesForTable(table: Table): void {\n let seq = 1;\n const add = (columns: IndexedColumn[], unique: boolean): void => {\n if (columns.length === 0) return;\n // INTEGER PRIMARY KEY is the rowid map \u2014 no secondary autoindex.\n if (\n unique &&\n columns.length === 1 &&\n !table.withoutRowid &&\n table.integerPkColumn()?.name.toLowerCase() === columns[0]!.name.toLowerCase()\n ) {\n return;\n }\n const name = `sqlite_autoindex_${table.name}_${seq++}`;\n const index: IndexInfo = {\n name,\n tableName: table.name,\n unique,\n columns: structuredClone(columns),\n where: null,\n originalSql: null,\n store: new IndexStore(name),\n };\n this.indexes.set(keyOf(name), index);\n table.indexes.push(index.name);\n };\n\n const hasTablePrimary = table.constraints.some((constraint) => constraint.type === \"primary_key\");\n for (const column of table.columns) {\n if (column.unique) {\n add([{ name: column.name, collate: column.collate, order: null }], true);\n }\n if (column.primaryKey && !hasTablePrimary) {\n add([{ name: column.name, collate: column.collate, order: null }], true);\n }\n }\n for (const constraint of table.constraints) {\n if (constraint.type === \"primary_key\" || constraint.type === \"unique\") {\n add(constraint.columns, true);\n }\n }\n }\n\n dropTable(name: string, ifExists = false): boolean {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).dropTable(bare, ifExists);\n }\n const key = keyOf(bare);\n const table = this.tables.get(key);\n const virtual = this.virtualTables.get(key);\n if (!table && !virtual) {\n if (ifExists) return false;\n throw new SqliteError(`no such table: ${name}`, \"no_such_table\");\n }\n if (virtual) {\n this.virtualTables.delete(key);\n this.schemaVersion++;\n return true;\n }\n for (const [indexKey, index] of this.indexes) {\n if (keyOf(index.tableName) === key) this.indexes.delete(indexKey);\n }\n this.dropTriggersForTable(bare);\n this.tables.delete(key);\n this.schemaVersion++;\n return true;\n }\n\n renameTable(oldName: string, newName: string): Table {\n const { schema: oldSchema, bare: oldBare } = splitQualifiedName(oldName);\n if (oldSchema !== null) {\n return this.databaseForSchema(oldSchema, oldName).renameTable(oldBare, splitQualifiedName(newName).bare);\n }\n const oldKey = keyOf(oldBare);\n const table = this.getWritableTable(oldName);\n const { schema: newSchema, bare: newBare } = splitQualifiedName(newName);\n if (newSchema !== null) {\n throw new SqliteError(`no such table: ${newName}`, \"no_such_table\");\n }\n this.assertSchemaNameAvailable(newBare);\n this.tables.delete(oldKey);\n table.name = newBare;\n this.tables.set(keyOf(newBare), table);\n for (const index of [...this.indexes.values()]) {\n if (keyOf(index.tableName) !== oldKey) continue;\n this.ensureWritableIndex(index).tableName = newBare;\n }\n for (const [key, trigger] of this.triggers) {\n if (keyOf(trigger.tableName) !== oldKey) continue;\n this.triggers.set(key, { ...trigger, tableName: newBare });\n }\n this.schemaVersion++;\n return table;\n }\n\n createView(stmt: CreateViewStmt, originalSql: string | null = null): ViewInfo {\n const { schema, bare } = splitQualifiedName(stmt.name);\n if (schema !== null) {\n return this.databaseForSchema(schema, stmt.name).createView({ ...stmt, name: bare }, originalSql);\n }\n const key = keyOf(bare);\n const existing = this.views.get(key);\n if (existing && stmt.ifNotExists) return existing;\n this.assertSchemaNameAvailable(bare);\n const view: ViewInfo = {\n name: bare,\n columns: stmt.columns ? [...stmt.columns] : null,\n select: structuredClone(stmt.select),\n originalSql,\n };\n this.views.set(key, view);\n this.schemaVersion++;\n return view;\n }\n\n dropView(name: string, ifExists = false): boolean {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).dropView(bare, ifExists);\n }\n const deleted = this.views.delete(keyOf(bare));\n if (!deleted && !ifExists) throw new SqliteError(`no such view: ${name}`, \"other\");\n if (deleted) this.schemaVersion++;\n return deleted;\n }\n\n createIndex(stmt: CreateIndexStmt, originalSql: string | null = null): IndexInfo {\n const table = this.getWritableTable(stmt.table);\n const { schema, bare } = splitQualifiedName(stmt.name);\n const target = schema !== null ? this.databaseForSchema(schema, stmt.name) : this.databaseForTable(table);\n const key = keyOf(bare);\n const existing = target.indexes.get(key);\n if (existing && stmt.ifNotExists) return existing;\n target.assertSchemaNameAvailable(bare);\n for (const indexed of stmt.columns) {\n if (indexed.expr) continue;\n if (!table.columns.some((column) => keyOf(column.name) === keyOf(indexed.name))) {\n throw new SqliteError(`no such column: ${indexed.name}`, \"no_such_column\");\n }\n }\n const index: IndexInfo = {\n name: bare,\n tableName: table.name,\n unique: stmt.unique,\n columns: structuredClone(stmt.columns),\n where: stmt.where ? structuredClone(stmt.where) : null,\n originalSql,\n store: new IndexStore(bare),\n };\n target.indexes.set(key, index);\n table.indexes.push(index.name);\n target.schemaVersion++;\n return index;\n }\n\n dropIndex(name: string, ifExists = false): boolean {\n const { schema, bare } = splitQualifiedName(name);\n const target = schema !== null ? this.databaseForSchema(schema, name) : this;\n const key = keyOf(bare);\n const index = target.indexes.get(key);\n if (!index) {\n if (ifExists) return false;\n throw new SqliteError(`no such index: ${name}`, \"other\");\n }\n target.indexes.delete(key);\n const table = target.tables.get(keyOf(index.tableName));\n if (table) {\n const writable = target.ensureWritableTable(table);\n writable.indexes = writable.indexes.filter((item) => keyOf(item) !== key);\n }\n target.schemaVersion++;\n return true;\n }\n\n createTrigger(info: TriggerInfo): TriggerInfo {\n const { schema, bare } = splitQualifiedName(info.name);\n const target = schema !== null ? this.databaseForSchema(schema, info.name) : this;\n const key = keyOf(bare);\n target.assertSchemaNameAvailable(bare);\n const trigger: TriggerInfo = {\n ...info,\n name: bare,\n body: structuredClone(info.body),\n when: info.when ? structuredClone(info.when) : null,\n updateColumns: info.updateColumns ? [...info.updateColumns] : null,\n };\n target.triggers.set(key, trigger);\n target.schemaVersion++;\n return trigger;\n }\n\n dropTrigger(name: string, ifExists = false): boolean {\n const { schema, bare } = splitQualifiedName(name);\n const target = schema !== null ? this.databaseForSchema(schema, name) : this;\n const key = keyOf(bare);\n const deleted = target.triggers.delete(key);\n if (!deleted && !ifExists) throw new SqliteError(`no such trigger: ${name}`, \"other\");\n if (deleted) target.schemaVersion++;\n return deleted;\n }\n\n dropTriggersForTable(tableName: string): void {\n const key = keyOf(tableName);\n for (const [triggerKey, trigger] of this.triggers) {\n if (keyOf(trigger.tableName) === key) this.triggers.delete(triggerKey);\n }\n }\n\n recordChange(count: number, lastInsertRowid?: Rowid): void {\n this.changes = count;\n this.totalChanges += count;\n if (lastInsertRowid !== undefined) this.lastInsertRowid = lastInsertRowid;\n }\n\n clone(): DatabaseState {\n const copy = new DatabaseState();\n for (const [key, table] of this.tables) copy.tables.set(key, table.clone());\n for (const [key, table] of this.virtualTables) copy.virtualTables.set(key, table.clone());\n for (const [key, view] of this.views) {\n copy.views.set(key, {\n name: view.name,\n columns: view.columns ? [...view.columns] : null,\n select: structuredClone(view.select),\n originalSql: view.originalSql,\n });\n }\n for (const [key, index] of this.indexes) {\n copy.indexes.set(key, {\n name: index.name,\n tableName: index.tableName,\n unique: index.unique,\n columns: structuredClone(index.columns),\n where: index.where ? structuredClone(index.where) : null,\n originalSql: index.originalSql,\n store: index.store.clone(),\n });\n }\n for (const [key, trigger] of this.triggers) {\n copy.triggers.set(key, {\n name: trigger.name,\n tableName: trigger.tableName,\n timing: trigger.timing,\n event: trigger.event,\n when: trigger.when ? structuredClone(trigger.when) : null,\n forEachRow: trigger.forEachRow,\n body: structuredClone(trigger.body),\n updateColumns: trigger.updateColumns ? [...trigger.updateColumns] : null,\n originalSql: trigger.originalSql,\n });\n }\n for (const [name, attached] of this.attached) {\n copy.attached.set(name, { state: attached.state.clone(), filename: attached.filename });\n }\n copy.lastInsertRowid = this.lastInsertRowid;\n copy.changes = this.changes;\n copy.totalChanges = this.totalChanges;\n copy.foreignKeysEnabled = this.foreignKeysEnabled;\n copy.caseSensitiveLike = this.caseSensitiveLike;\n copy.schemaVersion = this.schemaVersion;\n copy.userVersion = this.userVersion;\n return copy;\n }\n\n /** Share table/index objects with the live state. Callers must freeze first. */\n cloneShallow(): DatabaseState {\n const copy = new DatabaseState();\n copy.tables = new Map(this.tables);\n for (const [key, table] of this.virtualTables) copy.virtualTables.set(key, table.clone());\n copy.views = new Map(this.views);\n copy.indexes = new Map(this.indexes);\n copy.triggers = new Map(this.triggers);\n for (const [name, attached] of this.attached) {\n copy.attached.set(name, { state: attached.state.cloneShallow(), filename: attached.filename });\n }\n copy.lastInsertRowid = this.lastInsertRowid;\n copy.changes = this.changes;\n copy.totalChanges = this.totalChanges;\n copy.foreignKeysEnabled = this.foreignKeysEnabled;\n copy.caseSensitiveLike = this.caseSensitiveLike;\n copy.schemaVersion = this.schemaVersion;\n copy.userVersion = this.userVersion;\n return copy;\n }\n\n freezeShared(): void {\n for (const table of this.tables.values()) table.freeze();\n for (const index of this.indexes.values()) index.store.freeze();\n for (const attached of this.attached.values()) attached.state.freezeShared();\n }\n\n thawShared(): void {\n for (const table of this.tables.values()) table.frozen = false;\n for (const index of this.indexes.values()) index.store.frozen = false;\n for (const attached of this.attached.values()) attached.state.thawShared();\n }\n\n getWritableTable(name: string): Table {\n const { schema, bare } = splitQualifiedName(name);\n if (schema !== null) {\n return this.databaseForSchema(schema, name).getWritableTable(bare);\n }\n const table = this.getTable(bare);\n return this.ensureWritableTable(table);\n }\n\n ensureWritableTable(table: Table): Table {\n if (!table.frozen) return table;\n const key = keyOf(table.name);\n const copy = table.clone();\n this.tables.set(key, copy);\n return copy;\n }\n\n getWritableIndex(name: string): IndexInfo {\n const key = keyOf(name);\n const index = this.indexes.get(key);\n if (!index) throw new SqliteError(`no such index: ${name}`, \"other\");\n return this.ensureWritableIndex(index);\n }\n\n ensureWritableIndex(index: IndexInfo): IndexInfo {\n if (!index.store.frozen) return index;\n const copy: IndexInfo = {\n name: index.name,\n tableName: index.tableName,\n unique: index.unique,\n columns: structuredClone(index.columns),\n where: index.where ? structuredClone(index.where) : null,\n originalSql: index.originalSql,\n store: index.store.clone(),\n };\n this.indexes.set(keyOf(index.name), copy);\n return copy;\n }\n\n replaceWith(state: DatabaseState, options?: { adopt?: boolean }): void {\n const copy = options?.adopt ? state : state.clone();\n this.tables = copy.tables;\n this.virtualTables = copy.virtualTables;\n this.views = copy.views;\n this.indexes = copy.indexes;\n this.triggers = copy.triggers;\n this.attached = copy.attached;\n this.lastInsertRowid = copy.lastInsertRowid;\n this.changes = copy.changes;\n this.totalChanges = copy.totalChanges;\n this.foreignKeysEnabled = copy.foreignKeysEnabled;\n this.caseSensitiveLike = copy.caseSensitiveLike;\n this.schemaVersion = copy.schemaVersion;\n this.userVersion = copy.userVersion;\n }\n\n private assertSchemaNameAvailable(name: string): void {\n const key = keyOf(name);\n if (\n this.tables.has(key) ||\n this.views.has(key) ||\n this.indexes.has(key) ||\n this.virtualTables.has(key) ||\n this.triggers.has(key)\n ) {\n throw new SqliteError(`object already exists: ${name}`, \"other\");\n }\n }\n}\n\nexport function splitQualifiedName(name: string): { schema: string | null; bare: string } {\n const dot = name.indexOf(\".\");\n if (dot < 0) return { schema: null, bare: name };\n return { schema: name.slice(0, dot), bare: name.slice(dot + 1) };\n}\n\nfunction keyOf(name: string): string {\n return name.toLowerCase();\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { Prng } from \"../runtime/prng.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\n\ninterface SavepointSnapshot {\n name: string;\n state: DatabaseState;\n prngState: bigint;\n}\n\nexport class TransactionManager {\n readonly state: DatabaseState;\n readonly prng: Prng;\n private transactionSnapshot: DatabaseState | null = null;\n private transactionPrngState: bigint | null = null;\n private savepoints: SavepointSnapshot[] = [];\n private startedBySavepoint = false;\n\n constructor(state: DatabaseState, prng: Prng) {\n this.state = state;\n this.prng = prng;\n }\n\n get inTransaction(): boolean {\n return this.transactionSnapshot !== null;\n }\n\n begin(): void {\n if (this.inTransaction) {\n throw new SqliteError(\"cannot start a transaction within a transaction\", \"transaction\", \"SQLITE_ERROR\");\n }\n this.state.freezeShared();\n this.transactionSnapshot = this.state.cloneShallow();\n this.transactionPrngState = this.prng.getState();\n this.savepoints = [];\n this.startedBySavepoint = false;\n }\n\n commit(): void {\n this.requireTransaction(\"cannot commit - no transaction is active\");\n this.transactionSnapshot = null;\n this.transactionPrngState = null;\n this.savepoints = [];\n this.startedBySavepoint = false;\n this.state.thawShared();\n }\n\n rollback(savepoint?: string): void {\n this.requireTransaction(\"cannot rollback - no transaction is active\");\n // SQLite keeps total_changes / last_insert_rowid / changes across ROLLBACK\n // (and ROLLBACK TO); only row/schema state is restored.\n const preserved = {\n totalChanges: this.state.totalChanges,\n changes: this.state.changes,\n lastInsertRowid: this.state.lastInsertRowid,\n };\n if (savepoint !== undefined) {\n const index = this.findSavepoint(savepoint);\n const snapshot = this.savepoints[index];\n if (!snapshot) throw new SqliteError(`no such savepoint: ${savepoint}`, \"transaction\", \"SQLITE_ERROR\");\n // Clone \u2014 adopting would alias live state with the savepoint snapshot Map.\n this.state.replaceWith(snapshot.state);\n this.prng.setState(snapshot.prngState);\n this.state.totalChanges = preserved.totalChanges;\n this.state.changes = preserved.changes;\n this.state.lastInsertRowid = preserved.lastInsertRowid;\n this.savepoints.splice(index + 1);\n return;\n }\n\n const snapshot = this.transactionSnapshot;\n const prngState = this.transactionPrngState;\n if (!snapshot || prngState === null) {\n throw new SqliteError(\"cannot rollback - no transaction is active\", \"transaction\", \"SQLITE_ERROR\");\n }\n this.state.replaceWith(snapshot, { adopt: true });\n this.prng.setState(prngState);\n this.state.totalChanges = preserved.totalChanges;\n this.state.changes = preserved.changes;\n this.state.lastInsertRowid = preserved.lastInsertRowid;\n this.transactionSnapshot = null;\n this.transactionPrngState = null;\n this.savepoints = [];\n this.startedBySavepoint = false;\n this.state.thawShared();\n }\n\n savepoint(name: string): void {\n if (!this.inTransaction) {\n this.state.freezeShared();\n this.transactionSnapshot = this.state.cloneShallow();\n this.transactionPrngState = this.prng.getState();\n this.startedBySavepoint = true;\n } else {\n this.state.freezeShared();\n }\n this.savepoints.push({\n name,\n state: this.state.cloneShallow(),\n prngState: this.prng.getState(),\n });\n }\n\n release(name: string): void {\n this.requireTransaction(\"cannot release savepoint - no transaction is active\");\n const index = this.findSavepoint(name);\n this.savepoints.splice(index);\n if (this.startedBySavepoint && this.savepoints.length === 0) {\n this.transactionSnapshot = null;\n this.transactionPrngState = null;\n this.startedBySavepoint = false;\n this.state.thawShared();\n }\n }\n\n private findSavepoint(name: string): number {\n const normalized = name.toLowerCase();\n for (let index = this.savepoints.length - 1; index >= 0; index--) {\n const savepoint = this.savepoints[index];\n if (savepoint && savepoint.name.toLowerCase() === normalized) return index;\n }\n throw new SqliteError(`no such savepoint: ${name}`, \"transaction\", \"SQLITE_ERROR\");\n }\n\n private requireTransaction(message: string): void {\n if (!this.inTransaction) throw new SqliteError(message, \"transaction\", \"SQLITE_ERROR\");\n }\n}\n", "import { asSqlReal, SqlJsonText, SqlReal, type SqlValue, utf8Decode } from \"../types/value.ts\";\nimport type { Rowid } from \"./row.ts\";\n\n/** Column pack tags (SQLM v5). */\nexport const PACK_NULL = 0;\nexport const PACK_I32 = 1;\nexport const PACK_I64 = 2;\nexport const PACK_F64 = 3;\nexport const PACK_TEXT_INTERN = 4;\nexport const PACK_TEXT_INLINE = 5;\nexport const PACK_BLOB = 6;\nexport const PACK_TAGGED = 7;\n\nexport interface SlabColumn {\n pack: number;\n nullBitmap: Uint8Array | null;\n /** Typed payload or inline blob region inside `buffer`. */\n payload: Uint8Array;\n /** Cached view over `payload` (avoid per-cell DataView alloc). */\n view?: DataView;\n /** Prefix count of non-null cells before each row (when nulls exist). */\n nonNullRank?: Uint32Array;\n /** For PACK_TEXT_INLINE: u32 offsets into payload per row. */\n inlineOffsets?: Uint32Array;\n /** For PACK_TAGGED: decoded values per non-null row in order. */\n tagged?: SqlValue[];\n /** For PACK_BLOB: one entry per non-null row. */\n blobChunks?: Uint8Array[];\n}\n\n/** Attach decode helpers; drop an all-zero null bitmap. */\nexport function prepareSlabColumn(column: SlabColumn, rowCount: number, nonNull: number): SlabColumn {\n if (column.payload.length > 0) {\n column.view = new DataView(column.payload.buffer, column.payload.byteOffset, column.payload.byteLength);\n }\n if (!column.nullBitmap || nonNull === rowCount) {\n column.nullBitmap = null;\n column.nonNullRank = undefined;\n return column;\n }\n column.nonNullRank = buildNonNullRank(column.nullBitmap, rowCount);\n return column;\n}\n\nfunction buildNonNullRank(bits: Uint8Array, n: number): Uint32Array {\n const rank = new Uint32Array(n);\n let k = 0;\n for (let i = 0; i < n; i++) {\n rank[i] = k;\n if ((bits[i >> 3]! & (1 << (i & 7))) === 0) k++;\n }\n return rank;\n}\n\n/** Frozen columnar row storage; zero-copy views into snapshot buffer. */\nexport class ColumnarSlab {\n readonly buffer: Uint8Array;\n readonly rowCount: number;\n readonly rowids: Rowid[];\n readonly columns: SlabColumn[];\n private readonly intern: readonly string[];\n private rowidIndex: Map<Rowid, number> | null = null;\n\n constructor(buffer: Uint8Array, rowCount: number, rowids: Rowid[], columns: SlabColumn[], intern: readonly string[]) {\n this.buffer = buffer;\n this.rowCount = rowCount;\n this.rowids = rowids;\n this.columns = columns;\n this.intern = intern;\n }\n\n private rowIndex(rowid: Rowid): number {\n this.rowidIndex ??= new Map(this.rowids.map((id, i) => [canonicalRowid(id), i]));\n const hit = this.rowidIndex.get(canonicalRowid(rowid));\n if (hit === undefined) return -1;\n return hit;\n }\n\n cell(rowIndex: number, col: number): SqlValue {\n if (rowIndex < 0 || rowIndex >= this.rowCount) return null;\n const column = this.columns[col];\n if (!column) return null;\n if (column.nullBitmap && isNull(column.nullBitmap, rowIndex)) return null;\n return readSlabCell(column, rowIndex, this.intern);\n }\n\n rowAt(rowIndex: number): { rowid: Rowid; values: SqlValue[] } {\n const values: SqlValue[] = new Array(this.columns.length);\n for (let c = 0; c < this.columns.length; c++) values[c] = this.cell(rowIndex, c);\n return { rowid: this.rowids[rowIndex]!, values };\n }\n\n get(rowid: Rowid): { rowid: Rowid; values: SqlValue[] } | undefined {\n const i = this.rowIndex(rowid);\n if (i < 0) return undefined;\n return this.rowAt(i);\n }\n\n *scan(): Generator<{ rowid: Rowid; values: SqlValue[] }> {\n for (let i = 0; i < this.rowCount; i++) yield this.rowAt(i);\n }\n\n materialize(): Map<Rowid, { rowid: Rowid; values: SqlValue[] }> {\n const map = new Map<Rowid, { rowid: Rowid; values: SqlValue[] }>();\n for (let i = 0; i < this.rowCount; i++) {\n const row = this.rowAt(i);\n map.set(row.rowid, row);\n }\n return map;\n }\n}\n\nfunction canonicalRowid(rowid: Rowid): Rowid {\n return typeof rowid === \"bigint\" ? rowid : rowid;\n}\n\nfunction isNull(bits: Uint8Array, i: number): boolean {\n return (bits[i >> 3]! & (1 << (i & 7))) !== 0;\n}\n\nfunction nonNullRowIndex(column: SlabColumn, rowIndex: number): number {\n if (!column.nullBitmap) return rowIndex;\n return column.nonNullRank?.[rowIndex] ?? rowIndex;\n}\n\nfunction readSlabCell(column: SlabColumn, rowIndex: number, intern: readonly string[]): SqlValue {\n const pack = column.pack;\n if (pack === PACK_NULL) return null;\n const nonNullIndex = nonNullRowIndex(column, rowIndex);\n const view = column.view;\n\n if (pack === PACK_I32) {\n return view!.getInt32(nonNullIndex * 4, true);\n }\n if (pack === PACK_I64) {\n const integer = view!.getBigInt64(nonNullIndex * 8, true);\n return integer <= BigInt(Number.MAX_SAFE_INTEGER) && integer >= BigInt(Number.MIN_SAFE_INTEGER)\n ? Number(integer)\n : integer;\n }\n if (pack === PACK_F64) {\n const value = view!.getFloat64(nonNullIndex * 8, true);\n return Number.isInteger(value) && Number.isFinite(value) ? asSqlReal(value) : value;\n }\n if (pack === PACK_TEXT_INTERN) {\n const id = view!.getUint32(nonNullIndex * 4, true);\n return intern[id] ?? \"\";\n }\n if (pack === PACK_TEXT_INLINE) {\n const offsets = column.inlineOffsets!;\n const start = offsets[nonNullIndex]!;\n const end = nonNullIndex + 1 < offsets.length ? offsets[nonNullIndex + 1]! : column.payload.length;\n return utf8Decode(column.payload.subarray(start, end));\n }\n if (pack === PACK_BLOB) {\n const blob = column.blobChunks![nonNullIndex]!;\n return blob;\n }\n if (pack === PACK_TAGGED) {\n return column.tagged![nonNullIndex] ?? null;\n }\n return null;\n}\n\nexport function packKindOf(value: SqlValue): number {\n if (value instanceof SqlReal) return PACK_F64;\n if (typeof value === \"bigint\") return PACK_I64;\n if (typeof value === \"number\" && Number.isInteger(value)) {\n return value >= -0x80000000 && value <= 0x7fffffff ? PACK_I32 : PACK_I64;\n }\n if (typeof value === \"number\") return PACK_F64;\n if (value instanceof SqlJsonText) return PACK_TAGGED;\n if (typeof value === \"string\") return PACK_TEXT_INTERN;\n if (value instanceof Uint8Array) return PACK_BLOB;\n return PACK_TAGGED;\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { utf8Decode, utf8Encode } from \"../types/value.ts\";\n\n// --- varint -------------------------------------------------------------------\n\nexport function writeVarintU32(w: Writer, value: number): void {\n let v = value >>> 0;\n while (v >= 0x80) {\n w.u8((v & 0x7f) | 0x80);\n v >>>= 7;\n }\n w.u8(v);\n}\n\nexport function readVarintU32(r: Reader): number {\n let result = 0;\n let shift = 0;\n for (;;) {\n const byte = r.u8();\n result |= (byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) return result >>> 0;\n shift += 7;\n if (shift > 28) r.fail();\n }\n}\n\n// --- Writer -------------------------------------------------------------------\n\nexport class Writer {\n private buf: Uint8Array;\n private view: DataView;\n private len = 0;\n\n constructor(capacity = 4096) {\n this.buf = new Uint8Array(capacity);\n this.view = new DataView(this.buf.buffer);\n }\n\n get position(): number {\n return this.len;\n }\n\n reserve(capacity: number): void {\n if (capacity <= this.buf.length) return;\n const next = new Uint8Array(capacity);\n next.set(this.buf.subarray(0, this.len));\n this.buf = next;\n this.view = new DataView(next.buffer);\n }\n\n private ensure(needed: number): void {\n if (this.len + needed <= this.buf.length) return;\n let cap = this.buf.length;\n while (cap < this.len + needed) cap *= 2;\n this.reserve(cap);\n }\n\n align4(): void {\n const pad = (4 - (this.len & 3)) & 3;\n for (let i = 0; i < pad; i++) this.u8(0);\n }\n\n u8(value: number): void {\n this.ensure(1);\n this.buf[this.len++] = value & 0xff;\n }\n\n u32(value: number): void {\n this.ensure(4);\n this.view.setUint32(this.len, value >>> 0, true);\n this.len += 4;\n }\n\n u64(value: bigint): void {\n this.ensure(8);\n this.view.setBigUint64(this.len, BigInt.asUintN(64, value), true);\n this.len += 8;\n }\n\n i64(value: bigint): void {\n this.ensure(8);\n this.view.setBigInt64(this.len, value, true);\n this.len += 8;\n }\n\n f64(value: number): void {\n this.ensure(8);\n this.view.setFloat64(this.len, value, true);\n this.len += 8;\n }\n\n raw(value: Uint8Array): void {\n this.ensure(value.length);\n this.buf.set(value, this.len);\n this.len += value.length;\n }\n\n rawAt(offset: number, value: Uint8Array): void {\n if (offset + value.length > this.len) this.fail();\n this.buf.set(value, offset);\n }\n\n /** Length-prefixed UTF-8 via encodeInto when possible. */\n text(value: string): void {\n const encoded = utf8Encode(value);\n writeVarintU32(this, encoded.length);\n this.raw(encoded);\n }\n\n /** Write UTF-8 at current position without length prefix (intern blob region). */\n textBytes(value: string): void {\n const encoded = utf8Encode(value);\n this.raw(encoded);\n }\n\n finish(): Uint8Array {\n if (this.len === this.buf.length) return this.buf;\n return this.buf.subarray(0, this.len).slice();\n }\n\n fail(): never {\n throw new SqliteError(\"invalid or truncated sqlite-mem snapshot\", \"other\");\n }\n}\n\n// --- Reader -------------------------------------------------------------------\n\nexport class Reader {\n private offset = 0;\n private readonly view: DataView;\n\n constructor(private readonly bytes: Uint8Array) {\n this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n }\n\n get position(): number {\n return this.offset;\n }\n\n skipAlign4(): void {\n const pad = (4 - (this.offset & 3)) & 3;\n this.offset += pad;\n }\n\n u8(): number {\n if (this.offset >= this.bytes.length) this.fail();\n return this.bytes[this.offset++]!;\n }\n\n u32(): number {\n if (this.offset + 4 > this.bytes.length) this.fail();\n const value = this.view.getUint32(this.offset, true);\n this.offset += 4;\n return value;\n }\n\n u64(): bigint {\n if (this.offset + 8 > this.bytes.length) this.fail();\n const value = this.view.getBigUint64(this.offset, true);\n this.offset += 8;\n return value;\n }\n\n i64(): bigint {\n if (this.offset + 8 > this.bytes.length) this.fail();\n const value = this.view.getBigInt64(this.offset, true);\n this.offset += 8;\n return value;\n }\n\n f64(): number {\n if (this.offset + 8 > this.bytes.length) this.fail();\n const value = this.view.getFloat64(this.offset, true);\n this.offset += 8;\n return value;\n }\n\n raw(length: number): Uint8Array {\n if (length < 0 || this.offset + length > this.bytes.length) this.fail();\n const value = this.bytes.subarray(this.offset, this.offset + length);\n this.offset += length;\n return value;\n }\n\n text(): string {\n const length = readVarintU32(this);\n return utf8Decode(this.raw(length));\n }\n\n remaining(): number {\n return this.bytes.length - this.offset;\n }\n\n done(): boolean {\n return this.offset === this.bytes.length;\n }\n\n fail(): never {\n throw new SqliteError(\"invalid or truncated sqlite-mem snapshot\", \"other\");\n }\n}\n\n// --- binary JSON (BJV) ------------------------------------------------------\n\nconst BJV_NULL = 0;\nconst BJV_FALSE = 1;\nconst BJV_TRUE = 2;\nconst BJV_I32 = 3;\nconst BJV_I64 = 4;\nconst BJV_F64 = 5;\nconst BJV_INTERN = 6;\nconst BJV_STRING = 7;\nconst BJV_BYTES = 8;\nconst BJV_ARRAY = 9;\nconst BJV_OBJECT = 10;\n\nexport function writeBjv(w: Writer, value: unknown, forceIntern: (s: string) => number): void {\n if (value === null || value === undefined) {\n w.u8(BJV_NULL);\n return;\n }\n if (typeof value === \"boolean\") {\n w.u8(value ? BJV_TRUE : BJV_FALSE);\n return;\n }\n if (typeof value === \"number\") {\n if (Number.isInteger(value) && value >= -0x80000000 && value <= 0x7fffffff) {\n w.u8(BJV_I32);\n w.u32(value | 0);\n return;\n }\n w.u8(BJV_F64);\n w.f64(value);\n return;\n }\n if (typeof value === \"bigint\") {\n w.u8(BJV_I64);\n w.i64(value);\n return;\n }\n if (typeof value === \"string\") {\n w.u8(BJV_INTERN);\n writeVarintU32(w, forceIntern(value));\n return;\n }\n if (value instanceof Uint8Array) {\n w.u8(BJV_BYTES);\n writeVarintU32(w, value.length);\n w.raw(value);\n return;\n }\n if (Array.isArray(value)) {\n w.u8(BJV_ARRAY);\n writeVarintU32(w, value.length);\n for (const item of value) writeBjv(w, item, forceIntern);\n return;\n }\n if (typeof value === \"object\") {\n const entries = Object.entries(value as Record<string, unknown>);\n w.u8(BJV_OBJECT);\n writeVarintU32(w, entries.length);\n for (const [k, v] of entries) {\n w.u8(BJV_INTERN);\n writeVarintU32(w, forceIntern(k));\n writeBjv(w, v, forceIntern);\n }\n return;\n }\n w.u8(BJV_NULL);\n}\n\nexport function readBjv(r: Reader, intern: readonly string[]): unknown {\n const tag = r.u8();\n switch (tag) {\n case BJV_NULL:\n return null;\n case BJV_FALSE:\n return false;\n case BJV_TRUE:\n return true;\n case BJV_I32:\n return r.u32() | 0;\n case BJV_I64:\n return r.i64();\n case BJV_F64:\n return r.f64();\n case BJV_INTERN:\n return intern[readVarintU32(r)] ?? \"\";\n case BJV_STRING:\n return r.text();\n case BJV_BYTES:\n return r.raw(readVarintU32(r)).slice();\n case BJV_ARRAY: {\n const count = readVarintU32(r);\n const out: unknown[] = new Array(count);\n for (let i = 0; i < count; i++) out[i] = readBjv(r, intern);\n return out;\n }\n case BJV_OBJECT: {\n const count = readVarintU32(r);\n const out: Record<string, unknown> = {};\n for (let i = 0; i < count; i++) {\n const key = readBjv(r, intern) as string;\n out[key] = readBjv(r, intern);\n }\n return out;\n }\n default:\n return r.fail();\n }\n}\n\n// --- adaptive intern ----------------------------------------------------------\n\nexport class InternPool {\n private readonly counts = new Map<string, number>();\n private readonly ids = new Map<string, number>();\n readonly list: string[] = [];\n\n constructor() {\n this.list.push(\"\");\n this.ids.set(\"\", 0);\n }\n\n count(s: string): void {\n this.counts.set(s, (this.counts.get(s) ?? 0) + 1);\n }\n\n /** Assign ids only to strings seen \u22652 times (plus empty string). */\n finalize(): void {\n for (const [s, c] of this.counts) {\n if (c >= 2 && !this.ids.has(s)) {\n const id = this.list.length;\n this.ids.set(s, id);\n this.list.push(s);\n }\n }\n }\n\n /** Always intern (schema / catalog strings). */\n forceId(s: string): number {\n const hit = this.ids.get(s);\n if (hit !== undefined) return hit;\n const id = this.list.length;\n this.ids.set(s, id);\n this.list.push(s);\n return id;\n }\n\n id(s: string): number {\n const hit = this.ids.get(s);\n if (hit !== undefined) return hit;\n return -1;\n }\n\n has(s: string): boolean {\n return this.ids.has(s);\n }\n}\n\n/** Write intern table: count, offsets[], concatenated UTF-8 blob. */\nexport function writeInternTable(w: Writer, strings: readonly string[]): void {\n writeVarintU32(w, strings.length);\n if (strings.length === 0) return;\n const offsets: number[] = [];\n let total = 0;\n for (const s of strings) {\n offsets.push(total);\n total += utf8Encode(s).length;\n }\n writeVarintU32(w, total);\n const base = w.position + offsets.length * 4;\n for (const off of offsets) w.u32(base + off);\n for (const s of strings) w.textBytes(s);\n}\n\nexport function readInternTable(r: Reader): string[] {\n const count = readVarintU32(r);\n if (count === 0) return [];\n const total = readVarintU32(r);\n const offsets: number[] = [];\n for (let i = 0; i < count; i++) offsets.push(r.u32());\n const blobStart = r.position;\n const blob = r.raw(total);\n const intern: string[] = new Array(count);\n for (let i = 0; i < count; i++) {\n const start = offsets[i]! - blobStart;\n const end = i + 1 < count ? offsets[i + 1]! - blobStart : total;\n intern[i] = utf8Decode(blob.subarray(start, end));\n }\n return intern;\n}\n", "import type { Expr, TableConstraint } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { IndexStore, serializeIndexEntry } from \"../indexes/index.ts\";\nimport {\n ColumnarSlab,\n PACK_BLOB,\n PACK_F64,\n PACK_I32,\n PACK_I64,\n PACK_NULL,\n PACK_TAGGED,\n PACK_TEXT_INLINE,\n PACK_TEXT_INTERN,\n packKindOf,\n prepareSlabColumn,\n type SlabColumn,\n} from \"../storage/columnar-slab.ts\";\nimport { DatabaseState, type IndexInfo, type ViewInfo } from \"../storage/database-state.ts\";\nimport type { Row, Rowid } from \"../storage/row.ts\";\nimport { type ColumnInfo, Table } from \"../storage/table.ts\";\nimport { asSqlReal, SqlJsonText, SqlReal, type SqlValue, utf8Encode } from \"../types/value.ts\";\nimport {\n InternPool,\n Reader,\n readBjv,\n readInternTable,\n readVarintU32,\n Writer,\n writeBjv,\n writeInternTable,\n writeVarintU32,\n} from \"./wire.ts\";\n\nconst MAGIC = utf8Encode(\"SQLM\");\n/** SQLM v5: adaptive intern, BJV schema, columnar slab hydrate, binary index keys. */\nconst VERSION = 5;\n\n/** PRNG + clock captured alongside schema/rows. */\nexport interface SnapshotRuntime {\n prngState: bigint;\n nowMs: number;\n}\n\n/** Result of {@link decodeDatabaseState}. */\nexport interface DecodedSnapshot {\n state: DatabaseState;\n runtime: SnapshotRuntime;\n}\n\nconst AFFINITIES: Array<import(\"../types/value.ts\").Affinity> = [\"TEXT\", \"NUMERIC\", \"INTEGER\", \"REAL\", \"BLOB\"];\n\n/**\n * Encode catalog, rows, and runtime into a sqlite-mem snapshot blob (not a `.sqlite` file).\n */\nexport function encodeDatabaseState(state: DatabaseState, runtime: SnapshotRuntime): Uint8Array {\n const pool = new InternPool();\n const tables = sortedValues(state.tables);\n const views = sortedValues(state.views);\n const indexes = sortedValues(state.indexes);\n const tableRows: Row[][] = [];\n\n for (const table of tables) {\n pool.count(table.name);\n pool.count(table.originalSql ?? \"\");\n for (const column of table.columns) {\n pool.count(column.name);\n pool.count(column.typeName ?? \"\");\n pool.count(column.collate ?? \"\");\n }\n for (const name of table.indexes) pool.count(name);\n const rows = table.sortedRows();\n tableRows.push(rows);\n for (const row of rows) {\n for (const value of row.values) {\n if (typeof value === \"string\") pool.count(value);\n else if (value instanceof SqlJsonText) pool.count(value.value);\n }\n }\n }\n for (const view of views) pool.count(JSON.stringify(view));\n for (const index of indexes) pool.count(index.name);\n pool.finalize();\n forceSchemaIntern(pool, tables, views, indexes);\n\n const internId = (s: string): number => pool.id(s);\n const forceId = (s: string): number => pool.forceId(s);\n\n const w = new Writer(64 * 1024);\n w.raw(MAGIC);\n w.u32(VERSION);\n w.u8(state.foreignKeysEnabled ? 1 : 0);\n w.u32(state.schemaVersion);\n w.u32(state.changes);\n w.u32(state.totalChanges);\n writeTaggedValue(w, state.lastInsertRowid, internId);\n writeInternTable(w, pool.list);\n\n writeVarintU32(w, tables.length);\n for (let t = 0; t < tables.length; t++) {\n const table = tables[t]!;\n writeVarintU32(w, forceId(table.name));\n writeVarintU32(w, table.columns.length);\n for (const column of table.columns) {\n writeVarintU32(w, forceId(column.name));\n writeVarintU32(w, forceId(column.typeName ?? \"\"));\n const aff = AFFINITIES.indexOf(column.affinity);\n w.u8(aff < 0 ? 2 : aff);\n w.u8(\n (column.notNull ? 1 : 0) |\n (column.primaryKey ? 2 : 0) |\n (column.autoincrement ? 4 : 0) |\n (column.unique ? 8 : 0),\n );\n writeVarintU32(w, forceId(column.collate ?? \"\"));\n if (column.defaultExpr) {\n w.u8(1);\n writeBjv(w, column.defaultExpr, forceId);\n } else w.u8(0);\n if (column.generated) {\n w.u8(1);\n writeBjv(w, column.generated, forceId);\n } else w.u8(0);\n }\n writeBjv(w, table.constraints, forceId);\n writeVarintU32(w, forceId(table.originalSql ?? \"\"));\n w.u8((table.withoutRowid ? 1 : 0) | (table.strict ? 2 : 0));\n const indexNames = [...table.indexes].sort(compareNames);\n writeVarintU32(w, indexNames.length);\n for (const name of indexNames) writeVarintU32(w, forceId(name));\n writeTaggedValue(w, table.nextRowid, internId);\n const rows = tableRows[t]!;\n writeVarintU32(w, rows.length);\n for (const row of rows) writeTaggedValue(w, row.rowid, internId);\n for (let c = 0; c < table.columns.length; c++) writePackedColumn(w, rows, c, internId);\n }\n\n writeVarintU32(w, views.length);\n for (const view of views) writeBjv(w, view, forceId);\n\n writeVarintU32(w, indexes.length);\n for (const index of indexes) {\n writeBjv(\n w,\n {\n name: index.name,\n tableName: index.tableName,\n unique: index.unique,\n columns: index.columns,\n where: index.where,\n originalSql: index.originalSql,\n },\n forceId,\n );\n }\n for (const index of indexes) writeIndexStoreBinary(w, index.store, internId);\n\n w.u64(runtime.prngState);\n w.i64(BigInt(Math.trunc(runtime.nowMs)));\n return w.finish();\n}\n\n/**\n * Decode a blob from {@link encodeDatabaseState} / {@link Database.snapshot}.\n */\nexport function decodeDatabaseState(snapshot: Uint8Array): DecodedSnapshot {\n try {\n return decodeInner(snapshot);\n } catch (error) {\n if (error instanceof SqliteError) throw error;\n throw new SqliteError(\"invalid or truncated sqlite-mem snapshot\", \"other\");\n }\n}\n\nfunction decodeInner(snapshot: Uint8Array): DecodedSnapshot {\n const r = new Reader(snapshot);\n const magic = r.raw(4);\n if (!magic.every((byte, index) => byte === MAGIC[index]))\n throw new SqliteError(\"invalid sqlite-mem snapshot magic\", \"other\");\n const version = r.u32();\n if (version !== VERSION) {\n throw new SqliteError(`unsupported sqlite-mem snapshot version: ${version}`, \"snapshot_version\", \"SQLITE_FORMAT\");\n }\n\n const state = new DatabaseState();\n state.foreignKeysEnabled = r.u8() !== 0;\n state.schemaVersion = r.u32();\n state.changes = r.u32();\n state.totalChanges = r.u32();\n state.lastInsertRowid = asRowid(readTaggedValue(r, []));\n const intern = readInternTable(r);\n const str = (id: number): string => intern[id] ?? \"\";\n\n const tableCount = readVarintU32(r);\n for (let t = 0; t < tableCount; t++) {\n const name = str(readVarintU32(r));\n const colCount = readVarintU32(r);\n const columns: ColumnInfo[] = [];\n for (let c = 0; c < colCount; c++) {\n const colName = str(readVarintU32(r));\n const typeName = str(readVarintU32(r)) || null;\n const affIndex = r.u8();\n const flags = r.u8();\n const collate = str(readVarintU32(r)) || null;\n const hasDefault = r.u8() === 1;\n const defaultExpr = hasDefault ? (readBjv(r, intern) as Expr) : null;\n const hasGenerated = r.u8() === 1;\n const generated = hasGenerated ? (readBjv(r, intern) as ColumnInfo[\"generated\"]) : null;\n columns.push({\n name: colName,\n nameLower: colName.toLowerCase(),\n typeName,\n affinity: AFFINITIES[affIndex] ?? \"NUMERIC\",\n notNull: (flags & 1) !== 0,\n primaryKey: (flags & 2) !== 0,\n autoincrement: (flags & 4) !== 0,\n unique: (flags & 8) !== 0,\n defaultExpr,\n collate,\n generated,\n });\n }\n const constraints = readBjv(r, intern) as TableConstraint[];\n const originalSql = str(readVarintU32(r)) || null;\n const tableFlags = r.u8();\n const indexNameCount = readVarintU32(r);\n const indexNames: string[] = [];\n for (let i = 0; i < indexNameCount; i++) indexNames.push(str(readVarintU32(r)));\n const table = new Table(name, columns, {\n constraints,\n indexes: indexNames,\n originalSql,\n withoutRowid: (tableFlags & 1) !== 0,\n strict: (tableFlags & 2) !== 0,\n });\n table.nextRowid = asRowid(readTaggedValue(r, intern));\n const rowCount = readVarintU32(r);\n const rowids: Rowid[] = [];\n for (let ri = 0; ri < rowCount; ri++) rowids.push(asRowid(readTaggedValue(r, intern)));\n const slabColumns: SlabColumn[] = [];\n for (let c = 0; c < colCount; c++) slabColumns.push(readPackedColumn(r, rowCount, intern));\n table.attachSlab(new ColumnarSlab(snapshot, rowCount, rowids, slabColumns, intern));\n if (table.withoutRowid) table.rebuildClusteredRows();\n state.tables.set(table.name.toLowerCase(), table);\n }\n\n const viewCount = readVarintU32(r);\n for (let i = 0; i < viewCount; i++) {\n const view = readBjv(r, intern) as ViewInfo;\n state.views.set(view.name.toLowerCase(), view);\n }\n\n const indexCount = readVarintU32(r);\n const loadedIndexes: IndexInfo[] = [];\n for (let i = 0; i < indexCount; i++) {\n const meta = readBjv(r, intern) as Omit<IndexInfo, \"store\">;\n const info: IndexInfo = { ...meta, store: new IndexStore(meta.name) };\n state.indexes.set(info.name.toLowerCase(), info);\n loadedIndexes.push(info);\n }\n for (const info of loadedIndexes) {\n info.store = readIndexStoreBinary(r, info.name, intern);\n }\n\n if (r.remaining() < 16) throw new SqliteError(\"invalid or truncated sqlite-mem snapshot\", \"other\");\n const runtime: SnapshotRuntime = { prngState: r.u64(), nowMs: finiteNowMs(Number(r.i64())) };\n if (!r.done()) throw new SqliteError(\"snapshot has trailing data\", \"other\");\n return { state, runtime };\n}\n\n// --- tagged SqlValue (rowid / tagged cells) -----------------------------------\n\nfunction writeTaggedValue(w: Writer, value: SqlValue, internId: (s: string) => number): void {\n if (value === null) {\n w.u8(0);\n return;\n }\n if (value instanceof SqlReal) {\n w.u8(2);\n w.f64(value.value);\n return;\n }\n if (typeof value === \"bigint\" || (typeof value === \"number\" && Number.isInteger(value))) {\n w.u8(1);\n w.i64(BigInt(value));\n return;\n }\n if (typeof value === \"number\") {\n w.u8(2);\n w.f64(value);\n return;\n }\n if (typeof value === \"string\") {\n const id = internId(value);\n if (id >= 0) {\n w.u8(3);\n writeVarintU32(w, id);\n return;\n }\n w.u8(4);\n w.text(value);\n return;\n }\n if (value instanceof SqlJsonText) {\n w.u8(4);\n w.text(value.value);\n return;\n }\n w.u8(5);\n writeVarintU32(w, value.length);\n w.raw(value);\n}\n\nfunction readTaggedValue(r: Reader, intern: readonly string[]): SqlValue {\n const tag = r.u8();\n if (tag === 0) return null;\n if (tag === 1) {\n const integer = r.i64();\n return integer <= BigInt(Number.MAX_SAFE_INTEGER) && integer >= BigInt(Number.MIN_SAFE_INTEGER)\n ? Number(integer)\n : integer;\n }\n if (tag === 2) {\n const value = r.f64();\n return Number.isInteger(value) && Number.isFinite(value) ? asSqlReal(value) : value;\n }\n if (tag === 3) return intern[readVarintU32(r)] ?? \"\";\n if (tag === 4) return r.text();\n return r.raw(readVarintU32(r));\n}\n\n// --- packed columns -----------------------------------------------------------\n\nfunction writePackedColumn(w: Writer, rows: Row[], col: number, internId: (s: string) => number): void {\n const n = rows.length;\n if (n === 0) {\n w.u8(PACK_NULL);\n return;\n }\n const bits = new Uint8Array((n + 7) >> 3);\n let nulls = 0;\n let kind: number | null = null;\n let useInlineText = false;\n for (let i = 0; i < n; i++) {\n const value = rows[i]!.values[col] ?? null;\n if (value === null) {\n bits[i >> 3] = (bits[i >> 3]! | (1 << (i & 7))) as number;\n nulls++;\n continue;\n }\n const cellKind = packKindOf(value);\n if (kind === null) kind = cellKind;\n else if (kind !== cellKind) kind = PACK_TAGGED;\n if (cellKind === PACK_TEXT_INTERN && typeof value === \"string\" && internId(value) < 0) useInlineText = true;\n if (value instanceof SqlJsonText) kind = PACK_TAGGED;\n }\n if (nulls === n) {\n w.u8(PACK_NULL);\n return;\n }\n let pack = kind ?? PACK_TAGGED;\n if (pack === PACK_TEXT_INTERN && useInlineText) pack = PACK_TEXT_INLINE;\n w.u8(pack);\n w.raw(bits);\n if (pack === PACK_I32) {\n w.align4();\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n w.u32(rows[i]!.values[col] as number);\n }\n return;\n }\n if (pack === PACK_I64) {\n w.align4();\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n const v = rows[i]!.values[col]!;\n w.i64(typeof v === \"bigint\" ? v : BigInt(v as number));\n }\n return;\n }\n if (pack === PACK_F64) {\n w.align4();\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n const v = rows[i]!.values[col]!;\n w.f64(v instanceof SqlReal ? v.value : (v as number));\n }\n return;\n }\n if (pack === PACK_TEXT_INTERN) {\n w.align4();\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n const text = rows[i]!.values[col] as string;\n w.u32(internId(text));\n }\n return;\n }\n if (pack === PACK_TEXT_INLINE) {\n const offsets: number[] = [];\n let blobLen = 0;\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n offsets.push(blobLen);\n const text =\n rows[i]!.values[col] instanceof SqlJsonText\n ? (rows[i]!.values[col] as SqlJsonText).value\n : (rows[i]!.values[col] as string);\n blobLen += utf8Encode(text).length;\n }\n writeVarintU32(w, offsets.length);\n for (const off of offsets) writeVarintU32(w, off);\n writeVarintU32(w, blobLen);\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n const text =\n rows[i]!.values[col] instanceof SqlJsonText\n ? (rows[i]!.values[col] as SqlJsonText).value\n : (rows[i]!.values[col] as string);\n w.textBytes(text);\n }\n return;\n }\n if (pack === PACK_BLOB) {\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n const blob = rows[i]!.values[col] as Uint8Array;\n writeVarintU32(w, blob.length);\n w.raw(blob);\n }\n return;\n }\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n writeTaggedValue(w, rows[i]!.values[col]!, internId);\n }\n}\n\nfunction readPackedColumn(r: Reader, n: number, intern: readonly string[]): SlabColumn {\n const pack = r.u8();\n if (pack === PACK_NULL) return prepareSlabColumn({ pack, nullBitmap: null, payload: new Uint8Array(0) }, n, 0);\n const bits = r.raw((n + 7) >> 3);\n const nonNull = countNonNull(bits, n);\n\n if (pack === PACK_I32 || pack === PACK_I64 || pack === PACK_F64 || pack === PACK_TEXT_INTERN) {\n r.skipAlign4();\n const width = pack === PACK_I32 || pack === PACK_TEXT_INTERN ? 4 : 8;\n const payload = r.raw(nonNull * width);\n return prepareSlabColumn({ pack, nullBitmap: bits, payload }, n, nonNull);\n }\n if (pack === PACK_TEXT_INLINE) {\n const count = readVarintU32(r);\n const offsets = new Uint32Array(count);\n for (let i = 0; i < count; i++) offsets[i] = readVarintU32(r);\n const total = readVarintU32(r);\n const payload = r.raw(total);\n return prepareSlabColumn({ pack, nullBitmap: bits, payload, inlineOffsets: offsets }, n, nonNull);\n }\n if (pack === PACK_BLOB) {\n const chunks: Uint8Array[] = [];\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n const len = readVarintU32(r);\n chunks.push(r.raw(len));\n }\n return prepareSlabColumn({ pack, nullBitmap: bits, payload: new Uint8Array(0), blobChunks: chunks }, n, nonNull);\n }\n const tagged: SqlValue[] = [];\n for (let i = 0; i < n; i++) {\n if (bits[i >> 3]! & (1 << (i & 7))) continue;\n tagged.push(readTaggedValue(r, intern));\n }\n return prepareSlabColumn({ pack: PACK_TAGGED, nullBitmap: bits, payload: new Uint8Array(0), tagged }, n, nonNull);\n}\n\nfunction countNonNull(bits: Uint8Array, n: number): number {\n let c = 0;\n for (let i = 0; i < n; i++) if ((bits[i >> 3]! & (1 << (i & 7))) === 0) c++;\n return c;\n}\n\n// --- binary index store -------------------------------------------------------\n\nfunction writeIndexStoreBinary(w: Writer, store: IndexStore, internId: (s: string) => number): void {\n const entries = store.snapshotKeys();\n writeVarintU32(w, entries.length);\n for (const entry of entries) {\n const values = store.keyValuesFor(entry.key);\n writeVarintU32(w, values.length);\n for (const v of values) writeTaggedValue(w, v, internId);\n writeVarintU32(w, entry.rowids.length);\n for (const id of entry.rowids) writeTaggedValue(w, id, internId);\n }\n}\n\nfunction readIndexStoreBinary(r: Reader, name: string, intern: readonly string[]): IndexStore {\n const count = readVarintU32(r);\n const entries = new Map<string, Rowid[]>();\n const keyValues = new Map<string, SqlValue[]>();\n for (let i = 0; i < count; i++) {\n const valueCount = readVarintU32(r);\n const values: SqlValue[] = [];\n for (let v = 0; v < valueCount; v++) values.push(readTaggedValue(r, intern));\n const key = serializeIndexEntry(values);\n const rowidCount = readVarintU32(r);\n const rowids: Rowid[] = [];\n for (let ri = 0; ri < rowidCount; ri++) rowids.push(asRowid(readTaggedValue(r, intern)));\n entries.set(key, rowids);\n keyValues.set(key, values);\n }\n return new IndexStore(name, entries, keyValues);\n}\n\n// --- helpers ------------------------------------------------------------------\n\nfunction asRowid(value: SqlValue): Rowid {\n if ((typeof value === \"number\" && Number.isSafeInteger(value)) || typeof value === \"bigint\") return value;\n throw new SqliteError(\"invalid rowid in snapshot\", \"other\");\n}\n\nfunction compareNames(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction finiteNowMs(value: number): number {\n if (!Number.isFinite(value)) return 0;\n const max = 8.64e15;\n if (value > max) return max;\n if (value < -max) return -max;\n return value;\n}\n\nfunction sortedValues<T extends { name: string }>(map: Map<string, T>): T[] {\n return [...map.values()].sort((a, b) => compareNames(a.name, b.name));\n}\n\nfunction forceSchemaIntern(pool: InternPool, tables: Table[], views: ViewInfo[], indexes: IndexInfo[]): void {\n for (const table of tables) {\n pool.forceId(table.name);\n pool.forceId(table.originalSql ?? \"\");\n for (const column of table.columns) {\n pool.forceId(column.name);\n pool.forceId(column.typeName ?? \"\");\n pool.forceId(column.collate ?? \"\");\n }\n for (const name of table.indexes) pool.forceId(name);\n forceBjvStrings(pool, table.constraints);\n for (const column of table.columns) {\n if (column.defaultExpr) forceBjvStrings(pool, column.defaultExpr);\n if (column.generated) forceBjvStrings(pool, column.generated);\n }\n }\n for (const view of views) forceBjvStrings(pool, view);\n for (const index of indexes) {\n pool.forceId(index.name);\n pool.forceId(index.tableName);\n pool.forceId(index.originalSql ?? \"\");\n forceBjvStrings(pool, {\n name: index.name,\n tableName: index.tableName,\n unique: index.unique,\n columns: index.columns,\n where: index.where,\n originalSql: index.originalSql,\n });\n }\n}\n\nfunction forceBjvStrings(pool: InternPool, value: unknown): void {\n if (value === null || value === undefined) return;\n if (typeof value === \"string\") {\n pool.forceId(value);\n return;\n }\n if (typeof value === \"bigint\" || typeof value === \"boolean\" || typeof value === \"number\") return;\n if (value instanceof Uint8Array) return;\n if (Array.isArray(value)) {\n for (const item of value) forceBjvStrings(pool, item);\n return;\n }\n if (typeof value === \"object\") {\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n pool.forceId(k);\n forceBjvStrings(pool, v);\n }\n }\n}\n", "import {\n type Clock,\n type DatabaseOptions,\n DEFAULT_DATABASE_SEED,\n DEFAULT_NOW,\n fixedClock,\n OsEntropy,\n Prng,\n type RandomMode,\n resolveClock,\n} from \"../runtime/index.ts\";\nimport { decodeDatabaseState, encodeDatabaseState } from \"../serialization/codec.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\nimport { createAdoptedDatabase, type Database } from \"./database.ts\";\n\nconst bytesCache = new WeakMap<Uint8Array, Snapshot>();\n\ninterface SnapshotInit {\n state: DatabaseState;\n prngState: bigint;\n nowMs: number;\n seed: number | bigint;\n randomMode: RandomMode;\n systemClock: boolean;\n bytes?: Uint8Array | null;\n runtimePresent: boolean;\n}\n\n/**\n * Frozen in-memory database template. {@link open} is a copy-on-write fork.\n * Encoded SQLM bytes are produced lazily via {@link encode}.\n */\nexport class Snapshot {\n /** @internal */\n readonly state: DatabaseState;\n /** @internal */\n readonly prngState: bigint;\n /** @internal */\n readonly nowMs: number;\n /** @internal */\n readonly seed: number | bigint;\n /** @internal */\n readonly randomMode: RandomMode;\n /** @internal */\n readonly systemClock: boolean;\n /** @internal true when the blob (or live capture) included PRNG/clock. */\n readonly runtimePresent: boolean;\n private cachedBytes: Uint8Array | null;\n\n /** @internal */\n constructor(init: SnapshotInit) {\n this.state = init.state;\n this.prngState = init.prngState;\n this.nowMs = init.nowMs;\n this.seed = init.seed;\n this.randomMode = init.randomMode;\n this.systemClock = init.systemClock;\n this.runtimePresent = init.runtimePresent;\n this.cachedBytes = init.bytes ?? null;\n }\n\n /** Encoded SQLM blob. Computed once; never mutates a buffer passed to {@link decode}. */\n encode(): Uint8Array {\n if (this.cachedBytes) return this.cachedBytes;\n this.cachedBytes = encodeDatabaseState(this.state, {\n prngState: this.prngState,\n nowMs: this.nowMs,\n });\n return this.cachedBytes;\n }\n\n /**\n * Copy-on-write database from this frozen template. Does not re-encode or re-decode.\n */\n open(options: DatabaseOptions = {}): Database {\n return openSnapshot(this, options);\n }\n\n /**\n * Decode `bytes` once and freeze the result. The same `Uint8Array` object\n * returns the same {@link Snapshot} (WeakMap), so later {@link open} calls\n * are copy-on-write forks after the first hydrate.\n */\n static decode(bytes: Uint8Array): Snapshot {\n const hit = bytesCache.get(bytes);\n if (hit) return hit;\n const decoded = decodeDatabaseState(bytes);\n decoded.state.freezeShared();\n const snap = new Snapshot({\n state: decoded.state,\n prngState: decoded.runtime?.prngState ?? 0n,\n nowMs: decoded.runtime?.nowMs ?? DEFAULT_NOW.getTime(),\n seed: DEFAULT_DATABASE_SEED,\n randomMode: \"deterministic\",\n systemClock: false,\n bytes,\n runtimePresent: decoded.runtime !== null,\n });\n bytesCache.set(bytes, snap);\n return snap;\n }\n}\n\n/** @internal Capture live engine state without encoding. */\nexport function captureSnapshot(\n state: DatabaseState,\n prng: Prng,\n now: Clock,\n seed: number | bigint,\n randomMode: RandomMode,\n systemClock: boolean,\n): Snapshot {\n state.freezeShared();\n return new Snapshot({\n state: state.cloneShallow(),\n prngState: prng.getState(),\n nowMs: now().getTime(),\n seed,\n randomMode,\n systemClock,\n runtimePresent: true,\n });\n}\n\n/** @internal */\nexport function openSnapshot(snapshot: Snapshot, options: DatabaseOptions = {}): Database {\n const seed = options.seed ?? snapshot.seed;\n const randomMode = options.random ?? snapshot.randomMode;\n const systemClock = options.now === \"system\" || (options.now === undefined && snapshot.systemClock);\n const prng = randomMode === \"os\" ? new OsEntropy() : new Prng(seed);\n if (snapshot.runtimePresent && randomMode !== \"os\") prng.setState(snapshot.prngState);\n let now = resolveClock(systemClock ? \"system\" : options.now);\n if (snapshot.runtimePresent && !systemClock) now = fixedClock(new Date(snapshot.nowMs));\n return createAdoptedDatabase({\n state: snapshot.state.cloneShallow(),\n prng,\n now,\n seed,\n randomMode,\n systemClock,\n });\n}\n", "import { coerceToNumber, compareSql, type SqlValue, utf8Decode } from \"../types/value.ts\";\n\nexport interface AggregateAccumulator {\n step(args: SqlValue[]): void;\n finalize(): SqlValue;\n}\n\nexport type AggregateFactory = () => AggregateAccumulator;\n\nclass CountAccumulator implements AggregateAccumulator {\n private count = 0;\n step(args: SqlValue[]): void {\n if (args.length === 0 || args[0] !== null) this.count++;\n }\n finalize(): SqlValue {\n return this.count;\n }\n}\n\nclass NumericAccumulator implements AggregateAccumulator {\n private count = 0;\n private sum = 0;\n constructor(private readonly mode: \"sum\" | \"avg\" | \"total\") {}\n step(args: SqlValue[]): void {\n const value = args[0];\n if (value === null || value === undefined) return;\n this.sum += coerceToNumber(value) ?? 0;\n this.count++;\n }\n finalize(): SqlValue {\n if (this.mode === \"total\") return this.sum;\n if (this.count === 0) return null;\n return this.mode === \"avg\" ? this.sum / this.count : this.sum;\n }\n}\n\nclass MinMaxAccumulator implements AggregateAccumulator {\n private value: SqlValue = null;\n constructor(private readonly direction: \"min\" | \"max\") {}\n step(args: SqlValue[]): void {\n const candidate = args[0];\n if (candidate === null || candidate === undefined) return;\n if (this.value === null) {\n this.value = candidate;\n return;\n }\n const comparison = compareSql(candidate, this.value)!;\n if ((this.direction === \"min\" && comparison < 0) || (this.direction === \"max\" && comparison > 0)) {\n this.value = candidate;\n }\n }\n finalize(): SqlValue {\n return this.value;\n }\n}\n\nclass GroupConcatAccumulator implements AggregateAccumulator {\n private readonly values: string[] = [];\n private separator = \",\";\n step(args: SqlValue[]): void {\n if (args[0] === null || args[0] === undefined) return;\n if (args[1] !== undefined && args[1] !== null) this.separator = String(args[1]);\n this.values.push(args[0] instanceof Uint8Array ? utf8Decode(args[0]) : String(args[0]));\n }\n finalize(): SqlValue {\n return this.values.length === 0 ? null : this.values.join(this.separator);\n }\n}\n\nexport const aggregateFunctions: Readonly<Record<string, AggregateFactory>> = {\n count: () => new CountAccumulator(),\n sum: () => new NumericAccumulator(\"sum\"),\n avg: () => new NumericAccumulator(\"avg\"),\n total: () => new NumericAccumulator(\"total\"),\n min: () => new MinMaxAccumulator(\"min\"),\n max: () => new MinMaxAccumulator(\"max\"),\n group_concat: () => new GroupConcatAccumulator(),\n string_agg: () => new GroupConcatAccumulator(),\n};\n\nexport function createAggregate(name: string): AggregateAccumulator | undefined {\n return aggregateFunctions[name.toLowerCase()]?.();\n}\n", "import { coerceToNumber, isSqlReal, type SqlValue } from \"../types/value.ts\";\nimport type { FunctionContext, ScalarFunction } from \"./registry.ts\";\n\nconst JULIAN_UNIX_EPOCH = 2440587.5;\n\nfunction parseDate(value: SqlValue | undefined, context: FunctionContext): Date | null {\n if (value === undefined || value === \"now\") {\n return context.now?.() ?? new Date(\"2000-01-01T00:00:00.000Z\");\n }\n if (value === null || value instanceof Uint8Array) return null;\n if (typeof value === \"number\" || typeof value === \"bigint\" || isSqlReal(value)) {\n return new Date((Number(isSqlReal(value) ? value.value : value) - JULIAN_UNIX_EPOCH) * 86400000);\n }\n if (typeof value !== \"string\") return null;\n const source = /^\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?$/.test(value)\n ? `2000-01-01T${value}Z`\n : /^\\d{4}-\\d\\d-\\d\\d$/.test(value)\n ? `${value}T00:00:00Z`\n : value.replace(\" \", \"T\") + (/[zZ]|[+-]\\d\\d:\\d\\d$/.test(value) ? \"\" : \"Z\");\n const date = new Date(source);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\nfunction applyModifier(date: Date, modifier: string, flags: { subsec: boolean }): Date | null {\n const result = new Date(date);\n const normalized = modifier.trim().toLowerCase();\n if (normalized === \"unixepoch\") return new Date((date.getTime() / 86400000 + JULIAN_UNIX_EPOCH) * 1000);\n if (normalized === \"utc\" || normalized === \"localtime\") return result;\n if (normalized === \"subsec\" || normalized === \"subsecond\") {\n flags.subsec = true;\n return result;\n }\n // Accepted by SQLite; when not attached to a prior fractional add they are effectively no-ops.\n if (normalized === \"floor\" || normalized === \"ceiling\") return result;\n const weekday = /^weekday\\s+([0-6])$/.exec(normalized);\n if (weekday) {\n const target = Number(weekday[1]);\n result.setUTCDate(result.getUTCDate() + ((target - result.getUTCDay() + 7) % 7));\n } else if (normalized === \"start of day\") result.setUTCHours(0, 0, 0, 0);\n else if (normalized === \"start of month\") {\n result.setUTCDate(1);\n result.setUTCHours(0, 0, 0, 0);\n } else if (normalized === \"start of year\") {\n result.setUTCMonth(0, 1);\n result.setUTCHours(0, 0, 0, 0);\n } else {\n const match = /^([+-]?\\d+(?:\\.\\d+)?)\\s+(second|minute|hour|day|month|year)s?$/.exec(normalized);\n if (!match) return null;\n const amount = Number(match[1]);\n switch (match[2]) {\n case \"second\":\n result.setTime(result.getTime() + amount * 1000);\n break;\n case \"minute\":\n result.setTime(result.getTime() + amount * 60000);\n break;\n case \"hour\":\n result.setTime(result.getTime() + amount * 3600000);\n break;\n case \"day\":\n result.setTime(result.getTime() + amount * 86400000);\n break;\n case \"month\":\n result.setUTCMonth(result.getUTCMonth() + amount);\n break;\n case \"year\":\n result.setUTCFullYear(result.getUTCFullYear() + amount);\n break;\n }\n }\n return result;\n}\n\nfunction applyModifiers(date: Date, modifiers: SqlValue[]): { date: Date; subsec: boolean } | null {\n const flags = { subsec: false };\n let current = date;\n for (const modifier of modifiers) {\n if (typeof modifier !== \"string\") return null;\n const next = applyModifier(current, modifier, flags);\n if (!next) return null;\n current = next;\n }\n return { date: current, subsec: flags.subsec };\n}\n\n/** Prefer direct unix\u2192ms to avoid julian float round-trip (off-by-one on some integers). */\nfunction fromUnixSeconds(seconds: number): Date | null {\n const date = new Date(seconds * 1000);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\nfunction resolveDate(args: SqlValue[], context: FunctionContext): { date: Date; subsec: boolean } | null {\n let source = args[0];\n let modifiers = args.slice(1);\n if (source === undefined) source = \"now\";\n if (modifiers[0] === \"unixepoch\") {\n const seconds = coerceToNumber(source);\n if (seconds === null) return null;\n const date = fromUnixSeconds(seconds);\n if (!date) return null;\n return applyModifiers(date, modifiers.slice(1));\n }\n if (typeof modifiers[0] === \"string\" && modifiers[0].trim().toLowerCase() === \"auto\") {\n const number = coerceToNumber(source);\n if (number === null) {\n // Non-numeric timestring: SQLite ignores auto and parses the timestring.\n modifiers = modifiers.slice(1);\n } else if (number >= 0 && number < 5373484.5) {\n // Julian day number.\n source = number;\n modifiers = modifiers.slice(1);\n } else {\n const date = fromUnixSeconds(number);\n if (!date) return null;\n return applyModifiers(date, modifiers.slice(1));\n }\n }\n const date = parseDate(source, context);\n if (!date) return null;\n return applyModifiers(date, modifiers);\n}\n\nfunction pad(value: number, length = 2): string {\n return String(value).padStart(length, \"0\");\n}\n\nfunction isoDate(date: Date): string {\n return `${pad(date.getUTCFullYear(), 4)}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`;\n}\n\nfunction isoTime(date: Date, subsec = false): string {\n const base = `${pad(date.getUTCHours())}:${pad(date.getUTCMinutes())}:${pad(date.getUTCSeconds())}`;\n return subsec ? `${base}.${pad(date.getUTCMilliseconds(), 3)}` : base;\n}\n\nfunction dayOfYear(date: Date): number {\n return (\n Math.floor(\n (Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()) - Date.UTC(date.getUTCFullYear(), 0, 1)) /\n 86400000,\n ) + 1\n );\n}\n\nfunction formatDate(date: Date, format: string): string {\n return format.replace(/%[%YmdHMSfjswWJ]/g, (code) => {\n switch (code) {\n case \"%%\":\n return \"%\";\n case \"%Y\":\n return pad(date.getUTCFullYear(), 4);\n case \"%m\":\n return pad(date.getUTCMonth() + 1);\n case \"%d\":\n return pad(date.getUTCDate());\n case \"%H\":\n return pad(date.getUTCHours());\n case \"%M\":\n return pad(date.getUTCMinutes());\n case \"%S\":\n return pad(date.getUTCSeconds());\n case \"%f\":\n return `${pad(date.getUTCSeconds())}.${pad(date.getUTCMilliseconds(), 3)}`;\n case \"%j\":\n return pad(dayOfYear(date), 3);\n case \"%s\":\n return String(Math.floor(date.getTime() / 1000));\n case \"%w\":\n return String(date.getUTCDay());\n case \"%W\":\n return pad(Math.floor((dayOfYear(date) - 1 + 7 - date.getUTCDay()) / 7));\n case \"%J\":\n return String(date.getTime() / 86400000 + JULIAN_UNIX_EPOCH);\n default:\n return code;\n }\n });\n}\n\nexport const dateTimeFunctions: Readonly<Record<string, ScalarFunction>> = {\n date(args, context) {\n const value = resolveDate(args, context);\n return value ? isoDate(value.date) : null;\n },\n time(args, context) {\n const value = resolveDate(args, context);\n return value ? isoTime(value.date, value.subsec) : null;\n },\n datetime(args, context) {\n const value = resolveDate(args, context);\n return value ? `${isoDate(value.date)} ${isoTime(value.date, value.subsec)}` : null;\n },\n julianday(args, context) {\n const value = resolveDate(args, context);\n return value ? value.date.getTime() / 86400000 + JULIAN_UNIX_EPOCH : null;\n },\n strftime(args, context) {\n if (typeof args[0] !== \"string\") return null;\n const value = resolveDate(args.slice(1), context);\n return value ? formatDate(value.date, args[0]) : null;\n },\n current_date(args, context) {\n return dateTimeFunctions.date!(args.length === 0 ? [\"now\"] : args, context);\n },\n current_time(args, context) {\n return dateTimeFunctions.time!(args.length === 0 ? [\"now\"] : args, context);\n },\n current_timestamp(args, context) {\n return dateTimeFunctions.datetime!(args.length === 0 ? [\"now\"] : args, context);\n },\n unixepoch(args, context) {\n const value = resolveDate(args.length === 0 ? [\"now\"] : args, context);\n return value ? Math.floor(value.date.getTime() / 1000) : null;\n },\n timediff(args) {\n if (args.length !== 2) return null;\n const a = parseDate(args[0], {});\n const b = parseDate(args[1], {});\n if (!a || !b) return null;\n let ms = a.getTime() - b.getTime();\n const sign = ms < 0 ? \"-\" : \"+\";\n ms = Math.abs(ms);\n const years = Math.floor(ms / (365.2425 * 86400000));\n ms -= years * 365.2425 * 86400000;\n // Approximate month/day breakdown matching SQLite's YYYY-MM-DD HH:MM:SS.mmm style\n const months = Math.floor(ms / (30.436875 * 86400000));\n ms -= months * 30.436875 * 86400000;\n const days = Math.floor(ms / 86400000);\n ms -= days * 86400000;\n const hours = Math.floor(ms / 3600000);\n ms -= hours * 3600000;\n const minutes = Math.floor(ms / 60000);\n ms -= minutes * 60000;\n const seconds = Math.floor(ms / 1000);\n const millis = Math.floor(ms % 1000);\n const p = (n: number, w: number) => String(n).padStart(w, \"0\");\n return `${sign}${p(years, 4)}-${p(months, 2)}-${p(days, 2)} ${p(hours, 2)}:${p(minutes, 2)}:${p(seconds, 2)}.${p(millis, 3)}`;\n },\n};\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\nimport type { Fts5VirtualTable } from \"../vtable/fts5.ts\";\nimport type { FunctionContext, ScalarFunction } from \"./registry.ts\";\n\nfunction requireArgs(name: string, args: SqlValue[], min: number, max = min): void {\n if (args.length < min || args.length > max) {\n throw new SqliteError(`wrong number of arguments to function ${name}()`, \"misuse\");\n }\n}\n\nfunction resolveFtsTable(args: SqlValue[], context: FunctionContext, name: string) {\n const first = args[0];\n let tableName: string | null = null;\n if (typeof first === \"string\") tableName = first;\n else if (context.ftsSourceTable) tableName = context.ftsSourceTable;\n else if (context.ftsMatch) tableName = context.ftsMatch.tableName;\n if (!tableName || !context.getFtsTable) {\n throw new SqliteError(`unable to use function ${name} in the requested context`, \"unsupported\");\n }\n const table = context.getFtsTable(tableName);\n if (!table) throw new SqliteError(`unable to use function ${name} in the requested context`, \"unsupported\");\n return table;\n}\n\nfunction columnText(table: Fts5VirtualTable, context: FunctionContext, colIndex: number): string {\n const col = table.columns[colIndex];\n if (!col) return \"\";\n const rowid = context.ftsMatch?.rowid ?? context.ftsRowid;\n if (rowid === undefined) return \"\";\n const row = table.rows.get(rowid);\n if (!row) return \"\";\n const value = row.values.get(col.toLowerCase());\n return value === null || value === undefined ? \"\" : String(value);\n}\n\n/**\n * FTS auxiliary functions. When used with a MATCH cursor they compute real\n * values; without MATCH they mirror SQLite's empty-cursor defaults.\n */\nexport const ftsAuxFunctions: Readonly<Record<string, ScalarFunction>> = {\n bm25(args, context) {\n requireArgs(\"bm25\", args, 1, 100);\n const table = resolveFtsTable(args, context, \"bm25\");\n const weights = args.slice(1).map((v) => (typeof v === \"number\" ? v : Number(v)));\n if (!context.ftsMatch || context.ftsMatch.tableName.toLowerCase() !== table.name.toLowerCase()) {\n return -0;\n }\n return table.bm25(context.ftsMatch, weights.length ? weights : undefined);\n },\n highlight(args, context) {\n requireArgs(\"highlight\", args, 4);\n const table = resolveFtsTable(args, context, \"highlight\");\n const colIndex = Number(args[1] ?? 0);\n const open = String(args[2] ?? \"\");\n const close = String(args[3] ?? \"\");\n if (!context.ftsMatch || context.ftsMatch.tableName.toLowerCase() !== table.name.toLowerCase()) {\n return columnText(table, context, colIndex);\n }\n return table.highlight(context.ftsMatch, colIndex, open, close);\n },\n snippet(args, context) {\n requireArgs(\"snippet\", args, 1, 6);\n const table = resolveFtsTable(args, context, \"snippet\");\n const colIndex = Number(args[1] ?? 0);\n const open = String(args[2] ?? \"<b>\");\n const close = String(args[3] ?? \"</b>\");\n const ellipsis = String(args[4] ?? \"...\");\n const tokenCount = Number(args[5] ?? 64);\n if (!context.ftsMatch || context.ftsMatch.tableName.toLowerCase() !== table.name.toLowerCase()) {\n return columnText(table, context, colIndex);\n }\n return table.snippet(context.ftsMatch, colIndex, open, close, ellipsis, tokenCount);\n },\n matchinfo(args, context) {\n requireArgs(\"matchinfo\", args, 1, 2);\n const table = resolveFtsTable(args, context, \"matchinfo\");\n const format = typeof args[1] === \"string\" ? args[1] : \"pcx\";\n if (!context.ftsMatch) {\n throw new SqliteError(\"unable to use function matchinfo in the requested context\", \"unsupported\");\n }\n return table.matchinfo(context.ftsMatch, format);\n },\n offsets(args, context) {\n requireArgs(\"offsets\", args, 1);\n const table = resolveFtsTable(args, context, \"offsets\");\n if (!context.ftsMatch) {\n throw new SqliteError(\"unable to use function offsets in the requested context\", \"unsupported\");\n }\n return table.offsets(context.ftsMatch);\n },\n};\n\nexport const rtreeAuxFunctions: Readonly<Record<string, ScalarFunction>> = {\n rtreecheck(args) {\n requireArgs(\"rtreecheck\", args, 1, 2);\n if (args.length === 1) return \"ok\";\n throw new SqliteError(\"SQL logic error\", \"other\");\n },\n rtreenode(args) {\n requireArgs(\"rtreenode\", args, 2);\n return \"{}\";\n },\n rtreedepth(args) {\n requireArgs(\"rtreedepth\", args, 1);\n return 0;\n },\n};\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { JsonNode } from \"./types.ts\";\n\nexport class JsonParseError extends Error {\n constructor(\n message: string,\n readonly position: number,\n ) {\n super(message);\n this.name = \"JsonParseError\";\n }\n}\n\n/** Parse JSON / JSON5-ish input into a JsonNode. Position is 1-based for errors. */\nexport function parseJsonText(input: string, options?: { strictCanonical?: boolean }): JsonNode {\n const parser = new JsonTextParser(input, options?.strictCanonical ?? false);\n const node = parser.parseValue();\n parser.skipWs();\n if (!parser.eof()) {\n throw new JsonParseError(\"malformed JSON\", parser.pos1());\n }\n return node;\n}\n\nexport function jsonErrorPosition(input: string): number {\n try {\n parseJsonText(input);\n return 0;\n } catch (e) {\n if (e instanceof JsonParseError) return e.position;\n return 1;\n }\n}\n\nexport function isValidJsonText(input: string, flags = 0): boolean {\n // SQLite flags: 0x01 accepts canonical RFC-8259 JSON and 0x02 accepts\n // JSON5. With no explicit flags json_valid() uses canonical JSON.\n const allowCanonical = flags === 0 || (flags & 0x01) !== 0;\n const allowJson5 = (flags & 0x02) !== 0;\n try {\n if (allowJson5) {\n parseJsonText(input);\n return true;\n }\n if (allowCanonical) {\n parseJsonText(input, { strictCanonical: true });\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\n\nclass JsonTextParser {\n private i = 0;\n constructor(\n private readonly s: string,\n private readonly strictCanonical: boolean,\n ) {}\n\n eof(): boolean {\n return this.i >= this.s.length;\n }\n\n pos1(): number {\n return this.i + 1;\n }\n\n peek(n = 0): string {\n return this.s[this.i + n] ?? \"\";\n }\n\n advance(): string {\n return this.s[this.i++] ?? \"\";\n }\n\n skipWs(): void {\n while (this.i < this.s.length) {\n const ch = this.peek();\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\v\" || ch === \"\\f\") {\n this.advance();\n continue;\n }\n if (!this.strictCanonical && ch === \"/\" && this.peek(1) === \"/\") {\n this.i += 2;\n while (!this.eof() && this.peek() !== \"\\n\") this.advance();\n continue;\n }\n if (!this.strictCanonical && ch === \"/\" && this.peek(1) === \"*\") {\n this.i += 2;\n while (!this.eof() && !(this.peek() === \"*\" && this.peek(1) === \"/\")) this.advance();\n if (!this.eof()) this.i += 2;\n continue;\n }\n break;\n }\n }\n\n parseValue(): JsonNode {\n this.skipWs();\n if (this.eof()) throw new JsonParseError(\"malformed JSON\", this.pos1());\n const ch = this.peek();\n if (ch === \"{\") return this.parseObject();\n if (ch === \"[\") return this.parseArray();\n if (ch === '\"' || (!this.strictCanonical && ch === \"'\")) return this.parseString();\n if (ch === \"-\" || ch === \"+\" || (ch >= \"0\" && ch <= \"9\") || ch === \".\") return this.parseNumber();\n if (ch === \"n\" || ch === \"N\") return this.parseKeyword();\n if (ch === \"t\" || ch === \"T\" || ch === \"f\" || ch === \"F\" || ch === \"I\" || ch === \"i\") {\n return this.parseKeyword();\n }\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n\n parseObject(): JsonNode {\n this.advance(); // {\n this.skipWs();\n const entries: Array<{ key: string; value: JsonNode }> = [];\n if (this.peek() === \"}\") {\n this.advance();\n return { kind: \"object\", entries };\n }\n while (true) {\n this.skipWs();\n let key: string;\n if (this.peek() === '\"' || (!this.strictCanonical && this.peek() === \"'\")) {\n const str = this.parseString();\n key = (str as { kind: \"string\"; value: string }).value;\n } else if (!this.strictCanonical && this.isIdentStart(this.peek())) {\n key = this.parseIdent();\n } else {\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n this.skipWs();\n if (this.advance() !== \":\") throw new JsonParseError(\"malformed JSON\", this.pos1());\n const value = this.parseValue();\n entries.push({ key, value });\n this.skipWs();\n const sep = this.peek();\n if (sep === \",\") {\n this.advance();\n this.skipWs();\n if (!this.strictCanonical && this.peek() === \"}\") {\n this.advance();\n break;\n }\n continue;\n }\n if (sep === \"}\") {\n this.advance();\n break;\n }\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n return { kind: \"object\", entries };\n }\n\n parseArray(): JsonNode {\n this.advance(); // [\n this.skipWs();\n const elements: JsonNode[] = [];\n if (this.peek() === \"]\") {\n this.advance();\n return { kind: \"array\", elements };\n }\n while (true) {\n elements.push(this.parseValue());\n this.skipWs();\n const sep = this.peek();\n if (sep === \",\") {\n this.advance();\n this.skipWs();\n if (!this.strictCanonical && this.peek() === \"]\") {\n this.advance();\n break;\n }\n continue;\n }\n if (sep === \"]\") {\n this.advance();\n break;\n }\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n return { kind: \"array\", elements };\n }\n\n parseString(): JsonNode {\n const quote = this.advance();\n if (this.strictCanonical && quote !== '\"') {\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n let out = \"\";\n while (!this.eof()) {\n const ch = this.advance();\n if (ch === quote) return { kind: \"string\", value: out };\n if (ch === \"\\\\\") {\n if (this.eof()) throw new JsonParseError(\"malformed JSON\", this.pos1());\n const esc = this.advance();\n switch (esc) {\n case '\"':\n case \"'\":\n case \"\\\\\":\n case \"/\":\n out += esc;\n break;\n case \"b\":\n out += \"\\b\";\n break;\n case \"f\":\n out += \"\\f\";\n break;\n case \"n\":\n out += \"\\n\";\n break;\n case \"r\":\n out += \"\\r\";\n break;\n case \"t\":\n out += \"\\t\";\n break;\n case \"u\": {\n const hex = this.s.slice(this.i, this.i + 4);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) throw new JsonParseError(\"malformed JSON\", this.pos1());\n this.i += 4;\n out += String.fromCharCode(parseInt(hex, 16));\n break;\n }\n case \"\\n\":\n case \"\\r\":\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n if (esc === \"\\r\" && this.peek() === \"\\n\") this.advance();\n break;\n default:\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n out += esc;\n }\n continue;\n }\n if (ch === \"\\n\" || ch === \"\\r\") {\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n out += ch;\n }\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n\n parseNumber(): JsonNode {\n const start = this.i;\n if (this.peek() === \"+\" || this.peek() === \"-\") {\n if (this.strictCanonical && this.peek() === \"+\") {\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n this.advance();\n }\n // Infinity / NaN handled via keyword if letter\n if (/[A-Za-z]/.test(this.peek())) {\n this.i = start;\n return this.parseKeyword();\n }\n if (this.peek() === \"0\" && /[xX]/.test(this.peek(1))) {\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n this.i += 2;\n while (/[0-9a-fA-F]/.test(this.peek())) this.advance();\n const text = this.s.slice(start, this.i);\n const n = Number(text);\n if (!Number.isFinite(n)) throw new JsonParseError(\"malformed JSON\", start + 1);\n return Number.isInteger(n) ? { kind: \"integer\", text: String(Math.trunc(n)) } : { kind: \"real\", text: String(n) };\n }\n let seenDot = false;\n let seenExp = false;\n if (this.peek() === \".\") {\n if (this.strictCanonical) throw new JsonParseError(\"malformed JSON\", this.pos1());\n seenDot = true;\n this.advance();\n }\n if (!(this.peek() >= \"0\" && this.peek() <= \"9\") && !seenDot) {\n throw new JsonParseError(\"malformed JSON\", this.pos1());\n }\n while (this.peek() >= \"0\" && this.peek() <= \"9\") this.advance();\n if (this.peek() === \".\") {\n seenDot = true;\n this.advance();\n while (this.peek() >= \"0\" && this.peek() <= \"9\") this.advance();\n }\n if (this.peek() === \"e\" || this.peek() === \"E\") {\n seenExp = true;\n this.advance();\n if (this.peek() === \"+\" || this.peek() === \"-\") this.advance();\n if (!(this.peek() >= \"0\" && this.peek() <= \"9\")) throw new JsonParseError(\"malformed JSON\", this.pos1());\n while (this.peek() >= \"0\" && this.peek() <= \"9\") this.advance();\n }\n const raw = this.s.slice(start, this.i);\n if (this.strictCanonical) {\n if (raw.startsWith(\"+\")) throw new JsonParseError(\"malformed JSON\", start + 1);\n if (raw.includes(\".\") && (raw.startsWith(\".\") || raw.endsWith(\".\") || /\\.-|\\+\\./.test(raw))) {\n // trailing/leading dot rejected in strict \u2014 already partially handled\n }\n if (/^-?0\\d/.test(raw)) throw new JsonParseError(\"malformed JSON\", start + 1);\n }\n const canon = canonicalizeNumberText(raw);\n if (canon.kind === \"integer\" || (!seenDot && !seenExp && !raw.includes(\".\"))) {\n // Prefer integer when no fractional/exponent markers in original (after leading +-)\n const body = raw.replace(/^[+-]/, \"\");\n if (!body.includes(\".\") && !/[eE]/.test(body)) {\n return { kind: \"integer\", text: canon.text };\n }\n }\n return { kind: \"real\", text: canon.text };\n }\n\n parseKeyword(): JsonNode {\n const start = this.i;\n while (/[A-Za-z]/.test(this.peek())) this.advance();\n const word = this.s.slice(start, this.i);\n const lower = word.toLowerCase();\n if (lower === \"null\") return { kind: \"null\" };\n if (lower === \"true\") return { kind: \"true\" };\n if (lower === \"false\") return { kind: \"false\" };\n if (!this.strictCanonical) {\n if (lower === \"nan\" || lower === \"qnan\" || lower === \"snan\") return { kind: \"null\" };\n if (lower === \"infinity\" || lower === \"inf\") {\n const _sign = this.s[start - 1] === \"-\" ? \"-\" : \"\";\n // Treat as null-ish? Docs say Inf is allowed in JSON5 input and converted; use a large number string?\n // SQLite converts Infinity to null when rendering? Actually json() of Infinity might error or become null.\n // Probe showed NaN -> null. For Inf, check:\n return { kind: \"null\" };\n }\n }\n throw new JsonParseError(\"malformed JSON\", start + 1);\n }\n\n isIdentStart(ch: string): boolean {\n return /[A-Za-z_$]/.test(ch) || (ch.length > 0 && ch.charCodeAt(0) > 0x7f);\n }\n\n parseIdent(): string {\n let out = \"\";\n while (!this.eof()) {\n const ch = this.peek();\n if (/[A-Za-z0-9_$]/.test(ch) || ch.charCodeAt(0) > 0x7f) {\n out += this.advance();\n continue;\n }\n break;\n }\n if (!out) throw new JsonParseError(\"malformed JSON\", this.pos1());\n return out;\n }\n}\n\nfunction canonicalizeNumberText(raw: string): { kind: \"integer\" | \"real\"; text: string } {\n let s = raw.trim();\n if (s.startsWith(\"+\")) s = s.slice(1);\n const n = Number(s);\n if (!Number.isFinite(n)) {\n throw new JsonParseError(\"malformed JSON\", 1);\n }\n if (Number.isInteger(n) && !/[eE.]/.test(s.replace(/^-/, \"\"))) {\n return { kind: \"integer\", text: String(Math.trunc(n)) };\n }\n // Prefer a stable JSON number rendering\n let text = String(n);\n if (text.includes(\"e\") || text.includes(\"E\")) {\n // keep JS default\n } else if (text.endsWith(\".0\") && Number.isInteger(n)) {\n text = String(Math.trunc(n));\n return { kind: \"integer\", text };\n }\n return { kind: Number.isInteger(n) && !s.includes(\".\") && !/[eE]/.test(s) ? \"integer\" : \"real\", text };\n}\n\nexport function malformedJsonError(position?: number): SqliteError {\n return new SqliteError(position !== undefined ? `malformed JSON` : \"malformed JSON\", \"other\");\n}\n", "import type { JsonNode } from \"./types.ts\";\n\nexport function stringifyJson(node: JsonNode): string {\n switch (node.kind) {\n case \"null\":\n return \"null\";\n case \"true\":\n return \"true\";\n case \"false\":\n return \"false\";\n case \"integer\":\n case \"real\":\n return node.text;\n case \"string\":\n return jsonQuoteString(node.value);\n case \"array\":\n return `[${node.elements.map(stringifyJson).join(\",\")}]`;\n case \"object\":\n return `{${node.entries.map((e) => `${jsonQuoteString(e.key)}:${stringifyJson(e.value)}`).join(\",\")}}`;\n }\n}\n\nexport function jsonQuoteString(value: string): string {\n let out = '\"';\n for (let i = 0; i < value.length; i++) {\n const ch = value[i]!;\n const code = ch.charCodeAt(0);\n switch (ch) {\n case '\"':\n out += '\\\\\"';\n break;\n case \"\\\\\":\n out += \"\\\\\\\\\";\n break;\n case \"\\b\":\n out += \"\\\\b\";\n break;\n case \"\\f\":\n out += \"\\\\f\";\n break;\n case \"\\n\":\n out += \"\\\\n\";\n break;\n case \"\\r\":\n out += \"\\\\r\";\n break;\n case \"\\t\":\n out += \"\\\\t\";\n break;\n default:\n if (code < 0x20) {\n out += `\\\\u${code.toString(16).padStart(4, \"0\")}`;\n } else {\n out += ch;\n }\n }\n }\n return `${out}\"`;\n}\n\nexport function prettyJson(node: JsonNode, indent = \" \"): string {\n return prettyNode(node, indent, 0);\n}\n\nfunction prettyNode(node: JsonNode, indent: string, depth: number): string {\n const pad = indent.repeat(depth);\n const padInner = indent.repeat(depth + 1);\n switch (node.kind) {\n case \"array\":\n if (node.elements.length === 0) return \"[]\";\n return `[\\n${node.elements.map((e) => `${padInner}${prettyNode(e, indent, depth + 1)}`).join(\",\\n\")}\\n${pad}]`;\n case \"object\":\n if (node.entries.length === 0) return \"{}\";\n return `{\\n${node.entries\n .map((e) => `${padInner}${jsonQuoteString(e.key)}: ${prettyNode(e.value, indent, depth + 1)}`)\n .join(\",\\n\")}\\n${pad}}`;\n default:\n return stringifyJson(node);\n }\n}\n", "import { utf8Decode, utf8Encode } from \"../types/value.ts\";\nimport { JsonParseError, parseJsonText } from \"./parse.ts\";\nimport { stringifyJson } from \"./stringify.ts\";\nimport type { JsonNode } from \"./types.ts\";\n\n/** JSONB element types (low nibble). */\nexport const JB = {\n NULL: 0,\n TRUE: 1,\n FALSE: 2,\n INT: 3,\n INT5: 4,\n FLOAT: 5,\n FLOAT5: 6,\n TEXT: 7,\n TEXTJ: 8,\n TEXT5: 9,\n TEXTRAW: 10,\n ARRAY: 11,\n OBJECT: 12,\n} as const;\n\nexport function encodeJsonb(node: JsonNode): Uint8Array {\n const parts: number[] = [];\n writeNode(node, parts);\n return Uint8Array.from(parts);\n}\n\nfunction writeNode(node: JsonNode, out: number[]): void {\n switch (node.kind) {\n case \"null\":\n writeHeader(out, 0, JB.NULL);\n break;\n case \"true\":\n writeHeader(out, 0, JB.TRUE);\n break;\n case \"false\":\n writeHeader(out, 0, JB.FALSE);\n break;\n case \"integer\": {\n const payload = utf8Encode(node.text);\n writeHeader(out, payload.length, JB.INT);\n for (const b of payload) out.push(b);\n break;\n }\n case \"real\": {\n const payload = utf8Encode(node.text);\n writeHeader(out, payload.length, JB.FLOAT);\n for (const b of payload) out.push(b);\n break;\n }\n case \"string\": {\n const payload = utf8Encode(node.value);\n const needsEscape = [...node.value].some((ch) => {\n const c = ch.charCodeAt(0);\n return ch === '\"' || ch === \"\\\\\" || c < 0x20;\n });\n // Prefer TEXT when no escapes needed; TEXTRAW if chars need escaping in JSON text\n const type = needsEscape ? JB.TEXTRAW : JB.TEXT;\n writeHeader(out, payload.length, type);\n for (const b of payload) out.push(b);\n break;\n }\n case \"array\": {\n const payload: number[] = [];\n for (const el of node.elements) writeNode(el, payload);\n writeHeader(out, payload.length, JB.ARRAY);\n out.push(...payload);\n break;\n }\n case \"object\": {\n const payload: number[] = [];\n for (const entry of node.entries) {\n writeNode({ kind: \"string\", value: entry.key }, payload);\n writeNode(entry.value, payload);\n }\n writeHeader(out, payload.length, JB.OBJECT);\n out.push(...payload);\n break;\n }\n }\n}\n\nfunction writeHeader(out: number[], size: number, type: number): void {\n if (size <= 11) {\n out.push((size << 4) | type);\n return;\n }\n if (size <= 0xff) {\n out.push((12 << 4) | type, size);\n return;\n }\n if (size <= 0xffff) {\n out.push((13 << 4) | type, (size >> 8) & 0xff, size & 0xff);\n return;\n }\n out.push((14 << 4) | type, (size >> 24) & 0xff, (size >> 16) & 0xff, (size >> 8) & 0xff, size & 0xff);\n}\n\nexport interface JsonbElement {\n offset: number;\n end: number;\n type: number;\n payloadOffset: number;\n payloadSize: number;\n}\n\nexport function readHeader(blob: Uint8Array, offset: number): JsonbElement {\n if (offset >= blob.length) throw new JsonParseError(\"malformed JSON\", offset + 1);\n const first = blob[offset]!;\n const sizeCode = first >> 4;\n const type = first & 0x0f;\n let headerSize = 1;\n let payloadSize = sizeCode;\n if (sizeCode >= 12) {\n const lenBytes = sizeCode === 12 ? 1 : sizeCode === 13 ? 2 : sizeCode === 14 ? 4 : 8;\n headerSize = 1 + lenBytes;\n if (offset + headerSize > blob.length) throw new JsonParseError(\"malformed JSON\", offset + 1);\n payloadSize = 0;\n for (let i = 0; i < lenBytes; i++) {\n payloadSize = (payloadSize << 8) | blob[offset + 1 + i]!;\n }\n }\n const payloadOffset = offset + headerSize;\n const end = payloadOffset + payloadSize;\n if (end > blob.length) throw new JsonParseError(\"malformed JSON\", offset + 1);\n return { offset, end, type, payloadOffset, payloadSize };\n}\n\nexport function looksLikeJsonb(blob: Uint8Array): boolean {\n if (blob.length === 0) return false;\n try {\n const el = readHeader(blob, 0);\n return el.end === blob.length && el.type <= JB.OBJECT;\n } catch {\n return false;\n }\n}\n\nexport function decodeJsonb(blob: Uint8Array): JsonNode {\n const el = readHeader(blob, 0);\n if (el.end !== blob.length) throw new JsonParseError(\"malformed JSON\", 1);\n return decodeElement(blob, el);\n}\n\nfunction decodeElement(blob: Uint8Array, el: JsonbElement): JsonNode {\n switch (el.type) {\n case JB.NULL:\n return { kind: \"null\" };\n case JB.TRUE:\n return { kind: \"true\" };\n case JB.FALSE:\n return { kind: \"false\" };\n case JB.INT:\n case JB.INT5: {\n const text = utf8Decode(blob.subarray(el.payloadOffset, el.end));\n return { kind: \"integer\", text: normalizeIntText(text) };\n }\n case JB.FLOAT:\n case JB.FLOAT5: {\n const text = utf8Decode(blob.subarray(el.payloadOffset, el.end));\n return { kind: \"real\", text };\n }\n case JB.TEXT:\n case JB.TEXTJ:\n case JB.TEXT5:\n case JB.TEXTRAW: {\n const raw = utf8Decode(blob.subarray(el.payloadOffset, el.end));\n if (el.type === JB.TEXT || el.type === JB.TEXTRAW) return { kind: \"string\", value: raw };\n // TEXTJ / TEXT5 store escaped content without quotes \u2014 unescape lightly\n return { kind: \"string\", value: unescapeJsonPayload(raw) };\n }\n case JB.ARRAY: {\n const elements: JsonNode[] = [];\n let pos = el.payloadOffset;\n while (pos < el.end) {\n const child = readHeader(blob, pos);\n elements.push(decodeElement(blob, child));\n pos = child.end;\n }\n return { kind: \"array\", elements };\n }\n case JB.OBJECT: {\n const entries: Array<{ key: string; value: JsonNode }> = [];\n let pos = el.payloadOffset;\n while (pos < el.end) {\n const keyEl = readHeader(blob, pos);\n const keyNode = decodeElement(blob, keyEl);\n if (keyNode.kind !== \"string\") throw new JsonParseError(\"malformed JSON\", pos + 1);\n pos = keyEl.end;\n const valEl = readHeader(blob, pos);\n entries.push({ key: keyNode.value, value: decodeElement(blob, valEl) });\n pos = valEl.end;\n }\n return { kind: \"object\", entries };\n }\n default:\n throw new JsonParseError(\"malformed JSON\", el.offset + 1);\n }\n}\n\nfunction normalizeIntText(text: string): string {\n const n = Number(text);\n if (Number.isFinite(n) && Number.isInteger(n)) return String(Math.trunc(n));\n return text;\n}\n\nfunction unescapeJsonPayload(raw: string): string {\n // Payload may contain JSON escapes without surrounding quotes\n try {\n return JSON.parse(`\"${raw.replace(/\"/g, '\\\\\"')}\"`) as string;\n } catch {\n return raw;\n }\n}\n\n/** Walk JSONB and collect element metadata for TVF id/parent assignment. */\nexport interface JsonbWalkEntry {\n offset: number;\n parent: number | null;\n node: JsonNode;\n key: string | number | null;\n path: string;\n fullkey: string;\n /** For object entries, offset of the key header (used as id). */\n idOffset: number;\n}\n\nexport function walkJsonbTree(blob: Uint8Array): JsonbWalkEntry[] {\n const root = readHeader(blob, 0);\n const node = decodeElement(blob, root);\n const out: JsonbWalkEntry[] = [];\n walk(blob, root, node, null, \"$\", \"$\", null, out);\n return out;\n}\n\nfunction walk(\n blob: Uint8Array,\n el: JsonbElement,\n node: JsonNode,\n parentId: number | null,\n path: string,\n fullkey: string,\n key: string | number | null,\n out: JsonbWalkEntry[],\n idOffset = el.offset,\n): void {\n out.push({ offset: el.offset, parent: parentId, node, key, path, fullkey, idOffset });\n if (node.kind === \"array\") {\n let pos = el.payloadOffset;\n let index = 0;\n while (pos < el.end) {\n const child = readHeader(blob, pos);\n const childNode = decodeElement(blob, child);\n const childFull = `${fullkey}[${index}]`;\n walk(blob, child, childNode, idOffset, fullkey, childFull, index, out);\n pos = child.end;\n index++;\n }\n } else if (node.kind === \"object\") {\n let pos = el.payloadOffset;\n while (pos < el.end) {\n const keyEl = readHeader(blob, pos);\n const keyNode = decodeElement(blob, keyEl);\n if (keyNode.kind !== \"string\") throw new JsonParseError(\"malformed JSON\", pos + 1);\n pos = keyEl.end;\n const valEl = readHeader(blob, pos);\n const valNode = decodeElement(blob, valEl);\n const childFull = appendObjectKey(fullkey, keyNode.value);\n // Children of this entry use the entry's id (key offset), matching SQLite.\n walk(blob, valEl, valNode, idOffset, fullkey, childFull, keyNode.value, out, keyEl.offset);\n pos = valEl.end;\n }\n }\n}\n\nfunction appendObjectKey(base: string, key: string): string {\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) return `${base}.${key}`;\n return `${base}.\"${key.replace(/\"/g, '\\\\\"')}\"`;\n}\n\nexport function jsonbToText(blob: Uint8Array): string {\n return stringifyJson(decodeJsonb(blob));\n}\n\nexport function textToJsonb(text: string): Uint8Array {\n return encodeJsonb(parseJsonText(text));\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport type { JsonNode } from \"./types.ts\";\n\nexport type PathStep =\n | { kind: \"root\" }\n | { kind: \"key\"; key: string }\n | { kind: \"index\"; index: number }\n | { kind: \"append\" } // [#]\n | { kind: \"fromEnd\"; n: number }; // [#-n]\n\nexport function parseJsonPath(path: string): PathStep[] {\n if (path === \"\") throw new SqliteError(\"bad JSON path: ''\", \"other\");\n if (!path.startsWith(\"$\")) throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n const steps: PathStep[] = [{ kind: \"root\" }];\n let i = 1;\n while (i < path.length) {\n if (path[i] === \".\") {\n i++;\n if (i >= path.length) throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n if (path[i] === '\"') {\n i++;\n let key = \"\";\n while (i < path.length) {\n const ch = path[i]!;\n if (ch === '\"') {\n i++;\n break;\n }\n if (ch === \"\\\\\") {\n i++;\n if (i >= path.length) throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n key += path[i]!;\n i++;\n continue;\n }\n key += ch;\n i++;\n }\n steps.push({ kind: \"key\", key });\n continue;\n }\n let key = \"\";\n while (i < path.length && path[i] !== \".\" && path[i] !== \"[\") {\n key += path[i]!;\n i++;\n }\n if (!key) throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n steps.push({ kind: \"key\", key });\n continue;\n }\n if (path[i] === \"[\") {\n i++;\n if (path[i] === \"#\") {\n i++;\n if (path[i] === \"]\") {\n i++;\n steps.push({ kind: \"append\" });\n continue;\n }\n if (path[i] === \"-\") {\n i++;\n let digits = \"\";\n while (i < path.length && path[i]! >= \"0\" && path[i]! <= \"9\") {\n digits += path[i]!;\n i++;\n }\n if (!digits || path[i] !== \"]\") throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n i++;\n steps.push({ kind: \"fromEnd\", n: Number(digits) });\n continue;\n }\n throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n }\n let digits = \"\";\n while (i < path.length && path[i]! >= \"0\" && path[i]! <= \"9\") {\n digits += path[i]!;\n i++;\n }\n if (!digits || path[i] !== \"]\") throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n i++;\n steps.push({ kind: \"index\", index: Number(digits) });\n continue;\n }\n throw new SqliteError(`bad JSON path: '${path}'`, \"other\");\n }\n return steps;\n}\n\n/** Resolve path for read; returns undefined if missing. */\nexport function pathGet(root: JsonNode, steps: PathStep[]): JsonNode | undefined {\n let cur: JsonNode | undefined = root;\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!;\n if (step.kind === \"root\") continue;\n if (cur === undefined) return undefined;\n if (step.kind === \"key\") {\n if (cur.kind !== \"object\") return undefined;\n const entries = cur.entries;\n let next: JsonNode | undefined;\n for (let j = entries.length - 1; j >= 0; j--) {\n if (entries[j]!.key === step.key) {\n next = entries[j]!.value;\n break;\n }\n }\n cur = next;\n continue;\n }\n if (step.kind === \"append\") return undefined;\n if (cur.kind !== \"array\") return undefined;\n let index: number;\n if (step.kind === \"index\") index = step.index;\n else index = cur.elements.length - step.n;\n if (index < 0 || index >= cur.elements.length) return undefined;\n cur = cur.elements[index];\n }\n return cur;\n}\n\nexport interface PathParent {\n parent: JsonNode;\n step: PathStep;\n /** For object: entry index; for array: element index (may be length for append). */\n index: number;\n}\n\n/** Locate parent container for the final path step (for mutate). */\nexport function pathParent(root: JsonNode, steps: PathStep[]): PathParent | null {\n if (steps.length <= 1) return null;\n const parentSteps = steps.slice(0, -1);\n const parent = pathGet(root, parentSteps);\n if (!parent) return null;\n const step = steps[steps.length - 1]!;\n if (step.kind === \"root\") return null;\n if (step.kind === \"key\") {\n if (parent.kind !== \"object\") return null;\n const index = parent.entries.findIndex((e) => e.key === step.key);\n return { parent, step, index };\n }\n if (parent.kind !== \"array\") return null;\n if (step.kind === \"append\") return { parent, step, index: parent.elements.length };\n if (step.kind === \"index\") return { parent, step, index: step.index };\n return { parent, step, index: parent.elements.length - step.n };\n}\n", "/** Internal JSON value tree used by sqlite-mem JSON1/JSONB. */\n\nexport type JsonNode =\n | { kind: \"null\" }\n | { kind: \"true\" }\n | { kind: \"false\" }\n | { kind: \"integer\"; text: string }\n | { kind: \"real\"; text: string }\n | { kind: \"string\"; value: string }\n | { kind: \"array\"; elements: JsonNode[] }\n | { kind: \"object\"; entries: Array<{ key: string; value: JsonNode }> };\n\nexport type JsonTypeName = \"null\" | \"true\" | \"false\" | \"integer\" | \"real\" | \"text\" | \"array\" | \"object\";\n\nexport function jsonTypeName(node: JsonNode): JsonTypeName {\n switch (node.kind) {\n case \"null\":\n return \"null\";\n case \"true\":\n return \"true\";\n case \"false\":\n return \"false\";\n case \"integer\":\n return \"integer\";\n case \"real\":\n return \"real\";\n case \"string\":\n return \"text\";\n case \"array\":\n return \"array\";\n case \"object\":\n return \"object\";\n }\n}\n\nexport function cloneJson(node: JsonNode): JsonNode {\n switch (node.kind) {\n case \"array\":\n return { kind: \"array\", elements: node.elements.map(cloneJson) };\n case \"object\":\n return {\n kind: \"object\",\n entries: node.entries.map((e) => ({ key: e.key, value: cloneJson(e.value) })),\n };\n case \"integer\":\n case \"real\":\n return { kind: node.kind, text: node.text };\n case \"string\":\n return { kind: \"string\", value: node.value };\n default:\n return { kind: node.kind };\n }\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { asSqlJsonText, asSqlReal, isSqlJsonText, SqlJsonText, type SqlValue, utf8Decode } from \"../types/value.ts\";\nimport { decodeJsonb, encodeJsonb, looksLikeJsonb } from \"./jsonb.ts\";\nimport { JsonParseError, parseJsonText } from \"./parse.ts\";\nimport { type PathStep, parseJsonPath, pathGet, pathParent } from \"./path.ts\";\nimport { stringifyJson } from \"./stringify.ts\";\nimport { cloneJson, type JsonNode } from \"./types.ts\";\n\nexport function sqlToJsonInput(value: SqlValue): JsonNode {\n if (value === null) return { kind: \"null\" };\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) return { kind: \"null\" };\n if (Number.isInteger(value)) return { kind: \"integer\", text: String(value) };\n return { kind: \"real\", text: String(value) };\n }\n if (typeof value === \"bigint\") return { kind: \"integer\", text: value.toString() };\n if (value instanceof SqlJsonText) return parseJsonText(value.value);\n if (typeof value === \"string\") return parseJsonText(value);\n if (value instanceof Uint8Array) {\n if (looksLikeJsonb(value)) return decodeJsonb(value);\n // Legacy blob-as-text JSON bug compatibility\n return parseJsonText(utf8Decode(value));\n }\n // SqlReal\n if (typeof value === \"object\" && value !== null && \"value\" in value) {\n const n = (value as { value: number }).value;\n if (!Number.isFinite(n)) return { kind: \"null\" };\n return { kind: \"real\", text: String(n) };\n }\n throw new SqliteError(\"malformed JSON\", \"other\");\n}\n\nexport function trySqlToJsonInput(value: SqlValue): JsonNode | null {\n try {\n return sqlToJsonInput(value);\n } catch {\n return null;\n }\n}\n\n/** VALUE arg for insert/set/array/object \u2014 literal unless JSON subtype / JSONB. */\nexport function sqlValueToJsonNode(value: SqlValue): JsonNode {\n if (value === null) return { kind: \"null\" };\n if (isSqlJsonText(value)) return parseJsonText(value.value);\n if (value instanceof Uint8Array && looksLikeJsonb(value)) return decodeJsonb(value);\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) return { kind: \"null\" };\n if (Number.isInteger(value)) return { kind: \"integer\", text: String(value) };\n return { kind: \"real\", text: String(value) };\n }\n if (typeof value === \"bigint\") return { kind: \"integer\", text: value.toString() };\n if (typeof value === \"object\" && value !== null && !(value instanceof Uint8Array) && \"value\" in value) {\n const n = (value as { value: number }).value;\n return { kind: \"real\", text: String(n) };\n }\n if (value instanceof Uint8Array) {\n throw new SqliteError(\"JSON cannot hold BLOB values\", \"other\");\n }\n // plain text / string \u2192 JSON string\n return { kind: \"string\", value: String(value) };\n}\n\nexport function jsonNodeToSql(node: JsonNode, mode: \"sql\" | \"json\" | \"jsonb\"): SqlValue {\n if (mode === \"jsonb\") return encodeJsonb(node);\n if (mode === \"json\") return asSqlJsonText(stringifyJson(node));\n // sql representation (json_extract single path / ->>)\n switch (node.kind) {\n case \"null\":\n return null;\n case \"true\":\n return 1;\n case \"false\":\n return 0;\n case \"integer\": {\n const n = Number(node.text);\n if (Number.isSafeInteger(n)) return n;\n try {\n return BigInt(node.text);\n } catch {\n return n;\n }\n }\n case \"real\": {\n const n = Number(node.text);\n return Number.isInteger(n) ? asSqlReal(n) : n;\n }\n case \"string\":\n return node.value;\n case \"array\":\n case \"object\":\n // ->> / sql mode: plain TEXT without JSON subtype so nested json_* quote it.\n if (mode === \"sql\") return stringifyJson(node);\n return asSqlJsonText(stringifyJson(node));\n }\n}\n\nexport function jsonArrowPath(right: SqlValue): string {\n if (right === null) throw new SqliteError(\"JSON path error\", \"other\");\n if (typeof right === \"number\" || typeof right === \"bigint\") {\n const n = typeof right === \"bigint\" ? Number(right) : Math.trunc(right);\n if (n < 0) return `$[#${n}]`; // -K \u2192 [#-K] via `[#-K]` \u2014 n is already negative\n return `$[${n}]`;\n }\n const text = isSqlJsonText(right) ? right.value : String(right);\n if (text.startsWith(\"$\")) return text;\n if (/^-?\\d+$/.test(text)) {\n const n = Number(text);\n if (n < 0) return `$[#${n}]`;\n return `$[${n}]`;\n }\n return `$.${text}`;\n}\n\nexport function extractOne(root: JsonNode, path: string): JsonNode | undefined {\n return pathGet(root, parseJsonPath(path));\n}\n\nexport type MutateMode = \"insert\" | \"replace\" | \"set\";\n\n/**\n * json_array_insert / jsonb_array_insert \u2014 like json_replace, but PATH must end\n * with an array index and the value is spliced in (existing elements shift right).\n * https://www.sqlite.org/json1.html#jarrins\n */\nexport function arrayInsertJson(root: JsonNode, path: string, value: JsonNode): JsonNode {\n const steps = parseJsonPath(path);\n const last = steps[steps.length - 1];\n if (!last || last.kind === \"root\" || last.kind === \"key\") {\n throw new SqliteError(\"JSON path error\", \"other\");\n }\n const result = cloneJson(root);\n const parentInfo = pathParent(result, steps);\n if (parentInfo?.parent.kind !== \"array\") return result;\n const parent = parentInfo.parent;\n let idx = parentInfo.index;\n if (last.kind === \"fromEnd\") idx = parent.elements.length - last.n;\n if (last.kind === \"append\") idx = parent.elements.length;\n if (idx < 0 || idx > parent.elements.length) return result;\n parent.elements.splice(idx, 0, cloneJson(value));\n return result;\n}\n\nexport function mutateJson(root: JsonNode, path: string, value: JsonNode, mode: MutateMode): JsonNode {\n const steps = parseJsonPath(path);\n if (steps.length <= 1) {\n // path is $\n if (mode === \"insert\") return root;\n return cloneJson(value);\n }\n const result = cloneJson(root);\n if (!applyMutate(result, steps, value, mode)) {\n createPathAndSet(result, steps, value, mode);\n }\n return result;\n}\n\nfunction applyMutate(root: JsonNode, steps: PathStep[], value: JsonNode, mode: MutateMode): boolean {\n const parentInfo = pathParent(root, steps);\n if (!parentInfo) return false;\n const { parent, step, index } = parentInfo;\n if (step.kind === \"key\") {\n if (parent.kind !== \"object\") return false;\n if (index >= 0) {\n if (mode === \"insert\") return false;\n parent.entries[index] = { key: step.key, value: cloneJson(value) };\n return true;\n }\n if (mode === \"replace\") return false;\n parent.entries.push({ key: step.key, value: cloneJson(value) });\n return true;\n }\n if (parent.kind !== \"array\") return false;\n if (step.kind === \"append\") {\n if (mode === \"replace\") return false;\n parent.elements.push(cloneJson(value));\n return true;\n }\n let idx = index;\n if (step.kind === \"fromEnd\") idx = parent.elements.length - step.n;\n if (idx < 0 || idx > parent.elements.length) return false;\n if (idx === parent.elements.length) {\n if (mode === \"replace\") return false;\n parent.elements.push(cloneJson(value));\n return true;\n }\n if (mode === \"insert\") return false;\n parent.elements[idx] = cloneJson(value);\n return true;\n}\n\nfunction createPathAndSet(root: JsonNode, steps: PathStep[], value: JsonNode, mode: MutateMode): boolean {\n // Walk creating missing object keys / refusing missing array slots (SQLite behavior)\n let cur = root;\n for (let i = 1; i < steps.length - 1; i++) {\n const step = steps[i]!;\n const next = steps[i + 1]!;\n if (step.kind === \"key\") {\n if (cur.kind !== \"object\") return false;\n let entry = cur.entries.find((e) => e.key === step.key);\n if (!entry) {\n if (mode === \"replace\") return false;\n const child: JsonNode =\n next.kind === \"key\" || next.kind === \"root\"\n ? { kind: \"object\", entries: [] }\n : { kind: \"array\", elements: [] };\n entry = { key: step.key, value: child };\n cur.entries.push(entry);\n }\n cur = entry.value;\n continue;\n }\n if (cur.kind !== \"array\") return false;\n let idx = step.kind === \"index\" ? step.index : step.kind === \"fromEnd\" ? cur.elements.length - step.n : -1;\n if (step.kind === \"append\") idx = cur.elements.length;\n if (idx < 0 || idx > cur.elements.length) return false;\n if (idx === cur.elements.length) {\n if (mode === \"replace\") return false;\n const child: JsonNode = next.kind === \"key\" ? { kind: \"object\", entries: [] } : { kind: \"array\", elements: [] };\n cur.elements.push(child);\n }\n cur = cur.elements[idx]!;\n }\n return applyMutate(root, steps, value, mode);\n}\n\nexport function removeJson(root: JsonNode, path: string): JsonNode {\n const steps = parseJsonPath(path);\n if (steps.length <= 1) return root;\n const result = cloneJson(root);\n const parentInfo = pathParent(result, steps);\n if (!parentInfo) return result;\n const { parent, step, index } = parentInfo;\n if (step.kind === \"key\" && parent.kind === \"object\" && index >= 0) {\n parent.entries.splice(index, 1);\n } else if (parent.kind === \"array\") {\n let idx = index;\n if (step.kind === \"fromEnd\") idx = parent.elements.length - step.n;\n if (step.kind === \"append\") return result;\n if (idx >= 0 && idx < parent.elements.length) parent.elements.splice(idx, 1);\n }\n return result;\n}\n\n/** RFC7396-ish JSON Merge Patch as implemented by SQLite json_patch. */\nexport function patchJson(target: JsonNode, patch: JsonNode): JsonNode {\n if (patch.kind !== \"object\") return cloneJson(patch);\n const base = target.kind === \"object\" ? cloneJson(target) : ({ kind: \"object\", entries: [] } as JsonNode);\n if (base.kind !== \"object\") return cloneJson(patch);\n for (const entry of patch.entries) {\n if (entry.value.kind === \"null\") {\n base.entries = base.entries.filter((e) => e.key !== entry.key);\n continue;\n }\n const existing = base.entries.find((e) => e.key === entry.key);\n if (existing) {\n existing.value = patchJson(existing.value, entry.value);\n } else {\n base.entries.push({ key: entry.key, value: cloneJson(entry.value) });\n }\n }\n return base;\n}\n\nexport function wrapJsonError(e: unknown): never {\n if (e instanceof SqliteError) throw e;\n if (e instanceof JsonParseError) throw new SqliteError(\"malformed JSON\", \"other\");\n throw new SqliteError(\"malformed JSON\", \"other\");\n}\n\nexport function ensureJson(value: SqlValue): JsonNode {\n try {\n return sqlToJsonInput(value);\n } catch (e) {\n wrapJsonError(e);\n }\n}\n\nexport function toJsonbBlob(value: SqlValue): Uint8Array {\n if (value instanceof Uint8Array && looksLikeJsonb(value)) return value;\n return encodeJsonb(ensureJson(value));\n}\n\nexport function toJsonText(value: SqlValue): SqlJsonText {\n return asSqlJsonText(stringifyJson(ensureJson(value)));\n}\n", "import type { SqlValue } from \"../types/value.ts\";\nimport { encodeJsonb, type JsonbWalkEntry, walkJsonbTree } from \"./jsonb.ts\";\nimport { ensureJson, jsonNodeToSql } from \"./ops.ts\";\nimport { stringifyJson } from \"./stringify.ts\";\nimport { type JsonNode, jsonTypeName } from \"./types.ts\";\n\nexport interface JsonTvfRow {\n key: SqlValue;\n value: SqlValue;\n type: string;\n atom: SqlValue;\n id: number;\n parent: SqlValue;\n fullkey: string;\n path: string;\n}\n\nfunction atomOf(node: JsonNode): SqlValue {\n switch (node.kind) {\n case \"null\":\n return null;\n case \"true\":\n return 1;\n case \"false\":\n return 0;\n case \"integer\":\n case \"real\":\n case \"string\":\n return jsonNodeToSql(node, \"sql\");\n default:\n return null;\n }\n}\n\nfunction valueOf(node: JsonNode): SqlValue {\n if (node.kind === \"array\" || node.kind === \"object\") return stringifyJson(node);\n return jsonNodeToSql(node, \"sql\");\n}\n\nexport function jsonEachRows(json: SqlValue, path?: SqlValue): JsonTvfRow[] {\n // SQL NULL \u2192 zero rows (distinct from JSON null, which yields one atom row).\n if (json === null) return [];\n const root = ensureJson(json);\n const blob = encodeJsonb(root);\n const walk = walkJsonbTree(blob);\n const rootEntry = walk[0];\n if (!rootEntry) return [];\n\n let focus = rootEntry;\n if (path !== undefined && path !== null) {\n const targetPath = String(path);\n const found = walk.find((e) => e.fullkey === targetPath);\n if (!found) return [];\n focus = found;\n }\n\n if (focus.node.kind !== \"array\" && focus.node.kind !== \"object\") {\n return [\n {\n key: focus.key,\n value: valueOf(focus.node),\n type: jsonTypeName(focus.node),\n atom: atomOf(focus.node),\n id: focus.idOffset,\n parent: null,\n fullkey: focus.fullkey,\n path: focus.path,\n },\n ];\n }\n\n return walk.filter((e) => e.parent === focus.idOffset).map((e) => rowFromWalk(e, true));\n}\n\nexport function jsonTreeRows(json: SqlValue, path?: SqlValue): JsonTvfRow[] {\n if (json === null) return [];\n const root = ensureJson(json);\n const blob = encodeJsonb(root);\n const walk = walkJsonbTree(blob);\n\n if (path === undefined || path === null) {\n return walk.map((e) => rowFromWalk(e, false));\n }\n\n const targetPath = String(path);\n // Keep IDs from the full document; return the subtree rooted at targetPath.\n const rootEntry = walk.find((e) => e.fullkey === targetPath);\n if (!rootEntry) return [];\n const subtree = walk.filter(\n (e) => e.fullkey === targetPath || e.fullkey.startsWith(targetPath + \".\") || e.fullkey.startsWith(targetPath + \"[\"),\n );\n return subtree.map((e) => {\n const row = rowFromWalk(e, false);\n if (e.idOffset === rootEntry.idOffset) {\n row.parent = null;\n }\n return row;\n });\n}\n\nfunction rowFromWalk(e: JsonbWalkEntry, eachMode: boolean): JsonTvfRow {\n return {\n key: e.key,\n value: valueOf(e.node),\n type: jsonTypeName(e.node),\n atom: atomOf(e.node),\n id: e.idOffset,\n parent: eachMode ? null : e.parent,\n fullkey: e.fullkey,\n path: e.path,\n };\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport {\n arrayInsertJson,\n ensureJson,\n extractOne,\n isValidJsonText,\n jsonArrowPath,\n jsonErrorPosition,\n jsonNodeToSql,\n mutateJson,\n patchJson,\n prettyJson,\n removeJson,\n sqlValueToJsonNode,\n stringifyJson,\n toJsonbBlob,\n toJsonText,\n wrapJsonError,\n} from \"../json/index.ts\";\nimport { decodeJsonb, looksLikeJsonb } from \"../json/jsonb.ts\";\nimport { jsonTypeName } from \"../json/types.ts\";\nimport { asSqlJsonText, isSqlJsonText, type SqlValue, subtypeOf, utf8Decode } from \"../types/value.ts\";\nimport type { AggregateAccumulator, AggregateFactory } from \"./aggregate.ts\";\nimport type { ScalarFunction } from \"./registry.ts\";\n\nfunction textOf(value: SqlValue): string {\n if (value instanceof Uint8Array) return utf8Decode(value);\n if (isSqlJsonText(value)) return value.value;\n return String(value);\n}\n\nfunction _requireOdd(name: string, args: SqlValue[]): void {\n if (args.length % 2 === 0) {\n throw new SqliteError(`json_${name}() requires an odd number of arguments`, \"misuse\");\n }\n}\n\nfunction arrayInsertArgs(args: SqlValue[], asJsonb: boolean): SqlValue {\n if (args.length === 0) {\n throw new SqliteError(\"wrong number of arguments to function json_array_insert()\", \"misuse\");\n }\n if (args.length % 2 === 0) {\n throw new SqliteError(\"json_array_insert() requires an odd number of arguments\", \"misuse\");\n }\n if (args.some((arg) => arg === null)) return null;\n try {\n let node = ensureJson(args[0]!);\n for (let i = 1; i < args.length; i += 2) {\n const path = textOf(args[i]!);\n const value = sqlValueToJsonNode(args[i + 1]!);\n node = arrayInsertJson(node, path, value);\n }\n return asJsonb ? jsonNodeToSql(node, \"jsonb\") : jsonNodeToSql(node, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n}\n\nfunction mutateArgs(args: SqlValue[], mode: \"insert\" | \"replace\" | \"set\", asJsonb: boolean): SqlValue {\n if (args.length === 0) throw new SqliteError(`wrong number of arguments to function json_${mode}()`, \"misuse\");\n if (args.length % 2 === 0) {\n throw new SqliteError(`json_${mode}() requires an odd number of arguments`, \"misuse\");\n }\n try {\n let node = ensureJson(args[0]!);\n for (let i = 1; i < args.length; i += 2) {\n const path = textOf(args[i]!);\n const value = sqlValueToJsonNode(args[i + 1]!);\n node = mutateJson(node, path, value, mode);\n }\n return asJsonb ? jsonNodeToSql(node, \"jsonb\") : jsonNodeToSql(node, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n}\n\nfunction extract(args: SqlValue[], asJsonb: boolean): SqlValue {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function json_extract()\", \"misuse\");\n try {\n const root = ensureJson(args[0]!);\n if (args.length === 2) {\n const found = extractOne(root, textOf(args[1]!));\n if (found === undefined) return null;\n if (asJsonb && (found.kind === \"array\" || found.kind === \"object\")) {\n return jsonNodeToSql(found, \"jsonb\");\n }\n if (found.kind === \"array\" || found.kind === \"object\") return jsonNodeToSql(found, \"json\");\n return jsonNodeToSql(found, \"sql\");\n }\n const parts = args.slice(1).map((p) => {\n const found = extractOne(root, textOf(p!));\n return found === undefined ? { kind: \"null\" as const } : found;\n });\n const arr = { kind: \"array\" as const, elements: parts };\n return asJsonb ? jsonNodeToSql(arr, \"jsonb\") : jsonNodeToSql(arr, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n}\n\nexport function jsonArrow(left: SqlValue, right: SqlValue, mode: \"->\" | \"->>\"): SqlValue {\n if (left === null || right === null) return null;\n try {\n const root = ensureJson(left);\n const path = jsonArrowPath(right);\n const found = extractOne(root, path);\n if (found === undefined) return null;\n if (mode === \"->\") return asSqlJsonText(stringifyJson(found));\n return jsonNodeToSql(found, \"sql\");\n } catch (e) {\n // -> on malformed JSON errors\n wrapJsonError(e);\n }\n}\n\nexport const jsonScalarFunctions: Readonly<Record<string, ScalarFunction>> = {\n json(args) {\n if (args.length !== 1) throw new SqliteError(\"wrong number of arguments to function json()\", \"misuse\");\n if (args[0] === null) return null;\n return toJsonText(args[0]!);\n },\n jsonb(args) {\n if (args.length !== 1) throw new SqliteError(\"wrong number of arguments to function jsonb()\", \"misuse\");\n if (args[0] === null) return null;\n return toJsonbBlob(args[0]!);\n },\n json_array(args) {\n try {\n const elements = args.map((a) => sqlValueToJsonNode(a));\n return jsonNodeToSql({ kind: \"array\", elements }, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n jsonb_array(args) {\n try {\n const elements = args.map((a) => sqlValueToJsonNode(a));\n return jsonNodeToSql({ kind: \"array\", elements }, \"jsonb\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_object(args) {\n if (args.length % 2 !== 0) {\n throw new SqliteError(\"json_object() requires an even number of arguments\", \"misuse\");\n }\n try {\n const entries: Array<{ key: string; value: import(\"../json/types.ts\").JsonNode }> = [];\n for (let i = 0; i < args.length; i += 2) {\n if (args[i] === null) throw new SqliteError(\"json_object() labels must be TEXT\", \"other\");\n if (args[i] instanceof Uint8Array) throw new SqliteError(\"JSON cannot hold BLOB values\", \"other\");\n const key = textOf(args[i]!);\n entries.push({ key, value: sqlValueToJsonNode(args[i + 1]!) });\n }\n return jsonNodeToSql({ kind: \"object\", entries }, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n jsonb_object(args) {\n if (args.length % 2 !== 0) {\n throw new SqliteError(\"json_object() requires an even number of arguments\", \"misuse\");\n }\n try {\n const entries: Array<{ key: string; value: import(\"../json/types.ts\").JsonNode }> = [];\n for (let i = 0; i < args.length; i += 2) {\n if (args[i] === null) throw new SqliteError(\"json_object() labels must be TEXT\", \"other\");\n if (args[i] instanceof Uint8Array) throw new SqliteError(\"JSON cannot hold BLOB values\", \"other\");\n const key = textOf(args[i]!);\n entries.push({ key, value: sqlValueToJsonNode(args[i + 1]!) });\n }\n return jsonNodeToSql({ kind: \"object\", entries }, \"jsonb\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_quote(args) {\n if (args.length !== 1) throw new SqliteError(\"wrong number of arguments to function json_quote()\", \"misuse\");\n const v = args[0] ?? null;\n if (v === null) return asSqlJsonText(\"null\");\n if (isSqlJsonText(v)) return v;\n if (v instanceof Uint8Array && looksLikeJsonb(v)) return asSqlJsonText(stringifyJson(decodeJsonb(v)));\n try {\n return asSqlJsonText(stringifyJson(sqlValueToJsonNode(v)));\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_extract(args) {\n return extract(args, false);\n },\n jsonb_extract(args) {\n return extract(args, true);\n },\n json_insert(args) {\n return mutateArgs(args, \"insert\", false);\n },\n jsonb_insert(args) {\n return mutateArgs(args, \"insert\", true);\n },\n json_array_insert(args) {\n return arrayInsertArgs(args, false);\n },\n jsonb_array_insert(args) {\n return arrayInsertArgs(args, true);\n },\n json_replace(args) {\n return mutateArgs(args, \"replace\", false);\n },\n jsonb_replace(args) {\n return mutateArgs(args, \"replace\", true);\n },\n json_set(args) {\n return mutateArgs(args, \"set\", false);\n },\n jsonb_set(args) {\n return mutateArgs(args, \"set\", true);\n },\n json_remove(args) {\n if (args.length < 1) throw new SqliteError(\"wrong number of arguments to function json_remove()\", \"misuse\");\n try {\n let node = ensureJson(args[0]!);\n for (let i = 1; i < args.length; i++) {\n node = removeJson(node, textOf(args[i]!));\n }\n return jsonNodeToSql(node, \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n jsonb_remove(args) {\n if (args.length < 1) throw new SqliteError(\"wrong number of arguments to function jsonb_remove()\", \"misuse\");\n try {\n let node = ensureJson(args[0]!);\n for (let i = 1; i < args.length; i++) {\n node = removeJson(node, textOf(args[i]!));\n }\n return jsonNodeToSql(node, \"jsonb\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_patch(args) {\n if (args.length !== 2) throw new SqliteError(\"wrong number of arguments to function json_patch()\", \"misuse\");\n try {\n return jsonNodeToSql(patchJson(ensureJson(args[0]!), ensureJson(args[1]!)), \"json\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n jsonb_patch(args) {\n if (args.length !== 2) throw new SqliteError(\"wrong number of arguments to function jsonb_patch()\", \"misuse\");\n try {\n return jsonNodeToSql(patchJson(ensureJson(args[0]!), ensureJson(args[1]!)), \"jsonb\");\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_type(args) {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_type()\", \"misuse\");\n }\n if (args[0] === null) return null;\n try {\n let node = ensureJson(args[0]!);\n if (args.length === 2) {\n if (args[1] === null) return null;\n const found = extractOne(node, textOf(args[1]!));\n if (!found) return null;\n node = found;\n }\n return jsonTypeName(node);\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_valid(args) {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_valid()\", \"misuse\");\n }\n if (args[0] === null) return 0;\n const flags = args.length === 2 && args[1] !== null ? Number(args[1]) : 0;\n if (args[0] instanceof Uint8Array) {\n return looksLikeJsonb(args[0]) ? 1 : 0;\n }\n return isValidJsonText(textOf(args[0]!), flags) ? 1 : 0;\n },\n json_error_position(args) {\n if (args.length !== 1) {\n throw new SqliteError(\"wrong number of arguments to function json_error_position()\", \"misuse\");\n }\n if (args[0] === null) return 0;\n if (args[0] instanceof Uint8Array) {\n return looksLikeJsonb(args[0]) ? 0 : 1;\n }\n return jsonErrorPosition(textOf(args[0]!));\n },\n json_array_length(args) {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_array_length()\", \"misuse\");\n }\n if (args[0] === null) return null;\n try {\n let node = ensureJson(args[0]!);\n if (args.length === 2) {\n if (args[1] === null) return null;\n const found = extractOne(node, textOf(args[1]!));\n if (!found) return null;\n node = found;\n }\n if (node.kind !== \"array\") return 0;\n return node.elements.length;\n } catch (e) {\n wrapJsonError(e);\n }\n },\n json_pretty(args) {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_pretty()\", \"misuse\");\n }\n if (args[0] === null) return null;\n try {\n const node = ensureJson(args[0]!);\n const indent = args.length === 2 && args[1] !== null ? textOf(args[1]!) : \" \";\n return asSqlJsonText(prettyJson(node, indent));\n } catch (e) {\n wrapJsonError(e);\n }\n },\n subtype(args) {\n if (args.length !== 1) throw new SqliteError(\"wrong number of arguments to function subtype()\", \"misuse\");\n return subtypeOf(args[0] ?? null);\n },\n};\n\nclass JsonGroupArrayAccumulator implements AggregateAccumulator {\n private readonly values: import(\"../json/types.ts\").JsonNode[] = [];\n constructor(private readonly asJsonb: boolean) {}\n step(args: SqlValue[]): void {\n if (args[0] === undefined) return;\n // NULLs are included as JSON null in json_group_array\n this.values.push(sqlValueToJsonNode(args[0]!));\n }\n finalize(): SqlValue {\n const node = { kind: \"array\" as const, elements: this.values };\n return this.asJsonb ? jsonNodeToSql(node, \"jsonb\") : jsonNodeToSql(node, \"json\");\n }\n}\n\nclass JsonGroupObjectAccumulator implements AggregateAccumulator {\n private readonly entries: Array<{ key: string; value: import(\"../json/types.ts\").JsonNode }> = [];\n constructor(private readonly asJsonb: boolean) {}\n step(args: SqlValue[]): void {\n if (args[0] === null || args[0] === undefined) return;\n const key = textOf(args[0]!);\n this.entries.push({ key, value: sqlValueToJsonNode(args[1] ?? null) });\n }\n finalize(): SqlValue {\n const node = { kind: \"object\" as const, entries: this.entries };\n return this.asJsonb ? jsonNodeToSql(node, \"jsonb\") : jsonNodeToSql(node, \"json\");\n }\n}\n\nexport const jsonAggregateFunctions: Readonly<Record<string, AggregateFactory>> = {\n json_group_array: () => new JsonGroupArrayAccumulator(false),\n jsonb_group_array: () => new JsonGroupArrayAccumulator(true),\n json_group_object: () => new JsonGroupObjectAccumulator(false),\n jsonb_group_object: () => new JsonGroupObjectAccumulator(true),\n};\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { asSqlReal, coerceToNumber, type SqlValue } from \"../types/value.ts\";\nimport type { FunctionContext, ScalarFunction } from \"./registry.ts\";\n\nfunction requireArgs(name: string, args: SqlValue[], min: number, max = min): void {\n if (args.length < min || args.length > max) {\n throw new SqliteError(`wrong number of arguments to function ${name}()`, \"misuse\");\n }\n}\n\nfunction num(value: SqlValue): number | null {\n if (value === null) return null;\n return coerceToNumber(value);\n}\n\nfunction realOrNull(value: number | null): SqlValue {\n if (value === null || Number.isNaN(value)) return null;\n return asSqlReal(value);\n}\n\nfunction unaryMath(name: string, fn: (n: number) => number): ScalarFunction {\n return (args) => {\n requireArgs(name, args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n return realOrNull(fn(n));\n };\n}\n\n/** IEEE754 helpers matching SQLite ENABLE_MATH_FUNCTIONS / ieee754 extension. */\nfunction decodeIeee754(value: number): { mantissa: bigint; exponent: number } {\n const buf = new ArrayBuffer(8);\n new DataView(buf).setFloat64(0, value, false);\n const bits = new DataView(buf).getBigUint64(0, false);\n const sign = bits >> 63n;\n const expBits = Number((bits >> 52n) & 0x7ffn);\n const frac = bits & 0xfffffffffffffn;\n if (expBits === 0) {\n // subnormal or zero\n let m = frac;\n let e = -1074;\n if (m === 0n) return { mantissa: sign === 0n ? 0n : -0n, exponent: 0 };\n while ((m & 1n) === 0n) {\n m >>= 1n;\n e++;\n }\n return { mantissa: sign ? -m : m, exponent: e };\n }\n if (expBits === 0x7ff) {\n // Inf/NaN \u2014 SQLite still formats; use mantissa with high bit\n const m = (1n << 52n) | frac;\n return { mantissa: sign ? -m : m, exponent: 972 };\n }\n let m = (1n << 52n) | frac;\n let e = expBits - 1075;\n while ((m & 1n) === 0n) {\n m >>= 1n;\n e++;\n }\n return { mantissa: sign ? -m : m, exponent: e };\n}\n\nfunction encodeIeee754(mantissa: bigint, exponent: number): number {\n if (mantissa === 0n) return 0;\n const sign = mantissa < 0n ? -1 : 1;\n let m = mantissa < 0n ? -mantissa : mantissa;\n let e = exponent;\n while (m > 0n && (m & 1n) === 0n) {\n m >>= 1n;\n e++;\n }\n // Reconstruct via Math: value = m * 2^e\n return sign * Number(m) * 2 ** e;\n}\n\nexport const mathFunctions: Readonly<Record<string, ScalarFunction>> = {\n acos: unaryMath(\"acos\", Math.acos),\n acosh: unaryMath(\"acosh\", Math.acosh),\n asin: unaryMath(\"asin\", Math.asin),\n asinh: unaryMath(\"asinh\", Math.asinh),\n atan: unaryMath(\"atan\", Math.atan),\n atanh: unaryMath(\"atanh\", Math.atanh),\n ceil: unaryMath(\"ceil\", Math.ceil),\n ceiling: unaryMath(\"ceiling\", Math.ceil),\n cos: unaryMath(\"cos\", Math.cos),\n cosh: unaryMath(\"cosh\", Math.cosh),\n degrees: unaryMath(\"degrees\", (n) => (n * 180) / Math.PI),\n exp: unaryMath(\"exp\", Math.exp),\n floor: unaryMath(\"floor\", Math.floor),\n ln: unaryMath(\"ln\", Math.log),\n log10: unaryMath(\"log10\", Math.log10),\n log2: unaryMath(\"log2\", Math.log2),\n pi(args) {\n requireArgs(\"pi\", args, 0);\n return asSqlReal(Math.PI);\n },\n radians: unaryMath(\"radians\", (n) => (n * Math.PI) / 180),\n sign(args) {\n requireArgs(\"sign\", args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n if (n > 0) return 1;\n if (n < 0) return -1;\n return 0;\n },\n sin: unaryMath(\"sin\", Math.sin),\n sinh: unaryMath(\"sinh\", Math.sinh),\n sqrt: unaryMath(\"sqrt\", Math.sqrt),\n tan: unaryMath(\"tan\", Math.tan),\n tanh: unaryMath(\"tanh\", Math.tanh),\n trunc: unaryMath(\"trunc\", Math.trunc),\n atan2(args) {\n requireArgs(\"atan2\", args, 2);\n const y = num(args[0]!);\n const x = num(args[1]!);\n if (y === null || x === null) return null;\n return realOrNull(Math.atan2(y, x));\n },\n log(args) {\n requireArgs(\"log\", args, 1, 2);\n if (args.length === 1) {\n const n = num(args[0]!);\n if (n === null) return null;\n return realOrNull(Math.log10(n));\n }\n const base = num(args[0]!);\n const n = num(args[1]!);\n if (base === null || n === null) return null;\n return realOrNull(Math.log(n) / Math.log(base));\n },\n mod(args) {\n requireArgs(\"mod\", args, 2);\n const a = num(args[0]!);\n const b = num(args[1]!);\n if (a === null || b === null) return null;\n if (b === 0) return null;\n return realOrNull(a % b);\n },\n pow(args) {\n requireArgs(\"pow\", args, 2);\n const a = num(args[0]!);\n const b = num(args[1]!);\n if (a === null || b === null) return null;\n return realOrNull(a ** b);\n },\n power(args, ctx) {\n return mathFunctions.pow!(args, ctx);\n },\n ieee754(args) {\n requireArgs(\"ieee754\", args, 1, 2);\n if (args.length === 1) {\n const n = num(args[0]!);\n if (n === null) return null;\n const { mantissa, exponent } = decodeIeee754(n);\n return `ieee754(${mantissa},${exponent})`;\n }\n const m = args[0]!;\n const e = args[1]!;\n if (m === null || e === null) return null;\n const mantissa = typeof m === \"bigint\" ? m : BigInt(Math.trunc(num(m)!));\n const exponent = Math.trunc(num(e)!);\n return realOrNull(encodeIeee754(mantissa, exponent));\n },\n ieee754_mantissa(args) {\n requireArgs(\"ieee754_mantissa\", args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n return decodeIeee754(n).mantissa;\n },\n ieee754_exponent(args) {\n requireArgs(\"ieee754_exponent\", args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n return decodeIeee754(n).exponent;\n },\n ieee754_to_blob(args) {\n requireArgs(\"ieee754_to_blob\", args, 1);\n const n = num(args[0]!);\n if (n === null) return null;\n const buf = new ArrayBuffer(8);\n new DataView(buf).setFloat64(0, n, false);\n return new Uint8Array(buf);\n },\n ieee754_from_blob(args) {\n requireArgs(\"ieee754_from_blob\", args, 1);\n const value = args[0];\n if (value === null) return null;\n if (!(value instanceof Uint8Array) || value.length !== 8) {\n throw new SqliteError(\"ieee754_from_blob() requires an 8-byte blob\", \"misuse\");\n }\n const view = new DataView(value.buffer, value.byteOffset, value.byteLength);\n return realOrNull(view.getFloat64(0, false));\n },\n ieee754_inc(args) {\n requireArgs(\"ieee754_inc\", args, 2);\n const n = num(args[0]!);\n const delta = num(args[1]!);\n if (n === null || delta === null) return null;\n const buf = new ArrayBuffer(8);\n const view = new DataView(buf);\n view.setFloat64(0, n, false);\n let bits = view.getBigUint64(0, false);\n const step = BigInt(Math.trunc(delta));\n bits = (bits + step) & 0xffffffffffffffffn;\n view.setBigUint64(0, bits, false);\n return realOrNull(view.getFloat64(0, false));\n },\n};\n\n// silence unused\nvoid (null as unknown as FunctionContext);\n", "import { SqliteError } from \"../errors/index.ts\";\n\nfunction escapeRegexChar(char: string): string {\n return /[\\\\^$.*+?()[\\]{}|]/.test(char) ? `\\\\${char}` : char;\n}\n\nfunction likeLiteral(char: string, caseSensitive: boolean): string {\n if (!caseSensitive) {\n const code = char.codePointAt(0)!;\n if (code >= 65 && code <= 90) return `[${char}${char.toLowerCase()}]`;\n if (code >= 97 && code <= 122) return `[${char}${char.toUpperCase()}]`;\n }\n return escapeRegexChar(char);\n}\n\n/**\n * SQLite LIKE matching. ASCII letters are case-insensitive unless `caseSensitive`.\n *\n * @param text - Value to test.\n * @param pattern - Pattern with `%` / `_` wildcards.\n * @param escape - Optional single-character ESCAPE (or `null`).\n * @param caseSensitive - When true, match like GLOB (SQLite `PRAGMA case_sensitive_like=ON`).\n */\nexport function likeMatch(text: string, pattern: string, escape: string | null = null, caseSensitive = false): boolean {\n if (escape !== null && [...escape].length !== 1) {\n throw new SqliteError(\"ESCAPE expression must be a single character\", \"other\");\n }\n\n let source = \"^\";\n const chars = [...pattern];\n for (let i = 0; i < chars.length; i++) {\n const char = chars[i]!;\n if (escape !== null && char === escape) {\n const next = chars[++i];\n source += next === undefined ? likeLiteral(char, caseSensitive) : likeLiteral(next, caseSensitive);\n } else if (char === \"%\") {\n source += \"[\\\\s\\\\S]*\";\n } else if (char === \"_\") {\n source += \"[\\\\s\\\\S]\";\n } else {\n source += likeLiteral(char, caseSensitive);\n }\n }\n return new RegExp(`${source}$`).test(text);\n}\n\n/**\n * SQLite GLOB matching. GLOB is case-sensitive and uses Unix `*` / `?` wildcards.\n *\n * @param text - Value to test.\n * @param pattern - GLOB pattern.\n */\nexport function globMatch(text: string, pattern: string): boolean {\n let source = \"^\";\n for (let i = 0; i < pattern.length; i++) {\n const char = pattern[i]!;\n if (char === \"*\") {\n source += \"[\\\\s\\\\S]*\";\n } else if (char === \"?\") {\n source += \"[\\\\s\\\\S]\";\n } else if (char === \"[\") {\n let end = i + 1;\n if (pattern[end] === \"^\") end++;\n if (pattern[end] === \"]\") end++;\n while (end < pattern.length && pattern[end] !== \"]\") end++;\n if (end >= pattern.length) {\n source += \"\\\\[\";\n } else {\n let content = pattern.slice(i + 1, end);\n // SQLite uses either ^ or ! as the first character to negate a class.\n if (content.startsWith(\"!\")) content = `^${content.slice(1)}`;\n source += `[${content.replace(/\\\\/g, \"\\\\\\\\\")}]`;\n i = end;\n }\n } else {\n source += escapeRegexChar(char);\n }\n }\n return new RegExp(`${source}$`).test(text);\n}\n", "import { SqliteError } from \"../errors/index.ts\";\nimport { globMatch, likeMatch } from \"../expressions/like.ts\";\nimport { assertBlobLength } from \"../runtime/assert.ts\";\nimport { sqliteAtoF } from \"../types/sqlite-atof.ts\";\nimport {\n affinityFromTypeName,\n asSqlReal,\n canonicalizeNumber,\n coerceToNumber,\n compareSql,\n formatRealAsText,\n isSqlReal,\n type SqlValue,\n storageClassOf,\n typeofSql,\n utf8Decode,\n utf8Encode,\n} from \"../types/value.ts\";\nimport type { FunctionContext, ScalarFunction } from \"./registry.ts\";\n\n/** Match bun:sqlite / SQLite 3.51.0 for drop-in parity. */\nexport const SQLITE_MEM_VERSION = \"3.51.0\";\nexport const SQLITE_MEM_SOURCE_ID =\n \"2025-06-12 13:14:41 f0ca7bba1c5e232e5d279fad6338121ab55af0c8c68c84cdfb18ba5114dcaapl\";\n\nconst COMPILE_OPTIONS = [\n \"ENABLE_FTS3\",\n \"ENABLE_FTS4\",\n \"ENABLE_FTS5\",\n \"ENABLE_MATH_FUNCTIONS\",\n \"ENABLE_RTREE\",\n \"ENABLE_DBSTAT_VTAB\",\n \"ENABLE_BYTECODE_VTAB\",\n \"THREADSAFE=1\",\n] as const;\n\nfunction text(value: SqlValue): string {\n if (value instanceof Uint8Array) return utf8Decode(value);\n return String(value);\n}\n\n/** CAST TEXT\u2192INTEGER: leading space, optional sign, digit prefix (sqlite3Atoi64). */\nfunction castTextToInteger(raw: string): number {\n let i = 0;\n while (i < raw.length && raw[i] === \" \") i++;\n if (i >= raw.length) return 0;\n let sign = 1;\n if (raw[i] === \"-\") {\n sign = -1;\n i++;\n } else if (raw[i] === \"+\") i++;\n if (i >= raw.length || raw[i]! < \"0\" || raw[i]! > \"9\") return 0;\n let n = 0;\n while (i < raw.length && raw[i]! >= \"0\" && raw[i]! <= \"9\") {\n n = n * 10 + (raw.charCodeAt(i) - 48);\n i++;\n }\n return sign * n;\n}\n\n/** CAST TEXT\u2192REAL/NUMERIC: prefix parse including fraction and exponent (sqlite3AtoF). */\nfunction castTextToReal(raw: string): number {\n return sqliteAtoF(raw);\n}\n\nfunction castNumericFromValue(value: SqlValue, kind: \"INTEGER\" | \"REAL\" | \"NUMERIC\"): number {\n if (typeof value === \"string\") {\n return kind === \"INTEGER\" ? castTextToInteger(value) : castTextToReal(value);\n }\n if (value instanceof Uint8Array) {\n const decoded = utf8Decode(value);\n return kind === \"INTEGER\" ? castTextToInteger(decoded) : castTextToReal(decoded);\n }\n return coerceToNumber(value) ?? 0;\n}\n\nfunction numeric(value: SqlValue): number {\n return coerceToNumber(value) ?? 0;\n}\n\nexport function castSqlValue(value: SqlValue, typeName: string): SqlValue {\n const affinity = affinityFromTypeName(typeName);\n if (value === null) return null;\n if (affinity === \"BLOB\") {\n return value instanceof Uint8Array ? value : utf8Encode(text(value));\n }\n if (affinity === \"TEXT\") {\n if (isSqlReal(value)) return formatRealAsText(value.value);\n if (typeof value === \"number\") {\n if (Number.isInteger(value) && Number.isSafeInteger(value)) return String(value);\n return formatRealAsText(value);\n }\n return text(value);\n }\n if (affinity === \"INTEGER\") return Math.trunc(castNumericFromValue(value, \"INTEGER\"));\n if (affinity === \"REAL\") return asSqlReal(castNumericFromValue(value, \"REAL\"));\n if (affinity === \"NUMERIC\") {\n const n = castNumericFromValue(value, \"NUMERIC\");\n if (Number.isInteger(n) && Number.isSafeInteger(n)) return Math.trunc(n);\n return canonicalizeNumber(n);\n }\n return value;\n}\n\nfunction trimChars(value: string, chars: string, left: boolean, right: boolean): string {\n const set = new Set([...chars]);\n const input = [...value];\n let start = 0;\n let end = input.length;\n if (left) while (start < end && set.has(input[start]!)) start++;\n if (right) while (end > start && set.has(input[end - 1]!)) end--;\n return input.slice(start, end).join(\"\");\n}\n\nfunction substr(value: string, startValue: number, lengthValue?: number): string {\n const chars = [...value];\n const start = Math.trunc(startValue);\n let index = start > 0 ? start - 1 : start < 0 ? chars.length + start : 0;\n index = Math.max(0, index);\n if (lengthValue === undefined) return chars.slice(index).join(\"\");\n const length = Math.trunc(lengthValue);\n if (length >= 0) return chars.slice(index, index + length).join(\"\");\n return chars.slice(Math.max(0, index + length), index).join(\"\");\n}\n\nfunction formatPrintf(format: string, args: SqlValue[]): string {\n let index = 0;\n return format.replace(\n /%([0 +\\-#]*)(\\d+)?(?:\\.(\\d+))?([%sdifgGxXcqQ])/g,\n (_match, flags: string, widthText: string | undefined, precisionText: string | undefined, kind: string) => {\n if (kind === \"%\") return \"%\";\n const value = args[index++] ?? null;\n const precision = precisionText === undefined ? undefined : Number(precisionText);\n let result: string;\n switch (kind) {\n case \"d\":\n case \"i\":\n result = String(Math.trunc(numeric(value)));\n break;\n case \"f\":\n result = numeric(value).toFixed(precision ?? 6);\n break;\n case \"g\":\n case \"G\":\n result = numeric(value)\n .toPrecision(precision ?? 6)\n .replace(/\\.?0+(e|$)/i, \"$1\");\n break;\n case \"x\":\n case \"X\":\n result = Math.trunc(numeric(value)).toString(16);\n break;\n case \"c\":\n result = String.fromCodePoint(Math.trunc(numeric(value)));\n break;\n case \"q\":\n result = value === null ? \"(NULL)\" : text(value).replace(/'/g, \"''\");\n break;\n case \"Q\":\n result = value === null ? \"NULL\" : `'${text(value).replace(/'/g, \"''\")}'`;\n break;\n default:\n result = value === null ? \"\" : text(value);\n }\n if (kind === \"G\" || kind === \"X\") result = result.toUpperCase();\n const width = Number(widthText ?? 0);\n if (width > result.length) {\n const pad = flags.includes(\"0\") ? \"0\" : \" \";\n result = flags.includes(\"-\") ? result.padEnd(width, pad) : result.padStart(width, pad);\n }\n return result;\n },\n );\n}\n\nfunction requireArgs(name: string, args: SqlValue[], min: number, max = min): void {\n if (args.length < min || args.length > max) {\n throw new SqliteError(`wrong number of arguments to function ${name}()`, \"misuse\");\n }\n}\n\nconst scalarFunctions: Record<string, ScalarFunction> = {\n abs(args) {\n requireArgs(\"abs\", args, 1);\n const value = args[0]!;\n if (value === null) return null;\n if (typeof value === \"bigint\") return value < 0n ? -value : value;\n return Math.abs(numeric(value));\n },\n coalesce(args) {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function coalesce()\", \"misuse\");\n return args.find((value) => value !== null) ?? null;\n },\n ifnull(args) {\n requireArgs(\"ifnull\", args, 2);\n return args[0] ?? args[1]!;\n },\n nullif(args) {\n requireArgs(\"nullif\", args, 2);\n const comparison = compareSql(args[0]!, args[1]!);\n return comparison === 0 ? null : args[0]!;\n },\n typeof(args) {\n requireArgs(\"typeof\", args, 1);\n return typeofSql(args[0]!);\n },\n length(args) {\n requireArgs(\"length\", args, 1);\n const value = args[0]!;\n if (value === null) return null;\n if (value instanceof Uint8Array) return value.length;\n return [...text(value)].length;\n },\n lower(args) {\n requireArgs(\"lower\", args, 1);\n return args[0] === null ? null : text(args[0]!).replace(/[A-Z]/g, (c) => c.toLowerCase());\n },\n upper(args) {\n requireArgs(\"upper\", args, 1);\n return args[0] === null ? null : text(args[0]!).replace(/[a-z]/g, (c) => c.toUpperCase());\n },\n trim(args) {\n requireArgs(\"trim\", args, 1, 2);\n if (args[0] === null || args[1] === null) return null;\n return trimChars(text(args[0]!), args[1] === undefined ? \" \" : text(args[1]), true, true);\n },\n ltrim(args) {\n requireArgs(\"ltrim\", args, 1, 2);\n if (args[0] === null || args[1] === null) return null;\n return trimChars(text(args[0]!), args[1] === undefined ? \" \" : text(args[1]), true, false);\n },\n rtrim(args) {\n requireArgs(\"rtrim\", args, 1, 2);\n if (args[0] === null || args[1] === null) return null;\n return trimChars(text(args[0]!), args[1] === undefined ? \" \" : text(args[1]), false, true);\n },\n substr(args) {\n requireArgs(\"substr\", args, 2, 3);\n if (args[0] === null || args[1] === null || args[2] === null) return null;\n return substr(text(args[0]!), numeric(args[1]!), args[2] === undefined ? undefined : numeric(args[2]));\n },\n substring(args, context) {\n return scalarFunctions.substr!(args, context);\n },\n replace(args) {\n requireArgs(\"replace\", args, 3);\n if (args.some((value) => value === null)) return null;\n const search = text(args[1]!);\n return search === \"\" ? text(args[0]!) : text(args[0]!).split(search).join(text(args[2]!));\n },\n round(args) {\n requireArgs(\"round\", args, 1, 2);\n if (args[0] === null) return null;\n const places = Math.max(0, Math.min(30, Math.trunc(numeric(args[1] ?? 0))));\n const factor = 10 ** places;\n const scaled = numeric(args[0]!) * factor;\n return (scaled < 0 ? -Math.round(-scaled) : Math.round(scaled)) / factor;\n },\n min(args) {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function min()\", \"misuse\");\n if (args.some((value) => value === null)) return null;\n return args.reduce((best, value) => (compareSql(value, best)! < 0 ? value : best));\n },\n max(args) {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function max()\", \"misuse\");\n if (args.some((value) => value === null)) return null;\n return args.reduce((best, value) => (compareSql(value, best)! > 0 ? value : best));\n },\n random(args, context) {\n requireArgs(\"random\", args, 0);\n if (context.random) return context.random();\n // Fallback deterministic stream when evaluated outside a Database (e.g. unit helpers).\n return 0n;\n },\n randomblob(args, context) {\n requireArgs(\"randomblob\", args, 1);\n if (args[0] === null) return null;\n const length = Math.max(0, Math.trunc(numeric(args[0]!)));\n assertBlobLength(length, \"randomblob\");\n const out = new Uint8Array(length);\n let offset = 0;\n while (offset < length) {\n const bits = context.randomU64?.() ?? 0n;\n for (let shift = 0; shift < 64 && offset < length; shift += 8) {\n out[offset++] = Number((bits >> BigInt(shift)) & 0xffn);\n }\n }\n return out;\n },\n zeroblob(args) {\n requireArgs(\"zeroblob\", args, 1);\n if (args[0] === null) return null;\n const length = Math.max(0, Math.trunc(numeric(args[0]!)));\n assertBlobLength(length, \"zeroblob\");\n return new Uint8Array(length);\n },\n hex(args) {\n requireArgs(\"hex\", args, 1);\n if (args[0] === null) return \"\";\n const bytes = args[0] instanceof Uint8Array ? args[0] : utf8Encode(text(args[0]!));\n return [...bytes]\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase();\n },\n quote(args) {\n requireArgs(\"quote\", args, 1);\n const value = args[0]!;\n if (value === null) return \"NULL\";\n if (value instanceof Uint8Array) return `X'${scalarFunctions.hex!([value], {})}'`;\n if (typeof value === \"string\") return `'${value.replace(/'/g, \"''\")}'`;\n if (typeof value === \"number\" && !Number.isFinite(value)) return value < 0 ? \"-9.0e+999\" : \"9.0e+999\";\n return String(value);\n },\n printf(args) {\n if (args.length === 0 || args[0] === null) return null;\n return formatPrintf(text(args[0]!), args.slice(1));\n },\n changes(args, context) {\n requireArgs(\"changes\", args, 0);\n return context.changes?.() ?? 0;\n },\n total_changes(args, context) {\n requireArgs(\"total_changes\", args, 0);\n return context.totalChanges?.() ?? 0;\n },\n last_insert_rowid(args, context) {\n requireArgs(\"last_insert_rowid\", args, 0);\n return context.lastInsertRowid?.() ?? 0;\n },\n sqlite_version(args) {\n requireArgs(\"sqlite_version\", args, 0);\n return SQLITE_MEM_VERSION;\n },\n sqlite_source_id(args) {\n requireArgs(\"sqlite_source_id\", args, 0);\n return SQLITE_MEM_SOURCE_ID;\n },\n sqlite_compileoption_used(args) {\n requireArgs(\"sqlite_compileoption_used\", args, 1);\n if (args[0] === null) return null;\n const needle = text(args[0]!)\n .toUpperCase()\n .replace(/^SQLITE_/, \"\");\n return COMPILE_OPTIONS.some((opt) => opt === needle || opt.startsWith(`${needle}=`)) ? 1 : 0;\n },\n sqlite_compileoption_get(args) {\n requireArgs(\"sqlite_compileoption_get\", args, 1);\n if (args[0] === null) return null;\n const index = Math.trunc(numeric(args[0]!));\n if (index < 0 || index >= COMPILE_OPTIONS.length) return null;\n return COMPILE_OPTIONS[index]!;\n },\n sqlite_log(args) {\n requireArgs(\"sqlite_log\", args, 2);\n return null;\n },\n load_extension(args) {\n requireArgs(\"load_extension\", args, 1, 2);\n throw new SqliteError(\"not authorized\", \"misuse\");\n },\n like(args, context) {\n requireArgs(\"like\", args, 2, 3);\n if (args[0] === null || args[1] === null || args[2] === null) return null;\n // like(pattern, string[, escape]) \u2261 string LIKE pattern [ESCAPE escape]\n const escape = args[2] === undefined ? null : text(args[2]!);\n return likeMatch(text(args[1]!), text(args[0]!), escape, context.caseSensitiveLike === true) ? 1 : 0;\n },\n glob(args) {\n requireArgs(\"glob\", args, 2);\n if (args[0] === null || args[1] === null) return null;\n // glob(pattern, string) \u2261 string GLOB pattern\n return globMatch(text(args[1]!), text(args[0]!)) ? 1 : 0;\n },\n match() {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n },\n char(args) {\n if (args.length === 0) return \"\";\n let out = \"\";\n for (const arg of args) {\n if (arg === null) continue;\n const code = Math.trunc(numeric(arg));\n if (code > 0) out += String.fromCodePoint(code);\n }\n return out;\n },\n format(args, context) {\n return scalarFunctions.printf!(args, context);\n },\n iif(args) {\n requireArgs(\"iif\", args, 3);\n const cond = args[0];\n if (cond === null) return args[2]!;\n if (typeof cond === \"number\" || typeof cond === \"bigint\") {\n return Number(cond) !== 0 ? args[1]! : args[2]!;\n }\n if (typeof cond === \"string\") return cond.length > 0 ? args[1]! : args[2]!;\n if (cond instanceof Uint8Array) return cond.length > 0 ? args[1]! : args[2]!;\n return args[1]!;\n },\n if(args, context) {\n return scalarFunctions.iif!(args, context);\n },\n instr(args) {\n requireArgs(\"instr\", args, 2);\n if (args[0] === null || args[1] === null) return null;\n if (args[0] instanceof Uint8Array || args[1] instanceof Uint8Array) {\n const hay = args[0] instanceof Uint8Array ? args[0] : utf8Encode(text(args[0]!));\n const needle = args[1] instanceof Uint8Array ? args[1] : utf8Encode(text(args[1]!));\n if (needle.length === 0) return 1;\n outer: for (let i = 0; i <= hay.length - needle.length; i++) {\n for (let j = 0; j < needle.length; j++) {\n if (hay[i + j] !== needle[j]) continue outer;\n }\n return i + 1;\n }\n return 0;\n }\n const hay = text(args[0]!);\n const needle = text(args[1]!);\n if (needle === \"\") return 1;\n const idx = hay.indexOf(needle);\n return idx < 0 ? 0 : [...hay.slice(0, idx)].length + 1;\n },\n unicode(args) {\n requireArgs(\"unicode\", args, 1);\n if (args[0] === null) return null;\n const s = text(args[0]!);\n if (s.length === 0) return null;\n return s.codePointAt(0)!;\n },\n octet_length(args) {\n requireArgs(\"octet_length\", args, 1);\n if (args[0] === null) return null;\n if (args[0] instanceof Uint8Array) return args[0].length;\n return utf8Encode(text(args[0]!)).length;\n },\n unhex(args) {\n requireArgs(\"unhex\", args, 1, 2);\n if (args[0] === null) return null;\n let hex = text(args[0]!).replace(/\\s+/g, \"\");\n if (args[1] !== undefined && args[1] !== null) {\n const sep = text(args[1]!);\n hex = text(args[0]!).split(sep).join(\"\");\n }\n if (hex.length % 2 !== 0) return null;\n if (!/^[0-9a-fA-F]*$/.test(hex)) return null;\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < out.length; i++) {\n out[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n }\n return out;\n },\n concat(args) {\n if (args.some((v) => v === null)) return null;\n return args.map((v) => text(v!)).join(\"\");\n },\n concat_ws(args) {\n if (args.length < 2) throw new SqliteError(\"wrong number of arguments to function concat_ws()\", \"misuse\");\n if (args[0] === null) return null;\n const sep = text(args[0]!);\n const parts: string[] = [];\n for (const arg of args.slice(1)) {\n if (arg === null) continue;\n parts.push(text(arg));\n }\n return parts.join(sep);\n },\n unistr(args) {\n requireArgs(\"unistr\", args, 1);\n if (args[0] === null) return null;\n const input = text(args[0]!);\n let out = \"\";\n for (let i = 0; i < input.length; i++) {\n if (input[i] === \"\\\\\" && input[i + 1] === \"u\") {\n const hex = input.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) {\n throw new SqliteError(\"invalid Unicode escape in unistr()\", \"other\");\n }\n out += String.fromCodePoint(Number.parseInt(hex, 16));\n i += 5;\n } else {\n out += input[i];\n }\n }\n return out;\n },\n unistr_quote(args) {\n requireArgs(\"unistr_quote\", args, 1);\n if (args[0] === null) return \"NULL\";\n const s = text(args[0]!);\n let needs = false;\n let escaped = \"\";\n for (const ch of s) {\n const cp = ch.codePointAt(0)!;\n if (cp < 0x20 || cp === 0x7f) {\n needs = true;\n escaped += `\\\\u${cp.toString(16).padStart(4, \"0\")}`;\n } else if (ch === \"'\") {\n escaped += \"''\";\n } else if (ch === \"\\\\\") {\n needs = true;\n escaped += \"\\\\\\\\\";\n } else {\n escaped += ch;\n }\n }\n return needs ? `unistr('${escaped}')` : `'${escaped}'`;\n },\n likelihood(args) {\n requireArgs(\"likelihood\", args, 2);\n const p = numOrThrow(args[1], \"likelihood\");\n if (p === null || p < 0 || p > 1) {\n throw new SqliteError(\"second argument to likelihood() must be a constant between 0.0 and 1.0\", \"misuse\");\n }\n return args[0]!;\n },\n likely(args) {\n requireArgs(\"likely\", args, 1);\n return args[0]!;\n },\n unlikely(args) {\n requireArgs(\"unlikely\", args, 1);\n return args[0]!;\n },\n unknown() {\n return null;\n },\n uuid(args, context) {\n requireArgs(\"uuid\", args, 0);\n return formatUuid(nextUuidBytes(context));\n },\n uuid_str(args) {\n requireArgs(\"uuid_str\", args, 1);\n if (args[0] === null) return null;\n if (typeof args[0] === \"string\") return args[0].toLowerCase();\n if (args[0] instanceof Uint8Array && args[0].length === 16) return formatUuid(args[0]);\n return null;\n },\n uuid_blob(args) {\n requireArgs(\"uuid_blob\", args, 1);\n if (args[0] === null) return null;\n if (args[0] instanceof Uint8Array && args[0].length === 16) return args[0];\n if (typeof args[0] === \"string\") {\n const hex = args[0].replace(/-/g, \"\");\n if (!/^[0-9a-fA-F]{32}$/.test(hex)) return null;\n const out = new Uint8Array(16);\n for (let i = 0; i < 16; i++) out[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n return out;\n }\n return null;\n },\n // FTS/RTREE helpers registered as context-sensitive stubs; real work is in MATCH/vtab paths.\n optimize() {\n throw new SqliteError(\"unable to use function optimize in the requested context\", \"unsupported\");\n },\n fts5() {\n throw new SqliteError(\"unable to use function fts5 in the requested context\", \"unsupported\");\n },\n fts5_source_id(args) {\n requireArgs(\"fts5_source_id\", args, 0);\n return `fts5: ${SQLITE_MEM_SOURCE_ID}`;\n },\n fts5_get_locale() {\n return null;\n },\n fts5_locale(args) {\n requireArgs(\"fts5_locale\", args, 1, 2);\n return args[0] ?? null;\n },\n fts5_insttoken(args) {\n requireArgs(\"fts5_insttoken\", args, 1);\n return args[0]!;\n },\n fts3_tokenizer() {\n throw new SqliteError(\"unknown tokenizer: \", \"other\");\n },\n};\n\nfunction numOrThrow(value: SqlValue | undefined, name: string): number | null {\n if (value === undefined) throw new SqliteError(`wrong number of arguments to function ${name}()`, \"misuse\");\n if (value === null) return null;\n return coerceToNumber(value);\n}\n\nfunction nextUuidBytes(context: FunctionContext): Uint8Array {\n const out = new Uint8Array(16);\n let offset = 0;\n while (offset < 16) {\n const bits = context.randomU64?.() ?? 0n;\n for (let shift = 0; shift < 64 && offset < 16; shift += 8) {\n out[offset++] = Number((bits >> BigInt(shift)) & 0xffn);\n }\n }\n // RFC 4122 version 4 / variant bits\n out[6] = (out[6]! & 0x0f) | 0x40;\n out[8] = (out[8]! & 0x3f) | 0x80;\n return out;\n}\n\nfunction formatUuid(bytes: Uint8Array): string {\n const hex = [...bytes].map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\nexport function getScalarFunctions(): Readonly<Record<string, ScalarFunction>> {\n return scalarFunctions;\n}\n\nexport function invokeScalar(name: string, args: SqlValue[], context: FunctionContext = {}): SqlValue {\n const fn = scalarFunctions[name.toLowerCase()];\n if (!fn) throw new SqliteError(`no such function: ${name}`, \"other\");\n return fn(args, context);\n}\n\nexport { storageClassOf };\n", "import type { SqlValue } from \"../types/value.ts\";\nimport { type AggregateAccumulator, type AggregateFactory, aggregateFunctions } from \"./aggregate.ts\";\nimport { dateTimeFunctions } from \"./datetime.ts\";\nimport { ftsAuxFunctions, rtreeAuxFunctions } from \"./extensions.ts\";\nimport { jsonAggregateFunctions, jsonScalarFunctions } from \"./json.ts\";\nimport { mathFunctions } from \"./math.ts\";\nimport { getScalarFunctions } from \"./scalar.ts\";\n\nexport interface FunctionContext {\n changes?: () => number;\n totalChanges?: () => number;\n lastInsertRowid?: () => number | bigint;\n /** Injectable clock \u2014 defaults to a fixed instant on Database. */\n now?: () => Date;\n /** Injectable SQLite `random()` source \u2014 defaults to a seeded PRNG on Database. */\n random?: () => bigint;\n /** Raw unsigned 64-bit PRNG draws for `randomblob`. */\n randomU64?: () => bigint;\n /** Active FTS MATCH cursor when evaluating projections with MATCH in WHERE. */\n ftsMatch?: import(\"../vtable/fts5.ts\").FtsMatchCursor | null;\n /** SQLite `PRAGMA case_sensitive_like` for LIKE / like(). */\n caseSensitiveLike?: boolean;\n /** Current rowid for FTS aux defaults when MATCH is absent. */\n ftsRowid?: import(\"../storage/row.ts\").Rowid;\n /** Source FTS table name for the current scan row. */\n ftsSourceTable?: string;\n /** Resolve FTS table by name for aux functions. */\n getFtsTable?: (name: string) => import(\"../vtable/fts5.ts\").Fts5VirtualTable | null;\n}\n\nexport type ScalarFunction = (args: SqlValue[], context: FunctionContext) => SqlValue;\n\nexport class FunctionRegistry {\n private readonly scalars = new Map<string, ScalarFunction>();\n private readonly aggregates = new Map<string, AggregateFactory>();\n\n constructor() {\n for (const [name, fn] of Object.entries(getScalarFunctions())) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(dateTimeFunctions)) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(jsonScalarFunctions)) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(mathFunctions)) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(ftsAuxFunctions)) this.scalars.set(name, fn);\n for (const [name, fn] of Object.entries(rtreeAuxFunctions)) this.scalars.set(name, fn);\n for (const [name, factory] of Object.entries(aggregateFunctions)) this.aggregates.set(name, factory);\n for (const [name, factory] of Object.entries(jsonAggregateFunctions)) this.aggregates.set(name, factory);\n }\n\n registerScalar(name: string, fn: ScalarFunction): void {\n this.scalars.set(name.toLowerCase(), fn);\n }\n\n registerAggregate(name: string, factory: AggregateFactory): void {\n this.aggregates.set(name.toLowerCase(), factory);\n }\n\n lookupScalar(name: string): ScalarFunction | undefined {\n return this.scalars.get(name.toLowerCase());\n }\n\n lookupAggregate(name: string): AggregateFactory | undefined {\n return this.aggregates.get(name.toLowerCase());\n }\n\n createAggregate(name: string): AggregateAccumulator | undefined {\n return this.lookupAggregate(name)?.();\n }\n\n isAggregateName(name: string): boolean {\n return this.aggregates.has(name.toLowerCase());\n }\n}\n\nexport const defaultFunctionRegistry = new FunctionRegistry();\n\nexport function lookupScalar(name: string): ScalarFunction | undefined {\n return defaultFunctionRegistry.lookupScalar(name);\n}\n\nexport function lookupAggregate(name: string): AggregateFactory | undefined {\n return defaultFunctionRegistry.lookupAggregate(name);\n}\n\nexport function isAggregateName(name: string): boolean {\n return defaultFunctionRegistry.isAggregateName(name);\n}\n", "import type { SelectStmt } from \"../ast/nodes.ts\";\nimport { SqliteError, TriggerRaiseError } from \"../errors/index.ts\";\nimport type { EvalContext } from \"../expressions/context.ts\";\nimport { defaultFunctionRegistry, type FunctionRegistry } from \"../functions/registry.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\nimport type { Rowid } from \"../storage/row.ts\";\nimport type { TransactionManager } from \"../transactions/manager.ts\";\nimport {\n type Affinity,\n canonicalizeNumber,\n SqlJsonText,\n SqlReal,\n type SqlValue,\n storageClassOf,\n} from \"../types/value.ts\";\nimport type { ResultSet } from \"./result.ts\";\n\nexport interface Cell {\n table: string | null;\n tableLower?: string | null;\n name: string;\n nameLower?: string;\n value: SqlValue;\n affinity?: Affinity;\n collate?: string | null;\n /** Right-hand duplicate of a column merged by JOIN ... USING. */\n hiddenByUsing?: boolean;\n}\n\nexport function makeCell(\n table: string | null,\n name: string,\n value: SqlValue,\n extra?: Omit<Partial<Cell>, \"table\" | \"name\" | \"value\" | \"tableLower\" | \"nameLower\">,\n): Cell {\n return {\n table,\n tableLower: table?.toLowerCase() ?? null,\n name,\n nameLower: name.toLowerCase(),\n value,\n ...extra,\n };\n}\n\nexport interface ScopeRow {\n cells: Cell[];\n rowid?: Rowid;\n /** Output name of the rowid pseudo-column (INTEGER PRIMARY KEY alias when present). */\n rowidName?: string;\n sourceTable?: string;\n /** Set when WHERE MATCH succeeds for this row. */\n ftsMatch?: import(\"../vtable/fts5.ts\").FtsMatchCursor | null;\n}\n\nexport type SelectRunner = (stmt: SelectStmt, env: ExecutionEnv, parent?: EvalContext) => ResultSet;\n\nexport interface ExecutionHooks {\n now?: () => Date;\n random?: () => bigint;\n /** Raw xorshift64* output for `randomblob`. */\n randomU64?: () => bigint;\n}\n\nexport class ExecutionEnv {\n readonly state: DatabaseState;\n readonly transactions: TransactionManager;\n readonly functions: FunctionRegistry;\n readonly positional: SqlValue[];\n readonly named: Map<string, SqlValue>;\n readonly ctes = new Map<string, ResultSet>();\n readonly hooks: ExecutionHooks;\n selectRunner?: SelectRunner;\n\n /** Nesting depth while executing trigger programs. */\n triggerDepth = 0;\n /** OLD/NEW column scope for the active trigger program. */\n triggerScope: ScopeRow | null = null;\n\n /** Cap SELECT output rows (used by Statement.get). */\n maxRows = Number.POSITIVE_INFINITY;\n /** When true, skip simple-select / simple-join fast paths (tests only). */\n forceFullSelect = false;\n /** When true, skip tryFastInsert (tests only). */\n forceFullInsert = false;\n includeNamedRows = true;\n includeValues = true;\n /** Source text of the statement currently executing (for sqlite_master.sql). */\n statementSql: string | null = null;\n\n constructor(\n state: DatabaseState,\n transactions: TransactionManager,\n params: readonly unknown[] = [],\n functions: FunctionRegistry = defaultFunctionRegistry,\n hooks: ExecutionHooks = {},\n ) {\n this.state = state;\n this.transactions = transactions;\n this.functions = functions;\n this.hooks = hooks;\n this.positional = params.map(toSqlValue);\n this.named = new Map();\n }\n\n reset(params: readonly unknown[]): void {\n this.positional.length = 0;\n for (const value of params) this.positional.push(toSqlValue(value));\n this.named.clear();\n this.ctes.clear();\n this.triggerDepth = 0;\n this.triggerScope = null;\n this.maxRows = Number.POSITIVE_INFINITY;\n this.forceFullSelect = false;\n this.forceFullInsert = false;\n this.includeNamedRows = true;\n this.includeValues = true;\n this.statementSql = null;\n }\n\n getBoundParameter(name: string | number): SqlValue {\n if (typeof name === \"number\") {\n if (name < 1 || name > this.positional.length) return null;\n return this.positional[name - 1]!;\n }\n const key = name.toLowerCase();\n if (!this.named.has(key)) {\n // Unnamed positional fallback is handled by the evaluator for PARAM_POS;\n // named placeholders that were never bound are NULL (SQLite).\n return null;\n }\n return this.named.get(key) ?? null;\n }\n\n setNamed(name: string, value: unknown): void {\n this.named.set(name.toLowerCase(), toSqlValue(value));\n }\n\n createEvalContext(row: ScopeRow | null = null, parent?: EvalContext): EvalContext {\n const scope = row ?? this.triggerScope;\n const cells = scope?.cells ?? [];\n const inheritedParent =\n parent ??\n (row !== null && this.triggerScope !== null && row !== this.triggerScope\n ? this.createEvalContext(this.triggerScope)\n : undefined);\n const context: EvalContext = {\n parent: inheritedParent,\n ftsMatch: scope?.ftsMatch ?? null,\n functions: this.functions,\n functionContext: {\n changes: () => this.state.changes,\n totalChanges: () => this.state.totalChanges,\n lastInsertRowid: () => this.state.lastInsertRowid,\n now: this.hooks.now,\n random: this.hooks.random,\n randomU64: this.hooks.randomU64,\n caseSensitiveLike: this.state.caseSensitiveLike,\n ftsMatch: scope?.ftsMatch ?? null,\n ftsRowid: scope?.rowid,\n ftsSourceTable: scope?.sourceTable,\n getFtsTable: (name: string) => {\n if (!this.state.isFtsTable(name)) return null;\n return this.state.getVirtualTable(name);\n },\n },\n raise: this.triggerScope\n ? (action, message) => {\n throw new TriggerRaiseError(action, message);\n }\n : undefined,\n resolveColumn: (table, name) => {\n const key = name.toLowerCase();\n const tableKey = table?.toLowerCase();\n const tableMatches =\n table === null || cells.some((cell) => (cell.tableLower ?? cell.table?.toLowerCase()) === tableKey);\n if (tableMatches && (key === \"rowid\" || key === \"_rowid_\" || key === \"oid\") && scope?.rowid !== undefined) {\n return scope.rowid;\n }\n if (key === \"rank\" && scope?.sourceTable && this.state.isFtsTable(scope.sourceTable)) {\n const fts = this.state.getVirtualTable(scope.sourceTable);\n if (scope.ftsMatch) return fts.bm25(scope.ftsMatch);\n return null;\n }\n // FTS table-name reference used by aux functions (bm25(docs), \u2026)\n if (\n scope?.sourceTable &&\n key === scope.sourceTable.toLowerCase() &&\n this.state.isFtsTable(scope.sourceTable) &&\n !cells.some((cell) => (cell.nameLower ?? cell.name.toLowerCase()) === key)\n ) {\n return scope.sourceTable;\n }\n const matches = cells.filter((cell) => {\n if ((cell.nameLower ?? cell.name.toLowerCase()) !== key) return false;\n if (table === null) return !cell.hiddenByUsing;\n return (cell.tableLower ?? cell.table?.toLowerCase()) === tableKey;\n });\n if (matches.length === 0) {\n // SQLite: bare TRUE/FALSE are integer 1/0 unless a same-named column is in scope.\n if (table === null) {\n if (key === \"true\") return 1;\n if (key === \"false\") return 0;\n }\n throw new SqliteError(`no such column: ${table ? `${table}.` : \"\"}${name}`, \"no_such_column\");\n }\n if (matches.length > 1 && table === null) throw new SqliteError(`ambiguous column name: ${name}`, \"other\");\n return matches[0]!.value;\n },\n resolveStorageClass: (table, name) => {\n const key = name.toLowerCase();\n if (key === \"rank\") return \"real\";\n const tableKey = table?.toLowerCase();\n const matches = cells.filter((cell) => {\n if ((cell.nameLower ?? cell.name.toLowerCase()) !== key) return false;\n if (table === null) return !cell.hiddenByUsing;\n return (cell.tableLower ?? cell.table?.toLowerCase()) === tableKey;\n });\n if (matches.length === 0) {\n if (table === null && (key === \"true\" || key === \"false\")) return \"integer\";\n throw new SqliteError(`no such column: ${table ? `${table}.` : \"\"}${name}`, \"no_such_column\");\n }\n if (matches.length > 1 && table === null) throw new SqliteError(`ambiguous column name: ${name}`, \"other\");\n const cell = matches[0]!;\n return cell.affinity === \"REAL\" && typeof cell.value === \"number\" ? \"real\" : storageClassOf(cell.value);\n },\n resolveAffinity: (table, name) => {\n const key = name.toLowerCase();\n const tableKey = table?.toLowerCase();\n const matches = cells.filter((cell) => {\n if ((cell.nameLower ?? cell.name.toLowerCase()) !== key) return false;\n if (table === null) return !cell.hiddenByUsing;\n return (cell.tableLower ?? cell.table?.toLowerCase()) === tableKey;\n });\n if (matches.length !== 1) return null;\n return matches[0]!.affinity ?? null;\n },\n resolveCollation: (table, name) => {\n const key = name.toLowerCase();\n const tableKey = table?.toLowerCase();\n const matches = cells.filter((cell) => {\n if ((cell.nameLower ?? cell.name.toLowerCase()) !== key) return false;\n if (table === null) return !cell.hiddenByUsing;\n return (cell.tableLower ?? cell.table?.toLowerCase()) === tableKey;\n });\n if (matches.length === 0) return null;\n if (matches.length > 1 && table === null) return null;\n return matches[0]!.collate ?? null;\n },\n getParameter: (name) => this.getBoundParameter(name),\n executeSelect: (select) => {\n if (!this.selectRunner) throw new SqliteError(\"select executor is not configured\", \"misuse\");\n const result = this.selectRunner(select, this, context);\n return {\n columns: result.columns,\n rows:\n result.values.length > 0\n ? result.values.map((row) => [...row])\n : result.rows.map((record) => result.columns.map((column) => record[column] ?? null)),\n };\n },\n matchFts: (table, column, query) => {\n if (row?.rowid === undefined || !row.sourceTable) {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n }\n if (!this.state.isFtsTable(row.sourceTable)) {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n }\n const fts = this.state.getVirtualTable(row.sourceTable);\n const cursor = fts.matchCursor(row.rowid, table, column, query);\n if (cursor) row.ftsMatch = cursor;\n else row.ftsMatch = null;\n return cursor !== null;\n },\n };\n return context;\n }\n}\n\nexport function toSqlValue(value: unknown): SqlValue {\n if (value === null || typeof value === \"string\" || typeof value === \"bigint\") return value;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw new SqliteError(\"only finite numbers can be bound\", \"datatype_mismatch\");\n return canonicalizeNumber(value);\n }\n if (typeof value === \"boolean\") return value ? 1 : 0;\n if (value instanceof SqlReal || value instanceof SqlJsonText) return value;\n if (value instanceof Uint8Array) {\n if (isSharedArrayBufferView(value)) {\n throw new SqliteError(\"cannot bind SharedArrayBuffer-backed buffers; copy into a Uint8Array first\", \"misuse\");\n }\n return new Uint8Array(value);\n }\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n if (typeof SharedArrayBuffer !== \"undefined\" && value instanceof SharedArrayBuffer) {\n throw new SqliteError(\"cannot bind SharedArrayBuffer; copy into an ArrayBuffer or Uint8Array first\", \"misuse\");\n }\n if (ArrayBuffer.isView(value)) {\n const kind = Object.prototype.toString.call(value).slice(8, -1);\n throw new SqliteError(`cannot bind ${kind}; only Uint8Array and ArrayBuffer are accepted as BLOB values`, \"misuse\");\n }\n throw new SqliteError(`unsupported bind value: ${typeof value}`, \"datatype_mismatch\");\n}\n\nfunction isSharedArrayBufferView(view: ArrayBufferView): boolean {\n return typeof SharedArrayBuffer !== \"undefined\" && view.buffer instanceof SharedArrayBuffer;\n}\n", "import type { BinaryOp, Expr, SelectStmt } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { jsonArrow } from \"../functions/json.ts\";\nimport { defaultFunctionRegistry } from \"../functions/registry.ts\";\nimport { castSqlValue } from \"../functions/scalar.ts\";\nimport { compareWithCollation } from \"../types/collation.ts\";\nimport {\n type Affinity,\n affinityFromTypeName,\n applyComparisonAffinity,\n asSqlReal,\n canonicalizeNumber,\n coerceToNumberPrefix,\n compareSql,\n isSqlReal,\n isTruthySql,\n type SqlValue,\n storageClassOf,\n utf8Decode,\n} from \"../types/value.ts\";\nimport type { EvalContext } from \"./context.ts\";\nimport { globMatch, likeMatch } from \"./like.ts\";\n\nfunction numberValue(value: SqlValue): number {\n return coerceToNumberPrefix(value);\n}\n\nfunction asNumber(value: number): number {\n return canonicalizeNumber(value);\n}\n\nfunction integerValue(value: SqlValue): bigint {\n if (value === null) return 0n;\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\") return BigInt(Math.trunc(value));\n if (isSqlReal(value)) return BigInt(Math.trunc(value.value));\n return BigInt(Math.trunc(coerceToNumberPrefix(value)));\n}\n\nfunction isRealStorage(value: SqlValue): boolean {\n return storageClassOf(value) === \"real\" || isSqlReal(value);\n}\n\nfunction textValue(value: SqlValue): string {\n if (value instanceof Uint8Array) return utf8Decode(value);\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"value\" in value &&\n typeof (value as { value: unknown }).value === \"string\"\n ) {\n return (value as { value: string }).value;\n }\n return String(value);\n}\n\nfunction booleanValue(value: boolean): SqlValue {\n return value ? 1 : 0;\n}\n\nfunction executeSelect(ctx: EvalContext, select: SelectStmt): { columns: string[]; rows: SqlValue[][] } {\n if (!ctx.executeSelect) throw new SqliteError(\"subqueries are not available in this evaluation context\", \"misuse\");\n return ctx.executeSelect(select);\n}\n\nfunction resolveColumn(ctx: EvalContext, table: string | null, name: string): SqlValue {\n try {\n return ctx.resolveColumn(table, name);\n } catch (error) {\n if (ctx.parent && error instanceof SqliteError && error.category === \"no_such_column\") {\n return resolveColumn(ctx.parent, table, name);\n }\n throw error;\n }\n}\n\nfunction sqlAnd(left: SqlValue, right: () => SqlValue): SqlValue {\n const leftTruth = isTruthySql(left);\n if (leftTruth === false) return 0;\n const rightTruth = isTruthySql(right());\n if (rightTruth === false) return 0;\n if (leftTruth === null || rightTruth === null) return null;\n return 1;\n}\n\nfunction sqlOr(left: SqlValue, right: () => SqlValue): SqlValue {\n const leftTruth = isTruthySql(left);\n if (leftTruth === true) return 1;\n const rightTruth = isTruthySql(right());\n if (rightTruth === true) return 1;\n if (leftTruth === null || rightTruth === null) return null;\n return 0;\n}\n\nfunction compareResult(\n op: BinaryOp,\n left: SqlValue,\n right: SqlValue,\n collation?: string,\n leftAffinity: Affinity | null = null,\n rightAffinity: Affinity | null = null,\n): SqlValue {\n [left, right] = applyComparisonAffinity(left, right, leftAffinity, rightAffinity);\n if (op === \"IS\" || op === \"IS NOT\" || op === \"IS DISTINCT FROM\" || op === \"IS NOT DISTINCT FROM\") {\n const equal =\n left === null || right === null\n ? left === right\n : (collation ? compareWithCollation(left, right, collation) : compareSql(left, right)) === 0;\n if (op === \"IS\" || op === \"IS NOT DISTINCT FROM\") return booleanValue(equal);\n return booleanValue(!equal);\n }\n const comparison = collation ? compareWithCollation(left, right, collation) : compareSql(left, right);\n if (comparison === null) return null;\n switch (op) {\n case \"=\":\n case \"==\":\n return booleanValue(comparison === 0);\n case \"!=\":\n case \"<>\":\n return booleanValue(comparison !== 0);\n case \"<\":\n return booleanValue(comparison < 0);\n case \"<=\":\n return booleanValue(comparison <= 0);\n case \">\":\n return booleanValue(comparison > 0);\n case \">=\":\n return booleanValue(comparison >= 0);\n default:\n throw new SqliteError(`unsupported comparison operator: ${op}`, \"unsupported\");\n }\n}\n\nfunction evalBinary(op: BinaryOp, leftExpr: Expr, rightExpr: Expr, ctx: EvalContext): SqlValue {\n if (op === \"MATCH\") {\n if (leftExpr.type !== \"column\") {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n }\n const query = textValue(evalExpr(rightExpr, ctx));\n if (!ctx.matchFts) {\n throw new SqliteError(\"unable to use function MATCH in the requested context\", \"unsupported\");\n }\n return booleanValue(ctx.matchFts(leftExpr.table, leftExpr.name, query));\n }\n\n if (\n leftExpr.type === \"row\" &&\n rightExpr.type === \"row\" &&\n [\"=\", \"==\", \"!=\", \"<>\", \"<\", \"<=\", \">\", \">=\", \"IS\", \"IS NOT\", \"IS DISTINCT FROM\", \"IS NOT DISTINCT FROM\"].includes(\n op,\n )\n ) {\n return compareRowValues(op, leftExpr.values, rightExpr.values, ctx);\n }\n\n const left = evalExpr(leftExpr, ctx);\n if (op === \"AND\") return sqlAnd(left, () => evalExpr(rightExpr, ctx));\n if (op === \"OR\") return sqlOr(left, () => evalExpr(rightExpr, ctx));\n const right = evalExpr(rightExpr, ctx);\n\n if (op === \"->\" || op === \"->>\") {\n return jsonArrow(left, right, op);\n }\n\n if (\n [\"=\", \"==\", \"!=\", \"<>\", \"<\", \"<=\", \">\", \">=\", \"IS\", \"IS NOT\", \"IS DISTINCT FROM\", \"IS NOT DISTINCT FROM\"].includes(\n op,\n )\n ) {\n return compareResult(\n op,\n left,\n right,\n resolveComparisonCollation(leftExpr, rightExpr, ctx) ?? undefined,\n resolveComparisonAffinity(leftExpr, ctx),\n resolveComparisonAffinity(rightExpr, ctx),\n );\n }\n if (op === \"LIKE\" || op === \"NOT LIKE\" || op === \"GLOB\" || op === \"NOT GLOB\") {\n if (left === null || right === null) return null;\n const matches = op.includes(\"LIKE\")\n ? likeMatch(textValue(left), textValue(right), null, ctx.functionContext?.caseSensitiveLike === true)\n : globMatch(textValue(left), textValue(right));\n return booleanValue(op.startsWith(\"NOT\") ? !matches : matches);\n }\n if (left === null || right === null) return null;\n switch (op) {\n case \"+\":\n if (storageClassOf(left) === \"integer\" && storageClassOf(right) === \"integer\") {\n return integerArithmetic(\"+\", left, right);\n }\n return asNumber(numberValue(left) + numberValue(right));\n case \"-\":\n if (storageClassOf(left) === \"integer\" && storageClassOf(right) === \"integer\") {\n return integerArithmetic(\"-\", left, right);\n }\n return asNumber(numberValue(left) - numberValue(right));\n case \"*\":\n if (storageClassOf(left) === \"integer\" && storageClassOf(right) === \"integer\") {\n return integerArithmetic(\"*\", left, right);\n }\n return asNumber(numberValue(left) * numberValue(right));\n case \"/\": {\n const divisor = numberValue(right);\n if (divisor === 0) return null;\n if (storageClassOf(left) === \"integer\" && storageClassOf(right) === \"integer\") {\n const quotient = integerValue(left) / integerValue(right);\n return quotient <= BigInt(Number.MAX_SAFE_INTEGER) && quotient >= BigInt(Number.MIN_SAFE_INTEGER)\n ? Number(quotient)\n : quotient;\n }\n return asNumber(numberValue(left) / divisor);\n }\n case \"%\": {\n const divisor = integerValue(right);\n if (divisor === 0n) return null;\n const remainder = integerValue(left) % divisor;\n if (isRealStorage(left) || isRealStorage(right)) {\n return asSqlReal(Number(remainder));\n }\n return safeIntegerResult(remainder);\n }\n case \"||\":\n return textValue(left) + textValue(right);\n case \"&\":\n return safeIntegerResult(integerValue(left) & integerValue(right));\n case \"|\":\n return safeIntegerResult(integerValue(left) | integerValue(right));\n case \"<<\":\n return safeIntegerResult(integerValue(left) << integerValue(right));\n case \">>\":\n return safeIntegerResult(integerValue(left) >> integerValue(right));\n case \"IN\":\n case \"NOT IN\":\n throw new SqliteError(`${op} requires an IN expression node`, \"misuse\");\n default:\n throw new SqliteError(`unsupported binary operator: ${op}`, \"unsupported\");\n }\n}\n\nfunction safeIntegerResult(value: bigint): number | bigint {\n return value <= BigInt(Number.MAX_SAFE_INTEGER) && value >= BigInt(Number.MIN_SAFE_INTEGER) ? Number(value) : value;\n}\n\nconst I64_MIN = -(2n ** 63n);\nconst I64_MAX = 2n ** 63n - 1n;\n\nfunction integerArithmetic(op: \"+\" | \"-\" | \"*\", left: SqlValue, right: SqlValue): SqlValue {\n const a = integerValue(left);\n const b = integerValue(right);\n const result = op === \"+\" ? a + b : op === \"-\" ? a - b : a * b;\n if (result < I64_MIN || result > I64_MAX) {\n return asSqlReal(Number(result));\n }\n return safeIntegerResult(result);\n}\n\nfunction compareRowValues(op: BinaryOp, leftExprs: Expr[], rightExprs: Expr[], ctx: EvalContext): SqlValue {\n if (leftExprs.length !== rightExprs.length) {\n throw new SqliteError(\"row value misused\", \"misuse\");\n }\n const isIsFamily = op === \"IS\" || op === \"IS NOT\" || op === \"IS DISTINCT FROM\" || op === \"IS NOT DISTINCT FROM\";\n let sawNull = false;\n for (let i = 0; i < leftExprs.length; i++) {\n const left = evalExpr(leftExprs[i]!, ctx);\n const right = evalExpr(rightExprs[i]!, ctx);\n if (isIsFamily) {\n const equal = left === null || right === null ? left === right : compareSql(left, right) === 0;\n if (!equal) {\n if (op === \"IS\" || op === \"IS NOT DISTINCT FROM\") return booleanValue(false);\n return booleanValue(true);\n }\n continue;\n }\n if (left === null || right === null) {\n sawNull = true;\n continue;\n }\n const cmp = compareSql(left, right);\n if (cmp === null) {\n sawNull = true;\n continue;\n }\n if (cmp !== 0) {\n switch (op) {\n case \"=\":\n case \"==\":\n return booleanValue(false);\n case \"!=\":\n case \"<>\":\n return booleanValue(true);\n case \"<\":\n return booleanValue(cmp < 0);\n case \"<=\":\n return booleanValue(cmp < 0);\n case \">\":\n return booleanValue(cmp > 0);\n case \">=\":\n return booleanValue(cmp > 0);\n }\n }\n }\n if (isIsFamily) {\n if (op === \"IS\" || op === \"IS NOT DISTINCT FROM\") return booleanValue(true);\n return booleanValue(false);\n }\n if (sawNull) return null;\n switch (op) {\n case \"=\":\n case \"==\":\n case \"<=\":\n case \">=\":\n return booleanValue(true);\n case \"!=\":\n case \"<>\":\n case \"<\":\n case \">\":\n return booleanValue(false);\n default:\n return null;\n }\n}\n\nfunction rowValuesEqual(left: SqlValue[], right: SqlValue[]): boolean | null {\n if (left.length !== right.length) return false;\n let sawNull = false;\n for (let i = 0; i < left.length; i++) {\n const a = left[i]!;\n const b = right[i]!;\n if (a === null || b === null) {\n sawNull = true;\n continue;\n }\n const cmp = compareSql(a, b);\n if (cmp === null) {\n sawNull = true;\n continue;\n }\n if (cmp !== 0) return false;\n }\n return sawNull ? null : true;\n}\n\n/** COLLATE name on `expr`, if any (does not walk column inheritance). */\nexport function explicitCollation(expr: Expr): string | null {\n switch (expr.type) {\n case \"collate\":\n return expr.collation;\n case \"unary\":\n case \"cast\":\n return explicitCollation(expr.expr);\n case \"is_bool\":\n return explicitCollation(expr.expr);\n case \"binary\":\n return explicitCollation(expr.left) ?? explicitCollation(expr.right);\n case \"between\":\n return explicitCollation(expr.expr) ?? explicitCollation(expr.lower) ?? explicitCollation(expr.upper);\n case \"in\":\n return (\n explicitCollation(expr.expr) ??\n (Array.isArray(expr.values) ? (expr.values.map(explicitCollation).find((name) => name !== null) ?? null) : null)\n );\n case \"like\":\n return explicitCollation(expr.expr) ?? explicitCollation(expr.pattern);\n case \"case\":\n return (\n (expr.base && explicitCollation(expr.base)) ??\n expr.whens\n .flatMap((branch) => [branch.when, branch.then])\n .map(explicitCollation)\n .find((name) => name !== null) ??\n (expr.else && explicitCollation(expr.else)) ??\n null\n );\n case \"row\":\n return expr.values.map(explicitCollation).find((name) => name !== null) ?? null;\n default:\n return null;\n }\n}\n\n/** Explicit COLLATE wins; otherwise inherit declared column collation (left then right). */\nfunction resolveComparisonCollation(leftExpr: Expr, rightExpr: Expr, ctx: EvalContext): string | null {\n const explicit = explicitCollation(leftExpr) ?? explicitCollation(rightExpr);\n if (explicit) return explicit;\n return inheritedCollation(leftExpr, ctx) ?? inheritedCollation(rightExpr, ctx);\n}\n\nfunction inheritedCollation(expr: Expr, ctx: EvalContext): string | null {\n switch (expr.type) {\n case \"collate\":\n return inheritedCollation(expr.expr, ctx);\n case \"column\":\n return (\n ctx.resolveCollation?.(expr.table, expr.name) ?? ctx.parent?.resolveCollation?.(expr.table, expr.name) ?? null\n );\n case \"unary\":\n case \"cast\":\n return inheritedCollation(expr.expr, ctx);\n case \"is_bool\":\n return inheritedCollation(expr.expr, ctx);\n default:\n return null;\n }\n}\n\nfunction resolveComparisonAffinity(expr: Expr, ctx: EvalContext): Affinity | null {\n switch (expr.type) {\n case \"column\":\n return (\n ctx.resolveAffinity?.(expr.table, expr.name) ?? ctx.parent?.resolveAffinity?.(expr.table, expr.name) ?? null\n );\n case \"cast\":\n return affinityFromTypeName(expr.typeName);\n case \"collate\":\n return resolveComparisonAffinity(expr.expr, ctx);\n default:\n return null;\n }\n}\n\nfunction evalIn(left: SqlValue, values: SqlValue[], not: boolean, leftAffinity: Affinity | null): SqlValue {\n if (values.length === 0) return booleanValue(not);\n if (left === null) return null;\n let sawNull = false;\n for (const value of values) {\n if (value === null) {\n sawNull = true;\n } else if (compareSql(...applyComparisonAffinity(left, value, leftAffinity, null)) === 0) {\n return booleanValue(!not);\n }\n }\n if (sawNull) return null;\n return booleanValue(not);\n}\n\n/**\n * Evaluate a parsed SQL expression against `ctx` (columns, parameters, functions).\n *\n * @param expr - Expression AST node from {@link parse}.\n * @param ctx - Column / parameter / function resolution.\n */\nexport function evalExpr(expr: Expr, ctx: EvalContext): SqlValue {\n switch (expr.type) {\n case \"literal\": {\n if (expr.forceReal && typeof expr.value === \"number\") {\n return asSqlReal(expr.value);\n }\n return expr.value;\n }\n case \"null\":\n return null;\n case \"column\":\n return resolveColumn(ctx, expr.table, expr.name);\n case \"parameter\":\n return ctx.getParameter(expr.name);\n case \"collate\":\n return evalExpr(expr.expr, ctx);\n case \"unary\": {\n const value = evalExpr(expr.expr, ctx);\n if (expr.op === \"NOT\") {\n const truth = isTruthySql(value);\n return truth === null ? null : booleanValue(!truth);\n }\n if (value === null) return null;\n if (expr.op === \"+\") {\n const n = asNumber(numberValue(value));\n return storageClassOf(value) === \"real\" ? asSqlReal(n) : n;\n }\n if (expr.op === \"-\") {\n const n = asNumber(-numberValue(value));\n return storageClassOf(value) === \"real\" ? asSqlReal(n) : n;\n }\n return ~integerValue(value);\n }\n case \"is_bool\": {\n const truth = isTruthySql(evalExpr(expr.expr, ctx));\n if (!expr.not && expr.sense) return booleanValue(truth === true);\n if (!expr.not && !expr.sense) return booleanValue(truth === false);\n if (expr.not && expr.sense) return booleanValue(truth !== true);\n return booleanValue(truth !== false);\n }\n case \"binary\":\n return evalBinary(expr.op, expr.left, expr.right, ctx);\n case \"between\": {\n const value = evalExpr(expr.expr, ctx);\n const collation =\n resolveComparisonCollation(expr.expr, expr.lower, ctx) ??\n resolveComparisonCollation(expr.expr, expr.upper, ctx) ??\n undefined;\n const affinity = resolveComparisonAffinity(expr.expr, ctx);\n const lower = compareResult(\">=\", value, evalExpr(expr.lower, ctx), collation, affinity);\n const result = sqlAnd(lower, () => compareResult(\"<=\", value, evalExpr(expr.upper, ctx), collation, affinity));\n if (result === null) return null;\n return expr.not ? booleanValue(result === 0) : result;\n }\n case \"in\": {\n if (expr.expr.type === \"row\" && Array.isArray(expr.values)) {\n const left = expr.expr.values.map((value) => evalExpr(value, ctx));\n let sawNull = false;\n let found = false;\n for (const candidate of expr.values) {\n if (candidate.type !== \"row\") {\n throw new SqliteError(\"row value misused\", \"misuse\");\n }\n const right = candidate.values.map((value) => evalExpr(value, ctx));\n const eq = rowValuesEqual(left, right);\n if (eq === true) {\n found = true;\n break;\n }\n if (eq === null) sawNull = true;\n }\n if (found) return booleanValue(!expr.not);\n if (sawNull) return null;\n return booleanValue(expr.not);\n }\n const left = evalExpr(expr.expr, ctx);\n const values = Array.isArray(expr.values)\n ? expr.values.map((value) => evalExpr(value, ctx))\n : executeSelect(ctx, expr.values).rows.map((row) => row[0] ?? null);\n return evalIn(left, values, expr.not, resolveComparisonAffinity(expr.expr, ctx));\n }\n case \"like\": {\n const value = evalExpr(expr.expr, ctx);\n const pattern = evalExpr(expr.pattern, ctx);\n const escape = expr.escape === null ? null : evalExpr(expr.escape, ctx);\n if (value === null || pattern === null || (escape === null && expr.escape !== null)) return null;\n const match =\n expr.op === \"LIKE\"\n ? likeMatch(\n textValue(value),\n textValue(pattern),\n escape === null ? null : textValue(escape),\n ctx.functionContext?.caseSensitiveLike === true,\n )\n : globMatch(textValue(value), textValue(pattern));\n return booleanValue(expr.not ? !match : match);\n }\n case \"case\": {\n if (expr.base === null) {\n for (const branch of expr.whens) {\n if (isTruthySql(evalExpr(branch.when, ctx)) === true) return evalExpr(branch.then, ctx);\n }\n } else {\n const base = evalExpr(expr.base, ctx);\n for (const branch of expr.whens) {\n if (compareSql(base, evalExpr(branch.when, ctx)) === 0) return evalExpr(branch.then, ctx);\n }\n }\n return expr.else === null ? null : evalExpr(expr.else, ctx);\n }\n case \"cast\":\n return castSqlValue(evalExpr(expr.expr, ctx), expr.typeName);\n case \"function\": {\n if (expr.args === \"*\") throw new SqliteError(`wrong number of arguments to function ${expr.name}()`, \"misuse\");\n if (expr.name.toLowerCase() === \"raise\") {\n evalRaiseFunction(expr.args, ctx);\n throw new SqliteError(\"RAISE() did not abort execution\", \"misuse\");\n }\n if (\n expr.name.toLowerCase() === \"typeof\" &&\n expr.args.length === 1 &&\n expr.args[0]?.type === \"column\" &&\n ctx.resolveStorageClass\n ) {\n return ctx.resolveStorageClass(expr.args[0].table, expr.args[0].name);\n }\n const fn = (ctx.functions ?? defaultFunctionRegistry).lookupScalar(expr.name);\n if (!fn) throw new SqliteError(`no such function: ${expr.name}`, \"other\");\n return fn(\n expr.args.map((arg) => evalExpr(arg, ctx)),\n ctx.functionContext ?? {},\n );\n }\n case \"exists\": {\n const exists = executeSelect(ctx, expr.select).rows.length > 0;\n return booleanValue(expr.not ? !exists : exists);\n }\n case \"subquery\": {\n const result = executeSelect(ctx, expr.select);\n if (result.columns.length > 1) throw new SqliteError(\"sub-select returns more than 1 column\", \"other\");\n return result.rows[0]?.[0] ?? null;\n }\n case \"aggregate\":\n throw new SqliteError(\"window expression requires window evaluation\", \"misuse\");\n case \"window\":\n throw new SqliteError(\"misuse of window function\", \"misuse\");\n case \"row\":\n throw new SqliteError(\"row value cannot be used as a scalar value\", \"misuse\");\n }\n}\n\nfunction evalRaiseFunction(args: Expr[], ctx: EvalContext): never {\n if (!ctx.raise) throw new SqliteError(\"RAISE() may only be used within a trigger-program\", \"other\");\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function RAISE()\", \"misuse\");\n }\n const action = raiseActionName(args[0]!);\n if (!action) throw new SqliteError(\"bad argument to RAISE()\", \"other\");\n let message: string | undefined;\n if (args.length === 2) {\n const value = evalExpr(args[1]!, ctx);\n message = value === null ? undefined : String(value);\n }\n ctx.raise(action, message);\n throw new SqliteError(message ?? \"RAISE\", \"other\");\n}\n\nfunction raiseActionName(expr: Expr): \"IGNORE\" | \"ABORT\" | \"FAIL\" | \"ROLLBACK\" | null {\n if (expr.type === \"column\" && expr.table === null) {\n const name = expr.name.toUpperCase();\n if (name === \"IGNORE\" || name === \"ABORT\" || name === \"FAIL\" || name === \"ROLLBACK\") return name;\n }\n if (expr.type === \"literal\" && typeof expr.value === \"string\") {\n const name = expr.value.toUpperCase();\n if (name === \"IGNORE\" || name === \"ABORT\" || name === \"FAIL\" || name === \"ROLLBACK\") return name;\n }\n return null;\n}\n", "import type { IndexedColumn } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { Cell, ExecutionEnv } from \"../executor/env.ts\";\nimport type { EvalContext } from \"../expressions/context.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { defaultFunctionRegistry } from \"../functions/registry.ts\";\nimport type { IndexInfo } from \"../storage/database-state.ts\";\nimport { normalizeColumnName, type Row } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { normalizeForCollation } from \"../types/collation.ts\";\nimport { applyAffinity, isTruthySql, type SqlValue } from \"../types/value.ts\";\n\n/** Heap cells for evaluating index expressions / partial `WHERE` via `ExecutionEnv`. */\nexport function heapRowCells(table: Table, row: Row, env?: ExecutionEnv): Cell[] {\n const alias = table.name;\n const baseCells: Cell[] = table.columns\n .filter((column) => !column.generated || column.generated.stored)\n .map((column) => ({\n table: alias,\n name: column.name,\n value: table.cell(row, normalizeColumnName(column.name)),\n affinity: column.affinity,\n collate: column.collate,\n }));\n const cells = [...baseCells];\n if (env) {\n for (const column of table.columns) {\n if (!column.generated || column.generated.stored) continue;\n const ctx = env.createEvalContext({ cells: baseCells, sourceTable: table.name });\n const value = applyAffinity(evalExpr(column.generated.expr, ctx), column.affinity);\n cells.push({\n table: alias,\n name: column.name,\n value,\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n } else {\n for (const column of table.columns) {\n if (!column.generated || column.generated.stored) continue;\n cells.push({\n table: alias,\n name: column.name,\n value: null,\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n }\n cells.sort((a, b) => {\n const ai = table.columns.findIndex((column) => column.name.toLowerCase() === a.name.toLowerCase());\n const bi = table.columns.findIndex((column) => column.name.toLowerCase() === b.name.toLowerCase());\n return ai - bi;\n });\n return cells;\n}\n\n/** Indexed-column values for one heap row (expression indexes included when `ctx` is set). */\nexport function indexKeyValues(\n columns: readonly IndexedColumn[],\n row: Row,\n ctx?: EvalContext | null,\n table?: Table,\n): SqlValue[] {\n return columns.map((column) => {\n let raw: SqlValue;\n if (column.expr && ctx) {\n raw = evalExpr(column.expr, ctx);\n } else if (ctx) {\n // Bare column refs (including VIRTUAL generated columns) come from scope, not heap storage.\n raw = ctx.resolveColumn(null, column.name);\n } else if (table) {\n raw = table.cell(row, normalizeColumnName(column.name));\n } else {\n raw = null;\n }\n return normalizeForCollation(raw, column.collate ?? \"BINARY\");\n });\n}\n\n/** Rebuild `index.store` from `table` using the same keys as DML maintenance. */\nexport function rebuildIndexFromTable(index: IndexInfo, table: Table, ctxForRow: (row: Row) => EvalContext): void {\n index.store.clear();\n for (const row of table.scan()) {\n const ctx = ctxForRow(row);\n if (index.where && isTruthySql(evalExpr(index.where, ctx)) !== true) continue;\n index.store.insert(indexKeyValues(index.columns, row, ctx, table), row.rowid, index.unique);\n }\n}\n\n/** Snapshot / no-`ExecutionEnv` evaluator for index expressions / partial predicates. */\nexport function tableRowEvalContext(table: Table, row: Row): EvalContext {\n return {\n functions: defaultFunctionRegistry,\n resolveColumn: (qualifier, name) => {\n if (qualifier && qualifier.toLowerCase() !== table.name.toLowerCase()) {\n throw new SqliteError(`no such column: ${qualifier}.${name}`, \"no_such_column\");\n }\n const key = name.toLowerCase();\n if (key === \"rowid\" || key === \"_rowid_\" || key === \"oid\") return row.rowid;\n if (!table.hasColumn(key) && key !== \"rowid\") {\n throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n }\n return table.cell(row, key);\n },\n getParameter: () => {\n throw new SqliteError(\"parameters are not allowed in index predicates\", \"misuse\");\n },\n };\n}\n", "import { isSqlJsonText, isSqlReal, type QueryRow, type QueryValue, type SqlValue } from \"../types/value.ts\";\n\n/** Query result returned by {@link Statement.result}. */\nexport interface ResultSet {\n /** Result-column names, in SELECT order. Present even when `rows` is empty. */\n columns: string[];\n /** Named rows. Duplicate column names keep the last value. */\n rows: QueryRow[];\n /** Positional rows; always present (empty array when there are zero rows). */\n values: QueryValue[][];\n /** Rows changed by the most recent mutating statement in this execution. */\n changes: number;\n /** Rowid of the most recent INSERT in this execution. */\n lastInsertRowid: number | bigint;\n}\n\nexport function emptyResult(changes = 0, lastInsertRowid: number | bigint = 0): ResultSet {\n return { columns: [], rows: [], values: [], changes, lastInsertRowid };\n}\n\n/** Export engine values to the public JS surface (SqlReal \u2192 number, SqlJsonText \u2192 string). */\nexport function exportSqlValue(value: SqlValue): QueryValue {\n if (isSqlReal(value)) return value.value;\n if (isSqlJsonText(value)) return value.value;\n return value;\n}\n\nexport function valuesToResult(\n columns: string[],\n values: SqlValue[][],\n changes = 0,\n lastInsertRowid: number | bigint = 0,\n options?: { named?: boolean; keepValues?: boolean },\n): ResultSet {\n const named = options?.named !== false;\n const keepValues = options?.keepValues !== false;\n return {\n columns,\n values: keepValues ? values.map((row) => row.map(exportSqlValue)) : [],\n rows: named\n ? values.map((row) => {\n const object: QueryRow = {};\n for (let index = 0; index < columns.length; index++) {\n object[columns[index]!] = exportSqlValue(row[index] ?? null);\n }\n return object;\n })\n : [],\n changes,\n lastInsertRowid,\n };\n}\n\nexport function resultValues(result: ResultSet): SqlValue[][] {\n if (result.values.length > 0 || result.rows.length === 0) {\n return result.values.map((row) => [...row]);\n }\n return result.rows.map((row) => result.columns.map((column) => row[column] ?? null));\n}\n", "import type { AttachStmt, DetachStmt } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { DatabaseState } from \"../storage/database-state.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { emptyResult, type ResultSet } from \"./result.ts\";\n\nexport function executeAttach(stmt: AttachStmt, env: ExecutionEnv): ResultSet {\n const filename = evalExpr(stmt.filename, env.createEvalContext());\n if (typeof filename !== \"string\") {\n throw new SqliteError(\"filename argument to ATTACH must be a string\", \"datatype_mismatch\");\n }\n const schema = stmt.schema.toLowerCase();\n if (schema === \"main\") {\n throw new SqliteError(\"database main is already in use\", \"other\");\n }\n if (schema === \"temp\") {\n throw new SqliteError(\"database temp is already in use\", \"other\");\n }\n if (env.state.attached.has(schema)) {\n throw new SqliteError(`database ${stmt.schema} is already in use`, \"other\");\n }\n env.state.attached.set(schema, { state: new DatabaseState(), filename });\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDetach(stmt: DetachStmt, env: ExecutionEnv): ResultSet {\n const schema = stmt.schema.toLowerCase();\n if (schema === \"main\") {\n throw new SqliteError(\"cannot detach database main\", \"other\");\n }\n if (schema === \"temp\") {\n throw new SqliteError(\"cannot detach database temp\", \"other\");\n }\n if (!env.state.attached.delete(schema)) {\n throw new SqliteError(`no such database: ${stmt.schema}`, \"other\");\n }\n return emptyResult(0, env.state.lastInsertRowid);\n}\n", "import { tokenize } from \"../lexer/tokenize.ts\";\n\n/**\n * Normalize CREATE source toward SQLite's `sqlite_master.sql` conventions:\n * strip TEMP/TEMPORARY, IF NOT EXISTS, and schema qualifiers on the object name.\n * Body text (from after the object name) is preserved byte-for-byte from the input.\n */\nexport function normalizeMasterSql(sql: string): string {\n const trimmed = sql\n .trim()\n .replace(/;+\\s*$/u, \"\")\n .trim();\n if (!trimmed) return trimmed;\n\n const tokens = tokenize(trimmed);\n if (tokens.length === 0 || tokens[0]!.kind === \"EOF\") return trimmed;\n\n let i = 0;\n const at = (offset: number, ...kinds: string[]): boolean => {\n const tok = tokens[i + offset];\n return tok !== undefined && kinds.includes(tok.kind);\n };\n\n if (!at(0, \"CREATE\")) return trimmed;\n i++; // CREATE\n\n if (at(0, \"TEMP\", \"TEMPORARY\")) i++;\n\n let headKind: \"table\" | \"view\" | \"index\" | \"trigger\" | \"vtable\" | \"unique_index\" = \"table\";\n if (at(0, \"UNIQUE\") && at(1, \"INDEX\")) {\n headKind = \"unique_index\";\n i += 2;\n } else if (at(0, \"VIRTUAL\") && at(1, \"TABLE\")) {\n headKind = \"vtable\";\n i += 2;\n } else if (at(0, \"TABLE\")) {\n headKind = \"table\";\n i++;\n } else if (at(0, \"VIEW\")) {\n headKind = \"view\";\n i++;\n } else if (at(0, \"INDEX\")) {\n headKind = \"index\";\n i++;\n } else if (at(0, \"TRIGGER\")) {\n headKind = \"trigger\";\n i++;\n } else {\n return trimmed;\n }\n\n if (at(0, \"IF\") && at(1, \"NOT\") && at(2, \"EXISTS\")) i += 3;\n\n let nameText = \"\";\n let nameEnd = 0;\n if (tokens[i] && tokens[i]!.kind !== \"EOF\" && at(1, \"DOT\") && tokens[i + 2] && tokens[i + 2]!.kind !== \"EOF\") {\n nameText = trimmed.slice(tokens[i + 2]!.start, tokens[i + 2]!.end);\n nameEnd = tokens[i + 2]!.end;\n i += 3;\n } else if (tokens[i] && tokens[i]!.kind !== \"EOF\") {\n nameText = trimmed.slice(tokens[i]!.start, tokens[i]!.end);\n nameEnd = tokens[i]!.end;\n i++;\n }\n\n // Preserve whitespace between the object name and the body (SQLite keeps `projects (`).\n const body = nameEnd < trimmed.length ? trimmed.slice(nameEnd) : \"\";\n const needsSpace = body.length > 0 && !/^[\\s(]/u.test(body);\n\n const head =\n headKind === \"unique_index\"\n ? \"CREATE UNIQUE INDEX\"\n : headKind === \"vtable\"\n ? \"CREATE VIRTUAL TABLE\"\n : headKind === \"view\"\n ? \"CREATE VIEW\"\n : headKind === \"index\"\n ? \"CREATE INDEX\"\n : headKind === \"trigger\"\n ? \"CREATE TRIGGER\"\n : \"CREATE TABLE\";\n\n if (body.length === 0) return `${head} ${nameText}`;\n return needsSpace ? `${head} ${nameText} ${body}` : `${head} ${nameText}${body}`;\n}\n\n/** Append an ALTER TABLE ADD COLUMN definition into CREATE TABLE master sql (SQLite style). */\nexport function appendAddColumnToMasterSql(originalSql: string | null, alterSql: string | null): string | null {\n if (!originalSql || !alterSql) return originalSql;\n const match = alterSql.match(/\\bADD\\s+(?:COLUMN\\s+)?(.+)$/iu);\n if (!match?.[1]) return originalSql;\n const colDef = match[1]\n .trim()\n .replace(/;+\\s*$/u, \"\")\n .trim();\n const close = originalSql.lastIndexOf(\")\");\n if (close < 0) return originalSql;\n return `${originalSql.slice(0, close)}, ${colDef}${originalSql.slice(close)}`;\n}\n\n/** Synthesize CTAS catalog SQL: `CREATE TABLE name(col1, col2, ...)`. */\nexport function synthesizeCtasMasterSql(tableName: string, columnNames: string[]): string {\n const cols = columnNames.map(quoteIdentIfNeeded).join(\",\");\n return `CREATE TABLE ${quoteIdentIfNeeded(tableName)}(${cols})`;\n}\n\nfunction quoteIdentIfNeeded(name: string): string {\n if (/^[A-Za-z_][A-Za-z0-9_]*$/u.test(name)) return name;\n return `\"${name.replaceAll('\"', '\"\"')}\"`;\n}\n", "import { compareSql, type SqlValue } from \"../types/value.ts\";\n\nexport type PartitionRow = SqlValue[];\n\nfunction rowsEqual(left: PartitionRow, right: PartitionRow): boolean {\n if (left.length !== right.length) return false;\n return left.every((value, index) => {\n const other = right[index];\n return (value === null && other === null) || (other !== undefined && compareSql(value, other) === 0);\n });\n}\n\nexport function rowNumber(_partition: PartitionRow[], index: number): number {\n return index + 1;\n}\n\nexport function rank(partition: PartitionRow[], index: number, orderKeys: PartitionRow[] = partition): number {\n if (index <= 0) return 1;\n let firstPeer = index;\n while (firstPeer > 0 && rowsEqual(orderKeys[firstPeer]!, orderKeys[firstPeer - 1]!)) firstPeer--;\n return firstPeer + 1;\n}\n\nexport function denseRank(partition: PartitionRow[], index: number, orderKeys: PartitionRow[] = partition): number {\n if (index <= 0) return 1;\n let result = 1;\n for (let i = 1; i <= index; i++) {\n if (!rowsEqual(orderKeys[i]!, orderKeys[i - 1]!)) result++;\n }\n return result;\n}\n\nexport function lag(\n partition: PartitionRow[],\n index: number,\n valueIndex = 0,\n offset = 1,\n defaultValue: SqlValue = null,\n): SqlValue {\n const target = index - Math.max(0, Math.trunc(offset));\n return target < 0 ? defaultValue : (partition[target]?.[valueIndex] ?? null);\n}\n\nexport function lead(\n partition: PartitionRow[],\n index: number,\n valueIndex = 0,\n offset = 1,\n defaultValue: SqlValue = null,\n): SqlValue {\n const target = index + Math.max(0, Math.trunc(offset));\n return target >= partition.length ? defaultValue : (partition[target]?.[valueIndex] ?? null);\n}\n\nexport function firstValue(partition: PartitionRow[], valueIndex = 0, frameStart = 0): SqlValue {\n return partition[frameStart]?.[valueIndex] ?? null;\n}\n\nexport function lastValue(partition: PartitionRow[], valueIndex = 0, frameEnd = partition.length - 1): SqlValue {\n return partition[frameEnd]?.[valueIndex] ?? null;\n}\n\nexport function nthValue(partition: PartitionRow[], n: number, valueIndex = 0, frameStart = 0): SqlValue {\n const offset = Math.trunc(n);\n if (offset <= 0) return null;\n return partition[frameStart + offset - 1]?.[valueIndex] ?? null;\n}\n\nexport const windowFunctions = {\n row_number: rowNumber,\n rank,\n dense_rank: denseRank,\n lag,\n lead,\n first_value: firstValue,\n last_value: lastValue,\n nth_value: nthValue,\n ntile: () => 0,\n cume_dist: () => 0,\n percent_rank: () => 0,\n} as const;\n", "/**\n * Shared PRAGMA query engine used by statement-form `PRAGMA \u2026` and `pragma_*` TVFs.\n */\nimport type { Expr } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { aggregateFunctions } from \"../functions/aggregate.ts\";\nimport { dateTimeFunctions } from \"../functions/datetime.ts\";\nimport { ftsAuxFunctions, rtreeAuxFunctions } from \"../functions/extensions.ts\";\nimport { jsonAggregateFunctions, jsonScalarFunctions } from \"../functions/json.ts\";\nimport { mathFunctions } from \"../functions/math.ts\";\nimport { getScalarFunctions } from \"../functions/scalar.ts\";\nimport { windowFunctions } from \"../functions/window.ts\";\nimport type { IndexInfo } from \"../storage/database-state.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { isTruthySql, type SqlValue, toInteger } from \"../types/value.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\n\nexport interface PragmaQueryResult {\n columns: string[];\n rows: SqlValue[][];\n}\n\n/** Oracle-exposed pragma_* TVF base names (without the `pragma_` prefix). */\nexport const PRAGMA_TVF_NAMES = [\n \"analysis_limit\",\n \"application_id\",\n \"auto_vacuum\",\n \"automatic_index\",\n \"busy_timeout\",\n \"cache_size\",\n \"cache_spill\",\n \"cell_size_check\",\n \"checkpoint_fullfsync\",\n \"collation_list\",\n \"compile_options\",\n \"count_changes\",\n \"data_version\",\n \"database_list\",\n \"default_cache_size\",\n \"defer_foreign_keys\",\n \"empty_result_callbacks\",\n \"encoding\",\n \"foreign_key_check\",\n \"foreign_key_list\",\n \"foreign_keys\",\n \"freelist_count\",\n \"full_column_names\",\n \"fullfsync\",\n \"function_list\",\n \"hard_heap_limit\",\n \"ignore_check_constraints\",\n \"index_info\",\n \"index_list\",\n \"index_xinfo\",\n \"integrity_check\",\n \"journal_mode\",\n \"journal_size_limit\",\n \"legacy_alter_table\",\n \"locking_mode\",\n \"max_page_count\",\n \"module_list\",\n \"optimize\",\n \"page_count\",\n \"page_size\",\n \"pragma_list\",\n \"query_only\",\n \"quick_check\",\n \"read_uncommitted\",\n \"recursive_triggers\",\n \"reverse_unordered_selects\",\n \"schema_version\",\n \"secure_delete\",\n \"short_column_names\",\n \"soft_heap_limit\",\n \"synchronous\",\n \"table_info\",\n \"table_list\",\n \"table_xinfo\",\n \"temp_store\",\n \"threads\",\n \"trusted_schema\",\n \"user_version\",\n \"writable_schema\",\n] as const;\n\n/** Full pragma name list for `pragma_pragma_list` (includes names without TVFs). */\nexport const PRAGMA_LIST_NAMES = [\n \"activate_extensions\",\n ...PRAGMA_TVF_NAMES,\n \"case_sensitive_like\",\n \"hexkey\",\n \"hexrekey\",\n \"incremental_vacuum\",\n \"key\",\n \"lock_proxy_file\",\n \"mmap_size\",\n \"rekey\",\n \"shrink_memory\",\n \"temp_store_directory\",\n \"textkey\",\n \"textrekey\",\n \"wal_autocheckpoint\",\n \"wal_checkpoint\",\n].sort((a, b) => a.localeCompare(b));\n\nconst MEMORY_VTABLE_MODULES = [\n \"bytecode\",\n \"dbstat\",\n \"fts3\",\n \"fts3tokenize\",\n \"fts4\",\n \"fts4aux\",\n \"fts5\",\n \"fts5vocab\",\n \"json_each\",\n \"json_tree\",\n \"rtree\",\n \"rtree_i32\",\n \"tables_used\",\n];\n\nconst COMPILE_OPTIONS = [\n \"COMPILER=typescript\",\n \"ENABLE_FTS3\",\n \"ENABLE_FTS4\",\n \"ENABLE_FTS5\",\n \"ENABLE_JSON1\",\n \"ENABLE_RTREE\",\n \"THREADSAFE=0\",\n];\n\n/** Stable in-memory defaults matching bun:sqlite `:memory:` where applicable. */\nconst STORAGE_DEFAULTS: Record<string, { column: string; value: SqlValue }> = {\n analysis_limit: { column: \"analysis_limit\", value: 0 },\n application_id: { column: \"application_id\", value: 0 },\n auto_vacuum: { column: \"auto_vacuum\", value: 0 },\n automatic_index: { column: \"automatic_index\", value: 1 },\n busy_timeout: { column: \"timeout\", value: 0 },\n cache_size: { column: \"cache_size\", value: 2000 },\n cache_spill: { column: \"cache_spill\", value: 20000 },\n cell_size_check: { column: \"cell_size_check\", value: 0 },\n checkpoint_fullfsync: { column: \"checkpoint_fullfsync\", value: 1 },\n count_changes: { column: \"count_changes\", value: 0 },\n data_version: { column: \"data_version\", value: 1 },\n default_cache_size: { column: \"cache_size\", value: 2000 },\n defer_foreign_keys: { column: \"defer_foreign_keys\", value: 0 },\n empty_result_callbacks: { column: \"empty_result_callbacks\", value: 0 },\n encoding: { column: \"encoding\", value: \"UTF-8\" },\n freelist_count: { column: \"freelist_count\", value: 0 },\n full_column_names: { column: \"full_column_names\", value: 0 },\n fullfsync: { column: \"fullfsync\", value: 0 },\n hard_heap_limit: { column: \"hard_heap_limit\", value: 0 },\n ignore_check_constraints: { column: \"ignore_check_constraints\", value: 0 },\n journal_mode: { column: \"journal_mode\", value: \"memory\" },\n journal_size_limit: { column: \"journal_size_limit\", value: 32768 },\n legacy_alter_table: { column: \"legacy_alter_table\", value: 1 },\n locking_mode: { column: \"locking_mode\", value: \"normal\" },\n max_page_count: { column: \"max_page_count\", value: 1073741823 },\n page_size: { column: \"page_size\", value: 4096 },\n query_only: { column: \"query_only\", value: 0 },\n read_uncommitted: { column: \"read_uncommitted\", value: 0 },\n recursive_triggers: { column: \"recursive_triggers\", value: 0 },\n reverse_unordered_selects: { column: \"reverse_unordered_selects\", value: 0 },\n secure_delete: { column: \"secure_delete\", value: 2 },\n short_column_names: { column: \"short_column_names\", value: 1 },\n soft_heap_limit: { column: \"soft_heap_limit\", value: 0 },\n synchronous: { column: \"synchronous\", value: 2 },\n temp_store: { column: \"temp_store\", value: 0 },\n threads: { column: \"threads\", value: 0 },\n trusted_schema: { column: \"trusted_schema\", value: 1 },\n writable_schema: { column: \"writable_schema\", value: 0 },\n};\n\nexport function isPragmaTvfName(name: string): boolean {\n const lower = name.toLowerCase();\n if ((PRAGMA_TVF_NAMES as readonly string[]).includes(lower)) return true;\n if (lower.startsWith(\"pragma_\")) {\n return (PRAGMA_TVF_NAMES as readonly string[]).includes(lower.slice(\"pragma_\".length));\n }\n return false;\n}\n\n/**\n * Column names for a pragma_* TVF without evaluating arguments.\n * Used by SELECT shape analysis so correlated args (e.g. `tl.name`) are not\n * resolved before the outer row is bound.\n */\nexport function pragmaTvfColumns(name: string): string[] | null {\n const key = normalizePragmaKey(name);\n switch (key) {\n case \"foreign_keys\":\n return [\"foreign_keys\"];\n case \"user_version\":\n return [\"user_version\"];\n case \"schema_version\":\n return [\"schema_version\"];\n case \"table_info\":\n return [\"cid\", \"name\", \"type\", \"notnull\", \"dflt_value\", \"pk\"];\n case \"table_xinfo\":\n return [\"cid\", \"name\", \"type\", \"notnull\", \"dflt_value\", \"pk\", \"hidden\"];\n case \"index_list\":\n return [\"seq\", \"name\", \"unique\", \"origin\", \"partial\"];\n case \"index_info\":\n return [\"seqno\", \"cid\", \"name\"];\n case \"index_xinfo\":\n return [\"seqno\", \"cid\", \"name\", \"desc\", \"coll\", \"key\"];\n case \"foreign_key_list\":\n return [\"id\", \"seq\", \"table\", \"from\", \"to\", \"on_update\", \"on_delete\", \"match\"];\n case \"foreign_key_check\":\n return [\"table\", \"rowid\", \"parent\", \"fkid\"];\n case \"database_list\":\n return [\"seq\", \"name\", \"file\"];\n case \"table_list\":\n return [\"schema\", \"name\", \"type\", \"ncol\", \"wr\", \"strict\"];\n case \"collation_list\":\n return [\"seq\", \"name\"];\n case \"compile_options\":\n return [\"compile_options\"];\n case \"function_list\":\n return [\"name\", \"builtin\", \"type\", \"enc\", \"narg\", \"flags\"];\n case \"module_list\":\n case \"pragma_list\":\n return [\"name\"];\n case \"integrity_check\":\n case \"quick_check\":\n return [key];\n case \"optimize\":\n return [\"optimize\"];\n case \"page_count\":\n return [\"page_count\"];\n default: {\n const storage = STORAGE_DEFAULTS[key];\n if (storage) return [storage.column];\n return null;\n }\n }\n}\n\nfunction normalizePragmaKey(name: string): string {\n const lower = name.toLowerCase();\n if ((PRAGMA_TVF_NAMES as readonly string[]).includes(lower)) return lower;\n if (lower.startsWith(\"pragma_\")) {\n const stripped = lower.slice(\"pragma_\".length);\n if ((PRAGMA_TVF_NAMES as readonly string[]).includes(stripped)) return stripped;\n return stripped;\n }\n return lower;\n}\n\n/**\n * Query a pragma by name with optional SQL values (TVF args or evaluated statement args).\n * Read-only \u2014 writers stay in {@link executePragma}.\n */\nexport function queryPragma(name: string, args: readonly SqlValue[], env: ExecutionEnv): PragmaQueryResult {\n const key = normalizePragmaKey(name);\n\n switch (key) {\n case \"foreign_keys\":\n return single(\"foreign_keys\", env.state.foreignKeysEnabled ? 1 : 0);\n case \"case_sensitive_like\":\n return single(\"case_sensitive_like\", env.state.caseSensitiveLike ? 1 : 0);\n case \"user_version\":\n return single(\"user_version\", env.state.userVersion);\n case \"schema_version\":\n return single(\"schema_version\", env.state.schemaVersion);\n case \"table_info\":\n return pragmaTableInfo(args, env, false);\n case \"table_xinfo\":\n return pragmaTableInfo(args, env, true);\n case \"index_list\":\n return pragmaIndexList(args, env);\n case \"index_info\":\n return pragmaIndexInfo(args, env, false);\n case \"index_xinfo\":\n return pragmaIndexInfo(args, env, true);\n case \"foreign_key_list\":\n return pragmaForeignKeyList(args, env);\n case \"foreign_key_check\":\n return pragmaForeignKeyCheck(args, env);\n case \"database_list\":\n return pragmaDatabaseList(env);\n case \"table_list\":\n return pragmaTableList(env);\n case \"collation_list\":\n return {\n columns: [\"seq\", \"name\"],\n rows: [\n [0, \"RTRIM\"],\n [1, \"NOCASE\"],\n [2, \"BINARY\"],\n ],\n };\n case \"compile_options\":\n return { columns: [\"compile_options\"], rows: COMPILE_OPTIONS.map((opt) => [opt]) };\n case \"function_list\":\n return pragmaFunctionList();\n case \"module_list\":\n return pragmaModuleList();\n case \"pragma_list\":\n return { columns: [\"name\"], rows: PRAGMA_LIST_NAMES.map((n) => [n]) };\n case \"integrity_check\":\n case \"quick_check\":\n return single(key, \"ok\");\n case \"optimize\":\n return { columns: [\"optimize\"], rows: [] };\n case \"page_count\":\n return single(\"page_count\", estimatePageCount(env));\n default: {\n const storage = STORAGE_DEFAULTS[key];\n if (storage) return single(storage.column, storage.value);\n return { columns: [], rows: [] };\n }\n }\n}\n\nfunction single(column: string, value: SqlValue): PragmaQueryResult {\n return { columns: [column], rows: [[value]] };\n}\n\nfunction estimatePageCount(env: ExecutionEnv): number {\n const objects = env.state.tables.size + env.state.indexes.size + env.state.views.size + env.state.virtualTables.size;\n return objects === 0 ? 0 : Math.max(1, objects);\n}\n\nfunction pragmaTableInfo(args: readonly SqlValue[], env: ExecutionEnv, xinfo: boolean): PragmaQueryResult {\n const tableName = requireNameArg(args, \"table_info\");\n const table = env.state.tables.get(tableName.toLowerCase());\n if (!table) return { columns: xinfoColumns(xinfo), rows: [] };\n // SQLite's table_info omits generated columns; table_xinfo includes them (hidden 2/3).\n const visible = xinfo ? table.columns : table.columns.filter((column) => !column.generated);\n const rows: SqlValue[][] = visible.map((column, cid) => {\n const pkIndex = table.columns.filter((c) => c.primaryKey).findIndex((c) => c.name === column.name);\n const pk = column.primaryKey ? (pkIndex >= 0 ? pkIndex + 1 : 1) : 0;\n const dflt = column.defaultExpr ? defaultLiteral(column.defaultExpr) : null;\n // WITHOUT ROWID primary keys are NOT NULL in SQLite's table_info.\n const notNull = column.notNull || (table.withoutRowid && column.primaryKey) ? 1 : 0;\n const base: SqlValue[] = [cid, column.name, column.typeName ?? \"\", notNull, dflt, pk];\n if (xinfo) {\n let hidden = 0;\n if (column.generated && !column.generated.stored) hidden = 2;\n if (column.generated?.stored) hidden = 3;\n base.push(hidden);\n }\n return base;\n });\n return { columns: xinfoColumns(xinfo), rows };\n}\n\nfunction xinfoColumns(xinfo: boolean): string[] {\n return xinfo\n ? [\"cid\", \"name\", \"type\", \"notnull\", \"dflt_value\", \"pk\", \"hidden\"]\n : [\"cid\", \"name\", \"type\", \"notnull\", \"dflt_value\", \"pk\"];\n}\n\nfunction defaultLiteral(expr: Expr): SqlValue {\n if (expr.type === \"literal\")\n return typeof expr.value === \"string\" ? `'${expr.value.replace(/'/g, \"''\")}'` : expr.value;\n if (expr.type === \"null\") return \"NULL\";\n return null;\n}\n\nfunction pragmaIndexList(args: readonly SqlValue[], env: ExecutionEnv): PragmaQueryResult {\n const tableName = requireNameArg(args, \"index_list\");\n const table = env.state.tables.get(tableName.toLowerCase());\n if (!table) return { columns: [\"seq\", \"name\", \"unique\", \"origin\", \"partial\"], rows: [] };\n const rows: SqlValue[][] = [];\n let seq = 0;\n for (const name of table.indexes) {\n const index = env.state.indexes.get(name.toLowerCase());\n if (!index) continue;\n rows.push([seq++, index.name, index.unique ? 1 : 0, indexOrigin(index), index.where ? 1 : 0]);\n }\n return { columns: [\"seq\", \"name\", \"unique\", \"origin\", \"partial\"], rows };\n}\n\nfunction indexOrigin(index: IndexInfo): string {\n if (index.originalSql) return \"c\";\n if (index.name.toLowerCase().startsWith(\"sqlite_autoindex_\") && index.unique) return \"u\";\n return \"c\";\n}\n\nfunction pragmaIndexInfo(args: readonly SqlValue[], env: ExecutionEnv, xinfo: boolean): PragmaQueryResult {\n const indexName = requireNameArg(args, \"index_info\");\n const index = env.state.indexes.get(indexName.toLowerCase());\n const columns = xinfo ? [\"seqno\", \"cid\", \"name\", \"desc\", \"coll\", \"key\"] : [\"seqno\", \"cid\", \"name\"];\n if (!index) return { columns, rows: [] };\n const table = env.state.tables.get(index.tableName.toLowerCase());\n const rows: SqlValue[][] = index.columns.map((column, seqno) => {\n const cid = table?.columns.findIndex((c) => c.name.toLowerCase() === column.name.toLowerCase()) ?? -1;\n const base: SqlValue[] = [seqno, cid, column.name];\n if (xinfo) {\n base.push(column.order === \"DESC\" ? 1 : 0, (column.collate ?? \"BINARY\").toUpperCase(), 1);\n }\n return base;\n });\n if (xinfo) {\n // Trailing rowid key column (SQLite index_xinfo)\n rows.push([index.columns.length, -1, null, 0, \"BINARY\", 0]);\n }\n return { columns, rows };\n}\n\nfunction pragmaForeignKeyList(args: readonly SqlValue[], env: ExecutionEnv): PragmaQueryResult {\n const tableName = requireNameArg(args, \"foreign_key_list\");\n const table = env.state.tables.get(tableName.toLowerCase());\n const columns = [\"id\", \"seq\", \"table\", \"from\", \"to\", \"on_update\", \"on_delete\", \"match\"];\n if (!table) return { columns, rows: [] };\n const rows: SqlValue[][] = [];\n let id = 0;\n for (const constraint of table.constraints) {\n if (constraint.type !== \"foreign_key\") continue;\n const refColumns =\n constraint.refColumns ??\n env.state.tables\n .get(constraint.refTable.toLowerCase())\n ?.columns.filter((c) => c.primaryKey)\n .map((c) => c.name) ??\n [];\n constraint.columns.forEach((column, seq) => {\n rows.push([\n id,\n seq,\n constraint.refTable,\n column,\n refColumns[seq] ?? null,\n constraint.onUpdate ?? \"NO ACTION\",\n constraint.onDelete ?? \"NO ACTION\",\n \"NONE\",\n ]);\n });\n id++;\n }\n return { columns, rows };\n}\n\nfunction pragmaForeignKeyCheck(args: readonly SqlValue[], env: ExecutionEnv): PragmaQueryResult {\n const columns = [\"table\", \"rowid\", \"parent\", \"fkid\"];\n const filter = args[0] != null && args[0] !== null ? String(args[0]).toLowerCase() : null;\n const rows: SqlValue[][] = [];\n for (const table of env.state.tables.values()) {\n if (filter && table.name.toLowerCase() !== filter) continue;\n let fkid = 0;\n for (const constraint of table.constraints) {\n if (constraint.type !== \"foreign_key\") continue;\n const parent = env.state.tables.get(constraint.refTable.toLowerCase());\n const refColumns = constraint.refColumns ?? parent?.columns.filter((c) => c.primaryKey).map((c) => c.name) ?? [];\n for (const row of table.scan()) {\n let allNull = true;\n const childValues: SqlValue[] = [];\n for (const col of constraint.columns) {\n const value = table.cell(row, col.toLowerCase());\n childValues.push(value);\n if (value !== null) allNull = false;\n }\n // MATCH FULL is parsed but not enforced by SQLite (SIMPLE semantics).\n if (allNull) continue;\n if (!parent || !parentHasMatch(parent, refColumns, childValues)) {\n rows.push([table.name, row.rowid, constraint.refTable, fkid]);\n }\n }\n fkid++;\n }\n }\n return { columns, rows };\n}\n\nfunction parentHasMatch(parent: Table, refColumns: string[], childValues: SqlValue[]): boolean {\n if (refColumns.length === 0) return false;\n for (const row of parent.scan()) {\n let ok = true;\n for (let i = 0; i < refColumns.length; i++) {\n const parentVal = parent.cell(row, refColumns[i]!.toLowerCase());\n if (!sqlValuesEqual(parentVal, childValues[i] ?? null)) {\n ok = false;\n break;\n }\n }\n if (ok) return true;\n }\n return false;\n}\n\nfunction sqlValuesEqual(a: SqlValue, b: SqlValue): boolean {\n if (a === null || b === null) return a === b;\n if (typeof a === \"number\" && typeof b === \"number\") return a === b;\n if (typeof a === \"bigint\" || typeof b === \"bigint\") {\n return BigInt(a as number | bigint) === BigInt(b as number | bigint);\n }\n if (a instanceof Uint8Array || b instanceof Uint8Array) return false;\n return String(a) === String(b);\n}\n\nfunction pragmaDatabaseList(env: ExecutionEnv): PragmaQueryResult {\n const rows: SqlValue[][] = [[0, \"main\", \"\"]];\n let seq = 2;\n for (const [name, attached] of env.state.attached) {\n const file = attached.filename === \":memory:\" ? \"\" : attached.filename;\n rows.push([seq++, name, file]);\n }\n return { columns: [\"seq\", \"name\", \"file\"], rows };\n}\n\nfunction pragmaTableList(env: ExecutionEnv): PragmaQueryResult {\n const columns = [\"schema\", \"name\", \"type\", \"ncol\", \"wr\", \"strict\"];\n const rows: SqlValue[][] = [];\n for (const table of env.state.tables.values()) {\n rows.push([\"main\", table.name, \"table\", table.columns.length, table.withoutRowid ? 1 : 0, table.strict ? 1 : 0]);\n }\n for (const view of env.state.views.values()) {\n const ncol = view.columns?.length ?? 0;\n rows.push([\"main\", view.name, \"view\", ncol, 0, 0]);\n }\n for (const vt of env.state.virtualTables.values()) {\n rows.push([\"main\", vt.name, \"virtual\", vt.columns.length, 0, 0]);\n }\n rows.push([\"main\", \"sqlite_schema\", \"table\", 5, 0, 0]);\n rows.push([\"temp\", \"sqlite_temp_schema\", \"table\", 5, 0, 0]);\n for (const [schema] of env.state.attached) {\n rows.push([schema, \"sqlite_schema\", \"table\", 5, 0, 0]);\n }\n return { columns, rows };\n}\n\nfunction pragmaFunctionList(): PragmaQueryResult {\n const columns = [\"name\", \"builtin\", \"type\", \"enc\", \"narg\", \"flags\"];\n const rows: SqlValue[][] = [];\n const add = (name: string, type: string, narg: number, flags: number): void => {\n rows.push([name, 1, type, \"utf8\", narg, flags]);\n };\n for (const name of Object.keys(getScalarFunctions())) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(dateTimeFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(jsonScalarFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(mathFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(ftsAuxFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(rtreeAuxFunctions)) add(name, \"s\", -1, 2099200);\n for (const name of Object.keys(aggregateFunctions)) {\n add(name, \"w\", name === \"count\" ? 0 : 1, 2097152);\n if (name === \"count\") add(name, \"w\", 1, 2097152);\n }\n for (const name of Object.keys(jsonAggregateFunctions)) add(name, \"w\", -1, 2097152);\n for (const name of Object.keys(windowFunctions)) add(name, \"w\", -1, 2097152);\n for (const name of [\"generate_series\", \"json_each\", \"json_tree\"]) {\n add(name, \"s\", -1, 2099200);\n }\n rows.sort((a, b) => String(a[0]).localeCompare(String(b[0])) || Number(a[4]) - Number(b[4]));\n return { columns, rows };\n}\n\nfunction pragmaModuleList(): PragmaQueryResult {\n const names = new Set<string>([\n ...MEMORY_VTABLE_MODULES,\n ...PRAGMA_TVF_NAMES.map((n) => `pragma_${n}`),\n \"generate_series\",\n \"json_each\",\n \"json_tree\",\n ]);\n return {\n columns: [\"name\"],\n rows: [...names].sort((a, b) => a.localeCompare(b)).map((name) => [name]),\n };\n}\n\nfunction requireNameArg(args: readonly SqlValue[], pragma: string): string {\n if (args.length === 0 || args[0] == null) {\n throw new SqliteError(`missing pragma argument for ${pragma}`, \"misuse\");\n }\n const value = args[0];\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n throw new SqliteError(`invalid pragma argument for ${pragma}`, \"misuse\");\n}\n\n/** Evaluate a statement-form pragma argument expression to a SQL value list. */\nexport function evalPragmaArgs(expr: Expr | null, env: ExecutionEnv): SqlValue[] {\n if (expr === null) return [];\n if (expr.type === \"column\" && expr.table === null) return [expr.name];\n if (expr.type === \"literal\") return [expr.value as SqlValue];\n return [evalExpr(expr, env.createEvalContext())];\n}\n\nexport function evalPragmaSetValue(expr: Expr, env: ExecutionEnv): SqlValue {\n if (expr.type === \"column\" && expr.table === null) {\n const keyword = expr.name.toLowerCase();\n if (keyword === \"on\" || keyword === \"true\" || keyword === \"yes\") return 1;\n if (keyword === \"off\" || keyword === \"false\" || keyword === \"no\") return 0;\n return expr.name;\n }\n return evalExpr(expr, env.createEvalContext());\n}\n\nexport function coercePragmaInt(value: SqlValue): number {\n if (typeof value === \"number\") return Math.trunc(value);\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"string\") {\n const n = Number.parseInt(value, 10);\n return Number.isFinite(n) ? n : 0;\n }\n const asInt = toInteger(value);\n return asInt === null ? 0 : typeof asInt === \"bigint\" ? Number(asInt) : asInt;\n}\n\nexport function coercePragmaTruthy(value: SqlValue): boolean {\n return isTruthySql(value) === true;\n}\n", "import type { ExecutionEnv, ScopeRow } from \"../executor/env.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\n\nexport interface TableValuedResult {\n columns: string[];\n rows: ScopeRow[];\n}\n\nexport type TableValuedFn = (args: SqlValue[], alias: string | null, env: ExecutionEnv) => TableValuedResult;\n\nconst registry = new Map<string, TableValuedFn>();\n\nexport function registerTableValuedFunction(name: string, fn: TableValuedFn): void {\n registry.set(name.toLowerCase(), fn);\n}\n\nexport function getTableValuedFunction(name: string): TableValuedFn | undefined {\n return registry.get(name.toLowerCase());\n}\n\nexport function listRegisteredTableValuedFunctions(): string[] {\n return [...registry.keys()].sort();\n}\n\nexport function hasRegisteredTableValuedFunction(name: string): boolean {\n return registry.has(name.toLowerCase());\n}\n", "/**\n * Register all oracle-exposed `pragma_*` eponymous table-valued functions.\n * Imported for side effects from table-valued / select.\n */\nimport { isPragmaTvfName, PRAGMA_TVF_NAMES, queryPragma } from \"../executor/pragma-engine.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\nimport { registerTableValuedFunction, type TableValuedResult } from \"./table-valued-registry.ts\";\n\nfunction toTvfResult(\n alias: string | null,\n defaultName: string,\n columns: string[],\n rows: SqlValue[][],\n): TableValuedResult {\n const table = alias ?? defaultName;\n return {\n columns,\n rows: rows.map((row) => ({\n cells: columns.map((name, index) => ({\n table,\n name,\n value: row[index] ?? null,\n })),\n })),\n };\n}\n\nlet registered = false;\n\n/** Idempotent registration of every oracle `pragma_*` TVF. */\nexport function ensurePragmaTvfsRegistered(): void {\n if (registered) return;\n registered = true;\n for (const baseName of PRAGMA_TVF_NAMES) {\n const tvfName = `pragma_${baseName}`;\n registerTableValuedFunction(tvfName, (args, alias, env) => {\n const result = queryPragma(baseName, args, env);\n return toTvfResult(alias, tvfName, result.columns, result.rows);\n });\n }\n}\n\nexport { isPragmaTvfName };\n", "import type { Expr } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { ExecutionEnv, ScopeRow } from \"../executor/env.ts\";\nimport { pragmaTvfColumns } from \"../executor/pragma-engine.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { jsonEachRows, jsonTreeRows } from \"../json/tvf.ts\";\nimport { toInteger } from \"../types/value.ts\";\nimport { ensurePragmaTvfsRegistered } from \"./pragma-tvf.ts\";\nimport {\n getTableValuedFunction,\n hasRegisteredTableValuedFunction,\n listRegisteredTableValuedFunctions,\n registerTableValuedFunction,\n type TableValuedResult,\n} from \"./table-valued-registry.ts\";\n\nexport type { TableValuedResult };\nexport { registerTableValuedFunction };\n\nconst JSON_TVF_COLUMNS = [\"key\", \"value\", \"type\", \"atom\", \"id\", \"parent\", \"fullkey\", \"path\"] as const;\n\nfunction jsonTvfResult(\n alias: string | null,\n defaultName: string,\n rows: ReturnType<typeof jsonEachRows>,\n): TableValuedResult {\n const table = alias ?? defaultName;\n return {\n columns: [...JSON_TVF_COLUMNS],\n rows: rows.map((row) => ({\n cells: JSON_TVF_COLUMNS.map((name) => ({\n table,\n name,\n value: row[name],\n })),\n })),\n };\n}\n\nregisterTableValuedFunction(\"generate_series\", (args, alias) => {\n if (args.length < 2 || args.length > 3) {\n throw new SqliteError(\"wrong number of arguments to function generate_series()\", \"misuse\");\n }\n const start = toInteger(args[0] ?? null);\n const stop = toInteger(args[1] ?? null);\n const step = args.length === 3 ? toInteger(args[2] ?? null) : 1n;\n if (start === null || stop === null || step === null) {\n throw new SqliteError(\"datatype mismatch\", \"datatype_mismatch\");\n }\n if (step === 0n || step === 0) throw new SqliteError(\"step must not be zero\", \"misuse\");\n const startN = typeof start === \"bigint\" ? start : BigInt(start);\n const stopN = typeof stop === \"bigint\" ? stop : BigInt(stop);\n const stepN = typeof step === \"bigint\" ? step : BigInt(step);\n const table = alias ?? \"generate_series\";\n const rows: ScopeRow[] = [];\n if (stepN > 0n) {\n for (let value = startN; value <= stopN; value += stepN) {\n rows.push({\n cells: [{ table, name: \"value\", value: safeInt(value) }],\n });\n }\n } else {\n for (let value = startN; value >= stopN; value += stepN) {\n rows.push({\n cells: [{ table, name: \"value\", value: safeInt(value) }],\n });\n }\n }\n return { columns: [\"value\"], rows };\n});\n\nregisterTableValuedFunction(\"json_each\", (args, alias) => {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_each()\", \"misuse\");\n }\n return jsonTvfResult(alias, \"json_each\", jsonEachRows(args[0]!, args[1]));\n});\n\nregisterTableValuedFunction(\"json_tree\", (args, alias) => {\n if (args.length < 1 || args.length > 2) {\n throw new SqliteError(\"wrong number of arguments to function json_tree()\", \"misuse\");\n }\n return jsonTvfResult(alias, \"json_tree\", jsonTreeRows(args[0]!, args[1]));\n});\n\nfunction safeInt(value: bigint): number | bigint {\n return value <= BigInt(Number.MAX_SAFE_INTEGER) && value >= BigInt(Number.MIN_SAFE_INTEGER) ? Number(value) : value;\n}\n\n/**\n * Known output columns for a TVF without evaluating arguments.\n * Prefer this for FROM-item shape analysis when args may be correlated.\n */\nexport function tableValuedColumns(name: string): string[] | null {\n ensurePragmaTvfsRegistered();\n const lower = name.toLowerCase();\n if (lower === \"generate_series\") return [\"value\"];\n if (lower === \"json_each\" || lower === \"json_tree\") return [...JSON_TVF_COLUMNS];\n return pragmaTvfColumns(name);\n}\n\nexport function evaluateTableFunction(\n name: string,\n args: Expr[],\n alias: string | null,\n env: ExecutionEnv,\n scope?: ScopeRow | null,\n parent?: import(\"../expressions/context.ts\").EvalContext,\n): TableValuedResult {\n ensurePragmaTvfsRegistered();\n const fn = getTableValuedFunction(name);\n if (!fn) throw new SqliteError(`no such table-valued function: ${name}`, \"no_such_table\");\n const values = args.map((arg) => evalExpr(arg, env.createEvalContext(scope ?? null, parent)));\n return fn(values, alias, env);\n}\n\nexport function listTableValuedFunctions(): string[] {\n ensurePragmaTvfsRegistered();\n return listRegisteredTableValuedFunctions();\n}\n\nexport function hasTableValuedFunction(name: string): boolean {\n ensurePragmaTvfsRegistered();\n return hasRegisteredTableValuedFunction(name);\n}\n", "import type { Expr } from \"../ast/nodes.ts\";\n\n/** Structural equality for matching WHERE expressions to index expressions. */\nexport function exprEquals(left: Expr, right: Expr): boolean {\n if (left.type !== right.type) return false;\n switch (left.type) {\n case \"null\":\n return true;\n case \"literal\":\n return right.type === \"literal\" && valuesEqual(left.value, right.value);\n case \"column\":\n return (\n right.type === \"column\" &&\n (left.table ?? \"\").toLowerCase() === (right.table ?? \"\").toLowerCase() &&\n left.name.toLowerCase() === right.name.toLowerCase()\n );\n case \"unary\":\n return right.type === \"unary\" && left.op === right.op && exprEquals(left.expr, right.expr);\n case \"is_bool\":\n return (\n right.type === \"is_bool\" &&\n left.not === right.not &&\n left.sense === right.sense &&\n exprEquals(left.expr, right.expr)\n );\n case \"binary\":\n return (\n right.type === \"binary\" &&\n left.op === right.op &&\n exprEquals(left.left, right.left) &&\n exprEquals(left.right, right.right)\n );\n case \"function\":\n return (\n right.type === \"function\" &&\n left.name.toLowerCase() === right.name.toLowerCase() &&\n left.distinct === right.distinct &&\n argsEqual(left.args, right.args)\n );\n case \"collate\":\n return (\n right.type === \"collate\" &&\n left.collation.toLowerCase() === right.collation.toLowerCase() &&\n exprEquals(left.expr, right.expr)\n );\n case \"cast\":\n return (\n right.type === \"cast\" &&\n (left.typeName ?? \"\").toUpperCase() === (right.typeName ?? \"\").toUpperCase() &&\n exprEquals(left.expr, right.expr)\n );\n default:\n return JSON.stringify(left) === JSON.stringify(right);\n }\n}\n\nfunction argsEqual(left: Expr[] | \"*\", right: Expr[] | \"*\"): boolean {\n if (left === \"*\" || right === \"*\") return left === right;\n if (left.length !== right.length) return false;\n return left.every((expr, index) => exprEquals(expr, right[index]!));\n}\n\nfunction valuesEqual(left: unknown, right: unknown): boolean {\n if (left === right) return true;\n if (left instanceof Uint8Array && right instanceof Uint8Array) {\n if (left.length !== right.length) return false;\n return left.every((byte, index) => byte === right[index]);\n }\n return false;\n}\n", "import type { ErrorCategory } from \"../errors/index.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\n\n/** True when an error is an expected fast-path miss (fall through to full executor). */\nexport function isExpectedFastPathMiss(\n error: unknown,\n categories: readonly ErrorCategory[] = [\"no_such_table\"],\n): boolean {\n return error instanceof SqliteError && categories.includes(error.category);\n}\n", "import type { Expr, FromItem, TableRef } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { ExecutionEnv } from \"../executor/env.ts\";\nimport { exprEquals } from \"../expressions/equals.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { isExpectedFastPathMiss } from \"../runtime/catch.ts\";\nimport type { IndexInfo } from \"../storage/database-state.ts\";\nimport type { Row, Rowid } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { normalizeForCollation } from \"../types/collation.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\n\nexport interface ConstEquality {\n table: string | null;\n column: string;\n valueExpr: Expr;\n}\n\nexport function conjunctions(expr: Expr): Expr[] {\n if (expr.type === \"binary\" && expr.op === \"AND\") {\n return [...conjunctions(expr.left), ...conjunctions(expr.right)];\n }\n return [expr];\n}\n\nfunction isRowIndependentExpr(expr: Expr): boolean {\n return expr.type !== \"column\";\n}\n\nexport function equalityAgainstConst(expr: Expr): ConstEquality | null {\n if (expr.type !== \"binary\" || (expr.op !== \"=\" && expr.op !== \"==\")) return null;\n if (expr.left.type === \"column\" && isRowIndependentExpr(expr.right)) {\n return { table: expr.left.table, column: expr.left.name, valueExpr: expr.right };\n }\n if (expr.right.type === \"column\" && isRowIndependentExpr(expr.left)) {\n return { table: expr.right.table, column: expr.right.name, valueExpr: expr.left };\n }\n return null;\n}\n\nexport function equalityAgainstExpr(expr: Expr): { expr: Expr; valueExpr: Expr } | null {\n if (expr.type !== \"binary\" || (expr.op !== \"=\" && expr.op !== \"==\")) return null;\n if (expr.left.type !== \"column\" && isRowIndependentExpr(expr.right)) {\n return { expr: expr.left, valueExpr: expr.right };\n }\n if (expr.right.type !== \"column\" && isRowIndependentExpr(expr.left)) {\n return { expr: expr.right, valueExpr: expr.left };\n }\n return null;\n}\n\nexport function whereFullyCovered(where: Expr, coveredColumns: Set<string>, alias: string, tableName: string): boolean {\n for (const part of conjunctions(where)) {\n const eq = equalityAgainstConst(part);\n if (!eq) return false;\n if (!matchesTable(eq.table, alias, tableName)) return false;\n const col = eq.column.toLowerCase();\n if (!coveredColumns.has(col) && !isRowidName(eq.column)) return false;\n }\n return true;\n}\n\nfunction matchesTable(table: string | null, alias: string, tableName: string): boolean {\n if (table === null) return true;\n const key = table.toLowerCase();\n return key === alias.toLowerCase() || key === tableName.toLowerCase();\n}\n\nfunction isRowidName(name: string): boolean {\n const key = name.toLowerCase();\n return key === \"rowid\" || key === \"_rowid_\" || key === \"oid\";\n}\n\nexport interface TableRowLookup {\n table: Table;\n alias: string;\n rows: Row[];\n /** Lowercased columns whose equality predicates were applied by the access path. */\n coveredColumns: Set<string>;\n}\n\n/** Look up rows for a simple `FROM table WHERE ...` using PK, a covering equality index, or an automatic hash. */\nexport function tryIndexedTableRows(from: FromItem, where: Expr, env: ExecutionEnv): TableRowLookup | null {\n if (from.type !== \"table\") return null;\n return lookupTableRows(from, where, env);\n}\n\nexport function lookupTableRows(from: TableRef, where: Expr, env: ExecutionEnv): TableRowLookup | null {\n const alias = from.alias ?? from.name;\n const qualified = from.schema ? `${from.schema}.${from.name}` : from.name;\n const db = env.state.databaseForSchema(from.schema, qualified);\n if (from.name.toLowerCase() === \"sqlite_schema\" || from.name.toLowerCase() === \"sqlite_master\") return null;\n if (db.virtualTables.has(from.name.toLowerCase()) || db.views.has(from.name.toLowerCase())) return null;\n if (env.ctes.has(from.name.toLowerCase())) return null;\n\n let table: Table;\n try {\n table = db.getTable(from.name);\n } catch (error) {\n if (!isExpectedFastPathMiss(error)) throw error;\n return null;\n }\n\n const parts = conjunctions(where);\n const equalities = parts\n .map(equalityAgainstConst)\n .filter((item): item is ConstEquality => item !== null)\n .filter((item) => matchesTable(item.table, alias, table.name));\n\n const evalConst = (expr: Expr): SqlValue | undefined => {\n try {\n return evalExpr(expr, env.createEvalContext(null));\n } catch (error) {\n if (error instanceof SqliteError) return undefined;\n throw error;\n }\n };\n\n const resolved: { table: string | null; column: string; value: SqlValue }[] = [];\n for (const eq of equalities) {\n const value = evalConst(eq.valueExpr);\n if (value === undefined) continue;\n resolved.push({ table: eq.table, column: eq.column, value });\n }\n\n const pk = table.integerPkColumn();\n for (const eq of resolved) {\n const col = eq.column.toLowerCase();\n if (isRowidName(eq.column) || (pk && col === pk.name.toLowerCase())) {\n const row = table.getByKey(eq.value);\n const coveredColumns = new Set<string>([col, \"rowid\", \"_rowid_\", \"oid\"]);\n if (pk) coveredColumns.add(pk.nameLower ?? pk.name.toLowerCase());\n if (row) return { table, alias, rows: [row], coveredColumns };\n if (eq.value === null || typeof eq.value === \"number\" || typeof eq.value === \"bigint\") {\n return { table, alias, rows: [], coveredColumns };\n }\n return null;\n }\n }\n\n const byColumn = new Map<string, SqlValue>();\n for (const eq of resolved) byColumn.set(eq.column.toLowerCase(), eq.value);\n\n let best: IndexLookup | null = null;\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index) continue;\n if (index.where && !parts.some((part) => exprEquals(part, index.where!))) continue;\n\n if (index.columns.some((column) => column.expr)) {\n const prefix: SqlValue[] = [];\n for (const column of index.columns) {\n if (!column.expr) {\n const value = byColumn.get(column.name.toLowerCase());\n if (value === undefined) break;\n prefix.push(normalizeForCollation(value, column.collate ?? \"BINARY\"));\n continue;\n }\n const match = parts.map(equalityAgainstExpr).find((item) => item && exprEquals(item.expr, column.expr!));\n if (!match) break;\n const value = evalConst(match.valueExpr);\n if (value === undefined) break;\n prefix.push(normalizeForCollation(value, column.collate ?? \"BINARY\"));\n }\n if (prefix.length === 0) continue;\n const full = prefix.length === index.columns.length;\n const rowids = full ? index.store.lookup(prefix) : index.store.lookupPrefix(prefix);\n const next = considerIndexLookup(best, {\n rowids,\n columns: index.columns.slice(0, prefix.length).map((column) => column.name.toLowerCase()),\n prefixLen: prefix.length,\n uniqueFull: index.unique && full,\n });\n best = next.best;\n if (next.stop) break;\n continue;\n }\n\n const prefix: SqlValue[] = [];\n for (const column of index.columns) {\n const value = byColumn.get(column.name.toLowerCase());\n if (value === undefined) break;\n prefix.push(normalizeForCollation(value, column.collate ?? \"BINARY\"));\n }\n if (prefix.length === 0) continue;\n const full = prefix.length === index.columns.length;\n const rowids = full ? index.store.lookup(prefix) : index.store.lookupPrefix(prefix);\n const next = considerIndexLookup(best, {\n rowids,\n columns: index.columns.slice(0, prefix.length).map((column) => column.name.toLowerCase()),\n prefixLen: prefix.length,\n uniqueFull: index.unique && full,\n });\n best = next.best;\n if (next.stop) break;\n }\n\n if (best) {\n const rows: Row[] = [];\n for (const rowid of best.rowids) {\n const row = table.get(rowid);\n if (row) rows.push(row);\n }\n rows.sort((a, b) => compareRowids(a.rowid, b.rowid));\n return { table, alias, rows, coveredColumns: new Set(best.columns) };\n }\n\n for (const eq of resolved) {\n const col = eq.column.toLowerCase();\n if (isRowidName(eq.column)) continue;\n const hashed = table.lookupEquality(col, eq.value);\n if (!hashed) continue;\n hashed.sort((a, b) => compareRowids(a.rowid, b.rowid));\n return { table, alias, rows: hashed, coveredColumns: new Set([col]) };\n }\n\n const range = rangeAgainstConst(where) ?? rangeFromBetween(where);\n if (range && matchesTable(range.table, alias, table.name)) {\n const value = evalConst(range.valueExpr);\n const value2 = range.valueExpr2 ? evalConst(range.valueExpr2) : undefined;\n if (value !== undefined) {\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index || index.where || index.columns.length !== 1) continue;\n if (index.columns[0]!.expr) continue;\n if (index.columns[0]!.name.toLowerCase() !== range.column.toLowerCase()) continue;\n const bound = normalizeForCollation(value, index.columns[0]!.collate ?? \"BINARY\");\n const bound2 =\n value2 !== undefined ? normalizeForCollation(value2, index.columns[0]!.collate ?? \"BINARY\") : undefined;\n const rowids = index.store.rangeLookup(range.op, bound, bound2);\n const rows: Row[] = [];\n for (const rowid of rowids) {\n const row = table.get(rowid);\n if (row) rows.push(row);\n }\n return { table, alias, rows, coveredColumns: new Set([range.column.toLowerCase()]) };\n }\n }\n }\n\n return null;\n}\n\nfunction rangeAgainstConst(\n expr: Expr,\n): { table: string | null; column: string; op: \">\" | \">=\" | \"<\" | \"<=\"; valueExpr: Expr; valueExpr2?: Expr } | null {\n if (expr.type !== \"binary\") return null;\n const op = expr.op;\n if (op !== \">\" && op !== \">=\" && op !== \"<\" && op !== \"<=\") return null;\n if (expr.left.type === \"column\" && isRowIndependentExpr(expr.right)) {\n return { table: expr.left.table, column: expr.left.name, op, valueExpr: expr.right };\n }\n if (expr.right.type === \"column\" && isRowIndependentExpr(expr.left)) {\n const flipped = op === \">\" ? \"<\" : op === \">=\" ? \"<=\" : op === \"<\" ? \">\" : \">=\";\n return { table: expr.right.table, column: expr.right.name, op: flipped, valueExpr: expr.left };\n }\n return null;\n}\n\nfunction rangeFromBetween(\n expr: Expr,\n): { table: string | null; column: string; op: \"between\"; valueExpr: Expr; valueExpr2: Expr } | null {\n if (expr.type !== \"between\" || expr.not || expr.expr.type !== \"column\") return null;\n return {\n table: expr.expr.table,\n column: expr.expr.name,\n op: \"between\",\n valueExpr: expr.lower,\n valueExpr2: expr.upper,\n };\n}\n\nexport function tryIndexedOrder(\n from: FromItem,\n order: { expr: Expr; dir: \"ASC\" | \"DESC\" },\n env: ExecutionEnv,\n limit?: number,\n): TableRowLookup | null {\n if (from.type !== \"table\" || order.expr.type !== \"column\") return null;\n const alias = from.alias ?? from.name;\n const db = env.state.databaseForSchema(from.schema, from.schema ? `${from.schema}.${from.name}` : from.name);\n let table: Table;\n try {\n table = db.getTable(from.name);\n } catch (error) {\n if (!isExpectedFastPathMiss(error)) throw error;\n return null;\n }\n const col = order.expr.name.toLowerCase();\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index || index.where || index.columns.length !== 1 || index.columns[0]!.expr) continue;\n if (index.columns[0]!.name.toLowerCase() !== col) continue;\n const desc = order.dir === \"DESC\";\n const rows: Row[] = [];\n for (const rowid of index.store.orderedRowids(desc)) {\n const row = table.get(rowid);\n if (row) rows.push(row);\n if (limit !== undefined && rows.length >= limit) break;\n }\n return { table, alias, rows, coveredColumns: new Set([col]) };\n }\n return null;\n}\n\ninterface IndexLookup {\n rowids: readonly Rowid[];\n columns: string[];\n prefixLen: number;\n uniqueFull: boolean;\n}\n\n/** Unique full-key lookups are authoritative (including misses). Empty prefix hits are not. */\nfunction considerIndexLookup(\n best: IndexLookup | null,\n candidate: IndexLookup,\n): { best: IndexLookup | null; stop: boolean } {\n if (candidate.uniqueFull) return { best: candidate, stop: true };\n if (candidate.rowids.length === 0) return { best, stop: false };\n if (!best || candidate.prefixLen > best.prefixLen) return { best: candidate, stop: false };\n return { best, stop: false };\n}\n\nfunction compareRowids(left: Rowid, right: Rowid): number {\n const a = typeof left === \"bigint\" ? left : BigInt(left);\n const b = typeof right === \"bigint\" ? right : BigInt(right);\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nexport interface JoinProbe {\n table: Table;\n alias: string;\n /** When true, ON is fully applied by the probe (skip re-eval). */\n covering: boolean;\n lookup: (leftCellsValue: (table: string | null, name: string) => SqlValue) => Row[];\n}\n\n/** Equality join keys extracted from ON (column = column), for hash join when no index probe. */\nexport interface JoinEqualityKeys {\n /** Right-side column names in join-key order. */\n rightColumns: string[];\n /** Corresponding left-side (probe) column references. */\n leftKeys: { table: string | null; column: string }[];\n}\n\nexport function tryJoinEqualityKeys(right: FromItem, on: Expr | null, env?: ExecutionEnv): JoinEqualityKeys | null {\n if (!on || right.type !== \"table\") return null;\n if (env) {\n const db = env.state.databaseForSchema(right.schema, right.schema ? `${right.schema}.${right.name}` : right.name);\n if (db.virtualTables.has(right.name.toLowerCase()) || db.views.has(right.name.toLowerCase())) return null;\n if (env.ctes.has(right.name.toLowerCase())) return null;\n }\n const alias = right.alias ?? right.name;\n const pairs: { rightColumn: string; leftTable: string | null; leftColumn: string }[] = [];\n for (const part of conjunctions(on)) {\n if (part.type !== \"binary\" || (part.op !== \"=\" && part.op !== \"==\")) continue;\n if (part.left.type !== \"column\" || part.right.type !== \"column\") continue;\n const leftOnRight = columnOnTable(part.left, alias, right.name);\n const rightOnRight = columnOnTable(part.right, alias, right.name);\n if (leftOnRight && !rightOnRight) {\n pairs.push({ rightColumn: part.left.name, leftTable: part.right.table, leftColumn: part.right.name });\n } else if (rightOnRight && !leftOnRight) {\n pairs.push({ rightColumn: part.right.name, leftTable: part.left.table, leftColumn: part.left.name });\n }\n }\n if (pairs.length === 0) return null;\n // Require the entire ON to be only equality conjunctions (no leftover predicates).\n const parts = conjunctions(on);\n if (parts.length !== pairs.length) return null;\n for (const part of parts) {\n if (part.type !== \"binary\" || (part.op !== \"=\" && part.op !== \"==\")) return null;\n if (part.left.type !== \"column\" || part.right.type !== \"column\") return null;\n }\n // rowid join keys need ScopeRow.rowid, not a regular cell \u2014 keep nested loop.\n if (pairs.some((pair) => isRowidName(pair.rightColumn))) return null;\n return {\n rightColumns: pairs.map((pair) => pair.rightColumn),\n leftKeys: pairs.map((pair) => ({ table: pair.leftTable, column: pair.leftColumn })),\n };\n}\n\nexport function tryJoinProbe(right: FromItem, on: Expr | null, env: ExecutionEnv): JoinProbe | null {\n if (!on || right.type !== \"table\") return null;\n const alias = right.alias ?? right.name;\n const db = env.state.databaseForSchema(right.schema, right.schema ? `${right.schema}.${right.name}` : right.name);\n if (db.virtualTables.has(right.name.toLowerCase()) || db.views.has(right.name.toLowerCase())) return null;\n if (env.ctes.has(right.name.toLowerCase())) return null;\n let table: Table;\n try {\n table = db.getTable(right.name);\n } catch {\n return null;\n }\n\n const pairs: { rightColumn: string; leftTable: string | null; leftColumn: string }[] = [];\n for (const part of conjunctions(on)) {\n if (part.type !== \"binary\" || (part.op !== \"=\" && part.op !== \"==\")) continue;\n if (part.left.type !== \"column\" || part.right.type !== \"column\") continue;\n const leftOnRight = columnOnTable(part.left, alias, table.name);\n const rightOnRight = columnOnTable(part.right, alias, table.name);\n if (leftOnRight && !rightOnRight) {\n pairs.push({ rightColumn: part.left.name, leftTable: part.right.table, leftColumn: part.right.name });\n } else if (rightOnRight && !leftOnRight) {\n pairs.push({ rightColumn: part.right.name, leftTable: part.left.table, leftColumn: part.left.name });\n }\n }\n if (pairs.length === 0) return null;\n\n const pk = table.integerPkColumn();\n const pkPair = pairs.find(\n (pair) => isRowidName(pair.rightColumn) || (pk && pair.rightColumn.toLowerCase() === pk.name.toLowerCase()),\n );\n if (pkPair) {\n return {\n table,\n alias,\n covering: pairs.length === 1,\n lookup: (getLeft) => {\n const value = getLeft(pkPair.leftTable, pkPair.leftColumn);\n const row = table.getByKey(value);\n return row ? [row] : [];\n },\n };\n }\n\n for (const indexName of table.indexes) {\n const index: IndexInfo | undefined = db.indexes.get(indexName.toLowerCase());\n if (!index || index.where) continue;\n const prefixPairs: typeof pairs = [];\n for (const column of index.columns) {\n const pair = pairs.find((item) => item.rightColumn.toLowerCase() === column.name.toLowerCase());\n if (!pair) break;\n prefixPairs.push(pair);\n }\n if (prefixPairs.length !== index.columns.length) continue;\n return {\n table,\n alias,\n covering: prefixPairs.length === pairs.length,\n lookup: (getLeft) => {\n const values = prefixPairs.map((pair, i) =>\n normalizeForCollation(getLeft(pair.leftTable, pair.leftColumn), index.columns[i]?.collate ?? \"BINARY\"),\n );\n const rows: Row[] = [];\n for (const rowid of index.store.lookup(values)) {\n const row = table.get(rowid);\n if (row) rows.push(row);\n }\n rows.sort((a, b) => compareRowids(a.rowid, b.rowid));\n return rows;\n },\n };\n }\n\n if (pairs.length === 1) {\n const pair = pairs[0]!;\n const col = pair.rightColumn.toLowerCase();\n if (!isRowidName(pair.rightColumn) && table.ensureEqualityHash(col)) {\n return {\n table,\n alias,\n covering: true,\n lookup: (getLeft) => {\n const rows = table.lookupEquality(col, getLeft(pair.leftTable, pair.leftColumn));\n return rows ?? [];\n },\n };\n }\n }\n return null;\n}\n\nfunction columnOnTable(column: { table: string | null; name: string }, alias: string, tableName: string): boolean {\n return column.table !== null && matchesTable(column.table, alias, tableName);\n}\n", "import type { DatabaseState } from \"../storage/database-state.ts\";\nimport { makeColumnInfo, Table } from \"../storage/table.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\n\nexport type SchemaObjectType = \"table\" | \"index\" | \"view\" | \"trigger\";\n\nexport interface SchemaCatalogRow {\n type: SchemaObjectType;\n name: string;\n tbl_name: string;\n rootpage: number;\n sql: string | null;\n}\n\nexport function schemaCatalogRows(state: DatabaseState): SchemaCatalogRow[] {\n const tables = [...state.tables.values()].sort((a, b) => compareNames(a.name, b.name));\n const indexes = [...state.indexes.values()].sort((a, b) => compareNames(a.name, b.name));\n const views = [...state.views.values()].sort((a, b) => compareNames(a.name, b.name));\n const triggers = [...state.triggers.values()].sort((a, b) => compareNames(a.name, b.name));\n\n const rows: SchemaCatalogRow[] = [];\n let rootpage = 2;\n\n for (const table of tables) {\n rows.push({\n type: \"table\",\n name: table.name,\n tbl_name: table.name,\n rootpage: rootpage++,\n sql: table.originalSql,\n });\n }\n for (const index of indexes) {\n rows.push({\n type: \"index\",\n name: index.name,\n tbl_name: index.tableName,\n rootpage: rootpage++,\n sql: index.originalSql,\n });\n }\n for (const view of views) {\n rows.push({\n type: \"view\",\n name: view.name,\n tbl_name: view.name,\n rootpage: 0,\n sql: view.originalSql,\n });\n }\n for (const trigger of triggers) {\n rows.push({\n type: \"trigger\",\n name: trigger.name,\n tbl_name: trigger.tableName,\n rootpage: 0,\n sql: trigger.originalSql,\n });\n }\n return rows;\n}\n\n/** Locale-independent UTF-16 code-unit order for stable catalog/snapshot encoding. */\nfunction compareNames(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nexport function buildSchemaCatalog(state: DatabaseState, name = \"sqlite_schema\"): Table {\n const catalog = new Table(name, [\n makeColumnInfo(\"type\", \"TEXT\"),\n makeColumnInfo(\"name\", \"TEXT\"),\n makeColumnInfo(\"tbl_name\", \"TEXT\"),\n makeColumnInfo(\"rootpage\", \"INTEGER\"),\n makeColumnInfo(\"sql\", \"TEXT\"),\n ]);\n\n for (const row of schemaCatalogRows(state)) {\n catalog.insert({\n values: {\n type: row.type,\n name: row.name,\n tbl_name: row.tbl_name,\n rootpage: row.rootpage,\n sql: row.sql,\n } satisfies Record<string, SqlValue>,\n });\n }\n return catalog;\n}\n\nexport function buildSqliteSchema(state: DatabaseState): Table {\n return buildSchemaCatalog(state, \"sqlite_schema\");\n}\n\nexport function buildSqliteMaster(state: DatabaseState): Table {\n return buildSchemaCatalog(state, \"sqlite_master\");\n}\n", "import type { Expr, ResultColumn, SelectStmt } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport {\n conjunctions,\n equalityAgainstConst,\n lookupTableRows,\n tryIndexedOrder,\n tryJoinEqualityKeys,\n whereFullyCovered,\n} from \"../planner/access.ts\";\nimport { isExpectedFastPathMiss } from \"../runtime/catch.ts\";\nimport type { Row } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { applyAffinity, canonicalizeNumber, compareSql, type SqlValue, toInteger } from \"../types/value.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { type ResultSet, valuesToResult } from \"./result.ts\";\n\n/**\n * Tight path for `SELECT cols FROM table WHERE col = ?` (no join/group/order).\n * Skips ScopeRow / evalExpr and honors maxRows during the scan.\n */\nexport function tryExecuteSimpleSelect(stmt: SelectStmt, env: ExecutionEnv): ResultSet | null {\n if (stmt.with || stmt.compound || stmt.distinct || stmt.groupBy.length > 0 || stmt.having || stmt.windows.length > 0)\n return null;\n if (stmt.orderBy.length > 1) return null;\n if (stmt.orderBy.length === 1 && stmt.where) return null;\n if (stmt.from?.type !== \"table\") return null;\n for (const column of stmt.columns) {\n if (column.type === \"star\") continue;\n if (column.expr.type !== \"column\") return null;\n }\n\n const from = stmt.from;\n const nameKey = from.name.toLowerCase();\n if (nameKey === \"sqlite_schema\" || nameKey === \"sqlite_master\") return null;\n if (env.ctes.has(nameKey)) return null;\n const qualified = from.schema ? `${from.schema}.${from.name}` : from.name;\n const db = env.state.databaseForSchema(from.schema, qualified);\n if (db.virtualTables.has(nameKey) || db.views.has(nameKey)) return null;\n\n let table: Table;\n try {\n table = db.getTable(from.name);\n } catch (error) {\n if (!isExpectedFastPathMiss(error)) throw error;\n return null;\n }\n if (table.withoutRowid) return null;\n if (table.columns.some((column) => column.generated && !column.generated.stored)) return null;\n\n const alias = from.alias ?? from.name;\n const aliasLower = alias.toLowerCase();\n const tableLower = table.name.toLowerCase();\n for (const column of stmt.columns) {\n if (column.type === \"star\") continue;\n if (column.expr.type !== \"column\") return null;\n const tableRef = column.expr.table?.toLowerCase();\n if (tableRef && tableRef !== aliasLower && tableRef !== tableLower && tableRef !== nameKey) return null;\n const key = column.expr.name.toLowerCase();\n if (isRowidName(key)) continue;\n if (!table.columns.some((item) => (item.nameLower ?? item.name.toLowerCase()) === key)) return null;\n }\n\n const filters: { column: string; value: SqlValue }[] = [];\n if (stmt.where) {\n for (const part of conjunctions(stmt.where)) {\n const eq = equalityAgainstConst(part);\n if (!eq) return null;\n let value: SqlValue;\n try {\n value = evalIndependent(eq.valueExpr, env);\n } catch (error) {\n if (error instanceof SqliteError) return null;\n throw error;\n }\n const column = eq.column.toLowerCase();\n const affinity = isRowidName(column)\n ? \"INTEGER\"\n : table.columns.find((item) => (item.nameLower ?? item.name.toLowerCase()) === column)?.affinity;\n filters.push({ column, value: affinity ? applyAffinity(value, affinity) : value });\n }\n }\n\n let limit = env.maxRows;\n let offset = 0;\n if (stmt.limit) {\n try {\n const limitValue = toInteger(evalIndependent(stmt.limit.limit, env));\n const offsetValue = stmt.limit.offset ? toInteger(evalIndependent(stmt.limit.offset, env)) : 0;\n if (limitValue === null || offsetValue === null) return null;\n offset = Math.max(0, Number(offsetValue));\n const n = Number(limitValue);\n if (n >= 0) limit = Math.min(limit, n);\n } catch (error) {\n if (error instanceof SqliteError) return null;\n throw error;\n }\n }\n const columns = projectNames(stmt.columns, table);\n if (limit <= 0) return pack(env, columns, []);\n\n let source: Iterable<Row> = table.scan();\n let alreadyFiltered = false;\n\n if (stmt.orderBy.length === 1 && stmt.orderBy[0]) {\n const take = limit < Number.MAX_SAFE_INTEGER ? offset + limit : undefined;\n const ordered = tryIndexedOrder(from, { expr: stmt.orderBy[0].expr, dir: stmt.orderBy[0].dir ?? \"ASC\" }, env, take);\n if (!ordered) return null;\n source = ordered.rows;\n alreadyFiltered = true;\n } else if (stmt.where) {\n const indexed = lookupTableRows(from, stmt.where, env);\n if (indexed) {\n source = indexed.rows;\n alreadyFiltered = whereFullyCovered(stmt.where, indexed.coveredColumns, alias, table.name);\n }\n }\n\n const projectors = projectionFns(stmt.columns, table);\n const values: SqlValue[][] = [];\n let skipped = 0;\n\n for (const row of source) {\n if (!alreadyFiltered && filters.length > 0 && !rowMatches(table, row, filters)) continue;\n if (skipped < offset) {\n skipped++;\n continue;\n }\n values.push(projectors.map((fn) => fn(row)));\n if (values.length >= limit) break;\n }\n\n return pack(env, columns, values);\n}\n\nexport function tryExecuteSimpleJoin(stmt: SelectStmt, env: ExecutionEnv): ResultSet | null {\n if (stmt.with || stmt.compound || stmt.distinct || stmt.groupBy.length > 0 || stmt.having || stmt.windows.length > 0)\n return null;\n if (stmt.orderBy.length > 0 || stmt.limit || stmt.where) return null;\n if (stmt.from?.type !== \"join\") return null;\n const join = stmt.from;\n if ((join.joinType !== \"INNER\" && join.joinType !== \"CROSS\") || join.using || !join.on) return null;\n if (join.left.type !== \"table\" || join.right.type !== \"table\") return null;\n const keys = tryJoinEqualityKeys(join.right, join.on, env);\n if (keys?.rightColumns.length !== 1) return null;\n\n const leftRef = join.left;\n const rightRef = join.right;\n const leftDb = env.state.databaseForSchema(\n leftRef.schema,\n leftRef.schema ? `${leftRef.schema}.${leftRef.name}` : leftRef.name,\n );\n const rightDb = env.state.databaseForSchema(\n rightRef.schema,\n rightRef.schema ? `${rightRef.schema}.${rightRef.name}` : rightRef.name,\n );\n if (env.ctes.has(leftRef.name.toLowerCase()) || env.ctes.has(rightRef.name.toLowerCase())) return null;\n if (leftDb.views.has(leftRef.name.toLowerCase()) || rightDb.views.has(rightRef.name.toLowerCase())) return null;\n if (leftDb.virtualTables.has(leftRef.name.toLowerCase()) || rightDb.virtualTables.has(rightRef.name.toLowerCase()))\n return null;\n\n let leftTable: Table;\n let rightTable: Table;\n try {\n leftTable = leftDb.getTable(leftRef.name);\n rightTable = rightDb.getTable(rightRef.name);\n } catch (error) {\n if (!isExpectedFastPathMiss(error)) throw error;\n return null;\n }\n if (leftTable.withoutRowid || rightTable.withoutRowid) return null;\n\n const leftAlias = (leftRef.alias ?? leftRef.name).toLowerCase();\n const rightAlias = (rightRef.alias ?? rightRef.name).toLowerCase();\n const rightCol = keys.rightColumns[0]!.toLowerCase();\n const leftCol = keys.leftKeys[0]!.column.toLowerCase();\n if (!rightTable.ensureEqualityHash(rightCol)) return null;\n\n const names: string[] = [];\n const projectors: ((left: Row, right: Row) => SqlValue)[] = [];\n for (const column of stmt.columns) {\n if (column.type !== \"expr\" || column.expr.type !== \"column\") return null;\n const tableRef = column.expr.table?.toLowerCase() ?? null;\n const key = column.expr.name.toLowerCase();\n const onLeft =\n tableRef === null\n ? leftTable.columns.some((item) => (item.nameLower ?? item.name.toLowerCase()) === key)\n : tableRef === leftAlias || tableRef === leftTable.name.toLowerCase();\n const onRight =\n tableRef === null\n ? rightTable.columns.some((item) => (item.nameLower ?? item.name.toLowerCase()) === key)\n : tableRef === rightAlias || tableRef === rightTable.name.toLowerCase();\n if (onLeft === onRight) return null;\n names.push(column.alias ?? column.expr.name);\n if (onLeft) {\n if (isRowidName(key)) projectors.push((left) => left.rowid);\n else projectors.push((left) => leftTable.cell(left, key));\n } else {\n if (isRowidName(key)) projectors.push((_left, right) => right.rowid);\n else projectors.push((_left, right) => rightTable.cell(right, key));\n }\n }\n\n const values: SqlValue[][] = [];\n for (const left of leftTable.scan()) {\n const matches = rightTable.lookupEquality(rightCol, leftTable.cell(left, leftCol));\n if (!matches) return null;\n for (const right of matches) values.push(projectors.map((fn) => fn(left, right)));\n }\n return pack(env, names, values);\n}\n\nfunction rowMatches(table: Table, row: Row, filters: { column: string; value: SqlValue }[]): boolean {\n for (const filter of filters) {\n if (isRowidName(filter.column)) {\n if (compareSql(row.rowid, filter.value) !== 0) return false;\n continue;\n }\n if (compareSql(table.cell(row, filter.column), filter.value) !== 0) return false;\n }\n return true;\n}\n\nfunction projectNames(columns: ResultColumn[], table: Table): string[] {\n const names: string[] = [];\n for (const column of columns) {\n if (column.type === \"star\") {\n for (const item of table.columns) names.push(item.name);\n continue;\n }\n if (column.alias) {\n names.push(column.alias);\n continue;\n }\n const key = column.expr.type === \"column\" ? column.expr.name.toLowerCase() : \"\";\n if (isRowidName(key)) names.push(table.integerPkColumn()?.name ?? \"rowid\");\n else names.push(column.expr.type === \"column\" ? column.expr.name : \"?column?\");\n }\n return names;\n}\n\nfunction projectionFns(columns: ResultColumn[], table: Table): ((row: Row) => SqlValue)[] {\n const fns: ((row: Row) => SqlValue)[] = [];\n for (const column of columns) {\n if (column.type === \"star\") {\n for (const item of table.columns) {\n const key = item.nameLower ?? item.name.toLowerCase();\n fns.push((row) => table.cell(row, key));\n }\n continue;\n }\n const expr = column.expr;\n if (expr.type !== \"column\") continue;\n const key = expr.name.toLowerCase();\n if (isRowidName(key)) fns.push((row) => row.rowid);\n else fns.push((row) => table.cell(row, key));\n }\n return fns;\n}\n\nfunction evalIndependent(expr: Expr, env: ExecutionEnv): SqlValue {\n if (expr.type === \"literal\") return expr.value;\n if (expr.type === \"null\") return null;\n if (expr.type === \"parameter\") return env.getBoundParameter(expr.name);\n if (expr.type === \"unary\" && expr.op === \"-\" && expr.expr.type === \"literal\" && typeof expr.expr.value === \"number\") {\n return canonicalizeNumber(-expr.expr.value);\n }\n throw new Error(\"not independent\");\n}\n\nfunction isRowidName(name: string): boolean {\n return name === \"rowid\" || name === \"_rowid_\" || name === \"oid\";\n}\n\nfunction pack(env: ExecutionEnv, columns: string[], values: SqlValue[][]): ResultSet {\n return valuesToResult(columns, values, 0, env.state.lastInsertRowid, {\n named: env.includeNamedRows,\n keepValues: true,\n });\n}\n", "import type {\n AggregateExpr,\n Expr,\n FromItem,\n OrderByItem,\n ResultColumn,\n SelectStmt,\n WindowExpr,\n WindowSpec,\n WithClause,\n} from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { EvalContext } from \"../expressions/context.ts\";\nimport { evalExpr, explicitCollation } from \"../expressions/eval.ts\";\nimport { isPragmaTvfName } from \"../functions/pragma-tvf.ts\";\nimport { evaluateTableFunction, hasTableValuedFunction, tableValuedColumns } from \"../functions/table-valued.ts\";\nimport { serializeIndexKey } from \"../indexes/index.ts\";\nimport {\n tryIndexedOrder,\n tryIndexedTableRows,\n tryJoinEqualityKeys,\n tryJoinProbe,\n whereFullyCovered,\n} from \"../planner/access.ts\";\nimport { buildSqliteMaster, buildSqliteSchema } from \"../schema/catalog.ts\";\nimport type { DatabaseState } from \"../storage/database-state.ts\";\nimport type { Row } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { compareWithCollation, normalizeForCollation } from \"../types/collation.ts\";\nimport {\n type Affinity,\n applyAffinity,\n compareSql,\n isTruthySql,\n type SqlValue,\n sqlValueEquals,\n toInteger,\n} from \"../types/value.ts\";\nimport type { FtsVocabVirtualTable } from \"../vtable/modules.ts\";\nimport type { ExecutionEnv, ScopeRow } from \"./env.ts\";\nimport { makeCell } from \"./env.ts\";\nimport { type ResultSet, resultValues, valuesToResult } from \"./result.ts\";\nimport { tryExecuteSimpleJoin, tryExecuteSimpleSelect } from \"./simple-select.ts\";\n\nfunction applyAffinityLocal(value: SqlValue, affinity: Affinity): SqlValue {\n return applyAffinity(value, affinity);\n}\n\ninterface OutputRow {\n values: SqlValue[];\n scope: ScopeRow;\n}\n\nexport function executeSelect(stmt: SelectStmt, env: ExecutionEnv, parent?: EvalContext): ResultSet {\n env.selectRunner = executeSelect;\n if (!parent && !stmt.with && !stmt.compound && !env.forceFullSelect) {\n const simple = tryExecuteSimpleSelect(stmt, env) ?? tryExecuteSimpleJoin(stmt, env);\n if (simple) return simple;\n }\n const savedCtes = new Map(env.ctes);\n try {\n if (stmt.with) executeWith(stmt.with, env, parent);\n const base = executeSelectCore(\n {\n ...stmt,\n with: null,\n compound: null,\n orderBy: stmt.compound ? [] : stmt.orderBy,\n limit: stmt.compound ? null : stmt.limit,\n },\n env,\n parent,\n );\n if (!stmt.compound) return base;\n const right = executeSelect(stmt.compound.select, env, parent);\n if (base.columns.length !== right.columns.length) {\n throw new SqliteError(\n \"SELECTs to the left and right of compound operator do not have the same number of result columns\",\n \"other\",\n );\n }\n const leftRows = resultValues(base);\n const rightRows = resultValues(right);\n let rows: SqlValue[][];\n switch (stmt.compound.op) {\n case \"UNION ALL\":\n rows = [...leftRows, ...rightRows];\n break;\n case \"UNION\":\n rows = uniqueRows([...leftRows, ...rightRows]);\n break;\n case \"INTERSECT\":\n rows = uniqueRows(leftRows).filter((row) => rightRows.some((other) => rowsEqual(row, other)));\n break;\n case \"EXCEPT\":\n rows = uniqueRows(leftRows).filter((row) => !rightRows.some((other) => rowsEqual(row, other)));\n break;\n }\n if (stmt.orderBy.length > 0) rows.sort((a, b) => compareCompoundRows(a, b, stmt.orderBy, base.columns));\n if (stmt.limit) {\n const ctx = env.createEvalContext(null, parent);\n const limitValue = toInteger(evalExpr(stmt.limit.limit, ctx));\n const offsetValue = stmt.limit.offset ? toInteger(evalExpr(stmt.limit.offset, ctx)) : 0;\n if (limitValue === null || offsetValue === null) throw new SqliteError(\"datatype mismatch\", \"datatype_mismatch\");\n const offset = Math.max(0, Number(offsetValue));\n const limit = Number(limitValue);\n rows = rows.slice(offset, limit < 0 ? undefined : offset + limit);\n }\n return valuesToResult(base.columns, rows, 0, env.state.lastInsertRowid, {\n named: env.includeNamedRows,\n keepValues: true,\n });\n } finally {\n env.ctes.clear();\n for (const [name, result] of savedCtes) env.ctes.set(name, result);\n }\n}\n\nexport function executeWith(withClause: WithClause, env: ExecutionEnv, parent?: EvalContext): void {\n for (const cte of withClause.ctes) {\n const key = cte.name.toLowerCase();\n if (withClause.recursive && referencesTable(cte.select, cte.name) && cte.select.compound) {\n const anchor = executeSelect({ ...cte.select, compound: null }, env, parent);\n const columns = cte.columns ?? anchor.columns;\n const recursive = cte.select.compound.select;\n const limit = recursive.limit\n ? toInteger(evalExpr(recursive.limit.limit, env.createEvalContext(null, parent)))\n : null;\n if (recursive.limit && limit === null) throw new SqliteError(\"datatype mismatch\", \"datatype_mismatch\");\n const maxRows = limit === null || Number(limit) < 0 ? Number.POSITIVE_INFINITY : Number(limit);\n const queue = resultValues(anchor);\n const discovered = [...queue];\n const accumulated: SqlValue[][] = [];\n if (recursive.orderBy.length > 0) {\n queue.sort((left, right) => compareCteQueueRows(left, right, columns, recursive.orderBy, env, parent));\n }\n while (queue.length > 0 && accumulated.length < maxRows) {\n const current = queue.shift()!;\n accumulated.push(current);\n env.ctes.set(key, valuesToResult(columns, [current]));\n const nextResult = executeSelect({ ...recursive, orderBy: [], limit: null }, env, parent);\n const candidates = resultValues(nextResult);\n const additions: SqlValue[][] = [];\n for (const candidate of candidates) {\n if (\n cte.select.compound.op !== \"UNION ALL\" &&\n [...discovered, ...additions].some((existing) => rowsEqual(existing, candidate))\n )\n continue;\n additions.push(candidate);\n }\n discovered.push(...additions);\n queue.push(...additions);\n if (recursive.orderBy.length > 0) {\n queue.sort((left, right) => compareCteQueueRows(left, right, columns, recursive.orderBy, env, parent));\n }\n }\n env.ctes.set(key, valuesToResult(columns, accumulated));\n } else {\n const result = executeSelect(cte.select, env, parent);\n const columns = cte.columns ?? result.columns;\n env.ctes.set(key, valuesToResult(columns, resultValues(result)));\n }\n }\n}\n\nfunction compareCteQueueRows(\n left: SqlValue[],\n right: SqlValue[],\n columns: string[],\n order: OrderByItem[],\n env: ExecutionEnv,\n parent?: EvalContext,\n): number {\n const scope = (values: SqlValue[]): ScopeRow => ({\n cells: columns.map((name, index) => ({ table: null, name, value: values[index] ?? null })),\n });\n const leftScope = scope(left);\n const rightScope = scope(right);\n for (const item of order) {\n if (item.expr.type === \"literal\" && typeof item.expr.value === \"number\" && Number.isInteger(item.expr.value)) {\n const index = item.expr.value - 1;\n const result = compareNullable(left[index] ?? null, right[index] ?? null, item);\n if (result !== 0) return result;\n continue;\n }\n const a = evalExpr(item.expr, env.createEvalContext(leftScope, parent));\n const b = evalExpr(item.expr, env.createEvalContext(rightScope, parent));\n const result = compareNullable(a, b, item, leftScope);\n if (result !== 0) return result;\n }\n return 0;\n}\n\nfunction executeSelectCore(stmt: SelectStmt, env: ExecutionEnv, parent?: EvalContext): ResultSet {\n let scopes: ScopeRow[];\n let skipWhere = false;\n let skipOrder = false;\n if (stmt.from && stmt.where) {\n const indexed = tryIndexedTableRows(stmt.from, stmt.where, env);\n if (indexed) {\n scopes = scopesFromTableRows(indexed.table, indexed.rows, indexed.alias, env, parent);\n skipWhere = whereFullyCovered(stmt.where, indexed.coveredColumns, indexed.alias, indexed.table.name);\n } else {\n scopes = scanFrom(stmt.from, env, parent);\n }\n } else if (stmt.from && stmt.orderBy.length === 1 && stmt.orderBy[0]) {\n const canUseIndexedOrderScan =\n stmt.groupBy.length === 0 &&\n stmt.having === null &&\n !stmt.distinct &&\n !stmt.columns.some((column) => column.type === \"expr\" && containsAggregate(column.expr));\n let take: number | undefined;\n if (canUseIndexedOrderScan && stmt.limit) {\n const ctx = env.createEvalContext(null, parent);\n const limitValue = toInteger(evalExpr(stmt.limit.limit, ctx));\n const offsetValue = stmt.limit.offset ? toInteger(evalExpr(stmt.limit.offset, ctx)) : 0;\n if (limitValue !== null && offsetValue !== null) {\n const offset = Math.max(0, Number(offsetValue));\n const limit = Number(limitValue);\n take = limit < 0 ? undefined : offset + limit;\n }\n }\n if (canUseIndexedOrderScan) {\n const ordered = tryIndexedOrder(\n stmt.from,\n { expr: stmt.orderBy[0].expr, dir: stmt.orderBy[0].dir ?? \"ASC\" },\n env,\n take,\n );\n if (ordered) {\n scopes = scopesFromTableRows(ordered.table, ordered.rows, ordered.alias, env, parent);\n skipOrder = true;\n } else scopes = scanFrom(stmt.from, env, parent);\n } else scopes = scanFrom(stmt.from, env, parent);\n } else {\n scopes = stmt.from ? scanFrom(stmt.from, env, parent) : [{ cells: [] }];\n }\n const canStopEarly =\n stmt.orderBy.length === 0 &&\n !stmt.distinct &&\n stmt.groupBy.length === 0 &&\n stmt.having === null &&\n Number.isFinite(env.maxRows);\n const aggregate =\n stmt.groupBy.length > 0 ||\n stmt.columns.some((column) => column.type === \"expr\" && containsAggregate(column.expr)) ||\n (stmt.having !== null && containsAggregate(stmt.having));\n if (stmt.where && !skipWhere) {\n if (canStopEarly && !aggregate) {\n const filtered: ScopeRow[] = [];\n for (const scope of scopes) {\n if (isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope, parent))) !== true) continue;\n filtered.push(scope);\n if (filtered.length >= env.maxRows) break;\n }\n scopes = filtered;\n } else {\n scopes = scopes.filter(\n (scope) => isTruthySql(evalExpr(stmt.where!, env.createEvalContext(scope, parent))) === true,\n );\n }\n }\n const groupBy = stmt.groupBy.map((expr) => {\n if (expr.type === \"literal\" && typeof expr.value === \"number\" && Number.isInteger(expr.value)) {\n const column = stmt.columns[expr.value - 1];\n if (column?.type !== \"expr\") throw new SqliteError(`${expr.value}th GROUP BY term out of range`, \"other\");\n return column.expr;\n }\n if (expr.type === \"column\" && expr.table === null) {\n const column = stmt.columns.find(\n (candidate) => candidate.type === \"expr\" && candidate.alias?.toLowerCase() === expr.name.toLowerCase(),\n );\n if (column?.type === \"expr\") return column.expr;\n }\n return expr;\n });\n const groups = aggregate ? groupRows(scopes, groupBy, env, parent) : scopes.map((scope) => [scope]);\n const windowScopes = aggregate ? groups.map((group) => group[0] ?? { cells: [] }) : scopes;\n const sample = scopes[0] ?? (stmt.from ? { cells: shapeOf(stmt.from, env) } : undefined);\n if (scopes.length === 0 && sample) validateProjectedColumns(stmt, sample, env, parent);\n const columns = resultColumnNames(stmt.columns, sample);\n let output: OutputRow[] = [];\n\n for (const group of groups) {\n const scope = group[0] ?? { cells: [] };\n const ctx = env.createEvalContext(scope, parent);\n const values: SqlValue[] = [];\n for (const column of stmt.columns) {\n if (column.type === \"star\") {\n for (const cell of scope.cells) {\n if (\n (column.table !== null || !cell.hiddenByUsing) &&\n (column.table === null || cell.table?.toLowerCase() === column.table.toLowerCase())\n )\n values.push(cell.value);\n }\n } else {\n values.push(evalGrouped(column.expr, ctx, group, env, parent, stmt.windows, windowScopes));\n }\n }\n if (stmt.having) {\n const aliases = new Map<string, SqlValue>();\n stmt.columns.forEach((column, index) => {\n if (column.type === \"expr\" && column.alias) aliases.set(column.alias.toLowerCase(), values[index] ?? null);\n });\n const havingCtx: EvalContext = {\n ...ctx,\n resolveColumn: (table, name) => {\n if (table === null && aliases.has(name.toLowerCase())) return aliases.get(name.toLowerCase()) ?? null;\n return ctx.resolveColumn(table, name);\n },\n };\n if (isTruthySql(evalGrouped(stmt.having, havingCtx, group, env, parent, stmt.windows, windowScopes)) !== true)\n continue;\n }\n output.push({ values, scope });\n if (canStopEarly && !aggregate && !stmt.limit && output.length >= env.maxRows) break;\n }\n\n // SQLite emits grouped rows sorted by GROUP BY keys (ASC) even without ORDER BY.\n if (stmt.groupBy.length > 0 && stmt.orderBy.length === 0 && !skipOrder) {\n const groupOrder = groupBy.map((expr) => ({ expr, dir: \"ASC\" as const, nulls: null }));\n output.sort((left, right) => compareOutput(left, right, groupOrder, columns, env, parent, stmt.columns));\n }\n\n if (stmt.distinct) {\n const seen = new Set<string>();\n output = output.filter((row) => {\n const key = valueKey(row.values);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n }\n if (stmt.orderBy.length > 0 && !skipOrder) {\n const groupOrder =\n stmt.groupBy.length > 0\n ? groupBy.map((expr) => ({ expr, dir: \"ASC\" as const, nulls: null as OrderByItem[\"nulls\"] }))\n : [];\n output.sort((left, right) => {\n const primary = compareOutput(left, right, stmt.orderBy, columns, env, parent, stmt.columns);\n if (primary !== 0 || groupOrder.length === 0) return primary;\n return compareOutput(left, right, groupOrder, columns, env, parent, stmt.columns);\n });\n }\n if (stmt.limit) {\n const ctx = env.createEvalContext(null, parent);\n const limitValue = toInteger(evalExpr(stmt.limit.limit, ctx));\n const offsetValue = stmt.limit.offset ? toInteger(evalExpr(stmt.limit.offset, ctx)) : 0;\n if (limitValue === null || offsetValue === null) throw new SqliteError(\"datatype mismatch\", \"datatype_mismatch\");\n const offset = Math.max(0, Number(offsetValue));\n const limit = Number(limitValue);\n output = output.slice(offset, limit < 0 ? undefined : offset + limit);\n }\n if (Number.isFinite(env.maxRows) && output.length > env.maxRows) output = output.slice(0, env.maxRows);\n return valuesToResult(\n columns,\n output.map((row) => row.values),\n 0,\n env.state.lastInsertRowid,\n {\n named: env.includeNamedRows,\n keepValues: true,\n },\n );\n}\n\nexport function scanFrom(item: FromItem, env: ExecutionEnv, parent?: EvalContext): ScopeRow[] {\n if (item.type === \"join\") {\n const left = scanFrom(item.left, env, parent);\n\n // Correlated table-valued functions (e.g. json_each(t.data)) are evaluated per left row.\n if (item.right.type === \"table_func\") {\n const result: ScopeRow[] = [];\n const rightShape = shapeOf(item.right, env);\n const nullRight = rightShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n for (const lhs of left) {\n const tvf = evaluateTableFunction(item.right.name, item.right.args, item.right.alias, env, lhs, parent);\n if (tvf.rows.length === 0) {\n if (item.joinType === \"LEFT\" || item.joinType === \"FULL\") {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n continue;\n }\n for (const rhs of tvf.rows) {\n const joined = { cells: [...lhs.cells, ...rhs.cells] };\n if (item.on) {\n if (isTruthySql(evalExpr(item.on, env.createEvalContext(joined, parent))) !== true) continue;\n }\n result.push(joined);\n }\n }\n return result;\n }\n\n const probe =\n !item.using && item.joinType !== \"RIGHT\" && item.joinType !== \"FULL\"\n ? tryJoinProbe(item.right, item.on, env)\n : null;\n if (probe) {\n const rightShape = shapeOf(item.right, env);\n const nullRight = rightShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n const result: ScopeRow[] = [];\n for (const lhs of left) {\n const raw = probe.lookup((tableName, name) => {\n const key = name.toLowerCase();\n const match = lhs.cells.find(\n (cell) =>\n (cell.nameLower ?? cell.name.toLowerCase()) === key &&\n (tableName === null || (cell.tableLower ?? cell.table?.toLowerCase()) === tableName.toLowerCase()),\n );\n return match?.value ?? null;\n });\n const rhsScopes = scopesFromTableRows(probe.table, raw, probe.alias, env, parent);\n let matched = false;\n for (const rhs of rhsScopes) {\n const joined = { cells: [...lhs.cells, ...rhs.cells] };\n if (\n item.on &&\n !probe.covering &&\n isTruthySql(evalExpr(item.on, env.createEvalContext(joined, parent))) !== true\n )\n continue;\n matched = true;\n result.push(joined);\n }\n if (!matched && (item.joinType === \"LEFT\" || item.joinType === \"FULL\")) {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n }\n return result;\n }\n\n // Hash-join fallback for unindexed equality INNER/LEFT joins (NULL keys never match).\n const hashKeys =\n !item.using && item.joinType !== \"RIGHT\" && item.joinType !== \"FULL\"\n ? tryJoinEqualityKeys(item.right, item.on, env)\n : null;\n if (hashKeys) {\n const rawRight = rawJoinTable(item.right, env);\n if (rawRight) {\n return hashJoinRaw(left, rawRight, hashKeys, item);\n }\n const right = scanFrom(item.right, env, parent);\n const rightShape = (right[0]?.cells ?? shapeOf(item.right, env)).map((cell) => cell);\n const nullRight = rightShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n const buckets = new Map<string, ScopeRow[]>();\n for (const rhs of right) {\n const values = hashKeys.rightColumns.map((name) => {\n const key = name.toLowerCase();\n const cell = rhs.cells.find((c) => (c.nameLower ?? c.name.toLowerCase()) === key);\n return normalizeForCollation(cell?.value ?? null, \"BINARY\");\n });\n const mapKey = serializeIndexKey(values);\n if (mapKey === null) continue; // NULL join key \u2192 never matches via =\n const bucket = buckets.get(mapKey);\n if (bucket) bucket.push(rhs);\n else buckets.set(mapKey, [rhs]);\n }\n const result: ScopeRow[] = [];\n for (const lhs of left) {\n const values = hashKeys.leftKeys.map((key) => {\n const cell = lhs.cells.find(\n (c) =>\n (c.nameLower ?? c.name.toLowerCase()) === key.column.toLowerCase() &&\n (key.table === null || (c.tableLower ?? c.table?.toLowerCase()) === key.table.toLowerCase()),\n );\n return normalizeForCollation(cell?.value ?? null, \"BINARY\");\n });\n const mapKey = serializeIndexKey(values);\n let matched = false;\n if (mapKey !== null) {\n const matches = buckets.get(mapKey);\n if (matches) {\n for (const rhs of matches) {\n const joined = { cells: [...lhs.cells, ...rhs.cells] };\n matched = true;\n result.push(joined);\n }\n }\n }\n if (!matched && (item.joinType === \"LEFT\" || item.joinType === \"FULL\")) {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n }\n return result;\n }\n\n const right = scanFrom(item.right, env, parent);\n const using = resolveUsingColumns(item, left, right, env);\n const leftShape = left[0]?.cells ?? shapeOf(item.left, env);\n const rightShape = (right[0]?.cells ?? shapeOf(item.right, env)).map((cell) =>\n using?.some((name) => name.toLowerCase() === cell.name.toLowerCase()) ? { ...cell, hiddenByUsing: true } : cell,\n );\n const nullLeft = leftShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n const nullRight = rightShape.map((cell) => ({ ...cell, value: null as SqlValue }));\n const result: ScopeRow[] = [];\n const matchedRight = new Set<number>();\n\n const joinOk = (lhs: ScopeRow, rhs: ScopeRow, joined: ScopeRow): boolean => {\n if (using) {\n return using.every((name) => {\n const l = lhs.cells.find((cell) => cell.name.toLowerCase() === name.toLowerCase())?.value ?? null;\n const r = rhs.cells.find((cell) => cell.name.toLowerCase() === name.toLowerCase())?.value ?? null;\n return l !== null && r !== null && sqlValueEquals(l, r);\n });\n }\n if (item.on) return isTruthySql(evalExpr(item.on, env.createEvalContext(joined, parent))) === true;\n return true;\n };\n\n for (const lhs of left) {\n let matched = false;\n right.forEach((rhs, rightIndex) => {\n const rightCells = using\n ? rhs.cells.map((cell) =>\n using.some((name) => name.toLowerCase() === cell.name.toLowerCase())\n ? { ...cell, hiddenByUsing: true }\n : cell,\n )\n : rhs.cells;\n const joined = { cells: [...lhs.cells, ...rightCells] };\n if (!joinOk(lhs, rhs, joined)) return;\n matched = true;\n matchedRight.add(rightIndex);\n result.push(joined);\n });\n if (!matched && (item.joinType === \"LEFT\" || item.joinType === \"FULL\")) {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n }\n\n if (item.joinType === \"RIGHT\" || item.joinType === \"FULL\") {\n right.forEach((rhs, rightIndex) => {\n if (matchedRight.has(rightIndex)) return;\n if (using) {\n // USING/NATURAL: unmatched right rows expose right values for shared columns.\n const leftCells = nullLeft.map((cell) => {\n const shared = using.some((name) => name.toLowerCase() === cell.name.toLowerCase());\n if (!shared) return cell;\n const fromRight = rhs.cells.find((c) => c.name.toLowerCase() === cell.name.toLowerCase());\n return { ...cell, value: fromRight?.value ?? null, hiddenByUsing: false };\n });\n const rightOnly = rhs.cells.filter(\n (cell) => !using.some((name) => name.toLowerCase() === cell.name.toLowerCase()),\n );\n result.push({ cells: [...leftCells, ...rightOnly] });\n } else {\n result.push({ cells: [...nullLeft, ...rhs.cells] });\n }\n });\n }\n\n return result;\n }\n if (item.type === \"subquery\") {\n const result = executeSelect(item.select, env, parent);\n return resultValues(result).map((values) => ({\n cells: result.columns.map((name, index) => ({ table: item.alias, name, value: values[index] ?? null })),\n }));\n }\n if (item.type === \"table_func\") {\n return evaluateTableFunction(item.name, item.args, item.alias, env).rows;\n }\n\n // Eponymous pragma_* virtual tables may be referenced without parentheses.\n if (item.type === \"table\" && isPragmaTvfName(item.name) && hasTableValuedFunction(item.name.toLowerCase())) {\n return evaluateTableFunction(item.name, [], item.alias, env, null, parent).rows;\n }\n\n const alias = item.alias ?? item.name;\n const qualified = item.schema ? `${item.schema}.${item.name}` : item.name;\n const db = env.state.databaseForSchema(item.schema, qualified);\n const cte = env.ctes.get(item.name.toLowerCase());\n if (cte) {\n return resultValues(cte).map((values) => ({\n cells: cte.columns.map((name, index) => ({ table: alias, name, value: values[index] ?? null })),\n }));\n }\n const view = db.views.get(item.name.toLowerCase());\n if (view) {\n const result = executeSelect(view.select, env, parent);\n const names = view.columns ?? result.columns;\n return resultValues(result).map((values) => ({\n cells: names.map((name, index) => ({ table: alias, name, value: values[index] ?? null })),\n }));\n }\n const virtual = db.virtualTables.get(item.name.toLowerCase());\n if (virtual) {\n if (virtual.kind === \"fts5\" || virtual.kind === \"fts3\" || virtual.kind === \"fts4\") {\n return virtual.scan().map((row) => ({\n rowid: row.rowid,\n rowidName: \"rowid\",\n sourceTable: virtual.name,\n cells: virtual.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n }));\n }\n if (virtual.kind === \"rtree\") {\n return virtual.scan().map((row) => ({\n rowid: row.rowid,\n rowidName: \"rowid\",\n sourceTable: virtual.name,\n cells: virtual.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n }));\n }\n if (virtual.kind === \"dbstat\") {\n return scanDbStat(db, alias, virtual.schemaArg);\n }\n if (virtual.kind === \"fts5vocab\") {\n return scanFtsVocab(db, alias, virtual);\n }\n // bytecode / tables_used: empty by default\n return [];\n }\n let table: Table;\n if (item.name.toLowerCase() === \"sqlite_schema\") table = buildSqliteSchema(db);\n else if (item.name.toLowerCase() === \"sqlite_master\") table = buildSqliteMaster(db);\n else table = db.getTable(item.name);\n return scopesFromTableRows(table, table.scan(), alias, env, parent);\n}\n\nfunction rawJoinTable(item: FromItem, env: ExecutionEnv): { table: Table; alias: string } | null {\n if (item.type !== \"table\") return null;\n const nameKey = item.name.toLowerCase();\n if (nameKey === \"sqlite_schema\" || nameKey === \"sqlite_master\") return null;\n if (env.ctes.has(nameKey)) return null;\n const db = env.state.databaseForSchema(item.schema, item.schema ? `${item.schema}.${item.name}` : item.name);\n if (db.virtualTables.has(nameKey) || db.views.has(nameKey)) return null;\n try {\n return { table: db.getTable(item.name), alias: item.alias ?? item.name };\n } catch {\n return null;\n }\n}\n\nfunction hashJoinRaw(\n left: ScopeRow[],\n right: { table: Table; alias: string },\n hashKeys: { rightColumns: string[]; leftKeys: { table: string | null; column: string }[] },\n item: Extract<FromItem, { type: \"join\" }>,\n): ScopeRow[] {\n const rightKeys = hashKeys.rightColumns.map((name) => name.toLowerCase());\n const buckets = new Map<string, Row[]>();\n const source = right.table.withoutRowid ? right.table.clusteredRows.values() : right.table.rows.values();\n for (const row of source) {\n const values = rightKeys.map((key) => normalizeForCollation(right.table.cell(row, key), \"BINARY\"));\n const mapKey = serializeIndexKey(values);\n if (mapKey === null) continue;\n const bucket = buckets.get(mapKey);\n if (bucket) bucket.push(row);\n else buckets.set(mapKey, [row]);\n }\n const nullRight = right.table.columns.map((column) =>\n makeCell(right.alias, column.name, null, { affinity: column.affinity, collate: column.collate }),\n );\n const result: ScopeRow[] = [];\n for (const lhs of left) {\n const values = hashKeys.leftKeys.map((key) => {\n const want = key.column.toLowerCase();\n const tableKey = key.table?.toLowerCase();\n const cell = lhs.cells.find(\n (c) =>\n (c.nameLower ?? c.name.toLowerCase()) === want &&\n (tableKey === undefined || (c.tableLower ?? c.table?.toLowerCase()) === tableKey),\n );\n return normalizeForCollation(cell?.value ?? null, \"BINARY\");\n });\n const mapKey = serializeIndexKey(values);\n let matched = false;\n if (mapKey !== null) {\n const matches = buckets.get(mapKey);\n if (matches) {\n for (const row of matches) {\n const rhsCells = right.table.columns.map((column) =>\n makeCell(right.alias, column.name, right.table.cell(row, column.nameLower ?? column.name.toLowerCase()), {\n affinity: column.affinity,\n collate: column.collate,\n }),\n );\n result.push({ cells: [...lhs.cells, ...rhsCells] });\n matched = true;\n }\n }\n }\n if (!matched && (item.joinType === \"LEFT\" || item.joinType === \"FULL\")) {\n result.push({ cells: [...lhs.cells, ...nullRight] });\n }\n }\n return result;\n}\n\nfunction scopesFromTableRows(\n table: Table,\n rows: Iterable<Row>,\n alias: string,\n env: ExecutionEnv,\n parent?: EvalContext,\n): ScopeRow[] {\n const integerPkAlias = table.integerPkColumn()?.name;\n const result: ScopeRow[] = [];\n for (const row of rows) {\n const baseCells = table.columns\n .filter((c) => !c.generated || c.generated.stored)\n .map((column) =>\n makeCell(alias, column.name, table.cell(row, column.nameLower ?? column.name.toLowerCase()), {\n affinity: column.affinity,\n collate: column.collate,\n }),\n );\n const cells = table.columns.map((column) => {\n if (column.generated && !column.generated.stored) {\n const ctx = env.createEvalContext({ cells: baseCells, sourceTable: table.name }, parent);\n return makeCell(alias, column.name, applyAffinityLocal(evalExpr(column.generated.expr, ctx), column.affinity), {\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n return makeCell(alias, column.name, table.cell(row, column.nameLower ?? column.name.toLowerCase()), {\n affinity: column.affinity,\n collate: column.collate,\n });\n });\n result.push({\n ...(table.withoutRowid ? {} : { rowid: row.rowid }),\n rowidName: integerPkAlias ?? (table.withoutRowid ? undefined : \"rowid\"),\n sourceTable: table.name,\n cells,\n });\n }\n return result;\n}\n\nfunction shapeOf(item: FromItem, env: ExecutionEnv): ScopeRow[\"cells\"] {\n if (item.type === \"join\") {\n const left = shapeOf(item.left, env);\n const right = shapeOf(item.right, env);\n const using = resolveUsingFromShapes(item.using, left, right);\n return [\n ...left,\n ...right.map((cell) =>\n using?.some((name) => name.toLowerCase() === cell.name.toLowerCase()) ? { ...cell, hiddenByUsing: true } : cell,\n ),\n ];\n }\n if (item.type === \"subquery\")\n return resultColumnNames(item.select.columns).map((name) => ({ table: item.alias, name, value: null }));\n if (item.type === \"table_func\") {\n // Do not evaluate args here \u2014 they may be correlated (e.g. pragma_table_info(tl.name)).\n const known = tableValuedColumns(item.name);\n const columns = known ?? evaluateTableFunction(item.name, item.args, item.alias, env).columns;\n return columns.map((name) => ({\n table: item.alias ?? item.name,\n name,\n value: null,\n }));\n }\n if (item.type === \"table\" && isPragmaTvfName(item.name) && hasTableValuedFunction(item.name.toLowerCase())) {\n const columns = tableValuedColumns(item.name) ?? evaluateTableFunction(item.name, [], item.alias, env).columns;\n return columns.map((name) => ({\n table: item.alias ?? item.name,\n name,\n value: null,\n }));\n }\n const alias = item.alias ?? item.name;\n const qualified = item.schema ? `${item.schema}.${item.name}` : item.name;\n const db = env.state.databaseForSchema(item.schema, qualified);\n const cte = env.ctes.get(item.name.toLowerCase());\n if (cte) return cte.columns.map((name) => ({ table: alias, name, value: null }));\n const view = db.views.get(item.name.toLowerCase());\n if (view)\n return (view.columns ?? resultColumnNames(view.select.columns)).map((name) => ({\n table: alias,\n name,\n value: null,\n }));\n const virtual = db.virtualTables.get(item.name.toLowerCase());\n if (virtual) return virtual.columns.map((name) => ({ table: alias, name, value: null }));\n const table =\n item.name.toLowerCase() === \"sqlite_schema\"\n ? buildSqliteSchema(db)\n : item.name.toLowerCase() === \"sqlite_master\"\n ? buildSqliteMaster(db)\n : db.getTable(item.name);\n return table.columns.map((column) => ({ table: alias, name: column.name, value: null, affinity: column.affinity }));\n}\n\n/** NATURAL JOIN uses an empty USING list as a sentinel; resolve shared column names at runtime. */\nfunction resolveUsingColumns(\n item: Extract<FromItem, { type: \"join\" }>,\n left: ScopeRow[],\n right: ScopeRow[],\n env: ExecutionEnv,\n): string[] | null {\n const leftCells = left[0]?.cells ?? shapeOf(item.left, env);\n const rightCells = right[0]?.cells ?? shapeOf(item.right, env);\n return resolveUsingFromShapes(item.using, leftCells, rightCells);\n}\n\nfunction resolveUsingFromShapes(\n using: string[] | null,\n leftCells: ScopeRow[\"cells\"],\n rightCells: ScopeRow[\"cells\"],\n): string[] | null {\n if (using === null) return null;\n if (using.length > 0) return using;\n const rightNames = new Set(rightCells.map((cell) => cell.name.toLowerCase()));\n const common: string[] = [];\n const seen = new Set<string>();\n for (const cell of leftCells) {\n const key = cell.name.toLowerCase();\n if (rightNames.has(key) && !seen.has(key)) {\n seen.add(key);\n common.push(cell.name);\n }\n }\n return common;\n}\n\nfunction groupRows(rows: ScopeRow[], expressions: Expr[], env: ExecutionEnv, parent?: EvalContext): ScopeRow[][] {\n if (expressions.length === 0) return [rows];\n const groups: ScopeRow[][] = [];\n const indexByKey = new Map<string, number>();\n for (const row of rows) {\n const keyValues = expressions.map((expr) => {\n const value = evalExpr(expr, env.createEvalContext(row, parent));\n return expr.type === \"collate\" ? normalizeForCollation(value, expr.collation) : value;\n });\n const key = valueKey(keyValues);\n const index = indexByKey.get(key);\n if (index === undefined) {\n indexByKey.set(key, groups.length);\n groups.push([row]);\n } else groups[index]!.push(row);\n }\n return groups;\n}\n\nfunction evalGrouped(\n expr: Expr,\n ctx: EvalContext,\n group: ScopeRow[],\n env: ExecutionEnv,\n parent: EvalContext | undefined,\n namedWindows: SelectStmt[\"windows\"],\n windowRows: ScopeRow[],\n): SqlValue {\n return evalExpr(\n replaceSpecial(expr, (special) => {\n if (special.type === \"aggregate\") return aggregateValue(special, group, env, parent);\n return windowValue(special, group[0] ?? { cells: [] }, windowRows, env, parent, namedWindows);\n }),\n ctx,\n );\n}\n\nfunction aggregateValue(expr: AggregateExpr, rows: ScopeRow[], env: ExecutionEnv, parent?: EvalContext): SqlValue {\n const accumulator = env.functions.createAggregate(expr.name);\n if (!accumulator) throw new SqliteError(`no such aggregate function: ${expr.name}`, \"other\");\n const seen: SqlValue[][] = [];\n const orderedRows =\n expr.orderBy.length > 0 ? [...rows].sort((a, b) => compareScopes(a, b, expr.orderBy, env, parent)) : rows;\n for (const row of orderedRows) {\n const ctx = env.createEvalContext(row, parent);\n if (expr.filter && isTruthySql(evalExpr(expr.filter, ctx)) !== true) continue;\n const args = expr.args === \"*\" ? [] : expr.args.map((arg) => evalExpr(arg, ctx));\n if (expr.distinct && seen.some((values) => rowsEqual(values, args))) continue;\n seen.push(args);\n accumulator.step(args);\n }\n return accumulator.finalize();\n}\n\nfunction windowValue(\n expr: WindowExpr,\n current: ScopeRow,\n rows: ScopeRow[],\n env: ExecutionEnv,\n parent: EvalContext | undefined,\n namedWindows: SelectStmt[\"windows\"],\n): SqlValue {\n const spec = resolveWindow(expr.window, namedWindows);\n const currentCtx = env.createEvalContext(current, parent);\n const partitionKey = spec.partitionBy.map((item) => evalExpr(item, currentCtx));\n const partition = rows.filter((row) =>\n rowsEqual(\n partitionKey,\n spec.partitionBy.map((item) => evalExpr(item, env.createEvalContext(row, parent))),\n ),\n );\n partition.sort((a, b) => compareScopes(a, b, spec.orderBy, env, parent));\n const index = Math.max(0, partition.indexOf(current));\n const orderKeys = partition.map((row) =>\n spec.orderBy.map((item) => evalExpr(item.expr, env.createEvalContext(row, parent))),\n );\n let defaultFrameEnd = index;\n if (spec.orderBy.length > 0) {\n while (defaultFrameEnd + 1 < partition.length) {\n const next = partition[defaultFrameEnd + 1];\n if (!next || compareScopes(current, next, spec.orderBy, env, parent) !== 0) break;\n defaultFrameEnd++;\n }\n }\n if (expr.func.type === \"aggregate\") {\n const [start, end] = frameBounds(spec, index, partition.length, currentCtx, defaultFrameEnd, orderKeys);\n const framed = frameRows(partition, start, end, index, orderKeys, spec.frame?.exclude ?? null);\n return aggregateValue(expr.func, framed, env, parent);\n }\n const name = expr.func.name.toLowerCase();\n const args = expr.func.args === \"*\" ? [] : expr.func.args;\n const values = partition.map((row) => args.map((arg) => evalExpr(arg, env.createEvalContext(row, parent))));\n if (name === \"row_number\") return index + 1;\n if (name === \"rank\") {\n let first = index;\n while (first > 0 && rowsEqual(orderKeys[first]!, orderKeys[first - 1]!)) first--;\n return first + 1;\n }\n if (name === \"dense_rank\") {\n let rank = 1;\n for (let i = 1; i <= index; i++) if (!rowsEqual(orderKeys[i]!, orderKeys[i - 1]!)) rank++;\n return rank;\n }\n const evaluated = args.map((arg) => evalExpr(arg, currentCtx));\n if (name === \"lag\" || name === \"lead\") {\n const offset = Number(toInteger(evaluated[1] ?? 1) ?? 1);\n const target = name === \"lag\" ? index - offset : index + offset;\n return values[target]?.[0] ?? evaluated[2] ?? null;\n }\n const [start, end] = frameBounds(spec, index, partition.length, currentCtx, defaultFrameEnd, orderKeys);\n const framed = frameRows(partition, start, end, index, orderKeys, spec.frame?.exclude ?? null);\n const framedValues = framed.map((row) => args.map((arg) => evalExpr(arg, env.createEvalContext(row, parent))));\n if (name === \"first_value\") return framedValues[0]?.[0] ?? null;\n if (name === \"last_value\") return framedValues[framedValues.length - 1]?.[0] ?? null;\n if (name === \"nth_value\") {\n const target = Number(toInteger(evaluated[1] ?? null) ?? 0) - 1;\n return target >= 0 && target < framedValues.length ? (framedValues[target]?.[0] ?? null) : null;\n }\n if (name === \"ntile\") {\n const buckets = Math.max(1, Number(toInteger(evaluated[0] ?? 1) ?? 1));\n const n = partition.length;\n const small = Math.floor(n / buckets);\n const large = small + 1;\n const largeCount = n % buckets;\n // First `largeCount` buckets have `large` rows\n let remaining = index;\n for (let b = 1; b <= buckets; b++) {\n const size = b <= largeCount ? large : small;\n if (remaining < size) return b;\n remaining -= size;\n }\n return buckets;\n }\n if (name === \"cume_dist\") {\n if (partition.length === 0) return null;\n let lastPeer = index;\n while (lastPeer + 1 < partition.length && rowsEqual(orderKeys[lastPeer + 1]!, orderKeys[index]!)) {\n lastPeer++;\n }\n return (lastPeer + 1) / partition.length;\n }\n if (name === \"percent_rank\") {\n if (partition.length <= 1) return 0;\n let first = index;\n while (first > 0 && rowsEqual(orderKeys[first]!, orderKeys[first - 1]!)) first--;\n return first / (partition.length - 1);\n }\n throw new SqliteError(`no such window function: ${expr.func.name}`, \"other\");\n}\n\nfunction resolveWindow(spec: WindowSpec, namedWindows: SelectStmt[\"windows\"], seen = new Set<string>()): WindowSpec {\n if (!spec.ref) return spec;\n const key = spec.ref.toLowerCase();\n if (seen.has(key)) throw new SqliteError(`circular window definition: ${spec.ref}`, \"other\");\n const named = namedWindows.find((item) => item.name.toLowerCase() === key);\n if (!named) throw new SqliteError(`no such window: ${spec.ref}`, \"other\");\n seen.add(key);\n const base = resolveWindow(named.spec, namedWindows, seen);\n return {\n partitionBy: spec.partitionBy.length ? spec.partitionBy : base.partitionBy,\n orderBy: spec.orderBy.length ? spec.orderBy : base.orderBy,\n frame: spec.frame ?? base.frame,\n ref: null,\n };\n}\n\nfunction frameBounds(\n spec: WindowSpec,\n index: number,\n length: number,\n ctx: EvalContext,\n defaultFrameEnd: number,\n orderKeys: SqlValue[][],\n): [number, number] {\n if (!spec.frame) return [0, spec.orderBy.length > 0 ? defaultFrameEnd : Math.max(0, length - 1)];\n const isRangeLike = spec.frame.type === \"RANGE\" || spec.frame.type === \"GROUPS\";\n let peerFirst = index;\n let peerLast = index;\n if (isRangeLike && spec.orderBy.length > 0) {\n while (peerFirst > 0 && rowsEqual(orderKeys[peerFirst]!, orderKeys[peerFirst - 1]!)) peerFirst--;\n while (peerLast + 1 < length && rowsEqual(orderKeys[peerLast]!, orderKeys[peerLast + 1]!)) peerLast++;\n }\n const bound = (\n item: WindowSpec[\"frame\"] extends infer _ ? NonNullable<WindowSpec[\"frame\"]>[\"start\"] : never,\n isStart: boolean,\n ): number => {\n switch (item.kind) {\n case \"unbounded_preceding\":\n return 0;\n case \"unbounded_following\":\n return Math.max(0, length - 1);\n case \"current_row\":\n if (isRangeLike) return isStart ? peerFirst : peerLast;\n return index;\n case \"preceding\":\n case \"following\": {\n const offset = Number(evalExpr(item.expr, ctx));\n if (spec.frame?.type === \"GROUPS\") {\n const groups: Array<{ first: number; last: number }> = [];\n for (let i = 0; i < length; ) {\n let last = i;\n while (last + 1 < length && rowsEqual(orderKeys[last]!, orderKeys[last + 1]!)) last++;\n groups.push({ first: i, last });\n i = last + 1;\n }\n const currentGroup = groups.findIndex((group) => index >= group.first && index <= group.last);\n const delta = item.kind === \"preceding\" ? -offset : offset;\n const target = groups[Math.max(0, Math.min(groups.length - 1, currentGroup + delta))]!;\n return isStart ? target.first : target.last;\n }\n if (spec.frame?.type === \"RANGE\" && spec.orderBy.length === 1) {\n const rawCurrent = orderKeys[index]?.[0];\n const current =\n typeof rawCurrent === \"number\"\n ? rawCurrent\n : typeof rawCurrent === \"bigint\"\n ? Number(rawCurrent)\n : rawCurrent && typeof rawCurrent === \"object\" && \"value\" in rawCurrent\n ? Number(rawCurrent.value)\n : Number.NaN;\n if (!Number.isFinite(current) || !Number.isFinite(offset)) return isStart ? peerFirst : peerLast;\n const descending = spec.orderBy[0]?.dir === \"DESC\";\n const signed = item.kind === \"preceding\" ? -offset : offset;\n const target = current + (descending ? -signed : signed);\n const numericKey = (position: number): number => {\n const value = orderKeys[position]?.[0];\n if (typeof value === \"number\") return value;\n if (typeof value === \"bigint\") return Number(value);\n if (value && typeof value === \"object\" && \"value\" in value) return Number(value.value);\n return Number.NaN;\n };\n if (isStart) {\n for (let i = 0; i < length; i++) {\n const value = numericKey(i);\n if ((descending && value <= target) || (!descending && value >= target)) return i;\n }\n return length;\n }\n for (let i = length - 1; i >= 0; i--) {\n const value = numericKey(i);\n if ((descending && value >= target) || (!descending && value <= target)) return i;\n }\n return -1;\n }\n const rowOffset = Number(toInteger(evalExpr(item.expr, ctx)) ?? 0);\n return item.kind === \"preceding\"\n ? Math.max(0, index - rowOffset)\n : Math.min(Math.max(0, length - 1), index + rowOffset);\n }\n }\n };\n return [bound(spec.frame.start, true), bound(spec.frame.end, false)];\n}\n\nfunction frameRows(\n partition: ScopeRow[],\n start: number,\n end: number,\n index: number,\n orderKeys: SqlValue[][],\n exclude: \"no_others\" | \"current_row\" | \"group\" | \"ties\" | null,\n): ScopeRow[] {\n let peerFirst = index;\n let peerLast = index;\n while (peerFirst > 0 && rowsEqual(orderKeys[peerFirst]!, orderKeys[peerFirst - 1]!)) peerFirst--;\n while (peerLast + 1 < partition.length && rowsEqual(orderKeys[peerLast]!, orderKeys[peerLast + 1]!)) peerLast++;\n const rows: ScopeRow[] = [];\n for (let i = Math.max(0, start); i <= end && i < partition.length; i++) {\n if (exclude === \"current_row\" && i === index) continue;\n if (exclude === \"group\" && i >= peerFirst && i <= peerLast) continue;\n if (exclude === \"ties\" && i >= peerFirst && i <= peerLast && i !== index) continue;\n rows.push(partition[i]!);\n }\n return rows;\n}\n\nfunction compareScopes(\n a: ScopeRow,\n b: ScopeRow,\n order: OrderByItem[],\n env: ExecutionEnv,\n parent?: EvalContext,\n): number {\n for (const item of order) {\n const left = evalExpr(item.expr, env.createEvalContext(a, parent));\n const right = evalExpr(item.expr, env.createEvalContext(b, parent));\n const result = compareNullable(left, right, item, a);\n if (result !== 0) return result;\n }\n return 0;\n}\n\nfunction compareOutput(\n a: OutputRow,\n b: OutputRow,\n order: OrderByItem[],\n columns: string[],\n env: ExecutionEnv,\n parent?: EvalContext,\n resultColumns?: ResultColumn[],\n): number {\n for (const item of order) {\n const value = (row: OutputRow): SqlValue => {\n if (item.expr.type === \"literal\" && typeof item.expr.value === \"number\" && Number.isInteger(item.expr.value)) {\n return row.values[item.expr.value - 1] ?? null;\n }\n if (item.expr.type === \"column\" && item.expr.table === null) {\n const requestedName = item.expr.name.toLowerCase();\n const index = columns.findIndex((name) => name.toLowerCase() === requestedName);\n if (index >= 0) return row.values[index] ?? null;\n }\n return evalExpr(item.expr, env.createEvalContext(row.scope, parent));\n };\n const result = compareNullable(value(a), value(b), item, a.scope, columns, resultColumns);\n if (result !== 0) return result;\n }\n return 0;\n}\n\nfunction collationForOrderItem(\n item: OrderByItem,\n resultColumns: ResultColumn[],\n columnNames: string[],\n scope?: ScopeRow,\n): string | null {\n if (item.expr.type === \"collate\") return item.expr.collation;\n if (item.expr.type === \"literal\" && typeof item.expr.value === \"number\" && Number.isInteger(item.expr.value)) {\n const column = resultColumns[item.expr.value - 1];\n if (column?.type === \"expr\") return explicitCollation(column.expr);\n }\n if (item.expr.type === \"column\" && item.expr.table === null) {\n const key = item.expr.name.toLowerCase();\n const byAlias = resultColumns.find((column) => column.type === \"expr\" && column.alias?.toLowerCase() === key);\n if (byAlias?.type === \"expr\") return explicitCollation(byAlias.expr);\n const index = columnNames.findIndex((name) => name.toLowerCase() === key);\n if (index >= 0) {\n const column = resultColumns[index];\n if (column?.type === \"expr\") return explicitCollation(column.expr);\n }\n }\n if (scope && item.expr.type === \"column\") {\n const key = item.expr.name.toLowerCase();\n const match = scope.cells.find(\n (cell) =>\n cell.name.toLowerCase() === key &&\n item.expr.type === \"column\" &&\n (item.expr.table === null || cell.table?.toLowerCase() === item.expr.table.toLowerCase()),\n );\n if (match?.collate) return match.collate;\n }\n return null;\n}\n\nfunction compareNullable(\n left: SqlValue,\n right: SqlValue,\n item: OrderByItem,\n scope?: ScopeRow,\n columnNames?: string[],\n resultColumns?: ResultColumn[],\n): number {\n if (left === null || right === null) {\n if (left === right) return 0;\n const nullFirst = item.nulls ? item.nulls === \"FIRST\" : item.dir === \"ASC\";\n return (left === null ? -1 : 1) * (nullFirst ? 1 : -1);\n }\n const collation =\n resultColumns && columnNames\n ? collationForOrderItem(item, resultColumns, columnNames, scope)\n : scope && item.expr.type === \"column\"\n ? (() => {\n const key = item.expr.name.toLowerCase();\n const match = scope.cells.find(\n (cell) =>\n cell.name.toLowerCase() === key &&\n item.expr.type === \"column\" &&\n (item.expr.table === null || cell.table?.toLowerCase() === item.expr.table.toLowerCase()),\n );\n return match?.collate ?? null;\n })()\n : item.expr.type === \"collate\"\n ? item.expr.collation\n : null;\n const comparison = collation ? compareWithCollation(left, right, collation) : compareSql(left, right);\n return (comparison ?? 0) * (item.dir === \"DESC\" ? -1 : 1);\n}\n\nfunction resultColumnNames(columns: ResultColumn[], sample?: ScopeRow): string[] {\n const names: string[] = [];\n for (const column of columns) {\n if (column.type === \"star\") {\n for (const cell of sample?.cells ?? []) {\n if (\n (column.table !== null || !cell.hiddenByUsing) &&\n (column.table === null || cell.table?.toLowerCase() === column.table.toLowerCase())\n )\n names.push(cell.name);\n }\n } else if (\n !column.alias &&\n column.expr.type === \"column\" &&\n [\"rowid\", \"_rowid_\", \"oid\"].includes(column.expr.name.toLowerCase()) &&\n sample?.rowidName\n ) {\n names.push(sample.rowidName);\n } else names.push(column.alias ?? expressionName(column.expr));\n }\n return names;\n}\n\nfunction compareCompoundRows(left: SqlValue[], right: SqlValue[], order: OrderByItem[], columns: string[]): number {\n for (const item of order) {\n let index = -1;\n if (item.expr.type === \"literal\" && typeof item.expr.value === \"number\" && Number.isInteger(item.expr.value)) {\n index = item.expr.value - 1;\n } else if (item.expr.type === \"column\" && item.expr.table === null) {\n const requested = item.expr.name.toLowerCase();\n index = columns.findIndex((name) => name.toLowerCase() === requested);\n }\n if (index < 0) throw new SqliteError(\"ORDER BY term does not match any column in the result set\", \"other\");\n const result = compareNullable(left[index] ?? null, right[index] ?? null, item);\n if (result !== 0) return result;\n }\n return 0;\n}\n\nfunction validateProjectedColumns(stmt: SelectStmt, sample: ScopeRow, env: ExecutionEnv, parent?: EvalContext): void {\n const ctx = env.createEvalContext({ ...sample, rowid: 1, rowidName: sample.rowidName }, parent);\n const visit = (expr: Expr): void => {\n if (expr.type === \"column\") {\n if (expr.name !== \"*\") ctx.resolveColumn(expr.table, expr.name);\n return;\n }\n const recurse = (item: Expr) => visit(item);\n switch (expr.type) {\n case \"unary\":\n recurse(expr.expr);\n break;\n case \"is_bool\":\n recurse(expr.expr);\n break;\n case \"binary\":\n recurse(expr.left);\n recurse(expr.right);\n break;\n case \"between\":\n recurse(expr.expr);\n recurse(expr.lower);\n recurse(expr.upper);\n break;\n case \"in\":\n recurse(expr.expr);\n if (Array.isArray(expr.values)) expr.values.forEach(recurse);\n break;\n case \"like\":\n recurse(expr.expr);\n recurse(expr.pattern);\n if (expr.escape) recurse(expr.escape);\n break;\n case \"function\":\n case \"aggregate\":\n if (expr.args !== \"*\") expr.args.forEach(recurse);\n if (expr.filter) recurse(expr.filter);\n break;\n case \"window\":\n if (expr.func.args !== \"*\") expr.func.args.forEach(recurse);\n break;\n case \"case\":\n if (expr.base) recurse(expr.base);\n expr.whens.forEach((branch) => {\n recurse(branch.when);\n recurse(branch.then);\n });\n if (expr.else) recurse(expr.else);\n break;\n case \"cast\":\n case \"collate\":\n recurse(expr.expr);\n break;\n case \"row\":\n expr.values.forEach(recurse);\n break;\n }\n };\n for (const column of stmt.columns) if (column.type === \"expr\") visit(column.expr);\n}\n\nfunction expressionName(expr: Expr): string {\n if (expr.type === \"column\") return expr.name;\n if (expr.type === \"literal\") {\n if (expr.value === null) return \"NULL\";\n if (expr.value instanceof Uint8Array)\n return `X'${Array.from(expr.value)\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase()}'`;\n return typeof expr.value === \"string\" ? `'${expr.value.replaceAll(\"'\", \"''\")}'` : String(expr.value);\n }\n if (expr.type === \"null\") return \"NULL\";\n if (expr.type === \"function\" || expr.type === \"aggregate\") {\n if (expr.args === \"*\") return `${expr.name.toLowerCase()}(*)`;\n const args = expr.args.map((arg) => expressionName(arg)).join(\", \");\n return `${expr.name.toLowerCase()}(${args})`;\n }\n if (expr.type === \"binary\") {\n return `${expressionName(expr.left)} ${expr.op} ${expressionName(expr.right)}`;\n }\n if (expr.type === \"is_bool\") {\n const sense = expr.sense ? \"TRUE\" : \"FALSE\";\n return `${expressionName(expr.expr)} IS${expr.not ? \" NOT\" : \"\"} ${sense}`;\n }\n return expr.type;\n}\n\nfunction replaceSpecial(expr: Expr, evaluate: (expr: AggregateExpr | WindowExpr) => SqlValue): Expr {\n if (expr.type === \"aggregate\" || expr.type === \"window\") return { type: \"literal\", value: evaluate(expr) };\n const recurse = (item: Expr) => replaceSpecial(item, evaluate);\n switch (expr.type) {\n case \"unary\":\n return { ...expr, expr: recurse(expr.expr) };\n case \"is_bool\":\n return { ...expr, expr: recurse(expr.expr) };\n case \"binary\":\n return { ...expr, left: recurse(expr.left), right: recurse(expr.right) };\n case \"between\":\n return { ...expr, expr: recurse(expr.expr), lower: recurse(expr.lower), upper: recurse(expr.upper) };\n case \"in\":\n return {\n ...expr,\n expr: recurse(expr.expr),\n values: Array.isArray(expr.values) ? expr.values.map(recurse) : expr.values,\n };\n case \"like\":\n return {\n ...expr,\n expr: recurse(expr.expr),\n pattern: recurse(expr.pattern),\n escape: expr.escape && recurse(expr.escape),\n };\n case \"function\":\n return {\n ...expr,\n args: expr.args === \"*\" ? \"*\" : expr.args.map(recurse),\n filter: expr.filter && recurse(expr.filter),\n };\n case \"case\":\n return {\n ...expr,\n base: expr.base && recurse(expr.base),\n whens: expr.whens.map(({ when, then: thenExpr }) => {\n // biome-ignore lint/suspicious/noThenProperty: CASE WHEN/THEN AST field, not a thenable\n return { when: recurse(when), then: recurse(thenExpr) };\n }),\n else: expr.else && recurse(expr.else),\n };\n case \"cast\":\n return { ...expr, expr: recurse(expr.expr) };\n case \"row\":\n return { ...expr, values: expr.values.map(recurse) };\n case \"collate\":\n return { ...expr, expr: recurse(expr.expr) };\n default:\n return expr;\n }\n}\n\nfunction containsAggregate(expr: Expr): boolean {\n let found = false;\n replaceSpecial(expr, (special) => {\n if (special.type === \"aggregate\") found = true;\n return null;\n });\n return found;\n}\n\nfunction referencesTable(select: SelectStmt, name: string): boolean {\n const target = name.toLowerCase();\n const visit = (item: FromItem | null): boolean => {\n if (!item) return false;\n if (item.type === \"table\") return item.name.toLowerCase() === target;\n if (item.type === \"join\") return visit(item.left) || visit(item.right);\n return item.type === \"subquery\" ? referencesTable(item.select, name) : false;\n };\n return visit(select.from) || (select.compound ? referencesTable(select.compound.select, name) : false);\n}\n\nfunction rowsEqual(left: SqlValue[], right: SqlValue[]): boolean {\n return (\n left.length === right.length &&\n left.every((value, index) => {\n const other = right[index] ?? null;\n return (value === null && other === null) || (value !== null && other !== null && sqlValueEquals(value, other));\n })\n );\n}\n\nfunction uniqueRows(rows: SqlValue[][]): SqlValue[][] {\n const seen = new Set<string>();\n const result: SqlValue[][] = [];\n for (const row of rows) {\n const key = valueKey(row);\n if (seen.has(key)) continue;\n seen.add(key);\n result.push(row);\n }\n return result;\n}\n\nfunction valueKey(values: SqlValue[]): string {\n return values.map(valueKeyPart).join(\"\\0\");\n}\n\nfunction valueKeyPart(value: SqlValue): string {\n if (value === null) return \"N\";\n if (typeof value === \"bigint\") return `I:${value.toString()}`;\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) return `I:${value.toString()}`;\n if (Number.isNaN(value)) return \"F:nan\";\n return `F:${Object.is(value, -0) ? \"0\" : value.toString()}`;\n }\n if (typeof value === \"string\") return `T:${value}`;\n if (value instanceof Uint8Array) {\n let hex = \"B:\";\n for (const byte of value) hex += byte.toString(16).padStart(2, \"0\");\n return hex;\n }\n if (\"value\" in value && typeof value.value === \"number\") {\n const n = value.value;\n if (Number.isInteger(n)) return `I:${n.toString()}`;\n return `F:${n.toString()}`;\n }\n if (\"value\" in value && typeof value.value === \"string\") return `T:${value.value}`;\n return `T:${String(value)}`;\n}\n\nfunction scanDbStat(db: DatabaseState, alias: string, _schemaArg: string | null): ScopeRow[] {\n const rows: ScopeRow[] = [];\n let pageno = 1;\n const push = (name: string, pagetype: string, ncell: number) => {\n rows.push({\n cells: [\n { table: alias, name: \"name\", value: name },\n { table: alias, name: \"path\", value: \"/\" },\n { table: alias, name: \"pageno\", value: pageno++ },\n { table: alias, name: \"pagetype\", value: pagetype },\n { table: alias, name: \"ncell\", value: ncell },\n { table: alias, name: \"payload\", value: ncell * 8 },\n { table: alias, name: \"unused\", value: 0 },\n { table: alias, name: \"mx_payload\", value: 0 },\n { table: alias, name: \"pgoffset\", value: (pageno - 1) * 4096 },\n { table: alias, name: \"pgsize\", value: 4096 },\n ],\n });\n };\n push(\"sqlite_schema\", \"leaf\", db.tables.size + db.views.size + db.virtualTables.size);\n for (const table of db.tables.values()) {\n push(table.name, \"leaf\", [...table.scan()].length);\n }\n for (const table of db.virtualTables.values()) {\n if (table.kind === \"fts5\" || table.kind === \"fts3\" || table.kind === \"fts4\" || table.kind === \"rtree\") {\n push(table.name, \"leaf\", table.kind === \"rtree\" ? table.rows.size : table.rows.size);\n } else {\n push(table.name, \"leaf\", 0);\n }\n }\n return rows;\n}\n\nfunction scanFtsVocab(db: DatabaseState, alias: string, vocab: FtsVocabVirtualTable): ScopeRow[] {\n const fts = db.virtualTables.get(vocab.ftsTable.toLowerCase());\n if (!fts || (fts.kind !== \"fts5\" && fts.kind !== \"fts3\" && fts.kind !== \"fts4\")) return [];\n return fts.vocabRows(\"row\").map((record) => ({\n cells: vocab.columns.map((column) => ({\n table: alias,\n name: column,\n value: record[column] ?? (column === \"col\" ? \"*\" : column === \"offset\" ? 0 : null),\n })),\n }));\n}\n", "import type {\n AlterTableStmt,\n CreateIndexStmt,\n CreateTableStmt,\n CreateViewStmt,\n DropIndexStmt,\n DropTableStmt,\n DropViewStmt,\n} from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { heapRowCells, rebuildIndexFromTable } from \"../indexes/keys.ts\";\nimport { appendAddColumnToMasterSql, normalizeMasterSql, synthesizeCtasMasterSql } from \"../schema/master-sql.ts\";\nimport { normalizeColumnName } from \"../storage/row.ts\";\nimport { makeColumnInfo } from \"../storage/table.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { emptyResult, type ResultSet, resultValues } from \"./result.ts\";\nimport { executeSelect } from \"./select.ts\";\n\nexport function executeCreateTable(stmt: CreateTableStmt, env: ExecutionEnv): ResultSet {\n const sourceSql = env.statementSql ? normalizeMasterSql(env.statementSql) : null;\n if (!stmt.asSelect) {\n env.state.createTable(stmt, sourceSql);\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n }\n const result = executeSelect(stmt.asSelect, env);\n const columns = result.columns.map((name) => ({ name, typeName: null, constraints: [] }));\n const bareName = stmt.name.includes(\".\") ? (stmt.name.split(\".\").pop() ?? stmt.name) : stmt.name;\n const ctasSql = synthesizeCtasMasterSql(bareName, result.columns);\n const table = env.state.createTable({ ...stmt, columns, constraints: [], asSelect: null }, ctasSql);\n for (const values of resultValues(result)) {\n table.insert(\n new Map(table.columns.map((column, index) => [normalizeColumnName(column.name), values[index] ?? null])),\n );\n }\n // Populate any autoindexes created with the empty table.\n const db = env.state.databaseForTable(table);\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index) continue;\n rebuildIndexFromTable(index, table, (row) =>\n env.createEvalContext({ rowid: row.rowid, sourceTable: table.name, cells: heapRowCells(table, row, env) }),\n );\n }\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeCreateIndex(stmt: CreateIndexStmt, env: ExecutionEnv): ResultSet {\n const index = env.state.createIndex(stmt, env.statementSql ? normalizeMasterSql(env.statementSql) : null);\n const table = env.state.getTable(stmt.table);\n try {\n rebuildIndexFromTable(index, table, (row) =>\n env.createEvalContext({ rowid: row.rowid, sourceTable: table.name, cells: heapRowCells(table, row, env) }),\n );\n } catch (error) {\n env.state.dropIndex(stmt.name, true);\n throw error;\n }\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeAlterTable(stmt: AlterTableStmt, env: ExecutionEnv): ResultSet {\n const table = env.state.getWritableTable(stmt.table);\n const action = stmt.action;\n if (action.kind === \"rename_table\") {\n env.state.renameTable(stmt.table, action.newName);\n } else if (action.kind === \"rename_column\") {\n const column = table.columns.find((item) => item.name.toLowerCase() === action.oldName.toLowerCase());\n if (!column) throw new SqliteError(`no such column: ${action.oldName}`, \"no_such_column\");\n if (table.columns.some((item) => item.name.toLowerCase() === action.newName.toLowerCase()))\n throw new SqliteError(`duplicate column name: ${action.newName}`, \"other\");\n column.name = action.newName;\n column.nameLower = action.newName.toLowerCase();\n table.rebuildColIndex();\n for (const constraint of table.constraints) renameConstraintColumn(constraint, action.oldName, action.newName);\n for (const name of table.indexes) {\n const index = env.state.getWritableIndex(name);\n if (index)\n for (const indexed of index.columns)\n if (indexed.name.toLowerCase() === action.oldName.toLowerCase()) indexed.name = action.newName;\n }\n table.clearEqualityHashes();\n env.state.schemaVersion++;\n } else if (action.kind === \"add_column\") {\n if (table.columns.some((item) => item.name.toLowerCase() === action.column.name.toLowerCase()))\n throw new SqliteError(`duplicate column name: ${action.column.name}`, \"other\");\n const primary = action.column.constraints.some((item) => item.type === \"primary_key\");\n const unique = action.column.constraints.some((item) => item.type === \"unique\");\n if ((primary || unique) && table.rowCount() > 0)\n throw new SqliteError(\"Cannot add a PRIMARY KEY or UNIQUE column\", \"other\");\n const defaultExpr = action.column.constraints.find((item) => item.type === \"default\")?.expr ?? null;\n const collate = action.column.constraints.find((item) => item.type === \"collate\");\n const generated = action.column.constraints.find((item) => item.type === \"generated\");\n const column = makeColumnInfo(action.column.name, action.column.typeName, {\n notNull: action.column.constraints.some((item) => item.type === \"not_null\"),\n primaryKey: primary,\n unique,\n defaultExpr,\n collate: collate?.type === \"collate\" ? collate.name : null,\n generated: generated?.type === \"generated\" ? { expr: generated.expr, stored: generated.stored } : null,\n });\n const defaultValue = defaultExpr ? evalExpr(defaultExpr, env.createEvalContext()) : null;\n if (column.notNull && defaultValue === null && table.rowCount() > 0)\n throw new SqliteError(\"Cannot add a NOT NULL column with default value NULL\", \"other\");\n table.materializeSlab();\n table.columns.push(column);\n table.rebuildColIndex();\n for (const row of table.rows.values()) row.values.push(defaultValue);\n table.originalSql = appendAddColumnToMasterSql(table.originalSql, env.statementSql);\n table.clearEqualityHashes();\n env.state.schemaVersion++;\n } else {\n const index = table.columns.findIndex((item) => item.name.toLowerCase() === action.name.toLowerCase());\n if (index < 0) throw new SqliteError(`no such column: ${action.name}`, \"no_such_column\");\n if (table.columns.length === 1)\n throw new SqliteError(\"cannot drop column: table must have at least one column\", \"other\");\n const column = table.columns[index]!;\n if (column.primaryKey) {\n throw new SqliteError(`cannot drop PRIMARY KEY or UNIQUE column: ${action.name}`, \"other\");\n }\n if (column.unique) {\n throw new SqliteError(`cannot drop UNIQUE column: \"${action.name}\"`, \"other\");\n }\n if (\n table.constraints.some(\n (item) =>\n (item.type === \"primary_key\" || item.type === \"unique\") &&\n item.columns.some((part) => part.name.toLowerCase() === action.name.toLowerCase()),\n )\n ) {\n throw new SqliteError(\n `error in table ${stmt.table} after drop column: no such column: ${action.name}`,\n \"no_such_column\",\n );\n }\n for (const name of table.indexes) {\n const schemaIndex = env.state.indexes.get(name.toLowerCase());\n if (schemaIndex?.columns.some((part) => part.name.toLowerCase() === action.name.toLowerCase())) {\n throw new SqliteError(\n `error in index ${name} after drop column: no such column: ${action.name}`,\n \"no_such_column\",\n );\n }\n }\n table.columns.splice(index, 1);\n table.rebuildColIndex();\n for (const row of table.rows.values()) row.values.splice(index, 1);\n table.clearEqualityHashes();\n env.state.schemaVersion++;\n }\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDropTable(stmt: DropTableStmt, env: ExecutionEnv): ResultSet {\n env.state.dropTable(stmt.name, stmt.ifExists);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDropIndex(stmt: DropIndexStmt, env: ExecutionEnv): ResultSet {\n env.state.dropIndex(stmt.name, stmt.ifExists);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeCreateView(stmt: CreateViewStmt, env: ExecutionEnv): ResultSet {\n env.state.createView(stmt, env.statementSql ? normalizeMasterSql(env.statementSql) : null);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDropView(stmt: DropViewStmt, env: ExecutionEnv): ResultSet {\n env.state.dropView(stmt.name, stmt.ifExists);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nfunction renameConstraintColumn(\n constraint: import(\"../ast/nodes.ts\").TableConstraint,\n oldName: string,\n newName: string,\n): void {\n if (constraint.type === \"primary_key\" || constraint.type === \"unique\") {\n for (const column of constraint.columns)\n if (column.name.toLowerCase() === oldName.toLowerCase()) column.name = newName;\n } else if (constraint.type === \"foreign_key\") {\n constraint.columns = constraint.columns.map((name) =>\n name.toLowerCase() === oldName.toLowerCase() ? newName : name,\n );\n }\n}\n", "import type { Expr } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport type { IndexStore } from \"../indexes/index.ts\";\nimport type { Row, Rowid } from \"../storage/row.ts\";\nimport { normalizeColumnName } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\nimport { isTruthySql } from \"../types/value.ts\";\n\nexport type CheckEvaluator = (expr: Expr, row: Row) => SqlValue;\n\nexport function checkNotNull(table: Table, row: Row): void {\n for (const column of table.columns) {\n if (!column.notNull) continue;\n if (table.cell(row, normalizeColumnName(column.name)) === null) {\n throw new SqliteError(\n `NOT NULL constraint failed: ${table.name}.${column.name}`,\n \"constraint_notnull\",\n \"SQLITE_CONSTRAINT_NOTNULL\",\n );\n }\n }\n}\n\nexport function checkPrimaryKey(table: Table, row: Row): void {\n for (const column of table.columns) {\n if (!column.primaryKey) continue;\n if (table.cell(row, normalizeColumnName(column.name)) === null) {\n throw new SqliteError(\n `PRIMARY KEY constraint failed: ${table.name}.${column.name}`,\n \"constraint_primary\",\n \"SQLITE_CONSTRAINT_PRIMARYKEY\",\n );\n }\n }\n}\n\nexport function checkUnique(index: IndexStore, values: readonly SqlValue[], rowid?: Rowid): void {\n index.checkUnique(values, rowid);\n}\n\nexport function checkExpressions(\n expressions: readonly Expr[],\n row: Row,\n evaluate: CheckEvaluator,\n constraintName = \"CHECK\",\n): void {\n for (const expression of expressions) {\n const result = evaluate(expression, row);\n if (result !== null && isTruthySql(result) === false) {\n throw new SqliteError(\n `CHECK constraint failed: ${constraintName}`,\n \"constraint_check\",\n \"SQLITE_CONSTRAINT_CHECK\",\n );\n }\n }\n}\n\nexport function checkTableConstraints(table: Table, row: Row, evaluate: CheckEvaluator): void {\n checkNotNull(table, row);\n checkPrimaryKey(table, row);\n for (const constraint of table.constraints) {\n if (constraint.type !== \"check\") continue;\n checkExpressions([constraint.expr], row, evaluate, constraint.name ?? table.name);\n }\n}\n", "import type { CreateTriggerStmt, DropTriggerStmt, Statement } from \"../ast/nodes.ts\";\nimport { SqliteError, TriggerRaiseError } from \"../errors/index.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { normalizeMasterSql } from \"../schema/master-sql.ts\";\nimport type { TriggerInfo } from \"../storage/database-state.ts\";\nimport { splitQualifiedName } from \"../storage/database-state.ts\";\nimport type { Row } from \"../storage/row.ts\";\nimport { normalizeColumnName } from \"../storage/row.ts\";\nimport type { Table } from \"../storage/table.ts\";\nimport { isTruthySql, type SqlValue } from \"../types/value.ts\";\nimport type { ExecutionEnv, ScopeRow } from \"./env.ts\";\nimport { executeStatement } from \"./execute.ts\";\nimport { emptyResult, type ResultSet } from \"./result.ts\";\n\nconst MAX_TRIGGER_DEPTH = 1000;\n\nexport function executeCreateTrigger(stmt: CreateTriggerStmt, env: ExecutionEnv): ResultSet {\n const { schema, bare } = splitQualifiedName(stmt.name);\n const target = schema !== null ? env.state.databaseForSchema(schema, stmt.name) : env.state;\n const existing = target.triggers.get(bare.toLowerCase());\n if (existing && stmt.ifNotExists) {\n return emptyResult(0, env.state.lastInsertRowid);\n }\n\n const tableKey = splitQualifiedName(stmt.table).bare.toLowerCase();\n const isView = target.views.has(tableKey);\n const isTable = target.tables.has(tableKey);\n if (stmt.timing === \"INSTEAD\") {\n if (!isView) throw new SqliteError(`cannot create INSTEAD OF trigger on table: ${stmt.table}`, \"other\");\n } else if (isView) {\n throw new SqliteError(`cannot create ${stmt.timing} trigger on view: ${stmt.table}`, \"other\");\n } else if (!isTable) {\n throw new SqliteError(`no such table: ${stmt.table}`, \"no_such_table\");\n }\n\n if (existing) throw new SqliteError(`object already exists: ${bare}`, \"other\");\n\n target.createTrigger({\n name: bare,\n tableName: splitQualifiedName(stmt.table).bare,\n timing: stmt.timing,\n event: stmt.event,\n when: stmt.when,\n forEachRow: stmt.forEachRow,\n body: stmt.body,\n updateColumns: stmt.updateColumns,\n originalSql: env.statementSql ? normalizeMasterSql(env.statementSql) : null,\n });\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeDropTrigger(stmt: DropTriggerStmt, env: ExecutionEnv): ResultSet {\n env.state.dropTrigger(stmt.name, stmt.ifExists);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function fireInsertTriggers(\n timing: \"BEFORE\" | \"AFTER\" | \"INSTEAD\",\n table: Table,\n values: Map<string, SqlValue>,\n oldRow: Row | null,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n return runTriggers(table, \"INSERT\", timing, oldRow, values, null, env);\n}\n\nexport function fireUpdateTriggers(\n timing: \"BEFORE\" | \"AFTER\" | \"INSTEAD\",\n table: Table,\n oldRow: Row,\n newValues: Map<string, SqlValue>,\n updatedColumns: Set<string>,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n return runTriggers(table, \"UPDATE\", timing, oldRow, newValues, updatedColumns, env);\n}\n\nexport function fireDeleteTriggers(\n timing: \"BEFORE\" | \"AFTER\" | \"INSTEAD\",\n table: Table,\n oldRow: Row,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n return runTriggers(table, \"DELETE\", timing, oldRow, null, null, env);\n}\n\nfunction runTriggers(\n table: Table,\n event: TriggerInfo[\"event\"],\n timing: TriggerInfo[\"timing\"],\n oldRow: Row | null,\n newValues: Map<string, SqlValue> | null,\n updatedColumns: Set<string> | null,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n const db = env.state.databaseForTable(table);\n if (db.triggers.size === 0) return \"ok\";\n const triggers = [...db.triggers.values()].filter(\n (trigger) =>\n trigger.tableName.toLowerCase() === table.name.toLowerCase() &&\n trigger.event === event &&\n trigger.timing === timing,\n );\n\n for (const trigger of triggers) {\n if (event === \"UPDATE\" && trigger.updateColumns) {\n const watched = new Set(trigger.updateColumns.map((name) => name.toLowerCase()));\n if (!updatedColumns || ![...updatedColumns].some((name) => watched.has(name.toLowerCase()))) continue;\n }\n if (trigger.when) {\n const scope = triggerScope(table, oldRow, newValues);\n if (isTruthySql(evalExpr(trigger.when, env.createEvalContext(scope))) !== true) continue;\n }\n const result = executeTriggerProgram(trigger, table, oldRow, newValues, env);\n if (result === \"ignore\") return \"ignore\";\n }\n return \"ok\";\n}\n\nfunction executeTriggerProgram(\n trigger: TriggerInfo,\n table: Table,\n oldRow: Row | null,\n newValues: Map<string, SqlValue> | null,\n env: ExecutionEnv,\n): \"ok\" | \"ignore\" {\n if (env.triggerDepth >= MAX_TRIGGER_DEPTH) {\n throw new SqliteError(\"too many levels of trigger recursion\", \"other\");\n }\n env.triggerDepth++;\n const savedScope = env.triggerScope;\n const savedLastInsertRowid = env.state.lastInsertRowid;\n env.triggerScope = triggerScope(table, oldRow, newValues);\n try {\n for (const statement of trigger.body) {\n executeTriggerStatement(statement, env);\n }\n return \"ok\";\n } catch (error) {\n if (error instanceof TriggerRaiseError) {\n if (error.action === \"IGNORE\") return \"ignore\";\n if (error.action === \"ROLLBACK\") {\n env.transactions.rollback();\n throw error;\n }\n throw error;\n }\n throw error;\n } finally {\n env.state.lastInsertRowid = savedLastInsertRowid;\n env.triggerScope = savedScope;\n env.triggerDepth--;\n }\n}\n\nfunction executeTriggerStatement(statement: Statement, env: ExecutionEnv): void {\n executeStatement(statement, env);\n}\n\nfunction triggerScope(table: Table, oldRow: Row | null, newValues: Map<string, SqlValue> | null): ScopeRow {\n const cells: ScopeRow[\"cells\"] = [];\n for (const column of table.columns) {\n const key = normalizeColumnName(column.name);\n cells.push({\n table: \"old\",\n name: column.name,\n value: oldRow ? table.cell(oldRow, key) : null,\n affinity: column.affinity,\n collate: column.collate,\n });\n cells.push({\n table: \"new\",\n name: column.name,\n value: newValues ? (newValues.get(key) ?? null) : null,\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n return {\n cells,\n rowid: oldRow?.rowid ?? undefined,\n sourceTable: table.name,\n };\n}\n", "import type { CreateVirtualTableStmt } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { normalizeMasterSql } from \"../schema/master-sql.ts\";\nimport { normalizeColumnName } from \"../storage/row.ts\";\nimport type { SqlValue } from \"../types/value.ts\";\nimport type { Fts5VirtualTable } from \"../vtable/fts5.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { emptyResult, type ResultSet } from \"./result.ts\";\n\nexport function executeCreateVirtualTable(stmt: CreateVirtualTableStmt, env: ExecutionEnv): ResultSet {\n env.state.createVirtualTable(stmt, env.statementSql ? normalizeMasterSql(env.statementSql) : null);\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nexport function executeFtsInsert(\n table: Fts5VirtualTable,\n columnNames: string[],\n sourceRows: SqlValue[][],\n env: ExecutionEnv,\n): { changes: number; lastInsertRowid: number | bigint } {\n let changes = 0;\n let last = env.state.lastInsertRowid;\n for (const source of sourceRows) {\n if (source.length !== columnNames.length) {\n throw new SqliteError(`${source.length} values for ${columnNames.length} columns`, \"other\");\n }\n const values = new Map<string, SqlValue>();\n let explicitRowid: number | bigint | undefined;\n for (let i = 0; i < columnNames.length; i++) {\n const name = columnNames[i]!;\n const lower = name.toLowerCase();\n const value = source[i] ?? null;\n if (lower === \"rowid\" || lower === \"_rowid_\" || lower === \"oid\") {\n if (typeof value === \"number\" || typeof value === \"bigint\") explicitRowid = value;\n else if (value !== null) explicitRowid = Number(value);\n continue;\n }\n values.set(normalizeColumnName(name), value);\n }\n for (const column of table.columns) {\n const key = normalizeColumnName(column);\n if (!values.has(key) && !columnNames.some((n) => n.toLowerCase() === key)) {\n values.set(key, null);\n }\n }\n const rowid = table.insert(values, explicitRowid);\n // Special commands don't change row counts the same way \u2014 still count as a write\n changes++;\n last = rowid;\n }\n return { changes, lastInsertRowid: last };\n}\n\nexport function executeFtsUpdate(\n table: Fts5VirtualTable,\n updates: Map<string, SqlValue>,\n rowids: Iterable<number | bigint>,\n): number {\n let changes = 0;\n for (const rowid of rowids) {\n table.update(rowid, updates);\n changes++;\n }\n return changes;\n}\n\nexport function executeFtsDelete(table: Fts5VirtualTable, rowids: Iterable<number | bigint>): number {\n let changes = 0;\n for (const rowid of rowids) {\n table.delete(rowid);\n changes++;\n }\n return changes;\n}\n", "import type {\n DeleteStmt,\n Expr,\n IndexedColumn,\n InsertStmt,\n ResultColumn,\n SetItem,\n UpdateStmt,\n WithClause,\n} from \"../ast/nodes.ts\";\nimport { checkTableConstraints } from \"../constraints/check.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { exprEquals } from \"../expressions/equals.ts\";\nimport { evalExpr } from \"../expressions/eval.ts\";\nimport { indexKeyValues } from \"../indexes/keys.ts\";\nimport { tryIndexedTableRows } from \"../planner/access.ts\";\nimport { isExpectedFastPathMiss } from \"../runtime/catch.ts\";\nimport { splitQualifiedName, type ViewInfo } from \"../storage/database-state.ts\";\nimport type { Row, Rowid } from \"../storage/row.ts\";\nimport { cloneRow, normalizeColumnName } from \"../storage/row.ts\";\nimport { makeColumnInfo, Table } from \"../storage/table.ts\";\nimport { normalizeForCollation } from \"../types/collation.ts\";\nimport { applyStrictValue } from \"../types/strict.ts\";\nimport { applyAffinity, asSqlReal, compareSql, isTruthySql, type SqlValue } from \"../types/value.ts\";\nimport type { Fts5Row, Fts5VirtualTable } from \"../vtable/fts5.ts\";\nimport type { ExecutionEnv, ScopeRow } from \"./env.ts\";\nimport { emptyResult, type ResultSet, resultValues, valuesToResult } from \"./result.ts\";\nimport { executeSelect, executeWith, scanFrom } from \"./select.ts\";\nimport { fireDeleteTriggers, fireInsertTriggers, fireUpdateTriggers } from \"./triggers.ts\";\nimport { executeFtsDelete, executeFtsInsert, executeFtsUpdate } from \"./vtable.ts\";\n\nfunction storeColumnValue(\n table: Table,\n column: { name: string; typeName: string | null; affinity: import(\"../types/value.ts\").Affinity },\n value: SqlValue,\n): SqlValue {\n const affined = applyAffinity(value, column.affinity);\n if (table.strict) return applyStrictValue(affined, column.typeName ?? \"\", table.name, column.name);\n return affined;\n}\n\nexport function executeInsert(stmt: InsertStmt, env: ExecutionEnv): ResultSet {\n try {\n return withDmlCtes(stmt.with, env, () => executeInsertCore(stmt, env));\n } catch (error) {\n handleConflictRollback(stmt.mode === \"insert_or_rollback\", error, env);\n throw error;\n }\n}\n\nfunction executeInsertCore(stmt: InsertStmt, env: ExecutionEnv): ResultSet {\n if (env.state.isVirtualTable(stmt.table)) {\n return executeVirtualInsert(stmt, env);\n }\n const totalBefore = env.state.totalChanges;\n const view = writableView(stmt.table, \"INSERT\", env);\n if (view) return executeViewInsert(stmt, view, env, totalBefore);\n const fast = env.forceFullInsert ? null : tryFastInsert(stmt, env);\n if (fast) return fast;\n let table = env.state.getWritableTable(stmt.table);\n const columnNames = stmt.columns ?? table.columns.map((column) => column.name);\n const rowidIndexes = columnNames.map((name, index) => (isRowidName(name) ? index : -1)).filter((index) => index >= 0);\n if (rowidIndexes.length > 1) throw new SqliteError(\"duplicate column name: rowid\", \"other\");\n if (table.withoutRowid && rowidIndexes.length > 0) {\n throw new SqliteError(`table ${table.name} has no column named rowid`, \"other\");\n }\n for (const name of columnNames) if (!isRowidName(name)) columnOf(table, name);\n const sourceRows = evaluateInsertSource(stmt, env);\n const returningRows: SqlValue[][] = [];\n let changes = 0;\n let last = env.state.lastInsertRowid;\n const suppliedIndexes = table.columns.map((column) =>\n columnNames.findIndex((name) => name.toLowerCase() === (column.nameLower ?? column.name.toLowerCase())),\n );\n const unconstrained =\n table.isUnconstrained() &&\n env.state.databaseForTable(table).triggers.size === 0 &&\n !stmt.upsert &&\n stmt.mode === \"insert\" &&\n stmt.returning.length === 0 &&\n rowidIndexes.length === 0;\n\n if (unconstrained) {\n for (const source of sourceRows) {\n if (source.length !== columnNames.length)\n throw new SqliteError(\n stmt.columns\n ? `${source.length} values for ${columnNames.length} columns`\n : `table ${table.name} has ${columnNames.length} columns but ${source.length} values were supplied`,\n \"other\",\n );\n const values = new Map<string, SqlValue>();\n for (let index = 0; index < table.columns.length; index++) {\n const column = table.columns[index]!;\n const suppliedIndex = suppliedIndexes[index]!;\n const value = suppliedIndex >= 0 ? (source[suppliedIndex] ?? null) : null;\n values.set(column.nameLower ?? column.name.toLowerCase(), storeColumnValue(table, column, value));\n }\n last = table.insert({ values }, { prepared: true, skipValidate: true });\n changes++;\n }\n env.state.recordChange(changes, last);\n return emptyResult(changes, last);\n }\n\n // ABORT undoes earlier rows from this statement without cloning the whole DB (critical for\n // bulk single-row inserts inside a user transaction \u2014 savepoints would be O(n\u00B2)).\n const abortMode = insertAbortResolution(stmt.mode) === \"abort\";\n const undoInserted: Rowid[] = [];\n const undoRemoved: Row[] = [];\n const undoStatement = (): void => {\n if (!abortMode) return;\n for (let i = undoInserted.length - 1; i >= 0; i--) {\n const row = table.rows.get(undoInserted[i]!);\n if (row) removeOne(table, row, env);\n }\n for (let i = undoRemoved.length - 1; i >= 0; i--) {\n const row = undoRemoved[i]!;\n table = env.state.ensureWritableTable(table);\n table.rows.set(row.rowid, row);\n if (table.indexes.length > 0) addIndexes(table, row, env);\n }\n };\n\n try {\n for (const source of sourceRows) {\n if (source.length !== columnNames.length)\n throw new SqliteError(\n stmt.columns\n ? `${source.length} values for ${columnNames.length} columns`\n : `table ${table.name} has ${columnNames.length} columns but ${source.length} values were supplied`,\n \"other\",\n );\n const values = new Map<string, SqlValue>();\n for (const column of table.columns) {\n if (column.generated) continue;\n const suppliedIndex = suppliedIndexes[table.columns.indexOf(column)] ?? -1;\n const value =\n suppliedIndex >= 0\n ? (source[suppliedIndex] ?? null)\n : column.defaultExpr\n ? evalExpr(column.defaultExpr, env.createEvalContext())\n : null;\n values.set(column.nameLower ?? column.name.toLowerCase(), storeColumnValue(table, column, value));\n }\n for (const column of table.columns) {\n if (!column.generated) continue;\n if (columnNames.some((name) => name.toLowerCase() === column.name.toLowerCase())) {\n throw new SqliteError(`cannot INSERT into generated column \"${column.name}\"`, \"misuse\");\n }\n if (column.generated.stored) {\n const genCtx = env.createEvalContext({\n cells: table.columns\n .filter((c) => !c.generated || c === column)\n .flatMap((c) => {\n if (c.generated && c !== column) return [];\n if (c === column) return [];\n return [\n {\n table: table.name,\n name: c.name,\n value: values.get(normalizeColumnName(c.name)) ?? null,\n affinity: c.affinity,\n collate: c.collate,\n },\n ];\n }),\n });\n const computed = evalExpr(column.generated.expr, genCtx);\n values.set(normalizeColumnName(column.name), storeColumnValue(table, column, computed));\n } else {\n values.set(normalizeColumnName(column.name), null);\n }\n }\n\n if (fireInsertTriggers(\"BEFORE\", table, values, null, env) === \"ignore\") continue;\n\n const conflicts = conflictingRows(table, values, env);\n if (conflicts.length > 0) {\n if (stmt.upsert) {\n const targetConflicts = conflictsForUpsert(table, values, env, stmt.upsert);\n if (targetConflicts.length === 0) {\n throw new SqliteError(\n `UNIQUE constraint failed: ${table.name}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n if (stmt.upsert.action === \"nothing\") continue;\n const row = targetConflicts[0]!;\n const scope = scopeFor(table, row, stmt.table, env);\n const excluded: ScopeRow = {\n cells: table.columns.map((column) => ({\n table: \"excluded\",\n name: column.name,\n value: values.get(normalizeColumnName(column.name)) ?? null,\n })),\n };\n const merged = { cells: [...scope.cells, ...excluded.cells], rowid: row.rowid, sourceTable: table.name };\n const ctx = env.createEvalContext(merged);\n if (stmt.upsert.action.where && isTruthySql(evalExpr(stmt.upsert.action.where, ctx)) !== true) continue;\n const updates = evaluateSet(stmt.upsert.action.set, table, ctx);\n const updated = updateOne(table, row, updates, env);\n changes += 1 + updated.cascaded;\n if (stmt.returning.length)\n returningRows.push(projectReturning(stmt.returning, scopeFor(table, updated.row, stmt.table, env), env));\n continue;\n }\n const mode = stmt.mode;\n if (mode === \"insert_or_ignore\") continue;\n if (mode === \"replace\" || mode === \"insert_or_replace\") {\n for (const row of conflicts) {\n if (abortMode) undoRemoved.push(cloneRow(row));\n removeOne(table, row, env);\n }\n } else {\n throw new SqliteError(\n `UNIQUE constraint failed: ${table.name}`,\n \"constraint_unique\",\n \"SQLITE_CONSTRAINT_UNIQUE\",\n );\n }\n }\n\n let insertedRowid: Rowid | undefined;\n try {\n const suppliedRowid = rowidIndexes.length ? asExplicitRowid(source[rowidIndexes[0]!] ?? null) : undefined;\n const rowid = table.insert({ values, rowid: suppliedRowid }, { prepared: true });\n insertedRowid = rowid;\n const row = table.rows.get(rowid)!;\n validateRow(table, row, env);\n if (table.indexes.length > 0) addIndexes(table, row, env);\n if (env.state.foreignKeysEnabled) checkForeignKeys(table, row, env);\n if (!table.withoutRowid) {\n last = rowid;\n env.state.lastInsertRowid = rowid;\n }\n fireInsertTriggers(\"AFTER\", table, table.namedValues(row), null, env);\n changes++;\n if (abortMode) undoInserted.push(rowid);\n if (stmt.returning.length)\n returningRows.push(projectReturning(stmt.returning, scopeFor(table, row, stmt.table, env), env));\n } catch (error) {\n if (insertedRowid !== undefined) {\n const inserted = table.rows.get(insertedRowid);\n if (inserted) removeOne(table, inserted, env);\n }\n if (\n stmt.mode === \"insert_or_ignore\" &&\n error instanceof SqliteError &&\n error.category.startsWith(\"constraint\") &&\n error.category !== \"constraint_foreign\"\n )\n continue;\n throw error;\n }\n }\n } catch (error) {\n undoStatement();\n throw error;\n }\n const reportedChanges = finalizeDmlChanges(totalBefore, changes, env, last);\n if (stmt.returning.length === 0) return emptyResult(reportedChanges, last);\n return valuesToResult(returningNames(stmt.returning, table), returningRows, reportedChanges, last);\n}\n\nfunction evaluateInsertSource(stmt: InsertStmt, env: ExecutionEnv): SqlValue[][] {\n if (stmt.select) return resultValues(executeSelect(stmt.select, env));\n if (!stmt.values) return [[]];\n const ctx = env.createEvalContext();\n return stmt.values.map((items) =>\n items.map((expr) => {\n if (expr.type === \"parameter\") return env.getBoundParameter(expr.name);\n return evalExpr(expr, ctx);\n }),\n );\n}\n\ninterface FastInsertSlot {\n key: string;\n affinity: import(\"../types/value.ts\").Affinity;\n read: (env: ExecutionEnv) => SqlValue;\n}\n\ninterface FastInsertPlan {\n tableName: string;\n slots: FastInsertSlot[];\n}\n\nconst fastInsertPlans = new WeakMap<InsertStmt, FastInsertPlan>();\n\nfunction tryFastInsert(stmt: InsertStmt, env: ExecutionEnv): ResultSet | null {\n if (stmt.with || stmt.select || stmt.upsert || stmt.returning.length > 0 || stmt.mode !== \"insert\") return null;\n if (stmt.values?.length !== 1) return null;\n let plan = fastInsertPlans.get(stmt);\n if (!plan) {\n const built = buildFastInsertPlan(stmt, env);\n if (!built) return null;\n plan = built;\n fastInsertPlans.set(stmt, plan);\n }\n let table: Table;\n try {\n table = env.state.getWritableTable(plan.tableName);\n } catch (error) {\n if (!isExpectedFastPathMiss(error)) throw error;\n return null;\n }\n if (env.state.databaseForTable(table).triggers.size > 0) return null;\n if (!table.isUnconstrained()) return null;\n const values = new Map<string, SqlValue>();\n for (const slot of plan.slots) values.set(slot.key, applyAffinity(slot.read(env), slot.affinity));\n const last = table.insert({ values }, { prepared: true, skipValidate: true });\n env.state.recordChange(1, last);\n return emptyResult(1, last);\n}\n\nfunction buildFastInsertPlan(stmt: InsertStmt, env: ExecutionEnv): FastInsertPlan | null {\n let table: Table;\n try {\n table = env.state.getTable(stmt.table);\n } catch (error) {\n if (!isExpectedFastPathMiss(error)) throw error;\n return null;\n }\n if (!table.isUnconstrained()) return null;\n const tuple = stmt.values?.[0];\n if (!tuple) return null;\n const columnNames = stmt.columns ?? table.columns.map((column) => column.name);\n if (tuple.length !== columnNames.length) return null;\n if (columnNames.some((name) => isRowidName(name))) return null;\n const slots: FastInsertSlot[] = [];\n for (const column of table.columns) {\n const key = column.nameLower ?? column.name.toLowerCase();\n const suppliedIndex = columnNames.findIndex((name) => name.toLowerCase() === key);\n if (suppliedIndex < 0) {\n if (column.defaultExpr) return null;\n slots.push({ key, affinity: column.affinity, read: () => null });\n continue;\n }\n const expr = tuple[suppliedIndex];\n if (!expr) return null;\n if (expr.type === \"parameter\") {\n const name = expr.name;\n slots.push({ key, affinity: column.affinity, read: (exec) => exec.getBoundParameter(name) });\n } else if (expr.type === \"literal\") {\n const value = expr.forceReal && typeof expr.value === \"number\" ? asSqlReal(expr.value) : expr.value;\n slots.push({ key, affinity: column.affinity, read: () => value });\n } else if (expr.type === \"null\") {\n slots.push({ key, affinity: column.affinity, read: () => null });\n } else return null;\n }\n return { tableName: stmt.table, slots };\n}\n\nexport function executeUpdate(stmt: UpdateStmt, env: ExecutionEnv): ResultSet {\n try {\n return withDmlCtes(stmt.with, env, () => executeUpdateCore(stmt, env));\n } catch (error) {\n handleConflictRollback(stmt.or === \"rollback\", error, env);\n throw error;\n }\n}\n\nfunction executeUpdateCore(stmt: UpdateStmt, env: ExecutionEnv): ResultSet {\n if (env.state.isVirtualTable(stmt.table)) {\n return executeVirtualUpdate(stmt, env);\n }\n const totalBefore = env.state.totalChanges;\n const view = writableView(stmt.table, \"UPDATE\", env);\n if (view) return executeViewUpdate(stmt, view, env, totalBefore);\n // Scan for candidates before any statement savepoint. getWritableTable must run *after*\n // freeze/clone so all row mutations share one live writable table (not re-clone from frozen).\n const scanTable = env.state.getTable(stmt.table);\n const alias = stmt.alias ?? stmt.table;\n const candidates: { row: Row; scope: ScopeRow }[] = [];\n\n if (stmt.from) {\n const fromRows = scanFrom(stmt.from, env);\n for (const row of scanTable.scan()) {\n const targetScope = scopeFor(scanTable, row, alias, env);\n let matchedScope: ScopeRow | null = null;\n for (const fromRow of fromRows) {\n const joined: ScopeRow = {\n ...targetScope,\n cells: [...targetScope.cells, ...fromRow.cells],\n };\n if (stmt.where && isTruthySql(evalExpr(stmt.where, env.createEvalContext(joined))) !== true) continue;\n // SQLite keeps the last matching FROM row when multiple sources match.\n matchedScope = joined;\n }\n if (matchedScope) candidates.push({ row, scope: matchedScope });\n }\n } else {\n const indexed =\n stmt.where === null\n ? null\n : tryIndexedTableRows({ type: \"table\", schema: null, name: stmt.table, alias: stmt.alias }, stmt.where, env);\n const scanRows = indexed ? indexed.rows : scanTable.scan();\n for (const row of scanRows) {\n const scope = scopeFor(scanTable, row, alias, env);\n if (stmt.where && isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope))) !== true) continue;\n candidates.push({ row, scope });\n }\n }\n\n const applyUpdates = (): ResultSet => {\n let table = env.state.getWritableTable(stmt.table);\n const returningRows: SqlValue[][] = [];\n let changes = 0;\n for (const { row, scope } of candidates) {\n const ctx = env.createEvalContext(scope);\n const updates = evaluateSet(stmt.set, table, ctx);\n const newValues = mergedValues(table, row, updates);\n const updatedColumns = new Set(\n [...updates.keys()].map((key) => {\n const column = table.columns.find((item) => normalizeColumnName(item.name) === key);\n return column?.name ?? key;\n }),\n );\n if (fireUpdateTriggers(\"BEFORE\", table, row, newValues, updatedColumns, env) === \"ignore\") continue;\n try {\n if (stmt.or === \"replace\") {\n for (const conflict of conflictingRows(table, newValues, env)) {\n if (conflict.rowid === row.rowid) continue;\n removeOne(table, conflict, env);\n table = env.state.getWritableTable(stmt.table);\n // SQLite changes() counts the updated row only, not replaced conflict deletions.\n }\n }\n const updated = updateOne(table, row, updates, env);\n table = env.state.getWritableTable(stmt.table);\n fireUpdateTriggers(\"AFTER\", table, row, table.namedValues(updated.row), updatedColumns, env);\n changes += 1 + updated.cascaded;\n if (stmt.returning.length)\n returningRows.push(projectReturning(stmt.returning, scopeFor(table, updated.row, alias, env), env));\n } catch (error) {\n if (\n stmt.or === \"ignore\" &&\n error instanceof SqliteError &&\n error.category.startsWith(\"constraint\") &&\n error.category !== \"constraint_foreign\"\n )\n continue;\n throw error;\n }\n }\n const reportedChanges = finalizeDmlChanges(totalBefore, changes, env);\n return valuesToResult(\n returningNames(stmt.returning, table),\n returningRows,\n reportedChanges,\n env.state.lastInsertRowid,\n );\n };\n\n if (updateAbortResolution(stmt.or) === \"abort\" && candidates.length > 1) {\n return withStatementAtomicity(env, \"abort\", applyUpdates);\n }\n return applyUpdates();\n}\n\nexport function executeDelete(stmt: DeleteStmt, env: ExecutionEnv): ResultSet {\n try {\n return withDmlCtes(stmt.with, env, () => executeDeleteCore(stmt, env));\n } catch (error) {\n handleConflictRollback(stmt.or === \"rollback\", error, env);\n throw error;\n }\n}\n\nfunction executeDeleteCore(stmt: DeleteStmt, env: ExecutionEnv): ResultSet {\n if (env.state.isVirtualTable(stmt.table)) {\n return executeVirtualDelete(stmt, env);\n }\n const totalBefore = env.state.totalChanges;\n const view = writableView(stmt.table, \"DELETE\", env);\n if (view) return executeViewDelete(stmt, view, env, totalBefore);\n // Select targets before any statement savepoint; get writable only inside applyDeletes.\n const scanTable = env.state.getTable(stmt.table);\n const selectedSource =\n stmt.where === null\n ? null\n : tryIndexedTableRows({ type: \"table\", schema: null, name: stmt.table, alias: stmt.alias }, stmt.where, env);\n const selected = [...(selectedSource ? selectedSource.rows : scanTable.scan())].filter((row) => {\n if (!stmt.where) return true;\n return (\n isTruthySql(\n evalExpr(stmt.where, env.createEvalContext(scopeFor(scanTable, row, stmt.alias ?? stmt.table, env))),\n ) === true\n );\n });\n\n const applyDeletes = (): ResultSet => {\n let table = env.state.getWritableTable(stmt.table);\n const returningRows: SqlValue[][] = [];\n let changes = 0;\n for (const row of selected) {\n try {\n if (fireDeleteTriggers(\"BEFORE\", table, row, env) === \"ignore\") continue;\n if (stmt.returning.length)\n returningRows.push(\n projectReturning(stmt.returning, scopeFor(table, row, stmt.alias ?? stmt.table, env), env),\n );\n changes += applyReferentialDelete(table, row, env);\n table = env.state.getWritableTable(stmt.table);\n removeOne(table, row, env);\n table = env.state.getWritableTable(stmt.table);\n fireDeleteTriggers(\"AFTER\", table, row, env);\n changes++;\n } catch (error) {\n if (\n stmt.or === \"ignore\" &&\n error instanceof SqliteError &&\n error.category.startsWith(\"constraint\") &&\n error.category !== \"constraint_foreign\"\n )\n continue;\n throw error;\n }\n }\n const reportedChanges = finalizeDmlChanges(totalBefore, changes, env);\n return valuesToResult(\n returningNames(stmt.returning, table),\n returningRows,\n reportedChanges,\n env.state.lastInsertRowid,\n );\n };\n\n if (deleteAbortResolution(stmt.or) === \"abort\" && selected.length > 1) {\n return withStatementAtomicity(env, \"abort\", applyDeletes);\n }\n return applyDeletes();\n}\n\nfunction withDmlCtes(withClause: WithClause | null, env: ExecutionEnv, execute: () => ResultSet): ResultSet {\n if (!withClause) return execute();\n const savedCtes = new Map(env.ctes);\n try {\n executeWith(withClause, env);\n return execute();\n } finally {\n env.ctes.clear();\n for (const [name, result] of savedCtes) env.ctes.set(name, result);\n }\n}\n\nfunction handleConflictRollback(rollback: boolean, error: unknown, env: ExecutionEnv): void {\n if (\n rollback &&\n env.transactions.inTransaction &&\n error instanceof SqliteError &&\n error.category.startsWith(\"constraint\")\n ) {\n env.transactions.rollback();\n }\n}\n\nlet statementSavepointSeq = 0;\nlet statementAtomicityDepth = 0;\n\n/** SQLite ABORT: undo all changes from the current statement; FAIL keeps prior row changes. */\nfunction withStatementAtomicity<T>(env: ExecutionEnv, resolution: \"abort\" | \"fail\", run: () => T): T {\n if (resolution === \"fail\") return run();\n // Nested DML (e.g. triggers) shares the outer statement savepoint; re-freezing would\n // invalidate caller table references mid-statement.\n if (statementAtomicityDepth > 0) return run();\n const name = `__mem_stmt_${++statementSavepointSeq}`;\n statementAtomicityDepth++;\n env.transactions.savepoint(name);\n try {\n const result = run();\n env.transactions.release(name);\n return result;\n } catch (error) {\n if (env.transactions.inTransaction) {\n try {\n env.transactions.rollback(name);\n env.transactions.release(name);\n } catch {\n // Transaction may already have been rolled back (OR ROLLBACK).\n }\n }\n throw error;\n } finally {\n statementAtomicityDepth--;\n }\n}\n\nfunction insertAbortResolution(mode: InsertStmt[\"mode\"]): \"abort\" | \"fail\" {\n return mode === \"insert_or_fail\" ? \"fail\" : \"abort\";\n}\n\nfunction updateAbortResolution(or: UpdateStmt[\"or\"]): \"abort\" | \"fail\" {\n return or === \"fail\" ? \"fail\" : \"abort\";\n}\n\nfunction deleteAbortResolution(or: DeleteStmt[\"or\"]): \"abort\" | \"fail\" {\n return or === \"fail\" ? \"fail\" : \"abort\";\n}\n\ninterface WritableView {\n schema: string | null;\n name: string;\n view: ViewInfo;\n table: Table;\n}\n\nfunction writableView(name: string, event: \"INSERT\" | \"UPDATE\" | \"DELETE\", env: ExecutionEnv): WritableView | null {\n const { schema, bare } = splitQualifiedName(name);\n const db = env.state.databaseForSchema(schema, name);\n const view = db.views.get(bare.toLowerCase());\n if (!view) return null;\n const hasInsteadOf = [...db.triggers.values()].some(\n (trigger) =>\n trigger.tableName.toLowerCase() === bare.toLowerCase() && trigger.event === event && trigger.timing === \"INSTEAD\",\n );\n if (!hasInsteadOf) {\n throw new SqliteError(`cannot modify ${bare} because it is a view`, \"other\");\n }\n const names = view.columns ?? executeSelect(view.select, env).columns;\n return {\n schema,\n name: bare,\n view,\n table: new Table(\n bare,\n names.map((column) => makeColumnInfo(column, null)),\n ),\n };\n}\n\nfunction executeViewInsert(stmt: InsertStmt, target: WritableView, env: ExecutionEnv, totalBefore: number): ResultSet {\n const columnNames = stmt.columns ?? target.table.columns.map((column) => column.name);\n for (const name of columnNames) columnOf(target.table, name);\n const suppliedIndexes = target.table.columns.map((column) =>\n columnNames.findIndex((name) => name.toLowerCase() === normalizeColumnName(column.name)),\n );\n for (const source of evaluateInsertSource(stmt, env)) {\n if (source.length !== columnNames.length) {\n throw new SqliteError(`${source.length} values for ${columnNames.length} columns`, \"other\");\n }\n const values = new Map<string, SqlValue>();\n target.table.columns.forEach((column, index) => {\n const supplied = suppliedIndexes[index] ?? -1;\n values.set(normalizeColumnName(column.name), supplied < 0 ? null : (source[supplied] ?? null));\n });\n fireInsertTriggers(\"INSTEAD\", target.table, values, null, env);\n }\n const changes = finalizeDmlChanges(totalBefore, 0, env);\n return emptyResult(changes, env.state.lastInsertRowid);\n}\n\nfunction executeViewUpdate(stmt: UpdateStmt, target: WritableView, env: ExecutionEnv, totalBefore: number): ResultSet {\n const alias = stmt.alias ?? target.name;\n const scopes = scanView(target, alias, env);\n const updatedColumns = new Set(\n stmt.set.flatMap((item) => item.columns.map((name) => columnOf(target.table, name).name)),\n );\n for (const scope of scopes) {\n const ctx = env.createEvalContext(scope);\n if (stmt.where && isTruthySql(evalExpr(stmt.where, ctx)) !== true) continue;\n const oldRow = viewRow(target.table, scope);\n const updates = evaluateSet(stmt.set, target.table, ctx);\n const newValues = mergedValues(target.table, oldRow, updates);\n fireUpdateTriggers(\"INSTEAD\", target.table, oldRow, newValues, updatedColumns, env);\n }\n const changes = finalizeDmlChanges(totalBefore, 0, env);\n return emptyResult(changes, env.state.lastInsertRowid);\n}\n\nfunction executeViewDelete(stmt: DeleteStmt, target: WritableView, env: ExecutionEnv, totalBefore: number): ResultSet {\n const alias = stmt.alias ?? target.name;\n for (const scope of scanView(target, alias, env)) {\n if (stmt.where && isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope))) !== true) continue;\n fireDeleteTriggers(\"INSTEAD\", target.table, viewRow(target.table, scope), env);\n }\n const changes = finalizeDmlChanges(totalBefore, 0, env);\n return emptyResult(changes, env.state.lastInsertRowid);\n}\n\nfunction scanView(target: WritableView, alias: string, env: ExecutionEnv): ScopeRow[] {\n return scanFrom(\n { type: \"table\", schema: target.schema, name: target.name, alias: alias === target.name ? null : alias },\n env,\n );\n}\n\nfunction viewRow(table: Table, scope: ScopeRow): Row {\n const values: SqlValue[] = [];\n for (const column of table.columns) {\n const key = normalizeColumnName(column.name);\n const cell = scope.cells.find((candidate) => normalizeColumnName(candidate.name) === key);\n values.push(cell?.value ?? null);\n }\n return { rowid: scope.rowid ?? 0, values };\n}\n\nfunction finalizeDmlChanges(totalBefore: number, directChanges: number, env: ExecutionEnv, last?: Rowid): number {\n const triggerChanges = env.state.totalChanges - totalBefore;\n env.state.recordChange(directChanges, last);\n const reportedChanges = triggerChanges + directChanges;\n env.state.changes = reportedChanges;\n return reportedChanges;\n}\n\nfunction mergedValues(table: Table, row: Row, updates: Map<string, SqlValue>): Map<string, SqlValue> {\n const values = new Map<string, SqlValue>();\n for (const column of table.columns) {\n const key = normalizeColumnName(column.name);\n values.set(key, updates.has(key) ? updates.get(key)! : table.cell(row, key));\n }\n return values;\n}\n\nfunction evaluateSet(\n items: SetItem[],\n table: Table,\n ctx: ReturnType<ExecutionEnv[\"createEvalContext\"]>,\n): Map<string, SqlValue> {\n const updates = new Map<string, SqlValue>();\n for (const item of items) {\n if (item.columns.length === 1) {\n const column = columnOf(table, item.columns[0]!);\n if (column.generated) throw new SqliteError(`cannot UPDATE generated column \"${column.name}\"`, \"misuse\");\n updates.set(normalizeColumnName(column.name), storeColumnValue(table, column, evalExpr(item.expr, ctx)));\n continue;\n }\n if (item.expr.type !== \"row\" || item.expr.values.length !== item.columns.length) {\n throw new SqliteError(\n `${item.columns.length} columns assigned ${item.expr.type === \"row\" ? item.expr.values.length : 1} values`,\n \"other\",\n );\n }\n item.columns.forEach((name, index) => {\n const column = columnOf(table, name);\n if (column.generated) throw new SqliteError(`cannot UPDATE generated column \"${column.name}\"`, \"misuse\");\n updates.set(\n normalizeColumnName(column.name),\n storeColumnValue(table, column, evalExpr(item.expr.type === \"row\" ? item.expr.values[index]! : item.expr, ctx)),\n );\n });\n }\n return updates;\n}\n\nfunction updateOne(\n table: Table,\n row: Row,\n updates: Map<string, SqlValue>,\n env: ExecutionEnv,\n): { row: Row; cascaded: number } {\n table = env.state.ensureWritableTable(table);\n const before = row;\n let after: Row | undefined;\n let indexesAdded = false;\n removeIndexes(table, before, env);\n try {\n const merged = table.namedValues(row);\n for (const [name, value] of updates) merged.set(name, value);\n for (const column of table.columns) {\n if (!column.generated?.stored) continue;\n const genCtx = env.createEvalContext({\n cells: table.columns\n .filter((c) => !c.generated)\n .map((c) => ({\n table: table.name,\n name: c.name,\n value: merged.get(normalizeColumnName(c.name)) ?? null,\n affinity: c.affinity,\n collate: c.collate,\n })),\n });\n merged.set(\n normalizeColumnName(column.name),\n storeColumnValue(table, column, evalExpr(column.generated.expr, genCtx)),\n );\n }\n after = table.update(row.rowid, merged);\n if (!after) throw new SqliteError(`no such row: ${row.rowid}`, \"other\");\n validateRow(table, after, env);\n addIndexes(table, after, env);\n indexesAdded = true;\n checkForeignKeys(table, after, env);\n const cascaded = applyReferentialUpdate(table, before, after, env);\n return { row: after, cascaded };\n } catch (error) {\n if (after) {\n if (indexesAdded) removeIndexes(table, after, env);\n // Revert row storage (including WITHOUT ROWID clustered keys), not just `rows`.\n table.update(before.rowid, table.namedValues(before));\n }\n addIndexes(table, before, env);\n throw error;\n }\n}\n\nfunction validateRow(table: Table, row: Row, env: ExecutionEnv): void {\n checkTableConstraints(table, row, (expr, candidate) =>\n evalExpr(expr, env.createEvalContext(scopeFor(table, candidate, table.name, env))),\n );\n}\n\nfunction addIndexes(table: Table, row: Row, env: ExecutionEnv): void {\n const db = env.state.databaseForTable(table);\n for (const name of table.indexes) {\n const found = db.indexes.get(name.toLowerCase());\n if (!found) continue;\n const index = db.ensureWritableIndex(found);\n if (\n index.where &&\n isTruthySql(evalExpr(index.where, env.createEvalContext(scopeFor(table, row, table.name, env)))) !== true\n )\n continue;\n index.store.insert(indexValues(index.columns, row, env, table), row.rowid, index.unique);\n }\n}\n\nfunction removeIndexes(table: Table, row: Row, env: ExecutionEnv): void {\n const db = env.state.databaseForTable(table);\n for (const name of table.indexes) {\n const found = db.indexes.get(name.toLowerCase());\n if (!found) continue;\n const index = db.ensureWritableIndex(found);\n index.store.remove(indexValues(index.columns, row, env, table), row.rowid);\n }\n}\n\nfunction removeOne(table: Table, row: Row, env: ExecutionEnv): void {\n table = env.state.ensureWritableTable(table);\n removeIndexes(table, row, env);\n table.delete(row.rowid);\n}\n\nfunction conflictingRows(table: Table, values: Map<string, SqlValue>, env: ExecutionEnv): Row[] {\n return conflictsForSets(table, values, uniqueColumnSets(table, env), env);\n}\n\nfunction conflictsMatchingTarget(\n table: Table,\n values: Map<string, SqlValue>,\n env: ExecutionEnv,\n targetColumns: string[],\n): Row[] {\n const targetKeys = targetColumns.map((name) => normalizeColumnName(name));\n const matchingSets = uniqueColumnSets(table, env).filter((columns) => {\n if (columns.length !== targetKeys.length) return false;\n const setKeys = columns.map((column) => normalizeColumnName(column.name));\n return targetKeys.every((key) => setKeys.includes(key));\n });\n if (matchingSets.length === 0) {\n // Infer INTEGER PRIMARY KEY / rowid target.\n if (\n targetKeys.length === 1 &&\n (targetKeys[0] === \"rowid\" ||\n table.columns.some((column) => normalizeColumnName(column.name) === targetKeys[0] && column.primaryKey))\n ) {\n const pkSets = uniqueColumnSets(table, env).filter(\n (columns) =>\n columns.length === 1 &&\n (normalizeColumnName(columns[0]!.name) === targetKeys[0] ||\n table.columns.find((column) => normalizeColumnName(column.name) === normalizeColumnName(columns[0]!.name))\n ?.primaryKey),\n );\n return conflictsForSets(\n table,\n values,\n pkSets.length > 0 ? pkSets : [[{ name: targetColumns[0]!, collate: null, order: null }]],\n env,\n );\n }\n return [];\n }\n return conflictsForSets(table, values, matchingSets, env);\n}\n\nfunction conflictsForUpsert(\n table: Table,\n values: Map<string, SqlValue>,\n env: ExecutionEnv,\n upsert: NonNullable<InsertStmt[\"upsert\"]>,\n): Row[] {\n if (!upsert.targetColumns) return conflictingRows(table, values, env);\n const exprs = upsert.targetExprs;\n const hasExpr = exprs?.some((expr) => expr.type !== \"column\") ?? false;\n if (hasExpr && exprs) {\n const db = env.state.databaseForTable(table);\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index?.unique || index.columns.length !== exprs.length) continue;\n const matches = index.columns.every((column, i) => {\n const expr = exprs[i]!;\n if (column.expr) return exprEquals(column.expr, expr);\n return expr.type === \"column\" && expr.name.toLowerCase() === column.name.toLowerCase();\n });\n if (!matches) continue;\n if (upsert.targetWhere && index.where && !exprEquals(upsert.targetWhere, index.where)) continue;\n return conflictsForSets(table, values, [index.columns], env);\n }\n }\n return conflictsMatchingTarget(table, values, env, upsert.targetColumns.filter(Boolean));\n}\n\nfunction uniqueColumnSets(table: Table, env: ExecutionEnv): IndexedColumn[][] {\n const sets: IndexedColumn[][] = [];\n const seen = new Set<string>();\n const remember = (columns: IndexedColumn[]): void => {\n const key = columns.map((column) => normalizeColumnName(column.name)).join(\"\\0\");\n if (seen.has(key)) return;\n seen.add(key);\n sets.push(columns);\n };\n\n for (const indexName of table.indexes) {\n const index = env.state.databaseForTable(table).indexes.get(indexName.toLowerCase());\n if (index?.unique) remember(index.columns);\n }\n\n // INTEGER PRIMARY KEY / rowid uniqueness (no autoindex).\n const pk = table.integerPkColumn();\n if (pk) remember([{ name: pk.name, collate: pk.collate, order: null }]);\n\n // Fallback for any UNIQUE/PK constraints not yet covered by an index (legacy / edge cases).\n const hasTablePrimary = table.constraints.some((constraint) => constraint.type === \"primary_key\");\n for (const column of table.columns) {\n if (column.unique || (column.primaryKey && !hasTablePrimary)) {\n remember([{ name: column.name, collate: column.collate, order: null }]);\n }\n }\n for (const constraint of table.constraints) {\n if (constraint.type === \"unique\" || constraint.type === \"primary_key\") remember(constraint.columns);\n }\n return sets;\n}\n\nfunction conflictsForSets(\n table: Table,\n values: Map<string, SqlValue>,\n sets: IndexedColumn[][],\n env: ExecutionEnv,\n): Row[] {\n const found: Row[] = [];\n const seen = new Set<string>();\n const push = (row: Row): void => {\n const key = String(row.rowid);\n if (seen.has(key)) return;\n seen.add(key);\n found.push(row);\n };\n\n const db = env.state.databaseForTable(table);\n for (const columns of sets) {\n const desired = indexValuesFromMap(columns, values, table, env);\n if (desired.some((value) => value === null)) continue;\n\n // INTEGER PRIMARY KEY / rowid map.\n if (columns.length === 1) {\n const pk = table.integerPkColumn();\n if (pk && normalizeColumnName(columns[0]!.name) === normalizeColumnName(pk.name)) {\n const row = table.getByKey(desired[0]!);\n if (row) push(row);\n continue;\n }\n }\n\n // Prefer IndexStore lookup (autoindexes + CREATE INDEX).\n let usedIndex = false;\n for (const indexName of table.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index?.unique) continue;\n if (index.columns.length !== columns.length) continue;\n if (\n !index.columns.every((column, i) => normalizeColumnName(column.name) === normalizeColumnName(columns[i]!.name))\n ) {\n continue;\n }\n usedIndex = true;\n if (index.where && !indexWhereMatches(index.where, values, table, env)) continue;\n for (const rowid of index.store.lookup(desired)) {\n const row = table.get(rowid);\n if (row) push(row);\n }\n break;\n }\n if (usedIndex) continue;\n\n // Slow fallback: full scan (should be rare once autoindexes exist).\n for (const row of table.scan()) {\n const existing = indexValues(columns, row, env, table);\n if (desired.every((value, index) => compareSql(value, existing[index] ?? null) === 0)) push(row);\n }\n }\n return found;\n}\n\nfunction indexValues(columns: IndexedColumn[], row: Row, env?: ExecutionEnv, table?: Table): SqlValue[] {\n if (!env || !table) return indexKeyValues(columns, row, null, table);\n return indexKeyValues(columns, row, env.createEvalContext(scopeFor(table, row, table.name, env)), table);\n}\n\nfunction indexValuesFromMap(\n columns: IndexedColumn[],\n values: Map<string, SqlValue>,\n table: Table,\n env: ExecutionEnv,\n): SqlValue[] {\n const fake = table.rowFromNamed(values);\n return indexValues(columns, fake, env, table);\n}\n\nfunction indexWhereMatches(where: Expr, values: Map<string, SqlValue>, table: Table, env: ExecutionEnv): boolean {\n const fake = table.rowFromNamed(values);\n return isTruthySql(evalExpr(where, env.createEvalContext(scopeFor(table, fake, table.name, env)))) === true;\n}\n\nfunction checkForeignKeys(table: Table, row: Row, env: ExecutionEnv): void {\n if (!env.state.foreignKeysEnabled) return;\n for (const constraint of table.constraints) {\n if (constraint.type !== \"foreign_key\") continue;\n if (fkIsDeferred(constraint, env)) continue;\n assertForeignKeySatisfied(table, row, constraint, env);\n }\n}\n\nfunction fkIsDeferred(\n constraint: Extract<Table[\"constraints\"][number], { type: \"foreign_key\" }>,\n env: ExecutionEnv,\n): boolean {\n return env.transactions.inTransaction && constraint.initiallyDeferred;\n}\n\nfunction assertForeignKeySatisfied(\n table: Table,\n row: Row,\n constraint: Extract<Table[\"constraints\"][number], { type: \"foreign_key\" }>,\n env: ExecutionEnv,\n excludeParent: Row | null = null,\n): void {\n const values = constraint.columns.map((name) => table.cell(row, normalizeColumnName(name)));\n assertForeignKeyValues(values, constraint, env, excludeParent);\n}\n\n/** Like assertForeignKeySatisfied, but using pending column updates (ON DELETE SET DEFAULT). */\nfunction assertForeignKeySatisfiedWithUpdates(\n table: Table,\n row: Row,\n constraint: Extract<Table[\"constraints\"][number], { type: \"foreign_key\" }>,\n updates: Map<string, SqlValue>,\n env: ExecutionEnv,\n excludeParent: Row | null,\n): void {\n const values = constraint.columns.map((name) => {\n const key = normalizeColumnName(name);\n return updates.has(key) ? (updates.get(key) ?? null) : table.cell(row, key);\n });\n assertForeignKeyValues(values, constraint, env, excludeParent);\n}\n\nfunction assertForeignKeyValues(\n values: SqlValue[],\n constraint: Extract<Table[\"constraints\"][number], { type: \"foreign_key\" }>,\n env: ExecutionEnv,\n excludeParent: Row | null,\n): void {\n // SQLite parses MATCH FULL/PARTIAL but enforces MATCH SIMPLE only (any NULL skips the check).\n if (values.some((value) => value === null)) return;\n const parent = env.state.getTable(constraint.refTable);\n const parentColumns =\n constraint.refColumns ?? parent.columns.filter((column) => column.primaryKey).map((column) => column.name);\n if (findParentRowsForFk(parent, parentColumns, values, env, excludeParent).length === 0) {\n throw new SqliteError(\"FOREIGN KEY constraint failed\", \"constraint_foreign\", \"SQLITE_CONSTRAINT_FOREIGNKEY\");\n }\n}\n\nfunction parentRowMatchesFk(\n parent: Table,\n parentColumns: string[],\n values: SqlValue[],\n excludeParent: Row | null,\n candidate: Row,\n): boolean {\n if (excludeParent && candidate.rowid === excludeParent.rowid) return false;\n return values.every((value, index) => {\n const parentColumn = parentColumns[index];\n return (\n parentColumn !== undefined && compareSql(value, parent.cell(candidate, normalizeColumnName(parentColumn))) === 0\n );\n });\n}\n\nfunction findParentRowsForFk(\n parent: Table,\n parentColumns: string[],\n values: SqlValue[],\n env: ExecutionEnv,\n excludeParent: Row | null,\n): Row[] {\n const db = env.state.databaseForTable(parent);\n const pk = parent.integerPkColumn();\n if (parentColumns.length === 1) {\n const col = parentColumns[0]!.toLowerCase();\n if (\n col === \"rowid\" ||\n col === \"_rowid_\" ||\n col === \"oid\" ||\n (pk && col === (pk.nameLower ?? pk.name.toLowerCase()))\n ) {\n const row = parent.getByKey(values[0]!);\n if (row && parentRowMatchesFk(parent, parentColumns, values, excludeParent, row)) return [row];\n return [];\n }\n }\n\n const normalizedValues = values.map((value, index) => {\n const colName = parentColumns[index]!;\n const column = parent.columns.find((item) => (item.nameLower ?? item.name.toLowerCase()) === colName.toLowerCase());\n return normalizeForCollation(value, column?.collate ?? \"BINARY\");\n });\n for (const indexName of parent.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index?.unique || index.where || index.columns.some((column) => column.expr)) continue;\n if (index.columns.length !== parentColumns.length) continue;\n if (!index.columns.every((column, idx) => column.name.toLowerCase() === parentColumns[idx]!.toLowerCase()))\n continue;\n const rows: Row[] = [];\n for (const rowid of index.store.lookup(normalizedValues)) {\n const candidate = parent.get(rowid);\n if (candidate && parentRowMatchesFk(parent, parentColumns, values, excludeParent, candidate))\n rows.push(candidate);\n }\n return rows;\n }\n\n return [...parent.scan()].filter((candidate) =>\n parentRowMatchesFk(parent, parentColumns, values, excludeParent, candidate),\n );\n}\n\nfunction findChildRowsForFk(\n child: Table,\n childColumns: string[],\n parentColumns: string[],\n parent: Table,\n parentRow: Row,\n env: ExecutionEnv,\n): Row[] {\n const refValues = parentColumns.map((name) => parent.cell(parentRow, normalizeColumnName(name)));\n if (refValues.some((value) => value === null)) return [];\n\n if (childColumns.length === 1) {\n const col = childColumns[0]!.toLowerCase();\n const matches = child.lookupEquality(col, refValues[0]!);\n if (matches) {\n return matches.filter((candidate) =>\n foreignKeyMatches(childColumns, candidate, parentColumns, parentRow, child, parent),\n );\n }\n }\n\n const db = env.state.databaseForTable(child);\n const normalizedValues = refValues.map((value, index) => {\n const colName = childColumns[index]!;\n const column = child.columns.find((item) => (item.nameLower ?? item.name.toLowerCase()) === colName.toLowerCase());\n return normalizeForCollation(value, column?.collate ?? \"BINARY\");\n });\n for (const indexName of child.indexes) {\n const index = db.indexes.get(indexName.toLowerCase());\n if (!index || index.where || index.columns.some((column) => column.expr)) continue;\n if (index.columns.length < childColumns.length) continue;\n if (!childColumns.every((name, idx) => index.columns[idx]?.name.toLowerCase() === name.toLowerCase())) {\n continue;\n }\n const lookupValues = normalizedValues.slice(0, index.columns.length);\n const rowids =\n lookupValues.length === index.columns.length\n ? index.store.lookup(lookupValues)\n : index.store.lookupPrefix(lookupValues);\n const rows: Row[] = [];\n for (const rowid of rowids) {\n const candidate = child.get(rowid);\n if (candidate && foreignKeyMatches(childColumns, candidate, parentColumns, parentRow, child, parent)) {\n rows.push(candidate);\n }\n }\n return rows;\n }\n\n return [...child.scan()].filter((candidate) =>\n foreignKeyMatches(childColumns, candidate, parentColumns, parentRow, child, parent),\n );\n}\n\nexport function checkDeferredForeignKeys(env: ExecutionEnv): void {\n if (!env.state.foreignKeysEnabled) return;\n for (const table of env.state.tables.values()) {\n for (const constraint of table.constraints) {\n if (constraint.type !== \"foreign_key\" || !constraint.initiallyDeferred) continue;\n for (const row of table.scan()) assertForeignKeySatisfied(table, row, constraint, env);\n }\n }\n}\n\nfunction applyReferentialDelete(parent: Table, row: Row, env: ExecutionEnv): number {\n if (!env.state.foreignKeysEnabled) return 0;\n let changes = 0;\n const parentPk = parent.columns.filter((column) => column.primaryKey).map((column) => column.name);\n for (const childKey of [...env.state.tables.keys()]) {\n let child = env.state.tables.get(childKey);\n if (!child) continue;\n for (const constraint of child.constraints) {\n if (constraint.type !== \"foreign_key\" || constraint.refTable.toLowerCase() !== parent.name.toLowerCase())\n continue;\n child = env.state.ensureWritableTable(child);\n const target = child;\n const referenced = constraint.refColumns ?? parentPk;\n const matches = findChildRowsForFk(target, constraint.columns, referenced, parent, row, env).filter(\n (candidate) => !(target === parent && candidate.rowid === row.rowid),\n );\n for (const candidate of matches) {\n if (constraint.onDelete === \"CASCADE\") {\n changes += applyReferentialDelete(child, candidate, env);\n if (fireDeleteTriggers(\"BEFORE\", child, candidate, env) === \"ignore\") continue;\n removeOne(child, candidate, env);\n fireDeleteTriggers(\"AFTER\", child, candidate, env);\n changes++;\n } else if (constraint.onDelete === \"SET NULL\") {\n const updated = updateOne(\n child,\n candidate,\n new Map(constraint.columns.map((name) => [normalizeColumnName(name), null])),\n env,\n );\n changes += 1 + updated.cascaded;\n } else if (constraint.onDelete === \"SET DEFAULT\") {\n const updates = defaultUpdates(child, constraint.columns, env);\n // Default must resolve to a surviving parent row (exclude the row being deleted).\n assertForeignKeySatisfiedWithUpdates(child, candidate, constraint, updates, env, row);\n const updated = updateOne(child, candidate, updates, env);\n changes += 1 + updated.cascaded;\n } else if (constraint.onDelete === \"RESTRICT\" || !fkIsDeferred(constraint, env)) {\n throw new SqliteError(\"FOREIGN KEY constraint failed\", \"constraint_foreign\", \"SQLITE_CONSTRAINT_FOREIGNKEY\");\n }\n }\n }\n }\n return changes;\n}\n\nfunction applyReferentialUpdate(parent: Table, before: Row, after: Row, env: ExecutionEnv): number {\n if (!env.state.foreignKeysEnabled) return 0;\n let changes = 0;\n const parentPk = parent.columns.filter((column) => column.primaryKey).map((column) => column.name);\n for (const childKey of [...env.state.tables.keys()]) {\n let child = env.state.tables.get(childKey);\n if (!child) continue;\n for (const constraint of child.constraints) {\n if (constraint.type !== \"foreign_key\" || constraint.refTable.toLowerCase() !== parent.name.toLowerCase())\n continue;\n child = env.state.ensureWritableTable(child);\n const target = child;\n const referenced = constraint.refColumns ?? parentPk;\n const oldValues = referenced.map((name) => parent.cell(before, normalizeColumnName(name)));\n const newValues = referenced.map((name) => parent.cell(after, normalizeColumnName(name)));\n if (oldValues.every((value, index) => compareSql(value, newValues[index] ?? null) === 0)) continue;\n\n const matches = findChildRowsForFk(target, constraint.columns, referenced, parent, before, env);\n for (const candidate of matches) {\n if (constraint.onUpdate === \"CASCADE\") {\n const updated = updateOne(\n target,\n candidate,\n new Map(constraint.columns.map((name, index) => [normalizeColumnName(name), newValues[index] ?? null])),\n env,\n );\n changes += 1 + updated.cascaded;\n } else if (constraint.onUpdate === \"SET NULL\") {\n const updated = updateOne(\n target,\n candidate,\n new Map(constraint.columns.map((name) => [normalizeColumnName(name), null])),\n env,\n );\n changes += 1 + updated.cascaded;\n } else if (constraint.onUpdate === \"SET DEFAULT\") {\n const updated = updateOne(target, candidate, defaultUpdates(target, constraint.columns, env), env);\n changes += 1 + updated.cascaded;\n } else if (constraint.onUpdate === \"RESTRICT\" || !fkIsDeferred(constraint, env)) {\n throw new SqliteError(\"FOREIGN KEY constraint failed\", \"constraint_foreign\", \"SQLITE_CONSTRAINT_FOREIGNKEY\");\n }\n }\n }\n }\n return changes;\n}\n\nfunction foreignKeyMatches(\n childColumns: string[],\n child: Row,\n parentColumns: string[],\n parent: Row,\n childTable: Table,\n parentTable: Table,\n): boolean {\n const childValues = childColumns.map((name) => childTable.cell(child, normalizeColumnName(name)));\n if (childValues.some((value) => value === null)) return false;\n return childValues.every((value, index) => {\n const parentColumn = parentColumns[index];\n return (\n parentColumn !== undefined && compareSql(value, parentTable.cell(parent, normalizeColumnName(parentColumn))) === 0\n );\n });\n}\n\nfunction defaultUpdates(table: Table, columns: string[], env: ExecutionEnv): Map<string, SqlValue> {\n return new Map(\n columns.map((name) => {\n const column = columnOf(table, name);\n const value = column.defaultExpr ? evalExpr(column.defaultExpr, env.createEvalContext()) : null;\n return [normalizeColumnName(column.name), value];\n }),\n );\n}\n\nfunction scopeFor(table: Table, row: Row, alias: string, env?: ExecutionEnv): ScopeRow {\n const integerPkAlias = table.withoutRowid\n ? undefined\n : table.columns.find((column) => column.primaryKey && column.typeName?.trim().toUpperCase() === \"INTEGER\")?.name;\n const baseCells = table.columns\n .filter((c) => !c.generated || c.generated.stored)\n .map((column) => ({\n table: alias,\n name: column.name,\n value: table.cell(row, normalizeColumnName(column.name)),\n affinity: column.affinity,\n collate: column.collate,\n }));\n const cells = [...baseCells];\n if (env) {\n for (const column of table.columns) {\n if (!column.generated || column.generated.stored) continue;\n const ctx = env.createEvalContext({ cells: baseCells, sourceTable: table.name });\n const value = applyAffinity(evalExpr(column.generated.expr, ctx), column.affinity);\n cells.push({\n table: alias,\n name: column.name,\n value,\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n // Preserve column order\n cells.sort((a, b) => {\n const ai = table.columns.findIndex((c) => c.name.toLowerCase() === a.name.toLowerCase());\n const bi = table.columns.findIndex((c) => c.name.toLowerCase() === b.name.toLowerCase());\n return ai - bi;\n });\n } else {\n for (const column of table.columns) {\n if (!column.generated || column.generated.stored) continue;\n cells.push({\n table: alias,\n name: column.name,\n value: null,\n affinity: column.affinity,\n collate: column.collate,\n });\n }\n cells.sort((a, b) => {\n const ai = table.columns.findIndex((c) => c.name.toLowerCase() === a.name.toLowerCase());\n const bi = table.columns.findIndex((c) => c.name.toLowerCase() === b.name.toLowerCase());\n return ai - bi;\n });\n }\n return {\n ...(table.withoutRowid ? {} : { rowid: row.rowid }),\n rowidName: integerPkAlias ?? (table.withoutRowid ? undefined : \"rowid\"),\n sourceTable: table.name,\n cells,\n };\n}\n\nfunction projectReturning(columns: ResultColumn[], scope: ScopeRow, env: ExecutionEnv): SqlValue[] {\n const values: SqlValue[] = [];\n const ctx = env.createEvalContext(scope);\n for (const column of columns) {\n if (column.type === \"star\") {\n for (const cell of scope.cells)\n if (column.table === null || cell.table?.toLowerCase() === column.table.toLowerCase()) values.push(cell.value);\n } else values.push(evalExpr(column.expr, ctx));\n }\n return values;\n}\n\nfunction returningNames(columns: ResultColumn[], table: Table): string[] {\n return columns.flatMap((column) =>\n column.type === \"star\"\n ? table.columns.map((item) => item.name)\n : [column.alias ?? (column.expr.type === \"column\" ? column.expr.name : column.expr.type)],\n );\n}\n\nfunction columnOf(table: Table, name: string) {\n const column = table.columns.find((item) => item.name.toLowerCase() === name.toLowerCase());\n if (!column) throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n return column;\n}\n\nfunction isRowidName(name: string): boolean {\n const key = name.toLowerCase();\n return key === \"rowid\" || key === \"_rowid_\" || key === \"oid\";\n}\n\nfunction ftsScopeFor(table: Fts5VirtualTable, row: Fts5Row, alias: string): ScopeRow {\n return {\n rowid: row.rowid,\n rowidName: \"rowid\",\n sourceTable: table.name,\n cells: table.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n };\n}\n\nfunction executeVirtualInsert(stmt: InsertStmt, env: ExecutionEnv): ResultSet {\n const any = env.state.getAnyVirtualTable(stmt.table);\n if (any.kind === \"rtree\") {\n const columnNames = stmt.columns ?? any.columns;\n const sourceRows = stmt.values\n ? stmt.values.map((items) => items.map((expr) => evalExpr(expr, env.createEvalContext())))\n : stmt.select\n ? resultValues(executeSelect({ ...stmt.select, with: stmt.with ?? stmt.select.with }, env))\n : [[]];\n let changes = 0;\n let last = env.state.lastInsertRowid;\n for (const source of sourceRows) {\n const values = new Map<string, SqlValue>();\n for (let i = 0; i < columnNames.length; i++) {\n values.set(columnNames[i]!.toLowerCase(), source[i] ?? null);\n }\n last = any.insert(values);\n changes++;\n }\n env.state.recordChange(changes, last);\n return valuesToResult([], [], changes, last);\n }\n if (any.kind !== \"fts5\" && any.kind !== \"fts3\" && any.kind !== \"fts4\") {\n throw new SqliteError(`table ${stmt.table} may not be modified`, \"misuse\");\n }\n const table = any;\n const columnNames = stmt.columns ?? table.columns;\n for (const name of columnNames) {\n const lower = name.toLowerCase();\n if (lower === table.name.toLowerCase()) continue; // FTS special-command column\n if (lower === \"rowid\" || lower === \"_rowid_\" || lower === \"oid\") continue;\n if (!table.columns.some((column) => column.toLowerCase() === lower)) {\n throw new SqliteError(`table ${table.name} has no column named ${name}`, \"no_such_column\");\n }\n }\n const sourceRows = stmt.values\n ? stmt.values.map((items) => items.map((expr) => evalExpr(expr, env.createEvalContext())))\n : stmt.select\n ? resultValues(executeSelect({ ...stmt.select, with: stmt.with ?? stmt.select.with }, env))\n : [[]];\n const { changes, lastInsertRowid } = executeFtsInsert(table, columnNames, sourceRows, env);\n env.state.recordChange(changes, lastInsertRowid);\n return valuesToResult([], [], changes, lastInsertRowid);\n}\n\nfunction executeVirtualUpdate(stmt: UpdateStmt, env: ExecutionEnv): ResultSet {\n if (stmt.from) throw new SqliteError(\"UPDATE FROM is not supported\", \"unsupported\");\n const any = env.state.getAnyVirtualTable(stmt.table);\n if (any.kind === \"rtree\") {\n const alias = stmt.alias ?? stmt.table;\n const candidates = any.scan().filter((row) => {\n if (!stmt.where) return true;\n const scope: ScopeRow = {\n rowid: row.rowid,\n rowidName: \"rowid\",\n sourceTable: any.name,\n cells: any.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n };\n return isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope))) === true;\n });\n let changes = 0;\n for (const row of candidates) {\n const updates = new Map<string, SqlValue>();\n const scope: ScopeRow = {\n rowid: row.rowid,\n cells: any.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n };\n for (const item of stmt.set) {\n if (item.columns.length !== 1)\n throw new SqliteError(\"multi-column SET is not supported on virtual tables\", \"unsupported\");\n updates.set(item.columns[0]!.toLowerCase(), evalExpr(item.expr, env.createEvalContext(scope)));\n }\n any.update(row.rowid, updates);\n changes++;\n }\n env.state.recordChange(changes);\n return valuesToResult([], [], changes, env.state.lastInsertRowid);\n }\n if (any.kind !== \"fts5\" && any.kind !== \"fts3\" && any.kind !== \"fts4\") {\n throw new SqliteError(`table ${stmt.table} may not be modified`, \"misuse\");\n }\n const table = any;\n const alias = stmt.alias ?? stmt.table;\n const candidates: Rowid[] = [];\n for (const row of table.scan()) {\n const scope = ftsScopeFor(table, row, alias);\n if (stmt.where && isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope))) !== true) continue;\n candidates.push(row.rowid);\n }\n let changes = 0;\n for (const rowid of candidates) {\n const row = table.rows.get(rowid)!;\n const scope = ftsScopeFor(table, row, alias);\n const updates = evaluateFtsSet(stmt.set, table, env.createEvalContext(scope));\n executeFtsUpdate(table, updates, [rowid]);\n changes++;\n }\n env.state.recordChange(changes);\n return valuesToResult([], [], changes, env.state.lastInsertRowid);\n}\n\nfunction executeVirtualDelete(stmt: DeleteStmt, env: ExecutionEnv): ResultSet {\n const any = env.state.getAnyVirtualTable(stmt.table);\n if (any.kind === \"rtree\") {\n const alias = stmt.alias ?? stmt.table;\n const selected = any.scan().filter((row) => {\n if (!stmt.where) return true;\n const scope: ScopeRow = {\n rowid: row.rowid,\n cells: any.columns.map((column) => ({\n table: alias,\n name: column,\n value: row.values.get(column.toLowerCase()) ?? null,\n })),\n };\n return isTruthySql(evalExpr(stmt.where, env.createEvalContext(scope))) === true;\n });\n let changes = 0;\n for (const row of selected) {\n any.delete(row.rowid);\n changes++;\n }\n env.state.recordChange(changes);\n return valuesToResult([], [], changes, env.state.lastInsertRowid);\n }\n if (any.kind !== \"fts5\" && any.kind !== \"fts3\" && any.kind !== \"fts4\") {\n throw new SqliteError(`table ${stmt.table} may not be modified`, \"misuse\");\n }\n const table = any;\n const alias = stmt.alias ?? stmt.table;\n const selected = table.scan().filter((row) => {\n if (!stmt.where) return true;\n return isTruthySql(evalExpr(stmt.where, env.createEvalContext(ftsScopeFor(table, row, alias)))) === true;\n });\n const changes = executeFtsDelete(\n table,\n selected.map((row) => row.rowid),\n );\n env.state.recordChange(changes);\n return valuesToResult([], [], changes, env.state.lastInsertRowid);\n}\n\nfunction evaluateFtsSet(\n items: SetItem[],\n table: Fts5VirtualTable,\n ctx: ReturnType<ExecutionEnv[\"createEvalContext\"]>,\n): Map<string, SqlValue> {\n const updates = new Map<string, SqlValue>();\n for (const item of items) {\n if (item.columns.length !== 1)\n throw new SqliteError(\"multi-column SET is not supported on virtual tables\", \"unsupported\");\n const name = item.columns[0]!;\n if (!table.columns.some((column) => column.toLowerCase() === name.toLowerCase())) {\n throw new SqliteError(`no such column: ${name}`, \"no_such_column\");\n }\n updates.set(normalizeColumnName(name), evalExpr(item.expr, ctx));\n }\n return updates;\n}\n\nfunction asExplicitRowid(value: SqlValue): Rowid | undefined {\n if (value === null) return undefined;\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\" && Number.isSafeInteger(value)) return value;\n throw new SqliteError(\"datatype mismatch\", \"datatype_mismatch\", \"SQLITE_MISMATCH\");\n}\n", "import type { Expr } from \"../ast/nodes.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport {\n coercePragmaInt,\n coercePragmaTruthy,\n evalPragmaArgs,\n evalPragmaSetValue,\n queryPragma,\n} from \"./pragma-engine.ts\";\nimport { emptyResult, type ResultSet, valuesToResult } from \"./result.ts\";\n\nexport function executePragma(name: string, expr: Expr | null, env: ExecutionEnv): ResultSet {\n const key = name.toLowerCase();\n\n // Writable statement forms\n if (key === \"foreign_keys\" && expr !== null) {\n const value = evalPragmaSetValue(expr, env);\n if (!env.transactions.inTransaction) env.state.foreignKeysEnabled = coercePragmaTruthy(value);\n return emptyResult(0, env.state.lastInsertRowid);\n }\n if (key === \"case_sensitive_like\" && expr !== null) {\n const value = evalPragmaSetValue(expr, env);\n env.state.caseSensitiveLike = coercePragmaTruthy(value);\n return emptyResult(0, env.state.lastInsertRowid);\n }\n if ((key === \"user_version\" || key === \"schema_version\") && expr !== null) {\n const value = evalPragmaSetValue(expr, env);\n const num = coercePragmaInt(value);\n if (key === \"user_version\") env.state.userVersion = num;\n else env.state.schemaVersion = num;\n return emptyResult(0, env.state.lastInsertRowid);\n }\n\n const args = evalPragmaArgs(expr, env);\n const result = queryPragma(key, args, env);\n if (result.columns.length === 0 && result.rows.length === 0) {\n return emptyResult(0, env.state.lastInsertRowid);\n }\n return valuesToResult(result.columns, result.rows, 0, env.state.lastInsertRowid);\n}\n", "import type { ReindexStmt, Statement } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { heapRowCells, rebuildIndexFromTable } from \"../indexes/keys.ts\";\nimport { assertUnreachable } from \"../runtime/assert.ts\";\nimport type { DatabaseState, IndexInfo } from \"../storage/database-state.ts\";\nimport { executeAttach, executeDetach } from \"./attach.ts\";\nimport {\n executeAlterTable,\n executeCreateIndex,\n executeCreateTable,\n executeCreateView,\n executeDropIndex,\n executeDropTable,\n executeDropView,\n} from \"./ddl.ts\";\nimport { checkDeferredForeignKeys, executeDelete, executeInsert, executeUpdate } from \"./dml.ts\";\nimport type { ExecutionEnv } from \"./env.ts\";\nimport { executePragma } from \"./pragma.ts\";\nimport { emptyResult, type ResultSet, valuesToResult } from \"./result.ts\";\nimport { executeSelect } from \"./select.ts\";\nimport { executeCreateTrigger, executeDropTrigger } from \"./triggers.ts\";\nimport { executeCreateVirtualTable } from \"./vtable.ts\";\n\nexport function executeStatement(stmt: Statement, env: ExecutionEnv): ResultSet {\n env.selectRunner = executeSelect;\n switch (stmt.type) {\n case \"select\":\n return executeSelect(stmt, env);\n case \"insert\":\n return executeInsert(stmt, env);\n case \"update\":\n return executeUpdate(stmt, env);\n case \"delete\":\n return executeDelete(stmt, env);\n case \"create_table\":\n return executeCreateTable(stmt, env);\n case \"drop_table\":\n return executeDropTable(stmt, env);\n case \"alter_table\":\n return executeAlterTable(stmt, env);\n case \"create_index\":\n return executeCreateIndex(stmt, env);\n case \"drop_index\":\n return executeDropIndex(stmt, env);\n case \"create_view\":\n return executeCreateView(stmt, env);\n case \"drop_view\":\n return executeDropView(stmt, env);\n case \"create_trigger\":\n return executeCreateTrigger(stmt, env);\n case \"drop_trigger\":\n return executeDropTrigger(stmt, env);\n case \"create_virtual_table\":\n return executeCreateVirtualTable(stmt, env);\n case \"attach\":\n return executeAttach(stmt, env);\n case \"detach\":\n return executeDetach(stmt, env);\n case \"begin\":\n env.transactions.begin();\n return emptyResult(0, env.state.lastInsertRowid);\n case \"commit\":\n checkDeferredForeignKeys(env);\n env.transactions.commit();\n return emptyResult(0, env.state.lastInsertRowid);\n case \"rollback\":\n env.transactions.rollback(stmt.savepoint ?? undefined);\n return emptyResult(0, env.state.lastInsertRowid);\n case \"savepoint\":\n env.transactions.savepoint(stmt.name);\n return emptyResult(0, env.state.lastInsertRowid);\n case \"release\":\n env.transactions.release(stmt.name);\n return emptyResult(0, env.state.lastInsertRowid);\n case \"pragma\":\n return executePragma(stmt.name, stmt.value, env);\n case \"explain\":\n return valuesToResult(\n stmt.queryPlan\n ? [\"id\", \"parent\", \"notused\", \"detail\"]\n : [\"addr\", \"opcode\", \"p1\", \"p2\", \"p3\", \"p4\", \"p5\", \"comment\"],\n stmt.queryPlan\n ? [[0, 0, 0, `EXECUTE ${stmt.statement.type.toUpperCase()}`]]\n : [[0, \"Execute\", 0, 0, 0, stmt.statement.type, 0, null]],\n 0,\n env.state.lastInsertRowid,\n );\n case \"analyze\":\n return executeAnalyze(stmt, env);\n case \"reindex\":\n return executeReindex(stmt, env);\n case \"vacuum\":\n // :memory: VACUUM is a successful no-op (matches bun:sqlite).\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n default:\n return assertUnreachable(stmt);\n }\n}\n\nfunction executeReindex(stmt: ReindexStmt, env: ExecutionEnv): ResultSet {\n const targets = resolveReindexTargets(stmt, env);\n for (const { db, index } of targets) rebuildOneIndex(env, db, index);\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n\nfunction resolveReindexTargets(stmt: ReindexStmt, env: ExecutionEnv): Array<{ db: DatabaseState; index: IndexInfo }> {\n if (stmt.name === null) {\n return allDatabaseStates(env.state).flatMap((db) => [...db.indexes.values()].map((index) => ({ db, index })));\n }\n const name = stmt.name;\n const collation = builtinCollationName(name);\n // SQLite: collation-name wins over a table/index of the same name when un-qualified.\n if (stmt.schema === null && collation) {\n return allDatabaseStates(env.state).flatMap((db) =>\n [...db.indexes.values()].filter((index) => indexUsesCollation(index, collation)).map((index) => ({ db, index })),\n );\n }\n const db = env.state.databaseForSchema(stmt.schema, stmt.schema ? `${stmt.schema}.${name}` : name);\n const table = db.tables.get(name.toLowerCase());\n if (table) {\n return table.indexes\n .map((indexName) => db.indexes.get(indexName.toLowerCase()))\n .filter((index): index is IndexInfo => index !== undefined)\n .map((index) => ({ db, index }));\n }\n const index = db.indexes.get(name.toLowerCase());\n if (index) return [{ db, index }];\n throw new SqliteError(`unable to identify the object to be reindexed: ${qualifiedReindexName(stmt)}`, \"other\");\n}\n\nfunction rebuildOneIndex(env: ExecutionEnv, db: DatabaseState, index: IndexInfo): void {\n const table = db.tables.get(index.tableName.toLowerCase());\n if (!table) return;\n const writable = db.ensureWritableIndex(index);\n rebuildIndexFromTable(writable, table, (row) =>\n env.createEvalContext({ rowid: row.rowid, sourceTable: table.name, cells: heapRowCells(table, row, env) }),\n );\n}\n\nfunction allDatabaseStates(root: DatabaseState): DatabaseState[] {\n return [root, ...[...root.attached.values()].map((entry) => entry.state)];\n}\n\nfunction indexUsesCollation(index: IndexInfo, collation: string): boolean {\n return index.columns.some((column) => (column.collate ?? \"BINARY\").toUpperCase() === collation);\n}\n\nfunction builtinCollationName(name: string): \"BINARY\" | \"NOCASE\" | \"RTRIM\" | null {\n const upper = name.toUpperCase();\n if (upper === \"BINARY\" || upper === \"NOCASE\" || upper === \"RTRIM\") return upper;\n return null;\n}\n\nfunction qualifiedReindexName(stmt: ReindexStmt): string {\n return stmt.schema ? `${stmt.schema}.${stmt.name}` : (stmt.name ?? \"\");\n}\n\nfunction executeAnalyze(stmt: import(\"../ast/nodes.ts\").AnalyzeStmt, env: ExecutionEnv): ResultSet {\n // Populate sqlite_stat1 with simple row counts for oracle-visible ANALYZE behavior.\n let stat = env.state.tables.get(\"sqlite_stat1\");\n if (!stat) {\n env.state.createTable(\n {\n type: \"create_table\",\n ifNotExists: true,\n temp: false,\n name: \"sqlite_stat1\",\n columns: [\n { name: \"tbl\", typeName: \"TEXT\", constraints: [] },\n { name: \"idx\", typeName: \"TEXT\", constraints: [] },\n { name: \"stat\", typeName: \"TEXT\", constraints: [] },\n ],\n constraints: [],\n asSelect: null,\n withoutRowid: false,\n strict: false,\n },\n \"CREATE TABLE sqlite_stat1(tbl,idx,stat)\",\n );\n stat = env.state.tables.get(\"sqlite_stat1\");\n }\n if (stat) {\n for (const row of [...stat.scan()]) {\n stat.delete(row.rowid);\n }\n const tables = [...env.state.tables.values()].filter((t) => t.name.toLowerCase() !== \"sqlite_stat1\");\n const targets = stmt.name ? tables.filter((t) => t.name.toLowerCase() === stmt.name!.toLowerCase()) : tables;\n for (const table of targets) {\n const rowCount = [...table.scan()].length;\n const indexes = [...env.state.indexes.values()].filter(\n (i) => i.tableName.toLowerCase() === table.name.toLowerCase(),\n );\n if (indexes.length === 0) {\n stat.insert(\n new Map<string, import(\"../types/value.ts\").SqlValue>([\n [\"tbl\", table.name],\n [\"idx\", null],\n [\"stat\", String(rowCount)],\n ]),\n );\n } else {\n for (const index of indexes) {\n stat.insert(\n new Map<string, import(\"../types/value.ts\").SqlValue>([\n [\"tbl\", table.name],\n [\"idx\", index.name],\n [\"stat\", `${rowCount} ${Math.max(1, Math.floor(rowCount / 2))}`],\n ]),\n );\n }\n }\n }\n }\n env.state.recordChange(0);\n return emptyResult(0, env.state.lastInsertRowid);\n}\n", "import type { Statement as AstStatement } from \"../ast/nodes.ts\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { ExecutionEnv } from \"../executor/env.ts\";\nimport { executeStatement } from \"../executor/execute.ts\";\nimport { emptyResult, type ResultSet } from \"../executor/result.ts\";\nimport { tokenize } from \"../lexer/tokenize.ts\";\nimport { parseUnits } from \"../parser/index.ts\";\nimport type { BindValue, QueryRow } from \"../types/value.ts\";\nimport type { Database } from \"./database.ts\";\n\n/** Mutation counters returned by {@link Statement.run}. */\nexport interface RunResult {\n /** Rows changed by this execution (SQLite `changes()`). */\n changes: number;\n /** Rowid of the most recent INSERT in this execution. */\n lastInsertRowid: number | bigint;\n}\n\n/**\n * Prepared SQL statement bound to a {@link Database}.\n *\n * Create with {@link Database.prepare}. Pass bind values as rest arguments to\n * {@link run}, {@link all}, {@link get}, or {@link result} on each call\n * (stateless \u2014 there is no sticky `bind()`).\n *\n * @example\n * ```ts\n * import { Database } from \"@crvouga/mockingbird-service-sqlite\";\n *\n * const db = new Database();\n * db.exec(\"CREATE TABLE t (id INTEGER PRIMARY KEY, name TEXT)\");\n * const insert = db.prepare(\"INSERT INTO t (name) VALUES (?)\");\n * insert.run(\"Ada\");\n * const row = db.prepare(\"SELECT id, name FROM t WHERE id = ?\").get<{ id: number; name: string }>(1);\n * ```\n */\nexport class Statement {\n private namedPlan: ReturnType<typeof planNamedParameters> | null = null;\n private env: ExecutionEnv | null = null;\n private statements: AstStatement[];\n private statementSqls: string[];\n private schemaVersion: number;\n\n private constructor(\n private readonly database: Database,\n private readonly sql: string,\n statements: AstStatement[],\n statementSqls: string[],\n ) {\n this.statements = statements;\n this.statementSqls = statementSqls;\n this.schemaVersion = database.state.schemaVersion;\n }\n\n /**\n * Construct a {@link Statement} for {@link Database.prepare} / {@link Database.exec}.\n * @internal\n */\n static create(database: Database, sql: string, statements: AstStatement[], statementSqls?: string[]): Statement {\n return new Statement(database, sql, statements, statementSqls ?? statements.map(() => sql));\n }\n\n /** @internal Build from {@link parseUnits}. */\n static createFromSql(database: Database, sql: string): Statement {\n const units = parseUnits(sql);\n return new Statement(\n database,\n sql,\n units.map((u) => u.statement),\n units.map((u) => u.sql),\n );\n }\n\n /**\n * Execute for side effects (INSERT / UPDATE / DELETE / DDL).\n *\n * @param params - Bind values for this call only.\n * @returns Mutation counters for this execution.\n * @throws {SqliteError} If the database is closed, the statement is empty, or execution fails.\n */\n run(...params: BindValue[]): RunResult {\n const result = this.execute(params, { named: false });\n return { changes: result.changes, lastInsertRowid: result.lastInsertRowid };\n }\n\n /**\n * Execute and return every result row as an object keyed by column name.\n *\n * @typeParam T - Row shape. Defaults to {@link QueryRow}.\n * @param params - Bind values for this call only.\n * @throws {SqliteError} If the database is closed, the statement is empty, or execution fails.\n */\n all<T = QueryRow>(...params: BindValue[]): T[] {\n return this.execute(params, { named: true }).rows as T[];\n }\n\n /**\n * Execute and return the full {@link ResultSet}, including column names.\n *\n * Use this when you need metadata for an empty result (column names with zero rows).\n * {@link all} only returns row objects.\n *\n * @param params - Bind values for this call only.\n * @throws {SqliteError} If the database is closed, the statement is empty, or execution fails.\n */\n result(...params: BindValue[]): ResultSet {\n return this.execute(params, { named: true });\n }\n\n /**\n * Execute and return the first row, or `undefined` if there are no rows.\n *\n * @typeParam T - Row shape. Defaults to {@link QueryRow}.\n * @param params - Bind values for this call only.\n * @throws {SqliteError} If the database is closed, the statement is empty, or execution fails.\n */\n get<T = QueryRow>(...params: BindValue[]): T | undefined {\n return this.execute(params, { named: true, maxRows: 1 }).rows[0] as T | undefined;\n }\n\n private execute(params: readonly BindValue[], options?: { named?: boolean; maxRows?: number }): ResultSet {\n this.database.assertOpen();\n this.reprepareIfSchemaChanged();\n if (this.statements.length === 0) {\n if (options?.named) throw new SqliteError(\"empty statement\", \"misuse\");\n return emptyResult(this.database.state.changes, this.database.state.lastInsertRowid);\n }\n this.namedPlan ??= planNamedParameters(this.sql);\n const expected = this.namedPlan.expectedCount;\n if (params.length > 0 && params.length !== expected) {\n throw new SqliteError(`SQLite query expected ${expected} values, received ${params.length}`, \"misuse\");\n }\n const env = this.obtainEnv(params);\n env.maxRows = options?.maxRows ?? Number.POSITIVE_INFINITY;\n env.includeNamedRows = options?.named !== false;\n env.includeValues = true;\n this.bindNamed(env, params);\n let result: ResultSet | undefined;\n for (let i = 0; i < this.statements.length; i++) {\n env.statementSql = this.statementSqls[i] ?? this.sql;\n result = executeStatement(this.statements[i]!, env);\n }\n env.statementSql = null;\n return result!;\n }\n\n private obtainEnv(params: readonly BindValue[]): ExecutionEnv {\n if (this.env) {\n this.env.reset(params);\n this.env.hooks.now = this.database.now;\n this.env.hooks.random = () => this.database.prng.nextSqliteRandom();\n this.env.hooks.randomU64 = () => this.database.prng.nextU64();\n return this.env;\n }\n this.env = new ExecutionEnv(this.database.state, this.database.transactions, params, undefined, {\n now: this.database.now,\n random: () => this.database.prng.nextSqliteRandom(),\n randomU64: () => this.database.prng.nextU64(),\n });\n return this.env;\n }\n\n private reprepareIfSchemaChanged(): void {\n if (this.schemaVersion === this.database.state.schemaVersion) return;\n const units = parseUnits(this.sql);\n this.statements = units.map((u) => u.statement);\n this.statementSqls = units.map((u) => u.sql);\n this.env = null;\n this.namedPlan = null;\n this.schemaVersion = this.database.state.schemaVersion;\n }\n\n private bindNamed(env: ExecutionEnv, params: readonly BindValue[]): void {\n this.namedPlan ??= planNamedParameters(this.sql);\n for (const item of this.namedPlan.named) {\n if (item.slot <= params.length) env.setNamed(item.name, params[item.slot - 1]);\n }\n }\n}\n\ninterface NamedPlan {\n named: { name: string; slot: number }[];\n /** Highest bind slot index (SQLite parameter count). */\n expectedCount: number;\n}\n\nfunction planNamedParameters(sql: string): NamedPlan {\n const tokens = tokenize(sql);\n let nextSlot = 1;\n const namedSlots = new Map<string, number>();\n const named: { name: string; slot: number }[] = [];\n for (const token of tokens) {\n if (token.kind === \"PARAM_POS\") {\n if (token.index !== undefined) nextSlot = Math.max(nextSlot, token.index + 1);\n else nextSlot++;\n } else if (token.kind === \"PARAM_NAMED\") {\n const name = token.value.toLowerCase();\n let slot = namedSlots.get(name);\n if (slot === undefined) {\n slot = nextSlot++;\n namedSlots.set(name, slot);\n named.push({ name, slot });\n }\n }\n }\n return { named, expectedCount: nextSlot - 1 };\n}\n\n/**\n * Bind named placeholders into an execution environment.\n * @internal\n */\nexport function bindNamedParameters(env: ExecutionEnv, sql: string, params: readonly BindValue[]): void {\n const plan = planNamedParameters(sql);\n for (const item of plan.named) {\n if (item.slot <= params.length) env.setNamed(item.name, params[item.slot - 1]);\n }\n}\n", "import { type Checkpoint, Timeline } from \"@crvouga/mockingbird-core\";\nimport { SqliteError } from \"../errors/index.ts\";\nimport { parseUnits } from \"../parser/index.ts\";\nimport {\n type Clock,\n type DatabaseOptions,\n DEFAULT_DATABASE_SEED,\n fixedClock,\n OsEntropy,\n Prng,\n type RandomMode,\n resolveClock,\n} from \"../runtime/index.ts\";\nimport { DatabaseState } from \"../storage/database-state.ts\";\nimport { TransactionManager } from \"../transactions/manager.ts\";\nimport type { BindValue, QueryRow } from \"../types/value.ts\";\nimport { captureSnapshot, type Snapshot } from \"./snapshot.ts\";\nimport { Statement } from \"./statement.ts\";\n\nconst ADOPT = Symbol(\"sqlite-mem.adopt\");\n\ninterface AdoptedDatabase {\n readonly [ADOPT]: true;\n readonly state: DatabaseState;\n readonly prng: Prng;\n readonly now: Clock;\n readonly seed: number | bigint;\n readonly randomMode: RandomMode;\n readonly systemClock: boolean;\n}\n\n/** A timeline checkpoint without its retained snapshot value. */\nexport interface HistoryCheckpoint {\n id: string;\n branch: string;\n parent: string | null;\n at: number;\n}\n\n/** Branch heads and checkpoints owned by the shared Timeline. */\nexport interface DatabaseHistory {\n readonly size: number;\n head(branch?: string): HistoryCheckpoint | undefined;\n branches(): Readonly<Record<string, string>>;\n checkpoints(): readonly HistoryCheckpoint[];\n}\n\n/** Additive time-travel controls for read APIs. */\nexport interface QueryOptions {\n /**\n * Execute against this immutable snapshot, or a timeline checkpoint id,\n * instead of the live database.\n */\n at?: Snapshot | string;\n}\n\n/**\n * Pure TypeScript in-memory SQLite database.\n *\n * Deterministic by default: `random()` / `randomblob()` use a seeded PRNG\n * (`seed` defaults to `1`) and `date('now')` / friends use a fixed clock\n * (`2000-01-01T00:00:00.000Z`). Pass `{ random: \"os\" }` and `{ now: \"system\" }`\n * for SQLite-like CSPRNG and wall-clock `'now'`. There is no filesystem or WASM.\n *\n * @example\n * ```ts\n * import { Database } from \"@crvouga/mockingbird-service-sqlite\";\n *\n * const db = new Database();\n * db.exec(\"CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT NOT NULL)\");\n * db.prepare(\"INSERT INTO users (name) VALUES (?)\").run(\"Alice\");\n * const users = db.query<{ id: number; name: string }>(\"SELECT * FROM users\");\n * ```\n */\nexport class Database {\n /** @internal Engine catalog, tables, and mutation counters. */\n readonly state: DatabaseState;\n /** Seed used to construct the PRNG. Ignored when {@link randomMode} is `\"os\"`. */\n readonly seed: number | bigint;\n /** Entropy mode for `random()` / `randomblob()`. */\n readonly randomMode: RandomMode;\n /**\n * When true, `'now'` follows the wall clock and is not frozen by {@link Snapshot.open}.\n * @internal\n */\n readonly systemClock: boolean;\n /**\n * PRNG backing `random()` / `randomblob()` and related builtins.\n * Prefer passing `seed` / `random` to the constructor.\n * @internal\n */\n readonly prng: Prng;\n /**\n * Clock used by `date('now')` / `datetime('now')` / `CURRENT_TIMESTAMP`.\n * Prefer passing `now` to the constructor.\n * @internal\n */\n now: Clock;\n /** @internal Transaction / savepoint manager. */\n readonly transactions: TransactionManager;\n private closed = false;\n private transactionSequence = 0;\n /** Depth of active {@link transaction} callbacks (not SQL BEGIN). */\n private apiTransactionDepth = 0;\n /** @internal Shared checkpoint DAG. Omitted from published declarations. */\n readonly timeline: Timeline<Snapshot>;\n private historyBranch = \"main\";\n private originId = \"\";\n\n /**\n * Create an empty in-memory database.\n *\n * @param options - Determinism knobs. See {@link DatabaseOptions}.\n */\n constructor(options: DatabaseOptions = {}) {\n if (isAdopted(options)) {\n this.seed = options.seed;\n this.randomMode = options.randomMode;\n this.systemClock = options.systemClock;\n this.prng = options.prng;\n this.now = options.now;\n this.state = options.state;\n this.transactions = new TransactionManager(this.state, this.prng);\n } else {\n this.seed = options.seed ?? DEFAULT_DATABASE_SEED;\n this.randomMode = options.random ?? \"deterministic\";\n this.systemClock = options.now === \"system\";\n this.prng = this.randomMode === \"os\" ? new OsEntropy() : new Prng(this.seed);\n this.now = resolveClock(options.now);\n this.state = new DatabaseState();\n this.transactions = new TransactionManager(this.state, this.prng);\n }\n this.timeline = new Timeline<Snapshot>({\n now: () => this.now().getTime(),\n ...(options.maxCheckpoints !== undefined ? { maxCheckpoints: options.maxCheckpoints } : {}),\n });\n const origin = this.timeline.commit(this.captureLive());\n this.originId = origin.id;\n this.timeline.retain(origin.id);\n }\n\n /**\n * Execute SQL for its side effects (DDL/DML). Multiple statements are allowed.\n *\n * Does not accept bind parameters \u2014 use {@link prepare} or {@link query}.\n *\n * @param sql - SQL to run (semicolon-separated statements are ok).\n * @throws {SqliteError} If the database is closed, extra arguments are passed, or the SQL fails.\n */\n exec(sql: string): void {\n this.assertOpen();\n // Runtime guard: TypeScript rejects a second argument; JS callers must still get misuse.\n // biome-ignore lint/complexity/noArguments: intentional arity check for the frozen exec(sql) signature\n if (arguments.length > 1) {\n throw new SqliteError(\"exec() does not accept parameters; use prepare() or query()\", \"misuse\");\n }\n Statement.createFromSql(this, sql).run();\n }\n\n /**\n * Execute a single-statement query and return all rows as objects keyed by column name.\n *\n * @typeParam T - Row shape. Defaults to {@link QueryRow}.\n * @param sql - A single SQL statement (trailing `;` is fine).\n * @param params - Bound parameters for `?` / `:name` placeholders.\n * @returns All result rows.\n * @throws {SqliteError} If the database is closed, `sql` is not a single statement, or execution fails.\n */\n query<T = QueryRow>(sql: string, params: readonly BindValue[] = [], options: QueryOptions = {}): T[] {\n this.assertOpen();\n const at = options.at;\n if (typeof at === \"string\") {\n try {\n return this.timeline.get(at).value.open().query<T>(sql, params);\n } catch (error) {\n this.historyError(error);\n }\n }\n if (at) return at.open().query<T>(sql, params);\n return this.prepareSingle(sql).all<T>(...params);\n }\n\n /**\n * Compile a single SQL statement into a reusable {@link Statement}.\n *\n * @param sql - A single SQL statement (trailing `;` is fine). Multi-statement scripts are rejected.\n * @throws {SqliteError} If the database is closed or `sql` cannot be prepared as one statement.\n */\n prepare(sql: string): Statement {\n this.assertOpen();\n return this.prepareSingle(sql);\n }\n\n /**\n * Run `fn` inside a transaction. Commits on success; rolls back if `fn` throws.\n *\n * Nested calls use SAVEPOINTs so an inner failure does not abort the outer\n * transaction. Calling {@link close} from inside `fn` throws `misuse`.\n *\n * @param fn - Work to run while the transaction is open.\n * @returns The value returned by `fn`.\n * @throws {SqliteError} If the database is closed. Re-throws whatever `fn` throws after rollback.\n */\n transaction<T>(fn: () => T): T {\n this.assertOpen();\n this.apiTransactionDepth++;\n try {\n if (!this.transactions.inTransaction) {\n this.transactions.begin();\n try {\n const value = fn();\n this.transactions.commit();\n return value;\n } catch (error) {\n this.transactions.rollback();\n throw error;\n }\n }\n const name = `__api_transaction_${++this.transactionSequence}`;\n this.transactions.savepoint(name);\n try {\n const value = fn();\n this.transactions.release(name);\n return value;\n } catch (error) {\n this.transactions.rollback(name);\n this.transactions.release(name);\n throw error;\n }\n } finally {\n this.apiTransactionDepth--;\n }\n }\n\n /**\n * Freeze this database into a reusable {@link Snapshot} template.\n *\n * Does not encode SQLM bytes. Call {@link Snapshot.encode} to persist, or\n * {@link Snapshot.open} for a copy-on-write fork.\n *\n * @throws {SqliteError} If the database is closed or a transaction is open.\n */\n snapshot(): Snapshot {\n const point = this.record(this.historyBranch);\n return this.timeline.get(point.id).value;\n }\n\n /** Alias for {@link snapshot}, naming the value as a timeline checkpoint. */\n checkpoint(): Snapshot {\n return this.snapshot();\n }\n\n /**\n * Commit the live state onto `branch` (default: the branch this database follows).\n * Does not switch the live database. Illegal inside a transaction.\n */\n record(branch = this.historyBranch): HistoryCheckpoint {\n this.assertOpen();\n if (this.transactions.inTransaction) {\n throw new SqliteError(\"cannot snapshot during a transaction\", \"transaction\");\n }\n try {\n return project(this.timeline.commit(this.captureLive(), { branch }));\n } catch (error) {\n this.historyError(error);\n }\n }\n\n /** Point `name` at a checkpoint without copying rows or switching the live database. */\n fork(name: string, at?: string): HistoryCheckpoint {\n this.assertOpen();\n try {\n const point = this.timeline.fork(name, at !== undefined ? { from: at } : {});\n if (!point) throw new SqliteError(\"no checkpoint to fork from\", \"misuse\");\n return project(point);\n } catch (error) {\n if (error instanceof SqliteError) throw error;\n this.historyError(error);\n }\n }\n\n /** Move `branch` to `id` and install that checkpoint as the live database. */\n checkout(id: string, branch = this.historyBranch): HistoryCheckpoint {\n this.assertOpen();\n if (this.transactions.inTransaction) {\n throw new SqliteError(\"cannot checkout during a transaction\", \"transaction\");\n }\n try {\n const point = this.timeline.checkout(branch, id);\n this.historyBranch = branch;\n this.install(point.value);\n return project(point);\n } catch (error) {\n this.historyError(error);\n }\n }\n\n /** Return the live database to the origin checkpoint on `main`. */\n reset(): HistoryCheckpoint {\n return this.checkout(this.originId, \"main\");\n }\n\n /** Checkpoint ids and branch heads. Values stay inside the timeline. */\n get history(): DatabaseHistory {\n const timeline = this.timeline;\n return {\n get size() {\n return timeline.size;\n },\n head(branch?: string) {\n const point = timeline.head(branch);\n return point ? project(point) : undefined;\n },\n branches() {\n return timeline.branches();\n },\n checkpoints() {\n return timeline.checkpoints().map(project);\n },\n };\n }\n\n /** Open a copy-on-write branch from `at`, or from the current state when omitted. */\n branch(at: Snapshot = this.snapshot()): Database {\n this.assertOpen();\n return at.open();\n }\n\n /**\n * Close the database. Further SQL throws {@link SqliteError}. Idempotent.\n *\n * Rolls back an open SQL transaction, if any. Throws if called from inside\n * a {@link transaction} callback.\n */\n close(): void {\n if (this.closed) return;\n if (this.apiTransactionDepth > 0) {\n throw new SqliteError(\"cannot close database inside transaction()\", \"misuse\");\n }\n if (this.transactions.inTransaction) this.transactions.rollback();\n this.closed = true;\n }\n\n /**\n * Rows changed by the most recent INSERT / UPDATE / DELETE (SQLite `changes()`).\n *\n * @throws {SqliteError} If the database is closed.\n */\n get changes(): number {\n this.assertOpen();\n return this.state.changes;\n }\n\n /**\n * Rowid of the most recent INSERT (SQLite `last_insert_rowid()`).\n *\n * @throws {SqliteError} If the database is closed.\n */\n get lastInsertRowid(): number | bigint {\n this.assertOpen();\n return this.state.lastInsertRowid;\n }\n\n /**\n * Cumulative rows changed by INSERT / UPDATE / DELETE (SQLite `total_changes()`).\n *\n * @throws {SqliteError} If the database is closed.\n */\n get totalChanges(): number {\n this.assertOpen();\n return this.state.totalChanges;\n }\n\n /**\n * Throw if {@link close} has already been called.\n * @internal\n * @throws {SqliteError} If the database is closed.\n */\n assertOpen(): void {\n if (this.closed) throw new SqliteError(\"Database is closed\", \"misuse\");\n }\n\n private historyError(error: unknown): never {\n const message = error instanceof Error ? error.message : String(error);\n throw new SqliteError(message, \"misuse\");\n }\n\n private captureLive(): Snapshot {\n return captureSnapshot(this.state, this.prng, this.now, this.seed, this.randomMode, this.systemClock);\n }\n\n private install(snapshot: Snapshot): void {\n this.state.replaceWith(snapshot.state.cloneShallow(), { adopt: true });\n this.prng.setState(snapshot.prngState);\n if (!this.systemClock) this.now = fixedClock(new Date(snapshot.nowMs));\n }\n\n private prepareSingle(sql: string): Statement {\n const units = parseUnits(sql);\n if (units.length === 0) {\n throw new SqliteError(\"empty statement\", \"misuse\");\n }\n if (units.length > 1) {\n throw new SqliteError(\"query()/prepare() accept a single statement only; use exec() for scripts\", \"misuse\");\n }\n return Statement.create(\n this,\n sql,\n units.map((u) => u.statement),\n units.map((u) => u.sql),\n );\n }\n}\n\nconst disposeKey = (Symbol as unknown as { dispose?: symbol }).dispose;\nif (typeof disposeKey === \"symbol\") {\n Object.defineProperty(Database.prototype, disposeKey, {\n value: function (this: Database): void {\n this.close();\n },\n writable: true,\n configurable: true,\n });\n}\n\nfunction isAdopted(value: object): value is AdoptedDatabase {\n return ADOPT in value;\n}\n\nfunction project(point: Checkpoint<Snapshot>): HistoryCheckpoint {\n return { id: point.id, branch: point.branch, parent: point.parent, at: point.at };\n}\n\n/** @internal Used by {@link Snapshot.open}. */\nexport function createAdoptedDatabase(opts: Omit<AdoptedDatabase, typeof ADOPT>): Database {\n return new Database({\n [ADOPT]: true,\n ...opts,\n } as DatabaseOptions);\n}\n\nexport { Snapshot } from \"./snapshot.ts\";\nexport type { DatabaseOptions };\n", "/**\n * The shared mock admin API in front of an in-memory SQLite database.\n * `GET /__admin/ui` is the shell; `GET /sql/tables` and `POST /sql/query` feed the explorer.\n *\n * @module\n */\n// Relative on purpose. A package dependency on @crvouga/mockingbird-service makes a\n// Turbo build cycle: that package depends on @crvouga/mockingbird-sqlite, which depends\n// on this package. The admin bundle inlines this module.\nimport {\n createEngineAdmin,\n type EngineAdmin,\n type SqlCheckpoint,\n type SqlColumn,\n type SqlEngine,\n type SqlPage,\n type SqlResult,\n type SqlTable,\n} from \"../../core/src/engine-admin.ts\";\nimport { Database, type DatabaseOptions, type HistoryCheckpoint } from \"./api/database.ts\";\nimport type { BindValue } from \"./types/value.ts\";\n\nexport interface AdminOptions {\n /** Database for the `default` namespace. Other namespaces open a fresh engine. */\n database?: Database;\n adminPrefix?: string\n adminKey?: string;\n /** Options for namespaces opened after `default`, and for `default` when `database` is omitted. */\n databaseOptions?: DatabaseOptions;\n}\n\nconst QUERY_CAP = 500;\n\nconst quoteIdent = (name: string): string => `\"${name.replaceAll('\"', '\"\"')}\"`;\n\nconst bounded = (value: number): number => {\n if (!Number.isSafeInteger(value) || value < 0) throw new Error(\"limit and offset must be non-negative integers\");\n return value;\n};\n\nconst asNumber = (value: unknown): number => {\n if (typeof value === \"number\") return value;\n if (typeof value === \"bigint\") return Number(value);\n if (typeof value === \"string\" && value.trim() !== \"\") return Number(value);\n return 0;\n};\n\nconst point = (checkpoint: HistoryCheckpoint): SqlCheckpoint => ({\n id: checkpoint.id,\n branch: checkpoint.branch,\n parent: checkpoint.parent,\n at: checkpoint.at,\n});\n\nconst touch = (db: Database): void => {\n if (!db.transactions.inTransaction) db.record();\n};\n\nconst columnsOf = (db: Database, name: string): SqlColumn[] => {\n try {\n return db\n .query<{ name: string; type: string; pk: number }>(`PRAGMA table_info(${quoteIdent(name)})`)\n .map((column) => ({\n name: column.name,\n type: column.type,\n ...(column.pk > 0 ? { primaryKey: true } : {}),\n }));\n } catch {\n return [];\n }\n};\n\nconst listed = (db: Database): SqlTable[] =>\n db\n .query<{ type: string; name: string }>(\n `SELECT type, name FROM sqlite_master\n WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%'\n ORDER BY name`,\n )\n .map((row) => ({\n schema: \"main\",\n name: row.name,\n kind: row.type === \"view\" ? \"view\" : \"table\",\n columns: columnsOf(db, row.name),\n }));\n\nconst requireTable = (db: Database, schema: string, table: string): SqlTable => {\n const found = listed(db).find((item) => item.schema === schema && item.name === table);\n if (!found) throw new Error(`no table ${schema}.${table}`);\n return found;\n};\n\nconst adapt = (db: Database): SqlEngine => ({\n tables: () => listed(db),\n page(schema, table, limit, offset): SqlPage {\n const found = requireTable(db, schema, table);\n const from = quoteIdent(table);\n const take = bounded(limit);\n const skip = bounded(offset);\n const totalRow = db.query<{ count: unknown }>(`SELECT count(*) AS count FROM ${from}`);\n const total = asNumber(totalRow[0]?.count);\n const rows = db.query<Record<string, unknown>>(`SELECT * FROM ${from} LIMIT ${take} OFFSET ${skip}`);\n return {\n columns: rows[0] ? Object.keys(rows[0]) : found.columns.map((column) => column.name),\n rows,\n total,\n };\n },\n query(sql, params): SqlResult {\n const rows = db.query<Record<string, unknown>>(sql, params as BindValue[]);\n touch(db);\n const truncated = rows.length > QUERY_CAP;\n const sliced = truncated ? rows.slice(0, QUERY_CAP) : rows;\n return {\n columns: sliced[0] ? Object.keys(sliced[0]) : [],\n rows: sliced,\n rowCount: rows.length,\n ...(truncated ? { truncated: true } : {}),\n };\n },\n exec(sql) {\n db.exec(sql);\n touch(db);\n return { rowCount: db.changes };\n },\n checkpoint: (branch) => point(db.record(branch)),\n fork: (name, at) => point(at !== undefined ? db.fork(name, at) : db.fork(name)),\n checkout: (id, branch) => {\n db.checkout(id, branch);\n },\n retain: (id) => {\n db.timeline.retain(id);\n },\n release: (id) => db.timeline.release(id),\n inspect: () => ({ branches: db.history.branches(), checkpoints: db.history.checkpoints() }),\n reset: () => {\n db.reset();\n },\n});\n\n/** Admin fetch handler. SQL is only available through `/__admin`. */\nexport function createAdmin(options: AdminOptions = {}): EngineAdmin {\n const seeded = options.database;\n return createEngineAdmin({\n name: \"sqlite\",\n dialect: \"sqlite\",\n ...(options.adminPrefix !== undefined ? { adminPrefix: options.adminPrefix } : {}),\n ...(options.adminKey !== undefined ? { adminKey: options.adminKey } : {}),\n open(namespace) {\n if (namespace === \"default\" && seeded) return adapt(seeded);\n return adapt(new Database(options.databaseOptions ?? {}));\n },\n });\n}\n"],
5
+ "mappings": "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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAiaoB,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAQjB,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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AA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;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;AAA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",
6
+ "names": ["text", "columnsOf", "listed", "readJson", "numeric", "textOf", "preview", "text", "isRecord", "point", "json", "document", "numeric", "next", "json", "adminError", "isRecord", "text", "registry", "num", "right", "alias", "window", "e", "left", "right", "text", "a", "b", "s", "text", "text", "window", "rowid", "colDef", "sameRowid", "rowid", "candidate", "snapshot", "rank", "canonicalRowid", "pack", "pad", "asRowid", "pack", "text", "systemClock", "date", "text", "pad", "text", "key", "digits", "text", "json", "walk", "requireArgs", "m", "e", "n", "mantissa", "exponent", "text", "pad", "requireArgs", "hay", "needle", "matches", "cell", "row", "matches", "left", "COMPILE_OPTIONS", "prefix", "value", "full", "rowids", "next", "compareRowids", "compareNames", "isRowidName", "matches", "key", "executeSelect", "rowsEqual", "result", "rightShape", "nullRight", "right", "matches", "start", "end", "framed", "rank", "executeSelect", "isRowidName", "executeSelect", "matches", "columnNames", "sourceRows", "changes", "alias", "candidates", "selected", "num", "executeSelect", "db", "index", "point", "asNumber"]
7
+ }