@quereus/quereus 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -1
- package/dist/src/common/errors.js.map +1 -1
- package/dist/src/common/json-types.d.ts +11 -0
- package/dist/src/common/json-types.d.ts.map +1 -0
- package/dist/src/common/json-types.js +3 -0
- package/dist/src/common/json-types.js.map +1 -0
- package/dist/src/common/types.d.ts +1 -0
- package/dist/src/common/types.d.ts.map +1 -1
- package/dist/src/core/database-options.d.ts +2 -2
- package/dist/src/core/database-options.d.ts.map +1 -1
- package/dist/src/core/database-options.js.map +1 -1
- package/dist/src/core/database.d.ts +61 -14
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +481 -54
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/statement.d.ts.map +1 -1
- package/dist/src/core/statement.js +3 -1
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/func/builtins/builtin-window-functions.d.ts.map +1 -1
- package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
- package/dist/src/func/builtins/datetime.d.ts +2 -0
- package/dist/src/func/builtins/datetime.d.ts.map +1 -1
- package/dist/src/func/builtins/datetime.js +39 -0
- package/dist/src/func/builtins/datetime.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts +1 -0
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +159 -36
- package/dist/src/func/builtins/explain.js.map +1 -1
- package/dist/src/func/builtins/index.d.ts.map +1 -1
- package/dist/src/func/builtins/index.js +5 -2
- package/dist/src/func/builtins/index.js.map +1 -1
- package/dist/src/func/builtins/json-helpers.d.ts +8 -8
- package/dist/src/func/builtins/json-helpers.d.ts.map +1 -1
- package/dist/src/func/builtins/json-helpers.js +3 -3
- package/dist/src/func/builtins/json-helpers.js.map +1 -1
- package/dist/src/func/builtins/json-tvf.d.ts.map +1 -1
- package/dist/src/func/builtins/json-tvf.js +1 -1
- package/dist/src/func/builtins/json-tvf.js.map +1 -1
- package/dist/src/func/builtins/json.d.ts.map +1 -1
- package/dist/src/func/builtins/json.js +3 -2
- package/dist/src/func/builtins/json.js.map +1 -1
- package/dist/src/func/builtins/schema.d.ts.map +1 -1
- package/dist/src/func/builtins/schema.js +22 -1
- package/dist/src/func/builtins/schema.js.map +1 -1
- package/dist/src/func/context.d.ts.map +1 -1
- package/dist/src/func/context.js +5 -0
- package/dist/src/func/context.js.map +1 -1
- package/dist/src/func/registration.d.ts +2 -1
- package/dist/src/func/registration.d.ts.map +1 -1
- package/dist/src/func/registration.js.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/parser/ast.d.ts +83 -4
- package/dist/src/parser/ast.d.ts.map +1 -1
- package/dist/src/parser/lexer.d.ts +11 -0
- package/dist/src/parser/lexer.d.ts.map +1 -1
- package/dist/src/parser/lexer.js +29 -21
- package/dist/src/parser/lexer.js.map +1 -1
- package/dist/src/parser/parser.d.ts +16 -0
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +542 -26
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/parser/visitor.d.ts.map +1 -1
- package/dist/src/parser/visitor.js +1 -0
- package/dist/src/parser/visitor.js.map +1 -1
- package/dist/src/planner/analysis/binding-collector.d.ts +5 -0
- package/dist/src/planner/analysis/binding-collector.d.ts.map +1 -0
- package/dist/src/planner/analysis/binding-collector.js +73 -0
- package/dist/src/planner/analysis/binding-collector.js.map +1 -0
- package/dist/src/planner/analysis/const-evaluator.js +1 -1
- package/dist/src/planner/analysis/const-evaluator.js.map +1 -1
- package/dist/src/planner/analysis/const-pass.d.ts.map +1 -1
- package/dist/src/planner/analysis/const-pass.js +1 -1
- package/dist/src/planner/analysis/const-pass.js.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts +67 -31
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +513 -84
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/analysis/predicate-normalizer.d.ts +17 -0
- package/dist/src/planner/analysis/predicate-normalizer.d.ts.map +1 -0
- package/dist/src/planner/analysis/predicate-normalizer.js +222 -0
- package/dist/src/planner/analysis/predicate-normalizer.js.map +1 -0
- package/dist/src/planner/building/alter-table.d.ts.map +1 -1
- package/dist/src/planner/building/alter-table.js +5 -2
- package/dist/src/planner/building/alter-table.js.map +1 -1
- package/dist/src/planner/building/block.d.ts.map +1 -1
- package/dist/src/planner/building/block.js +16 -0
- package/dist/src/planner/building/block.js.map +1 -1
- package/dist/src/planner/building/constraint-builder.d.ts +1 -1
- package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
- package/dist/src/planner/building/constraint-builder.js +52 -3
- package/dist/src/planner/building/constraint-builder.js.map +1 -1
- package/dist/src/planner/building/create-assertion.d.ts +5 -0
- package/dist/src/planner/building/create-assertion.d.ts.map +1 -0
- package/dist/src/planner/building/create-assertion.js +5 -0
- package/dist/src/planner/building/create-assertion.js.map +1 -0
- package/dist/src/planner/building/declare-schema.d.ts +8 -0
- package/dist/src/planner/building/declare-schema.d.ts.map +1 -0
- package/dist/src/planner/building/declare-schema.js +14 -0
- package/dist/src/planner/building/declare-schema.js.map +1 -0
- package/dist/src/planner/building/delete.d.ts.map +1 -1
- package/dist/src/planner/building/delete.js +37 -5
- package/dist/src/planner/building/delete.js.map +1 -1
- package/dist/src/planner/building/drop-assertion.d.ts +5 -0
- package/dist/src/planner/building/drop-assertion.d.ts.map +1 -0
- package/dist/src/planner/building/drop-assertion.js +8 -0
- package/dist/src/planner/building/drop-assertion.js.map +1 -0
- package/dist/src/planner/building/expression.d.ts.map +1 -1
- package/dist/src/planner/building/expression.js +1 -0
- package/dist/src/planner/building/expression.js.map +1 -1
- package/dist/src/planner/building/function-call.d.ts.map +1 -1
- package/dist/src/planner/building/function-call.js +2 -1
- package/dist/src/planner/building/function-call.js.map +1 -1
- package/dist/src/planner/building/insert.d.ts.map +1 -1
- package/dist/src/planner/building/insert.js +67 -10
- package/dist/src/planner/building/insert.js.map +1 -1
- package/dist/src/planner/building/pragma.d.ts.map +1 -1
- package/dist/src/planner/building/pragma.js +1 -0
- package/dist/src/planner/building/pragma.js.map +1 -1
- package/dist/src/planner/building/schema-resolution.d.ts +2 -2
- package/dist/src/planner/building/schema-resolution.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.js +3 -2
- package/dist/src/planner/building/select-aggregates.js.map +1 -1
- package/dist/src/planner/building/select-compound.d.ts +2 -2
- package/dist/src/planner/building/select-compound.d.ts.map +1 -1
- package/dist/src/planner/building/select-compound.js +10 -1
- package/dist/src/planner/building/select-compound.js.map +1 -1
- package/dist/src/planner/building/select-context.d.ts +3 -3
- package/dist/src/planner/building/select-context.d.ts.map +1 -1
- package/dist/src/planner/building/select-context.js.map +1 -1
- package/dist/src/planner/building/select-modifiers.d.ts +6 -5
- package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
- package/dist/src/planner/building/select-modifiers.js +5 -4
- package/dist/src/planner/building/select-modifiers.js.map +1 -1
- package/dist/src/planner/building/select-projections.d.ts.map +1 -1
- package/dist/src/planner/building/select-projections.js +4 -5
- package/dist/src/planner/building/select-projections.js.map +1 -1
- package/dist/src/planner/building/select-window.d.ts.map +1 -1
- package/dist/src/planner/building/select-window.js +6 -3
- package/dist/src/planner/building/select-window.js.map +1 -1
- package/dist/src/planner/building/select.d.ts +3 -3
- package/dist/src/planner/building/select.d.ts.map +1 -1
- package/dist/src/planner/building/select.js +18 -8
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/building/table-function.d.ts.map +1 -1
- package/dist/src/planner/building/table-function.js +1 -1
- package/dist/src/planner/building/table-function.js.map +1 -1
- package/dist/src/planner/building/table.d.ts +5 -3
- package/dist/src/planner/building/table.d.ts.map +1 -1
- package/dist/src/planner/building/table.js +7 -2
- package/dist/src/planner/building/table.js.map +1 -1
- package/dist/src/planner/building/update.d.ts.map +1 -1
- package/dist/src/planner/building/update.js +38 -6
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/building/with.d.ts +3 -3
- package/dist/src/planner/building/with.d.ts.map +1 -1
- package/dist/src/planner/building/with.js.map +1 -1
- package/dist/src/planner/debug.d.ts.map +1 -1
- package/dist/src/planner/debug.js.map +1 -1
- package/dist/src/planner/framework/characteristics.d.ts +235 -0
- package/dist/src/planner/framework/characteristics.d.ts.map +1 -0
- package/dist/src/planner/framework/characteristics.js +299 -0
- package/dist/src/planner/framework/characteristics.js.map +1 -0
- package/dist/src/planner/framework/context.d.ts +16 -5
- package/dist/src/planner/framework/context.d.ts.map +1 -1
- package/dist/src/planner/framework/context.js +2 -0
- package/dist/src/planner/framework/context.js.map +1 -1
- package/dist/src/planner/framework/pass.d.ts +116 -0
- package/dist/src/planner/framework/pass.d.ts.map +1 -0
- package/dist/src/planner/framework/pass.js +236 -0
- package/dist/src/planner/framework/pass.js.map +1 -0
- package/dist/src/planner/nodes/aggregate-node.d.ts +16 -6
- package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/aggregate-node.js +40 -4
- package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
- package/dist/src/planner/nodes/array-index-node.js.map +1 -1
- package/dist/src/planner/nodes/cache-node.d.ts +5 -2
- package/dist/src/planner/nodes/cache-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/cache-node.js +6 -0
- package/dist/src/planner/nodes/cache-node.js.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.d.ts +10 -2
- package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.js +12 -4
- package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
- package/dist/src/planner/nodes/create-assertion-node.d.ts +22 -0
- package/dist/src/planner/nodes/create-assertion-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/create-assertion-node.js +41 -0
- package/dist/src/planner/nodes/create-assertion-node.js.map +1 -0
- package/dist/src/planner/nodes/create-index-node.js +2 -2
- package/dist/src/planner/nodes/create-index-node.js.map +1 -1
- package/dist/src/planner/nodes/create-table-node.js +2 -2
- package/dist/src/planner/nodes/create-table-node.js.map +1 -1
- package/dist/src/planner/nodes/cte-node.d.ts +17 -2
- package/dist/src/planner/nodes/cte-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/cte-node.js +9 -1
- package/dist/src/planner/nodes/cte-node.js.map +1 -1
- package/dist/src/planner/nodes/cte-reference-node.js +1 -1
- package/dist/src/planner/nodes/cte-reference-node.js.map +1 -1
- package/dist/src/planner/nodes/declarative-schema.d.ts +62 -0
- package/dist/src/planner/nodes/declarative-schema.d.ts.map +1 -0
- package/dist/src/planner/nodes/declarative-schema.js +181 -0
- package/dist/src/planner/nodes/declarative-schema.js.map +1 -0
- package/dist/src/planner/nodes/delete-node.d.ts +8 -3
- package/dist/src/planner/nodes/delete-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/delete-node.js +10 -2
- package/dist/src/planner/nodes/delete-node.js.map +1 -1
- package/dist/src/planner/nodes/distinct-node.d.ts +3 -2
- package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/distinct-node.js +17 -4
- package/dist/src/planner/nodes/distinct-node.js.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.d.ts +1 -1
- package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/drop-assertion-node.d.ts +21 -0
- package/dist/src/planner/nodes/drop-assertion-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/drop-assertion-node.js +41 -0
- package/dist/src/planner/nodes/drop-assertion-node.js.map +1 -0
- package/dist/src/planner/nodes/drop-table-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/drop-table-node.js +1 -0
- package/dist/src/planner/nodes/drop-table-node.js.map +1 -1
- package/dist/src/planner/nodes/filter.d.ts +8 -3
- package/dist/src/planner/nodes/filter.d.ts.map +1 -1
- package/dist/src/planner/nodes/filter.js +44 -0
- package/dist/src/planner/nodes/filter.js.map +1 -1
- package/dist/src/planner/nodes/insert-node.d.ts +9 -3
- package/dist/src/planner/nodes/insert-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/insert-node.js +11 -2
- package/dist/src/planner/nodes/insert-node.js.map +1 -1
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts +3 -4
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js +1 -16
- package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js.map +1 -1
- package/dist/src/planner/nodes/join-node.d.ts +12 -3
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +111 -2
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/limit-offset.d.ts +7 -3
- package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +15 -0
- package/dist/src/planner/nodes/limit-offset.js.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.d.ts +8 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.js +8 -0
- package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
- package/dist/src/planner/nodes/plan-node.d.ts +9 -9
- package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node.js +3 -3
- package/dist/src/planner/nodes/plan-node.js.map +1 -1
- package/dist/src/planner/nodes/pragma.d.ts +2 -1
- package/dist/src/planner/nodes/pragma.d.ts.map +1 -1
- package/dist/src/planner/nodes/pragma.js +3 -1
- package/dist/src/planner/nodes/pragma.js.map +1 -1
- package/dist/src/planner/nodes/project-node.d.ts +16 -3
- package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/project-node.js +82 -2
- package/dist/src/planner/nodes/project-node.js.map +1 -1
- package/dist/src/planner/nodes/recursive-cte-node.d.ts +2 -2
- package/dist/src/planner/nodes/recursive-cte-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/recursive-cte-node.js +1 -1
- package/dist/src/planner/nodes/recursive-cte-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts +13 -4
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +16 -0
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/remote-query-node.d.ts +37 -0
- package/dist/src/planner/nodes/remote-query-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/remote-query-node.js +63 -0
- package/dist/src/planner/nodes/remote-query-node.js.map +1 -0
- package/dist/src/planner/nodes/retrieve-node.d.ts +46 -0
- package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/retrieve-node.js +77 -0
- package/dist/src/planner/nodes/retrieve-node.js.map +1 -0
- package/dist/src/planner/nodes/returning-node.d.ts +4 -3
- package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/returning-node.js +44 -3
- package/dist/src/planner/nodes/returning-node.js.map +1 -1
- package/dist/src/planner/nodes/sequencing-node.d.ts +1 -1
- package/dist/src/planner/nodes/sequencing-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/sequencing-node.js.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts +1 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
- package/dist/src/planner/nodes/sort.d.ts +11 -2
- package/dist/src/planner/nodes/sort.d.ts.map +1 -1
- package/dist/src/planner/nodes/sort.js +23 -2
- package/dist/src/planner/nodes/sort.js.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.js +4 -1
- package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts +7 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +22 -4
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/nodes/table-function-call.d.ts +2 -1
- package/dist/src/planner/nodes/table-function-call.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-function-call.js +12 -5
- package/dist/src/planner/nodes/table-function-call.js.map +1 -1
- package/dist/src/planner/nodes/transaction-node.js +2 -2
- package/dist/src/planner/nodes/transaction-node.js.map +1 -1
- package/dist/src/planner/nodes/update-node.d.ts +7 -1
- package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/update-node.js +11 -2
- package/dist/src/planner/nodes/update-node.js.map +1 -1
- package/dist/src/planner/nodes/view-reference-node.js.map +1 -1
- package/dist/src/planner/nodes/window-function.js.map +1 -1
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/optimizer-tuning.d.ts +11 -0
- package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
- package/dist/src/planner/optimizer-tuning.js +6 -0
- package/dist/src/planner/optimizer-tuning.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts +17 -3
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +159 -67
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/planning-context.d.ts +5 -3
- package/dist/src/planner/planning-context.d.ts.map +1 -1
- package/dist/src/planner/planning-context.js +2 -0
- package/dist/src/planner/planning-context.js.map +1 -1
- package/dist/src/planner/resolve.d.ts +3 -2
- package/dist/src/planner/resolve.d.ts.map +1 -1
- package/dist/src/planner/resolve.js +6 -5
- package/dist/src/planner/resolve.js.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts +8 -3
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js +206 -47
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts +10 -3
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js +95 -87
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts +8 -2
- package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-cte-optimization.js +24 -13
- package/dist/src/planner/rules/cache/rule-cte-optimization.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-materialization-advisory.d.ts +9 -2
- package/dist/src/planner/rules/cache/rule-materialization-advisory.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-materialization-advisory.js +14 -7
- package/dist/src/planner/rules/cache/rule-materialization-advisory.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.d.ts +9 -3
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js +34 -37
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts +14 -0
- package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js +33 -0
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -0
- package/dist/src/planner/rules/join/rule-join-key-inference.d.ts +11 -0
- package/dist/src/planner/rules/join/rule-join-key-inference.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-join-key-inference.js +32 -0
- package/dist/src/planner/rules/join/rule-join-key-inference.js.map +1 -0
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts +4 -0
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js +233 -0
- package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts +21 -0
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +125 -0
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -0
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts +21 -0
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -0
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +261 -0
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -0
- package/dist/src/planner/scopes/registered.d.ts +1 -0
- package/dist/src/planner/scopes/registered.d.ts.map +1 -1
- package/dist/src/planner/scopes/registered.js +7 -0
- package/dist/src/planner/scopes/registered.js.map +1 -1
- package/dist/src/planner/stats/index.d.ts +0 -17
- package/dist/src/planner/stats/index.d.ts.map +1 -1
- package/dist/src/planner/stats/index.js +0 -58
- package/dist/src/planner/stats/index.js.map +1 -1
- package/dist/src/planner/util/deferred-constraint.d.ts +14 -0
- package/dist/src/planner/util/deferred-constraint.d.ts.map +1 -0
- package/dist/src/planner/util/deferred-constraint.js +85 -0
- package/dist/src/planner/util/deferred-constraint.js.map +1 -0
- package/dist/src/planner/util/key-utils.d.ts +15 -0
- package/dist/src/planner/util/key-utils.d.ts.map +1 -0
- package/dist/src/planner/util/key-utils.js +43 -0
- package/dist/src/planner/util/key-utils.js.map +1 -0
- package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
- package/dist/src/planner/validation/plan-validator.js +1 -0
- package/dist/src/planner/validation/plan-validator.js.map +1 -1
- package/dist/src/runtime/deferred-constraint-queue.d.ts +33 -0
- package/dist/src/runtime/deferred-constraint-queue.d.ts.map +1 -0
- package/dist/src/runtime/deferred-constraint-queue.js +172 -0
- package/dist/src/runtime/deferred-constraint-queue.js.map +1 -0
- package/dist/src/runtime/emission-context.d.ts +9 -3
- package/dist/src/runtime/emission-context.d.ts.map +1 -1
- package/dist/src/runtime/emission-context.js +5 -1
- package/dist/src/runtime/emission-context.js.map +1 -1
- package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
- package/dist/src/runtime/emit/add-constraint.js +22 -4
- package/dist/src/runtime/emit/add-constraint.js.map +1 -1
- package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
- package/dist/src/runtime/emit/aggregate.js +3 -2
- package/dist/src/runtime/emit/aggregate.js.map +1 -1
- package/dist/src/runtime/emit/array-index.js.map +1 -1
- package/dist/src/runtime/emit/binary.d.ts.map +1 -1
- package/dist/src/runtime/emit/binary.js +9 -2
- package/dist/src/runtime/emit/binary.js.map +1 -1
- package/dist/src/runtime/emit/cache.d.ts.map +1 -1
- package/dist/src/runtime/emit/cache.js +1 -1
- package/dist/src/runtime/emit/cache.js.map +1 -1
- package/dist/src/runtime/emit/cast.d.ts.map +1 -1
- package/dist/src/runtime/emit/cast.js.map +1 -1
- package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
- package/dist/src/runtime/emit/constraint-check.js +110 -23
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/create-assertion.d.ts +5 -0
- package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -0
- package/dist/src/runtime/emit/create-assertion.js +70 -0
- package/dist/src/runtime/emit/create-assertion.js.map +1 -0
- package/dist/src/runtime/emit/cte-reference.d.ts.map +1 -1
- package/dist/src/runtime/emit/cte-reference.js.map +1 -1
- package/dist/src/runtime/emit/cte.d.ts.map +1 -1
- package/dist/src/runtime/emit/cte.js.map +1 -1
- package/dist/src/runtime/emit/distinct.d.ts.map +1 -1
- package/dist/src/runtime/emit/distinct.js.map +1 -1
- package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
- package/dist/src/runtime/emit/dml-executor.js +17 -9
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/drop-assertion.d.ts +5 -0
- package/dist/src/runtime/emit/drop-assertion.d.ts.map +1 -0
- package/dist/src/runtime/emit/drop-assertion.js +30 -0
- package/dist/src/runtime/emit/drop-assertion.js.map +1 -0
- package/dist/src/runtime/emit/filter.d.ts.map +1 -1
- package/dist/src/runtime/emit/filter.js.map +1 -1
- package/dist/src/runtime/emit/join.d.ts.map +1 -1
- package/dist/src/runtime/emit/join.js.map +1 -1
- package/dist/src/runtime/emit/limit-offset.d.ts.map +1 -1
- package/dist/src/runtime/emit/limit-offset.js.map +1 -1
- package/dist/src/runtime/emit/pragma.js.map +1 -1
- package/dist/src/runtime/emit/project.d.ts.map +1 -1
- package/dist/src/runtime/emit/project.js.map +1 -1
- package/dist/src/runtime/emit/recursive-cte.d.ts.map +1 -1
- package/dist/src/runtime/emit/recursive-cte.js +1 -1
- package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
- package/dist/src/runtime/emit/remote-query.d.ts +9 -0
- package/dist/src/runtime/emit/remote-query.d.ts.map +1 -0
- package/dist/src/runtime/emit/remote-query.js +30 -0
- package/dist/src/runtime/emit/remote-query.js.map +1 -0
- package/dist/src/runtime/emit/retrieve.d.ts +5 -0
- package/dist/src/runtime/emit/retrieve.d.ts.map +1 -0
- package/dist/src/runtime/emit/retrieve.js +9 -0
- package/dist/src/runtime/emit/retrieve.js.map +1 -0
- package/dist/src/runtime/emit/returning.d.ts.map +1 -1
- package/dist/src/runtime/emit/returning.js +1 -1
- package/dist/src/runtime/emit/returning.js.map +1 -1
- package/dist/src/runtime/emit/scalar-function.d.ts.map +1 -1
- package/dist/src/runtime/emit/scalar-function.js.map +1 -1
- package/dist/src/runtime/emit/scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/scan.js +20 -5
- package/dist/src/runtime/emit/scan.js.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.d.ts +8 -0
- package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -0
- package/dist/src/runtime/emit/schema-declarative.js +163 -0
- package/dist/src/runtime/emit/schema-declarative.js.map +1 -0
- package/dist/src/runtime/emit/sequencing.d.ts.map +1 -1
- package/dist/src/runtime/emit/sequencing.js.map +1 -1
- package/dist/src/runtime/emit/set-operation.d.ts.map +1 -1
- package/dist/src/runtime/emit/set-operation.js +6 -6
- package/dist/src/runtime/emit/set-operation.js.map +1 -1
- package/dist/src/runtime/emit/sort.d.ts.map +1 -1
- package/dist/src/runtime/emit/sort.js.map +1 -1
- package/dist/src/runtime/emit/subquery.d.ts +1 -1
- package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
- package/dist/src/runtime/emit/subquery.js +6 -6
- package/dist/src/runtime/emit/subquery.js.map +1 -1
- package/dist/src/runtime/emit/transaction.d.ts.map +1 -1
- package/dist/src/runtime/emit/transaction.js +48 -8
- package/dist/src/runtime/emit/transaction.js.map +1 -1
- package/dist/src/runtime/emit/values.d.ts.map +1 -1
- package/dist/src/runtime/emit/values.js.map +1 -1
- package/dist/src/runtime/emit/window.d.ts.map +1 -1
- package/dist/src/runtime/emit/window.js.map +1 -1
- package/dist/src/runtime/emitters.d.ts.map +1 -1
- package/dist/src/runtime/emitters.js +1 -0
- package/dist/src/runtime/emitters.js.map +1 -1
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +16 -2
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/runtime/scheduler.js.map +1 -1
- package/dist/src/runtime/types.d.ts +2 -2
- package/dist/src/runtime/types.d.ts.map +1 -1
- package/dist/src/runtime/types.js +4 -1
- package/dist/src/runtime/types.js.map +1 -1
- package/dist/src/runtime/utils.d.ts +2 -2
- package/dist/src/runtime/utils.d.ts.map +1 -1
- package/dist/src/runtime/utils.js +1 -0
- package/dist/src/runtime/utils.js.map +1 -1
- package/dist/src/schema/assertion.d.ts +19 -0
- package/dist/src/schema/assertion.d.ts.map +1 -0
- package/dist/src/schema/assertion.js +2 -0
- package/dist/src/schema/assertion.js.map +1 -0
- package/dist/src/schema/catalog.d.ts +44 -0
- package/dist/src/schema/catalog.d.ts.map +1 -0
- package/dist/src/schema/catalog.js +148 -0
- package/dist/src/schema/catalog.js.map +1 -0
- package/dist/src/schema/change-events.d.ts +2 -2
- package/dist/src/schema/change-events.d.ts.map +1 -1
- package/dist/src/schema/column.d.ts +2 -0
- package/dist/src/schema/column.d.ts.map +1 -1
- package/dist/src/schema/column.js.map +1 -1
- package/dist/src/schema/declared-schema-manager.d.ts +42 -0
- package/dist/src/schema/declared-schema-manager.d.ts.map +1 -0
- package/dist/src/schema/declared-schema-manager.js +71 -0
- package/dist/src/schema/declared-schema-manager.js.map +1 -0
- package/dist/src/schema/function.d.ts +3 -2
- package/dist/src/schema/function.d.ts.map +1 -1
- package/dist/src/schema/function.js.map +1 -1
- package/dist/src/schema/manager.d.ts +8 -3
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +32 -3
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/schema-differ.d.ts +34 -0
- package/dist/src/schema/schema-differ.d.ts.map +1 -0
- package/dist/src/schema/schema-differ.js +157 -0
- package/dist/src/schema/schema-differ.js.map +1 -0
- package/dist/src/schema/schema-hasher.d.ts +10 -0
- package/dist/src/schema/schema-hasher.d.ts.map +1 -0
- package/dist/src/schema/schema-hasher.js +39 -0
- package/dist/src/schema/schema-hasher.js.map +1 -0
- package/dist/src/schema/schema.d.ts +7 -0
- package/dist/src/schema/schema.d.ts.map +1 -1
- package/dist/src/schema/schema.js +19 -0
- package/dist/src/schema/schema.js.map +1 -1
- package/dist/src/schema/table.d.ts +28 -3
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +17 -2
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/schema/window-function.d.ts.map +1 -1
- package/dist/src/schema/window-function.js.map +1 -1
- package/dist/src/util/ast-stringify.d.ts.map +1 -1
- package/dist/src/util/ast-stringify.js +116 -3
- package/dist/src/util/ast-stringify.js.map +1 -1
- package/dist/src/util/environment.js.map +1 -1
- package/dist/src/util/plugin-loader.d.ts +25 -0
- package/dist/src/util/plugin-loader.d.ts.map +1 -1
- package/dist/src/util/plugin-loader.js +137 -0
- package/dist/src/util/plugin-loader.js.map +1 -1
- package/dist/src/util/row-descriptor.d.ts +1 -1
- package/dist/src/util/row-descriptor.d.ts.map +1 -1
- package/dist/src/util/row-descriptor.js.map +1 -1
- package/dist/src/util/serialization.d.ts +3 -0
- package/dist/src/util/serialization.d.ts.map +1 -1
- package/dist/src/util/serialization.js +1 -0
- package/dist/src/util/serialization.js.map +1 -1
- package/dist/src/vtab/best-access-plan.d.ts +1 -1
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js +1 -0
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/manifest.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base.js +2 -0
- package/dist/src/vtab/memory/layer/base.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +2 -1
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +24 -6
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/layer/safe-iterate.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/safe-iterate.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +5 -0
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/memory/table.d.ts +2 -1
- package/dist/src/vtab/memory/table.d.ts.map +1 -1
- package/dist/src/vtab/memory/table.js +3 -2
- package/dist/src/vtab/memory/table.js.map +1 -1
- package/dist/src/vtab/memory/utils/logging.d.ts +2 -2
- package/dist/src/vtab/memory/utils/logging.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/logging.js +6 -3
- package/dist/src/vtab/memory/utils/logging.js.map +1 -1
- package/dist/src/vtab/module.d.ts +25 -0
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/dist/src/vtab/table.d.ts +17 -4
- package/dist/src/vtab/table.d.ts.map +1 -1
- package/dist/src/vtab/table.js.map +1 -1
- package/package.json +4 -2
- package/src/common/errors.ts +1 -1
- package/src/common/json-types.ts +16 -0
- package/src/common/types.ts +2 -0
- package/src/core/database-options.ts +8 -8
- package/src/core/database.ts +537 -71
- package/src/core/statement.ts +3 -1
- package/src/func/builtins/builtin-window-functions.ts +11 -10
- package/src/func/builtins/datetime.ts +42 -0
- package/src/func/builtins/explain.ts +186 -44
- package/src/func/builtins/index.ts +5 -2
- package/src/func/builtins/json-helpers.ts +21 -21
- package/src/func/builtins/json-tvf.ts +8 -9
- package/src/func/builtins/json.ts +10 -9
- package/src/func/builtins/schema.ts +24 -4
- package/src/func/context.ts +7 -0
- package/src/func/registration.ts +5 -1
- package/src/index.ts +2 -2
- package/src/parser/ast.ts +582 -481
- package/src/parser/lexer.ts +27 -21
- package/src/parser/parser.ts +3336 -2776
- package/src/parser/visitor.ts +1 -0
- package/src/planner/analysis/binding-collector.ts +83 -0
- package/src/planner/analysis/const-evaluator.ts +1 -1
- package/src/planner/analysis/const-pass.ts +3 -2
- package/src/planner/analysis/constraint-extractor.ts +610 -123
- package/src/planner/analysis/predicate-normalizer.ts +237 -0
- package/src/planner/building/alter-table.ts +3 -1
- package/src/planner/building/block.ts +93 -78
- package/src/planner/building/constraint-builder.ts +173 -114
- package/src/planner/building/create-assertion.ts +7 -0
- package/src/planner/building/declare-schema.ts +22 -0
- package/src/planner/building/delete.ts +214 -171
- package/src/planner/building/drop-assertion.ts +11 -0
- package/src/planner/building/expression.ts +1 -0
- package/src/planner/building/function-call.ts +6 -5
- package/src/planner/building/insert.ts +428 -349
- package/src/planner/building/pragma.ts +1 -0
- package/src/planner/building/schema-resolution.ts +176 -176
- package/src/planner/building/select-aggregates.ts +5 -3
- package/src/planner/building/select-compound.ts +22 -13
- package/src/planner/building/select-context.ts +6 -6
- package/src/planner/building/select-modifiers.ts +8 -7
- package/src/planner/building/select-projections.ts +177 -176
- package/src/planner/building/select-window.ts +259 -253
- package/src/planner/building/select.ts +531 -520
- package/src/planner/building/table-function.ts +49 -48
- package/src/planner/building/table.ts +9 -3
- package/src/planner/building/update.ts +319 -270
- package/src/planner/building/with.ts +7 -7
- package/src/planner/debug.ts +1 -0
- package/src/planner/framework/characteristics.ts +503 -0
- package/src/planner/framework/context.ts +23 -6
- package/src/planner/framework/pass.ts +354 -0
- package/src/planner/nodes/aggregate-node.ts +52 -7
- package/src/planner/nodes/array-index-node.ts +1 -1
- package/src/planner/nodes/cache-node.ts +11 -2
- package/src/planner/nodes/constraint-check-node.ts +14 -5
- package/src/planner/nodes/create-assertion-node.ts +51 -0
- package/src/planner/nodes/create-index-node.ts +2 -2
- package/src/planner/nodes/create-table-node.ts +2 -2
- package/src/planner/nodes/cte-node.ts +30 -4
- package/src/planner/nodes/cte-reference-node.ts +2 -2
- package/src/planner/nodes/declarative-schema.ts +221 -0
- package/src/planner/nodes/delete-node.ts +102 -96
- package/src/planner/nodes/distinct-node.ts +20 -6
- package/src/planner/nodes/dml-executor-node.ts +1 -1
- package/src/planner/nodes/drop-assertion-node.ts +50 -0
- package/src/planner/nodes/drop-table-node.ts +1 -0
- package/src/planner/nodes/filter.ts +56 -3
- package/src/planner/nodes/insert-node.ts +126 -120
- package/src/planner/nodes/internal-recursive-cte-ref-node.ts +5 -20
- package/src/planner/nodes/join-node.ts +122 -4
- package/src/planner/nodes/limit-offset.ts +132 -113
- package/src/planner/nodes/plan-node-type.ts +95 -87
- package/src/planner/nodes/plan-node.ts +8 -8
- package/src/planner/nodes/pragma.ts +6 -3
- package/src/planner/nodes/project-node.ts +101 -7
- package/src/planner/nodes/recursive-cte-node.ts +6 -6
- package/src/planner/nodes/reference.ts +334 -312
- package/src/planner/nodes/remote-query-node.ts +73 -0
- package/src/planner/nodes/retrieve-node.ts +86 -0
- package/src/planner/nodes/returning-node.ts +52 -10
- package/src/planner/nodes/sequencing-node.ts +2 -2
- package/src/planner/nodes/set-operation-node.ts +3 -3
- package/src/planner/nodes/sort.ts +33 -4
- package/src/planner/nodes/stream-aggregate.ts +5 -1
- package/src/planner/nodes/table-access-nodes.ts +31 -6
- package/src/planner/nodes/table-function-call.ts +134 -127
- package/src/planner/nodes/transaction-node.ts +2 -2
- package/src/planner/nodes/update-node.ts +138 -132
- package/src/planner/nodes/view-reference-node.ts +1 -1
- package/src/planner/nodes/window-function.ts +2 -2
- package/src/planner/nodes/window-node.ts +1 -1
- package/src/planner/optimizer-tuning.ts +18 -0
- package/src/planner/optimizer.ts +171 -96
- package/src/planner/planning-context.ts +10 -3
- package/src/planner/resolve.ts +10 -9
- package/src/planner/rules/README.md +96 -96
- package/src/planner/rules/access/rule-select-access-path.ts +384 -184
- package/src/planner/rules/aggregate/rule-aggregate-streaming.ts +118 -104
- package/src/planner/rules/cache/rule-cte-optimization.ts +29 -16
- package/src/planner/rules/cache/rule-materialization-advisory.ts +14 -7
- package/src/planner/rules/cache/rule-mutating-subquery-cache.ts +38 -44
- package/src/planner/rules/join/rule-join-greedy-commute.ts +48 -0
- package/src/planner/rules/join/rule-join-key-inference.ts +35 -0
- package/src/planner/rules/join/rule-quickpick-enumeration.ts +267 -0
- package/src/planner/rules/predicate/rule-predicate-pushdown.ts +144 -0
- package/src/planner/rules/retrieve/rule-grow-retrieve.ts +337 -0
- package/src/planner/scopes/registered.ts +8 -0
- package/src/planner/stats/index.ts +0 -65
- package/src/planner/util/key-utils.ts +46 -0
- package/src/planner/validation/plan-validator.ts +5 -3
- package/src/runtime/deferred-constraint-queue.ts +196 -0
- package/src/runtime/emission-context.ts +11 -5
- package/src/runtime/emit/add-constraint.ts +26 -5
- package/src/runtime/emit/aggregate.ts +9 -7
- package/src/runtime/emit/array-index.ts +2 -2
- package/src/runtime/emit/binary.ts +26 -8
- package/src/runtime/emit/cache.ts +2 -2
- package/src/runtime/emit/cast.ts +2 -2
- package/src/runtime/emit/constraint-check.ts +148 -26
- package/src/runtime/emit/create-assertion.ts +82 -0
- package/src/runtime/emit/cte-reference.ts +2 -2
- package/src/runtime/emit/cte.ts +2 -2
- package/src/runtime/emit/distinct.ts +2 -2
- package/src/runtime/emit/dml-executor.ts +20 -12
- package/src/runtime/emit/drop-assertion.ts +45 -0
- package/src/runtime/emit/filter.ts +4 -4
- package/src/runtime/emit/join.ts +8 -7
- package/src/runtime/emit/limit-offset.ts +2 -2
- package/src/runtime/emit/pragma.ts +2 -2
- package/src/runtime/emit/project.ts +2 -2
- package/src/runtime/emit/recursive-cte.ts +2 -2
- package/src/runtime/emit/remote-query.ts +47 -0
- package/src/runtime/emit/retrieve.ts +15 -0
- package/src/runtime/emit/returning.ts +4 -4
- package/src/runtime/emit/scalar-function.ts +2 -2
- package/src/runtime/emit/scan.ts +29 -13
- package/src/runtime/emit/schema-declarative.ts +205 -0
- package/src/runtime/emit/sequencing.ts +3 -3
- package/src/runtime/emit/set-operation.ts +7 -7
- package/src/runtime/emit/sort.ts +2 -2
- package/src/runtime/emit/subquery.ts +10 -10
- package/src/runtime/emit/transaction.ts +46 -8
- package/src/runtime/emit/values.ts +2 -2
- package/src/runtime/emit/window.ts +3 -3
- package/src/runtime/emitters.ts +1 -0
- package/src/runtime/register.ts +150 -135
- package/src/runtime/scheduler.ts +2 -2
- package/src/runtime/types.ts +10 -7
- package/src/runtime/utils.ts +3 -2
- package/src/schema/assertion.ts +21 -0
- package/src/schema/catalog.ts +208 -0
- package/src/schema/change-events.ts +2 -2
- package/src/schema/column.ts +2 -0
- package/src/schema/declared-schema-manager.ts +82 -0
- package/src/schema/function.ts +5 -2
- package/src/schema/manager.ts +742 -709
- package/src/schema/schema-differ.ts +214 -0
- package/src/schema/schema-hasher.ts +44 -0
- package/src/schema/schema.ts +23 -0
- package/src/schema/table.ts +398 -364
- package/src/schema/window-function.ts +2 -0
- package/src/util/ast-stringify.ts +869 -764
- package/src/util/environment.ts +2 -2
- package/src/util/plugin-loader.ts +184 -0
- package/src/util/row-descriptor.ts +1 -1
- package/src/util/serialization.ts +2 -0
- package/src/vtab/best-access-plan.ts +2 -1
- package/src/vtab/manifest.ts +1 -0
- package/src/vtab/memory/index.ts +178 -178
- package/src/vtab/memory/layer/base.ts +275 -273
- package/src/vtab/memory/layer/interface.ts +47 -47
- package/src/vtab/memory/layer/manager.ts +33 -11
- package/src/vtab/memory/layer/safe-iterate.ts +3 -3
- package/src/vtab/memory/layer/transaction.ts +229 -229
- package/src/vtab/memory/module.ts +24 -18
- package/src/vtab/memory/table.ts +256 -253
- package/src/vtab/memory/utils/logging.ts +6 -3
- package/src/vtab/module.ts +170 -140
- package/src/vtab/table.ts +162 -143
|
@@ -1,13 +1,25 @@
|
|
|
1
1
|
import type { ConstraintCheckNode } from '../../planner/nodes/constraint-check-node.js';
|
|
2
|
-
import type { Instruction, RuntimeContext } from '../types.js';
|
|
2
|
+
import type { Instruction, InstructionRun, RuntimeContext } from '../types.js';
|
|
3
3
|
import type { Row } from '../../common/types.js';
|
|
4
4
|
import type { EmissionContext } from '../emission-context.js';
|
|
5
5
|
import { emitPlanNode, emitCallFromPlan } from '../emitters.js';
|
|
6
6
|
import { QuereusError } from '../../common/errors.js';
|
|
7
7
|
import { StatusCode, type SqlValue, type OutputValue } from '../../common/types.js';
|
|
8
8
|
import type { RowConstraintSchema, TableSchema } from '../../schema/table.js';
|
|
9
|
+
import type { RowDescriptor } from '../../planner/nodes/plan-node.js';
|
|
9
10
|
import { RowOpFlag } from '../../schema/table.js';
|
|
10
|
-
import { withAsyncRowContext } from '../context-helpers.js';
|
|
11
|
+
import { withAsyncRowContext, createRowSlot } from '../context-helpers.js';
|
|
12
|
+
|
|
13
|
+
interface ConstraintMetadataEntry {
|
|
14
|
+
schema: RowConstraintSchema;
|
|
15
|
+
flatRowDescriptor: RowDescriptor;
|
|
16
|
+
evaluator: (ctx: RuntimeContext) => OutputValue;
|
|
17
|
+
constraintName: string;
|
|
18
|
+
shouldDefer: boolean;
|
|
19
|
+
baseTable: string;
|
|
20
|
+
contextRow?: Row; // Mutation context row if present
|
|
21
|
+
contextDescriptor?: RowDescriptor; // Mutation context row descriptor
|
|
22
|
+
}
|
|
11
23
|
|
|
12
24
|
export function emitConstraintCheck(plan: ConstraintCheckNode, ctx: EmissionContext): Instruction {
|
|
13
25
|
// Get the table schema to access constraints
|
|
@@ -16,32 +28,102 @@ export function emitConstraintCheck(plan: ConstraintCheckNode, ctx: EmissionCont
|
|
|
16
28
|
// Use the pre-built flat row descriptor from the plan
|
|
17
29
|
const flatRowDescriptor = plan.flatRowDescriptor;
|
|
18
30
|
|
|
31
|
+
// Get mutation context from the plan (passed from DML builders)
|
|
32
|
+
const mutationContextValues = plan.mutationContextValues;
|
|
33
|
+
const contextAttributes = plan.contextAttributes;
|
|
34
|
+
const contextDescriptor = plan.contextDescriptor;
|
|
35
|
+
|
|
36
|
+
// Emit mutation context value evaluators if present
|
|
37
|
+
const contextEvaluatorInstructions: Instruction[] = [];
|
|
38
|
+
if (mutationContextValues && contextAttributes) {
|
|
39
|
+
for (const attr of contextAttributes) {
|
|
40
|
+
const valueExpr = mutationContextValues.get(attr.name);
|
|
41
|
+
if (valueExpr) {
|
|
42
|
+
contextEvaluatorInstructions.push(emitCallFromPlan(valueExpr, ctx));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
19
47
|
// Emit evaluator instructions for each pre-built constraint expression
|
|
20
48
|
const checkEvaluators = plan.constraintChecks.map(check =>
|
|
21
49
|
emitCallFromPlan(check.expression, ctx)
|
|
22
50
|
);
|
|
23
51
|
|
|
24
|
-
|
|
25
|
-
|
|
52
|
+
const constraintMetadata: ConstraintMetadataEntry[] = plan.constraintChecks.map((check, idx) => {
|
|
53
|
+
const evaluatorInstruction = checkEvaluators[idx];
|
|
54
|
+
const constraintName = check.constraint.name ?? generateDefaultConstraintName(tableSchema, check.constraint);
|
|
55
|
+
return {
|
|
56
|
+
schema: check.constraint,
|
|
57
|
+
flatRowDescriptor: plan.flatRowDescriptor,
|
|
58
|
+
evaluator: evaluatorInstruction.run,
|
|
59
|
+
constraintName,
|
|
60
|
+
shouldDefer: Boolean(check.deferrable || check.initiallyDeferred || check.containsSubquery),
|
|
61
|
+
baseTable: `${tableSchema.schemaName}.${tableSchema.name}`,
|
|
62
|
+
contextRow: undefined,
|
|
63
|
+
contextDescriptor
|
|
64
|
+
};
|
|
65
|
+
});
|
|
26
66
|
|
|
27
67
|
async function* run(rctx: RuntimeContext, inputRows: AsyncIterable<Row>, ...evaluatorFunctions: Array<(ctx: RuntimeContext) => OutputValue>): AsyncIterable<Row> {
|
|
28
68
|
if (!inputRows) {
|
|
29
69
|
return;
|
|
30
70
|
}
|
|
31
71
|
|
|
32
|
-
|
|
33
|
-
|
|
72
|
+
// Evaluate mutation context values once per statement (not per row)
|
|
73
|
+
let contextRow: Row | undefined;
|
|
74
|
+
let contextSlot: ReturnType<typeof createRowSlot> | undefined;
|
|
75
|
+
|
|
76
|
+
if (contextEvaluatorInstructions.length > 0 && contextDescriptor) {
|
|
77
|
+
// Split evaluatorFunctions into context evaluators and constraint evaluators
|
|
78
|
+
const contextEvalFunctions = evaluatorFunctions.slice(0, contextEvaluatorInstructions.length);
|
|
79
|
+
const constraintEvalFunctions = evaluatorFunctions.slice(contextEvaluatorInstructions.length);
|
|
34
80
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
81
|
+
// Evaluate all context values
|
|
82
|
+
contextRow = [];
|
|
83
|
+
for (const contextEvaluator of contextEvalFunctions) {
|
|
84
|
+
const value = await contextEvaluator(rctx) as SqlValue;
|
|
85
|
+
contextRow.push(value);
|
|
86
|
+
}
|
|
38
87
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
88
|
+
// Store context row in metadata for deferred constraints
|
|
89
|
+
constraintMetadata.forEach(meta => {
|
|
90
|
+
meta.contextRow = contextRow;
|
|
42
91
|
});
|
|
43
92
|
|
|
44
|
-
|
|
93
|
+
// Create a row slot for the mutation context that persists for the whole statement
|
|
94
|
+
contextSlot = createRowSlot(rctx, contextDescriptor);
|
|
95
|
+
contextSlot.set(contextRow);
|
|
96
|
+
|
|
97
|
+
// Use constraint evaluators for the rest of the function
|
|
98
|
+
evaluatorFunctions = constraintEvalFunctions;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
try {
|
|
102
|
+
for await (const inputRow of inputRows) {
|
|
103
|
+
const flatRow = inputRow;
|
|
104
|
+
|
|
105
|
+
// If we have mutation context, compose it with the flat row for constraint evaluation
|
|
106
|
+
const combinedRow = contextRow ? [...contextRow, ...flatRow] : flatRow;
|
|
107
|
+
const combinedDescriptor = contextDescriptor && contextRow
|
|
108
|
+
? composeCombinedDescriptor(contextDescriptor, flatRowDescriptor)
|
|
109
|
+
: flatRowDescriptor;
|
|
110
|
+
|
|
111
|
+
const result = await withAsyncRowContext(rctx, combinedDescriptor, () => combinedRow, async () => {
|
|
112
|
+
// Check all constraints that apply to this operation
|
|
113
|
+
await checkConstraints(rctx, plan, tableSchema, flatRow, constraintMetadata, evaluatorFunctions);
|
|
114
|
+
|
|
115
|
+
// If all constraints pass, yield the flat row for downstream processing
|
|
116
|
+
// All downstream operations (INSERT executor, DELETE executor, RETURNING) expect flat rows
|
|
117
|
+
return flatRow;
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
yield result;
|
|
121
|
+
}
|
|
122
|
+
} finally {
|
|
123
|
+
// Clean up context slot if we created one
|
|
124
|
+
if (contextSlot) {
|
|
125
|
+
contextSlot.close();
|
|
126
|
+
}
|
|
45
127
|
}
|
|
46
128
|
}
|
|
47
129
|
|
|
@@ -49,18 +131,45 @@ export function emitConstraintCheck(plan: ConstraintCheckNode, ctx: EmissionCont
|
|
|
49
131
|
const sourceInstruction = emitPlanNode(plan.source, ctx);
|
|
50
132
|
|
|
51
133
|
return {
|
|
52
|
-
params: [sourceInstruction, ...checkEvaluators],
|
|
53
|
-
run: run as
|
|
54
|
-
note: `constraintCheck(${plan.operation}, ${plan.constraintChecks.length} checks)`
|
|
134
|
+
params: [sourceInstruction, ...contextEvaluatorInstructions, ...checkEvaluators],
|
|
135
|
+
run: run as InstructionRun,
|
|
136
|
+
note: `constraintCheck(${plan.operation}, ${contextEvaluatorInstructions.length} ctx, ${plan.constraintChecks.length} checks)`
|
|
55
137
|
};
|
|
56
138
|
}
|
|
57
139
|
|
|
140
|
+
/**
|
|
141
|
+
* Composes a combined row descriptor that includes both context and flat (OLD/NEW) descriptors.
|
|
142
|
+
* Context attributes come first, followed by OLD/NEW attributes with offset indices.
|
|
143
|
+
*/
|
|
144
|
+
function composeCombinedDescriptor(contextDescriptor: RowDescriptor, flatRowDescriptor: RowDescriptor): RowDescriptor {
|
|
145
|
+
const combined: RowDescriptor = [];
|
|
146
|
+
const contextLength = Object.keys(contextDescriptor).filter(k => contextDescriptor[parseInt(k)] !== undefined).length;
|
|
147
|
+
|
|
148
|
+
// Copy context descriptor as-is (indices 0..contextLength-1)
|
|
149
|
+
for (const attrIdStr in contextDescriptor) {
|
|
150
|
+
const attrId = parseInt(attrIdStr);
|
|
151
|
+
if (contextDescriptor[attrId] !== undefined) {
|
|
152
|
+
combined[attrId] = contextDescriptor[attrId];
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Copy flat descriptor with offset indices (indices contextLength..end)
|
|
157
|
+
for (const attrIdStr in flatRowDescriptor) {
|
|
158
|
+
const attrId = parseInt(attrIdStr);
|
|
159
|
+
if (flatRowDescriptor[attrId] !== undefined) {
|
|
160
|
+
combined[attrId] = flatRowDescriptor[attrId] + contextLength;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return combined;
|
|
165
|
+
}
|
|
166
|
+
|
|
58
167
|
async function checkConstraints(
|
|
59
168
|
rctx: RuntimeContext,
|
|
60
169
|
plan: ConstraintCheckNode,
|
|
61
170
|
tableSchema: TableSchema,
|
|
62
171
|
row: Row,
|
|
63
|
-
constraintMetadata:
|
|
172
|
+
constraintMetadata: ConstraintMetadataEntry[],
|
|
64
173
|
evaluatorFunctions: Array<(ctx: RuntimeContext) => OutputValue>
|
|
65
174
|
): Promise<void> {
|
|
66
175
|
// Check PRIMARY KEY constraints (UNIQUE constraints on PK columns)
|
|
@@ -70,7 +179,7 @@ async function checkConstraints(
|
|
|
70
179
|
await checkNotNullConstraints(rctx, plan, tableSchema, row);
|
|
71
180
|
|
|
72
181
|
// Check CHECK constraints (both column-level and table-level)
|
|
73
|
-
await checkCheckConstraints(rctx, plan, tableSchema, constraintMetadata, evaluatorFunctions);
|
|
182
|
+
await checkCheckConstraints(rctx, plan, tableSchema, row, constraintMetadata, evaluatorFunctions);
|
|
74
183
|
}
|
|
75
184
|
|
|
76
185
|
async function checkNotNullConstraints(
|
|
@@ -122,25 +231,38 @@ async function checkCheckConstraints(
|
|
|
122
231
|
rctx: RuntimeContext,
|
|
123
232
|
plan: ConstraintCheckNode,
|
|
124
233
|
tableSchema: TableSchema,
|
|
125
|
-
|
|
234
|
+
row: Row,
|
|
235
|
+
constraintMetadata: ConstraintMetadataEntry[],
|
|
126
236
|
evaluatorFunctions: Array<(ctx: RuntimeContext) => OutputValue>
|
|
127
237
|
): Promise<void> {
|
|
128
238
|
// Evaluate each CHECK constraint using pre-built evaluators
|
|
129
239
|
for (let i = 0; i < constraintMetadata.length; i++) {
|
|
130
|
-
const
|
|
131
|
-
const evaluator = evaluatorFunctions[i];
|
|
240
|
+
const metadata = constraintMetadata[i];
|
|
241
|
+
const evaluator = evaluatorFunctions[i] ?? metadata.evaluator;
|
|
242
|
+
|
|
243
|
+
if (metadata.shouldDefer) {
|
|
244
|
+
const activeConnectionId = rctx.activeConnection?.connectionId;
|
|
245
|
+
rctx.db._queueDeferredConstraintRow(
|
|
246
|
+
metadata.baseTable,
|
|
247
|
+
metadata.constraintName,
|
|
248
|
+
row.slice() as Row,
|
|
249
|
+
metadata.flatRowDescriptor,
|
|
250
|
+
evaluator,
|
|
251
|
+
activeConnectionId,
|
|
252
|
+
metadata.contextRow,
|
|
253
|
+
metadata.contextDescriptor
|
|
254
|
+
);
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
132
257
|
|
|
133
258
|
try {
|
|
134
|
-
|
|
135
|
-
const result = evaluator(rctx) as SqlValue;
|
|
259
|
+
const result = await evaluator(rctx) as SqlValue;
|
|
136
260
|
|
|
137
261
|
// CHECK constraint passes if result is truthy or NULL
|
|
138
262
|
// It fails only if result is false or 0 (SQLite-style numeric boolean)
|
|
139
263
|
if (result === false || result === 0) {
|
|
140
|
-
// Generate a proper constraint name if none was provided
|
|
141
|
-
const constraintName = constraint.name || generateDefaultConstraintName(tableSchema, constraint);
|
|
142
264
|
throw new QuereusError(
|
|
143
|
-
`CHECK constraint failed: ${constraintName}`,
|
|
265
|
+
`CHECK constraint failed: ${metadata.constraintName}`,
|
|
144
266
|
StatusCode.CONSTRAINT
|
|
145
267
|
);
|
|
146
268
|
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { CreateAssertionNode } from '../../planner/nodes/create-assertion-node.js';
|
|
2
|
+
import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
|
|
3
|
+
import type { EmissionContext } from '../emission-context.js';
|
|
4
|
+
import { QuereusError } from '../../common/errors.js';
|
|
5
|
+
import { SqlValue, StatusCode } from '../../common/types.js';
|
|
6
|
+
import { createLogger } from '../../common/logger.js';
|
|
7
|
+
import type { IntegrityAssertionSchema, AssertionDependentTable } from '../../schema/assertion.js';
|
|
8
|
+
import { expressionToString } from '../../util/ast-stringify.js';
|
|
9
|
+
|
|
10
|
+
const log = createLogger('runtime:emit:create-assertion');
|
|
11
|
+
|
|
12
|
+
export function emitCreateAssertion(plan: CreateAssertionNode, _ctx: EmissionContext): Instruction {
|
|
13
|
+
|
|
14
|
+
async function run(rctx: RuntimeContext): Promise<SqlValue> {
|
|
15
|
+
// Convert the CHECK expression to SQL text for storage
|
|
16
|
+
// The CHECK expression should be negated to become a violation query:
|
|
17
|
+
// CHECK (condition) becomes "SELECT 1 WHERE NOT (condition)"
|
|
18
|
+
let violationSql: string;
|
|
19
|
+
try {
|
|
20
|
+
const exprSql = expressionToString(plan.checkExpression);
|
|
21
|
+
violationSql = `SELECT 1 WHERE NOT (${exprSql})`;
|
|
22
|
+
} catch (e) {
|
|
23
|
+
log('Failed to stringify assertion expression: %O', e);
|
|
24
|
+
// Fallback for complex expressions
|
|
25
|
+
violationSql = 'SELECT 1 WHERE FALSE'; // Never violates
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Create the assertion schema object
|
|
29
|
+
const assertionSchema: IntegrityAssertionSchema = {
|
|
30
|
+
name: plan.name,
|
|
31
|
+
violationSql,
|
|
32
|
+
deferrable: true, // Auto-deferred for multi-table constraints
|
|
33
|
+
initiallyDeferred: true,
|
|
34
|
+
dependentTables: []
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
// Discover dependent base tables (best-effort; conservative if any failure)
|
|
38
|
+
try {
|
|
39
|
+
const planNode = rctx.db.getPlan(violationSql);
|
|
40
|
+
const deps = new Map<string, AssertionDependentTable>();
|
|
41
|
+
(function collect(node: unknown) {
|
|
42
|
+
const anyNode = node as any;
|
|
43
|
+
if (anyNode && typeof anyNode.getRelations === 'function') {
|
|
44
|
+
for (const child of anyNode.getRelations()) collect(child);
|
|
45
|
+
}
|
|
46
|
+
if (anyNode?.tableSchema?.name && anyNode?.id !== undefined) {
|
|
47
|
+
const base = `${anyNode.tableSchema.schemaName}.${anyNode.tableSchema.name}`.toLowerCase();
|
|
48
|
+
const relationKey = `${base}#${anyNode.id}`;
|
|
49
|
+
if (!deps.has(relationKey)) deps.set(relationKey, { relationKey, base });
|
|
50
|
+
}
|
|
51
|
+
})(planNode);
|
|
52
|
+
assertionSchema.dependentTables = Array.from(deps.values());
|
|
53
|
+
log('Assertion %s dependencies discovered: %o', plan.name, assertionSchema.dependentTables);
|
|
54
|
+
} catch (depErr) {
|
|
55
|
+
log('Dependency discovery failed for assertion %s: %O', plan.name, depErr);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Add to schema
|
|
59
|
+
const schemaManager = rctx.db.schemaManager;
|
|
60
|
+
const schema = schemaManager.getMainSchema(); // Store in main schema for now
|
|
61
|
+
|
|
62
|
+
// Check for existing assertion
|
|
63
|
+
const existing = schema.getAssertion(plan.name);
|
|
64
|
+
if (existing) {
|
|
65
|
+
throw new QuereusError(
|
|
66
|
+
`Assertion ${plan.name} already exists`,
|
|
67
|
+
StatusCode.CONSTRAINT
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
schema.addAssertion(assertionSchema);
|
|
72
|
+
|
|
73
|
+
log('Created assertion %s with violationSql: %s', plan.name, violationSql);
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
params: [],
|
|
79
|
+
run: run as InstructionRun,
|
|
80
|
+
note: `createAssertion(${plan.name})`
|
|
81
|
+
};
|
|
82
|
+
}
|
|
@@ -2,7 +2,7 @@ import type { Row } from '../../common/types.js';
|
|
|
2
2
|
import type { CTEReferenceNode } from '../../planner/nodes/cte-reference-node.js';
|
|
3
3
|
import type { EmissionContext } from '../emission-context.js';
|
|
4
4
|
import { emitPlanNode, createValidatedInstruction } from '../emitters.js';
|
|
5
|
-
import type { Instruction, RuntimeContext } from '../types.js';
|
|
5
|
+
import type { Instruction, InstructionRun, RuntimeContext } from '../types.js';
|
|
6
6
|
import { buildRowDescriptor } from '../../util/row-descriptor.js';
|
|
7
7
|
import { withRowContextGenerator } from '../context-helpers.js';
|
|
8
8
|
import { createLogger } from '../../common/logger.js';
|
|
@@ -31,7 +31,7 @@ export function emitCTEReference(plan: CTEReferenceNode, ctx: EmissionContext):
|
|
|
31
31
|
|
|
32
32
|
return createValidatedInstruction(
|
|
33
33
|
[cteInstruction],
|
|
34
|
-
run as
|
|
34
|
+
run as InstructionRun,
|
|
35
35
|
ctx,
|
|
36
36
|
`cte_ref(${plan.source.cteName}${plan.alias ? ` AS ${plan.alias}` : ''})`
|
|
37
37
|
);
|
package/src/runtime/emit/cte.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CTENode } from '../../planner/nodes/cte-node.js';
|
|
2
|
-
import type { Instruction, RuntimeContext } from '../types.js';
|
|
2
|
+
import type { Instruction, InstructionRun, RuntimeContext } from '../types.js';
|
|
3
3
|
import type { EmissionContext } from '../emission-context.js';
|
|
4
4
|
import { emitPlanNode } from '../emitters.js';
|
|
5
5
|
import type { Row } from '../../common/types.js';
|
|
@@ -33,7 +33,7 @@ export function emitCTE(plan: CTENode, ctx: EmissionContext): Instruction {
|
|
|
33
33
|
|
|
34
34
|
return {
|
|
35
35
|
params: [queryInstruction],
|
|
36
|
-
run: run as
|
|
36
|
+
run: run as InstructionRun,
|
|
37
37
|
note: `cte(${plan.cteName})`
|
|
38
38
|
};
|
|
39
39
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DistinctNode } from '../../planner/nodes/distinct-node.js';
|
|
2
|
-
import type { Instruction, RuntimeContext } from '../types.js';
|
|
2
|
+
import type { Instruction, InstructionRun, RuntimeContext } from '../types.js';
|
|
3
3
|
import { emitPlanNode } from '../emitters.js';
|
|
4
4
|
import { type Row } from '../../common/types.js';
|
|
5
5
|
import type { EmissionContext } from '../emission-context.js';
|
|
@@ -34,7 +34,7 @@ export function emitDistinct(plan: DistinctNode, ctx: EmissionContext): Instruct
|
|
|
34
34
|
|
|
35
35
|
return {
|
|
36
36
|
params: [sourceInstruction],
|
|
37
|
-
run: run as
|
|
37
|
+
run: run as InstructionRun,
|
|
38
38
|
note: 'distinct (btree-optimized)'
|
|
39
39
|
};
|
|
40
40
|
}
|
|
@@ -2,8 +2,9 @@ import type { DmlExecutorNode } from '../../planner/nodes/dml-executor-node.js';
|
|
|
2
2
|
import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
|
|
3
3
|
import { emitPlanNode } from '../emitters.js';
|
|
4
4
|
import { QuereusError } from '../../common/errors.js';
|
|
5
|
-
import { StatusCode, type Row } from '../../common/types.js';
|
|
5
|
+
import { StatusCode, type Row, type SqlValue } from '../../common/types.js';
|
|
6
6
|
import { getVTable, disconnectVTable } from '../utils.js';
|
|
7
|
+
import { ConflictResolution } from '../../common/constants.js';
|
|
7
8
|
import type { EmissionContext } from '../emission-context.js';
|
|
8
9
|
import { extractOldRowFromFlat, extractNewRowFromFlat } from '../../util/row-descriptor.js';
|
|
9
10
|
|
|
@@ -21,8 +22,10 @@ export function emitDmlExecutor(plan: DmlExecutorNode, ctx: EmissionContext): In
|
|
|
21
22
|
try {
|
|
22
23
|
for await (const flatRow of rows) {
|
|
23
24
|
const newRow = extractNewRowFromFlat(flatRow, tableSchema.columns.length);
|
|
24
|
-
(newRow
|
|
25
|
-
|
|
25
|
+
await vtab.xUpdate!('insert', newRow, undefined, plan.onConflict ?? ConflictResolution.ABORT);
|
|
26
|
+
// Track change (INSERT): record NEW primary key
|
|
27
|
+
const pkValues = tableSchema.primaryKeyDefinition.map(def => newRow[def.index]);
|
|
28
|
+
ctx.db._recordInsert(`${tableSchema.schemaName}.${tableSchema.name}`, pkValues);
|
|
26
29
|
yield flatRow; // make OLD/NEW available downstream (e.g. RETURNING)
|
|
27
30
|
}
|
|
28
31
|
} finally {
|
|
@@ -39,13 +42,16 @@ export function emitDmlExecutor(plan: DmlExecutorNode, ctx: EmissionContext): In
|
|
|
39
42
|
const newRow = extractNewRowFromFlat(flatRow, tableSchema.columns.length);
|
|
40
43
|
|
|
41
44
|
// Extract primary key values from the OLD row (these identify which row to update)
|
|
42
|
-
const keyValues = pkColumnIndicesInSchema.map(pkColIdx => {
|
|
45
|
+
const keyValues: SqlValue[] = pkColumnIndicesInSchema.map(pkColIdx => {
|
|
43
46
|
if (pkColIdx >= oldRow.length) {
|
|
44
47
|
throw new QuereusError(`PK column index ${pkColIdx} out of bounds for OLD row length ${oldRow.length} in UPDATE on '${tableSchema.name}'.`, StatusCode.INTERNAL);
|
|
45
48
|
}
|
|
46
49
|
return oldRow[pkColIdx];
|
|
47
50
|
});
|
|
48
|
-
await vtab.xUpdate!('update', newRow, keyValues);
|
|
51
|
+
await vtab.xUpdate!('update', newRow, keyValues, ConflictResolution.ABORT);
|
|
52
|
+
// Track change (UPDATE): record OLD and NEW primary keys
|
|
53
|
+
const newKeyValues: SqlValue[] = tableSchema.primaryKeyDefinition.map(pkColDef => newRow[pkColDef.index]);
|
|
54
|
+
ctx.db._recordUpdate(`${tableSchema.schemaName}.${tableSchema.name}`, keyValues, newKeyValues);
|
|
49
55
|
yield flatRow;
|
|
50
56
|
}
|
|
51
57
|
} finally {
|
|
@@ -60,13 +66,15 @@ export function emitDmlExecutor(plan: DmlExecutorNode, ctx: EmissionContext): In
|
|
|
60
66
|
for await (const flatRow of rows) {
|
|
61
67
|
const oldRow = extractOldRowFromFlat(flatRow, tableSchema.columns.length);
|
|
62
68
|
|
|
63
|
-
const keyValues = pkColumnIndicesInSchema.map(pkColIdx => {
|
|
69
|
+
const keyValues: SqlValue[] = pkColumnIndicesInSchema.map(pkColIdx => {
|
|
64
70
|
if (pkColIdx >= oldRow.length) {
|
|
65
71
|
throw new QuereusError(`PK column index ${pkColIdx} out of bounds for OLD row length ${oldRow.length} in DELETE on '${tableSchema.name}'.`, StatusCode.INTERNAL);
|
|
66
72
|
}
|
|
67
73
|
return oldRow[pkColIdx];
|
|
68
74
|
});
|
|
69
|
-
await vtab.xUpdate!('delete', undefined, keyValues);
|
|
75
|
+
await vtab.xUpdate!('delete', undefined, keyValues, ConflictResolution.ABORT);
|
|
76
|
+
// Track change (DELETE): record OLD primary key
|
|
77
|
+
ctx.db._recordDelete(`${tableSchema.schemaName}.${tableSchema.name}`, keyValues);
|
|
70
78
|
yield flatRow;
|
|
71
79
|
}
|
|
72
80
|
} finally {
|
|
@@ -75,11 +83,11 @@ export function emitDmlExecutor(plan: DmlExecutorNode, ctx: EmissionContext): In
|
|
|
75
83
|
}
|
|
76
84
|
|
|
77
85
|
// Select the correct generator based on operation
|
|
78
|
-
let
|
|
86
|
+
let run: InstructionRun;
|
|
79
87
|
switch (plan.operation) {
|
|
80
|
-
case 'insert':
|
|
81
|
-
case 'update':
|
|
82
|
-
case 'delete':
|
|
88
|
+
case 'insert': run = runInsert as InstructionRun; break;
|
|
89
|
+
case 'update': run = runUpdate as InstructionRun; break;
|
|
90
|
+
case 'delete': run = runDelete as InstructionRun; break;
|
|
83
91
|
default:
|
|
84
92
|
throw new QuereusError(`Unknown DML operation: ${plan.operation}`, StatusCode.INTERNAL);
|
|
85
93
|
}
|
|
@@ -88,7 +96,7 @@ export function emitDmlExecutor(plan: DmlExecutorNode, ctx: EmissionContext): In
|
|
|
88
96
|
|
|
89
97
|
return {
|
|
90
98
|
params: [sourceInstruction],
|
|
91
|
-
run
|
|
99
|
+
run,
|
|
92
100
|
note: `execute${plan.operation}(${plan.table.tableSchema.name})`
|
|
93
101
|
};
|
|
94
102
|
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { DropAssertionNode } from '../../planner/nodes/drop-assertion-node.js';
|
|
2
|
+
import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
|
|
3
|
+
import type { EmissionContext } from '../emission-context.js';
|
|
4
|
+
import { QuereusError } from '../../common/errors.js';
|
|
5
|
+
import { SqlValue, StatusCode } from '../../common/types.js';
|
|
6
|
+
import { createLogger } from '../../common/logger.js';
|
|
7
|
+
|
|
8
|
+
const log = createLogger('runtime:emit:drop-assertion');
|
|
9
|
+
|
|
10
|
+
export function emitDropAssertion(plan: DropAssertionNode, _ctx: EmissionContext): Instruction {
|
|
11
|
+
|
|
12
|
+
async function run(rctx: RuntimeContext): Promise<SqlValue> {
|
|
13
|
+
const schemaManager = rctx.db.schemaManager;
|
|
14
|
+
const schema = schemaManager.getMainSchema(); // Look in main schema for now
|
|
15
|
+
|
|
16
|
+
const existing = schema.getAssertion(plan.name);
|
|
17
|
+
if (!existing) {
|
|
18
|
+
if (plan.ifExists) {
|
|
19
|
+
log('Assertion %s not found, but IF EXISTS specified', plan.name);
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
throw new QuereusError(
|
|
23
|
+
`Assertion ${plan.name} not found`,
|
|
24
|
+
StatusCode.NOTFOUND
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const removed = schema.removeAssertion(plan.name);
|
|
29
|
+
if (!removed && !plan.ifExists) {
|
|
30
|
+
throw new QuereusError(
|
|
31
|
+
`Failed to remove assertion ${plan.name}`,
|
|
32
|
+
StatusCode.INTERNAL
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
log('Dropped assertion %s', plan.name);
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return {
|
|
41
|
+
params: [],
|
|
42
|
+
run: run as InstructionRun,
|
|
43
|
+
note: `dropAssertion(${plan.name})`
|
|
44
|
+
};
|
|
45
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { FilterNode } from '../../planner/nodes/filter.js';
|
|
2
|
-
import type { Instruction, RuntimeContext } from '../types.js';
|
|
2
|
+
import type { Instruction, InstructionRun, RuntimeContext } from '../types.js';
|
|
3
3
|
import { emitPlanNode, emitCallFromPlan } from '../emitters.js';
|
|
4
|
-
import { type Row } from '../../common/types.js';
|
|
4
|
+
import { OutputValue, type Row } from '../../common/types.js';
|
|
5
5
|
import type { EmissionContext } from '../emission-context.js';
|
|
6
6
|
import { buildRowDescriptor } from '../../util/row-descriptor.js';
|
|
7
7
|
import { withRowContextGenerator } from '../context-helpers.js';
|
|
@@ -13,7 +13,7 @@ export function emitFilter(plan: FilterNode, ctx: EmissionContext): Instruction
|
|
|
13
13
|
// Create row descriptor for source attributes
|
|
14
14
|
const sourceRowDescriptor = buildRowDescriptor(plan.source.getAttributes());
|
|
15
15
|
|
|
16
|
-
async function* run(ctx: RuntimeContext, source: AsyncIterable<Row>, predicate: (ctx: RuntimeContext) =>
|
|
16
|
+
async function* run(ctx: RuntimeContext, source: AsyncIterable<Row>, predicate: (ctx: RuntimeContext) => OutputValue): AsyncIterable<Row> {
|
|
17
17
|
yield* withRowContextGenerator(ctx, sourceRowDescriptor, source, async function* (sourceRow) {
|
|
18
18
|
const result = await predicate(ctx);
|
|
19
19
|
if (result) {
|
|
@@ -24,7 +24,7 @@ export function emitFilter(plan: FilterNode, ctx: EmissionContext): Instruction
|
|
|
24
24
|
|
|
25
25
|
return {
|
|
26
26
|
params: [sourceInstruction, predicateFunc],
|
|
27
|
-
run: run as
|
|
27
|
+
run: run as InstructionRun,
|
|
28
28
|
note: `filter(${plan.predicate.toString()})`
|
|
29
29
|
};
|
|
30
30
|
}
|
package/src/runtime/emit/join.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import type { JoinNode } from '../../planner/nodes/join-node.js';
|
|
2
|
-
import type { Instruction, RuntimeContext } from '../types.js';
|
|
2
|
+
import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
|
|
3
3
|
import { emitCallFromPlan, emitPlanNode } from '../emitters.js';
|
|
4
|
-
import type { Row } from '../../common/types.js';
|
|
4
|
+
import type { Row, OutputValue } from '../../common/types.js';
|
|
5
5
|
import type { EmissionContext } from '../emission-context.js';
|
|
6
6
|
import { createLogger } from '../../common/logger.js';
|
|
7
7
|
import { compareSqlValues } from '../../util/comparison.js';
|
|
8
8
|
import { buildRowDescriptor } from '../../util/row-descriptor.js';
|
|
9
9
|
import { createRowSlot } from '../context-helpers.js';
|
|
10
|
+
import type { Attribute } from '../../planner/nodes/plan-node.js';
|
|
10
11
|
|
|
11
12
|
const log = createLogger('runtime:emit:join');
|
|
12
13
|
|
|
@@ -23,7 +24,7 @@ export function emitLoopJoin(plan: JoinNode, ctx: EmissionContext): Instruction
|
|
|
23
24
|
const rightRowDescriptor = buildRowDescriptor(rightAttributes);
|
|
24
25
|
|
|
25
26
|
// NOTE: rightSource must be re-startable (optimizer facilitates through cache node)
|
|
26
|
-
async function* run(rctx: RuntimeContext, leftSource: AsyncIterable<Row>, rightCallback: (ctx: RuntimeContext) => AsyncIterable<Row>, conditionCallback?: (ctx: RuntimeContext) =>
|
|
27
|
+
async function* run(rctx: RuntimeContext, leftSource: AsyncIterable<Row>, rightCallback: (ctx: RuntimeContext) => AsyncIterable<Row>, conditionCallback?: (ctx: RuntimeContext) => OutputValue): AsyncIterable<Row> {
|
|
27
28
|
const joinType = plan.joinType;
|
|
28
29
|
|
|
29
30
|
log('Starting %s join between %d left attrs and %d right attrs',
|
|
@@ -106,7 +107,7 @@ export function emitLoopJoin(plan: JoinNode, ctx: EmissionContext): Instruction
|
|
|
106
107
|
|
|
107
108
|
return {
|
|
108
109
|
params,
|
|
109
|
-
run: run as
|
|
110
|
+
run: run as InstructionRun,
|
|
110
111
|
note: `${plan.joinType} join (nested loop)`
|
|
111
112
|
};
|
|
112
113
|
}
|
|
@@ -117,9 +118,9 @@ export function emitLoopJoin(plan: JoinNode, ctx: EmissionContext): Instruction
|
|
|
117
118
|
function evaluateUsingCondition(
|
|
118
119
|
leftRow: Row,
|
|
119
120
|
rightRow: Row,
|
|
120
|
-
usingColumns: string[],
|
|
121
|
-
leftAttributes:
|
|
122
|
-
rightAttributes:
|
|
121
|
+
usingColumns: readonly string[],
|
|
122
|
+
leftAttributes: readonly Attribute[],
|
|
123
|
+
rightAttributes: readonly Attribute[]
|
|
123
124
|
): boolean {
|
|
124
125
|
for (const columnName of usingColumns) {
|
|
125
126
|
const leftColName = columnName.toLowerCase();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { LimitOffsetNode } from '../../planner/nodes/limit-offset.js';
|
|
2
|
-
import type { Instruction, RuntimeContext } from '../types.js';
|
|
2
|
+
import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
|
|
3
3
|
import { emitPlanNode, emitCallFromPlan } from '../emitters.js';
|
|
4
4
|
import { type SqlValue, type Row, MaybePromise } from '../../common/types.js';
|
|
5
5
|
import type { EmissionContext } from '../emission-context.js';
|
|
@@ -67,7 +67,7 @@ export function emitLimitOffset(plan: LimitOffsetNode, ctx: EmissionContext): In
|
|
|
67
67
|
|
|
68
68
|
return {
|
|
69
69
|
params,
|
|
70
|
-
run: run as
|
|
70
|
+
run: run as InstructionRun,
|
|
71
71
|
note: `limit_offset(${plan.limit ? 'LIMIT' : ''}${plan.limit && plan.offset ? ',' : ''}${plan.offset ? 'OFFSET' : ''})`
|
|
72
72
|
};
|
|
73
73
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { EmissionContext } from '../emission-context.js';
|
|
2
2
|
import type { PragmaPlanNode } from '../../planner/nodes/pragma.js';
|
|
3
3
|
import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
|
|
4
|
-
import type { Row } from '../../common/types.js';
|
|
4
|
+
import type { Row, SqlValue } from '../../common/types.js';
|
|
5
5
|
import { createLogger } from '../../common/logger.js';
|
|
6
6
|
import { QuereusError } from '../../common/errors.js';
|
|
7
7
|
import { StatusCode } from '../../common/types.js';
|
|
@@ -32,7 +32,7 @@ export function emitPragma(plan: PragmaPlanNode, _ctx: EmissionContext): Instruc
|
|
|
32
32
|
log(`PRAGMA ${pragmaName} (reading)`);
|
|
33
33
|
|
|
34
34
|
try {
|
|
35
|
-
const currentValue = rctx.db.getOption(pragmaName);
|
|
35
|
+
const currentValue = rctx.db.getOption(pragmaName) as SqlValue;
|
|
36
36
|
log(`Read option ${pragmaName} = ${currentValue}`);
|
|
37
37
|
// Return as a single-row result with the pragma name as column
|
|
38
38
|
yield [pragmaName, currentValue];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ProjectNode } from '../../planner/nodes/project-node.js';
|
|
2
|
-
import type { Instruction, RuntimeContext } from '../types.js';
|
|
2
|
+
import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
|
|
3
3
|
import { emitPlanNode, emitCallFromPlan } from '../emitters.js';
|
|
4
4
|
import { type Row } from '../../common/types.js';
|
|
5
5
|
import { type OutputValue } from '../../common/types.js';
|
|
@@ -40,7 +40,7 @@ export function emitProject(plan: ProjectNode, ctx: EmissionContext): Instructio
|
|
|
40
40
|
|
|
41
41
|
return {
|
|
42
42
|
params: [sourceInstruction, ...projectionFuncs],
|
|
43
|
-
run: run as
|
|
43
|
+
run: run as InstructionRun,
|
|
44
44
|
note: `project(${plan.projections.length} cols)`
|
|
45
45
|
};
|
|
46
46
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { RecursiveCTENode } from '../../planner/nodes/recursive-cte-node.js';
|
|
2
|
-
import type { Instruction, RuntimeContext } from '../types.js';
|
|
2
|
+
import type { Instruction, InstructionRun, RuntimeContext } from '../types.js';
|
|
3
3
|
import type { EmissionContext } from '../emission-context.js';
|
|
4
4
|
import { emitCallFromPlan, emitPlanNode } from '../emitters.js';
|
|
5
5
|
import type { Row } from '../../common/types.js';
|
|
@@ -102,7 +102,7 @@ export function emitRecursiveCTE(plan: RecursiveCTENode, ctx: EmissionContext):
|
|
|
102
102
|
|
|
103
103
|
return {
|
|
104
104
|
params: [baseCaseInstruction, recursiveCaseInstruction],
|
|
105
|
-
run,
|
|
105
|
+
run: run as InstructionRun,
|
|
106
106
|
note: `recursiveCTE(${plan.cteName})`
|
|
107
107
|
};
|
|
108
108
|
}
|