@quereus/quereus 0.2.0 → 0.4.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 +12 -1
- package/dist/src/common/errors.js.map +1 -1
- package/dist/src/common/json-types.d.ts +11 -0
- package/dist/src/common/json-types.d.ts.map +1 -0
- package/dist/src/common/json-types.js +3 -0
- package/dist/src/common/json-types.js.map +1 -0
- package/dist/src/common/types.d.ts +2 -0
- package/dist/src/common/types.d.ts.map +1 -1
- package/dist/src/core/database-options.d.ts +2 -2
- package/dist/src/core/database-options.d.ts.map +1 -1
- package/dist/src/core/database-options.js.map +1 -1
- package/dist/src/core/database.d.ts +61 -14
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +481 -54
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/statement.d.ts.map +1 -1
- package/dist/src/core/statement.js +3 -1
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/func/builtins/builtin-window-functions.d.ts.map +1 -1
- package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
- package/dist/src/func/builtins/datetime.d.ts +2 -0
- package/dist/src/func/builtins/datetime.d.ts.map +1 -1
- package/dist/src/func/builtins/datetime.js +39 -0
- package/dist/src/func/builtins/datetime.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts +1 -0
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +159 -36
- package/dist/src/func/builtins/explain.js.map +1 -1
- package/dist/src/func/builtins/index.d.ts.map +1 -1
- package/dist/src/func/builtins/index.js +5 -2
- package/dist/src/func/builtins/index.js.map +1 -1
- package/dist/src/func/builtins/json-helpers.d.ts +8 -8
- package/dist/src/func/builtins/json-helpers.d.ts.map +1 -1
- package/dist/src/func/builtins/json-helpers.js +3 -3
- package/dist/src/func/builtins/json-helpers.js.map +1 -1
- package/dist/src/func/builtins/json-tvf.d.ts.map +1 -1
- package/dist/src/func/builtins/json-tvf.js +1 -1
- package/dist/src/func/builtins/json-tvf.js.map +1 -1
- package/dist/src/func/builtins/json.d.ts.map +1 -1
- package/dist/src/func/builtins/json.js +3 -2
- package/dist/src/func/builtins/json.js.map +1 -1
- package/dist/src/func/builtins/schema.d.ts.map +1 -1
- package/dist/src/func/builtins/schema.js +22 -1
- package/dist/src/func/builtins/schema.js.map +1 -1
- package/dist/src/func/context.d.ts.map +1 -1
- package/dist/src/func/context.js +5 -0
- package/dist/src/func/context.js.map +1 -1
- package/dist/src/func/registration.d.ts +2 -1
- package/dist/src/func/registration.d.ts.map +1 -1
- package/dist/src/func/registration.js.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/parser/ast.d.ts +84 -6
- package/dist/src/parser/ast.d.ts.map +1 -1
- package/dist/src/parser/lexer.d.ts +11 -0
- package/dist/src/parser/lexer.d.ts.map +1 -1
- package/dist/src/parser/lexer.js +29 -21
- package/dist/src/parser/lexer.js.map +1 -1
- package/dist/src/parser/parser.d.ts +16 -0
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +542 -26
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/parser/visitor.d.ts.map +1 -1
- package/dist/src/parser/visitor.js +1 -0
- package/dist/src/parser/visitor.js.map +1 -1
- package/dist/src/planner/analysis/binding-collector.d.ts +5 -0
- package/dist/src/planner/analysis/binding-collector.d.ts.map +1 -0
- package/dist/src/planner/analysis/binding-collector.js +73 -0
- package/dist/src/planner/analysis/binding-collector.js.map +1 -0
- package/dist/src/planner/analysis/const-evaluator.js +1 -1
- package/dist/src/planner/analysis/const-evaluator.js.map +1 -1
- package/dist/src/planner/analysis/const-pass.d.ts.map +1 -1
- package/dist/src/planner/analysis/const-pass.js +1 -1
- package/dist/src/planner/analysis/const-pass.js.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts +67 -31
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +513 -84
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/analysis/predicate-normalizer.d.ts +17 -0
- package/dist/src/planner/analysis/predicate-normalizer.d.ts.map +1 -0
- package/dist/src/planner/analysis/predicate-normalizer.js +222 -0
- package/dist/src/planner/analysis/predicate-normalizer.js.map +1 -0
- package/dist/src/planner/building/alter-table.d.ts.map +1 -1
- package/dist/src/planner/building/alter-table.js +5 -2
- package/dist/src/planner/building/alter-table.js.map +1 -1
- package/dist/src/planner/building/block.d.ts.map +1 -1
- package/dist/src/planner/building/block.js +16 -0
- package/dist/src/planner/building/block.js.map +1 -1
- package/dist/src/planner/building/constraint-builder.d.ts +2 -2
- package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
- package/dist/src/planner/building/constraint-builder.js +52 -3
- package/dist/src/planner/building/constraint-builder.js.map +1 -1
- package/dist/src/planner/building/create-assertion.d.ts +5 -0
- package/dist/src/planner/building/create-assertion.d.ts.map +1 -0
- package/dist/src/planner/building/create-assertion.js +5 -0
- package/dist/src/planner/building/create-assertion.js.map +1 -0
- package/dist/src/planner/building/declare-schema.d.ts +8 -0
- package/dist/src/planner/building/declare-schema.d.ts.map +1 -0
- package/dist/src/planner/building/declare-schema.js +14 -0
- package/dist/src/planner/building/declare-schema.js.map +1 -0
- package/dist/src/planner/building/delete.d.ts.map +1 -1
- package/dist/src/planner/building/delete.js +38 -6
- package/dist/src/planner/building/delete.js.map +1 -1
- package/dist/src/planner/building/drop-assertion.d.ts +5 -0
- package/dist/src/planner/building/drop-assertion.d.ts.map +1 -0
- package/dist/src/planner/building/drop-assertion.js +8 -0
- package/dist/src/planner/building/drop-assertion.js.map +1 -0
- package/dist/src/planner/building/expression.d.ts.map +1 -1
- package/dist/src/planner/building/expression.js +1 -0
- package/dist/src/planner/building/expression.js.map +1 -1
- package/dist/src/planner/building/function-call.d.ts.map +1 -1
- package/dist/src/planner/building/function-call.js +2 -1
- package/dist/src/planner/building/function-call.js.map +1 -1
- package/dist/src/planner/building/insert.d.ts.map +1 -1
- package/dist/src/planner/building/insert.js +68 -11
- package/dist/src/planner/building/insert.js.map +1 -1
- package/dist/src/planner/building/pragma.d.ts.map +1 -1
- package/dist/src/planner/building/pragma.js +1 -0
- package/dist/src/planner/building/pragma.js.map +1 -1
- package/dist/src/planner/building/schema-resolution.d.ts +2 -2
- package/dist/src/planner/building/schema-resolution.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.js +3 -2
- package/dist/src/planner/building/select-aggregates.js.map +1 -1
- package/dist/src/planner/building/select-compound.d.ts +2 -2
- package/dist/src/planner/building/select-compound.d.ts.map +1 -1
- package/dist/src/planner/building/select-compound.js +10 -1
- package/dist/src/planner/building/select-compound.js.map +1 -1
- package/dist/src/planner/building/select-context.d.ts +3 -3
- package/dist/src/planner/building/select-context.d.ts.map +1 -1
- package/dist/src/planner/building/select-context.js.map +1 -1
- package/dist/src/planner/building/select-modifiers.d.ts +6 -5
- package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
- package/dist/src/planner/building/select-modifiers.js +5 -4
- package/dist/src/planner/building/select-modifiers.js.map +1 -1
- package/dist/src/planner/building/select-projections.d.ts.map +1 -1
- package/dist/src/planner/building/select-projections.js +4 -5
- package/dist/src/planner/building/select-projections.js.map +1 -1
- package/dist/src/planner/building/select-window.d.ts.map +1 -1
- package/dist/src/planner/building/select-window.js +6 -3
- package/dist/src/planner/building/select-window.js.map +1 -1
- package/dist/src/planner/building/select.d.ts +3 -3
- package/dist/src/planner/building/select.d.ts.map +1 -1
- package/dist/src/planner/building/select.js +18 -8
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/building/table-function.d.ts.map +1 -1
- package/dist/src/planner/building/table-function.js +1 -1
- package/dist/src/planner/building/table-function.js.map +1 -1
- package/dist/src/planner/building/table.d.ts +5 -3
- package/dist/src/planner/building/table.d.ts.map +1 -1
- package/dist/src/planner/building/table.js +7 -2
- 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 +39 -7
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/building/with.d.ts +3 -3
- package/dist/src/planner/building/with.d.ts.map +1 -1
- package/dist/src/planner/building/with.js.map +1 -1
- package/dist/src/planner/debug.d.ts.map +1 -1
- package/dist/src/planner/debug.js.map +1 -1
- package/dist/src/planner/framework/characteristics.d.ts +235 -0
- package/dist/src/planner/framework/characteristics.d.ts.map +1 -0
- package/dist/src/planner/framework/characteristics.js +299 -0
- package/dist/src/planner/framework/characteristics.js.map +1 -0
- package/dist/src/planner/framework/context.d.ts +16 -5
- package/dist/src/planner/framework/context.d.ts.map +1 -1
- package/dist/src/planner/framework/context.js +2 -0
- package/dist/src/planner/framework/context.js.map +1 -1
- package/dist/src/planner/framework/pass.d.ts +116 -0
- package/dist/src/planner/framework/pass.d.ts.map +1 -0
- package/dist/src/planner/framework/pass.js +236 -0
- package/dist/src/planner/framework/pass.js.map +1 -0
- package/dist/src/planner/nodes/aggregate-node.d.ts +16 -6
- package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.js +40 -4
- package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
- package/dist/src/planner/nodes/array-index-node.js.map +1 -1
- package/dist/src/planner/nodes/cache-node.d.ts +5 -2
- package/dist/src/planner/nodes/cache-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/cache-node.js +6 -0
- package/dist/src/planner/nodes/cache-node.js.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.d.ts +12 -4
- package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.js +12 -4
- package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
- package/dist/src/planner/nodes/create-assertion-node.d.ts +22 -0
- package/dist/src/planner/nodes/create-assertion-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/create-assertion-node.js +41 -0
- package/dist/src/planner/nodes/create-assertion-node.js.map +1 -0
- package/dist/src/planner/nodes/create-index-node.js +2 -2
- package/dist/src/planner/nodes/create-index-node.js.map +1 -1
- package/dist/src/planner/nodes/create-table-node.js +2 -2
- package/dist/src/planner/nodes/create-table-node.js.map +1 -1
- package/dist/src/planner/nodes/cte-node.d.ts +17 -2
- package/dist/src/planner/nodes/cte-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/cte-node.js +9 -1
- package/dist/src/planner/nodes/cte-node.js.map +1 -1
- package/dist/src/planner/nodes/cte-reference-node.js +1 -1
- package/dist/src/planner/nodes/cte-reference-node.js.map +1 -1
- package/dist/src/planner/nodes/declarative-schema.d.ts +62 -0
- package/dist/src/planner/nodes/declarative-schema.d.ts.map +1 -0
- package/dist/src/planner/nodes/declarative-schema.js +181 -0
- package/dist/src/planner/nodes/declarative-schema.js.map +1 -0
- package/dist/src/planner/nodes/delete-node.d.ts +8 -3
- package/dist/src/planner/nodes/delete-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/delete-node.js +10 -2
- package/dist/src/planner/nodes/delete-node.js.map +1 -1
- package/dist/src/planner/nodes/distinct-node.d.ts +3 -2
- package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/distinct-node.js +17 -4
- package/dist/src/planner/nodes/distinct-node.js.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.d.ts +2 -2
- package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/drop-assertion-node.d.ts +21 -0
- package/dist/src/planner/nodes/drop-assertion-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/drop-assertion-node.js +41 -0
- package/dist/src/planner/nodes/drop-assertion-node.js.map +1 -0
- package/dist/src/planner/nodes/drop-table-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/drop-table-node.js +1 -0
- package/dist/src/planner/nodes/drop-table-node.js.map +1 -1
- package/dist/src/planner/nodes/filter.d.ts +8 -3
- package/dist/src/planner/nodes/filter.d.ts.map +1 -1
- package/dist/src/planner/nodes/filter.js +44 -0
- package/dist/src/planner/nodes/filter.js.map +1 -1
- package/dist/src/planner/nodes/insert-node.d.ts +9 -3
- package/dist/src/planner/nodes/insert-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/insert-node.js +11 -2
- package/dist/src/planner/nodes/insert-node.js.map +1 -1
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts +3 -4
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js +1 -16
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js.map +1 -1
- package/dist/src/planner/nodes/join-node.d.ts +12 -3
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +111 -2
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/limit-offset.d.ts +7 -3
- package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +15 -0
- package/dist/src/planner/nodes/limit-offset.js.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.d.ts +8 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.js +8 -0
- package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
- package/dist/src/planner/nodes/plan-node.d.ts +9 -9
- package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node.js +3 -3
- package/dist/src/planner/nodes/plan-node.js.map +1 -1
- package/dist/src/planner/nodes/pragma.d.ts +2 -1
- package/dist/src/planner/nodes/pragma.d.ts.map +1 -1
- package/dist/src/planner/nodes/pragma.js +3 -1
- package/dist/src/planner/nodes/pragma.js.map +1 -1
- package/dist/src/planner/nodes/project-node.d.ts +16 -3
- package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/project-node.js +82 -2
- package/dist/src/planner/nodes/project-node.js.map +1 -1
- package/dist/src/planner/nodes/recursive-cte-node.d.ts +2 -2
- package/dist/src/planner/nodes/recursive-cte-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/recursive-cte-node.js +1 -1
- package/dist/src/planner/nodes/recursive-cte-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts +13 -4
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +16 -0
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/remote-query-node.d.ts +37 -0
- package/dist/src/planner/nodes/remote-query-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/remote-query-node.js +63 -0
- package/dist/src/planner/nodes/remote-query-node.js.map +1 -0
- package/dist/src/planner/nodes/retrieve-node.d.ts +46 -0
- package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/retrieve-node.js +77 -0
- package/dist/src/planner/nodes/retrieve-node.js.map +1 -0
- package/dist/src/planner/nodes/returning-node.d.ts +4 -3
- package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/returning-node.js +44 -3
- package/dist/src/planner/nodes/returning-node.js.map +1 -1
- package/dist/src/planner/nodes/sequencing-node.d.ts +1 -1
- package/dist/src/planner/nodes/sequencing-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/sequencing-node.js.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts +1 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
- package/dist/src/planner/nodes/sort.d.ts +11 -2
- package/dist/src/planner/nodes/sort.d.ts.map +1 -1
- package/dist/src/planner/nodes/sort.js +23 -2
- package/dist/src/planner/nodes/sort.js.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.js +4 -1
- package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts +7 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +22 -4
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/nodes/table-function-call.d.ts +2 -1
- package/dist/src/planner/nodes/table-function-call.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-function-call.js +12 -5
- package/dist/src/planner/nodes/table-function-call.js.map +1 -1
- package/dist/src/planner/nodes/transaction-node.js +2 -2
- package/dist/src/planner/nodes/transaction-node.js.map +1 -1
- package/dist/src/planner/nodes/update-node.d.ts +7 -1
- package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/update-node.js +11 -2
- package/dist/src/planner/nodes/update-node.js.map +1 -1
- package/dist/src/planner/nodes/view-reference-node.js.map +1 -1
- package/dist/src/planner/nodes/window-function.js.map +1 -1
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/optimizer-tuning.d.ts +11 -0
- 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 +17 -3
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +159 -67
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/planning-context.d.ts +5 -3
- package/dist/src/planner/planning-context.d.ts.map +1 -1
- package/dist/src/planner/planning-context.js +2 -0
- package/dist/src/planner/planning-context.js.map +1 -1
- package/dist/src/planner/resolve.d.ts +3 -2
- package/dist/src/planner/resolve.d.ts.map +1 -1
- package/dist/src/planner/resolve.js +6 -5
- package/dist/src/planner/resolve.js.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts +8 -3
- 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 +206 -47
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts +10 -3
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js +95 -87
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts +8 -2
- package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-cte-optimization.js +24 -13
- package/dist/src/planner/rules/cache/rule-cte-optimization.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-materialization-advisory.d.ts +9 -2
- package/dist/src/planner/rules/cache/rule-materialization-advisory.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-materialization-advisory.js +14 -7
- package/dist/src/planner/rules/cache/rule-materialization-advisory.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.d.ts +9 -3
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js +34 -37
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts +14 -0
- package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js +33 -0
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -0
- package/dist/src/planner/rules/join/rule-join-key-inference.d.ts +11 -0
- package/dist/src/planner/rules/join/rule-join-key-inference.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-join-key-inference.js +32 -0
- package/dist/src/planner/rules/join/rule-join-key-inference.js.map +1 -0
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts +4 -0
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js +233 -0
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts +21 -0
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +125 -0
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -0
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts +21 -0
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -0
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +261 -0
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -0
- package/dist/src/planner/scopes/registered.d.ts +1 -0
- package/dist/src/planner/scopes/registered.d.ts.map +1 -1
- package/dist/src/planner/scopes/registered.js +7 -0
- package/dist/src/planner/scopes/registered.js.map +1 -1
- package/dist/src/planner/stats/index.d.ts +0 -17
- package/dist/src/planner/stats/index.d.ts.map +1 -1
- package/dist/src/planner/stats/index.js +0 -58
- package/dist/src/planner/stats/index.js.map +1 -1
- package/dist/src/planner/util/deferred-constraint.d.ts +14 -0
- package/dist/src/planner/util/deferred-constraint.d.ts.map +1 -0
- package/dist/src/planner/util/deferred-constraint.js +85 -0
- package/dist/src/planner/util/deferred-constraint.js.map +1 -0
- package/dist/src/planner/util/key-utils.d.ts +15 -0
- package/dist/src/planner/util/key-utils.d.ts.map +1 -0
- package/dist/src/planner/util/key-utils.js +43 -0
- package/dist/src/planner/util/key-utils.js.map +1 -0
- package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
- package/dist/src/planner/validation/plan-validator.js +1 -0
- package/dist/src/planner/validation/plan-validator.js.map +1 -1
- package/dist/src/runtime/deferred-constraint-queue.d.ts +33 -0
- package/dist/src/runtime/deferred-constraint-queue.d.ts.map +1 -0
- package/dist/src/runtime/deferred-constraint-queue.js +172 -0
- package/dist/src/runtime/deferred-constraint-queue.js.map +1 -0
- package/dist/src/runtime/emission-context.d.ts +9 -3
- package/dist/src/runtime/emission-context.d.ts.map +1 -1
- package/dist/src/runtime/emission-context.js +5 -1
- package/dist/src/runtime/emission-context.js.map +1 -1
- package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
- package/dist/src/runtime/emit/add-constraint.js +22 -4
- package/dist/src/runtime/emit/add-constraint.js.map +1 -1
- package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
- package/dist/src/runtime/emit/aggregate.js +3 -2
- package/dist/src/runtime/emit/aggregate.js.map +1 -1
- package/dist/src/runtime/emit/array-index.js.map +1 -1
- package/dist/src/runtime/emit/binary.d.ts.map +1 -1
- package/dist/src/runtime/emit/binary.js +9 -2
- package/dist/src/runtime/emit/binary.js.map +1 -1
- package/dist/src/runtime/emit/cache.d.ts.map +1 -1
- package/dist/src/runtime/emit/cache.js +1 -1
- package/dist/src/runtime/emit/cache.js.map +1 -1
- package/dist/src/runtime/emit/cast.d.ts.map +1 -1
- package/dist/src/runtime/emit/cast.js.map +1 -1
- package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
- package/dist/src/runtime/emit/constraint-check.js +112 -25
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/create-assertion.d.ts +5 -0
- package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -0
- package/dist/src/runtime/emit/create-assertion.js +70 -0
- package/dist/src/runtime/emit/create-assertion.js.map +1 -0
- package/dist/src/runtime/emit/cte-reference.d.ts.map +1 -1
- package/dist/src/runtime/emit/cte-reference.js.map +1 -1
- package/dist/src/runtime/emit/cte.d.ts.map +1 -1
- package/dist/src/runtime/emit/cte.js.map +1 -1
- package/dist/src/runtime/emit/distinct.d.ts.map +1 -1
- package/dist/src/runtime/emit/distinct.js.map +1 -1
- package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
- package/dist/src/runtime/emit/dml-executor.js +17 -9
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/drop-assertion.d.ts +5 -0
- package/dist/src/runtime/emit/drop-assertion.d.ts.map +1 -0
- package/dist/src/runtime/emit/drop-assertion.js +30 -0
- package/dist/src/runtime/emit/drop-assertion.js.map +1 -0
- package/dist/src/runtime/emit/filter.d.ts.map +1 -1
- package/dist/src/runtime/emit/filter.js.map +1 -1
- package/dist/src/runtime/emit/join.d.ts.map +1 -1
- package/dist/src/runtime/emit/join.js.map +1 -1
- package/dist/src/runtime/emit/limit-offset.d.ts.map +1 -1
- package/dist/src/runtime/emit/limit-offset.js.map +1 -1
- package/dist/src/runtime/emit/pragma.js.map +1 -1
- package/dist/src/runtime/emit/project.d.ts.map +1 -1
- package/dist/src/runtime/emit/project.js.map +1 -1
- package/dist/src/runtime/emit/recursive-cte.d.ts.map +1 -1
- package/dist/src/runtime/emit/recursive-cte.js +1 -1
- package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
- package/dist/src/runtime/emit/remote-query.d.ts +9 -0
- package/dist/src/runtime/emit/remote-query.d.ts.map +1 -0
- package/dist/src/runtime/emit/remote-query.js +30 -0
- package/dist/src/runtime/emit/remote-query.js.map +1 -0
- package/dist/src/runtime/emit/retrieve.d.ts +5 -0
- package/dist/src/runtime/emit/retrieve.d.ts.map +1 -0
- package/dist/src/runtime/emit/retrieve.js +9 -0
- package/dist/src/runtime/emit/retrieve.js.map +1 -0
- package/dist/src/runtime/emit/returning.d.ts.map +1 -1
- package/dist/src/runtime/emit/returning.js +1 -1
- package/dist/src/runtime/emit/returning.js.map +1 -1
- package/dist/src/runtime/emit/scalar-function.d.ts.map +1 -1
- package/dist/src/runtime/emit/scalar-function.js.map +1 -1
- package/dist/src/runtime/emit/scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/scan.js +20 -5
- package/dist/src/runtime/emit/scan.js.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.d.ts +8 -0
- package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -0
- package/dist/src/runtime/emit/schema-declarative.js +163 -0
- package/dist/src/runtime/emit/schema-declarative.js.map +1 -0
- package/dist/src/runtime/emit/sequencing.d.ts.map +1 -1
- package/dist/src/runtime/emit/sequencing.js.map +1 -1
- package/dist/src/runtime/emit/set-operation.d.ts.map +1 -1
- package/dist/src/runtime/emit/set-operation.js +6 -6
- package/dist/src/runtime/emit/set-operation.js.map +1 -1
- package/dist/src/runtime/emit/sort.d.ts.map +1 -1
- package/dist/src/runtime/emit/sort.js.map +1 -1
- package/dist/src/runtime/emit/subquery.d.ts +1 -1
- package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
- package/dist/src/runtime/emit/subquery.js +6 -6
- package/dist/src/runtime/emit/subquery.js.map +1 -1
- package/dist/src/runtime/emit/transaction.d.ts.map +1 -1
- package/dist/src/runtime/emit/transaction.js +48 -8
- package/dist/src/runtime/emit/transaction.js.map +1 -1
- package/dist/src/runtime/emit/values.d.ts.map +1 -1
- package/dist/src/runtime/emit/values.js.map +1 -1
- package/dist/src/runtime/emit/window.d.ts.map +1 -1
- package/dist/src/runtime/emit/window.js.map +1 -1
- package/dist/src/runtime/emitters.d.ts.map +1 -1
- package/dist/src/runtime/emitters.js +1 -0
- package/dist/src/runtime/emitters.js.map +1 -1
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +16 -2
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/runtime/scheduler.js.map +1 -1
- package/dist/src/runtime/types.d.ts +2 -2
- package/dist/src/runtime/types.d.ts.map +1 -1
- package/dist/src/runtime/types.js +4 -1
- package/dist/src/runtime/types.js.map +1 -1
- package/dist/src/runtime/utils.d.ts +2 -2
- package/dist/src/runtime/utils.d.ts.map +1 -1
- package/dist/src/runtime/utils.js +1 -0
- package/dist/src/runtime/utils.js.map +1 -1
- package/dist/src/schema/assertion.d.ts +19 -0
- package/dist/src/schema/assertion.d.ts.map +1 -0
- package/dist/src/schema/assertion.js +2 -0
- package/dist/src/schema/assertion.js.map +1 -0
- package/dist/src/schema/catalog.d.ts +44 -0
- package/dist/src/schema/catalog.d.ts.map +1 -0
- package/dist/src/schema/catalog.js +148 -0
- package/dist/src/schema/catalog.js.map +1 -0
- package/dist/src/schema/change-events.d.ts +2 -2
- package/dist/src/schema/change-events.d.ts.map +1 -1
- package/dist/src/schema/column.d.ts +2 -0
- package/dist/src/schema/column.d.ts.map +1 -1
- package/dist/src/schema/column.js.map +1 -1
- package/dist/src/schema/declared-schema-manager.d.ts +42 -0
- package/dist/src/schema/declared-schema-manager.d.ts.map +1 -0
- package/dist/src/schema/declared-schema-manager.js +71 -0
- package/dist/src/schema/declared-schema-manager.js.map +1 -0
- package/dist/src/schema/function.d.ts +3 -2
- package/dist/src/schema/function.d.ts.map +1 -1
- package/dist/src/schema/function.js.map +1 -1
- package/dist/src/schema/manager.d.ts +8 -3
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +32 -3
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/schema-differ.d.ts +34 -0
- package/dist/src/schema/schema-differ.d.ts.map +1 -0
- package/dist/src/schema/schema-differ.js +157 -0
- package/dist/src/schema/schema-differ.js.map +1 -0
- package/dist/src/schema/schema-hasher.d.ts +10 -0
- package/dist/src/schema/schema-hasher.d.ts.map +1 -0
- package/dist/src/schema/schema-hasher.js +39 -0
- package/dist/src/schema/schema-hasher.js.map +1 -0
- package/dist/src/schema/schema.d.ts +7 -0
- package/dist/src/schema/schema.d.ts.map +1 -1
- package/dist/src/schema/schema.js +19 -0
- package/dist/src/schema/schema.js.map +1 -1
- package/dist/src/schema/table.d.ts +31 -6
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +27 -12
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/schema/window-function.d.ts.map +1 -1
- package/dist/src/schema/window-function.js.map +1 -1
- package/dist/src/util/ast-stringify.d.ts.map +1 -1
- package/dist/src/util/ast-stringify.js +116 -3
- package/dist/src/util/ast-stringify.js.map +1 -1
- package/dist/src/util/environment.js.map +1 -1
- package/dist/src/util/plugin-loader.d.ts +25 -0
- package/dist/src/util/plugin-loader.d.ts.map +1 -1
- package/dist/src/util/plugin-loader.js +137 -0
- package/dist/src/util/plugin-loader.js.map +1 -1
- package/dist/src/util/row-descriptor.d.ts +1 -1
- package/dist/src/util/row-descriptor.d.ts.map +1 -1
- package/dist/src/util/row-descriptor.js.map +1 -1
- package/dist/src/util/serialization.d.ts +3 -0
- package/dist/src/util/serialization.d.ts.map +1 -1
- package/dist/src/util/serialization.js +1 -0
- package/dist/src/util/serialization.js.map +1 -1
- package/dist/src/vtab/best-access-plan.d.ts +1 -1
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js +1 -0
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/manifest.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base.js +2 -0
- package/dist/src/vtab/memory/layer/base.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +2 -1
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +24 -6
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/layer/safe-iterate.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/safe-iterate.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +5 -0
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/memory/table.d.ts +2 -1
- package/dist/src/vtab/memory/table.d.ts.map +1 -1
- package/dist/src/vtab/memory/table.js +3 -2
- package/dist/src/vtab/memory/table.js.map +1 -1
- package/dist/src/vtab/memory/utils/logging.d.ts +2 -2
- package/dist/src/vtab/memory/utils/logging.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/logging.js +6 -3
- package/dist/src/vtab/memory/utils/logging.js.map +1 -1
- package/dist/src/vtab/module.d.ts +25 -0
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/dist/src/vtab/table.d.ts +18 -5
- package/dist/src/vtab/table.d.ts.map +1 -1
- package/dist/src/vtab/table.js.map +1 -1
- package/package.json +5 -3
- package/src/common/errors.ts +1 -1
- package/src/common/json-types.ts +16 -0
- package/src/common/types.ts +3 -0
- package/src/core/database-options.ts +8 -8
- package/src/core/database.ts +537 -71
- package/src/core/statement.ts +3 -1
- package/src/func/builtins/builtin-window-functions.ts +11 -10
- package/src/func/builtins/datetime.ts +42 -0
- package/src/func/builtins/explain.ts +186 -44
- package/src/func/builtins/index.ts +5 -2
- package/src/func/builtins/json-helpers.ts +21 -21
- package/src/func/builtins/json-tvf.ts +8 -9
- package/src/func/builtins/json.ts +10 -9
- package/src/func/builtins/schema.ts +24 -4
- package/src/func/context.ts +7 -0
- package/src/func/registration.ts +5 -1
- package/src/index.ts +3 -3
- package/src/parser/ast.ts +582 -484
- package/src/parser/lexer.ts +27 -21
- package/src/parser/parser.ts +3336 -2776
- package/src/parser/visitor.ts +1 -0
- package/src/planner/analysis/binding-collector.ts +83 -0
- package/src/planner/analysis/const-evaluator.ts +1 -1
- package/src/planner/analysis/const-pass.ts +3 -2
- package/src/planner/analysis/constraint-extractor.ts +610 -123
- package/src/planner/analysis/predicate-normalizer.ts +237 -0
- package/src/planner/building/alter-table.ts +3 -1
- package/src/planner/building/block.ts +93 -78
- package/src/planner/building/constraint-builder.ts +173 -114
- package/src/planner/building/create-assertion.ts +7 -0
- package/src/planner/building/declare-schema.ts +22 -0
- package/src/planner/building/delete.ts +214 -171
- package/src/planner/building/drop-assertion.ts +11 -0
- package/src/planner/building/expression.ts +1 -0
- package/src/planner/building/function-call.ts +6 -5
- package/src/planner/building/insert.ts +428 -349
- package/src/planner/building/pragma.ts +1 -0
- package/src/planner/building/schema-resolution.ts +176 -176
- package/src/planner/building/select-aggregates.ts +5 -3
- package/src/planner/building/select-compound.ts +22 -13
- package/src/planner/building/select-context.ts +6 -6
- package/src/planner/building/select-modifiers.ts +8 -7
- package/src/planner/building/select-projections.ts +177 -176
- package/src/planner/building/select-window.ts +259 -253
- package/src/planner/building/select.ts +531 -520
- package/src/planner/building/table-function.ts +49 -48
- package/src/planner/building/table.ts +9 -3
- package/src/planner/building/update.ts +319 -270
- package/src/planner/building/with.ts +7 -7
- package/src/planner/debug.ts +1 -0
- package/src/planner/framework/characteristics.ts +503 -0
- package/src/planner/framework/context.ts +23 -6
- package/src/planner/framework/pass.ts +354 -0
- package/src/planner/nodes/aggregate-node.ts +52 -7
- package/src/planner/nodes/array-index-node.ts +1 -1
- package/src/planner/nodes/cache-node.ts +11 -2
- package/src/planner/nodes/constraint-check-node.ts +16 -7
- package/src/planner/nodes/create-assertion-node.ts +51 -0
- package/src/planner/nodes/create-index-node.ts +2 -2
- package/src/planner/nodes/create-table-node.ts +2 -2
- package/src/planner/nodes/cte-node.ts +30 -4
- package/src/planner/nodes/cte-reference-node.ts +2 -2
- package/src/planner/nodes/declarative-schema.ts +221 -0
- package/src/planner/nodes/delete-node.ts +102 -96
- package/src/planner/nodes/distinct-node.ts +20 -6
- package/src/planner/nodes/dml-executor-node.ts +2 -2
- package/src/planner/nodes/drop-assertion-node.ts +50 -0
- package/src/planner/nodes/drop-table-node.ts +1 -0
- package/src/planner/nodes/filter.ts +56 -3
- package/src/planner/nodes/insert-node.ts +126 -120
- package/src/planner/nodes/internal-recursive-cte-ref-node.ts +5 -20
- package/src/planner/nodes/join-node.ts +122 -4
- package/src/planner/nodes/limit-offset.ts +132 -113
- package/src/planner/nodes/plan-node-type.ts +95 -87
- package/src/planner/nodes/plan-node.ts +8 -8
- package/src/planner/nodes/pragma.ts +6 -3
- package/src/planner/nodes/project-node.ts +101 -7
- package/src/planner/nodes/recursive-cte-node.ts +6 -6
- package/src/planner/nodes/reference.ts +334 -312
- package/src/planner/nodes/remote-query-node.ts +73 -0
- package/src/planner/nodes/retrieve-node.ts +86 -0
- package/src/planner/nodes/returning-node.ts +52 -10
- package/src/planner/nodes/sequencing-node.ts +2 -2
- package/src/planner/nodes/set-operation-node.ts +3 -3
- package/src/planner/nodes/sort.ts +33 -4
- package/src/planner/nodes/stream-aggregate.ts +5 -1
- package/src/planner/nodes/table-access-nodes.ts +31 -6
- package/src/planner/nodes/table-function-call.ts +134 -127
- package/src/planner/nodes/transaction-node.ts +2 -2
- package/src/planner/nodes/update-node.ts +138 -132
- package/src/planner/nodes/view-reference-node.ts +1 -1
- package/src/planner/nodes/window-function.ts +2 -2
- package/src/planner/nodes/window-node.ts +1 -1
- package/src/planner/optimizer-tuning.ts +18 -0
- package/src/planner/optimizer.ts +171 -96
- package/src/planner/planning-context.ts +10 -3
- package/src/planner/resolve.ts +10 -9
- package/src/planner/rules/README.md +96 -96
- package/src/planner/rules/access/rule-select-access-path.ts +384 -184
- package/src/planner/rules/aggregate/rule-aggregate-streaming.ts +118 -104
- package/src/planner/rules/cache/rule-cte-optimization.ts +29 -16
- package/src/planner/rules/cache/rule-materialization-advisory.ts +14 -7
- package/src/planner/rules/cache/rule-mutating-subquery-cache.ts +38 -44
- package/src/planner/rules/join/rule-join-greedy-commute.ts +48 -0
- package/src/planner/rules/join/rule-join-key-inference.ts +35 -0
- package/src/planner/rules/join/rule-quickpick-enumeration.ts +267 -0
- package/src/planner/rules/predicate/rule-predicate-pushdown.ts +144 -0
- package/src/planner/rules/retrieve/rule-grow-retrieve.ts +337 -0
- package/src/planner/scopes/registered.ts +8 -0
- package/src/planner/stats/index.ts +0 -65
- package/src/planner/util/key-utils.ts +46 -0
- package/src/planner/validation/plan-validator.ts +5 -3
- package/src/runtime/deferred-constraint-queue.ts +196 -0
- package/src/runtime/emission-context.ts +11 -5
- package/src/runtime/emit/add-constraint.ts +26 -5
- package/src/runtime/emit/aggregate.ts +9 -7
- package/src/runtime/emit/array-index.ts +2 -2
- package/src/runtime/emit/binary.ts +26 -8
- package/src/runtime/emit/cache.ts +2 -2
- package/src/runtime/emit/cast.ts +2 -2
- package/src/runtime/emit/constraint-check.ts +150 -28
- package/src/runtime/emit/create-assertion.ts +82 -0
- package/src/runtime/emit/cte-reference.ts +2 -2
- package/src/runtime/emit/cte.ts +2 -2
- package/src/runtime/emit/distinct.ts +2 -2
- package/src/runtime/emit/dml-executor.ts +20 -12
- package/src/runtime/emit/drop-assertion.ts +45 -0
- package/src/runtime/emit/filter.ts +4 -4
- package/src/runtime/emit/join.ts +8 -7
- package/src/runtime/emit/limit-offset.ts +2 -2
- package/src/runtime/emit/pragma.ts +2 -2
- package/src/runtime/emit/project.ts +2 -2
- package/src/runtime/emit/recursive-cte.ts +2 -2
- package/src/runtime/emit/remote-query.ts +47 -0
- package/src/runtime/emit/retrieve.ts +15 -0
- package/src/runtime/emit/returning.ts +4 -4
- package/src/runtime/emit/scalar-function.ts +2 -2
- package/src/runtime/emit/scan.ts +29 -13
- package/src/runtime/emit/schema-declarative.ts +205 -0
- package/src/runtime/emit/sequencing.ts +3 -3
- package/src/runtime/emit/set-operation.ts +7 -7
- package/src/runtime/emit/sort.ts +2 -2
- package/src/runtime/emit/subquery.ts +10 -10
- package/src/runtime/emit/transaction.ts +46 -8
- package/src/runtime/emit/values.ts +2 -2
- package/src/runtime/emit/window.ts +3 -3
- package/src/runtime/emitters.ts +1 -0
- package/src/runtime/register.ts +150 -135
- package/src/runtime/scheduler.ts +2 -2
- package/src/runtime/types.ts +10 -7
- package/src/runtime/utils.ts +3 -2
- package/src/schema/assertion.ts +21 -0
- package/src/schema/catalog.ts +208 -0
- package/src/schema/change-events.ts +2 -2
- package/src/schema/column.ts +2 -0
- package/src/schema/declared-schema-manager.ts +82 -0
- package/src/schema/function.ts +5 -2
- package/src/schema/manager.ts +742 -709
- package/src/schema/schema-differ.ts +214 -0
- package/src/schema/schema-hasher.ts +44 -0
- package/src/schema/schema.ts +23 -0
- package/src/schema/table.ts +398 -364
- package/src/schema/window-function.ts +2 -0
- package/src/util/ast-stringify.ts +869 -764
- package/src/util/environment.ts +2 -2
- package/src/util/plugin-loader.ts +184 -0
- package/src/util/row-descriptor.ts +1 -1
- package/src/util/serialization.ts +2 -0
- package/src/vtab/best-access-plan.ts +2 -1
- package/src/vtab/manifest.ts +1 -0
- package/src/vtab/memory/index.ts +178 -178
- package/src/vtab/memory/layer/base.ts +275 -273
- package/src/vtab/memory/layer/interface.ts +47 -47
- package/src/vtab/memory/layer/manager.ts +33 -11
- package/src/vtab/memory/layer/safe-iterate.ts +3 -3
- package/src/vtab/memory/layer/transaction.ts +229 -229
- package/src/vtab/memory/module.ts +24 -18
- package/src/vtab/memory/table.ts +256 -253
- package/src/vtab/memory/utils/logging.ts +6 -3
- package/src/vtab/module.ts +170 -140
- package/src/vtab/table.ts +162 -143
|
@@ -12,15 +12,23 @@ import { Parser, ParseError } from '../parser/parser.js';
|
|
|
12
12
|
import { buildBlock } from '../planner/building/block.js';
|
|
13
13
|
import { emitPlanNode } from '../runtime/emitters.js';
|
|
14
14
|
import { Scheduler } from '../runtime/scheduler.js';
|
|
15
|
+
import { BlockNode } from '../planner/nodes/block.js';
|
|
15
16
|
import { BuildTimeDependencyTracker } from '../planner/planning-context.js';
|
|
16
17
|
import { ParameterScope } from '../planner/scopes/param.js';
|
|
17
18
|
import { GlobalScope } from '../planner/scopes/global.js';
|
|
19
|
+
import { FilterNode } from '../planner/nodes/filter.js';
|
|
20
|
+
import { BinaryOpNode } from '../planner/nodes/scalar.js';
|
|
21
|
+
import { ParameterReferenceNode, ColumnReferenceNode, TableReferenceNode } from '../planner/nodes/reference.js';
|
|
18
22
|
import { registerEmitters } from '../runtime/register.js';
|
|
19
23
|
import { serializePlanTree, formatPlanTree } from '../planner/debug.js';
|
|
20
24
|
import { EmissionContext } from '../runtime/emission-context.js';
|
|
21
25
|
import { Optimizer, DEFAULT_TUNING } from '../planner/optimizer.js';
|
|
22
26
|
import { registerBuiltinWindowFunctions } from '../func/builtins/builtin-window-functions.js';
|
|
23
27
|
import { DatabaseOptionsManager } from './database-options.js';
|
|
28
|
+
import { isAsyncIterable } from '../runtime/utils.js';
|
|
29
|
+
import { DeclaredSchemaManager } from '../schema/declared-schema-manager.js';
|
|
30
|
+
import { analyzeRowSpecific } from '../planner/analysis/constraint-extractor.js';
|
|
31
|
+
import { DeferredConstraintQueue } from '../runtime/deferred-constraint-queue.js';
|
|
24
32
|
const log = createLogger('core:database');
|
|
25
33
|
const warnLog = log.extend('warn');
|
|
26
34
|
const errorLog = log.extend('error');
|
|
@@ -31,6 +39,7 @@ const debugLog = log.extend('debug');
|
|
|
31
39
|
*/
|
|
32
40
|
export class Database {
|
|
33
41
|
schemaManager;
|
|
42
|
+
declaredSchemaManager;
|
|
34
43
|
isOpen = true;
|
|
35
44
|
statements = new Set();
|
|
36
45
|
isAutocommit = true; // Manages transaction state
|
|
@@ -40,8 +49,15 @@ export class Database {
|
|
|
40
49
|
optimizer;
|
|
41
50
|
options;
|
|
42
51
|
instructionTracer;
|
|
52
|
+
/** Per-transaction change tracking: base table name → serialized PK tuples */
|
|
53
|
+
changeLog = new Map();
|
|
54
|
+
/** Savepoint layers for change tracking */
|
|
55
|
+
changeLogLayers = [];
|
|
56
|
+
/** Deferred constraint evaluation queue */
|
|
57
|
+
deferredConstraints = new DeferredConstraintQueue(this);
|
|
43
58
|
constructor() {
|
|
44
59
|
this.schemaManager = new SchemaManager(this);
|
|
60
|
+
this.declaredSchemaManager = new DeclaredSchemaManager();
|
|
45
61
|
this.options = new DatabaseOptionsManager();
|
|
46
62
|
log("Database instance created.");
|
|
47
63
|
// Register built-in functions
|
|
@@ -85,9 +101,8 @@ export class Database {
|
|
|
85
101
|
validatePlan: event.newValue
|
|
86
102
|
}
|
|
87
103
|
};
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
log('Optimizer recreated with validate_plan = %s', event.newValue);
|
|
104
|
+
this.updateOptimizerTuning(newTuning);
|
|
105
|
+
log('Optimizer tuning updated with validate_plan = %s', event.newValue);
|
|
91
106
|
}
|
|
92
107
|
});
|
|
93
108
|
this.options.registerOption('default_vtab_module', {
|
|
@@ -182,7 +197,7 @@ export class Database {
|
|
|
182
197
|
}
|
|
183
198
|
if (batch.length === 0)
|
|
184
199
|
return;
|
|
185
|
-
const needsImplicitTransaction = batch.length
|
|
200
|
+
const needsImplicitTransaction = batch.length >= 1
|
|
186
201
|
&& this.isAutocommit
|
|
187
202
|
// has explicit transaction
|
|
188
203
|
&& !batch.some(ast => ast.type === 'begin' || ast.type === 'commit' || ast.type === 'rollback' || ast.type === 'savepoint' || ast.type === 'release');
|
|
@@ -204,7 +219,7 @@ export class Database {
|
|
|
204
219
|
const scheduler = new Scheduler(rootInstruction);
|
|
205
220
|
const runtimeCtx = {
|
|
206
221
|
db: this,
|
|
207
|
-
stmt:
|
|
222
|
+
stmt: undefined,
|
|
208
223
|
params: params ?? {},
|
|
209
224
|
context: new Map(),
|
|
210
225
|
tableContexts: new Map(),
|
|
@@ -215,7 +230,8 @@ export class Database {
|
|
|
215
230
|
// Nothing to do with the result, this is executed for side effects only
|
|
216
231
|
}
|
|
217
232
|
catch (err) {
|
|
218
|
-
|
|
233
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
234
|
+
executionError = error instanceof QuereusError ? error : new QuereusError(error.message, StatusCode.ERROR, error);
|
|
219
235
|
break; // Stop processing further statements on error
|
|
220
236
|
}
|
|
221
237
|
// No explicit finalize for transient plan/scheduler used in exec loop
|
|
@@ -223,16 +239,11 @@ export class Database {
|
|
|
223
239
|
}
|
|
224
240
|
finally {
|
|
225
241
|
if (needsImplicitTransaction) {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
await this.rollbackImplicitTransaction();
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
await this.commitImplicitTransaction();
|
|
232
|
-
}
|
|
242
|
+
if (executionError) {
|
|
243
|
+
await this.rollbackImplicitTransaction();
|
|
233
244
|
}
|
|
234
|
-
|
|
235
|
-
|
|
245
|
+
else {
|
|
246
|
+
await this.commitImplicitTransaction();
|
|
236
247
|
}
|
|
237
248
|
}
|
|
238
249
|
}
|
|
@@ -359,7 +370,7 @@ export class Database {
|
|
|
359
370
|
* Registers a user-defined aggregate function.
|
|
360
371
|
*
|
|
361
372
|
* @param name The name of the SQL function.
|
|
362
|
-
* @param options Configuration: { numArgs: number, flags?: number, initialState?:
|
|
373
|
+
* @param options Configuration: { numArgs: number, flags?: number, initialState?: unknown }.
|
|
363
374
|
* @param stepFunc The function called for each row (accumulator, ...args) => newAccumulator.
|
|
364
375
|
* @param finalFunc The function called at the end (accumulator) => finalResult.
|
|
365
376
|
*/
|
|
@@ -438,6 +449,10 @@ export class Database {
|
|
|
438
449
|
this.checkOpen();
|
|
439
450
|
return this.options.getOption(option);
|
|
440
451
|
}
|
|
452
|
+
/** Update optimizer tuning in place */
|
|
453
|
+
updateOptimizerTuning(tuning) {
|
|
454
|
+
this.optimizer.updateTuning(tuning);
|
|
455
|
+
}
|
|
441
456
|
/**
|
|
442
457
|
* Registers a user-defined collation sequence.
|
|
443
458
|
* @param name The name of the collation sequence (case-insensitive).
|
|
@@ -480,6 +495,125 @@ export class Database {
|
|
|
480
495
|
_getCollation(name) {
|
|
481
496
|
return getCollation(name);
|
|
482
497
|
}
|
|
498
|
+
/** Serialize a composite primary key tuple for set storage */
|
|
499
|
+
serializeKeyTuple(values) {
|
|
500
|
+
// JSON serialization is sufficient because SqlValue is JSON-safe in this engine
|
|
501
|
+
return JSON.stringify(values);
|
|
502
|
+
}
|
|
503
|
+
/** Add a key tuple to the current change log for a base table */
|
|
504
|
+
addChange(baseTable, keyTuple) {
|
|
505
|
+
const target = this.changeLogLayers.length > 0
|
|
506
|
+
? this.changeLogLayers[this.changeLogLayers.length - 1]
|
|
507
|
+
: this.changeLog;
|
|
508
|
+
const key = baseTable.toLowerCase();
|
|
509
|
+
if (!target.has(key))
|
|
510
|
+
target.set(key, new Set());
|
|
511
|
+
target.get(key).add(this.serializeKeyTuple(keyTuple));
|
|
512
|
+
}
|
|
513
|
+
_queueDeferredConstraintRow(baseTable, constraintName, row, descriptor, evaluator, connectionId, contextRow, contextDescriptor) {
|
|
514
|
+
this.deferredConstraints.enqueue(baseTable, constraintName, row, descriptor, evaluator, connectionId, contextRow, contextDescriptor);
|
|
515
|
+
}
|
|
516
|
+
/** @internal Flag to prevent new connections from starting transactions during constraint evaluation */
|
|
517
|
+
evaluatingDeferredConstraints = false;
|
|
518
|
+
/** @internal Flag indicating we're in a coordinated multi-connection commit */
|
|
519
|
+
inCoordinatedCommit = false;
|
|
520
|
+
async runDeferredRowConstraints() {
|
|
521
|
+
this.evaluatingDeferredConstraints = true;
|
|
522
|
+
try {
|
|
523
|
+
await this.deferredConstraints.runDeferredRows();
|
|
524
|
+
}
|
|
525
|
+
finally {
|
|
526
|
+
this.evaluatingDeferredConstraints = false;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
/** @internal Check if we should skip auto-beginning transactions on newly registered connections */
|
|
530
|
+
_isEvaluatingDeferredConstraints() {
|
|
531
|
+
return this.evaluatingDeferredConstraints;
|
|
532
|
+
}
|
|
533
|
+
/** @internal Mark start of coordinated multi-connection commit */
|
|
534
|
+
_beginCoordinatedCommit() {
|
|
535
|
+
this.inCoordinatedCommit = true;
|
|
536
|
+
}
|
|
537
|
+
/** @internal Mark end of coordinated multi-connection commit */
|
|
538
|
+
_endCoordinatedCommit() {
|
|
539
|
+
this.inCoordinatedCommit = false;
|
|
540
|
+
}
|
|
541
|
+
/** @internal Check if we're in a coordinated commit (allows sibling layer validation) */
|
|
542
|
+
_inCoordinatedCommit() {
|
|
543
|
+
return this.inCoordinatedCommit;
|
|
544
|
+
}
|
|
545
|
+
/** Public API used by DML emitters to record changes */
|
|
546
|
+
_recordInsert(baseTable, newKey) {
|
|
547
|
+
this.addChange(baseTable, newKey);
|
|
548
|
+
}
|
|
549
|
+
_recordDelete(baseTable, oldKey) {
|
|
550
|
+
this.addChange(baseTable, oldKey);
|
|
551
|
+
}
|
|
552
|
+
_recordUpdate(baseTable, oldKey, newKey) {
|
|
553
|
+
this.addChange(baseTable, oldKey);
|
|
554
|
+
// If the PK changed, also record the new key
|
|
555
|
+
if (this.serializeKeyTuple(oldKey) !== this.serializeKeyTuple(newKey)) {
|
|
556
|
+
this.addChange(baseTable, newKey);
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
/** Savepoint change tracking */
|
|
560
|
+
_beginSavepointLayer() {
|
|
561
|
+
this.changeLogLayers.push(new Map());
|
|
562
|
+
this.deferredConstraints.beginLayer();
|
|
563
|
+
}
|
|
564
|
+
_rollbackSavepointLayer() {
|
|
565
|
+
// Discard the top layer
|
|
566
|
+
this.changeLogLayers.pop();
|
|
567
|
+
this.deferredConstraints.rollbackLayer();
|
|
568
|
+
}
|
|
569
|
+
_releaseSavepointLayer() {
|
|
570
|
+
// Merge the top layer into previous or main log
|
|
571
|
+
const top = this.changeLogLayers.pop();
|
|
572
|
+
if (!top)
|
|
573
|
+
return;
|
|
574
|
+
const target = this.changeLogLayers.length > 0 ? this.changeLogLayers[this.changeLogLayers.length - 1] : this.changeLog;
|
|
575
|
+
for (const [table, set] of top) {
|
|
576
|
+
if (!target.has(table))
|
|
577
|
+
target.set(table, new Set());
|
|
578
|
+
const tgt = target.get(table);
|
|
579
|
+
for (const k of set)
|
|
580
|
+
tgt.add(k);
|
|
581
|
+
}
|
|
582
|
+
this.deferredConstraints.releaseLayer();
|
|
583
|
+
}
|
|
584
|
+
getChangedBaseTables() {
|
|
585
|
+
const result = new Set();
|
|
586
|
+
const collect = (m) => {
|
|
587
|
+
for (const [t, s] of m) {
|
|
588
|
+
if (s.size > 0)
|
|
589
|
+
result.add(t);
|
|
590
|
+
}
|
|
591
|
+
};
|
|
592
|
+
collect(this.changeLog);
|
|
593
|
+
for (const layer of this.changeLogLayers)
|
|
594
|
+
collect(layer);
|
|
595
|
+
return result;
|
|
596
|
+
}
|
|
597
|
+
_clearChangeLog() {
|
|
598
|
+
this.changeLog.clear();
|
|
599
|
+
this.changeLogLayers = [];
|
|
600
|
+
this.deferredConstraints.clear();
|
|
601
|
+
}
|
|
602
|
+
/**
|
|
603
|
+
* Marks that an explicit SQL BEGIN has started a transaction.
|
|
604
|
+
* Ensures subsequently registered connections also begin a transaction.
|
|
605
|
+
*/
|
|
606
|
+
markExplicitTransactionStart() {
|
|
607
|
+
this.inTransaction = true;
|
|
608
|
+
this.isAutocommit = false;
|
|
609
|
+
}
|
|
610
|
+
/**
|
|
611
|
+
* Marks that an explicit SQL COMMIT/ROLLBACK has ended the transaction.
|
|
612
|
+
*/
|
|
613
|
+
markExplicitTransactionEnd() {
|
|
614
|
+
this.inTransaction = false;
|
|
615
|
+
this.isAutocommit = true;
|
|
616
|
+
}
|
|
483
617
|
/**
|
|
484
618
|
* Prepares, binds parameters, executes, and yields result rows for a query.
|
|
485
619
|
* This is a high-level convenience method for iterating over query results.
|
|
@@ -537,9 +671,10 @@ export class Database {
|
|
|
537
671
|
try {
|
|
538
672
|
ast = parser.parse(originalSqlString);
|
|
539
673
|
}
|
|
540
|
-
catch (
|
|
541
|
-
|
|
542
|
-
|
|
674
|
+
catch (err) {
|
|
675
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
676
|
+
errorLog("Failed to parse SQL for query plan: %O", error);
|
|
677
|
+
throw error;
|
|
543
678
|
}
|
|
544
679
|
}
|
|
545
680
|
else {
|
|
@@ -616,7 +751,8 @@ export class Database {
|
|
|
616
751
|
cteNodes: new Map(),
|
|
617
752
|
schemaDependencies: new BuildTimeDependencyTracker(),
|
|
618
753
|
schemaCache: new Map(),
|
|
619
|
-
cteReferenceCache: new Map()
|
|
754
|
+
cteReferenceCache: new Map(),
|
|
755
|
+
outputScopes: new Map()
|
|
620
756
|
};
|
|
621
757
|
return buildBlock(ctx, statements);
|
|
622
758
|
}
|
|
@@ -628,8 +764,9 @@ export class Database {
|
|
|
628
764
|
this.activeConnections.set(connection.connectionId, connection);
|
|
629
765
|
debugLog(`Registered connection ${connection.connectionId} for table ${connection.tableName}`);
|
|
630
766
|
// If we're already in a transaction (implicit or explicit),
|
|
631
|
-
// start a transaction on this new connection
|
|
632
|
-
|
|
767
|
+
// start a transaction on this new connection UNLESS we're evaluating deferred constraints
|
|
768
|
+
// (during which subqueries should read committed state without creating new transaction layers)
|
|
769
|
+
if (this.inTransaction && !this.evaluatingDeferredConstraints) {
|
|
633
770
|
try {
|
|
634
771
|
await connection.begin();
|
|
635
772
|
debugLog(`Started transaction on newly registered connection ${connection.connectionId}`);
|
|
@@ -639,6 +776,9 @@ export class Database {
|
|
|
639
776
|
// Don't throw here - just log the error to avoid breaking connection registration
|
|
640
777
|
}
|
|
641
778
|
}
|
|
779
|
+
else if (this.evaluatingDeferredConstraints) {
|
|
780
|
+
debugLog(`Skipped transaction begin on connection ${connection.connectionId} (evaluating deferred constraints)`);
|
|
781
|
+
}
|
|
642
782
|
}
|
|
643
783
|
/**
|
|
644
784
|
* @internal Unregisters an active VirtualTable connection.
|
|
@@ -670,8 +810,13 @@ export class Database {
|
|
|
670
810
|
* @returns Array of connections for the table
|
|
671
811
|
*/
|
|
672
812
|
getConnectionsForTable(tableName) {
|
|
813
|
+
const normalized = tableName.toLowerCase();
|
|
814
|
+
const simpleName = normalized.includes('.') ? normalized.substring(normalized.lastIndexOf('.') + 1) : normalized;
|
|
673
815
|
return Array.from(this.activeConnections.values())
|
|
674
|
-
.filter(conn =>
|
|
816
|
+
.filter(conn => {
|
|
817
|
+
const connName = conn.tableName.toLowerCase();
|
|
818
|
+
return connName === normalized || connName === simpleName;
|
|
819
|
+
});
|
|
675
820
|
}
|
|
676
821
|
/**
|
|
677
822
|
* @internal Gets all active connections.
|
|
@@ -702,21 +847,6 @@ export class Database {
|
|
|
702
847
|
if (!this.isOpen)
|
|
703
848
|
throw new MisuseError("Database is closed");
|
|
704
849
|
}
|
|
705
|
-
/** Helper to execute simple commands (BEGIN, COMMIT, ROLLBACK) internally
|
|
706
|
-
* This method is for commands that don't produce rows and don't need complex parameter handling.
|
|
707
|
-
*/
|
|
708
|
-
async execSimple(sqlCommand) {
|
|
709
|
-
let stmt = null;
|
|
710
|
-
try {
|
|
711
|
-
stmt = this.prepare(sqlCommand);
|
|
712
|
-
await stmt.run();
|
|
713
|
-
}
|
|
714
|
-
finally {
|
|
715
|
-
if (stmt) {
|
|
716
|
-
await stmt.finalize();
|
|
717
|
-
}
|
|
718
|
-
}
|
|
719
|
-
}
|
|
720
850
|
/**
|
|
721
851
|
* Begin an implicit transaction and coordinate with virtual table connections
|
|
722
852
|
*/
|
|
@@ -743,24 +873,318 @@ export class Database {
|
|
|
743
873
|
*/
|
|
744
874
|
async commitImplicitTransaction() {
|
|
745
875
|
debugLog("Database: Committing implicit transaction.");
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
876
|
+
try {
|
|
877
|
+
const connectionsToCommit = this.getAllConnections();
|
|
878
|
+
// Evaluate global assertions and deferred row constraints BEFORE committing connections. If violated, rollback and abort.
|
|
879
|
+
await this.runGlobalAssertions();
|
|
880
|
+
await this.runDeferredRowConstraints();
|
|
881
|
+
// Mark coordinated commit to relax layer validation for sibling layers
|
|
882
|
+
this._beginCoordinatedCommit();
|
|
749
883
|
try {
|
|
750
|
-
|
|
884
|
+
// Commit only the original connections (not any opened during constraint evaluation)
|
|
885
|
+
// Commit sequentially to avoid race conditions with layer promotion
|
|
886
|
+
for (const connection of connectionsToCommit) {
|
|
887
|
+
try {
|
|
888
|
+
await connection.commit();
|
|
889
|
+
}
|
|
890
|
+
catch (error) {
|
|
891
|
+
errorLog(`Error committing transaction on connection ${connection.connectionId}: %O`, error);
|
|
892
|
+
throw error;
|
|
893
|
+
}
|
|
894
|
+
}
|
|
751
895
|
}
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
throw error;
|
|
896
|
+
finally {
|
|
897
|
+
this._endCoordinatedCommit();
|
|
755
898
|
}
|
|
756
|
-
}
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
899
|
+
}
|
|
900
|
+
catch (e) {
|
|
901
|
+
// On pre-commit assertion failure (or commit error), rollback all connections
|
|
902
|
+
const conns = this.getAllConnections();
|
|
903
|
+
await Promise.allSettled(conns.map(c => c.rollback()));
|
|
904
|
+
throw e;
|
|
905
|
+
}
|
|
906
|
+
finally {
|
|
907
|
+
this.inTransaction = false;
|
|
908
|
+
this.isAutocommit = true;
|
|
909
|
+
this.inImplicitTransaction = false;
|
|
910
|
+
this._clearChangeLog();
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
async runGlobalAssertions() {
|
|
914
|
+
const assertions = this.schemaManager.getAllAssertions();
|
|
915
|
+
if (assertions.length === 0)
|
|
916
|
+
return;
|
|
917
|
+
// Only evaluate assertions impacted by changed base tables
|
|
918
|
+
const changedBases = this.getChangedBaseTables();
|
|
919
|
+
if (changedBases.size === 0)
|
|
920
|
+
return;
|
|
921
|
+
for (const assertion of assertions) {
|
|
922
|
+
const planSql = assertion.violationSql;
|
|
923
|
+
const parser = new Parser();
|
|
924
|
+
let ast;
|
|
925
|
+
try {
|
|
926
|
+
ast = parser.parse(planSql);
|
|
927
|
+
}
|
|
928
|
+
catch (err) {
|
|
929
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
930
|
+
throw new QuereusError(`Failed to parse deferred assertion '${assertion.name}': ${error.message}`, StatusCode.INTERNAL, error);
|
|
931
|
+
}
|
|
932
|
+
const plan = this._buildPlan([ast]);
|
|
933
|
+
const analyzed = this.optimizer.optimizeForAnalysis(plan, this);
|
|
934
|
+
// Collect base tables and relationKeys in this plan
|
|
935
|
+
const relationKeyToBase = new Map();
|
|
936
|
+
const baseTablesInPlan = new Set();
|
|
937
|
+
this.collectTables(analyzed, relationKeyToBase, baseTablesInPlan);
|
|
938
|
+
// Determine impact: if assertion has no dependencies, treat as global and always impacted.
|
|
939
|
+
const hasDeps = baseTablesInPlan.size > 0;
|
|
940
|
+
let impacted = !hasDeps;
|
|
941
|
+
if (hasDeps) {
|
|
942
|
+
for (const b of baseTablesInPlan) {
|
|
943
|
+
if (changedBases.has(b)) {
|
|
944
|
+
impacted = true;
|
|
945
|
+
break;
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
if (!impacted)
|
|
950
|
+
continue;
|
|
951
|
+
// Classify instances as row/global
|
|
952
|
+
const classifications = analyzeRowSpecific(analyzed);
|
|
953
|
+
// If any changed base appears as a global instance, run full violation query once
|
|
954
|
+
let requiresGlobal = false;
|
|
955
|
+
for (const [relKey, klass] of classifications) {
|
|
956
|
+
if (klass === 'global') {
|
|
957
|
+
const base = relationKeyToBase.get(relKey);
|
|
958
|
+
if (base && changedBases.has(base)) {
|
|
959
|
+
requiresGlobal = true;
|
|
960
|
+
break;
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
if (requiresGlobal) {
|
|
965
|
+
await this.executeViolationOnce(assertion.name, assertion.violationSql);
|
|
966
|
+
continue;
|
|
967
|
+
}
|
|
968
|
+
// Collect row-specific references that correspond to changed bases
|
|
969
|
+
const rowSpecificChanged = [];
|
|
970
|
+
for (const [relKey, klass] of classifications) {
|
|
971
|
+
if (klass !== 'row')
|
|
972
|
+
continue;
|
|
973
|
+
const base = relationKeyToBase.get(relKey);
|
|
974
|
+
if (base && changedBases.has(base))
|
|
975
|
+
rowSpecificChanged.push({ relKey, base });
|
|
976
|
+
}
|
|
977
|
+
if (rowSpecificChanged.length === 0) {
|
|
978
|
+
// No row-specific changed refs (or no refs at all) → run once globally.
|
|
979
|
+
await this.executeViolationOnce(assertion.name, assertion.violationSql);
|
|
980
|
+
continue;
|
|
981
|
+
}
|
|
982
|
+
// Execute parameterized variants per changed key for each row-specific reference; early-exit on violation
|
|
983
|
+
for (const { relKey, base } of rowSpecificChanged) {
|
|
984
|
+
await this.executeViolationPerChangedKeys(assertion.name, assertion.violationSql, analyzed, relKey, base);
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
async executeViolationOnce(assertionName, sql) {
|
|
989
|
+
const stmt = await this.prepare(sql);
|
|
990
|
+
try {
|
|
991
|
+
for await (const _ of stmt.all()) {
|
|
992
|
+
throw new QuereusError(`Integrity assertion failed: ${assertionName}`, StatusCode.CONSTRAINT);
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
finally {
|
|
996
|
+
await stmt.finalize();
|
|
997
|
+
}
|
|
998
|
+
}
|
|
999
|
+
async executeViolationOnceFromPlan(assertionName, plan) {
|
|
1000
|
+
const optimizedPlan = this.optimizer.optimize(plan, this);
|
|
1001
|
+
const emissionContext = new EmissionContext(this);
|
|
1002
|
+
const rootInstruction = emitPlanNode(optimizedPlan, emissionContext);
|
|
1003
|
+
const scheduler = new Scheduler(rootInstruction);
|
|
1004
|
+
const runtimeCtx = {
|
|
1005
|
+
db: this,
|
|
1006
|
+
stmt: undefined,
|
|
1007
|
+
params: {},
|
|
1008
|
+
context: new Map(),
|
|
1009
|
+
tableContexts: new Map(),
|
|
1010
|
+
tracer: this.instructionTracer,
|
|
1011
|
+
enableMetrics: this.options.getBooleanOption('runtime_stats'),
|
|
1012
|
+
};
|
|
1013
|
+
const result = await scheduler.run(runtimeCtx);
|
|
1014
|
+
if (isAsyncIterable(result)) {
|
|
1015
|
+
for await (const _ of result) {
|
|
1016
|
+
throw new QuereusError(`CHECK constraint failed: ${assertionName}`, StatusCode.CONSTRAINT);
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
async executeViolationPerChangedKeysFromPlan(assertionName, analyzed, targetRelationKey, base) {
|
|
1021
|
+
const changedKeyTuples = this.getChangedKeyTuples(base);
|
|
1022
|
+
if (changedKeyTuples.length === 0)
|
|
1023
|
+
return;
|
|
1024
|
+
// Find PK indices for the base table
|
|
1025
|
+
const [schemaName, tableName] = base.split('.');
|
|
1026
|
+
const table = this._findTable(tableName, schemaName);
|
|
1027
|
+
if (!table) {
|
|
1028
|
+
throw new QuereusError(`Constraint references unknown table ${base}`, StatusCode.INTERNAL);
|
|
1029
|
+
}
|
|
1030
|
+
const pkIndices = table.primaryKeyDefinition.map(def => def.index);
|
|
1031
|
+
// Prepare a rewritten plan with an injected Filter on the target relationKey
|
|
1032
|
+
const rewritten = this.injectPkFilter(analyzed, targetRelationKey, base, pkIndices);
|
|
1033
|
+
const optimizedPlan = this.optimizer.optimize(rewritten, this);
|
|
1034
|
+
// Emit and execute for each changed PK tuple; stop on first violation row.
|
|
1035
|
+
const emissionContext = new EmissionContext(this);
|
|
1036
|
+
const rootInstruction = emitPlanNode(optimizedPlan, emissionContext);
|
|
1037
|
+
const scheduler = new Scheduler(rootInstruction);
|
|
1038
|
+
for (const tuple of changedKeyTuples) {
|
|
1039
|
+
const params = {};
|
|
1040
|
+
for (let i = 0; i < pkIndices.length; i++) {
|
|
1041
|
+
params[`pk${i}`] = tuple[i];
|
|
1042
|
+
}
|
|
1043
|
+
const runtimeCtx = {
|
|
1044
|
+
db: this,
|
|
1045
|
+
stmt: undefined,
|
|
1046
|
+
params,
|
|
1047
|
+
context: new Map(),
|
|
1048
|
+
tableContexts: new Map(),
|
|
1049
|
+
tracer: this.instructionTracer,
|
|
1050
|
+
enableMetrics: this.options.getBooleanOption('runtime_stats'),
|
|
1051
|
+
};
|
|
1052
|
+
// Run and detect first output row (violation)
|
|
1053
|
+
const result = await scheduler.run(runtimeCtx);
|
|
1054
|
+
if (isAsyncIterable(result)) {
|
|
1055
|
+
for await (const _ of result) {
|
|
1056
|
+
throw new QuereusError(`CHECK constraint failed: ${assertionName}`, StatusCode.CONSTRAINT);
|
|
1057
|
+
}
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
/** Execute a parameterized variant of the assertion once per changed key for a specific row-specific relationKey. */
|
|
1062
|
+
async executeViolationPerChangedKeys(assertionName, violationSql, analyzed, targetRelationKey, base) {
|
|
1063
|
+
const changedKeyTuples = this.getChangedKeyTuples(base);
|
|
1064
|
+
if (changedKeyTuples.length === 0)
|
|
1065
|
+
return;
|
|
1066
|
+
// Find PK indices for the base table
|
|
1067
|
+
const [schemaName, tableName] = base.split('.');
|
|
1068
|
+
const table = this._findTable(tableName, schemaName);
|
|
1069
|
+
if (!table) {
|
|
1070
|
+
throw new QuereusError(`Assertion references unknown table ${base}`, StatusCode.INTERNAL);
|
|
1071
|
+
}
|
|
1072
|
+
const pkIndices = table.primaryKeyDefinition.map(def => def.index);
|
|
1073
|
+
// Prepare a rewritten plan with an injected Filter on the target relationKey
|
|
1074
|
+
const rewritten = this.injectPkFilter(analyzed, targetRelationKey, base, pkIndices);
|
|
1075
|
+
const optimizedPlan = this.optimizer.optimize(rewritten, this);
|
|
1076
|
+
// Emit and execute for each changed PK tuple; stop on first violation row.
|
|
1077
|
+
const emissionContext = new EmissionContext(this);
|
|
1078
|
+
const rootInstruction = emitPlanNode(optimizedPlan, emissionContext);
|
|
1079
|
+
const scheduler = new Scheduler(rootInstruction);
|
|
1080
|
+
for (const tuple of changedKeyTuples) {
|
|
1081
|
+
const params = {};
|
|
1082
|
+
for (let i = 0; i < pkIndices.length; i++) {
|
|
1083
|
+
params[`pk${i}`] = tuple[i];
|
|
1084
|
+
}
|
|
1085
|
+
const runtimeCtx = {
|
|
1086
|
+
db: this,
|
|
1087
|
+
stmt: undefined,
|
|
1088
|
+
params,
|
|
1089
|
+
context: new Map(),
|
|
1090
|
+
tableContexts: new Map(),
|
|
1091
|
+
tracer: this.instructionTracer,
|
|
1092
|
+
enableMetrics: this.options.getBooleanOption('runtime_stats'),
|
|
1093
|
+
};
|
|
1094
|
+
// Run and detect first output row (violation)
|
|
1095
|
+
const result = await scheduler.run(runtimeCtx);
|
|
1096
|
+
if (isAsyncIterable(result)) {
|
|
1097
|
+
for await (const _ of result) {
|
|
1098
|
+
throw new QuereusError(`Integrity assertion failed: ${assertionName}`, StatusCode.CONSTRAINT);
|
|
1099
|
+
}
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
/** Gather all changed PK tuples for a base table across layers */
|
|
1104
|
+
getChangedKeyTuples(base) {
|
|
1105
|
+
const lower = base.toLowerCase();
|
|
1106
|
+
const tuples = [];
|
|
1107
|
+
const collect = (m) => {
|
|
1108
|
+
const set = m.get(lower);
|
|
1109
|
+
if (!set)
|
|
1110
|
+
return;
|
|
1111
|
+
for (const s of set)
|
|
1112
|
+
tuples.push(JSON.parse(s));
|
|
1113
|
+
};
|
|
1114
|
+
collect(this.changeLog);
|
|
1115
|
+
for (const layer of this.changeLogLayers)
|
|
1116
|
+
collect(layer);
|
|
1117
|
+
return tuples;
|
|
1118
|
+
}
|
|
1119
|
+
/** Inject an equality Filter with named parameters :pk0, :pk1, ... at the earliest reference of targetRelationKey. */
|
|
1120
|
+
injectPkFilter(block, targetRelationKey, base, pkIndices) {
|
|
1121
|
+
const newStatements = block.getChildren().map(stmt => this.rewriteForPkFilter(stmt, targetRelationKey, base, pkIndices));
|
|
1122
|
+
if (newStatements.every((s, i) => s === block.getChildren()[i]))
|
|
1123
|
+
return block;
|
|
1124
|
+
return this.createBlockWithNewStatements(block, newStatements);
|
|
1125
|
+
}
|
|
1126
|
+
rewriteForPkFilter(node, targetRelationKey, base, pkIndices) {
|
|
1127
|
+
// If this node is the target TableReference instance, wrap with a Filter
|
|
1128
|
+
const maybe = this.tryWrapTableReference(node, targetRelationKey, base, pkIndices);
|
|
1129
|
+
if (maybe)
|
|
1130
|
+
return maybe;
|
|
1131
|
+
const originalChildren = node.getChildren();
|
|
1132
|
+
if (!originalChildren || originalChildren.length === 0)
|
|
1133
|
+
return node;
|
|
1134
|
+
const rewrittenChildren = originalChildren.map(child => this.rewriteForPkFilter(child, targetRelationKey, base, pkIndices));
|
|
1135
|
+
const changed = rewrittenChildren.some((c, i) => c !== originalChildren[i]);
|
|
1136
|
+
return changed ? node.withChildren(rewrittenChildren) : node;
|
|
1137
|
+
}
|
|
1138
|
+
tryWrapTableReference(node, targetRelationKey, base, pkIndices) {
|
|
1139
|
+
if (!(node instanceof TableReferenceNode))
|
|
1140
|
+
return null;
|
|
1141
|
+
const tableSchema = node.tableSchema;
|
|
1142
|
+
const schemaName = tableSchema.schemaName;
|
|
1143
|
+
const tableName = tableSchema.name;
|
|
1144
|
+
const relName = `${schemaName}.${tableName}`.toLowerCase();
|
|
1145
|
+
const relKey = `${relName}#${node.id ?? 'unknown'}`;
|
|
1146
|
+
if (relKey !== targetRelationKey)
|
|
1147
|
+
return null;
|
|
1148
|
+
// Build predicate: AND(col_pk_i = :pk{i}) for all PK columns
|
|
1149
|
+
const relational = node;
|
|
1150
|
+
const scope = relational.scope;
|
|
1151
|
+
const attributes = relational.getAttributes();
|
|
1152
|
+
const makeColumnRef = (colIndex) => {
|
|
1153
|
+
const attr = attributes[colIndex];
|
|
1154
|
+
const expr = { type: 'column', name: attr.name, table: tableName, schema: schemaName };
|
|
1155
|
+
return new ColumnReferenceNode(scope, expr, attr.type, attr.id, colIndex);
|
|
1156
|
+
};
|
|
1157
|
+
const makeParamRef = (i, type) => {
|
|
1158
|
+
const pexpr = { type: 'parameter', name: `pk${i}` };
|
|
1159
|
+
return new ParameterReferenceNode(scope, pexpr, `pk${i}`, type);
|
|
1160
|
+
};
|
|
1161
|
+
let predicate = null;
|
|
1162
|
+
for (let i = 0; i < pkIndices.length; i++) {
|
|
1163
|
+
const colIdx = pkIndices[i];
|
|
1164
|
+
const left = makeColumnRef(colIdx);
|
|
1165
|
+
const right = makeParamRef(i, attributes[colIdx].type);
|
|
1166
|
+
const bexpr = { type: 'binary', operator: '=', left: left.expression, right: right.expression };
|
|
1167
|
+
const eqNode = new BinaryOpNode(scope, bexpr, left, right);
|
|
1168
|
+
predicate = predicate
|
|
1169
|
+
? new BinaryOpNode(scope, { type: 'binary', operator: 'AND', left: predicate.expression, right: eqNode.expression }, predicate, eqNode)
|
|
1170
|
+
: eqNode;
|
|
1171
|
+
}
|
|
1172
|
+
if (!predicate)
|
|
1173
|
+
return null;
|
|
1174
|
+
// Wrap the table reference with a FilterNode
|
|
1175
|
+
return new FilterNode(scope, relational, predicate);
|
|
1176
|
+
}
|
|
1177
|
+
collectTables(node, relToBase, bases) {
|
|
1178
|
+
for (const child of node.getChildren()) {
|
|
1179
|
+
this.collectTables(child, relToBase, bases);
|
|
1180
|
+
}
|
|
1181
|
+
if (node instanceof TableReferenceNode) {
|
|
1182
|
+
const schema = node.tableSchema;
|
|
1183
|
+
const baseName = `${schema.schemaName}.${schema.name}`.toLowerCase();
|
|
1184
|
+
bases.add(baseName);
|
|
1185
|
+
const relKey = `${baseName}#${node.id ?? 'unknown'}`;
|
|
1186
|
+
relToBase.set(relKey, baseName);
|
|
1187
|
+
}
|
|
764
1188
|
}
|
|
765
1189
|
/**
|
|
766
1190
|
* Rollback an implicit transaction and coordinate with virtual table connections
|
|
@@ -775,7 +1199,7 @@ export class Database {
|
|
|
775
1199
|
}
|
|
776
1200
|
catch (error) {
|
|
777
1201
|
errorLog(`Error rolling back transaction on connection ${connection.connectionId}: %O`, error);
|
|
778
|
-
//
|
|
1202
|
+
// Continue attempting rollback for other connections.
|
|
779
1203
|
}
|
|
780
1204
|
});
|
|
781
1205
|
await Promise.allSettled(rollbackPromises);
|
|
@@ -784,5 +1208,8 @@ export class Database {
|
|
|
784
1208
|
this.isAutocommit = true;
|
|
785
1209
|
this.inImplicitTransaction = false;
|
|
786
1210
|
}
|
|
1211
|
+
createBlockWithNewStatements(block, statements) {
|
|
1212
|
+
return new BlockNode(block.scope, statements, block.parameters);
|
|
1213
|
+
}
|
|
787
1214
|
}
|
|
788
1215
|
//# sourceMappingURL=database.js.map
|