@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,130 +1,394 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Constraint extraction utilities for predicate analysis and
|
|
2
|
+
* Constraint extraction utilities for predicate analysis and pushdown optimization
|
|
3
3
|
* Converts scalar expressions into constraints that can be pushed down to virtual tables
|
|
4
4
|
*/
|
|
5
5
|
import { PlanNodeType } from '../nodes/plan-node-type.js';
|
|
6
|
+
import { BinaryOpNode } from '../nodes/scalar.js';
|
|
7
|
+
import { createLogger } from '../../common/logger.js';
|
|
8
|
+
import { getSyncLiteral } from '../../parser/utils.js';
|
|
9
|
+
import { TableReferenceNode } from '../nodes/reference.js';
|
|
10
|
+
import { CapabilityDetectors } from '../framework/characteristics.js';
|
|
11
|
+
const log = createLogger('planner:analysis:constraint-extractor');
|
|
6
12
|
/**
|
|
7
13
|
* Extract constraints from a scalar predicate expression
|
|
8
|
-
*
|
|
14
|
+
* Handles binary comparisons, boolean logic (AND/OR), and complex expressions
|
|
9
15
|
*/
|
|
10
|
-
export function extractConstraints(predicate,
|
|
11
|
-
const
|
|
16
|
+
export function extractConstraints(predicate, tableInfos = []) {
|
|
17
|
+
const constraintsByTable = new Map();
|
|
18
|
+
const allConstraints = [];
|
|
12
19
|
const residualExpressions = [];
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
20
|
+
log('Extracting constraints from predicate: %s', predicate.toString());
|
|
21
|
+
// Build attribute-to-table mapping for quick lookups
|
|
22
|
+
const tableByAttribute = new Map();
|
|
23
|
+
for (const tableInfo of tableInfos) {
|
|
24
|
+
for (const attr of tableInfo.attributes) {
|
|
25
|
+
tableByAttribute.set(attr.id, tableInfo);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Start extraction process & build supported fragments per table
|
|
29
|
+
const perTableParts = new Map();
|
|
30
|
+
extractFromExpression(predicate, allConstraints, residualExpressions, tableByAttribute, perTableParts);
|
|
31
|
+
// Group constraints by table instance key
|
|
32
|
+
for (const constraint of allConstraints) {
|
|
33
|
+
if (constraint.targetRelation) {
|
|
34
|
+
if (!constraintsByTable.has(constraint.targetRelation)) {
|
|
35
|
+
constraintsByTable.set(constraint.targetRelation, []);
|
|
36
|
+
}
|
|
37
|
+
constraintsByTable.get(constraint.targetRelation).push(constraint);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Build residual predicate from unmatched expressions (combine with AND)
|
|
16
41
|
let residualPredicate;
|
|
17
42
|
if (residualExpressions.length === 1) {
|
|
18
43
|
residualPredicate = residualExpressions[0];
|
|
19
44
|
}
|
|
20
45
|
else if (residualExpressions.length > 1) {
|
|
21
|
-
|
|
22
|
-
|
|
46
|
+
let acc = residualExpressions[0];
|
|
47
|
+
for (let i = 1; i < residualExpressions.length; i++) {
|
|
48
|
+
const right = residualExpressions[i];
|
|
49
|
+
const ast = { type: 'binary', operator: 'AND', left: acc.expression, right: right.expression };
|
|
50
|
+
acc = new BinaryOpNode(acc.scope, ast, acc, right);
|
|
51
|
+
}
|
|
52
|
+
residualPredicate = acc;
|
|
53
|
+
}
|
|
54
|
+
log('Extracted %d constraints across %d tables, %d residual expressions', allConstraints.length, constraintsByTable.size, residualExpressions.length);
|
|
55
|
+
const supportedPredicateByTable = new Map();
|
|
56
|
+
for (const [rel, parts] of perTableParts) {
|
|
57
|
+
const combined = combineParts(parts);
|
|
58
|
+
if (combined)
|
|
59
|
+
supportedPredicateByTable.set(rel, combined);
|
|
60
|
+
}
|
|
61
|
+
// Compute covered keys per table: collect equality constraints and check against table unique keys
|
|
62
|
+
const coveredKeysByTable = new Map();
|
|
63
|
+
for (const [rel, constraints] of constraintsByTable) {
|
|
64
|
+
const tInfo = tableInfos.find(t => t.relationKey === rel || t.relationName === rel);
|
|
65
|
+
if (!tInfo || !tInfo.uniqueKeys || tInfo.uniqueKeys.length === 0) {
|
|
66
|
+
coveredKeysByTable.set(rel, []);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const eqCols = new Set();
|
|
70
|
+
for (const c of constraints) {
|
|
71
|
+
if (c.op === '=') {
|
|
72
|
+
eqCols.add(c.columnIndex);
|
|
73
|
+
}
|
|
74
|
+
// Single-value IN could be treated as equality
|
|
75
|
+
if (c.op === 'IN' && Array.isArray(c.value) && c.value.length === 1) {
|
|
76
|
+
eqCols.add(c.columnIndex);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const covered = [];
|
|
80
|
+
for (const key of tInfo.uniqueKeys) {
|
|
81
|
+
if (key.length === 0) {
|
|
82
|
+
// Zero-length key means at most one row; trivially covered
|
|
83
|
+
covered.push([]);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const allCovered = key.every(idx => eqCols.has(idx));
|
|
87
|
+
if (allCovered)
|
|
88
|
+
covered.push([...key]);
|
|
89
|
+
}
|
|
90
|
+
coveredKeysByTable.set(rel, covered);
|
|
23
91
|
}
|
|
24
92
|
return {
|
|
25
|
-
|
|
26
|
-
residualPredicate
|
|
93
|
+
constraintsByTable,
|
|
94
|
+
residualPredicate,
|
|
95
|
+
allConstraints,
|
|
96
|
+
supportedPredicateByTable,
|
|
97
|
+
coveredKeysByTable
|
|
27
98
|
};
|
|
28
99
|
}
|
|
29
100
|
/**
|
|
30
101
|
* Recursively extract constraints from an expression
|
|
31
102
|
*/
|
|
32
|
-
function extractFromExpression(expr, constraints, residual,
|
|
103
|
+
function extractFromExpression(expr, constraints, residual, attributeToTableMap, perTableParts) {
|
|
33
104
|
// Handle AND expressions - recurse on both sides
|
|
34
105
|
if (isAndExpression(expr)) {
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
106
|
+
const binaryOp = expr;
|
|
107
|
+
extractFromExpression(binaryOp.left, constraints, residual, attributeToTableMap, perTableParts);
|
|
108
|
+
extractFromExpression(binaryOp.right, constraints, residual, attributeToTableMap, perTableParts);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
// Handle OR expressions - for now, treat as residual (could be enhanced later)
|
|
112
|
+
if (isOrExpression(expr)) {
|
|
113
|
+
log('OR expression found, treating as residual: %s', expr.toString());
|
|
114
|
+
residual.push(expr);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// BETWEEN → range constraints
|
|
118
|
+
if (expr.nodeType === PlanNodeType.Between) {
|
|
119
|
+
const c = extractBetweenConstraints(expr, attributeToTableMap);
|
|
120
|
+
if (c) {
|
|
121
|
+
constraints.push(...c);
|
|
122
|
+
addSupportedPart(expr, attributeToTableMap, perTableParts);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// IN list → IN constraint (literals only)
|
|
127
|
+
if (expr.nodeType === PlanNodeType.In) {
|
|
128
|
+
const c = extractInConstraint(expr, attributeToTableMap);
|
|
129
|
+
if (c) {
|
|
130
|
+
constraints.push(c);
|
|
131
|
+
addSupportedPart(expr, attributeToTableMap, perTableParts);
|
|
39
132
|
return;
|
|
40
133
|
}
|
|
41
134
|
}
|
|
42
135
|
// Try to extract constraint from binary comparison
|
|
43
|
-
const constraint = extractBinaryConstraint(expr,
|
|
136
|
+
const constraint = extractBinaryConstraint(expr, attributeToTableMap);
|
|
44
137
|
if (constraint) {
|
|
45
138
|
constraints.push(constraint);
|
|
139
|
+
addSupportedPart(expr, attributeToTableMap, perTableParts);
|
|
140
|
+
log('Extracted constraint: %s %s %s (table: %s)', constraint.attributeId, constraint.op, constraint.value, constraint.targetRelation);
|
|
46
141
|
}
|
|
47
142
|
else {
|
|
48
143
|
// Cannot convert to constraint - add to residual
|
|
144
|
+
log('Cannot extract constraint from expression, adding to residual: %s', expr.toString());
|
|
49
145
|
residual.push(expr);
|
|
50
146
|
}
|
|
51
147
|
}
|
|
148
|
+
function addSupportedPart(expr, attributeToTableMap, perTableParts) {
|
|
149
|
+
// Determine target table by first column reference in expr; if absent, skip
|
|
150
|
+
const relKey = findTargetRelationKey(expr, attributeToTableMap);
|
|
151
|
+
if (!relKey)
|
|
152
|
+
return;
|
|
153
|
+
if (!perTableParts.has(relKey))
|
|
154
|
+
perTableParts.set(relKey, []);
|
|
155
|
+
perTableParts.get(relKey).push(expr);
|
|
156
|
+
}
|
|
157
|
+
function findTargetRelationKey(expr, attributeToTableMap) {
|
|
158
|
+
let found;
|
|
159
|
+
const stack = [expr];
|
|
160
|
+
while (stack.length) {
|
|
161
|
+
const n = stack.pop();
|
|
162
|
+
if (n.nodeType === PlanNodeType.ColumnReference) {
|
|
163
|
+
const attrId = n.attributeId;
|
|
164
|
+
const info = attributeToTableMap.get(attrId);
|
|
165
|
+
if (info)
|
|
166
|
+
return info.relationKey ?? info.relationName;
|
|
167
|
+
}
|
|
168
|
+
for (const c of n.getChildren()) {
|
|
169
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
170
|
+
stack.push(c);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return found;
|
|
174
|
+
}
|
|
175
|
+
function combineParts(parts) {
|
|
176
|
+
if (parts.length === 0)
|
|
177
|
+
return undefined;
|
|
178
|
+
if (parts.length === 1)
|
|
179
|
+
return parts[0];
|
|
180
|
+
// Combine with AND
|
|
181
|
+
let acc = parts[0];
|
|
182
|
+
for (let i = 1; i < parts.length; i++) {
|
|
183
|
+
const right = parts[i];
|
|
184
|
+
const ast = { type: 'binary', operator: 'AND', left: acc.expression, right: right.expression };
|
|
185
|
+
acc = new BinaryOpNode(acc.scope, ast, acc, right);
|
|
186
|
+
}
|
|
187
|
+
return acc;
|
|
188
|
+
}
|
|
52
189
|
/**
|
|
53
190
|
* Extract constraint from binary comparison expression
|
|
54
191
|
*/
|
|
55
|
-
function extractBinaryConstraint(expr,
|
|
56
|
-
|
|
57
|
-
if (
|
|
192
|
+
function extractBinaryConstraint(expr, attributeToTableMap) {
|
|
193
|
+
// Must be a binary operation
|
|
194
|
+
if (expr.nodeType !== PlanNodeType.BinaryOp) {
|
|
58
195
|
return null;
|
|
59
196
|
}
|
|
60
|
-
const
|
|
197
|
+
const binaryOp = expr;
|
|
198
|
+
const { left, right } = binaryOp;
|
|
199
|
+
const operator = binaryOp.expression.operator;
|
|
61
200
|
// Try column-constant pattern (column op constant)
|
|
62
201
|
let columnRef = null;
|
|
63
202
|
let constant;
|
|
64
|
-
let
|
|
65
|
-
if (isColumnReference(left) && isLiteralConstant(right)) {
|
|
203
|
+
let finalOp = null;
|
|
204
|
+
if (isColumnReference(left) && (isLiteralConstant(right) || isDynamicValue(right))) {
|
|
66
205
|
columnRef = left;
|
|
67
|
-
|
|
206
|
+
if (isLiteralConstant(right)) {
|
|
207
|
+
constant = getLiteralValue(right);
|
|
208
|
+
}
|
|
209
|
+
finalOp = mapOperatorToConstraint(operator, constant);
|
|
68
210
|
}
|
|
69
|
-
else if (isLiteralConstant(left) && isColumnReference(right)) {
|
|
211
|
+
else if ((isLiteralConstant(left) || isDynamicValue(left)) && isColumnReference(right)) {
|
|
70
212
|
// Reverse pattern (constant op column) - flip operator
|
|
71
213
|
columnRef = right;
|
|
72
|
-
|
|
73
|
-
|
|
214
|
+
if (isLiteralConstant(left)) {
|
|
215
|
+
constant = getLiteralValue(left);
|
|
216
|
+
}
|
|
217
|
+
const baseOp = mapOperatorToConstraint(operator, constant);
|
|
218
|
+
finalOp = baseOp ? flipOperator(baseOp) : null;
|
|
74
219
|
}
|
|
75
|
-
if (!columnRef) {
|
|
220
|
+
if (!columnRef || !finalOp) {
|
|
221
|
+
log('No column-constant pattern found in binary expression');
|
|
76
222
|
return null;
|
|
77
223
|
}
|
|
78
|
-
// Map attribute ID to column index
|
|
79
|
-
|
|
80
|
-
if (
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
224
|
+
// Map attribute ID to table and column index
|
|
225
|
+
const tableInfo = attributeToTableMap.get(columnRef.attributeId);
|
|
226
|
+
if (!tableInfo) {
|
|
227
|
+
log('No table mapping found for attribute ID %d', columnRef.attributeId);
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
const columnIndex = tableInfo.columnIndexMap.get(columnRef.attributeId);
|
|
231
|
+
if (columnIndex === undefined) {
|
|
232
|
+
log('No column index found for attribute ID %d', columnRef.attributeId);
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
const result = {
|
|
236
|
+
columnIndex,
|
|
237
|
+
attributeId: columnRef.attributeId,
|
|
238
|
+
op: finalOp,
|
|
239
|
+
value: constant,
|
|
240
|
+
usable: true, // Usable since we found table mapping
|
|
241
|
+
sourceExpression: expr,
|
|
242
|
+
targetRelation: tableInfo.relationKey
|
|
243
|
+
};
|
|
244
|
+
// Attach dynamic binding metadata when RHS/LHS is not a literal
|
|
245
|
+
const rhs = expr.right;
|
|
246
|
+
const lhs = expr.left;
|
|
247
|
+
const nonLiteral = !isLiteralConstant(lhs) || !isLiteralConstant(rhs);
|
|
248
|
+
if (nonLiteral) {
|
|
249
|
+
// Determine which side is the value side
|
|
250
|
+
const valueSide = (columnRef === lhs ? rhs : lhs);
|
|
251
|
+
if (!isLiteralConstant(valueSide)) {
|
|
252
|
+
result.valueExpr = valueSide;
|
|
253
|
+
if (valueSide.nodeType === PlanNodeType.ParameterReference) {
|
|
254
|
+
result.bindingKind = 'parameter';
|
|
255
|
+
}
|
|
256
|
+
else if (valueSide.nodeType === PlanNodeType.ColumnReference) {
|
|
257
|
+
const rhsAttrId = valueSide.attributeId;
|
|
258
|
+
const sameTable = tableInfo.columnIndexMap.has(rhsAttrId);
|
|
259
|
+
result.bindingKind = sameTable ? 'expression' : 'correlated';
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
result.bindingKind = 'expression';
|
|
263
|
+
}
|
|
84
264
|
}
|
|
265
|
+
else {
|
|
266
|
+
result.bindingKind = 'literal';
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
result.bindingKind = 'literal';
|
|
271
|
+
}
|
|
272
|
+
return result;
|
|
273
|
+
}
|
|
274
|
+
function extractBetweenConstraints(expr, attributeToTableMap) {
|
|
275
|
+
// Only support column BETWEEN literal AND literal
|
|
276
|
+
const col = expr.expr;
|
|
277
|
+
const low = expr.lower;
|
|
278
|
+
const up = expr.upper;
|
|
279
|
+
const not = !!expr.expression.not;
|
|
280
|
+
if (col.nodeType !== PlanNodeType.ColumnReference)
|
|
281
|
+
return null;
|
|
282
|
+
if (!isLiteralConstant(low) || !isLiteralConstant(up))
|
|
283
|
+
return null;
|
|
284
|
+
const columnRef = col;
|
|
285
|
+
const tableInfo = attributeToTableMap.get(columnRef.attributeId);
|
|
286
|
+
if (!tableInfo)
|
|
287
|
+
return null;
|
|
288
|
+
const columnIndex = tableInfo.columnIndexMap.get(columnRef.attributeId);
|
|
289
|
+
if (columnIndex === undefined)
|
|
290
|
+
return null;
|
|
291
|
+
if (not) {
|
|
292
|
+
// NOT BETWEEN not expressible as single contiguous range; leave as residual
|
|
293
|
+
return null;
|
|
85
294
|
}
|
|
295
|
+
const lowVal = getLiteralValue(low);
|
|
296
|
+
const upVal = getLiteralValue(up);
|
|
297
|
+
return [
|
|
298
|
+
{
|
|
299
|
+
columnIndex,
|
|
300
|
+
attributeId: columnRef.attributeId,
|
|
301
|
+
op: '>=',
|
|
302
|
+
value: lowVal,
|
|
303
|
+
usable: true,
|
|
304
|
+
sourceExpression: expr,
|
|
305
|
+
targetRelation: tableInfo.relationKey
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
columnIndex,
|
|
309
|
+
attributeId: columnRef.attributeId,
|
|
310
|
+
op: '<=',
|
|
311
|
+
value: upVal,
|
|
312
|
+
usable: true,
|
|
313
|
+
sourceExpression: expr,
|
|
314
|
+
targetRelation: tableInfo.relationKey
|
|
315
|
+
}
|
|
316
|
+
];
|
|
317
|
+
}
|
|
318
|
+
function extractInConstraint(expr, attributeToTableMap) {
|
|
319
|
+
// Only support column IN (literal, ...)
|
|
320
|
+
if (expr.source)
|
|
321
|
+
return null;
|
|
322
|
+
if (!expr.values || expr.values.length === 0)
|
|
323
|
+
return null;
|
|
324
|
+
const col = expr.condition;
|
|
325
|
+
if (col.nodeType !== PlanNodeType.ColumnReference)
|
|
326
|
+
return null;
|
|
327
|
+
// Ensure all are literals
|
|
328
|
+
if (!expr.values.every(v => isLiteralConstant(v)))
|
|
329
|
+
return null;
|
|
330
|
+
const columnRef = col;
|
|
331
|
+
const tableInfo = attributeToTableMap.get(columnRef.attributeId);
|
|
332
|
+
if (!tableInfo)
|
|
333
|
+
return null;
|
|
334
|
+
const columnIndex = tableInfo.columnIndexMap.get(columnRef.attributeId);
|
|
335
|
+
if (columnIndex === undefined)
|
|
336
|
+
return null;
|
|
337
|
+
// Virtual table IN constraint can carry a single array value or multiple equality constraints.
|
|
338
|
+
// Our API supports op 'IN' with value array.
|
|
339
|
+
const values = expr.values.map(v => getLiteralValue(v));
|
|
86
340
|
return {
|
|
87
341
|
columnIndex,
|
|
88
342
|
attributeId: columnRef.attributeId,
|
|
89
|
-
op:
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
343
|
+
op: 'IN',
|
|
344
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
345
|
+
value: values,
|
|
346
|
+
usable: true,
|
|
347
|
+
sourceExpression: expr,
|
|
348
|
+
targetRelation: tableInfo.relationKey
|
|
93
349
|
};
|
|
94
350
|
}
|
|
95
351
|
/**
|
|
96
|
-
*
|
|
352
|
+
* Map AST operators to constraint operators
|
|
97
353
|
*/
|
|
98
|
-
function
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
return
|
|
354
|
+
function mapOperatorToConstraint(operator, rightValue) {
|
|
355
|
+
switch (operator) {
|
|
356
|
+
case '=': return '=';
|
|
357
|
+
case '>': return '>';
|
|
358
|
+
case '>=': return '>=';
|
|
359
|
+
case '<': return '<';
|
|
360
|
+
case '<=': return '<=';
|
|
361
|
+
case 'LIKE': return 'LIKE';
|
|
362
|
+
case 'GLOB': return 'GLOB';
|
|
363
|
+
case 'MATCH': return 'MATCH';
|
|
364
|
+
case 'IN': return 'IN';
|
|
365
|
+
case 'NOT IN': return 'NOT IN';
|
|
366
|
+
case 'IS':
|
|
367
|
+
return rightValue === null ? 'IS NULL' : null;
|
|
368
|
+
case 'IS NOT':
|
|
369
|
+
return rightValue === null ? 'IS NOT NULL' : null;
|
|
370
|
+
default: return null;
|
|
106
371
|
}
|
|
107
|
-
return null;
|
|
108
372
|
}
|
|
109
373
|
/**
|
|
110
374
|
* Check if expression is an AND operation
|
|
111
375
|
*/
|
|
112
376
|
function isAndExpression(expr) {
|
|
113
|
-
|
|
114
|
-
|
|
377
|
+
return expr.nodeType === PlanNodeType.BinaryOp &&
|
|
378
|
+
expr.expression.operator === 'AND';
|
|
115
379
|
}
|
|
116
380
|
/**
|
|
117
|
-
*
|
|
381
|
+
* Check if expression is an OR operation
|
|
118
382
|
*/
|
|
119
|
-
function
|
|
120
|
-
|
|
121
|
-
|
|
383
|
+
function isOrExpression(expr) {
|
|
384
|
+
return expr.nodeType === PlanNodeType.BinaryOp &&
|
|
385
|
+
expr.expression.operator === 'OR';
|
|
122
386
|
}
|
|
123
387
|
/**
|
|
124
388
|
* Check if node is a column reference
|
|
125
389
|
*/
|
|
126
390
|
function isColumnReference(node) {
|
|
127
|
-
return node
|
|
391
|
+
return CapabilityDetectors.isColumnReference(node);
|
|
128
392
|
}
|
|
129
393
|
/**
|
|
130
394
|
* Check if node is a literal constant
|
|
@@ -132,12 +396,16 @@ function isColumnReference(node) {
|
|
|
132
396
|
function isLiteralConstant(node) {
|
|
133
397
|
return node.nodeType === PlanNodeType.Literal;
|
|
134
398
|
}
|
|
399
|
+
function isDynamicValue(node) {
|
|
400
|
+
// Parameter or column reference from any table (correlation handled later)
|
|
401
|
+
return node.nodeType === PlanNodeType.ParameterReference || node.nodeType === PlanNodeType.ColumnReference;
|
|
402
|
+
}
|
|
135
403
|
/**
|
|
136
404
|
* Get literal value from literal node
|
|
137
405
|
*/
|
|
138
|
-
function getLiteralValue(
|
|
139
|
-
|
|
140
|
-
return
|
|
406
|
+
function getLiteralValue(node) {
|
|
407
|
+
const literalNode = node;
|
|
408
|
+
return getSyncLiteral(literalNode.expression);
|
|
141
409
|
}
|
|
142
410
|
/**
|
|
143
411
|
* Flip comparison operator for reversed operand order
|
|
@@ -149,45 +417,206 @@ function flipOperator(op) {
|
|
|
149
417
|
case '>': return '<';
|
|
150
418
|
case '>=': return '<=';
|
|
151
419
|
case '=': return '=';
|
|
420
|
+
case 'LIKE': return 'LIKE'; // Not flippable
|
|
421
|
+
case 'GLOB': return 'GLOB'; // Not flippable
|
|
422
|
+
case 'MATCH': return 'MATCH'; // Not flippable
|
|
423
|
+
case 'IN': return 'IN'; // Not flippable in this context
|
|
424
|
+
case 'NOT IN': return 'NOT IN'; // Not flippable in this context
|
|
152
425
|
default: return op;
|
|
153
426
|
}
|
|
154
427
|
}
|
|
155
428
|
/**
|
|
156
|
-
*
|
|
429
|
+
* Extract constraints for a specific table from a relational plan
|
|
430
|
+
* Analyzes all Filter nodes and join conditions that reference the table
|
|
157
431
|
*/
|
|
158
|
-
function
|
|
159
|
-
|
|
160
|
-
//
|
|
161
|
-
|
|
432
|
+
export function extractConstraintsForTable(plan, targetTableRelationKey) {
|
|
433
|
+
const constraints = [];
|
|
434
|
+
// Walk the plan tree looking for filter predicates
|
|
435
|
+
walkPlanForPredicates(plan, (predicate, sourceNode) => {
|
|
436
|
+
// Create table info for the target table only
|
|
437
|
+
const tableInfos = createTableInfosFromPlan(plan).filter(info => info.relationKey === targetTableRelationKey);
|
|
438
|
+
if (tableInfos.length > 0) {
|
|
439
|
+
const result = extractConstraints(predicate, tableInfos);
|
|
440
|
+
const tableConstraints = result.constraintsByTable.get(targetTableRelationKey);
|
|
441
|
+
if (tableConstraints) {
|
|
442
|
+
constraints.push(...tableConstraints);
|
|
443
|
+
log('Found %d constraints for table %s from %s', tableConstraints.length, targetTableRelationKey, sourceNode);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
return constraints;
|
|
162
448
|
}
|
|
163
449
|
/**
|
|
164
|
-
*
|
|
165
|
-
* This allows creating a filter function that can be applied at runtime
|
|
450
|
+
* Extract constraints and combined residual predicate for a specific table
|
|
166
451
|
*/
|
|
167
|
-
export function
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
452
|
+
export function extractConstraintsAndResidualForTable(plan, targetTableRelationKey) {
|
|
453
|
+
const constraints = [];
|
|
454
|
+
const residuals = [];
|
|
455
|
+
walkPlanForPredicates(plan, (predicate) => {
|
|
456
|
+
const tableInfos = createTableInfosFromPlan(plan).filter(info => info.relationKey === targetTableRelationKey);
|
|
457
|
+
if (tableInfos.length === 0)
|
|
458
|
+
return;
|
|
459
|
+
const result = extractConstraints(predicate, tableInfos);
|
|
460
|
+
const tableConstraints = result.constraintsByTable.get(targetTableRelationKey);
|
|
461
|
+
if (tableConstraints && tableConstraints.length) {
|
|
462
|
+
constraints.push(...tableConstraints);
|
|
463
|
+
}
|
|
464
|
+
if (result.residualPredicate) {
|
|
465
|
+
residuals.push(result.residualPredicate);
|
|
466
|
+
}
|
|
467
|
+
});
|
|
468
|
+
return { constraints, residualPredicate: combineResiduals(residuals) };
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Compute which unique keys are fully covered by equality constraints for a table within a plan.
|
|
472
|
+
* Returns a list of covered keys (each key is a list of column indexes in the table output order).
|
|
473
|
+
*/
|
|
474
|
+
export function extractCoveredKeysForTable(plan, targetTableRelationKey) {
|
|
475
|
+
const constraints = extractConstraintsForTable(plan, targetTableRelationKey);
|
|
476
|
+
const tInfos = createTableInfosFromPlan(plan).filter(info => info.relationKey === targetTableRelationKey);
|
|
477
|
+
if (tInfos.length === 0)
|
|
478
|
+
return [];
|
|
479
|
+
const uniqueKeys = tInfos[0].uniqueKeys ?? [];
|
|
480
|
+
return computeCoveredKeysForConstraints(constraints, uniqueKeys);
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Given a set of constraints and a table's unique keys, compute which keys are fully covered by equality.
|
|
484
|
+
*/
|
|
485
|
+
export function computeCoveredKeysForConstraints(constraints, tableUniqueKeys) {
|
|
486
|
+
const eqCols = new Set();
|
|
487
|
+
for (const c of constraints) {
|
|
488
|
+
if (c.op === '=') {
|
|
489
|
+
eqCols.add(c.columnIndex);
|
|
490
|
+
}
|
|
491
|
+
if (c.op === 'IN' && Array.isArray(c.value) && c.value.length === 1) {
|
|
492
|
+
eqCols.add(c.columnIndex);
|
|
493
|
+
}
|
|
173
494
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
495
|
+
const covered = [];
|
|
496
|
+
for (const key of tableUniqueKeys) {
|
|
497
|
+
if (key.length === 0) {
|
|
498
|
+
covered.push([]);
|
|
499
|
+
continue;
|
|
500
|
+
}
|
|
501
|
+
const allCovered = key.every(idx => eqCols.has(idx));
|
|
502
|
+
if (allCovered)
|
|
503
|
+
covered.push([...key]);
|
|
504
|
+
}
|
|
505
|
+
return covered;
|
|
177
506
|
}
|
|
178
507
|
/**
|
|
179
|
-
*
|
|
180
|
-
*
|
|
508
|
+
* Analyze plan to classify each TableReference instance as 'row' (row-specific) or 'global'.
|
|
509
|
+
* Row-specific means equality constraints fully cover at least one unique key at that reference.
|
|
181
510
|
*/
|
|
182
|
-
export function
|
|
183
|
-
const
|
|
184
|
-
|
|
185
|
-
for (const
|
|
186
|
-
const
|
|
187
|
-
|
|
188
|
-
|
|
511
|
+
export function analyzeRowSpecific(plan) {
|
|
512
|
+
const result = new Map();
|
|
513
|
+
const infos = createTableInfosFromPlan(plan);
|
|
514
|
+
for (const info of infos) {
|
|
515
|
+
const covered = extractCoveredKeysForTable(plan, info.relationKey);
|
|
516
|
+
result.set(info.relationKey, covered.length > 0 ? 'row' : 'global');
|
|
517
|
+
}
|
|
518
|
+
return result;
|
|
519
|
+
}
|
|
520
|
+
function combineResiduals(predicates) {
|
|
521
|
+
if (predicates.length === 0)
|
|
522
|
+
return undefined;
|
|
523
|
+
if (predicates.length === 1)
|
|
524
|
+
return predicates[0];
|
|
525
|
+
let acc = predicates[0];
|
|
526
|
+
for (let i = 1; i < predicates.length; i++) {
|
|
527
|
+
const right = predicates[i];
|
|
528
|
+
const ast = { type: 'binary', operator: 'AND', left: acc.expression, right: right.expression };
|
|
529
|
+
acc = new BinaryOpNode(acc.scope, ast, acc, right);
|
|
530
|
+
}
|
|
531
|
+
return acc;
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Walk a plan tree and call callback for each predicate found
|
|
535
|
+
*/
|
|
536
|
+
function walkPlanForPredicates(plan, callback) {
|
|
537
|
+
if (!plan)
|
|
538
|
+
return;
|
|
539
|
+
// If node exposes predicates via characteristic, collect them
|
|
540
|
+
if (CapabilityDetectors.isPredicateSource(plan)) {
|
|
541
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
542
|
+
const preds = plan.getPredicates();
|
|
543
|
+
for (const p of preds) {
|
|
544
|
+
callback(p, 'PredicateSource');
|
|
189
545
|
}
|
|
190
546
|
}
|
|
191
|
-
|
|
547
|
+
// Recurse into all children (scalar and relational)
|
|
548
|
+
for (const child of plan.getChildren()) {
|
|
549
|
+
walkPlanForPredicates(child, callback);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* Create table information from a relational plan
|
|
554
|
+
*/
|
|
555
|
+
function createTableInfosFromPlan(plan) {
|
|
556
|
+
const tableInfos = [];
|
|
557
|
+
const seen = new Set();
|
|
558
|
+
function visitAny(node) {
|
|
559
|
+
const id = node.id ?? null;
|
|
560
|
+
if (id !== null) {
|
|
561
|
+
const k = String(id);
|
|
562
|
+
if (seen.has(k))
|
|
563
|
+
return;
|
|
564
|
+
seen.add(k);
|
|
565
|
+
}
|
|
566
|
+
if (node instanceof TableReferenceNode) {
|
|
567
|
+
const tr = node;
|
|
568
|
+
tableInfos.push(createTableInfoFromNode(node, `${tr.tableSchema.schemaName}.${tr.tableSchema.name}`));
|
|
569
|
+
}
|
|
570
|
+
for (const rel of node.getRelations()) {
|
|
571
|
+
visitAny(rel);
|
|
572
|
+
}
|
|
573
|
+
for (const child of node.getChildren()) {
|
|
574
|
+
visitAny(child);
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
visitAny(plan);
|
|
578
|
+
return tableInfos;
|
|
579
|
+
}
|
|
580
|
+
/**
|
|
581
|
+
* Utility to create table info from a table reference node
|
|
582
|
+
*/
|
|
583
|
+
export function createTableInfoFromNode(node, relationName) {
|
|
584
|
+
const attributes = node.getAttributes();
|
|
585
|
+
const columnIndexMap = new Map();
|
|
586
|
+
// Map attribute IDs to column indices
|
|
587
|
+
attributes.forEach((attr, index) => {
|
|
588
|
+
columnIndexMap.set(attr.id, index);
|
|
589
|
+
});
|
|
590
|
+
// Extract logical unique keys from relation type, map ColRef[] to plain column indexes
|
|
591
|
+
const relType = node.getType();
|
|
592
|
+
const uniqueKeys = Array.isArray(relType?.keys)
|
|
593
|
+
? relType.keys.map(key => key.map(ref => ref.index))
|
|
594
|
+
: undefined;
|
|
595
|
+
const relName = relationName || node.toString();
|
|
596
|
+
const relationKey = `${relName}#${node.id ?? 'unknown'}`;
|
|
597
|
+
return {
|
|
598
|
+
relationName: relName,
|
|
599
|
+
relationKey,
|
|
600
|
+
attributes: attributes.map(attr => ({ id: attr.id, name: attr.name })),
|
|
601
|
+
columnIndexMap,
|
|
602
|
+
uniqueKeys
|
|
603
|
+
};
|
|
604
|
+
}
|
|
605
|
+
/**
|
|
606
|
+
* Create a residual filter predicate from constraints that weren't handled
|
|
607
|
+
* This allows creating a filter function that can be applied at runtime
|
|
608
|
+
*/
|
|
609
|
+
export function createResidualFilter(originalPredicate, handledConstraints) {
|
|
610
|
+
// If no constraints were handled, return undefined (original predicate still needed)
|
|
611
|
+
if (handledConstraints.length === 0) {
|
|
612
|
+
return undefined;
|
|
613
|
+
}
|
|
614
|
+
// TODO: Implement sophisticated residual filter construction
|
|
615
|
+
// This would need to:
|
|
616
|
+
// 1. Identify which parts of the original predicate were handled
|
|
617
|
+
// 2. Construct a new predicate with only the unhandled parts
|
|
618
|
+
// 3. Compile that predicate to a runtime function
|
|
619
|
+
log('Residual filter construction not yet implemented - using original predicate');
|
|
620
|
+
return undefined;
|
|
192
621
|
}
|
|
193
622
|
//# sourceMappingURL=constraint-extractor.js.map
|