@quereus/quereus 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -1
- package/dist/src/common/errors.js.map +1 -1
- package/dist/src/common/json-types.d.ts +11 -0
- package/dist/src/common/json-types.d.ts.map +1 -0
- package/dist/src/common/json-types.js +3 -0
- package/dist/src/common/json-types.js.map +1 -0
- package/dist/src/common/types.d.ts +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 -0
- package/dist/src/util/plugin-loader.d.ts.map +1 -1
- package/dist/src/util/plugin-loader.js +137 -0
- package/dist/src/util/plugin-loader.js.map +1 -1
- package/dist/src/util/row-descriptor.d.ts +1 -1
- package/dist/src/util/row-descriptor.d.ts.map +1 -1
- package/dist/src/util/row-descriptor.js.map +1 -1
- package/dist/src/util/serialization.d.ts +3 -0
- package/dist/src/util/serialization.d.ts.map +1 -1
- package/dist/src/util/serialization.js +1 -0
- package/dist/src/util/serialization.js.map +1 -1
- package/dist/src/vtab/best-access-plan.d.ts +1 -1
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js +1 -0
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/manifest.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base.js +2 -0
- package/dist/src/vtab/memory/layer/base.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +2 -1
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +24 -6
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/layer/safe-iterate.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/safe-iterate.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +5 -0
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/memory/table.d.ts +2 -1
- package/dist/src/vtab/memory/table.d.ts.map +1 -1
- package/dist/src/vtab/memory/table.js +3 -2
- package/dist/src/vtab/memory/table.js.map +1 -1
- package/dist/src/vtab/memory/utils/logging.d.ts +2 -2
- package/dist/src/vtab/memory/utils/logging.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/logging.js +6 -3
- package/dist/src/vtab/memory/utils/logging.js.map +1 -1
- package/dist/src/vtab/module.d.ts +25 -0
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/dist/src/vtab/table.d.ts +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 +184 -0
- package/src/util/row-descriptor.ts +1 -1
- package/src/util/serialization.ts +2 -0
- package/src/vtab/best-access-plan.ts +2 -1
- package/src/vtab/manifest.ts +1 -0
- package/src/vtab/memory/index.ts +178 -178
- package/src/vtab/memory/layer/base.ts +275 -273
- package/src/vtab/memory/layer/interface.ts +47 -47
- package/src/vtab/memory/layer/manager.ts +33 -11
- package/src/vtab/memory/layer/safe-iterate.ts +3 -3
- package/src/vtab/memory/layer/transaction.ts +229 -229
- package/src/vtab/memory/module.ts +24 -18
- package/src/vtab/memory/table.ts +256 -253
- package/src/vtab/memory/utils/logging.ts +6 -3
- package/src/vtab/module.ts +170 -140
- package/src/vtab/table.ts +162 -143
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: Grow Retrieve
|
|
3
|
+
*
|
|
4
|
+
* Structural sliding rule that maximizes the query segment each virtual table module can execute.
|
|
5
|
+
* This is a bottom-up transformation that slides RetrieveNode boundaries upward to encompass
|
|
6
|
+
* as much of the query pipeline as each module can handle.
|
|
7
|
+
*
|
|
8
|
+
* Applied When:
|
|
9
|
+
* - Node is a unary relational operation (Filter, Project, Sort, LimitOffset)
|
|
10
|
+
* - Child is a RetrieveNode
|
|
11
|
+
* - Virtual table module supports executing the expanded pipeline
|
|
12
|
+
*
|
|
13
|
+
* Benefits:
|
|
14
|
+
* - Maximizes push-down opportunities for query-based modules
|
|
15
|
+
* - Provides fallback support for index-style modules via constraint extraction
|
|
16
|
+
* - Establishes optimal module execution boundaries before cost-based optimization
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { createLogger } from '../../../common/logger.js';
|
|
20
|
+
import { isRelationalNode, type PlanNode, type RelationalPlanNode } from '../../nodes/plan-node.js';
|
|
21
|
+
import type { OptContext } from '../../framework/context.js';
|
|
22
|
+
import { RetrieveNode } from '../../nodes/retrieve-node.js';
|
|
23
|
+
import { FilterNode } from '../../nodes/filter.js';
|
|
24
|
+
import type { TableReferenceNode } from '../../nodes/reference.js';
|
|
25
|
+
import { PlanNodeType } from '../../nodes/plan-node-type.js';
|
|
26
|
+
import type { SupportAssessment } from '../../../vtab/module.js';
|
|
27
|
+
import type { BestAccessPlanRequest, BestAccessPlanResult, PredicateConstraint } from '../../../vtab/best-access-plan.js';
|
|
28
|
+
import { extractConstraints, createTableInfoFromNode, type TableInfo } from '../../analysis/constraint-extractor.js';
|
|
29
|
+
import { normalizePredicate } from '../../analysis/predicate-normalizer.js';
|
|
30
|
+
import { seqScanCost } from '../../cost/index.js';
|
|
31
|
+
import { SortNode } from '../../nodes/sort.js';
|
|
32
|
+
import { extractOrderingFromSortKeys } from '../../framework/physical-utils.js';
|
|
33
|
+
import { LimitOffsetNode } from '../../nodes/limit-offset.js';
|
|
34
|
+
import { PlanNode as _PlanNode } from '../../nodes/plan-node.js';
|
|
35
|
+
import { PlanNodeType as _PlanNodeType } from '../../nodes/plan-node-type.js';
|
|
36
|
+
import { LiteralNode } from '../../nodes/scalar.js';
|
|
37
|
+
import { collectBindingsInPlan } from '../../analysis/binding-collector.js';
|
|
38
|
+
|
|
39
|
+
const log = createLogger('optimizer:rule:grow-retrieve');
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Context data stored in RetrieveNode.moduleCtx for index-style fallback
|
|
43
|
+
*/
|
|
44
|
+
interface IndexStyleContext {
|
|
45
|
+
kind: 'index-style';
|
|
46
|
+
accessPlan: BestAccessPlanResult;
|
|
47
|
+
residualPredicate?: PlanNode;
|
|
48
|
+
originalConstraints: PredicateConstraint[];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function isIndexStyleContext(ctx: unknown): ctx is IndexStyleContext {
|
|
52
|
+
return !!ctx && typeof ctx === 'object' && (ctx as any).kind === 'index-style';
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function ruleGrowRetrieve(node: PlanNode, context: OptContext): PlanNode | null {
|
|
56
|
+
// This rule runs in a TOP-DOWN pass, looking for any relational operation
|
|
57
|
+
// above a RetrieveNode that can be pushed into the module's execution boundary
|
|
58
|
+
|
|
59
|
+
// Must be a relational node to be growable
|
|
60
|
+
if (!isRelationalNode(node)) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Find the RetrieveNode child (if any)
|
|
65
|
+
const retrieveChild = findRetrieveChild(node);
|
|
66
|
+
if (!retrieveChild) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const tableRef = retrieveChild.tableRef;
|
|
71
|
+
|
|
72
|
+
// Guard: ensure we have required properties
|
|
73
|
+
if (!tableRef?.tableSchema) {
|
|
74
|
+
log('RetrieveNode missing tableRef or tableSchema');
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const tableSchema = tableRef.tableSchema;
|
|
79
|
+
const vtabModule = tableRef.vtabModule;
|
|
80
|
+
|
|
81
|
+
log('Evaluating growth for %s over table %s', node.nodeType, tableSchema.name);
|
|
82
|
+
|
|
83
|
+
// If no vtabModule, can't grow
|
|
84
|
+
if (!vtabModule) {
|
|
85
|
+
log('No vtabModule available for table %s', tableSchema.name);
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Create candidate pipeline by sliding the operation into the retrieve boundary
|
|
90
|
+
// This replaces the RetrieveNode child with its source in the parent operation
|
|
91
|
+
const candidatePipeline = replaceRetrieveWithSource(node, retrieveChild);
|
|
92
|
+
|
|
93
|
+
// Try module's supports() method first (if available)
|
|
94
|
+
let assessment: SupportAssessment | undefined;
|
|
95
|
+
|
|
96
|
+
if (vtabModule.supports && typeof vtabModule.supports === 'function') {
|
|
97
|
+
// Query-based module: let it decide if it can handle the pipeline
|
|
98
|
+
log('Testing module.supports() for %s pipeline', node.nodeType);
|
|
99
|
+
assessment = vtabModule.supports(candidatePipeline);
|
|
100
|
+
|
|
101
|
+
if (assessment) {
|
|
102
|
+
log('Module supports expanded pipeline (cost: %d)', assessment.cost);
|
|
103
|
+
} else {
|
|
104
|
+
log('Module declined expanded pipeline');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// If module doesn't have supports() or declined, try index-style fallback
|
|
109
|
+
// but ONLY for operations we know can be translated to index constraints
|
|
110
|
+
if (!assessment && vtabModule.getBestAccessPlan && typeof vtabModule.getBestAccessPlan === 'function') {
|
|
111
|
+
if (canTranslateToIndexConstraints(node)) {
|
|
112
|
+
log('Testing index-style fallback for %s', node.nodeType);
|
|
113
|
+
assessment = fallbackIndexSupports(node, candidatePipeline, context, tableRef);
|
|
114
|
+
|
|
115
|
+
if (assessment) {
|
|
116
|
+
log('Index-style fallback supports pipeline (cost: %d)', assessment.cost);
|
|
117
|
+
} else {
|
|
118
|
+
log('Index-style fallback declined pipeline');
|
|
119
|
+
}
|
|
120
|
+
} else {
|
|
121
|
+
log('Node type %s cannot be translated to index constraints', node.nodeType);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (!assessment) {
|
|
126
|
+
// Module cannot handle the expanded pipeline
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Determine how to slide depending on assessment origin
|
|
131
|
+
let newPipeline: RelationalPlanNode;
|
|
132
|
+
let newBindings = [...(retrieveChild.bindings ?? []), ...collectBindingsInPlan(node, retrieveChild.tableRef)];
|
|
133
|
+
|
|
134
|
+
if (isIndexStyleContext(assessment.ctx)) {
|
|
135
|
+
// Index-style fallback: only place supported fragments under Retrieve; keep residuals above
|
|
136
|
+
newPipeline = candidatePipeline as RelationalPlanNode;
|
|
137
|
+
if (node instanceof FilterNode) {
|
|
138
|
+
const tableInfo: TableInfo = createTableInfoFromNode(retrieveChild.tableRef, tableSchema.name);
|
|
139
|
+
const extraction = extractConstraints(normalizePredicate(node.predicate), [tableInfo]);
|
|
140
|
+
const supported = extraction.supportedPredicateByTable?.get(tableInfo.relationKey);
|
|
141
|
+
if (supported) {
|
|
142
|
+
newPipeline = new FilterNode(
|
|
143
|
+
retrieveChild.source.scope,
|
|
144
|
+
(candidatePipeline as FilterNode).source,
|
|
145
|
+
supported
|
|
146
|
+
) as unknown as RelationalPlanNode;
|
|
147
|
+
newBindings = [...(retrieveChild.bindings ?? []), ...collectBindingsInPlan(newPipeline, retrieveChild.tableRef)];
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
} else {
|
|
151
|
+
// Query-based module with supports(): move the entire node into the module boundary
|
|
152
|
+
newPipeline = candidatePipeline as RelationalPlanNode;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const grownRetrieve = new RetrieveNode(
|
|
156
|
+
node.scope,
|
|
157
|
+
newPipeline,
|
|
158
|
+
retrieveChild.tableRef,
|
|
159
|
+
assessment.ctx,
|
|
160
|
+
newBindings
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
log('Grew retrieve pipeline for table %s: %s → %s',
|
|
164
|
+
tableSchema.name, retrieveChild.source.nodeType, candidatePipeline.nodeType);
|
|
165
|
+
|
|
166
|
+
return grownRetrieve;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Find a RetrieveNode among the children of this node
|
|
171
|
+
*/
|
|
172
|
+
function findRetrieveChild(node: PlanNode): RetrieveNode | undefined {
|
|
173
|
+
const children = node.getChildren();
|
|
174
|
+
for (const child of children) {
|
|
175
|
+
if (child instanceof RetrieveNode) {
|
|
176
|
+
return child;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Replace the RetrieveNode child with its source in the parent operation
|
|
184
|
+
*/
|
|
185
|
+
function replaceRetrieveWithSource(parent: PlanNode, retrieveNode: RetrieveNode): PlanNode {
|
|
186
|
+
const children = parent.getChildren();
|
|
187
|
+
const newChildren = children.map(child =>
|
|
188
|
+
child === retrieveNode ? retrieveNode.source : child
|
|
189
|
+
);
|
|
190
|
+
return parent.withChildren(newChildren);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Check if this node type can be translated to index constraints
|
|
195
|
+
* This is used for the fallback when modules don't implement supports()
|
|
196
|
+
*/
|
|
197
|
+
function canTranslateToIndexConstraints(node: PlanNode): boolean {
|
|
198
|
+
switch (node.nodeType) {
|
|
199
|
+
case PlanNodeType.Filter:
|
|
200
|
+
// Filters can be translated to predicates
|
|
201
|
+
return true;
|
|
202
|
+
case PlanNodeType.Sort:
|
|
203
|
+
// Sort can be translated to ordering requirements
|
|
204
|
+
return true;
|
|
205
|
+
case PlanNodeType.LimitOffset:
|
|
206
|
+
// Limit can be passed to index access
|
|
207
|
+
return true;
|
|
208
|
+
default:
|
|
209
|
+
// Other operations (Project, Aggregate, etc.) can't be
|
|
210
|
+
// meaningfully translated to index constraints
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Fallback assessment for index-style modules using getBestAccessPlan
|
|
217
|
+
* Translates various operations to index constraints
|
|
218
|
+
*/
|
|
219
|
+
function fallbackIndexSupports(
|
|
220
|
+
node: PlanNode,
|
|
221
|
+
candidatePipeline: PlanNode,
|
|
222
|
+
context: OptContext,
|
|
223
|
+
tableRef: TableReferenceNode
|
|
224
|
+
): SupportAssessment | undefined {
|
|
225
|
+
|
|
226
|
+
const vtabModule = tableRef.vtabModule;
|
|
227
|
+
const tableSchema = tableRef.tableSchema;
|
|
228
|
+
|
|
229
|
+
// Build BestAccessPlanRequest based on node type
|
|
230
|
+
const request: BestAccessPlanRequest = {
|
|
231
|
+
columns: tableSchema.columns.map((col, index) => ({
|
|
232
|
+
index,
|
|
233
|
+
name: col.name,
|
|
234
|
+
type: col.affinity,
|
|
235
|
+
isPrimaryKey: col.primaryKey || false,
|
|
236
|
+
isUnique: col.primaryKey || false
|
|
237
|
+
})),
|
|
238
|
+
filters: [],
|
|
239
|
+
requiredOrdering: undefined,
|
|
240
|
+
limit: undefined,
|
|
241
|
+
estimatedRows: tableRef.estimatedRows ?? context.stats.tableRows(tableSchema) ?? 1000
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
// Extract information based on node type
|
|
245
|
+
let residualPredicate: PlanNode | undefined;
|
|
246
|
+
|
|
247
|
+
if (node instanceof FilterNode) {
|
|
248
|
+
// Extract constraints from filter predicate
|
|
249
|
+
const tableInfo: TableInfo = createTableInfoFromNode(tableRef, tableSchema.name);
|
|
250
|
+
const normalizedPredicate = normalizePredicate(node.predicate);
|
|
251
|
+
const extraction = extractConstraints(normalizedPredicate, [tableInfo]);
|
|
252
|
+
|
|
253
|
+
if (extraction.allConstraints.length === 0) {
|
|
254
|
+
log('No extractable constraints from filter predicate');
|
|
255
|
+
return undefined;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
request.filters = extraction.allConstraints;
|
|
259
|
+
residualPredicate = extraction.residualPredicate;
|
|
260
|
+
log('Extracted %d constraints from Filter', extraction.allConstraints.length);
|
|
261
|
+
|
|
262
|
+
} else if (node.nodeType === PlanNodeType.Sort) {
|
|
263
|
+
// Extract ordering requirements from Sort node
|
|
264
|
+
const sort = node as unknown as SortNode;
|
|
265
|
+
const ordering = extractOrderingFromSortKeys(sort.getSortKeys(), sort.source.getAttributes());
|
|
266
|
+
if (!ordering) {
|
|
267
|
+
log('Sort node has non-trivial expressions; cannot translate to ordering spec');
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
request.requiredOrdering = ordering.map(o => ({ columnIndex: o.column, desc: o.desc }));
|
|
271
|
+
log('Extracted ordering requirement of length %d', request.requiredOrdering.length);
|
|
272
|
+
|
|
273
|
+
} else if (node.nodeType === PlanNodeType.LimitOffset) {
|
|
274
|
+
// Extract limit from LimitOffset node when constant
|
|
275
|
+
const lim = node as unknown as LimitOffsetNode;
|
|
276
|
+
if (lim.limit && lim.limit.nodeType === _PlanNodeType.Literal) {
|
|
277
|
+
const limitVal = (lim.limit as unknown as LiteralNode).expression.value;
|
|
278
|
+
if (typeof limitVal === 'number') {
|
|
279
|
+
request.limit = Math.max(0, Math.floor(limitVal));
|
|
280
|
+
log('Extracted limit value: %d', request.limit);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// We ignore OFFSET for now (modules can implement it internally if desired)
|
|
284
|
+
if (!request.limit) {
|
|
285
|
+
log('No usable constant LIMIT found');
|
|
286
|
+
return undefined;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
} else {
|
|
290
|
+
log('Node type %s not supported by index-style fallback', node.nodeType);
|
|
291
|
+
return undefined;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
log('Built access plan request: %d filters, ordering: %s, limit: %s',
|
|
295
|
+
request.filters.length,
|
|
296
|
+
request.requiredOrdering ? 'yes' : 'no',
|
|
297
|
+
request.limit ?? 'none');
|
|
298
|
+
|
|
299
|
+
// Get access plan from module
|
|
300
|
+
const accessPlan = vtabModule.getBestAccessPlan!(context.db, tableSchema, request);
|
|
301
|
+
|
|
302
|
+
// Check if the plan is beneficial
|
|
303
|
+
const handlesAnyFilter = request.filters.length > 0 &&
|
|
304
|
+
accessPlan.handledFilters.some(handled => handled);
|
|
305
|
+
const providesOrdering = request.requiredOrdering &&
|
|
306
|
+
accessPlan.providesOrdering;
|
|
307
|
+
|
|
308
|
+
// Calculate baseline cost
|
|
309
|
+
const estimatedRows = request.estimatedRows ?? 1000;
|
|
310
|
+
const seqCost = seqScanCost(estimatedRows);
|
|
311
|
+
|
|
312
|
+
// Accept the plan if it handles filters OR provides required ordering
|
|
313
|
+
if (!handlesAnyFilter && !providesOrdering) {
|
|
314
|
+
log('Access plan provides no benefit');
|
|
315
|
+
return undefined;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
if (accessPlan.cost >= seqCost && !providesOrdering) {
|
|
319
|
+
log('Access plan cost (%d) not better than sequential scan (%d)', accessPlan.cost, seqCost);
|
|
320
|
+
return undefined;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
log('Index-style fallback beneficial: cost %d vs %d seq scan', accessPlan.cost, seqCost);
|
|
324
|
+
|
|
325
|
+
// Store context for later use in ruleSelectAccessPath
|
|
326
|
+
const indexCtx: IndexStyleContext = {
|
|
327
|
+
kind: 'index-style',
|
|
328
|
+
accessPlan,
|
|
329
|
+
residualPredicate,
|
|
330
|
+
originalConstraints: [...request.filters] // Copy to satisfy mutable type
|
|
331
|
+
};
|
|
332
|
+
|
|
333
|
+
return {
|
|
334
|
+
cost: accessPlan.cost,
|
|
335
|
+
ctx: indexCtx
|
|
336
|
+
};
|
|
337
|
+
}
|
|
@@ -37,6 +37,14 @@ export class RegisteredScope implements Scope {
|
|
|
37
37
|
this.registeredSymbols.set(lowerSymbolKey, getReference);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
subscribeFactory(symbolKey: string, factory: ReferenceCallback): void {
|
|
41
|
+
const lower = symbolKey.toLowerCase();
|
|
42
|
+
if (this.registeredSymbols.has(lower)) {
|
|
43
|
+
throw new QuereusError(`Symbol '${lower}' already exists in the same scope.`, StatusCode.ERROR);
|
|
44
|
+
}
|
|
45
|
+
this.registeredSymbols.set(lower, factory);
|
|
46
|
+
}
|
|
47
|
+
|
|
40
48
|
resolveSymbol(symbolKey: string, expression: AST.Expression): PlanNode | typeof Ambiguous | undefined {
|
|
41
49
|
const reference = this.registeredSymbols.get(symbolKey.toLowerCase());
|
|
42
50
|
if (reference) {
|
|
@@ -133,76 +133,11 @@ export class NaiveStatsProvider implements StatsProvider {
|
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
-
/**
|
|
137
|
-
* Statistics provider that delegates to virtual table modules
|
|
138
|
-
* Allows VTab modules to provide their own statistics
|
|
139
|
-
*/
|
|
140
|
-
export class VTabStatsProvider implements StatsProvider {
|
|
141
|
-
constructor(
|
|
142
|
-
private readonly fallback: StatsProvider = new NaiveStatsProvider()
|
|
143
|
-
) {
|
|
144
|
-
log('Created VTab stats provider with fallback');
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
tableRows(table: TableSchema): number | undefined {
|
|
148
|
-
// Try to get stats from VTab module if it supports it
|
|
149
|
-
if (table.vtabModule && typeof table.vtabModule === 'object' && 'getTableStats' in table.vtabModule) {
|
|
150
|
-
try {
|
|
151
|
-
const stats = (table.vtabModule as any).getTableStats?.(table);
|
|
152
|
-
if (stats?.rowCount !== undefined) {
|
|
153
|
-
log('Got row count from VTab module for %s: %d', table.name, stats.rowCount);
|
|
154
|
-
return stats.rowCount;
|
|
155
|
-
}
|
|
156
|
-
} catch (error) {
|
|
157
|
-
log('Error getting VTab stats for %s: %s', table.name, error);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// Fall back to default provider
|
|
162
|
-
return this.fallback.tableRows(table);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
selectivity(table: TableSchema, predicate: ScalarPlanNode): number | undefined {
|
|
166
|
-
// Try VTab module selectivity
|
|
167
|
-
if (table.vtabModule && typeof table.vtabModule === 'object' && 'getSelectivity' in table.vtabModule) {
|
|
168
|
-
try {
|
|
169
|
-
const selectivity = (table.vtabModule as any).getSelectivity?.(table, predicate);
|
|
170
|
-
if (selectivity !== undefined) {
|
|
171
|
-
log('Got selectivity from VTab module for %s: %f', table.name, selectivity);
|
|
172
|
-
return selectivity;
|
|
173
|
-
}
|
|
174
|
-
} catch (error) {
|
|
175
|
-
log('Error getting VTab selectivity for %s: %s', table.name, error);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// Fall back to default provider
|
|
180
|
-
return this.fallback.selectivity(table, predicate);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
joinSelectivity(leftTable: TableSchema, rightTable: TableSchema, joinCondition: ScalarPlanNode): number | undefined {
|
|
184
|
-
return this.fallback.joinSelectivity?.(leftTable, rightTable, joinCondition);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
distinctValues(table: TableSchema, columnName: string): number | undefined {
|
|
188
|
-
return this.fallback.distinctValues?.(table, columnName);
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
indexSelectivity(table: TableSchema, indexName: string, predicate: ScalarPlanNode): number | undefined {
|
|
192
|
-
return this.fallback.indexSelectivity?.(table, indexName, predicate);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
|
|
196
136
|
/**
|
|
197
137
|
* Default statistics provider instance
|
|
198
138
|
*/
|
|
199
139
|
export const defaultStatsProvider = new NaiveStatsProvider();
|
|
200
140
|
|
|
201
|
-
/**
|
|
202
|
-
* VTab-aware statistics provider instance
|
|
203
|
-
*/
|
|
204
|
-
export const vtabStatsProvider = new VTabStatsProvider();
|
|
205
|
-
|
|
206
141
|
/**
|
|
207
142
|
* Create a custom statistics provider
|
|
208
143
|
*/
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { ColRef } from '../../common/datatype.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Project unique keys through a projection mapping.
|
|
5
|
+
* - sourceKeys: keys defined on the source relation (arrays of column refs by source column index)
|
|
6
|
+
* - projectionMap: mapping from source column index -> projected column index
|
|
7
|
+
* Returns keys that survive projection (all columns present), with indices remapped to output.
|
|
8
|
+
*/
|
|
9
|
+
export function projectKeys(sourceKeys: ReadonlyArray<ReadonlyArray<ColRef>>, projectionMap: ReadonlyMap<number, number>): ColRef[][] {
|
|
10
|
+
const result: ColRef[][] = [];
|
|
11
|
+
for (const key of sourceKeys) {
|
|
12
|
+
const projected: ColRef[] = [];
|
|
13
|
+
let missing = false;
|
|
14
|
+
for (const col of key) {
|
|
15
|
+
const projectedIndex = projectionMap.get(col.index);
|
|
16
|
+
if (projectedIndex === undefined) {
|
|
17
|
+
missing = true;
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
projected.push({ index: projectedIndex, desc: col.desc });
|
|
21
|
+
}
|
|
22
|
+
if (!missing) {
|
|
23
|
+
result.push(projected);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Combine unique keys across a join.
|
|
31
|
+
* - For inner/cross joins: keys from left and right are preserved; right indices are shifted by left column count.
|
|
32
|
+
* - For outer joins: return [] conservatively (null padding may break uniqueness).
|
|
33
|
+
*/
|
|
34
|
+
export function combineJoinKeys(leftKeys: ReadonlyArray<ReadonlyArray<ColRef>>, rightKeys: ReadonlyArray<ReadonlyArray<ColRef>>, joinType: 'inner' | 'left' | 'right' | 'full' | 'cross', leftColumnCount: number): ColRef[][] {
|
|
35
|
+
if (joinType !== 'inner' && joinType !== 'cross') return [];
|
|
36
|
+
const result: ColRef[][] = [];
|
|
37
|
+
for (const key of leftKeys) {
|
|
38
|
+
result.push(key.map(c => ({ index: c.index, desc: c.desc })));
|
|
39
|
+
}
|
|
40
|
+
for (const key of rightKeys) {
|
|
41
|
+
result.push(key.map(c => ({ index: c.index + leftColumnCount, desc: c.desc })));
|
|
42
|
+
}
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
@@ -8,6 +8,7 @@ import { PlanNodeType } from '../nodes/plan-node-type.js';
|
|
|
8
8
|
import { QuereusError } from '../../common/errors.js';
|
|
9
9
|
import { StatusCode } from '../../common/types.js';
|
|
10
10
|
import { validateLog } from '../debug/logger-utils.js';
|
|
11
|
+
import type { ColumnReferenceNode } from '../nodes/reference.js';
|
|
11
12
|
|
|
12
13
|
const log = validateLog();
|
|
13
14
|
|
|
@@ -105,7 +106,7 @@ function validateNode(node: PlanNode, context: ValidationContext, path: string[]
|
|
|
105
106
|
|
|
106
107
|
// 4. Validate column references point to valid attributes
|
|
107
108
|
if (node.nodeType === PlanNodeType.ColumnReference) {
|
|
108
|
-
validateColumnReference(node as
|
|
109
|
+
validateColumnReference(node as ColumnReferenceNode, context, nodePath);
|
|
109
110
|
}
|
|
110
111
|
|
|
111
112
|
// 5. Recursively validate children
|
|
@@ -183,6 +184,7 @@ function validatePhysicalNodeType(node: PlanNode, nodePath: string): void {
|
|
|
183
184
|
// Node types that should NOT appear in a fully optimized physical tree
|
|
184
185
|
const logicalOnlyTypes = new Set([
|
|
185
186
|
PlanNodeType.Aggregate, // Should be StreamAggregate or HashAggregate
|
|
187
|
+
PlanNodeType.Retrieve, // Must be rewritten to a physical access node
|
|
186
188
|
// Add other logical-only types here as needed
|
|
187
189
|
]);
|
|
188
190
|
|
|
@@ -248,7 +250,7 @@ function validateRelationalNode(node: RelationalPlanNode, context: ValidationCon
|
|
|
248
250
|
/**
|
|
249
251
|
* Validate column references point to valid attributes
|
|
250
252
|
*/
|
|
251
|
-
function validateColumnReference(node:
|
|
253
|
+
function validateColumnReference(node: ColumnReferenceNode, context: ValidationContext, nodePath: string): void {
|
|
252
254
|
if (!context.options.validateAttributes) {
|
|
253
255
|
return;
|
|
254
256
|
}
|
|
@@ -272,7 +274,7 @@ function validateColumnReference(node: any, context: ValidationContext, nodePath
|
|
|
272
274
|
/**
|
|
273
275
|
* Validate ordering specification
|
|
274
276
|
*/
|
|
275
|
-
function validateOrdering(ordering:
|
|
277
|
+
function validateOrdering(ordering: { column: number; desc: boolean }[], columnCount: number, nodePath: string): void {
|
|
276
278
|
for (let i = 0; i < ordering.length; i++) {
|
|
277
279
|
const orderSpec = ordering[i];
|
|
278
280
|
|