@sixb/ducklake 0.1.8 → 0.1.9

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.
Files changed (69) hide show
  1. package/README.md +59 -4
  2. package/dist/ducklake-storage.d.ts +1 -0
  3. package/dist/ducklake-storage.d.ts.map +1 -1
  4. package/dist/index.js +1817 -511
  5. package/dist/index.js.map +24 -14
  6. package/dist/internal/dataset-row-commit.d.ts +10 -0
  7. package/dist/internal/dataset-row-commit.d.ts.map +1 -1
  8. package/dist/internal/dataset-row-merge.d.ts.map +1 -1
  9. package/dist/internal/ducklake-dataset-catalog.d.ts +20 -3
  10. package/dist/internal/ducklake-dataset-catalog.d.ts.map +1 -1
  11. package/dist/internal/ducklake-dataset-table-ref.d.ts +13 -0
  12. package/dist/internal/ducklake-dataset-table-ref.d.ts.map +1 -1
  13. package/dist/internal/ducklake-maintenance.d.ts +21 -1
  14. package/dist/internal/ducklake-maintenance.d.ts.map +1 -1
  15. package/dist/internal/ducklake-snapshot-reader.d.ts +63 -16
  16. package/dist/internal/ducklake-snapshot-reader.d.ts.map +1 -1
  17. package/dist/internal/ducklake-sql-executor.d.ts +9 -1
  18. package/dist/internal/ducklake-sql-executor.d.ts.map +1 -1
  19. package/dist/internal/ducklake-version-transaction.d.ts +54 -0
  20. package/dist/internal/ducklake-version-transaction.d.ts.map +1 -0
  21. package/dist/internal/ducklake-write-coordinator.d.ts +30 -3
  22. package/dist/internal/ducklake-write-coordinator.d.ts.map +1 -1
  23. package/dist/internal/lineage-encoding.d.ts +8 -0
  24. package/dist/internal/lineage-encoding.d.ts.map +1 -0
  25. package/dist/internal/sql-lineage/analysis.d.ts +32 -0
  26. package/dist/internal/sql-lineage/analysis.d.ts.map +1 -0
  27. package/dist/internal/sql-lineage/expressions.d.ts +9 -0
  28. package/dist/internal/sql-lineage/expressions.d.ts.map +1 -0
  29. package/dist/internal/sql-lineage/plan-json.d.ts +34 -0
  30. package/dist/internal/sql-lineage/plan-json.d.ts.map +1 -0
  31. package/dist/internal/sql-lineage/plan-relation.d.ts +28 -0
  32. package/dist/internal/sql-lineage/plan-relation.d.ts.map +1 -0
  33. package/dist/internal/sql-lineage/plan-walker.d.ts +18 -0
  34. package/dist/internal/sql-lineage/plan-walker.d.ts.map +1 -0
  35. package/dist/internal/sql-lineage/rejection.d.ts +11 -0
  36. package/dist/internal/sql-lineage/rejection.d.ts.map +1 -0
  37. package/dist/internal/sql-lineage/statement-gate.d.ts +21 -0
  38. package/dist/internal/sql-lineage/statement-gate.d.ts.map +1 -0
  39. package/dist/internal/sql-lineage/table-functions.d.ts +6 -0
  40. package/dist/internal/sql-lineage/table-functions.d.ts.map +1 -0
  41. package/dist/internal/sql-transform-relations.d.ts +20 -5
  42. package/dist/internal/sql-transform-relations.d.ts.map +1 -1
  43. package/dist/internal/versions.d.ts +10 -1
  44. package/dist/internal/versions.d.ts.map +1 -1
  45. package/dist/types.d.ts +10 -1
  46. package/dist/types.d.ts.map +1 -1
  47. package/package.json +4 -4
  48. package/src/ducklake-storage.ts +9 -2
  49. package/src/internal/dataset-row-commit.ts +28 -2
  50. package/src/internal/dataset-row-merge.ts +4 -0
  51. package/src/internal/ducklake-dataset-catalog.ts +162 -49
  52. package/src/internal/ducklake-dataset-table-ref.ts +75 -17
  53. package/src/internal/ducklake-maintenance.ts +110 -48
  54. package/src/internal/ducklake-snapshot-reader.ts +352 -304
  55. package/src/internal/ducklake-sql-executor.ts +214 -14
  56. package/src/internal/ducklake-version-transaction.ts +224 -0
  57. package/src/internal/ducklake-write-coordinator.ts +226 -148
  58. package/src/internal/lineage-encoding.ts +136 -0
  59. package/src/internal/sql-lineage/analysis.ts +257 -0
  60. package/src/internal/sql-lineage/expressions.ts +208 -0
  61. package/src/internal/sql-lineage/plan-json.ts +130 -0
  62. package/src/internal/sql-lineage/plan-relation.ts +59 -0
  63. package/src/internal/sql-lineage/plan-walker.ts +727 -0
  64. package/src/internal/sql-lineage/rejection.ts +16 -0
  65. package/src/internal/sql-lineage/statement-gate.ts +164 -0
  66. package/src/internal/sql-lineage/table-functions.ts +11 -0
  67. package/src/internal/sql-transform-relations.ts +90 -40
  68. package/src/internal/versions.ts +37 -14
  69. package/src/types.ts +11 -1
package/dist/index.js.map CHANGED
@@ -1,39 +1,49 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/internal/ducklake-change-reader.ts", "../src/internal/duckdb-row.ts", "../src/internal/names.ts", "../src/internal/sql.ts", "../src/internal/ducklake-dataset-table-ref.ts", "../src/internal/schema.ts", "../src/internal/duckdb-column-types.ts", "../src/internal/duckdb-decimal.ts", "../src/internal/versions.ts", "../src/internal/ducklake-connection-manager.ts", "../src/internal/catalog-key.ts", "../src/internal/duckdb-runtime.ts", "../src/internal/duckdb-reader.ts", "../src/internal/duckdb-value-converter.ts", "../src/internal/ducklake-read-gate.ts", "../src/internal/ducklake-dataset-catalog.ts", "../src/internal/ducklake-catalog-schema.ts", "../src/internal/ducklake-current-dataset-definitions.ts", "../src/internal/ducklake-maintenance.ts", "../src/internal/ducklake-row-reader.ts", "../src/internal/ducklake-snapshot-reader.ts", "../src/internal/ducklake-sql-executor.ts", "../src/internal/dataset-row-commit.ts", "../src/internal/sql-transform-relations.ts", "../src/internal/ducklake-write-coordinator.ts", "../src/internal/dataset-row-merge.ts", "../src/internal/ducklake-merge-session.ts", "../src/internal/row-appender.ts", "../src/internal/ducklake-write-session.ts", "../src/ducklake-storage.ts"],
3
+ "sources": ["../src/internal/ducklake-change-reader.ts", "../src/internal/duckdb-row.ts", "../src/internal/ducklake-dataset-table-ref.ts", "../src/internal/names.ts", "../src/internal/sql.ts", "../src/internal/schema.ts", "../src/internal/duckdb-column-types.ts", "../src/internal/duckdb-decimal.ts", "../src/internal/versions.ts", "../src/internal/ducklake-connection-manager.ts", "../src/internal/catalog-key.ts", "../src/internal/duckdb-runtime.ts", "../src/internal/duckdb-reader.ts", "../src/internal/duckdb-value-converter.ts", "../src/internal/ducklake-read-gate.ts", "../src/internal/ducklake-dataset-catalog.ts", "../src/internal/ducklake-catalog-schema.ts", "../src/internal/ducklake-current-dataset-definitions.ts", "../src/internal/ducklake-version-transaction.ts", "../src/internal/lineage-encoding.ts", "../src/internal/ducklake-maintenance.ts", "../src/internal/ducklake-row-reader.ts", "../src/internal/ducklake-snapshot-reader.ts", "../src/internal/ducklake-sql-executor.ts", "../src/internal/dataset-row-commit.ts", "../src/internal/sql-lineage/analysis.ts", "../src/internal/sql-transform-relations.ts", "../src/internal/sql-lineage/rejection.ts", "../src/internal/sql-lineage/plan-json.ts", "../src/internal/sql-lineage/plan-relation.ts", "../src/internal/sql-lineage/expressions.ts", "../src/internal/sql-lineage/table-functions.ts", "../src/internal/sql-lineage/plan-walker.ts", "../src/internal/sql-lineage/statement-gate.ts", "../src/internal/ducklake-write-coordinator.ts", "../src/internal/dataset-row-merge.ts", "../src/internal/ducklake-merge-session.ts", "../src/internal/row-appender.ts", "../src/internal/ducklake-write-session.ts", "../src/ducklake-storage.ts"],
4
4
  "sourcesContent": [
5
5
  "import { randomUUID } from \"node:crypto\"\nimport type { DatasetColumnDefinition, DatasetRow } from \"@sixb/core\"\nimport {\n type DatasetChanges,\n type DatasetRowChange,\n LakeStorageError,\n type ReadDatasetChangesInput,\n resolveDatasetChangeColumns,\n} from \"@sixb/core/lake-storage\"\nimport type { DuckLakeStorageOptions } from \"../types\"\nimport { getBigIntLike } from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport type { DuckLakeConnectionManager } from \"./ducklake-connection-manager\"\nimport { resolveDatasetTableRef } from \"./ducklake-dataset-table-ref\"\nimport type { DuckLakeSnapshotReader } from \"./ducklake-snapshot-reader\"\nimport { normalizeReadValue } from \"./schema\"\nimport { qualifiedTableName, quoteIdentifier } from \"./sql\"\nimport { parseVersionId } from \"./versions\"\n\nconst PAGE_ROWS = 5_000\n\n/** Compare once in DuckDB, then page only the delta without holding the connection between yields. */\nexport class DuckLakeChangeReader {\n constructor(\n private readonly options: DuckLakeStorageOptions,\n private readonly connections: DuckLakeConnectionManager,\n private readonly snapshots: DuckLakeSnapshotReader\n ) {}\n\n async readChanges(input: ReadDatasetChangesInput): Promise<DatasetChanges | null> {\n input.signal?.throwIfAborted()\n const before = await this.snapshots.getVersion(input.datasetId, input.fromVersionId)\n const after = await this.snapshots.getVersion(input.datasetId, input.toVersionId)\n const columns = resolveDatasetChangeColumns(input, before, after)\n if (!columns) return null\n const lease = await this.connections.acquireAttachedRuntime()\n const runtime = lease.runtime\n const temporary = quoteIdentifier(`sixb_delta_${randomUUID().replaceAll(\"-\", \"\")}`)\n let retained = false\n let created = false\n try {\n const ref = await resolveDatasetTableRef(this.options, runtime, input.datasetId)\n if (!ref) return null\n const table = qualifiedTableName(this.options, ref.tableName)\n const oldRelation = `${table} AT (VERSION => ${parseVersionId(input.fromVersionId)})`\n const newRelation = `${table} AT (VERSION => ${parseVersionId(input.toVersionId)})`\n const previousCount = await uniqueRowCount(runtime, oldRelation, input.keyColumns)\n const nextCount = await uniqueRowCount(runtime, newRelation, input.keyColumns)\n if (previousCount === null || nextCount === null) return null\n input.signal?.throwIfAborted()\n const key = quoteIdentifier(input.keyColumns[0]!)\n const values = columns.flatMap((column, index) => [\n `b.${quoteIdentifier(column.name)} AS b${index}`,\n `a.${quoteIdentifier(column.name)} AS a${index}`,\n ])\n const join = input.keyColumns\n .map((name) => `b.${quoteIdentifier(name)} = a.${quoteIdentifier(name)}`)\n .join(\" AND \")\n const changed = columns\n .map(\n (column) =>\n `b.${quoteIdentifier(column.name)} IS DISTINCT FROM a.${quoteIdentifier(column.name)}`\n )\n .join(\" OR \")\n // The native change feed reflects DELETE/INSERT writes: snapshot ingestion can produce 2N\n // physical changes for one logical edit. Compare the pinned states instead of replaying it.\n await runtime.run(`CREATE TEMP TABLE ${temporary} AS\n SELECT b.${key} IS NOT NULL AS before_present, a.${key} IS NOT NULL AS after_present,\n ${values.join(\", \")}\n FROM (SELECT * FROM ${oldRelation}) b\n FULL OUTER JOIN (SELECT * FROM ${newRelation}) a ON ${join}\n WHERE b.${key} IS NULL OR a.${key} IS NULL OR ${changed}`)\n created = true\n const [count] = await runtime.query(`SELECT count(*) AS count FROM ${temporary}`)\n const changeCount = safeCount(count!, \"count\")\n input.signal?.throwIfAborted()\n let closePromise: Promise<void> | undefined\n const close = () => {\n closePromise ??= runtime.run(`DROP TABLE IF EXISTS ${temporary}`)\n return closePromise\n }\n const changes = (async function* (): AsyncIterable<DatasetRowChange> {\n try {\n let cursor = -1n\n let delivered = 0\n while (delivered < changeCount) {\n input.signal?.throwIfAborted()\n if (closePromise) throw new LakeStorageError(\"[SixbDuckLake] Change reader is closed.\")\n const page = await runtime.query(`SELECT rowid AS position, * FROM ${temporary}\n WHERE rowid > ${cursor} ORDER BY rowid LIMIT ${PAGE_ROWS}`)\n if (page.length === 0)\n throw new LakeStorageError(\n \"[SixbDuckLake] Change read ended before its declared count.\"\n )\n for (const row of page) {\n input.signal?.throwIfAborted()\n delivered++\n yield {\n before: row.before_present === true ? rowImage(row, \"b\", columns) : null,\n after: row.after_present === true ? rowImage(row, \"a\", columns) : null,\n }\n }\n cursor = getBigIntLike(page[page.length - 1]!, \"position\")\n }\n } finally {\n await close()\n }\n })()\n retained = true\n return { fromRowCount: previousCount, toRowCount: nextCount, changeCount, changes, close }\n } finally {\n // The delta is a DuckDB temp table, independent of the attached DuckLake catalog. Release\n // the local attachment lock before returning it, otherwise consumer lake operations deadlock.\n try {\n if (!retained && created) await runtime.run(`DROP TABLE IF EXISTS ${temporary}`)\n } finally {\n await lease.release()\n }\n }\n }\n}\n\nasync function uniqueRowCount(\n runtime: DuckDbQueryRuntime,\n relation: string,\n keys: readonly string[]\n): Promise<number | null> {\n const names = keys.map(quoteIdentifier)\n const invalid = names.map((name) => `${name} IS NULL OR trim(${name}) = ''`).join(\" OR \")\n const [row] = await runtime.query(`SELECT count(*) AS total,\n count(DISTINCT (${names.join(\", \")})) AS unique_keys,\n count(*) FILTER (WHERE ${invalid}) AS invalid_keys FROM ${relation}`)\n const count = safeCount(row!, \"total\")\n return safeCount(row!, \"unique_keys\") === count && safeCount(row!, \"invalid_keys\") === 0\n ? count\n : null\n}\n\nfunction safeCount(row: Readonly<Record<string, unknown>>, name: string): number {\n const count = Number(getBigIntLike(row, name))\n if (!Number.isSafeInteger(count) || count < 0)\n throw new LakeStorageError(\"[SixbDuckLake] Change count exceeds the supported integer range.\")\n return count\n}\n\nfunction rowImage(\n row: Readonly<Record<string, unknown>>,\n prefix: \"a\" | \"b\",\n columns: readonly DatasetColumnDefinition[]\n): DatasetRow {\n return Object.fromEntries(\n columns.map((column, index) => [\n column.name,\n normalizeReadValue(row[`${prefix}${index}`], column),\n ])\n )\n}\n",
6
6
  "import { LakeStorageError } from \"@sixb/core/lake-storage\"\n\nexport type DuckDbRow = Readonly<Record<string, unknown>>\n\nexport function getString(row: DuckDbRow, key: string): string {\n const value = row[key]\n if (typeof value !== \"string\") {\n throw new LakeStorageError(\n `[SixbDuckLake] Expected DuckDB column '${key}' to be a string, got ${typeof value}.`\n )\n }\n\n return value\n}\n\nexport function getOptionalString(row: DuckDbRow, key: string): string | undefined {\n const value = row[key]\n if (value === null || value === undefined) {\n return undefined\n }\n\n if (typeof value !== \"string\") {\n throw new LakeStorageError(\n `[SixbDuckLake] Expected DuckDB column '${key}' to be a string, got ${typeof value}.`\n )\n }\n\n return value\n}\n\nexport function getBoolean(row: DuckDbRow, key: string): boolean {\n const value = row[key]\n if (typeof value !== \"boolean\") {\n throw new LakeStorageError(\n `[SixbDuckLake] Expected DuckDB column '${key}' to be a boolean, got ${typeof value}.`\n )\n }\n\n return value\n}\n\nexport function getBigIntLike(row: DuckDbRow, key: string): bigint {\n const value = row[key]\n if (typeof value === \"bigint\") {\n return value\n }\n\n if (typeof value === \"number\" && Number.isInteger(value)) {\n return BigInt(value)\n }\n\n if (typeof value === \"string\" && /^-?\\d+$/.test(value)) {\n return BigInt(value)\n }\n\n throw new LakeStorageError(\n `[SixbDuckLake] Expected DuckDB column '${key}' to be an integer, got ${typeof value}.`\n )\n}\n\nexport function getOptionalBigIntLike(row: DuckDbRow, key: string): bigint | undefined {\n const value = row[key]\n if (value === null || value === undefined) {\n return undefined\n }\n\n return getBigIntLike(row, key)\n}\n\nexport function getDate(row: DuckDbRow, key: string): Date {\n const value = row[key]\n if (value instanceof Date) {\n return value\n }\n\n if (typeof value === \"string\") {\n return new Date(value)\n }\n\n throw new LakeStorageError(\n `[SixbDuckLake] Expected DuckDB column '${key}' to be a date, got ${typeof value}.`\n )\n}\n",
7
+ "import { LakeStorageError } from \"@sixb/core/lake-storage\"\nimport type { DuckLakeStorageOptions } from \"../types\"\nimport { getBigIntLike } from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport { encodeDatasetSequenceTableName, encodeDatasetTableName } from \"./names\"\nimport { duckLakeAlias, duckLakeMetadataTableName, quoteIdentifier, quoteSqlString } from \"./sql\"\n\nexport interface DatasetTableRef {\n readonly datasetId: string\n readonly tableName: string\n readonly tableId: bigint\n /** The table a sequenced dataset keeps its source ordering in, which merges also change. */\n readonly sequenceTableId?: bigint\n}\n\nexport async function resolveDatasetTableRef(\n options: DuckLakeStorageOptions,\n runtime: DuckDbQueryRuntime,\n datasetId: string\n): Promise<DatasetTableRef | null> {\n return tableRefFromRows(datasetId, await runtime.query(datasetTablesSql(options, datasetId)))\n}\n\n/**\n * The dataset's tables and the lake's current snapshot, in one catalog read. Inside a\n * transaction, reading the current snapshot also fixes the transaction's DuckLake snapshot, which\n * DuckLake otherwise fixes on its first read of the lake.\n */\nexport async function resolveDatasetTableRefAtCurrentSnapshot(\n options: DuckLakeStorageOptions,\n runtime: DuckDbQueryRuntime,\n datasetId: string\n): Promise<{ readonly snapshotId: string; readonly table: DatasetTableRef | null }> {\n // Joined on true, the current snapshot still reads when the dataset has no table.\n const rows = await runtime.query(`\n SELECT current.id AS current_snapshot, tables.table_id, tables.table_name\n FROM ${quoteIdentifier(duckLakeAlias(options))}.current_snapshot() current\n LEFT JOIN (${datasetTablesSql(options, datasetId)}) tables ON true\n `)\n const [first] = rows\n if (first === undefined) {\n throw new LakeStorageError(\"[SixbDuckLake] DuckLake did not return a current snapshot.\")\n }\n\n return {\n snapshotId: String(getBigIntLike(first, \"current_snapshot\")),\n table: tableRefFromRows(\n datasetId,\n rows.filter((row) => row.table_id !== null && row.table_id !== undefined)\n ),\n }\n}\n\n/** Every table a dataset's versions change. */\nexport function datasetTableIds(table: Omit<DatasetTableRef, \"tableName\">): readonly bigint[] {\n return table.sequenceTableId === undefined\n ? [table.tableId]\n : [table.tableId, table.sequenceTableId]\n}\n\nfunction datasetTablesSql(options: DuckLakeStorageOptions, datasetId: string): string {\n const tableNames = [encodeDatasetTableName(datasetId), encodeDatasetSequenceTableName(datasetId)]\n return `\n SELECT table_id, table_name\n FROM ${duckLakeMetadataTableName(options, \"ducklake_table\")}\n WHERE table_name IN (${tableNames.map((name) => quoteSqlString(name)).join(\", \")})\n AND end_snapshot IS NULL\n `\n}\n\nfunction tableRefFromRows(\n datasetId: string,\n rows: readonly Readonly<Record<string, unknown>>[]\n): DatasetTableRef | null {\n const tableName = encodeDatasetTableName(datasetId)\n const tableIdOf = (name: string) => {\n const row = rows.find((candidate) => candidate.table_name === name)\n return row === undefined ? undefined : getBigIntLike(row, \"table_id\")\n }\n\n const tableId = tableIdOf(tableName)\n if (tableId === undefined) {\n return null\n }\n\n const sequenceTableId = tableIdOf(encodeDatasetSequenceTableName(datasetId))\n return {\n datasetId,\n tableName,\n tableId,\n ...(sequenceTableId === undefined ? {} : { sequenceTableId }),\n }\n}\n",
7
8
  "import { LakeStorageError } from \"@sixb/core/lake-storage\"\n\n/**\n * Prefix used for all Sixb dataset tables inside the DuckLake schema.\n */\nexport const DATASET_TABLE_PREFIX = \"sixb__ds__\"\n\nconst textEncoder = new TextEncoder()\nconst textDecoder = new TextDecoder(\"utf-8\", { fatal: true })\n\nfunction isInlineByte(byte: number): boolean {\n return (byte >= 0x61 && byte <= 0x7a) || (byte >= 0x30 && byte <= 0x39)\n}\n\nfunction isHexPair(value: string): boolean {\n return /^[0-9a-f]{2}$/.test(value)\n}\n\n/**\n * Encode a Sixb dataset id into a SQL identifier-safe table suffix.\n *\n * Common lowercase dotted ids stay readable by mapping \".\" to \"__\". Literal\n * underscores and all other non-inline UTF-8 bytes are encoded as \"_xx\" hex\n * escapes so decoding is collision-free.\n */\nfunction encodeDatasetId(datasetId: string): string {\n if (datasetId.trim().length === 0) {\n throw new LakeStorageError(\"[SixbDuckLake] Dataset id must not be empty.\")\n }\n\n let encoded = \"\"\n for (const byte of textEncoder.encode(datasetId)) {\n if (isInlineByte(byte)) {\n encoded += String.fromCharCode(byte)\n } else if (byte === 0x2e) {\n encoded += \"__\"\n } else {\n encoded += `_${byte.toString(16).padStart(2, \"0\")}`\n }\n }\n\n return encoded\n}\n\n/**\n * Decode a table suffix created by `encodeDatasetId`.\n *\n * Returns null for malformed provider table names so metadata scans can filter\n * defensively instead of throwing on unrelated tables.\n */\nfunction decodeDatasetId(encoded: string): string | null {\n if (encoded.length === 0) {\n return null\n }\n\n const bytes: number[] = []\n let index = 0\n\n while (index < encoded.length) {\n const char = encoded[index]\n const byte = char.charCodeAt(0)\n\n if (isInlineByte(byte)) {\n bytes.push(byte)\n index += 1\n continue\n }\n\n if (char !== \"_\") {\n return null\n }\n\n if (encoded[index + 1] === \"_\") {\n bytes.push(0x2e)\n index += 2\n continue\n }\n\n const hex = encoded.slice(index + 1, index + 3)\n if (!isHexPair(hex)) {\n return null\n }\n\n bytes.push(Number.parseInt(hex, 16))\n index += 3\n }\n\n try {\n return textDecoder.decode(new Uint8Array(bytes))\n } catch {\n return null\n }\n}\n\n/**\n * Convert a Sixb dataset id to its physical DuckLake table name.\n */\nexport function encodeDatasetTableName(datasetId: string): string {\n return `${DATASET_TABLE_PREFIX}${encodeDatasetId(datasetId)}`\n}\n\n/** Current source-ordering state, deliberately outside the dataset table namespace. */\nexport function encodeDatasetSequenceTableName(datasetId: string): string {\n return `sixb__seq__${encodeDatasetTableName(datasetId)}`\n}\n\n/**\n * Decode a physical DuckLake table name back to a Sixb dataset id.\n */\nexport function decodeDatasetTableName(tableName: string): string | null {\n if (!tableName.startsWith(DATASET_TABLE_PREFIX)) {\n return null\n }\n\n return decodeDatasetId(tableName.slice(DATASET_TABLE_PREFIX.length))\n}\n",
8
9
  "import { LakeStorageError } from \"@sixb/core/lake-storage\"\nimport type {\n AzureSecretOptions,\n DuckDbSecretOptions,\n DuckLakeCatalogOptions,\n DuckLakeStorageOptions,\n GcsSecretOptions,\n PostgresDuckLakeCatalogOptions,\n R2SecretOptions,\n S3SecretOptions,\n} from \"../types\"\n\nconst DEFAULT_ALIAS = \"sixb_lake\"\n\n/**\n * Resolve the DuckLake attachment alias used by all provider SQL.\n */\nexport function duckLakeAlias(options: Pick<DuckLakeStorageOptions, \"alias\">): string {\n return options.alias ?? DEFAULT_ALIAS\n}\n\n/**\n * DuckLake exposes catalog metadata through an attached DuckDB database whose\n * name is derived from the user-facing DuckLake alias.\n */\nfunction duckLakeMetadataCatalog(options: Pick<DuckLakeStorageOptions, \"alias\">): string {\n return `__ducklake_metadata_${duckLakeAlias(options)}`\n}\n\n/**\n * Configure the PostgreSQL extension pool used by DuckLake's attached metadata\n * catalog. DuckDB worker threads can otherwise pin pooled Postgres connections\n * in the thread-local cache until the pool is exhausted during repeated\n * DuckLake metadata reads.\n */\nexport function buildConfigurePostgresMetadataPoolSql(\n options: Pick<DuckLakeStorageOptions, \"alias\" | \"postgresPool\">\n): string {\n const parameters = [\n `catalog_name=${quoteSqlString(duckLakeMetadataCatalog(options))}`,\n ...postgresPoolParameters(options.postgresPool).map(({ name, value }) => `${name}=${value}`),\n ]\n\n return `FROM postgres_configure_pool(${parameters.join(\", \")})`\n}\n\n/**\n * Configure DuckDB's PostgreSQL extension before ATTACH. These settings only\n * affect databases attached after they are set.\n */\nexport function buildSetPostgresPoolSql(\n options: Pick<DuckLakeStorageOptions, \"postgresPool\">\n): readonly string[] {\n return postgresPoolParameters(options.postgresPool).map(\n ({ name, value }) => `SET pg_pool_${name} = ${value}`\n )\n}\n\n/**\n * Render a fully-qualified DuckLake metadata table path.\n *\n * PostgreSQL catalogs expose DuckLake metadata tables under the configured\n * metadata schema (PostgreSQL's `public` by default) inside the attached\n * metadata catalog. Local catalogs use DuckDB's default `main` schema.\n */\nexport function duckLakeMetadataTableName(\n options: Pick<DuckLakeStorageOptions, \"alias\" | \"catalog\">,\n tableName: string\n): string {\n return `${quoteIdentifier(duckLakeMetadataCatalog(options))}.${quoteIdentifier(\n duckLakeMetadataSchema(options)\n )}.${quoteIdentifier(tableName)}`\n}\n\n/**\n * Render a metadata query that runs where the catalog lives.\n *\n * DuckDB's PostgreSQL scanner pushes comparisons and constant IN lists down to PostgreSQL, but not\n * string matching, so a query that filters on text would copy the whole column into DuckDB. On a\n * PostgreSQL catalog the query therefore runs server-side through `postgres_query`; elsewhere the\n * catalog is local and DuckDB runs it. `build` must produce SQL that both dialects accept.\n */\nexport function buildDuckLakeMetadataQuery(\n options: Pick<DuckLakeStorageOptions, \"alias\" | \"catalog\">,\n build: (table: (tableName: string) => string) => string\n): string {\n if (options.catalog.type !== \"postgres\") {\n return build((tableName) => duckLakeMetadataTableName(options, tableName))\n }\n\n // Unqualified names follow the connection's search path, as DuckLake's own writes do.\n const schema = options.catalog.metadataSchema\n const sql = build((tableName) =>\n schema === undefined\n ? quoteIdentifier(tableName)\n : `${quoteIdentifier(schema)}.${quoteIdentifier(tableName)}`\n )\n return `SELECT * FROM postgres_query(${quoteSqlString(duckLakeMetadataCatalog(options))}, ${quoteSqlString(sql)})`\n}\n\nfunction duckLakeMetadataSchema(options: Pick<DuckLakeStorageOptions, \"catalog\">): string {\n if (options.catalog.type !== \"postgres\") return \"main\"\n // Without a metadata schema DuckLake writes to PostgreSQL's default schema.\n return options.catalog.metadataSchema ?? \"public\"\n}\n\n/**\n * Quote a SQL identifier after validating it is already identifier-shaped.\n *\n * Dataset table names are produced by `names.ts`; user text should never be\n * passed here without first going through a deterministic encoder.\n */\nexport function quoteIdentifier(identifier: string): string {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(identifier)) {\n throw new LakeStorageError(`[SixbDuckLake] Invalid SQL identifier '${identifier}'.`)\n }\n\n return `\"${identifier}\"`\n}\n\n/**\n * Quote a SQL string literal for DDL statements that DuckDB does not parameterize.\n */\nexport function quoteSqlString(value: string): string {\n return `'${value.replaceAll(\"'\", \"''\")}'`\n}\n\nexport function quoteSqlStringList(values: readonly string[]): string {\n return values.map((value) => quoteSqlString(value)).join(\", \")\n}\n\n/**\n * Render a fully-qualified table path.\n */\nexport function qualifiedTableName(\n options: Pick<DuckLakeStorageOptions, \"alias\">,\n tableName: string\n): string {\n return `${quoteIdentifier(duckLakeAlias(options))}.main.${quoteIdentifier(tableName)}`\n}\n\n/**\n * Build the catalog URI expected by DuckLake's ATTACH statement.\n */\nexport function catalogUri(catalog: DuckLakeCatalogOptions): string {\n switch (catalog.type) {\n case \"duckdb\":\n return `ducklake:${catalog.path}`\n case \"sqlite\":\n return `ducklake:sqlite:${catalog.path}`\n case \"postgres\":\n return `ducklake:postgres:${postgresConnectionString(catalog)}`\n case \"custom\":\n return `ducklake:${catalog.uri}`\n }\n}\n\n/**\n * Render typed PostgreSQL options to the libpq connection string DuckLake expects.\n */\nexport function postgresConnectionString(catalog: PostgresDuckLakeCatalogOptions): string {\n const parameters: string[] = []\n const names = new Set<string>()\n\n appendPostgresConnectionParameter(parameters, names, \"dbname\", catalog.database)\n appendPostgresConnectionParameter(parameters, names, \"host\", catalog.host)\n appendPostgresConnectionParameter(parameters, names, \"port\", catalog.port)\n appendPostgresConnectionParameter(parameters, names, \"user\", catalog.user)\n appendPostgresConnectionParameter(parameters, names, \"password\", catalog.password)\n appendPostgresConnectionParameter(parameters, names, \"sslmode\", catalog.sslMode)\n appendPostgresConnectionParameter(parameters, names, \"application_name\", catalog.applicationName)\n appendPostgresConnectionParameter(\n parameters,\n names,\n \"connect_timeout\",\n catalog.connectTimeoutSeconds\n )\n\n for (const [name, value] of Object.entries(catalog.parameters ?? {})) {\n appendPostgresConnectionParameter(parameters, names, name, value)\n }\n\n return parameters.join(\" \")\n}\n\n/**\n * Catalog extensions that must be available before ATTACH.\n */\nfunction catalogExtensions(catalog: DuckLakeCatalogOptions): readonly string[] {\n switch (catalog.type) {\n case \"duckdb\":\n return []\n case \"sqlite\":\n return [\"sqlite\"]\n case \"postgres\":\n return [\"postgres\"]\n case \"custom\":\n return catalog.extensions ?? []\n }\n}\n\n/**\n * Extensions needed by the catalog, data path, and typed secrets.\n */\nexport function requiredExtensions(options: DuckLakeStorageOptions): readonly string[] {\n const extensions = new Set<string>(catalogExtensions(options.catalog))\n\n for (const extension of storageExtensions(options.dataPath)) {\n extensions.add(extension)\n }\n\n for (const secret of options.secrets ?? []) {\n for (const extension of secretExtensions(secret)) {\n extensions.add(extension)\n }\n }\n\n return [...extensions]\n}\n\n/**\n * Build a typed DuckDB CREATE SECRET statement.\n */\nexport function buildCreateSecretSql(secret: DuckDbSecretOptions): string {\n const persistence = secret.persistent ? \"PERSISTENT \" : \"TEMPORARY \"\n const nameSql = secret.name === undefined ? \"\" : `${quoteIdentifier(secret.name)} `\n return `CREATE OR REPLACE ${persistence}SECRET ${nameSql}(${secretParameters(secret).join(\", \")})`\n}\n\n/**\n * Build the DuckLake ATTACH statement from public provider options.\n */\nexport function buildAttachSql(options: DuckLakeStorageOptions): string {\n const parameters: string[] = []\n\n if (options.dataPath !== undefined) {\n parameters.push(`DATA_PATH ${quoteSqlString(options.dataPath)}`)\n }\n\n parameters.push(`CREATE_IF_NOT_EXISTS ${options.createIfNotExists ?? true}`)\n\n if (options.readOnly) {\n parameters.push(\"READ_ONLY\")\n }\n\n if (options.catalog.type === \"postgres\" && options.catalog.metadataSchema !== undefined) {\n parameters.push(`METADATA_SCHEMA ${quoteSqlString(options.catalog.metadataSchema)}`)\n }\n\n if (\n options.catalog.type === \"custom\" &&\n options.catalog.metadataParameters !== undefined &&\n Object.keys(options.catalog.metadataParameters).length > 0\n ) {\n const entries = Object.entries(options.catalog.metadataParameters).map(\n ([key, value]) => `${quoteSqlString(key)}: ${quoteSqlString(value)}`\n )\n parameters.push(`METADATA_PARAMETERS MAP {${entries.join(\", \")}}`)\n }\n\n return `ATTACH ${quoteSqlString(catalogUri(options.catalog))} AS ${quoteIdentifier(\n duckLakeAlias(options)\n )} (${parameters.join(\", \")})`\n}\n\nfunction storageExtensions(path: string | undefined): readonly string[] {\n if (path === undefined) {\n return []\n }\n\n switch (pathScheme(path)) {\n case \"s3\":\n case \"r2\":\n case \"gcs\":\n case \"gs\":\n return [\"httpfs\"]\n case \"az\":\n case \"azure\":\n case \"abfss\":\n return [\"azure\"]\n default:\n return []\n }\n}\n\n/**\n * The single source of truth for PostgreSQL pool options. Both the pre-attach\n * `SET pg_pool_*` form and the post-attach `postgres_configure_pool(...)` form\n * render from this list so the two stay in sync. `name` is the unprefixed\n * option key; `value` is already rendered (numbers/booleans bare, strings\n * quoted as SQL literals).\n */\nfunction postgresPoolParameters(\n pool: DuckLakeStorageOptions[\"postgresPool\"]\n): readonly { readonly name: string; readonly value: string }[] {\n const parameters: { name: string; value: string }[] = [\n { name: \"enable_thread_local_cache\", value: String(pool?.enableThreadLocalCache ?? false) },\n ]\n\n appendPoolNumber(parameters, \"max_connections\", pool?.maxConnections)\n appendPoolNumber(parameters, \"wait_timeout_millis\", pool?.waitTimeoutMillis)\n appendPoolNumber(parameters, \"max_lifetime_millis\", pool?.maxLifetimeMillis)\n appendPoolNumber(parameters, \"idle_timeout_millis\", pool?.idleTimeoutMillis)\n\n if (pool?.enableReaperThread !== undefined) {\n parameters.push({ name: \"enable_reaper_thread\", value: String(pool.enableReaperThread) })\n }\n\n if (pool?.healthCheckQuery !== undefined) {\n parameters.push({ name: \"health_check_query\", value: quoteSqlString(pool.healthCheckQuery) })\n }\n\n return parameters\n}\n\nfunction appendPoolNumber(\n parameters: { name: string; value: string }[],\n name: string,\n value: number | undefined\n): void {\n if (value === undefined) {\n return\n }\n\n parameters.push({ name, value: String(value) })\n}\n\nfunction secretExtensions(secret: DuckDbSecretOptions): readonly string[] {\n switch (secret.type) {\n case \"s3\":\n case \"r2\":\n case \"gcs\":\n return [\"httpfs\"]\n case \"azure\":\n return [\"azure\"]\n }\n}\n\nfunction secretParameters(secret: DuckDbSecretOptions): readonly string[] {\n switch (secret.type) {\n case \"s3\":\n return withCommonSecretParameters(secret, [\n \"TYPE s3\",\n ...s3ApiSecretParameters(secret),\n ...optionalStringParameter(\"KMS_KEY_ID\", secret.kmsKeyId),\n ...optionalBooleanParameter(\"REQUESTER_PAYS\", secret.requesterPays),\n ])\n case \"r2\":\n return withCommonSecretParameters(secret, [\n \"TYPE r2\",\n ...s3ApiSecretParameters(secret),\n ...optionalStringParameter(\"ACCOUNT_ID\", secret.accountId),\n ])\n case \"gcs\":\n return withCommonSecretParameters(secret, [\"TYPE gcs\", ...s3ApiSecretParameters(secret)])\n case \"azure\":\n return withCommonSecretParameters(secret, azureSecretParameters(secret))\n }\n}\n\nfunction s3ApiSecretParameters(\n secret: S3SecretOptions | R2SecretOptions | GcsSecretOptions\n): readonly string[] {\n return [\n ...optionalIdentifierParameter(\"PROVIDER\", secret.provider),\n ...optionalStringParameter(\"KEY_ID\", secret.keyId),\n ...optionalStringParameter(\"SECRET\", secret.secret),\n ...optionalStringParameter(\"SESSION_TOKEN\", secret.sessionToken),\n ...optionalStringParameter(\"REGION\", secret.region),\n ...optionalStringParameter(\"ENDPOINT\", secret.endpoint),\n ...optionalStringParameter(\"URL_STYLE\", secret.urlStyle),\n ...optionalBooleanParameter(\"USE_SSL\", secret.useSsl),\n ...optionalBooleanParameter(\"VERIFY_SSL\", secret.verifySsl),\n ...optionalStringParameter(\"CHAIN\", secret.chain),\n ...optionalStringParameter(\"PROFILE\", secret.profile),\n ]\n}\n\nfunction azureSecretParameters(secret: AzureSecretOptions): readonly string[] {\n if (\n secret.tenantId !== undefined ||\n secret.clientId !== undefined ||\n secret.clientSecret !== undefined\n ) {\n return [\n \"TYPE azure\",\n \"PROVIDER service_principal\",\n ...optionalStringParameter(\"TENANT_ID\", secret.tenantId),\n ...optionalStringParameter(\"CLIENT_ID\", secret.clientId),\n ...optionalStringParameter(\"CLIENT_SECRET\", secret.clientSecret),\n ...optionalStringParameter(\"ACCOUNT_NAME\", secret.accountName),\n ]\n }\n\n const connectionString =\n secret.connectionString ??\n (secret.accountName !== undefined && secret.accountKey !== undefined\n ? `DefaultEndpointsProtocol=https;AccountName=${secret.accountName};AccountKey=${secret.accountKey};EndpointSuffix=core.windows.net`\n : undefined)\n\n if (connectionString !== undefined) {\n return [\"TYPE azure\", ...optionalStringParameter(\"CONNECTION_STRING\", connectionString)]\n }\n\n return [\n \"TYPE azure\",\n \"PROVIDER credential_chain\",\n ...optionalStringParameter(\"ACCOUNT_NAME\", secret.accountName),\n ]\n}\n\nfunction withCommonSecretParameters(\n secret: DuckDbSecretOptions,\n parameters: readonly string[]\n): readonly string[] {\n return [...parameters, ...optionalStringParameter(\"SCOPE\", secret.scope)]\n}\n\nfunction optionalStringParameter(name: string, value: string | undefined): readonly string[] {\n return value === undefined ? [] : [`${name} ${quoteSqlString(value)}`]\n}\n\nfunction optionalBooleanParameter(name: string, value: boolean | undefined): readonly string[] {\n return value === undefined ? [] : [`${name} ${value}`]\n}\n\nfunction optionalIdentifierParameter(name: string, value: string | undefined): readonly string[] {\n if (value === undefined) {\n return []\n }\n\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(value)) {\n throw new LakeStorageError(`[SixbDuckLake] Invalid SQL identifier '${value}'.`)\n }\n\n return [`${name} ${value}`]\n}\n\nfunction appendPostgresConnectionParameter(\n parameters: string[],\n names: Set<string>,\n name: string,\n value: string | number | boolean | undefined\n): void {\n if (value === undefined) {\n return\n }\n\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {\n throw new LakeStorageError(`[SixbDuckLake] Invalid PostgreSQL catalog parameter '${name}'.`)\n }\n\n const normalizedName = name.toLowerCase()\n if (names.has(normalizedName)) {\n throw new LakeStorageError(`[SixbDuckLake] Duplicate PostgreSQL catalog parameter '${name}'.`)\n }\n\n names.add(normalizedName)\n parameters.push(`${name}=${quotePostgresConnectionValue(String(value))}`)\n}\n\nfunction quotePostgresConnectionValue(value: string): string {\n return `'${value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"'\", \"\\\\'\")}'`\n}\n\nfunction pathScheme(path: string): string | null {\n const match = /^([a-z][a-z0-9+.-]*):\\/\\//i.exec(path)\n return match ? match[1].toLowerCase() : null\n}\n",
9
- "import type { DuckLakeStorageOptions } from \"../types\"\nimport { getBigIntLike } from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport { encodeDatasetTableName } from \"./names\"\nimport { duckLakeMetadataTableName, quoteSqlString } from \"./sql\"\n\nexport interface DatasetTableRef {\n readonly datasetId: string\n readonly tableName: string\n readonly tableId: bigint\n}\n\nexport async function resolveDatasetTableRef(\n options: DuckLakeStorageOptions,\n runtime: DuckDbQueryRuntime,\n datasetId: string\n): Promise<DatasetTableRef | null> {\n const tableName = encodeDatasetTableName(datasetId)\n const ducklakeTable = duckLakeMetadataTableName(options, \"ducklake_table\")\n const [row] = await runtime.query(`\n SELECT table_id\n FROM ${ducklakeTable}\n WHERE table_name = ${quoteSqlString(tableName)}\n AND end_snapshot IS NULL\n LIMIT 1\n `)\n\n return row === undefined\n ? null\n : {\n datasetId,\n tableName,\n tableId: getBigIntLike(row, \"table_id\"),\n }\n}\n",
10
10
  "import type { DatasetColumnDefinition, DatasetColumnType, DatasetSchema, FileRef } from \"@sixb/core\"\nimport { LakeStorageError } from \"@sixb/core/lake-storage\"\nimport { DUCKDB_COLUMN_TYPES, findDatasetColumnTypeForDuckDbSql } from \"./duckdb-column-types\"\nimport { normalizeDuckDbDecimalValue } from \"./duckdb-decimal\"\nimport { quoteIdentifier } from \"./sql\"\n\n/**\n * Normalized column metadata read from DuckDB/DuckLake introspection queries.\n */\nexport interface DuckDbColumnMetadata {\n readonly name: string\n readonly type: string\n readonly nullable: boolean\n}\n\n/**\n * Map a Sixb dataset column type to the DuckDB type used in CREATE TABLE.\n */\nexport function datasetColumnTypeToDuckDbSql(type: DatasetColumnType): string {\n return DUCKDB_COLUMN_TYPES[type].sql\n}\n\n/**\n * Reconstruct a Sixb dataset column type from DuckDB column metadata.\n */\nexport function duckDbTypeToDatasetColumnType(typeSql: string): DatasetColumnType {\n const type = findDatasetColumnTypeForDuckDbSql(typeSql)\n if (type) {\n return type\n }\n\n throw new LakeStorageError(\n `[SixbDuckLake] DuckDB column type '${typeSql}' cannot be mapped to a Sixb dataset column type.`\n )\n}\n\n/**\n * Render one Sixb dataset column as DuckDB DDL.\n */\nexport function datasetColumnToDuckDbSql(column: DatasetColumnDefinition): string {\n const nullableSql = column.nullable ? \"\" : \" NOT NULL\"\n return `${quoteIdentifier(column.name)} ${datasetColumnTypeToDuckDbSql(column.type)}${nullableSql}`\n}\n\n/**\n * Render the column list used by CREATE TABLE and staging table DDL.\n */\nexport function datasetSchemaToDuckDbColumnsSql(schema: DatasetSchema): string {\n return schema.columns.map((column) => datasetColumnToDuckDbSql(column)).join(\", \")\n}\n\n/** Render a dataset schema for merge staging, where delete rows leave non-key values null. */\nexport function datasetSchemaToDuckDbNullableColumnsSql(schema: DatasetSchema): string {\n return schema.columns\n .map((column) => `${quoteIdentifier(column.name)} ${datasetColumnTypeToDuckDbSql(column.type)}`)\n .join(\", \")\n}\n\n/**\n * Render the column list used by INSERT ... SELECT operations.\n */\nexport function datasetSchemaColumnNamesSql(schema: DatasetSchema): string {\n return schema.columns.map((column) => quoteIdentifier(column.name)).join(\", \")\n}\n\n/**\n * Convert DuckDB column metadata back into a Sixb dataset schema.\n */\nexport function duckDbColumnsToDatasetSchema(\n columns: readonly DuckDbColumnMetadata[]\n): DatasetSchema {\n return {\n columns: columns.map((column) => ({\n name: column.name,\n type: duckDbTypeToDatasetColumnType(column.type),\n ...(column.nullable ? { nullable: true } : {}),\n })),\n }\n}\n\nexport function normalizeReadValue(value: unknown, column: DatasetColumnDefinition): unknown {\n if (value === null || value === undefined) {\n return null\n }\n\n switch (column.type) {\n case \"int64\":\n return typeof value === \"bigint\" ? value.toString() : value\n case \"decimal\":\n return normalizeDuckDbDecimalValue(value, column.name)\n case \"date\":\n return value instanceof Date ? value.toISOString().slice(0, 10) : String(value)\n case \"timestamp\":\n return value instanceof Date ? value.toISOString() : String(value)\n case \"json\":\n return typeof value === \"string\" ? JSON.parse(value) : value\n case \"fileRef\":\n return normalizeFileRef(value)\n default:\n return value\n }\n}\n\nfunction normalizeFileRef(value: unknown): FileRef {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new LakeStorageError(\"[SixbDuckLake] DuckDB fileRef value must be a struct.\")\n }\n\n const record = value as Record<string, unknown>\n return {\n blobId: getStringField(record, \"blobId\"),\n digest: getStringField(record, \"digest\") as FileRef[\"digest\"],\n sizeBytes: getIntegerField(record, \"sizeBytes\"),\n fileName: getOptionalStringField(record, \"fileName\"),\n mediaType: getOptionalStringField(record, \"mediaType\"),\n logicalPath: getOptionalStringField(record, \"logicalPath\"),\n }\n}\n\nfunction getStringField(record: Readonly<Record<string, unknown>>, key: string): string {\n const value = record[key]\n if (typeof value !== \"string\") {\n throw new LakeStorageError(`[SixbDuckLake] DuckDB fileRef field '${key}' must be a string.`)\n }\n\n return value\n}\n\nfunction getOptionalStringField(\n record: Readonly<Record<string, unknown>>,\n key: string\n): string | undefined {\n const value = record[key]\n if (value === null || value === undefined) {\n return undefined\n }\n\n if (typeof value !== \"string\") {\n throw new LakeStorageError(`[SixbDuckLake] DuckDB fileRef field '${key}' must be a string.`)\n }\n\n return value\n}\n\nfunction getIntegerField(record: Readonly<Record<string, unknown>>, key: string): number {\n const value = record[key]\n if (typeof value === \"number\" && Number.isInteger(value)) {\n return value\n }\n\n if (typeof value === \"bigint\") {\n return Number(value)\n }\n\n throw new LakeStorageError(`[SixbDuckLake] DuckDB fileRef field '${key}' must be an integer.`)\n}\n",
11
11
  "import type { DatasetColumnType } from \"@sixb/core\"\n\ninterface DuckDbColumnTypeMapping {\n readonly sql: string\n readonly matches: (typeSql: string) => boolean\n}\n\ninterface DuckDbDecimalTypeMapping extends DuckDbColumnTypeMapping {\n readonly precision: number\n readonly scale: number\n}\n\nfunction normalizeDuckDbTypeSql(typeSql: string): string {\n return typeSql\n .trim()\n .toUpperCase()\n .replace(/\\s+/g, \" \")\n .replace(/\\s*([(),])\\s*/g, \"$1\")\n}\n\nfunction defineDuckDbColumnType<const Sql extends string>(\n sql: Sql,\n aliases: readonly string[] = []\n): DuckDbColumnTypeMapping & { readonly sql: Sql } {\n const acceptedTypes = new Set([sql, ...aliases].map(normalizeDuckDbTypeSql))\n return {\n sql,\n matches: (typeSql) => acceptedTypes.has(normalizeDuckDbTypeSql(typeSql)),\n }\n}\n\nfunction defineDuckDbDecimalType(precision: number, scale: number): DuckDbDecimalTypeMapping {\n return {\n ...defineDuckDbColumnType(`DECIMAL(${precision}, ${scale})`),\n precision,\n scale,\n }\n}\n\n/**\n * DuckDB representations used for every Sixb dataset column type.\n *\n * Each entry owns both its CREATE TABLE representation and the metadata\n * spellings accepted when reconstructing a Sixb dataset schema.\n */\nexport const DUCKDB_COLUMN_TYPES = {\n string: defineDuckDbColumnType(\"VARCHAR\"),\n boolean: defineDuckDbColumnType(\"BOOLEAN\"),\n int64: defineDuckDbColumnType(\"BIGINT\", [\"INT64\"]),\n float64: defineDuckDbColumnType(\"DOUBLE\", [\"FLOAT64\"]),\n decimal: defineDuckDbDecimalType(38, 9),\n date: defineDuckDbColumnType(\"DATE\"),\n timestamp: defineDuckDbColumnType(\"TIMESTAMPTZ\", [\"TIMESTAMP WITH TIME ZONE\"]),\n json: defineDuckDbColumnType(\"JSON\"),\n fileRef: defineDuckDbColumnType(\n \"STRUCT(blobId VARCHAR, digest VARCHAR, sizeBytes BIGINT, fileName VARCHAR, mediaType VARCHAR, logicalPath VARCHAR)\"\n ),\n} satisfies Record<DatasetColumnType, DuckDbColumnTypeMapping>\n\nexport function findDatasetColumnTypeForDuckDbSql(typeSql: string): DatasetColumnType | undefined {\n for (const type of Object.keys(DUCKDB_COLUMN_TYPES) as DatasetColumnType[]) {\n if (DUCKDB_COLUMN_TYPES[type].matches(typeSql)) {\n return type\n }\n }\n\n return undefined\n}\n",
12
12
  "import { type DecimalValue, normalizeDecimalValue } from \"@sixb/core\"\nimport { LakeStorageError } from \"@sixb/core/lake-storage\"\nimport { DUCKDB_COLUMN_TYPES } from \"./duckdb-column-types\"\n\nconst decimalType = DUCKDB_COLUMN_TYPES.decimal\nconst maxIntegerDigits = decimalType.precision - decimalType.scale\n\n/**\n * Normalize a dataset decimal and reject values DuckDB would round or overflow.\n */\nexport function normalizeDuckDbDecimalValue(value: unknown, columnName: string): DecimalValue {\n if (typeof value !== \"string\") {\n throw new LakeStorageError(\n `[SixbDuckLake] Decimal column '${columnName}' must be an exact decimal string.`\n )\n }\n\n let normalized: DecimalValue\n try {\n normalized = normalizeDecimalValue(value)\n } catch {\n throw new LakeStorageError(\n `[SixbDuckLake] Decimal column '${columnName}' must be an exact decimal string.`\n )\n }\n\n const unsigned = normalized.startsWith(\"-\") ? normalized.slice(1) : normalized\n const [integer, fraction = \"\"] = unsigned.split(\".\")\n if (integer.length > maxIntegerDigits || fraction.length > decimalType.scale) {\n throw new LakeStorageError(\n `[SixbDuckLake] Decimal column '${columnName}' cannot be represented exactly as ${decimalType.sql}; expected at most ${maxIntegerDigits} integer digits and ${decimalType.scale} fractional digits.`\n )\n }\n\n return normalized\n}\n",
13
- "import type { DatasetVersion } from \"@sixb/core/lake-storage\"\nimport { LakeStorageError } from \"@sixb/core/lake-storage\"\n\nexport interface SixbSchemaChangeMetadata {\n readonly addColumns?: readonly string[]\n}\n\nexport interface SixbCommitMetadata {\n readonly kind: \"datasetVersion\"\n readonly datasetId: string\n readonly commitId?: string\n readonly mode?: DatasetVersion[\"mode\"]\n readonly producer?: DatasetVersion[\"producer\"]\n readonly inputs?: DatasetVersion[\"inputs\"]\n readonly rowCount?: number\n readonly validatedPrimaryKeyColumns?: readonly string[]\n readonly schemaChange?: SixbSchemaChangeMetadata\n}\n\nexport function parseVersionId(versionId: string): string {\n if (!versionId.startsWith(\"ducklake:\")) {\n throw new LakeStorageError(`[SixbDuckLake] Invalid DuckLake version id '${versionId}'.`)\n }\n\n const snapshotId = versionId.slice(\"ducklake:\".length)\n if (!/^\\d+$/.test(snapshotId)) {\n throw new LakeStorageError(`[SixbDuckLake] Invalid DuckLake version id '${versionId}'.`)\n }\n\n return snapshotId\n}\n\nexport function toVersionId(snapshotId: string): string {\n return `ducklake:${snapshotId}`\n}\n\nexport function parseCommitMetadata(value: unknown): SixbCommitMetadata | undefined {\n if (typeof value !== \"string\") {\n return undefined\n }\n\n let parsed: unknown\n try {\n parsed = JSON.parse(value)\n } catch {\n return undefined\n }\n\n if (\n !isRecord(parsed) ||\n !isRecord(parsed.sixb) ||\n parsed.sixb.kind !== \"datasetVersion\" ||\n typeof parsed.sixb.datasetId !== \"string\"\n ) {\n return undefined\n }\n\n const mode = parsed.sixb.mode\n const commitId = parsed.sixb.commitId\n const rowCount = parsed.sixb.rowCount\n const validatedPrimaryKeyColumns = parsed.sixb.validatedPrimaryKeyColumns\n\n return {\n kind: \"datasetVersion\",\n datasetId: parsed.sixb.datasetId,\n ...(typeof commitId === \"string\" ? { commitId } : {}),\n ...(mode === \"snapshot\" || mode === \"append\" || mode === \"merge\" || mode === \"schema\"\n ? { mode }\n : {}),\n ...(isDatasetProducer(parsed.sixb.producer) ? { producer: parsed.sixb.producer } : {}),\n ...(isDatasetVersionRefs(parsed.sixb.inputs) ? { inputs: parsed.sixb.inputs } : {}),\n ...(typeof commitId === \"string\" && isRowCount(rowCount) ? { rowCount } : {}),\n ...(typeof commitId === \"string\" && isValidatedPrimaryKeyColumns(validatedPrimaryKeyColumns)\n ? { validatedPrimaryKeyColumns }\n : {}),\n ...(isSchemaChangeMetadata(parsed.sixb.schemaChange)\n ? { schemaChange: parsed.sixb.schemaChange }\n : {}),\n }\n}\n\nexport function parseInlineDataChange(\n changesMade: string,\n tableId: bigint\n): { readonly hasDataChange: boolean; readonly hasDeleteChange: boolean } {\n const tableIdText = tableId.toString()\n let hasDataChange = false\n let hasDeleteChange = false\n\n for (const change of changesMade.split(\",\")) {\n const [kind, changedTableId] = change.split(\":\")\n if (changedTableId !== tableIdText) {\n continue\n }\n\n const normalizedKind = kind.toLowerCase()\n if (normalizedKind.includes(\"insert\") || normalizedKind.includes(\"delete\")) {\n hasDataChange = true\n }\n\n if (normalizedKind.includes(\"delete\")) {\n hasDeleteChange = true\n }\n }\n\n return { hasDataChange, hasDeleteChange }\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction isDatasetProducer(value: unknown): value is NonNullable<DatasetVersion[\"producer\"]> {\n return (\n isRecord(value) &&\n (value.kind === \"sync\" || value.kind === \"pipeline\" || value.kind === \"ingest\") &&\n optionalString(value.id) &&\n optionalString(value.runId)\n )\n}\n\nfunction isDatasetVersionRefs(value: unknown): value is NonNullable<DatasetVersion[\"inputs\"]> {\n return (\n Array.isArray(value) &&\n value.every(\n (item) =>\n isRecord(item) && typeof item.datasetId === \"string\" && typeof item.versionId === \"string\"\n )\n )\n}\n\nfunction isSchemaChangeMetadata(value: unknown): value is SixbSchemaChangeMetadata {\n return (\n isRecord(value) &&\n (value.addColumns === undefined ||\n (Array.isArray(value.addColumns) &&\n value.addColumns.every((columnName) => typeof columnName === \"string\")))\n )\n}\n\nfunction optionalString(value: unknown): boolean {\n return value === undefined || typeof value === \"string\"\n}\n\nfunction isRowCount(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0\n}\n\nfunction isValidatedPrimaryKeyColumns(value: unknown): value is readonly string[] {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n value.every((column) => typeof column === \"string\" && column.trim().length > 0) &&\n new Set(value).size === value.length\n )\n}\n",
13
+ "import type { DatasetProducer, DatasetVersion } from \"@sixb/core/lake-storage\"\nimport { LakeStorageError } from \"@sixb/core/lake-storage\"\n\nexport interface SixbSchemaChangeMetadata {\n readonly addColumns?: readonly string[]\n}\n\nexport interface SixbCommitMetadata {\n readonly kind: \"datasetVersion\"\n readonly datasetId: string\n readonly commitId?: string\n readonly mode?: DatasetVersion[\"mode\"]\n readonly producer?: DatasetVersion[\"producer\"]\n readonly inputs?: DatasetVersion[\"inputs\"]\n readonly rowCount?: number\n readonly validatedPrimaryKeyColumns?: readonly string[]\n readonly schemaChange?: SixbSchemaChangeMetadata\n /** As `encodeLineage` stored it: decoded only for the versions a read returns. */\n readonly lineage?: unknown\n}\n\nexport function parseVersionId(versionId: string): string {\n if (!versionId.startsWith(\"ducklake:\")) {\n throw new LakeStorageError(`[SixbDuckLake] Invalid DuckLake version id '${versionId}'.`)\n }\n\n const snapshotId = versionId.slice(\"ducklake:\".length)\n if (!/^\\d+$/.test(snapshotId)) {\n throw new LakeStorageError(`[SixbDuckLake] Invalid DuckLake version id '${versionId}'.`)\n }\n\n return snapshotId\n}\n\nexport function toVersionId(snapshotId: string): string {\n return `ducklake:${snapshotId}`\n}\n\nexport function parseCommitMetadata(value: unknown): SixbCommitMetadata | undefined {\n if (typeof value !== \"string\") {\n return undefined\n }\n\n let parsed: unknown\n try {\n parsed = JSON.parse(value)\n } catch {\n return undefined\n }\n\n if (\n !isRecord(parsed) ||\n !isRecord(parsed.sixb) ||\n parsed.sixb.kind !== \"datasetVersion\" ||\n typeof parsed.sixb.datasetId !== \"string\"\n ) {\n return undefined\n }\n\n const mode = parsed.sixb.mode\n const commitId = parsed.sixb.commitId\n const producer = parseDatasetProducer(parsed.sixb.producer)\n const rowCount = parsed.sixb.rowCount\n const validatedPrimaryKeyColumns = parsed.sixb.validatedPrimaryKeyColumns\n\n return {\n kind: \"datasetVersion\",\n datasetId: parsed.sixb.datasetId,\n ...(typeof commitId === \"string\" ? { commitId } : {}),\n ...(mode === \"snapshot\" || mode === \"append\" || mode === \"merge\" || mode === \"schema\"\n ? { mode }\n : {}),\n ...(producer === undefined ? {} : { producer }),\n ...(isDatasetVersionRefs(parsed.sixb.inputs) ? { inputs: parsed.sixb.inputs } : {}),\n ...(typeof commitId === \"string\" && isRowCount(rowCount) ? { rowCount } : {}),\n ...(typeof commitId === \"string\" && isValidatedPrimaryKeyColumns(validatedPrimaryKeyColumns)\n ? { validatedPrimaryKeyColumns }\n : {}),\n ...(isSchemaChangeMetadata(parsed.sixb.schemaChange)\n ? { schemaChange: parsed.sixb.schemaChange }\n : {}),\n ...(parsed.sixb.lineage === undefined ? {} : { lineage: parsed.sixb.lineage }),\n }\n}\n\n/** Whether a DuckLake snapshot's `changes_made` names one of the tables, for any change. */\nexport function changesTouchTables(changesMade: string, tableIds: readonly bigint[]): boolean {\n const ids = new Set(tableIds.map((tableId) => tableId.toString()))\n return changesMade.split(\",\").some((change) => ids.has(change.split(\":\")[1] ?? \"\"))\n}\n\n/**\n * Whether a DuckLake snapshot changed a table's rows, and whether it removed any. DuckLake records\n * every row change in `changes_made`, for inlined rows (`inlined_insert:<id>`) as for files\n * (`inserted_into_table:<id>`, `deleted_from_table:<id>`); altering a table changes none.\n */\nexport function parseTableDataChange(\n changesMade: string,\n tableId: bigint\n): { readonly hasDataChange: boolean; readonly hasDeleteChange: boolean } {\n const tableIdText = tableId.toString()\n let hasDataChange = false\n let hasDeleteChange = false\n\n for (const change of changesMade.split(\",\")) {\n const [kind, changedTableId] = change.split(\":\")\n if (changedTableId !== tableIdText) {\n continue\n }\n\n const normalizedKind = kind.toLowerCase()\n if (normalizedKind.includes(\"insert\") || normalizedKind.includes(\"delete\")) {\n hasDataChange = true\n }\n\n if (normalizedKind.includes(\"delete\")) {\n hasDeleteChange = true\n }\n }\n\n return { hasDataChange, hasDeleteChange }\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\n/**\n * Malformed fields are dropped rather than failing the read, and never the producer's kind: a\n * pipeline version must keep reading as one, since a pipeline version without lineage is\n * classified with every marking.\n */\nfunction parseDatasetProducer(value: unknown): DatasetProducer | undefined {\n if (\n !isRecord(value) ||\n (value.kind !== \"sync\" && value.kind !== \"pipeline\" && value.kind !== \"ingest\")\n ) {\n return undefined\n }\n\n return {\n kind: value.kind,\n ...(typeof value.id === \"string\" ? { id: value.id } : {}),\n ...(typeof value.runId === \"string\" ? { runId: value.runId } : {}),\n ...(typeof value.stepId === \"string\" ? { stepId: value.stepId } : {}),\n }\n}\n\nfunction isDatasetVersionRefs(value: unknown): value is NonNullable<DatasetVersion[\"inputs\"]> {\n return (\n Array.isArray(value) &&\n value.every(\n (item) =>\n isRecord(item) && typeof item.datasetId === \"string\" && typeof item.versionId === \"string\"\n )\n )\n}\n\nfunction isSchemaChangeMetadata(value: unknown): value is SixbSchemaChangeMetadata {\n return (\n isRecord(value) &&\n (value.addColumns === undefined ||\n (Array.isArray(value.addColumns) &&\n value.addColumns.every((columnName) => typeof columnName === \"string\")))\n )\n}\n\nfunction isRowCount(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0\n}\n\nfunction isValidatedPrimaryKeyColumns(value: unknown): value is readonly string[] {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n value.every((column) => typeof column === \"string\" && column.trim().length > 0) &&\n new Set(value).size === value.length\n )\n}\n",
14
14
  "import { LakeStorageError } from \"@sixb/core/lake-storage\"\nimport type { DuckLakeStorageOptions } from \"../types\"\nimport { localCatalogCoordinationKey } from \"./catalog-key\"\nimport type { DuckDbReader } from \"./duckdb-reader\"\nimport {\n createDuckDbRuntime,\n type DuckDbExclusiveRuntime,\n type DuckDbQueryRuntime,\n type DuckDbRuntime,\n installDuckLakeExtensions,\n setupDuckLake,\n} from \"./duckdb-runtime\"\nimport { DuckLakeReadGate } from \"./ducklake-read-gate\"\nimport {\n buildAttachSql,\n buildConfigurePostgresMetadataPoolSql,\n duckLakeAlias,\n quoteIdentifier,\n} from \"./sql\"\n\nexport interface DuckLakeAttachedRuntimeLease {\n readonly runtime: DuckDbRuntime\n release(): Promise<void>\n}\n\n/**\n * Owns DuckDB/DuckLake runtime lifecycle for DuckLakeStorage.\n *\n * A storage instance owns one DuckDB runtime and at most one DuckLake\n * attachment. The runtime starts unattached so construction and non-lake setup\n * do not immediately open DuckLake metadata connections; reads and commits\n * attach lazily through `attachedRuntime()`.\n */\nexport class DuckLakeConnectionManager {\n private runtimePromise: Promise<DuckDbRuntime> | undefined\n private installExtensionsPromise: Promise<void> | undefined\n private attachPromise: Promise<void> | undefined\n private refreshPromise: Promise<void> | undefined\n // Local catalogs need DETACH/ATTACH to refresh metadata visibility. Keep\n // those attachment changes outside whole read operations so a read cannot\n // observe the DuckLake alias disappearing between its metadata queries.\n private attachmentLock: Promise<void> = Promise.resolve()\n private observedLocalCatalogGeneration: number\n private attached = false\n private closed = false\n private closePromise: Promise<void> | undefined\n private runtimePoisoned = false\n private pinnedReaders = 0\n private refreshRequested = false\n private readonly shutdown = new AbortController()\n private readonly reads = new DuckLakeReadGate()\n private readonly maxStreamingReads: number\n\n constructor(private readonly options: DuckLakeStorageOptions) {\n this.observedLocalCatalogGeneration = currentLocalCatalogGeneration(options)\n this.maxStreamingReads = options.maxStreamingReads ?? 4\n if (!Number.isSafeInteger(this.maxStreamingReads) || this.maxStreamingReads < 1) {\n throw new LakeStorageError(\"[SixbDuckLake] maxStreamingReads must be a positive integer.\")\n }\n }\n\n async acquireRead(signal?: AbortSignal): Promise<{\n readonly signal: AbortSignal\n readonly release: () => void\n }> {\n this.assertOpen()\n const combined = signal ? AbortSignal.any([signal, this.shutdown.signal]) : this.shutdown.signal\n return { signal: combined, release: await this.reads.acquire(combined) }\n }\n\n private async nativeReaderLimit(runtime: DuckDbRuntime): Promise<number> {\n if (this.options.catalog.type === \"duckdb\") return this.maxStreamingReads\n // SQLite metadata transactions keep a read lock for the native stream's lifetime.\n // Unknown/custom catalogs use bounded queries too, without assuming their locking behavior.\n if (this.options.catalog.type !== \"postgres\") return 0\n const [setting] = await runtime.query(\n \"SELECT current_setting('pg_pool_max_connections') AS value\"\n )\n const budget = Number(setting?.value)\n // Reserve metadata/write headroom, including transient leases from bounded scans. A\n // four-connection pool must stay paged: one paused native cursor can still starve an append.\n // The extension can exceed its cache limit; this is not a server-wide connection guarantee.\n return Number.isFinite(budget) ? Math.min(this.maxStreamingReads, Math.max(0, budget - 4)) : 0\n }\n\n /** Caller holds an attachment lease until this query has started. */\n async openReader(\n runtime: DuckDbRuntime,\n sql: string,\n signal: AbortSignal,\n releaseRead: () => void\n ): Promise<DuckDbReader | null> {\n const limit = await this.nativeReaderLimit(runtime)\n signal.throwIfAborted()\n if (this.pinnedReaders >= limit) return null\n this.pinnedReaders++\n let starting = true\n let released = false\n const onClose = async () => {\n if (released) return\n released = true\n this.pinnedReaders--\n if (signal.aborted || this.closed || this.runtimePoisoned) releaseRead()\n // On startup failure the caller still holds its lease and will detach on release.\n if (starting || this.closed || this.runtimePoisoned) return\n await this.withAttachmentLock(async () => {\n if (this.pinnedReaders === 0 && this.refreshRequested) await this.resetRuntimeUnlocked()\n await this.detachDuckDbCatalogAfterLease()\n })\n }\n try {\n return await runtime.openReader(sql, { signal, onClose })\n } catch (error) {\n await onClose()\n throw error\n } finally {\n starting = false\n }\n }\n\n async withMaintenanceRuntime<T>(\n run: (runtime: DuckDbExclusiveRuntime) => Promise<T>\n ): Promise<T> {\n return this.reads.withMaintenance(this.shutdown.signal, () => this.withExclusiveAttached(run))\n }\n\n assertOpen(): void {\n if (this.closed) {\n throw new LakeStorageError(\"[SixbDuckLake] DuckLakeStorage is closed.\")\n }\n }\n\n async runtime(): Promise<DuckDbRuntime> {\n this.assertOpen()\n\n if (this.runtimePromise === undefined) {\n const runtimePromise = this.createRuntime().catch((error) => {\n if (this.runtimePromise === runtimePromise) {\n this.runtimePromise = undefined\n }\n throw error\n })\n this.runtimePromise = runtimePromise\n }\n\n return this.runtimePromise\n }\n\n async attachedRuntime(): Promise<DuckDbRuntime> {\n const runtime = await this.runtime()\n await this.ensureAttached(runtime)\n return runtime\n }\n\n async withAttachedRuntime<T>(run: (runtime: DuckDbRuntime) => Promise<T>): Promise<T> {\n const lease = await this.acquireAttachedRuntime()\n try {\n return await run(lease.runtime)\n } finally {\n await lease.release()\n }\n }\n\n async acquireAttachedRuntime(): Promise<DuckLakeAttachedRuntimeLease> {\n this.assertOpen()\n\n // Keep attachment changes and native-query preparation outside each other's critical section.\n // The lease ends before rows are yielded; an active reader only retains the attachment.\n const releaseLock = await this.acquireAttachmentLock()\n let released = false\n const release = async () => {\n if (released) {\n return\n }\n\n released = true\n try {\n if (this.runtimePoisoned) {\n await this.discardRuntimeUnlocked()\n this.runtimePoisoned = false\n } else {\n await this.detachDuckDbCatalogAfterLease()\n }\n } finally {\n releaseLock()\n }\n }\n\n try {\n await this.refreshForExternalChangesUnlocked()\n const runtime = await this.attachedRuntime()\n return { runtime, release }\n } catch (error) {\n await release()\n throw error\n }\n }\n\n async withExclusiveAttached<T>(run: (runtime: DuckDbExclusiveRuntime) => Promise<T>): Promise<T> {\n const lease = await this.acquireAttachedRuntime()\n try {\n return await lease.runtime.withExclusive(run)\n } finally {\n await lease.release()\n }\n }\n\n async stagingRuntime(): Promise<DuckDbRuntime> {\n const runtime = await this.runtime()\n\n if (this.options.catalog.type !== \"postgres\") {\n // Local catalogs can keep stale attached metadata when another provider\n // commits while this write session is open. Stage rows unattached so the\n // later exclusive commit attaches fresh without losing temp tables.\n await this.detachRuntime()\n }\n\n return runtime\n }\n\n /**\n * Create the one runtime owned by this manager. Setup loads extensions,\n * secrets, setup SQL, and pre-attach Postgres pool settings, but deliberately\n * leaves DuckLake unattached until `attachedRuntime()` is needed.\n */\n async createRuntime(): Promise<DuckDbRuntime> {\n this.assertOpen()\n\n const runtime = await createDuckDbRuntime(this.options.duckdb)\n try {\n await this.ensureExtensionsInstalled(runtime)\n await setupDuckLake(runtime, this.options, {\n attach: false,\n installExtensions: false,\n })\n // Projection checkpoints use physical offsets. Reapply this after caller setup SQL so it\n // cannot weaken immutable snapshot ordering, including after runtime recreation.\n await runtime.run(\"SET preserve_insertion_order = true\")\n return runtime\n } catch (error) {\n await this.closeRuntime(runtime, { detach: false })\n throw error\n }\n }\n\n async resetRuntime(): Promise<void> {\n const releaseLock = await this.acquireAttachmentLock()\n try {\n await this.resetRuntimeUnlocked()\n } finally {\n releaseLock()\n }\n }\n\n private async resetRuntimeUnlocked(): Promise<void> {\n if (this.pinnedReaders > 0) {\n this.refreshRequested = true\n return\n }\n this.refreshRequested = false\n const runtimePromise = this.runtimePromise\n if (runtimePromise === undefined) {\n return\n }\n\n if (this.attachPromise !== undefined) {\n await this.attachPromise\n }\n\n if (!this.attached) {\n return\n }\n\n let refreshedPromise: Promise<DuckDbRuntime>\n refreshedPromise = runtimePromise\n .then(async (runtime) => {\n try {\n await this.refreshAttachedRuntime(runtime)\n this.attached = true\n return runtime\n } catch (error) {\n this.attached = false\n await this.closeRuntime(runtime, { detach: false })\n throw error\n }\n })\n .catch((error) => {\n if (this.runtimePromise === refreshedPromise) {\n this.runtimePromise = undefined\n }\n throw error\n })\n\n this.attached = false\n this.runtimePromise = refreshedPromise\n await refreshedPromise\n }\n\n async refreshForExternalChanges(): Promise<void> {\n if (this.options.catalog.type === \"postgres\") {\n return\n }\n\n if (!this.needsLocalCatalogRefresh()) {\n return\n }\n\n if (this.refreshPromise === undefined) {\n let refreshPromise: Promise<void>\n refreshPromise = this.withAttachmentLock(() =>\n this.refreshForExternalChangesUnlocked()\n ).finally(() => {\n if (this.refreshPromise === refreshPromise) {\n this.refreshPromise = undefined\n }\n })\n this.refreshPromise = refreshPromise\n }\n\n await this.refreshPromise\n }\n\n markLocalCatalogChanged(): void {\n if (this.options.catalog.type === \"postgres\") {\n return\n }\n\n this.observedLocalCatalogGeneration = incrementLocalCatalogGeneration(this.options)\n }\n\n async detachLocalCatalogAfterCommit(runtime: DuckDbQueryRuntime): Promise<void> {\n if (this.options.catalog.type === \"postgres\") {\n return\n }\n\n try {\n if (this.pinnedReaders === 0) {\n await runtime.run(`DETACH ${quoteIdentifier(duckLakeAlias(this.options))}`)\n this.attached = false\n }\n } catch {\n // The commit already succeeded. Keep the original write result and let a\n // later refresh/close retry detaching this local catalog if needed.\n } finally {\n this.markLocalCatalogChanged()\n }\n }\n\n private async refreshForExternalChangesUnlocked(): Promise<void> {\n const generation = currentLocalCatalogGeneration(this.options)\n if (this.observedLocalCatalogGeneration === generation) {\n return\n }\n\n await this.resetRuntimeUnlocked()\n\n this.observedLocalCatalogGeneration = generation\n }\n\n private needsLocalCatalogRefresh(): boolean {\n return this.observedLocalCatalogGeneration !== currentLocalCatalogGeneration(this.options)\n }\n\n close(): Promise<void> {\n this.closePromise ??= this.finishClose()\n return this.closePromise\n }\n\n private async finishClose(): Promise<void> {\n this.closed = true\n this.shutdown.abort(new LakeStorageError(\"[SixbDuckLake] DuckLakeStorage is closed.\"))\n\n const runtimePromise = this.runtimePromise\n this.runtimePromise = undefined\n await this.closeRuntimePromise(runtimePromise, {\n // For Postgres catalogs, the DuckDB Postgres extension owns the attached\n // pool. Explicit DETACH can briefly create or retain another backend;\n // closing the DuckDB runtime is the tighter shutdown path.\n detach: this.attached && this.options.catalog.type !== \"postgres\",\n })\n this.attached = false\n }\n\n private async ensureAttached(runtime: DuckDbRuntime): Promise<void> {\n this.assertOpen()\n\n if (this.attached) {\n return\n }\n\n if (this.attachPromise === undefined) {\n let attachPromise: Promise<void>\n attachPromise = this.attachRuntime(runtime)\n .then(() => {\n this.attached = true\n })\n .catch(async (error) => {\n if (this.attachPromise === attachPromise) {\n this.runtimePromise = undefined\n this.attached = false\n }\n await this.closeRuntime(runtime, { detach: false })\n throw error\n })\n .finally(() => {\n if (this.attachPromise === attachPromise) {\n this.attachPromise = undefined\n }\n })\n this.attachPromise = attachPromise\n }\n\n await this.attachPromise\n }\n\n private async ensureExtensionsInstalled(runtime: DuckDbRuntime): Promise<void> {\n if (this.installExtensionsPromise === undefined) {\n const installExtensionsPromise = installDuckLakeExtensions(runtime, this.options).catch(\n (error) => {\n if (this.installExtensionsPromise === installExtensionsPromise) {\n this.installExtensionsPromise = undefined\n }\n throw error\n }\n )\n this.installExtensionsPromise = installExtensionsPromise\n }\n\n await this.installExtensionsPromise\n }\n\n private async attachRuntime(runtime: DuckDbRuntime): Promise<void> {\n await runtime.runStatements([\n buildAttachSql(this.options),\n ...(this.options.catalog.type === \"postgres\"\n ? [buildConfigurePostgresMetadataPoolSql(this.options)]\n : []),\n ])\n }\n\n private async refreshAttachedRuntime(runtime: DuckDbRuntime): Promise<void> {\n await runtime.runStatements([\n `DETACH ${quoteIdentifier(duckLakeAlias(this.options))}`,\n buildAttachSql(this.options),\n ...(this.options.catalog.type === \"postgres\"\n ? [buildConfigurePostgresMetadataPoolSql(this.options)]\n : []),\n ])\n }\n\n private async detachRuntime(): Promise<void> {\n await this.withAttachmentLock(() => this.detachRuntimeUnlocked())\n }\n\n /**\n * Mark the active runtime as unusable for reuse. The next lease release\n * discards the connection so session state that could not be cleaned up\n * (such as a SET pragma whose RESET failed) cannot reach a later operation.\n */\n poisonRuntime(): void {\n this.runtimePoisoned = true\n }\n\n private async detachDuckDbCatalogAfterLease(): Promise<void> {\n if (this.options.catalog.type !== \"duckdb\" || !this.attached || this.pinnedReaders > 0) {\n return\n }\n\n try {\n await this.detachRuntimeUnlocked()\n } catch {\n // DuckDB-backed DuckLake catalogs are single-client local catalogs. If\n // cleanup cannot detach, discard this runtime so the next operation\n // starts from an unattached connection instead of keeping stale metadata.\n await this.discardRuntimeUnlocked()\n }\n }\n\n // Close and forget the current runtime so the next `runtime()` builds a fresh\n // connection with default session state. Unlike `resetRuntimeUnlocked()`,\n // which DETACH/ATTACHes the same connection, this drops the connection\n // entirely -- the only way to clear a leaked session pragma.\n private async discardRuntimeUnlocked(): Promise<void> {\n const runtimePromise = this.runtimePromise\n this.runtimePromise = undefined\n this.attached = false\n await this.closeRuntimePromise(runtimePromise, { detach: false }).catch(() => {})\n }\n\n private async detachRuntimeUnlocked(): Promise<void> {\n if (this.pinnedReaders > 0) return\n if (this.attachPromise !== undefined) {\n await this.attachPromise\n }\n\n if (!this.attached) {\n return\n }\n\n const runtime = await this.runtime()\n await runtime.run(`DETACH ${quoteIdentifier(duckLakeAlias(this.options))}`)\n this.attached = false\n }\n\n private async withAttachmentLock<T>(run: () => Promise<T>): Promise<T> {\n const releaseLock = await this.acquireAttachmentLock()\n try {\n return await run()\n } finally {\n releaseLock()\n }\n }\n\n private async acquireAttachmentLock(): Promise<() => void> {\n const previous = this.attachmentLock.catch(() => {})\n let release!: () => void\n const current = new Promise<void>((resolve) => {\n release = resolve\n })\n this.attachmentLock = previous.then(() => current)\n\n await previous\n\n let released = false\n return () => {\n if (released) {\n return\n }\n\n released = true\n release()\n }\n }\n\n private async closeRuntimePromise(\n runtimePromise: Promise<DuckDbRuntime> | undefined,\n options: { readonly detach: boolean }\n ): Promise<void> {\n if (runtimePromise === undefined) {\n return\n }\n\n let runtime: DuckDbRuntime\n try {\n runtime = await runtimePromise\n } catch {\n // createRuntime/attachRuntime already close partially-initialized\n // runtimes before rejecting. Swallowing here keeps close/reset\n // idempotent while preserving the original operation error.\n return\n }\n\n await this.closeRuntime(runtime, options)\n }\n\n private async closeRuntime(\n runtime: DuckDbRuntime,\n options: { readonly detach: boolean }\n ): Promise<void> {\n try {\n await runtime.stopReaders()\n if (options.detach) {\n try {\n await runtime.run(`DETACH ${quoteIdentifier(duckLakeAlias(this.options))}`)\n } catch {\n // Detaching a partially initialized or failed catalog can fail; still close the engine.\n }\n }\n } finally {\n await runtime.close()\n }\n }\n}\n\n// Local catalog tests commonly create multiple DuckLakeStorage instances in one\n// process. DuckLake/Postgres handles cross-connection visibility itself; local\n// file catalogs need this in-process signal so peers refresh after Sixb writes.\nconst localCatalogGenerations = new Map<string, number>()\n\nfunction currentLocalCatalogGeneration(options: DuckLakeStorageOptions): number {\n const key = localCatalogCoordinationKey(options)\n return key === undefined ? 0 : (localCatalogGenerations.get(key) ?? 0)\n}\n\nfunction incrementLocalCatalogGeneration(options: DuckLakeStorageOptions): number {\n const key = localCatalogCoordinationKey(options)\n if (key === undefined) {\n return 0\n }\n\n const nextGeneration = (localCatalogGenerations.get(key) ?? 0) + 1\n localCatalogGenerations.set(key, nextGeneration)\n return nextGeneration\n}\n",
15
15
  "import { resolve } from \"node:path\"\nimport type { DuckLakeStorageOptions } from \"../types\"\n\n/**\n * Stable key for coordinating local catalog users inside this process.\n *\n * PostgreSQL coordinates through the database. In-memory local catalogs have no\n * shared file identity. File-backed local catalogs need equivalent path\n * spellings, such as `lake.ducklake` and `dir/../lake.ducklake`, to map to the\n * same coordination key.\n */\nexport function localCatalogCoordinationKey(\n options: Pick<DuckLakeStorageOptions, \"catalog\">\n): string | undefined {\n switch (options.catalog.type) {\n case \"duckdb\":\n case \"sqlite\":\n if (options.catalog.path === \":memory:\") {\n return undefined\n }\n\n return `${options.catalog.type}:${resolve(options.catalog.path)}`\n case \"custom\":\n return `custom:${options.catalog.uri}`\n case \"postgres\":\n return undefined\n }\n}\n",
16
16
  "import { mkdir, mkdtemp, rm } from \"node:fs/promises\"\nimport { join, resolve } from \"node:path\"\nimport {\n type DuckDBConnection,\n DuckDBInstance,\n type DuckDBValue,\n type DuckDBAppender as NodeDuckDBAppender,\n} from \"@duckdb/node-api\"\nimport { LakeStorageError } from \"@sixb/core/lake-storage\"\nimport type { DuckDbRuntimeOptions, DuckLakeStorageOptions } from \"../types\"\nimport { type DuckDbReader, type DuckDbReaderOptions, NodeDuckDbReader } from \"./duckdb-reader\"\nimport { sixbDuckDbValueConverter } from \"./duckdb-value-converter\"\nimport {\n buildAttachSql,\n buildConfigurePostgresMetadataPoolSql,\n buildCreateSecretSql,\n buildSetPostgresPoolSql,\n quoteIdentifier,\n requiredExtensions,\n} from \"./sql\"\n\n/**\n * Narrow adapter around `@duckdb/node-api`.\n *\n * Keeping the public provider behind this interface confines the driver types to\n * this module instead of leaking them into `DuckLakeStorage`. Main-connection calls\n * share one queue; readers use separate connections to the same DuckDB instance.\n */\nexport interface DuckDbQueryRuntime {\n run(sql: string, values?: readonly DuckDBValue[]): Promise<void>\n runStatements(statements: readonly string[]): Promise<void>\n query(sql: string, values?: readonly DuckDBValue[]): Promise<readonly Record<string, unknown>[]>\n withAppender<T>(\n tableName: string,\n useAppender: (appender: DuckDbAppender) => T | Promise<T>\n ): Promise<T>\n}\n\nexport interface DuckDbRuntime extends DuckDbQueryRuntime {\n openReader(sql: string, options?: DuckDbReaderOptions): Promise<DuckDbReader>\n stopReaders(): Promise<void>\n /**\n * Reserve the runtime queue for a multi-statement critical section.\n *\n * Use this for sequences such as BEGIN/read metadata/write/COMMIT where an\n * interleaved read or write would observe the wrong connection state.\n */\n withExclusive<T>(useRuntime: (runtime: DuckDbExclusiveRuntime) => Promise<T>): Promise<T>\n close(): Promise<void>\n}\n\n/**\n * Runtime surface available while the caller already owns the queue slot.\n *\n * This is the query/appender subset only: no streaming, no close, and no nested\n * exclusive block.\n */\nexport type DuckDbExclusiveRuntime = DuckDbQueryRuntime\n\nexport interface DuckDbAppender {\n appendNull(): void\n appendBoolean(value: boolean): void\n appendVarchar(value: string): void\n appendBigInt(value: bigint): void\n appendDouble(value: number): void\n appendStruct(value: Readonly<Record<string, DuckDBValue>>): void\n endRow(): void\n}\n\ninterface SetupDuckLakeOptions {\n readonly installExtensions?: boolean\n readonly attach?: boolean\n}\n\nclass NodeDuckDbRuntime implements DuckDbRuntime {\n private closing = false\n private closed = false\n // Serialize main-connection calls so transactions and staged writes cannot interleave.\n private operations: Promise<void> = Promise.resolve()\n private readonly readers = new Set<DuckDbReader>()\n private closePromise: Promise<void> | undefined\n\n constructor(\n private readonly instance: DuckDBInstance,\n private readonly connection: DuckDBConnection,\n private readonly temporaryDirectory?: string\n ) {}\n\n async openReader(sql: string, options: DuckDbReaderOptions = {}): Promise<DuckDbReader> {\n return this.enqueue(async () => {\n this.assertAcceptingOperations()\n const connection = await this.instance.connect()\n if (this.closing) {\n connection.closeSync()\n this.assertAcceptingOperations()\n }\n const reader = new NodeDuckDbReader(connection, {\n ...options,\n onClose: async () => {\n this.readers.delete(reader)\n await options.onClose?.()\n },\n })\n this.readers.add(reader)\n try {\n await reader.start(sql)\n return reader\n } catch (error) {\n await reader.close()\n throw error\n }\n })\n }\n\n async run(sql: string, values?: readonly DuckDBValue[]): Promise<void> {\n await this.enqueue(async () => {\n await this.connection.run(sql, values === undefined ? undefined : [...values])\n })\n }\n\n async runStatements(statements: readonly string[]): Promise<void> {\n await this.enqueue(async () => {\n for (const sql of statements) {\n await this.connection.run(sql)\n }\n })\n }\n\n async query(\n sql: string,\n values?: readonly DuckDBValue[]\n ): Promise<readonly Record<string, unknown>[]> {\n return this.enqueue(async () => {\n const reader = await this.connection.runAndReadAll(\n sql,\n values === undefined ? undefined : [...values]\n )\n return reader.convertRowObjects(sixbDuckDbValueConverter)\n })\n }\n\n async withAppender<T>(\n tableName: string,\n useAppender: (appender: DuckDbAppender) => T | Promise<T>\n ): Promise<T> {\n return this.enqueue(async () => {\n const appender = await this.connection.createAppender(tableName)\n try {\n return await useAppender(new NodeDuckDbAppenderAdapter(appender))\n } finally {\n appender.closeSync()\n }\n })\n }\n\n async withExclusive<T>(useRuntime: (runtime: DuckDbExclusiveRuntime) => Promise<T>): Promise<T> {\n return this.enqueue(async () => {\n // The exclusive adapter talks directly to the underlying connection while\n // this queued operation is active. Do not pass `this` into the callback.\n return useRuntime(new NodeDuckDbExclusiveRuntime(this.connection))\n })\n }\n\n close(): Promise<void> {\n this.closePromise ??= this.finish()\n return this.closePromise\n }\n\n async stopReaders(): Promise<void> {\n const results = await Promise.allSettled([...this.readers].map((reader) => reader.close()))\n const failed = results.find((result) => result.status === \"rejected\")\n if (failed?.status === \"rejected\") throw failed.reason\n }\n\n private async finish(): Promise<void> {\n this.closing = true\n const results = await Promise.allSettled([...this.readers].map((reader) => reader.close()))\n // resetRuntime()/close() can run while an API read is still using this\n // runtime. Wait for accepted work before closing the native connection.\n await this.operations.catch(() => {})\n this.closed = true\n this.connection.closeSync()\n this.instance.closeSync()\n if (this.temporaryDirectory) await rm(this.temporaryDirectory, { recursive: true, force: true })\n const failed = results.find((result) => result.status === \"rejected\")\n if (failed?.status === \"rejected\") throw failed.reason\n }\n\n private enqueue<T>(operation: () => T | Promise<T>): Promise<T> {\n this.assertAcceptingOperations()\n\n // Keep the chain alive after failures so one rejected query does not block\n // all later work on this runtime.\n const result = this.operations.then(async () => {\n this.assertNotClosed()\n return operation()\n })\n this.operations = result.then(\n () => {},\n () => {}\n )\n return result\n }\n\n private assertAcceptingOperations(): void {\n if (this.closing || this.closed) {\n throw new LakeStorageError(\"[SixbDuckLake] DuckDB runtime is closed.\")\n }\n }\n\n private assertNotClosed(): void {\n if (this.closed) {\n throw new LakeStorageError(\"[SixbDuckLake] DuckDB runtime is closed.\")\n }\n }\n}\n\nclass NodeDuckDbExclusiveRuntime implements DuckDbExclusiveRuntime {\n constructor(private readonly connection: DuckDBConnection) {}\n\n async run(sql: string, values?: readonly DuckDBValue[]): Promise<void> {\n await this.connection.run(sql, values === undefined ? undefined : [...values])\n }\n\n async runStatements(statements: readonly string[]): Promise<void> {\n for (const sql of statements) {\n await this.connection.run(sql)\n }\n }\n\n async query(\n sql: string,\n values?: readonly DuckDBValue[]\n ): Promise<readonly Record<string, unknown>[]> {\n const reader = await this.connection.runAndReadAll(\n sql,\n values === undefined ? undefined : [...values]\n )\n return reader.convertRowObjects(sixbDuckDbValueConverter)\n }\n\n async withAppender<T>(\n tableName: string,\n useAppender: (appender: DuckDbAppender) => T | Promise<T>\n ): Promise<T> {\n const appender = await this.connection.createAppender(tableName)\n try {\n return await useAppender(new NodeDuckDbAppenderAdapter(appender))\n } finally {\n appender.closeSync()\n }\n }\n}\n\nclass NodeDuckDbAppenderAdapter implements DuckDbAppender {\n constructor(private readonly appender: NodeDuckDBAppender) {}\n\n appendNull(): void {\n this.appender.appendNull()\n }\n\n appendBoolean(value: boolean): void {\n this.appender.appendBoolean(value)\n }\n\n appendVarchar(value: string): void {\n this.appender.appendVarchar(value)\n }\n\n appendBigInt(value: bigint): void {\n this.appender.appendBigInt(value)\n }\n\n appendDouble(value: number): void {\n this.appender.appendDouble(value)\n }\n\n appendStruct(value: Readonly<Record<string, DuckDBValue>>): void {\n this.appender.appendStruct(value)\n }\n\n endRow(): void {\n this.appender.endRow()\n }\n}\n\n/**\n * Create the DuckDB runtime used by the provider.\n */\nexport async function createDuckDbRuntime(\n options: DuckDbRuntimeOptions = {}\n): Promise<DuckDbRuntime> {\n const path = options.path ?? \":memory:\"\n const base = options.config?.temp_directory ?? (path === \":memory:\" ? \".tmp\" : `${path}.tmp`)\n // DuckDB's default .tmp filenames collide between independent instances/processes. Keep the\n // configured disk location, but give each runtime its own directory and cleanup ownership.\n let temporaryDirectory: string | undefined\n if (base !== \"\") {\n const directory = resolve(base)\n await mkdir(directory, { recursive: true })\n temporaryDirectory = await mkdtemp(join(directory, \"sixb-\"))\n }\n let instance: DuckDBInstance | undefined\n try {\n instance = await DuckDBInstance.create(path, {\n ...options.config,\n ...(temporaryDirectory ? { temp_directory: temporaryDirectory } : {}),\n })\n return new NodeDuckDbRuntime(instance, await instance.connect(), temporaryDirectory)\n } catch (error) {\n instance?.closeSync()\n if (temporaryDirectory) await rm(temporaryDirectory, { recursive: true, force: true })\n throw error\n }\n}\n\n/**\n * Install DuckLake and any catalog/data-path extensions into DuckDB's local\n * extension directory. Installation is idempotent and can be shared by many\n * short-lived runtimes created by one provider instance.\n */\nexport async function installDuckLakeExtensions(\n runtime: DuckDbRuntime,\n options: DuckLakeStorageOptions\n): Promise<void> {\n await runtime.run(\"INSTALL ducklake\")\n\n for (const extension of requiredExtensions(options)) {\n await runtime.run(`INSTALL ${quoteIdentifier(extension)}`)\n }\n}\n\n/**\n * Load DuckLake, load catalog extensions, run caller setup SQL, and optionally\n * attach the configured DuckLake catalog.\n */\nexport async function setupDuckLake(\n runtime: DuckDbRuntime,\n options: DuckLakeStorageOptions,\n setupOptions: SetupDuckLakeOptions = {}\n): Promise<void> {\n if (setupOptions.installExtensions ?? true) {\n await installDuckLakeExtensions(runtime, options)\n }\n\n await runtime.run(\"LOAD ducklake\")\n\n for (const extension of requiredExtensions(options)) {\n await runtime.run(`LOAD ${quoteIdentifier(extension)}`)\n }\n\n for (const sql of options.setupSql ?? []) {\n await runtime.run(sql)\n }\n\n if (options.catalog.type === \"postgres\") {\n await runtime.runStatements(buildSetPostgresPoolSql(options))\n }\n\n for (const secret of options.secrets ?? []) {\n await runtime.run(buildCreateSecretSql(secret))\n }\n\n if (setupOptions.attach ?? true) {\n await runtime.run(buildAttachSql(options))\n\n if (options.catalog.type === \"postgres\") {\n await runtime.run(buildConfigurePostgresMetadataPoolSql(options))\n }\n }\n}\n",
17
17
  "import type { DuckDBConnection, DuckDBResult } from \"@duckdb/node-api\"\nimport { LakeStorageError } from \"@sixb/core/lake-storage\"\nimport { sixbDuckDbValueConverter } from \"./duckdb-value-converter\"\n\n/** One native query, on a connection belonging to the runtime's shared instance. */\nexport interface DuckDbReader {\n rows(): AsyncIterable<Record<string, unknown>>\n close(): Promise<void>\n}\n\nexport interface DuckDbReaderOptions {\n readonly signal?: AbortSignal\n readonly onClose?: () => Promise<void>\n}\n\nexport class NodeDuckDbReader implements DuckDbReader {\n private resultPromise: Promise<DuckDBResult> | undefined\n private pending: Promise<unknown> | undefined\n private closePromise: Promise<void> | undefined\n private finished = false\n private consumed = false\n private readonly onAbort = () => {\n // Keep the rejected cleanup observable through close()/rows(), including when the consumer\n // is paused. The event listener itself cannot return an awaited promise.\n void this.close().catch(() => {})\n }\n\n constructor(\n private readonly connection: DuckDBConnection,\n private readonly options: DuckDbReaderOptions\n ) {}\n\n async start(sql: string): Promise<void> {\n this.options.signal?.throwIfAborted()\n this.options.signal?.addEventListener(\"abort\", this.onAbort, { once: true })\n // Connection-local settings are not inherited by a new connection. Physical offsets must\n // remain stable even when a dataset shadows DuckDB's virtual rowid column.\n await this.track(this.connection.run(\"SET preserve_insertion_order = true\"))\n this.assertOpen()\n const prepared = await this.track(this.connection.prepare(sql))\n try {\n this.assertOpen()\n // Starting the pending query establishes its interruptible context synchronously. Avoid\n // connection.stream() starting execution after an abort that happened during preparation.\n this.resultPromise = this.track(prepared.startStream().getResult()).finally(() => {\n prepared.destroySync()\n })\n // Execute independently after preparation, so a large sort does not occupy the main queue\n // or attachment lease. rows() observes failures even if execution ends before consumption.\n void this.resultPromise.catch(() => {})\n } catch (error) {\n prepared.destroySync()\n throw error\n }\n }\n\n async *rows(): AsyncIterable<Record<string, unknown>> {\n if (this.consumed)\n throw new LakeStorageError(\"[SixbDuckLake] Reader can only be consumed once.\")\n this.consumed = true\n try {\n this.assertOpen()\n const result = await this.resultPromise!\n this.assertOpen()\n const batches = result\n .yieldConvertedRowObjects(sixbDuckDbValueConverter)\n [Symbol.asyncIterator]()\n while (true) {\n this.assertOpen()\n const batch = await this.track(batches.next())\n this.assertOpen()\n if (batch.done) {\n this.finished = true\n return\n }\n for (const row of batch.value) {\n this.assertOpen()\n yield row as Record<string, unknown>\n }\n }\n } finally {\n await this.close()\n }\n }\n\n close(): Promise<void> {\n if (!this.closePromise) {\n this.options.signal?.removeEventListener(\"abort\", this.onAbort)\n if (this.pending) this.connection.interrupt()\n this.closePromise = this.finish()\n }\n return this.closePromise\n }\n\n private async finish(): Promise<void> {\n try {\n await this.pending?.catch(() => {})\n if (!this.finished) {\n // node-api 1.5.2 exposes no result.close(). Disconnect alone leaves a paused query's\n // transaction alive until GC. A new statement ends it without draining the whole result.\n await this.connection.run(\"SELECT 1\")\n }\n } finally {\n this.resultPromise = undefined\n try {\n this.connection.closeSync()\n } finally {\n await this.options.onClose?.()\n }\n }\n }\n\n private async track<T>(operation: Promise<T>): Promise<T> {\n this.pending = operation\n try {\n return await operation\n } catch (error) {\n this.assertOpen()\n throw error\n } finally {\n if (this.pending === operation) this.pending = undefined\n }\n }\n\n private assertOpen(): void {\n this.options.signal?.throwIfAborted()\n if (this.closePromise) throw new LakeStorageError(\"[SixbDuckLake] Reader is closed.\")\n }\n}\n",
18
18
  "import {\n DuckDBDecimalValue,\n DuckDBTypeId,\n type DuckDBValueConverter,\n type JS,\n JSDuckDBValueConverter,\n} from \"@duckdb/node-api\"\nimport { LakeStorageError } from \"@sixb/core/lake-storage\"\n\n/**\n * Preserve DuckDB decimals as exact strings while retaining the driver's normal\n * JavaScript conversions for every other scalar and nested value.\n */\nexport const sixbDuckDbValueConverter: DuckDBValueConverter<JS> = (value, type, converter) => {\n if (value === null) {\n return null\n }\n\n if (type.typeId === DuckDBTypeId.DECIMAL) {\n if (!(value instanceof DuckDBDecimalValue)) {\n throw new LakeStorageError(\"[SixbDuckLake] DuckDB returned an invalid DECIMAL value.\")\n }\n return value.toString()\n }\n\n return JSDuckDBValueConverter(value, type, converter)\n}\n",
19
19
  "/** Keeps destructive maintenance outside reads, including paged overflow readers. */\nexport class DuckLakeReadGate {\n private active = 0\n private maintenance = false\n private readonly waiters = new Set<() => void>()\n\n async acquire(signal: AbortSignal): Promise<() => void> {\n while (true) {\n signal.throwIfAborted()\n if (!this.maintenance) {\n this.active++\n let released = false\n return () => {\n if (released) return\n released = true\n this.active--\n this.wake()\n }\n }\n await this.wait(signal)\n }\n }\n\n async withMaintenance<T>(signal: AbortSignal, run: () => Promise<T>): Promise<T> {\n // Waiting maintenance must let an active pipeline open the rest of its inputs. Only block\n // new reads once maintenance can actually start; continuous reads may defer it indefinitely.\n while (this.active > 0 || this.maintenance) await this.wait(signal)\n signal.throwIfAborted()\n this.maintenance = true\n try {\n return await run()\n } finally {\n this.maintenance = false\n this.wake()\n }\n }\n\n private wait(signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n const wake = () => {\n signal.removeEventListener(\"abort\", abort)\n this.waiters.delete(wake)\n resolve()\n }\n const abort = () => {\n this.waiters.delete(wake)\n reject(signal.reason)\n }\n signal.throwIfAborted()\n this.waiters.add(wake)\n signal.addEventListener(\"abort\", abort, { once: true })\n })\n }\n\n private wake(): void {\n for (const wake of this.waiters) wake()\n }\n}\n",
20
- "import { randomUUID } from \"node:crypto\"\nimport type { DatasetDefinition, DatasetSchema } from \"@sixb/core\"\nimport type { DatasetDefinitionUpdatePlan, DatasetSchemaUpdatePlan } from \"@sixb/core/lake-storage\"\nimport {\n assertDatasetDefinition,\n LakeStorageError,\n planDatasetDefinitionUpdate,\n} from \"@sixb/core/lake-storage\"\nimport type { DuckLakeStorageOptions } from \"../types\"\nimport { getBigIntLike, getBoolean, getOptionalBigIntLike, getString } from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport {\n DATASET_SEQUENCE_COLUMN_COMMENT,\n type DuckLakeCatalogColumn,\n duckLakeCatalogColumnsToDatasetSchema,\n duckLakePrimaryKeyColumnComment,\n} from \"./ducklake-catalog-schema\"\nimport type { DuckLakeConnectionManager } from \"./ducklake-connection-manager\"\nimport { readCurrentDatasetDefinitions } from \"./ducklake-current-dataset-definitions\"\nimport { encodeDatasetSequenceTableName, encodeDatasetTableName } from \"./names\"\nimport { datasetColumnToDuckDbSql, datasetSchemaToDuckDbColumnsSql } from \"./schema\"\nimport {\n duckLakeAlias,\n duckLakeMetadataTableName,\n qualifiedTableName,\n quoteIdentifier,\n quoteSqlString,\n} from \"./sql\"\n\n/**\n * Translates between Sixb dataset definitions and DuckLake table metadata.\n *\n * DuckLake stays the source of truth for the physical table, schema, comments,\n * and partitioning. Sixb only decides which definition changes are safe to\n * translate into DuckLake DDL.\n */\nexport class DuckLakeDatasetCatalog {\n constructor(\n private readonly options: DuckLakeStorageOptions,\n private readonly connections: DuckLakeConnectionManager\n ) {}\n\n async createDataset(definition: DatasetDefinition): Promise<DatasetDefinition> {\n this.assertSchema(definition)\n\n // Step 1: read the current DuckLake table back into Sixb shape. The\n // existing definition is DuckLake's catalog state; the next definition is\n // the developer's current source definition.\n const existing = await this.getDataset(definition.id)\n\n if (existing) {\n const plan = planDatasetDefinitionUpdate(existing, definition)\n if (plan.changed) {\n await this.applyExistingDatasetUpdate(plan)\n this.connections.markLocalCatalogChanged()\n await this.connections.resetRuntime()\n }\n\n return (await this.getDataset(definition.id)) ?? plan.definition\n }\n\n // New datasets materialize as one DuckLake table with native columns. The\n // table name is reversible, so no sidecar mapping is needed.\n const tableName = encodeDatasetTableName(definition.id)\n const qualifiedName = qualifiedTableName(this.options, tableName)\n\n // Creating a dataset can be several catalog DDL statements. Keep them in\n // one transaction and runtime slot so nothing can observe a partial definition.\n await this.connections.withExclusiveAttached(async (runtime) => {\n await runtime.run(\"BEGIN TRANSACTION\")\n let committed = false\n try {\n await runtime.run(\n `CREATE TABLE ${qualifiedName} (${datasetSchemaToDuckDbColumnsSql(definition.schema)})`\n )\n\n if (definition.description !== undefined) {\n await runtime.run(\n `COMMENT ON TABLE ${qualifiedName} IS ${quoteSqlString(definition.description)}`\n )\n }\n\n await this.applyPrimaryKey(runtime, qualifiedName, definition)\n if (definition.sequenceBy !== undefined) {\n await runtime.run(\n `COMMENT ON COLUMN ${qualifiedName}.${quoteIdentifier(definition.sequenceBy)} IS ${quoteSqlString(DATASET_SEQUENCE_COLUMN_COMMENT)}`\n )\n await runtime.run(\n `CREATE TABLE ${qualifiedTableName(this.options, encodeDatasetSequenceTableName(definition.id))} (source_key VARCHAR NOT NULL, sequence VARCHAR NOT NULL, content VARCHAR)`\n )\n }\n await this.applyPartitionBy(runtime, qualifiedName, definition)\n\n await runtime.run(\"COMMIT\")\n committed = true\n } catch (error) {\n if (!committed) {\n await this.rollbackTransaction(runtime)\n }\n throw error\n }\n })\n this.connections.markLocalCatalogChanged()\n\n return structuredClone(definition)\n }\n\n async assertDatasetDefinitionsCompatible(\n definitions: readonly DatasetDefinition[]\n ): Promise<void> {\n const failures: string[] = []\n const checkedDefinitions: DatasetDefinition[] = []\n\n for (const definition of definitions) {\n try {\n this.assertSchema(definition)\n checkedDefinitions.push(definition)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n failures.push(`- ${definition.id}: ${message}`)\n }\n }\n\n const existingById = await this.readCurrentDatasetDefinitions({\n datasetIds: checkedDefinitions.map((definition) => definition.id),\n })\n\n for (const definition of checkedDefinitions) {\n const existing = existingById.get(definition.id)\n if (!existing) {\n continue\n }\n\n try {\n planDatasetDefinitionUpdate(existing, definition)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n failures.push(`- ${definition.id}: ${message}`)\n }\n }\n\n if (failures.length > 0) {\n const details = failures.join(\"\\n\")\n throw new LakeStorageError(\n `[SixbLake] Lake dataset definition check failed for ${failures.length} dataset(s).\\n${details}`\n )\n }\n }\n\n async getDataset(datasetId: string): Promise<DatasetDefinition | null> {\n this.connections.assertOpen()\n\n return this.connections.withAttachedRuntime((runtime) =>\n this.getDatasetOnRuntime(runtime, datasetId)\n )\n }\n\n async getDatasetOnRuntime(\n runtime: DuckDbQueryRuntime,\n datasetId: string\n ): Promise<DatasetDefinition | null> {\n return (\n (\n await this.readCurrentDatasetDefinitionsOnRuntime(runtime, {\n datasetIds: [datasetId],\n })\n ).get(datasetId) ?? null\n )\n }\n\n async listDatasets(): Promise<readonly DatasetDefinition[]> {\n this.connections.assertOpen()\n\n return this.connections.withAttachedRuntime(async (runtime) => {\n return [...(await this.readCurrentDatasetDefinitionsOnRuntime(runtime)).values()].sort(\n (left, right) => left.id.localeCompare(right.id)\n )\n })\n }\n\n private async readCurrentDatasetDefinitions(options?: {\n readonly datasetIds?: readonly string[]\n }): Promise<Map<string, DatasetDefinition>> {\n if (options?.datasetIds?.length === 0) {\n return new Map()\n }\n\n return this.connections.withAttachedRuntime((runtime) =>\n this.readCurrentDatasetDefinitionsOnRuntime(runtime, options)\n )\n }\n\n private async readCurrentDatasetDefinitionsOnRuntime(\n runtime: DuckDbQueryRuntime,\n options?: { readonly datasetIds?: readonly string[] }\n ): Promise<Map<string, DatasetDefinition>> {\n return readCurrentDatasetDefinitions({\n options: this.options,\n runtime,\n datasetIds: options?.datasetIds,\n })\n }\n\n async getDatasetSchemaAtSnapshot(\n runtime: DuckDbQueryRuntime,\n datasetId: string,\n tableName: string,\n tableId: bigint,\n snapshotId: string\n ): Promise<DatasetSchema> {\n assertDuckLakeSnapshotId(snapshotId)\n\n const columns = await this.readDatasetColumnsAtSnapshot(runtime, tableName, tableId, snapshotId)\n if (columns.length === 0) {\n throw new LakeStorageError(\n `[SixbDuckLake] Could not reconstruct schema for dataset '${datasetId}' at DuckLake snapshot '${snapshotId}'.`\n )\n }\n\n return duckLakeCatalogColumnsToDatasetSchema(tableName, columns)\n }\n\n assertSchema(definition: DatasetDefinition): void {\n assertDatasetDefinition(\n definition,\n (message) => new LakeStorageError(`[SixbDuckLake] ${message}`)\n )\n }\n\n private async applyExistingDatasetUpdate(plan: DatasetDefinitionUpdatePlan): Promise<void> {\n const tableName = encodeDatasetTableName(plan.definition.id)\n const qualifiedName = qualifiedTableName(this.options, tableName)\n\n await this.connections.withExclusiveAttached(async (runtime) => {\n if (plan.schema.kind === \"none\") {\n await this.applyMetadataDelta(runtime, qualifiedName, plan)\n return\n }\n\n // Schema-only DuckLake snapshots still matter to Sixb. Apply schema and\n // compatible metadata DDL atomically, then tag the commit so versions can\n // treat it as this dataset's schema-change version.\n await runtime.run(\"BEGIN TRANSACTION\")\n let committed = false\n try {\n await this.applySchemaEvolutionDdl(runtime, qualifiedName, plan.schema)\n await this.applyMetadataDelta(runtime, qualifiedName, plan)\n await this.setSchemaEvolutionCommitMetadata(runtime, plan.definition.id, plan.schema)\n\n await runtime.run(\"COMMIT\")\n committed = true\n } catch (error) {\n if (!committed) {\n await this.rollbackTransaction(runtime)\n }\n throw error\n }\n })\n }\n\n private async applySchemaEvolutionDdl(\n runtime: DuckDbQueryRuntime,\n qualifiedName: string,\n plan: Extract<DatasetSchemaUpdatePlan, { readonly kind: \"addNullableColumns\" }>\n ): Promise<void> {\n for (const column of plan.columns) {\n await runtime.run(\n `ALTER TABLE ${qualifiedName} ADD COLUMN ${datasetColumnToDuckDbSql(column)}`\n )\n }\n }\n\n private async applyMetadataDelta(\n runtime: DuckDbQueryRuntime,\n qualifiedName: string,\n plan: DatasetDefinitionUpdatePlan\n ): Promise<void> {\n // A compatible merge may add optional metadata after first creation. Apply\n // those deltas explicitly so createDataset never silently accepts a change\n // that DuckLake did not persist.\n if (plan.metadata.descriptionChanged && plan.definition.description !== undefined) {\n await runtime.run(\n `COMMENT ON TABLE ${qualifiedName} IS ${quoteSqlString(plan.definition.description)}`\n )\n }\n\n if (plan.metadata.partitionByChanged) {\n await this.applyPartitionBy(runtime, qualifiedName, plan.definition)\n }\n }\n\n private async applyPartitionBy(\n runtime: DuckDbQueryRuntime,\n qualifiedName: string,\n definition: DatasetDefinition\n ): Promise<void> {\n if (definition.partitionBy === undefined || definition.partitionBy.length === 0) {\n return\n }\n\n // Partitioning is DuckLake physical metadata. If DuckLake cannot apply it,\n // fail with the original driver message instead of returning stale\n // partition metadata.\n try {\n await runtime.run(\n `ALTER TABLE ${qualifiedName} SET PARTITIONED BY (${definition.partitionBy\n .map((columnName) => quoteIdentifier(columnName))\n .join(\", \")})`\n )\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${definition.id}' cannot apply partitionBy because DuckLake rejected ALTER TABLE SET PARTITIONED BY: ${message}`\n )\n }\n }\n\n private async applyPrimaryKey(\n runtime: DuckDbQueryRuntime,\n qualifiedName: string,\n definition: DatasetDefinition\n ): Promise<void> {\n if (definition.primaryKey === undefined) {\n return\n }\n\n const columnNames =\n typeof definition.primaryKey === \"string\" ? [definition.primaryKey] : definition.primaryKey\n for (const [ordinal, columnName] of columnNames.entries()) {\n await runtime.run(\n `COMMENT ON COLUMN ${qualifiedName}.${quoteIdentifier(columnName)} IS ${quoteSqlString(\n duckLakePrimaryKeyColumnComment(ordinal)\n )}`\n )\n }\n }\n\n private async setSchemaEvolutionCommitMetadata(\n runtime: DuckDbQueryRuntime,\n datasetId: string,\n plan: Extract<DatasetSchemaUpdatePlan, { readonly kind: \"addNullableColumns\" }>\n ): Promise<void> {\n await runtime.run(\n `CALL ${quoteIdentifier(duckLakeAlias(this.options))}.set_commit_message(${quoteSqlString(\n \"Sixb\"\n )}, ${quoteSqlString(`evolve dataset ${datasetId} schema`)}, extra_info => ${quoteSqlString(\n JSON.stringify({\n sixb: {\n kind: \"datasetVersion\",\n datasetId,\n commitId: randomUUID(),\n mode: \"schema\",\n schemaChange: {\n addColumns: plan.columns.map((column) => column.name),\n },\n },\n })\n )})`\n )\n }\n\n private async rollbackTransaction(runtime: DuckDbQueryRuntime): Promise<void> {\n try {\n await runtime.run(\"ROLLBACK\")\n } catch {\n // Preserve the original DDL failure. DuckDB may already have closed the\n // transaction if COMMIT itself failed.\n }\n }\n\n private async readDatasetColumnsAtSnapshot(\n runtime: DuckDbQueryRuntime,\n tableName: string,\n tableId: bigint,\n snapshotId: string\n ): Promise<readonly DuckLakeCatalogColumn[]> {\n const ducklakeColumn = duckLakeMetadataTableName(this.options, \"ducklake_column\")\n const rows = await runtime.query(`\n SELECT\n column_id,\n column_order,\n column_name,\n column_type,\n CAST(nulls_allowed AS BOOLEAN) AS nulls_allowed,\n parent_column\n FROM ${ducklakeColumn}\n WHERE table_id = ${tableId}\n AND begin_snapshot <= ${snapshotId}\n AND (end_snapshot IS NULL OR end_snapshot > ${snapshotId})\n ORDER BY column_order\n `)\n\n return rows.map((row) => ({\n tableName,\n columnId: getBigIntLike(row, \"column_id\"),\n columnOrder: getBigIntLike(row, \"column_order\"),\n columnName: getString(row, \"column_name\"),\n columnType: getString(row, \"column_type\"),\n nullsAllowed: getBoolean(row, \"nulls_allowed\"),\n parentColumnId: getOptionalBigIntLike(row, \"parent_column\"),\n }))\n }\n}\n\nfunction assertDuckLakeSnapshotId(snapshotId: string): void {\n if (!/^\\d+$/.test(snapshotId)) {\n throw new LakeStorageError(`[SixbDuckLake] Invalid DuckLake snapshot id '${snapshotId}'.`)\n }\n}\n",
20
+ "import { randomUUID } from \"node:crypto\"\nimport type { DatasetDefinition, DatasetSchema } from \"@sixb/core\"\nimport type {\n DatasetDefinitionUpdatePlan,\n DatasetSchemaUpdatePlan,\n DatasetVersionLineage,\n} from \"@sixb/core/lake-storage\"\nimport {\n assertDatasetDefinition,\n LakeStorageError,\n lineageAtCommit,\n planDatasetDefinitionUpdate,\n} from \"@sixb/core/lake-storage\"\nimport type { DuckLakeStorageOptions } from \"../types\"\nimport { getBigIntLike, getBoolean, getOptionalBigIntLike, getString } from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport {\n DATASET_SEQUENCE_COLUMN_COMMENT,\n type DuckLakeCatalogColumn,\n duckLakeCatalogColumnsToDatasetSchema,\n duckLakePrimaryKeyColumnComment,\n} from \"./ducklake-catalog-schema\"\nimport type { DuckLakeConnectionManager } from \"./ducklake-connection-manager\"\nimport { readCurrentDatasetDefinitions } from \"./ducklake-current-dataset-definitions\"\nimport type { DatasetTableRef } from \"./ducklake-dataset-table-ref\"\nimport type { DuckLakeVersionSummary } from \"./ducklake-snapshot-reader\"\nimport {\n beginTransactionOnLatestVersion,\n commitVersionTransaction,\n type LatestVersionAtSnapshot,\n rerunWhenCatalogMoves,\n} from \"./ducklake-version-transaction\"\nimport { encodeLineage } from \"./lineage-encoding\"\nimport { encodeDatasetSequenceTableName, encodeDatasetTableName } from \"./names\"\nimport { datasetColumnToDuckDbSql, datasetSchemaToDuckDbColumnsSql } from \"./schema\"\nimport {\n duckLakeAlias,\n duckLakeMetadataTableName,\n qualifiedTableName,\n quoteIdentifier,\n quoteSqlString,\n} from \"./sql\"\n\n/**\n * Reads the latest version of a dataset, which a schema change keeps the rows of, as\n * `BeginVersionTransactionInput.readLatestVersion`.\n */\nexport type LatestDatasetVersionReader = (\n runtime: DuckDbQueryRuntime,\n definition: DatasetDefinition\n) => Promise<LatestVersionAtSnapshot<DuckLakeVersionSummary>>\n\nexport interface DatasetSchemaAtSnapshotRequest {\n readonly table: DatasetTableRef\n readonly snapshotId: string\n}\n\n/** A row of `ducklake_column`: one column of one table, alive over a snapshot range. */\ninterface DuckLakeColumnVersion {\n readonly tableId: bigint\n readonly beginSnapshot: bigint\n readonly endSnapshot?: bigint\n readonly column: Omit<DuckLakeCatalogColumn, \"tableName\">\n}\n\n/**\n * Translates between Sixb dataset definitions and DuckLake table metadata.\n *\n * DuckLake stays the source of truth for the physical table, schema, comments,\n * and partitioning. Sixb only decides which definition changes are safe to\n * translate into DuckLake DDL.\n */\nexport class DuckLakeDatasetCatalog {\n constructor(\n private readonly options: DuckLakeStorageOptions,\n private readonly connections: DuckLakeConnectionManager\n ) {}\n\n async createDataset(\n definition: DatasetDefinition,\n readLatestVersion: LatestDatasetVersionReader\n ): Promise<DatasetDefinition> {\n this.assertSchema(definition)\n\n // Step 1: read the current DuckLake table back into Sixb shape. The\n // existing definition is DuckLake's catalog state; the next definition is\n // the developer's current source definition.\n const existing = await this.getDataset(definition.id)\n\n if (existing) {\n // A schema change the catalog moved under, such as one another host applied concurrently,\n // reruns from the stored definition: it may have nothing left to change.\n const plan = await rerunWhenCatalogMoves(definition.id, async (attempt) => {\n const current = attempt === 1 ? existing : await this.getDataset(definition.id)\n if (!current) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${definition.id}' was removed while its definition was updated.`\n )\n }\n\n const plan = planDatasetDefinitionUpdate(current, definition)\n if (plan.changed) {\n await this.applyExistingDatasetUpdate(plan, readLatestVersion)\n }\n\n return plan\n })\n\n if (plan.changed) {\n this.connections.markLocalCatalogChanged()\n await this.connections.resetRuntime()\n }\n\n return (await this.getDataset(definition.id)) ?? plan.definition\n }\n\n // New datasets materialize as one DuckLake table with native columns. The\n // table name is reversible, so no sidecar mapping is needed.\n const tableName = encodeDatasetTableName(definition.id)\n const qualifiedName = qualifiedTableName(this.options, tableName)\n\n // Creating a dataset can be several catalog DDL statements. Keep them in\n // one transaction and runtime slot so nothing can observe a partial definition.\n await this.connections.withExclusiveAttached(async (runtime) => {\n await runtime.run(\"BEGIN TRANSACTION\")\n let committed = false\n try {\n await runtime.run(\n `CREATE TABLE ${qualifiedName} (${datasetSchemaToDuckDbColumnsSql(definition.schema)})`\n )\n\n if (definition.description !== undefined) {\n await runtime.run(\n `COMMENT ON TABLE ${qualifiedName} IS ${quoteSqlString(definition.description)}`\n )\n }\n\n await this.applyPrimaryKey(runtime, qualifiedName, definition)\n if (definition.sequenceBy !== undefined) {\n await runtime.run(\n `COMMENT ON COLUMN ${qualifiedName}.${quoteIdentifier(definition.sequenceBy)} IS ${quoteSqlString(DATASET_SEQUENCE_COLUMN_COMMENT)}`\n )\n await runtime.run(\n `CREATE TABLE ${qualifiedTableName(this.options, encodeDatasetSequenceTableName(definition.id))} (source_key VARCHAR NOT NULL, sequence VARCHAR NOT NULL, content VARCHAR)`\n )\n }\n await this.applyPartitionBy(runtime, qualifiedName, definition)\n\n await runtime.run(\"COMMIT\")\n committed = true\n } catch (error) {\n if (!committed) {\n await this.rollbackTransaction(runtime)\n }\n throw error\n }\n })\n this.connections.markLocalCatalogChanged()\n\n return structuredClone(definition)\n }\n\n async assertDatasetDefinitionsCompatible(\n definitions: readonly DatasetDefinition[]\n ): Promise<void> {\n const failures: string[] = []\n const checkedDefinitions: DatasetDefinition[] = []\n\n for (const definition of definitions) {\n try {\n this.assertSchema(definition)\n checkedDefinitions.push(definition)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n failures.push(`- ${definition.id}: ${message}`)\n }\n }\n\n const existingById = await this.readCurrentDatasetDefinitions({\n datasetIds: checkedDefinitions.map((definition) => definition.id),\n })\n\n for (const definition of checkedDefinitions) {\n const existing = existingById.get(definition.id)\n if (!existing) {\n continue\n }\n\n try {\n planDatasetDefinitionUpdate(existing, definition)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n failures.push(`- ${definition.id}: ${message}`)\n }\n }\n\n if (failures.length > 0) {\n const details = failures.join(\"\\n\")\n throw new LakeStorageError(\n `[SixbLake] Lake dataset definition check failed for ${failures.length} dataset(s).\\n${details}`\n )\n }\n }\n\n async getDataset(datasetId: string): Promise<DatasetDefinition | null> {\n this.connections.assertOpen()\n\n return this.connections.withAttachedRuntime((runtime) =>\n this.getDatasetOnRuntime(runtime, datasetId)\n )\n }\n\n async getDatasetOnRuntime(\n runtime: DuckDbQueryRuntime,\n datasetId: string\n ): Promise<DatasetDefinition | null> {\n return (\n (\n await this.readCurrentDatasetDefinitionsOnRuntime(runtime, {\n datasetIds: [datasetId],\n })\n ).get(datasetId) ?? null\n )\n }\n\n async listDatasets(): Promise<readonly DatasetDefinition[]> {\n this.connections.assertOpen()\n\n return this.connections.withAttachedRuntime(async (runtime) => {\n return [...(await this.readCurrentDatasetDefinitionsOnRuntime(runtime)).values()].sort(\n (left, right) => left.id.localeCompare(right.id)\n )\n })\n }\n\n private async readCurrentDatasetDefinitions(options?: {\n readonly datasetIds?: readonly string[]\n }): Promise<Map<string, DatasetDefinition>> {\n if (options?.datasetIds?.length === 0) {\n return new Map()\n }\n\n return this.connections.withAttachedRuntime((runtime) =>\n this.readCurrentDatasetDefinitionsOnRuntime(runtime, options)\n )\n }\n\n private async readCurrentDatasetDefinitionsOnRuntime(\n runtime: DuckDbQueryRuntime,\n options?: { readonly datasetIds?: readonly string[] }\n ): Promise<Map<string, DatasetDefinition>> {\n return readCurrentDatasetDefinitions({\n options: this.options,\n runtime,\n datasetIds: options?.datasetIds,\n })\n }\n\n /**\n * Dataset schemas at DuckLake snapshots, in request order, from one catalog read: a column row\n * is visible from its begin_snapshot until its end_snapshot, so the rows alive anywhere between\n * the oldest and the newest requested snapshot answer every request.\n */\n async getDatasetSchemasAtSnapshots(\n runtime: DuckDbQueryRuntime,\n requests: readonly DatasetSchemaAtSnapshotRequest[]\n ): Promise<readonly DatasetSchema[]> {\n if (requests.length === 0) {\n return []\n }\n\n for (const request of requests) {\n assertDuckLakeSnapshotId(request.snapshotId)\n }\n\n const snapshots = requests.map((request) => BigInt(request.snapshotId))\n const rows = await this.readDatasetColumnsBetweenSnapshots(\n runtime,\n requests.map((request) => request.table),\n snapshots.reduce((oldest, snapshot) => (snapshot < oldest ? snapshot : oldest)),\n snapshots.reduce((newest, snapshot) => (snapshot > newest ? snapshot : newest))\n )\n\n return requests.map(({ table, snapshotId }, index) => {\n const snapshot = snapshots[index]\n const columns = rows\n .filter(\n (row) =>\n row.tableId === table.tableId &&\n row.beginSnapshot <= snapshot &&\n (row.endSnapshot === undefined || row.endSnapshot > snapshot)\n )\n .map((row) => ({ tableName: table.tableName, ...row.column }))\n\n if (columns.length === 0) {\n throw new LakeStorageError(\n `[SixbDuckLake] Could not reconstruct schema for dataset '${table.datasetId}' at DuckLake snapshot '${snapshotId}'.`\n )\n }\n\n return duckLakeCatalogColumnsToDatasetSchema(table.tableName, columns)\n })\n }\n\n assertSchema(definition: DatasetDefinition): void {\n assertDatasetDefinition(\n definition,\n (message) => new LakeStorageError(`[SixbDuckLake] ${message}`)\n )\n }\n\n private async applyExistingDatasetUpdate(\n plan: DatasetDefinitionUpdatePlan,\n readLatestVersion: LatestDatasetVersionReader\n ): Promise<void> {\n const tableName = encodeDatasetTableName(plan.definition.id)\n const qualifiedName = qualifiedTableName(this.options, tableName)\n const { schema } = plan\n\n if (schema.kind === \"none\") {\n await this.connections.withExclusiveAttached((runtime) =>\n this.applyMetadataDelta(runtime, qualifiedName, plan)\n )\n return\n }\n\n // Schema-only DuckLake snapshots still matter to Sixb. Apply schema and\n // compatible metadata DDL atomically, then tag the commit so versions can\n // treat it as this dataset's schema-change version. It keeps the rows of\n // the latest version, and so its lineage. ALTER TABLE claims the table, and\n // changes no rows: it commits on the snapshot it read, or fails and reruns.\n await this.connections.withExclusiveAttached(async (runtime) => {\n let committed = false\n try {\n const parent = await beginTransactionOnLatestVersion({\n options: this.options,\n runtime,\n datasetId: plan.definition.id,\n readLatestVersion: () => readLatestVersion(runtime, plan.definition),\n })\n\n await this.applySchemaEvolutionDdl(runtime, qualifiedName, schema)\n await this.applyMetadataDelta(runtime, qualifiedName, plan)\n await this.setSchemaEvolutionCommitMetadata(\n runtime,\n plan.definition.id,\n schema,\n lineageAtCommit({ mode: \"schema\", schema: plan.definition.schema, parent })\n )\n\n await commitVersionTransaction(runtime, plan.definition.id, {\n poisonRuntime: () => this.connections.poisonRuntime(),\n })\n committed = true\n } catch (error) {\n if (!committed) {\n await this.rollbackTransaction(runtime)\n }\n throw error\n }\n })\n }\n\n private async applySchemaEvolutionDdl(\n runtime: DuckDbQueryRuntime,\n qualifiedName: string,\n plan: Extract<DatasetSchemaUpdatePlan, { readonly kind: \"addNullableColumns\" }>\n ): Promise<void> {\n for (const column of plan.columns) {\n await runtime.run(\n `ALTER TABLE ${qualifiedName} ADD COLUMN ${datasetColumnToDuckDbSql(column)}`\n )\n }\n }\n\n private async applyMetadataDelta(\n runtime: DuckDbQueryRuntime,\n qualifiedName: string,\n plan: DatasetDefinitionUpdatePlan\n ): Promise<void> {\n // A compatible merge may add optional metadata after first creation. Apply\n // those deltas explicitly so createDataset never silently accepts a change\n // that DuckLake did not persist.\n if (plan.metadata.descriptionChanged && plan.definition.description !== undefined) {\n await runtime.run(\n `COMMENT ON TABLE ${qualifiedName} IS ${quoteSqlString(plan.definition.description)}`\n )\n }\n\n if (plan.metadata.partitionByChanged) {\n await this.applyPartitionBy(runtime, qualifiedName, plan.definition)\n }\n }\n\n private async applyPartitionBy(\n runtime: DuckDbQueryRuntime,\n qualifiedName: string,\n definition: DatasetDefinition\n ): Promise<void> {\n if (definition.partitionBy === undefined || definition.partitionBy.length === 0) {\n return\n }\n\n // Partitioning is DuckLake physical metadata. If DuckLake cannot apply it,\n // fail with the original driver message instead of returning stale\n // partition metadata.\n try {\n await runtime.run(\n `ALTER TABLE ${qualifiedName} SET PARTITIONED BY (${definition.partitionBy\n .map((columnName) => quoteIdentifier(columnName))\n .join(\", \")})`\n )\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${definition.id}' cannot apply partitionBy because DuckLake rejected ALTER TABLE SET PARTITIONED BY: ${message}`\n )\n }\n }\n\n private async applyPrimaryKey(\n runtime: DuckDbQueryRuntime,\n qualifiedName: string,\n definition: DatasetDefinition\n ): Promise<void> {\n if (definition.primaryKey === undefined) {\n return\n }\n\n const columnNames =\n typeof definition.primaryKey === \"string\" ? [definition.primaryKey] : definition.primaryKey\n for (const [ordinal, columnName] of columnNames.entries()) {\n await runtime.run(\n `COMMENT ON COLUMN ${qualifiedName}.${quoteIdentifier(columnName)} IS ${quoteSqlString(\n duckLakePrimaryKeyColumnComment(ordinal)\n )}`\n )\n }\n }\n\n private async setSchemaEvolutionCommitMetadata(\n runtime: DuckDbQueryRuntime,\n datasetId: string,\n plan: Extract<DatasetSchemaUpdatePlan, { readonly kind: \"addNullableColumns\" }>,\n lineage: DatasetVersionLineage | undefined\n ): Promise<void> {\n await runtime.run(\n `CALL ${quoteIdentifier(duckLakeAlias(this.options))}.set_commit_message(${quoteSqlString(\n \"Sixb\"\n )}, ${quoteSqlString(`evolve dataset ${datasetId} schema`)}, extra_info => ${quoteSqlString(\n JSON.stringify({\n sixb: {\n kind: \"datasetVersion\",\n datasetId,\n commitId: randomUUID(),\n mode: \"schema\",\n schemaChange: {\n addColumns: plan.columns.map((column) => column.name),\n },\n ...(lineage === undefined ? {} : { lineage: encodeLineage(lineage) }),\n },\n })\n )})`\n )\n }\n\n private async rollbackTransaction(runtime: DuckDbQueryRuntime): Promise<void> {\n try {\n await runtime.run(\"ROLLBACK\")\n } catch {\n // Preserve the original DDL failure. DuckDB may already have closed the\n // transaction if COMMIT itself failed.\n }\n }\n\n private async readDatasetColumnsBetweenSnapshots(\n runtime: DuckDbQueryRuntime,\n tables: readonly DatasetTableRef[],\n oldestSnapshot: bigint,\n newestSnapshot: bigint\n ): Promise<readonly DuckLakeColumnVersion[]> {\n const tableIds = new Set(tables.map((table) => table.tableId))\n const ducklakeColumn = duckLakeMetadataTableName(this.options, \"ducklake_column\")\n const rows = await runtime.query(`\n SELECT\n table_id,\n column_id,\n column_order,\n column_name,\n column_type,\n CAST(nulls_allowed AS BOOLEAN) AS nulls_allowed,\n parent_column,\n begin_snapshot,\n end_snapshot\n FROM ${ducklakeColumn}\n WHERE table_id IN (${[...tableIds].join(\", \")})\n AND begin_snapshot <= ${newestSnapshot}\n AND (end_snapshot IS NULL OR end_snapshot > ${oldestSnapshot})\n ORDER BY column_order, column_id\n `)\n\n return rows.map((row) => ({\n tableId: getBigIntLike(row, \"table_id\"),\n beginSnapshot: getBigIntLike(row, \"begin_snapshot\"),\n endSnapshot: getOptionalBigIntLike(row, \"end_snapshot\"),\n column: {\n columnId: getBigIntLike(row, \"column_id\"),\n columnOrder: getBigIntLike(row, \"column_order\"),\n columnName: getString(row, \"column_name\"),\n columnType: getString(row, \"column_type\"),\n nullsAllowed: getBoolean(row, \"nulls_allowed\"),\n parentColumnId: getOptionalBigIntLike(row, \"parent_column\"),\n },\n }))\n }\n}\n\nfunction assertDuckLakeSnapshotId(snapshotId: string): void {\n if (!/^\\d+$/.test(snapshotId)) {\n throw new LakeStorageError(`[SixbDuckLake] Invalid DuckLake snapshot id '${snapshotId}'.`)\n }\n}\n",
21
21
  "import type { DatasetColumnDefinition, DatasetPrimaryKey, DatasetSchema } from \"@sixb/core\"\nimport { LakeStorageError } from \"@sixb/core/lake-storage\"\nimport { duckDbTypeToDatasetColumnType } from \"./schema\"\n\nexport interface DuckLakeCatalogColumn {\n readonly tableName: string\n readonly columnId: bigint\n readonly columnOrder: bigint\n readonly columnName: string\n readonly columnType: string\n readonly nullsAllowed: boolean\n readonly parentColumnId?: bigint\n readonly comment?: string\n}\n\nconst SIXB_PRIMARY_KEY_COMMENT_NAMESPACE = \"sixb:primary-key:\"\nexport const DATASET_SEQUENCE_COLUMN_COMMENT = \"sixb.sequenceBy.v1\"\nconst SIXB_PRIMARY_KEY_COMMENT_PREFIX = `${SIXB_PRIMARY_KEY_COMMENT_NAMESPACE}v1:`\n\nconst FILE_REF_STRUCT_CHILDREN = [\n { name: \"blobId\", type: \"string\" },\n { name: \"digest\", type: \"string\" },\n { name: \"sizeBytes\", type: \"int64\" },\n { name: \"fileName\", type: \"string\" },\n { name: \"mediaType\", type: \"string\" },\n { name: \"logicalPath\", type: \"string\" },\n] satisfies readonly { readonly name: string; readonly type: DatasetColumnDefinition[\"type\"] }[]\n\nexport function duckLakeCatalogColumnsToDatasetSchema(\n tableName: string,\n rows: readonly DuckLakeCatalogColumn[]\n): DatasetSchema {\n const childrenByParentId = new Map<bigint, DuckLakeCatalogColumn[]>()\n const topLevelColumns: DuckLakeCatalogColumn[] = []\n\n for (const row of rows) {\n if (row.parentColumnId === undefined) {\n topLevelColumns.push(row)\n continue\n }\n\n const children = childrenByParentId.get(row.parentColumnId) ?? []\n children.push(row)\n childrenByParentId.set(row.parentColumnId, children)\n }\n\n return {\n columns: topLevelColumns\n .sort(compareDuckLakeCatalogColumnOrder)\n .map((column) => duckLakeCatalogColumnToDefinition(tableName, column, childrenByParentId)),\n }\n}\n\nexport function duckLakePrimaryKeyColumnComment(ordinal: number): string {\n return `${SIXB_PRIMARY_KEY_COMMENT_PREFIX}${ordinal}`\n}\n\nexport function duckLakeCatalogColumnsToDatasetPrimaryKey(\n tableName: string,\n rows: readonly DuckLakeCatalogColumn[]\n): DatasetPrimaryKey | undefined {\n const keyedColumns: { readonly column: DuckLakeCatalogColumn; readonly ordinal: number }[] = []\n const seenOrdinals = new Set<number>()\n\n for (const column of rows) {\n const comment = column.comment\n if (comment === undefined || !comment.startsWith(SIXB_PRIMARY_KEY_COMMENT_NAMESPACE)) {\n continue\n }\n\n if (\n column.parentColumnId !== undefined ||\n !comment.startsWith(SIXB_PRIMARY_KEY_COMMENT_PREFIX)\n ) {\n throwInvalidPrimaryKeyMetadata(tableName, column, comment)\n }\n\n const ordinalText = comment.slice(SIXB_PRIMARY_KEY_COMMENT_PREFIX.length)\n if (!/^(0|[1-9]\\d*)$/.test(ordinalText)) {\n throwInvalidPrimaryKeyMetadata(tableName, column, comment)\n }\n\n const ordinal = Number(ordinalText)\n if (!Number.isSafeInteger(ordinal)) {\n throwInvalidPrimaryKeyMetadata(tableName, column, comment)\n }\n if (seenOrdinals.has(ordinal)) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset table '${tableName}' has duplicate primary-key ordinal '${ordinal}'.`\n )\n }\n seenOrdinals.add(ordinal)\n\n if (duckDbTypeToDatasetColumnType(column.columnType) !== \"string\") {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset table '${tableName}' primary-key column '${column.columnName}' must map to type 'string'.`\n )\n }\n if (column.nullsAllowed) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset table '${tableName}' primary-key column '${column.columnName}' must not be nullable.`\n )\n }\n\n keyedColumns.push({ column, ordinal })\n }\n\n if (keyedColumns.length === 0) {\n return undefined\n }\n\n keyedColumns.sort((left, right) => left.ordinal - right.ordinal)\n for (const [expectedOrdinal, keyedColumn] of keyedColumns.entries()) {\n if (keyedColumn.ordinal !== expectedOrdinal) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset table '${tableName}' primary-key ordinals must be contiguous from 0.`\n )\n }\n }\n\n const columnNames = keyedColumns.map(({ column }) => column.columnName)\n if (columnNames.length === 1) {\n return columnNames[0]\n }\n\n return columnNames as [string, string, ...string[]]\n}\n\nfunction throwInvalidPrimaryKeyMetadata(\n tableName: string,\n column: DuckLakeCatalogColumn,\n comment: string\n): never {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset table '${tableName}' has malformed primary-key metadata '${comment}' on column '${column.columnName}'.`\n )\n}\n\nfunction duckLakeCatalogColumnToDefinition(\n tableName: string,\n column: DuckLakeCatalogColumn,\n childrenByParentId: ReadonlyMap<bigint, readonly DuckLakeCatalogColumn[]>\n): DatasetColumnDefinition {\n const children = [...(childrenByParentId.get(column.columnId) ?? [])].sort(\n compareDuckLakeCatalogColumnOrder\n )\n return {\n name: column.columnName,\n type: duckLakeCatalogColumnTypeToDatasetType(tableName, column, children),\n ...(column.nullsAllowed ? { nullable: true } : {}),\n }\n}\n\nfunction duckLakeCatalogColumnTypeToDatasetType(\n tableName: string,\n column: DuckLakeCatalogColumn,\n children: readonly DuckLakeCatalogColumn[]\n): DatasetColumnDefinition[\"type\"] {\n if (children.length === 0 && column.columnType.toLowerCase() !== \"struct\") {\n return duckDbTypeToDatasetColumnType(column.columnType)\n }\n\n if (isFileRefStruct(children)) {\n return \"fileRef\"\n }\n\n throw new LakeStorageError(\n `[SixbDuckLake] DuckDB column type '${formatDuckLakeCatalogColumnType(\n column,\n children\n )}' in dataset table '${tableName}' cannot be mapped to a Sixb dataset column type.`\n )\n}\n\nfunction compareDuckLakeCatalogColumnOrder(\n left: DuckLakeCatalogColumn,\n right: DuckLakeCatalogColumn\n): number {\n return Number(left.columnOrder - right.columnOrder)\n}\n\nfunction isFileRefStruct(children: readonly DuckLakeCatalogColumn[]): boolean {\n if (children.length !== FILE_REF_STRUCT_CHILDREN.length) {\n return false\n }\n\n return FILE_REF_STRUCT_CHILDREN.every((expected, index) => {\n const child = children[index]\n return (\n child !== undefined &&\n child.columnName === expected.name &&\n duckDbTypeToDatasetColumnType(child.columnType) === expected.type\n )\n })\n}\n\nfunction formatDuckLakeCatalogColumnType(\n column: DuckLakeCatalogColumn,\n children: readonly DuckLakeCatalogColumn[]\n): string {\n if (children.length === 0) {\n return column.columnType\n }\n\n return `STRUCT(${children.map((child) => `${child.columnName} ${child.columnType}`).join(\", \")})`\n}\n",
22
22
  "import type { DatasetDefinition } from \"@sixb/core\"\nimport { LakeStorageError } from \"@sixb/core/lake-storage\"\nimport type { DuckLakeStorageOptions } from \"../types\"\nimport {\n getBigIntLike,\n getBoolean,\n getOptionalBigIntLike,\n getOptionalString,\n getString,\n} from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport {\n DATASET_SEQUENCE_COLUMN_COMMENT,\n type DuckLakeCatalogColumn,\n duckLakeCatalogColumnsToDatasetPrimaryKey,\n duckLakeCatalogColumnsToDatasetSchema,\n} from \"./ducklake-catalog-schema\"\nimport { decodeDatasetTableName, encodeDatasetTableName } from \"./names\"\nimport { duckLakeAlias, duckLakeMetadataTableName, quoteSqlString, quoteSqlStringList } from \"./sql\"\n\ninterface CurrentDatasetTable {\n readonly datasetId: string\n readonly tableName: string\n readonly comment?: string\n}\n\ninterface CurrentDatasetPartition {\n readonly tableName: string\n readonly columnName: string\n readonly transform: string\n}\n\nexport interface ReadCurrentDatasetDefinitionsInput {\n readonly options: DuckLakeStorageOptions\n readonly runtime: DuckDbQueryRuntime\n readonly datasetIds?: readonly string[]\n}\n\nexport async function readCurrentDatasetDefinitions(\n input: ReadCurrentDatasetDefinitionsInput\n): Promise<Map<string, DatasetDefinition>> {\n if (input.datasetIds?.length === 0) {\n return new Map()\n }\n\n const tables = await readCurrentDatasetTables(input, input.datasetIds)\n if (tables.length === 0) {\n return new Map()\n }\n\n const tableNames = tables.map((table) => table.tableName)\n const columnsByTableName = groupColumnsByTableName(\n await readCurrentDatasetColumns(input, tableNames)\n )\n const partitionByTableName = groupPartitionsByTableName(\n await readCurrentDatasetPartitions(input, tableNames)\n )\n const definitions = new Map<string, DatasetDefinition>()\n\n for (const table of tables) {\n const columns = columnsByTableName.get(table.tableName) ?? []\n const primaryKey = duckLakeCatalogColumnsToDatasetPrimaryKey(table.tableName, columns)\n const sequenceBy = columns.find(\n (column) => column.comment === DATASET_SEQUENCE_COLUMN_COMMENT\n )?.columnName\n const partitionBy = partitionByTableName.get(table.tableName) ?? []\n definitions.set(table.datasetId, {\n kind: \"dataset\",\n id: table.datasetId,\n schema: duckLakeCatalogColumnsToDatasetSchema(table.tableName, columns),\n ...(primaryKey !== undefined ? { primaryKey } : {}),\n ...(sequenceBy !== undefined ? { sequenceBy } : {}),\n ...(partitionBy.length > 0 ? { partitionBy } : {}),\n ...(table.comment !== undefined ? { description: table.comment } : {}),\n })\n }\n\n return definitions\n}\n\nasync function readCurrentDatasetTables(\n input: ReadCurrentDatasetDefinitionsInput,\n datasetIds: readonly string[] | undefined\n): Promise<readonly CurrentDatasetTable[]> {\n if (datasetIds !== undefined && datasetIds.length === 0) {\n return []\n }\n\n const tableNameFilter =\n datasetIds === undefined\n ? \"\"\n : `AND table_name IN (${quoteSqlStringList(\n [...new Set(datasetIds)].map((datasetId) => encodeDatasetTableName(datasetId))\n )})`\n\n const rows = await input.runtime.query(\n `SELECT table_name, comment FROM duckdb_tables() WHERE database_name = ${quoteSqlString(\n duckLakeAlias(input.options)\n )} AND schema_name = 'main' ${tableNameFilter} AND NOT internal ORDER BY table_name`\n )\n\n const tables: CurrentDatasetTable[] = []\n for (const row of rows) {\n const tableName = getString(row, \"table_name\")\n const datasetId = decodeDatasetTableName(tableName)\n if (datasetId === null) {\n continue\n }\n\n tables.push({\n datasetId,\n tableName,\n comment: getOptionalString(row, \"comment\"),\n })\n }\n\n return tables\n}\n\nasync function readCurrentDatasetColumns(\n input: ReadCurrentDatasetDefinitionsInput,\n tableNames: readonly string[]\n): Promise<readonly DuckLakeCatalogColumn[]> {\n if (tableNames.length === 0) {\n return []\n }\n\n const ducklakeTable = duckLakeMetadataTableName(input.options, \"ducklake_table\")\n const ducklakeColumn = duckLakeMetadataTableName(input.options, \"ducklake_column\")\n const ducklakeColumnTag = duckLakeMetadataTableName(input.options, \"ducklake_column_tag\")\n const rows = await input.runtime.query(`\n SELECT\n table_meta.table_name,\n column_meta.column_id,\n column_meta.column_order,\n column_meta.column_name,\n column_meta.column_type,\n CAST(column_meta.nulls_allowed AS BOOLEAN) AS nulls_allowed,\n column_meta.parent_column,\n column_tag.\"value\" AS comment\n FROM ${ducklakeTable} table_meta\n JOIN ${ducklakeColumn} column_meta\n ON column_meta.table_id = table_meta.table_id\n AND column_meta.end_snapshot IS NULL\n LEFT JOIN ${ducklakeColumnTag} column_tag\n ON column_tag.table_id = column_meta.table_id\n AND column_tag.column_id = column_meta.column_id\n AND column_tag.\"key\" = 'comment'\n AND column_tag.end_snapshot IS NULL\n WHERE table_meta.end_snapshot IS NULL\n AND table_meta.table_name IN (${quoteSqlStringList(tableNames)})\n ORDER BY table_meta.table_name, column_meta.column_order\n `)\n\n return rows.map((row) => ({\n tableName: getString(row, \"table_name\"),\n columnId: getBigIntLike(row, \"column_id\"),\n columnOrder: getBigIntLike(row, \"column_order\"),\n columnName: getString(row, \"column_name\"),\n columnType: getString(row, \"column_type\"),\n nullsAllowed: getBoolean(row, \"nulls_allowed\"),\n parentColumnId: getOptionalBigIntLike(row, \"parent_column\"),\n comment: getOptionalString(row, \"comment\"),\n }))\n}\n\nasync function readCurrentDatasetPartitions(\n input: ReadCurrentDatasetDefinitionsInput,\n tableNames: readonly string[]\n): Promise<readonly CurrentDatasetPartition[]> {\n if (tableNames.length === 0) {\n return []\n }\n\n const ducklakeTable = duckLakeMetadataTableName(input.options, \"ducklake_table\")\n const ducklakePartitionInfo = duckLakeMetadataTableName(input.options, \"ducklake_partition_info\")\n const ducklakePartitionColumn = duckLakeMetadataTableName(\n input.options,\n \"ducklake_partition_column\"\n )\n const ducklakeColumn = duckLakeMetadataTableName(input.options, \"ducklake_column\")\n const rows = await input.runtime.query(`\n SELECT\n table_meta.table_name,\n column_meta.column_name,\n partition_column.transform\n FROM ${ducklakeTable} table_meta\n JOIN ${ducklakePartitionInfo} partition_info\n ON partition_info.table_id = table_meta.table_id\n AND partition_info.end_snapshot IS NULL\n JOIN ${ducklakePartitionColumn} partition_column\n ON partition_column.table_id = table_meta.table_id\n AND partition_column.partition_id = partition_info.partition_id\n JOIN ${ducklakeColumn} column_meta\n ON column_meta.table_id = table_meta.table_id\n AND column_meta.column_id = partition_column.column_id\n AND column_meta.end_snapshot IS NULL\n WHERE table_meta.end_snapshot IS NULL\n AND table_meta.table_name IN (${quoteSqlStringList(tableNames)})\n ORDER BY table_meta.table_name, partition_column.partition_key_index\n `)\n\n return rows.map((row) => {\n const partition = {\n tableName: getString(row, \"table_name\"),\n columnName: getString(row, \"column_name\"),\n transform: getString(row, \"transform\"),\n } satisfies CurrentDatasetPartition\n\n if (partition.transform !== \"identity\") {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset table '${partition.tableName}' uses unsupported DuckLake partition transform '${partition.transform}'.`\n )\n }\n\n return partition\n })\n}\n\nfunction groupColumnsByTableName(\n rows: readonly DuckLakeCatalogColumn[]\n): Map<string, DuckLakeCatalogColumn[]> {\n const result = new Map<string, DuckLakeCatalogColumn[]>()\n for (const row of rows) {\n const tableRows = result.get(row.tableName) ?? []\n tableRows.push(row)\n result.set(row.tableName, tableRows)\n }\n return result\n}\n\nfunction groupPartitionsByTableName(\n rows: readonly CurrentDatasetPartition[]\n): Map<string, string[]> {\n const result = new Map<string, string[]>()\n for (const row of rows) {\n const tablePartitions = result.get(row.tableName) ?? []\n tablePartitions.push(row.columnName)\n result.set(row.tableName, tablePartitions)\n }\n return result\n}\n",
23
- "import { LakeStorageError } from \"@sixb/core/lake-storage\"\nimport type {\n DuckLakeMaintenanceOptions,\n DuckLakeMaintenanceReport,\n DuckLakeStorageOptions,\n} from \"../types\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport type { DuckLakeConnectionManager } from \"./ducklake-connection-manager\"\nimport { duckLakeAlias, quoteSqlString } from \"./sql\"\n\nconst DEFAULT_RETENTION = \"7 days\"\n\ninterface MaintenanceCounts {\n readonly snapshots: number\n readonly oldFiles: number\n readonly orphanedFiles: number\n}\n\nexport class DuckLakeMaintenance {\n constructor(\n private readonly options: DuckLakeStorageOptions,\n private readonly connections: DuckLakeConnectionManager\n ) {}\n\n async runMaintenance(\n options: DuckLakeMaintenanceOptions = {}\n ): Promise<DuckLakeMaintenanceReport> {\n this.connections.assertOpen()\n\n const expireOlderThan = options.expireOlderThan ?? DEFAULT_RETENTION\n const deleteOlderThan = options.deleteOlderThan ?? expireOlderThan\n const dryRun = options.dryRun ?? false\n\n if (this.options.readOnly && !dryRun) {\n throw new LakeStorageError(\n \"[SixbDuckLake] DuckLake maintenance cannot run in read-only mode.\"\n )\n }\n\n return this.connections.withMaintenanceRuntime(async (runtime) => {\n const counts = await runMaintenanceProcedures(\n runtime,\n this.options,\n {\n expireOlderThan,\n deleteOlderThan,\n },\n dryRun\n )\n\n if (!dryRun) {\n this.connections.markLocalCatalogChanged()\n }\n\n return {\n dryRun,\n expireOlderThan,\n deleteOlderThan,\n ...counts,\n }\n })\n }\n}\n\nasync function runMaintenanceProcedures(\n runtime: DuckDbQueryRuntime,\n options: DuckLakeStorageOptions,\n retention: Pick<DuckLakeMaintenanceReport, \"expireOlderThan\" | \"deleteOlderThan\">,\n dryRun: boolean\n): Promise<MaintenanceCounts> {\n const aliasSql = quoteSqlString(duckLakeAlias(options))\n const snapshots = await runtime.query(\n maintenanceProcedureSql(\n \"ducklake_expire_snapshots\",\n aliasSql,\n retention.expireOlderThan,\n dryRun\n )\n )\n const oldFiles = await runtime.query(\n maintenanceProcedureSql(\n \"ducklake_cleanup_old_files\",\n aliasSql,\n retention.deleteOlderThan,\n dryRun\n )\n )\n const orphanedFiles = await runtime.query(\n maintenanceProcedureSql(\n \"ducklake_delete_orphaned_files\",\n aliasSql,\n retention.deleteOlderThan,\n dryRun\n )\n )\n\n return {\n snapshots: snapshots.length,\n oldFiles: oldFiles.length,\n orphanedFiles: orphanedFiles.length,\n }\n}\n\nfunction maintenanceProcedureSql(\n procedure: string,\n aliasSql: string,\n olderThan: string,\n dryRun: boolean\n): string {\n const olderThanSql = quoteSqlString(olderThan)\n const dryRunSql = dryRun ? \"dry_run => true, \" : \"\"\n return (\n `CALL ${procedure}(${aliasSql}, ${dryRunSql}` +\n `older_than => now() - INTERVAL ${olderThanSql})`\n )\n}\n",
23
+ "import { LakeConcurrencyError, LakeStorageError } from \"@sixb/core/lake-storage\"\nimport type { DuckLakeCatalogOptions, DuckLakeStorageOptions } from \"../types\"\nimport { getBigIntLike } from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport { duckLakeAlias, quoteIdentifier } from \"./sql\"\n\n/**\n * How a version transaction reruns after other writers moved the catalog under it. Of concurrent\n * commits to one claimed table, only the first commits: the others rerun, behind a winner that may\n * already be committing its next version, so rerunning at once can lose every time. Each rerun\n * after the first waits a random part (full jitter) of a window that doubles up to a cap, which\n * spreads the losers apart.\n *\n * Ten writers that kept committing to one keyed dataset on PostgreSQL needed up to 10 attempts per\n * write; rerunning at once, one of them ran out of 12. 16 attempts leave room above that, and wait\n * at most 9.3 s in all (4.6 s on average) before a writer that cannot commit fails.\n */\nconst VERSION_RERUNS = { maxAttempts: 16, baseDelayMillis: 10, maxDelayMillis: 1_000 } as const\n\n/**\n * The catalog moved while a version transaction was being prepared or committed, before anything\n * was stored. Rerunning the whole transaction from a fresh read of the latest version is safe.\n */\nexport class CatalogMovedError extends LakeConcurrencyError {}\n\n/** The latest version of a dataset, and the lake's snapshot it was read at. */\nexport interface LatestVersionAtSnapshot<T> {\n readonly snapshotId: string\n readonly latestVersion: T | null\n}\n\nexport interface BeginVersionTransactionInput<T> {\n readonly options: DuckLakeStorageOptions\n readonly runtime: DuckDbQueryRuntime\n readonly datasetId: string\n readonly signal?: AbortSignal\n /**\n * Reads the latest version of the dataset, which the transaction then builds on. Its first\n * statement reads the lake's current snapshot, which fixes the transaction's snapshot.\n */\n readonly readLatestVersion: () => Promise<LatestVersionAtSnapshot<T>>\n}\n\n/**\n * Begins the transaction of a new dataset version together with a read of the latest version, so\n * what the new version derives from its parent, such as its row count or its lineage, describes\n * the parent it commits on top of, provided every version it must not build on unseen claims its\n * table (see the write coordinator).\n */\nexport async function beginTransactionOnLatestVersion<T>(\n input: BeginVersionTransactionInput<T>\n): Promise<T | null> {\n if (!isSqliteCatalog(input.options.catalog)) {\n await input.runtime.run(\"BEGIN TRANSACTION\")\n\n // DuckLake fixes a transaction's snapshot on its first read of the lake, not at BEGIN: the\n // read fixes it before it reads the latest version, so a version that claimed the table and\n // committed after that read makes this transaction conflict.\n return (await input.readLatestVersion()).latestVersion\n }\n\n // Direct metadata reads enlist a second SQLite transaction on the outer DuckDB connection.\n // Its read lock blocks DuckLake's own metadata connection at COMMIT. Read in autocommit,\n // then fix the transaction's DuckLake snapshot and verify nothing changed in between: the\n // read is then valid for this transaction, including null (no previous version).\n input.signal?.throwIfAborted()\n const { snapshotId, latestVersion } = await input.readLatestVersion()\n\n await input.runtime.run(\"BEGIN TRANSACTION\")\n if ((await currentSnapshotId(input.options, input.runtime)) !== snapshotId) {\n await input.runtime.run(\"ROLLBACK\")\n throw new CatalogMovedError(\n `[SixbDuckLake] Catalog changed while a write to dataset '${input.datasetId}' was prepared.`\n )\n }\n\n return latestVersion\n}\n\nexport interface CommitOnReadSnapshot {\n /** Recycles the connection when its DuckLake retry setting cannot be restored. */\n readonly poisonRuntime: () => void\n}\n\n/**\n * Commits a version transaction. A conflict with a concurrent commit fails before DuckLake stores\n * anything, and is raised as a `CatalogMovedError` for the transaction to rerun.\n *\n * DuckLake commits on top of any snapshot committed since the transaction began that does not\n * conflict with it. With `onReadSnapshot`, the commit fails on any such snapshot instead, of this\n * dataset or not: a version that must sit on the version it read, but that inserts and deletes no\n * rows DuckLake could check, needs it.\n */\nexport async function commitVersionTransaction(\n runtime: DuckDbQueryRuntime,\n datasetId: string,\n onReadSnapshot?: CommitOnReadSnapshot\n): Promise<void> {\n if (onReadSnapshot) {\n await runtime.run(\"SET ducklake_max_retry_count = 0\")\n }\n\n try {\n await runtime.run(\"COMMIT\")\n } catch (error) {\n throw catalogMovedError(error, datasetId) ?? error\n } finally {\n if (onReadSnapshot) {\n await runtime.run(\"RESET ducklake_max_retry_count\").catch(() => {\n // The setting is session state on a shared connection, and the commit already succeeded\n // or failed durably: never change that outcome, but never reuse the connection either.\n onReadSnapshot.poisonRuntime()\n })\n }\n }\n}\n\n/**\n * Reruns a version transaction that the catalog moved under, before anything was stored. The\n * rerun reads the latest version again: one guarded on an expected latest version checks its guard\n * against what moved, and fails as an optimistic commit if this dataset is what moved.\n */\nexport async function rerunWhenCatalogMoves<T>(\n datasetId: string,\n transaction: (attempt: number) => Promise<T>,\n signal?: AbortSignal\n): Promise<T> {\n for (let attempt = 1; ; attempt++) {\n try {\n return await transaction(attempt)\n } catch (error) {\n if (!(error instanceof CatalogMovedError)) {\n throw error\n }\n\n if (attempt === VERSION_RERUNS.maxAttempts) {\n throw new LakeConcurrencyError(\n `[SixbDuckLake] Concurrent writers moved the catalog during ${attempt} attempts to commit dataset '${datasetId}'. Retry the write.`,\n { cause: error }\n )\n }\n }\n\n await waitBeforeRerun(rerunDelayMillis(attempt), signal)\n }\n}\n\n/** The wait before the given rerun: none before the first, then full jitter on a doubling window. */\nfunction rerunDelayMillis(rerun: number): number {\n if (rerun === 1) {\n return 0\n }\n\n const window = Math.min(\n VERSION_RERUNS.maxDelayMillis,\n VERSION_RERUNS.baseDelayMillis * 2 ** (rerun - 1)\n )\n\n return Math.random() * window\n}\n\nfunction waitBeforeRerun(millis: number, signal: AbortSignal | undefined): Promise<void> {\n signal?.throwIfAborted()\n if (millis === 0) {\n return Promise.resolve()\n }\n\n return new Promise((resolve, reject) => {\n const abort = () => {\n clearTimeout(timer)\n reject(signal?.reason)\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", abort)\n resolve()\n }, millis)\n\n signal?.addEventListener(\"abort\", abort, { once: true })\n })\n}\n\nexport function isSqliteCatalog(catalog: DuckLakeCatalogOptions): boolean {\n return (\n catalog.type === \"sqlite\" ||\n (catalog.type === \"custom\" && catalog.uri.toLowerCase().startsWith(\"sqlite:\"))\n )\n}\n\n/**\n * DuckLake refuses a commit that conflicts with one committed since the transaction began, or that\n * exhausted its retries against concurrent commits, before it stores anything. Other errors, such\n * as a lost connection during COMMIT, are not classified: their outcome is ambiguous.\n */\nfunction catalogMovedError(error: unknown, datasetId: string): CatalogMovedError | undefined {\n if (\n error instanceof Error &&\n error.message.startsWith(\n \"TransactionContext Error: Failed to commit: Failed to commit DuckLake transaction.\"\n ) &&\n (error.message.includes(\"Transaction conflict - \") ||\n error.message.includes(\"Exceeded the maximum retry count\"))\n ) {\n return new CatalogMovedError(\n `[SixbDuckLake] Concurrent catalog commit for dataset '${datasetId}'.`,\n { cause: error }\n )\n }\n\n return undefined\n}\n\nasync function currentSnapshotId(\n options: DuckLakeStorageOptions,\n runtime: DuckDbQueryRuntime\n): Promise<string> {\n const [row] = await runtime.query(\n `SELECT id FROM ${quoteIdentifier(duckLakeAlias(options))}.current_snapshot()`\n )\n if (row === undefined) {\n throw new LakeStorageError(\"[SixbDuckLake] DuckLake did not return a current snapshot.\")\n }\n\n return String(getBigIntLike(row, \"id\"))\n}\n",
24
+ "import type {\n DatasetColumnLineage,\n DatasetColumnRef,\n DatasetVersionLineage,\n} from \"@sixb/core/lake-storage\"\n\n/**\n * How a version's resolved lineage is stored in DuckLake commit metadata.\n *\n * A resolved lineage repeats the same dataset ids and column names across thousands of refs, and\n * every catalog scan reads the commit metadata of every snapshot it passes, wanted or not. So each\n * distinct string is stored once and refs are index pairs, and the encoded lineage is one JSON\n * string inside the metadata: parsing the metadata copies it without building its refs, which\n * only the versions a read returns decode.\n */\ninterface EncodedColumnLineage {\n readonly v: 1\n /** Every distinct dataset id, column name, and lineage column name. */\n readonly strings: readonly string[]\n /** Row refs as flat index pairs: dataset id, column. */\n readonly rows: readonly number[]\n /** One entry per column: its name's index, then its refs as flat index pairs. */\n readonly columns: readonly (readonly number[])[]\n}\n\nexport function encodeLineage(lineage: DatasetVersionLineage): string {\n if (\"unknown\" in lineage) {\n return JSON.stringify({ unknown: lineage.unknown })\n }\n\n const strings: string[] = []\n const indexes = new Map<string, number>()\n const indexOf = (value: string) => {\n let index = indexes.get(value)\n if (index === undefined) {\n index = strings.length\n strings.push(value)\n indexes.set(value, index)\n }\n return index\n }\n const encodeRefs = (refs: readonly DatasetColumnRef[]) =>\n refs.flatMap((ref) => [indexOf(ref.datasetId), indexOf(ref.column)])\n\n const encoded: EncodedColumnLineage = {\n v: 1,\n strings,\n rows: encodeRefs(lineage.rows),\n columns: Object.entries(lineage.columns).map(([column, refs]) => [\n indexOf(column),\n ...encodeRefs(refs),\n ]),\n }\n\n return JSON.stringify(encoded)\n}\n\n/**\n * The stored lineage, as stored. One Sixb cannot read is unknown, as Sixb reads a malformed\n * lineage: dropping it instead would classify a version outside pipelines by its own columns only.\n */\nexport function decodeLineage(datasetId: string, stored: unknown): DatasetVersionLineage {\n const parsed = typeof stored === \"string\" ? parseJson(stored) : undefined\n if (isRecord(parsed) && Object.hasOwn(parsed, \"unknown\")) {\n return typeof parsed.unknown === \"string\" ? { unknown: parsed.unknown } : unreadable(datasetId)\n }\n\n return decodeColumnLineage(parsed) ?? unreadable(datasetId)\n}\n\nfunction decodeColumnLineage(value: unknown): DatasetColumnLineage | undefined {\n if (!isRecord(value) || value.v !== 1 || !isStringList(value.strings)) {\n return undefined\n }\n\n const { strings } = value\n const decodeRefs = (flat: readonly unknown[], from: number) => {\n if ((flat.length - from) % 2 !== 0) {\n return undefined\n }\n\n const refs: DatasetColumnRef[] = []\n for (let index = from; index < flat.length; index += 2) {\n const datasetId = stringAt(strings, flat[index])\n const column = stringAt(strings, flat[index + 1])\n if (datasetId === undefined || column === undefined) {\n return undefined\n }\n refs.push({ datasetId, column })\n }\n\n return refs\n }\n\n const rows = Array.isArray(value.rows) ? decodeRefs(value.rows, 0) : undefined\n if (rows === undefined || !Array.isArray(value.columns)) {\n return undefined\n }\n\n // A column listed twice would read as its last entry: a tampered record could narrow it.\n const columns = new Map<string, DatasetColumnRef[]>()\n for (const entry of value.columns) {\n const name = Array.isArray(entry) ? stringAt(strings, entry[0]) : undefined\n const refs = name === undefined ? undefined : decodeRefs(entry, 1)\n if (name === undefined || refs === undefined || columns.has(name)) {\n return undefined\n }\n columns.set(name, refs)\n }\n\n return { rows, columns: Object.fromEntries(columns) }\n}\n\nfunction unreadable(datasetId: string): DatasetVersionLineage {\n return { unknown: `a version of '${datasetId}' records a column lineage Sixb cannot read` }\n}\n\nfunction parseJson(text: string): unknown {\n try {\n return JSON.parse(text)\n } catch {\n return undefined\n }\n}\n\nfunction stringAt(strings: readonly string[], index: unknown): string | undefined {\n return typeof index === \"number\" && Number.isInteger(index) ? strings[index] : undefined\n}\n\nfunction isStringList(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\")\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n",
25
+ "import type { DatasetVersionRef } from \"@sixb/core/lake-storage\"\nimport { LakeStorageError } from \"@sixb/core/lake-storage\"\nimport type {\n DuckLakeMaintenanceOptions,\n DuckLakeMaintenanceReport,\n DuckLakeStorageOptions,\n} from \"../types\"\nimport { getBigIntLike } from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport type { DuckLakeConnectionManager } from \"./ducklake-connection-manager\"\nimport type { DuckLakeSnapshotReader } from \"./ducklake-snapshot-reader\"\nimport { duckLakeAlias, duckLakeMetadataTableName, quoteSqlString } from \"./sql\"\nimport { parseVersionId } from \"./versions\"\n\nconst DEFAULT_RETENTION = \"7 days\"\n\ninterface MaintenanceCounts {\n readonly snapshots: number\n readonly keptSnapshots: number\n readonly oldFiles: number\n readonly orphanedFiles: number\n}\n\n/**\n * Expires old snapshots, except those holding a version that is still needed, then reclaims files.\n *\n * DuckLake's own `older_than` would expire the latest version of a dataset idle longer than the\n * retention, leaving its rows without a version to read them through. Maintenance lists the\n * snapshots older than the retention, keeps those holding each dataset's latest version or a\n * protected version, and expires the rest by id. DuckLake then schedules the files only the\n * expired snapshots referenced, as it does with `older_than`.\n */\nexport class DuckLakeMaintenance {\n constructor(\n private readonly options: DuckLakeStorageOptions,\n private readonly connections: DuckLakeConnectionManager,\n private readonly snapshots: DuckLakeSnapshotReader\n ) {}\n\n async runMaintenance(\n options: DuckLakeMaintenanceOptions = {}\n ): Promise<DuckLakeMaintenanceReport> {\n this.connections.assertOpen()\n\n const expireOlderThan = options.expireOlderThan ?? DEFAULT_RETENTION\n const deleteOlderThan = options.deleteOlderThan ?? expireOlderThan\n const dryRun = options.dryRun ?? false\n const protect = (options.protect ?? []).map(protectedSnapshotId)\n\n if (this.options.readOnly && !dryRun) {\n throw new LakeStorageError(\n \"[SixbDuckLake] DuckLake maintenance cannot run in read-only mode.\"\n )\n }\n\n return this.connections.withMaintenanceRuntime(async (runtime) => {\n const counts = await this.runMaintenanceProcedures(\n runtime,\n { expireOlderThan, deleteOlderThan },\n protect,\n dryRun\n )\n\n if (!dryRun) {\n this.connections.markLocalCatalogChanged()\n }\n\n return {\n dryRun,\n expireOlderThan,\n deleteOlderThan,\n ...counts,\n }\n })\n }\n\n private async runMaintenanceProcedures(\n runtime: DuckDbQueryRuntime,\n retention: Pick<DuckLakeMaintenanceReport, \"expireOlderThan\" | \"deleteOlderThan\">,\n protect: readonly string[],\n dryRun: boolean\n ): Promise<MaintenanceCounts> {\n const aliasSql = quoteSqlString(duckLakeAlias(this.options))\n\n const oldSnapshotIds = await this.snapshotsOlderThan(runtime, retention.expireOlderThan)\n const needed = new Set([\n ...(await this.snapshots.latestVersionSnapshotIds(runtime)),\n ...protect,\n ])\n const expirable = oldSnapshotIds.filter((snapshotId) => !needed.has(snapshotId))\n\n const snapshots =\n expirable.length === 0\n ? []\n : await runtime.query(\n maintenanceProcedureSql(\n \"ducklake_expire_snapshots\",\n aliasSql,\n `versions => [${expirable.join(\", \")}]`,\n dryRun\n )\n )\n\n const oldFiles = await runtime.query(\n maintenanceProcedureSql(\n \"ducklake_cleanup_old_files\",\n aliasSql,\n `older_than => ${olderThanSql(retention.deleteOlderThan)}`,\n dryRun\n )\n )\n const orphanedFiles = await runtime.query(\n maintenanceProcedureSql(\n \"ducklake_delete_orphaned_files\",\n aliasSql,\n `older_than => ${olderThanSql(retention.deleteOlderThan)}`,\n dryRun\n )\n )\n\n return {\n snapshots: snapshots.length,\n keptSnapshots: oldSnapshotIds.length - expirable.length,\n oldFiles: oldFiles.length,\n orphanedFiles: orphanedFiles.length,\n }\n }\n\n /**\n * Snapshots older than the retention, except the current one, which DuckLake never expires.\n *\n * Not DuckLake's own `older_than` selection: a SQLite catalog stores snapshot times as text with\n * their UTC offset, and with DuckLake 415a9ebd that selection then also returned snapshots\n * written a moment ago outside UTC. Casting the stored text compares instants on every catalog.\n */\n private async snapshotsOlderThan(\n runtime: DuckDbQueryRuntime,\n olderThan: string\n ): Promise<readonly string[]> {\n const ducklakeSnapshot = duckLakeMetadataTableName(this.options, \"ducklake_snapshot\")\n const rows = await runtime.query(`\n SELECT snapshot_id\n FROM ${ducklakeSnapshot}\n WHERE CAST(snapshot_time AS TIMESTAMPTZ) < ${olderThanSql(olderThan)}\n AND snapshot_id < (\n SELECT snapshot_id FROM ${ducklakeSnapshot} ORDER BY snapshot_id DESC LIMIT 1\n )\n ORDER BY snapshot_id\n `)\n\n return rows.map((row) => String(getBigIntLike(row, \"snapshot_id\")))\n }\n}\n\nfunction protectedSnapshotId(ref: DatasetVersionRef): string {\n try {\n return parseVersionId(ref.versionId)\n } catch (error) {\n throw new LakeStorageError(\n `[SixbDuckLake] Cannot protect version '${ref.versionId}' of dataset '${ref.datasetId}' from maintenance: it is not a DuckLake version id.`,\n { cause: error }\n )\n }\n}\n\nfunction olderThanSql(olderThan: string): string {\n return `now() - INTERVAL ${quoteSqlString(olderThan)}`\n}\n\nfunction maintenanceProcedureSql(\n procedure: string,\n aliasSql: string,\n selection: string,\n dryRun: boolean\n): string {\n const dryRunSql = dryRun ? \"dry_run => true, \" : \"\"\n return `CALL ${procedure}(${aliasSql}, ${dryRunSql}${selection})`\n}\n",
24
26
  "import type { DatasetColumnDefinition, DatasetRow } from \"@sixb/core\"\nimport type { DatasetVersion, ReadDatasetRowsInput } from \"@sixb/core/lake-storage\"\nimport { LakeStorageError } from \"@sixb/core/lake-storage\"\nimport type { DuckLakeStorageOptions } from \"../types\"\nimport type { DuckDbReader } from \"./duckdb-reader\"\nimport { getBigIntLike } from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport type { DuckLakeConnectionManager } from \"./ducklake-connection-manager\"\nimport { type DatasetTableRef, resolveDatasetTableRef } from \"./ducklake-dataset-table-ref\"\nimport type { DuckLakeSnapshotReader } from \"./ducklake-snapshot-reader\"\nimport { normalizeReadValue } from \"./schema\"\nimport { qualifiedTableName, quoteIdentifier } from \"./sql\"\nimport { parseVersionId } from \"./versions\"\n\n// Bounded fallback for catalogs whose metadata transactions cannot stay open during a read.\nconst READ_PAGE_ROWS = 5_000\nconst PHYSICAL_ROW_ID_ALIAS = \"__sixb_physical_row_id\"\n\n/**\n * Reads dataset rows from DuckLake snapshots.\n *\n * This module owns the last mile of reads: resolve the requested Sixb version\n * to a DuckLake snapshot id, render a DuckLake time-travel query, and normalize\n * DuckDB values back into Sixb row shape.\n */\nexport class DuckLakeRowReader {\n constructor(\n private readonly options: DuckLakeStorageOptions,\n private readonly connections: DuckLakeConnectionManager,\n private readonly snapshots: DuckLakeSnapshotReader\n ) {}\n\n async *readRows(input: ReadDatasetRowsInput): AsyncIterable<DatasetRow> {\n const read = await this.connections.acquireRead(input.signal)\n let reader: DuckDbReader | null = null\n try {\n const prepared = await this.connections.withAttachedRuntime(async (runtime) => {\n read.signal.throwIfAborted()\n const tableRef = await resolveDatasetTableRef(this.options, runtime, input.datasetId)\n if (!tableRef) {\n throw new LakeStorageError(`[SixbDuckLake] Unknown dataset '${input.datasetId}'.`)\n }\n // Resolve latest once, before yielding any rows. Every query names the same snapshot.\n const version = await this.resolveVersion(runtime, tableRef, input.versionId)\n const columns = this.resolveReadColumns(tableRef.datasetId, version.schema, input.columns)\n const names = new Set(version.schema.columns.map((column) => column.name.toLowerCase()))\n const physicalOrder = !names.has(\"rowid\") && !names.has(PHYSICAL_ROW_ID_ALIAS)\n const relation = `${qualifiedTableName(this.options, tableRef.tableName)} AT (VERSION => ${parseVersionId(version.versionId)})`\n const columnsSql = columns.map((column) => quoteIdentifier(column.name)).join(\", \")\n const offset = Math.max(0, Math.trunc(input.offset ?? 0))\n const limit = input.limit === undefined ? undefined : Math.max(0, Math.trunc(input.limit))\n const sql = `SELECT ${columnsSql} FROM ${relation}${physicalOrder ? \" ORDER BY rowid\" : \"\"}${limit === undefined ? \"\" : ` LIMIT ${limit}`}${offset > 0 ? ` OFFSET ${offset}` : \"\"}`\n const cursor =\n limit === undefined || limit > READ_PAGE_ROWS\n ? await this.connections.openReader(runtime, sql, read.signal, read.release)\n : null\n const query = { columnsSql, relation, physicalOrder }\n const firstPage =\n cursor || limit === 0\n ? []\n : await runtime.query(\n pageSql(query, Math.min(limit ?? READ_PAGE_ROWS, READ_PAGE_ROWS), offset, null)\n )\n return { columns, ...query, offset, limit, cursor, firstPage }\n })\n reader = prepared.cursor\n // A paused paged reader owns no native query. Cancellation can release its read lease without\n // waiting for the consumer to call next()/return(); native readers release after cleanup.\n if (!reader) read.signal.addEventListener(\"abort\", read.release, { once: true })\n read.signal.throwIfAborted()\n if (reader) {\n yield* this.normalizeRows(reader.rows(), prepared.columns, read.signal)\n return\n }\n\n // Each bounded query releases both the runtime queue and attachment lease before yielding.\n // SQLite metadata locks and PostgreSQL pool slots are released before consumer operations.\n let offset = prepared.offset\n let remaining = prepared.limit\n let cursor: bigint | null = null\n let page: readonly Record<string, unknown>[] | undefined = prepared.firstPage\n while (remaining !== 0) {\n read.signal.throwIfAborted()\n const pageSize = Math.min(remaining ?? READ_PAGE_ROWS, READ_PAGE_ROWS)\n const rows: readonly Record<string, unknown>[] =\n page ??\n (await this.connections.withAttachedRuntime((runtime) =>\n runtime.query(pageSql(prepared, pageSize, offset, cursor))\n ))\n page = undefined\n read.signal.throwIfAborted()\n yield* this.normalizeRows(rows, prepared.columns, read.signal)\n if (remaining !== undefined) remaining -= rows.length\n if (rows.length < pageSize) return\n if (prepared.physicalOrder)\n cursor = getBigIntLike(rows[rows.length - 1]!, PHYSICAL_ROW_ID_ALIAS)\n offset += rows.length\n }\n } finally {\n read.signal.removeEventListener(\"abort\", read.release)\n try {\n await reader?.close()\n } finally {\n read.release()\n }\n }\n }\n\n private async *normalizeRows(\n rows: Iterable<Record<string, unknown>> | AsyncIterable<Record<string, unknown>>,\n selectedColumns: readonly DatasetColumnDefinition[],\n signal: AbortSignal\n ): AsyncIterable<DatasetRow> {\n for await (const row of rows) {\n signal.throwIfAborted()\n const output: Record<string, unknown> = {}\n for (const column of selectedColumns) {\n output[column.name] = normalizeReadValue(row[column.name], column)\n }\n yield output\n }\n }\n\n private async resolveVersion(\n runtime: DuckDbQueryRuntime,\n tableRef: DatasetTableRef,\n versionId?: string\n ): Promise<DatasetVersion> {\n if (versionId !== undefined) {\n const snapshotId = parseVersionId(versionId)\n const version = await this.snapshots.getVersionForTableRef(runtime, tableRef, snapshotId)\n if (!version) {\n this.throwNoCommittedVersion(tableRef.datasetId)\n }\n\n return version\n }\n\n const latestVersion = await this.snapshots.getLatestVersionForTableRef(runtime, tableRef)\n if (!latestVersion) {\n this.throwNoCommittedVersion(tableRef.datasetId)\n }\n\n return latestVersion\n }\n\n private resolveReadColumns(\n datasetId: string,\n schema: DatasetVersion[\"schema\"],\n columns?: readonly string[]\n ): readonly DatasetColumnDefinition[] {\n if (columns === undefined || columns.length === 0) {\n return schema.columns\n }\n\n const columnsByName = new Map(schema.columns.map((column) => [column.name, column] as const))\n\n return columns.map((columnName) => {\n const column = columnsByName.get(columnName)\n if (!column) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${datasetId}' does not have column '${columnName}' at the requested version.`\n )\n }\n\n return column\n })\n }\n\n private throwNoCommittedVersion(datasetId: string): never {\n throw new LakeStorageError(\n `[SixbDuckLake] No committed version found for dataset '${datasetId}'.`\n )\n }\n}\n\nfunction pageSql(\n read: { readonly columnsSql: string; readonly relation: string; readonly physicalOrder: boolean },\n limit: number,\n offset: number,\n cursor: bigint | null\n): string {\n return read.physicalOrder\n ? `SELECT rowid AS ${quoteIdentifier(PHYSICAL_ROW_ID_ALIAS)}, ${read.columnsSql}\n FROM ${read.relation} ${cursor === null ? \"\" : `WHERE rowid > ${cursor}`}\n ORDER BY rowid LIMIT ${limit} ${cursor === null && offset > 0 ? `OFFSET ${offset}` : \"\"}`\n : `SELECT ${read.columnsSql} FROM ${read.relation} LIMIT ${limit} OFFSET ${offset}`\n}\n",
25
- "import type { DatasetDefinition } from \"@sixb/core\"\nimport type {\n DatasetCatalogState,\n DatasetLatestVersionSummary,\n DatasetVersion,\n DatasetVersionMode,\n DatasetVersionRef,\n LatestVersionsSince,\n ListLatestVersionsSinceInput,\n} from \"@sixb/core/lake-storage\"\nimport { LakeStorageError } from \"@sixb/core/lake-storage\"\nimport type { DuckLakeStorageOptions } from \"../types\"\nimport { getBigIntLike, getBoolean, getDate, getOptionalString, getString } from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport type { DuckLakeConnectionManager } from \"./ducklake-connection-manager\"\nimport type { DuckLakeDatasetCatalog } from \"./ducklake-dataset-catalog\"\nimport { type DatasetTableRef, resolveDatasetTableRef } from \"./ducklake-dataset-table-ref\"\nimport { decodeDatasetTableName, encodeDatasetTableName } from \"./names\"\nimport { buildDuckLakeMetadataQuery, duckLakeMetadataTableName, quoteSqlString } from \"./sql\"\nimport {\n parseCommitMetadata,\n parseInlineDataChange,\n parseVersionId,\n type SixbCommitMetadata,\n toVersionId,\n} from \"./versions\"\n\ninterface DatasetSnapshotRow {\n readonly snapshotId: string\n readonly tableId: bigint\n readonly createdAt: Date\n readonly mode: DatasetVersionMode\n readonly parentSnapshotId?: string\n readonly metadata?: SixbCommitMetadata\n}\n\ninterface DatasetSnapshotCandidateRow {\n readonly snapshotId: string\n readonly createdAt: Date\n readonly changesMade: string\n readonly hasFileChange: boolean\n readonly hasFileDeleteChange: boolean\n readonly metadata?: SixbCommitMetadata\n}\n\ninterface FeedTable {\n readonly datasetId: string\n readonly tableId: bigint\n /** A dataset cannot have a version before its table exists. */\n readonly startSnapshotId: bigint\n}\n\ninterface MissingSnapshotCandidate {\n readonly snapshotId: string\n readonly missing: true\n}\n\ninterface SnapshotCandidateQueryInput {\n readonly datasetId: string\n readonly tableId: bigint\n readonly exactSnapshotId?: string\n readonly beforeSnapshotId?: string\n readonly limit: number\n}\n\ninterface VisibleSnapshotRowsInput {\n readonly datasetId: string\n readonly tableId: bigint\n readonly exactSnapshotId?: string\n readonly beforeSnapshotId?: string\n readonly visibleRowLimit?: number\n}\n\nexport interface DuckLakeVersionSummary {\n readonly datasetId: string\n readonly versionId: string\n readonly inputs?: readonly DatasetVersionRef[]\n readonly rowCount?: number\n readonly validatedPrimaryKeyColumns?: readonly string[]\n}\n\n/** One snapshot row from the shared catalog scan, before per-dataset filtering. */\ninterface CatalogScanSnapshot {\n readonly snapshotId: string\n readonly createdAt: Date\n readonly changesMade: string\n readonly metadata?: SixbCommitMetadata\n}\n\n/** Per (snapshot, table) file-change flags merged into the catalog scan. */\ninterface FileChangeFlags {\n readonly hasFileChange: boolean\n readonly hasFileDeleteChange: boolean\n}\n\nconst SNAPSHOT_ROW_BATCH_SIZE = 128\n// One feed read covers at most this many commits; the next read continues from its cursor.\nconst FEED_PAGE_SIZE = 512\n\n// The bulk catalog scan shares one descending walk of recent snapshots across\n// all requested datasets, so its cost is bounded by this window rather than by\n// the dataset count. A dataset whose latest version is older than the window\n// reports a null latest version, which is acceptable for a catalog summary; the\n// detail routes still hydrate exact history.\nconst CATALOG_SNAPSHOT_SCAN_LIMIT = 512\n\n/**\n * Reconstructs Sixb DatasetVersion objects from DuckLake snapshots.\n *\n * DuckLake remains the source of truth for version ids, commit times, and\n * historical reads. Sixb commit metadata only hydrates fields DuckLake does\n * not know about, such as producer info and declared inputs.\n *\n * This class intentionally reads DuckLake metadata directly. The provider does\n * not keep a Sixb side table for versions; a Sixb version is a DuckLake\n * snapshot that either changed the dataset table or was explicitly tagged with\n * Sixb dataset metadata.\n */\nexport class DuckLakeSnapshotReader {\n constructor(\n private readonly options: DuckLakeStorageOptions,\n private readonly connections: DuckLakeConnectionManager,\n private readonly datasets: DuckLakeDatasetCatalog\n ) {}\n\n async listVersions(datasetId: string, limit?: number): Promise<readonly DatasetVersion[]> {\n this.connections.assertOpen()\n\n return this.connections.withAttachedRuntime(async (runtime) => {\n const tableRef = await resolveDatasetTableRef(this.options, runtime, datasetId)\n if (!tableRef) {\n return []\n }\n\n return this.listVersionsForTableRef(runtime, tableRef, limit)\n })\n }\n\n async getLatestVersion(datasetId: string): Promise<DatasetVersion | null> {\n this.connections.assertOpen()\n\n return this.connections.withAttachedRuntime(async (runtime) => {\n const tableRef = await resolveDatasetTableRef(this.options, runtime, datasetId)\n if (!tableRef) {\n return null\n }\n\n return this.getLatestVersionForTableRef(runtime, tableRef)\n })\n }\n\n async getVersion(datasetId: string, versionId: string): Promise<DatasetVersion | null> {\n const snapshotId = parseVersionId(versionId)\n this.connections.assertOpen()\n\n return this.connections.withAttachedRuntime(async (runtime) => {\n const tableRef = await resolveDatasetTableRef(this.options, runtime, datasetId)\n if (!tableRef) {\n return null\n }\n\n return this.getVersionForTableRef(runtime, tableRef, snapshotId)\n })\n }\n\n /**\n * Bulk catalog-summary read used by the dataset list view.\n *\n * Resolves materialized state and a lightweight latest-version summary for\n * many datasets with a bounded number of metadata queries, never one snapshot\n * scan per dataset and never a count(*) over dataset contents.\n */\n async listDatasetCatalogState(\n datasetIds: readonly string[]\n ): Promise<readonly DatasetCatalogState[]> {\n this.connections.assertOpen()\n\n if (datasetIds.length === 0) {\n return []\n }\n\n return this.connections.withAttachedRuntime((runtime) =>\n this.collectDatasetCatalogState(runtime, datasetIds)\n )\n }\n\n private async collectDatasetCatalogState(\n runtime: DuckDbQueryRuntime,\n datasetIds: readonly string[]\n ): Promise<readonly DatasetCatalogState[]> {\n const uniqueIds = [...new Set(datasetIds)]\n const tableIdsByDatasetId = await this.resolveDatasetTableIds(runtime, uniqueIds)\n const latestRowByDatasetId = await this.resolveLatestSnapshotRows(runtime, tableIdsByDatasetId)\n\n return uniqueIds.map((datasetId) => {\n if (!tableIdsByDatasetId.has(datasetId)) {\n return { datasetId, materialized: false, latestVersion: null }\n }\n\n const row = latestRowByDatasetId.get(datasetId)\n return {\n datasetId,\n materialized: true,\n latestVersion: row ? this.snapshotRowToSummary(datasetId, row) : null,\n }\n })\n }\n\n /**\n * Change feed over DuckLake's snapshot table, which is an append-only commit log: snapshot ids\n * only increase, and a commit becomes visible only after every lower id has (concurrent commits\n * that pick the same id conflict, and the loser retries with the next one). The cursor is the\n * last snapshot id read. Every query is bounded by a snapshot-id range, so an idle read is one\n * indexed query that returns the cursor's own snapshot, whatever the history length.\n */\n async listLatestVersionsSince(\n input: ListLatestVersionsSinceInput\n ): Promise<LatestVersionsSince | null> {\n this.connections.assertOpen()\n\n return this.connections.withAttachedRuntime(async (runtime) => {\n if (input.cursor === null) {\n return { cursor: await this.queryHeadSnapshotId(runtime), versions: [] }\n }\n if (!/^\\d+$/.test(input.cursor)) {\n return null\n }\n\n const snapshots = await this.querySnapshotsFrom(runtime, input.cursor)\n // The cursor's own snapshot proves the cursor is still a position in this lake's history.\n if (snapshots[0]?.snapshotId !== input.cursor) {\n return null\n }\n const newSnapshots = snapshots.slice(1)\n if (newSnapshots.length === 0) {\n return { cursor: input.cursor, versions: [] }\n }\n\n const tables = await this.resolveFeedTables(runtime, input.datasetIds)\n const latest = await this.collectFeedPage(runtime, tables, newSnapshots)\n return {\n cursor: newSnapshots[newSnapshots.length - 1]?.snapshotId ?? input.cursor,\n versions: [...latest].map(([datasetId, row]) => this.snapshotRowToSummary(datasetId, row)),\n }\n })\n }\n\n private async queryHeadSnapshotId(runtime: DuckDbQueryRuntime): Promise<string> {\n const [row] = await runtime.query(\n buildDuckLakeMetadataQuery(\n this.options,\n (table) => `SELECT max(snapshot_id) AS snapshot_id FROM ${table(\"ducklake_snapshot\")}`\n )\n )\n if (row?.snapshot_id === null || row?.snapshot_id === undefined) {\n throw new LakeStorageError(\"[SixbDuckLake] DuckLake catalog has no snapshots.\")\n }\n return String(getBigIntLike(row, \"snapshot_id\"))\n }\n\n /** The cursor's snapshot and up to one feed page of snapshots after it, oldest first. */\n private async querySnapshotsFrom(\n runtime: DuckDbQueryRuntime,\n cursor: string\n ): Promise<readonly { readonly snapshotId: string; readonly createdAt: Date }[]> {\n const rows = await runtime.query(\n buildDuckLakeMetadataQuery(\n this.options,\n (table) => `\n SELECT snapshot_id, snapshot_time\n FROM ${table(\"ducklake_snapshot\")}\n WHERE snapshot_id >= ${cursor}\n ORDER BY snapshot_id\n LIMIT ${FEED_PAGE_SIZE + 1}\n `\n )\n )\n return rows.map((row) => ({\n snapshotId: String(getBigIntLike(row, \"snapshot_id\")),\n createdAt: getDate(row, \"snapshot_time\"),\n }))\n }\n\n /** Current dataset tables, with the first snapshot each table id existed in. */\n private async resolveFeedTables(\n runtime: DuckDbQueryRuntime,\n datasetIds: readonly string[] | undefined\n ): Promise<readonly FeedTable[]> {\n const requested = datasetIds === undefined ? null : new Set(datasetIds)\n const rows = await runtime.query(`\n SELECT table_id, table_name, begin_snapshot, end_snapshot\n FROM ${duckLakeMetadataTableName(this.options, \"ducklake_table\")}\n `)\n\n const startByTableId = new Map<bigint, bigint>()\n const current: { datasetId: string; tableId: bigint }[] = []\n for (const row of rows) {\n const tableId = getBigIntLike(row, \"table_id\")\n const begin = getBigIntLike(row, \"begin_snapshot\")\n const start = startByTableId.get(tableId)\n if (start === undefined || begin < start) {\n startByTableId.set(tableId, begin)\n }\n if (row.end_snapshot !== null && row.end_snapshot !== undefined) {\n continue\n }\n const datasetId = decodeDatasetTableName(getString(row, \"table_name\"))\n if (datasetId !== null && (requested === null || requested.has(datasetId))) {\n current.push({ datasetId, tableId })\n }\n }\n\n return current.map((table) => ({\n ...table,\n startSnapshotId: startByTableId.get(table.tableId) ?? 0n,\n }))\n }\n\n /** Folds a page of snapshots, oldest first, into each dataset's newest data version. */\n private async collectFeedPage(\n runtime: DuckDbQueryRuntime,\n tables: readonly FeedTable[],\n snapshots: readonly { readonly snapshotId: string; readonly createdAt: Date }[]\n ): Promise<Map<string, DatasetSnapshotRow>> {\n const latest = new Map<string, DatasetSnapshotRow>()\n const first = snapshots[0]?.snapshotId\n const last = snapshots[snapshots.length - 1]?.snapshotId\n if (first === undefined || last === undefined || tables.length === 0) {\n return latest\n }\n\n const changeRows = await runtime.query(\n buildDuckLakeMetadataQuery(\n this.options,\n (table) => `\n SELECT snapshot_id, changes_made, commit_extra_info\n FROM ${table(\"ducklake_snapshot_changes\")}\n WHERE snapshot_id >= ${first} AND snapshot_id <= ${last}\n `\n )\n )\n const fileFlags = await this.queryFileChangeFlags(\n runtime,\n snapshots.map((snapshot) => snapshot.snapshotId),\n tables.map((table) => table.tableId)\n )\n const changesBySnapshotId = new Map(\n changeRows.map((row) => [String(getBigIntLike(row, \"snapshot_id\")), row])\n )\n const tablesByTableId = new Map(tables.map((table) => [table.tableId.toString(), table]))\n const tablesByDatasetId = new Map(tables.map((table) => [table.datasetId, table]))\n\n for (const snapshot of snapshots) {\n const changes = changesBySnapshotId.get(snapshot.snapshotId)\n if (changes === undefined) {\n continue\n }\n const changesMade = getString(changes, \"changes_made\")\n const metadata = parseCommitMetadata(changes.commit_extra_info)\n\n // Only tables this snapshot names, touches through files, or tags can change visibility.\n const touched = new Set<FeedTable>()\n for (const change of changesMade.split(\",\")) {\n const table = tablesByTableId.get(change.split(\":\")[1] ?? \"\")\n if (table) touched.add(table)\n }\n for (const table of tables) {\n if (fileFlags.has(fileChangeKey(snapshot.snapshotId, table.tableId))) touched.add(table)\n }\n const tagged = metadata === undefined ? undefined : tablesByDatasetId.get(metadata.datasetId)\n if (tagged) touched.add(tagged)\n\n for (const table of touched) {\n if (BigInt(snapshot.snapshotId) < table.startSnapshotId) {\n continue\n }\n const flags = fileFlags.get(fileChangeKey(snapshot.snapshotId, table.tableId))\n const row = this.candidateToSnapshotRow(table.datasetId, table.tableId, {\n snapshotId: snapshot.snapshotId,\n createdAt: snapshot.createdAt,\n changesMade,\n hasFileChange: flags?.hasFileChange ?? false,\n hasFileDeleteChange: flags?.hasFileDeleteChange ?? false,\n ...(metadata !== undefined ? { metadata } : {}),\n })\n if (row && row.mode !== \"schema\") {\n latest.set(table.datasetId, row)\n }\n }\n }\n\n return latest\n }\n\n private snapshotRowToSummary(\n datasetId: string,\n row: DatasetSnapshotRow\n ): DatasetLatestVersionSummary {\n return {\n datasetId,\n versionId: toVersionId(row.snapshotId),\n mode: row.mode,\n createdAt: row.createdAt,\n ...(row.metadata?.rowCount !== undefined ? { rowCount: row.metadata.rowCount } : {}),\n }\n }\n\n private async resolveDatasetTableIds(\n runtime: DuckDbQueryRuntime,\n datasetIds: readonly string[]\n ): Promise<Map<string, bigint>> {\n // Encoded table names are a collision-free bijection with dataset ids, so a\n // single `ducklake_table` read maps every requested id to its current table.\n const datasetIdByTableName = new Map<string, string>()\n for (const datasetId of datasetIds) {\n datasetIdByTableName.set(encodeDatasetTableName(datasetId), datasetId)\n }\n\n const ducklakeTable = duckLakeMetadataTableName(this.options, \"ducklake_table\")\n const tableNameList = [...datasetIdByTableName.keys()]\n .map((name) => quoteSqlString(name))\n .join(\", \")\n const rows = await runtime.query(`\n SELECT table_id, table_name\n FROM ${ducklakeTable}\n WHERE table_name IN (${tableNameList})\n AND end_snapshot IS NULL\n `)\n\n const tableIdsByDatasetId = new Map<string, bigint>()\n for (const row of rows) {\n const datasetId = datasetIdByTableName.get(getString(row, \"table_name\"))\n if (datasetId !== undefined) {\n tableIdsByDatasetId.set(datasetId, getBigIntLike(row, \"table_id\"))\n }\n }\n\n return tableIdsByDatasetId\n }\n\n /**\n * Resolve each dataset's latest snapshot row with one shared descending walk.\n *\n * The walk reuses {@link candidateToSnapshotRow} so Sixb visibility, mode\n * derivation, and the loud conflict rule match exact version hydration. Cost\n * is bounded by the snapshot window, not by the number of datasets.\n */\n private async resolveLatestSnapshotRows(\n runtime: DuckDbQueryRuntime,\n tableIdsByDatasetId: ReadonlyMap<string, bigint>\n ): Promise<Map<string, DatasetSnapshotRow>> {\n const result = new Map<string, DatasetSnapshotRow>()\n if (tableIdsByDatasetId.size === 0) {\n return result\n }\n\n const unresolved = new Map<string, bigint>(tableIdsByDatasetId)\n const tableIds = [...new Set(tableIdsByDatasetId.values())]\n\n let beforeSnapshotId: string | undefined\n let scanned = 0\n while (unresolved.size > 0 && scanned < CATALOG_SNAPSHOT_SCAN_LIMIT) {\n const candidates = await this.queryCatalogSnapshotBatch(\n runtime,\n beforeSnapshotId,\n SNAPSHOT_ROW_BATCH_SIZE\n )\n if (candidates.length === 0) {\n break\n }\n\n const fileFlags = await this.queryFileChangeFlags(\n runtime,\n candidates.map((candidate) => candidate.snapshotId),\n tableIds\n )\n\n for (const candidate of candidates) {\n scanned += 1\n for (const [datasetId, tableId] of [...unresolved]) {\n const flags = fileFlags.get(fileChangeKey(candidate.snapshotId, tableId))\n const row = this.candidateToSnapshotRow(datasetId, tableId, {\n snapshotId: candidate.snapshotId,\n createdAt: candidate.createdAt,\n changesMade: candidate.changesMade,\n hasFileChange: flags?.hasFileChange ?? false,\n hasFileDeleteChange: flags?.hasFileDeleteChange ?? false,\n ...(candidate.metadata !== undefined ? { metadata: candidate.metadata } : {}),\n })\n if (row) {\n result.set(datasetId, row)\n unresolved.delete(datasetId)\n }\n }\n\n if (unresolved.size === 0) {\n break\n }\n }\n\n if (candidates.length < SNAPSHOT_ROW_BATCH_SIZE) {\n break\n }\n beforeSnapshotId = candidates[candidates.length - 1]?.snapshotId\n }\n\n return result\n }\n\n private async queryCatalogSnapshotBatch(\n runtime: DuckDbQueryRuntime,\n beforeSnapshotId: string | undefined,\n limit: number\n ): Promise<readonly CatalogScanSnapshot[]> {\n const ducklakeSnapshot = duckLakeMetadataTableName(this.options, \"ducklake_snapshot\")\n const ducklakeSnapshotChanges = duckLakeMetadataTableName(\n this.options,\n \"ducklake_snapshot_changes\"\n )\n\n let whereSql = \"\"\n if (beforeSnapshotId !== undefined) {\n assertDuckLakeSnapshotId(beforeSnapshotId)\n whereSql = `WHERE snapshot.snapshot_id < ${beforeSnapshotId}`\n }\n\n const rows = await runtime.query(`\n SELECT\n snapshot.snapshot_id,\n snapshot.snapshot_time,\n changes.changes_made,\n changes.commit_extra_info\n FROM ${ducklakeSnapshot} snapshot\n JOIN ${ducklakeSnapshotChanges} changes ON changes.snapshot_id = snapshot.snapshot_id\n ${whereSql}\n ORDER BY snapshot.snapshot_id DESC\n LIMIT ${Math.max(0, Math.trunc(limit))}\n `)\n\n return rows.map((row) => {\n const metadata = parseCommitMetadata(getOptionalString(row, \"commit_extra_info\"))\n return {\n snapshotId: String(getBigIntLike(row, \"snapshot_id\")),\n createdAt: getDate(row, \"snapshot_time\"),\n changesMade: getString(row, \"changes_made\"),\n ...(metadata !== undefined ? { metadata } : {}),\n }\n })\n }\n\n private async queryFileChangeFlags(\n runtime: DuckDbQueryRuntime,\n snapshotIds: readonly string[],\n tableIds: readonly bigint[]\n ): Promise<Map<string, FileChangeFlags>> {\n const flags = new Map<string, FileChangeFlags>()\n if (snapshotIds.length === 0 || tableIds.length === 0) {\n return flags\n }\n\n for (const snapshotId of snapshotIds) {\n assertDuckLakeSnapshotId(snapshotId)\n }\n\n const snapshotIdList = snapshotIds.join(\", \")\n const tableIdList = tableIds.map((tableId) => tableId.toString()).join(\", \")\n const ducklakeDataFile = duckLakeMetadataTableName(this.options, \"ducklake_data_file\")\n const ducklakeDeleteFile = duckLakeMetadataTableName(this.options, \"ducklake_delete_file\")\n\n // Large tables keep their changes in data/delete files instead of inline\n // `changes_made`, so merge file-level changes for the scanned snapshots.\n const rows = await runtime.query(`\n WITH file_changes AS (\n SELECT begin_snapshot AS snapshot_id, table_id, false AS is_delete\n FROM ${ducklakeDataFile}\n WHERE table_id IN (${tableIdList}) AND begin_snapshot IN (${snapshotIdList})\n UNION ALL\n SELECT end_snapshot, table_id, true\n FROM ${ducklakeDataFile}\n WHERE table_id IN (${tableIdList}) AND end_snapshot IN (${snapshotIdList})\n UNION ALL\n SELECT begin_snapshot, table_id, true\n FROM ${ducklakeDeleteFile}\n WHERE table_id IN (${tableIdList}) AND begin_snapshot IN (${snapshotIdList})\n UNION ALL\n SELECT end_snapshot, table_id, true\n FROM ${ducklakeDeleteFile}\n WHERE table_id IN (${tableIdList}) AND end_snapshot IN (${snapshotIdList})\n )\n SELECT snapshot_id, table_id, bool_or(is_delete) AS has_delete\n FROM file_changes\n GROUP BY snapshot_id, table_id\n `)\n\n for (const row of rows) {\n const key = fileChangeKey(\n String(getBigIntLike(row, \"snapshot_id\")),\n getBigIntLike(row, \"table_id\")\n )\n flags.set(key, { hasFileChange: true, hasFileDeleteChange: getBoolean(row, \"has_delete\") })\n }\n\n return flags\n }\n\n private assertNoMetadataConflict(\n snapshotId: string,\n datasetId: string,\n metadata: SixbCommitMetadata | undefined\n ): void {\n if (metadata !== undefined && metadata.datasetId !== datasetId) {\n throw new LakeStorageError(\n `[SixbDuckLake] DuckLake snapshot '${snapshotId}' changed dataset '${datasetId}' but Sixb commit metadata references dataset '${metadata.datasetId}'.`\n )\n }\n }\n\n async getLatestVersionForDefinition(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition\n ): Promise<DatasetVersion | null> {\n const tableRef = await resolveDatasetTableRef(this.options, runtime, dataset.id)\n return tableRef ? this.getLatestVersionForTableRef(runtime, tableRef) : null\n }\n\n async getLatestVersionRefForDefinition(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition\n ): Promise<DatasetVersionRef | null> {\n const summary = await this.getLatestVersionSummaryForDefinition(runtime, dataset)\n return summary ? { datasetId: summary.datasetId, versionId: summary.versionId } : null\n }\n\n async getLatestVersionSummaryForDefinition(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition\n ): Promise<DuckLakeVersionSummary | null> {\n const tableRef = await resolveDatasetTableRef(this.options, runtime, dataset.id)\n if (!tableRef) {\n return null\n }\n\n const row = await this.getLatestSnapshotRowForTableRef(runtime, tableRef)\n if (!row) {\n return null\n }\n\n return {\n datasetId: tableRef.datasetId,\n versionId: toVersionId(row.snapshotId),\n inputs: row.metadata?.inputs,\n ...(row.metadata?.rowCount !== undefined ? { rowCount: row.metadata.rowCount } : {}),\n ...(row.metadata?.validatedPrimaryKeyColumns !== undefined\n ? { validatedPrimaryKeyColumns: row.metadata.validatedPrimaryKeyColumns }\n : {}),\n }\n }\n\n async getVersionForSnapshot(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition,\n snapshotId: string\n ): Promise<DatasetVersion | null> {\n assertDuckLakeSnapshotId(snapshotId)\n\n const tableRef = await resolveDatasetTableRef(this.options, runtime, dataset.id)\n return tableRef ? this.getVersionForTableRef(runtime, tableRef, snapshotId) : null\n }\n\n async getVersionForTableRef(\n runtime: DuckDbQueryRuntime,\n tableRef: DatasetTableRef,\n snapshotId: string\n ): Promise<DatasetVersion | null> {\n const match = await this.getSnapshotRowForTableRef(runtime, tableRef, snapshotId, {\n includeParent: true,\n })\n return match ? this.snapshotToVersion(runtime, tableRef, match) : null\n }\n\n async getVersionRefForSnapshot(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition,\n snapshotId: string\n ): Promise<DatasetVersionRef | null> {\n assertDuckLakeSnapshotId(snapshotId)\n\n const tableRef = await resolveDatasetTableRef(this.options, runtime, dataset.id)\n if (!tableRef) {\n return null\n }\n\n const row = await this.getSnapshotRowForTableRef(runtime, tableRef, snapshotId, {\n includeParent: false,\n })\n return row ? { datasetId: tableRef.datasetId, versionId: toVersionId(row.snapshotId) } : null\n }\n\n async listVersionsForDefinition(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition,\n limit?: number\n ): Promise<readonly DatasetVersion[]> {\n const tableRef = await resolveDatasetTableRef(this.options, runtime, dataset.id)\n return tableRef ? this.listVersionsForTableRef(runtime, tableRef, limit) : []\n }\n\n private async listVersionsForTableRef(\n runtime: DuckDbQueryRuntime,\n tableRef: DatasetTableRef,\n limit?: number\n ): Promise<readonly DatasetVersion[]> {\n const limitedRows = await this.getSnapshotRowsForTableRef(runtime, tableRef, limit)\n const versions: DatasetVersion[] = []\n\n for (const row of limitedRows) {\n versions.push(await this.snapshotToVersion(runtime, tableRef, row))\n }\n\n return versions\n }\n\n async getLatestVersionForTableRef(\n runtime: DuckDbQueryRuntime,\n tableRef: DatasetTableRef\n ): Promise<DatasetVersion | null> {\n const [latest] = await this.listVersionsForTableRef(runtime, tableRef, 1)\n return latest ?? null\n }\n\n private async getLatestSnapshotRowForTableRef(\n runtime: DuckDbQueryRuntime,\n tableRef: DatasetTableRef\n ): Promise<DatasetSnapshotRow | null> {\n const [row] = await this.collectVisibleSnapshotRows(runtime, {\n datasetId: tableRef.datasetId,\n tableId: tableRef.tableId,\n visibleRowLimit: 1,\n })\n return row ?? null\n }\n\n private async getSnapshotRowForTableRef(\n runtime: DuckDbQueryRuntime,\n tableRef: DatasetTableRef,\n snapshotId: string,\n options: { readonly includeParent: boolean }\n ): Promise<DatasetSnapshotRow | null> {\n assertDuckLakeSnapshotId(snapshotId)\n\n const [row] = await this.collectVisibleSnapshotRows(runtime, {\n datasetId: tableRef.datasetId,\n tableId: tableRef.tableId,\n exactSnapshotId: snapshotId,\n visibleRowLimit: 1,\n })\n if (!row) {\n return null\n }\n\n if (\n !options.includeParent ||\n (row.mode !== \"append\" && row.mode !== \"merge\" && row.mode !== \"schema\")\n ) {\n return row\n }\n\n const [parent] = await this.collectVisibleSnapshotRows(runtime, {\n datasetId: tableRef.datasetId,\n tableId: tableRef.tableId,\n beforeSnapshotId: snapshotId,\n visibleRowLimit: 1,\n })\n\n return parent ? { ...row, parentSnapshotId: parent.snapshotId } : row\n }\n\n private async getSnapshotRowsForTableRef(\n runtime: DuckDbQueryRuntime,\n tableRef: DatasetTableRef,\n limit?: number\n ): Promise<readonly DatasetSnapshotRow[]> {\n const visibleLimit = limit === undefined ? undefined : Math.max(0, limit)\n if (visibleLimit === 0) {\n return []\n }\n\n const rows = await this.collectVisibleSnapshotRows(runtime, {\n datasetId: tableRef.datasetId,\n tableId: tableRef.tableId,\n visibleRowLimit: visibleLimit === undefined ? undefined : visibleLimit + 1,\n })\n const rowsWithParents = this.withParentSnapshotIds(rows)\n return visibleLimit === undefined ? rowsWithParents : rowsWithParents.slice(0, visibleLimit)\n }\n\n private async collectVisibleSnapshotRows(\n runtime: DuckDbQueryRuntime,\n input: VisibleSnapshotRowsInput\n ): Promise<readonly DatasetSnapshotRow[]> {\n if (input.visibleRowLimit !== undefined && input.visibleRowLimit <= 0) {\n return []\n }\n\n const snapshots: DatasetSnapshotRow[] = []\n let beforeSnapshotId = input.beforeSnapshotId\n\n while (input.visibleRowLimit === undefined || snapshots.length < input.visibleRowLimit) {\n const candidates = await this.querySnapshotCandidates(runtime, {\n datasetId: input.datasetId,\n tableId: input.tableId,\n exactSnapshotId: input.exactSnapshotId,\n beforeSnapshotId,\n limit: input.exactSnapshotId === undefined ? SNAPSHOT_ROW_BATCH_SIZE : 1,\n })\n if (candidates.length === 0) {\n break\n }\n\n for (const candidate of candidates) {\n if (\"missing\" in candidate) {\n continue\n }\n const snapshot = this.candidateToSnapshotRow(input.datasetId, input.tableId, candidate)\n if (snapshot) {\n snapshots.push(snapshot)\n }\n\n if (input.visibleRowLimit !== undefined && snapshots.length >= input.visibleRowLimit) {\n break\n }\n }\n\n if (input.exactSnapshotId !== undefined || candidates.length < SNAPSHOT_ROW_BATCH_SIZE) {\n break\n }\n\n beforeSnapshotId = candidates[candidates.length - 1]?.snapshotId\n }\n\n return snapshots\n }\n\n /**\n * Hydrates, newest first, the snapshots that may hold a version of one dataset table: those\n * that added or removed its data or delete files, that DuckLake recorded as changing it inline,\n * or whose Sixb commit metadata names the dataset. The text matches are a superset;\n * candidateToSnapshotRow decides visibility. Only this table's snapshots are read, so the cost\n * follows the dataset's own history rather than every commit in the catalog.\n *\n * Returns one row per candidate id, including ids whose snapshot no longer exists, so the caller\n * can tell a short batch from the end of the history.\n */\n private async querySnapshotCandidates(\n runtime: DuckDbQueryRuntime,\n input: SnapshotCandidateQueryInput\n ): Promise<readonly (DatasetSnapshotCandidateRow | MissingSnapshotCandidate)[]> {\n const tableId = input.tableId.toString()\n const limit = Math.max(0, Math.trunc(input.limit))\n if (limit === 0) {\n return []\n }\n if (input.exactSnapshotId !== undefined) {\n assertDuckLakeSnapshotId(input.exactSnapshotId)\n }\n if (input.beforeSnapshotId !== undefined) {\n assertDuckLakeSnapshotId(input.beforeSnapshotId)\n }\n\n const rows = await runtime.query(\n buildDuckLakeMetadataQuery(this.options, (table) => {\n // A dataset cannot have a version before its table exists. Use the earliest table record:\n // a rename may create a newer record with the same table id and must not hide older\n // versions.\n const tableStart = `(SELECT min(begin_snapshot) FROM ${table(\"ducklake_table\")} WHERE table_id = ${tableId})`\n const candidateIds =\n input.exactSnapshotId !== undefined\n ? `SELECT CAST(${input.exactSnapshotId} AS BIGINT) AS snapshot_id\n WHERE ${input.exactSnapshotId} >= ${tableStart}`\n : `SELECT DISTINCT snapshot_id\n FROM (\n SELECT begin_snapshot AS snapshot_id\n FROM ${table(\"ducklake_data_file\")} WHERE table_id = ${tableId}\n UNION ALL\n SELECT end_snapshot\n FROM ${table(\"ducklake_data_file\")}\n WHERE table_id = ${tableId} AND end_snapshot IS NOT NULL\n UNION ALL\n SELECT begin_snapshot\n FROM ${table(\"ducklake_delete_file\")} WHERE table_id = ${tableId}\n UNION ALL\n SELECT end_snapshot\n FROM ${table(\"ducklake_delete_file\")}\n WHERE table_id = ${tableId} AND end_snapshot IS NOT NULL\n UNION ALL\n SELECT snapshot_id\n FROM ${table(\"ducklake_snapshot_changes\")}\n WHERE strpos(',' || changes_made || ',', ${quoteSqlString(`:${tableId},`)}) > 0\n OR strpos(\n commit_extra_info,\n ${quoteSqlString(`\"datasetId\":${JSON.stringify(input.datasetId)}`)}\n ) > 0\n ) touched\n WHERE snapshot_id >= ${tableStart}\n ${input.beforeSnapshotId === undefined ? \"\" : `AND snapshot_id < ${input.beforeSnapshotId}`}\n ORDER BY snapshot_id DESC\n LIMIT ${limit}`\n\n return `\n WITH candidate_ids AS (\n ${candidateIds}\n ),\n candidate_snapshots AS (\n SELECT\n snapshot.snapshot_id,\n snapshot.snapshot_time,\n changes.changes_made,\n changes.commit_extra_info\n FROM ${table(\"ducklake_snapshot\")} snapshot\n JOIN ${table(\"ducklake_snapshot_changes\")} changes\n ON changes.snapshot_id = snapshot.snapshot_id\n WHERE snapshot.snapshot_id IN (SELECT snapshot_id FROM candidate_ids)\n ),\n file_changes AS (\n -- File metadata tells whether this table changed in each candidate snapshot.\n SELECT begin_snapshot AS snapshot_id, false AS is_delete_change\n FROM ${table(\"ducklake_data_file\")}\n WHERE table_id = ${tableId}\n AND begin_snapshot IN (SELECT snapshot_id FROM candidate_ids)\n UNION ALL\n SELECT end_snapshot AS snapshot_id, true AS is_delete_change\n FROM ${table(\"ducklake_data_file\")}\n WHERE table_id = ${tableId}\n AND end_snapshot IN (SELECT snapshot_id FROM candidate_ids)\n UNION ALL\n SELECT begin_snapshot AS snapshot_id, true AS is_delete_change\n FROM ${table(\"ducklake_delete_file\")}\n WHERE table_id = ${tableId}\n AND begin_snapshot IN (SELECT snapshot_id FROM candidate_ids)\n UNION ALL\n SELECT end_snapshot AS snapshot_id, true AS is_delete_change\n FROM ${table(\"ducklake_delete_file\")}\n WHERE table_id = ${tableId}\n AND end_snapshot IN (SELECT snapshot_id FROM candidate_ids)\n ),\n file_changes_by_snapshot AS (\n -- Collapse file-level changes into one row per snapshot.\n SELECT\n snapshot_id,\n count(*) > 0 AS has_file_change,\n count(*) FILTER (WHERE is_delete_change) > 0 AS has_file_delete_change\n FROM file_changes\n GROUP BY snapshot_id\n )\n SELECT\n -- Keep metadata-only candidates; Sixb filters them with commit_extra_info.\n candidate_ids.snapshot_id,\n candidate.snapshot_time,\n candidate.changes_made,\n candidate.commit_extra_info,\n coalesce(file_changes.has_file_change, false) AS has_file_change,\n coalesce(file_changes.has_file_delete_change, false) AS has_file_delete_change\n FROM candidate_ids\n LEFT JOIN candidate_snapshots candidate\n ON candidate.snapshot_id = candidate_ids.snapshot_id\n LEFT JOIN file_changes_by_snapshot file_changes\n ON file_changes.snapshot_id = candidate_ids.snapshot_id\n ORDER BY candidate_ids.snapshot_id DESC\n `\n })\n )\n\n return rows.map((row) => {\n const snapshotId = String(getBigIntLike(row, \"snapshot_id\"))\n // Expired snapshots keep their file records; they are no longer versions.\n if (row.snapshot_time === null || row.snapshot_time === undefined) {\n return { snapshotId, missing: true } as const\n }\n const metadata = parseCommitMetadata(row.commit_extra_info)\n return {\n snapshotId,\n createdAt: getDate(row, \"snapshot_time\"),\n changesMade: getString(row, \"changes_made\"),\n hasFileChange: getBoolean(row, \"has_file_change\"),\n hasFileDeleteChange: getBoolean(row, \"has_file_delete_change\"),\n ...(metadata !== undefined ? { metadata } : {}),\n }\n })\n }\n\n private candidateToSnapshotRow(\n datasetId: string,\n tableId: bigint,\n candidate: DatasetSnapshotCandidateRow\n ): DatasetSnapshotRow | null {\n const inlineChange = parseInlineDataChange(candidate.changesMade, tableId)\n const hasDataChange = inlineChange.hasDataChange || candidate.hasFileChange\n const hasDeleteChange = inlineChange.hasDeleteChange || candidate.hasFileDeleteChange\n\n // Metadata-only snapshots are common for table comments, schema changes,\n // and other catalog operations. Treat them as dataset versions only when\n // their Sixb metadata names this dataset.\n if (!hasDataChange) {\n const metadata = candidate.metadata\n if (!metadata || metadata.datasetId !== datasetId) {\n return null\n }\n\n return {\n snapshotId: candidate.snapshotId,\n tableId,\n createdAt: candidate.createdAt,\n mode: metadata.mode ?? \"schema\",\n metadata,\n }\n }\n\n // A real data-change snapshot belongs to this dataset because DuckLake's\n // change metadata touched this table id. If Sixb metadata is present but\n // points elsewhere, fail loudly rather than hydrating the wrong lineage.\n this.assertNoMetadataConflict(candidate.snapshotId, datasetId, candidate.metadata)\n\n return {\n snapshotId: candidate.snapshotId,\n tableId,\n createdAt: candidate.createdAt,\n mode: candidate.metadata?.mode ?? (hasDeleteChange ? \"snapshot\" : \"append\"),\n ...(candidate.metadata !== undefined ? { metadata: candidate.metadata } : {}),\n }\n }\n\n private async snapshotToVersion(\n runtime: DuckDbQueryRuntime,\n tableRef: DatasetTableRef,\n row: DatasetSnapshotRow\n ): Promise<DatasetVersion> {\n const schemaAtSnapshot = await this.datasets.getDatasetSchemaAtSnapshot(\n runtime,\n tableRef.datasetId,\n tableRef.tableName,\n tableRef.tableId,\n row.snapshotId\n )\n\n // DuckLake gives us version id, timestamp, and time travel. Sixb metadata\n // fills in caller intent such as append vs snapshot and producer lineage.\n // Version listing is a metadata path, so it only carries row counts already\n // stored in Sixb commit metadata and never counts historical table contents.\n\n return {\n datasetId: tableRef.datasetId,\n versionId: toVersionId(row.snapshotId),\n parentVersionId:\n row.parentSnapshotId === undefined ? undefined : toVersionId(row.parentSnapshotId),\n mode: row.mode,\n createdAt: row.createdAt,\n schema: schemaAtSnapshot,\n producer: row.metadata?.producer,\n inputs: row.metadata?.inputs,\n ...(row.metadata?.rowCount !== undefined ? { rowCount: row.metadata.rowCount } : {}),\n }\n }\n\n private withParentSnapshotIds(\n snapshots: readonly DatasetSnapshotRow[]\n ): readonly DatasetSnapshotRow[] {\n return snapshots.map((snapshot, index) => {\n // Parent ids track versions that reuse the previous dataset state.\n // Snapshot versions replace the rows, so time travel stands on the snapshot id.\n const parentSnapshotId =\n snapshot.mode === \"append\" || snapshot.mode === \"merge\" || snapshot.mode === \"schema\"\n ? snapshots[index + 1]?.snapshotId\n : undefined\n return parentSnapshotId === undefined ? snapshot : { ...snapshot, parentSnapshotId }\n })\n }\n}\n\nfunction assertDuckLakeSnapshotId(snapshotId: string): void {\n if (!/^\\d+$/.test(snapshotId)) {\n throw new LakeStorageError(`[SixbDuckLake] Invalid DuckLake snapshot id '${snapshotId}'.`)\n }\n}\n\nfunction fileChangeKey(snapshotId: string, tableId: bigint): string {\n return `${snapshotId}|${tableId}`\n}\n",
26
- "import { randomUUID } from \"node:crypto\"\nimport type { DatasetColumnDefinition, DatasetDefinition, DatasetRow } from \"@sixb/core\"\nimport {\n type DatasetVersionRef,\n type DatasetWriteCommitResult,\n type DatasetWriteMode,\n type ExecuteSqlTransformInput,\n type LakeSqlExecutor,\n LakeStorageError,\n type PreviewSqlTransformInput,\n} from \"@sixb/core/lake-storage\"\nimport type { DuckLakeStorageOptions } from \"../types\"\nimport {\n type ApplyDatasetRowsResult,\n applyDatasetRowsFromRelation,\n assertDatasetWriteMode,\n} from \"./dataset-row-commit\"\nimport { findDatasetColumnTypeForDuckDbSql } from \"./duckdb-column-types\"\nimport { getString } from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport type { DuckLakeConnectionManager } from \"./ducklake-connection-manager\"\nimport type { DuckLakeDatasetCatalog } from \"./ducklake-dataset-catalog\"\nimport type { DuckLakeSnapshotReader } from \"./ducklake-snapshot-reader\"\nimport type { DuckLakeWriteCoordinator } from \"./ducklake-write-coordinator\"\nimport { datasetColumnTypeToDuckDbSql } from \"./schema\"\nimport { quoteIdentifier } from \"./sql\"\nimport {\n type DuckLakeSqlTransformSourceRelation,\n renderDuckLakeSqlTransformSql,\n} from \"./sql-transform-relations\"\nimport { parseVersionId } from \"./versions\"\n\nconst DEFAULT_PREVIEW_LIMIT = 100\nconst MAX_PREVIEW_LIMIT = 1_000\n\ninterface ResolvedDuckLakeSqlTransformSources {\n readonly relations: Readonly<Record<string, DuckLakeSqlTransformSourceRelation>>\n readonly inputs: readonly DatasetVersionRef[]\n}\n\ninterface ApplySqlTransformInput {\n readonly runtime: DuckDbQueryRuntime\n readonly target: DatasetDefinition\n readonly mode: DatasetWriteMode\n readonly sql: string\n readonly checkedCasts: readonly SqlTransformCheckedCast[]\n readonly previousRowCount?: number\n}\n\ninterface SqlTransformResultColumn {\n readonly name: string\n readonly typeSql: string\n}\n\ninterface SqlTransformCheckedCast {\n readonly columnName: string\n readonly targetTypeSql: string\n}\n\n/**\n * DuckDB-backed SQL transform executor for DuckLakeStorage.\n */\nexport class DuckLakeSqlExecutor implements LakeSqlExecutor<\"duckdb\"> {\n readonly dialect = \"duckdb\" as const\n readonly capabilities = {\n preview: true,\n supportsAppend: true,\n supportsSnapshot: true,\n }\n\n constructor(\n private readonly options: DuckLakeStorageOptions,\n private readonly connections: DuckLakeConnectionManager,\n private readonly datasets: DuckLakeDatasetCatalog,\n private readonly snapshots: DuckLakeSnapshotReader,\n private readonly writes: DuckLakeWriteCoordinator\n ) {}\n\n async *preview(input: PreviewSqlTransformInput<\"duckdb\">): AsyncIterable<DatasetRow> {\n this.connections.assertOpen()\n\n const rows = await this.connections.withAttachedRuntime(async (runtime) => {\n const sources = await this.resolveSources(runtime, input.sources)\n const sql = renderDuckLakeSqlTransformSql({\n options: this.options,\n sources: sources.relations,\n sql: input.sql,\n })\n return runtime.query(buildPreviewSql(sql, previewLimit(input.limit)))\n })\n\n for (const row of rows) {\n yield normalizePreviewRow(row)\n }\n }\n\n async execute(input: ExecuteSqlTransformInput<\"duckdb\">): Promise<DatasetWriteCommitResult> {\n this.connections.assertOpen()\n assertDatasetWriteMode(input.mode, \"SQL transform\")\n\n return this.writes.withCommitRuntime(async (runtime) => {\n const target = await this.resolveTargetDataset(runtime, input.target)\n const sources = await this.resolveSources(runtime, input.sources)\n const sql = renderDuckLakeSqlTransformSql({\n options: this.options,\n sources: sources.relations,\n sql: input.sql,\n })\n\n const checkedCasts = await this.assertResultSchemaMatchesTarget(runtime, target, sql)\n\n return this.writes.commitDatasetVersionOnExclusiveRuntime(runtime, {\n dataset: target,\n mode: input.mode,\n expectedLatestVersionId: input.expectedLatestVersionId,\n commitMessage: input.commitMessage ?? `execute SQL transform for dataset ${target.id}`,\n producer: input.producer,\n inputs: sources.inputs,\n applyChanges: (runtime, context) =>\n this.applySqlTransform({\n runtime,\n target,\n mode: input.mode,\n sql,\n checkedCasts,\n previousRowCount: context.previousRowCount,\n }),\n })\n })\n }\n\n private async resolveSources(\n runtime: DuckDbQueryRuntime,\n sources: PreviewSqlTransformInput<\"duckdb\">[\"sources\"]\n ): Promise<ResolvedDuckLakeSqlTransformSources> {\n const relations: Record<string, DuckLakeSqlTransformSourceRelation> = Object.create(null)\n const inputs: DatasetVersionRef[] = []\n\n for (const [sourceName, source] of Object.entries(sources)) {\n const definition = await this.resolveSourceDataset(runtime, source.dataset)\n const versionRef = await this.resolveSourceVersion(runtime, definition, source.versionId)\n\n relations[sourceName] = {\n datasetId: definition.id,\n versionId: versionRef.versionId,\n }\n inputs.push({\n datasetId: definition.id,\n versionId: versionRef.versionId,\n })\n }\n\n return {\n relations: Object.freeze(relations),\n inputs: Object.freeze(inputs),\n }\n }\n\n private async resolveSourceDataset(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition\n ): Promise<DatasetDefinition> {\n const definition = await this.datasets.getDatasetOnRuntime(runtime, dataset.id)\n if (!definition) {\n throw new LakeStorageError(\n `[SixbDuckLake] Unknown SQL transform source dataset '${dataset.id}'.`\n )\n }\n\n return definition\n }\n\n private async resolveTargetDataset(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition\n ): Promise<DatasetDefinition> {\n const definition = await this.datasets.getDatasetOnRuntime(runtime, dataset.id)\n if (!definition) {\n throw new LakeStorageError(\n `[SixbDuckLake] Unknown SQL transform target dataset '${dataset.id}'.`\n )\n }\n\n this.datasets.assertSchema(definition)\n return definition\n }\n\n private async resolveSourceVersion(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition,\n versionId?: string\n ): Promise<DatasetVersionRef> {\n if (versionId !== undefined) {\n const snapshotId = parseVersionId(versionId)\n const versionRef = await this.snapshots.getVersionRefForSnapshot(runtime, dataset, snapshotId)\n if (versionRef) {\n return versionRef\n }\n\n throwNoCommittedSourceVersion(dataset.id)\n }\n\n const latestVersionRef = await this.snapshots.getLatestVersionRefForDefinition(runtime, dataset)\n if (latestVersionRef) {\n return latestVersionRef\n }\n\n throwNoCommittedSourceVersion(dataset.id)\n }\n\n private async assertResultSchemaMatchesTarget(\n runtime: DuckDbQueryRuntime,\n target: DatasetDefinition,\n sql: string\n ): Promise<readonly SqlTransformCheckedCast[]> {\n const rows = await runtime.query(\n `DESCRIBE SELECT * FROM (${sql}) AS sixb_sql_transform_result_schema`\n )\n const actualColumns = rows.map((row) => resultColumnFromDescribeRow(row))\n const expectedColumns = target.schema.columns\n const checkedCasts: SqlTransformCheckedCast[] = []\n\n if (actualColumns.length !== expectedColumns.length) {\n throwResultSchemaMismatch(\n target.id,\n `expected ${expectedColumns.length} columns, got ${actualColumns.length}`\n )\n }\n\n for (let index = 0; index < expectedColumns.length; index += 1) {\n const expected = expectedColumns[index]\n const actual = actualColumns[index]\n\n if (actual.name !== expected.name) {\n throwResultSchemaMismatch(\n target.id,\n `column ${index + 1} should be '${expected.name}', got '${actual.name}'`\n )\n }\n\n const actualDatasetType = findDatasetColumnTypeForDuckDbSql(actual.typeSql)\n if (actualDatasetType === expected.type) {\n continue\n }\n\n if (isCheckedInt64Cast(actual.typeSql, expected.type)) {\n checkedCasts.push({\n columnName: expected.name,\n targetTypeSql: datasetColumnTypeToDuckDbSql(expected.type),\n })\n continue\n }\n\n throwResultSchemaMismatch(\n target.id,\n `column '${expected.name}' should have type '${expected.type}', got '${actualDatasetType ?? actual.typeSql}'`\n )\n }\n\n return checkedCasts\n }\n\n private async applySqlTransform(input: ApplySqlTransformInput): Promise<ApplyDatasetRowsResult> {\n const tempTableName = `sixb_sql_transform_${randomUUID().replaceAll(\"-\", \"\")}`\n const tempTable = quoteIdentifier(tempTableName)\n\n await input.runtime.run(\n `CREATE TEMP TABLE ${tempTable} AS SELECT * FROM (${input.sql}) AS sixb_sql_transform_result`\n )\n\n let result: ApplyDatasetRowsResult\n try {\n for (const checkedCast of input.checkedCasts) {\n await input.runtime.run(\n `ALTER TABLE ${tempTable} ALTER COLUMN ${quoteIdentifier(\n checkedCast.columnName\n )} SET DATA TYPE ${checkedCast.targetTypeSql}`\n )\n }\n\n result = await applyDatasetRowsFromRelation({\n options: this.options,\n runtime: input.runtime,\n dataset: input.target,\n mode: input.mode,\n sourceRelationSql: tempTable,\n previousRowCount: input.previousRowCount,\n })\n } catch (error) {\n try {\n await input.runtime.run(`DROP TABLE IF EXISTS ${tempTable}`)\n } catch {\n // Preserve the write failure. DuckDB rejects cleanup statements while\n // the transaction is aborted; the coordinator will roll it back next.\n }\n throw error\n }\n\n await input.runtime.run(`DROP TABLE IF EXISTS ${tempTable}`)\n return result\n }\n}\n\nfunction previewLimit(limit: number | undefined): number {\n if (limit === undefined || !Number.isFinite(limit)) {\n return DEFAULT_PREVIEW_LIMIT\n }\n\n return Math.min(Math.max(0, Math.trunc(limit)), MAX_PREVIEW_LIMIT)\n}\n\nfunction buildPreviewSql(sql: string, limit: number): string {\n return `SELECT * FROM (${sql}) AS sixb_sql_transform_preview LIMIT ${limit}`\n}\n\nfunction resultColumnFromDescribeRow(\n row: Readonly<Record<string, unknown>>\n): SqlTransformResultColumn {\n const name = getString(row, \"column_name\")\n const typeSql = getString(row, \"column_type\")\n\n return { name, typeSql }\n}\n\nfunction isCheckedInt64Cast(\n actualTypeSql: string,\n expectedType: DatasetColumnDefinition[\"type\"]\n): boolean {\n const normalizedType = actualTypeSql.trim().toUpperCase()\n return expectedType === \"int64\" && (normalizedType === \"HUGEINT\" || normalizedType === \"INT128\")\n}\n\nfunction normalizePreviewRow(row: Readonly<Record<string, unknown>>): DatasetRow {\n const normalized: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(row)) {\n normalized[key] = normalizePreviewValue(value)\n }\n\n return normalized\n}\n\nfunction normalizePreviewValue(value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString()\n }\n\n if (value instanceof Date) {\n return value.toISOString()\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => normalizePreviewValue(item))\n }\n\n if (typeof value === \"object\" && value !== null) {\n const normalized: Record<string, unknown> = {}\n for (const [key, child] of Object.entries(value)) {\n normalized[key] = normalizePreviewValue(child)\n }\n return normalized\n }\n\n return value\n}\n\nfunction throwNoCommittedSourceVersion(datasetId: string): never {\n throw new LakeStorageError(\n `[SixbDuckLake] No committed version found for SQL transform source dataset '${datasetId}'.`\n )\n}\n\nfunction throwResultSchemaMismatch(datasetId: string, detail: string): never {\n throw new LakeStorageError(\n `[SixbDuckLake] SQL transform result schema does not match target dataset '${datasetId}': ${detail}.`\n )\n}\n",
27
- "import type { DatasetDefinition } from \"@sixb/core\"\nimport {\n type DatasetWriteMode,\n getDatasetPrimaryKeyColumns,\n LakeStorageError,\n} from \"@sixb/core/lake-storage\"\nimport type { DuckLakeStorageOptions } from \"../types\"\nimport { getBigIntLike } from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport { encodeDatasetTableName } from \"./names\"\nimport { datasetSchemaColumnNamesSql } from \"./schema\"\nimport { qualifiedTableName, quoteIdentifier } from \"./sql\"\n\nexport type CommitRowCount =\n | { readonly kind: \"exact\"; readonly value: number }\n | { readonly kind: \"unknown\" }\n\nexport interface ApplyDatasetRowsResult {\n readonly dataChangeExpected: boolean\n readonly sourceRowCount: number\n readonly resultingRowCount: CommitRowCount\n}\n\nexport function assertDatasetWriteMode(\n mode: unknown,\n operation: string\n): asserts mode is DatasetWriteMode {\n if (mode !== \"snapshot\" && mode !== \"append\") {\n throw new LakeStorageError(\n `[SixbDuckLake] Invalid ${operation} mode '${String(mode)}'. Expected 'snapshot' or 'append'.`\n )\n }\n}\n\nexport async function applyDatasetRowsFromRelation(input: {\n readonly options: DuckLakeStorageOptions\n readonly runtime: DuckDbQueryRuntime\n readonly dataset: DatasetDefinition\n readonly mode: DatasetWriteMode\n /** Provider-rendered relation SQL, such as a quoted staging or temp table. */\n readonly sourceRelationSql: string\n readonly previousRowCount?: number\n}): Promise<ApplyDatasetRowsResult> {\n const tableName = encodeDatasetTableName(input.dataset.id)\n const table = qualifiedTableName(input.options, tableName)\n const columnsSql = datasetSchemaColumnNamesSql(input.dataset.schema)\n const primaryKeyColumns = getDatasetPrimaryKeyColumns(input.dataset)\n\n if (primaryKeyColumns !== null) {\n await inspectUniqueKeyedRelation({\n runtime: input.runtime,\n dataset: input.dataset,\n relationSql: input.sourceRelationSql,\n context: `${input.mode} source`,\n })\n\n if (input.mode === \"append\") {\n await inspectUniqueKeyedRelation({\n runtime: input.runtime,\n dataset: input.dataset,\n relationSql: table,\n context: \"current baseline\",\n })\n await assertNoPrimaryKeyOverlap({\n runtime: input.runtime,\n dataset: input.dataset,\n leftRelationSql: input.sourceRelationSql,\n rightRelationSql: table,\n context: \"append\",\n })\n }\n }\n\n if (input.mode === \"snapshot\") {\n const source = await fingerprintRelation(input.runtime, input.sourceRelationSql, columnsSql)\n const target = await fingerprintRelation(input.runtime, table, columnsSql)\n\n if (sameFingerprint(source, target)) {\n return {\n dataChangeExpected: false,\n sourceRowCount: source.rowCount,\n resultingRowCount: { kind: \"exact\", value: target.rowCount },\n }\n }\n\n await input.runtime.run(`DELETE FROM ${table}`)\n await input.runtime.run(\n `INSERT INTO ${table} (${columnsSql}) SELECT ${columnsSql} FROM ${input.sourceRelationSql}`\n )\n\n return {\n dataChangeExpected: source.rowCount > 0 || target.rowCount > 0,\n sourceRowCount: source.rowCount,\n resultingRowCount: { kind: \"exact\", value: source.rowCount },\n }\n }\n\n const sourceRowCount = await countRows(input.runtime, input.sourceRelationSql)\n await input.runtime.run(\n `INSERT INTO ${table} (${columnsSql}) SELECT ${columnsSql} FROM ${input.sourceRelationSql}`\n )\n\n return {\n dataChangeExpected: sourceRowCount > 0,\n sourceRowCount,\n resultingRowCount:\n input.previousRowCount === undefined\n ? { kind: \"unknown\" }\n : { kind: \"exact\", value: input.previousRowCount + sourceRowCount },\n }\n}\n\nexport async function inspectUniqueKeyedRelation(input: {\n readonly runtime: DuckDbQueryRuntime\n readonly dataset: DatasetDefinition\n readonly relationSql: string\n readonly context: string\n}): Promise<number> {\n const primaryKeyColumns = getDatasetPrimaryKeyColumns(input.dataset)\n if (primaryKeyColumns === null) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${input.dataset.id}' must define a primaryKey before rows can be keyed.`\n )\n }\n\n const keysSql = primaryKeyColumns.map((column) => quoteIdentifier(column)).join(\", \")\n const [row] = await input.runtime.query(`\n SELECT\n count(*) AS row_count,\n coalesce(max(key_count), 0) AS max_key_count\n FROM (\n SELECT count(*) OVER (PARTITION BY ${keysSql}) AS key_count\n FROM ${input.relationSql}\n ) keyed_rows\n `)\n\n const rowCount = row === undefined ? 0 : Number(getBigIntLike(row, \"row_count\"))\n const maxKeyCount = row === undefined ? 0 : Number(getBigIntLike(row, \"max_key_count\"))\n if (maxKeyCount > 1) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${input.dataset.id}' ${input.context} contains duplicate primary key.`\n )\n }\n\n return rowCount\n}\n\nasync function assertNoPrimaryKeyOverlap(input: {\n readonly runtime: DuckDbQueryRuntime\n readonly dataset: DatasetDefinition\n readonly leftRelationSql: string\n readonly rightRelationSql: string\n readonly context: string\n}): Promise<void> {\n const primaryKeyColumns = getDatasetPrimaryKeyColumns(input.dataset)\n if (primaryKeyColumns === null) {\n return\n }\n\n const matchSql = primaryKeyColumns\n .map((column) => `left_rows.${quoteIdentifier(column)} = right_rows.${quoteIdentifier(column)}`)\n .join(\" AND \")\n const [collision] = await input.runtime.query(`\n SELECT 1\n FROM ${input.leftRelationSql} left_rows\n JOIN ${input.rightRelationSql} right_rows ON ${matchSql}\n LIMIT 1\n `)\n if (collision !== undefined) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${input.dataset.id}' ${input.context} contains duplicate primary key.`\n )\n }\n}\n\ninterface RelationFingerprint {\n readonly rowCount: number\n readonly hashSum: string\n readonly hashXor: string\n}\n\nasync function fingerprintRelation(\n runtime: DuckDbQueryRuntime,\n relationSql: string,\n columnsSql: string\n): Promise<RelationFingerprint> {\n const [row] = await runtime.query(`\n SELECT\n count(*) AS row_count,\n coalesce(sum(hash(${columnsSql})::HUGEINT), 0::HUGEINT) AS hash_sum,\n coalesce(bit_xor(hash('sixb:snapshot:v1', ${columnsSql})), 0::UBIGINT) AS hash_xor\n FROM ${relationSql}\n `)\n\n if (row === undefined) {\n return { rowCount: 0, hashSum: \"0\", hashXor: \"0\" }\n }\n\n return {\n rowCount: Number(getBigIntLike(row, \"row_count\")),\n hashSum: getBigIntLike(row, \"hash_sum\").toString(),\n hashXor: getBigIntLike(row, \"hash_xor\").toString(),\n }\n}\n\nfunction sameFingerprint(left: RelationFingerprint, right: RelationFingerprint): boolean {\n return (\n left.rowCount === right.rowCount &&\n left.hashSum === right.hashSum &&\n left.hashXor === right.hashXor\n )\n}\n\nasync function countRows(runtime: DuckDbQueryRuntime, relationSql: string): Promise<number> {\n const [row] = await runtime.query(`SELECT count(*) AS row_count FROM ${relationSql}`)\n if (row === undefined) {\n return 0\n }\n\n return Number(getBigIntLike(row, \"row_count\"))\n}\n",
28
- "import { randomUUID } from \"node:crypto\"\nimport {\n LakeStorageError,\n type SqlTransformBody,\n type SqlTransformRelation,\n} from \"@sixb/core/lake-storage\"\nimport type { DuckLakeStorageOptions } from \"../types\"\nimport { encodeDatasetTableName } from \"./names\"\nimport { qualifiedTableName } from \"./sql\"\nimport { parseVersionId } from \"./versions\"\n\nconst RELATION_PLACEHOLDER_PREFIX = \"__sixb_sql_transform_relation_\"\nconst RELATION_PLACEHOLDER_PATTERN = /__sixb_sql_transform_relation_[0-9a-f]{32}_[0-9]+__/g\n\nexport interface DuckLakeSqlTransformSourceRelation {\n readonly datasetId: string\n readonly versionId: string\n}\n\nexport interface RenderDuckLakeSqlTransformSqlInput {\n readonly options: Pick<DuckLakeStorageOptions, \"alias\">\n readonly sources: Readonly<Record<string, DuckLakeSqlTransformSourceRelation>>\n readonly sql: SqlTransformBody<\"duckdb\">\n}\n\ninterface DuckLakeSqlTransformRelationContext {\n readonly relations: Readonly<Record<string, SqlTransformRelation>>\n render(sql: string): string\n}\n\nclass DuckLakeSqlTransformRelation implements SqlTransformRelation {\n constructor(private readonly placeholder: string) {}\n\n toString(): string {\n return this.placeholder\n }\n}\n\nexport function renderDuckLakeSqlTransformSql(input: RenderDuckLakeSqlTransformSqlInput): string {\n const context = createDuckLakeSqlTransformRelationContext(input)\n const sql = input.sql(context.relations)\n\n if (typeof sql !== \"string\") {\n throw new LakeStorageError(\"[SixbDuckLake] SQL transform body must return a SQL string.\")\n }\n\n return context.render(sql)\n}\n\nfunction createDuckLakeSqlTransformRelationContext(\n input: Omit<RenderDuckLakeSqlTransformSqlInput, \"sql\">\n): DuckLakeSqlTransformRelationContext {\n const token = randomUUID().replaceAll(\"-\", \"\")\n const relations: Record<string, SqlTransformRelation> = Object.create(null)\n const replacements = new Map<string, string>()\n\n let index = 0\n for (const [sourceName, source] of Object.entries(input.sources)) {\n const placeholder = `${RELATION_PLACEHOLDER_PREFIX}${token}_${index}__`\n relations[sourceName] = Object.freeze(new DuckLakeSqlTransformRelation(placeholder))\n replacements.set(placeholder, renderDuckLakeSourceRelation(input.options, source))\n index += 1\n }\n\n return {\n relations: Object.freeze(relations),\n render(sql) {\n const rendered = sql.replace(RELATION_PLACEHOLDER_PATTERN, (placeholder) => {\n const replacement = replacements.get(placeholder)\n if (replacement === undefined) {\n throwUnresolvedPlaceholder()\n }\n\n return replacement\n })\n\n if (rendered.includes(RELATION_PLACEHOLDER_PREFIX)) {\n throwUnresolvedPlaceholder()\n }\n\n return rendered\n },\n }\n}\n\nfunction renderDuckLakeSourceRelation(\n options: Pick<DuckLakeStorageOptions, \"alias\">,\n source: DuckLakeSqlTransformSourceRelation\n): string {\n const snapshotId = parseVersionId(source.versionId)\n const tableName = encodeDatasetTableName(source.datasetId)\n return `(SELECT * FROM ${qualifiedTableName(options, tableName)} AT (VERSION => ${snapshotId}))`\n}\n\nfunction throwUnresolvedPlaceholder(): never {\n throw new LakeStorageError(\n \"[SixbDuckLake] SQL transform contains an unresolved relation placeholder.\"\n )\n}\n",
29
- "import { randomUUID } from \"node:crypto\"\nimport type { DatasetDefinition } from \"@sixb/core\"\nimport type {\n BeginDatasetMergeInput,\n BeginDatasetWriteInput,\n DatasetMergeCommitResult,\n DatasetVersion,\n DatasetWriteCommitResult,\n DatasetWriteMode,\n LakeMergeSession,\n LakeWriteSession,\n} from \"@sixb/core/lake-storage\"\nimport {\n assertUnsequencedDatasetWrite,\n getDatasetPrimaryKeyColumns,\n hasDatasetInputChanges,\n LakeConcurrencyError,\n LakeStorageError,\n retryDatasetMergeCommit,\n} from \"@sixb/core/lake-storage\"\nimport type { DuckLakeCatalogOptions, DuckLakeStorageOptions } from \"../types\"\nimport { localCatalogCoordinationKey } from \"./catalog-key\"\nimport {\n type ApplyDatasetRowsResult,\n applyDatasetRowsFromRelation,\n assertDatasetWriteMode,\n type CommitRowCount,\n} from \"./dataset-row-commit\"\nimport { applyDatasetMergeFromRelation } from \"./dataset-row-merge\"\nimport { getBigIntLike } from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport type { DuckLakeConnectionManager } from \"./ducklake-connection-manager\"\nimport type { DuckLakeDatasetCatalog } from \"./ducklake-dataset-catalog\"\nimport { createDuckLakeMergeSession, type DuckLakeCommitMergeInput } from \"./ducklake-merge-session\"\nimport type { DuckLakeSnapshotReader, DuckLakeVersionSummary } from \"./ducklake-snapshot-reader\"\nimport { createDuckLakeWriteSession, type DuckLakeCommitWriteInput } from \"./ducklake-write-session\"\nimport { encodeDatasetTableName } from \"./names\"\nimport {\n duckLakeAlias,\n duckLakeMetadataTableName,\n qualifiedTableName,\n quoteIdentifier,\n quoteSqlString,\n} from \"./sql\"\nimport { parseCommitMetadata, type SixbCommitMetadata } from \"./versions\"\n\nexport interface DuckLakeCommitDatasetVersionInput {\n readonly dataset: DatasetDefinition\n readonly mode: DatasetWriteMode\n readonly expectedLatestVersionId?: string | null\n readonly commitMessage: string\n readonly producer?: BeginDatasetWriteInput[\"producer\"]\n readonly inputs?: BeginDatasetWriteInput[\"inputs\"]\n applyChanges(\n runtime: DuckDbQueryRuntime,\n context: DuckLakeApplyChangesContext\n ): Promise<ApplyDatasetRowsResult>\n}\n\ninterface DuckLakeCommitVersionOutcomeInput\n extends Omit<DuckLakeCommitDatasetVersionInput, \"expectedLatestVersionId\" | \"mode\"> {\n readonly mode: DatasetWriteMode | \"merge\"\n readonly expectedLatestVersionId?: string | null\n readonly allowInitialNoOp?: boolean\n readonly signal?: AbortSignal\n readonly disableRetries?: boolean\n readonly optimisticOperation?: \"commit\" | \"merge commit\"\n}\n\ninterface DuckLakeCommitVersionOutcomeRuntimeInput extends DuckLakeCommitVersionOutcomeInput {\n readonly runtime: DuckDbQueryRuntime\n}\n\nexport interface DuckLakeApplyChangesContext {\n readonly previousRowCount?: number\n readonly validatedPrimaryKeyColumns?: readonly string[]\n}\n\n/**\n * Owns the durable DuckLake transaction for a staged Sixb write.\n *\n * Write sessions keep validation and temp staging table mechanics close to the\n * caller. This coordinator handles everything that changes shared DuckLake\n * state: attachment refresh, optimistic guards, row replacement/append,\n * commit_extra_info, no-op detection, and DatasetVersion hydration.\n */\nexport class DuckLakeWriteCoordinator {\n constructor(\n private readonly options: DuckLakeStorageOptions,\n private readonly connections: DuckLakeConnectionManager,\n private readonly datasets: DuckLakeDatasetCatalog,\n private readonly snapshots: DuckLakeSnapshotReader\n ) {}\n\n async beginWrite(input: BeginDatasetWriteInput): Promise<LakeWriteSession> {\n this.connections.assertOpen()\n\n const definition = await this.datasets.getDataset(input.dataset.id)\n if (!definition) {\n throw new LakeStorageError(`[SixbDuckLake] Unknown dataset '${input.dataset.id}'.`)\n }\n\n this.datasets.assertSchema(definition)\n assertUnsequencedDatasetWrite(definition)\n const mode = input.mode ?? \"snapshot\"\n assertDatasetWriteMode(mode, \"write\")\n\n // Staging tables are connection-scoped in DuckDB. In the single-runtime\n // model every active write session creates a uniquely named temp table on\n // the shared runtime; the durable commit later runs on that same\n // connection under an exclusive queue slot.\n const runtime = await this.connections.stagingRuntime()\n return createDuckLakeWriteSession({\n commitWrite: (options) => this.commitWrite(options),\n runtime,\n write: {\n ...input,\n dataset: definition,\n mode,\n },\n })\n }\n\n async beginMerge(input: BeginDatasetMergeInput): Promise<LakeMergeSession> {\n this.connections.assertOpen()\n\n const definition = await this.datasets.getDataset(input.dataset.id)\n if (!definition) {\n throw new LakeStorageError(`[SixbDuckLake] Unknown dataset '${input.dataset.id}'.`)\n }\n if (getDatasetPrimaryKeyColumns(definition) === null) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${definition.id}' must define a primaryKey before it can be merged.`\n )\n }\n\n this.datasets.assertSchema(definition)\n const latestVersion = await this.connections.withAttachedRuntime((runtime) =>\n this.snapshots.getLatestVersionForDefinition(runtime, definition)\n )\n if (\n input.expectedLatestVersionId !== undefined &&\n latestVersion?.versionId !== input.expectedLatestVersionId\n ) {\n throw new LakeConcurrencyError(\n `[SixbDuckLake] Optimistic merge start failed for dataset '${definition.id}': expected latest version '${input.expectedLatestVersionId}', found '${latestVersion?.versionId ?? \"none\"}'.`\n )\n }\n const runtime = await this.connections.stagingRuntime()\n return createDuckLakeMergeSession({\n commitMerge: (options) => this.commitMerge(options),\n runtime,\n merge: { ...input, dataset: definition },\n baseVersionId: latestVersion?.versionId ?? null,\n })\n }\n\n private async commitWrite(input: DuckLakeCommitWriteInput): Promise<DatasetWriteCommitResult> {\n const definition = await this.datasets.getDataset(input.write.dataset.id)\n if (!definition) {\n throw new LakeStorageError(`[SixbDuckLake] Unknown dataset '${input.write.dataset.id}'.`)\n }\n\n const mode = input.write.mode ?? \"snapshot\"\n assertDatasetWriteMode(mode, \"write\")\n\n return this.commitDatasetVersion({\n dataset: definition,\n mode,\n expectedLatestVersionId: input.commit?.expectedLatestVersionId,\n commitMessage: input.commit?.commitMessage ?? `write dataset ${input.write.dataset.id}`,\n producer: input.write.producer,\n inputs: input.write.inputs,\n applyChanges: (runtime, context) =>\n this.applyStagedRows({\n ...input,\n runtime,\n previousRowCount: context.previousRowCount,\n }),\n })\n }\n\n private async commitMerge(input: DuckLakeCommitMergeInput): Promise<DatasetMergeCommitResult> {\n const definition = await this.datasets.getDataset(input.merge.dataset.id)\n if (!definition) {\n throw new LakeStorageError(`[SixbDuckLake] Unknown dataset '${input.merge.dataset.id}'.`)\n }\n if (getDatasetPrimaryKeyColumns(definition) === null) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${definition.id}' must define a primaryKey before it can be merged.`\n )\n }\n\n return retryDatasetMergeCommit(input.merge, input.commit, (rebase) =>\n this.withCommitRuntime(async (runtime) => {\n input.commit?.signal?.throwIfAborted()\n const baseVersionId = rebase\n ? ((await this.snapshots.getLatestVersionForDefinition(runtime, definition))?.versionId ??\n null)\n : input.baseVersionId\n return this.commitVersionOutcomeOnExclusiveRuntime(runtime, {\n dataset: definition,\n mode: \"merge\",\n expectedLatestVersionId: baseVersionId,\n allowInitialNoOp: !input.commit?.createInitialVersion,\n signal: input.commit?.signal,\n disableRetries: true,\n optimisticOperation: \"merge commit\",\n commitMessage: input.commit?.commitMessage ?? `merge dataset ${definition.id}`,\n producer: input.merge.producer,\n inputs: input.merge.inputs,\n applyChanges: async (commitRuntime, context) => {\n const result = await applyDatasetMergeFromRelation({\n options: this.options,\n runtime: commitRuntime,\n dataset: definition,\n stagingTableName: input.stagingTableName,\n sequenceColumnName: input.sequenceColumnName,\n kindColumnName: input.kindColumnName,\n previousRowCount: context.previousRowCount,\n validatedPrimaryKeyColumns: context.validatedPrimaryKeyColumns,\n })\n if (result.sourceRowCount !== input.changesWritten) {\n throw new LakeStorageError(\n `[SixbDuckLake] Staged merge for dataset '${definition.id}' accepted ${input.changesWritten} change(s), but DuckLake saw ${result.sourceRowCount} source change(s) at commit time.`\n )\n }\n return result\n },\n })\n })\n )\n }\n\n async commitDatasetVersion(\n input: DuckLakeCommitDatasetVersionInput\n ): Promise<DatasetWriteCommitResult> {\n return this.withCommitRuntime((runtime) =>\n this.commitDatasetVersionOnExclusiveRuntime(runtime, input)\n )\n }\n\n async withCommitRuntime<T>(run: (runtime: DuckDbQueryRuntime) => Promise<T>): Promise<T> {\n return withCatalogCommitLock(this.options, async () => {\n // `withExclusiveAttached` refreshes local catalogs before the exclusive\n // slot, then holds the local attachment boundary through the commit.\n return this.connections.withExclusiveAttached(run)\n })\n }\n\n async commitDatasetVersionOnExclusiveRuntime(\n runtime: DuckDbQueryRuntime,\n input: DuckLakeCommitDatasetVersionInput\n ): Promise<DatasetWriteCommitResult> {\n assertUnsequencedDatasetWrite(input.dataset)\n const result = await this.commitVersionOutcomeOnExclusiveRuntime(runtime, {\n ...input,\n // DuckLake has no primary-key constraint. Do not let its automatic retry replay a keyed\n // append after the collision checks ran against an older transaction snapshot.\n disableRetries:\n input.mode === \"append\" && getDatasetPrimaryKeyColumns(input.dataset) !== null,\n })\n if (result.version === null) {\n throw new LakeStorageError(\n `[SixbDuckLake] No DuckLake changes were committed for dataset '${input.dataset.id}', and no previous version exists.`\n )\n }\n\n return { ...result.version, outcome: result.outcome }\n }\n\n private async commitVersionOutcomeOnExclusiveRuntime(\n runtime: DuckDbQueryRuntime,\n input: DuckLakeCommitVersionOutcomeInput\n ): Promise<DatasetMergeCommitResult> {\n const runtimeInput = { ...input, runtime }\n return this.withGuardedRetrySetting(runtimeInput, () =>\n this.commitDatasetVersionUnlocked(runtimeInput)\n )\n }\n\n private async withGuardedRetrySetting<T>(\n input: DuckLakeCommitVersionOutcomeRuntimeInput,\n run: () => Promise<T>\n ): Promise<T> {\n if (input.expectedLatestVersionId === undefined && !input.disableRetries) {\n return run()\n }\n\n // DuckLake can retry transactions internally. Optimistic guards and keyed append constraint\n // checks must not be replayed against a different snapshot, so disable retries for this\n // exclusive commit and restore the runtime setting before releasing the queue.\n await input.runtime.run(\"SET ducklake_max_retry_count = 0\")\n let outcome:\n | { readonly kind: \"success\"; readonly value: T }\n | {\n readonly kind: \"error\"\n readonly error: unknown\n }\n\n try {\n outcome = { kind: \"success\", value: await run() }\n } catch (error) {\n outcome = { kind: \"error\", error }\n }\n\n try {\n await input.runtime.run(\"RESET ducklake_max_retry_count\")\n } catch {\n // The retry count is session state on a shared, long-lived connection.\n // If it cannot be restored, recycle the connection so a leftover value of\n // 0 cannot silently disable DuckLake auto-retry for a later unguarded\n // commit. The commit already succeeded or failed durably, so this cleanup\n // must never change the outcome reported to the caller.\n this.connections.poisonRuntime()\n }\n\n if (outcome.kind === \"error\") {\n throw outcome.error\n }\n\n return outcome.value\n }\n\n private async commitDatasetVersionUnlocked(\n input: DuckLakeCommitVersionOutcomeRuntimeInput\n ): Promise<DatasetMergeCommitResult> {\n // Capture the write connection's last committed DuckLake snapshot before\n // and after COMMIT. The commitId in DuckLake commit_extra_info proves\n // which snapshot belongs to this transaction.\n const previousWriteSnapshotId = await this.lastCommittedSnapshotId(input.runtime)\n\n let committed = false\n try {\n // Guarded Sixb commits need compare-and-swap semantics. DuckLake can\n // automatically retry non-conflicting commits, so guarded transactions\n // disable retries and validate a head belonging to the native write snapshot.\n const latestVersion = await this.beginVersionTransaction(input)\n if (input.expectedLatestVersionId !== undefined) {\n this.assertExpectedLatestVersion({\n datasetId: input.dataset.id,\n expectedLatestVersionId: input.expectedLatestVersionId,\n actualLatestVersionId: latestVersion?.versionId ?? null,\n operation: input.optimisticOperation ?? \"commit\",\n })\n }\n\n const changeResult = await input.applyChanges(input.runtime, {\n previousRowCount: latestVersion?.rowCount,\n validatedPrimaryKeyColumns: latestVersion?.validatedPrimaryKeyColumns,\n })\n input.signal?.throwIfAborted()\n await this.ensureNoOpHasSnapshot(input, changeResult, latestVersion)\n const commitId = randomUUID()\n await this.setCommitMetadata(\n input,\n commitId,\n commitRowCount(input, changeResult, latestVersion)\n )\n\n await input.runtime.run(\"COMMIT\")\n committed = true\n\n const committedWriteSnapshotId = await this.lastCommittedSnapshotId(input.runtime)\n try {\n return await this.versionForCommittedWrite({\n ...input,\n commitId,\n previousWriteSnapshotId,\n committedWriteSnapshotId,\n changeResult,\n })\n } finally {\n await this.connections.detachLocalCatalogAfterCommit(input.runtime)\n }\n } catch (error) {\n if (!committed) {\n await this.rollbackTransaction(input.runtime)\n // DuckLake's snapshot-id uniqueness constraint is its catalog commit CAS. With native\n // retries disabled, this error proves the transaction lost to another writer. Do not\n // classify generic connection/COMMIT errors: their durable outcome may be ambiguous.\n if (\n error instanceof Error &&\n error.message.startsWith(\n \"TransactionContext Error: Failed to commit: Failed to commit DuckLake transaction.\"\n ) &&\n error.message.includes(\"Exceeded the maximum retry count of 0\") &&\n error.message.includes(\n 'duplicate key value violates unique constraint \"ducklake_snapshot_pkey\"'\n )\n ) {\n throw new LakeConcurrencyError(\n `[SixbDuckLake] Concurrent catalog commit for dataset '${input.dataset.id}'.`,\n { cause: error }\n )\n }\n }\n throw error\n }\n }\n\n private async versionForCommittedWrite(\n input: DuckLakeCommitVersionOutcomeRuntimeInput & {\n readonly commitId: string\n readonly previousWriteSnapshotId: string | null\n readonly committedWriteSnapshotId: string | null\n readonly changeResult: ApplyDatasetRowsResult\n }\n ): Promise<DatasetMergeCommitResult> {\n // Hydrate the committed version on the same exclusive runtime. That keeps\n // snapshot matching and row-count fallback inside the same serialized\n // connection state that just committed.\n const ownSnapshotId = await this.findOwnSnapshotId(\n input.runtime,\n input.dataset.id,\n input.commitId,\n input.previousWriteSnapshotId,\n input.committedWriteSnapshotId\n )\n\n if (ownSnapshotId !== null) {\n const version = await this.snapshots.getVersionForSnapshot(\n input.runtime,\n input.dataset,\n ownSnapshotId\n )\n if (version) {\n return { outcome: \"created\", version }\n }\n\n throw new LakeStorageError(\n `[SixbDuckLake] DuckLake committed snapshot '${ownSnapshotId}' for dataset '${input.dataset.id}', but Sixb could not hydrate it as a dataset version.`\n )\n }\n\n if (!input.changeResult.dataChangeExpected) {\n const version = await this.versionForNoOpCommit(\n input.runtime,\n input.dataset,\n input.allowInitialNoOp ?? false\n )\n if (input.expectedLatestVersionId !== undefined) {\n this.assertExpectedLatestVersion({\n datasetId: input.dataset.id,\n expectedLatestVersionId: input.expectedLatestVersionId,\n actualLatestVersionId: version?.versionId ?? null,\n operation: input.optimisticOperation ?? \"commit\",\n })\n }\n return {\n outcome: \"unchanged\",\n version,\n }\n }\n\n if (input.committedWriteSnapshotId === input.previousWriteSnapshotId) {\n throw new LakeStorageError(\n `[SixbDuckLake] DuckLake commit for dataset '${input.dataset.id}' completed without producing a snapshot for this non-empty write.`\n )\n }\n\n throw new LakeStorageError(\n `[SixbDuckLake] DuckLake commit for dataset '${input.dataset.id}' completed, but Sixb could not find a matching snapshot for this write.`\n )\n }\n\n private async applyStagedRows(\n input: DuckLakeCommitWriteInput & {\n readonly runtime: DuckDbQueryRuntime\n readonly previousRowCount?: number\n }\n ): Promise<ApplyDatasetRowsResult> {\n const mode = input.write.mode ?? \"snapshot\"\n const result = await applyDatasetRowsFromRelation({\n options: this.options,\n runtime: input.runtime,\n dataset: input.write.dataset,\n mode,\n sourceRelationSql: quoteIdentifier(input.stagingTableName),\n previousRowCount: input.previousRowCount,\n })\n\n if (result.sourceRowCount !== input.rowsWritten) {\n throw new LakeStorageError(\n `[SixbDuckLake] Staged write for dataset '${input.write.dataset.id}' accepted ${input.rowsWritten} row(s), but DuckLake saw ${result.sourceRowCount} source row(s) at commit time.`\n )\n }\n\n return result\n }\n\n private async setCommitMetadata(\n input: DuckLakeCommitVersionOutcomeRuntimeInput,\n commitId: string,\n rowCount: CommitRowCount\n ): Promise<void> {\n // DuckLake stores this JSON on the snapshot it creates for the current\n // transaction. Version id, timestamp, and data-change detection still come\n // from DuckLake itself. commitId is only a transaction correlation token so\n // concurrent writers do not accidentally hydrate each other's snapshots.\n // Every keyed data path either replaces the baseline or validates its uniqueness before this\n // marker is persisted. Merge commits can therefore avoid repeating that full-table audit.\n const validatedPrimaryKeyColumns = getDatasetPrimaryKeyColumns(input.dataset)\n const metadata: SixbCommitMetadata = {\n kind: \"datasetVersion\",\n datasetId: input.dataset.id,\n commitId,\n mode: input.mode,\n producer: input.producer ? structuredClone(input.producer) : undefined,\n inputs: input.inputs ? structuredClone(input.inputs) : undefined,\n ...(rowCount.kind === \"exact\" ? { rowCount: rowCount.value } : {}),\n ...(validatedPrimaryKeyColumns !== null\n ? { validatedPrimaryKeyColumns: [...validatedPrimaryKeyColumns] }\n : {}),\n }\n\n await input.runtime.run(\n `CALL ${quoteIdentifier(duckLakeAlias(this.options))}.set_commit_message(${quoteSqlString(\n \"Sixb\"\n )}, ${quoteSqlString(input.commitMessage)}, extra_info => ${quoteSqlString(\n JSON.stringify({ sixb: metadata })\n )})`\n )\n }\n\n private async ensureNoOpHasSnapshot(\n input: DuckLakeCommitVersionOutcomeRuntimeInput,\n changeResult: ApplyDatasetRowsResult,\n knownLatestVersion: DuckLakeVersionSummary | null | undefined\n ): Promise<void> {\n if (changeResult.dataChangeExpected) {\n return\n }\n\n const latestVersion =\n knownLatestVersion === undefined\n ? await this.snapshots.getLatestVersionSummaryForDefinition(input.runtime, input.dataset)\n : knownLatestVersion\n if (\n latestVersion\n ? input.mode === \"merge\" || !hasDatasetInputChanges(latestVersion.inputs, input.inputs)\n : input.allowInitialNoOp\n ) {\n return\n }\n\n // DuckLake 1.5.2 does not create a snapshot for a transaction whose data and metadata are\n // unchanged, and set_commit_message alone cannot force one. Reapplying the current table\n // comment is an idempotent metadata write: it leaves the visible DatasetDefinition unchanged\n // while giving initial empty writes and changed input lineage a real DuckLake snapshot.\n const table = qualifiedTableName(this.options, encodeDatasetTableName(input.dataset.id))\n const descriptionSql =\n input.dataset.description === undefined ? \"NULL\" : quoteSqlString(input.dataset.description)\n await input.runtime.run(`COMMENT ON TABLE ${table} IS ${descriptionSql}`)\n }\n\n private async versionForNoOpCommit(\n runtime: DuckDbQueryRuntime,\n definition: DatasetDefinition,\n allowInitialNoOp: boolean\n ): Promise<DatasetVersion | null> {\n const latestVersion = await this.snapshots.getLatestVersionForDefinition(runtime, definition)\n if (latestVersion) {\n return latestVersion\n }\n\n if (allowInitialNoOp) {\n return null\n }\n\n throw new LakeStorageError(\n `[SixbDuckLake] No DuckLake changes were committed for dataset '${definition.id}', and no previous version exists.`\n )\n }\n\n private async rollbackTransaction(runtime: DuckDbQueryRuntime): Promise<void> {\n try {\n await runtime.run(\"ROLLBACK\")\n } catch {\n // Preserve the original write failure. DuckDB may already have closed\n // the transaction if COMMIT itself failed.\n }\n }\n\n private async beginVersionTransaction(\n input: DuckLakeCommitVersionOutcomeRuntimeInput\n ): Promise<DuckLakeVersionSummary | null | undefined> {\n if (!isSqliteCatalog(this.options.catalog)) {\n await input.runtime.run(\"BEGIN TRANSACTION\")\n if (input.expectedLatestVersionId === undefined && input.mode !== \"append\") {\n return undefined\n }\n return this.snapshots.getLatestVersionSummaryForDefinition(input.runtime, input.dataset)\n }\n\n // Direct metadata reads enlist a second SQLite transaction on the outer DuckDB connection.\n // Its read lock blocks DuckLake's own metadata connection at COMMIT. Read in autocommit,\n // then pin the native DuckLake snapshot and verify nothing changed in between. The summary\n // is now valid for this write transaction, including null (no previous version).\n // Only preparation can repeat: staged mutations and COMMIT are never replayed here.\n for (let attempt = 0; attempt < 3; attempt++) {\n input.signal?.throwIfAborted()\n const snapshotId = await this.currentSnapshotId(input.runtime)\n const latestVersion = await this.snapshots.getLatestVersionSummaryForDefinition(\n input.runtime,\n input.dataset\n )\n await input.runtime.run(\"BEGIN TRANSACTION\")\n if ((await this.currentSnapshotId(input.runtime)) === snapshotId) {\n return latestVersion\n }\n await input.runtime.run(\"ROLLBACK\")\n }\n\n throw new LakeConcurrencyError(\n `[SixbDuckLake] Catalog changed during three write preparations for dataset '${input.dataset.id}'. Retry the write.`\n )\n }\n\n private async currentSnapshotId(runtime: DuckDbQueryRuntime): Promise<string> {\n const [row] = await runtime.query(\n `SELECT id FROM ${quoteIdentifier(duckLakeAlias(this.options))}.current_snapshot()`\n )\n if (row === undefined) {\n throw new LakeStorageError(\"[SixbDuckLake] DuckLake did not return a current snapshot.\")\n }\n return String(getBigIntLike(row, \"id\"))\n }\n\n private async lastCommittedSnapshotId(runtime: DuckDbQueryRuntime): Promise<string | null> {\n // DuckLake reports the last snapshot committed by this connection.\n const [row] = await runtime.query(\n `SELECT id FROM ${quoteIdentifier(duckLakeAlias(this.options))}.last_committed_snapshot()`\n )\n if (row === undefined || row.id === null || row.id === undefined) {\n return null\n }\n\n return String(getBigIntLike(row, \"id\"))\n }\n\n private async findSnapshotIdByCommitId(\n runtime: DuckDbQueryRuntime,\n datasetId: string,\n commitId: string,\n snapshotId?: string\n ): Promise<string | null> {\n if (snapshotId !== undefined) {\n assertDuckLakeSnapshotId(snapshotId)\n }\n\n const ducklakeSnapshotChanges = duckLakeMetadataTableName(\n this.options,\n \"ducklake_snapshot_changes\"\n )\n const whereSql = snapshotId === undefined ? \"\" : `WHERE snapshot_id = ${snapshotId}`\n const orderSql = snapshotId === undefined ? \"ORDER BY snapshot_id DESC\" : \"\"\n const rows = await runtime.query(`\n SELECT snapshot_id, commit_extra_info\n FROM ${ducklakeSnapshotChanges}\n ${whereSql}\n ${orderSql}\n `)\n\n for (const row of rows) {\n const metadata = parseCommitMetadata(row.commit_extra_info)\n if (metadata?.datasetId === datasetId && metadata.commitId === commitId) {\n return String(getBigIntLike(row, \"snapshot_id\"))\n }\n }\n\n return null\n }\n\n private async findOwnSnapshotId(\n runtime: DuckDbQueryRuntime,\n datasetId: string,\n commitId: string,\n previousWriteSnapshotId: string | null,\n committedWriteSnapshotId: string | null\n ): Promise<string | null> {\n if (committedWriteSnapshotId === null || committedWriteSnapshotId === previousWriteSnapshotId) {\n return null\n }\n\n const exactMatch = await this.findSnapshotIdByCommitId(\n runtime,\n datasetId,\n commitId,\n committedWriteSnapshotId\n )\n if (exactMatch !== null) {\n return exactMatch\n }\n\n // Defensive fallback for driver/version edge cases. The expected hot path\n // above reads a single metadata row keyed by last_committed_snapshot().\n return this.findSnapshotIdByCommitId(runtime, datasetId, commitId)\n }\n\n private assertExpectedLatestVersion(input: {\n readonly datasetId: string\n readonly expectedLatestVersionId?: string | null\n readonly actualLatestVersionId: string | null\n readonly operation: \"commit\" | \"merge commit\"\n }): void {\n if (input.expectedLatestVersionId === undefined) {\n return\n }\n\n if (input.actualLatestVersionId !== input.expectedLatestVersionId) {\n throw new LakeConcurrencyError(\n `[SixbDuckLake] Optimistic ${input.operation} failed for dataset '${input.datasetId}': expected latest version '${input.expectedLatestVersionId ?? \"none\"}', found '${input.actualLatestVersionId ?? \"none\"}'.`\n )\n }\n }\n}\n\nfunction isSqliteCatalog(catalog: DuckLakeCatalogOptions): boolean {\n return (\n catalog.type === \"sqlite\" ||\n (catalog.type === \"custom\" && catalog.uri.toLowerCase().startsWith(\"sqlite:\"))\n )\n}\n\nfunction commitRowCount(\n input: Pick<DuckLakeCommitVersionOutcomeInput, \"expectedLatestVersionId\" | \"mode\">,\n changeResult: ApplyDatasetRowsResult,\n latestVersion: DuckLakeVersionSummary | null | undefined\n): CommitRowCount {\n // Unguarded append commits can be retried by DuckLake after this transaction\n // read the previous latest version. In that case previousRowCount +\n // sourceRowCount can underreport the committed snapshot, so leave the count unknown.\n if (input.mode === \"append\" && input.expectedLatestVersionId === undefined) {\n return { kind: \"unknown\" }\n }\n\n if (changeResult.resultingRowCount.kind === \"exact\") {\n return changeResult.resultingRowCount\n }\n\n if (input.mode === \"append\" && latestVersion === null) {\n return { kind: \"exact\", value: changeResult.sourceRowCount }\n }\n\n return { kind: \"unknown\" }\n}\n\nfunction assertDuckLakeSnapshotId(snapshotId: string): void {\n if (!/^\\d+$/.test(snapshotId)) {\n throw new LakeStorageError(`[SixbDuckLake] Invalid DuckLake snapshot id '${snapshotId}'.`)\n }\n}\n\n// Local metadata catalogs are useful for dev/test, but they do not have the\n// same multi-connection conflict behavior as PostgreSQL. Serialize local\n// commits within this process so a losing writer cannot hydrate another\n// connection's snapshot during DuckLake conflict handling.\nconst localCatalogCommitLocks = new Map<string, Promise<void>>()\n\nasync function withCatalogCommitLock<T>(\n options: DuckLakeStorageOptions,\n run: () => Promise<T>\n): Promise<T> {\n const key = localCatalogCoordinationKey(options)\n if (key === undefined) {\n return run()\n }\n\n const previous = localCatalogCommitLocks.get(key) ?? Promise.resolve()\n const ready = previous.catch(() => {})\n let release!: () => void\n const next = new Promise<void>((resolve) => {\n release = resolve\n })\n const current = ready.then(() => next)\n localCatalogCommitLocks.set(key, current)\n\n await ready\n try {\n return await run()\n } finally {\n release()\n if (localCatalogCommitLocks.get(key) === current) {\n localCatalogCommitLocks.delete(key)\n }\n }\n}\n",
30
- "import type { DatasetDefinition } from \"@sixb/core\"\nimport {\n type DatasetSequenceChange,\n type DatasetSequenceState,\n getDatasetPrimaryKeyColumns,\n LakeStorageError,\n reconcileDatasetSequences,\n} from \"@sixb/core/lake-storage\"\nimport type { DuckLakeStorageOptions } from \"../types\"\nimport { type ApplyDatasetRowsResult, inspectUniqueKeyedRelation } from \"./dataset-row-commit\"\nimport { getBigIntLike, getOptionalString, getString } from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport { encodeDatasetSequenceTableName, encodeDatasetTableName } from \"./names\"\nimport { datasetSchemaColumnNamesSql } from \"./schema\"\nimport { qualifiedTableName, quoteIdentifier, quoteSqlString } from \"./sql\"\n\nexport interface ApplyDatasetMergeFromRelationInput {\n readonly options: DuckLakeStorageOptions\n readonly runtime: DuckDbQueryRuntime\n readonly dataset: DatasetDefinition\n readonly stagingTableName: string\n readonly sequenceColumnName: string\n readonly kindColumnName: string\n readonly previousRowCount?: number\n readonly validatedPrimaryKeyColumns?: readonly string[]\n}\n\ninterface MergeEffectCounts {\n readonly inserts: number\n readonly updates: number\n readonly deletes: number\n}\n\nexport async function applyDatasetMergeFromRelation(\n input: ApplyDatasetMergeFromRelationInput\n): Promise<ApplyDatasetRowsResult> {\n const primaryKeyColumns = getDatasetPrimaryKeyColumns(input.dataset)\n if (primaryKeyColumns === null) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${input.dataset.id}' must define a primaryKey before it can be merged.`\n )\n }\n\n const stagingTable = quoteIdentifier(input.stagingTableName)\n const targetTable = qualifiedTableName(input.options, encodeDatasetTableName(input.dataset.id))\n const sourceRowCount = await countRows(input.runtime, stagingTable)\n const previousRowCount = await currentBaselineRowCount(input, targetTable, primaryKeyColumns)\n\n return withMaterializedFinalChanges(\n input,\n primaryKeyColumns,\n async (finalChanges, orderingChanged) => {\n const effects = await countMergeEffects(input, targetTable, finalChanges, primaryKeyColumns)\n const effectiveChangeCount = effects.inserts + effects.updates + effects.deletes\n\n if (effectiveChangeCount === 0) {\n return {\n dataChangeExpected: orderingChanged,\n sourceRowCount,\n resultingRowCount: { kind: \"exact\", value: previousRowCount },\n }\n }\n\n const keyMatchSql = primaryKeyMatchSql(primaryKeyColumns, \"target\", \"source\")\n const rowDifferenceSql = datasetRowDifferenceSql(input.dataset, \"target\", \"source\")\n const kindColumn = `source.${quoteIdentifier(input.kindColumnName)}`\n\n await input.runtime.run(`\n DELETE FROM ${targetTable} AS target\n USING ${finalChanges} AS source\n WHERE ${keyMatchSql}\n AND (\n ${kindColumn} = ${quoteSqlString(\"delete\")}\n OR (\n ${kindColumn} = ${quoteSqlString(\"upsert\")}\n AND (${rowDifferenceSql})\n )\n )\n `)\n\n const columnsSql = datasetSchemaColumnNamesSql(input.dataset.schema)\n const selectedColumnsSql = input.dataset.schema.columns\n .map((column) => `source.${quoteIdentifier(column.name)}`)\n .join(\", \")\n const firstSequenceColumnName = firstSequenceName(input.sequenceColumnName)\n await input.runtime.run(`\n INSERT INTO ${targetTable} (${columnsSql})\n SELECT ${selectedColumnsSql}\n FROM ${finalChanges} AS source\n WHERE ${kindColumn} = ${quoteSqlString(\"upsert\")}\n AND NOT EXISTS (\n SELECT 1\n FROM ${targetTable} AS target\n WHERE ${keyMatchSql}\n )\n ORDER BY source.${quoteIdentifier(firstSequenceColumnName)}\n `)\n\n return {\n dataChangeExpected: true,\n sourceRowCount,\n resultingRowCount: {\n kind: \"exact\",\n value: previousRowCount + effects.inserts - effects.deletes,\n },\n }\n }\n )\n}\n\n/** The companion table is current state, committed in the same DuckLake transaction as rows.\n * It is not recovered from expirable snapshot history. Only keys present in staging are read.\n */\nasync function applySourceOrdering(\n input: ApplyDatasetMergeFromRelationInput,\n acceptedTable: string\n): Promise<boolean> {\n const source = quoteIdentifier(`${input.sequenceColumnName}_source`)\n const ordinal = quoteIdentifier(input.sequenceColumnName)\n const staging = quoteIdentifier(input.stagingTableName)\n const stateTable = qualifiedTableName(\n input.options,\n encodeDatasetSequenceTableName(input.dataset.id)\n )\n await input.runtime.run(\n `CREATE TEMP TABLE ${acceptedTable} (source_key VARCHAR, ordinal UBIGINT)`\n )\n let lastOrdinal = -1n\n let changed = false\n while (true) {\n const staged = await input.runtime.query(\n `SELECT ${ordinal} AS ordinal, ${source} AS source FROM ${staging}\n WHERE ${ordinal} > ${lastOrdinal} ORDER BY ${ordinal} LIMIT 1000`\n )\n if (staged.length === 0) return changed\n const changes = staged.map(\n (row) => JSON.parse(getString(row, \"source\")) as DatasetSequenceChange\n )\n lastOrdinal = getBigIntLike(staged[staged.length - 1]!, \"ordinal\")\n const batchKeys = changes.map((change) => quoteSqlString(change.key)).join(\",\")\n const current = await input.runtime.query(\n `SELECT * FROM ${stateTable} WHERE source_key IN (${batchKeys})`\n )\n const previous = new Map<string, DatasetSequenceState>()\n for (const row of current) {\n previous.set(getString(row, \"source_key\"), {\n sequence: getString(row, \"sequence\"),\n content: getOptionalString(row, \"content\") ?? null,\n })\n }\n // Earlier batches are visible inside this transaction. A later conflict rolls them all back.\n const { states, accepted } = reconcileDatasetSequences(input.dataset, previous, changes)\n if (accepted.size === 0) continue\n changed = true\n const stateValues: string[] = []\n const acceptedValues: string[] = []\n for (const [key, index] of accepted) {\n const state = states.get(key)!\n stateValues.push(\n `(${quoteSqlString(key)}, ${quoteSqlString(state.sequence)}, ${state.content === null ? \"NULL\" : quoteSqlString(state.content)})`\n )\n acceptedValues.push(`(${quoteSqlString(key)}, ${getBigIntLike(staged[index]!, \"ordinal\")})`)\n }\n const keys = [...accepted.keys()].map(quoteSqlString).join(\",\")\n await input.runtime.run(`DELETE FROM ${stateTable} WHERE source_key IN (${keys})`)\n await input.runtime.run(`INSERT INTO ${stateTable} VALUES ${stateValues.join(\",\")}`)\n await input.runtime.run(`DELETE FROM ${acceptedTable} WHERE source_key IN (${keys})`)\n await input.runtime.run(`INSERT INTO ${acceptedTable} VALUES ${acceptedValues.join(\",\")}`)\n }\n}\n\nasync function currentBaselineRowCount(\n input: ApplyDatasetMergeFromRelationInput,\n targetTable: string,\n primaryKeyColumns: readonly string[]\n): Promise<number> {\n // Sixb writes mark keyed versions only after the write path has enforced uniqueness. Older or\n // external versions carry no marker and keep the full defensive audit.\n if (sameColumns(input.validatedPrimaryKeyColumns, primaryKeyColumns)) {\n return input.previousRowCount ?? countRows(input.runtime, targetTable)\n }\n\n return inspectUniqueKeyedRelation({\n runtime: input.runtime,\n dataset: input.dataset,\n relationSql: targetTable,\n context: \"current baseline\",\n })\n}\n\nasync function withMaterializedFinalChanges<T>(\n input: ApplyDatasetMergeFromRelationInput,\n primaryKeyColumns: readonly string[],\n run: (finalChangesTable: string, orderingChanged: boolean) => Promise<T>\n): Promise<T> {\n const table = quoteIdentifier(`${input.stagingTableName}_final`)\n const acceptedTable = quoteIdentifier(`${input.stagingTableName}_accepted`)\n\n let outcome:\n | { readonly kind: \"success\"; readonly value: T }\n | { readonly kind: \"error\"; readonly error: unknown }\n try {\n const sequenced = input.dataset.sequenceBy !== undefined\n const orderingChanged = sequenced ? await applySourceOrdering(input, acceptedTable) : false\n const ordinal = quoteIdentifier(input.sequenceColumnName)\n const selectSql = sequenced\n ? `SELECT source.*, source.${ordinal} AS ${quoteIdentifier(firstSequenceName(input.sequenceColumnName))}\n FROM ${quoteIdentifier(input.stagingTableName)} AS source\n JOIN ${acceptedTable} AS accepted ON source.${ordinal} = accepted.ordinal`\n : finalChangesSelectSql(input, primaryKeyColumns)\n await input.runtime.run(`CREATE TEMP TABLE ${table} AS ${selectSql}`)\n outcome = { kind: \"success\", value: await run(table, orderingChanged) }\n } catch (error) {\n outcome = { kind: \"error\", error }\n }\n\n try {\n await input.runtime.run(`DROP TABLE IF EXISTS ${table}`)\n await input.runtime.run(`DROP TABLE IF EXISTS ${acceptedTable}`)\n } catch (cleanupError) {\n if (outcome.kind === \"success\") {\n throw cleanupError\n }\n }\n\n if (outcome.kind === \"error\") {\n throw outcome.error\n }\n\n return outcome.value\n}\n\nfunction finalChangesSelectSql(\n input: ApplyDatasetMergeFromRelationInput,\n primaryKeyColumns: readonly string[]\n): string {\n const sequenceColumn = quoteIdentifier(input.sequenceColumnName)\n const keyColumnsSql = primaryKeyColumns.map((column) => quoteIdentifier(column)).join(\", \")\n const rankColumn = quoteIdentifier(rankName(input.sequenceColumnName))\n const firstSequenceColumn = quoteIdentifier(firstSequenceName(input.sequenceColumnName))\n\n return `\n SELECT * EXCLUDE (${rankColumn})\n FROM (\n SELECT\n *,\n min(${sequenceColumn}) OVER (PARTITION BY ${keyColumnsSql}) AS ${firstSequenceColumn},\n row_number() OVER (\n PARTITION BY ${keyColumnsSql}\n ORDER BY ${sequenceColumn} DESC\n ) AS ${rankColumn}\n FROM ${quoteIdentifier(input.stagingTableName)}\n ) ranked_changes\n WHERE ${rankColumn} = 1\n `\n}\n\nasync function countMergeEffects(\n input: ApplyDatasetMergeFromRelationInput,\n targetTable: string,\n finalChanges: string,\n primaryKeyColumns: readonly string[]\n): Promise<MergeEffectCounts> {\n const matchColumn = primaryKeyColumns[0]\n if (matchColumn === undefined) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${input.dataset.id}' primaryKey must contain at least one column.`\n )\n }\n\n const keyMatchSql = primaryKeyMatchSql(primaryKeyColumns, \"target\", \"source\")\n const targetMatch = `target.${quoteIdentifier(matchColumn)} IS NOT NULL`\n const kindColumn = `source.${quoteIdentifier(input.kindColumnName)}`\n const rowDifferenceSql = datasetRowDifferenceSql(input.dataset, \"target\", \"source\")\n const [row] = await input.runtime.query(`\n SELECT\n count(*) FILTER (\n WHERE ${kindColumn} = ${quoteSqlString(\"upsert\")} AND NOT (${targetMatch})\n ) AS insert_count,\n count(*) FILTER (\n WHERE ${kindColumn} = ${quoteSqlString(\"upsert\")}\n AND ${targetMatch}\n AND (${rowDifferenceSql})\n ) AS update_count,\n count(*) FILTER (\n WHERE ${kindColumn} = ${quoteSqlString(\"delete\")} AND ${targetMatch}\n ) AS delete_count\n FROM ${finalChanges} AS source\n LEFT JOIN ${targetTable} AS target ON ${keyMatchSql}\n `)\n\n return {\n inserts: row === undefined ? 0 : Number(getBigIntLike(row, \"insert_count\")),\n updates: row === undefined ? 0 : Number(getBigIntLike(row, \"update_count\")),\n deletes: row === undefined ? 0 : Number(getBigIntLike(row, \"delete_count\")),\n }\n}\n\nfunction primaryKeyMatchSql(\n primaryKeyColumns: readonly string[],\n leftAlias: string,\n rightAlias: string\n): string {\n return primaryKeyColumns\n .map(\n (column) =>\n `${leftAlias}.${quoteIdentifier(column)} = ${rightAlias}.${quoteIdentifier(column)}`\n )\n .join(\" AND \")\n}\n\nfunction datasetRowDifferenceSql(\n dataset: DatasetDefinition,\n leftAlias: string,\n rightAlias: string\n): string {\n return dataset.schema.columns\n .map(\n (column) =>\n `${leftAlias}.${quoteIdentifier(column.name)} IS DISTINCT FROM ${rightAlias}.${quoteIdentifier(\n column.name\n )}`\n )\n .join(\" OR \")\n}\n\nasync function countRows(runtime: DuckDbQueryRuntime, relationSql: string): Promise<number> {\n const [row] = await runtime.query(`SELECT count(*) AS row_count FROM ${relationSql}`)\n return row === undefined ? 0 : Number(getBigIntLike(row, \"row_count\"))\n}\n\nfunction rankName(sequenceColumnName: string): string {\n return `${sequenceColumnName}_rank`\n}\n\nfunction firstSequenceName(sequenceColumnName: string): string {\n return `${sequenceColumnName}_first`\n}\n\nfunction sameColumns(left: readonly string[] | undefined, right: readonly string[]): boolean {\n return (\n left !== undefined &&\n left.length === right.length &&\n left.every((value, index) => value === right[index])\n )\n}\n",
27
+ "import type { DatasetDefinition, DatasetSchema } from \"@sixb/core\"\nimport type {\n DatasetCatalogState,\n DatasetLatestVersionSummary,\n DatasetProducer,\n DatasetVersion,\n DatasetVersionLineage,\n DatasetVersionMode,\n DatasetVersionRef,\n LatestVersionsSince,\n ListLatestVersionsSinceInput,\n} from \"@sixb/core/lake-storage\"\nimport { LakeStorageError } from \"@sixb/core/lake-storage\"\nimport type { DuckLakeStorageOptions } from \"../types\"\nimport { getBigIntLike, getDate, getOptionalString, getString } from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport type { DuckLakeConnectionManager } from \"./ducklake-connection-manager\"\nimport type { DuckLakeDatasetCatalog } from \"./ducklake-dataset-catalog\"\nimport {\n type DatasetTableRef,\n datasetTableIds,\n resolveDatasetTableRef,\n resolveDatasetTableRefAtCurrentSnapshot,\n} from \"./ducklake-dataset-table-ref\"\nimport type { LatestVersionAtSnapshot } from \"./ducklake-version-transaction\"\nimport { decodeLineage } from \"./lineage-encoding\"\nimport {\n decodeDatasetTableName,\n encodeDatasetSequenceTableName,\n encodeDatasetTableName,\n} from \"./names\"\nimport { buildDuckLakeMetadataQuery, duckLakeMetadataTableName, quoteSqlString } from \"./sql\"\nimport {\n changesTouchTables,\n parseCommitMetadata,\n parseTableDataChange,\n parseVersionId,\n type SixbCommitMetadata,\n toVersionId,\n} from \"./versions\"\n\nexport interface DatasetSnapshotRow {\n readonly snapshotId: string\n readonly tableId: bigint\n readonly createdAt: Date\n readonly mode: DatasetVersionMode\n readonly parentSnapshotId?: string\n readonly metadata?: SixbCommitMetadata\n}\n\ninterface DatasetSnapshotCandidateRow {\n readonly snapshotId: string\n readonly createdAt: Date\n readonly changesMade: string\n readonly metadata?: SixbCommitMetadata\n}\n\ninterface FeedTable {\n readonly datasetId: string\n readonly tableId: bigint\n /** A dataset cannot have a version before its table exists. */\n readonly startSnapshotId: bigint\n}\n\ninterface SnapshotCandidateQueryInput {\n readonly table: DatasetTableRef\n readonly exactSnapshotId?: string\n readonly beforeSnapshotId?: string\n readonly limit: number\n}\n\ninterface VisibleSnapshotRowsInput {\n readonly table: DatasetTableRef\n readonly exactSnapshotId?: string\n readonly beforeSnapshotId?: string\n readonly visibleRowLimit?: number\n}\n\n/** A version reference, with the DuckLake table and snapshot it was resolved through. */\nexport interface DuckLakeTableVersionRef extends DatasetVersionRef {\n readonly table: DatasetTableRef\n readonly snapshot: DatasetSnapshotRow\n}\n\n/** What a commit needs of the version it builds on. */\nexport interface DuckLakeVersionSummary {\n readonly datasetId: string\n readonly versionId: string\n readonly schema: DatasetSchema\n readonly producer?: DatasetProducer\n readonly inputs?: readonly DatasetVersionRef[]\n readonly lineage?: DatasetVersionLineage\n readonly rowCount?: number\n readonly validatedPrimaryKeyColumns?: readonly string[]\n}\n\n/** One snapshot row from the shared catalog scan, before per-dataset filtering. */\ninterface CatalogScanSnapshot {\n readonly snapshotId: string\n readonly createdAt: Date\n readonly changesMade: string\n}\n\nconst SNAPSHOT_ROW_BATCH_SIZE = 128\n// One feed read covers at most this many commits; the next read continues from its cursor.\nconst FEED_PAGE_SIZE = 512\n\n// A read of the latest version, or of the one before a version, usually finds it among the\n// dataset's most recent snapshots. It first reads only a few of them: each carries the commit\n// metadata of its version, whose lineage may be large.\nconst SHORT_READ_BATCH_SIZE = 8\n\n// The bulk catalog scan shares one descending walk of recent snapshots across\n// all requested datasets, so its cost is bounded by this window rather than by\n// the dataset count. A dataset whose latest version is older than the window\n// reports a null latest version, which is acceptable for a catalog summary; the\n// detail routes still hydrate exact history.\nconst CATALOG_SNAPSHOT_SCAN_LIMIT = 512\n\n/**\n * Reconstructs Sixb DatasetVersion objects from DuckLake snapshots.\n *\n * DuckLake remains the source of truth for version ids, commit times, and\n * historical reads. Sixb commit metadata only hydrates fields DuckLake does\n * not know about, such as producer info and declared inputs.\n *\n * This class intentionally reads DuckLake metadata directly. The provider does\n * not keep a Sixb side table for versions; a Sixb version is a DuckLake\n * snapshot whose `changes_made` names the dataset table: one that changed its\n * rows, or that altered the table with Sixb commit metadata naming the dataset,\n * as a version that changes no rows does (see the write coordinator's\n * `claimTable`).\n *\n * DuckLake names a table in `changes_made` for every change to its rows, inlined\n * or written to files, so version reads never scan the catalog's file tables.\n */\nexport class DuckLakeSnapshotReader {\n constructor(\n private readonly options: DuckLakeStorageOptions,\n private readonly connections: DuckLakeConnectionManager,\n private readonly datasets: DuckLakeDatasetCatalog\n ) {}\n\n async listVersions(datasetId: string, limit?: number): Promise<readonly DatasetVersion[]> {\n this.connections.assertOpen()\n\n return this.connections.withAttachedRuntime(async (runtime) => {\n const tableRef = await resolveDatasetTableRef(this.options, runtime, datasetId)\n if (!tableRef) {\n return []\n }\n\n return this.listVersionsForTableRef(runtime, tableRef, limit)\n })\n }\n\n async getLatestVersion(datasetId: string): Promise<DatasetVersion | null> {\n this.connections.assertOpen()\n\n return this.connections.withAttachedRuntime(async (runtime) => {\n const tableRef = await resolveDatasetTableRef(this.options, runtime, datasetId)\n if (!tableRef) {\n return null\n }\n\n return this.getLatestVersionForTableRef(runtime, tableRef)\n })\n }\n\n async getVersion(datasetId: string, versionId: string): Promise<DatasetVersion | null> {\n const snapshotId = parseVersionId(versionId)\n this.connections.assertOpen()\n\n return this.connections.withAttachedRuntime(async (runtime) => {\n const tableRef = await resolveDatasetTableRef(this.options, runtime, datasetId)\n if (!tableRef) {\n return null\n }\n\n return this.getVersionForTableRef(runtime, tableRef, snapshotId)\n })\n }\n\n /**\n * Bulk catalog-summary read used by the dataset list view.\n *\n * Resolves materialized state and a lightweight latest-version summary for\n * many datasets with a bounded number of metadata queries, never one snapshot\n * scan per dataset and never a count(*) over dataset contents.\n */\n async listDatasetCatalogState(\n datasetIds: readonly string[]\n ): Promise<readonly DatasetCatalogState[]> {\n this.connections.assertOpen()\n\n if (datasetIds.length === 0) {\n return []\n }\n\n return this.connections.withAttachedRuntime((runtime) =>\n this.collectDatasetCatalogState(runtime, datasetIds)\n )\n }\n\n private async collectDatasetCatalogState(\n runtime: DuckDbQueryRuntime,\n datasetIds: readonly string[]\n ): Promise<readonly DatasetCatalogState[]> {\n const uniqueIds = [...new Set(datasetIds)]\n const tablesByDatasetId = await this.resolveDatasetTables(runtime, uniqueIds)\n const latestRowByDatasetId = await this.resolveLatestSnapshotRows(runtime, tablesByDatasetId)\n\n return uniqueIds.map((datasetId) => {\n if (!tablesByDatasetId.has(datasetId)) {\n return { datasetId, materialized: false, latestVersion: null }\n }\n\n const row = latestRowByDatasetId.get(datasetId)\n return {\n datasetId,\n materialized: true,\n latestVersion: row ? this.snapshotRowToSummary(datasetId, row) : null,\n }\n })\n }\n\n /**\n * Change feed over DuckLake's snapshot table, which is an append-only commit log: snapshot ids\n * only increase, and a commit becomes visible only after every lower id has (concurrent commits\n * that pick the same id conflict, and the loser retries with the next one). The cursor is the\n * last snapshot id read. Every query is bounded by a snapshot-id range, so an idle read is one\n * indexed query that returns the cursor's own snapshot, whatever the history length.\n */\n async listLatestVersionsSince(\n input: ListLatestVersionsSinceInput\n ): Promise<LatestVersionsSince | null> {\n this.connections.assertOpen()\n\n return this.connections.withAttachedRuntime(async (runtime) => {\n if (input.cursor === null) {\n return { cursor: await this.queryHeadSnapshotId(runtime), versions: [] }\n }\n if (!/^\\d+$/.test(input.cursor)) {\n return null\n }\n\n const snapshots = await this.querySnapshotsFrom(runtime, input.cursor)\n // The cursor's own snapshot proves the cursor is still a position in this lake's history.\n if (snapshots[0]?.snapshotId !== input.cursor) {\n return null\n }\n const newSnapshots = snapshots.slice(1)\n if (newSnapshots.length === 0) {\n return { cursor: input.cursor, versions: [] }\n }\n\n const tables = await this.resolveFeedTables(runtime, input.datasetIds)\n const latest = await this.collectFeedPage(runtime, tables, newSnapshots)\n return {\n cursor: newSnapshots[newSnapshots.length - 1]?.snapshotId ?? input.cursor,\n versions: [...latest].map(([datasetId, row]) => this.snapshotRowToSummary(datasetId, row)),\n }\n })\n }\n\n private async queryHeadSnapshotId(runtime: DuckDbQueryRuntime): Promise<string> {\n const [row] = await runtime.query(\n buildDuckLakeMetadataQuery(\n this.options,\n (table) => `SELECT max(snapshot_id) AS snapshot_id FROM ${table(\"ducklake_snapshot\")}`\n )\n )\n if (row?.snapshot_id === null || row?.snapshot_id === undefined) {\n throw new LakeStorageError(\"[SixbDuckLake] DuckLake catalog has no snapshots.\")\n }\n return String(getBigIntLike(row, \"snapshot_id\"))\n }\n\n /** The cursor's snapshot and up to one feed page of snapshots after it, oldest first. */\n private async querySnapshotsFrom(\n runtime: DuckDbQueryRuntime,\n cursor: string\n ): Promise<readonly { readonly snapshotId: string; readonly createdAt: Date }[]> {\n const rows = await runtime.query(\n buildDuckLakeMetadataQuery(\n this.options,\n (table) => `\n SELECT snapshot_id, snapshot_time\n FROM ${table(\"ducklake_snapshot\")}\n WHERE snapshot_id >= ${cursor}\n ORDER BY snapshot_id\n LIMIT ${FEED_PAGE_SIZE + 1}\n `\n )\n )\n return rows.map((row) => ({\n snapshotId: String(getBigIntLike(row, \"snapshot_id\")),\n createdAt: getDate(row, \"snapshot_time\"),\n }))\n }\n\n /** Current dataset tables, with the first snapshot each table id existed in. */\n private async resolveFeedTables(\n runtime: DuckDbQueryRuntime,\n datasetIds: readonly string[] | undefined\n ): Promise<readonly FeedTable[]> {\n const requested = datasetIds === undefined ? null : new Set(datasetIds)\n const rows = await runtime.query(`\n SELECT table_id, table_name, begin_snapshot, end_snapshot\n FROM ${duckLakeMetadataTableName(this.options, \"ducklake_table\")}\n `)\n\n const startByTableId = new Map<bigint, bigint>()\n const current: { datasetId: string; tableId: bigint }[] = []\n for (const row of rows) {\n const tableId = getBigIntLike(row, \"table_id\")\n const begin = getBigIntLike(row, \"begin_snapshot\")\n const start = startByTableId.get(tableId)\n if (start === undefined || begin < start) {\n startByTableId.set(tableId, begin)\n }\n if (row.end_snapshot !== null && row.end_snapshot !== undefined) {\n continue\n }\n const datasetId = decodeDatasetTableName(getString(row, \"table_name\"))\n if (datasetId !== null && (requested === null || requested.has(datasetId))) {\n current.push({ datasetId, tableId })\n }\n }\n\n return current.map((table) => ({\n ...table,\n startSnapshotId: startByTableId.get(table.tableId) ?? 0n,\n }))\n }\n\n /** Folds a page of snapshots, oldest first, into each dataset's newest data version. */\n private async collectFeedPage(\n runtime: DuckDbQueryRuntime,\n tables: readonly FeedTable[],\n snapshots: readonly { readonly snapshotId: string; readonly createdAt: Date }[]\n ): Promise<Map<string, DatasetSnapshotRow>> {\n const latest = new Map<string, DatasetSnapshotRow>()\n const first = snapshots[0]?.snapshotId\n const last = snapshots[snapshots.length - 1]?.snapshotId\n if (first === undefined || last === undefined || tables.length === 0) {\n return latest\n }\n\n const changeRows = await runtime.query(\n buildDuckLakeMetadataQuery(\n this.options,\n (table) => `\n SELECT snapshot_id, changes_made, commit_extra_info\n FROM ${table(\"ducklake_snapshot_changes\")}\n WHERE snapshot_id >= ${first} AND snapshot_id <= ${last}\n `\n )\n )\n const changesBySnapshotId = new Map(\n changeRows.map((row) => [String(getBigIntLike(row, \"snapshot_id\")), row])\n )\n const tablesByTableId = new Map(tables.map((table) => [table.tableId.toString(), table]))\n\n for (const snapshot of snapshots) {\n const changes = changesBySnapshotId.get(snapshot.snapshotId)\n if (changes === undefined) {\n continue\n }\n const changesMade = getString(changes, \"changes_made\")\n const metadata = parseCommitMetadata(changes.commit_extra_info)\n\n // Only the tables this snapshot names can have a version in it.\n const touched = new Set<FeedTable>()\n for (const change of changesMade.split(\",\")) {\n const table = tablesByTableId.get(change.split(\":\")[1] ?? \"\")\n if (table) touched.add(table)\n }\n\n for (const table of touched) {\n if (BigInt(snapshot.snapshotId) < table.startSnapshotId) {\n continue\n }\n const row = this.candidateToSnapshotRow(table.datasetId, table.tableId, {\n snapshotId: snapshot.snapshotId,\n createdAt: snapshot.createdAt,\n changesMade,\n ...(metadata !== undefined ? { metadata } : {}),\n })\n if (row && row.mode !== \"schema\") {\n latest.set(table.datasetId, row)\n }\n }\n }\n\n return latest\n }\n\n /**\n * The snapshot of every dataset's latest version, however old, from one shared walk down the\n * whole history: maintenance must never expire one.\n */\n async latestVersionSnapshotIds(runtime: DuckDbQueryRuntime): Promise<readonly string[]> {\n const tables = await runtime.query(`\n SELECT table_name\n FROM ${duckLakeMetadataTableName(this.options, \"ducklake_table\")}\n WHERE end_snapshot IS NULL\n `)\n const datasetIds = tables.flatMap((table) => {\n const datasetId = decodeDatasetTableName(getString(table, \"table_name\"))\n return datasetId === null ? [] : [datasetId]\n })\n\n if (datasetIds.length === 0) {\n return []\n }\n\n const latest = await this.resolveLatestSnapshotRows(\n runtime,\n await this.resolveDatasetTables(runtime, datasetIds),\n Number.POSITIVE_INFINITY\n )\n return [...latest.values()].map((row) => row.snapshotId)\n }\n\n private snapshotRowToSummary(\n datasetId: string,\n row: DatasetSnapshotRow\n ): DatasetLatestVersionSummary {\n return {\n datasetId,\n versionId: toVersionId(row.snapshotId),\n mode: row.mode,\n createdAt: row.createdAt,\n ...(row.metadata?.rowCount !== undefined ? { rowCount: row.metadata.rowCount } : {}),\n }\n }\n\n private async resolveDatasetTables(\n runtime: DuckDbQueryRuntime,\n datasetIds: readonly string[]\n ): Promise<Map<string, DatasetTableRef>> {\n // Encoded table names are a collision-free bijection with dataset ids, so a\n // single `ducklake_table` read maps every requested id to its current tables.\n const datasetIdByTableName = new Map<string, string>()\n const datasetIdBySequenceTableName = new Map<string, string>()\n for (const datasetId of datasetIds) {\n datasetIdByTableName.set(encodeDatasetTableName(datasetId), datasetId)\n datasetIdBySequenceTableName.set(encodeDatasetSequenceTableName(datasetId), datasetId)\n }\n\n const ducklakeTable = duckLakeMetadataTableName(this.options, \"ducklake_table\")\n const tableNameList = [...datasetIdByTableName.keys(), ...datasetIdBySequenceTableName.keys()]\n .map((name) => quoteSqlString(name))\n .join(\", \")\n const rows = await runtime.query(`\n SELECT table_id, table_name\n FROM ${ducklakeTable}\n WHERE table_name IN (${tableNameList})\n AND end_snapshot IS NULL\n `)\n\n const tablesByDatasetId = new Map<string, DatasetTableRef>()\n for (const row of rows) {\n const tableName = getString(row, \"table_name\")\n const datasetId = datasetIdByTableName.get(tableName)\n if (datasetId !== undefined) {\n tablesByDatasetId.set(datasetId, {\n datasetId,\n tableName,\n tableId: getBigIntLike(row, \"table_id\"),\n })\n }\n }\n\n for (const row of rows) {\n const datasetId = datasetIdBySequenceTableName.get(getString(row, \"table_name\"))\n const table = datasetId === undefined ? undefined : tablesByDatasetId.get(datasetId)\n if (datasetId !== undefined && table !== undefined) {\n tablesByDatasetId.set(datasetId, {\n ...table,\n sequenceTableId: getBigIntLike(row, \"table_id\"),\n })\n }\n }\n\n return tablesByDatasetId\n }\n\n /**\n * Resolve each dataset's latest snapshot row with one shared descending walk.\n *\n * The walk reuses {@link candidateToSnapshotRow} so Sixb visibility, mode\n * derivation, and the loud conflict rule match exact version hydration. Cost\n * is bounded by the snapshot window, not by the number of datasets.\n */\n private async resolveLatestSnapshotRows(\n runtime: DuckDbQueryRuntime,\n tablesByDatasetId: ReadonlyMap<string, DatasetTableRef>,\n scanLimit = CATALOG_SNAPSHOT_SCAN_LIMIT\n ): Promise<Map<string, DatasetSnapshotRow>> {\n const result = new Map<string, DatasetSnapshotRow>()\n if (tablesByDatasetId.size === 0) {\n return result\n }\n\n const unresolved = new Map<string, DatasetTableRef>(tablesByDatasetId)\n\n let beforeSnapshotId: string | undefined\n let scanned = 0\n while (unresolved.size > 0 && scanned < scanLimit) {\n const candidates = await this.queryCatalogSnapshotBatch(\n runtime,\n beforeSnapshotId,\n SNAPSHOT_ROW_BATCH_SIZE\n )\n if (candidates.length === 0) {\n break\n }\n\n const tables = [...unresolved.values()]\n const metadata = await this.readCommitMetadata(\n runtime,\n candidates\n .filter((candidate) =>\n tables.some((table) =>\n changesTouchTables(candidate.changesMade, datasetTableIds(table))\n )\n )\n .map((candidate) => candidate.snapshotId)\n )\n\n for (const candidate of candidates) {\n scanned += 1\n const candidateMetadata = metadata.get(candidate.snapshotId)\n for (const [datasetId, table] of [...unresolved]) {\n const row = this.candidateToSnapshotRow(datasetId, table.tableId, {\n snapshotId: candidate.snapshotId,\n createdAt: candidate.createdAt,\n changesMade: candidate.changesMade,\n ...(candidateMetadata !== undefined ? { metadata: candidateMetadata } : {}),\n })\n if (row) {\n result.set(datasetId, row)\n unresolved.delete(datasetId)\n }\n }\n\n if (unresolved.size === 0) {\n break\n }\n }\n\n if (candidates.length < SNAPSHOT_ROW_BATCH_SIZE) {\n break\n }\n beforeSnapshotId = candidates[candidates.length - 1]?.snapshotId\n }\n\n return result\n }\n\n private async queryCatalogSnapshotBatch(\n runtime: DuckDbQueryRuntime,\n beforeSnapshotId: string | undefined,\n limit: number\n ): Promise<readonly CatalogScanSnapshot[]> {\n const ducklakeSnapshot = duckLakeMetadataTableName(this.options, \"ducklake_snapshot\")\n const ducklakeSnapshotChanges = duckLakeMetadataTableName(\n this.options,\n \"ducklake_snapshot_changes\"\n )\n\n let whereSql = \"\"\n if (beforeSnapshotId !== undefined) {\n assertDuckLakeSnapshotId(beforeSnapshotId)\n whereSql = `WHERE snapshot.snapshot_id < ${beforeSnapshotId}`\n }\n\n const rows = await runtime.query(`\n SELECT\n snapshot.snapshot_id,\n snapshot.snapshot_time,\n changes.changes_made\n FROM ${ducklakeSnapshot} snapshot\n JOIN ${ducklakeSnapshotChanges} changes ON changes.snapshot_id = snapshot.snapshot_id\n ${whereSql}\n ORDER BY snapshot.snapshot_id DESC\n LIMIT ${Math.max(0, Math.trunc(limit))}\n `)\n\n return rows.map((row) => ({\n snapshotId: String(getBigIntLike(row, \"snapshot_id\")),\n createdAt: getDate(row, \"snapshot_time\"),\n changesMade: getString(row, \"changes_made\"),\n }))\n }\n\n private assertNoMetadataConflict(\n snapshotId: string,\n datasetId: string,\n metadata: SixbCommitMetadata | undefined\n ): void {\n if (metadata !== undefined && metadata.datasetId !== datasetId) {\n throw new LakeStorageError(\n `[SixbDuckLake] DuckLake snapshot '${snapshotId}' changed dataset '${datasetId}' but Sixb commit metadata references dataset '${metadata.datasetId}'.`\n )\n }\n }\n\n async getLatestVersionForDefinition(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition\n ): Promise<DatasetVersion | null> {\n const tableRef = await resolveDatasetTableRef(this.options, runtime, dataset.id)\n return tableRef ? this.getLatestVersionForTableRef(runtime, tableRef) : null\n }\n\n async getLatestVersionRefForDefinition(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition\n ): Promise<DuckLakeTableVersionRef | null> {\n const tableRef = await resolveDatasetTableRef(this.options, runtime, dataset.id)\n if (!tableRef) {\n return null\n }\n\n const row = await this.getLatestSnapshotRowForTableRef(runtime, tableRef)\n return row ? tableVersionRef(tableRef, row) : null\n }\n\n async getLatestVersionSummaryForDefinition(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition\n ): Promise<DuckLakeVersionSummary | null> {\n const tableRef = await resolveDatasetTableRef(this.options, runtime, dataset.id)\n return tableRef ? this.getLatestVersionSummaryForTableRef(runtime, tableRef) : null\n }\n\n /**\n * The latest version a commit builds on, with the lake's snapshot it was read at. Its first\n * read fixes the snapshot of a transaction it runs in (see `beginTransactionOnLatestVersion`).\n */\n async getLatestVersionSummaryAtCurrentSnapshot(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition\n ): Promise<LatestVersionAtSnapshot<DuckLakeVersionSummary>> {\n const { snapshotId, table } = await resolveDatasetTableRefAtCurrentSnapshot(\n this.options,\n runtime,\n dataset.id\n )\n\n return {\n snapshotId,\n latestVersion: table ? await this.getLatestVersionSummaryForTableRef(runtime, table) : null,\n }\n }\n\n private async getLatestVersionSummaryForTableRef(\n runtime: DuckDbQueryRuntime,\n tableRef: DatasetTableRef\n ): Promise<DuckLakeVersionSummary | null> {\n const row = await this.getLatestSnapshotRowForTableRef(runtime, tableRef)\n if (!row) {\n return null\n }\n\n const [schema] = await this.datasets.getDatasetSchemasAtSnapshots(runtime, [\n { table: tableRef, snapshotId: row.snapshotId },\n ])\n\n return {\n datasetId: tableRef.datasetId,\n versionId: toVersionId(row.snapshotId),\n schema,\n producer: row.metadata?.producer,\n inputs: row.metadata?.inputs,\n ...storedLineage(tableRef.datasetId, row),\n ...(row.metadata?.rowCount !== undefined ? { rowCount: row.metadata.rowCount } : {}),\n ...(row.metadata?.validatedPrimaryKeyColumns !== undefined\n ? { validatedPrimaryKeyColumns: row.metadata.validatedPrimaryKeyColumns }\n : {}),\n }\n }\n\n async getVersionForSnapshot(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition,\n snapshotId: string\n ): Promise<DatasetVersion | null> {\n assertDuckLakeSnapshotId(snapshotId)\n\n const tableRef = await resolveDatasetTableRef(this.options, runtime, dataset.id)\n return tableRef ? this.getVersionForTableRef(runtime, tableRef, snapshotId) : null\n }\n\n async getVersionForTableRef(\n runtime: DuckDbQueryRuntime,\n tableRef: DatasetTableRef,\n snapshotId: string\n ): Promise<DatasetVersion | null> {\n const match = await this.getSnapshotRowForTableRef(runtime, tableRef, snapshotId, {\n includeParent: true,\n })\n return match ? (await this.snapshotsToVersions(runtime, tableRef, [match]))[0] : null\n }\n\n async getVersionRefForSnapshot(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition,\n snapshotId: string\n ): Promise<DuckLakeTableVersionRef | null> {\n assertDuckLakeSnapshotId(snapshotId)\n\n const tableRef = await resolveDatasetTableRef(this.options, runtime, dataset.id)\n if (!tableRef) {\n return null\n }\n\n const row = await this.getSnapshotRowForTableRef(runtime, tableRef, snapshotId, {\n includeParent: false,\n })\n return row ? tableVersionRef(tableRef, row) : null\n }\n\n /**\n * The versions resolved refs point to, with their schemas from one catalog read. Refs resolve\n * without their parent, so these versions carry no `parentVersionId`.\n */\n async getVersionsForRefs(\n runtime: DuckDbQueryRuntime,\n refs: readonly DuckLakeTableVersionRef[]\n ): Promise<DatasetVersion[]> {\n const schemas = await this.datasets.getDatasetSchemasAtSnapshots(\n runtime,\n refs.map((ref) => ({ table: ref.table, snapshotId: ref.snapshot.snapshotId }))\n )\n\n return refs.map((ref, index) => snapshotToVersion(ref.table, ref.snapshot, schemas[index]))\n }\n\n async listVersionsForDefinition(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition,\n limit?: number\n ): Promise<readonly DatasetVersion[]> {\n const tableRef = await resolveDatasetTableRef(this.options, runtime, dataset.id)\n return tableRef ? this.listVersionsForTableRef(runtime, tableRef, limit) : []\n }\n\n private async listVersionsForTableRef(\n runtime: DuckDbQueryRuntime,\n tableRef: DatasetTableRef,\n limit?: number\n ): Promise<readonly DatasetVersion[]> {\n const limitedRows = await this.getSnapshotRowsForTableRef(runtime, tableRef, limit)\n return this.snapshotsToVersions(runtime, tableRef, limitedRows)\n }\n\n async getLatestVersionForTableRef(\n runtime: DuckDbQueryRuntime,\n tableRef: DatasetTableRef\n ): Promise<DatasetVersion | null> {\n const [latest] = await this.listVersionsForTableRef(runtime, tableRef, 1)\n return latest ?? null\n }\n\n private async getLatestSnapshotRowForTableRef(\n runtime: DuckDbQueryRuntime,\n tableRef: DatasetTableRef\n ): Promise<DatasetSnapshotRow | null> {\n const [row] = await this.collectVisibleSnapshotRows(runtime, {\n table: tableRef,\n visibleRowLimit: 1,\n })\n return row ?? null\n }\n\n private async getSnapshotRowForTableRef(\n runtime: DuckDbQueryRuntime,\n tableRef: DatasetTableRef,\n snapshotId: string,\n options: { readonly includeParent: boolean }\n ): Promise<DatasetSnapshotRow | null> {\n assertDuckLakeSnapshotId(snapshotId)\n\n const [row] = await this.collectVisibleSnapshotRows(runtime, {\n table: tableRef,\n exactSnapshotId: snapshotId,\n visibleRowLimit: 1,\n })\n if (!row) {\n return null\n }\n\n if (\n !options.includeParent ||\n (row.mode !== \"append\" && row.mode !== \"merge\" && row.mode !== \"schema\")\n ) {\n return row\n }\n\n const [parent] = await this.collectVisibleSnapshotRows(runtime, {\n table: tableRef,\n beforeSnapshotId: snapshotId,\n visibleRowLimit: 1,\n })\n\n return parent ? { ...row, parentSnapshotId: parent.snapshotId } : row\n }\n\n private async getSnapshotRowsForTableRef(\n runtime: DuckDbQueryRuntime,\n tableRef: DatasetTableRef,\n limit?: number\n ): Promise<readonly DatasetSnapshotRow[]> {\n const visibleLimit = limit === undefined ? undefined : Math.max(0, limit)\n if (visibleLimit === 0) {\n return []\n }\n\n const rows = await this.collectVisibleSnapshotRows(runtime, {\n table: tableRef,\n visibleRowLimit: visibleLimit === undefined ? undefined : visibleLimit + 1,\n })\n const rowsWithParents = this.withParentSnapshotIds(rows)\n return visibleLimit === undefined ? rowsWithParents : rowsWithParents.slice(0, visibleLimit)\n }\n\n private async collectVisibleSnapshotRows(\n runtime: DuckDbQueryRuntime,\n input: VisibleSnapshotRowsInput\n ): Promise<readonly DatasetSnapshotRow[]> {\n if (input.visibleRowLimit !== undefined && input.visibleRowLimit <= 0) {\n return []\n }\n\n const snapshots: DatasetSnapshotRow[] = []\n let beforeSnapshotId = input.beforeSnapshotId\n let shortRead =\n input.exactSnapshotId !== undefined ||\n (input.visibleRowLimit !== undefined && input.visibleRowLimit <= 2)\n\n while (input.visibleRowLimit === undefined || snapshots.length < input.visibleRowLimit) {\n const batchSize = shortRead ? SHORT_READ_BATCH_SIZE : SNAPSHOT_ROW_BATCH_SIZE\n const candidates = await this.querySnapshotCandidates(runtime, {\n table: input.table,\n exactSnapshotId: input.exactSnapshotId,\n beforeSnapshotId,\n limit: input.exactSnapshotId === undefined ? batchSize : 1,\n })\n shortRead = false\n if (candidates.length === 0) {\n break\n }\n\n for (const candidate of candidates) {\n const snapshot = this.candidateToSnapshotRow(\n input.table.datasetId,\n input.table.tableId,\n candidate\n )\n if (snapshot) {\n snapshots.push(snapshot)\n }\n\n if (input.visibleRowLimit !== undefined && snapshots.length >= input.visibleRowLimit) {\n break\n }\n }\n\n if (input.exactSnapshotId !== undefined || candidates.length < batchSize) {\n break\n }\n\n beforeSnapshotId = candidates[candidates.length - 1]?.snapshotId\n }\n\n return snapshots\n }\n\n /**\n * Hydrates, newest first, the snapshots whose changes name one of the dataset's tables: every\n * snapshot that may hold one of its versions. The text match is a superset;\n * candidateToSnapshotRow decides visibility.\n *\n * The query walks the catalog's snapshot ids downwards, from `beforeSnapshotId` or the head,\n * and stops at the limit or at the table's creation. A lookup therefore reads the snapshots\n * between where it starts and the versions it returns: a few for an active dataset, at most the\n * table's lifetime for one written long ago. It never reads the file tables, whose replaced\n * files stay until cleanup.\n */\n private async querySnapshotCandidates(\n runtime: DuckDbQueryRuntime,\n input: SnapshotCandidateQueryInput\n ): Promise<readonly DatasetSnapshotCandidateRow[]> {\n const limit = Math.max(0, Math.trunc(input.limit))\n if (limit === 0) {\n return []\n }\n if (input.exactSnapshotId !== undefined) {\n assertDuckLakeSnapshotId(input.exactSnapshotId)\n }\n if (input.beforeSnapshotId !== undefined) {\n assertDuckLakeSnapshotId(input.beforeSnapshotId)\n }\n\n const rows = await runtime.query(\n buildDuckLakeMetadataQuery(this.options, (table) => {\n // A dataset cannot have a version before its table exists. Use the earliest table record:\n // a rename may create a newer record with the same table id and must not hide older\n // versions.\n const bounds = [\n `changes.snapshot_id >= (\n SELECT min(begin_snapshot)\n FROM ${table(\"ducklake_table\")}\n WHERE table_id = ${input.table.tableId}\n )`,\n ]\n if (input.exactSnapshotId !== undefined) {\n bounds.push(`changes.snapshot_id = ${input.exactSnapshotId}`)\n }\n if (input.beforeSnapshotId !== undefined) {\n bounds.push(`changes.snapshot_id < ${input.beforeSnapshotId}`)\n }\n\n const namesDatasetTable = datasetTableIds(input.table)\n .map(\n (tableId) =>\n `strpos(',' || changes.changes_made || ',', ${quoteSqlString(`:${tableId},`)}) > 0`\n )\n .join(\" OR \")\n\n // Bounds and order follow the snapshot-id primary key, so PostgreSQL reads it backwards\n // and stops at the limit; the text match only filters the rows it passes.\n return `\n SELECT\n changes.snapshot_id,\n snapshot.snapshot_time,\n changes.changes_made,\n changes.commit_extra_info\n FROM ${table(\"ducklake_snapshot_changes\")} changes\n JOIN ${table(\"ducklake_snapshot\")} snapshot\n ON snapshot.snapshot_id = changes.snapshot_id\n WHERE ${bounds.join(\" AND \")}\n AND (${namesDatasetTable})\n ORDER BY changes.snapshot_id DESC\n LIMIT ${limit}\n `\n })\n )\n\n return rows.map((row) => {\n const metadata = parseCommitMetadata(row.commit_extra_info)\n\n return {\n snapshotId: String(getBigIntLike(row, \"snapshot_id\")),\n createdAt: getDate(row, \"snapshot_time\"),\n changesMade: getString(row, \"changes_made\"),\n ...(metadata !== undefined ? { metadata } : {}),\n }\n })\n }\n\n /**\n * Sixb commit metadata of the snapshots that changed a scanned dataset. Each one carries the\n * lineage of its version, which can be large: scans read it only for the snapshots they keep,\n * never for the other datasets' snapshots they page past.\n */\n private async readCommitMetadata(\n runtime: DuckDbQueryRuntime,\n snapshotIds: readonly string[]\n ): Promise<Map<string, SixbCommitMetadata>> {\n const metadata = new Map<string, SixbCommitMetadata>()\n if (snapshotIds.length === 0) {\n return metadata\n }\n\n for (const snapshotId of snapshotIds) {\n assertDuckLakeSnapshotId(snapshotId)\n }\n\n const ducklakeSnapshotChanges = duckLakeMetadataTableName(\n this.options,\n \"ducklake_snapshot_changes\"\n )\n const rows = await runtime.query(`\n SELECT snapshot_id, commit_extra_info\n FROM ${ducklakeSnapshotChanges}\n WHERE snapshot_id IN (${snapshotIds.join(\", \")})\n `)\n\n for (const row of rows) {\n const parsed = parseCommitMetadata(getOptionalString(row, \"commit_extra_info\"))\n if (parsed !== undefined) {\n metadata.set(String(getBigIntLike(row, \"snapshot_id\")), parsed)\n }\n }\n\n return metadata\n }\n\n private candidateToSnapshotRow(\n datasetId: string,\n tableId: bigint,\n candidate: DatasetSnapshotCandidateRow\n ): DatasetSnapshotRow | null {\n const { hasDataChange, hasDeleteChange } = parseTableDataChange(candidate.changesMade, tableId)\n\n // Metadata-only snapshots are common for table comments, schema changes,\n // and other catalog operations. Treat them as dataset versions only when\n // their Sixb metadata names this dataset.\n if (!hasDataChange) {\n const metadata = candidate.metadata\n if (!metadata || metadata.datasetId !== datasetId) {\n return null\n }\n\n return {\n snapshotId: candidate.snapshotId,\n tableId,\n createdAt: candidate.createdAt,\n mode: metadata.mode ?? \"schema\",\n metadata,\n }\n }\n\n // A real data-change snapshot belongs to this dataset because DuckLake's\n // change metadata touched this table id. If Sixb metadata is present but\n // points elsewhere, fail loudly rather than hydrating the wrong lineage.\n this.assertNoMetadataConflict(candidate.snapshotId, datasetId, candidate.metadata)\n\n return {\n snapshotId: candidate.snapshotId,\n tableId,\n createdAt: candidate.createdAt,\n mode: candidate.metadata?.mode ?? (hasDeleteChange ? \"snapshot\" : \"append\"),\n ...(candidate.metadata !== undefined ? { metadata: candidate.metadata } : {}),\n }\n }\n\n /** One catalog read for the schemas of every listed version, not one per version. */\n private async snapshotsToVersions(\n runtime: DuckDbQueryRuntime,\n tableRef: DatasetTableRef,\n rows: readonly DatasetSnapshotRow[]\n ): Promise<DatasetVersion[]> {\n const schemas = await this.datasets.getDatasetSchemasAtSnapshots(\n runtime,\n rows.map((row) => ({ table: tableRef, snapshotId: row.snapshotId }))\n )\n return rows.map((row, index) => snapshotToVersion(tableRef, row, schemas[index]))\n }\n\n private withParentSnapshotIds(\n snapshots: readonly DatasetSnapshotRow[]\n ): readonly DatasetSnapshotRow[] {\n return snapshots.map((snapshot, index) => {\n // Parent ids track versions that reuse the previous dataset state.\n // Snapshot versions replace the rows, so time travel stands on the snapshot id.\n const parentSnapshotId =\n snapshot.mode === \"append\" || snapshot.mode === \"merge\" || snapshot.mode === \"schema\"\n ? snapshots[index + 1]?.snapshotId\n : undefined\n return parentSnapshotId === undefined ? snapshot : { ...snapshot, parentSnapshotId }\n })\n }\n}\n\nfunction snapshotToVersion(\n tableRef: DatasetTableRef,\n row: DatasetSnapshotRow,\n schema: DatasetVersion[\"schema\"]\n): DatasetVersion {\n // DuckLake gives us version id, timestamp, and time travel. Sixb metadata\n // fills in caller intent such as append vs snapshot and producer lineage.\n // Version listing is a metadata path, so it only carries row counts already\n // stored in Sixb commit metadata and never counts historical table contents.\n\n return {\n datasetId: tableRef.datasetId,\n versionId: toVersionId(row.snapshotId),\n parentVersionId:\n row.parentSnapshotId === undefined ? undefined : toVersionId(row.parentSnapshotId),\n mode: row.mode,\n createdAt: row.createdAt,\n schema,\n producer: row.metadata?.producer,\n inputs: row.metadata?.inputs,\n ...storedLineage(tableRef.datasetId, row),\n ...(row.metadata?.rowCount !== undefined ? { rowCount: row.metadata.rowCount } : {}),\n }\n}\n\n/**\n * A data snapshot without Sixb metadata was written outside Sixb, by any DuckLake client. It may\n * keep rows of its parent whatever change it made, and nothing says where its own rows come from:\n * its lineage is unknown.\n */\nfunction storedLineage(\n datasetId: string,\n row: DatasetSnapshotRow\n): Pick<DatasetVersion, \"lineage\"> {\n const metadata = row.metadata\n if (metadata === undefined) {\n return {\n lineage: {\n unknown: `version '${toVersionId(row.snapshotId)}' of '${datasetId}' was written outside Sixb`,\n },\n }\n }\n\n return metadata.lineage === undefined\n ? {}\n : { lineage: decodeLineage(metadata.datasetId, metadata.lineage) }\n}\n\nfunction tableVersionRef(\n table: DatasetTableRef,\n snapshot: DatasetSnapshotRow\n): DuckLakeTableVersionRef {\n return {\n datasetId: table.datasetId,\n versionId: toVersionId(snapshot.snapshotId),\n table,\n snapshot,\n }\n}\n\nfunction assertDuckLakeSnapshotId(snapshotId: string): void {\n if (!/^\\d+$/.test(snapshotId)) {\n throw new LakeStorageError(`[SixbDuckLake] Invalid DuckLake snapshot id '${snapshotId}'.`)\n }\n}\n",
28
+ "import { randomUUID } from \"node:crypto\"\nimport type { DatasetColumnDefinition, DatasetDefinition, DatasetRow } from \"@sixb/core\"\nimport {\n type AnalyzeSqlTransformInput,\n type AnalyzeSqlTransformSource,\n type DatasetColumnLineage,\n type DatasetColumnRef,\n type DatasetProducer,\n type DatasetVersion,\n type DatasetVersionLineage,\n type DatasetVersionRef,\n type DatasetWriteCommitResult,\n type DatasetWriteMode,\n type ExecuteSqlTransformInput,\n type LakeSqlExecutor,\n LakeStorageError,\n type PreviewSqlTransformInput,\n resolveStepLineage,\n type SqlTransformAnalysis,\n type SqlTransformColumnRef,\n type SqlTransformLineage,\n} from \"@sixb/core/lake-storage\"\nimport type { DuckLakeStorageOptions } from \"../types\"\nimport {\n type ApplyDatasetRowsResult,\n applyDatasetRowsFromRelation,\n assertDatasetWriteMode,\n} from \"./dataset-row-commit\"\nimport { findDatasetColumnTypeForDuckDbSql } from \"./duckdb-column-types\"\nimport { getString } from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport type { DuckLakeConnectionManager } from \"./ducklake-connection-manager\"\nimport type { DuckLakeDatasetCatalog } from \"./ducklake-dataset-catalog\"\nimport type { DuckLakeSnapshotReader, DuckLakeTableVersionRef } from \"./ducklake-snapshot-reader\"\nimport type { DuckLakeWriteCoordinator } from \"./ducklake-write-coordinator\"\nimport { datasetColumnTypeToDuckDbSql } from \"./schema\"\nimport { quoteIdentifier } from \"./sql\"\nimport { analyzeSqlTransformLineage, type SqlLineageAnalysis } from \"./sql-lineage/analysis\"\nimport {\n createDuckLakeSqlTransformTemplate,\n type DuckLakeSqlTransformSourceRelation,\n type DuckLakeSqlTransformTemplate,\n pickSourceColumns,\n renderDuckLakeSourceRelations,\n} from \"./sql-transform-relations\"\nimport { parseVersionId } from \"./versions\"\n\nconst DEFAULT_PREVIEW_LIMIT = 100\nconst MAX_PREVIEW_LIMIT = 1_000\n\ninterface ResolvedDuckLakeSqlTransformSources {\n readonly relations: Readonly<Record<string, DuckLakeSqlTransformSourceRelation>>\n readonly tables: Readonly<Record<string, ResolvedDuckLakeSourceTable>>\n readonly inputs: readonly DatasetVersionRef[]\n}\n\n/** A source's stored definition, and the version it resolved to. */\ninterface ResolvedDuckLakeSourceTable {\n readonly definition: DatasetDefinition\n readonly version: DuckLakeTableVersionRef\n}\n\ninterface ApplySqlTransformInput {\n readonly runtime: DuckDbQueryRuntime\n readonly target: DatasetDefinition\n readonly mode: DatasetWriteMode\n readonly sql: string\n readonly checkedCasts: readonly SqlTransformCheckedCast[]\n readonly previousRowCount?: number\n}\n\ninterface SqlTransformResultColumn {\n readonly name: string\n readonly typeSql: string\n}\n\ninterface SqlTransformCheckedCast {\n readonly columnName: string\n readonly targetTypeSql: string\n}\n\n/**\n * DuckDB-backed SQL transform executor for DuckLakeStorage.\n */\nexport class DuckLakeSqlExecutor implements LakeSqlExecutor<\"duckdb\"> {\n readonly dialect = \"duckdb\" as const\n readonly capabilities = {\n preview: true,\n supportsAppend: true,\n supportsSnapshot: true,\n }\n\n constructor(\n private readonly options: DuckLakeStorageOptions,\n private readonly connections: DuckLakeConnectionManager,\n private readonly datasets: DuckLakeDatasetCatalog,\n private readonly snapshots: DuckLakeSnapshotReader,\n private readonly writes: DuckLakeWriteCoordinator\n ) {}\n\n async *preview(input: PreviewSqlTransformInput<\"duckdb\">): AsyncIterable<DatasetRow> {\n this.connections.assertOpen()\n\n const template = createDuckLakeSqlTransformTemplate(Object.keys(input.sources), input.sql)\n\n const rows = await this.connections.withAttachedRuntime(async (runtime) => {\n const sources = await this.resolveSources(runtime, input.sources)\n const sql = template.render(renderDuckLakeSourceRelations(this.options, sources.relations))\n return runtime.query(buildPreviewSql(sql, previewLimit(input.limit)))\n })\n\n for (const row of rows) {\n yield normalizePreviewRow(row)\n }\n }\n\n async execute(input: ExecuteSqlTransformInput<\"duckdb\">): Promise<DatasetWriteCommitResult> {\n this.connections.assertOpen()\n assertDatasetWriteMode(input.mode, \"SQL transform\")\n\n const template = createDuckLakeSqlTransformTemplate(Object.keys(input.sources), input.sql)\n\n return this.writes.withCommitRuntime(async (runtime) => {\n const target = await this.resolveTargetDataset(runtime, input.target)\n const sources = await this.resolveSources(runtime, input.sources)\n const sql = template.render(renderDuckLakeSourceRelations(this.options, sources.relations))\n\n const sourceVersions = await this.readSourceVersions(runtime, sources).catch(\n (error: unknown) => skipLineage(target, error)\n )\n\n // The analysis binds in its own DuckDB instance while the lake checks the result schema.\n const [checkedCasts, stepLineage] = await Promise.all([\n this.assertResultSchemaMatchesTarget(runtime, target, sql),\n sourceVersions === undefined\n ? undefined\n : analyzeExecutedLineage(\n template,\n pinnedSources(sources, sourceVersions),\n sources.relations,\n target\n ),\n ])\n\n return this.writes.commitDatasetVersionOnExclusiveRuntime(runtime, {\n dataset: target,\n mode: input.mode,\n expectedLatestVersionId: input.expectedLatestVersionId,\n commitMessage: input.commitMessage ?? `execute SQL transform for dataset ${target.id}`,\n producer: input.producer,\n inputs: sources.inputs,\n lineage:\n stepLineage === undefined || sourceVersions === undefined\n ? unanalyzedLineage(target, input.producer)\n : resolveStepLineage(stepLineage, [...sourceVersions.values()]),\n applyChanges: (runtime, context) =>\n this.applySqlTransform({\n runtime,\n target,\n mode: input.mode,\n sql,\n checkedCasts,\n previousRowCount: context.previousRowCount,\n }),\n })\n })\n }\n\n /**\n * Column lineage bound against the definitions passed in, without reading the lake: it works\n * before any source version exists. Their columns are bound in the order given, which can differ\n * from the lake's stored order; `execute` binds each source's stored version schema instead.\n */\n async analyze(input: AnalyzeSqlTransformInput<\"duckdb\">): Promise<SqlTransformAnalysis> {\n for (const source of Object.values(input.sources)) {\n this.datasets.assertSchema(source.dataset)\n }\n\n const analysis = await analyzeSqlTransformLineage({\n sources: input.sources,\n template: createDuckLakeSqlTransformTemplate(Object.keys(input.sources), input.sql),\n })\n return analysis.supported\n ? { supported: true, lineage: analysis.lineage }\n : { supported: false, reason: analysis.reason }\n }\n\n private async resolveSources(\n runtime: DuckDbQueryRuntime,\n sources: PreviewSqlTransformInput<\"duckdb\">[\"sources\"]\n ): Promise<ResolvedDuckLakeSqlTransformSources> {\n const relations: Record<string, DuckLakeSqlTransformSourceRelation> = Object.create(null)\n const tables: Record<string, ResolvedDuckLakeSourceTable> = Object.create(null)\n const inputs: DatasetVersionRef[] = []\n\n for (const [sourceName, source] of Object.entries(sources)) {\n const definition = await this.resolveSourceDataset(runtime, source.dataset)\n\n // Rejects a pick of columns the stored definition does not have before any SQL renders it.\n pickSourceColumns(sourceName, definition, source.columns)\n\n const versionRef = await this.resolveSourceVersion(runtime, definition, source.versionId)\n\n relations[sourceName] = {\n datasetId: definition.id,\n versionId: versionRef.versionId,\n ...(source.columns === undefined ? {} : { columns: source.columns }),\n }\n tables[sourceName] = { definition, version: versionRef }\n inputs.push({\n datasetId: definition.id,\n versionId: versionRef.versionId,\n })\n }\n\n return {\n relations: Object.freeze(relations),\n tables: Object.freeze(tables),\n inputs: Object.freeze(inputs),\n }\n }\n\n private async resolveSourceDataset(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition\n ): Promise<DatasetDefinition> {\n const definition = await this.datasets.getDatasetOnRuntime(runtime, dataset.id)\n if (!definition) {\n throw new LakeStorageError(\n `[SixbDuckLake] Unknown SQL transform source dataset '${dataset.id}'.`\n )\n }\n\n return definition\n }\n\n private async resolveTargetDataset(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition\n ): Promise<DatasetDefinition> {\n const definition = await this.datasets.getDatasetOnRuntime(runtime, dataset.id)\n if (!definition) {\n throw new LakeStorageError(\n `[SixbDuckLake] Unknown SQL transform target dataset '${dataset.id}'.`\n )\n }\n\n this.datasets.assertSchema(definition)\n return definition\n }\n\n /** The source versions read, by source name, with their schemas from one catalog read. */\n private async readSourceVersions(\n runtime: DuckDbQueryRuntime,\n sources: ResolvedDuckLakeSqlTransformSources\n ): Promise<ReadonlyMap<string, DatasetVersion>> {\n const names = Object.keys(sources.tables)\n const versions = await this.snapshots.getVersionsForRefs(\n runtime,\n names.map((sourceName) => sources.tables[sourceName].version)\n )\n\n return new Map(names.map((sourceName, index) => [sourceName, versions[index]]))\n }\n\n private async resolveSourceVersion(\n runtime: DuckDbQueryRuntime,\n dataset: DatasetDefinition,\n versionId?: string\n ): Promise<DuckLakeTableVersionRef> {\n if (versionId !== undefined) {\n const snapshotId = parseVersionId(versionId)\n const versionRef = await this.snapshots.getVersionRefForSnapshot(runtime, dataset, snapshotId)\n if (versionRef) {\n return versionRef\n }\n\n throwNoCommittedSourceVersion(dataset.id)\n }\n\n const latestVersionRef = await this.snapshots.getLatestVersionRefForDefinition(runtime, dataset)\n if (latestVersionRef) {\n return latestVersionRef\n }\n\n throwNoCommittedSourceVersion(dataset.id)\n }\n\n private async assertResultSchemaMatchesTarget(\n runtime: DuckDbQueryRuntime,\n target: DatasetDefinition,\n sql: string\n ): Promise<readonly SqlTransformCheckedCast[]> {\n const rows = await runtime.query(\n `DESCRIBE SELECT * FROM (${sql}) AS sixb_sql_transform_result_schema`\n )\n const actualColumns = rows.map((row) => resultColumnFromDescribeRow(row))\n const expectedColumns = target.schema.columns\n const checkedCasts: SqlTransformCheckedCast[] = []\n\n if (actualColumns.length !== expectedColumns.length) {\n throwResultSchemaMismatch(\n target.id,\n `expected ${expectedColumns.length} columns, got ${actualColumns.length}`\n )\n }\n\n for (let index = 0; index < expectedColumns.length; index += 1) {\n const expected = expectedColumns[index]\n const actual = actualColumns[index]\n\n if (actual.name !== expected.name) {\n throwResultSchemaMismatch(\n target.id,\n `column ${index + 1} should be '${expected.name}', got '${actual.name}'`\n )\n }\n\n const actualDatasetType = findDatasetColumnTypeForDuckDbSql(actual.typeSql)\n if (actualDatasetType === expected.type) {\n continue\n }\n\n if (isCheckedInt64Cast(actual.typeSql, expected.type)) {\n checkedCasts.push({\n columnName: expected.name,\n targetTypeSql: datasetColumnTypeToDuckDbSql(expected.type),\n })\n continue\n }\n\n throwResultSchemaMismatch(\n target.id,\n `column '${expected.name}' should have type '${expected.type}', got '${actualDatasetType ?? actual.typeSql}'`\n )\n }\n\n return checkedCasts\n }\n\n private async applySqlTransform(input: ApplySqlTransformInput): Promise<ApplyDatasetRowsResult> {\n const tempTableName = `sixb_sql_transform_${randomUUID().replaceAll(\"-\", \"\")}`\n const tempTable = quoteIdentifier(tempTableName)\n\n await input.runtime.run(\n `CREATE TEMP TABLE ${tempTable} AS SELECT * FROM (${input.sql}) AS sixb_sql_transform_result`\n )\n\n let result: ApplyDatasetRowsResult\n try {\n for (const checkedCast of input.checkedCasts) {\n await input.runtime.run(\n `ALTER TABLE ${tempTable} ALTER COLUMN ${quoteIdentifier(\n checkedCast.columnName\n )} SET DATA TYPE ${checkedCast.targetTypeSql}`\n )\n }\n\n result = await applyDatasetRowsFromRelation({\n options: this.options,\n runtime: input.runtime,\n dataset: input.target,\n mode: input.mode,\n sourceRelationSql: tempTable,\n previousRowCount: input.previousRowCount,\n })\n } catch (error) {\n try {\n await input.runtime.run(`DROP TABLE IF EXISTS ${tempTable}`)\n } catch {\n // Preserve the write failure. DuckDB rejects cleanup statements while\n // the transaction is aborted; the coordinator will roll it back next.\n }\n throw error\n }\n\n await input.runtime.run(`DROP TABLE IF EXISTS ${tempTable}`)\n return result\n }\n}\n\n/**\n * Each source as the transform binds it on the lake: the schema of the version it reads, in the\n * stored column order, then its pick. Today's definition may have gained columns since, and a new\n * column can change what a name in the SQL resolves to, such as a lateral alias.\n */\nfunction pinnedSources(\n sources: ResolvedDuckLakeSqlTransformSources,\n versions: ReadonlyMap<string, DatasetVersion>\n): Readonly<Record<string, AnalyzeSqlTransformSource>> {\n const pinned: Record<string, AnalyzeSqlTransformSource> = Object.create(null)\n for (const [sourceName, version] of versions) {\n pinned[sourceName] = {\n dataset: { ...sources.tables[sourceName].definition, schema: version.schema },\n columns: sources.relations[sourceName].columns,\n }\n }\n\n return pinned\n}\n\n/**\n * Lineage of the SQL about to run, by the sources' dataset ids, against the schemas of the\n * versions it reads.\n *\n * SQL that cannot be analyzed exactly but reads only its sources, such as a PIVOT, depends on at\n * most every column it reads. Otherwise there is none: the SQL may read what no lineage names. A\n * result shaped unlike the target means the analysis tables diverged from what runs on the lake, so\n * that lineage is not recorded either.\n */\nasync function analyzeExecutedLineage(\n template: DuckLakeSqlTransformTemplate,\n pinnedSources: Readonly<Record<string, AnalyzeSqlTransformSource>>,\n relations: Readonly<Record<string, DuckLakeSqlTransformSourceRelation>>,\n target: DatasetDefinition\n): Promise<DatasetColumnLineage | undefined> {\n let analysis: SqlLineageAnalysis\n try {\n analysis = await analyzeSqlTransformLineage({ sources: pinnedSources, template })\n } catch (error) {\n return skipLineage(target, error)\n }\n\n if (!analysis.supported) {\n return analysis.readsOnlySources\n ? toDatasetColumnLineage(everySourceColumn(pinnedSources, target), relations)\n : undefined\n }\n\n if (!describesTarget(analysis.outputColumns, target)) return undefined\n return toDatasetColumnLineage(analysis.lineage, relations)\n}\n\n/** Every column the sources expose decides every row of the target, and so each of its values. */\nfunction everySourceColumn(\n sources: Readonly<Record<string, AnalyzeSqlTransformSource>>,\n target: DatasetDefinition\n): SqlTransformLineage {\n const rows = Object.entries(sources).flatMap(([source, { dataset, columns }]) =>\n (columns ?? dataset.schema.columns.map((column) => column.name)).map((column) => ({\n source,\n column,\n }))\n )\n\n return { rows, columns: Object.fromEntries(target.schema.columns.map(({ name }) => [name, []])) }\n}\n\n/**\n * A pipeline write without lineage is classified with every marking. Any other write without it\n * would depend on its own columns only, so one whose SQL cannot be analyzed records that.\n */\nfunction unanalyzedLineage(\n target: DatasetDefinition,\n producer: DatasetProducer | undefined\n): DatasetVersionLineage | undefined {\n return producer?.kind === \"pipeline\"\n ? undefined\n : { unknown: `a SQL transform into '${target.id}' could not be analyzed` }\n}\n\n/**\n * Lineage never fails a transform: invalid SQL or picks fail where the transform binds on the lake.\n * When the analysis cannot even start, the version records no lineage of its own SQL.\n */\nfunction skipLineage(target: DatasetDefinition, error: unknown): undefined {\n const message = error instanceof Error ? error.message : String(error)\n console.warn(\n `[SixbDuckLake] SQL transform into dataset '${target.id}' records no column lineage: ${message}`\n )\n return undefined\n}\n\nfunction describesTarget(outputColumns: readonly string[], target: DatasetDefinition): boolean {\n return (\n outputColumns.length === target.schema.columns.length &&\n target.schema.columns.every((column, index) => outputColumns[index] === column.name)\n )\n}\n\n/** Source names become dataset ids; two sources reading one dataset share its column refs. */\nfunction toDatasetColumnLineage(\n lineage: SqlTransformLineage,\n relations: Readonly<Record<string, DuckLakeSqlTransformSourceRelation>>\n): DatasetColumnLineage {\n const toRefs = (refs: readonly SqlTransformColumnRef[]): DatasetColumnRef[] => {\n const unique = new Map<string, DatasetColumnRef>()\n for (const { source, column } of refs) {\n const datasetId = relations[source].datasetId\n unique.set(JSON.stringify([datasetId, column]), { datasetId, column })\n }\n\n return [...unique.values()]\n }\n\n return {\n rows: toRefs(lineage.rows),\n columns: Object.fromEntries(\n Object.entries(lineage.columns).map(([column, refs]) => [column, toRefs(refs)])\n ),\n }\n}\n\nfunction previewLimit(limit: number | undefined): number {\n if (limit === undefined || !Number.isFinite(limit)) {\n return DEFAULT_PREVIEW_LIMIT\n }\n\n return Math.min(Math.max(0, Math.trunc(limit)), MAX_PREVIEW_LIMIT)\n}\n\nfunction buildPreviewSql(sql: string, limit: number): string {\n return `SELECT * FROM (${sql}) AS sixb_sql_transform_preview LIMIT ${limit}`\n}\n\nfunction resultColumnFromDescribeRow(\n row: Readonly<Record<string, unknown>>\n): SqlTransformResultColumn {\n const name = getString(row, \"column_name\")\n const typeSql = getString(row, \"column_type\")\n\n return { name, typeSql }\n}\n\nfunction isCheckedInt64Cast(\n actualTypeSql: string,\n expectedType: DatasetColumnDefinition[\"type\"]\n): boolean {\n const normalizedType = actualTypeSql.trim().toUpperCase()\n return expectedType === \"int64\" && (normalizedType === \"HUGEINT\" || normalizedType === \"INT128\")\n}\n\nfunction normalizePreviewRow(row: Readonly<Record<string, unknown>>): DatasetRow {\n const normalized: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(row)) {\n normalized[key] = normalizePreviewValue(value)\n }\n\n return normalized\n}\n\nfunction normalizePreviewValue(value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString()\n }\n\n if (value instanceof Date) {\n return value.toISOString()\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => normalizePreviewValue(item))\n }\n\n if (typeof value === \"object\" && value !== null) {\n const normalized: Record<string, unknown> = {}\n for (const [key, child] of Object.entries(value)) {\n normalized[key] = normalizePreviewValue(child)\n }\n return normalized\n }\n\n return value\n}\n\nfunction throwNoCommittedSourceVersion(datasetId: string): never {\n throw new LakeStorageError(\n `[SixbDuckLake] No committed version found for SQL transform source dataset '${datasetId}'.`\n )\n}\n\nfunction throwResultSchemaMismatch(datasetId: string, detail: string): never {\n throw new LakeStorageError(\n `[SixbDuckLake] SQL transform result schema does not match target dataset '${datasetId}': ${detail}.`\n )\n}\n",
29
+ "import type { DatasetDefinition } from \"@sixb/core\"\nimport {\n type DatasetWriteMode,\n getDatasetPrimaryKeyColumns,\n LakeStorageError,\n} from \"@sixb/core/lake-storage\"\nimport type { DuckLakeStorageOptions } from \"../types\"\nimport { getBigIntLike } from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport { encodeDatasetTableName } from \"./names\"\nimport { datasetSchemaColumnNamesSql } from \"./schema\"\nimport { qualifiedTableName, quoteIdentifier } from \"./sql\"\n\nexport type CommitRowCount =\n | { readonly kind: \"exact\"; readonly value: number }\n | { readonly kind: \"unknown\" }\n\nexport interface ApplyDatasetRowsResult {\n readonly dataChangeExpected: boolean\n readonly sourceRowCount: number\n readonly resultingRowCount: CommitRowCount\n /**\n * The table held no rows when this transaction read it. A write into an empty table deletes\n * nothing, so DuckLake lets it commit alongside a concurrent one that also read the table empty.\n */\n readonly targetWasEmpty: boolean\n /**\n * The write inserted or deleted rows of the dataset table, which DuckLake checks against\n * concurrent changes to the table. A merge that only advances source ordering changes none.\n */\n readonly changedTableRows: boolean\n}\n\nexport function assertDatasetWriteMode(\n mode: unknown,\n operation: string\n): asserts mode is DatasetWriteMode {\n if (mode !== \"snapshot\" && mode !== \"append\") {\n throw new LakeStorageError(\n `[SixbDuckLake] Invalid ${operation} mode '${String(mode)}'. Expected 'snapshot' or 'append'.`\n )\n }\n}\n\nexport async function applyDatasetRowsFromRelation(input: {\n readonly options: DuckLakeStorageOptions\n readonly runtime: DuckDbQueryRuntime\n readonly dataset: DatasetDefinition\n readonly mode: DatasetWriteMode\n /** Provider-rendered relation SQL, such as a quoted staging or temp table. */\n readonly sourceRelationSql: string\n readonly previousRowCount?: number\n}): Promise<ApplyDatasetRowsResult> {\n const tableName = encodeDatasetTableName(input.dataset.id)\n const table = qualifiedTableName(input.options, tableName)\n const columnsSql = datasetSchemaColumnNamesSql(input.dataset.schema)\n const primaryKeyColumns = getDatasetPrimaryKeyColumns(input.dataset)\n\n let baselineRowCount: number | undefined\n if (primaryKeyColumns !== null) {\n await inspectUniqueKeyedRelation({\n runtime: input.runtime,\n dataset: input.dataset,\n relationSql: input.sourceRelationSql,\n context: `${input.mode} source`,\n })\n\n if (input.mode === \"append\") {\n baselineRowCount = await inspectUniqueKeyedRelation({\n runtime: input.runtime,\n dataset: input.dataset,\n relationSql: table,\n context: \"current baseline\",\n })\n await assertNoPrimaryKeyOverlap({\n runtime: input.runtime,\n dataset: input.dataset,\n leftRelationSql: input.sourceRelationSql,\n rightRelationSql: table,\n context: \"append\",\n })\n }\n }\n\n if (input.mode === \"snapshot\") {\n const source = await fingerprintRelation(input.runtime, input.sourceRelationSql, columnsSql)\n const target = await fingerprintRelation(input.runtime, table, columnsSql)\n\n if (sameFingerprint(source, target)) {\n return {\n dataChangeExpected: false,\n sourceRowCount: source.rowCount,\n resultingRowCount: { kind: \"exact\", value: target.rowCount },\n targetWasEmpty: target.rowCount === 0,\n changedTableRows: false,\n }\n }\n\n await input.runtime.run(`DELETE FROM ${table}`)\n await input.runtime.run(\n `INSERT INTO ${table} (${columnsSql}) SELECT ${columnsSql} FROM ${input.sourceRelationSql}`\n )\n\n const changedTableRows = source.rowCount > 0 || target.rowCount > 0\n return {\n dataChangeExpected: changedTableRows,\n sourceRowCount: source.rowCount,\n resultingRowCount: { kind: \"exact\", value: source.rowCount },\n targetWasEmpty: target.rowCount === 0,\n changedTableRows,\n }\n }\n\n const sourceRowCount = await countRows(input.runtime, input.sourceRelationSql)\n const knownRowCount = baselineRowCount ?? input.previousRowCount\n const targetWasEmpty =\n knownRowCount === undefined ? await isEmptyRelation(input.runtime, table) : knownRowCount === 0\n await input.runtime.run(\n `INSERT INTO ${table} (${columnsSql}) SELECT ${columnsSql} FROM ${input.sourceRelationSql}`\n )\n\n return {\n dataChangeExpected: sourceRowCount > 0,\n targetWasEmpty,\n changedTableRows: sourceRowCount > 0,\n sourceRowCount,\n resultingRowCount:\n input.previousRowCount === undefined\n ? { kind: \"unknown\" }\n : { kind: \"exact\", value: input.previousRowCount + sourceRowCount },\n }\n}\n\nexport async function inspectUniqueKeyedRelation(input: {\n readonly runtime: DuckDbQueryRuntime\n readonly dataset: DatasetDefinition\n readonly relationSql: string\n readonly context: string\n}): Promise<number> {\n const primaryKeyColumns = getDatasetPrimaryKeyColumns(input.dataset)\n if (primaryKeyColumns === null) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${input.dataset.id}' must define a primaryKey before rows can be keyed.`\n )\n }\n\n const keysSql = primaryKeyColumns.map((column) => quoteIdentifier(column)).join(\", \")\n const [row] = await input.runtime.query(`\n SELECT\n count(*) AS row_count,\n coalesce(max(key_count), 0) AS max_key_count\n FROM (\n SELECT count(*) OVER (PARTITION BY ${keysSql}) AS key_count\n FROM ${input.relationSql}\n ) keyed_rows\n `)\n\n const rowCount = row === undefined ? 0 : Number(getBigIntLike(row, \"row_count\"))\n const maxKeyCount = row === undefined ? 0 : Number(getBigIntLike(row, \"max_key_count\"))\n if (maxKeyCount > 1) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${input.dataset.id}' ${input.context} contains duplicate primary key.`\n )\n }\n\n return rowCount\n}\n\nasync function assertNoPrimaryKeyOverlap(input: {\n readonly runtime: DuckDbQueryRuntime\n readonly dataset: DatasetDefinition\n readonly leftRelationSql: string\n readonly rightRelationSql: string\n readonly context: string\n}): Promise<void> {\n const primaryKeyColumns = getDatasetPrimaryKeyColumns(input.dataset)\n if (primaryKeyColumns === null) {\n return\n }\n\n const matchSql = primaryKeyColumns\n .map((column) => `left_rows.${quoteIdentifier(column)} = right_rows.${quoteIdentifier(column)}`)\n .join(\" AND \")\n const [collision] = await input.runtime.query(`\n SELECT 1\n FROM ${input.leftRelationSql} left_rows\n JOIN ${input.rightRelationSql} right_rows ON ${matchSql}\n LIMIT 1\n `)\n if (collision !== undefined) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${input.dataset.id}' ${input.context} contains duplicate primary key.`\n )\n }\n}\n\ninterface RelationFingerprint {\n readonly rowCount: number\n readonly hashSum: string\n readonly hashXor: string\n}\n\nasync function fingerprintRelation(\n runtime: DuckDbQueryRuntime,\n relationSql: string,\n columnsSql: string\n): Promise<RelationFingerprint> {\n const [row] = await runtime.query(`\n SELECT\n count(*) AS row_count,\n coalesce(sum(hash(${columnsSql})::HUGEINT), 0::HUGEINT) AS hash_sum,\n coalesce(bit_xor(hash('sixb:snapshot:v1', ${columnsSql})), 0::UBIGINT) AS hash_xor\n FROM ${relationSql}\n `)\n\n if (row === undefined) {\n return { rowCount: 0, hashSum: \"0\", hashXor: \"0\" }\n }\n\n return {\n rowCount: Number(getBigIntLike(row, \"row_count\")),\n hashSum: getBigIntLike(row, \"hash_sum\").toString(),\n hashXor: getBigIntLike(row, \"hash_xor\").toString(),\n }\n}\n\nfunction sameFingerprint(left: RelationFingerprint, right: RelationFingerprint): boolean {\n return (\n left.rowCount === right.rowCount &&\n left.hashSum === right.hashSum &&\n left.hashXor === right.hashXor\n )\n}\n\nasync function countRows(runtime: DuckDbQueryRuntime, relationSql: string): Promise<number> {\n const [row] = await runtime.query(`SELECT count(*) AS row_count FROM ${relationSql}`)\n if (row === undefined) {\n return 0\n }\n\n return Number(getBigIntLike(row, \"row_count\"))\n}\n\nasync function isEmptyRelation(runtime: DuckDbQueryRuntime, relationSql: string): Promise<boolean> {\n const rows = await runtime.query(`SELECT 1 AS present FROM ${relationSql} LIMIT 1`)\n return rows.length === 0\n}\n",
30
+ "import { randomUUID } from \"node:crypto\"\nimport { type DuckDBConnection, DuckDBInstance } from \"@duckdb/node-api\"\nimport type { DatasetColumnDefinition } from \"@sixb/core\"\nimport type {\n AnalyzeSqlTransformSource,\n SqlTransformColumnRef,\n SqlTransformLineage,\n} from \"@sixb/core/lake-storage\"\nimport { datasetColumnToDuckDbSql } from \"../schema\"\nimport { quoteIdentifier, quoteSqlString } from \"../sql\"\nimport {\n type DuckLakeSqlTransformTemplate,\n pickSourceColumns,\n renderSourceRelation,\n} from \"../sql-transform-relations\"\nimport { parseSerializerOutput } from \"./plan-json\"\nimport { type PlanSourceTables, planLineage } from \"./plan-walker\"\nimport { rejectPlanFormat } from \"./rejection\"\nimport { assertSingleSelect, readsOnlySources } from \"./statement-gate\"\n\ninterface AnalyzeSqlTransformLineageInput {\n readonly sources: Readonly<Record<string, AnalyzeSqlTransformSource>>\n readonly template: DuckLakeSqlTransformTemplate\n}\n\n/**\n * `SqlTransformAnalysis` with the result's column names in order, which the lineage record cannot\n * carry: object keys that look like integers enumerate first.\n */\nexport type SqlLineageAnalysis =\n | {\n readonly supported: true\n readonly lineage: SqlTransformLineage\n readonly outputColumns: readonly string[]\n }\n | { readonly supported: false; readonly reason: string; readonly readsOnlySources: boolean }\n\ninterface AnalyzedSql {\n readonly lineage: SqlTransformLineage\n readonly outputColumns: readonly string[]\n}\n\n/** An empty table standing in for one source, under a name the transform cannot guess. */\ninterface AnalysisTable {\n readonly sourceName: string\n readonly tableName: string\n readonly columns: readonly DatasetColumnDefinition[]\n readonly relationSql: string\n}\n\n/**\n * No file, network, extension, or setting is reachable from the analysis instance; the transform\n * only binds against its sources' empty tables.\n */\nconst ISOLATED_INSTANCE_CONFIG = {\n enable_external_access: \"false\",\n autoinstall_known_extensions: \"false\",\n autoload_known_extensions: \"false\",\n}\n\n/**\n * Column lineage of a SQL transform, derived without reading any data.\n *\n * A fresh in-memory DuckDB instance creates one empty table per source from its column schema,\n * the transform renders against those tables in the same relation shape it runs with on the lake,\n * and DuckDB binds it. The bound, unoptimized plan is then walked operator by operator. Whatever\n * the walker does not understand exactly is rejected rather than guessed; a rejection or a bind\n * error is an unsupported analysis, while an invalid source pick throws. An unsupported analysis\n * of SQL that parsed still says whether its parse tree reads anything but the sources.\n */\nexport async function analyzeSqlTransformLineage(\n input: AnalyzeSqlTransformLineageInput\n): Promise<SqlLineageAnalysis> {\n const tables = analysisTables(input.sources)\n const sql = input.template.render(\n new Map(tables.map((table) => [table.sourceName, table.relationSql]))\n )\n\n try {\n return await withAnalysisConnection(tables, async (connection) => {\n const statements = await serialize(\n connection,\n `json_serialize_sql(${quoteSqlString(sql)}, skip_null := false, skip_empty := false)`,\n \"statements\",\n \"DuckDB could not parse the transform\"\n )\n\n try {\n return { supported: true, ...(await analyzeSql(connection, sql, statements, tables)) }\n } catch (error) {\n const sourceTables = new Set(tables.map((table) => table.tableName))\n const functions = await builtinFunctions(connection).catch(() => undefined)\n return unsupported(\n error,\n functions !== undefined && readsOnlySources(statements, sourceTables, functions)\n )\n }\n })\n } catch (error) {\n return unsupported(error, false)\n }\n}\n\n/** The functions DuckDB defines, the same in every fresh instance: read from the first one. */\nlet builtins: Promise<ReadonlySet<string>> | undefined\n\nfunction builtinFunctions(connection: DuckDBConnection): Promise<ReadonlySet<string>> {\n if (builtins) return builtins\n\n const read = connection\n .runAndReadAll(\"SELECT DISTINCT lower(function_name) FROM duckdb_functions()\")\n .then((reader) => new Set(reader.getRows().map(([name]) => String(name))))\n\n // A failed read is not kept: the next analysis reads again.\n builtins = read\n read.catch(() => {\n if (builtins === read) builtins = undefined\n })\n return read\n}\n\nfunction unsupported(error: unknown, readsOnlySources: boolean): SqlLineageAnalysis {\n return {\n supported: false,\n reason: error instanceof Error ? error.message : String(error),\n readsOnlySources,\n }\n}\n\nfunction analysisTables(\n sources: Readonly<Record<string, AnalyzeSqlTransformSource>>\n): readonly AnalysisTable[] {\n const token = randomUUID().replaceAll(\"-\", \"\")\n\n return Object.entries(sources).map(([sourceName, source], index) => {\n const tableName = `sixb_lineage_${token}_${index}`\n return {\n sourceName,\n tableName,\n columns: pickSourceColumns(sourceName, source.dataset, source.columns),\n relationSql: renderSourceRelation(quoteIdentifier(tableName), source.columns),\n }\n })\n}\n\nasync function withAnalysisConnection<T>(\n tables: readonly AnalysisTable[],\n use: (connection: DuckDBConnection) => Promise<T>\n): Promise<T> {\n const instance = await DuckDBInstance.create(\":memory:\", ISOLATED_INSTANCE_CONFIG)\n try {\n const connection = await instance.connect()\n try {\n for (const table of tables) {\n const columnsSql = table.columns.map((column) => datasetColumnToDuckDbSql(column))\n await connection.run(\n `CREATE TABLE ${quoteIdentifier(table.tableName)} (${columnsSql.join(\", \")})`\n )\n }\n\n // The transform cannot loosen the restrictions above through SET or a setting function.\n await connection.run(\"SET lock_configuration = true\")\n return await use(connection)\n } finally {\n connection.closeSync()\n }\n } finally {\n instance.closeSync()\n }\n}\n\nasync function analyzeSql(\n connection: DuckDBConnection,\n sql: string,\n statements: readonly unknown[],\n tables: readonly AnalysisTable[]\n): Promise<AnalyzedSql> {\n assertSingleSelect(statements)\n\n const plans = await serialize(\n connection,\n `json_serialize_plan(${quoteSqlString(sql)}, skip_null := false, skip_empty := false, optimize := false)`,\n \"plans\",\n \"DuckDB could not bind the transform\"\n )\n if (plans.length !== 1) {\n rejectPlanFormat(`expected one plan, got ${plans.length}`)\n }\n\n const sourceColumns = numberSourceColumns(tables)\n const lineage = planLineage(plans[0], sourceColumns.ids)\n const names = await outputColumnNames(connection, sql)\n if (lineage.columns.length !== names.length) {\n rejectPlanFormat(`the plan has ${lineage.columns.length} columns, the result ${names.length}`)\n }\n\n const refs = (ids: readonly number[]): SqlTransformColumnRef[] =>\n ids.map((id) => sourceColumns.refs[id])\n\n return {\n lineage: {\n rows: refs(lineage.rows),\n columns: Object.fromEntries(names.map((name, index) => [name, refs(lineage.columns[index])])),\n },\n outputColumns: names,\n }\n}\n\n/** Numbers every column of every table, in source then column order, for the plan walker. */\nfunction numberSourceColumns(tables: readonly AnalysisTable[]): {\n readonly ids: PlanSourceTables\n readonly refs: readonly SqlTransformColumnRef[]\n} {\n const refs: SqlTransformColumnRef[] = []\n const ids = new Map(\n tables.map((table) => {\n const columnIds = table.columns.map((column) => {\n refs.push({ source: table.sourceName, column: column.name })\n return [column.name, refs.length - 1] as const\n })\n return [table.tableName, new Map(columnIds)] as const\n })\n )\n\n return { ids, refs }\n}\n\n/**\n * Names as the executor materializes them: selected through a subquery, where DuckDB renames\n * duplicate output names (`id`, `id_1`).\n */\nasync function outputColumnNames(\n connection: DuckDBConnection,\n sql: string\n): Promise<readonly string[]> {\n const prepared = await connection.prepare(`SELECT * FROM (${sql}) AS sixb_lineage_result`)\n try {\n return Array.from({ length: prepared.columnCount }, (_, index) => prepared.columnName(index))\n } finally {\n prepared.destroySync()\n }\n}\n\nasync function serialize(\n connection: DuckDBConnection,\n serializerSql: string,\n listKey: string,\n failure: string\n): Promise<readonly unknown[]> {\n const reader = await connection.runAndReadAll(`SELECT ${serializerSql}`)\n const text = reader.getRows()[0]?.[0]\n if (typeof text !== \"string\") {\n rejectPlanFormat(\"the serializer returned no JSON\")\n }\n\n return parseSerializerOutput(text, listKey, failure)\n}\n",
31
+ "import { randomUUID } from \"node:crypto\"\nimport type { DatasetColumnDefinition, DatasetDefinition } from \"@sixb/core\"\nimport {\n LakeStorageError,\n type SqlTransformBody,\n type SqlTransformRelation,\n} from \"@sixb/core/lake-storage\"\nimport type { DuckLakeStorageOptions } from \"../types\"\nimport { encodeDatasetTableName } from \"./names\"\nimport { qualifiedTableName, quoteIdentifier } from \"./sql\"\nimport { parseVersionId } from \"./versions\"\n\nconst RELATION_PLACEHOLDER_PREFIX = \"__sixb_sql_transform_relation_\"\nconst RELATION_PLACEHOLDER_PATTERN = /__sixb_sql_transform_relation_[0-9a-f]{32}_[0-9]+__/g\n\nexport interface DuckLakeSqlTransformSourceRelation {\n readonly datasetId: string\n readonly versionId: string\n /** The only columns the transform may read, in order. Every column when omitted. */\n readonly columns?: readonly string[]\n}\n\n/**\n * The SQL a transform body returned, with a placeholder where each source relation belongs. The\n * body runs once; the same SQL then renders against the lake and against the lineage analysis.\n */\nexport interface DuckLakeSqlTransformTemplate {\n /** Replaces each placeholder with its source's relation SQL, keyed by source name. */\n render(relations: ReadonlyMap<string, string>): string\n}\n\nclass DuckLakeSqlTransformRelation implements SqlTransformRelation {\n constructor(private readonly placeholder: string) {}\n\n toString(): string {\n return this.placeholder\n }\n}\n\nexport function createDuckLakeSqlTransformTemplate(\n sourceNames: readonly string[],\n body: SqlTransformBody<\"duckdb\">\n): DuckLakeSqlTransformTemplate {\n const token = randomUUID().replaceAll(\"-\", \"\")\n const relations: Record<string, SqlTransformRelation> = Object.create(null)\n const sourceNamesByPlaceholder = new Map<string, string>()\n\n sourceNames.forEach((sourceName, index) => {\n const placeholder = `${RELATION_PLACEHOLDER_PREFIX}${token}_${index}__`\n relations[sourceName] = Object.freeze(new DuckLakeSqlTransformRelation(placeholder))\n sourceNamesByPlaceholder.set(placeholder, sourceName)\n })\n\n const sql = body(Object.freeze(relations))\n if (typeof sql !== \"string\") {\n throw new LakeStorageError(\"[SixbDuckLake] SQL transform body must return a SQL string.\")\n }\n\n return {\n render(relationSql) {\n const rendered = sql.replace(RELATION_PLACEHOLDER_PATTERN, (placeholder) => {\n const sourceName = sourceNamesByPlaceholder.get(placeholder)\n const relation = sourceName === undefined ? undefined : relationSql.get(sourceName)\n if (relation === undefined) {\n throwUnresolvedPlaceholder()\n }\n\n return relation\n })\n\n if (rendered.includes(RELATION_PLACEHOLDER_PREFIX)) {\n throwUnresolvedPlaceholder()\n }\n\n return rendered\n },\n }\n}\n\n/** Each source as DuckLake time travel to its resolved version. */\nexport function renderDuckLakeSourceRelations(\n options: Pick<DuckLakeStorageOptions, \"alias\">,\n sources: Readonly<Record<string, DuckLakeSqlTransformSourceRelation>>\n): ReadonlyMap<string, string> {\n return new Map(\n Object.entries(sources).map(([sourceName, source]) => {\n const snapshotId = parseVersionId(source.versionId)\n const table = qualifiedTableName(options, encodeDatasetTableName(source.datasetId))\n return [\n sourceName,\n renderSourceRelation(`${table} AT (VERSION => ${snapshotId})`, source.columns),\n ]\n })\n )\n}\n\n/**\n * The shape of every source relation. A pick lists its columns, so the transform cannot read any\n * other column of the source.\n */\nexport function renderSourceRelation(tableSql: string, columns?: readonly string[]): string {\n const columnsSql =\n columns === undefined ? \"*\" : columns.map((column) => quoteIdentifier(column)).join(\", \")\n return `(SELECT ${columnsSql} FROM ${tableSql})`\n}\n\n/** The columns a source exposes to a transform: its pick, in order, or every column. */\nexport function pickSourceColumns(\n sourceName: string,\n dataset: DatasetDefinition,\n columns?: readonly string[]\n): readonly DatasetColumnDefinition[] {\n if (columns === undefined) {\n return dataset.schema.columns\n }\n\n if (columns.length === 0) {\n throw new LakeStorageError(\n `[SixbDuckLake] SQL transform source '${sourceName}' must pick at least one column.`\n )\n }\n\n const columnsByName = new Map(dataset.schema.columns.map((column) => [column.name, column]))\n const picked = new Set<string>()\n\n return columns.map((columnName) => {\n const column = columnsByName.get(columnName)\n if (column === undefined) {\n throw new LakeStorageError(\n `[SixbDuckLake] SQL transform source '${sourceName}' picks column '${columnName}', which dataset '${dataset.id}' does not have.`\n )\n }\n\n if (picked.has(columnName)) {\n throw new LakeStorageError(\n `[SixbDuckLake] SQL transform source '${sourceName}' picks column '${columnName}' more than once.`\n )\n }\n\n picked.add(columnName)\n return column\n })\n}\n\nfunction throwUnresolvedPlaceholder(): never {\n throw new LakeStorageError(\n \"[SixbDuckLake] SQL transform contains an unresolved relation placeholder.\"\n )\n}\n",
32
+ "/**\n * A transform whose lineage cannot be derived exactly. The message names the construct and becomes\n * the `reason` of an unsupported analysis; it never escapes the analysis as an error.\n */\nexport class SqlLineageRejected extends Error {\n override readonly name = \"SqlLineageRejected\"\n}\n\nexport function reject(reason: string): never {\n throw new SqlLineageRejected(reason)\n}\n\n/** DuckDB serialized something the analysis does not recognize, most likely after an upgrade. */\nexport function rejectPlanFormat(detail: string): never {\n reject(`unexpected DuckDB plan format: ${detail}`)\n}\n",
33
+ "import { reject, rejectPlanFormat } from \"./rejection\"\n\n/**\n * Strict readers for DuckDB's JSON serializers (`json_serialize_sql`, `json_serialize_plan`).\n *\n * The format is not a stable DuckDB API. Every field the analysis reads must be present with the\n * expected shape, so a renamed or retyped field in a future release rejects the transform instead\n * of silently dropping a dependency.\n */\nexport type JsonObject = Readonly<Record<string, unknown>>\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nexport function asObject(value: unknown, what: string): JsonObject {\n if (!isJsonObject(value)) {\n rejectPlanFormat(`${what} is not an object`)\n }\n\n return value\n}\n\n/** A field the serializer always writes. It may be null. */\nexport function field(object: JsonObject, key: string): unknown {\n if (!Object.hasOwn(object, key)) {\n rejectPlanFormat(`missing field '${key}'`)\n }\n\n return object[key]\n}\n\nexport function objectField(object: JsonObject, key: string): JsonObject {\n return asObject(field(object, key), `field '${key}'`)\n}\n\nexport function nullableObjectField(object: JsonObject, key: string): JsonObject | null {\n const value = field(object, key)\n return value === null ? null : asObject(value, `field '${key}'`)\n}\n\nexport function stringField(object: JsonObject, key: string): string {\n const value = field(object, key)\n if (typeof value !== \"string\") {\n rejectPlanFormat(`field '${key}' is not a string`)\n }\n\n return value\n}\n\nexport function booleanField(object: JsonObject, key: string): boolean {\n const value = field(object, key)\n if (typeof value !== \"boolean\") {\n rejectPlanFormat(`field '${key}' is not a boolean`)\n }\n\n return value\n}\n\n/**\n * Indexes and table indexes. DuckDB writes 2^64-1 as an \"unset\" sentinel, which `JSON.parse`\n * rounds; it stays an integer far past any column count, which is all the analysis compares.\n */\nexport function indexField(object: JsonObject, key: string): number {\n return asIndex(field(object, key), `field '${key}'`)\n}\n\nfunction asIndex(value: unknown, what: string): number {\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < 0) {\n rejectPlanFormat(`${what} is not an index`)\n }\n\n return value\n}\n\n/** A list field. The serializer writes an absent list as null or as an empty array. */\nexport function listField(object: JsonObject, key: string): readonly unknown[] {\n return asList(field(object, key), `field '${key}'`)\n}\n\nexport function asList(value: unknown, what: string): readonly unknown[] {\n if (value === null) {\n return []\n }\n\n if (!Array.isArray(value)) {\n rejectPlanFormat(`${what} is not a list`)\n }\n\n return value\n}\n\nexport function objectListField(object: JsonObject, key: string): readonly JsonObject[] {\n return listField(object, key).map((item) => asObject(item, `an item of '${key}'`))\n}\n\nexport function indexListField(object: JsonObject, key: string): readonly number[] {\n return asIndexList(field(object, key), `field '${key}'`)\n}\n\nexport function asIndexList(value: unknown, what: string): readonly number[] {\n return asList(value, what).map((item) => asIndex(item, `an item of ${what}`))\n}\n\nexport function stringListField(object: JsonObject, key: string): readonly string[] {\n return listField(object, key).map((item) => {\n if (typeof item !== \"string\") {\n rejectPlanFormat(`an item of '${key}' is not a string`)\n }\n\n return item\n })\n}\n\n/**\n * Both serializers answer `{ \"error\": false, <listKey>: [...] }`, or `{ \"error\": true,\n * \"error_message\": ... }` when DuckDB could not parse or bind the query.\n */\nexport function parseSerializerOutput(\n text: string,\n listKey: string,\n failure: string\n): readonly unknown[] {\n const output = asObject(JSON.parse(text), \"serializer output\")\n if (booleanField(output, \"error\")) {\n reject(`${failure}: ${stringField(output, \"error_message\")}`)\n }\n\n return listField(output, listKey)\n}\n",
34
+ "import { rejectPlanFormat } from \"./rejection\"\n\n/** Source columns, as ids assigned by the analysis session, that something depends on. */\nexport type Dependencies = ReadonlySet<number>\n\n/**\n * A planner-internal column past the end of a table's columns: `rowid`, or the placeholder a\n * `count(*)` scan reads. Scanning one is allowed; depending on one rejects the transform.\n */\nexport const VIRTUAL_COLUMN = -1\n\n/** A column flowing out of a plan operator. */\nexport interface PlanColumn {\n readonly dependencies: Dependencies\n /**\n * `table_index.column_index` in the plan. Most expressions reference their input by position\n * (BOUND_REF); the subtree under a table function's input keeps binding references instead.\n */\n readonly binding?: string\n}\n\n/** The output of a plan operator: its columns, and what decides which rows exist and their order. */\nexport interface PlanRelation {\n readonly columns: readonly PlanColumn[]\n readonly rows: Dependencies\n}\n\nexport function bindingKey(tableIndex: number, columnIndex: number): string {\n return `${tableIndex}.${columnIndex}`\n}\n\n/** Positional access into an operator's columns or index lists. */\nexport function itemAt<T>(items: readonly T[], index: number, what: string): T {\n const item = items[index]\n if (item === undefined) {\n rejectPlanFormat(`${what} ${index} is out of range`)\n }\n\n return item\n}\n\nexport function unionOf(...sets: readonly Dependencies[]): Set<number> {\n const union = new Set<number>()\n for (const set of sets) {\n addAll(union, set)\n }\n\n return union\n}\n\nexport function addAll(target: Set<number>, source: Iterable<number>): void {\n for (const item of source) {\n target.add(item)\n }\n}\n\nexport function sameDependencies(left: Dependencies, right: Dependencies): boolean {\n return left.size === right.size && [...left].every((item) => right.has(item))\n}\n",
35
+ "import {\n asObject,\n booleanField,\n field,\n indexField,\n isJsonObject,\n type JsonObject,\n listField,\n nullableObjectField,\n objectField,\n objectListField,\n stringField,\n} from \"./plan-json\"\nimport { addAll, bindingKey, itemAt, type PlanColumn } from \"./plan-relation\"\nimport { reject, rejectPlanFormat } from \"./rejection\"\n\n/** Source columns whose values flow into an expression evaluated over an operator's `input`. */\nexport function expressionDependencies(\n expression: unknown,\n input: readonly PlanColumn[]\n): Set<number> {\n const dependencies = new Set<number>()\n addExpression(dependencies, expression, input)\n return dependencies\n}\n\n/** The sort expressions of an ORDER BY list (`{ type, null_order, expression }` entries). */\nexport function orderExpressions(orders: readonly unknown[]): readonly unknown[] {\n return orders.map((order) => field(asObject(order, \"sort order\"), \"expression\"))\n}\n\n/** `{ orders: [...] }` or null, as aggregates and DISTINCT ON write their ORDER BY. */\nexport function nestedOrderExpressions(object: JsonObject, key: string): readonly unknown[] {\n const orderBy = nullableObjectField(object, key)\n return orderBy === null ? [] : orderExpressions(listField(orderBy, \"orders\"))\n}\n\nfunction addExpression(target: Set<number>, value: unknown, input: readonly PlanColumn[]): void {\n const expression = asObject(value, \"expression\")\n const expressionClass = stringField(expression, \"expression_class\")\n\n switch (expressionClass) {\n case \"BOUND_REF\":\n // Positional: the index-th column of the operator's input.\n addAll(target, itemAt(input, indexField(expression, \"index\"), \"column\").dependencies)\n return\n\n case \"BOUND_COLUMN_REF\":\n addAll(target, columnByBinding(expression, input).dependencies)\n return\n\n case \"BOUND_CONSTANT\":\n return\n\n case \"BOUND_CAST\":\n case \"BOUND_UNNEST\":\n addExpression(target, field(expression, \"child\"), input)\n return\n\n case \"BOUND_FUNCTION\":\n // A lambda body lives in the bind data with its own column numbering, and every column it\n // captures is also passed as an extra child.\n assertNoHiddenExpressions(expression, \"lambda_expr\")\n addExpressions(target, listField(expression, \"children\"), input)\n return\n\n case \"BOUND_AGGREGATE\":\n // FILTER and ORDER BY shape the aggregated value, as a CASE inside the aggregate would.\n assertNoHiddenExpressions(expression)\n addExpressions(target, listField(expression, \"children\"), input)\n addOptionalExpression(target, field(expression, \"filter\"), input)\n addExpressions(target, nestedOrderExpressions(expression, \"order_bys\"), input)\n return\n\n case \"BOUND_WINDOW\":\n addWindowExpression(target, expression, input)\n return\n\n case \"BOUND_COMPARISON\":\n addExpression(target, field(expression, \"left\"), input)\n addExpression(target, field(expression, \"right\"), input)\n return\n\n case \"BOUND_BETWEEN\":\n addExpression(target, field(expression, \"input\"), input)\n addExpression(target, field(expression, \"lower\"), input)\n addExpression(target, field(expression, \"upper\"), input)\n return\n\n case \"BOUND_CONJUNCTION\":\n case \"BOUND_OPERATOR\":\n addExpressions(target, listField(expression, \"children\"), input)\n return\n\n case \"BOUND_CASE\":\n for (const check of objectListField(expression, \"case_checks\")) {\n addExpression(target, field(check, \"when_expr\"), input)\n addExpression(target, field(check, \"then_expr\"), input)\n }\n\n addExpression(target, field(expression, \"else_expr\"), input)\n return\n\n default:\n // Subqueries are always flattened into joins by the planner; parameters, lambda\n // references outside a lambda body, and anything newer are not understood.\n reject(`expression '${expressionClass}' is not supported`)\n }\n}\n\n/**\n * PARTITION BY and ORDER BY are value dependencies of the window column; the window operator also\n * adds them to the row dependencies. FILTER, frame bounds, offsets and defaults shape the value.\n */\nfunction addWindowExpression(\n target: Set<number>,\n expression: JsonObject,\n input: readonly PlanColumn[]\n): void {\n // Only window aggregates serialize a function, with its bind data; ranking and value functions\n // such as row_number() or lag() have none.\n if (stringField(expression, \"type\") === \"WINDOW_AGGREGATE\") {\n assertNoHiddenExpressions(expression)\n }\n\n addExpressions(target, listField(expression, \"children\"), input)\n addExpressions(target, listField(expression, \"partitions\"), input)\n addExpressions(target, orderExpressions(listField(expression, \"orders\")), input)\n addExpressions(target, orderExpressions(listField(expression, \"arg_orders\")), input)\n\n for (const key of [\"filters\", \"start_expr\", \"end_expr\", \"offset_expr\", \"default_expr\"]) {\n addOptionalExpression(target, field(expression, key), input)\n }\n}\n\nfunction addExpressions(\n target: Set<number>,\n expressions: readonly unknown[],\n input: readonly PlanColumn[]\n): void {\n for (const expression of expressions) {\n addExpression(target, expression, input)\n }\n}\n\nfunction addOptionalExpression(\n target: Set<number>,\n expression: unknown,\n input: readonly PlanColumn[]\n): void {\n if (expression !== null) {\n addExpression(target, expression, input)\n }\n}\n\n/**\n * DuckDB leaves the subtree under a table function's input unresolved: columns are referenced by\n * their plan binding instead of their position.\n */\nfunction columnByBinding(expression: JsonObject, input: readonly PlanColumn[]): PlanColumn {\n if (indexField(expression, \"depth\") !== 0) {\n reject(\"correlated column references that the planner did not flatten are not supported\")\n }\n\n const binding = objectField(expression, \"binding\")\n const key = bindingKey(indexField(binding, \"table_index\"), indexField(binding, \"column_index\"))\n const column = input.find((candidate) => candidate.binding === key)\n if (column === undefined) {\n rejectPlanFormat(`column binding ${key} does not resolve`)\n }\n\n return column\n}\n\n/**\n * Function bind data is opaque to the analysis. It may hold the lambda body of a list function,\n * whose captures are also children; any other expression in it would be a hidden dependency.\n */\nfunction assertNoHiddenExpressions(expression: JsonObject, allowedKey?: string): void {\n // Functions without a serializer rebind from their children: there is no bind data to read.\n if (!booleanField(expression, \"has_serialize\")) {\n return\n }\n\n const bindData = field(expression, \"function_data\")\n const inspected =\n isJsonObject(bindData) && allowedKey !== undefined\n ? Object.entries(bindData).flatMap(([key, value]) => (key === allowedKey ? [] : [value]))\n : [bindData]\n\n if (inspected.some(containsExpression)) {\n reject(\n `function '${stringField(expression, \"name\")}' keeps expressions in its bind data, which is not supported`\n )\n }\n}\n\nfunction containsExpression(value: unknown): boolean {\n if (Array.isArray(value)) {\n return value.some((item) => containsExpression(item))\n }\n\n if (!isJsonObject(value)) {\n return false\n }\n\n return Object.hasOwn(value, \"expression_class\") || Object.values(value).some(containsExpression)\n}\n",
36
+ "/**\n * Table functions that compute only from their arguments. Every other table function reads outside\n * the transform's sources (files, catalogs, settings) or runs SQL of its own, like `query()`.\n */\nexport const PURE_TABLE_FUNCTIONS: ReadonlySet<string> = new Set([\n \"range\",\n \"generate_series\",\n \"unnest\",\n \"json_each\",\n \"json_tree\",\n])\n",
37
+ "import { expressionDependencies, nestedOrderExpressions, orderExpressions } from \"./expressions\"\nimport {\n asIndexList,\n asList,\n asObject,\n booleanField,\n field,\n indexField,\n indexListField,\n type JsonObject,\n listField,\n objectField,\n objectListField,\n stringField,\n stringListField,\n} from \"./plan-json\"\nimport {\n addAll,\n bindingKey,\n type Dependencies,\n itemAt,\n type PlanColumn,\n type PlanRelation,\n sameDependencies,\n unionOf,\n VIRTUAL_COLUMN,\n} from \"./plan-relation\"\nimport { reject, rejectPlanFormat } from \"./rejection\"\nimport { PURE_TABLE_FUNCTIONS } from \"./table-functions\"\n\n/** The tables a plan may scan: physical table name, then column name, to a source column id. */\nexport type PlanSourceTables = ReadonlyMap<string, ReadonlyMap<string, number>>\n\n/** Source column ids, sorted, for the whole result and for each output column by position. */\nexport interface PlanLineage {\n readonly rows: readonly number[]\n readonly columns: readonly (readonly number[])[]\n}\n\ninterface WalkContext {\n readonly tables: PlanSourceTables\n /** CTE definitions by table index, set where the CTE is declared. */\n readonly ctes: Map<number, PlanRelation>\n /** Duplicate-eliminated columns of the enclosing DELIM_JOINs, innermost last. */\n readonly delimColumns: (readonly PlanColumn[])[]\n}\n\n/** Recursive CTE lineage grows monotonically; real queries settle within a few rounds. */\nconst MAX_RECURSIVE_CTE_ROUNDS = 64\n\n/**\n * Column lineage of one bound, unoptimized logical plan (`json_serialize_plan(sql, optimize :=\n * false)`), walked bottom-up. Each operator yields its output columns with the source columns their\n * values come from, plus the source columns that decide which rows exist or their order. Those row\n * dependencies accumulate upwards and apply to every output column.\n *\n * Expressions mostly reference their operator's input by position, so each operator below states\n * the order of its output columns.\n */\nexport function planLineage(plan: unknown, tables: PlanSourceTables): PlanLineage {\n const root = evaluate(asObject(plan, \"plan\"), { tables, ctes: new Map(), delimColumns: [] })\n const rows = sortedIds(root.rows)\n const columns = root.columns.map((column) => sortedIds(column.dependencies))\n\n if ([rows, ...columns].some((ids) => ids.includes(VIRTUAL_COLUMN))) {\n reject(\"reading virtual columns such as rowid is not supported\")\n }\n\n return { rows, columns }\n}\n\nfunction evaluate(node: JsonObject, context: WalkContext): PlanRelation {\n const type = stringField(node, \"type\")\n\n switch (type) {\n case \"LOGICAL_GET\":\n return evaluateGet(node, context)\n case \"LOGICAL_DUMMY_SCAN\":\n return evaluateDummyScan(node)\n case \"LOGICAL_EXPRESSION_GET\":\n return evaluateExpressionGet(node, context)\n case \"LOGICAL_PROJECTION\":\n return evaluateProjection(node, context)\n case \"LOGICAL_FILTER\":\n return evaluateFilter(node, context)\n case \"LOGICAL_AGGREGATE_AND_GROUP_BY\":\n return evaluateAggregate(node, context)\n case \"LOGICAL_WINDOW\":\n return evaluateWindow(node, context)\n case \"LOGICAL_UNNEST\":\n return evaluateUnnest(node, context)\n case \"LOGICAL_ORDER_BY\":\n return evaluateOrderBy(node, context)\n case \"LOGICAL_LIMIT\":\n return evaluateLimit(node, context)\n case \"LOGICAL_SAMPLE\":\n // A random sample: no column decides which rows survive.\n return evaluateOnlyChild(node, context)\n case \"LOGICAL_DISTINCT\":\n return evaluateDistinct(node, context)\n case \"LOGICAL_CROSS_PRODUCT\":\n case \"LOGICAL_POSITIONAL_JOIN\":\n return evaluateCrossProduct(node, context)\n case \"LOGICAL_COMPARISON_JOIN\":\n case \"LOGICAL_ASOF_JOIN\":\n return evaluateComparisonJoin(node, context)\n case \"LOGICAL_DELIM_JOIN\":\n return evaluateDelimJoin(node, context)\n case \"LOGICAL_ANY_JOIN\":\n return evaluateAnyJoin(node, context)\n case \"LOGICAL_DELIM_GET\":\n return evaluateDelimGet(node, context)\n case \"LOGICAL_UNION\":\n case \"LOGICAL_EXCEPT\":\n case \"LOGICAL_INTERSECT\":\n return evaluateSetOperation(node, context)\n case \"LOGICAL_MATERIALIZED_CTE\":\n return evaluateMaterializedCte(node, context)\n case \"LOGICAL_RECURSIVE_CTE\":\n return evaluateRecursiveCte(node, context)\n case \"LOGICAL_CTE_REF\":\n return evaluateCteRef(node, context)\n default:\n reject(`plan node '${type}' is not supported`)\n }\n}\n\ninterface ScanSource {\n /** Source columns behind the scanned column at a table or function column index. */\n readonly column: (index: number) => Dependencies\n readonly rows: Dependencies\n}\n\n/**\n * Output: the scanned columns (column_indexes), narrowed to projection_ids when present, then the\n * input columns an in-out table function passes through (projected_input).\n */\nfunction evaluateGet(node: JsonObject, context: WalkContext): PlanRelation {\n if (objectListField(objectField(node, \"table_filters\"), \"filters\").length > 0) {\n rejectPlanFormat(\"an unoptimized scan has pushed-down filters\")\n }\n\n const inputs = objectListField(node, \"children\")\n if (inputs.length > 1) {\n rejectPlanFormat(\"a scan has several inputs\")\n }\n\n const input = inputs[0] === undefined ? undefined : evaluate(inputs[0], context)\n const functionName = stringField(node, \"name\")\n const source =\n functionName === \"seq_scan\"\n ? tableScanSource(node, context, input)\n : tableFunctionSource(functionName, input)\n\n const scanned = objectListField(node, \"column_indexes\").map((entry) =>\n source.column(indexField(entry, \"index\"))\n )\n\n const tableIndex = indexField(node, \"table_index\")\n const projectionIds = indexListField(node, \"projection_ids\")\n const positions = projectionIds.length > 0 ? projectionIds : scanned.map((_, index) => index)\n\n const columns: PlanColumn[] = positions.map((position) => ({\n dependencies: itemAt(scanned, position, \"scanned column\"),\n binding: bindingKey(tableIndex, position),\n }))\n\n for (const position of indexListField(node, \"projected_input\")) {\n if (input === undefined) {\n rejectPlanFormat(\"a scan passes through input columns without an input\")\n }\n\n columns.push(itemAt(input.columns, position, \"input column\"))\n }\n\n return { columns, rows: unionOf(input?.rows ?? new Set(), source.rows) }\n}\n\nfunction tableScanSource(\n node: JsonObject,\n context: WalkContext,\n input: PlanRelation | undefined\n): ScanSource {\n if (input !== undefined) {\n rejectPlanFormat(\"a table scan has an input\")\n }\n\n const table = stringField(objectField(node, \"function_data\"), \"table\")\n const columnIds = context.tables.get(table)\n if (columnIds === undefined) {\n reject(`table '${table}' is not a source of the transform`)\n }\n\n const names = stringListField(node, \"names\")\n return {\n rows: new Set(),\n column: (index) => {\n // Indexes past the table's columns are planner-internal virtual columns.\n const name = names[index]\n if (name === undefined) {\n return new Set([VIRTUAL_COLUMN])\n }\n\n const id = columnIds.get(name)\n if (id === undefined) {\n rejectPlanFormat(`table '${table}' has no column '${name}'`)\n }\n\n return new Set([id])\n },\n }\n}\n\n/**\n * Without an input, a table function's arguments are bound constants. With one (LATERAL arguments,\n * or a subquery as an argument), every produced column and the number of rows derive from it.\n */\nfunction tableFunctionSource(name: string, input: PlanRelation | undefined): ScanSource {\n if (!PURE_TABLE_FUNCTIONS.has(name)) {\n reject(`table function '${name}' is not supported`)\n }\n\n const dependencies =\n input === undefined\n ? new Set<number>()\n : unionOf(...input.columns.map((column) => column.dependencies))\n\n return { rows: dependencies, column: () => dependencies }\n}\n\n/** `SELECT` without FROM: one row of one placeholder column. */\nfunction evaluateDummyScan(node: JsonObject): PlanRelation {\n assertLeaf(node)\n return {\n columns: [{ dependencies: new Set(), binding: bindingKey(indexField(node, \"table_index\"), 0) }],\n rows: new Set(),\n }\n}\n\n/** VALUES: column i is the union of every row's i-th expression. */\nfunction evaluateExpressionGet(node: JsonObject, context: WalkContext): PlanRelation {\n const input = evaluateOnlyChild(node, context)\n const width = listField(node, \"expr_types\").length\n const values = Array.from({ length: width }, () => new Set<number>())\n\n for (const row of listField(node, \"expressions\")) {\n const expressions = asList(row, \"a VALUES row\")\n if (expressions.length !== width) {\n rejectPlanFormat(\"a VALUES row does not match the VALUES width\")\n }\n\n expressions.forEach((expression, index) => {\n addAll(\n itemAt(values, index, \"VALUES column\"),\n expressionDependencies(expression, input.columns)\n )\n })\n }\n\n const tableIndex = indexField(node, \"table_index\")\n return {\n columns: values.map((dependencies, index) => ({\n dependencies,\n binding: bindingKey(tableIndex, index),\n })),\n rows: input.rows,\n }\n}\n\nfunction evaluateProjection(node: JsonObject, context: WalkContext): PlanRelation {\n const input = evaluateOnlyChild(node, context)\n const tableIndex = indexField(node, \"table_index\")\n\n return {\n columns: listField(node, \"expressions\").map((expression, index) => ({\n dependencies: expressionDependencies(expression, input.columns),\n binding: bindingKey(tableIndex, index),\n })),\n rows: input.rows,\n }\n}\n\n/** Output: the window's input columns, then one column per window expression (window_index). */\nfunction evaluateWindow(node: JsonObject, context: WalkContext): PlanRelation {\n const input = evaluateOnlyChild(node, context)\n const windowIndex = indexField(node, \"window_index\")\n const rows = new Set(input.rows)\n\n const windows = objectListField(node, \"expressions\").map((expression, index) => {\n if (stringField(expression, \"expression_class\") !== \"BOUND_WINDOW\") {\n rejectPlanFormat(\"a window operator computes something other than a window function\")\n }\n\n // Partitions and orders decide which rows each window function compares.\n addAll(rows, dependenciesOf(listField(expression, \"partitions\"), input.columns))\n addAll(rows, dependenciesOf(orderExpressions(listField(expression, \"orders\")), input.columns))\n\n return {\n dependencies: expressionDependencies(expression, input.columns),\n binding: bindingKey(windowIndex, index),\n }\n })\n\n return { columns: [...input.columns, ...windows], rows }\n}\n\nfunction evaluateFilter(node: JsonObject, context: WalkContext): PlanRelation {\n const input = evaluateOnlyChild(node, context)\n\n return {\n columns: projectColumns(input.columns, indexListField(node, \"projection_map\")),\n rows: unionOf(input.rows, dependenciesOf(listField(node, \"expressions\"), input.columns)),\n }\n}\n\n/**\n * Output: the groups (group_index), the aggregates (aggregate_index), then one GROUPING() column\n * per grouping function (groupings_index). HAVING is a filter above this operator.\n */\nfunction evaluateAggregate(node: JsonObject, context: WalkContext): PlanRelation {\n const input = evaluateOnlyChild(node, context)\n const groups = listField(node, \"groups\").map((expression) =>\n expressionDependencies(expression, input.columns)\n )\n\n const groupIndex = indexField(node, \"group_index\")\n const aggregateIndex = indexField(node, \"aggregate_index\")\n const groupingsIndex = indexField(node, \"groupings_index\")\n\n const groupColumns = groups.map((dependencies, index) => ({\n dependencies,\n binding: bindingKey(groupIndex, index),\n }))\n\n const aggregateColumns = listField(node, \"expressions\").map((expression, index) => ({\n dependencies: expressionDependencies(expression, input.columns),\n binding: bindingKey(aggregateIndex, index),\n }))\n\n // GROUPING(a, b) tells which of the groups it lists are rolled up in a row.\n const groupingColumns = listField(node, \"grouping_functions\").map((groupIndexes, index) => ({\n dependencies: unionOf(\n ...asIndexList(groupIndexes, \"a grouping function\").map((group) =>\n itemAt(groups, group, \"group\")\n )\n ),\n binding: bindingKey(groupingsIndex, index),\n }))\n\n return {\n columns: [...groupColumns, ...aggregateColumns, ...groupingColumns],\n rows: unionOf(input.rows, ...groups),\n }\n}\n\n/**\n * Output: the input columns, then one column per UNNEST (unnest_index). Unnesting turns each row\n * into as many rows as its list has items, so the lists are row dependencies too.\n */\nfunction evaluateUnnest(node: JsonObject, context: WalkContext): PlanRelation {\n const input = evaluateOnlyChild(node, context)\n const unnestIndex = indexField(node, \"unnest_index\")\n const rows = new Set(input.rows)\n\n const unnested = listField(node, \"expressions\").map((expression, index) => {\n const dependencies = expressionDependencies(expression, input.columns)\n addAll(rows, dependencies)\n return { dependencies, binding: bindingKey(unnestIndex, index) }\n })\n\n return { columns: [...input.columns, ...unnested], rows }\n}\n\n/** A row dependency even without LIMIT: a materialized dataset keeps its row order. */\nfunction evaluateOrderBy(node: JsonObject, context: WalkContext): PlanRelation {\n const input = evaluateOnlyChild(node, context)\n\n return {\n columns: projectColumns(input.columns, indexListField(node, \"projections\")),\n rows: unionOf(\n input.rows,\n dependenciesOf(orderExpressions(listField(node, \"orders\")), input.columns)\n ),\n }\n}\n\nfunction evaluateLimit(node: JsonObject, context: WalkContext): PlanRelation {\n const input = evaluateOnlyChild(node, context)\n\n return {\n columns: input.columns,\n rows: unionOf(\n input.rows,\n limitDependencies(objectField(node, \"limit_val\"), input.columns),\n limitDependencies(objectField(node, \"offset_val\"), input.columns)\n ),\n }\n}\n\nfunction limitDependencies(limit: JsonObject, input: readonly PlanColumn[]): Dependencies {\n const kind = stringField(limit, \"type\")\n\n switch (kind) {\n case \"UNSET\":\n case \"CONSTANT_VALUE\":\n case \"CONSTANT_PERCENTAGE\":\n return new Set()\n case \"EXPRESSION_VALUE\":\n case \"EXPRESSION_PERCENTAGE\":\n return expressionDependencies(field(limit, \"expression\"), input)\n default:\n reject(`LIMIT kind '${kind}' is not supported`)\n }\n}\n\n/** DISTINCT, DISTINCT ON with its ORDER BY, and the deduplication of set operations. */\nfunction evaluateDistinct(node: JsonObject, context: WalkContext): PlanRelation {\n const input = evaluateOnlyChild(node, context)\n\n return {\n columns: input.columns,\n rows: unionOf(\n input.rows,\n dependenciesOf(listField(node, \"distinct_targets\"), input.columns),\n dependenciesOf(nestedOrderExpressions(node, \"order_by\"), input.columns)\n ),\n }\n}\n\n/** Output: the left columns, then the right columns. */\nfunction evaluateCrossProduct(node: JsonObject, context: WalkContext): PlanRelation {\n const [left, right] = evaluateTwoChildren(node, context)\n return { columns: [...left.columns, ...right.columns], rows: unionOf(left.rows, right.rows) }\n}\n\nfunction evaluateComparisonJoin(node: JsonObject, context: WalkContext): PlanRelation {\n const [left, right] = evaluateTwoChildren(node, context)\n return comparisonJoinOutput(node, left, right)\n}\n\n/**\n * A correlated subquery, flattened. The duplicate-eliminated columns are computed over one side\n * (the left, unless delim_flipped), and every DELIM_GET on the other side reads them.\n */\nfunction evaluateDelimJoin(node: JsonObject, context: WalkContext): PlanRelation {\n const [first, second] = twoChildren(node)\n const flipped = booleanField(node, \"delim_flipped\")\n const outer = evaluate(flipped ? second : first, context)\n\n context.delimColumns.push(\n listField(node, \"duplicate_eliminated_columns\").map((expression) => ({\n dependencies: expressionDependencies(expression, outer.columns),\n }))\n )\n\n const inner = evaluate(flipped ? first : second, context)\n context.delimColumns.pop()\n\n return flipped\n ? comparisonJoinOutput(node, inner, outer)\n : comparisonJoinOutput(node, outer, inner)\n}\n\n/** Each side of a condition reads its own input; the residual predicate reads left ++ right. */\nfunction comparisonJoinOutput(\n node: JsonObject,\n left: PlanRelation,\n right: PlanRelation\n): PlanRelation {\n const condition = new Set<number>()\n\n for (const comparison of objectListField(node, \"conditions\")) {\n addAll(condition, expressionDependencies(field(comparison, \"left\"), left.columns))\n addAll(condition, expressionDependencies(field(comparison, \"right\"), right.columns))\n }\n\n const predicate = field(node, \"predicate\")\n if (predicate !== null) {\n addAll(condition, expressionDependencies(predicate, [...left.columns, ...right.columns]))\n }\n\n return joinOutput(node, left, right, condition)\n}\n\n/** A join on an arbitrary condition, which reads left ++ right. */\nfunction evaluateAnyJoin(node: JsonObject, context: WalkContext): PlanRelation {\n const [left, right] = evaluateTwoChildren(node, context)\n const condition = expressionDependencies(field(node, \"condition\"), [\n ...left.columns,\n ...right.columns,\n ])\n\n return joinOutput(node, left, right, condition)\n}\n\n/** Which columns a join outputs depends on its type; its condition decides its rows. */\nfunction joinOutput(\n node: JsonObject,\n left: PlanRelation,\n right: PlanRelation,\n condition: Dependencies\n): PlanRelation {\n const rows = unionOf(left.rows, right.rows, condition)\n const leftColumns = projectColumns(left.columns, indexListField(node, \"left_projection_map\"))\n const rightColumns = projectColumns(right.columns, indexListField(node, \"right_projection_map\"))\n const joinType = stringField(node, \"join_type\")\n\n switch (joinType) {\n case \"INNER\":\n case \"LEFT\":\n case \"RIGHT\":\n case \"FULL\":\n case \"SINGLE\": // a correlated scalar subquery\n return { columns: [...leftColumns, ...rightColumns], rows }\n case \"SEMI\":\n case \"ANTI\":\n return { columns: leftColumns, rows }\n case \"RIGHT_SEMI\":\n case \"RIGHT_ANTI\":\n return { columns: rightColumns, rows }\n case \"MARK\": {\n // EXISTS, IN or ANY used as a value: a boolean column (mark_index) telling whether the\n // condition matched.\n const mark = {\n dependencies: condition,\n binding: bindingKey(indexField(node, \"mark_index\"), 0),\n }\n return { columns: [...leftColumns, mark], rows }\n }\n default:\n reject(`join type '${joinType}' is not supported`)\n }\n}\n\nfunction evaluateDelimGet(node: JsonObject, context: WalkContext): PlanRelation {\n assertLeaf(node)\n const delimColumns = context.delimColumns.at(-1)\n if (delimColumns === undefined) {\n rejectPlanFormat(\"a DELIM_GET is outside any DELIM_JOIN\")\n }\n\n if (listField(node, \"chunk_types\").length !== delimColumns.length) {\n rejectPlanFormat(\"a DELIM_GET does not match its DELIM_JOIN\")\n }\n\n return { columns: rebind(delimColumns, indexField(node, \"table_index\")), rows: new Set() }\n}\n\n/** UNION ALL chains are flattened: a set operation may have more than two inputs. */\nfunction evaluateSetOperation(node: JsonObject, context: WalkContext): PlanRelation {\n const inputs = objectListField(node, \"children\").map((child) => evaluate(child, context))\n const width = indexField(node, \"column_count\")\n if (inputs.length < 2 || inputs.some((input) => input.columns.length !== width)) {\n rejectPlanFormat(\"set operation inputs do not match\")\n }\n\n const tableIndex = indexField(node, \"table_index\")\n const rows = unionOf(...inputs.map((input) => input.rows))\n\n if (stringField(node, \"type\") === \"LOGICAL_UNION\") {\n const columns = Array.from({ length: width }, (_, index) => ({\n dependencies: unionOf(\n ...inputs.map((input) => itemAt(input.columns, index, \"column\").dependencies)\n ),\n binding: bindingKey(tableIndex, index),\n }))\n\n // Without ALL, deduplication compares every column.\n if (!booleanField(node, \"setop_all\")) {\n addAll(rows, unionOf(...columns.map((column) => column.dependencies)))\n }\n\n return { columns, rows }\n }\n\n // EXCEPT and INTERSECT: values come from the first input; whether a row survives depends on\n // every column of every input.\n for (const input of inputs) {\n addAll(rows, unionOf(...input.columns.map((column) => column.dependencies)))\n }\n\n return { columns: rebind(itemAt(inputs, 0, \"input\").columns, tableIndex), rows }\n}\n\n/**\n * The first input defines the CTE, the second is the query reading it. The planner emits this node\n * for every CTE, materialized or not, since inlining is an optimizer step. A CTE adds its row\n * dependencies only where a CTE_REF reads it.\n */\nfunction evaluateMaterializedCte(node: JsonObject, context: WalkContext): PlanRelation {\n const [definition, query] = twoChildren(node)\n context.ctes.set(indexField(node, \"table_index\"), evaluate(definition, context))\n return evaluate(query, context)\n}\n\n/**\n * The first input is the anchor, the second the recursive step, which reads the CTE through CTE_REFs\n * to this table_index. The step is re-evaluated against the accumulated lineage until it is stable.\n */\nfunction evaluateRecursiveCte(node: JsonObject, context: WalkContext): PlanRelation {\n const [anchorNode, stepNode] = twoChildren(node)\n const tableIndex = indexField(node, \"table_index\")\n const unionAll = booleanField(node, \"union_all\")\n const keyTargets = listField(node, \"key_targets\")\n let current = evaluate(anchorNode, context)\n\n for (let round = 0; round < MAX_RECURSIVE_CTE_ROUNDS; round += 1) {\n context.ctes.set(tableIndex, current)\n const step = evaluate(stepNode, context)\n if (step.columns.length !== current.columns.length) {\n rejectPlanFormat(\"recursive CTE branches have different widths\")\n }\n\n const columns = current.columns.map((column, index) => ({\n dependencies: unionOf(\n column.dependencies,\n itemAt(step.columns, index, \"column\").dependencies\n ),\n binding: bindingKey(tableIndex, index),\n }))\n\n const rows = unionOf(current.rows, step.rows, dependenciesOf(keyTargets, columns))\n\n // Without ALL, deduplication compares every column.\n if (!unionAll) {\n addAll(rows, unionOf(...columns.map((column) => column.dependencies)))\n }\n\n const next = { columns, rows }\n if (sameRelation(current, next)) {\n return next\n }\n\n current = next\n }\n\n reject(\"recursive CTE lineage did not converge\")\n}\n\nfunction evaluateCteRef(node: JsonObject, context: WalkContext): PlanRelation {\n assertLeaf(node)\n const definition = context.ctes.get(indexField(node, \"cte_index\"))\n if (definition === undefined) {\n rejectPlanFormat(\"a CTE_REF reads an undefined CTE\")\n }\n\n if (listField(node, \"chunk_types\").length !== definition.columns.length) {\n rejectPlanFormat(\"a CTE_REF does not match its CTE\")\n }\n\n return {\n columns: rebind(definition.columns, indexField(node, \"table_index\")),\n rows: definition.rows,\n }\n}\n\nfunction twoChildren(node: JsonObject): readonly [JsonObject, JsonObject] {\n const children = objectListField(node, \"children\")\n const [first, second] = children\n if (children.length !== 2 || first === undefined || second === undefined) {\n rejectPlanFormat(`'${stringField(node, \"type\")}' should have two inputs`)\n }\n\n return [first, second]\n}\n\nfunction evaluateTwoChildren(\n node: JsonObject,\n context: WalkContext\n): readonly [PlanRelation, PlanRelation] {\n const [left, right] = twoChildren(node)\n return [evaluate(left, context), evaluate(right, context)]\n}\n\nfunction evaluateOnlyChild(node: JsonObject, context: WalkContext): PlanRelation {\n const children = objectListField(node, \"children\")\n const [child] = children\n if (children.length !== 1 || child === undefined) {\n rejectPlanFormat(`'${stringField(node, \"type\")}' should have one input`)\n }\n\n return evaluate(child, context)\n}\n\nfunction assertLeaf(node: JsonObject): void {\n if (objectListField(node, \"children\").length > 0) {\n rejectPlanFormat(`'${stringField(node, \"type\")}' should have no input`)\n }\n}\n\n/** An operator's projection map selects input columns by position; empty keeps them all. */\nfunction projectColumns(\n columns: readonly PlanColumn[],\n projectionMap: readonly number[]\n): readonly PlanColumn[] {\n return projectionMap.length === 0\n ? columns\n : projectionMap.map((index) => itemAt(columns, index, \"projected column\"))\n}\n\n/** The same columns, exposed under another operator's table index. */\nfunction rebind(columns: readonly PlanColumn[], tableIndex: number): readonly PlanColumn[] {\n return columns.map((column, index) => ({\n dependencies: column.dependencies,\n binding: bindingKey(tableIndex, index),\n }))\n}\n\nfunction dependenciesOf(\n expressions: readonly unknown[],\n input: readonly PlanColumn[]\n): Dependencies {\n return unionOf(...expressions.map((expression) => expressionDependencies(expression, input)))\n}\n\nfunction sameRelation(left: PlanRelation, right: PlanRelation): boolean {\n return (\n sameDependencies(left.rows, right.rows) &&\n left.columns.every((column, index) =>\n sameDependencies(column.dependencies, itemAt(right.columns, index, \"column\").dependencies)\n )\n )\n}\n\nfunction sortedIds(ids: Dependencies): readonly number[] {\n return [...ids].sort((left, right) => left - right)\n}\n",
38
+ "import { isJsonObject, type JsonObject, listField, objectField, stringField } from \"./plan-json\"\nimport { reject } from \"./rejection\"\nimport { PURE_TABLE_FUNCTIONS } from \"./table-functions\"\n\n/**\n * Checks the parse tree (`json_serialize_sql`) before DuckDB binds the query. Binding already runs\n * table functions' bind code, and table macros such as `query()` only expand during binding, so\n * they must be refused from the parse tree. PIVOT is refused here because its output columns depend\n * on data the empty analysis tables do not have.\n */\nexport function assertSingleSelect(statements: readonly unknown[]): void {\n const [statement] = statements\n if (statements.length !== 1 || statement === undefined) {\n reject(\"the transform must be exactly one SELECT statement\")\n }\n\n visit(statement, (node) => {\n if (node.type === \"PIVOT\") {\n const unpivot = listField(node, \"unpivot_names\").length > 0\n reject(`${unpivot ? \"UNPIVOT\" : \"PIVOT\"} is not supported`)\n }\n\n const unread = readsBeyondSources(node)\n if (unread) reject(unread)\n })\n}\n\n/**\n * Whether the statement reads nothing but its sources, for a transform the analysis rejected: then\n * every column it outputs depends on at most every column of its sources. PIVOT reads only its\n * input.\n *\n * Data reaches a query through its table references. Each must be one of `sourceTables`, or a\n * common table expression an enclosing query defines; a table function must compute from its\n * arguments alone. A name a query does not define resolves to a table of the lake.\n *\n * A function must carry a name DuckDB itself defines, one of `builtinFunctions`: a macro the\n * lake's setup defines can read any table, and its call shows none.\n */\nexport function readsOnlySources(\n statements: readonly unknown[],\n sourceTables: ReadonlySet<string>,\n builtinFunctions: ReadonlySet<string>\n): boolean {\n const [statement] = statements\n if (statements.length !== 1 || statement === undefined) return false\n\n let only = true\n visit(statement, (node, ctes) => {\n if (readsBeyondSources(node)) only = false\n else if (node.type === \"BASE_TABLE\" && !readsSourceOrCte(node, sourceTables, ctes)) only = false\n else if (callsUnknownFunction(node, builtinFunctions)) only = false\n })\n\n return only\n}\n\n/** What makes a node read outside the transform's sources, if anything. */\nfunction readsBeyondSources(node: JsonObject): string | undefined {\n if (node.type === \"SHOW_REF\") {\n return \"DESCRIBE, SHOW and SUMMARIZE are not supported\"\n }\n\n if (node.type === \"TABLE_FUNCTION\") {\n const name = stringField(objectField(node, \"function\"), \"function_name\")\n if (!PURE_TABLE_FUNCTIONS.has(name)) return `table function '${name}' is not supported`\n }\n\n if (node.class === \"PARAMETER\") {\n return \"query parameters are not supported\"\n }\n\n return undefined\n}\n\nfunction readsSourceOrCte(\n table: JsonObject,\n sourceTables: ReadonlySet<string>,\n ctes: ReadonlySet<string>\n): boolean {\n if (qualified(table, \"schema_name\") || qualified(table, \"catalog_name\")) return false\n\n const name = stringField(table, \"table_name\")\n return sourceTables.has(name) || ctes.has(name.toLowerCase())\n}\n\n/**\n * DuckDB writes syntax such as `EXTRACT`, `[1, 2]` or `{a: 1}` as calls to functions of schema\n * `main`, so only another schema or a catalog qualifies a call.\n */\nfunction callsUnknownFunction(node: JsonObject, builtinFunctions: ReadonlySet<string>): boolean {\n if (node.class !== \"FUNCTION\" && node.class !== \"WINDOW\") return false\n if (qualified(node, \"catalog\") || (qualified(node, \"schema\") && node.schema !== \"main\")) {\n return true\n }\n\n const name = node.function_name\n return typeof name !== \"string\" || !builtinFunctions.has(name.toLowerCase())\n}\n\nfunction qualified(node: JsonObject, key: string): boolean {\n const value = node[key]\n return typeof value === \"string\" && value !== \"\"\n}\n\n/**\n * Visit every node of a parse tree, with the names of the common table expressions in scope, which\n * DuckDB matches without regard to case.\n *\n * A query's body sees all of its expressions. An expression's own query sees only those defined\n * before it, and a recursive one sees itself in its recursive part alone: any other name resolves\n * to a table of the lake, so `WITH raw AS (SELECT * FROM raw)` reads the lake's `raw`.\n */\nfunction visit(\n value: unknown,\n check: (node: JsonObject, ctes: ReadonlySet<string>) => void,\n ctes: ReadonlySet<string> = new Set()\n): void {\n if (Array.isArray(value)) {\n for (const item of value) visit(item, check, ctes)\n return\n }\n\n if (!isJsonObject(value)) return\n\n const entries = cteEntries(value)\n const defined = new Set(ctes)\n for (const { name, query } of entries) {\n visit(query, check, new Set(defined))\n defined.add(name)\n }\n\n check(value, defined)\n\n const recursive =\n value.type === \"RECURSIVE_CTE_NODE\" && typeof value.cte_name === \"string\"\n ? new Set([...defined, value.cte_name.toLowerCase()])\n : undefined\n\n for (const [key, child] of Object.entries(value)) {\n if (key === \"cte_map\" && entries.length > 0) continue\n visit(child, check, key === \"right\" && recursive ? recursive : defined)\n }\n}\n\n/**\n * A query's common table expressions, in the order it defines them. A map in a shape this does not\n * know gives none: its nodes are then visited as any others, with no name in scope.\n */\nfunction cteEntries(\n node: JsonObject\n): readonly { readonly name: string; readonly query: unknown }[] {\n const map = node.cte_map\n if (!isJsonObject(map) || !Array.isArray(map.map)) return []\n\n const entries: { name: string; query: unknown }[] = []\n for (const entry of map.map) {\n if (!isJsonObject(entry) || typeof entry.key !== \"string\" || !isJsonObject(entry.value)) {\n return []\n }\n entries.push({ name: entry.key.toLowerCase(), query: entry.value.query })\n }\n return entries\n}\n",
39
+ "import { randomUUID } from \"node:crypto\"\nimport type { DatasetDefinition } from \"@sixb/core\"\nimport type {\n BeginDatasetMergeInput,\n BeginDatasetWriteInput,\n DatasetMergeCommitResult,\n DatasetProducer,\n DatasetVersion,\n DatasetVersionLineage,\n DatasetWriteCommitResult,\n DatasetWriteMode,\n LakeMergeSession,\n LakeWriteSession,\n} from \"@sixb/core/lake-storage\"\nimport {\n assertUnsequencedDatasetWrite,\n getDatasetPrimaryKeyColumns,\n hasDatasetProvenanceChanges,\n LakeConcurrencyError,\n LakeStorageError,\n lineageAtCommit,\n retryDatasetMergeCommit,\n} from \"@sixb/core/lake-storage\"\nimport type { DuckLakeStorageOptions } from \"../types\"\nimport { localCatalogCoordinationKey } from \"./catalog-key\"\nimport {\n type ApplyDatasetRowsResult,\n applyDatasetRowsFromRelation,\n assertDatasetWriteMode,\n type CommitRowCount,\n} from \"./dataset-row-commit\"\nimport { applyDatasetMergeFromRelation } from \"./dataset-row-merge\"\nimport { getBigIntLike } from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport type { DuckLakeConnectionManager } from \"./ducklake-connection-manager\"\nimport type { DuckLakeDatasetCatalog } from \"./ducklake-dataset-catalog\"\nimport { createDuckLakeMergeSession, type DuckLakeCommitMergeInput } from \"./ducklake-merge-session\"\nimport type { DuckLakeSnapshotReader, DuckLakeVersionSummary } from \"./ducklake-snapshot-reader\"\nimport {\n beginTransactionOnLatestVersion,\n CatalogMovedError,\n commitVersionTransaction,\n isSqliteCatalog,\n rerunWhenCatalogMoves,\n} from \"./ducklake-version-transaction\"\nimport { createDuckLakeWriteSession, type DuckLakeCommitWriteInput } from \"./ducklake-write-session\"\nimport { encodeLineage } from \"./lineage-encoding\"\nimport { encodeDatasetTableName } from \"./names\"\nimport {\n duckLakeAlias,\n duckLakeMetadataTableName,\n qualifiedTableName,\n quoteIdentifier,\n quoteSqlString,\n} from \"./sql\"\nimport { parseCommitMetadata, parseVersionId, type SixbCommitMetadata } from \"./versions\"\n\nexport interface DuckLakeCommitDatasetVersionInput {\n readonly dataset: DatasetDefinition\n readonly mode: DatasetWriteMode\n readonly expectedLatestVersionId?: string | null\n readonly commitMessage: string\n readonly producer?: BeginDatasetWriteInput[\"producer\"]\n readonly inputs?: BeginDatasetWriteInput[\"inputs\"]\n /** The lineage of the rows written, as `BeginDatasetWriteInput.lineage`. */\n readonly lineage?: BeginDatasetWriteInput[\"lineage\"]\n applyChanges(\n runtime: DuckDbQueryRuntime,\n context: DuckLakeApplyChangesContext\n ): Promise<ApplyDatasetRowsResult>\n}\n\ninterface DuckLakeCommitVersionOutcomeInput\n extends Omit<DuckLakeCommitDatasetVersionInput, \"expectedLatestVersionId\" | \"mode\"> {\n readonly mode: DatasetWriteMode | \"merge\"\n readonly expectedLatestVersionId?: string | null\n readonly allowInitialNoOp?: boolean\n readonly signal?: AbortSignal\n readonly optimisticOperation?: \"commit\" | \"merge commit\"\n}\n\ninterface DuckLakeCommitVersionOutcomeRuntimeInput extends DuckLakeCommitVersionOutcomeInput {\n readonly runtime: DuckDbQueryRuntime\n}\n\nexport interface DuckLakeApplyChangesContext {\n readonly previousRowCount?: number\n readonly validatedPrimaryKeyColumns?: readonly string[]\n}\n\n/**\n * Owns the durable DuckLake transaction for a staged Sixb write.\n *\n * Write sessions keep validation and temp staging table mechanics close to the\n * caller. This coordinator handles everything that changes shared DuckLake\n * state: attachment refresh, optimistic guards, row replacement/append,\n * commit_extra_info, no-op detection, and DatasetVersion hydration.\n */\nexport class DuckLakeWriteCoordinator {\n constructor(\n private readonly options: DuckLakeStorageOptions,\n private readonly connections: DuckLakeConnectionManager,\n private readonly datasets: DuckLakeDatasetCatalog,\n private readonly snapshots: DuckLakeSnapshotReader\n ) {}\n\n async beginWrite(input: BeginDatasetWriteInput): Promise<LakeWriteSession> {\n this.connections.assertOpen()\n\n const definition = await this.datasets.getDataset(input.dataset.id)\n if (!definition) {\n throw new LakeStorageError(`[SixbDuckLake] Unknown dataset '${input.dataset.id}'.`)\n }\n\n this.datasets.assertSchema(definition)\n assertUnsequencedDatasetWrite(definition)\n const mode = input.mode ?? \"snapshot\"\n assertDatasetWriteMode(mode, \"write\")\n\n // Staging tables are connection-scoped in DuckDB. In the single-runtime\n // model every active write session creates a uniquely named temp table on\n // the shared runtime; the durable commit later runs on that same\n // connection under an exclusive queue slot.\n const runtime = await this.connections.stagingRuntime()\n return createDuckLakeWriteSession({\n commitWrite: (options) => this.commitWrite(options),\n runtime,\n write: {\n ...input,\n dataset: definition,\n mode,\n },\n })\n }\n\n async beginMerge(input: BeginDatasetMergeInput): Promise<LakeMergeSession> {\n this.connections.assertOpen()\n\n const definition = await this.datasets.getDataset(input.dataset.id)\n if (!definition) {\n throw new LakeStorageError(`[SixbDuckLake] Unknown dataset '${input.dataset.id}'.`)\n }\n if (getDatasetPrimaryKeyColumns(definition) === null) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${definition.id}' must define a primaryKey before it can be merged.`\n )\n }\n\n this.datasets.assertSchema(definition)\n const latestVersion = await this.connections.withAttachedRuntime((runtime) =>\n this.snapshots.getLatestVersionForDefinition(runtime, definition)\n )\n if (\n input.expectedLatestVersionId !== undefined &&\n latestVersion?.versionId !== input.expectedLatestVersionId\n ) {\n throw new LakeConcurrencyError(\n `[SixbDuckLake] Optimistic merge start failed for dataset '${definition.id}': expected latest version '${input.expectedLatestVersionId}', found '${latestVersion?.versionId ?? \"none\"}'.`\n )\n }\n const runtime = await this.connections.stagingRuntime()\n return createDuckLakeMergeSession({\n commitMerge: (options) => this.commitMerge(options),\n runtime,\n merge: { ...input, dataset: definition },\n baseVersionId: latestVersion?.versionId ?? null,\n })\n }\n\n private async commitWrite(input: DuckLakeCommitWriteInput): Promise<DatasetWriteCommitResult> {\n const definition = await this.datasets.getDataset(input.write.dataset.id)\n if (!definition) {\n throw new LakeStorageError(`[SixbDuckLake] Unknown dataset '${input.write.dataset.id}'.`)\n }\n\n const mode = input.write.mode ?? \"snapshot\"\n assertDatasetWriteMode(mode, \"write\")\n\n return this.commitDatasetVersion({\n dataset: definition,\n mode,\n expectedLatestVersionId: input.commit?.expectedLatestVersionId,\n commitMessage: input.commit?.commitMessage ?? `write dataset ${input.write.dataset.id}`,\n producer: input.write.producer,\n inputs: input.write.inputs,\n lineage: input.write.lineage,\n applyChanges: (runtime, context) =>\n this.applyStagedRows({\n ...input,\n runtime,\n previousRowCount: context.previousRowCount,\n }),\n })\n }\n\n private async commitMerge(input: DuckLakeCommitMergeInput): Promise<DatasetMergeCommitResult> {\n const definition = await this.datasets.getDataset(input.merge.dataset.id)\n if (!definition) {\n throw new LakeStorageError(`[SixbDuckLake] Unknown dataset '${input.merge.dataset.id}'.`)\n }\n if (getDatasetPrimaryKeyColumns(definition) === null) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${definition.id}' must define a primaryKey before it can be merged.`\n )\n }\n\n return retryDatasetMergeCommit(input.merge, input.commit, (rebase) =>\n this.withCommitRuntime(async (runtime) => {\n input.commit?.signal?.throwIfAborted()\n const baseVersionId = rebase\n ? ((await this.snapshots.getLatestVersionForDefinition(runtime, definition))?.versionId ??\n null)\n : input.baseVersionId\n return this.commitVersionOutcomeOnExclusiveRuntime(runtime, {\n dataset: definition,\n mode: \"merge\",\n expectedLatestVersionId: baseVersionId,\n allowInitialNoOp: !input.commit?.createInitialVersion,\n signal: input.commit?.signal,\n optimisticOperation: \"merge commit\",\n commitMessage: input.commit?.commitMessage ?? `merge dataset ${definition.id}`,\n producer: input.merge.producer,\n inputs: input.merge.inputs,\n applyChanges: async (commitRuntime, context) => {\n const result = await applyDatasetMergeFromRelation({\n options: this.options,\n runtime: commitRuntime,\n dataset: definition,\n stagingTableName: input.stagingTableName,\n sequenceColumnName: input.sequenceColumnName,\n kindColumnName: input.kindColumnName,\n previousRowCount: context.previousRowCount,\n validatedPrimaryKeyColumns: context.validatedPrimaryKeyColumns,\n })\n if (result.sourceRowCount !== input.changesWritten) {\n throw new LakeStorageError(\n `[SixbDuckLake] Staged merge for dataset '${definition.id}' accepted ${input.changesWritten} change(s), but DuckLake saw ${result.sourceRowCount} source change(s) at commit time.`\n )\n }\n return result\n },\n })\n })\n )\n }\n\n async commitDatasetVersion(\n input: DuckLakeCommitDatasetVersionInput\n ): Promise<DatasetWriteCommitResult> {\n return this.withCommitRuntime((runtime) =>\n this.commitDatasetVersionOnExclusiveRuntime(runtime, input)\n )\n }\n\n async withCommitRuntime<T>(run: (runtime: DuckDbQueryRuntime) => Promise<T>): Promise<T> {\n return withCatalogCommitLock(this.options, async () => {\n // `withExclusiveAttached` refreshes local catalogs before the exclusive\n // slot, then holds the local attachment boundary through the commit.\n return this.connections.withExclusiveAttached(run)\n })\n }\n\n async commitDatasetVersionOnExclusiveRuntime(\n runtime: DuckDbQueryRuntime,\n input: DuckLakeCommitDatasetVersionInput\n ): Promise<DatasetWriteCommitResult> {\n assertUnsequencedDatasetWrite(input.dataset)\n const result = await this.commitVersionOutcomeOnExclusiveRuntime(runtime, input)\n if (result.version === null) {\n throw new LakeStorageError(\n `[SixbDuckLake] No DuckLake changes were committed for dataset '${input.dataset.id}', and no previous version exists.`\n )\n }\n\n return { ...result.version, outcome: result.outcome }\n }\n\n private async commitVersionOutcomeOnExclusiveRuntime(\n runtime: DuckDbQueryRuntime,\n input: DuckLakeCommitVersionOutcomeInput\n ): Promise<DatasetMergeCommitResult> {\n // Staged rows outlive a failed transaction, so a rerun applies exactly the same changes.\n return rerunWhenCatalogMoves(\n input.dataset.id,\n () => this.commitDatasetVersionUnlocked({ ...input, runtime }),\n input.signal\n )\n }\n\n private async commitDatasetVersionUnlocked(\n input: DuckLakeCommitVersionOutcomeRuntimeInput\n ): Promise<DatasetMergeCommitResult> {\n // Capture the write connection's last committed DuckLake snapshot before\n // and after COMMIT. The commitId in DuckLake commit_extra_info proves\n // which snapshot belongs to this transaction.\n const previousWriteSnapshotId = await this.lastCommittedSnapshotId(input.runtime)\n\n let committed = false\n try {\n const latestVersion = await this.beginVersionTransaction(input)\n if (input.expectedLatestVersionId !== undefined) {\n this.assertExpectedLatestVersion({\n datasetId: input.dataset.id,\n expectedLatestVersionId: input.expectedLatestVersionId,\n actualLatestVersionId: latestVersion?.versionId ?? null,\n operation: input.optimisticOperation ?? \"commit\",\n })\n }\n\n const lineage = lineageAtCommit({\n mode: input.mode,\n schema: input.dataset.schema,\n producer: input.producer,\n written: input.lineage,\n parent: latestVersion,\n })\n\n const changeResult = await input.applyChanges(input.runtime, {\n previousRowCount: latestVersion?.rowCount,\n validatedPrimaryKeyColumns: latestVersion?.validatedPrimaryKeyColumns,\n })\n input.signal?.throwIfAborted()\n\n // A commit that changes no rows is decided against the latest version it compared with.\n const noOpBase = changeResult.dataChangeExpected\n ? undefined\n : latestVersion === undefined\n ? await this.latestVersionAtReadSnapshot(input)\n : latestVersion\n\n const createsVersion =\n noOpBase === undefined || this.noOpCreatesVersion(input, noOpBase, lineage)\n if (createsVersion && mustClaimTable(input, changeResult, lineage)) {\n await this.claimTable(input)\n }\n\n const commitId = randomUUID()\n await this.setCommitMetadata(\n input,\n commitId,\n commitRowCount(input, changeResult, latestVersion),\n lineage\n )\n\n await commitVersionTransaction(\n input.runtime,\n input.dataset.id,\n createsVersion && mustCommitOnReadSnapshot(input, changeResult)\n ? { poisonRuntime: () => this.connections.poisonRuntime() }\n : undefined\n )\n committed = true\n\n const committedWriteSnapshotId = await this.lastCommittedSnapshotId(input.runtime)\n try {\n return await this.versionForCommittedWrite({\n ...input,\n commitId,\n previousWriteSnapshotId,\n committedWriteSnapshotId,\n changeResult,\n noOpBaseVersionId: noOpBase?.versionId ?? null,\n })\n } finally {\n await this.connections.detachLocalCatalogAfterCommit(input.runtime)\n }\n } catch (error) {\n if (!committed) {\n await this.rollbackTransaction(input.runtime)\n }\n throw error\n }\n }\n\n private async versionForCommittedWrite(\n input: DuckLakeCommitVersionOutcomeRuntimeInput & {\n readonly commitId: string\n readonly previousWriteSnapshotId: string | null\n readonly committedWriteSnapshotId: string | null\n readonly changeResult: ApplyDatasetRowsResult\n /** The latest version a commit that changes no rows was compared with. */\n readonly noOpBaseVersionId: string | null\n }\n ): Promise<DatasetMergeCommitResult> {\n // Hydrate the committed version on the same exclusive runtime. That keeps\n // snapshot matching and row-count fallback inside the same serialized\n // connection state that just committed.\n const ownSnapshotId = await this.findOwnSnapshotId(\n input.runtime,\n input.dataset.id,\n input.commitId,\n input.previousWriteSnapshotId,\n input.committedWriteSnapshotId\n )\n\n if (ownSnapshotId !== null) {\n const version = await this.snapshots.getVersionForSnapshot(\n input.runtime,\n input.dataset,\n ownSnapshotId\n )\n if (version) {\n return { outcome: \"created\", version }\n }\n\n throw new LakeStorageError(\n `[SixbDuckLake] DuckLake committed snapshot '${ownSnapshotId}' for dataset '${input.dataset.id}', but Sixb could not hydrate it as a dataset version.`\n )\n }\n\n if (!input.changeResult.dataChangeExpected) {\n const version = await this.versionForNoOpCommit(\n input.runtime,\n input.dataset,\n input.allowInitialNoOp ?? false\n )\n if (input.expectedLatestVersionId !== undefined) {\n this.assertExpectedLatestVersion({\n datasetId: input.dataset.id,\n expectedLatestVersionId: input.expectedLatestVersionId,\n actualLatestVersionId: version?.versionId ?? null,\n operation: input.optimisticOperation ?? \"commit\",\n })\n }\n\n // Nothing was committed: the write matched the version this transaction read. Another\n // writer moved the latest version since, and the write may not match that one.\n if ((version?.versionId ?? null) !== input.noOpBaseVersionId) {\n throw new CatalogMovedError(\n `[SixbDuckLake] Dataset '${input.dataset.id}' changed while an unchanged write was compared with it.`\n )\n }\n\n return {\n outcome: \"unchanged\",\n version,\n }\n }\n\n if (input.committedWriteSnapshotId === input.previousWriteSnapshotId) {\n throw new LakeStorageError(\n `[SixbDuckLake] DuckLake commit for dataset '${input.dataset.id}' completed without producing a snapshot for this non-empty write.`\n )\n }\n\n throw new LakeStorageError(\n `[SixbDuckLake] DuckLake commit for dataset '${input.dataset.id}' completed, but Sixb could not find a matching snapshot for this write.`\n )\n }\n\n private async applyStagedRows(\n input: DuckLakeCommitWriteInput & {\n readonly runtime: DuckDbQueryRuntime\n readonly previousRowCount?: number\n }\n ): Promise<ApplyDatasetRowsResult> {\n const mode = input.write.mode ?? \"snapshot\"\n const result = await applyDatasetRowsFromRelation({\n options: this.options,\n runtime: input.runtime,\n dataset: input.write.dataset,\n mode,\n sourceRelationSql: quoteIdentifier(input.stagingTableName),\n previousRowCount: input.previousRowCount,\n })\n\n if (result.sourceRowCount !== input.rowsWritten) {\n throw new LakeStorageError(\n `[SixbDuckLake] Staged write for dataset '${input.write.dataset.id}' accepted ${input.rowsWritten} row(s), but DuckLake saw ${result.sourceRowCount} source row(s) at commit time.`\n )\n }\n\n return result\n }\n\n private async setCommitMetadata(\n input: DuckLakeCommitVersionOutcomeRuntimeInput,\n commitId: string,\n rowCount: CommitRowCount,\n lineage: DatasetVersionLineage | undefined\n ): Promise<void> {\n // DuckLake stores this JSON on the snapshot it creates for the current\n // transaction. Version id, timestamp, and data-change detection still come\n // from DuckLake itself. commitId is only a transaction correlation token so\n // concurrent writers do not accidentally hydrate each other's snapshots.\n // Every keyed data path either replaces the baseline or validates its uniqueness before this\n // marker is persisted. Merge commits can therefore avoid repeating that full-table audit.\n const validatedPrimaryKeyColumns = getDatasetPrimaryKeyColumns(input.dataset)\n const metadata: SixbCommitMetadata = {\n kind: \"datasetVersion\",\n datasetId: input.dataset.id,\n commitId,\n mode: input.mode,\n producer: input.producer ? structuredClone(input.producer) : undefined,\n inputs: input.inputs ? structuredClone(input.inputs) : undefined,\n ...(rowCount.kind === \"exact\" ? { rowCount: rowCount.value } : {}),\n ...(validatedPrimaryKeyColumns !== null\n ? { validatedPrimaryKeyColumns: [...validatedPrimaryKeyColumns] }\n : {}),\n ...(lineage === undefined ? {} : { lineage: encodeLineage(lineage) }),\n }\n\n await input.runtime.run(\n `CALL ${quoteIdentifier(duckLakeAlias(this.options))}.set_commit_message(${quoteSqlString(\n \"Sixb\"\n )}, ${quoteSqlString(input.commitMessage)}, extra_info => ${quoteSqlString(\n JSON.stringify({ sixb: metadata })\n )})`\n )\n }\n\n /**\n * Claims the table for the version this transaction commits by reapplying its current comment:\n * an idempotent metadata write, which DuckLake records as altering the table. A transaction\n * that changes a table another one altered since it began then fails to commit, before storing\n * anything, and reruns on the new latest version (see `mustClaimTable`).\n *\n * It also gives a version that changes no rows, an initial empty write or a change of\n * provenance, a DuckLake snapshot: DuckLake 1.5.2 creates none for a transaction whose data and\n * metadata are unchanged, and set_commit_message alone cannot force one.\n *\n * Altering a table bumps DuckLake's catalog-wide schema version: every connection reloads its\n * catalog, and concurrent writers to other tables slow down. Versions claim only when needed.\n */\n private async claimTable(input: DuckLakeCommitVersionOutcomeRuntimeInput): Promise<void> {\n const table = qualifiedTableName(this.options, encodeDatasetTableName(input.dataset.id))\n const descriptionSql =\n input.dataset.description === undefined ? \"NULL\" : quoteSqlString(input.dataset.description)\n await input.runtime.run(`COMMENT ON TABLE ${table} IS ${descriptionSql}`)\n }\n\n /** A commit that changes no rows still creates a version for a first version or new provenance. */\n private noOpCreatesVersion(\n input: DuckLakeCommitVersionOutcomeRuntimeInput,\n latestVersion: DuckLakeVersionSummary | null,\n lineage: DatasetVersionLineage | undefined\n ): boolean {\n if (!latestVersion) {\n return !input.allowInitialNoOp\n }\n\n return (\n input.mode !== \"merge\" &&\n hasDatasetProvenanceChanges(latestVersion, {\n datasetId: input.dataset.id,\n schema: input.dataset.schema,\n producer: input.producer,\n inputs: input.inputs,\n lineage,\n })\n )\n }\n\n /**\n * The latest version a write that began without reading it compared its rows with: the one at\n * the lake snapshot its first read fixed. The version metadata also shows versions committed\n * since. One of this dataset means the rows were compared with an older version, so the write\n * reruns.\n */\n private async latestVersionAtReadSnapshot(\n input: DuckLakeCommitVersionOutcomeRuntimeInput\n ): Promise<DuckLakeVersionSummary | null> {\n const { snapshotId, latestVersion } =\n await this.snapshots.getLatestVersionSummaryAtCurrentSnapshot(input.runtime, input.dataset)\n\n if (latestVersion && BigInt(parseVersionId(latestVersion.versionId)) > BigInt(snapshotId)) {\n throw new CatalogMovedError(\n `[SixbDuckLake] Dataset '${input.dataset.id}' changed while an unchanged write was compared with it.`\n )\n }\n\n return latestVersion\n }\n\n private async versionForNoOpCommit(\n runtime: DuckDbQueryRuntime,\n definition: DatasetDefinition,\n allowInitialNoOp: boolean\n ): Promise<DatasetVersion | null> {\n const latestVersion = await this.snapshots.getLatestVersionForDefinition(runtime, definition)\n if (latestVersion) {\n return latestVersion\n }\n\n if (allowInitialNoOp) {\n return null\n }\n\n throw new LakeStorageError(\n `[SixbDuckLake] No DuckLake changes were committed for dataset '${definition.id}', and no previous version exists.`\n )\n }\n\n private async rollbackTransaction(runtime: DuckDbQueryRuntime): Promise<void> {\n try {\n await runtime.run(\"ROLLBACK\")\n } catch {\n // Preserve the original write failure. DuckDB may already have closed\n // the transaction if COMMIT itself failed.\n }\n }\n\n /**\n * Every version but a snapshot keeps its parent's rows, and the lineage it records merges the\n * parent's. A snapshot replaces its parent: it reads it only to guard on it, or on SQLite, whose\n * later reads inside the transaction would block its commit.\n */\n private async beginVersionTransaction(\n input: DuckLakeCommitVersionOutcomeRuntimeInput\n ): Promise<DuckLakeVersionSummary | null | undefined> {\n if (\n input.mode === \"snapshot\" &&\n input.expectedLatestVersionId === undefined &&\n !isSqliteCatalog(this.options.catalog)\n ) {\n await input.runtime.run(\"BEGIN TRANSACTION\")\n return undefined\n }\n\n return beginTransactionOnLatestVersion({\n options: this.options,\n runtime: input.runtime,\n datasetId: input.dataset.id,\n signal: input.signal,\n readLatestVersion: () =>\n this.snapshots.getLatestVersionSummaryAtCurrentSnapshot(input.runtime, input.dataset),\n })\n }\n\n private async lastCommittedSnapshotId(runtime: DuckDbQueryRuntime): Promise<string | null> {\n // DuckLake reports the last snapshot committed by this connection.\n const [row] = await runtime.query(\n `SELECT id FROM ${quoteIdentifier(duckLakeAlias(this.options))}.last_committed_snapshot()`\n )\n if (row === undefined || row.id === null || row.id === undefined) {\n return null\n }\n\n return String(getBigIntLike(row, \"id\"))\n }\n\n private async findSnapshotIdByCommitId(\n runtime: DuckDbQueryRuntime,\n datasetId: string,\n commitId: string,\n snapshotId?: string\n ): Promise<string | null> {\n if (snapshotId !== undefined) {\n assertDuckLakeSnapshotId(snapshotId)\n }\n\n const ducklakeSnapshotChanges = duckLakeMetadataTableName(\n this.options,\n \"ducklake_snapshot_changes\"\n )\n const whereSql = snapshotId === undefined ? \"\" : `WHERE snapshot_id = ${snapshotId}`\n const orderSql = snapshotId === undefined ? \"ORDER BY snapshot_id DESC\" : \"\"\n const rows = await runtime.query(`\n SELECT snapshot_id, commit_extra_info\n FROM ${ducklakeSnapshotChanges}\n ${whereSql}\n ${orderSql}\n `)\n\n for (const row of rows) {\n const metadata = parseCommitMetadata(row.commit_extra_info)\n if (metadata?.datasetId === datasetId && metadata.commitId === commitId) {\n return String(getBigIntLike(row, \"snapshot_id\"))\n }\n }\n\n return null\n }\n\n private async findOwnSnapshotId(\n runtime: DuckDbQueryRuntime,\n datasetId: string,\n commitId: string,\n previousWriteSnapshotId: string | null,\n committedWriteSnapshotId: string | null\n ): Promise<string | null> {\n if (committedWriteSnapshotId === null || committedWriteSnapshotId === previousWriteSnapshotId) {\n return null\n }\n\n const exactMatch = await this.findSnapshotIdByCommitId(\n runtime,\n datasetId,\n commitId,\n committedWriteSnapshotId\n )\n if (exactMatch !== null) {\n return exactMatch\n }\n\n // Defensive fallback for driver/version edge cases. The expected hot path\n // above reads a single metadata row keyed by last_committed_snapshot().\n return this.findSnapshotIdByCommitId(runtime, datasetId, commitId)\n }\n\n private assertExpectedLatestVersion(input: {\n readonly datasetId: string\n readonly expectedLatestVersionId?: string | null\n readonly actualLatestVersionId: string | null\n readonly operation: \"commit\" | \"merge commit\"\n }): void {\n if (input.expectedLatestVersionId === undefined) {\n return\n }\n\n if (input.actualLatestVersionId !== input.expectedLatestVersionId) {\n throw new LakeConcurrencyError(\n `[SixbDuckLake] Optimistic ${input.operation} failed for dataset '${input.datasetId}': expected latest version '${input.expectedLatestVersionId ?? \"none\"}', found '${input.actualLatestVersionId ?? \"none\"}'.`\n )\n }\n }\n}\n\n/**\n * Whether a version must claim its table so that a concurrent commit cannot build on it unseen.\n *\n * DuckLake commits a transaction on top of snapshots committed since it began unless one of them\n * altered the table or deleted rows it held. Only the earlier commit decides: a claim protects the\n * version that makes it from concurrent commits that land after it, never the reverse. A commit\n * that builds on a version it did not see keeps that version's rows, but stores the lineage of\n * the parent it read. For lineage, that is only wrong when the unseen version's stored lineage\n * carries dependencies: rows that depend on their own columns only add nothing to any lineage, so\n * two unkeyed appends to a dataset no pipeline writes may commit in any order. Commits that record\n * more of their parent than its lineage do not build on unseen versions (see\n * `mustCommitOnReadSnapshot`).\n *\n * - A version that changes no rows claims: it is also how it gets a snapshot.\n * - A write into an empty table claims, whatever it holds. It deletes nothing, so a snapshot that\n * also read the table empty would delete nothing either, and keep the rows it replaces.\n * - A snapshot that deleted rows needs no claim: any concurrent change to the table conflicts with\n * its deletes.\n * - A keyed append or merge claims. DuckLake has no primary key: two writes that insert one new\n * key both commit unless the earlier one claims.\n * - An unkeyed append into a table with rows claims when the lineage it stores carries a\n * dependency, or is unknown. A concurrent snapshot of that table deletes rows, and conflicts.\n */\nfunction mustClaimTable(\n input: DuckLakeCommitVersionOutcomeRuntimeInput,\n changeResult: ApplyDatasetRowsResult,\n lineage: DatasetVersionLineage | undefined\n): boolean {\n if (!changeResult.dataChangeExpected || changeResult.targetWasEmpty) {\n return true\n }\n\n if (input.mode === \"snapshot\") {\n return false\n }\n\n return (\n getDatasetPrimaryKeyColumns(input.dataset) !== null ||\n carriesDependencies(input.producer, lineage)\n )\n}\n\n/**\n * Whether a version must fail on any snapshot committed since its transaction began, rather than\n * commit on top of one that does not conflict with it. A version that did not claim its table (see\n * `mustClaimTable`) can only be built on unseen by a commit that records nothing of its parent but\n * its lineage, which that version cannot change. Two kinds of commit record more:\n *\n * - One that inserts and deletes no rows of its table, such as a version of new provenance, a\n * merge that only advances source ordering, or a schema change. DuckLake checks it against\n * nothing, and it would stand for rows it never compared.\n * - An unkeyed append guarded on the version it read, which an unclaimed append could move.\n */\nfunction mustCommitOnReadSnapshot(\n input: DuckLakeCommitVersionOutcomeRuntimeInput,\n changeResult: ApplyDatasetRowsResult\n): boolean {\n if (!changeResult.changedTableRows) {\n return true\n }\n\n return (\n input.expectedLatestVersionId !== undefined &&\n input.mode === \"append\" &&\n getDatasetPrimaryKeyColumns(input.dataset) === null\n )\n}\n\n/** Whether a stored lineage says the version's rows depend on any column but their own. */\nfunction carriesDependencies(\n producer: DatasetProducer | undefined,\n lineage: DatasetVersionLineage | undefined\n): boolean {\n if (lineage === undefined) {\n // A pipeline version without lineage could hold anything.\n return producer?.kind === \"pipeline\"\n }\n\n if (\"unknown\" in lineage) {\n return true\n }\n\n return lineage.rows.length > 0 || Object.values(lineage.columns).some((refs) => refs.length > 0)\n}\n\nfunction commitRowCount(\n input: Pick<DuckLakeCommitVersionOutcomeInput, \"expectedLatestVersionId\" | \"mode\">,\n changeResult: ApplyDatasetRowsResult,\n latestVersion: DuckLakeVersionSummary | null | undefined\n): CommitRowCount {\n // Unguarded append commits can be retried by DuckLake after this transaction\n // read the previous latest version. In that case previousRowCount +\n // sourceRowCount can underreport the committed snapshot, so leave the count unknown.\n if (input.mode === \"append\" && input.expectedLatestVersionId === undefined) {\n return { kind: \"unknown\" }\n }\n\n if (changeResult.resultingRowCount.kind === \"exact\") {\n return changeResult.resultingRowCount\n }\n\n if (input.mode === \"append\" && latestVersion === null) {\n return { kind: \"exact\", value: changeResult.sourceRowCount }\n }\n\n return { kind: \"unknown\" }\n}\n\nfunction assertDuckLakeSnapshotId(snapshotId: string): void {\n if (!/^\\d+$/.test(snapshotId)) {\n throw new LakeStorageError(`[SixbDuckLake] Invalid DuckLake snapshot id '${snapshotId}'.`)\n }\n}\n\n// Local metadata catalogs are useful for dev/test, but they do not have the\n// same multi-connection conflict behavior as PostgreSQL. Serialize local\n// commits within this process so a losing writer cannot hydrate another\n// connection's snapshot during DuckLake conflict handling.\nconst localCatalogCommitLocks = new Map<string, Promise<void>>()\n\nasync function withCatalogCommitLock<T>(\n options: DuckLakeStorageOptions,\n run: () => Promise<T>\n): Promise<T> {\n const key = localCatalogCoordinationKey(options)\n if (key === undefined) {\n return run()\n }\n\n const previous = localCatalogCommitLocks.get(key) ?? Promise.resolve()\n const ready = previous.catch(() => {})\n let release!: () => void\n const next = new Promise<void>((resolve) => {\n release = resolve\n })\n const current = ready.then(() => next)\n localCatalogCommitLocks.set(key, current)\n\n await ready\n try {\n return await run()\n } finally {\n release()\n if (localCatalogCommitLocks.get(key) === current) {\n localCatalogCommitLocks.delete(key)\n }\n }\n}\n",
40
+ "import type { DatasetDefinition } from \"@sixb/core\"\nimport {\n type DatasetSequenceChange,\n type DatasetSequenceState,\n getDatasetPrimaryKeyColumns,\n LakeStorageError,\n reconcileDatasetSequences,\n} from \"@sixb/core/lake-storage\"\nimport type { DuckLakeStorageOptions } from \"../types\"\nimport { type ApplyDatasetRowsResult, inspectUniqueKeyedRelation } from \"./dataset-row-commit\"\nimport { getBigIntLike, getOptionalString, getString } from \"./duckdb-row\"\nimport type { DuckDbQueryRuntime } from \"./duckdb-runtime\"\nimport { encodeDatasetSequenceTableName, encodeDatasetTableName } from \"./names\"\nimport { datasetSchemaColumnNamesSql } from \"./schema\"\nimport { qualifiedTableName, quoteIdentifier, quoteSqlString } from \"./sql\"\n\nexport interface ApplyDatasetMergeFromRelationInput {\n readonly options: DuckLakeStorageOptions\n readonly runtime: DuckDbQueryRuntime\n readonly dataset: DatasetDefinition\n readonly stagingTableName: string\n readonly sequenceColumnName: string\n readonly kindColumnName: string\n readonly previousRowCount?: number\n readonly validatedPrimaryKeyColumns?: readonly string[]\n}\n\ninterface MergeEffectCounts {\n readonly inserts: number\n readonly updates: number\n readonly deletes: number\n}\n\nexport async function applyDatasetMergeFromRelation(\n input: ApplyDatasetMergeFromRelationInput\n): Promise<ApplyDatasetRowsResult> {\n const primaryKeyColumns = getDatasetPrimaryKeyColumns(input.dataset)\n if (primaryKeyColumns === null) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${input.dataset.id}' must define a primaryKey before it can be merged.`\n )\n }\n\n const stagingTable = quoteIdentifier(input.stagingTableName)\n const targetTable = qualifiedTableName(input.options, encodeDatasetTableName(input.dataset.id))\n const sourceRowCount = await countRows(input.runtime, stagingTable)\n const previousRowCount = await currentBaselineRowCount(input, targetTable, primaryKeyColumns)\n\n return withMaterializedFinalChanges(\n input,\n primaryKeyColumns,\n async (finalChanges, orderingChanged) => {\n const effects = await countMergeEffects(input, targetTable, finalChanges, primaryKeyColumns)\n const effectiveChangeCount = effects.inserts + effects.updates + effects.deletes\n\n if (effectiveChangeCount === 0) {\n return {\n dataChangeExpected: orderingChanged,\n sourceRowCount,\n resultingRowCount: { kind: \"exact\", value: previousRowCount },\n targetWasEmpty: previousRowCount === 0,\n changedTableRows: false,\n }\n }\n\n const keyMatchSql = primaryKeyMatchSql(primaryKeyColumns, \"target\", \"source\")\n const rowDifferenceSql = datasetRowDifferenceSql(input.dataset, \"target\", \"source\")\n const kindColumn = `source.${quoteIdentifier(input.kindColumnName)}`\n\n await input.runtime.run(`\n DELETE FROM ${targetTable} AS target\n USING ${finalChanges} AS source\n WHERE ${keyMatchSql}\n AND (\n ${kindColumn} = ${quoteSqlString(\"delete\")}\n OR (\n ${kindColumn} = ${quoteSqlString(\"upsert\")}\n AND (${rowDifferenceSql})\n )\n )\n `)\n\n const columnsSql = datasetSchemaColumnNamesSql(input.dataset.schema)\n const selectedColumnsSql = input.dataset.schema.columns\n .map((column) => `source.${quoteIdentifier(column.name)}`)\n .join(\", \")\n const firstSequenceColumnName = firstSequenceName(input.sequenceColumnName)\n await input.runtime.run(`\n INSERT INTO ${targetTable} (${columnsSql})\n SELECT ${selectedColumnsSql}\n FROM ${finalChanges} AS source\n WHERE ${kindColumn} = ${quoteSqlString(\"upsert\")}\n AND NOT EXISTS (\n SELECT 1\n FROM ${targetTable} AS target\n WHERE ${keyMatchSql}\n )\n ORDER BY source.${quoteIdentifier(firstSequenceColumnName)}\n `)\n\n return {\n dataChangeExpected: true,\n sourceRowCount,\n resultingRowCount: {\n kind: \"exact\",\n value: previousRowCount + effects.inserts - effects.deletes,\n },\n targetWasEmpty: previousRowCount === 0,\n changedTableRows: true,\n }\n }\n )\n}\n\n/** The companion table is current state, committed in the same DuckLake transaction as rows.\n * It is not recovered from expirable snapshot history. Only keys present in staging are read.\n */\nasync function applySourceOrdering(\n input: ApplyDatasetMergeFromRelationInput,\n acceptedTable: string\n): Promise<boolean> {\n const source = quoteIdentifier(`${input.sequenceColumnName}_source`)\n const ordinal = quoteIdentifier(input.sequenceColumnName)\n const staging = quoteIdentifier(input.stagingTableName)\n const stateTable = qualifiedTableName(\n input.options,\n encodeDatasetSequenceTableName(input.dataset.id)\n )\n await input.runtime.run(\n `CREATE TEMP TABLE ${acceptedTable} (source_key VARCHAR, ordinal UBIGINT)`\n )\n let lastOrdinal = -1n\n let changed = false\n while (true) {\n const staged = await input.runtime.query(\n `SELECT ${ordinal} AS ordinal, ${source} AS source FROM ${staging}\n WHERE ${ordinal} > ${lastOrdinal} ORDER BY ${ordinal} LIMIT 1000`\n )\n if (staged.length === 0) return changed\n const changes = staged.map(\n (row) => JSON.parse(getString(row, \"source\")) as DatasetSequenceChange\n )\n lastOrdinal = getBigIntLike(staged[staged.length - 1]!, \"ordinal\")\n const batchKeys = changes.map((change) => quoteSqlString(change.key)).join(\",\")\n const current = await input.runtime.query(\n `SELECT * FROM ${stateTable} WHERE source_key IN (${batchKeys})`\n )\n const previous = new Map<string, DatasetSequenceState>()\n for (const row of current) {\n previous.set(getString(row, \"source_key\"), {\n sequence: getString(row, \"sequence\"),\n content: getOptionalString(row, \"content\") ?? null,\n })\n }\n // Earlier batches are visible inside this transaction. A later conflict rolls them all back.\n const { states, accepted } = reconcileDatasetSequences(input.dataset, previous, changes)\n if (accepted.size === 0) continue\n changed = true\n const stateValues: string[] = []\n const acceptedValues: string[] = []\n for (const [key, index] of accepted) {\n const state = states.get(key)!\n stateValues.push(\n `(${quoteSqlString(key)}, ${quoteSqlString(state.sequence)}, ${state.content === null ? \"NULL\" : quoteSqlString(state.content)})`\n )\n acceptedValues.push(`(${quoteSqlString(key)}, ${getBigIntLike(staged[index]!, \"ordinal\")})`)\n }\n const keys = [...accepted.keys()].map(quoteSqlString).join(\",\")\n await input.runtime.run(`DELETE FROM ${stateTable} WHERE source_key IN (${keys})`)\n await input.runtime.run(`INSERT INTO ${stateTable} VALUES ${stateValues.join(\",\")}`)\n await input.runtime.run(`DELETE FROM ${acceptedTable} WHERE source_key IN (${keys})`)\n await input.runtime.run(`INSERT INTO ${acceptedTable} VALUES ${acceptedValues.join(\",\")}`)\n }\n}\n\nasync function currentBaselineRowCount(\n input: ApplyDatasetMergeFromRelationInput,\n targetTable: string,\n primaryKeyColumns: readonly string[]\n): Promise<number> {\n // Sixb writes mark keyed versions only after the write path has enforced uniqueness. Older or\n // external versions carry no marker and keep the full defensive audit.\n if (sameColumns(input.validatedPrimaryKeyColumns, primaryKeyColumns)) {\n return input.previousRowCount ?? countRows(input.runtime, targetTable)\n }\n\n return inspectUniqueKeyedRelation({\n runtime: input.runtime,\n dataset: input.dataset,\n relationSql: targetTable,\n context: \"current baseline\",\n })\n}\n\nasync function withMaterializedFinalChanges<T>(\n input: ApplyDatasetMergeFromRelationInput,\n primaryKeyColumns: readonly string[],\n run: (finalChangesTable: string, orderingChanged: boolean) => Promise<T>\n): Promise<T> {\n const table = quoteIdentifier(`${input.stagingTableName}_final`)\n const acceptedTable = quoteIdentifier(`${input.stagingTableName}_accepted`)\n\n let outcome:\n | { readonly kind: \"success\"; readonly value: T }\n | { readonly kind: \"error\"; readonly error: unknown }\n try {\n const sequenced = input.dataset.sequenceBy !== undefined\n const orderingChanged = sequenced ? await applySourceOrdering(input, acceptedTable) : false\n const ordinal = quoteIdentifier(input.sequenceColumnName)\n const selectSql = sequenced\n ? `SELECT source.*, source.${ordinal} AS ${quoteIdentifier(firstSequenceName(input.sequenceColumnName))}\n FROM ${quoteIdentifier(input.stagingTableName)} AS source\n JOIN ${acceptedTable} AS accepted ON source.${ordinal} = accepted.ordinal`\n : finalChangesSelectSql(input, primaryKeyColumns)\n await input.runtime.run(`CREATE TEMP TABLE ${table} AS ${selectSql}`)\n outcome = { kind: \"success\", value: await run(table, orderingChanged) }\n } catch (error) {\n outcome = { kind: \"error\", error }\n }\n\n try {\n await input.runtime.run(`DROP TABLE IF EXISTS ${table}`)\n await input.runtime.run(`DROP TABLE IF EXISTS ${acceptedTable}`)\n } catch (cleanupError) {\n if (outcome.kind === \"success\") {\n throw cleanupError\n }\n }\n\n if (outcome.kind === \"error\") {\n throw outcome.error\n }\n\n return outcome.value\n}\n\nfunction finalChangesSelectSql(\n input: ApplyDatasetMergeFromRelationInput,\n primaryKeyColumns: readonly string[]\n): string {\n const sequenceColumn = quoteIdentifier(input.sequenceColumnName)\n const keyColumnsSql = primaryKeyColumns.map((column) => quoteIdentifier(column)).join(\", \")\n const rankColumn = quoteIdentifier(rankName(input.sequenceColumnName))\n const firstSequenceColumn = quoteIdentifier(firstSequenceName(input.sequenceColumnName))\n\n return `\n SELECT * EXCLUDE (${rankColumn})\n FROM (\n SELECT\n *,\n min(${sequenceColumn}) OVER (PARTITION BY ${keyColumnsSql}) AS ${firstSequenceColumn},\n row_number() OVER (\n PARTITION BY ${keyColumnsSql}\n ORDER BY ${sequenceColumn} DESC\n ) AS ${rankColumn}\n FROM ${quoteIdentifier(input.stagingTableName)}\n ) ranked_changes\n WHERE ${rankColumn} = 1\n `\n}\n\nasync function countMergeEffects(\n input: ApplyDatasetMergeFromRelationInput,\n targetTable: string,\n finalChanges: string,\n primaryKeyColumns: readonly string[]\n): Promise<MergeEffectCounts> {\n const matchColumn = primaryKeyColumns[0]\n if (matchColumn === undefined) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${input.dataset.id}' primaryKey must contain at least one column.`\n )\n }\n\n const keyMatchSql = primaryKeyMatchSql(primaryKeyColumns, \"target\", \"source\")\n const targetMatch = `target.${quoteIdentifier(matchColumn)} IS NOT NULL`\n const kindColumn = `source.${quoteIdentifier(input.kindColumnName)}`\n const rowDifferenceSql = datasetRowDifferenceSql(input.dataset, \"target\", \"source\")\n const [row] = await input.runtime.query(`\n SELECT\n count(*) FILTER (\n WHERE ${kindColumn} = ${quoteSqlString(\"upsert\")} AND NOT (${targetMatch})\n ) AS insert_count,\n count(*) FILTER (\n WHERE ${kindColumn} = ${quoteSqlString(\"upsert\")}\n AND ${targetMatch}\n AND (${rowDifferenceSql})\n ) AS update_count,\n count(*) FILTER (\n WHERE ${kindColumn} = ${quoteSqlString(\"delete\")} AND ${targetMatch}\n ) AS delete_count\n FROM ${finalChanges} AS source\n LEFT JOIN ${targetTable} AS target ON ${keyMatchSql}\n `)\n\n return {\n inserts: row === undefined ? 0 : Number(getBigIntLike(row, \"insert_count\")),\n updates: row === undefined ? 0 : Number(getBigIntLike(row, \"update_count\")),\n deletes: row === undefined ? 0 : Number(getBigIntLike(row, \"delete_count\")),\n }\n}\n\nfunction primaryKeyMatchSql(\n primaryKeyColumns: readonly string[],\n leftAlias: string,\n rightAlias: string\n): string {\n return primaryKeyColumns\n .map(\n (column) =>\n `${leftAlias}.${quoteIdentifier(column)} = ${rightAlias}.${quoteIdentifier(column)}`\n )\n .join(\" AND \")\n}\n\nfunction datasetRowDifferenceSql(\n dataset: DatasetDefinition,\n leftAlias: string,\n rightAlias: string\n): string {\n return dataset.schema.columns\n .map(\n (column) =>\n `${leftAlias}.${quoteIdentifier(column.name)} IS DISTINCT FROM ${rightAlias}.${quoteIdentifier(\n column.name\n )}`\n )\n .join(\" OR \")\n}\n\nasync function countRows(runtime: DuckDbQueryRuntime, relationSql: string): Promise<number> {\n const [row] = await runtime.query(`SELECT count(*) AS row_count FROM ${relationSql}`)\n return row === undefined ? 0 : Number(getBigIntLike(row, \"row_count\"))\n}\n\nfunction rankName(sequenceColumnName: string): string {\n return `${sequenceColumnName}_rank`\n}\n\nfunction firstSequenceName(sequenceColumnName: string): string {\n return `${sequenceColumnName}_first`\n}\n\nfunction sameColumns(left: readonly string[] | undefined, right: readonly string[]): boolean {\n return (\n left !== undefined &&\n left.length === right.length &&\n left.every((value, index) => value === right[index])\n )\n}\n",
31
41
  "import { randomUUID } from \"node:crypto\"\nimport type { DatasetRow, MergeChange } from \"@sixb/core\"\nimport type {\n BeginDatasetMergeInput,\n CommitDatasetMergeInput,\n DatasetMergeCommitResult,\n LakeMergeSession,\n} from \"@sixb/core/lake-storage\"\nimport {\n cloneDatasetMergeChange,\n datasetSequenceChange,\n getDatasetMergeChangeValidationError,\n LakeStorageError,\n} from \"@sixb/core/lake-storage\"\nimport type { DuckDbRuntime } from \"./duckdb-runtime\"\nimport { appendDatasetRow } from \"./row-appender\"\nimport { datasetSchemaToDuckDbNullableColumnsSql } from \"./schema\"\nimport { quoteIdentifier } from \"./sql\"\n\nexport interface DuckLakeCommitMergeInput {\n readonly merge: BeginDatasetMergeInput\n readonly baseVersionId: string | null\n readonly commit?: CommitDatasetMergeInput\n readonly stagingTableName: string\n readonly sequenceColumnName: string\n readonly kindColumnName: string\n readonly changesWritten: number\n}\n\ntype DuckLakeCommitMerge = (input: DuckLakeCommitMergeInput) => Promise<DatasetMergeCommitResult>\n\nconst MERGE_CHANGE_BATCH_SIZE = 1000\n\ninterface StagedMergeChange {\n readonly sequence: bigint\n readonly change: MergeChange<DatasetRow, DatasetRow>\n}\n\ninterface CreateDuckLakeMergeSessionInput {\n readonly commitMerge: DuckLakeCommitMerge\n readonly runtime: DuckDbRuntime\n readonly merge: BeginDatasetMergeInput\n readonly baseVersionId: string | null\n}\n\nexport async function createDuckLakeMergeSession(\n input: CreateDuckLakeMergeSessionInput\n): Promise<LakeMergeSession> {\n const suffix = randomUUID().replaceAll(\"-\", \"\")\n const stagingTableName = `sixb_merge_${suffix}`\n const sequenceColumnName = `sixb_merge_sequence_${suffix}`\n const kindColumnName = `sixb_merge_kind_${suffix}`\n\n await input.runtime.run(`\n CREATE TEMP TABLE ${quoteIdentifier(stagingTableName)} (\n ${quoteIdentifier(sequenceColumnName)} UBIGINT NOT NULL,\n ${quoteIdentifier(kindColumnName)} VARCHAR NOT NULL,\n ${input.merge.dataset.sequenceBy === undefined ? \"\" : `${quoteIdentifier(`${sequenceColumnName}_source`)} VARCHAR NOT NULL,`}\n ${datasetSchemaToDuckDbNullableColumnsSql(input.merge.dataset.schema)}\n )\n `)\n\n return new DuckLakeMergeSession(\n input.commitMerge,\n input.runtime,\n input.merge,\n input.baseVersionId,\n stagingTableName,\n sequenceColumnName,\n kindColumnName\n )\n}\n\nclass DuckLakeMergeSession implements LakeMergeSession {\n private closed = false\n private cleanedUp = false\n private nextSequence = 0n\n private changesWritten = 0\n\n constructor(\n private readonly commitMerge: DuckLakeCommitMerge,\n private readonly runtime: DuckDbRuntime,\n private readonly input: BeginDatasetMergeInput,\n private readonly baseVersionId: string | null,\n private readonly stagingTableName: string,\n private readonly sequenceColumnName: string,\n private readonly kindColumnName: string\n ) {}\n\n async writeChanges(\n changes:\n | Iterable<MergeChange<DatasetRow, DatasetRow>>\n | AsyncIterable<MergeChange<DatasetRow, DatasetRow>>\n ): Promise<void> {\n this.assertOpen()\n\n let batch: StagedMergeChange[] = []\n for await (const change of changes) {\n const validationError = getDatasetMergeChangeValidationError(change, this.input.dataset)\n if (validationError) {\n throw new LakeStorageError(`[SixbDuckLake] ${validationError}`)\n }\n\n batch.push({\n sequence: this.nextSequence,\n change: cloneDatasetMergeChange(change),\n })\n this.nextSequence += 1n\n\n if (batch.length >= MERGE_CHANGE_BATCH_SIZE) {\n await this.appendBatchToStagingTable(batch)\n batch = []\n await Bun.sleep(0)\n }\n }\n\n if (batch.length > 0) {\n await this.appendBatchToStagingTable(batch)\n }\n }\n\n private async appendBatchToStagingTable(batch: readonly StagedMergeChange[]): Promise<void> {\n await this.runtime.withAppender(this.stagingTableName, (appender) => {\n for (const staged of batch) {\n appender.appendBigInt(staged.sequence)\n appender.appendVarchar(staged.change.kind)\n if (this.input.dataset.sequenceBy !== undefined) {\n appender.appendVarchar(\n JSON.stringify(datasetSequenceChange(this.input.dataset, staged.change))\n )\n }\n appendDatasetRow(\n appender,\n this.input.dataset.schema,\n staged.change.kind === \"upsert\" ? staged.change.row : staged.change.key\n )\n }\n })\n this.changesWritten += batch.length\n }\n\n async commit(input?: CommitDatasetMergeInput): Promise<DatasetMergeCommitResult> {\n this.assertOpen()\n this.closed = true\n\n let committed = false\n try {\n const result = await this.commitMerge({\n merge: this.input,\n baseVersionId: this.baseVersionId,\n commit: input,\n stagingTableName: this.stagingTableName,\n sequenceColumnName: this.sequenceColumnName,\n kindColumnName: this.kindColumnName,\n changesWritten: this.changesWritten,\n })\n committed = true\n await this.cleanup()\n return result\n } catch (error) {\n if (!committed) {\n await this.cleanup()\n }\n throw error\n }\n }\n\n async abort(): Promise<void> {\n if (this.closed) {\n return\n }\n\n this.closed = true\n await this.cleanup()\n }\n\n private assertOpen(): void {\n if (this.closed) {\n throw new LakeStorageError(\"[SixbDuckLake] Merge session is already closed.\")\n }\n }\n\n private async cleanup(): Promise<void> {\n if (this.cleanedUp) {\n return\n }\n\n this.cleanedUp = true\n try {\n await this.runtime.run(`DROP TABLE IF EXISTS ${quoteIdentifier(this.stagingTableName)}`)\n } catch {\n // Preserve the commit/abort outcome. Temp tables disappear when the storage runtime closes.\n }\n }\n}\n",
32
42
  "import type { DuckDBValue } from \"@duckdb/node-api\"\nimport type { DatasetColumnDefinition, DatasetRow, DatasetSchema, FileRef } from \"@sixb/core\"\nimport { normalizeDuckDbDecimalValue } from \"./duckdb-decimal\"\nimport type { DuckDbAppender } from \"./duckdb-runtime\"\n\n/**\n * Append one validated dataset row into the staging table's DuckDB appender.\n */\nexport function appendDatasetRow(\n appender: DuckDbAppender,\n schema: DatasetSchema,\n row: DatasetRow\n): void {\n for (const column of schema.columns) {\n appendColumnValue(appender, column, row[column.name] ?? null)\n }\n\n appender.endRow()\n}\n\nfunction appendColumnValue(\n appender: DuckDbAppender,\n column: DatasetColumnDefinition,\n value: unknown\n): void {\n if (value === null || value === undefined) {\n appender.appendNull()\n return\n }\n\n switch (column.type) {\n case \"string\":\n appender.appendVarchar(value as string)\n return\n case \"boolean\":\n appender.appendBoolean(value as boolean)\n return\n case \"int64\":\n appender.appendBigInt(typeof value === \"bigint\" ? value : BigInt(value as string | number))\n return\n case \"float64\":\n appender.appendDouble(value as number)\n return\n case \"decimal\":\n appender.appendVarchar(normalizeDuckDbDecimalValue(value, column.name))\n return\n case \"date\":\n appender.appendVarchar(\n value instanceof Date ? value.toISOString().slice(0, 10) : String(value)\n )\n return\n case \"timestamp\":\n appender.appendVarchar(value instanceof Date ? value.toISOString() : String(value))\n return\n case \"json\":\n appender.appendVarchar(JSON.stringify(value))\n return\n case \"fileRef\":\n appender.appendStruct(fileRefToDuckDbStruct(value as FileRef))\n return\n }\n}\n\nfunction fileRefToDuckDbStruct(fileRef: FileRef): Readonly<Record<string, DuckDBValue>> {\n return {\n blobId: fileRef.blobId,\n digest: fileRef.digest,\n sizeBytes: BigInt(fileRef.sizeBytes),\n fileName: fileRef.fileName ?? null,\n mediaType: fileRef.mediaType ?? null,\n logicalPath: fileRef.logicalPath ?? null,\n }\n}\n",
33
43
  "import { randomUUID } from \"node:crypto\"\nimport type { DatasetRow } from \"@sixb/core\"\nimport { getDatasetRowValidationError } from \"@sixb/core\"\nimport type {\n BeginDatasetWriteInput,\n CommitDatasetWriteInput,\n DatasetWriteCommitResult,\n LakeWriteSession,\n} from \"@sixb/core/lake-storage\"\nimport {\n encodeDatasetPrimaryKey,\n getDatasetPrimaryKeyColumns,\n LakeStorageError,\n} from \"@sixb/core/lake-storage\"\nimport type { DuckDbRuntime } from \"./duckdb-runtime\"\nimport { appendDatasetRow } from \"./row-appender\"\nimport { datasetSchemaToDuckDbColumnsSql } from \"./schema\"\nimport { quoteIdentifier } from \"./sql\"\n\nexport interface DuckLakeCommitWriteInput {\n readonly write: BeginDatasetWriteInput\n readonly commit?: CommitDatasetWriteInput\n readonly stagingTableName: string\n readonly rowsWritten: number\n}\n\ntype DuckLakeCommitWrite = (options: DuckLakeCommitWriteInput) => Promise<DatasetWriteCommitResult>\n\n// Rows are staged in bounded in-memory batches so a slow source iterable never\n// holds the DuckDB runtime queue. Only the per-batch appender flush takes a\n// queue slot. 1000 keeps memory bounded while amortizing appender open/close.\nconst WRITE_ROW_BATCH_SIZE = 1000\n\ninterface CreateDuckLakeWriteSessionInput {\n readonly commitWrite: DuckLakeCommitWrite\n readonly runtime: DuckDbRuntime\n readonly write: BeginDatasetWriteInput\n}\n\nexport async function createDuckLakeWriteSession(\n input: CreateDuckLakeWriteSessionInput\n): Promise<LakeWriteSession> {\n const stagingTableName = `sixb_write_${randomUUID().replaceAll(\"-\", \"\")}`\n\n // The temp table lives only on this runtime connection. That keeps\n // partially written rows invisible until DuckLakeStorage commits them into\n // the durable dataset table.\n await input.runtime.run(\n `CREATE TEMP TABLE ${quoteIdentifier(stagingTableName)} (${datasetSchemaToDuckDbColumnsSql(\n input.write.dataset.schema\n )})`\n )\n\n return new DuckLakeWriteSession(input.commitWrite, input.runtime, input.write, stagingTableName)\n}\n\n/**\n * Package-private LakeWriteSession implementation for DuckLakeStorage.\n *\n * The session owns row validation, the connection-scoped staging table, and\n * cleanup. DuckLakeStorage owns the durable transaction because it has the\n * dataset/version context needed to build the returned DatasetVersion.\n */\nclass DuckLakeWriteSession implements LakeWriteSession {\n private closed = false\n private cleanedUp = false\n private rowsWritten = 0\n private readonly stagedPrimaryKeys = new Set<string>()\n\n constructor(\n private readonly commitWrite: DuckLakeCommitWrite,\n private readonly runtime: DuckDbRuntime,\n private readonly input: BeginDatasetWriteInput,\n private readonly stagingTableName: string\n ) {}\n\n async writeRows(rows: Iterable<DatasetRow> | AsyncIterable<DatasetRow>): Promise<void> {\n this.assertOpen()\n\n // Drain and validate the source OUTSIDE the DuckDB queue so slow external\n // reads (pagination, APIs, SFTP, retries) never hold a runtime slot. Only\n // appendBatchToStagingTable below briefly enters the queue.\n let batch: DatasetRow[] = []\n let batchPrimaryKeys = new Set<string>()\n for await (const row of rows) {\n const validationError = getDatasetRowValidationError(row, this.input.dataset)\n if (validationError) {\n throw new LakeStorageError(`[SixbDuckLake] ${validationError}`)\n }\n\n // Snapshot the validated row. Callers may reuse and mutate one row object\n // between yields, so the batch must not retain a live reference.\n const clonedRow = structuredClone(row)\n if (getDatasetPrimaryKeyColumns(this.input.dataset) !== null) {\n const primaryKey = encodeDatasetPrimaryKey(this.input.dataset, clonedRow)\n if (this.stagedPrimaryKeys.has(primaryKey) || batchPrimaryKeys.has(primaryKey)) {\n throw new LakeStorageError(\n `[SixbDuckLake] Dataset '${this.input.dataset.id}' ${this.input.mode ?? \"snapshot\"} source contains duplicate primary key.`\n )\n }\n batchPrimaryKeys.add(primaryKey)\n }\n batch.push(clonedRow)\n\n if (batch.length >= WRITE_ROW_BATCH_SIZE) {\n await this.appendBatchToStagingTable(batch, batchPrimaryKeys)\n batch = []\n batchPrimaryKeys = new Set()\n // Native appender promises can settle through microtasks quickly enough to starve timers\n // across a large in-memory iterable. Yield once per bounded batch so API traffic remains\n // responsive without adding per-row scheduling overhead.\n await Bun.sleep(0)\n }\n }\n\n if (batch.length > 0) {\n await this.appendBatchToStagingTable(batch, batchPrimaryKeys)\n }\n }\n\n private async appendBatchToStagingTable(\n batch: readonly DatasetRow[],\n primaryKeys: ReadonlySet<string>\n ): Promise<void> {\n // Synchronous callback: no awaits inside the queue slot. The appender\n // buffers and flushes the whole batch into the staging temp table on close.\n await this.runtime.withAppender(this.stagingTableName, (appender) => {\n for (const row of batch) {\n appendDatasetRow(appender, this.input.dataset.schema, row)\n }\n })\n // Count only rows actually appended -- commit asserts rowsWritten ===\n // sourceRowCount in the write coordinator.\n this.rowsWritten += batch.length\n for (const primaryKey of primaryKeys) {\n this.stagedPrimaryKeys.add(primaryKey)\n }\n }\n\n async commit(input?: CommitDatasetWriteInput): Promise<DatasetWriteCommitResult> {\n this.assertOpen()\n this.closed = true\n\n let committed = false\n try {\n const result = await this.commitWrite({\n write: this.input,\n commit: input,\n rowsWritten: this.rowsWritten,\n stagingTableName: this.stagingTableName,\n })\n committed = true\n // Even successful commits no longer need the staging table once rows\n // have been inserted into the durable DuckLake table.\n await this.cleanup()\n return result\n } catch (error) {\n if (!committed) {\n await this.cleanup()\n }\n throw error\n }\n }\n\n async abort(): Promise<void> {\n if (this.closed) {\n return\n }\n\n this.closed = true\n await this.cleanup()\n }\n\n private assertOpen(): void {\n if (this.closed) {\n throw new LakeStorageError(\"[SixbDuckLake] Write session is already closed.\")\n }\n }\n\n private async cleanup(): Promise<void> {\n if (this.cleanedUp) {\n return\n }\n\n this.cleanedUp = true\n this.stagedPrimaryKeys.clear()\n await this.dropStagingTable()\n }\n\n private async dropStagingTable(): Promise<void> {\n try {\n await this.runtime.run(`DROP TABLE IF EXISTS ${quoteIdentifier(this.stagingTableName)}`)\n } catch {\n // Preserve the commit/abort failure. Temp tables are connection-scoped\n // and will disappear when the storage runtime closes.\n }\n }\n}\n",
34
- "import type { DatasetDefinition, DatasetRow, LakeStorageWithSql } from \"@sixb/core\"\nimport type {\n BeginDatasetMergeInput,\n BeginDatasetWriteInput,\n DatasetCatalogState,\n DatasetChanges,\n DatasetVersion,\n LakeMergeSession,\n LakeWriteSession,\n LatestVersionsSince,\n ListLatestVersionsSinceInput,\n ReadDatasetChangesInput,\n ReadDatasetRowsInput,\n} from \"@sixb/core/lake-storage\"\nimport { DuckLakeChangeReader } from \"./internal/ducklake-change-reader\"\nimport { DuckLakeConnectionManager } from \"./internal/ducklake-connection-manager\"\nimport { DuckLakeDatasetCatalog } from \"./internal/ducklake-dataset-catalog\"\nimport { DuckLakeMaintenance } from \"./internal/ducklake-maintenance\"\nimport { DuckLakeRowReader } from \"./internal/ducklake-row-reader\"\nimport { DuckLakeSnapshotReader } from \"./internal/ducklake-snapshot-reader\"\nimport { DuckLakeSqlExecutor } from \"./internal/ducklake-sql-executor\"\nimport { DuckLakeWriteCoordinator } from \"./internal/ducklake-write-coordinator\"\nimport type {\n DuckLakeMaintenanceOptions,\n DuckLakeMaintenanceReport,\n DuckLakeStorageOptions,\n} from \"./types\"\n\n/**\n * DuckLake-backed implementation of Sixb's LakeStorage API.\n *\n * The public surface stays aligned with core LakeStorage while DuckLake owns\n * physical tables, schemas, snapshots, and transactions behind the provider.\n * Sixb-specific metadata is only used to reconstruct DatasetVersion shape.\n */\nexport class DuckLakeStorage implements LakeStorageWithSql<\"duckdb\"> {\n readonly standard = { id: \"ducklake\", version: \"1.0\" } as const\n readonly sql: DuckLakeSqlExecutor\n\n private readonly connections: DuckLakeConnectionManager\n private readonly datasets: DuckLakeDatasetCatalog\n private readonly maintenance: DuckLakeMaintenance\n private readonly rows: DuckLakeRowReader\n private readonly changes: DuckLakeChangeReader\n private readonly snapshotReader: DuckLakeSnapshotReader\n private readonly writes: DuckLakeWriteCoordinator\n\n constructor(options: DuckLakeStorageOptions) {\n const normalizedOptions: DuckLakeStorageOptions = {\n ...options,\n alias: options.alias ?? \"sixb_lake\",\n createIfNotExists: options.createIfNotExists ?? true,\n readOnly: options.readOnly ?? false,\n duckdb: {\n ...options.duckdb,\n path: options.duckdb?.path ?? \":memory:\",\n },\n }\n this.connections = new DuckLakeConnectionManager(normalizedOptions)\n this.datasets = new DuckLakeDatasetCatalog(normalizedOptions, this.connections)\n this.maintenance = new DuckLakeMaintenance(normalizedOptions, this.connections)\n this.snapshotReader = new DuckLakeSnapshotReader(\n normalizedOptions,\n this.connections,\n this.datasets\n )\n this.rows = new DuckLakeRowReader(normalizedOptions, this.connections, this.snapshotReader)\n this.changes = new DuckLakeChangeReader(\n normalizedOptions,\n this.connections,\n this.snapshotReader\n )\n this.writes = new DuckLakeWriteCoordinator(\n normalizedOptions,\n this.connections,\n this.datasets,\n this.snapshotReader\n )\n this.sql = new DuckLakeSqlExecutor(\n normalizedOptions,\n this.connections,\n this.datasets,\n this.snapshotReader,\n this.writes\n )\n }\n\n async createDataset(definition: DatasetDefinition): Promise<DatasetDefinition> {\n return this.datasets.createDataset(definition)\n }\n\n async assertDatasetDefinitionsCompatible(\n definitions: readonly DatasetDefinition[]\n ): Promise<void> {\n await this.datasets.assertDatasetDefinitionsCompatible(definitions)\n }\n\n async getDataset(datasetId: string): Promise<DatasetDefinition | null> {\n return this.datasets.getDataset(datasetId)\n }\n\n async listDatasets(): Promise<readonly DatasetDefinition[]> {\n return this.datasets.listDatasets()\n }\n\n async listDatasetCatalogState(\n datasetIds: readonly string[]\n ): Promise<readonly DatasetCatalogState[]> {\n return this.snapshotReader.listDatasetCatalogState(datasetIds)\n }\n\n async listVersions(datasetId: string, limit?: number): Promise<readonly DatasetVersion[]> {\n return this.snapshotReader.listVersions(datasetId, limit)\n }\n\n async beginWrite(input: BeginDatasetWriteInput): Promise<LakeWriteSession> {\n return this.writes.beginWrite(input)\n }\n\n async beginMerge(input: BeginDatasetMergeInput): Promise<LakeMergeSession> {\n return this.writes.beginMerge(input)\n }\n\n async getLatestVersion(datasetId: string): Promise<DatasetVersion | null> {\n return this.snapshotReader.getLatestVersion(datasetId)\n }\n\n async getVersion(datasetId: string, versionId: string): Promise<DatasetVersion | null> {\n return this.snapshotReader.getVersion(datasetId, versionId)\n }\n\n async listLatestVersionsSince(\n input: ListLatestVersionsSinceInput\n ): Promise<LatestVersionsSince | null> {\n return this.snapshotReader.listLatestVersionsSince(input)\n }\n\n readRows(input: ReadDatasetRowsInput): AsyncIterable<DatasetRow> {\n return this.rows.readRows(input)\n }\n\n readChanges(input: ReadDatasetChangesInput): Promise<DatasetChanges | null> {\n return this.changes.readChanges(input)\n }\n\n async runMaintenance(options?: DuckLakeMaintenanceOptions): Promise<DuckLakeMaintenanceReport> {\n return this.maintenance.runMaintenance(options)\n }\n\n /**\n * `close()` is provider-specific and intentionally not part of the core\n * LakeStorage interface.\n */\n async close(): Promise<void> {\n await this.connections.close()\n }\n}\n"
44
+ "import type { DatasetDefinition, DatasetRow, LakeStorageWithSql } from \"@sixb/core\"\nimport type {\n BeginDatasetMergeInput,\n BeginDatasetWriteInput,\n DatasetCatalogState,\n DatasetChanges,\n DatasetVersion,\n LakeMergeSession,\n LakeWriteSession,\n LatestVersionsSince,\n ListLatestVersionsSinceInput,\n ReadDatasetChangesInput,\n ReadDatasetRowsInput,\n} from \"@sixb/core/lake-storage\"\nimport { DuckLakeChangeReader } from \"./internal/ducklake-change-reader\"\nimport { DuckLakeConnectionManager } from \"./internal/ducklake-connection-manager\"\nimport { DuckLakeDatasetCatalog } from \"./internal/ducklake-dataset-catalog\"\nimport { DuckLakeMaintenance } from \"./internal/ducklake-maintenance\"\nimport { DuckLakeRowReader } from \"./internal/ducklake-row-reader\"\nimport { DuckLakeSnapshotReader } from \"./internal/ducklake-snapshot-reader\"\nimport { DuckLakeSqlExecutor } from \"./internal/ducklake-sql-executor\"\nimport { DuckLakeWriteCoordinator } from \"./internal/ducklake-write-coordinator\"\nimport type {\n DuckLakeMaintenanceOptions,\n DuckLakeMaintenanceReport,\n DuckLakeStorageOptions,\n} from \"./types\"\n\n/**\n * DuckLake-backed implementation of Sixb's LakeStorage API.\n *\n * The public surface stays aligned with core LakeStorage while DuckLake owns\n * physical tables, schemas, snapshots, and transactions behind the provider.\n * Sixb-specific metadata is only used to reconstruct DatasetVersion shape.\n */\nexport class DuckLakeStorage implements LakeStorageWithSql<\"duckdb\"> {\n readonly standard = { id: \"ducklake\", version: \"1.0\" } as const\n readonly recordsLineage = true\n readonly sql: DuckLakeSqlExecutor\n\n private readonly connections: DuckLakeConnectionManager\n private readonly datasets: DuckLakeDatasetCatalog\n private readonly maintenance: DuckLakeMaintenance\n private readonly rows: DuckLakeRowReader\n private readonly changes: DuckLakeChangeReader\n private readonly snapshotReader: DuckLakeSnapshotReader\n private readonly writes: DuckLakeWriteCoordinator\n\n constructor(options: DuckLakeStorageOptions) {\n const normalizedOptions: DuckLakeStorageOptions = {\n ...options,\n alias: options.alias ?? \"sixb_lake\",\n createIfNotExists: options.createIfNotExists ?? true,\n readOnly: options.readOnly ?? false,\n duckdb: {\n ...options.duckdb,\n path: options.duckdb?.path ?? \":memory:\",\n },\n }\n this.connections = new DuckLakeConnectionManager(normalizedOptions)\n this.datasets = new DuckLakeDatasetCatalog(normalizedOptions, this.connections)\n this.snapshotReader = new DuckLakeSnapshotReader(\n normalizedOptions,\n this.connections,\n this.datasets\n )\n this.maintenance = new DuckLakeMaintenance(\n normalizedOptions,\n this.connections,\n this.snapshotReader\n )\n this.rows = new DuckLakeRowReader(normalizedOptions, this.connections, this.snapshotReader)\n this.changes = new DuckLakeChangeReader(\n normalizedOptions,\n this.connections,\n this.snapshotReader\n )\n this.writes = new DuckLakeWriteCoordinator(\n normalizedOptions,\n this.connections,\n this.datasets,\n this.snapshotReader\n )\n this.sql = new DuckLakeSqlExecutor(\n normalizedOptions,\n this.connections,\n this.datasets,\n this.snapshotReader,\n this.writes\n )\n }\n\n async createDataset(definition: DatasetDefinition): Promise<DatasetDefinition> {\n return this.datasets.createDataset(definition, (runtime, dataset) =>\n this.snapshotReader.getLatestVersionSummaryAtCurrentSnapshot(runtime, dataset)\n )\n }\n\n async assertDatasetDefinitionsCompatible(\n definitions: readonly DatasetDefinition[]\n ): Promise<void> {\n await this.datasets.assertDatasetDefinitionsCompatible(definitions)\n }\n\n async getDataset(datasetId: string): Promise<DatasetDefinition | null> {\n return this.datasets.getDataset(datasetId)\n }\n\n async listDatasets(): Promise<readonly DatasetDefinition[]> {\n return this.datasets.listDatasets()\n }\n\n async listDatasetCatalogState(\n datasetIds: readonly string[]\n ): Promise<readonly DatasetCatalogState[]> {\n return this.snapshotReader.listDatasetCatalogState(datasetIds)\n }\n\n async listVersions(datasetId: string, limit?: number): Promise<readonly DatasetVersion[]> {\n return this.snapshotReader.listVersions(datasetId, limit)\n }\n\n async beginWrite(input: BeginDatasetWriteInput): Promise<LakeWriteSession> {\n return this.writes.beginWrite(input)\n }\n\n async beginMerge(input: BeginDatasetMergeInput): Promise<LakeMergeSession> {\n return this.writes.beginMerge(input)\n }\n\n async getLatestVersion(datasetId: string): Promise<DatasetVersion | null> {\n return this.snapshotReader.getLatestVersion(datasetId)\n }\n\n async getVersion(datasetId: string, versionId: string): Promise<DatasetVersion | null> {\n return this.snapshotReader.getVersion(datasetId, versionId)\n }\n\n async listLatestVersionsSince(\n input: ListLatestVersionsSinceInput\n ): Promise<LatestVersionsSince | null> {\n return this.snapshotReader.listLatestVersionsSince(input)\n }\n\n readRows(input: ReadDatasetRowsInput): AsyncIterable<DatasetRow> {\n return this.rows.readRows(input)\n }\n\n readChanges(input: ReadDatasetChangesInput): Promise<DatasetChanges | null> {\n return this.changes.readChanges(input)\n }\n\n async runMaintenance(options?: DuckLakeMaintenanceOptions): Promise<DuckLakeMaintenanceReport> {\n return this.maintenance.runMaintenance(options)\n }\n\n /**\n * `close()` is provider-specific and intentionally not part of the core\n * LakeStorage interface.\n */\n async close(): Promise<void> {\n await this.connections.close()\n }\n}\n"
35
45
  ],
36
- "mappings": "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",
37
- "debugId": "99E61447F4C74C9E64756E2164756E21",
46
+ "mappings": "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",
47
+ "debugId": "9F26B0918A26BCC464756E2164756E21",
38
48
  "names": []
39
49
  }