@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
package/src/core/database.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { createLogger } from '../common/logger.js';
|
|
2
2
|
import { MisuseError, quereusError, QuereusError } from '../common/errors.js';
|
|
3
|
-
import { StatusCode, type SqlParameters, type SqlValue } from '../common/types.js';
|
|
4
|
-
import type {
|
|
3
|
+
import { StatusCode, type SqlParameters, type SqlValue, type Row, type OutputValue } from '../common/types.js';
|
|
4
|
+
import type { ScalarType } from '../common/datatype.js';
|
|
5
|
+
import type { AnyVirtualTableModule } from '../vtab/module.js';
|
|
5
6
|
import { Statement } from './statement.js';
|
|
6
7
|
import { SchemaManager } from '../schema/manager.js';
|
|
7
8
|
import type { TableSchema } from '../schema/table.js';
|
|
@@ -11,7 +12,6 @@ import { createScalarFunction, createAggregateFunction } from '../func/registrat
|
|
|
11
12
|
import { FunctionFlags } from '../common/constants.js';
|
|
12
13
|
import { MemoryTableModule } from '../vtab/memory/module.js';
|
|
13
14
|
import type { VirtualTableConnection } from '../vtab/connection.js';
|
|
14
|
-
|
|
15
15
|
import { BINARY_COLLATION, getCollation, NOCASE_COLLATION, registerCollation, RTRIM_COLLATION, type CollationFunction } from '../util/comparison.js';
|
|
16
16
|
import { Parser, ParseError } from '../parser/parser.js';
|
|
17
17
|
import * as AST from '../parser/ast.js';
|
|
@@ -19,20 +19,29 @@ import { buildBlock } from '../planner/building/block.js';
|
|
|
19
19
|
import { emitPlanNode } from '../runtime/emitters.js';
|
|
20
20
|
import { Scheduler } from '../runtime/scheduler.js';
|
|
21
21
|
import type { RuntimeContext } from '../runtime/types.js';
|
|
22
|
-
import type {
|
|
22
|
+
import type { RowDescriptor } from '../planner/nodes/plan-node.js';
|
|
23
|
+
import { BlockNode } from '../planner/nodes/block.js';
|
|
23
24
|
import type { PlanningContext } from '../planner/planning-context.js';
|
|
24
25
|
import { BuildTimeDependencyTracker } from '../planner/planning-context.js';
|
|
25
26
|
import { ParameterScope } from '../planner/scopes/param.js';
|
|
26
27
|
import { GlobalScope } from '../planner/scopes/global.js';
|
|
27
|
-
import
|
|
28
|
+
import { PlanNode, type RelationalPlanNode, type ScalarPlanNode } from '../planner/nodes/plan-node.js';
|
|
29
|
+
import { FilterNode } from '../planner/nodes/filter.js';
|
|
30
|
+
import { BinaryOpNode } from '../planner/nodes/scalar.js';
|
|
31
|
+
import { ParameterReferenceNode, ColumnReferenceNode, TableReferenceNode } from '../planner/nodes/reference.js';
|
|
28
32
|
import { registerEmitters } from '../runtime/register.js';
|
|
29
33
|
import { serializePlanTree, formatPlanTree } from '../planner/debug.js';
|
|
30
34
|
import type { DebugOptions } from '../planner/planning-context.js';
|
|
31
35
|
import { EmissionContext } from '../runtime/emission-context.js';
|
|
32
36
|
import { Optimizer, DEFAULT_TUNING } from '../planner/optimizer.js';
|
|
37
|
+
import type { OptimizerTuning } from '../planner/optimizer-tuning.js';
|
|
33
38
|
import { registerBuiltinWindowFunctions } from '../func/builtins/builtin-window-functions.js';
|
|
34
39
|
import { DatabaseOptionsManager } from './database-options.js';
|
|
35
40
|
import type { InstructionTracer } from '../runtime/types.js';
|
|
41
|
+
import { isAsyncIterable } from '../runtime/utils.js';
|
|
42
|
+
import { DeclaredSchemaManager } from '../schema/declared-schema-manager.js';
|
|
43
|
+
import { analyzeRowSpecific } from '../planner/analysis/constraint-extractor.js';
|
|
44
|
+
import { DeferredConstraintQueue } from '../runtime/deferred-constraint-queue.js';
|
|
36
45
|
|
|
37
46
|
const log = createLogger('core:database');
|
|
38
47
|
const warnLog = log.extend('warn');
|
|
@@ -45,6 +54,7 @@ const debugLog = log.extend('debug');
|
|
|
45
54
|
*/
|
|
46
55
|
export class Database {
|
|
47
56
|
public readonly schemaManager: SchemaManager;
|
|
57
|
+
public readonly declaredSchemaManager: DeclaredSchemaManager;
|
|
48
58
|
private isOpen = true;
|
|
49
59
|
private statements = new Set<Statement>();
|
|
50
60
|
private isAutocommit = true; // Manages transaction state
|
|
@@ -54,9 +64,16 @@ export class Database {
|
|
|
54
64
|
public readonly optimizer: Optimizer;
|
|
55
65
|
public readonly options: DatabaseOptionsManager;
|
|
56
66
|
private instructionTracer: InstructionTracer | undefined;
|
|
67
|
+
/** Per-transaction change tracking: base table name → serialized PK tuples */
|
|
68
|
+
private changeLog: Map<string, Set<string>> = new Map();
|
|
69
|
+
/** Savepoint layers for change tracking */
|
|
70
|
+
private changeLogLayers: Array<Map<string, Set<string>>> = [];
|
|
71
|
+
/** Deferred constraint evaluation queue */
|
|
72
|
+
private readonly deferredConstraints = new DeferredConstraintQueue(this);
|
|
57
73
|
|
|
58
74
|
constructor() {
|
|
59
75
|
this.schemaManager = new SchemaManager(this);
|
|
76
|
+
this.declaredSchemaManager = new DeclaredSchemaManager();
|
|
60
77
|
this.options = new DatabaseOptionsManager();
|
|
61
78
|
log("Database instance created.");
|
|
62
79
|
|
|
@@ -110,9 +127,8 @@ export class Database {
|
|
|
110
127
|
validatePlan: event.newValue as boolean
|
|
111
128
|
}
|
|
112
129
|
};
|
|
113
|
-
|
|
114
|
-
(
|
|
115
|
-
log('Optimizer recreated with validate_plan = %s', event.newValue);
|
|
130
|
+
this.updateOptimizerTuning(newTuning as OptimizerTuning);
|
|
131
|
+
log('Optimizer tuning updated with validate_plan = %s', event.newValue);
|
|
116
132
|
}
|
|
117
133
|
});
|
|
118
134
|
|
|
@@ -130,7 +146,7 @@ export class Database {
|
|
|
130
146
|
defaultValue: {},
|
|
131
147
|
description: 'Default virtual table module arguments',
|
|
132
148
|
onChange: (event) => {
|
|
133
|
-
this.schemaManager.setDefaultVTabArgs(event.newValue as Record<string,
|
|
149
|
+
this.schemaManager.setDefaultVTabArgs(event.newValue as Record<string, SqlValue>);
|
|
134
150
|
}
|
|
135
151
|
});
|
|
136
152
|
|
|
@@ -220,7 +236,7 @@ export class Database {
|
|
|
220
236
|
|
|
221
237
|
if (batch.length === 0) return;
|
|
222
238
|
|
|
223
|
-
const needsImplicitTransaction = batch.length
|
|
239
|
+
const needsImplicitTransaction = batch.length >= 1
|
|
224
240
|
&& this.isAutocommit
|
|
225
241
|
// has explicit transaction
|
|
226
242
|
&& !batch.some(
|
|
@@ -251,7 +267,7 @@ export class Database {
|
|
|
251
267
|
|
|
252
268
|
const runtimeCtx: RuntimeContext = {
|
|
253
269
|
db: this,
|
|
254
|
-
stmt:
|
|
270
|
+
stmt: undefined,
|
|
255
271
|
params: params ?? {},
|
|
256
272
|
context: new Map(),
|
|
257
273
|
tableContexts: new Map(),
|
|
@@ -261,9 +277,9 @@ export class Database {
|
|
|
261
277
|
|
|
262
278
|
void await scheduler.run(runtimeCtx);
|
|
263
279
|
// Nothing to do with the result, this is executed for side effects only
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
executionError =
|
|
280
|
+
} catch (err) {
|
|
281
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
282
|
+
executionError = error instanceof QuereusError ? error : new QuereusError(error.message, StatusCode.ERROR, error);
|
|
267
283
|
break; // Stop processing further statements on error
|
|
268
284
|
}
|
|
269
285
|
// No explicit finalize for transient plan/scheduler used in exec loop
|
|
@@ -271,14 +287,10 @@ export class Database {
|
|
|
271
287
|
|
|
272
288
|
} finally {
|
|
273
289
|
if (needsImplicitTransaction) {
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
await this.commitImplicitTransaction();
|
|
279
|
-
}
|
|
280
|
-
} catch (txError) {
|
|
281
|
-
errorLog(`Error during implicit transaction ${executionError ? 'rollback' : 'commit'}: %O`, txError);
|
|
290
|
+
if (executionError) {
|
|
291
|
+
await this.rollbackImplicitTransaction();
|
|
292
|
+
} else {
|
|
293
|
+
await this.commitImplicitTransaction();
|
|
282
294
|
}
|
|
283
295
|
}
|
|
284
296
|
}
|
|
@@ -294,7 +306,7 @@ export class Database {
|
|
|
294
306
|
* @param module The module implementation.
|
|
295
307
|
* @param auxData Optional client data passed to xCreate/xConnect.
|
|
296
308
|
*/
|
|
297
|
-
registerVtabModule(name: string, module:
|
|
309
|
+
registerVtabModule(name: string, module: AnyVirtualTableModule, auxData?: unknown): void {
|
|
298
310
|
this.checkOpen();
|
|
299
311
|
this.schemaManager.registerModule(name, module, auxData);
|
|
300
312
|
}
|
|
@@ -414,7 +426,7 @@ export class Database {
|
|
|
414
426
|
deterministic?: boolean;
|
|
415
427
|
flags?: number;
|
|
416
428
|
},
|
|
417
|
-
func: (...args:
|
|
429
|
+
func: (...args: SqlValue[]) => SqlValue
|
|
418
430
|
): void {
|
|
419
431
|
this.checkOpen();
|
|
420
432
|
|
|
@@ -438,7 +450,7 @@ export class Database {
|
|
|
438
450
|
* Registers a user-defined aggregate function.
|
|
439
451
|
*
|
|
440
452
|
* @param name The name of the SQL function.
|
|
441
|
-
* @param options Configuration: { numArgs: number, flags?: number, initialState?:
|
|
453
|
+
* @param options Configuration: { numArgs: number, flags?: number, initialState?: unknown }.
|
|
442
454
|
* @param stepFunc The function called for each row (accumulator, ...args) => newAccumulator.
|
|
443
455
|
* @param finalFunc The function called at the end (accumulator) => finalResult.
|
|
444
456
|
*/
|
|
@@ -447,10 +459,10 @@ export class Database {
|
|
|
447
459
|
options: {
|
|
448
460
|
numArgs: number;
|
|
449
461
|
flags?: number;
|
|
450
|
-
initialState?:
|
|
462
|
+
initialState?: unknown;
|
|
451
463
|
},
|
|
452
|
-
stepFunc: (acc:
|
|
453
|
-
finalFunc: (acc:
|
|
464
|
+
stepFunc: (acc: unknown, ...args: SqlValue[]) => unknown,
|
|
465
|
+
finalFunc: (acc: unknown) => SqlValue
|
|
454
466
|
): void {
|
|
455
467
|
this.checkOpen();
|
|
456
468
|
|
|
@@ -518,7 +530,7 @@ export class Database {
|
|
|
518
530
|
* @param option The option name
|
|
519
531
|
* @param value The option value
|
|
520
532
|
*/
|
|
521
|
-
setOption(option: string, value:
|
|
533
|
+
setOption(option: string, value: unknown): void {
|
|
522
534
|
this.checkOpen();
|
|
523
535
|
this.options.setOption(option, value);
|
|
524
536
|
}
|
|
@@ -528,11 +540,16 @@ export class Database {
|
|
|
528
540
|
* @param option The option name
|
|
529
541
|
* @returns The option value
|
|
530
542
|
*/
|
|
531
|
-
getOption(option: string):
|
|
543
|
+
getOption(option: string): unknown {
|
|
532
544
|
this.checkOpen();
|
|
533
545
|
return this.options.getOption(option);
|
|
534
546
|
}
|
|
535
547
|
|
|
548
|
+
/** Update optimizer tuning in place */
|
|
549
|
+
private updateOptimizerTuning(tuning: OptimizerTuning): void {
|
|
550
|
+
this.optimizer.updateTuning(tuning);
|
|
551
|
+
}
|
|
552
|
+
|
|
536
553
|
/**
|
|
537
554
|
* Registers a user-defined collation sequence.
|
|
538
555
|
* @param name The name of the collation sequence (case-insensitive).
|
|
@@ -579,6 +596,136 @@ export class Database {
|
|
|
579
596
|
return getCollation(name);
|
|
580
597
|
}
|
|
581
598
|
|
|
599
|
+
/** Serialize a composite primary key tuple for set storage */
|
|
600
|
+
private serializeKeyTuple(values: SqlValue[]): string {
|
|
601
|
+
// JSON serialization is sufficient because SqlValue is JSON-safe in this engine
|
|
602
|
+
return JSON.stringify(values);
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
/** Add a key tuple to the current change log for a base table */
|
|
606
|
+
private addChange(baseTable: string, keyTuple: SqlValue[]): void {
|
|
607
|
+
const target = this.changeLogLayers.length > 0
|
|
608
|
+
? this.changeLogLayers[this.changeLogLayers.length - 1]
|
|
609
|
+
: this.changeLog;
|
|
610
|
+
const key = baseTable.toLowerCase();
|
|
611
|
+
if (!target.has(key)) target.set(key, new Set());
|
|
612
|
+
target.get(key)!.add(this.serializeKeyTuple(keyTuple));
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
public _queueDeferredConstraintRow(baseTable: string, constraintName: string, row: Row, descriptor: RowDescriptor, evaluator: (ctx: RuntimeContext) => OutputValue, connectionId?: string, contextRow?: Row, contextDescriptor?: RowDescriptor): void {
|
|
616
|
+
this.deferredConstraints.enqueue(baseTable, constraintName, row, descriptor, evaluator, connectionId, contextRow, contextDescriptor);
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
|
|
620
|
+
/** @internal Flag to prevent new connections from starting transactions during constraint evaluation */
|
|
621
|
+
private evaluatingDeferredConstraints = false;
|
|
622
|
+
/** @internal Flag indicating we're in a coordinated multi-connection commit */
|
|
623
|
+
private inCoordinatedCommit = false;
|
|
624
|
+
|
|
625
|
+
public async runDeferredRowConstraints(): Promise<void> {
|
|
626
|
+
this.evaluatingDeferredConstraints = true;
|
|
627
|
+
try {
|
|
628
|
+
await this.deferredConstraints.runDeferredRows();
|
|
629
|
+
} finally {
|
|
630
|
+
this.evaluatingDeferredConstraints = false;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
/** @internal Check if we should skip auto-beginning transactions on newly registered connections */
|
|
635
|
+
public _isEvaluatingDeferredConstraints(): boolean {
|
|
636
|
+
return this.evaluatingDeferredConstraints;
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
/** @internal Mark start of coordinated multi-connection commit */
|
|
640
|
+
public _beginCoordinatedCommit(): void {
|
|
641
|
+
this.inCoordinatedCommit = true;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/** @internal Mark end of coordinated multi-connection commit */
|
|
645
|
+
public _endCoordinatedCommit(): void {
|
|
646
|
+
this.inCoordinatedCommit = false;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
/** @internal Check if we're in a coordinated commit (allows sibling layer validation) */
|
|
650
|
+
public _inCoordinatedCommit(): boolean {
|
|
651
|
+
return this.inCoordinatedCommit;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
/** Public API used by DML emitters to record changes */
|
|
655
|
+
public _recordInsert(baseTable: string, newKey: SqlValue[]): void {
|
|
656
|
+
this.addChange(baseTable, newKey);
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
public _recordDelete(baseTable: string, oldKey: SqlValue[]): void {
|
|
660
|
+
this.addChange(baseTable, oldKey);
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
public _recordUpdate(baseTable: string, oldKey: SqlValue[], newKey: SqlValue[]): void {
|
|
664
|
+
this.addChange(baseTable, oldKey);
|
|
665
|
+
// If the PK changed, also record the new key
|
|
666
|
+
if (this.serializeKeyTuple(oldKey) !== this.serializeKeyTuple(newKey)) {
|
|
667
|
+
this.addChange(baseTable, newKey);
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
/** Savepoint change tracking */
|
|
672
|
+
public _beginSavepointLayer(): void {
|
|
673
|
+
this.changeLogLayers.push(new Map());
|
|
674
|
+
this.deferredConstraints.beginLayer();
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
public _rollbackSavepointLayer(): void {
|
|
678
|
+
// Discard the top layer
|
|
679
|
+
this.changeLogLayers.pop();
|
|
680
|
+
this.deferredConstraints.rollbackLayer();
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
public _releaseSavepointLayer(): void {
|
|
684
|
+
// Merge the top layer into previous or main log
|
|
685
|
+
const top = this.changeLogLayers.pop();
|
|
686
|
+
if (!top) return;
|
|
687
|
+
const target = this.changeLogLayers.length > 0 ? this.changeLogLayers[this.changeLogLayers.length - 1] : this.changeLog;
|
|
688
|
+
for (const [table, set] of top) {
|
|
689
|
+
if (!target.has(table)) target.set(table, new Set());
|
|
690
|
+
const tgt = target.get(table)!;
|
|
691
|
+
for (const k of set) tgt.add(k);
|
|
692
|
+
}
|
|
693
|
+
this.deferredConstraints.releaseLayer();
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
private getChangedBaseTables(): Set<string> {
|
|
697
|
+
const result = new Set<string>();
|
|
698
|
+
const collect = (m: Map<string, Set<string>>) => {
|
|
699
|
+
for (const [t, s] of m) { if (s.size > 0) result.add(t); }
|
|
700
|
+
};
|
|
701
|
+
collect(this.changeLog);
|
|
702
|
+
for (const layer of this.changeLogLayers) collect(layer);
|
|
703
|
+
return result;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
public _clearChangeLog(): void {
|
|
707
|
+
this.changeLog.clear();
|
|
708
|
+
this.changeLogLayers = [];
|
|
709
|
+
this.deferredConstraints.clear();
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
/**
|
|
713
|
+
* Marks that an explicit SQL BEGIN has started a transaction.
|
|
714
|
+
* Ensures subsequently registered connections also begin a transaction.
|
|
715
|
+
*/
|
|
716
|
+
public markExplicitTransactionStart(): void {
|
|
717
|
+
this.inTransaction = true;
|
|
718
|
+
this.isAutocommit = false;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
/**
|
|
722
|
+
* Marks that an explicit SQL COMMIT/ROLLBACK has ended the transaction.
|
|
723
|
+
*/
|
|
724
|
+
public markExplicitTransactionEnd(): void {
|
|
725
|
+
this.inTransaction = false;
|
|
726
|
+
this.isAutocommit = true;
|
|
727
|
+
}
|
|
728
|
+
|
|
582
729
|
/**
|
|
583
730
|
* Prepares, binds parameters, executes, and yields result rows for a query.
|
|
584
731
|
* This is a high-level convenience method for iterating over query results.
|
|
@@ -636,9 +783,10 @@ export class Database {
|
|
|
636
783
|
const parser = new Parser();
|
|
637
784
|
try {
|
|
638
785
|
ast = parser.parse(originalSqlString);
|
|
639
|
-
} catch (
|
|
640
|
-
|
|
641
|
-
|
|
786
|
+
} catch (err) {
|
|
787
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
788
|
+
errorLog("Failed to parse SQL for query plan: %O", error);
|
|
789
|
+
throw error;
|
|
642
790
|
}
|
|
643
791
|
} else {
|
|
644
792
|
ast = sqlOrAst;
|
|
@@ -660,7 +808,7 @@ export class Database {
|
|
|
660
808
|
getDebugPlan(sql: string, options?: { verbose?: boolean; expandNodes?: string[]; maxDepth?: number }): string {
|
|
661
809
|
this.checkOpen();
|
|
662
810
|
const plan = this.getPlan(sql);
|
|
663
|
-
|
|
811
|
+
|
|
664
812
|
if (options?.verbose) {
|
|
665
813
|
// Use the original detailed JSON format
|
|
666
814
|
return serializePlanTree(plan);
|
|
@@ -687,14 +835,14 @@ export class Database {
|
|
|
687
835
|
|
|
688
836
|
const stmt = new Statement(this, sql);
|
|
689
837
|
// Set debug options on the statement
|
|
690
|
-
(stmt as
|
|
838
|
+
(stmt as Statement & { _debugOptions?: DebugOptions })._debugOptions = debug;
|
|
691
839
|
|
|
692
840
|
this.statements.add(stmt);
|
|
693
841
|
return stmt;
|
|
694
842
|
}
|
|
695
843
|
|
|
696
844
|
/** @internal */
|
|
697
|
-
_getVtabModule(name: string): { module:
|
|
845
|
+
_getVtabModule(name: string): { module: AnyVirtualTableModule, auxData?: unknown } | undefined {
|
|
698
846
|
// Delegate to SchemaManager
|
|
699
847
|
return this.schemaManager.getModule(name);
|
|
700
848
|
// return this.registeredVTabs.get(name.toLowerCase()); // Old implementation
|
|
@@ -726,7 +874,8 @@ export class Database {
|
|
|
726
874
|
cteNodes: new Map(),
|
|
727
875
|
schemaDependencies: new BuildTimeDependencyTracker(),
|
|
728
876
|
schemaCache: new Map(),
|
|
729
|
-
cteReferenceCache: new Map()
|
|
877
|
+
cteReferenceCache: new Map(),
|
|
878
|
+
outputScopes: new Map()
|
|
730
879
|
};
|
|
731
880
|
|
|
732
881
|
return buildBlock(ctx, statements);
|
|
@@ -741,8 +890,9 @@ export class Database {
|
|
|
741
890
|
debugLog(`Registered connection ${connection.connectionId} for table ${connection.tableName}`);
|
|
742
891
|
|
|
743
892
|
// If we're already in a transaction (implicit or explicit),
|
|
744
|
-
// start a transaction on this new connection
|
|
745
|
-
|
|
893
|
+
// start a transaction on this new connection UNLESS we're evaluating deferred constraints
|
|
894
|
+
// (during which subqueries should read committed state without creating new transaction layers)
|
|
895
|
+
if (this.inTransaction && !this.evaluatingDeferredConstraints) {
|
|
746
896
|
try {
|
|
747
897
|
await connection.begin();
|
|
748
898
|
debugLog(`Started transaction on newly registered connection ${connection.connectionId}`);
|
|
@@ -750,6 +900,8 @@ export class Database {
|
|
|
750
900
|
errorLog(`Error starting transaction on newly registered connection ${connection.connectionId}: %O`, error);
|
|
751
901
|
// Don't throw here - just log the error to avoid breaking connection registration
|
|
752
902
|
}
|
|
903
|
+
} else if (this.evaluatingDeferredConstraints) {
|
|
904
|
+
debugLog(`Skipped transaction begin on connection ${connection.connectionId} (evaluating deferred constraints)`);
|
|
753
905
|
}
|
|
754
906
|
}
|
|
755
907
|
|
|
@@ -786,8 +938,13 @@ export class Database {
|
|
|
786
938
|
* @returns Array of connections for the table
|
|
787
939
|
*/
|
|
788
940
|
getConnectionsForTable(tableName: string): VirtualTableConnection[] {
|
|
941
|
+
const normalized = tableName.toLowerCase();
|
|
942
|
+
const simpleName = normalized.includes('.') ? normalized.substring(normalized.lastIndexOf('.') + 1) : normalized;
|
|
789
943
|
return Array.from(this.activeConnections.values())
|
|
790
|
-
.filter(conn =>
|
|
944
|
+
.filter(conn => {
|
|
945
|
+
const connName = conn.tableName.toLowerCase();
|
|
946
|
+
return connName === normalized || connName === simpleName;
|
|
947
|
+
});
|
|
791
948
|
}
|
|
792
949
|
|
|
793
950
|
/**
|
|
@@ -822,21 +979,6 @@ export class Database {
|
|
|
822
979
|
if (!this.isOpen) throw new MisuseError("Database is closed");
|
|
823
980
|
}
|
|
824
981
|
|
|
825
|
-
/** Helper to execute simple commands (BEGIN, COMMIT, ROLLBACK) internally
|
|
826
|
-
* This method is for commands that don't produce rows and don't need complex parameter handling.
|
|
827
|
-
*/
|
|
828
|
-
private async execSimple(sqlCommand: string): Promise<void> {
|
|
829
|
-
let stmt: Statement | null = null;
|
|
830
|
-
try {
|
|
831
|
-
stmt = this.prepare(sqlCommand);
|
|
832
|
-
await stmt.run();
|
|
833
|
-
} finally {
|
|
834
|
-
if (stmt) {
|
|
835
|
-
await stmt.finalize();
|
|
836
|
-
}
|
|
837
|
-
}
|
|
838
|
-
}
|
|
839
|
-
|
|
840
982
|
/**
|
|
841
983
|
* Begin an implicit transaction and coordinate with virtual table connections
|
|
842
984
|
*/
|
|
@@ -867,26 +1009,346 @@ export class Database {
|
|
|
867
1009
|
private async commitImplicitTransaction(): Promise<void> {
|
|
868
1010
|
debugLog("Database: Committing implicit transaction.");
|
|
869
1011
|
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
1012
|
+
try {
|
|
1013
|
+
const connectionsToCommit = this.getAllConnections();
|
|
1014
|
+
|
|
1015
|
+
// Evaluate global assertions and deferred row constraints BEFORE committing connections. If violated, rollback and abort.
|
|
1016
|
+
await this.runGlobalAssertions();
|
|
1017
|
+
await this.runDeferredRowConstraints();
|
|
1018
|
+
|
|
1019
|
+
// Mark coordinated commit to relax layer validation for sibling layers
|
|
1020
|
+
this._beginCoordinatedCommit();
|
|
873
1021
|
try {
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
1022
|
+
// Commit only the original connections (not any opened during constraint evaluation)
|
|
1023
|
+
// Commit sequentially to avoid race conditions with layer promotion
|
|
1024
|
+
for (const connection of connectionsToCommit) {
|
|
1025
|
+
try {
|
|
1026
|
+
await connection.commit();
|
|
1027
|
+
} catch (error) {
|
|
1028
|
+
errorLog(`Error committing transaction on connection ${connection.connectionId}: %O`, error);
|
|
1029
|
+
throw error;
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
} finally {
|
|
1033
|
+
this._endCoordinatedCommit();
|
|
878
1034
|
}
|
|
879
|
-
})
|
|
1035
|
+
} catch (e) {
|
|
1036
|
+
// On pre-commit assertion failure (or commit error), rollback all connections
|
|
1037
|
+
const conns = this.getAllConnections();
|
|
1038
|
+
await Promise.allSettled(conns.map(c => c.rollback()));
|
|
1039
|
+
throw e;
|
|
1040
|
+
} finally {
|
|
1041
|
+
this.inTransaction = false;
|
|
1042
|
+
this.isAutocommit = true;
|
|
1043
|
+
this.inImplicitTransaction = false;
|
|
1044
|
+
this._clearChangeLog();
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
880
1047
|
|
|
881
|
-
|
|
1048
|
+
public async runGlobalAssertions(): Promise<void> {
|
|
1049
|
+
const assertions = this.schemaManager.getAllAssertions();
|
|
1050
|
+
if (assertions.length === 0) return;
|
|
882
1051
|
|
|
883
|
-
//
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
1052
|
+
// Only evaluate assertions impacted by changed base tables
|
|
1053
|
+
const changedBases = this.getChangedBaseTables();
|
|
1054
|
+
if (changedBases.size === 0) return;
|
|
1055
|
+
|
|
1056
|
+
for (const assertion of assertions) {
|
|
1057
|
+
const planSql = assertion.violationSql;
|
|
1058
|
+
const parser = new Parser();
|
|
1059
|
+
let ast: AST.Statement;
|
|
1060
|
+
try {
|
|
1061
|
+
ast = parser.parse(planSql) as AST.Statement;
|
|
1062
|
+
} catch (err) {
|
|
1063
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
1064
|
+
throw new QuereusError(
|
|
1065
|
+
`Failed to parse deferred assertion '${assertion.name}': ${error.message}`,
|
|
1066
|
+
StatusCode.INTERNAL,
|
|
1067
|
+
error
|
|
1068
|
+
);
|
|
1069
|
+
}
|
|
1070
|
+
const plan = this._buildPlan([ast]) as BlockNode;
|
|
1071
|
+
const analyzed = this.optimizer.optimizeForAnalysis(plan, this) as BlockNode;
|
|
1072
|
+
|
|
1073
|
+
// Collect base tables and relationKeys in this plan
|
|
1074
|
+
const relationKeyToBase = new Map<string, string>();
|
|
1075
|
+
const baseTablesInPlan = new Set<string>();
|
|
1076
|
+
this.collectTables(analyzed, relationKeyToBase, baseTablesInPlan);
|
|
1077
|
+
|
|
1078
|
+
// Determine impact: if assertion has no dependencies, treat as global and always impacted.
|
|
1079
|
+
const hasDeps = baseTablesInPlan.size > 0;
|
|
1080
|
+
let impacted = !hasDeps;
|
|
1081
|
+
if (hasDeps) {
|
|
1082
|
+
for (const b of baseTablesInPlan) { if (changedBases.has(b)) { impacted = true; break; } }
|
|
1083
|
+
}
|
|
1084
|
+
if (!impacted) continue;
|
|
1085
|
+
|
|
1086
|
+
// Classify instances as row/global
|
|
1087
|
+
const classifications: Map<string, 'row' | 'global'> = analyzeRowSpecific(analyzed as unknown as RelationalPlanNode);
|
|
1088
|
+
|
|
1089
|
+
// If any changed base appears as a global instance, run full violation query once
|
|
1090
|
+
let requiresGlobal = false;
|
|
1091
|
+
for (const [relKey, klass] of classifications) {
|
|
1092
|
+
if (klass === 'global') {
|
|
1093
|
+
const base = relationKeyToBase.get(relKey);
|
|
1094
|
+
if (base && changedBases.has(base)) { requiresGlobal = true; break; }
|
|
1095
|
+
}
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
if (requiresGlobal) {
|
|
1099
|
+
await this.executeViolationOnce(assertion.name, assertion.violationSql);
|
|
1100
|
+
continue;
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
// Collect row-specific references that correspond to changed bases
|
|
1104
|
+
const rowSpecificChanged: Array<{ relKey: string; base: string }> = [];
|
|
1105
|
+
for (const [relKey, klass] of classifications) {
|
|
1106
|
+
if (klass !== 'row') continue;
|
|
1107
|
+
const base = relationKeyToBase.get(relKey);
|
|
1108
|
+
if (base && changedBases.has(base)) rowSpecificChanged.push({ relKey, base });
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1111
|
+
if (rowSpecificChanged.length === 0) {
|
|
1112
|
+
// No row-specific changed refs (or no refs at all) → run once globally.
|
|
1113
|
+
await this.executeViolationOnce(assertion.name, assertion.violationSql);
|
|
1114
|
+
continue;
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
// Execute parameterized variants per changed key for each row-specific reference; early-exit on violation
|
|
1118
|
+
for (const { relKey, base } of rowSpecificChanged) {
|
|
1119
|
+
await this.executeViolationPerChangedKeys(assertion.name, assertion.violationSql, analyzed, relKey, base);
|
|
1120
|
+
}
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
private async executeViolationOnce(assertionName: string, sql: string): Promise<void> {
|
|
1125
|
+
const stmt = await this.prepare(sql);
|
|
1126
|
+
try {
|
|
1127
|
+
for await (const _ of stmt.all()) {
|
|
1128
|
+
throw new QuereusError(`Integrity assertion failed: ${assertionName}`, StatusCode.CONSTRAINT);
|
|
1129
|
+
}
|
|
1130
|
+
} finally {
|
|
1131
|
+
await stmt.finalize();
|
|
1132
|
+
}
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
private async executeViolationOnceFromPlan(assertionName: string, plan: BlockNode): Promise<void> {
|
|
1136
|
+
const optimizedPlan = this.optimizer.optimize(plan, this) as BlockNode;
|
|
1137
|
+
const emissionContext = new EmissionContext(this);
|
|
1138
|
+
const rootInstruction = emitPlanNode(optimizedPlan, emissionContext);
|
|
1139
|
+
const scheduler = new Scheduler(rootInstruction);
|
|
1140
|
+
|
|
1141
|
+
const runtimeCtx: RuntimeContext = {
|
|
1142
|
+
db: this,
|
|
1143
|
+
stmt: undefined,
|
|
1144
|
+
params: {},
|
|
1145
|
+
context: new Map(),
|
|
1146
|
+
tableContexts: new Map(),
|
|
1147
|
+
tracer: this.instructionTracer,
|
|
1148
|
+
enableMetrics: this.options.getBooleanOption('runtime_stats'),
|
|
1149
|
+
};
|
|
1150
|
+
|
|
1151
|
+
const result = await scheduler.run(runtimeCtx);
|
|
1152
|
+
if (isAsyncIterable(result)) {
|
|
1153
|
+
for await (const _ of result as AsyncIterable<unknown>) {
|
|
1154
|
+
throw new QuereusError(`CHECK constraint failed: ${assertionName}`, StatusCode.CONSTRAINT);
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
private async executeViolationPerChangedKeysFromPlan(
|
|
1160
|
+
assertionName: string,
|
|
1161
|
+
analyzed: BlockNode,
|
|
1162
|
+
targetRelationKey: string,
|
|
1163
|
+
base: string
|
|
1164
|
+
): Promise<void> {
|
|
1165
|
+
const changedKeyTuples = this.getChangedKeyTuples(base);
|
|
1166
|
+
if (changedKeyTuples.length === 0) return;
|
|
1167
|
+
|
|
1168
|
+
// Find PK indices for the base table
|
|
1169
|
+
const [schemaName, tableName] = base.split('.');
|
|
1170
|
+
const table = this._findTable(tableName, schemaName);
|
|
1171
|
+
if (!table) {
|
|
1172
|
+
throw new QuereusError(`Constraint references unknown table ${base}`, StatusCode.INTERNAL);
|
|
1173
|
+
}
|
|
1174
|
+
const pkIndices = table.primaryKeyDefinition.map(def => def.index);
|
|
1175
|
+
|
|
1176
|
+
// Prepare a rewritten plan with an injected Filter on the target relationKey
|
|
1177
|
+
const rewritten = this.injectPkFilter(analyzed, targetRelationKey, base, pkIndices);
|
|
1178
|
+
const optimizedPlan = this.optimizer.optimize(rewritten, this) as BlockNode;
|
|
887
1179
|
|
|
888
|
-
//
|
|
889
|
-
|
|
1180
|
+
// Emit and execute for each changed PK tuple; stop on first violation row.
|
|
1181
|
+
const emissionContext = new EmissionContext(this);
|
|
1182
|
+
const rootInstruction = emitPlanNode(optimizedPlan, emissionContext);
|
|
1183
|
+
const scheduler = new Scheduler(rootInstruction);
|
|
1184
|
+
|
|
1185
|
+
for (const tuple of changedKeyTuples) {
|
|
1186
|
+
const params: Record<string, SqlValue> = {};
|
|
1187
|
+
for (let i = 0; i < pkIndices.length; i++) {
|
|
1188
|
+
params[`pk${i}`] = tuple[i];
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
const runtimeCtx: RuntimeContext = {
|
|
1192
|
+
db: this,
|
|
1193
|
+
stmt: undefined,
|
|
1194
|
+
params,
|
|
1195
|
+
context: new Map(),
|
|
1196
|
+
tableContexts: new Map(),
|
|
1197
|
+
tracer: this.instructionTracer,
|
|
1198
|
+
enableMetrics: this.options.getBooleanOption('runtime_stats'),
|
|
1199
|
+
};
|
|
1200
|
+
|
|
1201
|
+
// Run and detect first output row (violation)
|
|
1202
|
+
const result = await scheduler.run(runtimeCtx);
|
|
1203
|
+
if (isAsyncIterable(result)) {
|
|
1204
|
+
for await (const _ of result as AsyncIterable<unknown>) {
|
|
1205
|
+
throw new QuereusError(`CHECK constraint failed: ${assertionName}`, StatusCode.CONSTRAINT);
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1210
|
+
|
|
1211
|
+
/** Execute a parameterized variant of the assertion once per changed key for a specific row-specific relationKey. */
|
|
1212
|
+
private async executeViolationPerChangedKeys(
|
|
1213
|
+
assertionName: string,
|
|
1214
|
+
violationSql: string,
|
|
1215
|
+
analyzed: BlockNode,
|
|
1216
|
+
targetRelationKey: string,
|
|
1217
|
+
base: string
|
|
1218
|
+
): Promise<void> {
|
|
1219
|
+
const changedKeyTuples = this.getChangedKeyTuples(base);
|
|
1220
|
+
if (changedKeyTuples.length === 0) return;
|
|
1221
|
+
|
|
1222
|
+
// Find PK indices for the base table
|
|
1223
|
+
const [schemaName, tableName] = base.split('.');
|
|
1224
|
+
const table = this._findTable(tableName, schemaName);
|
|
1225
|
+
if (!table) {
|
|
1226
|
+
throw new QuereusError(`Assertion references unknown table ${base}`, StatusCode.INTERNAL);
|
|
1227
|
+
}
|
|
1228
|
+
const pkIndices = table.primaryKeyDefinition.map(def => def.index);
|
|
1229
|
+
|
|
1230
|
+
// Prepare a rewritten plan with an injected Filter on the target relationKey
|
|
1231
|
+
const rewritten = this.injectPkFilter(analyzed, targetRelationKey, base, pkIndices);
|
|
1232
|
+
const optimizedPlan = this.optimizer.optimize(rewritten, this) as BlockNode;
|
|
1233
|
+
|
|
1234
|
+
// Emit and execute for each changed PK tuple; stop on first violation row.
|
|
1235
|
+
const emissionContext = new EmissionContext(this);
|
|
1236
|
+
const rootInstruction = emitPlanNode(optimizedPlan, emissionContext);
|
|
1237
|
+
const scheduler = new Scheduler(rootInstruction);
|
|
1238
|
+
|
|
1239
|
+
for (const tuple of changedKeyTuples) {
|
|
1240
|
+
const params: Record<string, SqlValue> = {};
|
|
1241
|
+
for (let i = 0; i < pkIndices.length; i++) {
|
|
1242
|
+
params[`pk${i}`] = tuple[i];
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
const runtimeCtx: RuntimeContext = {
|
|
1246
|
+
db: this,
|
|
1247
|
+
stmt: undefined,
|
|
1248
|
+
params,
|
|
1249
|
+
context: new Map(),
|
|
1250
|
+
tableContexts: new Map(),
|
|
1251
|
+
tracer: this.instructionTracer,
|
|
1252
|
+
enableMetrics: this.options.getBooleanOption('runtime_stats'),
|
|
1253
|
+
};
|
|
1254
|
+
|
|
1255
|
+
// Run and detect first output row (violation)
|
|
1256
|
+
const result = await scheduler.run(runtimeCtx);
|
|
1257
|
+
if (isAsyncIterable(result)) {
|
|
1258
|
+
for await (const _ of result as AsyncIterable<unknown>) {
|
|
1259
|
+
throw new QuereusError(`Integrity assertion failed: ${assertionName}`, StatusCode.CONSTRAINT);
|
|
1260
|
+
}
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1264
|
+
|
|
1265
|
+
/** Gather all changed PK tuples for a base table across layers */
|
|
1266
|
+
private getChangedKeyTuples(base: string): SqlValue[][] {
|
|
1267
|
+
const lower = base.toLowerCase();
|
|
1268
|
+
const tuples: SqlValue[][] = [];
|
|
1269
|
+
const collect = (m: Map<string, Set<string>>): void => {
|
|
1270
|
+
const set = m.get(lower);
|
|
1271
|
+
if (!set) return;
|
|
1272
|
+
for (const s of set) tuples.push(JSON.parse(s) as SqlValue[]);
|
|
1273
|
+
};
|
|
1274
|
+
collect(this.changeLog);
|
|
1275
|
+
for (const layer of this.changeLogLayers) collect(layer);
|
|
1276
|
+
return tuples;
|
|
1277
|
+
}
|
|
1278
|
+
|
|
1279
|
+
/** Inject an equality Filter with named parameters :pk0, :pk1, ... at the earliest reference of targetRelationKey. */
|
|
1280
|
+
private injectPkFilter(block: BlockNode, targetRelationKey: string, base: string, pkIndices: number[]): BlockNode {
|
|
1281
|
+
const newStatements = block.getChildren().map(stmt => this.rewriteForPkFilter(stmt, targetRelationKey, base, pkIndices));
|
|
1282
|
+
if (newStatements.every((s, i) => s === block.getChildren()[i])) return block;
|
|
1283
|
+
return this.createBlockWithNewStatements(block, newStatements);
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
private rewriteForPkFilter(node: PlanNode, targetRelationKey: string, base: string, pkIndices: number[]): PlanNode {
|
|
1287
|
+
// If this node is the target TableReference instance, wrap with a Filter
|
|
1288
|
+
const maybe = this.tryWrapTableReference(node, targetRelationKey, base, pkIndices);
|
|
1289
|
+
if (maybe) return maybe;
|
|
1290
|
+
|
|
1291
|
+
const originalChildren = node.getChildren();
|
|
1292
|
+
if (!originalChildren || originalChildren.length === 0) return node;
|
|
1293
|
+
const rewrittenChildren = originalChildren.map(child => this.rewriteForPkFilter(child, targetRelationKey, base, pkIndices));
|
|
1294
|
+
const changed = rewrittenChildren.some((c, i) => c !== originalChildren[i]);
|
|
1295
|
+
return changed ? node.withChildren(rewrittenChildren) : node;
|
|
1296
|
+
}
|
|
1297
|
+
|
|
1298
|
+
private tryWrapTableReference(node: PlanNode, targetRelationKey: string, base: string, pkIndices: number[]): PlanNode | null {
|
|
1299
|
+
if (!(node instanceof TableReferenceNode)) return null;
|
|
1300
|
+
const tableSchema = node.tableSchema;
|
|
1301
|
+
const schemaName = tableSchema.schemaName;
|
|
1302
|
+
const tableName = tableSchema.name;
|
|
1303
|
+
const relName = `${schemaName}.${tableName}`.toLowerCase();
|
|
1304
|
+
const relKey = `${relName}#${node.id ?? 'unknown'}`;
|
|
1305
|
+
if (relKey !== targetRelationKey) return null;
|
|
1306
|
+
|
|
1307
|
+
// Build predicate: AND(col_pk_i = :pk{i}) for all PK columns
|
|
1308
|
+
const relational = node as RelationalPlanNode;
|
|
1309
|
+
const scope = relational.scope;
|
|
1310
|
+
const attributes = relational.getAttributes();
|
|
1311
|
+
|
|
1312
|
+
const makeColumnRef = (colIndex: number): ScalarPlanNode => {
|
|
1313
|
+
const attr = attributes[colIndex];
|
|
1314
|
+
const expr: AST.ColumnExpr = { type: 'column', name: attr.name, table: tableName, schema: schemaName };
|
|
1315
|
+
return new ColumnReferenceNode(scope, expr, attr.type, attr.id, colIndex);
|
|
1316
|
+
};
|
|
1317
|
+
|
|
1318
|
+
const makeParamRef = (i: number, type: ScalarType): ScalarPlanNode => {
|
|
1319
|
+
const pexpr: AST.ParameterExpr = { type: 'parameter', name: `pk${i}` };
|
|
1320
|
+
return new ParameterReferenceNode(scope, pexpr, `pk${i}`, type);
|
|
1321
|
+
};
|
|
1322
|
+
|
|
1323
|
+
let predicate: ScalarPlanNode | null = null;
|
|
1324
|
+
for (let i = 0; i < pkIndices.length; i++) {
|
|
1325
|
+
const colIdx = pkIndices[i];
|
|
1326
|
+
const left = makeColumnRef(colIdx);
|
|
1327
|
+
const right = makeParamRef(i, attributes[colIdx].type);
|
|
1328
|
+
const bexpr: AST.BinaryExpr = { type: 'binary', operator: '=', left: left.expression, right: right.expression };
|
|
1329
|
+
const eqNode = new BinaryOpNode(scope, bexpr, left, right);
|
|
1330
|
+
predicate = predicate
|
|
1331
|
+
? new BinaryOpNode(scope, { type: 'binary', operator: 'AND', left: predicate.expression, right: eqNode.expression }, predicate, eqNode)
|
|
1332
|
+
: eqNode;
|
|
1333
|
+
}
|
|
1334
|
+
|
|
1335
|
+
if (!predicate) return null;
|
|
1336
|
+
|
|
1337
|
+
// Wrap the table reference with a FilterNode
|
|
1338
|
+
return new FilterNode(scope, relational, predicate);
|
|
1339
|
+
}
|
|
1340
|
+
|
|
1341
|
+
private collectTables(node: PlanNode, relToBase: Map<string, string>, bases: Set<string>): void {
|
|
1342
|
+
for (const child of node.getChildren()) {
|
|
1343
|
+
this.collectTables(child, relToBase, bases);
|
|
1344
|
+
}
|
|
1345
|
+
if (node instanceof TableReferenceNode) {
|
|
1346
|
+
const schema = node.tableSchema;
|
|
1347
|
+
const baseName = `${schema.schemaName}.${schema.name}`.toLowerCase();
|
|
1348
|
+
bases.add(baseName);
|
|
1349
|
+
const relKey = `${baseName}#${node.id ?? 'unknown'}`;
|
|
1350
|
+
relToBase.set(relKey, baseName);
|
|
1351
|
+
}
|
|
890
1352
|
}
|
|
891
1353
|
|
|
892
1354
|
/**
|
|
@@ -902,7 +1364,7 @@ export class Database {
|
|
|
902
1364
|
await connection.rollback();
|
|
903
1365
|
} catch (error) {
|
|
904
1366
|
errorLog(`Error rolling back transaction on connection ${connection.connectionId}: %O`, error);
|
|
905
|
-
//
|
|
1367
|
+
// Continue attempting rollback for other connections.
|
|
906
1368
|
}
|
|
907
1369
|
});
|
|
908
1370
|
|
|
@@ -913,5 +1375,9 @@ export class Database {
|
|
|
913
1375
|
this.isAutocommit = true;
|
|
914
1376
|
this.inImplicitTransaction = false;
|
|
915
1377
|
}
|
|
1378
|
+
|
|
1379
|
+
private createBlockWithNewStatements(block: BlockNode, statements: PlanNode[]): BlockNode {
|
|
1380
|
+
return new BlockNode(block.scope, statements, block.parameters);
|
|
1381
|
+
}
|
|
916
1382
|
}
|
|
917
1383
|
|