@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
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import { emitPlanNode } from '../emitters.js';
|
|
2
|
-
import { compareSqlValuesFast,
|
|
2
|
+
import { compareSqlValuesFast, resolveCollation } from '../../util/comparison.js';
|
|
3
3
|
import { QuereusError } from '../../common/errors.js';
|
|
4
4
|
import { StatusCode } from '../../common/types.js';
|
|
5
5
|
import { BTree } from 'inheritree';
|
|
6
6
|
export function emitScalarSubquery(plan, ctx) {
|
|
7
|
-
async function run(
|
|
7
|
+
async function run(rctx, input) {
|
|
8
8
|
let result = null;
|
|
9
9
|
let seen = false;
|
|
10
10
|
for await (const row of input) {
|
|
11
11
|
if (seen) {
|
|
12
12
|
throw new QuereusError('Scalar subquery returned more than one row', StatusCode.ERROR, undefined, plan.expression.loc?.start.line, plan.expression.loc?.start.column);
|
|
13
13
|
}
|
|
14
|
+
if (row.length > 1) {
|
|
15
|
+
throw new QuereusError('Subquery should return at most one column', StatusCode.ERROR);
|
|
16
|
+
}
|
|
17
|
+
result = row.length === 0 ? null : row[0];
|
|
14
18
|
seen = true;
|
|
15
|
-
result = row[0];
|
|
16
19
|
}
|
|
17
20
|
return result;
|
|
18
21
|
}
|
|
@@ -20,19 +23,22 @@ export function emitScalarSubquery(plan, ctx) {
|
|
|
20
23
|
return {
|
|
21
24
|
params: [innerInstruction],
|
|
22
25
|
run,
|
|
23
|
-
note: '
|
|
26
|
+
note: 'SCALAR_SUBQUERY'
|
|
24
27
|
};
|
|
25
28
|
}
|
|
26
29
|
export function emitIn(plan, ctx) {
|
|
30
|
+
// Extract collation from the condition expression
|
|
31
|
+
const conditionType = plan.condition.getType();
|
|
32
|
+
const collationName = conditionType.collationName || 'BINARY';
|
|
33
|
+
const collation = resolveCollation(collationName);
|
|
27
34
|
if (plan.source) {
|
|
28
35
|
// IN subquery: expr IN (SELECT ...)
|
|
29
|
-
|
|
36
|
+
// Use streaming approach - check each row as we read it, return early on match
|
|
37
|
+
async function runSubqueryStreaming(_rctx, input, condition) {
|
|
30
38
|
// If condition is NULL, result is NULL
|
|
31
39
|
if (condition === null) {
|
|
32
40
|
return null;
|
|
33
41
|
}
|
|
34
|
-
// Build BTree of all values from subquery
|
|
35
|
-
const tree = new BTree((val) => val, (a, b) => compareSqlValuesFast(a, b, BINARY_COLLATION));
|
|
36
42
|
let hasNull = false;
|
|
37
43
|
for await (const row of input) {
|
|
38
44
|
if (row.length > 0) {
|
|
@@ -41,14 +47,12 @@ export function emitIn(plan, ctx) {
|
|
|
41
47
|
hasNull = true;
|
|
42
48
|
continue;
|
|
43
49
|
}
|
|
44
|
-
|
|
50
|
+
// Check for match immediately - no need to materialize
|
|
51
|
+
if (compareSqlValuesFast(condition, rowValue, collation) === 0) {
|
|
52
|
+
return 1; // Found a match
|
|
53
|
+
}
|
|
45
54
|
}
|
|
46
55
|
}
|
|
47
|
-
// Check if condition exists in tree
|
|
48
|
-
const value = tree.get(condition);
|
|
49
|
-
if (value !== undefined) {
|
|
50
|
-
return 1; // Found a match
|
|
51
|
-
}
|
|
52
56
|
// No match found - if any value was NULL, result is NULL
|
|
53
57
|
return hasNull ? null : 0;
|
|
54
58
|
}
|
|
@@ -56,49 +60,100 @@ export function emitIn(plan, ctx) {
|
|
|
56
60
|
const conditionExpr = emitPlanNode(plan.condition, ctx);
|
|
57
61
|
return {
|
|
58
62
|
params: [sourceInstruction, conditionExpr],
|
|
59
|
-
run:
|
|
63
|
+
run: runSubqueryStreaming,
|
|
60
64
|
note: `IN (subquery)`
|
|
61
65
|
};
|
|
62
66
|
}
|
|
63
67
|
else if (plan.values) {
|
|
64
68
|
// IN value list: expr IN (value1, value2, ...)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
// Build BTree of all values
|
|
71
|
-
const tree = new BTree((val) => val, (a, b) => compareSqlValuesFast(a, b, BINARY_COLLATION));
|
|
69
|
+
// Check if all values are truly constant (can be evaluated at emit time)
|
|
70
|
+
const allConstant = plan.values.every(val => val.physical.constant);
|
|
71
|
+
if (allConstant) {
|
|
72
|
+
// Pre-build BTree at emit time for constant values
|
|
73
|
+
const tree = new BTree((val) => val, (a, b) => compareSqlValuesFast(a, b, collation));
|
|
72
74
|
let hasNull = false;
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
function innerConstantRun(_rctx, condition) {
|
|
76
|
+
// If condition is NULL, result is NULL
|
|
77
|
+
if (condition === null) {
|
|
78
|
+
return null;
|
|
77
79
|
}
|
|
78
|
-
tree
|
|
80
|
+
// Check if condition exists in pre-built tree
|
|
81
|
+
const path = tree.find(condition);
|
|
82
|
+
if (path.on) {
|
|
83
|
+
return 1; // Found a match
|
|
84
|
+
}
|
|
85
|
+
// No match found - if any value was NULL, result is NULL
|
|
86
|
+
return hasNull ? null : 0;
|
|
79
87
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
if (
|
|
83
|
-
|
|
88
|
+
const values = plan.values.map(val => val.getValue());
|
|
89
|
+
let runFunc;
|
|
90
|
+
if (values.some(val => val instanceof Promise)) {
|
|
91
|
+
// Must resolve promises at runtime
|
|
92
|
+
runFunc = async (rctx, condition) => {
|
|
93
|
+
const resolved = await Promise.all(values);
|
|
94
|
+
for (const value of resolved) {
|
|
95
|
+
if (value === null) {
|
|
96
|
+
hasNull = true;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
tree.insert(value);
|
|
100
|
+
}
|
|
101
|
+
return innerConstantRun(rctx, condition);
|
|
102
|
+
};
|
|
84
103
|
}
|
|
85
|
-
|
|
86
|
-
|
|
104
|
+
else {
|
|
105
|
+
for (const value of values) {
|
|
106
|
+
if (value === null) {
|
|
107
|
+
hasNull = true;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
tree.insert(value);
|
|
111
|
+
}
|
|
112
|
+
runFunc = innerConstantRun;
|
|
113
|
+
}
|
|
114
|
+
const conditionExpr = emitPlanNode(plan.condition, ctx);
|
|
115
|
+
return {
|
|
116
|
+
params: [conditionExpr],
|
|
117
|
+
run: runFunc,
|
|
118
|
+
note: `IN (${plan.values.length} constant values)`
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// Some values are expressions - build tree at runtime
|
|
123
|
+
function runDynamicValues(_rctx, condition, ...values) {
|
|
124
|
+
// If condition is NULL, result is NULL
|
|
125
|
+
if (condition === null) {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
// Linear scan is optimal since we're only doing one lookup per execution
|
|
129
|
+
let hasNull = false;
|
|
130
|
+
for (const value of values) {
|
|
131
|
+
if (value === null) {
|
|
132
|
+
hasNull = true;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (compareSqlValuesFast(condition, value, collation) === 0) {
|
|
136
|
+
return 1; // Found a match
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// No match found - if any value was NULL, result is NULL
|
|
140
|
+
return hasNull ? null : 0;
|
|
141
|
+
}
|
|
142
|
+
const conditionExpr = emitPlanNode(plan.condition, ctx);
|
|
143
|
+
const valueExprs = plan.values.map(val => emitPlanNode(val, ctx));
|
|
144
|
+
return {
|
|
145
|
+
params: [conditionExpr, ...valueExprs],
|
|
146
|
+
run: runDynamicValues,
|
|
147
|
+
note: `IN (${plan.values.length} dynamic values)`
|
|
148
|
+
};
|
|
87
149
|
}
|
|
88
|
-
const conditionExpr = emitPlanNode(plan.condition, ctx);
|
|
89
|
-
const valueExprs = plan.values.map(val => emitPlanNode(val, ctx));
|
|
90
|
-
return {
|
|
91
|
-
params: [conditionExpr, ...valueExprs],
|
|
92
|
-
run: runValues,
|
|
93
|
-
note: `IN (${plan.values.length} values)`
|
|
94
|
-
};
|
|
95
150
|
}
|
|
96
151
|
else {
|
|
97
152
|
throw new QuereusError('IN node must have either source or values', StatusCode.INTERNAL);
|
|
98
153
|
}
|
|
99
154
|
}
|
|
100
155
|
export function emitExists(plan, ctx) {
|
|
101
|
-
async function run(
|
|
156
|
+
async function run(_rctx, input) {
|
|
102
157
|
for await (const _row of input) {
|
|
103
158
|
return 1; // First row => TRUE
|
|
104
159
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subquery.js","sourceRoot":"","sources":["../../../../src/runtime/emit/subquery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAElF,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"subquery.js","sourceRoot":"","sources":["../../../../src/runtime/emit/subquery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-valued-function.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/table-valued-function.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAkC,MAAM,aAAa,CAAC;AAM/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;
|
|
1
|
+
{"version":3,"file":"table-valued-function.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/table-valued-function.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAkC,MAAM,aAAa,CAAC;AAM/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAIxF,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,qBAAqB,EAAE,GAAG,EAAE,eAAe,GAAG,WAAW,CA8F1G"}
|
|
@@ -3,6 +3,7 @@ import { QuereusError } from '../../common/errors.js';
|
|
|
3
3
|
import { StatusCode } from '../../common/types.js';
|
|
4
4
|
import { isTableValuedFunctionSchema } from '../../schema/function.js';
|
|
5
5
|
import { buildRowDescriptor } from '../../util/row-descriptor.js';
|
|
6
|
+
import { withRowContextGenerator } from '../context-helpers.js';
|
|
6
7
|
export function emitTableValuedFunctionCall(plan, ctx) {
|
|
7
8
|
const functionName = plan.functionName.toLowerCase();
|
|
8
9
|
const numArgs = plan.operands.length;
|
|
@@ -36,17 +37,9 @@ export function emitTableValuedFunctionCall(plan, ctx) {
|
|
|
36
37
|
const result = capturedFunction.implementation(innerCtx.db, ...args);
|
|
37
38
|
// Handle both direct AsyncIterable and Promise<AsyncIterable>
|
|
38
39
|
const iterable = result instanceof Promise ? await result : result;
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
try {
|
|
43
|
-
yield row;
|
|
44
|
-
}
|
|
45
|
-
finally {
|
|
46
|
-
// Clean up row context
|
|
47
|
-
innerCtx.context.delete(rowDescriptor);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
40
|
+
yield* withRowContextGenerator(innerCtx, rowDescriptor, iterable, async function* (row) {
|
|
41
|
+
yield row;
|
|
42
|
+
});
|
|
50
43
|
}
|
|
51
44
|
catch (error) {
|
|
52
45
|
throw new QuereusError(`Table-valued function ${functionName} failed: ${error.message}`, StatusCode.ERROR, error);
|
|
@@ -75,17 +68,9 @@ export function emitTableValuedFunctionCall(plan, ctx) {
|
|
|
75
68
|
const result = capturedFunction.implementation(...args);
|
|
76
69
|
// Handle both direct AsyncIterable and Promise<AsyncIterable>
|
|
77
70
|
const iterable = result instanceof Promise ? await result : result;
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
try {
|
|
82
|
-
yield row;
|
|
83
|
-
}
|
|
84
|
-
finally {
|
|
85
|
-
// Clean up row context
|
|
86
|
-
innerCtx.context.delete(rowDescriptor);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
71
|
+
yield* withRowContextGenerator(innerCtx, rowDescriptor, iterable, async function* (row) {
|
|
72
|
+
yield row;
|
|
73
|
+
});
|
|
89
74
|
}
|
|
90
75
|
catch (error) {
|
|
91
76
|
throw new QuereusError(`Table-valued function ${functionName} failed: ${error.message}`, StatusCode.ERROR, error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-valued-function.js","sourceRoot":"","sources":["../../../../src/runtime/emit/table-valued-function.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,UAAU,EAA2B,MAAM,uBAAuB,CAAC;AAE5E,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAGvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"table-valued-function.js","sourceRoot":"","sources":["../../../../src/runtime/emit/table-valued-function.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAkC,MAAM,aAAa,CAAC;AAI/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAkC,MAAM,aAAa,CAAC;AAI/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,GAAG,WAAW,CAwD9E"}
|
|
@@ -2,6 +2,7 @@ import { emitPlanNode, emitCallFromPlan } from '../emitters.js';
|
|
|
2
2
|
import { QuereusError } from '../../common/errors.js';
|
|
3
3
|
import { StatusCode } from '../../common/types.js';
|
|
4
4
|
import { buildRowDescriptor, composeOldNewRow } from '../../util/row-descriptor.js';
|
|
5
|
+
import { withRowContextGenerator } from '../context-helpers.js';
|
|
5
6
|
export function emitUpdate(plan, ctx) {
|
|
6
7
|
const tableSchema = plan.table.tableSchema;
|
|
7
8
|
// Create row descriptor for the source rows (needed for assignment expression evaluation)
|
|
@@ -18,35 +19,27 @@ export function emitUpdate(plan, ctx) {
|
|
|
18
19
|
// Emit assignment value expressions as callbacks
|
|
19
20
|
const assignmentEvaluators = plan.assignments.map(assign => emitCallFromPlan(assign.value, ctx));
|
|
20
21
|
async function* run(rctx, sourceRowsIterable, ...assignmentEvaluators) {
|
|
21
|
-
|
|
22
|
-
//
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
for (const evaluator of assignmentEvaluators) {
|
|
28
|
-
const value = evaluator(rctx);
|
|
29
|
-
assignmentValues.push(value);
|
|
30
|
-
}
|
|
31
|
-
// Create a new row with updated values
|
|
32
|
-
const updatedRow = [...sourceRow]; // Copy the original row
|
|
33
|
-
// Apply assignment values to the row
|
|
34
|
-
for (let i = 0; i < assignmentValues.length; i++) {
|
|
35
|
-
const targetColIdx = assignmentTargetIndices[i];
|
|
36
|
-
updatedRow[targetColIdx] = assignmentValues[i];
|
|
37
|
-
}
|
|
38
|
-
// Create flat row with OLD (source) and NEW (updated) values for constraint checking
|
|
39
|
-
const flatRow = composeOldNewRow(sourceRow, updatedRow, tableSchema.columns.length);
|
|
40
|
-
// Yield the flat row for constraint checking
|
|
41
|
-
// NOTE: UpdateNode only transforms rows - it does NOT execute the actual update
|
|
42
|
-
// The UpdateExecutorNode is responsible for calling vtab.xUpdate
|
|
43
|
-
yield flatRow;
|
|
22
|
+
yield* withRowContextGenerator(rctx, sourceRowDescriptor, sourceRowsIterable, async function* (sourceRow) {
|
|
23
|
+
// Evaluate assignment expressions in the context of this row
|
|
24
|
+
const assignmentValues = [];
|
|
25
|
+
for (const evaluator of assignmentEvaluators) {
|
|
26
|
+
const value = evaluator(rctx);
|
|
27
|
+
assignmentValues.push(value);
|
|
44
28
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
29
|
+
// Create a new row with updated values
|
|
30
|
+
const updatedRow = [...sourceRow]; // Copy the original row
|
|
31
|
+
// Apply assignment values to the row
|
|
32
|
+
for (let i = 0; i < assignmentValues.length; i++) {
|
|
33
|
+
const targetColIdx = assignmentTargetIndices[i];
|
|
34
|
+
updatedRow[targetColIdx] = assignmentValues[i];
|
|
48
35
|
}
|
|
49
|
-
|
|
36
|
+
// Create flat row with OLD (source) and NEW (updated) values for constraint checking
|
|
37
|
+
const flatRow = composeOldNewRow(sourceRow, updatedRow, tableSchema.columns.length);
|
|
38
|
+
// Yield the flat row for constraint checking
|
|
39
|
+
// NOTE: UpdateNode only transforms rows - it does NOT execute the actual update
|
|
40
|
+
// The UpdateExecutorNode is responsible for calling vtab.xUpdate
|
|
41
|
+
yield flatRow;
|
|
42
|
+
});
|
|
50
43
|
}
|
|
51
44
|
const sourceInstruction = emitPlanNode(plan.source, ctx);
|
|
52
45
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/runtime/emit/update.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,UAAU,EAA2B,MAAM,uBAAuB,CAAC;AAE5E,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/runtime/emit/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/window.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAC;AAE/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/window.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAC;AAE/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAa9D,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,GAAG,WAAW,CAyF9E"}
|
|
@@ -5,6 +5,7 @@ import { StatusCode } from '../../common/types.js';
|
|
|
5
5
|
import { compareSqlValues, createOrderByComparatorFast, resolveCollation } from '../../util/comparison.js';
|
|
6
6
|
import { createLogger } from '../../common/logger.js';
|
|
7
7
|
import { buildRowDescriptor } from '../../util/row-descriptor.js';
|
|
8
|
+
import { withRowContext, withAsyncRowContext } from '../context-helpers.js';
|
|
8
9
|
const log = createLogger('runtime:emit:window');
|
|
9
10
|
export function emitWindow(plan, ctx) {
|
|
10
11
|
// Get schemas for all window functions in this node
|
|
@@ -63,20 +64,16 @@ export function emitWindow(plan, ctx) {
|
|
|
63
64
|
async function groupByPartitions(rows, partitionCallbacks, rctx, sourceRowDescriptor) {
|
|
64
65
|
const partitions = new Map();
|
|
65
66
|
for (const row of rows) {
|
|
66
|
-
rctx
|
|
67
|
-
try {
|
|
67
|
+
const partitionKey = await withAsyncRowContext(rctx, sourceRowDescriptor, () => row, async () => {
|
|
68
68
|
// Evaluate partition expressions
|
|
69
|
-
const partitionValues = partitionCallbacks.map(callback => callback(rctx));
|
|
69
|
+
const partitionValues = await Promise.all(partitionCallbacks.map(callback => callback(rctx)));
|
|
70
70
|
// Create partition key
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
partitions.get(partitionKey).push(row);
|
|
76
|
-
}
|
|
77
|
-
finally {
|
|
78
|
-
rctx.context.delete(sourceRowDescriptor);
|
|
71
|
+
return partitionValues.map(val => val === null ? 'NULL' : String(val)).join('|');
|
|
72
|
+
});
|
|
73
|
+
if (!partitions.has(partitionKey)) {
|
|
74
|
+
partitions.set(partitionKey, []);
|
|
79
75
|
}
|
|
76
|
+
partitions.get(partitionKey).push(row);
|
|
80
77
|
}
|
|
81
78
|
return partitions;
|
|
82
79
|
}
|
|
@@ -88,8 +85,8 @@ async function* processPartition(partitionRows, plan, functionSchemas, rctx, sou
|
|
|
88
85
|
const currentRow = sortedRows[currentIndex];
|
|
89
86
|
const outputRow = [...currentRow];
|
|
90
87
|
// Set up context for current row
|
|
91
|
-
rctx
|
|
92
|
-
|
|
88
|
+
const outputValues = await withRowContext(rctx, sourceRowDescriptor, () => currentRow, async () => {
|
|
89
|
+
const values = [];
|
|
93
90
|
// Compute each window function
|
|
94
91
|
for (let funcIndex = 0; funcIndex < plan.functions.length; funcIndex++) {
|
|
95
92
|
const func = plan.functions[funcIndex];
|
|
@@ -97,7 +94,7 @@ async function* processPartition(partitionRows, plan, functionSchemas, rctx, sou
|
|
|
97
94
|
const argCallback = funcArgCallbacks[funcIndex];
|
|
98
95
|
let value;
|
|
99
96
|
if (schema.kind === 'ranking') {
|
|
100
|
-
value = computeRankingFunction(func.functionName, sortedRows, currentIndex, orderByCallbacks, rctx, sourceRowDescriptor);
|
|
97
|
+
value = await computeRankingFunction(func.functionName, sortedRows, currentIndex, orderByCallbacks, rctx, sourceRowDescriptor);
|
|
101
98
|
}
|
|
102
99
|
else if (schema.kind === 'aggregate') {
|
|
103
100
|
value = await computeAggregateFunction(schema, argCallback, sortedRows, currentIndex, plan.windowSpec.frame, plan.windowSpec.orderBy.length > 0, rctx, sourceRowDescriptor);
|
|
@@ -105,20 +102,14 @@ async function* processPartition(partitionRows, plan, functionSchemas, rctx, sou
|
|
|
105
102
|
else {
|
|
106
103
|
throw new QuereusError(`Window function type ${schema.kind} not yet implemented`, StatusCode.UNSUPPORTED);
|
|
107
104
|
}
|
|
108
|
-
|
|
105
|
+
values.push(value);
|
|
109
106
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
107
|
+
return values;
|
|
108
|
+
});
|
|
109
|
+
// Add computed values to output row
|
|
110
|
+
outputRow.push(...outputValues);
|
|
114
111
|
// Yield the output row
|
|
115
|
-
rctx
|
|
116
|
-
try {
|
|
117
|
-
yield outputRow;
|
|
118
|
-
}
|
|
119
|
-
finally {
|
|
120
|
-
rctx.context.delete(outputRowDescriptor);
|
|
121
|
-
}
|
|
112
|
+
yield await withRowContext(rctx, outputRowDescriptor, () => outputRow, () => outputRow);
|
|
122
113
|
}
|
|
123
114
|
}
|
|
124
115
|
async function sortRows(rows, orderBy, orderByCallbacks, rctx, sourceRowDescriptor) {
|
|
@@ -130,31 +121,25 @@ async function sortRows(rows, orderBy, orderByCallbacks, rctx, sourceRowDescript
|
|
|
130
121
|
// TODO: Extract actual collation from order clause expression
|
|
131
122
|
// For now, use BINARY collation (most common case)
|
|
132
123
|
const collationFunc = resolveCollation('BINARY');
|
|
133
|
-
return createOrderByComparatorFast(orderClause.direction, orderClause.
|
|
124
|
+
return createOrderByComparatorFast(orderClause.direction, orderClause.nulls, collationFunc);
|
|
134
125
|
});
|
|
135
|
-
|
|
126
|
+
// Pre-evaluate ORDER BY values for all rows to avoid async in sort
|
|
127
|
+
const rowsWithValues = await Promise.all(rows.map(async (row) => {
|
|
128
|
+
const values = await Promise.all(orderByCallbacks.map(async (callback) => {
|
|
129
|
+
return await withAsyncRowContext(rctx, sourceRowDescriptor, () => row, async () => {
|
|
130
|
+
const result = callback(rctx);
|
|
131
|
+
return await Promise.resolve(result);
|
|
132
|
+
});
|
|
133
|
+
}));
|
|
134
|
+
return { row, values };
|
|
135
|
+
}));
|
|
136
|
+
// Now sort using the pre-evaluated values
|
|
137
|
+
rowsWithValues.sort((a, b) => {
|
|
136
138
|
// Compare each ORDER BY expression in sequence
|
|
137
139
|
for (let i = 0; i < orderBy.length; i++) {
|
|
138
|
-
const callback = orderByCallbacks[i];
|
|
139
140
|
const comparator = orderByComparators[i];
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
let valueA;
|
|
143
|
-
try {
|
|
144
|
-
valueA = callback(rctx);
|
|
145
|
-
}
|
|
146
|
-
finally {
|
|
147
|
-
rctx.context.delete(sourceRowDescriptor);
|
|
148
|
-
}
|
|
149
|
-
// Evaluate expression for row B
|
|
150
|
-
rctx.context.set(sourceRowDescriptor, () => b);
|
|
151
|
-
let valueB;
|
|
152
|
-
try {
|
|
153
|
-
valueB = callback(rctx);
|
|
154
|
-
}
|
|
155
|
-
finally {
|
|
156
|
-
rctx.context.delete(sourceRowDescriptor);
|
|
157
|
-
}
|
|
141
|
+
const valueA = a.values[i];
|
|
142
|
+
const valueB = b.values[i];
|
|
158
143
|
// Use pre-created optimized comparator
|
|
159
144
|
const comparison = comparator(valueA, valueB);
|
|
160
145
|
// If not equal, return comparison result
|
|
@@ -165,8 +150,10 @@ async function sortRows(rows, orderBy, orderByCallbacks, rctx, sourceRowDescript
|
|
|
165
150
|
}
|
|
166
151
|
return 0; // All ORDER BY expressions are equal
|
|
167
152
|
});
|
|
153
|
+
// Extract just the rows in sorted order
|
|
154
|
+
return rowsWithValues.map(item => item.row);
|
|
168
155
|
}
|
|
169
|
-
function computeRankingFunction(functionName, sortedRows, currentIndex, orderByCallbacks, rctx, sourceRowDescriptor) {
|
|
156
|
+
async function computeRankingFunction(functionName, sortedRows, currentIndex, orderByCallbacks, rctx, sourceRowDescriptor) {
|
|
170
157
|
switch (functionName.toLowerCase()) {
|
|
171
158
|
case 'row_number':
|
|
172
159
|
return currentIndex + 1;
|
|
@@ -176,7 +163,7 @@ function computeRankingFunction(functionName, sortedRows, currentIndex, orderByC
|
|
|
176
163
|
const currentRow = sortedRows[currentIndex];
|
|
177
164
|
for (let i = 0; i < currentIndex; i++) {
|
|
178
165
|
const prevRow = sortedRows[i];
|
|
179
|
-
if (!areRowsEqualInOrderBy(prevRow, currentRow, orderByCallbacks, rctx, sourceRowDescriptor)) {
|
|
166
|
+
if (!(await areRowsEqualInOrderBy(prevRow, currentRow, orderByCallbacks, rctx, sourceRowDescriptor))) {
|
|
180
167
|
rank = i + 2; // Rank is 1-based and accounts for ties
|
|
181
168
|
}
|
|
182
169
|
}
|
|
@@ -189,9 +176,9 @@ function computeRankingFunction(functionName, sortedRows, currentIndex, orderByC
|
|
|
189
176
|
const seenValues = new Set();
|
|
190
177
|
for (let i = 0; i < currentIndex; i++) {
|
|
191
178
|
const prevRow = sortedRows[i];
|
|
192
|
-
if (!areRowsEqualInOrderBy(prevRow, currentRow, orderByCallbacks, rctx, sourceRowDescriptor)) {
|
|
179
|
+
if (!(await areRowsEqualInOrderBy(prevRow, currentRow, orderByCallbacks, rctx, sourceRowDescriptor))) {
|
|
193
180
|
// Create a key for this distinct set of ORDER BY values
|
|
194
|
-
const key = getOrderByKey(prevRow, orderByCallbacks, rctx, sourceRowDescriptor);
|
|
181
|
+
const key = await getOrderByKey(prevRow, orderByCallbacks, rctx, sourceRowDescriptor);
|
|
195
182
|
if (!seenValues.has(key)) {
|
|
196
183
|
seenValues.add(key);
|
|
197
184
|
denseRank++;
|
|
@@ -212,22 +199,19 @@ async function computeAggregateFunction(schema, argCallback, sortedRows, current
|
|
|
212
199
|
// Process rows within the frame
|
|
213
200
|
for (let i = frameBounds.start; i <= frameBounds.end; i++) {
|
|
214
201
|
const frameRow = sortedRows[i];
|
|
215
|
-
rctx
|
|
216
|
-
try {
|
|
202
|
+
await withAsyncRowContext(rctx, sourceRowDescriptor, () => frameRow, async () => {
|
|
217
203
|
let argValue = null;
|
|
218
204
|
// Get argument value if callback exists
|
|
219
205
|
if (argCallback) {
|
|
220
|
-
|
|
206
|
+
const result = argCallback(rctx);
|
|
207
|
+
argValue = await Promise.resolve(result);
|
|
221
208
|
}
|
|
222
209
|
// Apply aggregate step function
|
|
223
210
|
if (schema.step) {
|
|
224
211
|
accumulator = schema.step(accumulator, argValue);
|
|
225
212
|
rowCount++;
|
|
226
213
|
}
|
|
227
|
-
}
|
|
228
|
-
finally {
|
|
229
|
-
rctx.context.delete(sourceRowDescriptor);
|
|
230
|
-
}
|
|
214
|
+
});
|
|
231
215
|
}
|
|
232
216
|
// Apply final function
|
|
233
217
|
return schema.final ? schema.final(accumulator, rowCount) : accumulator;
|
|
@@ -288,26 +272,18 @@ function getFrameBounds(frame, totalRows, currentIndex, hasOrderBy = true) {
|
|
|
288
272
|
}
|
|
289
273
|
return { start, end };
|
|
290
274
|
}
|
|
291
|
-
function areRowsEqualInOrderBy(rowA, rowB, orderByCallbacks, rctx, sourceRowDescriptor) {
|
|
275
|
+
async function areRowsEqualInOrderBy(rowA, rowB, orderByCallbacks, rctx, sourceRowDescriptor) {
|
|
292
276
|
for (const callback of orderByCallbacks) {
|
|
293
277
|
// Get value for row A
|
|
294
|
-
rctx
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
}
|
|
299
|
-
finally {
|
|
300
|
-
rctx.context.delete(sourceRowDescriptor);
|
|
301
|
-
}
|
|
278
|
+
const valueA = await withAsyncRowContext(rctx, sourceRowDescriptor, () => rowA, async () => {
|
|
279
|
+
const result = callback(rctx);
|
|
280
|
+
return await Promise.resolve(result);
|
|
281
|
+
});
|
|
302
282
|
// Get value for row B
|
|
303
|
-
rctx
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
}
|
|
308
|
-
finally {
|
|
309
|
-
rctx.context.delete(sourceRowDescriptor);
|
|
310
|
-
}
|
|
283
|
+
const valueB = await withAsyncRowContext(rctx, sourceRowDescriptor, () => rowB, async () => {
|
|
284
|
+
const result = callback(rctx);
|
|
285
|
+
return await Promise.resolve(result);
|
|
286
|
+
});
|
|
311
287
|
// If any ORDER BY expression differs, rows are not equal
|
|
312
288
|
if (compareSqlValues(valueA, valueB) !== 0) {
|
|
313
289
|
return false;
|
|
@@ -315,14 +291,10 @@ function areRowsEqualInOrderBy(rowA, rowB, orderByCallbacks, rctx, sourceRowDesc
|
|
|
315
291
|
}
|
|
316
292
|
return true; // All ORDER BY expressions are equal
|
|
317
293
|
}
|
|
318
|
-
function getOrderByKey(row, orderByCallbacks, rctx, sourceRowDescriptor) {
|
|
319
|
-
rctx
|
|
320
|
-
|
|
321
|
-
const values = orderByCallbacks.map(callback => callback(rctx));
|
|
294
|
+
async function getOrderByKey(row, orderByCallbacks, rctx, sourceRowDescriptor) {
|
|
295
|
+
return await withAsyncRowContext(rctx, sourceRowDescriptor, () => row, async () => {
|
|
296
|
+
const values = await Promise.all(orderByCallbacks.map(callback => Promise.resolve(callback(rctx))));
|
|
322
297
|
return values.map(val => val === null ? 'NULL' : String(val)).join('|');
|
|
323
|
-
}
|
|
324
|
-
finally {
|
|
325
|
-
rctx.context.delete(sourceRowDescriptor);
|
|
326
|
-
}
|
|
298
|
+
});
|
|
327
299
|
}
|
|
328
300
|
//# sourceMappingURL=window.js.map
|