@quereus/quereus 2.8.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +224 -222
- package/dist/src/core/database-assertions.d.ts +36 -16
- package/dist/src/core/database-assertions.d.ts.map +1 -1
- package/dist/src/core/database-assertions.js +222 -118
- package/dist/src/core/database-assertions.js.map +1 -1
- package/dist/src/core/database-transaction.d.ts +96 -13
- package/dist/src/core/database-transaction.d.ts.map +1 -1
- package/dist/src/core/database-transaction.js +294 -35
- package/dist/src/core/database-transaction.js.map +1 -1
- package/dist/src/core/database-watchers.d.ts +58 -0
- package/dist/src/core/database-watchers.d.ts.map +1 -0
- package/dist/src/core/database-watchers.js +206 -0
- package/dist/src/core/database-watchers.js.map +1 -0
- package/dist/src/core/database.d.ts +78 -5
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +120 -20
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/statement.d.ts +9 -0
- package/dist/src/core/statement.d.ts.map +1 -1
- package/dist/src/core/statement.js +29 -0
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/core/table-handle.d.ts +45 -0
- package/dist/src/core/table-handle.d.ts.map +1 -0
- package/dist/src/core/table-handle.js +54 -0
- package/dist/src/core/table-handle.js.map +1 -0
- package/dist/src/emit/ast-stringify.d.ts.map +1 -1
- package/dist/src/emit/ast-stringify.js +0 -3
- package/dist/src/emit/ast-stringify.js.map +1 -1
- package/dist/src/func/builtins/conversion.d.ts.map +1 -1
- package/dist/src/func/builtins/conversion.js +12 -1
- package/dist/src/func/builtins/conversion.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +22 -8
- package/dist/src/func/builtins/explain.js.map +1 -1
- package/dist/src/func/builtins/generation.d.ts.map +1 -1
- package/dist/src/func/builtins/generation.js +26 -1
- package/dist/src/func/builtins/generation.js.map +1 -1
- package/dist/src/func/builtins/index.d.ts.map +1 -1
- package/dist/src/func/builtins/index.js +5 -1
- package/dist/src/func/builtins/index.js.map +1 -1
- package/dist/src/func/builtins/json-tvf.d.ts.map +1 -1
- package/dist/src/func/builtins/json-tvf.js +16 -2
- package/dist/src/func/builtins/json-tvf.js.map +1 -1
- package/dist/src/func/builtins/schema.d.ts +4 -0
- package/dist/src/func/builtins/schema.d.ts.map +1 -1
- package/dist/src/func/builtins/schema.js +270 -11
- package/dist/src/func/builtins/schema.js.map +1 -1
- package/dist/src/func/registration.d.ts +19 -1
- package/dist/src/func/registration.d.ts.map +1 -1
- package/dist/src/func/registration.js +8 -3
- package/dist/src/func/registration.js.map +1 -1
- package/dist/src/index.d.ts +7 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/parser/ast.d.ts +3 -2
- package/dist/src/parser/ast.d.ts.map +1 -1
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +25 -8
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/planner/analysis/assertion-classifier.d.ts +71 -0
- package/dist/src/planner/analysis/assertion-classifier.d.ts.map +1 -0
- package/dist/src/planner/analysis/assertion-classifier.js +286 -0
- package/dist/src/planner/analysis/assertion-classifier.js.map +1 -0
- package/dist/src/planner/analysis/assertion-hoist-cache.d.ts +34 -0
- package/dist/src/planner/analysis/assertion-hoist-cache.d.ts.map +1 -0
- package/dist/src/planner/analysis/assertion-hoist-cache.js +119 -0
- package/dist/src/planner/analysis/assertion-hoist-cache.js.map +1 -0
- package/dist/src/planner/analysis/binding-extractor.d.ts +58 -0
- package/dist/src/planner/analysis/binding-extractor.d.ts.map +1 -0
- package/dist/src/planner/analysis/binding-extractor.js +110 -0
- package/dist/src/planner/analysis/binding-extractor.js.map +1 -0
- package/dist/src/planner/analysis/change-scope.d.ts +184 -0
- package/dist/src/planner/analysis/change-scope.d.ts.map +1 -0
- package/dist/src/planner/analysis/change-scope.js +825 -0
- package/dist/src/planner/analysis/change-scope.js.map +1 -0
- package/dist/src/planner/analysis/check-extraction.d.ts +29 -0
- package/dist/src/planner/analysis/check-extraction.d.ts.map +1 -0
- package/dist/src/planner/analysis/check-extraction.js +420 -0
- package/dist/src/planner/analysis/check-extraction.js.map +1 -0
- package/dist/src/planner/analysis/constraint-extractor.d.ts +47 -7
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +169 -92
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/analysis/partial-unique-extraction.d.ts +68 -0
- package/dist/src/planner/analysis/partial-unique-extraction.d.ts.map +1 -0
- package/dist/src/planner/analysis/partial-unique-extraction.js +347 -0
- package/dist/src/planner/analysis/partial-unique-extraction.js.map +1 -0
- package/dist/src/planner/analysis/predicate-conjuncts.d.ts +14 -0
- package/dist/src/planner/analysis/predicate-conjuncts.d.ts.map +1 -0
- package/dist/src/planner/analysis/predicate-conjuncts.js +31 -0
- package/dist/src/planner/analysis/predicate-conjuncts.js.map +1 -0
- package/dist/src/planner/analysis/predicate-shape.d.ts +52 -0
- package/dist/src/planner/analysis/predicate-shape.d.ts.map +1 -0
- package/dist/src/planner/analysis/predicate-shape.js +119 -0
- package/dist/src/planner/analysis/predicate-shape.js.map +1 -0
- package/dist/src/planner/analysis/sat-checker.d.ts +43 -0
- package/dist/src/planner/analysis/sat-checker.d.ts.map +1 -0
- package/dist/src/planner/analysis/sat-checker.js +393 -0
- package/dist/src/planner/analysis/sat-checker.js.map +1 -0
- package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.js +3 -2
- package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
- package/dist/src/planner/building/select.js +14 -2
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/building/table.d.ts.map +1 -1
- package/dist/src/planner/building/table.js +1 -1
- package/dist/src/planner/building/table.js.map +1 -1
- package/dist/src/planner/building/update.d.ts.map +1 -1
- package/dist/src/planner/building/update.js +10 -6
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/framework/characteristics.d.ts +13 -2
- package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
- package/dist/src/planner/framework/characteristics.js +31 -5
- package/dist/src/planner/framework/characteristics.js.map +1 -1
- package/dist/src/planner/framework/pass.d.ts.map +1 -1
- package/dist/src/planner/framework/pass.js +46 -16
- package/dist/src/planner/framework/pass.js.map +1 -1
- package/dist/src/planner/framework/physical-utils.d.ts +21 -9
- package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
- package/dist/src/planner/framework/physical-utils.js +47 -31
- package/dist/src/planner/framework/physical-utils.js.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.d.ts +25 -0
- package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.js +75 -8
- package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
- package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/alias-node.js +8 -1
- package/dist/src/planner/nodes/alias-node.js.map +1 -1
- package/dist/src/planner/nodes/asof-scan-node.d.ts +137 -0
- package/dist/src/planner/nodes/asof-scan-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/asof-scan-node.js +237 -0
- package/dist/src/planner/nodes/asof-scan-node.js.map +1 -0
- package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/bloom-join-node.js +19 -9
- package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.d.ts +3 -0
- package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
- package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/distinct-node.js +17 -6
- package/dist/src/planner/nodes/distinct-node.js.map +1 -1
- package/dist/src/planner/nodes/empty-relation-node.d.ts +27 -0
- package/dist/src/planner/nodes/empty-relation-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/empty-relation-node.js +61 -0
- package/dist/src/planner/nodes/empty-relation-node.js.map +1 -0
- package/dist/src/planner/nodes/filter.d.ts.map +1 -1
- package/dist/src/planner/nodes/filter.js +67 -5
- package/dist/src/planner/nodes/filter.js.map +1 -1
- package/dist/src/planner/nodes/function.d.ts +11 -1
- package/dist/src/planner/nodes/function.d.ts.map +1 -1
- package/dist/src/planner/nodes/function.js +94 -1
- package/dist/src/planner/nodes/function.js.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.d.ts +1 -1
- package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.js +10 -6
- package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +21 -10
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/join-utils.d.ts +42 -1
- package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-utils.js +132 -0
- package/dist/src/planner/nodes/join-utils.js.map +1 -1
- package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +8 -1
- package/dist/src/planner/nodes/limit-offset.js.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.js +22 -9
- package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
- package/dist/src/planner/nodes/ordinal-slice-node.d.ts +50 -0
- package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/ordinal-slice-node.js +130 -0
- package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts +3 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.js +3 -0
- package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
- package/dist/src/planner/nodes/plan-node.d.ts +316 -5
- package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node.js +49 -0
- package/dist/src/planner/nodes/plan-node.js.map +1 -1
- package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/project-node.js +78 -28
- package/dist/src/planner/nodes/project-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts +27 -2
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +117 -1
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/retrieve-node.d.ts +9 -1
- package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/retrieve-node.js +21 -0
- package/dist/src/planner/nodes/retrieve-node.js.map +1 -1
- package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/returning-node.js +64 -28
- package/dist/src/planner/nodes/returning-node.js.map +1 -1
- package/dist/src/planner/nodes/scalar.d.ts +8 -1
- package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/scalar.js +112 -1
- package/dist/src/planner/nodes/scalar.js.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts +2 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.js +24 -0
- package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
- package/dist/src/planner/nodes/single-row.d.ts.map +1 -1
- package/dist/src/planner/nodes/single-row.js +3 -1
- package/dist/src/planner/nodes/single-row.js.map +1 -1
- package/dist/src/planner/nodes/sort.d.ts.map +1 -1
- package/dist/src/planner/nodes/sort.js +28 -1
- package/dist/src/planner/nodes/sort.js.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.d.ts +1 -1
- package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.js +10 -8
- package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts +40 -5
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +113 -18
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/nodes/table-function-call.d.ts +4 -1
- package/dist/src/planner/nodes/table-function-call.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-function-call.js +224 -14
- package/dist/src/planner/nodes/table-function-call.js.map +1 -1
- package/dist/src/planner/nodes/update-node.d.ts +1 -3
- package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/update-node.js +3 -9
- package/dist/src/planner/nodes/update-node.js.map +1 -1
- package/dist/src/planner/nodes/window-node.d.ts +61 -2
- package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-node.js +71 -3
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/optimizer-tuning.d.ts +38 -1
- package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
- package/dist/src/planner/optimizer-tuning.js +6 -0
- package/dist/src/planner/optimizer-tuning.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +278 -0
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/rules/access/rule-asof-strategy-select.d.ts +30 -0
- package/dist/src/planner/rules/access/rule-asof-strategy-select.d.ts.map +1 -0
- package/dist/src/planner/rules/access/rule-asof-strategy-select.js +112 -0
- package/dist/src/planner/rules/access/rule-asof-strategy-select.js.map +1 -0
- package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.d.ts +33 -0
- package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.d.ts.map +1 -0
- package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.js +162 -0
- package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.js.map +1 -0
- package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts +29 -0
- package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts.map +1 -0
- package/dist/src/planner/rules/access/rule-monotonic-range-access.js +175 -0
- package/dist/src/planner/rules/access/rule-monotonic-range-access.js.map +1 -0
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js +53 -17
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts +30 -0
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts.map +1 -0
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js +116 -0
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js.map +1 -0
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts +7 -7
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts.map +1 -1
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.js +18 -16
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.js.map +1 -1
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts +61 -0
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts.map +1 -0
- package/dist/src/planner/rules/join/equi-pair-extractor.js +155 -0
- package/dist/src/planner/rules/join/equi-pair-extractor.js.map +1 -0
- package/dist/src/planner/rules/join/rule-join-elimination.d.ts +56 -0
- package/dist/src/planner/rules/join/rule-join-elimination.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-join-elimination.js +326 -0
- package/dist/src/planner/rules/join/rule-join-elimination.js.map +1 -0
- package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js +10 -2
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.js +2 -122
- package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.d.ts +21 -0
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.js +405 -0
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.js.map +1 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts +31 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js +113 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts +20 -0
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js +181 -0
- package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts +46 -0
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js +156 -0
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.d.ts +30 -0
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.js +60 -0
- package/dist/src/planner/rules/predicate/rule-filter-contradiction.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts +45 -0
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js +210 -0
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.d.ts +29 -0
- package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.js +161 -0
- package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.js.map +1 -0
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts +39 -0
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts.map +1 -0
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js +91 -0
- package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js.map +1 -0
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts +35 -0
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts.map +1 -0
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js +74 -0
- package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js.map +1 -0
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts +27 -0
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts.map +1 -0
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js +103 -0
- package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js.map +1 -0
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -1
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +1 -25
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
- package/dist/src/planner/rules/window/rule-monotonic-window.d.ts +47 -0
- package/dist/src/planner/rules/window/rule-monotonic-window.d.ts.map +1 -0
- package/dist/src/planner/rules/window/rule-monotonic-window.js +341 -0
- package/dist/src/planner/rules/window/rule-monotonic-window.js.map +1 -0
- package/dist/src/planner/scopes/global.js +2 -2
- package/dist/src/planner/scopes/global.js.map +1 -1
- package/dist/src/planner/type-utils.d.ts.map +1 -1
- package/dist/src/planner/type-utils.js +11 -0
- package/dist/src/planner/type-utils.js.map +1 -1
- package/dist/src/planner/util/fd-utils.d.ts +245 -0
- package/dist/src/planner/util/fd-utils.d.ts.map +1 -0
- package/dist/src/planner/util/fd-utils.js +1416 -0
- package/dist/src/planner/util/fd-utils.js.map +1 -0
- package/dist/src/planner/util/ind-utils.d.ts +79 -0
- package/dist/src/planner/util/ind-utils.d.ts.map +1 -0
- package/dist/src/planner/util/ind-utils.js +146 -0
- package/dist/src/planner/util/ind-utils.js.map +1 -0
- package/dist/src/planner/util/key-utils.d.ts +75 -14
- package/dist/src/planner/util/key-utils.d.ts.map +1 -1
- package/dist/src/planner/util/key-utils.js +234 -57
- package/dist/src/planner/util/key-utils.js.map +1 -1
- package/dist/src/runtime/context-helpers.d.ts +9 -0
- package/dist/src/runtime/context-helpers.d.ts.map +1 -1
- package/dist/src/runtime/context-helpers.js +5 -0
- package/dist/src/runtime/context-helpers.js.map +1 -1
- package/dist/src/runtime/delta-executor.d.ts +134 -0
- package/dist/src/runtime/delta-executor.d.ts.map +1 -0
- package/dist/src/runtime/delta-executor.js +382 -0
- package/dist/src/runtime/delta-executor.js.map +1 -0
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/alter-table.js +52 -16
- package/dist/src/runtime/emit/alter-table.js.map +1 -1
- package/dist/src/runtime/emit/asof-scan.d.ts +10 -0
- package/dist/src/runtime/emit/asof-scan.d.ts.map +1 -0
- package/dist/src/runtime/emit/asof-scan.js +467 -0
- package/dist/src/runtime/emit/asof-scan.js.map +1 -0
- package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
- package/dist/src/runtime/emit/constraint-check.js +20 -0
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -1
- package/dist/src/runtime/emit/create-assertion.js +3 -2
- package/dist/src/runtime/emit/create-assertion.js.map +1 -1
- package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
- package/dist/src/runtime/emit/dml-executor.js +40 -13
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/drop-assertion.js +1 -1
- package/dist/src/runtime/emit/drop-assertion.js.map +1 -1
- package/dist/src/runtime/emit/empty-relation.d.ts +5 -0
- package/dist/src/runtime/emit/empty-relation.d.ts.map +1 -0
- package/dist/src/runtime/emit/empty-relation.js +11 -0
- package/dist/src/runtime/emit/empty-relation.js.map +1 -0
- package/dist/src/runtime/emit/ordinal-slice.d.ts +13 -0
- package/dist/src/runtime/emit/ordinal-slice.d.ts.map +1 -0
- package/dist/src/runtime/emit/ordinal-slice.js +89 -0
- package/dist/src/runtime/emit/ordinal-slice.js.map +1 -0
- package/dist/src/runtime/emit/returning.d.ts.map +1 -1
- package/dist/src/runtime/emit/returning.js +9 -4
- package/dist/src/runtime/emit/returning.js.map +1 -1
- package/dist/src/runtime/emit/scan.d.ts +19 -3
- package/dist/src/runtime/emit/scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/scan.js +12 -8
- package/dist/src/runtime/emit/scan.js.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.js +91 -14
- package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
- package/dist/src/runtime/emit/window.d.ts.map +1 -1
- package/dist/src/runtime/emit/window.js +732 -37
- package/dist/src/runtime/emit/window.js.map +1 -1
- package/dist/src/runtime/foreign-key-actions.d.ts +16 -0
- package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -1
- package/dist/src/runtime/foreign-key-actions.js +86 -5
- package/dist/src/runtime/foreign-key-actions.js.map +1 -1
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +6 -0
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/schema/assertion.d.ts +8 -0
- package/dist/src/schema/assertion.d.ts.map +1 -1
- package/dist/src/schema/catalog.d.ts +10 -0
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +29 -6
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/change-events.d.ts +5 -1
- package/dist/src/schema/change-events.d.ts.map +1 -1
- package/dist/src/schema/change-events.js.map +1 -1
- package/dist/src/schema/function.d.ts +89 -1
- package/dist/src/schema/function.d.ts.map +1 -1
- package/dist/src/schema/function.js +31 -0
- package/dist/src/schema/function.js.map +1 -1
- package/dist/src/schema/manager.d.ts +43 -0
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +105 -4
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/rename-rewriter.d.ts.map +1 -1
- package/dist/src/schema/rename-rewriter.js +303 -102
- package/dist/src/schema/rename-rewriter.js.map +1 -1
- package/dist/src/schema/schema-differ.d.ts +18 -1
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +307 -42
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/table.d.ts +21 -2
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +17 -8
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/types/logical-type.d.ts +11 -0
- package/dist/src/types/logical-type.d.ts.map +1 -1
- package/dist/src/types/logical-type.js.map +1 -1
- package/dist/src/types/temporal-types.d.ts.map +1 -1
- package/dist/src/types/temporal-types.js +32 -0
- package/dist/src/types/temporal-types.js.map +1 -1
- package/dist/src/util/ast-literal.d.ts +11 -0
- package/dist/src/util/ast-literal.d.ts.map +1 -0
- package/dist/src/util/ast-literal.js +26 -0
- package/dist/src/util/ast-literal.js.map +1 -0
- package/dist/src/vtab/best-access-plan.d.ts +41 -0
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js +29 -0
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/events.d.ts +9 -0
- package/dist/src/vtab/events.d.ts.map +1 -1
- package/dist/src/vtab/events.js +19 -0
- package/dist/src/vtab/events.js.map +1 -1
- package/dist/src/vtab/filter-info.d.ts +14 -0
- package/dist/src/vtab/filter-info.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +24 -5
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts +39 -1
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +206 -44
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/memory/utils/predicate.d.ts +2 -1
- package/dist/src/vtab/memory/utils/predicate.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/predicate.js +32 -1
- package/dist/src/vtab/memory/utils/predicate.js.map +1 -1
- package/dist/src/vtab/module.d.ts +24 -0
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delta executor kernel.
|
|
3
|
+
*
|
|
4
|
+
* A reusable dispatcher that any change-driven consumer (assertions today;
|
|
5
|
+
* materialized views, reactive signals, triggers tomorrow) can register
|
|
6
|
+
* subscriptions against. The kernel inspects per-subscription bindings
|
|
7
|
+
* (`BindingMode`), collects the relevant changed binding tuples from the
|
|
8
|
+
* TransactionManager's change capture, applies a cost-based fallback to
|
|
9
|
+
* global re-evaluation when too many tuples would need per-binding dispatch,
|
|
10
|
+
* and invokes the subscription's `apply` once with the resulting batches.
|
|
11
|
+
*
|
|
12
|
+
* The kernel itself is stateless across runs; subscriptions own their own
|
|
13
|
+
* residual plan cache (no shared cache, since plan-shape generation is
|
|
14
|
+
* consumer-specific).
|
|
15
|
+
*/
|
|
16
|
+
import { createLogger } from '../common/logger.js';
|
|
17
|
+
import { QuereusError } from '../common/errors.js';
|
|
18
|
+
import { StatusCode } from '../common/types.js';
|
|
19
|
+
const log = createLogger('runtime:delta-executor');
|
|
20
|
+
/**
|
|
21
|
+
* Coordinates delta dispatch across all registered subscriptions.
|
|
22
|
+
*/
|
|
23
|
+
export class DeltaExecutor {
|
|
24
|
+
ctx;
|
|
25
|
+
subscriptions = new Set();
|
|
26
|
+
constructor(ctx) {
|
|
27
|
+
this.ctx = ctx;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Register a subscription. Returns a dispose handle that removes the
|
|
31
|
+
* subscription and calls its `dispose()`.
|
|
32
|
+
*/
|
|
33
|
+
register(sub) {
|
|
34
|
+
this.subscriptions.add(sub);
|
|
35
|
+
let disposed = false;
|
|
36
|
+
return () => {
|
|
37
|
+
if (disposed)
|
|
38
|
+
return;
|
|
39
|
+
disposed = true;
|
|
40
|
+
this.subscriptions.delete(sub);
|
|
41
|
+
sub.dispose();
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** Dispose all subscriptions. */
|
|
45
|
+
disposeAll() {
|
|
46
|
+
for (const sub of this.subscriptions) {
|
|
47
|
+
sub.dispose();
|
|
48
|
+
}
|
|
49
|
+
this.subscriptions.clear();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Run all impacted subscriptions. Throws on the first subscription's
|
|
53
|
+
* `apply` rejection — exceptions are surfaced unchanged so the COMMIT
|
|
54
|
+
* path can roll back.
|
|
55
|
+
*/
|
|
56
|
+
async runAll() {
|
|
57
|
+
if (this.subscriptions.size === 0)
|
|
58
|
+
return;
|
|
59
|
+
const changedBases = this.ctx.getChangedBaseTables();
|
|
60
|
+
if (changedBases.size === 0)
|
|
61
|
+
return;
|
|
62
|
+
// Snapshot subscriptions before iterating: a handler that registers a
|
|
63
|
+
// new subscription mid-fire must not see the current commit, and one
|
|
64
|
+
// that unsubscribes a peer must still see in-flight apply complete.
|
|
65
|
+
const snapshot = [...this.subscriptions];
|
|
66
|
+
for (const sub of snapshot) {
|
|
67
|
+
if (!this.subscriptions.has(sub))
|
|
68
|
+
continue;
|
|
69
|
+
await this.runOne(sub, changedBases);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async runOne(sub, changedBases) {
|
|
73
|
+
// Quick skip: if no dependency of the subscription changed at all.
|
|
74
|
+
let any = false;
|
|
75
|
+
for (const dep of sub.dependencies) {
|
|
76
|
+
if (changedBases.has(dep)) {
|
|
77
|
+
any = true;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (!any)
|
|
82
|
+
return;
|
|
83
|
+
const perRelationTuples = new Map();
|
|
84
|
+
const globalRelations = new Set();
|
|
85
|
+
for (const [relKey, binding] of sub.bindings) {
|
|
86
|
+
const base = sub.relationToBase.get(relKey);
|
|
87
|
+
if (!base || !changedBases.has(base))
|
|
88
|
+
continue;
|
|
89
|
+
if (binding.kind === 'global') {
|
|
90
|
+
globalRelations.add(relKey);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const cols = binding.kind === 'row' ? binding.keyColumns : binding.groupColumns;
|
|
94
|
+
const pkIndices = sub.pkIndicesByBase.get(base);
|
|
95
|
+
if (!pkIndices) {
|
|
96
|
+
// No PK known for this base — can't fetch tuples; fall back to global.
|
|
97
|
+
log('No PK for base %s; falling back to global for %s', base, sub.id);
|
|
98
|
+
globalRelations.add(relKey);
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
let tuples;
|
|
102
|
+
try {
|
|
103
|
+
tuples = this.ctx.getChangedTuples(base, cols, pkIndices);
|
|
104
|
+
}
|
|
105
|
+
catch (e) {
|
|
106
|
+
// The requested columns aren't registered. Fall back to global
|
|
107
|
+
// for safety — the subscription forgot to register a CaptureSpec.
|
|
108
|
+
log('getChangedTuples failed for %s on %s (%s); falling back to global', sub.id, base, e.message);
|
|
109
|
+
globalRelations.add(relKey);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (tuples.length === 0) {
|
|
113
|
+
// Dependency changed but no captured tuples touched this binding —
|
|
114
|
+
// nothing to dispatch for this relation.
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
// Cost fallback: if the number of distinct binding tuples is a large
|
|
118
|
+
// fraction of the base table size, doing N per-binding runs is likely
|
|
119
|
+
// worse than one global run.
|
|
120
|
+
const rowCount = this.ctx.getRowCount?.(base);
|
|
121
|
+
if (rowCount !== undefined && rowCount > 0) {
|
|
122
|
+
const ratio = tuples.length / rowCount;
|
|
123
|
+
if (ratio >= this.ctx.deltaPerRowFallbackRatio) {
|
|
124
|
+
log('Cost fallback for %s on %s: %d/%d ≥ %s — running global', sub.id, base, tuples.length, rowCount, this.ctx.deltaPerRowFallbackRatio);
|
|
125
|
+
globalRelations.add(relKey);
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
perRelationTuples.set(relKey, tuples);
|
|
130
|
+
}
|
|
131
|
+
if (perRelationTuples.size === 0 && globalRelations.size === 0) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const input = { perRelationTuples, globalRelations };
|
|
135
|
+
await sub.apply(input);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/** Synthetic relation key for the i-th watch in a scope. */
|
|
139
|
+
function relKeyForWatch(table, watchIndex) {
|
|
140
|
+
return `${baseKeyFor(table)}#watch_${watchIndex}`;
|
|
141
|
+
}
|
|
142
|
+
function baseKeyFor(table) {
|
|
143
|
+
// Defensive: the contract on `QualifiedName` says lowercased, but
|
|
144
|
+
// hand-built `ChangeScope` values may not honor it. The change log is
|
|
145
|
+
// keyed lowercased, so non-lowercased deps would never match.
|
|
146
|
+
return `${table.schema}.${table.table}`.toLowerCase();
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Stable string key for an SqlValue tuple, used to intersect kernel-emitted
|
|
150
|
+
* tuples against a watch's literal `values`.
|
|
151
|
+
*/
|
|
152
|
+
function tupleKey(tuple) {
|
|
153
|
+
const parts = [];
|
|
154
|
+
for (const v of tuple) {
|
|
155
|
+
if (v === null)
|
|
156
|
+
parts.push('null');
|
|
157
|
+
else if (typeof v === 'bigint')
|
|
158
|
+
parts.push(`b:${v.toString()}`);
|
|
159
|
+
else if (typeof v === 'number')
|
|
160
|
+
parts.push(`n:${v}`);
|
|
161
|
+
else if (typeof v === 'string')
|
|
162
|
+
parts.push(`s:${v}`);
|
|
163
|
+
else if (typeof v === 'boolean')
|
|
164
|
+
parts.push(`B:${v}`);
|
|
165
|
+
else if (v instanceof Uint8Array)
|
|
166
|
+
parts.push(`x:${Array.from(v).map(b => b.toString(16).padStart(2, '0')).join('')}`);
|
|
167
|
+
else
|
|
168
|
+
parts.push(`j:${JSON.stringify(v)}`);
|
|
169
|
+
}
|
|
170
|
+
return parts.join('|');
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Resolve a column name on a base table or throw a clear error.
|
|
174
|
+
*/
|
|
175
|
+
function resolveColumn(qname, info, name) {
|
|
176
|
+
const idx = info.columnIndexMap.get(name.toLowerCase());
|
|
177
|
+
if (idx === undefined) {
|
|
178
|
+
throw new QuereusError(`watch: column '${name}' does not exist on ${qname.schema}.${qname.table}`, StatusCode.ERROR);
|
|
179
|
+
}
|
|
180
|
+
return idx;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Translate a public `ChangeScope` into a `DeltaSubscription` plus its
|
|
184
|
+
* capture-spec dispose handles. Pure shape-translation: callers (i.e.
|
|
185
|
+
* `Database.watch`) own validation of unbound parameters, schema-change
|
|
186
|
+
* invalidation, and registration with the executor.
|
|
187
|
+
*
|
|
188
|
+
* Throws synchronously if:
|
|
189
|
+
* - any referenced table no longer exists in the schema;
|
|
190
|
+
* - any column referenced in `key` / `groupBy` / `columns` does not exist
|
|
191
|
+
* on its table.
|
|
192
|
+
*/
|
|
193
|
+
export function subscriptionFromChangeScope(scope, handler, id, ctx) {
|
|
194
|
+
const bindings = new Map();
|
|
195
|
+
const relationToBase = new Map();
|
|
196
|
+
const pkIndicesByBase = new Map();
|
|
197
|
+
const dependencies = new Set();
|
|
198
|
+
const captureDisposers = [];
|
|
199
|
+
const plans = [];
|
|
200
|
+
scope.watches.forEach((watch, i) => {
|
|
201
|
+
const info = ctx.resolveTable(watch.table);
|
|
202
|
+
if (!info) {
|
|
203
|
+
throw new QuereusError(`watch: table ${watch.table.schema}.${watch.table.table} does not exist`, StatusCode.ERROR);
|
|
204
|
+
}
|
|
205
|
+
const base = baseKeyFor(watch.table);
|
|
206
|
+
const relKey = relKeyForWatch(watch.table, i);
|
|
207
|
+
dependencies.add(base);
|
|
208
|
+
relationToBase.set(relKey, base);
|
|
209
|
+
if (!pkIndicesByBase.has(base)) {
|
|
210
|
+
pkIndicesByBase.set(base, info.pkIndices);
|
|
211
|
+
}
|
|
212
|
+
const extras = new Set();
|
|
213
|
+
const pkSet = new Set(info.pkIndices);
|
|
214
|
+
const recordExtras = (cols) => {
|
|
215
|
+
for (const c of cols) {
|
|
216
|
+
if (!pkSet.has(c))
|
|
217
|
+
extras.add(c);
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
let mode;
|
|
221
|
+
let literalValues = [];
|
|
222
|
+
switch (watch.scope.kind) {
|
|
223
|
+
case 'full': {
|
|
224
|
+
mode = { kind: 'global' };
|
|
225
|
+
if (watch.columns !== 'all') {
|
|
226
|
+
for (const name of watch.columns) {
|
|
227
|
+
const idx = resolveColumn(watch.table, info, name);
|
|
228
|
+
if (!pkSet.has(idx))
|
|
229
|
+
extras.add(idx);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
case 'rows': {
|
|
235
|
+
const keyCols = watch.scope.key.map(n => resolveColumn(watch.table, info, n));
|
|
236
|
+
literalValues = literalValuesOnly(watch.scope.values);
|
|
237
|
+
recordExtras(keyCols);
|
|
238
|
+
mode = { kind: 'row', keyColumns: keyCols };
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
case 'groups': {
|
|
242
|
+
const groupCols = watch.scope.groupBy.map(n => resolveColumn(watch.table, info, n));
|
|
243
|
+
recordExtras(groupCols);
|
|
244
|
+
mode = { kind: 'group', groupColumns: groupCols };
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
case 'rowsByGroup': {
|
|
248
|
+
const groupCols = watch.scope.groupBy.map(n => resolveColumn(watch.table, info, n));
|
|
249
|
+
literalValues = literalValuesOnly(watch.scope.values);
|
|
250
|
+
recordExtras(groupCols);
|
|
251
|
+
mode = { kind: 'group', groupColumns: groupCols };
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
bindings.set(relKey, mode);
|
|
256
|
+
if (extras.size > 0) {
|
|
257
|
+
captureDisposers.push(ctx.registerCaptureSpec(base, { extraColumns: extras }));
|
|
258
|
+
}
|
|
259
|
+
plans.push({ watch, relKey, base, literalValues });
|
|
260
|
+
});
|
|
261
|
+
const apply = async (input) => {
|
|
262
|
+
const matched = [];
|
|
263
|
+
for (const plan of plans) {
|
|
264
|
+
const { watch, relKey, literalValues } = plan;
|
|
265
|
+
const isGlobal = input.globalRelations.has(relKey);
|
|
266
|
+
const kernelTuples = input.perRelationTuples.get(relKey);
|
|
267
|
+
if (!isGlobal && !kernelTuples) {
|
|
268
|
+
// No change for this watch's base; skip.
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
let hits;
|
|
272
|
+
let observable;
|
|
273
|
+
switch (watch.scope.kind) {
|
|
274
|
+
case 'full': {
|
|
275
|
+
// Column-narrowing for `full + columns` is best-effort in v1:
|
|
276
|
+
// we register a capture spec but always fire on any change.
|
|
277
|
+
hits = [];
|
|
278
|
+
// Fire whenever the table was touched (kernel signals via
|
|
279
|
+
// globalRelations for 'global' bindings).
|
|
280
|
+
observable = isGlobal;
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
case 'rows': {
|
|
284
|
+
if (isGlobal) {
|
|
285
|
+
// Kernel fell back to global; we can't narrow precisely.
|
|
286
|
+
// Surface every literal value the watch was registered
|
|
287
|
+
// for so the handler treats them all as possibly-changed.
|
|
288
|
+
hits = literalValues;
|
|
289
|
+
observable = hits.length > 0;
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
hits = intersectTuples(kernelTuples ?? [], literalValues);
|
|
293
|
+
observable = hits.length > 0;
|
|
294
|
+
}
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
case 'groups': {
|
|
298
|
+
hits = isGlobal ? [] : (kernelTuples ?? []);
|
|
299
|
+
observable = hits.length > 0;
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
case 'rowsByGroup': {
|
|
303
|
+
if (isGlobal) {
|
|
304
|
+
hits = literalValues;
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
hits = intersectTuples(kernelTuples ?? [], literalValues);
|
|
308
|
+
}
|
|
309
|
+
observable = hits.length > 0;
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
if (observable)
|
|
314
|
+
matched.push({ watch, hits });
|
|
315
|
+
}
|
|
316
|
+
if (matched.length === 0)
|
|
317
|
+
return;
|
|
318
|
+
const event = { matched, txnId: ctx.getCurrentTxnId() };
|
|
319
|
+
try {
|
|
320
|
+
const r = handler(event);
|
|
321
|
+
if (r && typeof r.then === 'function') {
|
|
322
|
+
await r;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
catch (err) {
|
|
326
|
+
log('Watch handler %s threw: %O', id, err);
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
const subscription = {
|
|
330
|
+
id,
|
|
331
|
+
dependencies,
|
|
332
|
+
bindings,
|
|
333
|
+
relationToBase,
|
|
334
|
+
pkIndicesByBase,
|
|
335
|
+
apply,
|
|
336
|
+
dispose: () => { },
|
|
337
|
+
};
|
|
338
|
+
return { subscription, captureDisposers };
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Filter a ScopeValue-tuple list to literal-only tuples.
|
|
342
|
+
*
|
|
343
|
+
* `Database.watch` rejects scopes with `unboundParameters.length > 0` up
|
|
344
|
+
* front, so by the time we reach here, any surviving `ParamScopeValue`
|
|
345
|
+
* placeholders represent a caller-side bug; we drop them defensively
|
|
346
|
+
* rather than throw deep in the runtime path.
|
|
347
|
+
*/
|
|
348
|
+
function literalValuesOnly(values) {
|
|
349
|
+
const out = [];
|
|
350
|
+
for (const tuple of values) {
|
|
351
|
+
let allLiteral = true;
|
|
352
|
+
const lit = [];
|
|
353
|
+
for (const v of tuple) {
|
|
354
|
+
if (v !== null && typeof v === 'object' && !(v instanceof Uint8Array) && !Array.isArray(v) && v.kind === 'param') {
|
|
355
|
+
allLiteral = false;
|
|
356
|
+
break;
|
|
357
|
+
}
|
|
358
|
+
lit.push(v);
|
|
359
|
+
}
|
|
360
|
+
if (allLiteral)
|
|
361
|
+
out.push(lit);
|
|
362
|
+
}
|
|
363
|
+
return out;
|
|
364
|
+
}
|
|
365
|
+
function intersectTuples(kernel, watch) {
|
|
366
|
+
if (watch.length === 0)
|
|
367
|
+
return [];
|
|
368
|
+
const watchKeys = new Set();
|
|
369
|
+
for (const t of watch)
|
|
370
|
+
watchKeys.add(tupleKey(t));
|
|
371
|
+
const out = [];
|
|
372
|
+
const seen = new Set();
|
|
373
|
+
for (const kt of kernel) {
|
|
374
|
+
const k = tupleKey(kt);
|
|
375
|
+
if (!watchKeys.has(k) || seen.has(k))
|
|
376
|
+
continue;
|
|
377
|
+
seen.add(k);
|
|
378
|
+
out.push([...kt]);
|
|
379
|
+
}
|
|
380
|
+
return out;
|
|
381
|
+
}
|
|
382
|
+
//# sourceMappingURL=delta-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delta-executor.js","sourceRoot":"","sources":["../../../src/runtime/delta-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alter-table.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/alter-table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAkC,MAAM,aAAa,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,OAAO,KAAK,EAAE,WAAW,EAAE,0BAA0B,EAAmD,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"alter-table.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/alter-table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAkC,MAAM,aAAa,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,OAAO,KAAK,EAAE,WAAW,EAAE,0BAA0B,EAAmD,MAAM,uBAAuB,CAAC;AAkBtI,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,GAAG,WAAW,CA2CvF;AAypBD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAClC,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,EAAE,EAC1B,QAAQ,EAAE,0BAA0B,EAAE,GACpC,MAAM,CAuCR"}
|
|
@@ -5,7 +5,14 @@ import { buildColumnIndexMap, opsToMask, withGeneratedColumnGraph } from '../../
|
|
|
5
5
|
import { MemoryTableModule } from '../../vtab/memory/module.js';
|
|
6
6
|
import { quoteIdentifier, expressionToString, selectToString } from '../../emit/ast-stringify.js';
|
|
7
7
|
import { renameTableInAst, renameColumnInAst } from '../../schema/rename-rewriter.js';
|
|
8
|
+
import { tryFoldLiteral } from '../../parser/utils.js';
|
|
8
9
|
const log = createLogger('runtime:emit:alter-table');
|
|
10
|
+
function qualifyTableName(schemaName, tableName) {
|
|
11
|
+
const prefix = (schemaName && schemaName.toLowerCase() !== 'main')
|
|
12
|
+
? `${quoteIdentifier(schemaName)}.`
|
|
13
|
+
: '';
|
|
14
|
+
return `${prefix}${quoteIdentifier(tableName)}`;
|
|
15
|
+
}
|
|
9
16
|
export function emitAlterTable(plan, _ctx) {
|
|
10
17
|
const tableSchema = plan.table.tableSchema;
|
|
11
18
|
const action = plan.action;
|
|
@@ -142,11 +149,31 @@ async function runAddColumn(rctx, tableSchema, schema, columnDef) {
|
|
|
142
149
|
if (columnDef.constraints?.some(c => c.type === 'primaryKey')) {
|
|
143
150
|
throw new QuereusError(`Cannot add a PRIMARY KEY column via ALTER TABLE`, StatusCode.ERROR);
|
|
144
151
|
}
|
|
152
|
+
// Reject non-foldable DEFAULT expressions at DDL time. ADD COLUMN backfills
|
|
153
|
+
// existing rows with the DEFAULT value, so the expression must evaluate to a
|
|
154
|
+
// concrete literal at ALTER time. Column references, bind parameters, and
|
|
155
|
+
// non-deterministic function calls don't fold and are rejected per the
|
|
156
|
+
// determinism rule (consistent with CREATE TABLE's DEFAULT validation).
|
|
157
|
+
const defaultConstraint = columnDef.constraints?.find(c => c.type === 'default');
|
|
158
|
+
if (defaultConstraint && defaultConstraint.expr && tryFoldLiteral(defaultConstraint.expr) === undefined) {
|
|
159
|
+
throw new QuereusError(`ALTER TABLE ADD COLUMN DEFAULT for '${columnDef.name}' must fold to a literal — column references, bind parameters, and non-deterministic expressions are not allowed`, StatusCode.ERROR);
|
|
160
|
+
}
|
|
145
161
|
// Call module.alterTable for data + schema update
|
|
146
162
|
const module = tableSchema.vtabModule;
|
|
147
163
|
if (!module.alterTable) {
|
|
148
164
|
throw new QuereusError(`Module for table '${tableSchema.name}' does not support ALTER TABLE ADD COLUMN`, StatusCode.UNSUPPORTED);
|
|
149
165
|
}
|
|
166
|
+
// NOT NULL without a usable DEFAULT cannot backfill existing rows. A DEFAULT whose
|
|
167
|
+
// folded value is NULL is equivalent to "no DEFAULT" for this purpose. If the table
|
|
168
|
+
// is non-empty, reject before mutating any schema or data.
|
|
169
|
+
const hasNotNull = columnDef.constraints?.some(c => c.type === 'notNull') ?? false;
|
|
170
|
+
if (hasNotNull) {
|
|
171
|
+
const folded = defaultConstraint?.expr ? tryFoldLiteral(defaultConstraint.expr) : undefined;
|
|
172
|
+
const defaultIsNullish = !defaultConstraint || folded === undefined || folded === null;
|
|
173
|
+
if (defaultIsNullish) {
|
|
174
|
+
await validateNotNullBackfill(rctx, tableSchema, columnDef.name);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
150
177
|
// Extract column-level CHECK / FK constraints. Column-level UNIQUE is not enforced via
|
|
151
178
|
// table-level constraints; the existing rejection path in the manager handles it.
|
|
152
179
|
const newCheckConstraints = extractColumnLevelCheckConstraints(columnDef);
|
|
@@ -258,10 +285,7 @@ function extractColumnLevelForeignKeys(columnDef, defaultSchemaName) {
|
|
|
258
285
|
* `not (<check_expr>)` is a violation and aborts the ALTER.
|
|
259
286
|
*/
|
|
260
287
|
async function validateBackfillAgainstChecks(rctx, enhancedTableSchema, newCheckConstraints) {
|
|
261
|
-
const
|
|
262
|
-
? `${quoteIdentifier(enhancedTableSchema.schemaName)}.`
|
|
263
|
-
: '';
|
|
264
|
-
const qualifiedTable = `${schemaPrefix}${quoteIdentifier(enhancedTableSchema.name)}`;
|
|
288
|
+
const qualifiedTable = qualifyTableName(enhancedTableSchema.schemaName, enhancedTableSchema.name);
|
|
265
289
|
for (const cc of newCheckConstraints) {
|
|
266
290
|
const checkSql = expressionToString(cc.expr);
|
|
267
291
|
const sql = `select 1 from ${qualifiedTable} where not (${checkSql}) limit 1`;
|
|
@@ -281,6 +305,23 @@ async function validateBackfillAgainstChecks(rctx, enhancedTableSchema, newCheck
|
|
|
281
305
|
}
|
|
282
306
|
}
|
|
283
307
|
}
|
|
308
|
+
/**
|
|
309
|
+
* Rejects ADD COLUMN ... NOT NULL when no usable DEFAULT is supplied and the
|
|
310
|
+
* table already has rows. The pre-mutation form means no rollback is needed —
|
|
311
|
+
* the schema and module state are still untouched at this point.
|
|
312
|
+
*/
|
|
313
|
+
async function validateNotNullBackfill(rctx, tableSchema, newColumnName) {
|
|
314
|
+
const qualifiedTable = qualifyTableName(tableSchema.schemaName, tableSchema.name);
|
|
315
|
+
const stmt = rctx.db.prepare(`select 1 from ${qualifiedTable} limit 1`);
|
|
316
|
+
try {
|
|
317
|
+
for await (const _row of stmt._iterateRowsRaw()) {
|
|
318
|
+
throw new QuereusError(`NOT NULL constraint failed for column '${newColumnName}' added to ${tableSchema.schemaName}.${tableSchema.name} — column has no DEFAULT and existing rows cannot be backfilled`, StatusCode.CONSTRAINT);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
finally {
|
|
322
|
+
await stmt.finalize();
|
|
323
|
+
}
|
|
324
|
+
}
|
|
284
325
|
async function runDropColumn(rctx, tableSchema, schema, columnName) {
|
|
285
326
|
const colIndex = tableSchema.columnIndexMap.get(columnName.toLowerCase());
|
|
286
327
|
if (colIndex === undefined) {
|
|
@@ -529,10 +570,6 @@ async function rebuildMemoryTable(rctx, tableSchema, schema, module, survivingCo
|
|
|
529
570
|
* the shadow table faithfully mirrors the original schema.
|
|
530
571
|
*/
|
|
531
572
|
export function buildShadowTableDdl(tableSchema, shadowName, survivingColumns, newPkDef) {
|
|
532
|
-
const schemaName = tableSchema.schemaName;
|
|
533
|
-
const schemaPrefix = (schemaName && schemaName.toLowerCase() !== 'main')
|
|
534
|
-
? `${quoteIdentifier(schemaName)}.`
|
|
535
|
-
: '';
|
|
536
573
|
const colDefs = [];
|
|
537
574
|
for (const colName of survivingColumns) {
|
|
538
575
|
const idx = tableSchema.columnIndexMap.get(colName.toLowerCase());
|
|
@@ -556,7 +593,7 @@ export function buildShadowTableDdl(tableSchema, shadowName, survivingColumns, n
|
|
|
556
593
|
entry += ' desc';
|
|
557
594
|
pkColNames.push(entry);
|
|
558
595
|
}
|
|
559
|
-
let createDdl = `create table ${
|
|
596
|
+
let createDdl = `create table ${qualifyTableName(tableSchema.schemaName, shadowName)} (${colDefs.join(', ')}`;
|
|
560
597
|
createDdl += pkColNames.length > 0
|
|
561
598
|
? `, primary key (${pkColNames.join(', ')}))`
|
|
562
599
|
: `)`;
|
|
@@ -577,21 +614,20 @@ export function buildShadowTableDdl(tableSchema, shadowName, survivingColumns, n
|
|
|
577
614
|
async function rebuildViaShadowTable(rctx, tableSchema, schema, survivingColumns, newPkDef) {
|
|
578
615
|
const tableName = tableSchema.name;
|
|
579
616
|
const schemaName = tableSchema.schemaName;
|
|
580
|
-
const schemaPrefix = (schemaName && schemaName.toLowerCase() !== 'main')
|
|
581
|
-
? `${quoteIdentifier(schemaName)}.`
|
|
582
|
-
: '';
|
|
583
617
|
const shadowName = `${tableName}__rekey_${Date.now()}`;
|
|
618
|
+
const qualifiedShadow = qualifyTableName(schemaName, shadowName);
|
|
619
|
+
const qualifiedTable = qualifyTableName(schemaName, tableName);
|
|
584
620
|
const createDdl = buildShadowTableDdl(tableSchema, shadowName, survivingColumns, newPkDef);
|
|
585
621
|
const projection = survivingColumns.map(c => quoteIdentifier(c)).join(', ');
|
|
586
622
|
try {
|
|
587
623
|
await rctx.db._execWithinTransaction(createDdl);
|
|
588
|
-
await rctx.db._execWithinTransaction(`insert into ${
|
|
589
|
-
await rctx.db._execWithinTransaction(`drop table ${
|
|
590
|
-
await rctx.db._execWithinTransaction(`alter table ${
|
|
624
|
+
await rctx.db._execWithinTransaction(`insert into ${qualifiedShadow} (${projection}) select ${projection} from ${qualifiedTable}`);
|
|
625
|
+
await rctx.db._execWithinTransaction(`drop table ${qualifiedTable}`);
|
|
626
|
+
await rctx.db._execWithinTransaction(`alter table ${qualifiedShadow} rename to ${quoteIdentifier(tableName)}`);
|
|
591
627
|
}
|
|
592
628
|
catch (e) {
|
|
593
629
|
try {
|
|
594
|
-
await rctx.db._execWithinTransaction(`drop table if exists ${
|
|
630
|
+
await rctx.db._execWithinTransaction(`drop table if exists ${qualifiedShadow}`);
|
|
595
631
|
}
|
|
596
632
|
catch { /* ignore */ }
|
|
597
633
|
throw e;
|