@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
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import { PlanNodeType } from './plan-node-type.js';
|
|
2
|
-
import { PlanNode, type RelationalPlanNode, type ScalarPlanNode, type UnaryRelationalNode, type Attribute, isRelationalNode, isScalarNode } from './plan-node.js';
|
|
2
|
+
import { PlanNode, type RelationalPlanNode, type ScalarPlanNode, type UnaryRelationalNode, type Attribute, isRelationalNode, isScalarNode, type PhysicalProperties } from './plan-node.js';
|
|
3
3
|
import type { RelationType } from '../../common/datatype.js';
|
|
4
4
|
import type { Scope } from '../scopes/scope.js';
|
|
5
5
|
import { formatExpression } from '../../util/plan-formatter.js';
|
|
6
6
|
import { quereusError } from '../../common/errors.js';
|
|
7
7
|
import { StatusCode } from '../../common/types.js';
|
|
8
|
+
import { PredicateCapable, type PredicateSourceCapable } from '../framework/characteristics.js';
|
|
9
|
+
import { createTableInfoFromNode, extractConstraints } from '../analysis/constraint-extractor.js';
|
|
8
10
|
|
|
9
11
|
/**
|
|
10
12
|
* Represents a filter operation (WHERE clause).
|
|
11
13
|
* It takes an input relation and a predicate expression,
|
|
12
14
|
* and outputs rows for which the predicate is true.
|
|
13
15
|
*/
|
|
14
|
-
export class FilterNode extends PlanNode implements UnaryRelationalNode {
|
|
16
|
+
export class FilterNode extends PlanNode implements UnaryRelationalNode, PredicateCapable, PredicateSourceCapable {
|
|
15
17
|
override readonly nodeType = PlanNodeType.Filter;
|
|
16
18
|
|
|
17
19
|
constructor(
|
|
@@ -29,7 +31,7 @@ export class FilterNode extends PlanNode implements UnaryRelationalNode {
|
|
|
29
31
|
return this.source.getType();
|
|
30
32
|
}
|
|
31
33
|
|
|
32
|
-
getAttributes(): Attribute[] {
|
|
34
|
+
getAttributes(): readonly Attribute[] {
|
|
33
35
|
// Filter preserves the same attributes as its source
|
|
34
36
|
return this.source.getAttributes();
|
|
35
37
|
}
|
|
@@ -51,6 +53,34 @@ export class FilterNode extends PlanNode implements UnaryRelationalNode {
|
|
|
51
53
|
return sourceRows > 0 ? Math.max(1, Math.floor(sourceRows * 0.5)) : 0;
|
|
52
54
|
}
|
|
53
55
|
|
|
56
|
+
computePhysical(childrenPhysical: PhysicalProperties[]): Partial<PhysicalProperties> {
|
|
57
|
+
const sourcePhysical = childrenPhysical[0];
|
|
58
|
+
const srcRows = sourcePhysical?.estimatedRows;
|
|
59
|
+
const est = this.estimatedRows;
|
|
60
|
+
let rows = (typeof srcRows === 'number' && typeof est === 'number')
|
|
61
|
+
? Math.min(srcRows, est)
|
|
62
|
+
: (srcRows ?? est);
|
|
63
|
+
|
|
64
|
+
// Attempt logical covered-key detection to infer at-most-one row
|
|
65
|
+
let uniqueKeys = sourcePhysical?.uniqueKeys;
|
|
66
|
+
const tableInfo = createTableInfoFromNode(this.source);
|
|
67
|
+
if (tableInfo.uniqueKeys && tableInfo.uniqueKeys.length > 0) {
|
|
68
|
+
const result = extractConstraints(this.predicate, [tableInfo]);
|
|
69
|
+
const covered = result.coveredKeysByTable?.get(tableInfo.relationKey) || [];
|
|
70
|
+
if (covered.length > 0) {
|
|
71
|
+
// Equality covers a unique key → at most one row
|
|
72
|
+
uniqueKeys = [[]];
|
|
73
|
+
rows = 1;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
estimatedRows: rows,
|
|
79
|
+
ordering: sourcePhysical?.ordering,
|
|
80
|
+
uniqueKeys,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
54
84
|
override toString(): string {
|
|
55
85
|
return `WHERE ${formatExpression(this.predicate)}`;
|
|
56
86
|
}
|
|
@@ -88,4 +118,27 @@ export class FilterNode extends PlanNode implements UnaryRelationalNode {
|
|
|
88
118
|
newPredicate as ScalarPlanNode
|
|
89
119
|
);
|
|
90
120
|
}
|
|
121
|
+
|
|
122
|
+
// PredicateCapable interface implementation
|
|
123
|
+
getPredicate(): ScalarPlanNode | null {
|
|
124
|
+
return this.predicate;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
withPredicate(newPredicate: ScalarPlanNode | null): PlanNode {
|
|
128
|
+
if (newPredicate === null) {
|
|
129
|
+
// If predicate is null, return the source directly (no filter needed)
|
|
130
|
+
return this.source;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (newPredicate === this.predicate) {
|
|
134
|
+
return this;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return new FilterNode(this.scope, this.source, newPredicate);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// PredicateSourceCapable interface implementation
|
|
141
|
+
getPredicates(): readonly ScalarPlanNode[] {
|
|
142
|
+
return [this.predicate];
|
|
143
|
+
}
|
|
91
144
|
}
|
|
@@ -1,120 +1,126 @@
|
|
|
1
|
-
import type { Scope } from '../scopes/scope.js';
|
|
2
|
-
import { PlanNode, type RelationalPlanNode, type Attribute, type RowDescriptor, type PhysicalProperties, isRelationalNode } from './plan-node.js';
|
|
3
|
-
import { PlanNodeType } from './plan-node-type.js';
|
|
4
|
-
import type { TableReferenceNode } from './reference.js';
|
|
5
|
-
import type { ColumnDef, RelationType } from '../../common/datatype.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Represents an INSERT statement in the logical query plan.
|
|
9
|
-
* RelationalPlanNode because this node may be a return value of a SELECT node.
|
|
10
|
-
*/
|
|
11
|
-
export class InsertNode extends PlanNode implements RelationalPlanNode {
|
|
12
|
-
override readonly nodeType = PlanNodeType.Insert;
|
|
13
|
-
|
|
14
|
-
constructor(
|
|
15
|
-
scope: Scope,
|
|
16
|
-
public readonly table: TableReferenceNode,
|
|
17
|
-
public readonly targetColumns: ColumnDef[],
|
|
18
|
-
public readonly source: RelationalPlanNode, // Could be ValuesNode or output of a SELECT
|
|
19
|
-
public readonly flatRowDescriptor?: RowDescriptor, // For flat OLD/NEW row output
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
//
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
this.
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
return
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
1
|
+
import type { Scope } from '../scopes/scope.js';
|
|
2
|
+
import { PlanNode, type RelationalPlanNode, type ScalarPlanNode, type Attribute, type RowDescriptor, type PhysicalProperties, isRelationalNode } from './plan-node.js';
|
|
3
|
+
import { PlanNodeType } from './plan-node-type.js';
|
|
4
|
+
import type { TableReferenceNode } from './reference.js';
|
|
5
|
+
import type { ColumnDef, RelationType } from '../../common/datatype.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Represents an INSERT statement in the logical query plan.
|
|
9
|
+
* RelationalPlanNode because this node may be a return value of a SELECT node.
|
|
10
|
+
*/
|
|
11
|
+
export class InsertNode extends PlanNode implements RelationalPlanNode {
|
|
12
|
+
override readonly nodeType = PlanNodeType.Insert;
|
|
13
|
+
|
|
14
|
+
constructor(
|
|
15
|
+
scope: Scope,
|
|
16
|
+
public readonly table: TableReferenceNode,
|
|
17
|
+
public readonly targetColumns: ColumnDef[],
|
|
18
|
+
public readonly source: RelationalPlanNode, // Could be ValuesNode or output of a SELECT
|
|
19
|
+
public readonly flatRowDescriptor?: RowDescriptor, // For flat OLD/NEW row output
|
|
20
|
+
public readonly mutationContextValues?: Map<string, ScalarPlanNode>, // Mutation context value expressions
|
|
21
|
+
public readonly contextAttributes?: Attribute[], // Mutation context attributes
|
|
22
|
+
public readonly contextDescriptor?: RowDescriptor, // Mutation context row descriptor
|
|
23
|
+
) {
|
|
24
|
+
super(scope);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
override getType(): RelationType {
|
|
28
|
+
return this.source.getType();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
getAttributes(): readonly Attribute[] {
|
|
32
|
+
// If we have a flatRowDescriptor, produce attributes that correspond to the flat OLD/NEW row structure
|
|
33
|
+
if (this.flatRowDescriptor && Object.keys(this.flatRowDescriptor).length > 0) {
|
|
34
|
+
// Create attributes for the flat row: OLD columns first, then NEW columns
|
|
35
|
+
const attributes: Attribute[] = [];
|
|
36
|
+
|
|
37
|
+
// Add attributes for each position in the flat row
|
|
38
|
+
for (const attrIdStr in this.flatRowDescriptor) {
|
|
39
|
+
const attrId = parseInt(attrIdStr);
|
|
40
|
+
const flatIndex = this.flatRowDescriptor[attrId];
|
|
41
|
+
|
|
42
|
+
// Determine if this is OLD or NEW based on index
|
|
43
|
+
const tableColumnCount = this.table.tableSchema.columns.length;
|
|
44
|
+
const isOld = flatIndex < tableColumnCount;
|
|
45
|
+
const columnIndex = isOld ? flatIndex : flatIndex - tableColumnCount;
|
|
46
|
+
const col = this.table.tableSchema.columns[columnIndex];
|
|
47
|
+
|
|
48
|
+
attributes[flatIndex] = {
|
|
49
|
+
id: attrId,
|
|
50
|
+
name: col.name,
|
|
51
|
+
type: {
|
|
52
|
+
typeClass: 'scalar',
|
|
53
|
+
affinity: col.affinity,
|
|
54
|
+
nullable: isOld ? true : !col.notNull, // OLD values can be null, NEW follows column constraints
|
|
55
|
+
isReadOnly: false
|
|
56
|
+
},
|
|
57
|
+
sourceRelation: `${isOld ? 'OLD' : 'NEW'}.${this.table.tableSchema.name}`
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return attributes;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// INSERT produces the same attributes as its source (for non-RETURNING cases)
|
|
65
|
+
return this.source.getAttributes();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
override getRelations(): readonly [RelationalPlanNode, TableReferenceNode] {
|
|
69
|
+
return [this.source, this.table];
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
override getChildren(): readonly PlanNode[] {
|
|
73
|
+
// Return the source relation as a child so optimizer can traverse it
|
|
74
|
+
return [this.source];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
withChildren(newChildren: readonly PlanNode[]): PlanNode {
|
|
78
|
+
if (newChildren.length !== 1) {
|
|
79
|
+
throw new Error(`InsertNode expects 1 child (source), got ${newChildren.length}`);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const newSource = newChildren[0] as RelationalPlanNode;
|
|
83
|
+
if (!isRelationalNode(newSource)) {
|
|
84
|
+
throw new Error('InsertNode: child must be a RelationalPlanNode');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (newSource === this.source) {
|
|
88
|
+
return this;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return new InsertNode(
|
|
92
|
+
this.scope,
|
|
93
|
+
this.table,
|
|
94
|
+
this.targetColumns,
|
|
95
|
+
newSource,
|
|
96
|
+
this.flatRowDescriptor,
|
|
97
|
+
this.mutationContextValues,
|
|
98
|
+
this.contextAttributes,
|
|
99
|
+
this.contextDescriptor
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
computePhysical(): Partial<PhysicalProperties> {
|
|
104
|
+
return {
|
|
105
|
+
readonly: false, // INSERT has side effects
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
override toString(): string {
|
|
110
|
+
return `INSERT INTO ${this.table.tableSchema.name}`;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
override getLogicalAttributes(): Record<string, unknown> {
|
|
114
|
+
const props: Record<string, unknown> = {
|
|
115
|
+
table: this.table.tableSchema.name,
|
|
116
|
+
schema: this.table.tableSchema.schemaName,
|
|
117
|
+
targetColumns: this.targetColumns.map(col => col.name)
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
if (this.flatRowDescriptor) {
|
|
121
|
+
props.hasFlatRowDescriptor = true;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return props;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -3,6 +3,7 @@ import type { RelationType } from '../../common/datatype.js';
|
|
|
3
3
|
import { PlanNodeType } from './plan-node-type.js';
|
|
4
4
|
import type { Scope } from '../scopes/scope.js';
|
|
5
5
|
import { Cached } from '../../util/cached.js';
|
|
6
|
+
import type { CTEScopeNode } from './cte-node.js';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* Plan node for internal recursive CTE references.
|
|
@@ -10,11 +11,10 @@ import { Cached } from '../../util/cached.js';
|
|
|
10
11
|
* Unlike CTEReferenceNode, this doesn't materialize the CTE but looks up the working table
|
|
11
12
|
* from the runtime table context.
|
|
12
13
|
*/
|
|
13
|
-
export class InternalRecursiveCTERefNode extends ZeroAryRelationalBase {
|
|
14
|
+
export class InternalRecursiveCTERefNode extends ZeroAryRelationalBase implements CTEScopeNode {
|
|
14
15
|
readonly nodeType = PlanNodeType.InternalRecursiveCTERef;
|
|
15
16
|
|
|
16
17
|
private attributesCache: Cached<Attribute[]>;
|
|
17
|
-
private typeCache: Cached<RelationType>;
|
|
18
18
|
|
|
19
19
|
constructor(
|
|
20
20
|
scope: Scope,
|
|
@@ -26,12 +26,11 @@ export class InternalRecursiveCTERefNode extends ZeroAryRelationalBase {
|
|
|
26
26
|
) {
|
|
27
27
|
super(scope, 0.01); // Very low cost since we're just reading from working table
|
|
28
28
|
this.attributesCache = new Cached(() => this.buildAttributes());
|
|
29
|
-
this.typeCache = new Cached(() => this.buildType());
|
|
30
29
|
}
|
|
31
30
|
|
|
32
31
|
private buildAttributes(): Attribute[] {
|
|
33
32
|
// Return the attributes as provided, with proper source relation
|
|
34
|
-
return this.attributes.map((attr
|
|
33
|
+
return this.attributes.map((attr) => ({
|
|
35
34
|
id: attr.id,
|
|
36
35
|
name: attr.name,
|
|
37
36
|
type: attr.type,
|
|
@@ -39,26 +38,12 @@ export class InternalRecursiveCTERefNode extends ZeroAryRelationalBase {
|
|
|
39
38
|
}));
|
|
40
39
|
}
|
|
41
40
|
|
|
42
|
-
|
|
43
|
-
return {
|
|
44
|
-
typeClass: 'relation',
|
|
45
|
-
isReadOnly: true, // Working table is read-only from recursive case perspective
|
|
46
|
-
isSet: this.relationType.isSet,
|
|
47
|
-
columns: this.getAttributes().map((attr: any) => ({
|
|
48
|
-
name: attr.name,
|
|
49
|
-
type: attr.type
|
|
50
|
-
})),
|
|
51
|
-
keys: [],
|
|
52
|
-
rowConstraints: []
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
getAttributes(): Attribute[] {
|
|
41
|
+
getAttributes(): readonly Attribute[] {
|
|
57
42
|
return this.attributesCache.value;
|
|
58
43
|
}
|
|
59
44
|
|
|
60
45
|
getType(): RelationType {
|
|
61
|
-
return this.
|
|
46
|
+
return this.relationType;
|
|
62
47
|
}
|
|
63
48
|
|
|
64
49
|
toString(): string {
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import { isRelationalNode, PlanNode } from './plan-node.js';
|
|
2
2
|
import type { RelationalPlanNode, Attribute, BinaryRelationalNode, ScalarPlanNode } from './plan-node.js';
|
|
3
3
|
import type { RelationType } from '../../common/datatype.js';
|
|
4
|
+
import type { PhysicalProperties } from './plan-node.js';
|
|
4
5
|
import { PlanNodeType } from './plan-node-type.js';
|
|
5
6
|
import type { Scope } from '../scopes/scope.js';
|
|
6
7
|
import { Cached } from '../../util/cached.js';
|
|
7
8
|
import { StatusCode } from '../../common/types.js';
|
|
8
9
|
import { quereusError } from '../../common/errors.js';
|
|
10
|
+
import { JoinCapable, type PredicateSourceCapable } from '../framework/characteristics.js';
|
|
11
|
+
import { normalizePredicate } from '../analysis/predicate-normalizer.js';
|
|
12
|
+
import { combineJoinKeys } from '../util/key-utils.js';
|
|
13
|
+
import { BinaryOpNode } from './scalar.js';
|
|
14
|
+
import { ColumnReferenceNode } from './reference.js';
|
|
9
15
|
|
|
10
16
|
export type JoinType = 'inner' | 'left' | 'right' | 'full' | 'cross';
|
|
11
17
|
|
|
@@ -13,7 +19,7 @@ export type JoinType = 'inner' | 'left' | 'right' | 'full' | 'cross';
|
|
|
13
19
|
* Represents a logical JOIN operation between two relations.
|
|
14
20
|
* This is a logical node that will be converted to physical join algorithms during optimization.
|
|
15
21
|
*/
|
|
16
|
-
export class JoinNode extends PlanNode implements BinaryRelationalNode {
|
|
22
|
+
export class JoinNode extends PlanNode implements BinaryRelationalNode, JoinCapable, PredicateSourceCapable {
|
|
17
23
|
readonly nodeType = PlanNodeType.Join;
|
|
18
24
|
private attributesCache: Cached<Attribute[]>;
|
|
19
25
|
|
|
@@ -23,7 +29,7 @@ export class JoinNode extends PlanNode implements BinaryRelationalNode {
|
|
|
23
29
|
public readonly right: RelationalPlanNode,
|
|
24
30
|
public readonly joinType: JoinType,
|
|
25
31
|
public readonly condition?: ScalarPlanNode,
|
|
26
|
-
public readonly usingColumns?: string[]
|
|
32
|
+
public readonly usingColumns?: readonly string[]
|
|
27
33
|
) {
|
|
28
34
|
// Cost estimate: base cost is sum of children plus join cost
|
|
29
35
|
const leftCost = left.getTotalCost();
|
|
@@ -38,6 +44,93 @@ export class JoinNode extends PlanNode implements BinaryRelationalNode {
|
|
|
38
44
|
this.attributesCache = new Cached(() => this.buildAttributes());
|
|
39
45
|
}
|
|
40
46
|
|
|
47
|
+
computePhysical(childrenPhysical: PhysicalProperties[]): Partial<PhysicalProperties> {
|
|
48
|
+
const leftPhys = childrenPhysical[0];
|
|
49
|
+
const rightPhys = childrenPhysical[1];
|
|
50
|
+
const leftType = this.left.getType();
|
|
51
|
+
const rightType = this.right.getType();
|
|
52
|
+
const leftAttrs = this.left.getAttributes();
|
|
53
|
+
const rightAttrs = this.right.getAttributes();
|
|
54
|
+
|
|
55
|
+
const leftIdToIndex = new Map<number, number>();
|
|
56
|
+
leftAttrs.forEach((a, i) => leftIdToIndex.set(a.id, i));
|
|
57
|
+
const rightIdToIndex = new Map<number, number>();
|
|
58
|
+
rightAttrs.forEach((a, i) => rightIdToIndex.set(a.id, i));
|
|
59
|
+
|
|
60
|
+
// Gather equi-join attribute index pairs from simple AND-of-equalities
|
|
61
|
+
const pairs: Array<{ left: number; right: number }> = [];
|
|
62
|
+
const cond = this.condition ? normalizePredicate(this.condition) : undefined;
|
|
63
|
+
const stack: ScalarPlanNode[] = [];
|
|
64
|
+
if (cond) stack.push(cond);
|
|
65
|
+
while (stack.length) {
|
|
66
|
+
const n = stack.pop()!;
|
|
67
|
+
if (n instanceof BinaryOpNode) {
|
|
68
|
+
const op = n.expression.operator;
|
|
69
|
+
if (op === 'AND') {
|
|
70
|
+
stack.push(n.left, n.right);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (op === '=') {
|
|
74
|
+
if (n.left instanceof ColumnReferenceNode && n.right instanceof ColumnReferenceNode) {
|
|
75
|
+
let lIdx = leftIdToIndex.get(n.left.attributeId);
|
|
76
|
+
let rIdx = rightIdToIndex.get(n.right.attributeId);
|
|
77
|
+
if (lIdx !== undefined && rIdx !== undefined) {
|
|
78
|
+
pairs.push({ left: lIdx, right: rIdx });
|
|
79
|
+
} else {
|
|
80
|
+
// Try swapped alignment (right.col = left.col)
|
|
81
|
+
lIdx = leftIdToIndex.get(n.right.attributeId);
|
|
82
|
+
rIdx = rightIdToIndex.get(n.left.attributeId);
|
|
83
|
+
if (lIdx !== undefined && rIdx !== undefined) {
|
|
84
|
+
pairs.push({ left: lIdx, right: rIdx });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Check if a logical key (RelationType.keys) is fully covered by equi-join pairs
|
|
93
|
+
function coversLogicalKey(side: 'left' | 'right'): boolean {
|
|
94
|
+
const type = side === 'left' ? leftType : rightType;
|
|
95
|
+
const eqSet = new Set<number>(pairs.map(p => side === 'left' ? p.left : p.right));
|
|
96
|
+
return type.keys.some(key => key.length > 0 && key.every(ref => eqSet.has(ref.index)));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Check if a physical unique key (childrenPhysical.uniqueKeys) is fully covered by equi-join pairs
|
|
100
|
+
function coversPhysicalKey(side: 'left' | 'right'): boolean {
|
|
101
|
+
const phys = side === 'left' ? leftPhys : rightPhys;
|
|
102
|
+
if (!phys?.uniqueKeys) return false;
|
|
103
|
+
const eqSet = new Set<number>(pairs.map(p => side === 'left' ? p.left : p.right));
|
|
104
|
+
return phys.uniqueKeys.some(key => key.length > 0 && key.every(idx => eqSet.has(idx)));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const leftKeyCovered = coversLogicalKey('left') || coversPhysicalKey('left');
|
|
108
|
+
const rightKeyCovered = coversLogicalKey('right') || coversPhysicalKey('right');
|
|
109
|
+
|
|
110
|
+
let uniqueKeys: number[][] | undefined = undefined;
|
|
111
|
+
if (this.joinType === 'inner' || this.joinType === 'cross') {
|
|
112
|
+
const leftKeys = (leftPhys.uniqueKeys || []);
|
|
113
|
+
const rightKeys = (rightPhys.uniqueKeys || []).map(k => k.map(i => i + leftType.columns.length));
|
|
114
|
+
const preserved: number[][] = [];
|
|
115
|
+
if (rightKeyCovered) preserved.push(...leftKeys);
|
|
116
|
+
if (leftKeyCovered) preserved.push(...rightKeys);
|
|
117
|
+
if (preserved.length > 0) uniqueKeys = preserved;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
let estimatedRows: number | undefined = undefined;
|
|
121
|
+
const lRows = this.left.estimatedRows;
|
|
122
|
+
const rRows = this.right.estimatedRows;
|
|
123
|
+
if (this.joinType === 'inner') {
|
|
124
|
+
if (rightKeyCovered && typeof lRows === 'number') estimatedRows = lRows;
|
|
125
|
+
if (leftKeyCovered && typeof rRows === 'number') estimatedRows = (estimatedRows === undefined) ? rRows : Math.min(estimatedRows, rRows);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return {
|
|
129
|
+
uniqueKeys,
|
|
130
|
+
estimatedRows,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
41
134
|
private buildAttributes(): Attribute[] {
|
|
42
135
|
const leftAttrs = this.left.getAttributes();
|
|
43
136
|
const rightAttrs = this.right.getAttributes();
|
|
@@ -98,8 +191,8 @@ export class JoinNode extends PlanNode implements BinaryRelationalNode {
|
|
|
98
191
|
const isSet = (this.joinType === 'inner' || this.joinType === 'cross') &&
|
|
99
192
|
leftType.isSet && rightType.isSet;
|
|
100
193
|
|
|
101
|
-
// Combine keys
|
|
102
|
-
const combinedKeys =
|
|
194
|
+
// Combine keys conservatively
|
|
195
|
+
const combinedKeys = combineJoinKeys(leftType.keys, rightType.keys, this.joinType, leftType.columns.length);
|
|
103
196
|
|
|
104
197
|
// Combine row constraints from both sides
|
|
105
198
|
const combinedRowConstraints = [...leftType.rowConstraints, ...rightType.rowConstraints];
|
|
@@ -210,4 +303,29 @@ export class JoinNode extends PlanNode implements BinaryRelationalNode {
|
|
|
210
303
|
rightRows: this.right.estimatedRows
|
|
211
304
|
};
|
|
212
305
|
}
|
|
306
|
+
|
|
307
|
+
public getJoinType(): JoinType {
|
|
308
|
+
return this.joinType;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
public getJoinCondition(): ScalarPlanNode | undefined {
|
|
312
|
+
return this.condition;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
public getLeftSource(): RelationalPlanNode {
|
|
316
|
+
return this.left;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
public getRightSource(): RelationalPlanNode {
|
|
320
|
+
return this.right;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
public getUsingColumns(): readonly string[] | undefined {
|
|
324
|
+
return this.usingColumns;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// PredicateSourceCapable: Expose ON condition (if present) as a predicate source
|
|
328
|
+
getPredicates(): readonly ScalarPlanNode[] {
|
|
329
|
+
return this.condition ? [normalizePredicate(this.condition)] : [];
|
|
330
|
+
}
|
|
213
331
|
}
|