@quereus/quereus 0.2.0 → 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 +2 -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 +3 -3
- 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 +84 -6
- 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 +2 -2
- 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 +38 -6
- 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 +68 -11
- 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 +39 -7
- 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 +12 -4
- 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 +2 -2
- 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 +112 -25
- 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 +31 -6
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +27 -12
- 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 +18 -5
- package/dist/src/vtab/table.d.ts.map +1 -1
- package/dist/src/vtab/table.js.map +1 -1
- package/package.json +5 -3
- package/src/common/errors.ts +1 -1
- package/src/common/json-types.ts +16 -0
- package/src/common/types.ts +3 -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 +3 -3
- package/src/parser/ast.ts +582 -484
- 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 +16 -7
- 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 +2 -2
- 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 +150 -28
- 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,148 +1,162 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Rule: Aggregate Streaming
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Required Characteristics:
|
|
5
|
+
* - Node must support aggregation operations (AggregationCapable interface)
|
|
6
|
+
* - Node must be relational (produces rows)
|
|
7
|
+
* - Node must be read-only (no side effects for streaming)
|
|
8
|
+
*
|
|
9
|
+
* Applied When:
|
|
10
|
+
* - Logical aggregate node needs physical streaming implementation
|
|
11
|
+
* - Source data can be processed incrementally
|
|
12
|
+
*
|
|
13
|
+
* Benefits: Enables streaming aggregation with proper grouping order, memory efficient processing
|
|
7
14
|
*/
|
|
8
15
|
|
|
9
16
|
import { createLogger } from '../../../common/logger.js';
|
|
10
|
-
import type { PlanNode } from '../../nodes/plan-node.js';
|
|
17
|
+
import type { PlanNode, ScalarPlanNode, Attribute } from '../../nodes/plan-node.js';
|
|
11
18
|
import type { OptContext } from '../../framework/context.js';
|
|
12
|
-
import { AggregateNode } from '../../nodes/aggregate-node.js';
|
|
13
19
|
import { StreamAggregateNode } from '../../nodes/stream-aggregate.js';
|
|
14
20
|
import { SortNode } from '../../nodes/sort.js';
|
|
21
|
+
import {
|
|
22
|
+
PlanNodeCharacteristics,
|
|
23
|
+
CapabilityDetectors,
|
|
24
|
+
type AggregationCapable
|
|
25
|
+
} from '../../framework/characteristics.js';
|
|
15
26
|
|
|
16
27
|
const log = createLogger('optimizer:rule:aggregate-streaming');
|
|
17
28
|
|
|
18
29
|
export function ruleAggregateStreaming(node: PlanNode, _context: OptContext): PlanNode | null {
|
|
19
|
-
// Guard:
|
|
20
|
-
if (!(node
|
|
30
|
+
// Guard: node must support aggregation operations
|
|
31
|
+
if (!CapabilityDetectors.isAggregating(node)) {
|
|
21
32
|
return null;
|
|
22
33
|
}
|
|
23
34
|
|
|
24
35
|
log('Applying aggregate streaming rule to node %s', node.id);
|
|
25
36
|
|
|
26
|
-
//
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
// TODO: Check if source is ordered on groupBy columns
|
|
31
|
-
// TODO: Consider HashAggregate for unordered inputs
|
|
32
|
-
|
|
33
|
-
if (node.groupBy.length > 0) {
|
|
34
|
-
// Need to ensure ordering for streaming aggregate
|
|
35
|
-
// For now, always insert a sort
|
|
36
|
-
// TODO: Check if source already provides the required ordering
|
|
37
|
-
const sortKeys = node.groupBy.map(expr => ({
|
|
38
|
-
expression: expr,
|
|
39
|
-
direction: 'asc' as const,
|
|
40
|
-
nulls: undefined
|
|
41
|
-
}));
|
|
37
|
+
// Get aggregation characteristics
|
|
38
|
+
const aggregateNode = node as AggregationCapable;
|
|
39
|
+
const groupingKeys = aggregateNode.getGroupingKeys();
|
|
40
|
+
const aggregateExpressions = aggregateNode.getAggregateExpressions();
|
|
42
41
|
|
|
43
|
-
|
|
42
|
+
// Check if we can stream the aggregation over the source
|
|
43
|
+
const source = aggregateNode.getSource();
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
// Deduplicate by column NAME to avoid duplicate columns like 'id'
|
|
51
|
-
// (The same logical column can have different attribute IDs between aggregate and source)
|
|
52
|
-
const seenNames = new Set<string>();
|
|
53
|
-
const combinedAttrs: typeof aggregateAttrs = [];
|
|
54
|
-
|
|
55
|
-
// Add aggregate attributes first (GROUP BY + aggregates)
|
|
56
|
-
for (const attr of aggregateAttrs) {
|
|
57
|
-
combinedAttrs.push(attr);
|
|
58
|
-
seenNames.add(attr.name);
|
|
59
|
-
}
|
|
45
|
+
// Check if streaming aggregation is beneficial
|
|
46
|
+
if (!aggregateNode.canStreamAggregate()) {
|
|
47
|
+
log('Node cannot use streaming aggregation, skipping');
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
60
50
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
51
|
+
if (groupingKeys.length > 0) {
|
|
52
|
+
// Need to ensure ordering for streaming aggregate
|
|
53
|
+
// Check if source already provides the required ordering
|
|
54
|
+
const sourceOrdering = PlanNodeCharacteristics.getOrdering(source);
|
|
55
|
+
const needsSort = !isOrderedForGrouping(sourceOrdering, groupingKeys);
|
|
56
|
+
|
|
57
|
+
let sortedSource = source;
|
|
58
|
+
if (needsSort) {
|
|
59
|
+
// Insert sort to ensure proper grouping order
|
|
60
|
+
const sortKeys = groupingKeys.map(expr => ({
|
|
61
|
+
expression: expr,
|
|
62
|
+
direction: 'asc' as const,
|
|
63
|
+
nulls: undefined
|
|
64
|
+
}));
|
|
65
|
+
|
|
66
|
+
sortedSource = new SortNode(node.scope, source, sortKeys);
|
|
67
|
+
log('Inserted sort for grouping keys');
|
|
68
|
+
} else {
|
|
69
|
+
log('Source already provides required ordering for streaming');
|
|
67
70
|
}
|
|
68
71
|
|
|
69
|
-
//
|
|
70
|
-
const
|
|
71
|
-
const deduped: typeof combinedAttrs = [];
|
|
72
|
-
for (const attr of combinedAttrs) {
|
|
73
|
-
if (!uniqueByName.has(attr.name)) {
|
|
74
|
-
deduped.push(attr);
|
|
75
|
-
uniqueByName.add(attr.name);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
72
|
+
// Create combined attributes preserving attribute IDs
|
|
73
|
+
const finalAttrs = combineAttributes(node.getAttributes(), source.getAttributes());
|
|
78
74
|
|
|
79
|
-
|
|
75
|
+
// Convert aggregate expressions to match StreamAggregateNode interface
|
|
76
|
+
const streamAggregates = aggregateExpressions.map(agg => ({
|
|
77
|
+
expression: agg.expr,
|
|
78
|
+
alias: agg.alias
|
|
79
|
+
}));
|
|
80
80
|
|
|
81
81
|
const result = new StreamAggregateNode(
|
|
82
82
|
node.scope,
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
sortedSource,
|
|
84
|
+
groupingKeys,
|
|
85
|
+
streamAggregates,
|
|
86
86
|
undefined, // estimatedCostOverride
|
|
87
|
-
finalAttrs
|
|
87
|
+
finalAttrs
|
|
88
88
|
);
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
// Both SortNode and StreamAggregateNode have getPhysical() methods
|
|
92
|
-
|
|
93
|
-
log('Transformed AggregateNode to StreamAggregateNode with sort');
|
|
90
|
+
log('Transformed aggregation to StreamAggregateNode with %s', needsSort ? 'sort' : 'existing order');
|
|
94
91
|
return result;
|
|
95
92
|
} else {
|
|
96
93
|
// No GROUP BY - can stream aggregate without sorting
|
|
97
|
-
|
|
98
|
-
// This ensures both GROUP BY/aggregate AND source column attribute IDs are preserved
|
|
99
|
-
const aggregateAttrs = node.getAttributes();
|
|
100
|
-
const sourceAttrs = node.source.getAttributes();
|
|
101
|
-
|
|
102
|
-
// Deduplicate by column NAME to avoid duplicate columns like 'id'
|
|
103
|
-
// (The same logical column can have different attribute IDs between aggregate and source)
|
|
104
|
-
const seenNames = new Set<string>();
|
|
105
|
-
const combinedAttrs: typeof aggregateAttrs = [];
|
|
106
|
-
|
|
107
|
-
// Add aggregate attributes first (GROUP BY + aggregates)
|
|
108
|
-
for (const attr of aggregateAttrs) {
|
|
109
|
-
combinedAttrs.push(attr);
|
|
110
|
-
seenNames.add(attr.name);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Add source attributes that aren't already present by name
|
|
114
|
-
for (const attr of sourceAttrs) {
|
|
115
|
-
if (!seenNames.has(attr.name)) {
|
|
116
|
-
combinedAttrs.push(attr);
|
|
117
|
-
seenNames.add(attr.name);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
94
|
+
const finalAttrs = combineAttributes(node.getAttributes(), source.getAttributes());
|
|
120
95
|
|
|
121
|
-
//
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
deduped.push(attr);
|
|
127
|
-
uniqueByName.add(attr.name);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const finalAttrs = deduped;
|
|
96
|
+
// Convert aggregate expressions to match StreamAggregateNode interface
|
|
97
|
+
const streamAggregates = aggregateExpressions.map(agg => ({
|
|
98
|
+
expression: agg.expr,
|
|
99
|
+
alias: agg.alias
|
|
100
|
+
}));
|
|
132
101
|
|
|
133
102
|
const result = new StreamAggregateNode(
|
|
134
103
|
node.scope,
|
|
135
104
|
source,
|
|
136
|
-
|
|
137
|
-
|
|
105
|
+
groupingKeys,
|
|
106
|
+
streamAggregates,
|
|
138
107
|
undefined, // estimatedCostOverride
|
|
139
|
-
finalAttrs
|
|
108
|
+
finalAttrs
|
|
140
109
|
);
|
|
141
110
|
|
|
142
|
-
|
|
143
|
-
// StreamAggregateNode has getPhysical() method
|
|
144
|
-
|
|
145
|
-
log('Transformed AggregateNode to StreamAggregateNode without sort');
|
|
111
|
+
log('Transformed aggregation to StreamAggregateNode without sort');
|
|
146
112
|
return result;
|
|
147
113
|
}
|
|
148
114
|
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Check if source ordering matches grouping requirements for streaming
|
|
118
|
+
*/
|
|
119
|
+
function isOrderedForGrouping(
|
|
120
|
+
_ordering: { column: number; desc: boolean }[] | undefined,
|
|
121
|
+
_groupingKeys: readonly ScalarPlanNode[]
|
|
122
|
+
): boolean {
|
|
123
|
+
// TODO: Implement proper ordering analysis
|
|
124
|
+
// For now, conservatively return false to always sort
|
|
125
|
+
// This should check if the ordering covers all grouping keys in order
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Combine attributes from aggregate and source, avoiding duplicates by name
|
|
131
|
+
* This preserves attribute IDs while ensuring unique column names
|
|
132
|
+
*/
|
|
133
|
+
function combineAttributes(aggregateAttrs: readonly Attribute[], sourceAttrs: readonly Attribute[]): Attribute[] {
|
|
134
|
+
const seenNames = new Set<string>();
|
|
135
|
+
const combinedAttrs: Attribute[] = [];
|
|
136
|
+
|
|
137
|
+
// Add aggregate attributes first (GROUP BY + aggregates)
|
|
138
|
+
for (const attr of aggregateAttrs) {
|
|
139
|
+
combinedAttrs.push(attr);
|
|
140
|
+
seenNames.add(attr.name);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Add source attributes that aren't already present by name
|
|
144
|
+
for (const attr of sourceAttrs) {
|
|
145
|
+
if (!seenNames.has(attr.name)) {
|
|
146
|
+
combinedAttrs.push(attr);
|
|
147
|
+
seenNames.add(attr.name);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Final deduplication pass
|
|
152
|
+
const uniqueByName = new Set<string>();
|
|
153
|
+
const deduped: any[] = [];
|
|
154
|
+
for (const attr of combinedAttrs) {
|
|
155
|
+
if (!uniqueByName.has(attr.name)) {
|
|
156
|
+
deduped.push(attr);
|
|
157
|
+
uniqueByName.add(attr.name);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return deduped;
|
|
162
|
+
}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Rule: CTE Optimization
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Required Characteristics:
|
|
5
|
+
* - Node must support CTE operations (CTECapable interface)
|
|
6
|
+
* - Node must be relational (produces rows)
|
|
7
|
+
* - Source must be cacheable for materialization
|
|
8
|
+
*
|
|
9
|
+
* Applied When:
|
|
10
|
+
* - CTE would benefit from materialization/caching based on cost analysis
|
|
11
|
+
*
|
|
6
12
|
* Benefits: Reduces redundant computation for repeated CTE access
|
|
7
13
|
*/
|
|
8
14
|
|
|
@@ -11,37 +17,43 @@ import type { PlanNode } from '../../nodes/plan-node.js';
|
|
|
11
17
|
import type { OptContext } from '../../framework/context.js';
|
|
12
18
|
import { CTENode } from '../../nodes/cte-node.js';
|
|
13
19
|
import { CacheNode } from '../../nodes/cache-node.js';
|
|
14
|
-
import {
|
|
20
|
+
import { CapabilityDetectors, CachingAnalysis, PlanNodeCharacteristics, type CTECapable } from '../../framework/characteristics.js';
|
|
15
21
|
|
|
16
22
|
const log = createLogger('optimizer:rule:cte-optimization');
|
|
17
23
|
|
|
18
24
|
export function ruleCteOptimization(node: PlanNode, context: OptContext): PlanNode | null {
|
|
19
|
-
// Guard:
|
|
20
|
-
if (!(node
|
|
25
|
+
// Guard: node must support CTE operations
|
|
26
|
+
if (!CapabilityDetectors.isCTE(node)) {
|
|
21
27
|
return null;
|
|
22
28
|
}
|
|
23
29
|
|
|
24
|
-
|
|
30
|
+
// Get CTE characteristics
|
|
31
|
+
const cteNode = node as CTECapable;
|
|
32
|
+
log('Optimizing CTE %s', cteNode.cteName);
|
|
25
33
|
|
|
26
34
|
// Source is already optimized by framework
|
|
27
|
-
const source =
|
|
35
|
+
const source = cteNode.getCTESource();
|
|
28
36
|
|
|
29
37
|
// Heuristics for when to cache CTEs:
|
|
30
38
|
// 1. CTE has materialization hint
|
|
31
39
|
// 2. CTE is estimated to be reasonably sized
|
|
32
40
|
// 3. CTE is not already cached
|
|
33
|
-
const sourceSize = source
|
|
41
|
+
const sourceSize = PlanNodeCharacteristics.estimatesRows(source);
|
|
42
|
+
const isAlreadyCached = CapabilityDetectors.isCached(source) && source.isCached();
|
|
34
43
|
const shouldCache = (
|
|
35
|
-
|
|
44
|
+
cteNode.materializationHint === 'materialized' ||
|
|
36
45
|
(sourceSize > 0 && sourceSize < context.tuning.cte.maxSizeForCaching)
|
|
37
|
-
) &&
|
|
46
|
+
) && !isAlreadyCached;
|
|
38
47
|
|
|
39
48
|
if (shouldCache) {
|
|
40
|
-
log('Adding cache to CTE %s (estimated rows: %d)',
|
|
49
|
+
log('Adding cache to CTE %s (estimated rows: %d)', cteNode.cteName, sourceSize);
|
|
50
|
+
|
|
51
|
+
// Use characteristics-based cache threshold calculation
|
|
41
52
|
const cacheThreshold = Math.min(
|
|
42
|
-
|
|
53
|
+
CachingAnalysis.getCacheThreshold(source),
|
|
43
54
|
context.tuning.cte.maxCacheThreshold
|
|
44
55
|
);
|
|
56
|
+
|
|
45
57
|
const cachedSource = new CacheNode(
|
|
46
58
|
source.scope,
|
|
47
59
|
source,
|
|
@@ -49,13 +61,14 @@ export function ruleCteOptimization(node: PlanNode, context: OptContext): PlanNo
|
|
|
49
61
|
cacheThreshold
|
|
50
62
|
);
|
|
51
63
|
|
|
64
|
+
// Create new CTE with cached source (specific to CTENode implementation)
|
|
52
65
|
const result = new CTENode(
|
|
53
66
|
node.scope,
|
|
54
|
-
|
|
55
|
-
|
|
67
|
+
cteNode.cteName,
|
|
68
|
+
cteNode.columns,
|
|
56
69
|
cachedSource,
|
|
57
|
-
|
|
58
|
-
|
|
70
|
+
cteNode.materializationHint,
|
|
71
|
+
cteNode.isRecursive
|
|
59
72
|
);
|
|
60
73
|
|
|
61
74
|
log('Created CTE with caching');
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Rule: Materialization Advisory
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Required Characteristics:
|
|
5
|
+
* - Node must be non-relational with relational children
|
|
6
|
+
* - Children must be cacheable based on reference analysis
|
|
7
|
+
* - Children must benefit from materialization
|
|
8
|
+
*
|
|
9
|
+
* Applied When:
|
|
10
|
+
* - Transition from non-relational to relational subtrees
|
|
11
|
+
* - Relational subtrees would benefit from caching
|
|
12
|
+
*
|
|
6
13
|
* Benefits: Reduces redundant computation for repeated scans and loop contexts
|
|
7
14
|
*/
|
|
8
15
|
|
|
@@ -10,6 +17,7 @@ import { createLogger } from '../../../common/logger.js';
|
|
|
10
17
|
import type { PlanNode } from '../../nodes/plan-node.js';
|
|
11
18
|
import type { OptContext } from '../../framework/context.js';
|
|
12
19
|
import { MaterializationAdvisory } from '../../cache/materialization-advisory.js';
|
|
20
|
+
import { PlanNodeCharacteristics } from '../../framework/characteristics.js';
|
|
13
21
|
|
|
14
22
|
const log = createLogger('optimizer:rule:materialization-advisory');
|
|
15
23
|
|
|
@@ -17,9 +25,8 @@ export function ruleMaterializationAdvisory(node: PlanNode, context: OptContext)
|
|
|
17
25
|
// Apply this rule when we're at a non-relational node that has relational children
|
|
18
26
|
// This captures transitions into relational subtrees (queries, subqueries, CTEs, etc.)
|
|
19
27
|
|
|
20
|
-
// Check if this is a non-relational node
|
|
21
|
-
|
|
22
|
-
if (nodeType.typeClass === 'relation') {
|
|
28
|
+
// Check if this is a non-relational node using characteristics
|
|
29
|
+
if (PlanNodeCharacteristics.isRelational(node)) {
|
|
23
30
|
// This is already a relational node, don't apply here
|
|
24
31
|
return null;
|
|
25
32
|
}
|
|
@@ -31,7 +38,7 @@ export function ruleMaterializationAdvisory(node: PlanNode, context: OptContext)
|
|
|
31
38
|
return null;
|
|
32
39
|
}
|
|
33
40
|
|
|
34
|
-
log('Applying materialization advisory at transition from %s to relational children', node.
|
|
41
|
+
log('Applying materialization advisory at transition from %s to relational children', node.getType().typeClass);
|
|
35
42
|
|
|
36
43
|
try {
|
|
37
44
|
// Create advisory with current tuning parameters
|
|
@@ -45,7 +52,7 @@ export function ruleMaterializationAdvisory(node: PlanNode, context: OptContext)
|
|
|
45
52
|
const transformedRelation = advisory.analyzeAndTransform(relation);
|
|
46
53
|
if (transformedRelation !== relation) {
|
|
47
54
|
anyTransformed = true;
|
|
48
|
-
log('Transformed relational subtree under %s', node.
|
|
55
|
+
log('Transformed relational subtree under %s node', node.getType().typeClass);
|
|
49
56
|
}
|
|
50
57
|
}
|
|
51
58
|
|
|
@@ -1,51 +1,55 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Rule: Mutating Subquery Cache Injection
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Required Characteristics:
|
|
5
|
+
* - Node must be a join operation (JoinCapable interface)
|
|
6
|
+
* - Right side must contain operations with side effects (readonly=false)
|
|
7
|
+
* - Right side must not already be cached
|
|
8
|
+
*
|
|
9
|
+
* Applied When:
|
|
10
|
+
* - Join has mutating operations on right side that could be executed multiple times
|
|
11
|
+
*
|
|
6
12
|
* Benefits: Prevents mutating subqueries from being executed multiple times in nested loop joins
|
|
7
13
|
*/
|
|
8
14
|
|
|
9
15
|
import { createLogger } from '../../../common/logger.js';
|
|
10
16
|
import { PlanNode } from '../../nodes/plan-node.js';
|
|
11
17
|
import type { OptContext } from '../../framework/context.js';
|
|
12
|
-
import { JoinNode } from '../../nodes/join-node.js';
|
|
13
18
|
import { CacheNode } from '../../nodes/cache-node.js';
|
|
14
|
-
import {
|
|
19
|
+
import { JoinNode } from '../../nodes/join-node.js';
|
|
20
|
+
import { PlanNodeCharacteristics, CapabilityDetectors, CachingAnalysis, type JoinCapable } from '../../framework/characteristics.js';
|
|
15
21
|
|
|
16
22
|
const log = createLogger('optimizer:rule:mutating-subquery-cache');
|
|
17
23
|
|
|
18
|
-
export function ruleMutatingSubqueryCache(node: PlanNode,
|
|
19
|
-
// Guard:
|
|
20
|
-
if (!(node
|
|
24
|
+
export function ruleMutatingSubqueryCache(node: PlanNode, _context: OptContext): PlanNode | null {
|
|
25
|
+
// Guard: node must support join operations
|
|
26
|
+
if (!CapabilityDetectors.isJoin(node)) {
|
|
21
27
|
return null;
|
|
22
28
|
}
|
|
23
29
|
|
|
24
|
-
log('Checking
|
|
30
|
+
log('Checking join operation for side effects on right side');
|
|
25
31
|
|
|
26
|
-
//
|
|
27
|
-
const
|
|
28
|
-
const
|
|
32
|
+
// Get join-specific characteristics
|
|
33
|
+
const joinNode = node as JoinCapable;
|
|
34
|
+
const rightSide = joinNode.getRightSource();
|
|
29
35
|
|
|
36
|
+
// Check if right side contains operations with side effects
|
|
37
|
+
const hasSideEffects = containsOperationsWithSideEffects(rightSide);
|
|
30
38
|
if (!hasSideEffects) {
|
|
31
39
|
log('Right side does not contain operations with side effects, skipping');
|
|
32
40
|
return null;
|
|
33
41
|
}
|
|
34
42
|
|
|
35
43
|
// Check if right side is already cached
|
|
36
|
-
if (rightSide
|
|
44
|
+
if (CapabilityDetectors.isCached(rightSide) && rightSide.isCached()) {
|
|
37
45
|
log('Right side is already cached, skipping');
|
|
38
46
|
return null;
|
|
39
47
|
}
|
|
40
48
|
|
|
41
49
|
log('Detected operations with side effects on right side of join, injecting cache');
|
|
42
50
|
|
|
43
|
-
// Calculate appropriate cache threshold
|
|
44
|
-
const
|
|
45
|
-
const threshold = Math.min(
|
|
46
|
-
Math.max(estimatedRows * context.tuning.join.cacheThresholdMultiplier, 1000),
|
|
47
|
-
context.tuning.join.maxCacheThreshold
|
|
48
|
-
);
|
|
51
|
+
// Calculate appropriate cache threshold using characteristics
|
|
52
|
+
const threshold = CachingAnalysis.getCacheThreshold(rightSide);
|
|
49
53
|
|
|
50
54
|
// Wrap the right side with a cache node
|
|
51
55
|
const cachedRightSide = new CacheNode(
|
|
@@ -56,13 +60,16 @@ export function ruleMutatingSubqueryCache(node: PlanNode, context: OptContext):
|
|
|
56
60
|
);
|
|
57
61
|
|
|
58
62
|
// Create new join node with cached right side
|
|
63
|
+
// Note: We still need to use specific constructor since we don't have a generic join builder yet
|
|
59
64
|
const result = new JoinNode(
|
|
60
65
|
node.scope,
|
|
61
|
-
|
|
62
|
-
cachedRightSide,
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
joinNode.getLeftSource(),
|
|
67
|
+
cachedRightSide,
|
|
68
|
+
joinNode.getJoinType(),
|
|
69
|
+
joinNode.getJoinCondition(),
|
|
70
|
+
// Special case: for JOINs, we also need to check if any of the join conditions
|
|
71
|
+
// reference columns from the mutating subquery (via USING clause)
|
|
72
|
+
joinNode.getUsingColumns()
|
|
66
73
|
);
|
|
67
74
|
|
|
68
75
|
log('Successfully injected cache for operations with side effects (threshold: %d)', threshold);
|
|
@@ -71,40 +78,27 @@ export function ruleMutatingSubqueryCache(node: PlanNode, context: OptContext):
|
|
|
71
78
|
|
|
72
79
|
/**
|
|
73
80
|
* Recursively check if a plan tree contains operations with side effects
|
|
81
|
+
* Uses characteristics-based analysis instead of hard-coded node type checks
|
|
74
82
|
*/
|
|
75
83
|
function containsOperationsWithSideEffects(node: PlanNode): boolean {
|
|
76
|
-
// Check
|
|
77
|
-
if (
|
|
84
|
+
// Check this node's characteristics
|
|
85
|
+
if (PlanNodeCharacteristics.hasSideEffects(node)) {
|
|
78
86
|
return true;
|
|
79
87
|
}
|
|
80
88
|
|
|
81
|
-
// Recursively check children
|
|
89
|
+
// Recursively check all children
|
|
82
90
|
for (const child of node.getChildren()) {
|
|
83
91
|
if (containsOperationsWithSideEffects(child)) {
|
|
84
92
|
return true;
|
|
85
93
|
}
|
|
86
94
|
}
|
|
87
95
|
|
|
88
|
-
// Check relational children if available
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return true;
|
|
93
|
-
}
|
|
96
|
+
// Check relational children if available (preserved for compatibility)
|
|
97
|
+
for (const relation of node.getRelations()) {
|
|
98
|
+
if (containsOperationsWithSideEffects(relation)) {
|
|
99
|
+
return true;
|
|
94
100
|
}
|
|
95
101
|
}
|
|
96
102
|
|
|
97
103
|
return false;
|
|
98
104
|
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Check if a node has side effects using physical properties
|
|
102
|
-
*/
|
|
103
|
-
function hasNodeSideEffects(node: PlanNode): boolean {
|
|
104
|
-
// By the time rules run, all children should have physical properties set by the framework
|
|
105
|
-
if (!node.physical) {
|
|
106
|
-
throw new Error(`Internal error: Node ${node.nodeType}:${node.id} missing physical properties during rule application`);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return PlanNode.hasSideEffects(node.physical);
|
|
110
|
-
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { createLogger } from '../../../common/logger.js';
|
|
2
|
+
import type { PlanNode, RelationalPlanNode } from '../../nodes/plan-node.js';
|
|
3
|
+
import type { OptContext } from '../../framework/context.js';
|
|
4
|
+
import { JoinNode } from '../../nodes/join-node.js';
|
|
5
|
+
|
|
6
|
+
const log = createLogger('optimizer:rule:join-greedy-commute');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Rule: Join Greedy Commute
|
|
10
|
+
*
|
|
11
|
+
* Simple heuristic: for INNER joins, prefer the smaller input on the left to drive nested-loop-like cost.
|
|
12
|
+
* This uses children estimatedRows (influenced by pushdown/growth) and swaps left/right when beneficial.
|
|
13
|
+
*
|
|
14
|
+
* Safety:
|
|
15
|
+
* - INNER joins are commutative; ColumnReferenceNode uses attribute IDs, so swapping sides preserves semantics.
|
|
16
|
+
* - We do NOT change associativity; we only commute immediate children of a JoinNode.
|
|
17
|
+
*/
|
|
18
|
+
export function ruleJoinGreedyCommute(node: PlanNode, _context: OptContext): PlanNode | null {
|
|
19
|
+
if (!(node instanceof JoinNode)) return null;
|
|
20
|
+
if (node.joinType !== 'inner' && node.joinType !== 'cross') return null;
|
|
21
|
+
|
|
22
|
+
const leftRows = node.getLeftSource().estimatedRows ?? Number.POSITIVE_INFINITY;
|
|
23
|
+
const rightRows = node.getRightSource().estimatedRows ?? Number.POSITIVE_INFINITY;
|
|
24
|
+
|
|
25
|
+
// Prefer known finite estimatedRows; also detect <=1 row driver on either side
|
|
26
|
+
const leftIsSingleton = node.getLeftSource().physical.uniqueKeys?.some(k => k.length === 0) === true;
|
|
27
|
+
const rightIsSingleton = node.getRightSource().physical.uniqueKeys?.some(k => k.length === 0) === true;
|
|
28
|
+
|
|
29
|
+
// If right is strictly better driver (smaller or singleton), swap
|
|
30
|
+
const shouldSwap = (rightIsSingleton && !leftIsSingleton) || (!rightIsSingleton && !leftIsSingleton && rightRows < leftRows);
|
|
31
|
+
if (!shouldSwap) return null;
|
|
32
|
+
|
|
33
|
+
log('Commuting join children to place smaller input on the left (leftRows=%s, rightRows=%s)', String(leftRows), String(rightRows));
|
|
34
|
+
|
|
35
|
+
// Swap children; condition stays the same (attribute IDs are stable)
|
|
36
|
+
const swapped = new JoinNode(
|
|
37
|
+
node.scope,
|
|
38
|
+
node.getRightSource() as RelationalPlanNode,
|
|
39
|
+
node.getLeftSource() as RelationalPlanNode,
|
|
40
|
+
node.getJoinType(),
|
|
41
|
+
node.getJoinCondition(),
|
|
42
|
+
node.getUsingColumns()
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
return swapped;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createLogger } from '../../../common/logger.js';
|
|
2
|
+
import type { PlanNode } from '../../nodes/plan-node.js';
|
|
3
|
+
import type { OptContext } from '../../framework/context.js';
|
|
4
|
+
import { JoinNode } from '../../nodes/join-node.js';
|
|
5
|
+
import { BinaryOpNode } from '../../nodes/scalar.js';
|
|
6
|
+
import { ColumnReferenceNode } from '../../nodes/reference.js';
|
|
7
|
+
|
|
8
|
+
const log = createLogger('optimizer:rule:join-key-inference');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Rule: Join Key Inference
|
|
12
|
+
*
|
|
13
|
+
* Detect simple equi-join predicates (left.col = right.pk) and propagate
|
|
14
|
+
* inner/cross join unique keys (already handled by JoinNode.computePhysical),
|
|
15
|
+
* with a hook for future FK->PK inference (not implemented here yet).
|
|
16
|
+
*/
|
|
17
|
+
export function ruleJoinKeyInference(node: PlanNode, _context: OptContext): PlanNode | null {
|
|
18
|
+
if (!(node instanceof JoinNode)) return null;
|
|
19
|
+
if (node.joinType !== 'inner' && node.joinType !== 'cross') return null;
|
|
20
|
+
|
|
21
|
+
const cond = node.getJoinCondition();
|
|
22
|
+
if (!cond || !(cond instanceof BinaryOpNode)) return null;
|
|
23
|
+
if (cond.expression.operator !== '=') return null;
|
|
24
|
+
|
|
25
|
+
// Simple left.col = right.col pattern check; placeholder for future FK->PK detection
|
|
26
|
+
const leftIsCol = cond.left instanceof ColumnReferenceNode;
|
|
27
|
+
const rightIsCol = cond.right instanceof ColumnReferenceNode;
|
|
28
|
+
if (!leftIsCol || !rightIsCol) return null;
|
|
29
|
+
|
|
30
|
+
log('Detected equi-join predicate; JoinNode.computePhysical will preserve side keys');
|
|
31
|
+
// No structural change needed now; computePhysical on JoinNode already preserves side keys
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|