@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,73 @@
|
|
|
1
|
+
import type { RelationType } from '../../common/datatype.js';
|
|
2
|
+
import { PlanNode, type RelationalPlanNode, type Attribute, type UnaryRelationalNode } from './plan-node.js';
|
|
3
|
+
import { PlanNodeType } from './plan-node-type.js';
|
|
4
|
+
import type { Scope } from '../scopes/scope.js';
|
|
5
|
+
import type { TableReferenceNode } from './reference.js';
|
|
6
|
+
import type { AnyVirtualTableModule } from '../../vtab/module.js';
|
|
7
|
+
import { Cached } from '../../util/cached.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* RemoteQueryNode represents a physical node for executing a pushed-down
|
|
11
|
+
* query pipeline in a virtual table module that supports arbitrary queries.
|
|
12
|
+
*/
|
|
13
|
+
export class RemoteQueryNode extends PlanNode implements UnaryRelationalNode {
|
|
14
|
+
override readonly nodeType = PlanNodeType.RemoteQuery;
|
|
15
|
+
|
|
16
|
+
private typeCache: Cached<RelationType>;
|
|
17
|
+
|
|
18
|
+
constructor(
|
|
19
|
+
scope: Scope,
|
|
20
|
+
/** The pipeline of operations the virtual table module will execute */
|
|
21
|
+
public readonly source: RelationalPlanNode,
|
|
22
|
+
/** The table reference at the leaf of the pipeline */
|
|
23
|
+
public readonly tableRef: TableReferenceNode,
|
|
24
|
+
/** Optional context data from the module's supports() assessment */
|
|
25
|
+
public readonly moduleCtx?: unknown
|
|
26
|
+
) {
|
|
27
|
+
super(scope, source.getTotalCost());
|
|
28
|
+
this.typeCache = new Cached(() => this.source.getType());
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
override getChildren(): readonly PlanNode[] {
|
|
32
|
+
return [this.source];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
override withChildren(newChildren: readonly PlanNode[]): RemoteQueryNode {
|
|
36
|
+
if (newChildren.length !== 1) {
|
|
37
|
+
throw new Error('RemoteQueryNode requires exactly one child');
|
|
38
|
+
}
|
|
39
|
+
const newSource = newChildren[0] as RelationalPlanNode;
|
|
40
|
+
return new RemoteQueryNode(this.scope, newSource, this.tableRef, this.moduleCtx);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
getType(): RelationType {
|
|
44
|
+
return this.typeCache.value;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
getAttributes(): readonly Attribute[] {
|
|
48
|
+
return this.source.getAttributes();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
getRelations(): readonly [RelationalPlanNode] {
|
|
52
|
+
return [this.source];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Get the virtual table module for this remote query node */
|
|
56
|
+
get vtabModule(): AnyVirtualTableModule {
|
|
57
|
+
return this.tableRef.vtabModule;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
override toString(): string {
|
|
61
|
+
if (this.source === this.tableRef) {
|
|
62
|
+
return `REMOTE QUERY ${this.tableRef.tableSchema.name}`;
|
|
63
|
+
}
|
|
64
|
+
return `REMOTE QUERY pipeline over ${this.tableRef.tableSchema.name}`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
getLogicalProperties(): Record<string, unknown> {
|
|
68
|
+
return {
|
|
69
|
+
table: this.tableRef.tableSchema.name,
|
|
70
|
+
moduleContext: this.moduleCtx,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { RelationType } from '../../common/datatype.js';
|
|
2
|
+
import { PlanNode, type RelationalPlanNode, type Attribute, type UnaryRelationalNode, ScalarPlanNode } from './plan-node.js';
|
|
3
|
+
import { PlanNodeType } from './plan-node-type.js';
|
|
4
|
+
import type { Scope } from '../scopes/scope.js';
|
|
5
|
+
import type { TableReferenceNode } from './reference.js';
|
|
6
|
+
import type { AnyVirtualTableModule } from '../../vtab/module.js';
|
|
7
|
+
import { Cached } from '../../util/cached.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* RetrieveNode represents the boundary between virtual table module execution and Quereus execution.
|
|
11
|
+
* It wraps a (source) pipeline of logical operators that will be pushed down to the virtual table module for execution.
|
|
12
|
+
*
|
|
13
|
+
* The pipeline always ends with a TableReferenceNode as the leaf, and may contain additional operators (Filter, Project, etc.)
|
|
14
|
+
* that the module indicated via its supports() method that it can handle.
|
|
15
|
+
*/
|
|
16
|
+
export class RetrieveNode extends PlanNode implements UnaryRelationalNode {
|
|
17
|
+
override readonly nodeType = PlanNodeType.Retrieve;
|
|
18
|
+
|
|
19
|
+
private typeCache: Cached<RelationType>;
|
|
20
|
+
|
|
21
|
+
constructor(
|
|
22
|
+
scope: Scope,
|
|
23
|
+
/** The pipeline of operations the virtual table module will execute */
|
|
24
|
+
public readonly source: RelationalPlanNode,
|
|
25
|
+
/** The table reference at the leaf of the pipeline */
|
|
26
|
+
public readonly tableRef: TableReferenceNode,
|
|
27
|
+
/** Optional context data from the module's supports() assessment */
|
|
28
|
+
public readonly moduleCtx?: unknown,
|
|
29
|
+
/** Captured binding expressions used by the enveloped pipeline (params/correlated) */
|
|
30
|
+
public readonly bindings?: ReadonlyArray<ScalarPlanNode>
|
|
31
|
+
) {
|
|
32
|
+
super(scope, source.getTotalCost());
|
|
33
|
+
this.typeCache = new Cached(() => this.source.getType());
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
override getChildren(): readonly PlanNode[] {
|
|
37
|
+
return [this.source];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
override withChildren(newChildren: readonly PlanNode[]): RetrieveNode {
|
|
41
|
+
if (newChildren.length !== 1) {
|
|
42
|
+
throw new Error('RetrieveNode requires exactly one child');
|
|
43
|
+
}
|
|
44
|
+
const newSource = newChildren[0] as RelationalPlanNode;
|
|
45
|
+
return new RetrieveNode(this.scope, newSource, this.tableRef, this.moduleCtx, this.bindings);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
getType(): RelationType {
|
|
49
|
+
return this.typeCache.value;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
getAttributes(): readonly Attribute[] {
|
|
53
|
+
return this.source.getAttributes();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
getRelations(): readonly [RelationalPlanNode] {
|
|
57
|
+
return [this.source];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Get the virtual table module for this retrieve node */
|
|
61
|
+
get vtabModule(): AnyVirtualTableModule {
|
|
62
|
+
return this.tableRef.vtabModule;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Create a new RetrieveNode with updated source pipeline and module context */
|
|
66
|
+
withPipeline(newSource: RelationalPlanNode, newModuleCtx?: unknown, newBindings?: ReadonlyArray<ScalarPlanNode>): RetrieveNode {
|
|
67
|
+
return new RetrieveNode(this.scope, newSource, this.tableRef, newModuleCtx, newBindings ?? this.bindings);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
override toString(): string {
|
|
71
|
+
if (this.source === this.tableRef) {
|
|
72
|
+
return `RETRIEVE ${this.tableRef.tableSchema.name}`;
|
|
73
|
+
}
|
|
74
|
+
return `RETRIEVE pipeline over ${this.tableRef.tableSchema.name}`;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
override getLogicalAttributes(): Record<string, unknown> {
|
|
78
|
+
const bindingNodeTypes = (this.bindings ?? []).map(b => b.nodeType);
|
|
79
|
+
return {
|
|
80
|
+
table: this.tableRef.tableSchema.name,
|
|
81
|
+
moduleContext: this.moduleCtx,
|
|
82
|
+
bindingsCount: bindingNodeTypes.length,
|
|
83
|
+
bindingsNodeTypes: bindingNodeTypes,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type { Scope } from '../scopes/scope.js';
|
|
2
|
-
import { PlanNode, type RelationalPlanNode, type Attribute, isRelationalNode } from './plan-node.js';
|
|
2
|
+
import { PlanNode, type RelationalPlanNode, type Attribute, isRelationalNode, type PhysicalProperties } from './plan-node.js';
|
|
3
3
|
import { PlanNodeType } from './plan-node-type.js';
|
|
4
4
|
import type { ScalarPlanNode } from './plan-node.js';
|
|
5
5
|
import type { RelationType } from '../../common/datatype.js';
|
|
6
6
|
import { ColumnReferenceNode } from './reference.js';
|
|
7
7
|
import { expressionToString } from '../../util/ast-stringify.js';
|
|
8
8
|
import { Cached } from '../../util/cached.js';
|
|
9
|
+
import { projectKeys } from '../util/key-utils.js';
|
|
9
10
|
|
|
10
11
|
export interface ReturningProjection {
|
|
11
12
|
node: ScalarPlanNode;
|
|
@@ -22,14 +23,14 @@ export class ReturningNode extends PlanNode implements RelationalPlanNode {
|
|
|
22
23
|
override readonly nodeType = PlanNodeType.Returning;
|
|
23
24
|
|
|
24
25
|
private outputTypeCache: Cached<RelationType>;
|
|
25
|
-
private attributesCache: Cached<Attribute[]>;
|
|
26
|
+
private attributesCache: Cached<readonly Attribute[]>;
|
|
26
27
|
|
|
27
28
|
constructor(
|
|
28
29
|
scope: Scope,
|
|
29
30
|
public readonly executor: RelationalPlanNode, // The DML operation that yields affected rows
|
|
30
31
|
public readonly projections: ReadonlyArray<ReturningProjection>,
|
|
31
32
|
/** Optional predefined attributes for preserving IDs during optimization */
|
|
32
|
-
predefinedAttributes?: Attribute[]
|
|
33
|
+
predefinedAttributes?: readonly Attribute[]
|
|
33
34
|
) {
|
|
34
35
|
super(scope);
|
|
35
36
|
|
|
@@ -90,17 +91,28 @@ export class ReturningNode extends PlanNode implements RelationalPlanNode {
|
|
|
90
91
|
};
|
|
91
92
|
});
|
|
92
93
|
|
|
94
|
+
// Logical key propagation via simple column references
|
|
95
|
+
const execType = this.executor.getType();
|
|
96
|
+
const execAttrs = this.executor.getAttributes();
|
|
97
|
+
const srcToOut = new Map<number, number>();
|
|
98
|
+
this.projections.forEach((proj, outIdx) => {
|
|
99
|
+
if (proj.node instanceof ColumnReferenceNode) {
|
|
100
|
+
const srcIndex = execAttrs.findIndex(a => a.id === (proj.node as ColumnReferenceNode).attributeId);
|
|
101
|
+
if (srcIndex >= 0) srcToOut.set(srcIndex, outIdx);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
|
|
93
105
|
return {
|
|
94
106
|
typeClass: 'relation',
|
|
95
107
|
columns,
|
|
96
|
-
isSet:
|
|
108
|
+
isSet: execType.isSet,
|
|
97
109
|
isReadOnly: false,
|
|
98
|
-
keys:
|
|
99
|
-
rowConstraints: [],
|
|
110
|
+
keys: projectKeys(execType.keys, srcToOut),
|
|
111
|
+
rowConstraints: [],
|
|
100
112
|
};
|
|
101
113
|
}
|
|
102
114
|
|
|
103
|
-
private buildAttributes(): Attribute[] {
|
|
115
|
+
private buildAttributes(): readonly Attribute[] {
|
|
104
116
|
// Create attributes for the projected columns
|
|
105
117
|
// Get the computed column names from the type
|
|
106
118
|
const outputType = this.getType();
|
|
@@ -141,9 +153,9 @@ export class ReturningNode extends PlanNode implements RelationalPlanNode {
|
|
|
141
153
|
return this.outputTypeCache.value;
|
|
142
154
|
}
|
|
143
155
|
|
|
144
|
-
getAttributes(): Attribute[] {
|
|
145
|
-
|
|
146
|
-
|
|
156
|
+
getAttributes(): readonly Attribute[] {
|
|
157
|
+
return this.attributesCache.value;
|
|
158
|
+
}
|
|
147
159
|
|
|
148
160
|
getRelations(): readonly RelationalPlanNode[] {
|
|
149
161
|
// Return the executor which is now a RelationalPlanNode
|
|
@@ -207,6 +219,36 @@ export class ReturningNode extends PlanNode implements RelationalPlanNode {
|
|
|
207
219
|
return this.executor.estimatedRows;
|
|
208
220
|
}
|
|
209
221
|
|
|
222
|
+
computePhysical(childrenPhysical: PhysicalProperties[]): Partial<PhysicalProperties> {
|
|
223
|
+
const sourcePhysical = childrenPhysical[0];
|
|
224
|
+
const execAttrs = this.executor.getAttributes();
|
|
225
|
+
const map = new Map<number, number>();
|
|
226
|
+
this.projections.forEach((proj, outIdx) => {
|
|
227
|
+
if (proj.node instanceof ColumnReferenceNode) {
|
|
228
|
+
const srcIndex = execAttrs.findIndex(a => a.id === (proj.node as ColumnReferenceNode).attributeId);
|
|
229
|
+
if (srcIndex >= 0) map.set(srcIndex, outIdx);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
const uniqueKeys = (sourcePhysical?.uniqueKeys || [])
|
|
234
|
+
.map(key => {
|
|
235
|
+
const projected: number[] = [];
|
|
236
|
+
for (const col of key) {
|
|
237
|
+
const outIdx = map.get(col);
|
|
238
|
+
if (outIdx === undefined) return null;
|
|
239
|
+
projected.push(outIdx);
|
|
240
|
+
}
|
|
241
|
+
return projected;
|
|
242
|
+
})
|
|
243
|
+
.filter((k): k is number[] => k !== null);
|
|
244
|
+
|
|
245
|
+
return {
|
|
246
|
+
estimatedRows: this.estimatedRows,
|
|
247
|
+
ordering: sourcePhysical?.ordering,
|
|
248
|
+
uniqueKeys,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
|
|
210
252
|
override toString(): string {
|
|
211
253
|
const projList = this.projections.length > 3
|
|
212
254
|
? `${this.projections.length} columns`
|
|
@@ -50,7 +50,7 @@ export class SequencingNode extends PlanNode implements UnaryRelationalNode {
|
|
|
50
50
|
columns: [...sourceType.columns, sequenceColumn],
|
|
51
51
|
keys: [allColumnsKey], // All columns including sequence form a unique key
|
|
52
52
|
rowConstraints: sourceType.rowConstraints,
|
|
53
|
-
}
|
|
53
|
+
} satisfies RelationType;
|
|
54
54
|
});
|
|
55
55
|
}
|
|
56
56
|
|
|
@@ -58,7 +58,7 @@ export class SequencingNode extends PlanNode implements UnaryRelationalNode {
|
|
|
58
58
|
return this.outputTypeCache.value;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
getAttributes(): Attribute[] {
|
|
61
|
+
getAttributes(): readonly Attribute[] {
|
|
62
62
|
// Sort preserves the same attributes as its source
|
|
63
63
|
return this.source.getAttributes();
|
|
64
64
|
}
|
|
@@ -9,7 +9,7 @@ import { StatusCode } from '../../common/types.js';
|
|
|
9
9
|
|
|
10
10
|
export class SetOperationNode extends PlanNode implements BinaryRelationalNode {
|
|
11
11
|
readonly nodeType = PlanNodeType.SetOperation;
|
|
12
|
-
private attributesCache: Cached<Attribute[]>;
|
|
12
|
+
private attributesCache: Cached<readonly Attribute[]>;
|
|
13
13
|
|
|
14
14
|
constructor(
|
|
15
15
|
scope: Scope,
|
|
@@ -28,14 +28,14 @@ export class SetOperationNode extends PlanNode implements BinaryRelationalNode {
|
|
|
28
28
|
this.attributesCache = new Cached(() => this.buildAttributes());
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
private buildAttributes(): Attribute[] {
|
|
31
|
+
private buildAttributes(): readonly Attribute[] {
|
|
32
32
|
const leftAttrs = this.left.getAttributes();
|
|
33
33
|
// Preserve left child's attributes directly to avoid any mapping issues
|
|
34
34
|
// This ensures ORDER BY expressions can resolve to the same attribute IDs
|
|
35
35
|
return leftAttrs;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
getAttributes(): Attribute[] {
|
|
38
|
+
getAttributes(): readonly Attribute[] {
|
|
39
39
|
return this.attributesCache.value;
|
|
40
40
|
}
|
|
41
41
|
|
|
@@ -6,6 +6,7 @@ import { formatSortKey } from '../../util/plan-formatter.js';
|
|
|
6
6
|
import { quereusError } from '../../common/errors.js';
|
|
7
7
|
import { StatusCode } from '../../common/types.js';
|
|
8
8
|
import { extractOrderingFromSortKeys } from '../framework/physical-utils.js';
|
|
9
|
+
import { SortCapable } from '../framework/characteristics.js';
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* Represents a sort key for ordering results
|
|
@@ -25,7 +26,7 @@ export interface SortKey {
|
|
|
25
26
|
* and outputs rows sorted according to the keys.
|
|
26
27
|
* This is a physical operation that materializes and sorts rows.
|
|
27
28
|
*/
|
|
28
|
-
export class SortNode extends PlanNode implements UnaryRelationalNode {
|
|
29
|
+
export class SortNode extends PlanNode implements UnaryRelationalNode, SortCapable {
|
|
29
30
|
override readonly nodeType = PlanNodeType.Sort;
|
|
30
31
|
|
|
31
32
|
constructor(
|
|
@@ -48,7 +49,7 @@ export class SortNode extends PlanNode implements UnaryRelationalNode {
|
|
|
48
49
|
return this.source.getType();
|
|
49
50
|
}
|
|
50
51
|
|
|
51
|
-
getAttributes(): Attribute[] {
|
|
52
|
+
getAttributes(): readonly Attribute[] {
|
|
52
53
|
// Sort preserves the same attributes as its source
|
|
53
54
|
return this.source.getAttributes();
|
|
54
55
|
}
|
|
@@ -76,9 +77,7 @@ export class SortNode extends PlanNode implements UnaryRelationalNode {
|
|
|
76
77
|
|
|
77
78
|
return {
|
|
78
79
|
estimatedRows: this.estimatedRows,
|
|
79
|
-
// Only set ordering if we can extract it from trivial column references
|
|
80
80
|
ordering,
|
|
81
|
-
// Preserve unique keys from source
|
|
82
81
|
uniqueKeys: sourcePhysical?.uniqueKeys,
|
|
83
82
|
};
|
|
84
83
|
}
|
|
@@ -134,4 +133,34 @@ export class SortNode extends PlanNode implements UnaryRelationalNode {
|
|
|
134
133
|
newSortKeys
|
|
135
134
|
);
|
|
136
135
|
}
|
|
136
|
+
|
|
137
|
+
// SortCapable interface implementation
|
|
138
|
+
getSortKeys(): readonly { expression: ScalarPlanNode; direction: 'asc' | 'desc' }[] {
|
|
139
|
+
return this.sortKeys.map(key => ({
|
|
140
|
+
expression: key.expression,
|
|
141
|
+
direction: key.direction
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
withSortKeys(keys: readonly { expression: ScalarPlanNode; direction: 'asc' | 'desc' }[]): PlanNode {
|
|
146
|
+
// Convert to internal SortKey format with nulls handling
|
|
147
|
+
const newSortKeys = keys.map(key => ({
|
|
148
|
+
expression: key.expression,
|
|
149
|
+
direction: key.direction,
|
|
150
|
+
nulls: undefined as 'first' | 'last' | undefined
|
|
151
|
+
}));
|
|
152
|
+
|
|
153
|
+
// Check if anything changed
|
|
154
|
+
const changed = newSortKeys.length !== this.sortKeys.length ||
|
|
155
|
+
newSortKeys.some((key, i) =>
|
|
156
|
+
key.expression !== this.sortKeys[i].expression ||
|
|
157
|
+
key.direction !== this.sortKeys[i].direction
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
if (!changed) {
|
|
161
|
+
return this;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return new SortNode(this.scope, this.source, newSortKeys);
|
|
165
|
+
}
|
|
137
166
|
}
|
|
@@ -6,6 +6,7 @@ import { Cached } from '../../util/cached.js';
|
|
|
6
6
|
import { formatExpressionList } from '../../util/plan-formatter.js';
|
|
7
7
|
import { quereusError } from '../../common/errors.js';
|
|
8
8
|
import { StatusCode } from '../../common/types.js';
|
|
9
|
+
import type { ColumnReferenceNode } from './reference.js';
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* Physical node representing a streaming aggregate operation.
|
|
@@ -86,7 +87,7 @@ export class StreamAggregateNode extends PlanNode implements UnaryRelationalNode
|
|
|
86
87
|
private getGroupByColumnName(expr: ScalarPlanNode, index: number): string {
|
|
87
88
|
// If it's a column reference, use the column name
|
|
88
89
|
if (expr.nodeType === PlanNodeType.ColumnReference) {
|
|
89
|
-
const colRef = expr as
|
|
90
|
+
const colRef = expr as ColumnReferenceNode;
|
|
90
91
|
return colRef.expression.name;
|
|
91
92
|
}
|
|
92
93
|
// Otherwise, use a generic name
|
|
@@ -243,6 +244,9 @@ export class StreamAggregateNode extends PlanNode implements UnaryRelationalNode
|
|
|
243
244
|
}));
|
|
244
245
|
}
|
|
245
246
|
|
|
247
|
+
// Expose logical unique keys: group-by columns (0..groupCount-1) or [[]] for global aggregate
|
|
248
|
+
const groupCount = this.groupBy.length;
|
|
249
|
+
(props as any).uniqueKeys = groupCount > 0 ? [Array.from({ length: groupCount }, (_, i) => i)] : [[]];
|
|
246
250
|
return props;
|
|
247
251
|
}
|
|
248
252
|
|
|
@@ -11,12 +11,13 @@ import type { Scope } from '../scopes/scope.js';
|
|
|
11
11
|
import { Cached } from '../../util/cached.js';
|
|
12
12
|
import type { FilterInfo } from '../../vtab/filter-info.js';
|
|
13
13
|
import type { ScalarPlanNode } from './plan-node.js';
|
|
14
|
+
import { TableAccessCapable } from '../framework/characteristics.js';
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* Base class for physical table access operations
|
|
17
18
|
* Provides common functionality for sequential scan, index scan, and index seek
|
|
18
19
|
*/
|
|
19
|
-
export abstract class TableAccessNode extends PlanNode implements UnaryRelationalNode {
|
|
20
|
+
export abstract class TableAccessNode extends PlanNode implements UnaryRelationalNode, TableAccessCapable {
|
|
20
21
|
private attributesCache: Cached<Attribute[]>;
|
|
21
22
|
private outputType: Cached<RelationType>;
|
|
22
23
|
|
|
@@ -48,6 +49,13 @@ export abstract class TableAccessNode extends PlanNode implements UnaryRelationa
|
|
|
48
49
|
return [this.source];
|
|
49
50
|
}
|
|
50
51
|
|
|
52
|
+
// TableAccessCapable interface implementation
|
|
53
|
+
get tableSchema() {
|
|
54
|
+
return this.source.tableSchema;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
abstract getAccessMethod(): 'sequential' | 'index-scan' | 'index-seek' | 'virtual';
|
|
58
|
+
|
|
51
59
|
withChildren(newChildren: readonly PlanNode[]): PlanNode {
|
|
52
60
|
if (newChildren.length !== 1) {
|
|
53
61
|
throw new Error(`${this.nodeType} expects 1 child, got ${newChildren.length}`);
|
|
@@ -73,7 +81,7 @@ export abstract class TableAccessNode extends PlanNode implements UnaryRelationa
|
|
|
73
81
|
return {
|
|
74
82
|
table: this.source.tableSchema.name,
|
|
75
83
|
schema: this.source.tableSchema.schemaName,
|
|
76
|
-
accessMethod: this.
|
|
84
|
+
accessMethod: this.getAccessMethod(),
|
|
77
85
|
filterInfo: {
|
|
78
86
|
usableIndex: this.filterInfo.indexInfoOutput.idxStr,
|
|
79
87
|
matchedClauses: this.filterInfo.indexInfoOutput.aConstraintUsage?.length || 0,
|
|
@@ -91,6 +99,10 @@ export abstract class TableAccessNode extends PlanNode implements UnaryRelationa
|
|
|
91
99
|
export class SeqScanNode extends TableAccessNode {
|
|
92
100
|
override readonly nodeType = PlanNodeType.SeqScan;
|
|
93
101
|
|
|
102
|
+
getAccessMethod(): 'sequential' {
|
|
103
|
+
return 'sequential';
|
|
104
|
+
}
|
|
105
|
+
|
|
94
106
|
computePhysical(): Partial<PhysicalProperties> {
|
|
95
107
|
return {
|
|
96
108
|
estimatedRows: this.source.estimatedRows,
|
|
@@ -148,6 +160,10 @@ export class IndexScanNode extends TableAccessNode {
|
|
|
148
160
|
super(scope, source, filterInfo, estimatedCostOverride);
|
|
149
161
|
}
|
|
150
162
|
|
|
163
|
+
getAccessMethod(): 'index-scan' {
|
|
164
|
+
return 'index-scan';
|
|
165
|
+
}
|
|
166
|
+
|
|
151
167
|
computePhysical(): Partial<PhysicalProperties> {
|
|
152
168
|
return {
|
|
153
169
|
estimatedRows: this.source.estimatedRows,
|
|
@@ -220,14 +236,23 @@ export class IndexSeekNode extends TableAccessNode {
|
|
|
220
236
|
super(scope, source, filterInfo, estimatedCostOverride);
|
|
221
237
|
}
|
|
222
238
|
|
|
239
|
+
getAccessMethod(): 'index-seek' {
|
|
240
|
+
return 'index-seek';
|
|
241
|
+
}
|
|
242
|
+
|
|
223
243
|
computePhysical(): Partial<PhysicalProperties> {
|
|
224
|
-
|
|
244
|
+
const base = {
|
|
225
245
|
uniqueKeys: this.source.getType().keys.map(key => key.map(colRef => colRef.index)),
|
|
226
|
-
// Index seeks can provide ordering and usually return few rows
|
|
227
246
|
ordering: this.providesOrdering,
|
|
228
|
-
// Seeks typically return much fewer rows than estimated
|
|
229
247
|
estimatedRows: Math.min(this.source.estimatedRows || 1000, 100)
|
|
230
|
-
}
|
|
248
|
+
} as Partial<PhysicalProperties>;
|
|
249
|
+
if (!this.isRange) {
|
|
250
|
+
const pk = this.source.tableSchema.primaryKeyDefinition ?? [];
|
|
251
|
+
if (pk.length > 0 && this.seekKeys.length >= pk.length) {
|
|
252
|
+
return { ...base, estimatedRows: 1, uniqueKeys: [[]] } as Partial<PhysicalProperties>;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return base;
|
|
231
256
|
}
|
|
232
257
|
|
|
233
258
|
override toString(): string {
|