@quereus/quereus 0.2.1 → 0.4.5
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 +1 -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 +2 -2
- 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 +83 -4
- 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 +1 -1
- 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 +37 -5
- 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 +67 -10
- 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 +38 -6
- 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 +10 -2
- 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 +1 -1
- 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 +110 -23
- 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 +28 -3
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +17 -2
- 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 -2
- package/dist/src/util/plugin-loader.d.ts.map +1 -1
- package/dist/src/util/plugin-loader.js +180 -2
- 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 +17 -4
- package/dist/src/vtab/table.d.ts.map +1 -1
- package/dist/src/vtab/table.js.map +1 -1
- package/package.json +4 -2
- package/src/common/errors.ts +1 -1
- package/src/common/json-types.ts +16 -0
- package/src/common/types.ts +2 -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 +2 -2
- package/src/parser/ast.ts +582 -481
- 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 +14 -5
- 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 +1 -1
- 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 +148 -26
- 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 +232 -7
- 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
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optimization pass framework for multi-pass query optimization
|
|
3
|
+
*
|
|
4
|
+
* This framework enables rules to run in separate tree traversals,
|
|
5
|
+
* allowing for proper sequencing of transformations that require
|
|
6
|
+
* different traversal orders or multiple passes over the tree.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { PlanNode } from '../nodes/plan-node.js';
|
|
10
|
+
import type { OptContext } from './context.js';
|
|
11
|
+
import type { RuleHandle } from './registry.js';
|
|
12
|
+
import { createLogger } from '../../common/logger.js';
|
|
13
|
+
import { performConstantFolding } from '../analysis/const-pass.js';
|
|
14
|
+
import { createRuntimeExpressionEvaluator } from '../analysis/const-evaluator.js';
|
|
15
|
+
|
|
16
|
+
const log = createLogger('optimizer:framework:pass');
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Traversal order for optimization passes
|
|
20
|
+
*/
|
|
21
|
+
export enum TraversalOrder {
|
|
22
|
+
/** Process children before parents */
|
|
23
|
+
BottomUp = 'bottom-up',
|
|
24
|
+
/** Process parents before children */
|
|
25
|
+
TopDown = 'top-down',
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Definition of an optimization pass
|
|
30
|
+
*/
|
|
31
|
+
export interface OptimizationPass {
|
|
32
|
+
/** Unique identifier for this pass */
|
|
33
|
+
id: string;
|
|
34
|
+
|
|
35
|
+
/** Human-readable name for logging */
|
|
36
|
+
name: string;
|
|
37
|
+
|
|
38
|
+
/** Description of what this pass does */
|
|
39
|
+
description: string;
|
|
40
|
+
|
|
41
|
+
/** Traversal order for this pass */
|
|
42
|
+
traversalOrder: TraversalOrder;
|
|
43
|
+
|
|
44
|
+
/** Rules that belong to this pass (will be populated by registration) */
|
|
45
|
+
rules: RuleHandle[];
|
|
46
|
+
|
|
47
|
+
/** Optional custom execution logic (default uses standard rule application) */
|
|
48
|
+
execute?: (plan: PlanNode, context: OptContext) => PlanNode;
|
|
49
|
+
|
|
50
|
+
/** Whether this pass is enabled (default: true) */
|
|
51
|
+
enabled?: boolean;
|
|
52
|
+
|
|
53
|
+
/** Order in which passes execute (lower numbers first) */
|
|
54
|
+
order: number;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Standard optimization passes
|
|
59
|
+
*/
|
|
60
|
+
export enum PassId {
|
|
61
|
+
/** Pre-optimization constant folding */
|
|
62
|
+
ConstantFolding = 'constant-folding',
|
|
63
|
+
|
|
64
|
+
/** Structural transformations (pushdown, pullup, boundary sliding) */
|
|
65
|
+
Structural = 'structural',
|
|
66
|
+
|
|
67
|
+
/** Physical operator selection and implementation */
|
|
68
|
+
Physical = 'physical',
|
|
69
|
+
|
|
70
|
+
/** Post-optimization cleanup and caching */
|
|
71
|
+
PostOptimization = 'post-opt',
|
|
72
|
+
|
|
73
|
+
/** Final validation */
|
|
74
|
+
Validation = 'validation',
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Create a standard optimization pass
|
|
79
|
+
*/
|
|
80
|
+
export function createPass(
|
|
81
|
+
id: string,
|
|
82
|
+
name: string,
|
|
83
|
+
description: string,
|
|
84
|
+
order: number,
|
|
85
|
+
traversalOrder: TraversalOrder = TraversalOrder.BottomUp
|
|
86
|
+
): OptimizationPass {
|
|
87
|
+
return {
|
|
88
|
+
id,
|
|
89
|
+
name,
|
|
90
|
+
description,
|
|
91
|
+
traversalOrder,
|
|
92
|
+
rules: [],
|
|
93
|
+
enabled: true,
|
|
94
|
+
order
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Create constant folding pass with custom execution
|
|
100
|
+
*/
|
|
101
|
+
function createConstantFoldingPass(): OptimizationPass {
|
|
102
|
+
return {
|
|
103
|
+
id: PassId.ConstantFolding,
|
|
104
|
+
name: 'Constant Folding',
|
|
105
|
+
description: 'Pre-evaluate constant expressions and fold them into the plan',
|
|
106
|
+
traversalOrder: TraversalOrder.BottomUp,
|
|
107
|
+
rules: [],
|
|
108
|
+
enabled: true,
|
|
109
|
+
order: 0,
|
|
110
|
+
execute: (plan: PlanNode, context: OptContext) => {
|
|
111
|
+
// Custom execution for constant folding
|
|
112
|
+
const evaluator = createRuntimeExpressionEvaluator(context.db);
|
|
113
|
+
const result = performConstantFolding(plan, evaluator);
|
|
114
|
+
log('Constant folding completed');
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Standard pass definitions
|
|
122
|
+
*/
|
|
123
|
+
export const STANDARD_PASSES: OptimizationPass[] = [
|
|
124
|
+
createConstantFoldingPass(),
|
|
125
|
+
|
|
126
|
+
createPass(
|
|
127
|
+
PassId.Structural,
|
|
128
|
+
'Structural Transformations',
|
|
129
|
+
'Restructure the plan tree for optimal execution boundaries',
|
|
130
|
+
10,
|
|
131
|
+
TraversalOrder.TopDown
|
|
132
|
+
),
|
|
133
|
+
|
|
134
|
+
createPass(
|
|
135
|
+
PassId.Physical,
|
|
136
|
+
'Physical Selection',
|
|
137
|
+
'Convert logical operators to physical implementations',
|
|
138
|
+
20,
|
|
139
|
+
TraversalOrder.BottomUp
|
|
140
|
+
),
|
|
141
|
+
|
|
142
|
+
createPass(
|
|
143
|
+
PassId.PostOptimization,
|
|
144
|
+
'Post-Optimization',
|
|
145
|
+
'Final cleanup, materialization decisions, and caching',
|
|
146
|
+
30,
|
|
147
|
+
TraversalOrder.BottomUp
|
|
148
|
+
),
|
|
149
|
+
|
|
150
|
+
createPass(
|
|
151
|
+
PassId.Validation,
|
|
152
|
+
'Validation',
|
|
153
|
+
'Validate the correctness of the optimized plan',
|
|
154
|
+
40,
|
|
155
|
+
TraversalOrder.BottomUp
|
|
156
|
+
),
|
|
157
|
+
];
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Pass manager for coordinating multi-pass optimization
|
|
161
|
+
*/
|
|
162
|
+
export class PassManager {
|
|
163
|
+
private passes: Map<string, OptimizationPass> = new Map();
|
|
164
|
+
private sortedPasses: OptimizationPass[] = [];
|
|
165
|
+
|
|
166
|
+
constructor() {
|
|
167
|
+
// Register standard passes
|
|
168
|
+
for (const pass of STANDARD_PASSES) {
|
|
169
|
+
this.registerPass(pass);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Register an optimization pass
|
|
175
|
+
*/
|
|
176
|
+
registerPass(pass: OptimizationPass): void {
|
|
177
|
+
if (this.passes.has(pass.id)) {
|
|
178
|
+
log('Warning: Overwriting existing pass %s', pass.id);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
this.passes.set(pass.id, pass);
|
|
182
|
+
this.updateSortedPasses();
|
|
183
|
+
|
|
184
|
+
log('Registered pass %s (order: %d, traversal: %s)',
|
|
185
|
+
pass.id, pass.order, pass.traversalOrder);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Get a pass by ID
|
|
190
|
+
*/
|
|
191
|
+
getPass(id: string): OptimizationPass | undefined {
|
|
192
|
+
return this.passes.get(id);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Add a rule to a specific pass
|
|
197
|
+
*/
|
|
198
|
+
addRuleToPass(passId: string, rule: RuleHandle): void {
|
|
199
|
+
const pass = this.passes.get(passId);
|
|
200
|
+
if (!pass) {
|
|
201
|
+
throw new Error(`Unknown pass: ${passId}`);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Avoid duplicate registrations by rule ID within a pass
|
|
205
|
+
if (pass.rules.some(r => r.id === rule.id)) {
|
|
206
|
+
log('Skipping duplicate rule %s for pass %s', rule.id, passId);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
pass.rules.push(rule);
|
|
211
|
+
log('Added rule %s to pass %s', rule.id, passId);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Get all passes in execution order
|
|
216
|
+
*/
|
|
217
|
+
getPasses(): readonly OptimizationPass[] {
|
|
218
|
+
return this.sortedPasses;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Update sorted pass list after changes
|
|
223
|
+
*/
|
|
224
|
+
private updateSortedPasses(): void {
|
|
225
|
+
this.sortedPasses = Array.from(this.passes.values())
|
|
226
|
+
.filter(pass => pass.enabled !== false)
|
|
227
|
+
.sort((a, b) => a.order - b.order);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Execute all passes on a plan
|
|
232
|
+
*/
|
|
233
|
+
execute(plan: PlanNode, context: OptContext): PlanNode {
|
|
234
|
+
return this.executeUpTo(plan, context);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Execute passes up to and including the specified pass id
|
|
239
|
+
*/
|
|
240
|
+
executeUpTo(plan: PlanNode, context: OptContext, upToPassId?: string): PlanNode {
|
|
241
|
+
let currentPlan = plan;
|
|
242
|
+
for (const pass of this.sortedPasses) {
|
|
243
|
+
log('Starting pass: %s', pass.name);
|
|
244
|
+
|
|
245
|
+
if (pass.execute) {
|
|
246
|
+
// Custom execution logic
|
|
247
|
+
currentPlan = pass.execute(currentPlan, context);
|
|
248
|
+
} else {
|
|
249
|
+
// Standard rule-based execution
|
|
250
|
+
currentPlan = this.executeStandardPass(currentPlan, context, pass);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
log('Completed pass: %s', pass.name);
|
|
254
|
+
if (upToPassId && pass.id === upToPassId) break;
|
|
255
|
+
}
|
|
256
|
+
return currentPlan;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Execute a standard rule-based pass
|
|
261
|
+
*/
|
|
262
|
+
private executeStandardPass(
|
|
263
|
+
plan: PlanNode,
|
|
264
|
+
context: OptContext,
|
|
265
|
+
pass: OptimizationPass
|
|
266
|
+
): PlanNode {
|
|
267
|
+
// This will be implemented to traverse the tree in the specified order
|
|
268
|
+
// and apply the pass's rules at each node
|
|
269
|
+
|
|
270
|
+
if (pass.traversalOrder === TraversalOrder.TopDown) {
|
|
271
|
+
return this.traverseTopDown(plan, context, pass);
|
|
272
|
+
} else {
|
|
273
|
+
return this.traverseBottomUp(plan, context, pass);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Top-down traversal with rule application
|
|
279
|
+
*/
|
|
280
|
+
private traverseTopDown(
|
|
281
|
+
node: PlanNode,
|
|
282
|
+
context: OptContext,
|
|
283
|
+
pass: OptimizationPass
|
|
284
|
+
): PlanNode {
|
|
285
|
+
// Apply rules to this node first
|
|
286
|
+
let currentNode = this.applyPassRules(node, context, pass);
|
|
287
|
+
|
|
288
|
+
// Then traverse children
|
|
289
|
+
const children = currentNode.getChildren();
|
|
290
|
+
if (children.length > 0) {
|
|
291
|
+
const newChildren = children.map(child =>
|
|
292
|
+
this.traverseTopDown(child, context, pass)
|
|
293
|
+
);
|
|
294
|
+
|
|
295
|
+
// Only create new node if children changed
|
|
296
|
+
const childrenChanged = children.some((child, i) => child !== newChildren[i]);
|
|
297
|
+
if (childrenChanged) {
|
|
298
|
+
currentNode = currentNode.withChildren(newChildren);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
return currentNode;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Bottom-up traversal with rule application
|
|
307
|
+
*/
|
|
308
|
+
private traverseBottomUp(
|
|
309
|
+
node: PlanNode,
|
|
310
|
+
context: OptContext,
|
|
311
|
+
pass: OptimizationPass
|
|
312
|
+
): PlanNode {
|
|
313
|
+
// Traverse children first
|
|
314
|
+
const children = node.getChildren();
|
|
315
|
+
let currentNode = node;
|
|
316
|
+
|
|
317
|
+
if (children.length > 0) {
|
|
318
|
+
const newChildren = children.map(child =>
|
|
319
|
+
this.traverseBottomUp(child, context, pass)
|
|
320
|
+
);
|
|
321
|
+
|
|
322
|
+
// Only create new node if children changed
|
|
323
|
+
const childrenChanged = children.some((child, i) => child !== newChildren[i]);
|
|
324
|
+
if (childrenChanged) {
|
|
325
|
+
currentNode = currentNode.withChildren(newChildren);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Then apply rules to this node
|
|
330
|
+
return this.applyPassRules(currentNode, context, pass);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Apply all rules in a pass to a node
|
|
335
|
+
*/
|
|
336
|
+
private applyPassRules(
|
|
337
|
+
node: PlanNode,
|
|
338
|
+
context: OptContext,
|
|
339
|
+
pass: OptimizationPass
|
|
340
|
+
): PlanNode {
|
|
341
|
+
let currentNode = node;
|
|
342
|
+
// Apply rules against the current node type only
|
|
343
|
+
for (const rule of pass.rules) {
|
|
344
|
+
if (rule.nodeType !== currentNode.nodeType) continue;
|
|
345
|
+
const result = rule.fn(currentNode, context);
|
|
346
|
+
if (result && result !== currentNode) {
|
|
347
|
+
log('Rule %s transformed node in pass %s', rule.id, pass.id);
|
|
348
|
+
currentNode = result;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
return currentNode;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { PlanNodeType } from './plan-node-type.js';
|
|
2
|
-
import { PlanNode, type RelationalPlanNode, type ScalarPlanNode, type UnaryRelationalNode, type Attribute, isRelationalNode } from './plan-node.js';
|
|
2
|
+
import { PlanNode, type RelationalPlanNode, type ScalarPlanNode, type UnaryRelationalNode, type Attribute, isRelationalNode, type PhysicalProperties } from './plan-node.js';
|
|
3
|
+
import { ColumnReferenceNode } from './reference.js';
|
|
3
4
|
import type { RelationType } from '../../common/datatype.js';
|
|
4
5
|
import type { Scope } from '../scopes/scope.js';
|
|
5
6
|
import { Cached } from '../../util/cached.js';
|
|
6
7
|
import { formatExpressionList } from '../../util/plan-formatter.js';
|
|
7
8
|
import { StatusCode } from '../../common/types.js';
|
|
8
9
|
import { quereusError } from '../../common/errors.js';
|
|
10
|
+
import type { AggregationCapable } from '../framework/characteristics.js';
|
|
9
11
|
|
|
10
12
|
export interface AggregateExpression {
|
|
11
13
|
expression: ScalarPlanNode;
|
|
@@ -13,11 +15,10 @@ export interface AggregateExpression {
|
|
|
13
15
|
}
|
|
14
16
|
|
|
15
17
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* optionally grouping by specified expressions.
|
|
18
|
+
* Logical node representing an aggregate operation.
|
|
19
|
+
* Requires transformation to StreamAggregateNode or HashAggregateNode by optimizer.
|
|
19
20
|
*/
|
|
20
|
-
export class AggregateNode extends PlanNode implements UnaryRelationalNode {
|
|
21
|
+
export class AggregateNode extends PlanNode implements UnaryRelationalNode, AggregationCapable {
|
|
21
22
|
override readonly nodeType = PlanNodeType.Aggregate;
|
|
22
23
|
|
|
23
24
|
private outputTypeCache: Cached<RelationType>;
|
|
@@ -41,7 +42,7 @@ export class AggregateNode extends PlanNode implements UnaryRelationalNode {
|
|
|
41
42
|
private getGroupByColumnName(expr: ScalarPlanNode, index: number): string {
|
|
42
43
|
// If it's a column reference, use the column name
|
|
43
44
|
if (expr.nodeType === PlanNodeType.ColumnReference) {
|
|
44
|
-
const colRef = expr as
|
|
45
|
+
const colRef = expr as ColumnReferenceNode;
|
|
45
46
|
return colRef.expression.name;
|
|
46
47
|
}
|
|
47
48
|
// Otherwise, use a generic name
|
|
@@ -118,7 +119,7 @@ export class AggregateNode extends PlanNode implements UnaryRelationalNode {
|
|
|
118
119
|
return this.outputTypeCache.value;
|
|
119
120
|
}
|
|
120
121
|
|
|
121
|
-
getAttributes(): Attribute[] {
|
|
122
|
+
getAttributes(): readonly Attribute[] {
|
|
122
123
|
return this.attributesCache.value;
|
|
123
124
|
}
|
|
124
125
|
|
|
@@ -186,6 +187,19 @@ export class AggregateNode extends PlanNode implements UnaryRelationalNode {
|
|
|
186
187
|
}
|
|
187
188
|
}
|
|
188
189
|
|
|
190
|
+
computePhysical(childrenPhysical: PhysicalProperties[]): Partial<PhysicalProperties> {
|
|
191
|
+
const sourcePhysical = childrenPhysical[0];
|
|
192
|
+
const groupCount = this.groupBy.length;
|
|
193
|
+
// If there is a GROUP BY, the group-by columns form a unique key on the output
|
|
194
|
+
// Output attribute indices for group-by are 0..groupCount-1 per buildAttributes
|
|
195
|
+
const uniqueKeys = groupCount > 0 ? [Array.from({ length: groupCount }, (_, i) => i)] : [[]];
|
|
196
|
+
return {
|
|
197
|
+
uniqueKeys,
|
|
198
|
+
estimatedRows: this.estimatedRows,
|
|
199
|
+
ordering: sourcePhysical?.ordering,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
|
|
189
203
|
override toString(): string {
|
|
190
204
|
const parts: string[] = [];
|
|
191
205
|
|
|
@@ -217,6 +231,37 @@ export class AggregateNode extends PlanNode implements UnaryRelationalNode {
|
|
|
217
231
|
}));
|
|
218
232
|
}
|
|
219
233
|
|
|
234
|
+
// Expose logical unique keys: group-by columns (0..groupCount-1) or [[]] for global aggregate
|
|
235
|
+
const groupCount = this.groupBy.length;
|
|
236
|
+
(props as any).uniqueKeys = groupCount > 0 ? [Array.from({ length: groupCount }, (_, i) => i)] : [[]];
|
|
220
237
|
return props;
|
|
221
238
|
}
|
|
239
|
+
|
|
240
|
+
// AggregationCapable interface implementation
|
|
241
|
+
getGroupingKeys(): readonly ScalarPlanNode[] {
|
|
242
|
+
return this.groupBy;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
getAggregateExpressions(): readonly { expr: ScalarPlanNode; alias: string; attributeId: number }[] {
|
|
246
|
+
const attributes = this.getAttributes();
|
|
247
|
+
const groupByCount = this.groupBy.length;
|
|
248
|
+
|
|
249
|
+
return this.aggregates.map((agg, index) => ({
|
|
250
|
+
expr: agg.expression,
|
|
251
|
+
alias: agg.alias,
|
|
252
|
+
attributeId: attributes[groupByCount + index].id
|
|
253
|
+
}));
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
requiresOrdering(): boolean {
|
|
257
|
+
return this.groupBy.length > 0; // Only requires ordering if we have GROUP BY
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
canStreamAggregate(): boolean {
|
|
261
|
+
return true; // AggregateNode can always be converted to streaming
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
getSource(): RelationalPlanNode {
|
|
265
|
+
return this.source;
|
|
266
|
+
}
|
|
222
267
|
}
|
|
@@ -4,6 +4,7 @@ import type { RelationType } from '../../common/datatype.js';
|
|
|
4
4
|
import type { Scope } from '../scopes/scope.js';
|
|
5
5
|
import { StatusCode } from '../../common/types.js';
|
|
6
6
|
import { quereusError } from '../../common/errors.js';
|
|
7
|
+
import type { CacheCapable } from '../framework/characteristics.js';
|
|
7
8
|
|
|
8
9
|
export type CacheStrategy = 'memory' | 'spill'; // Future: spill-to-disk
|
|
9
10
|
|
|
@@ -14,7 +15,7 @@ export type CacheStrategy = 'memory' | 'spill'; // Future: spill-to-disk
|
|
|
14
15
|
* subsequent iterations from the cached result. It implements
|
|
15
16
|
* smart threshold-based policies to avoid excessive memory usage.
|
|
16
17
|
*/
|
|
17
|
-
export class CacheNode extends PlanNode implements UnaryRelationalNode {
|
|
18
|
+
export class CacheNode extends PlanNode implements UnaryRelationalNode, CacheCapable {
|
|
18
19
|
readonly nodeType = PlanNodeType.Cache;
|
|
19
20
|
|
|
20
21
|
constructor(
|
|
@@ -28,7 +29,7 @@ export class CacheNode extends PlanNode implements UnaryRelationalNode {
|
|
|
28
29
|
}
|
|
29
30
|
|
|
30
31
|
// Cache preserves source attributes exactly
|
|
31
|
-
getAttributes(): Attribute[] {
|
|
32
|
+
getAttributes(): readonly Attribute[] {
|
|
32
33
|
return this.source.getAttributes();
|
|
33
34
|
}
|
|
34
35
|
|
|
@@ -80,6 +81,14 @@ export class CacheNode extends PlanNode implements UnaryRelationalNode {
|
|
|
80
81
|
return this.source.estimatedRows;
|
|
81
82
|
}
|
|
82
83
|
|
|
84
|
+
getCacheStrategy(): string {
|
|
85
|
+
return this.strategy;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
isCached(): boolean {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
|
|
83
92
|
override toString(): string {
|
|
84
93
|
return `CACHE (${this.strategy}, threshold=${this.threshold})`;
|
|
85
94
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Scope } from '../scopes/scope.js';
|
|
2
|
-
import { PlanNode, type RelationalPlanNode, type Attribute, type RowDescriptor, type ScalarPlanNode, isRelationalNode } from './plan-node.js';
|
|
2
|
+
import { PlanNode, type RelationalPlanNode, type Attribute, type RowDescriptor, type ScalarPlanNode, isRelationalNode, isScalarNode } from './plan-node.js';
|
|
3
3
|
import { PlanNodeType } from './plan-node-type.js';
|
|
4
4
|
import type { TableReferenceNode } from './reference.js';
|
|
5
5
|
import type { RelationType } from '../../common/datatype.js';
|
|
@@ -9,6 +9,9 @@ import type { RowConstraintSchema } from '../../schema/table.js';
|
|
|
9
9
|
export interface ConstraintCheck {
|
|
10
10
|
constraint: RowConstraintSchema; // The constraint metadata
|
|
11
11
|
expression: ScalarPlanNode; // Pre-built expression node
|
|
12
|
+
deferrable?: boolean;
|
|
13
|
+
initiallyDeferred?: boolean;
|
|
14
|
+
containsSubquery: boolean; // Cached result of subquery detection
|
|
12
15
|
}
|
|
13
16
|
|
|
14
17
|
/**
|
|
@@ -26,7 +29,10 @@ export class ConstraintCheckNode extends PlanNode implements RelationalPlanNode
|
|
|
26
29
|
public readonly oldRowDescriptor: RowDescriptor | undefined,
|
|
27
30
|
public readonly newRowDescriptor: RowDescriptor | undefined,
|
|
28
31
|
public readonly flatRowDescriptor: RowDescriptor,
|
|
29
|
-
public readonly constraintChecks: ConstraintCheck[]
|
|
32
|
+
public readonly constraintChecks: ConstraintCheck[],
|
|
33
|
+
public readonly mutationContextValues?: Map<string, ScalarPlanNode>, // Mutation context value expressions
|
|
34
|
+
public readonly contextAttributes?: Attribute[], // Mutation context attributes
|
|
35
|
+
public readonly contextDescriptor?: RowDescriptor, // Mutation context row descriptor
|
|
30
36
|
) {
|
|
31
37
|
super(scope);
|
|
32
38
|
}
|
|
@@ -35,7 +41,7 @@ export class ConstraintCheckNode extends PlanNode implements RelationalPlanNode
|
|
|
35
41
|
return this.source.getType();
|
|
36
42
|
}
|
|
37
43
|
|
|
38
|
-
getAttributes(): Attribute[] {
|
|
44
|
+
getAttributes(): readonly Attribute[] {
|
|
39
45
|
// ConstraintCheck passes through the same attributes as its source
|
|
40
46
|
return this.source.getAttributes();
|
|
41
47
|
}
|
|
@@ -69,7 +75,7 @@ export class ConstraintCheckNode extends PlanNode implements RelationalPlanNode
|
|
|
69
75
|
// Type check constraint expressions
|
|
70
76
|
for (let i = 0; i < newConstraintExprs.length; i++) {
|
|
71
77
|
const expr = newConstraintExprs[i];
|
|
72
|
-
if (!(
|
|
78
|
+
if (!isScalarNode(expr)) {
|
|
73
79
|
throw new Error(`ConstraintCheckNode: constraint child ${i + 1} must be a ScalarPlanNode`);
|
|
74
80
|
}
|
|
75
81
|
}
|
|
@@ -95,7 +101,10 @@ export class ConstraintCheckNode extends PlanNode implements RelationalPlanNode
|
|
|
95
101
|
this.oldRowDescriptor,
|
|
96
102
|
this.newRowDescriptor,
|
|
97
103
|
this.flatRowDescriptor,
|
|
98
|
-
newConstraintChecks
|
|
104
|
+
newConstraintChecks,
|
|
105
|
+
this.mutationContextValues,
|
|
106
|
+
this.contextAttributes,
|
|
107
|
+
this.contextDescriptor
|
|
99
108
|
);
|
|
100
109
|
}
|
|
101
110
|
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Scope } from '../scopes/scope.js';
|
|
2
|
+
import { PlanNode, type VoidNode, type PhysicalProperties } from './plan-node.js';
|
|
3
|
+
import { PlanNodeType } from './plan-node-type.js';
|
|
4
|
+
import type { VoidType } from '../../common/datatype.js';
|
|
5
|
+
import type * as AST from '../../parser/ast.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Represents creating a global integrity assertion.
|
|
9
|
+
* This is a DDL operation that adds an assertion to the schema.
|
|
10
|
+
*/
|
|
11
|
+
export class CreateAssertionNode extends PlanNode implements VoidNode {
|
|
12
|
+
override readonly nodeType = PlanNodeType.CreateAssertion;
|
|
13
|
+
|
|
14
|
+
constructor(
|
|
15
|
+
scope: Scope,
|
|
16
|
+
public readonly name: string,
|
|
17
|
+
public readonly checkExpression: AST.Expression,
|
|
18
|
+
) {
|
|
19
|
+
super(scope);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
getType(): VoidType {
|
|
23
|
+
return { typeClass: 'void' };
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
getChildren(): readonly PlanNode[] {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
withChildren(newChildren: readonly PlanNode[]): PlanNode {
|
|
31
|
+
if (newChildren.length !== 0) {
|
|
32
|
+
throw new Error(`CreateAssertionNode expects 0 children, got ${newChildren.length}`);
|
|
33
|
+
}
|
|
34
|
+
return this; // No children, so no change
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
override toString(): string {
|
|
38
|
+
return `CREATE ASSERTION ${this.name}`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
override getLogicalAttributes(): Record<string, unknown> {
|
|
42
|
+
return {
|
|
43
|
+
name: this.name,
|
|
44
|
+
checkExpression: this.checkExpression.toString?.() || 'complex expression',
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
override computePhysical(_children: readonly PhysicalProperties[]): Partial<PhysicalProperties> {
|
|
49
|
+
return { readonly: false };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -2,7 +2,7 @@ import type * as AST from '../../parser/ast.js';
|
|
|
2
2
|
import type { Scope } from '../scopes/scope.js';
|
|
3
3
|
import { PhysicalProperties, VoidNode } from './plan-node.js';
|
|
4
4
|
import { PlanNodeType } from './plan-node-type.js';
|
|
5
|
-
import { expressionToString } from '../../util/ast-stringify.js';
|
|
5
|
+
import { astToString, expressionToString } from '../../util/ast-stringify.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Represents a CREATE INDEX statement in the logical query plan.
|
|
@@ -31,7 +31,7 @@ export class CreateIndexNode extends VoidNode {
|
|
|
31
31
|
ifNotExists: this.statementAst.ifNotExists,
|
|
32
32
|
columns: this.statementAst.columns.map(col => col.name || expressionToString(col.expr!)),
|
|
33
33
|
hasWhereClause: !!this.statementAst.where,
|
|
34
|
-
statement:
|
|
34
|
+
statement: astToString(this.statementAst)
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
37
|
|
|
@@ -2,7 +2,7 @@ import type * as AST from '../../parser/ast.js';
|
|
|
2
2
|
import type { Scope } from '../scopes/scope.js';
|
|
3
3
|
import { PhysicalProperties, VoidNode } from './plan-node.js';
|
|
4
4
|
import { PlanNodeType } from './plan-node-type.js';
|
|
5
|
-
import {
|
|
5
|
+
import { astToString } from '../../util/ast-stringify.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Represents a CREATE TABLE statement in the logical query plan.
|
|
@@ -25,7 +25,7 @@ export class CreateTableNode extends VoidNode {
|
|
|
25
25
|
return {
|
|
26
26
|
table: this.statementAst.table.name,
|
|
27
27
|
schema: this.statementAst.table.schema,
|
|
28
|
-
statement:
|
|
28
|
+
statement: astToString(this.statementAst)
|
|
29
29
|
};
|
|
30
30
|
}
|
|
31
31
|
|