@quereus/quereus 0.1.0 → 0.2.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 +47 -23
- package/dist/src/core/database.d.ts +22 -4
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +44 -6
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/statement.d.ts +0 -7
- package/dist/src/core/statement.d.ts.map +1 -1
- package/dist/src/core/statement.js +1 -51
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +0 -11
- package/dist/src/func/builtins/explain.js.map +1 -1
- package/dist/src/index.d.ts +13 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/parser/ast.d.ts +9 -2
- package/dist/src/parser/ast.d.ts.map +1 -1
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +40 -44
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/planner/analysis/const-pass.d.ts.map +1 -1
- package/dist/src/planner/analysis/const-pass.js +12 -6
- package/dist/src/planner/analysis/const-pass.js.map +1 -1
- package/dist/src/planner/building/constraint-builder.d.ts +11 -0
- package/dist/src/planner/building/constraint-builder.d.ts.map +1 -0
- package/dist/src/planner/building/constraint-builder.js +79 -0
- package/dist/src/planner/building/constraint-builder.js.map +1 -0
- package/dist/src/planner/building/delete.d.ts.map +1 -1
- package/dist/src/planner/building/delete.js +6 -3
- package/dist/src/planner/building/delete.js.map +1 -1
- package/dist/src/planner/building/expression.d.ts +3 -0
- package/dist/src/planner/building/expression.d.ts.map +1 -1
- package/dist/src/planner/building/expression.js +33 -7
- package/dist/src/planner/building/expression.js.map +1 -1
- package/dist/src/planner/building/insert.d.ts.map +1 -1
- package/dist/src/planner/building/insert.js +4 -1
- package/dist/src/planner/building/insert.js.map +1 -1
- package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.js +46 -9
- package/dist/src/planner/building/select-aggregates.js.map +1 -1
- package/dist/src/planner/building/select-context.js +20 -11
- package/dist/src/planner/building/select-context.js.map +1 -1
- package/dist/src/planner/building/select-modifiers.d.ts +5 -3
- package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
- package/dist/src/planner/building/select-modifiers.js +29 -20
- package/dist/src/planner/building/select-modifiers.js.map +1 -1
- package/dist/src/planner/building/select-projections.d.ts +3 -1
- package/dist/src/planner/building/select-projections.d.ts.map +1 -1
- package/dist/src/planner/building/select-projections.js +15 -20
- 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 +25 -2
- package/dist/src/planner/building/select.d.ts.map +1 -1
- package/dist/src/planner/building/select.js +147 -24
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/building/table.d.ts +0 -10
- package/dist/src/planner/building/table.d.ts.map +1 -1
- package/dist/src/planner/building/table.js +1 -35
- 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 +7 -4
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/building/with.d.ts.map +1 -1
- package/dist/src/planner/building/with.js +7 -8
- package/dist/src/planner/building/with.js.map +1 -1
- package/dist/src/planner/cache/correlation-detector.d.ts +11 -0
- package/dist/src/planner/cache/correlation-detector.d.ts.map +1 -0
- package/dist/src/planner/cache/correlation-detector.js +73 -0
- package/dist/src/planner/cache/correlation-detector.js.map +1 -0
- package/dist/src/planner/cache/materialization-advisory.d.ts +12 -18
- package/dist/src/planner/cache/materialization-advisory.d.ts.map +1 -1
- package/dist/src/planner/cache/materialization-advisory.js +65 -46
- package/dist/src/planner/cache/materialization-advisory.js.map +1 -1
- package/dist/src/planner/cache/reference-graph.d.ts +14 -9
- package/dist/src/planner/cache/reference-graph.d.ts.map +1 -1
- package/dist/src/planner/cache/reference-graph.js +93 -84
- package/dist/src/planner/cache/reference-graph.js.map +1 -1
- package/dist/src/planner/debug.d.ts +25 -0
- package/dist/src/planner/debug.d.ts.map +1 -1
- package/dist/src/planner/debug.js +127 -0
- package/dist/src/planner/debug.js.map +1 -1
- package/dist/src/planner/framework/context.d.ts +11 -0
- package/dist/src/planner/framework/context.d.ts.map +1 -1
- package/dist/src/planner/framework/context.js +25 -2
- package/dist/src/planner/framework/context.js.map +1 -1
- package/dist/src/planner/framework/registry.d.ts +3 -7
- package/dist/src/planner/framework/registry.d.ts.map +1 -1
- package/dist/src/planner/framework/registry.js +20 -31
- package/dist/src/planner/framework/registry.js.map +1 -1
- package/dist/src/planner/nodes/add-constraint-node.d.ts +2 -1
- package/dist/src/planner/nodes/add-constraint-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/add-constraint-node.js +3 -0
- package/dist/src/planner/nodes/add-constraint-node.js.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.js +6 -4
- package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
- package/dist/src/planner/nodes/cache-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/cache-node.js +2 -2
- package/dist/src/planner/nodes/cache-node.js.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.d.ts +11 -4
- package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.js +38 -12
- package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
- package/dist/src/planner/nodes/create-index-node.d.ts +2 -1
- package/dist/src/planner/nodes/create-index-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/create-index-node.js +3 -0
- package/dist/src/planner/nodes/create-index-node.js.map +1 -1
- package/dist/src/planner/nodes/create-table-node.d.ts +2 -1
- package/dist/src/planner/nodes/create-table-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/create-table-node.js +3 -0
- package/dist/src/planner/nodes/create-table-node.js.map +1 -1
- package/dist/src/planner/nodes/create-view-node.d.ts +2 -1
- package/dist/src/planner/nodes/create-view-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/create-view-node.js +3 -0
- package/dist/src/planner/nodes/create-view-node.js.map +1 -1
- package/dist/src/planner/nodes/cte-node.d.ts +1 -1
- package/dist/src/planner/nodes/cte-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/cte-node.js +33 -12
- package/dist/src/planner/nodes/cte-node.js.map +1 -1
- package/dist/src/planner/nodes/cte-reference-node.d.ts +18 -4
- package/dist/src/planner/nodes/cte-reference-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/cte-reference-node.js +40 -10
- package/dist/src/planner/nodes/cte-reference-node.js.map +1 -1
- package/dist/src/planner/nodes/delete-node.d.ts +4 -3
- package/dist/src/planner/nodes/delete-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/delete-node.js +20 -6
- package/dist/src/planner/nodes/delete-node.js.map +1 -1
- package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/distinct-node.js +2 -2
- package/dist/src/planner/nodes/distinct-node.js.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.js +2 -2
- package/dist/src/planner/nodes/dml-executor-node.js.map +1 -1
- package/dist/src/planner/nodes/drop-table-node.d.ts +2 -1
- package/dist/src/planner/nodes/drop-table-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/drop-table-node.js +3 -0
- package/dist/src/planner/nodes/drop-table-node.js.map +1 -1
- package/dist/src/planner/nodes/drop-view-node.d.ts +2 -1
- package/dist/src/planner/nodes/drop-view-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/drop-view-node.js +3 -0
- package/dist/src/planner/nodes/drop-view-node.js.map +1 -1
- package/dist/src/planner/nodes/filter.d.ts.map +1 -1
- package/dist/src/planner/nodes/filter.js +3 -3
- package/dist/src/planner/nodes/filter.js.map +1 -1
- package/dist/src/planner/nodes/insert-node.d.ts +2 -1
- package/dist/src/planner/nodes/insert-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/insert-node.js +18 -5
- package/dist/src/planner/nodes/insert-node.js.map +1 -1
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts +28 -0
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js +69 -0
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js.map +1 -0
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +3 -3
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +2 -2
- package/dist/src/planner/nodes/limit-offset.js.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.d.ts +1 -1
- package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.js +1 -1
- package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
- package/dist/src/planner/nodes/plan-node.d.ts +23 -0
- package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node.js +25 -2
- package/dist/src/planner/nodes/plan-node.js.map +1 -1
- package/dist/src/planner/nodes/project-node.d.ts +5 -1
- package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/project-node.js +39 -20
- 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 +20 -8
- package/dist/src/planner/nodes/recursive-cte-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +4 -2
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/returning-node.d.ts +1 -1
- package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/returning-node.js +21 -13
- package/dist/src/planner/nodes/returning-node.js.map +1 -1
- package/dist/src/planner/nodes/scalar.d.ts +26 -2
- package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/scalar.js +82 -10
- package/dist/src/planner/nodes/scalar.js.map +1 -1
- package/dist/src/planner/nodes/sequencing-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/sequencing-node.js +2 -2
- package/dist/src/planner/nodes/sequencing-node.js.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.js +3 -3
- package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
- package/dist/src/planner/nodes/single-row.d.ts +4 -2
- package/dist/src/planner/nodes/single-row.d.ts.map +1 -1
- package/dist/src/planner/nodes/single-row.js +3 -0
- package/dist/src/planner/nodes/single-row.js.map +1 -1
- package/dist/src/planner/nodes/sink-node.d.ts +1 -1
- package/dist/src/planner/nodes/sink-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/sink-node.js +4 -4
- package/dist/src/planner/nodes/sink-node.js.map +1 -1
- package/dist/src/planner/nodes/sort.d.ts.map +1 -1
- package/dist/src/planner/nodes/sort.js +2 -2
- package/dist/src/planner/nodes/sort.js.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.d.ts +1 -0
- package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.js +64 -11
- package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/subquery.d.ts +4 -4
- package/dist/src/planner/nodes/subquery.d.ts.map +1 -1
- package/dist/src/planner/nodes/subquery.js +68 -23
- package/dist/src/planner/nodes/subquery.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts +83 -0
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -0
- package/dist/src/planner/nodes/table-access-nodes.js +226 -0
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -0
- package/dist/src/planner/nodes/update-node.d.ts +4 -2
- package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/update-node.js +26 -13
- package/dist/src/planner/nodes/update-node.js.map +1 -1
- package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-node.js +25 -23
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +46 -50
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/planning-context.d.ts +13 -0
- package/dist/src/planner/planning-context.d.ts.map +1 -1
- package/dist/src/planner/planning-context.js.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts +1 -1
- 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 +59 -53
- 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.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js +62 -2
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-materialization-advisory.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-materialization-advisory.js +31 -24
- package/dist/src/planner/rules/cache/rule-materialization-advisory.js.map +1 -1
- package/dist/src/planner/scopes/base.d.ts +0 -10
- package/dist/src/planner/scopes/base.d.ts.map +1 -1
- package/dist/src/planner/scopes/base.js +0 -14
- package/dist/src/planner/scopes/base.js.map +1 -1
- package/dist/src/planner/scopes/empty.d.ts +0 -2
- package/dist/src/planner/scopes/empty.d.ts.map +1 -1
- package/dist/src/planner/scopes/empty.js +0 -8
- package/dist/src/planner/scopes/empty.js.map +1 -1
- package/dist/src/planner/scopes/multi.d.ts.map +1 -1
- package/dist/src/planner/scopes/multi.js +0 -1
- package/dist/src/planner/scopes/multi.js.map +1 -1
- package/dist/src/planner/scopes/param.d.ts.map +1 -1
- package/dist/src/planner/scopes/param.js +0 -1
- package/dist/src/planner/scopes/param.js.map +1 -1
- package/dist/src/planner/scopes/registered.d.ts +0 -10
- package/dist/src/planner/scopes/registered.d.ts.map +1 -1
- package/dist/src/planner/scopes/registered.js +1 -17
- package/dist/src/planner/scopes/registered.js.map +1 -1
- package/dist/src/planner/scopes/scope.d.ts +0 -8
- package/dist/src/planner/scopes/scope.d.ts.map +1 -1
- package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
- package/dist/src/planner/validation/plan-validator.js +1 -7
- package/dist/src/planner/validation/plan-validator.js.map +1 -1
- package/dist/src/runtime/context-helpers.d.ts +45 -0
- package/dist/src/runtime/context-helpers.d.ts.map +1 -0
- package/dist/src/runtime/context-helpers.js +139 -0
- package/dist/src/runtime/context-helpers.js.map +1 -0
- package/dist/src/runtime/emission-context.d.ts +1 -0
- package/dist/src/runtime/emission-context.d.ts.map +1 -1
- package/dist/src/runtime/emission-context.js +2 -1
- package/dist/src/runtime/emission-context.js.map +1 -1
- package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
- package/dist/src/runtime/emit/aggregate.js +119 -86
- package/dist/src/runtime/emit/aggregate.js.map +1 -1
- package/dist/src/runtime/emit/between.d.ts +5 -0
- package/dist/src/runtime/emit/between.d.ts.map +1 -0
- package/dist/src/runtime/emit/between.js +38 -0
- package/dist/src/runtime/emit/between.js.map +1 -0
- package/dist/src/runtime/emit/binary.d.ts +0 -1
- package/dist/src/runtime/emit/binary.d.ts.map +1 -1
- package/dist/src/runtime/emit/binary.js +0 -36
- package/dist/src/runtime/emit/binary.js.map +1 -1
- package/dist/src/runtime/emit/column-reference.d.ts.map +1 -1
- package/dist/src/runtime/emit/column-reference.js +2 -26
- package/dist/src/runtime/emit/column-reference.js.map +1 -1
- package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
- package/dist/src/runtime/emit/constraint-check.js +14 -121
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/cte-reference.d.ts.map +1 -1
- package/dist/src/runtime/emit/cte-reference.js +16 -48
- package/dist/src/runtime/emit/cte-reference.js.map +1 -1
- package/dist/src/runtime/emit/distinct.d.ts.map +1 -1
- package/dist/src/runtime/emit/distinct.js +2 -8
- package/dist/src/runtime/emit/distinct.js.map +1 -1
- package/dist/src/runtime/emit/filter.d.ts.map +1 -1
- package/dist/src/runtime/emit/filter.js +6 -13
- package/dist/src/runtime/emit/filter.js.map +1 -1
- package/dist/src/runtime/emit/internal-recursive-cte-ref.d.ts +5 -0
- package/dist/src/runtime/emit/internal-recursive-cte-ref.d.ts.map +1 -0
- package/dist/src/runtime/emit/internal-recursive-cte-ref.js +23 -0
- package/dist/src/runtime/emit/internal-recursive-cte-ref.js.map +1 -0
- package/dist/src/runtime/emit/join.d.ts.map +1 -1
- package/dist/src/runtime/emit/join.js +40 -40
- package/dist/src/runtime/emit/join.js.map +1 -1
- package/dist/src/runtime/emit/project.d.ts.map +1 -1
- package/dist/src/runtime/emit/project.js +13 -13
- 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 +3 -14
- package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
- package/dist/src/runtime/emit/returning.d.ts.map +1 -1
- package/dist/src/runtime/emit/returning.js +7 -14
- package/dist/src/runtime/emit/returning.js.map +1 -1
- package/dist/src/runtime/emit/scan.d.ts +5 -2
- package/dist/src/runtime/emit/scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/scan.js +21 -17
- package/dist/src/runtime/emit/scan.js.map +1 -1
- package/dist/src/runtime/emit/sort.d.ts.map +1 -1
- package/dist/src/runtime/emit/sort.js +8 -11
- package/dist/src/runtime/emit/sort.js.map +1 -1
- package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
- package/dist/src/runtime/emit/subquery.js +95 -40
- package/dist/src/runtime/emit/subquery.js.map +1 -1
- package/dist/src/runtime/emit/table-valued-function.d.ts.map +1 -1
- package/dist/src/runtime/emit/table-valued-function.js +7 -22
- package/dist/src/runtime/emit/table-valued-function.js.map +1 -1
- package/dist/src/runtime/emit/update.d.ts.map +1 -1
- package/dist/src/runtime/emit/update.js +20 -27
- package/dist/src/runtime/emit/update.js.map +1 -1
- package/dist/src/runtime/emit/window.d.ts.map +1 -1
- package/dist/src/runtime/emit/window.js +55 -83
- 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 +49 -1
- 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 +5 -4
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/runtime/scheduler.d.ts.map +1 -1
- package/dist/src/runtime/scheduler.js +47 -42
- package/dist/src/runtime/scheduler.js.map +1 -1
- package/dist/src/runtime/types.d.ts +34 -0
- package/dist/src/runtime/types.d.ts.map +1 -1
- package/dist/src/runtime/types.js +21 -0
- package/dist/src/runtime/types.js.map +1 -1
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +29 -16
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/util/plugin-loader.d.ts +10 -1
- package/dist/src/util/plugin-loader.d.ts.map +1 -1
- package/dist/src/util/plugin-loader.js +56 -1
- package/dist/src/util/plugin-loader.js.map +1 -1
- package/dist/src/util/working-table-iterable.d.ts.map +1 -1
- package/dist/src/util/working-table-iterable.js +8 -8
- package/dist/src/util/working-table-iterable.js.map +1 -1
- package/dist/src/vtab/manifest.d.ts +36 -0
- package/dist/src/vtab/manifest.d.ts.map +1 -1
- package/package.json +8 -3
- package/src/core/database.ts +48 -6
- package/src/core/statement.ts +1 -49
- package/src/func/builtins/explain.ts +0 -11
- package/src/index.ts +39 -5
- package/src/parser/ast.ts +11 -2
- package/src/parser/parser.ts +40 -47
- package/src/planner/analysis/const-pass.ts +281 -270
- package/src/planner/building/constraint-builder.ts +114 -0
- package/src/planner/building/delete.ts +16 -3
- package/src/planner/building/expression.ts +35 -7
- package/src/planner/building/insert.ts +14 -1
- package/src/planner/building/select-aggregates.ts +57 -11
- package/src/planner/building/select-context.ts +22 -12
- package/src/planner/building/select-modifiers.ts +35 -21
- package/src/planner/building/select-projections.ts +25 -26
- package/src/planner/building/select-window.ts +14 -9
- package/src/planner/building/select.ts +163 -31
- package/src/planner/building/table.ts +1 -40
- package/src/planner/building/update.ts +19 -4
- package/src/planner/building/with.ts +12 -13
- package/src/planner/cache/correlation-detector.ts +83 -0
- package/src/planner/cache/materialization-advisory.ts +71 -50
- package/src/planner/cache/reference-graph.ts +115 -91
- package/src/planner/debug.ts +163 -0
- package/src/planner/framework/context.ts +36 -2
- package/src/planner/framework/registry.ts +261 -274
- package/src/planner/nodes/add-constraint-node.ts +5 -1
- package/src/planner/nodes/aggregate-node.ts +6 -4
- package/src/planner/nodes/cache-node.ts +2 -2
- package/src/planner/nodes/constraint-check-node.ts +47 -13
- package/src/planner/nodes/create-index-node.ts +5 -1
- package/src/planner/nodes/create-table-node.ts +5 -1
- package/src/planner/nodes/create-view-node.ts +5 -1
- package/src/planner/nodes/cte-node.ts +45 -14
- package/src/planner/nodes/cte-reference-node.ts +49 -13
- package/src/planner/nodes/delete-node.ts +31 -7
- package/src/planner/nodes/distinct-node.ts +2 -2
- package/src/planner/nodes/dml-executor-node.ts +2 -2
- package/src/planner/nodes/drop-table-node.ts +5 -1
- package/src/planner/nodes/drop-view-node.ts +5 -1
- package/src/planner/nodes/filter.ts +3 -3
- package/src/planner/nodes/function.ts +93 -93
- package/src/planner/nodes/insert-node.ts +28 -5
- package/src/planner/nodes/internal-recursive-cte-ref-node.ts +76 -0
- package/src/planner/nodes/join-node.ts +3 -3
- package/src/planner/nodes/limit-offset.ts +2 -2
- package/src/planner/nodes/plan-node-type.ts +1 -1
- package/src/planner/nodes/plan-node.ts +39 -2
- package/src/planner/nodes/project-node.ts +39 -19
- package/src/planner/nodes/recursive-cte-node.ts +37 -9
- package/src/planner/nodes/reference.ts +4 -2
- package/src/planner/nodes/returning-node.ts +25 -13
- package/src/planner/nodes/scalar.ts +95 -11
- package/src/planner/nodes/sequencing-node.ts +2 -2
- package/src/planner/nodes/set-operation-node.ts +3 -3
- package/src/planner/nodes/single-row.ts +7 -2
- package/src/planner/nodes/sink-node.ts +5 -5
- package/src/planner/nodes/sort.ts +2 -2
- package/src/planner/nodes/stream-aggregate.ts +76 -12
- package/src/planner/nodes/subquery.ts +90 -27
- package/src/planner/nodes/{physical-access-nodes.ts → table-access-nodes.ts} +6 -6
- package/src/planner/nodes/update-node.ts +31 -13
- package/src/planner/nodes/window-node.ts +28 -22
- package/src/planner/optimizer.ts +257 -263
- package/src/planner/planning-context.ts +15 -0
- package/src/planner/rules/access/rule-select-access-path.ts +68 -64
- package/src/planner/rules/aggregate/rule-aggregate-streaming.ts +74 -2
- package/src/planner/rules/cache/rule-materialization-advisory.ts +31 -27
- package/src/planner/scopes/base.ts +0 -17
- package/src/planner/scopes/empty.ts +0 -10
- package/src/planner/scopes/multi.ts +0 -1
- package/src/planner/scopes/param.ts +0 -1
- package/src/planner/scopes/registered.ts +1 -20
- package/src/planner/scopes/scope.ts +0 -12
- package/src/planner/validation/plan-validator.ts +1 -8
- package/src/runtime/context-helpers.ts +191 -0
- package/src/runtime/emission-context.ts +5 -2
- package/src/runtime/emit/aggregate.ts +131 -85
- package/src/runtime/emit/between.ts +51 -0
- package/src/runtime/emit/binary.ts +0 -46
- package/src/runtime/emit/column-reference.ts +3 -36
- package/src/runtime/emit/constraint-check.ts +17 -142
- package/src/runtime/emit/cte-reference.ts +23 -60
- package/src/runtime/emit/distinct.ts +2 -7
- package/src/runtime/emit/filter.ts +6 -13
- package/src/runtime/emit/internal-recursive-cte-ref.ts +37 -0
- package/src/runtime/emit/join.ts +45 -43
- package/src/runtime/emit/project.ts +18 -12
- package/src/runtime/emit/recursive-cte.ts +3 -12
- package/src/runtime/emit/returning.ts +7 -14
- package/src/runtime/emit/scan.ts +25 -23
- package/src/runtime/emit/sort.ts +8 -11
- package/src/runtime/emit/subquery.ts +108 -48
- package/src/runtime/emit/table-valued-function.ts +7 -20
- package/src/runtime/emit/update.ts +22 -29
- package/src/runtime/emit/window.ts +74 -88
- package/src/runtime/emitters.ts +52 -1
- package/src/runtime/register.ts +5 -4
- package/src/runtime/scheduler.ts +54 -54
- package/src/runtime/types.ts +45 -0
- package/src/schema/manager.ts +34 -19
- package/src/util/plugin-loader.ts +78 -4
- package/src/util/working-table-iterable.ts +15 -7
- package/src/vtab/manifest.ts +42 -0
- package/src/planner/nodes/scan.ts +0 -103
- package/src/planner/rules/physical/rule-mark-physical.ts +0 -37
- package/src/runtime/emit/table-reference.ts +0 -92
package/src/planner/optimizer.ts
CHANGED
|
@@ -1,263 +1,257 @@
|
|
|
1
|
-
import { createLogger } from '../common/logger.js';
|
|
2
|
-
import { PlanNode } from './nodes/plan-node.js';
|
|
3
|
-
import { PlanNodeType } from './nodes/plan-node-type.js';
|
|
4
|
-
import { OptimizerTuning, DEFAULT_TUNING } from './optimizer-tuning.js';
|
|
5
|
-
|
|
6
|
-
// Re-export for convenience
|
|
7
|
-
export { DEFAULT_TUNING };
|
|
8
|
-
|
|
9
|
-
import { applyRules,
|
|
10
|
-
import { tracePhaseStart, tracePhaseEnd, traceNodeStart, traceNodeEnd } from './framework/trace.js';
|
|
11
|
-
import { defaultStatsProvider, type StatsProvider } from './stats/index.js';
|
|
12
|
-
import { createOptContext, type OptContext } from './framework/context.js';
|
|
13
|
-
// Phase 2 rules
|
|
14
|
-
import { ruleMaterializationAdvisory } from './rules/cache/rule-materialization-advisory.js';
|
|
15
|
-
// Phase 1.5 rules
|
|
16
|
-
import { ruleSelectAccessPath } from './rules/access/rule-select-access-path.js';
|
|
17
|
-
// Core optimization rules
|
|
18
|
-
import { ruleAggregateStreaming } from './rules/aggregate/rule-aggregate-streaming.js';
|
|
19
|
-
// Constraint rules removed - now handled in builders for correctness
|
|
20
|
-
import { ruleCteOptimization } from './rules/cache/rule-cte-optimization.js';
|
|
21
|
-
import { ruleMutatingSubqueryCache } from './rules/cache/rule-mutating-subquery-cache.js';
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
toRegister.push(createRule(
|
|
81
|
-
'
|
|
82
|
-
PlanNodeType.
|
|
83
|
-
'impl',
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
));
|
|
87
|
-
|
|
88
|
-
// toRegister.push(createRule(
|
|
89
|
-
// 'project-optimization',
|
|
90
|
-
// PlanNodeType.Project,
|
|
91
|
-
// 'impl',
|
|
92
|
-
// ruleProjectOptimization,
|
|
93
|
-
// 50 // Medium priority - basic optimization
|
|
94
|
-
// ));
|
|
95
|
-
|
|
96
|
-
// toRegister.push(createRule(
|
|
97
|
-
// 'filter-optimization',
|
|
98
|
-
// PlanNodeType.Filter,
|
|
99
|
-
// 'impl',
|
|
100
|
-
// ruleFilterOptimization,
|
|
101
|
-
// 50 // Medium priority - basic optimization
|
|
102
|
-
// ));
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
//
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
PlanNodeType.Block,
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
//
|
|
126
|
-
|
|
127
|
-
PlanNodeType.
|
|
128
|
-
PlanNodeType.
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
if (
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
//
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
* Get the statistics provider
|
|
259
|
-
*/
|
|
260
|
-
getStats(): StatsProvider {
|
|
261
|
-
return this.stats;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
1
|
+
import { createLogger } from '../common/logger.js';
|
|
2
|
+
import { PlanNode } from './nodes/plan-node.js';
|
|
3
|
+
import { PlanNodeType } from './nodes/plan-node-type.js';
|
|
4
|
+
import { OptimizerTuning, DEFAULT_TUNING } from './optimizer-tuning.js';
|
|
5
|
+
|
|
6
|
+
// Re-export for convenience
|
|
7
|
+
export { DEFAULT_TUNING };
|
|
8
|
+
|
|
9
|
+
import { applyRules, registerRules, createRule } from './framework/registry.js';
|
|
10
|
+
import { tracePhaseStart, tracePhaseEnd, traceNodeStart, traceNodeEnd } from './framework/trace.js';
|
|
11
|
+
import { defaultStatsProvider, type StatsProvider } from './stats/index.js';
|
|
12
|
+
import { createOptContext, type OptContext } from './framework/context.js';
|
|
13
|
+
// Phase 2 rules
|
|
14
|
+
import { ruleMaterializationAdvisory } from './rules/cache/rule-materialization-advisory.js';
|
|
15
|
+
// Phase 1.5 rules
|
|
16
|
+
import { ruleSelectAccessPath } from './rules/access/rule-select-access-path.js';
|
|
17
|
+
// Core optimization rules
|
|
18
|
+
import { ruleAggregateStreaming } from './rules/aggregate/rule-aggregate-streaming.js';
|
|
19
|
+
// Constraint rules removed - now handled in builders for correctness
|
|
20
|
+
import { ruleCteOptimization } from './rules/cache/rule-cte-optimization.js';
|
|
21
|
+
import { ruleMutatingSubqueryCache } from './rules/cache/rule-mutating-subquery-cache.js';
|
|
22
|
+
// Phase 3 rules
|
|
23
|
+
import { validatePhysicalTree } from './validation/plan-validator.js';
|
|
24
|
+
import { Database } from '../core/database.js';
|
|
25
|
+
import { performConstantFolding } from './analysis/const-pass.js';
|
|
26
|
+
import { createRuntimeExpressionEvaluator } from './analysis/const-evaluator.js';
|
|
27
|
+
|
|
28
|
+
const log = createLogger('optimizer');
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The query optimizer transforms logical plan trees into physical plan trees
|
|
32
|
+
*/
|
|
33
|
+
export class Optimizer {
|
|
34
|
+
private readonly stats: StatsProvider;
|
|
35
|
+
|
|
36
|
+
constructor(
|
|
37
|
+
public readonly tuning: OptimizerTuning = DEFAULT_TUNING,
|
|
38
|
+
stats?: StatsProvider
|
|
39
|
+
) {
|
|
40
|
+
this.stats = stats ?? defaultStatsProvider;
|
|
41
|
+
|
|
42
|
+
// Ensure global framework rules are registered once
|
|
43
|
+
Optimizer.ensureGlobalRulesRegistered();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
private static globalRulesRegistered = false;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Ensure global framework rules are registered only once
|
|
50
|
+
*/
|
|
51
|
+
private static ensureGlobalRulesRegistered(): void {
|
|
52
|
+
if (Optimizer.globalRulesRegistered) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
Optimizer.globalRulesRegistered = true;
|
|
56
|
+
|
|
57
|
+
const toRegister = [];
|
|
58
|
+
|
|
59
|
+
// Note: Single-pass constant folding is done before rules
|
|
60
|
+
|
|
61
|
+
// Mutating subquery cache injection - critical for correctness
|
|
62
|
+
toRegister.push(createRule(
|
|
63
|
+
'mutating-subquery-cache',
|
|
64
|
+
PlanNodeType.Join,
|
|
65
|
+
'rewrite',
|
|
66
|
+
ruleMutatingSubqueryCache,
|
|
67
|
+
20 // Very high priority - correctness fix to prevent multiple execution
|
|
68
|
+
));
|
|
69
|
+
|
|
70
|
+
// Phase 1.5 rules
|
|
71
|
+
toRegister.push(createRule(
|
|
72
|
+
'select-access-path',
|
|
73
|
+
PlanNodeType.TableReference,
|
|
74
|
+
'impl',
|
|
75
|
+
ruleSelectAccessPath,
|
|
76
|
+
25 // High priority - fundamental access path selection
|
|
77
|
+
));
|
|
78
|
+
|
|
79
|
+
// Core optimization rules (converted from old system)
|
|
80
|
+
toRegister.push(createRule(
|
|
81
|
+
'aggregate-streaming',
|
|
82
|
+
PlanNodeType.Aggregate,
|
|
83
|
+
'impl',
|
|
84
|
+
ruleAggregateStreaming,
|
|
85
|
+
40 // High priority - fundamental logical→physical transformation
|
|
86
|
+
));
|
|
87
|
+
|
|
88
|
+
// toRegister.push(createRule(
|
|
89
|
+
// 'project-optimization',
|
|
90
|
+
// PlanNodeType.Project,
|
|
91
|
+
// 'impl',
|
|
92
|
+
// ruleProjectOptimization,
|
|
93
|
+
// 50 // Medium priority - basic optimization
|
|
94
|
+
// ));
|
|
95
|
+
|
|
96
|
+
// toRegister.push(createRule(
|
|
97
|
+
// 'filter-optimization',
|
|
98
|
+
// PlanNodeType.Filter,
|
|
99
|
+
// 'impl',
|
|
100
|
+
// ruleFilterOptimization,
|
|
101
|
+
// 50 // Medium priority - basic optimization
|
|
102
|
+
// ));
|
|
103
|
+
|
|
104
|
+
toRegister.push(createRule(
|
|
105
|
+
'cte-optimization',
|
|
106
|
+
PlanNodeType.CTE,
|
|
107
|
+
'impl',
|
|
108
|
+
ruleCteOptimization,
|
|
109
|
+
70 // Lower priority - caching optimization
|
|
110
|
+
));
|
|
111
|
+
|
|
112
|
+
// Phase 2 rules - Materialization advisory
|
|
113
|
+
// TODO: Can we apply this more generally rather than assuming certain node types?
|
|
114
|
+
// Register for all node types that can have relational children
|
|
115
|
+
const nodeTypesWithRelationalChildren = [
|
|
116
|
+
PlanNodeType.Block, // Contains statements
|
|
117
|
+
PlanNodeType.ScalarSubquery, // Contains relational subquery
|
|
118
|
+
PlanNodeType.Exists, // Contains relational subquery
|
|
119
|
+
PlanNodeType.In, // Can contain relational subquery
|
|
120
|
+
PlanNodeType.Insert, // Has source relation
|
|
121
|
+
PlanNodeType.Update, // Has source relation
|
|
122
|
+
PlanNodeType.Delete, // Has source relation
|
|
123
|
+
PlanNodeType.CTE, // Has definition relation
|
|
124
|
+
PlanNodeType.RecursiveCTE, // Has anchor/recursive relations
|
|
125
|
+
PlanNodeType.Returning, // Wraps DML operations
|
|
126
|
+
// Scalar nodes that might contain subqueries
|
|
127
|
+
PlanNodeType.ScalarFunctionCall, // Function args might be subqueries
|
|
128
|
+
PlanNodeType.CaseExpr, // CASE conditions might be subqueries
|
|
129
|
+
];
|
|
130
|
+
|
|
131
|
+
for (const nodeType of nodeTypesWithRelationalChildren) {
|
|
132
|
+
toRegister.push(createRule(
|
|
133
|
+
'materialization-advisory',
|
|
134
|
+
nodeType,
|
|
135
|
+
'rewrite',
|
|
136
|
+
ruleMaterializationAdvisory,
|
|
137
|
+
90 // Low priority - run last for global analysis
|
|
138
|
+
));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Register all rules at once
|
|
142
|
+
registerRules(toRegister);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Optimize a plan tree by applying transformation rules
|
|
147
|
+
*/
|
|
148
|
+
optimize(plan: PlanNode, db: Database): PlanNode {
|
|
149
|
+
log('Starting optimization of plan', plan.nodeType);
|
|
150
|
+
|
|
151
|
+
// Create optimization context
|
|
152
|
+
const context = createOptContext(this, this.stats, this.tuning, db);
|
|
153
|
+
|
|
154
|
+
tracePhaseStart('optimization');
|
|
155
|
+
try {
|
|
156
|
+
// Phase 0: Single-pass constant folding before other rules
|
|
157
|
+
log('Running constant folding pre-pass');
|
|
158
|
+
const constantFoldedPlan = this.performConstantFolding(plan, context);
|
|
159
|
+
|
|
160
|
+
// Continue with rule-based optimization
|
|
161
|
+
const result = this.optimizeNode(constantFoldedPlan, context);
|
|
162
|
+
|
|
163
|
+
// Phase 3: Validate the physical plan before returning
|
|
164
|
+
if (this.tuning.debug.validatePlan) {
|
|
165
|
+
log('Running plan validation');
|
|
166
|
+
try {
|
|
167
|
+
validatePhysicalTree(result);
|
|
168
|
+
log('Plan validation passed');
|
|
169
|
+
} catch (error) {
|
|
170
|
+
log('Plan validation failed: %s', error);
|
|
171
|
+
throw error;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return result;
|
|
176
|
+
} finally {
|
|
177
|
+
tracePhaseEnd('optimization');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Perform single-pass constant folding over the entire plan tree
|
|
183
|
+
*/
|
|
184
|
+
private performConstantFolding(plan: PlanNode, context: OptContext): PlanNode {
|
|
185
|
+
// Create runtime expression evaluator
|
|
186
|
+
const evaluator = createRuntimeExpressionEvaluator(context.db);
|
|
187
|
+
|
|
188
|
+
// Perform single-pass constant folding
|
|
189
|
+
const result = performConstantFolding(plan, evaluator);
|
|
190
|
+
|
|
191
|
+
log('Constant folding completed');
|
|
192
|
+
return result;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
optimizeNode(node: PlanNode, context: OptContext): PlanNode {
|
|
196
|
+
traceNodeStart(node);
|
|
197
|
+
|
|
198
|
+
// Check if we've already optimized this exact node instance
|
|
199
|
+
const cached = context.optimizedNodes.get(node.id);
|
|
200
|
+
if (cached) {
|
|
201
|
+
log('Reusing optimized version of shared node %s (%s)', node.id, node.nodeType);
|
|
202
|
+
traceNodeEnd(node, cached);
|
|
203
|
+
return cached;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Note: We removed the broken `if (node.physical)` check here
|
|
207
|
+
// The `physical` property is always truthy (it returns a PhysicalProperties object)
|
|
208
|
+
// Physical vs logical distinction should be handled by the rules themselves
|
|
209
|
+
|
|
210
|
+
// First optimize all children
|
|
211
|
+
const optimizedNode = this.optimizeChildren(node, context);
|
|
212
|
+
|
|
213
|
+
// Apply rules
|
|
214
|
+
const rulesApplied = applyRules(optimizedNode, context);
|
|
215
|
+
|
|
216
|
+
if (rulesApplied !== optimizedNode) {
|
|
217
|
+
// Rules transformed the node
|
|
218
|
+
log(`Rules applied to ${optimizedNode.nodeType}, transformed to ${rulesApplied.nodeType}`);
|
|
219
|
+
traceNodeEnd(node, rulesApplied);
|
|
220
|
+
|
|
221
|
+
// Cache the final result
|
|
222
|
+
context.optimizedNodes.set(node.id, rulesApplied);
|
|
223
|
+
return rulesApplied;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// No rule applied - assume node is physical
|
|
227
|
+
traceNodeEnd(node, optimizedNode);
|
|
228
|
+
|
|
229
|
+
// Cache the result even if no rules applied
|
|
230
|
+
context.optimizedNodes.set(node.id, optimizedNode);
|
|
231
|
+
return optimizedNode;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
private optimizeChildren(node: PlanNode, context: OptContext): PlanNode {
|
|
235
|
+
// Generic tree walk using withChildren
|
|
236
|
+
const originalChildren = node.getChildren();
|
|
237
|
+
const optimizedChildren = originalChildren.map(child => this.optimizeNode(child, context));
|
|
238
|
+
|
|
239
|
+
// Check if any children changed
|
|
240
|
+
const childrenChanged = optimizedChildren.some((child, i) => child !== originalChildren[i]);
|
|
241
|
+
|
|
242
|
+
if (!childrenChanged) {
|
|
243
|
+
return node; // No changes
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Use withChildren to create new node with optimized children
|
|
247
|
+
// withChildren is a required contract - any errors should propagate
|
|
248
|
+
return node.withChildren(optimizedChildren);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Get the statistics provider
|
|
253
|
+
*/
|
|
254
|
+
getStats(): StatsProvider {
|
|
255
|
+
return this.stats;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
@@ -3,6 +3,8 @@ import type { Database } from '../core/database.js';
|
|
|
3
3
|
import type { SchemaManager } from '../schema/manager.js';
|
|
4
4
|
import type { Scope } from './scopes/scope.js';
|
|
5
5
|
import type { ScalarPlanNode } from './nodes/plan-node.js';
|
|
6
|
+
import type { CTEPlanNode } from './nodes/cte-node.js';
|
|
7
|
+
import type { CTEReferenceNode } from './nodes/cte-reference-node.js';
|
|
6
8
|
|
|
7
9
|
/**
|
|
8
10
|
* Debug options for query planning and execution.
|
|
@@ -156,6 +158,13 @@ export interface PlanningContext {
|
|
|
156
158
|
attributeId: number;
|
|
157
159
|
}>;
|
|
158
160
|
|
|
161
|
+
/**
|
|
162
|
+
* Active CTEs available in the current planning context.
|
|
163
|
+
* This map contains all CTEs from the current WITH clause and any parent WITH clauses,
|
|
164
|
+
* allowing subqueries in expressions to resolve CTE references correctly.
|
|
165
|
+
*/
|
|
166
|
+
readonly cteNodes?: Map<string, CTEPlanNode>;
|
|
167
|
+
|
|
159
168
|
/**
|
|
160
169
|
* Schema dependency tracker for this planning session.
|
|
161
170
|
*/
|
|
@@ -165,4 +174,10 @@ export interface PlanningContext {
|
|
|
165
174
|
* Schema object cache for resolved objects during planning.
|
|
166
175
|
*/
|
|
167
176
|
readonly schemaCache: Map<string, any>;
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Cache for CTE reference nodes to ensure consistent attribute IDs across multiple references
|
|
180
|
+
* to the same CTE with the same alias. Key format: "cteName:alias"
|
|
181
|
+
*/
|
|
182
|
+
cteReferenceCache?: Map<string, CTEReferenceNode>;
|
|
168
183
|
}
|