@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/schema/manager.ts
CHANGED
|
@@ -473,7 +473,7 @@ export class SchemaManager {
|
|
|
473
473
|
}
|
|
474
474
|
|
|
475
475
|
// Check if the virtual table module supports xCreateIndex
|
|
476
|
-
if (
|
|
476
|
+
if (!tableSchema.vtabModule.xCreateIndex) {
|
|
477
477
|
throw new QuereusError(`Virtual table module '${tableSchema.vtabModuleName}' for table '${tableName}' does not support CREATE INDEX.`, StatusCode.ERROR, undefined, stmt.table.loc?.start.line, stmt.table.loc?.start.column);
|
|
478
478
|
}
|
|
479
479
|
|
|
@@ -518,19 +518,26 @@ export class SchemaManager {
|
|
|
518
518
|
|
|
519
519
|
try {
|
|
520
520
|
// Call xCreateIndex on the virtual table module
|
|
521
|
-
await tableSchema.vtabModule.xCreateIndex
|
|
521
|
+
await tableSchema.vtabModule.xCreateIndex(
|
|
522
522
|
this.db,
|
|
523
523
|
targetSchemaName,
|
|
524
524
|
tableName,
|
|
525
525
|
indexSchema
|
|
526
526
|
);
|
|
527
527
|
|
|
528
|
-
// Update the table schema with the new index
|
|
528
|
+
// Update the table schema with the new index by creating a new schema object
|
|
529
529
|
const updatedIndexes = [...(tableSchema.indexes || []), indexSchema];
|
|
530
|
-
|
|
530
|
+
const updatedTableSchema: TableSchema = {
|
|
531
|
+
...tableSchema,
|
|
532
|
+
indexes: Object.freeze(updatedIndexes),
|
|
533
|
+
};
|
|
534
|
+
|
|
535
|
+
// Replace the table schema in the schema
|
|
536
|
+
const schema = this.getSchemaOrFail(targetSchemaName);
|
|
537
|
+
schema.addTable(updatedTableSchema);
|
|
531
538
|
|
|
532
539
|
log(`Successfully created index %s on table %s.%s`, indexName, targetSchemaName, tableName);
|
|
533
|
-
} catch (e:
|
|
540
|
+
} catch (e: unknown) {
|
|
534
541
|
const message = e instanceof Error ? e.message : String(e);
|
|
535
542
|
const code = e instanceof QuereusError ? e.code : StatusCode.ERROR;
|
|
536
543
|
throw new QuereusError(`xCreateIndex failed for index '${indexName}' on table '${tableName}': ${message}`, code, e instanceof Error ? e : undefined, stmt.loc?.start.line, stmt.loc?.start.column);
|
|
@@ -634,7 +641,7 @@ export class SchemaManager {
|
|
|
634
641
|
this.db,
|
|
635
642
|
baseTableSchema
|
|
636
643
|
);
|
|
637
|
-
} catch (e:
|
|
644
|
+
} catch (e: unknown) {
|
|
638
645
|
const message = e instanceof Error ? e.message : String(e);
|
|
639
646
|
const code = e instanceof QuereusError ? e.code : StatusCode.ERROR;
|
|
640
647
|
throw new QuereusError(`Module '${moduleName}' xCreate failed for table '${tableName}': ${message}`, code, e instanceof Error ? e : undefined, stmt.loc?.start.line, stmt.loc?.start.column);
|
|
@@ -650,20 +657,28 @@ export class SchemaManager {
|
|
|
650
657
|
throw new QuereusError(`Module '${moduleName}' xCreate did not provide a tableSchema for '${tableName}'.`, StatusCode.INTERNAL);
|
|
651
658
|
}
|
|
652
659
|
|
|
660
|
+
// Create a properly typed schema object instead of mutating properties
|
|
661
|
+
let correctedSchema = finalRegisteredSchema;
|
|
653
662
|
if (finalRegisteredSchema.name.toLowerCase() !== tableName.toLowerCase() ||
|
|
654
663
|
finalRegisteredSchema.schemaName.toLowerCase() !== targetSchemaName.toLowerCase()) {
|
|
655
|
-
warnLog(`Module ${moduleName} returned schema for ${finalRegisteredSchema.schemaName}.${finalRegisteredSchema.name} but expected ${targetSchemaName}.${tableName}.
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
(finalRegisteredSchema as any).vtabModule = moduleInfo.module;
|
|
662
|
-
(finalRegisteredSchema as any).vtabAuxData = moduleInfo.auxData;
|
|
663
|
-
if (finalRegisteredSchema.estimatedRows === undefined) {
|
|
664
|
-
(finalRegisteredSchema as any).estimatedRows = 0;
|
|
664
|
+
warnLog(`Module ${moduleName} returned schema for ${finalRegisteredSchema.schemaName}.${finalRegisteredSchema.name} but expected ${targetSchemaName}.${tableName}. Correcting name/schemaName.`);
|
|
665
|
+
correctedSchema = {
|
|
666
|
+
...finalRegisteredSchema,
|
|
667
|
+
name: tableName,
|
|
668
|
+
schemaName: targetSchemaName,
|
|
669
|
+
};
|
|
665
670
|
}
|
|
666
671
|
|
|
672
|
+
// Ensure all required properties are properly set
|
|
673
|
+
const completeTableSchema: TableSchema = {
|
|
674
|
+
...correctedSchema,
|
|
675
|
+
vtabModuleName: moduleName,
|
|
676
|
+
vtabArgs: effectiveModuleArgs,
|
|
677
|
+
vtabModule: moduleInfo.module,
|
|
678
|
+
vtabAuxData: moduleInfo.auxData,
|
|
679
|
+
estimatedRows: correctedSchema.estimatedRows ?? 0,
|
|
680
|
+
};
|
|
681
|
+
|
|
667
682
|
const existingTable = schema.getTable(tableName);
|
|
668
683
|
const existingView = schema.getView(tableName);
|
|
669
684
|
|
|
@@ -678,7 +693,7 @@ export class SchemaManager {
|
|
|
678
693
|
}
|
|
679
694
|
}
|
|
680
695
|
|
|
681
|
-
schema.addTable(
|
|
696
|
+
schema.addTable(completeTableSchema);
|
|
682
697
|
log(`Successfully created table %s.%s using module %s`, targetSchemaName, tableName, moduleName);
|
|
683
698
|
|
|
684
699
|
// Notify schema change listeners
|
|
@@ -686,9 +701,9 @@ export class SchemaManager {
|
|
|
686
701
|
type: 'table_added',
|
|
687
702
|
schemaName: targetSchemaName,
|
|
688
703
|
objectName: tableName,
|
|
689
|
-
newObject:
|
|
704
|
+
newObject: completeTableSchema
|
|
690
705
|
});
|
|
691
706
|
|
|
692
|
-
return
|
|
707
|
+
return completeTableSchema;
|
|
693
708
|
}
|
|
694
709
|
}
|
|
@@ -1,7 +1,21 @@
|
|
|
1
1
|
import type { Database } from '../core/database.js';
|
|
2
|
-
import type { PluginManifest } from '../vtab/manifest.js';
|
|
2
|
+
import type { PluginManifest, PluginRegistrations } from '../vtab/manifest.js';
|
|
3
3
|
import { StatusCode, type SqlValue } from '../common/types.js';
|
|
4
4
|
import { quereusError } from '../common/errors.js';
|
|
5
|
+
import { createLogger } from '../common/logger.js';
|
|
6
|
+
|
|
7
|
+
const log = createLogger('util:plugin-loader');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Plugin module interface - what we expect from a plugin module
|
|
11
|
+
*/
|
|
12
|
+
export interface PluginModule {
|
|
13
|
+
/** Plugin manifest with metadata */
|
|
14
|
+
manifest?: PluginManifest;
|
|
15
|
+
|
|
16
|
+
/** Default export - the plugin registration function */
|
|
17
|
+
default: (db: Database, config: Record<string, SqlValue>) => Promise<PluginRegistrations> | PluginRegistrations;
|
|
18
|
+
}
|
|
5
19
|
|
|
6
20
|
/**
|
|
7
21
|
* Dynamically loads and registers a plugin module
|
|
@@ -24,7 +38,7 @@ export async function dynamicLoadModule(
|
|
|
24
38
|
}
|
|
25
39
|
|
|
26
40
|
// Dynamic import with Vite ignore comment for bundler compatibility
|
|
27
|
-
const mod = await import(/* @vite-ignore */ moduleUrl.toString());
|
|
41
|
+
const mod = await import(/* @vite-ignore */ moduleUrl.toString()) as PluginModule;
|
|
28
42
|
|
|
29
43
|
// Validate module structure
|
|
30
44
|
if (typeof mod.default !== 'function') {
|
|
@@ -32,16 +46,74 @@ export async function dynamicLoadModule(
|
|
|
32
46
|
}
|
|
33
47
|
|
|
34
48
|
// Call the module's register function with the database and config
|
|
35
|
-
await mod.default(db, config);
|
|
49
|
+
const registrations = await mod.default(db, config);
|
|
50
|
+
|
|
51
|
+
// Register all the items the plugin provides
|
|
52
|
+
await registerPluginItems(db, registrations);
|
|
53
|
+
|
|
54
|
+
log('Successfully loaded plugin from %s', url);
|
|
55
|
+
if (registrations.vtables?.length) {
|
|
56
|
+
log(' Registered %d vtable module(s): %s', registrations.vtables.length,
|
|
57
|
+
registrations.vtables.map(v => v.name).join(', '));
|
|
58
|
+
}
|
|
59
|
+
if (registrations.functions?.length) {
|
|
60
|
+
log(' Registered %d function(s): %s', registrations.functions.length,
|
|
61
|
+
registrations.functions.map(f => `${f.schema.name}/${f.schema.numArgs}`).join(', '));
|
|
62
|
+
}
|
|
63
|
+
if (registrations.collations?.length) {
|
|
64
|
+
log(' Registered %d collation(s): %s', registrations.collations.length,
|
|
65
|
+
registrations.collations.map(c => c.name).join(', '));
|
|
66
|
+
}
|
|
36
67
|
|
|
37
68
|
// Return the manifest if available
|
|
38
|
-
return mod.manifest
|
|
69
|
+
return mod.manifest;
|
|
39
70
|
} catch (error) {
|
|
40
71
|
const message = error instanceof Error ? error.message : String(error);
|
|
41
72
|
quereusError(`Failed to load plugin from ${url}: ${message}`);
|
|
42
73
|
}
|
|
43
74
|
}
|
|
44
75
|
|
|
76
|
+
/**
|
|
77
|
+
* Registers all items provided by a plugin
|
|
78
|
+
*
|
|
79
|
+
* @param db Database instance to register with
|
|
80
|
+
* @param registrations The items to register
|
|
81
|
+
*/
|
|
82
|
+
async function registerPluginItems(db: Database, registrations: PluginRegistrations): Promise<void> {
|
|
83
|
+
// Register virtual table modules
|
|
84
|
+
if (registrations.vtables) {
|
|
85
|
+
for (const vtable of registrations.vtables) {
|
|
86
|
+
try {
|
|
87
|
+
db.registerVtabModule(vtable.name, vtable.module, vtable.auxData);
|
|
88
|
+
} catch (error) {
|
|
89
|
+
quereusError(`Failed to register vtable module '${vtable.name}': ${error instanceof Error ? error.message : String(error)}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Register functions
|
|
95
|
+
if (registrations.functions) {
|
|
96
|
+
for (const func of registrations.functions) {
|
|
97
|
+
try {
|
|
98
|
+
db.registerFunction(func.schema);
|
|
99
|
+
} catch (error) {
|
|
100
|
+
quereusError(`Failed to register function '${func.schema.name}/${func.schema.numArgs}': ${error instanceof Error ? error.message : String(error)}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Register collations
|
|
106
|
+
if (registrations.collations) {
|
|
107
|
+
for (const collation of registrations.collations) {
|
|
108
|
+
try {
|
|
109
|
+
db.registerCollation(collation.name, collation.func);
|
|
110
|
+
} catch (error) {
|
|
111
|
+
quereusError(`Failed to register collation '${collation.name}': ${error instanceof Error ? error.message : String(error)}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
45
117
|
/**
|
|
46
118
|
* Validates that a URL is likely to be a valid plugin module
|
|
47
119
|
*
|
|
@@ -67,3 +139,5 @@ export function validatePluginUrl(url: string): boolean {
|
|
|
67
139
|
return false;
|
|
68
140
|
}
|
|
69
141
|
}
|
|
142
|
+
|
|
143
|
+
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Row } from '../common/types.js';
|
|
2
2
|
import type { RuntimeContext } from '../runtime/types.js';
|
|
3
3
|
import type { RowDescriptor } from '../planner/nodes/plan-node.js';
|
|
4
|
+
import { withRowContextGenerator } from '../runtime/context-helpers.js';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* A reusable async iterable for working table data that can be iterated multiple times.
|
|
@@ -16,15 +17,22 @@ export class WorkingTableIterable implements AsyncIterable<Row> {
|
|
|
16
17
|
) {}
|
|
17
18
|
|
|
18
19
|
async *[Symbol.asyncIterator](): AsyncIterator<Row> {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
try {
|
|
20
|
+
// Convert rows array to async iterable
|
|
21
|
+
async function* rowsIterable(rows: Row[]): AsyncIterable<Row> {
|
|
22
|
+
for (const row of rows) {
|
|
23
23
|
yield row;
|
|
24
|
-
} finally {
|
|
25
|
-
// Clean up context
|
|
26
|
-
this.rctx.context.delete(this.rowDescriptor);
|
|
27
24
|
}
|
|
28
25
|
}
|
|
26
|
+
|
|
27
|
+
// Use the helper to manage context
|
|
28
|
+
yield* withRowContextGenerator(
|
|
29
|
+
this.rctx,
|
|
30
|
+
this.rowDescriptor,
|
|
31
|
+
rowsIterable(this.rows),
|
|
32
|
+
async function* (row) {
|
|
33
|
+
yield row;
|
|
34
|
+
}
|
|
35
|
+
);
|
|
29
36
|
}
|
|
30
37
|
}
|
|
38
|
+
|
package/src/vtab/manifest.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { SqlValue } from '../common/types.js';
|
|
2
|
+
import type { FunctionSchema } from '../schema/function.js';
|
|
3
|
+
import type { CollationFunction } from '../util/comparison.js';
|
|
2
4
|
|
|
3
5
|
/**
|
|
4
6
|
* Configuration setting definition for a plugin
|
|
@@ -12,6 +14,39 @@ export interface PluginSetting {
|
|
|
12
14
|
help?: string;
|
|
13
15
|
}
|
|
14
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Virtual table module registration info
|
|
19
|
+
*/
|
|
20
|
+
export interface VTablePluginInfo {
|
|
21
|
+
name: string; // module name for registration
|
|
22
|
+
module: any; // the VirtualTableModule implementation
|
|
23
|
+
auxData?: unknown; // optional auxiliary data
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Function registration info
|
|
28
|
+
*/
|
|
29
|
+
export interface FunctionPluginInfo {
|
|
30
|
+
schema: FunctionSchema; // complete function schema
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Collation registration info
|
|
35
|
+
*/
|
|
36
|
+
export interface CollationPluginInfo {
|
|
37
|
+
name: string; // collation name
|
|
38
|
+
func: CollationFunction; // comparison function
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Plugin registration items - what the plugin wants to register
|
|
43
|
+
*/
|
|
44
|
+
export interface PluginRegistrations {
|
|
45
|
+
vtables?: VTablePluginInfo[];
|
|
46
|
+
functions?: FunctionPluginInfo[];
|
|
47
|
+
collations?: CollationPluginInfo[];
|
|
48
|
+
}
|
|
49
|
+
|
|
15
50
|
/**
|
|
16
51
|
* Plugin manifest that describes the plugin's metadata and configuration options
|
|
17
52
|
*/
|
|
@@ -23,6 +58,13 @@ export interface PluginManifest {
|
|
|
23
58
|
pragmaPrefix?: string; // default = name, used for PRAGMA commands
|
|
24
59
|
settings?: PluginSetting[]; // configuration options
|
|
25
60
|
capabilities?: string[]; // e.g. ['scan', 'index', 'write']
|
|
61
|
+
|
|
62
|
+
// Plugin type indicators (for UI display)
|
|
63
|
+
provides?: {
|
|
64
|
+
vtables?: string[]; // names of vtable modules provided
|
|
65
|
+
functions?: string[]; // names of functions provided
|
|
66
|
+
collations?: string[]; // names of collations provided
|
|
67
|
+
};
|
|
26
68
|
}
|
|
27
69
|
|
|
28
70
|
/**
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import { PlanNodeType } from './plan-node-type.js';
|
|
2
|
-
import { PlanNode, type UnaryRelationalNode, type PhysicalProperties, type Attribute } from './plan-node.js';
|
|
3
|
-
import { TableReferenceNode } from './reference.js';
|
|
4
|
-
import type { RelationType } from '../../common/datatype.js';
|
|
5
|
-
import type { Scope } from '../scopes/scope.js';
|
|
6
|
-
import { Cached } from '../../util/cached.js';
|
|
7
|
-
import type { FilterInfo } from '../../vtab/filter-info.js';
|
|
8
|
-
import { quereusError } from '../../common/errors.js';
|
|
9
|
-
import { StatusCode } from '../../common/types.js';
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Represents a table scan operation (full or filtered).
|
|
13
|
-
* This is a physical node that accesses actual table data.
|
|
14
|
-
*/
|
|
15
|
-
export class TableScanNode extends PlanNode implements UnaryRelationalNode {
|
|
16
|
-
override readonly nodeType = PlanNodeType.TableScan;
|
|
17
|
-
|
|
18
|
-
private outputType: Cached<RelationType>;
|
|
19
|
-
|
|
20
|
-
constructor(
|
|
21
|
-
scope: Scope,
|
|
22
|
-
public readonly source: TableReferenceNode,
|
|
23
|
-
public readonly filterInfo: FilterInfo,
|
|
24
|
-
estimatedCostOverride?: number
|
|
25
|
-
) {
|
|
26
|
-
super(scope, estimatedCostOverride ?? filterInfo.indexInfoOutput.estimatedCost);
|
|
27
|
-
|
|
28
|
-
this.outputType = new Cached(() => this.source.getType());
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
getType(): RelationType {
|
|
32
|
-
return this.outputType.value;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
getAttributes(): Attribute[] {
|
|
36
|
-
// Table scans produce the same attributes as their source table reference
|
|
37
|
-
return this.source.getAttributes();
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
getChildren(): readonly [TableReferenceNode] {
|
|
41
|
-
return [this.source];
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
getRelations(): readonly [TableReferenceNode] {
|
|
45
|
-
return [this.source];
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
withChildren(newChildren: readonly PlanNode[]): PlanNode {
|
|
49
|
-
if (newChildren.length !== 1) {
|
|
50
|
-
quereusError(`TableScanNode expects 1 child, got ${newChildren.length}`, StatusCode.INTERNAL);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const [newSource] = newChildren;
|
|
54
|
-
|
|
55
|
-
// Type check - TableScanNode specifically needs a TableReferenceNode
|
|
56
|
-
if (!(newSource instanceof TableReferenceNode)) {
|
|
57
|
-
quereusError('TableScanNode: child must be a TableReferenceNode', StatusCode.INTERNAL);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Return same instance if nothing changed
|
|
61
|
-
if (newSource === this.source) {
|
|
62
|
-
return this;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Create new instance preserving attributes (scan preserves table attributes)
|
|
66
|
-
return new TableScanNode(
|
|
67
|
-
this.scope,
|
|
68
|
-
newSource,
|
|
69
|
-
this.filterInfo
|
|
70
|
-
);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
get estimatedRows(): number | undefined {
|
|
74
|
-
return Number(this.filterInfo.indexInfoOutput.estimatedRows);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
override computePhysical(): Partial<PhysicalProperties> {
|
|
78
|
-
const tableType = this.source.getType();
|
|
79
|
-
|
|
80
|
-
return {
|
|
81
|
-
estimatedRows: this.estimatedRows,
|
|
82
|
-
// Table scans preserve the logical keys from the table schema
|
|
83
|
-
uniqueKeys: tableType.keys.map(key => key.map(colRef => colRef.index)),
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
override toString(): string {
|
|
88
|
-
return `SCAN ${this.source.tableSchema.name}`;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
override getLogicalAttributes(): Record<string, unknown> {
|
|
92
|
-
return {
|
|
93
|
-
table: this.source.tableSchema.name,
|
|
94
|
-
schema: this.source.tableSchema.schemaName,
|
|
95
|
-
filterInfo: {
|
|
96
|
-
usableIndex: this.filterInfo.indexInfoOutput.idxStr,
|
|
97
|
-
matchedClauses: this.filterInfo.indexInfoOutput.aConstraintUsage?.length || 0,
|
|
98
|
-
estimatedCost: this.filterInfo.indexInfoOutput.estimatedCost,
|
|
99
|
-
estimatedRows: this.filterInfo.indexInfoOutput.estimatedRows
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rule: Mark Physical (Fallback)
|
|
3
|
-
*
|
|
4
|
-
* Transforms: Any logical node → Same node (marked as physical)
|
|
5
|
-
* Conditions: When no other rule has made the node physical
|
|
6
|
-
* Benefits: Ensures all nodes become physical even if no specific transformation is needed
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { createLogger } from '../../../common/logger.js';
|
|
10
|
-
import type { PlanNode } from '../../nodes/plan-node.js';
|
|
11
|
-
import type { OptContext } from '../../framework/context.js';
|
|
12
|
-
|
|
13
|
-
const log = createLogger('optimizer:rule:mark-physical');
|
|
14
|
-
|
|
15
|
-
export function ruleMarkPhysical(node: PlanNode, _context: OptContext): PlanNode | null {
|
|
16
|
-
// This is a fallback rule - only apply if the node is not already physical
|
|
17
|
-
if (node.physical) {
|
|
18
|
-
return null; // Already physical
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// Some node types cannot be made physical directly (like AggregateNode)
|
|
22
|
-
// These should have been handled by specific transformation rules
|
|
23
|
-
const cannotBePhysical = new Set([
|
|
24
|
-
'Aggregate', // Should be transformed to StreamAggregate/HashAggregate
|
|
25
|
-
]);
|
|
26
|
-
|
|
27
|
-
if (cannotBePhysical.has(node.nodeType)) {
|
|
28
|
-
log('Cannot mark %s as physical - requires transformation', node.nodeType);
|
|
29
|
-
return null; // Let the optimizer handle this as an error
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
log('Marking %s as physical (fallback rule)', node.nodeType);
|
|
33
|
-
|
|
34
|
-
// Return the node - framework will set physical properties via markPhysical()
|
|
35
|
-
// Don't hardcode properties, let the framework compute them from children
|
|
36
|
-
return node;
|
|
37
|
-
}
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import type { TableReferenceNode } from '../../planner/nodes/reference.js';
|
|
2
|
-
import type { Instruction, RuntimeContext } from '../types.js';
|
|
3
|
-
import type { EmissionContext } from '../emission-context.js';
|
|
4
|
-
import type { Row } from '../../common/types.js';
|
|
5
|
-
import { disconnectVTable } from '../utils.js';
|
|
6
|
-
import { createValidatedInstruction } from '../emitters.js';
|
|
7
|
-
import type { FilterInfo } from '../../vtab/filter-info.js';
|
|
8
|
-
import type { IndexInfo, IndexConstraintUsage } from '../../vtab/index-info.js';
|
|
9
|
-
import { QuereusError } from '../../common/errors.js';
|
|
10
|
-
import { StatusCode } from '../../common/types.js';
|
|
11
|
-
import { buildRowDescriptor } from '../../util/row-descriptor.js';
|
|
12
|
-
|
|
13
|
-
export function emitTableReference(plan: TableReferenceNode, ctx: EmissionContext): Instruction {
|
|
14
|
-
// Create row descriptor for output attributes
|
|
15
|
-
const rowDescriptor = buildRowDescriptor(plan.getAttributes());
|
|
16
|
-
|
|
17
|
-
async function* run(rctx: RuntimeContext): AsyncIterable<Row> {
|
|
18
|
-
// Get the table schema and pre-resolved vtab module
|
|
19
|
-
const tableSchema = plan.tableSchema;
|
|
20
|
-
const vtabModule = plan.vtabModule;
|
|
21
|
-
const vtabAuxData = plan.vtabAuxData;
|
|
22
|
-
|
|
23
|
-
// Create vtab instance using pre-resolved module
|
|
24
|
-
if (typeof vtabModule.xConnect !== 'function') {
|
|
25
|
-
throw new QuereusError(`Virtual table module '${tableSchema.vtabModuleName}' does not implement xConnect`, StatusCode.MISUSE);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const vtabArgs = tableSchema.vtabArgs || {};
|
|
29
|
-
const vtab = vtabModule.xConnect(
|
|
30
|
-
rctx.db,
|
|
31
|
-
vtabAuxData,
|
|
32
|
-
tableSchema.vtabModuleName,
|
|
33
|
-
tableSchema.schemaName,
|
|
34
|
-
tableSchema.name,
|
|
35
|
-
vtabArgs
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
try {
|
|
39
|
-
// Set up context for each row using row descriptor
|
|
40
|
-
let row: Row;
|
|
41
|
-
rctx.context.set(rowDescriptor, () => row);
|
|
42
|
-
|
|
43
|
-
// Check if the virtual table supports xQuery
|
|
44
|
-
if (typeof vtab.xQuery === 'function') {
|
|
45
|
-
// Create a minimal FilterInfo for full table scan
|
|
46
|
-
const defaultIndexInfo: IndexInfo = {
|
|
47
|
-
nConstraint: 0,
|
|
48
|
-
aConstraint: [],
|
|
49
|
-
nOrderBy: 0,
|
|
50
|
-
aOrderBy: [],
|
|
51
|
-
aConstraintUsage: [] as IndexConstraintUsage[],
|
|
52
|
-
idxNum: 0,
|
|
53
|
-
idxStr: 'fullscan',
|
|
54
|
-
orderByConsumed: false,
|
|
55
|
-
estimatedCost: 1000,
|
|
56
|
-
estimatedRows: BigInt(100),
|
|
57
|
-
idxFlags: 0,
|
|
58
|
-
colUsed: 0n,
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
const filterInfo: FilterInfo = {
|
|
62
|
-
idxNum: 0,
|
|
63
|
-
idxStr: 'fullscan',
|
|
64
|
-
constraints: [],
|
|
65
|
-
args: [],
|
|
66
|
-
indexInfoOutput: defaultIndexInfo,
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
// Use xQuery with the filter info
|
|
70
|
-
const asyncRowIterable = vtab.xQuery(filterInfo);
|
|
71
|
-
for await (row of asyncRowIterable) {
|
|
72
|
-
yield row;
|
|
73
|
-
}
|
|
74
|
-
} else {
|
|
75
|
-
throw new QuereusError(`Virtual table '${tableSchema.name}' does not support xQuery.`, StatusCode.UNSUPPORTED);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// Clean up context
|
|
79
|
-
rctx.context.delete(rowDescriptor);
|
|
80
|
-
} finally {
|
|
81
|
-
// Properly disconnect the VirtualTable instance
|
|
82
|
-
await disconnectVTable(rctx, vtab);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return createValidatedInstruction(
|
|
87
|
-
[],
|
|
88
|
-
run,
|
|
89
|
-
ctx,
|
|
90
|
-
`table_ref(${plan.tableSchema.schemaName}.${plan.tableSchema.name})`
|
|
91
|
-
);
|
|
92
|
-
}
|