@quereus/quereus 0.1.0 → 0.2.1
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/common/types.d.ts +1 -0
- package/dist/src/common/types.d.ts.map +1 -1
- 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 +10 -4
- 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 +7 -4
- 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 +5 -2
- 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 +8 -5
- 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 +13 -6
- 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 +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 +16 -123
- 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/schema/table.d.ts +4 -4
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +10 -10
- package/dist/src/schema/table.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/dist/src/vtab/table.d.ts +1 -1
- package/dist/src/vtab/table.d.ts.map +1 -1
- package/package.json +8 -3
- package/src/common/types.ts +1 -0
- 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 +12 -6
- package/src/parser/parser.ts +45 -52
- package/src/planner/analysis/const-pass.ts +281 -270
- package/src/planner/building/constraint-builder.ts +114 -0
- package/src/planner/building/delete.ts +18 -5
- package/src/planner/building/expression.ts +35 -7
- package/src/planner/building/insert.ts +16 -3
- 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 +22 -7
- 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 +49 -15
- 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 +3 -3
- 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 +19 -144
- 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/schema/table.ts +8 -8
- 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/vtab/table.ts +1 -1
- 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/core/database.ts
CHANGED
|
@@ -26,12 +26,13 @@ import { ParameterScope } from '../planner/scopes/param.js';
|
|
|
26
26
|
import { GlobalScope } from '../planner/scopes/global.js';
|
|
27
27
|
import type { PlanNode } from '../planner/nodes/plan-node.js';
|
|
28
28
|
import { registerEmitters } from '../runtime/register.js';
|
|
29
|
-
import { serializePlanTree } from '../planner/debug.js';
|
|
29
|
+
import { serializePlanTree, formatPlanTree } from '../planner/debug.js';
|
|
30
30
|
import type { DebugOptions } from '../planner/planning-context.js';
|
|
31
31
|
import { EmissionContext } from '../runtime/emission-context.js';
|
|
32
32
|
import { Optimizer, DEFAULT_TUNING } from '../planner/optimizer.js';
|
|
33
33
|
import { registerBuiltinWindowFunctions } from '../func/builtins/builtin-window-functions.js';
|
|
34
34
|
import { DatabaseOptionsManager } from './database-options.js';
|
|
35
|
+
import type { InstructionTracer } from '../runtime/types.js';
|
|
35
36
|
|
|
36
37
|
const log = createLogger('core:database');
|
|
37
38
|
const warnLog = log.extend('warn');
|
|
@@ -52,6 +53,7 @@ export class Database {
|
|
|
52
53
|
private inImplicitTransaction = false; // Track if we're in an implicit transaction
|
|
53
54
|
public readonly optimizer: Optimizer;
|
|
54
55
|
public readonly options: DatabaseOptionsManager;
|
|
56
|
+
private instructionTracer: InstructionTracer | undefined;
|
|
55
57
|
|
|
56
58
|
constructor() {
|
|
57
59
|
this.schemaManager = new SchemaManager(this);
|
|
@@ -145,6 +147,12 @@ export class Database {
|
|
|
145
147
|
log('Default column nullability changed to: %s', value);
|
|
146
148
|
}
|
|
147
149
|
});
|
|
150
|
+
|
|
151
|
+
this.options.registerOption('trace_plan_stack', {
|
|
152
|
+
type: 'boolean',
|
|
153
|
+
defaultValue: false,
|
|
154
|
+
description: 'Enable plan stack tracing',
|
|
155
|
+
});
|
|
148
156
|
}
|
|
149
157
|
|
|
150
158
|
/** @internal Registers default built-in SQL functions */
|
|
@@ -247,6 +255,7 @@ export class Database {
|
|
|
247
255
|
params: params ?? {},
|
|
248
256
|
context: new Map(),
|
|
249
257
|
tableContexts: new Map(),
|
|
258
|
+
tracer: this.instructionTracer,
|
|
250
259
|
enableMetrics: this.options.getBooleanOption('runtime_stats'),
|
|
251
260
|
};
|
|
252
261
|
|
|
@@ -547,6 +556,24 @@ export class Database {
|
|
|
547
556
|
log('Registered collation: %s', name);
|
|
548
557
|
}
|
|
549
558
|
|
|
559
|
+
/**
|
|
560
|
+
* Sets the instruction tracer for this database.
|
|
561
|
+
* The tracer will be used for all statement executions.
|
|
562
|
+
* @param tracer The instruction tracer to use, or null to disable tracing.
|
|
563
|
+
*/
|
|
564
|
+
setInstructionTracer(tracer: InstructionTracer | undefined): void {
|
|
565
|
+
this.instructionTracer = tracer;
|
|
566
|
+
log('Instruction tracer %s', tracer ? 'enabled' : 'disabled');
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
/**
|
|
570
|
+
* Gets the current instruction tracer for this database.
|
|
571
|
+
* @returns The instruction tracer, or undefined if none is set.
|
|
572
|
+
*/
|
|
573
|
+
getInstructionTracer(): InstructionTracer | undefined {
|
|
574
|
+
return this.instructionTracer;
|
|
575
|
+
}
|
|
576
|
+
|
|
550
577
|
/** @internal Gets a registered collation function */
|
|
551
578
|
_getCollation(name: string): CollationFunction | undefined {
|
|
552
579
|
return getCollation(name);
|
|
@@ -625,14 +652,27 @@ export class Database {
|
|
|
625
652
|
}
|
|
626
653
|
|
|
627
654
|
/**
|
|
628
|
-
* Gets a detailed
|
|
655
|
+
* Gets a detailed representation of the query plan for debugging.
|
|
629
656
|
* @param sql The SQL statement to plan.
|
|
630
|
-
* @
|
|
657
|
+
* @param options Optional formatting options. If not provided, uses concise tree format.
|
|
658
|
+
* @returns String containing the formatted plan tree.
|
|
631
659
|
*/
|
|
632
|
-
getDebugPlan(sql: string): string {
|
|
660
|
+
getDebugPlan(sql: string, options?: { verbose?: boolean; expandNodes?: string[]; maxDepth?: number }): string {
|
|
633
661
|
this.checkOpen();
|
|
634
662
|
const plan = this.getPlan(sql);
|
|
635
|
-
|
|
663
|
+
|
|
664
|
+
if (options?.verbose) {
|
|
665
|
+
// Use the original detailed JSON format
|
|
666
|
+
return serializePlanTree(plan);
|
|
667
|
+
} else {
|
|
668
|
+
// Use the new concise tree format
|
|
669
|
+
return formatPlanTree(plan, {
|
|
670
|
+
concise: true,
|
|
671
|
+
expandNodes: options?.expandNodes || [],
|
|
672
|
+
maxDepth: options?.maxDepth,
|
|
673
|
+
showPhysical: true
|
|
674
|
+
});
|
|
675
|
+
}
|
|
636
676
|
}
|
|
637
677
|
|
|
638
678
|
/**
|
|
@@ -683,8 +723,10 @@ export class Database {
|
|
|
683
723
|
schemaManager: this.schemaManager,
|
|
684
724
|
parameters: params ?? {},
|
|
685
725
|
scope: parameterScope,
|
|
726
|
+
cteNodes: new Map(),
|
|
686
727
|
schemaDependencies: new BuildTimeDependencyTracker(),
|
|
687
|
-
schemaCache: new Map()
|
|
728
|
+
schemaCache: new Map(),
|
|
729
|
+
cteReferenceCache: new Map()
|
|
688
730
|
};
|
|
689
731
|
|
|
690
732
|
return buildBlock(ctx, statements);
|
package/src/core/statement.ts
CHANGED
|
@@ -12,7 +12,6 @@ import type { RuntimeContext } from '../runtime/types.js';
|
|
|
12
12
|
import { Cached } from '../util/cached.js';
|
|
13
13
|
import { isAsyncIterable } from '../runtime/utils.js';
|
|
14
14
|
import { generateInstructionProgram, serializePlanTree } from '../planner/debug.js';
|
|
15
|
-
import type { InstructionTracer } from '../runtime/types.js';
|
|
16
15
|
import { EmissionContext } from '../runtime/emission-context.js';
|
|
17
16
|
import type { SchemaDependency } from '../planner/planning-context.js';
|
|
18
17
|
|
|
@@ -241,6 +240,7 @@ export class Statement {
|
|
|
241
240
|
params: this.boundArgs,
|
|
242
241
|
context: new Map(),
|
|
243
242
|
tableContexts: new Map(),
|
|
243
|
+
tracer: this.db.getInstructionTracer(),
|
|
244
244
|
enableMetrics: this.db.getOption('runtime_metrics'),
|
|
245
245
|
};
|
|
246
246
|
|
|
@@ -438,53 +438,5 @@ export class Statement {
|
|
|
438
438
|
|
|
439
439
|
return generateInstructionProgram(scheduler.instructions, scheduler.destinations);
|
|
440
440
|
}
|
|
441
|
-
|
|
442
|
-
/**
|
|
443
|
-
* Executes with runtime instruction tracing enabled.
|
|
444
|
-
* @param params Optional parameters to bind.
|
|
445
|
-
* @param tracer Optional custom tracer for collecting trace data.
|
|
446
|
-
*/
|
|
447
|
-
async *iterateRowsWithTrace(params?: SqlParameters | SqlValue[], tracer?: InstructionTracer): AsyncIterable<Row> {
|
|
448
|
-
this.validateStatement("iterate rows with trace for");
|
|
449
|
-
if (this.busy) throw new MisuseError("Statement busy, another iteration may be in progress or reset needed.");
|
|
450
|
-
if (params) this.bindAll(params);
|
|
451
|
-
this.busy = true;
|
|
452
|
-
|
|
453
|
-
try {
|
|
454
|
-
const blockPlanNode = this.compile();
|
|
455
|
-
if (!blockPlanNode.statements.length) return;
|
|
456
|
-
|
|
457
|
-
const emissionContext = this.getEmissionContext();
|
|
458
|
-
const rootInstruction = emitPlanNode(blockPlanNode, emissionContext);
|
|
459
|
-
const scheduler = new Scheduler(rootInstruction);
|
|
460
|
-
const runtimeCtx: RuntimeContext = {
|
|
461
|
-
db: this.db,
|
|
462
|
-
stmt: this,
|
|
463
|
-
params: this.boundArgs,
|
|
464
|
-
context: new Map(),
|
|
465
|
-
tableContexts: new Map(),
|
|
466
|
-
tracer: tracer,
|
|
467
|
-
enableMetrics: this.db.getOption('runtime_metrics'),
|
|
468
|
-
};
|
|
469
|
-
|
|
470
|
-
const results = await scheduler.run(runtimeCtx);
|
|
471
|
-
if (results) {
|
|
472
|
-
if (Array.isArray(results) && results.length) {
|
|
473
|
-
const lastStatementOutput = results[results.length - 1];
|
|
474
|
-
if (isAsyncIterable(lastStatementOutput)) {
|
|
475
|
-
yield* lastStatementOutput as AsyncIterable<Row>;
|
|
476
|
-
}
|
|
477
|
-
} else if (isAsyncIterable(results)) {
|
|
478
|
-
yield* results as AsyncIterable<Row>;
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
} catch (e: any) {
|
|
482
|
-
errorLog('Runtime execution failed in iterateRowsWithTrace for current statement: %O', e);
|
|
483
|
-
if (e instanceof QuereusError) throw e;
|
|
484
|
-
throw new QuereusError(`Execution error: ${e.message}`, StatusCode.ERROR, e);
|
|
485
|
-
} finally {
|
|
486
|
-
this.busy = false;
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
441
|
}
|
|
490
442
|
|
|
@@ -75,10 +75,6 @@ export const queryPlanFunc = createIntegratedTableValuedFunction(
|
|
|
75
75
|
op = node.nodeType.replace(/Node$/, '').toUpperCase();
|
|
76
76
|
|
|
77
77
|
switch (node.nodeType) {
|
|
78
|
-
case 'TableScan':
|
|
79
|
-
objectName = node.source?.tableSchema?.name || null;
|
|
80
|
-
alias = node.alias || null;
|
|
81
|
-
break;
|
|
82
78
|
case 'TableFunctionCall':
|
|
83
79
|
objectName = node.functionName;
|
|
84
80
|
alias = node.alias || null;
|
|
@@ -287,13 +283,6 @@ export const stackTraceFunc = createIntegratedTableValuedFunction(
|
|
|
287
283
|
vars: { statementCount: node.statements?.length || 0 }
|
|
288
284
|
});
|
|
289
285
|
break;
|
|
290
|
-
case 'TableScan':
|
|
291
|
-
stack.push({
|
|
292
|
-
name: 'buildTableScan',
|
|
293
|
-
location: 'building/table.ts:buildTableScan',
|
|
294
|
-
vars: { tableName: node.source?.tableSchema?.name || 'unknown' }
|
|
295
|
-
});
|
|
296
|
-
break;
|
|
297
286
|
case 'Filter':
|
|
298
287
|
stack.push({
|
|
299
288
|
name: 'buildFilter',
|
package/src/index.ts
CHANGED
|
@@ -11,16 +11,41 @@ export { Statement } from './core/statement.js';
|
|
|
11
11
|
|
|
12
12
|
// Common data types and constants
|
|
13
13
|
export { StatusCode, SqlDataType } from './common/types.js';
|
|
14
|
-
export type { SqlValue, SqlParameters, Row } from './common/types.js';
|
|
15
|
-
export { ConflictResolution } from './common/constants.js';
|
|
14
|
+
export type { SqlValue, SqlParameters, Row, MaybePromise, RowOp } from './common/types.js';
|
|
15
|
+
export { ConflictResolution, IndexConstraintOp, VTabConfig, FunctionFlags } from './common/constants.js';
|
|
16
16
|
export { QuereusError, MisuseError, ConstraintError, unwrapError, formatErrorChain, getPrimaryError } from './common/errors.js';
|
|
17
17
|
export type { ErrorInfo } from './common/errors.js';
|
|
18
18
|
|
|
19
19
|
// Virtual Table API
|
|
20
20
|
export { VirtualTable } from './vtab/table.js';
|
|
21
|
+
export type { VirtualTableConnection } from './vtab/connection.js';
|
|
21
22
|
export { MemoryTableModule } from './vtab/memory/module.js';
|
|
22
|
-
export type { IndexInfo, IndexConstraint, IndexConstraintUsage, IndexOrderBy
|
|
23
|
+
export type { IndexInfo, IndexConstraint, IndexConstraintUsage, IndexOrderBy } from './vtab/index-info.js';
|
|
24
|
+
export { IndexScanFlags } from './vtab/index-info.js';
|
|
23
25
|
export type { FilterInfo } from './vtab/filter-info.js';
|
|
26
|
+
export type { BaseModuleConfig, SchemaChangeInfo } from './vtab/module.js';
|
|
27
|
+
|
|
28
|
+
// Best Access Plan API (modern vtable planning interface)
|
|
29
|
+
export type {
|
|
30
|
+
BestAccessPlanRequest,
|
|
31
|
+
BestAccessPlanResult,
|
|
32
|
+
ConstraintOp,
|
|
33
|
+
ColumnMeta,
|
|
34
|
+
PredicateConstraint,
|
|
35
|
+
OrderingSpec
|
|
36
|
+
} from './vtab/best-access-plan.js';
|
|
37
|
+
export { AccessPlanBuilder, validateAccessPlan } from './vtab/best-access-plan.js';
|
|
38
|
+
|
|
39
|
+
// Collation functions
|
|
40
|
+
export type { CollationFunction } from './util/comparison.js';
|
|
41
|
+
export {
|
|
42
|
+
BINARY_COLLATION,
|
|
43
|
+
NOCASE_COLLATION,
|
|
44
|
+
RTRIM_COLLATION,
|
|
45
|
+
registerCollation,
|
|
46
|
+
getCollation,
|
|
47
|
+
resolveCollation
|
|
48
|
+
} from './util/comparison.js';
|
|
24
49
|
|
|
25
50
|
// SQL Parser and Compiler
|
|
26
51
|
export { Parser } from './parser/parser.js';
|
|
@@ -58,10 +83,19 @@ import './runtime/register.js';
|
|
|
58
83
|
|
|
59
84
|
// Re-export plugin system
|
|
60
85
|
export { dynamicLoadModule, validatePluginUrl } from './util/plugin-loader.js';
|
|
61
|
-
export type {
|
|
86
|
+
export type {
|
|
87
|
+
PluginManifest,
|
|
88
|
+
PluginRecord,
|
|
89
|
+
PluginSetting,
|
|
90
|
+
VTablePluginInfo,
|
|
91
|
+
FunctionPluginInfo,
|
|
92
|
+
CollationPluginInfo,
|
|
93
|
+
PluginRegistrations
|
|
94
|
+
} from './vtab/manifest.js';
|
|
62
95
|
|
|
63
96
|
// Re-export virtual table framework
|
|
64
97
|
export type { VirtualTableModule } from './vtab/module.js';
|
|
65
98
|
|
|
66
99
|
// Debug and development utilities
|
|
67
|
-
export { serializePlanTree } from './planner/debug.js';
|
|
100
|
+
export { serializePlanTree, formatPlanTree, formatPlanSummary, serializePlanTreeWithOptions } from './planner/debug.js';
|
|
101
|
+
export type { PlanDisplayOptions } from './planner/debug.js';
|
package/src/parser/ast.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { MaybePromise, SqlValue } from '../common/types.js';
|
|
1
|
+
import type { MaybePromise, RowOp, SqlValue } from '../common/types.js';
|
|
2
2
|
import type { ConflictResolution } from '../common/constants.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -13,7 +13,7 @@ export interface AstNode {
|
|
|
13
13
|
| 'rollback' | 'table' | 'join' | 'savepoint' | 'release' | 'functionSource' | 'with' | 'commonTableExpr' | 'pragma'
|
|
14
14
|
| 'collate' | 'primaryKey' | 'notNull' | 'null' | 'unique' | 'check' | 'default' | 'foreignKey' | 'generated' | 'windowFunction'
|
|
15
15
|
| 'windowDefinition' | 'windowFrame' | 'currentRow' | 'unboundedPreceding' | 'unboundedFollowing' | 'preceding' | 'following'
|
|
16
|
-
| 'subquerySource' | 'mutatingSubquerySource' | 'case' | 'in' | 'exists' | 'values';
|
|
16
|
+
| 'subquerySource' | 'mutatingSubquerySource' | 'case' | 'in' | 'exists' | 'values' | 'between';
|
|
17
17
|
loc?: {
|
|
18
18
|
start: { line: number, column: number, offset: number };
|
|
19
19
|
end: { line: number, column: number, offset: number };
|
|
@@ -23,7 +23,7 @@ export interface AstNode {
|
|
|
23
23
|
// Expression types
|
|
24
24
|
export type Expression = LiteralExpr | IdentifierExpr | BinaryExpr | UnaryExpr | FunctionExpr | CastExpr
|
|
25
25
|
| ParameterExpr | SubqueryExpr | ColumnExpr | FunctionSource | CollateExpr | WindowFunctionExpr | CaseExpr
|
|
26
|
-
| InExpr | ExistsExpr;
|
|
26
|
+
| InExpr | ExistsExpr | BetweenExpr;
|
|
27
27
|
|
|
28
28
|
// Literal value expression (number, string, null, etc.)
|
|
29
29
|
export interface LiteralExpr extends AstNode {
|
|
@@ -129,6 +129,15 @@ export interface SubqueryExpr extends AstNode {
|
|
|
129
129
|
query: SelectStmt;
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
+
// BETWEEN expression
|
|
133
|
+
export interface BetweenExpr extends AstNode {
|
|
134
|
+
type: 'between';
|
|
135
|
+
expr: Expression; // Left side of BETWEEN
|
|
136
|
+
lower: Expression; // Lower bound
|
|
137
|
+
upper: Expression; // Upper bound
|
|
138
|
+
not?: boolean; // For NOT BETWEEN
|
|
139
|
+
}
|
|
140
|
+
|
|
132
141
|
// IN expression
|
|
133
142
|
export interface InExpr extends AstNode {
|
|
134
143
|
type: 'in';
|
|
@@ -347,9 +356,6 @@ export interface ColumnDef {
|
|
|
347
356
|
constraints: ColumnConstraint[];
|
|
348
357
|
}
|
|
349
358
|
|
|
350
|
-
// New type for row operations
|
|
351
|
-
export type RowOp = 'insert' | 'update' | 'delete';
|
|
352
|
-
|
|
353
359
|
// Column constraint (PRIMARY KEY, NOT NULL, etc.)
|
|
354
360
|
export interface ColumnConstraint extends AstNode {
|
|
355
361
|
type: 'primaryKey' | 'notNull' | 'null' | 'unique' | 'check' | 'default' | 'foreignKey' | 'collate' | 'generated';
|
package/src/parser/parser.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { createLogger } from '../common/logger.js'; // Import logger
|
|
|
2
2
|
import { Lexer, type Token, TokenType } from './lexer.js';
|
|
3
3
|
import * as AST from './ast.js';
|
|
4
4
|
import { ConflictResolution } from '../common/constants.js';
|
|
5
|
-
import type { SqlValue } from '../common/types.js';
|
|
5
|
+
import type { RowOp, SqlValue } from '../common/types.js';
|
|
6
6
|
import { quereusError } from '../common/errors.js';
|
|
7
7
|
import { StatusCode } from '../common/types.js';
|
|
8
8
|
import { getSyncLiteral } from './utils.js';
|
|
@@ -466,7 +466,24 @@ export class Parser {
|
|
|
466
466
|
const expr = this.expression();
|
|
467
467
|
const direction = this.match(TokenType.DESC) ? 'desc' :
|
|
468
468
|
(this.match(TokenType.ASC) ? 'asc' : 'asc'); // Default to ASC
|
|
469
|
-
|
|
469
|
+
|
|
470
|
+
// Handle NULLS FIRST/LAST
|
|
471
|
+
let nulls: 'first' | 'last' | undefined;
|
|
472
|
+
if (this.matchKeyword('NULLS')) {
|
|
473
|
+
if (this.matchKeyword('FIRST')) {
|
|
474
|
+
nulls = 'first';
|
|
475
|
+
} else if (this.matchKeyword('LAST')) {
|
|
476
|
+
nulls = 'last';
|
|
477
|
+
} else {
|
|
478
|
+
throw this.error(this.peek(), "Expected 'FIRST' or 'LAST' after 'NULLS'.");
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
const orderClause: AST.OrderByClause = { expr, direction };
|
|
483
|
+
if (nulls) {
|
|
484
|
+
orderClause.nulls = nulls;
|
|
485
|
+
}
|
|
486
|
+
orderBy.push(orderClause);
|
|
470
487
|
} while (this.match(TokenType.COMMA));
|
|
471
488
|
lastConsumedToken = this.previous(); // After last order by clause
|
|
472
489
|
}
|
|
@@ -1125,33 +1142,18 @@ export class Parser {
|
|
|
1125
1142
|
}
|
|
1126
1143
|
} else if (this.match(TokenType.BETWEEN)) {
|
|
1127
1144
|
// NOT BETWEEN
|
|
1128
|
-
const
|
|
1145
|
+
const lower = this.term();
|
|
1129
1146
|
this.consume(TokenType.AND, "Expected 'AND' after NOT BETWEEN lower bound.");
|
|
1130
|
-
const
|
|
1131
|
-
const endToken = this.previous(); // End token is end of
|
|
1132
|
-
|
|
1133
|
-
// Create a binary AND expression for the bounds
|
|
1134
|
-
const boundsExpr: AST.BinaryExpr = {
|
|
1135
|
-
type: 'binary',
|
|
1136
|
-
operator: 'AND',
|
|
1137
|
-
left: low,
|
|
1138
|
-
right: high,
|
|
1139
|
-
loc: _createLoc(low.loc?.start ? this.tokens.find(t => t.startOffset === low.loc!.start.offset) ?? this.peek() : this.peek(), endToken)
|
|
1140
|
-
};
|
|
1141
|
-
|
|
1142
|
-
// Create the BETWEEN expression as a binary expression, then wrap in NOT
|
|
1143
|
-
const betweenExpr: AST.BinaryExpr = {
|
|
1144
|
-
type: 'binary',
|
|
1145
|
-
operator: 'BETWEEN',
|
|
1146
|
-
left: expr,
|
|
1147
|
-
right: boundsExpr,
|
|
1148
|
-
loc: _createLoc(startToken, endToken),
|
|
1149
|
-
};
|
|
1147
|
+
const upper = this.term();
|
|
1148
|
+
const endToken = this.previous(); // End token is end of upper expr
|
|
1150
1149
|
|
|
1150
|
+
// Create the NOT BETWEEN expression as a dedicated node type
|
|
1151
1151
|
expr = {
|
|
1152
|
-
type: '
|
|
1153
|
-
|
|
1154
|
-
|
|
1152
|
+
type: 'between',
|
|
1153
|
+
expr,
|
|
1154
|
+
lower,
|
|
1155
|
+
upper,
|
|
1156
|
+
not: true,
|
|
1155
1157
|
loc: _createLoc(notStartToken, endToken),
|
|
1156
1158
|
};
|
|
1157
1159
|
} else if (this.match(TokenType.LIKE)) {
|
|
@@ -1194,26 +1196,17 @@ export class Parser {
|
|
|
1194
1196
|
};
|
|
1195
1197
|
} else if (operatorToken.type === TokenType.BETWEEN) {
|
|
1196
1198
|
// Parse BETWEEN expression: expr BETWEEN low AND high
|
|
1197
|
-
const
|
|
1199
|
+
const lower = this.term();
|
|
1198
1200
|
this.consume(TokenType.AND, "Expected 'AND' after BETWEEN lower bound.");
|
|
1199
|
-
const
|
|
1200
|
-
const endToken = this.previous(); // End token is end of
|
|
1201
|
+
const upper = this.term();
|
|
1202
|
+
const endToken = this.previous(); // End token is end of upper expr
|
|
1201
1203
|
|
|
1202
|
-
// Create
|
|
1203
|
-
const boundsExpr: AST.BinaryExpr = {
|
|
1204
|
-
type: 'binary',
|
|
1205
|
-
operator: 'AND',
|
|
1206
|
-
left: low,
|
|
1207
|
-
right: high,
|
|
1208
|
-
loc: _createLoc(low.loc?.start ? this.tokens.find(t => t.startOffset === low.loc!.start.offset) ?? this.peek() : this.peek(), endToken)
|
|
1209
|
-
};
|
|
1210
|
-
|
|
1211
|
-
// Create the BETWEEN expression as a binary expression
|
|
1204
|
+
// Create the BETWEEN expression as a dedicated node type
|
|
1212
1205
|
expr = {
|
|
1213
|
-
type: '
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1206
|
+
type: 'between',
|
|
1207
|
+
expr,
|
|
1208
|
+
lower,
|
|
1209
|
+
upper,
|
|
1217
1210
|
loc: _createLoc(startToken, endToken),
|
|
1218
1211
|
};
|
|
1219
1212
|
} else if (operatorToken.type === TokenType.IN) {
|
|
@@ -1617,20 +1610,20 @@ export class Parser {
|
|
|
1617
1610
|
const direction = this.match(TokenType.DESC) ? 'desc' : (this.match(TokenType.ASC) ? 'asc' : 'asc');
|
|
1618
1611
|
|
|
1619
1612
|
// Handle NULLS FIRST/LAST
|
|
1620
|
-
let
|
|
1613
|
+
let nulls: 'first' | 'last' | undefined;
|
|
1621
1614
|
if (this.matchKeyword('NULLS')) {
|
|
1622
1615
|
if (this.matchKeyword('FIRST')) {
|
|
1623
|
-
|
|
1616
|
+
nulls = 'first';
|
|
1624
1617
|
} else if (this.matchKeyword('LAST')) {
|
|
1625
|
-
|
|
1618
|
+
nulls = 'last';
|
|
1626
1619
|
} else {
|
|
1627
1620
|
throw this.error(this.peek(), "Expected 'FIRST' or 'LAST' after 'NULLS'.");
|
|
1628
1621
|
}
|
|
1629
1622
|
}
|
|
1630
1623
|
|
|
1631
1624
|
const orderClause: AST.OrderByClause = { expr, direction };
|
|
1632
|
-
if (
|
|
1633
|
-
|
|
1625
|
+
if (nulls) {
|
|
1626
|
+
orderClause.nulls = nulls;
|
|
1634
1627
|
}
|
|
1635
1628
|
orderBy.push(orderClause);
|
|
1636
1629
|
} while (this.match(TokenType.COMMA));
|
|
@@ -2454,7 +2447,7 @@ export class Parser {
|
|
|
2454
2447
|
return { type: 'unique', name, onConflict, loc: _createLoc(startToken, endToken) };
|
|
2455
2448
|
} else if (this.match(TokenType.CHECK)) {
|
|
2456
2449
|
// --- Parse optional ON clause before parentheses --- //
|
|
2457
|
-
let operations:
|
|
2450
|
+
let operations: RowOp[] | undefined;
|
|
2458
2451
|
if (this.matchKeyword('ON')) {
|
|
2459
2452
|
operations = this.parseRowOpList();
|
|
2460
2453
|
}
|
|
@@ -2533,7 +2526,7 @@ export class Parser {
|
|
|
2533
2526
|
return { type: 'unique', name, columns, onConflict, loc: _createLoc(startToken, endToken) };
|
|
2534
2527
|
} else if (this.match(TokenType.CHECK)) {
|
|
2535
2528
|
// --- Parse optional ON clause before parentheses --- //
|
|
2536
|
-
let operations:
|
|
2529
|
+
let operations: RowOp[] | undefined;
|
|
2537
2530
|
if (this.matchKeyword('ON')) {
|
|
2538
2531
|
operations = this.parseRowOpList();
|
|
2539
2532
|
}
|
|
@@ -2704,8 +2697,8 @@ export class Parser {
|
|
|
2704
2697
|
}
|
|
2705
2698
|
|
|
2706
2699
|
/** Parses the list of operations for CHECK ON */
|
|
2707
|
-
private parseRowOpList():
|
|
2708
|
-
const operations:
|
|
2700
|
+
private parseRowOpList(): RowOp[] {
|
|
2701
|
+
const operations: RowOp[] = [];
|
|
2709
2702
|
|
|
2710
2703
|
// Parse operations in a comma-separated list
|
|
2711
2704
|
do {
|