@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
package/src/planner/optimizer.ts
CHANGED
|
@@ -6,16 +6,24 @@ import { OptimizerTuning, DEFAULT_TUNING } from './optimizer-tuning.js';
|
|
|
6
6
|
// Re-export for convenience
|
|
7
7
|
export { DEFAULT_TUNING };
|
|
8
8
|
|
|
9
|
-
import { applyRules
|
|
9
|
+
import { applyRules } from './framework/registry.js';
|
|
10
10
|
import { tracePhaseStart, tracePhaseEnd, traceNodeStart, traceNodeEnd } from './framework/trace.js';
|
|
11
11
|
import { defaultStatsProvider, type StatsProvider } from './stats/index.js';
|
|
12
12
|
import { createOptContext, type OptContext } from './framework/context.js';
|
|
13
|
+
import type { OptimizerDiagnostics } from './framework/context.js';
|
|
14
|
+
import { PassManager, PassId } from './framework/pass.js';
|
|
13
15
|
// Phase 2 rules
|
|
14
16
|
import { ruleMaterializationAdvisory } from './rules/cache/rule-materialization-advisory.js';
|
|
15
17
|
// Phase 1.5 rules
|
|
16
18
|
import { ruleSelectAccessPath } from './rules/access/rule-select-access-path.js';
|
|
19
|
+
import { ruleGrowRetrieve } from './rules/retrieve/rule-grow-retrieve.js';
|
|
20
|
+
import { rulePredicatePushdown } from './rules/predicate/rule-predicate-pushdown.js';
|
|
21
|
+
import { ruleJoinKeyInference } from './rules/join/rule-join-key-inference.js';
|
|
22
|
+
import { ruleJoinGreedyCommute } from './rules/join/rule-join-greedy-commute.js';
|
|
23
|
+
// Predicate pushdown rules
|
|
17
24
|
// Core optimization rules
|
|
18
25
|
import { ruleAggregateStreaming } from './rules/aggregate/rule-aggregate-streaming.js';
|
|
26
|
+
import { ruleQuickPickJoinEnumeration } from './rules/join/rule-quickpick-enumeration.js';
|
|
19
27
|
// Constraint rules removed - now handled in builders for correctness
|
|
20
28
|
import { ruleCteOptimization } from './rules/cache/rule-cte-optimization.js';
|
|
21
29
|
import { ruleMutatingSubqueryCache } from './rules/cache/rule-mutating-subquery-cache.js';
|
|
@@ -32,114 +40,157 @@ const log = createLogger('optimizer');
|
|
|
32
40
|
*/
|
|
33
41
|
export class Optimizer {
|
|
34
42
|
private readonly stats: StatsProvider;
|
|
43
|
+
private readonly passManager: PassManager;
|
|
44
|
+
private lastDiagnostics: OptimizerDiagnostics | null = null;
|
|
45
|
+
public tuning: OptimizerTuning;
|
|
35
46
|
|
|
36
47
|
constructor(
|
|
37
|
-
|
|
48
|
+
tuning: OptimizerTuning = DEFAULT_TUNING,
|
|
38
49
|
stats?: StatsProvider
|
|
39
50
|
) {
|
|
40
51
|
this.stats = stats ?? defaultStatsProvider;
|
|
52
|
+
this.passManager = new PassManager();
|
|
53
|
+
this.tuning = tuning;
|
|
41
54
|
|
|
42
|
-
//
|
|
43
|
-
|
|
55
|
+
// Register rules to their appropriate passes only (no legacy globals)
|
|
56
|
+
this.registerRulesToPasses();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
updateTuning(tuning: OptimizerTuning): void {
|
|
60
|
+
this.tuning = tuning;
|
|
44
61
|
}
|
|
45
62
|
|
|
46
63
|
private static globalRulesRegistered = false;
|
|
47
64
|
|
|
48
65
|
/**
|
|
49
|
-
*
|
|
66
|
+
* Legacy method removed; keep empty to avoid duplicate registrations
|
|
50
67
|
*/
|
|
51
|
-
private static ensureGlobalRulesRegistered(): void {
|
|
52
|
-
if (Optimizer.globalRulesRegistered) {
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
Optimizer.globalRulesRegistered = true;
|
|
56
68
|
|
|
57
|
-
|
|
69
|
+
/**
|
|
70
|
+
* Register rules with their appropriate passes
|
|
71
|
+
*/
|
|
72
|
+
private registerRulesToPasses(): void {
|
|
73
|
+
// Structural pass rules (top-down) - for operations that need parent context
|
|
74
|
+
// Register grow-retrieve for ALL relational node types
|
|
75
|
+
// The rule itself will determine if growth is possible
|
|
76
|
+
const relationalNodeTypes = [
|
|
77
|
+
PlanNodeType.Filter,
|
|
78
|
+
PlanNodeType.Project,
|
|
79
|
+
PlanNodeType.Sort,
|
|
80
|
+
PlanNodeType.LimitOffset,
|
|
81
|
+
PlanNodeType.Aggregate,
|
|
82
|
+
PlanNodeType.Distinct,
|
|
83
|
+
PlanNodeType.Join,
|
|
84
|
+
PlanNodeType.Window,
|
|
85
|
+
// Add any other relational node types as needed
|
|
86
|
+
];
|
|
58
87
|
|
|
59
|
-
|
|
88
|
+
for (const nodeType of relationalNodeTypes) {
|
|
89
|
+
this.passManager.addRuleToPass(PassId.Structural, {
|
|
90
|
+
id: `grow-retrieve-${nodeType}`,
|
|
91
|
+
nodeType,
|
|
92
|
+
phase: 'rewrite',
|
|
93
|
+
fn: ruleGrowRetrieve,
|
|
94
|
+
priority: 10
|
|
95
|
+
});
|
|
96
|
+
}
|
|
60
97
|
|
|
61
|
-
//
|
|
62
|
-
|
|
63
|
-
'
|
|
64
|
-
PlanNodeType.Join,
|
|
65
|
-
'rewrite',
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
)
|
|
69
|
-
|
|
70
|
-
//
|
|
71
|
-
|
|
72
|
-
'
|
|
73
|
-
PlanNodeType.
|
|
74
|
-
'
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
//
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
98
|
+
// Join key inference (structural/characteristic)
|
|
99
|
+
this.passManager.addRuleToPass(PassId.Structural, {
|
|
100
|
+
id: 'join-key-inference',
|
|
101
|
+
nodeType: PlanNodeType.Join,
|
|
102
|
+
phase: 'rewrite',
|
|
103
|
+
fn: ruleJoinKeyInference,
|
|
104
|
+
priority: 15
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// Greedy join commute: place smaller input on the left to improve nested-loop-like costs
|
|
108
|
+
this.passManager.addRuleToPass(PassId.Structural, {
|
|
109
|
+
id: 'join-greedy-commute',
|
|
110
|
+
nodeType: PlanNodeType.Join,
|
|
111
|
+
phase: 'rewrite',
|
|
112
|
+
fn: ruleJoinGreedyCommute,
|
|
113
|
+
priority: 16
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
this.passManager.addRuleToPass(PassId.Structural, {
|
|
117
|
+
id: 'predicate-pushdown',
|
|
118
|
+
nodeType: PlanNodeType.Filter,
|
|
119
|
+
phase: 'rewrite',
|
|
120
|
+
fn: rulePredicatePushdown,
|
|
121
|
+
priority: 20
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// Physical pass rules (bottom-up) - for logical to physical transformations
|
|
125
|
+
this.passManager.addRuleToPass(PassId.Physical, {
|
|
126
|
+
id: 'select-access-path',
|
|
127
|
+
nodeType: PlanNodeType.Retrieve,
|
|
128
|
+
phase: 'impl',
|
|
129
|
+
fn: ruleSelectAccessPath,
|
|
130
|
+
priority: 10
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
// QuickPick join enumeration (optional via tuning)
|
|
134
|
+
this.passManager.addRuleToPass(PassId.Physical, {
|
|
135
|
+
id: 'quickpick-join-enumeration',
|
|
136
|
+
nodeType: PlanNodeType.Join,
|
|
137
|
+
phase: 'impl',
|
|
138
|
+
fn: ruleQuickPickJoinEnumeration,
|
|
139
|
+
priority: 5
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
this.passManager.addRuleToPass(PassId.Physical, {
|
|
143
|
+
id: 'aggregate-streaming',
|
|
144
|
+
nodeType: PlanNodeType.Aggregate,
|
|
145
|
+
phase: 'impl',
|
|
146
|
+
fn: ruleAggregateStreaming,
|
|
147
|
+
priority: 20
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
// Post-optimization pass rules (bottom-up) - for cleanup and caching
|
|
151
|
+
this.passManager.addRuleToPass(PassId.PostOptimization, {
|
|
152
|
+
id: 'mutating-subquery-cache',
|
|
153
|
+
nodeType: PlanNodeType.Join,
|
|
154
|
+
phase: 'rewrite',
|
|
155
|
+
fn: ruleMutatingSubqueryCache,
|
|
156
|
+
priority: 10
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
this.passManager.addRuleToPass(PassId.PostOptimization, {
|
|
160
|
+
id: 'cte-optimization',
|
|
161
|
+
nodeType: PlanNodeType.CTE,
|
|
162
|
+
phase: 'rewrite',
|
|
163
|
+
fn: ruleCteOptimization,
|
|
164
|
+
priority: 20
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// Register materialization advisory for multiple node types
|
|
168
|
+
const nodeTypesForMaterialization = [
|
|
169
|
+
PlanNodeType.Block,
|
|
170
|
+
PlanNodeType.ScalarSubquery,
|
|
171
|
+
PlanNodeType.Exists,
|
|
172
|
+
PlanNodeType.In,
|
|
173
|
+
PlanNodeType.Insert,
|
|
174
|
+
PlanNodeType.Update,
|
|
175
|
+
PlanNodeType.Delete,
|
|
106
176
|
PlanNodeType.CTE,
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
// Phase 2 rules - Materialization advisory
|
|
113
|
-
// TODO: Can we apply this more generally rather than assuming certain node types?
|
|
114
|
-
// Register for all node types that can have relational children
|
|
115
|
-
const nodeTypesWithRelationalChildren = [
|
|
116
|
-
PlanNodeType.Block, // Contains statements
|
|
117
|
-
PlanNodeType.ScalarSubquery, // Contains relational subquery
|
|
118
|
-
PlanNodeType.Exists, // Contains relational subquery
|
|
119
|
-
PlanNodeType.In, // Can contain relational subquery
|
|
120
|
-
PlanNodeType.Insert, // Has source relation
|
|
121
|
-
PlanNodeType.Update, // Has source relation
|
|
122
|
-
PlanNodeType.Delete, // Has source relation
|
|
123
|
-
PlanNodeType.CTE, // Has definition relation
|
|
124
|
-
PlanNodeType.RecursiveCTE, // Has anchor/recursive relations
|
|
125
|
-
PlanNodeType.Returning, // Wraps DML operations
|
|
126
|
-
// Scalar nodes that might contain subqueries
|
|
127
|
-
PlanNodeType.ScalarFunctionCall, // Function args might be subqueries
|
|
128
|
-
PlanNodeType.CaseExpr, // CASE conditions might be subqueries
|
|
177
|
+
PlanNodeType.RecursiveCTE,
|
|
178
|
+
PlanNodeType.Returning,
|
|
179
|
+
PlanNodeType.ScalarFunctionCall,
|
|
180
|
+
PlanNodeType.CaseExpr,
|
|
129
181
|
];
|
|
130
182
|
|
|
131
|
-
for (const nodeType of
|
|
132
|
-
|
|
133
|
-
|
|
183
|
+
for (const nodeType of nodeTypesForMaterialization) {
|
|
184
|
+
this.passManager.addRuleToPass(PassId.PostOptimization, {
|
|
185
|
+
id: `materialization-advisory-${nodeType}`,
|
|
134
186
|
nodeType,
|
|
135
|
-
'rewrite',
|
|
136
|
-
ruleMaterializationAdvisory,
|
|
137
|
-
|
|
138
|
-
)
|
|
187
|
+
phase: 'rewrite',
|
|
188
|
+
fn: ruleMaterializationAdvisory,
|
|
189
|
+
priority: 30
|
|
190
|
+
});
|
|
139
191
|
}
|
|
140
192
|
|
|
141
|
-
|
|
142
|
-
registerRules(toRegister);
|
|
193
|
+
log('Registered rules to optimization passes');
|
|
143
194
|
}
|
|
144
195
|
|
|
145
196
|
/**
|
|
@@ -153,18 +204,17 @@ export class Optimizer {
|
|
|
153
204
|
|
|
154
205
|
tracePhaseStart('optimization');
|
|
155
206
|
try {
|
|
156
|
-
//
|
|
157
|
-
|
|
158
|
-
const constantFoldedPlan = this.performConstantFolding(plan, context);
|
|
207
|
+
// Execute all optimization passes
|
|
208
|
+
const optimizedPlan = this.passManager.execute(plan, context);
|
|
159
209
|
|
|
160
|
-
//
|
|
161
|
-
|
|
210
|
+
// Capture diagnostics snapshot for external consumers
|
|
211
|
+
this.lastDiagnostics = { ...context.diagnostics };
|
|
162
212
|
|
|
163
|
-
//
|
|
213
|
+
// Final validation (if enabled)
|
|
164
214
|
if (this.tuning.debug.validatePlan) {
|
|
165
215
|
log('Running plan validation');
|
|
166
216
|
try {
|
|
167
|
-
validatePhysicalTree(
|
|
217
|
+
validatePhysicalTree(optimizedPlan);
|
|
168
218
|
log('Plan validation passed');
|
|
169
219
|
} catch (error) {
|
|
170
220
|
log('Plan validation failed: %s', error);
|
|
@@ -172,12 +222,32 @@ export class Optimizer {
|
|
|
172
222
|
}
|
|
173
223
|
}
|
|
174
224
|
|
|
175
|
-
return
|
|
225
|
+
return optimizedPlan;
|
|
176
226
|
} finally {
|
|
177
227
|
tracePhaseEnd('optimization');
|
|
178
228
|
}
|
|
179
229
|
}
|
|
180
230
|
|
|
231
|
+
/**
|
|
232
|
+
* Run only non-physical passes to obtain a structurally rewritten logical plan
|
|
233
|
+
* suitable for pre-physical analysis (e.g., row-specific classification).
|
|
234
|
+
*/
|
|
235
|
+
optimizeForAnalysis(plan: PlanNode, db: Database): PlanNode {
|
|
236
|
+
log('Starting pre-physical analysis optimization of plan', plan.nodeType);
|
|
237
|
+
|
|
238
|
+
const context = createOptContext(this, this.stats, this.tuning, db);
|
|
239
|
+
tracePhaseStart('pre-physical-analysis');
|
|
240
|
+
try {
|
|
241
|
+
// Execute only structural pass(es) and constant folding
|
|
242
|
+
const folded = this.performConstantFolding(plan, context);
|
|
243
|
+
const structuralOnly = this.passManager.executeUpTo(folded, context, PassId.Structural);
|
|
244
|
+
this.lastDiagnostics = { ...context.diagnostics };
|
|
245
|
+
return structuralOnly;
|
|
246
|
+
} finally {
|
|
247
|
+
tracePhaseEnd('pre-physical-analysis');
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
181
251
|
/**
|
|
182
252
|
* Perform single-pass constant folding over the entire plan tree
|
|
183
253
|
*/
|
|
@@ -254,4 +324,9 @@ export class Optimizer {
|
|
|
254
324
|
getStats(): StatsProvider {
|
|
255
325
|
return this.stats;
|
|
256
326
|
}
|
|
327
|
+
|
|
328
|
+
/** Get diagnostics from the last optimization run */
|
|
329
|
+
getLastDiagnostics(): OptimizerDiagnostics | null {
|
|
330
|
+
return this.lastDiagnostics;
|
|
331
|
+
}
|
|
257
332
|
}
|
|
@@ -2,8 +2,8 @@ import type { SqlParameters } from '../common/types.js';
|
|
|
2
2
|
import type { Database } from '../core/database.js';
|
|
3
3
|
import type { SchemaManager } from '../schema/manager.js';
|
|
4
4
|
import type { Scope } from './scopes/scope.js';
|
|
5
|
-
import type { ScalarPlanNode } from './nodes/plan-node.js';
|
|
6
|
-
import type {
|
|
5
|
+
import type { PlanNode, ScalarPlanNode } from './nodes/plan-node.js';
|
|
6
|
+
import type { CTEScopeNode } from './nodes/cte-node.js';
|
|
7
7
|
import type { CTEReferenceNode } from './nodes/cte-reference-node.js';
|
|
8
8
|
|
|
9
9
|
/**
|
|
@@ -17,6 +17,7 @@ export interface DebugOptions {
|
|
|
17
17
|
/** Enable instruction program output */
|
|
18
18
|
showProgram?: boolean;
|
|
19
19
|
/** Custom debug context for additional logging */
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
20
21
|
debugContext?: Record<string, any>;
|
|
21
22
|
}
|
|
22
23
|
|
|
@@ -36,12 +37,14 @@ export interface SchemaDependency {
|
|
|
36
37
|
*/
|
|
37
38
|
export class BuildTimeDependencyTracker {
|
|
38
39
|
private dependencies = new Set<string>();
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
39
41
|
private resolvedObjects = new Map<string, WeakRef<any>>();
|
|
40
42
|
private invalidationCallbacks = new Set<() => void>();
|
|
41
43
|
|
|
42
44
|
/**
|
|
43
45
|
* Records a dependency on a schema object and stores a weak reference to it.
|
|
44
46
|
*/
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
45
48
|
recordDependency(dep: SchemaDependency, object: any): void {
|
|
46
49
|
const key = this.dependencyKey(dep);
|
|
47
50
|
this.dependencies.add(key);
|
|
@@ -163,7 +166,7 @@ export interface PlanningContext {
|
|
|
163
166
|
* This map contains all CTEs from the current WITH clause and any parent WITH clauses,
|
|
164
167
|
* allowing subqueries in expressions to resolve CTE references correctly.
|
|
165
168
|
*/
|
|
166
|
-
readonly cteNodes?: Map<string,
|
|
169
|
+
readonly cteNodes?: Map<string, CTEScopeNode>;
|
|
167
170
|
|
|
168
171
|
/**
|
|
169
172
|
* Schema dependency tracker for this planning session.
|
|
@@ -173,6 +176,7 @@ export interface PlanningContext {
|
|
|
173
176
|
/**
|
|
174
177
|
* Schema object cache for resolved objects during planning.
|
|
175
178
|
*/
|
|
179
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
176
180
|
readonly schemaCache: Map<string, any>;
|
|
177
181
|
|
|
178
182
|
/**
|
|
@@ -180,4 +184,7 @@ export interface PlanningContext {
|
|
|
180
184
|
* to the same CTE with the same alias. Key format: "cteName:alias"
|
|
181
185
|
*/
|
|
182
186
|
cteReferenceCache?: Map<string, CTEReferenceNode>;
|
|
187
|
+
|
|
188
|
+
/** maps a RelationalPlanNode to its column scope during building */
|
|
189
|
+
readonly outputScopes: Map<PlanNode, Scope>;
|
|
183
190
|
}
|
package/src/planner/resolve.ts
CHANGED
|
@@ -3,6 +3,7 @@ import * as AST from "../parser/ast.js";
|
|
|
3
3
|
import { ColumnReferenceNode, FunctionReferenceNode, ParameterReferenceNode, TableReferenceNode } from "./nodes/reference.js";
|
|
4
4
|
import { QuereusError } from "../common/errors.js";
|
|
5
5
|
import { StatusCode } from "../common/types.js";
|
|
6
|
+
import { isScalarNode, type ScalarPlanNode } from "./nodes/plan-node.js";
|
|
6
7
|
|
|
7
8
|
export function resolveTable(scope: Scope, exp: AST.IdentifierExpr, selectedSchema: string = 'main'): TableReferenceNode | typeof Ambiguous | undefined {
|
|
8
9
|
// table: [schema.]name
|
|
@@ -28,7 +29,7 @@ export function resolveTable(scope: Scope, exp: AST.IdentifierExpr, selectedSche
|
|
|
28
29
|
// throw new QuereusError(`${idName} isn't a pragma`, StatusCode.ERROR);
|
|
29
30
|
// }
|
|
30
31
|
|
|
31
|
-
export function resolveColumn(scope: Scope, exp: AST.ColumnExpr, selectedSchema: string = 'main'):
|
|
32
|
+
export function resolveColumn(scope: Scope, exp: AST.ColumnExpr, selectedSchema: string = 'main'): ScalarPlanNode | typeof Ambiguous | undefined {
|
|
32
33
|
const schemaQualifier = exp.schema;
|
|
33
34
|
const tableQualifier = exp.table;
|
|
34
35
|
const columnName = exp.name;
|
|
@@ -38,8 +39,8 @@ export function resolveColumn(scope: Scope, exp: AST.ColumnExpr, selectedSchema:
|
|
|
38
39
|
// Fully qualified: schema.table.column
|
|
39
40
|
const symbolKey = `${schemaQualifier}.${tableQualifier}.${columnName}`;
|
|
40
41
|
const result = scope.resolveSymbol(symbolKey, exp);
|
|
41
|
-
if (result === Ambiguous || result
|
|
42
|
-
return result;
|
|
42
|
+
if (result === Ambiguous || (result && isScalarNode(result))) {
|
|
43
|
+
return result as ScalarPlanNode | typeof Ambiguous;
|
|
43
44
|
}
|
|
44
45
|
throw new QuereusError(`${symbolKey} isn't a column`, StatusCode.ERROR);
|
|
45
46
|
} else {
|
|
@@ -47,15 +48,15 @@ export function resolveColumn(scope: Scope, exp: AST.ColumnExpr, selectedSchema:
|
|
|
47
48
|
// Try without schema first, then with schema if that fails
|
|
48
49
|
const unqualifiedKey = `${tableQualifier}.${columnName}`;
|
|
49
50
|
const result = scope.resolveSymbol(unqualifiedKey, exp);
|
|
50
|
-
if (result === Ambiguous || result
|
|
51
|
-
return result;
|
|
51
|
+
if (result === Ambiguous || (result && isScalarNode(result))) {
|
|
52
|
+
return result as ScalarPlanNode | typeof Ambiguous;
|
|
52
53
|
}
|
|
53
54
|
|
|
54
55
|
// If unqualified fails, try with the selected schema
|
|
55
56
|
const qualifiedKey = `${selectedSchema}.${tableQualifier}.${columnName}`;
|
|
56
57
|
const qualifiedResult = scope.resolveSymbol(qualifiedKey, exp);
|
|
57
|
-
if (qualifiedResult === Ambiguous || qualifiedResult
|
|
58
|
-
return qualifiedResult;
|
|
58
|
+
if (qualifiedResult === Ambiguous || (qualifiedResult && isScalarNode(qualifiedResult))) {
|
|
59
|
+
return qualifiedResult as ScalarPlanNode | typeof Ambiguous;
|
|
59
60
|
}
|
|
60
61
|
|
|
61
62
|
throw new QuereusError(`${unqualifiedKey} isn't a column`, StatusCode.ERROR);
|
|
@@ -63,8 +64,8 @@ export function resolveColumn(scope: Scope, exp: AST.ColumnExpr, selectedSchema:
|
|
|
63
64
|
} else {
|
|
64
65
|
// Unqualified: column
|
|
65
66
|
const result = scope.resolveSymbol(columnName, exp);
|
|
66
|
-
if (result === Ambiguous || result
|
|
67
|
-
return result;
|
|
67
|
+
if (result === Ambiguous || (result && isScalarNode(result))) {
|
|
68
|
+
return result as ScalarPlanNode | typeof Ambiguous;
|
|
68
69
|
}
|
|
69
70
|
throw new QuereusError(`Column not found: ${columnName}`, StatusCode.ERROR);
|
|
70
71
|
}
|
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
# Optimizer Rules Directory
|
|
2
|
-
|
|
3
|
-
This directory contains optimization rules for the Quereus Titan optimizer, organized by functional area.
|
|
4
|
-
|
|
5
|
-
## Directory Structure
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
rules/
|
|
9
|
-
├── rewrite/ # Logical-to-logical transformations
|
|
10
|
-
│ ├── predicate-pushdown/
|
|
11
|
-
│ ├── join-reordering/
|
|
12
|
-
│ └── subquery-rewrite/
|
|
13
|
-
├── access/ # Table access path optimization
|
|
14
|
-
│ ├── index-selection/
|
|
15
|
-
│ └── scan-strategy/
|
|
16
|
-
├── join/ # Join algorithm selection and optimization
|
|
17
|
-
│ ├── algorithm-selection/
|
|
18
|
-
│ └── join-ordering/
|
|
19
|
-
├── aggregate/ # Aggregation optimization
|
|
20
|
-
│ ├── streaming/
|
|
21
|
-
│ └── hash-aggregate/
|
|
22
|
-
├── cache/ # Caching and materialization
|
|
23
|
-
│ ├── materialization/
|
|
24
|
-
│ └── cache-injection/
|
|
25
|
-
└── physical/ # Physical property propagation
|
|
26
|
-
├── ordering/
|
|
27
|
-
└── uniqueness/
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## Rule Categories
|
|
31
|
-
|
|
32
|
-
### Rewrite Rules (Logical → Logical)
|
|
33
|
-
Transform logical plan structure without changing to physical nodes:
|
|
34
|
-
-
|
|
35
|
-
- Join reordering based on cardinality
|
|
36
|
-
- Subquery → join conversions
|
|
37
|
-
- Constant folding and elimination
|
|
38
|
-
|
|
39
|
-
### Access Rules (Logical → Physical)
|
|
40
|
-
Choose optimal table access strategies:
|
|
41
|
-
- Index vs. sequential scan selection
|
|
42
|
-
- Index seek vs. scan decisions
|
|
43
|
-
- Column pruning integration
|
|
44
|
-
|
|
45
|
-
### Join Rules (Logical → Physical)
|
|
46
|
-
Select join algorithms and optimize join trees:
|
|
47
|
-
- Nested loop vs. hash join selection
|
|
48
|
-
- Join order optimization
|
|
49
|
-
- Cache injection for inner sides
|
|
50
|
-
|
|
51
|
-
### Aggregate Rules (Logical → Physical)
|
|
52
|
-
Choose aggregation implementation strategies:
|
|
53
|
-
- Stream vs. hash aggregation
|
|
54
|
-
- Sort requirement analysis
|
|
55
|
-
- Grouping optimization
|
|
56
|
-
|
|
57
|
-
### Cache Rules
|
|
58
|
-
Inject caching where beneficial:
|
|
59
|
-
- CTE materialization decisions
|
|
60
|
-
- Nested loop inner caching
|
|
61
|
-
- Spill-to-disk strategies
|
|
62
|
-
|
|
63
|
-
### Physical Rules
|
|
64
|
-
Propagate and optimize physical properties:
|
|
65
|
-
- Ordering preservation and requirements
|
|
66
|
-
- Uniqueness key propagation
|
|
67
|
-
- Constant and deterministic flags
|
|
68
|
-
|
|
69
|
-
## Rule Naming Convention
|
|
70
|
-
|
|
71
|
-
Rules follow the pattern: `rule-<description>.ts`
|
|
72
|
-
|
|
73
|
-
Examples:
|
|
74
|
-
- `rule-
|
|
75
|
-
- `rule-aggregate-streaming.ts`
|
|
76
|
-
- `rule-join-hash-conversion.ts`
|
|
77
|
-
- `rule-cache-cte-materialization.ts`
|
|
78
|
-
|
|
79
|
-
## Implementation Requirements
|
|
80
|
-
|
|
81
|
-
Each rule must:
|
|
82
|
-
1. Follow the function signature: `(node: PlanNode, optimizer: Optimizer) => PlanNode | null`
|
|
83
|
-
2. Include comprehensive unit tests in co-located `.spec.ts` file
|
|
84
|
-
3. Use consistent logging with `createLogger('optimizer:rule:<name>')`
|
|
85
|
-
4. Preserve attribute IDs when creating new nodes
|
|
86
|
-
5. Set appropriate physical properties using `PlanNode.setDefaultPhysical()`
|
|
87
|
-
|
|
88
|
-
## Getting Started
|
|
89
|
-
|
|
90
|
-
1. Choose the appropriate category directory
|
|
91
|
-
2. Copy the rule template from `docs/optimizer-conventions.md`
|
|
92
|
-
3. Implement the rule following the established patterns
|
|
93
|
-
4. Add comprehensive unit tests
|
|
94
|
-
5. Register the rule in the appropriate registry file
|
|
95
|
-
|
|
96
|
-
See `docs/optimizer-conventions.md` for detailed implementation guidelines.
|
|
1
|
+
# Optimizer Rules Directory
|
|
2
|
+
|
|
3
|
+
This directory contains optimization rules for the Quereus Titan optimizer, organized by functional area.
|
|
4
|
+
|
|
5
|
+
## Directory Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
rules/
|
|
9
|
+
├── rewrite/ # Logical-to-logical transformations
|
|
10
|
+
│ ├── predicate-pushdown/
|
|
11
|
+
│ ├── join-reordering/
|
|
12
|
+
│ └── subquery-rewrite/
|
|
13
|
+
├── access/ # Table access path optimization
|
|
14
|
+
│ ├── index-selection/
|
|
15
|
+
│ └── scan-strategy/
|
|
16
|
+
├── join/ # Join algorithm selection and optimization
|
|
17
|
+
│ ├── algorithm-selection/
|
|
18
|
+
│ └── join-ordering/
|
|
19
|
+
├── aggregate/ # Aggregation optimization
|
|
20
|
+
│ ├── streaming/
|
|
21
|
+
│ └── hash-aggregate/
|
|
22
|
+
├── cache/ # Caching and materialization
|
|
23
|
+
│ ├── materialization/
|
|
24
|
+
│ └── cache-injection/
|
|
25
|
+
└── physical/ # Physical property propagation
|
|
26
|
+
├── ordering/
|
|
27
|
+
└── uniqueness/
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Rule Categories
|
|
31
|
+
|
|
32
|
+
### Rewrite Rules (Logical → Logical)
|
|
33
|
+
Transform logical plan structure without changing to physical nodes:
|
|
34
|
+
- Retrieve growth (modules handle pushdown via Retrieve pipelines)
|
|
35
|
+
- Join reordering based on cardinality
|
|
36
|
+
- Subquery → join conversions
|
|
37
|
+
- Constant folding and elimination
|
|
38
|
+
|
|
39
|
+
### Access Rules (Logical → Physical)
|
|
40
|
+
Choose optimal table access strategies:
|
|
41
|
+
- Index vs. sequential scan selection
|
|
42
|
+
- Index seek vs. scan decisions
|
|
43
|
+
- Column pruning integration
|
|
44
|
+
|
|
45
|
+
### Join Rules (Logical → Physical)
|
|
46
|
+
Select join algorithms and optimize join trees:
|
|
47
|
+
- Nested loop vs. hash join selection
|
|
48
|
+
- Join order optimization
|
|
49
|
+
- Cache injection for inner sides
|
|
50
|
+
|
|
51
|
+
### Aggregate Rules (Logical → Physical)
|
|
52
|
+
Choose aggregation implementation strategies:
|
|
53
|
+
- Stream vs. hash aggregation
|
|
54
|
+
- Sort requirement analysis
|
|
55
|
+
- Grouping optimization
|
|
56
|
+
|
|
57
|
+
### Cache Rules
|
|
58
|
+
Inject caching where beneficial:
|
|
59
|
+
- CTE materialization decisions
|
|
60
|
+
- Nested loop inner caching
|
|
61
|
+
- Spill-to-disk strategies
|
|
62
|
+
|
|
63
|
+
### Physical Rules
|
|
64
|
+
Propagate and optimize physical properties:
|
|
65
|
+
- Ordering preservation and requirements
|
|
66
|
+
- Uniqueness key propagation
|
|
67
|
+
- Constant and deterministic flags
|
|
68
|
+
|
|
69
|
+
## Rule Naming Convention
|
|
70
|
+
|
|
71
|
+
Rules follow the pattern: `rule-<description>.ts`
|
|
72
|
+
|
|
73
|
+
Examples:
|
|
74
|
+
- `rule-grow-retrieve.ts`
|
|
75
|
+
- `rule-aggregate-streaming.ts`
|
|
76
|
+
- `rule-join-hash-conversion.ts`
|
|
77
|
+
- `rule-cache-cte-materialization.ts`
|
|
78
|
+
|
|
79
|
+
## Implementation Requirements
|
|
80
|
+
|
|
81
|
+
Each rule must:
|
|
82
|
+
1. Follow the function signature: `(node: PlanNode, optimizer: Optimizer) => PlanNode | null`
|
|
83
|
+
2. Include comprehensive unit tests in co-located `.spec.ts` file
|
|
84
|
+
3. Use consistent logging with `createLogger('optimizer:rule:<name>')`
|
|
85
|
+
4. Preserve attribute IDs when creating new nodes
|
|
86
|
+
5. Set appropriate physical properties using `PlanNode.setDefaultPhysical()`
|
|
87
|
+
|
|
88
|
+
## Getting Started
|
|
89
|
+
|
|
90
|
+
1. Choose the appropriate category directory
|
|
91
|
+
2. Copy the rule template from `docs/optimizer-conventions.md`
|
|
92
|
+
3. Implement the rule following the established patterns
|
|
93
|
+
4. Add comprehensive unit tests
|
|
94
|
+
5. Register the rule in the appropriate registry file
|
|
95
|
+
|
|
96
|
+
See `docs/optimizer-conventions.md` for detailed implementation guidelines.
|