@quereus/quereus 0.2.1 → 0.4.5
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 -2
- package/dist/src/util/plugin-loader.d.ts.map +1 -1
- package/dist/src/util/plugin-loader.js +180 -2
- 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 +232 -7
- 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
|
@@ -18,6 +18,7 @@ import { scanTransactionLayer } from './transaction-cursor.js';
|
|
|
18
18
|
import { createPrimaryKeyFunctions, buildPrimaryKeyFromValues, type PrimaryKeyFunctions } from '../utils/primary-key.js';
|
|
19
19
|
import { createMemoryTableLoggers } from '../utils/logging.js';
|
|
20
20
|
import { getSyncLiteral } from '../../../parser/utils.js';
|
|
21
|
+
import { createLogger } from '../../../common/logger.js';
|
|
21
22
|
|
|
22
23
|
let tableManagerCounter = 0;
|
|
23
24
|
const logger = createMemoryTableLoggers('layer:manager');
|
|
@@ -130,12 +131,31 @@ export class MemoryTableManager {
|
|
|
130
131
|
currentParent = currentParent.getParent();
|
|
131
132
|
}
|
|
132
133
|
|
|
134
|
+
// Also check if the current committed layer and pending layer are siblings
|
|
135
|
+
// (both children of the same parent) - this handles coordinated multi-connection commits
|
|
133
136
|
if (!foundCommittedLayer) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
137
|
+
const pendingParent = pendingLayer.getParent();
|
|
138
|
+
let committedAncestor: Layer | null = this._currentCommittedLayer;
|
|
139
|
+
while (committedAncestor) {
|
|
140
|
+
if (committedAncestor === pendingParent) {
|
|
141
|
+
foundCommittedLayer = true;
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
committedAncestor = committedAncestor.getParent();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (!foundCommittedLayer) {
|
|
149
|
+
// During coordinated multi-connection commits (explicit COMMIT or implicit transaction commit),
|
|
150
|
+
// sibling layers are allowed. Only enforce strict validation outside coordinated commits.
|
|
151
|
+
if (!this.db._inCoordinatedCommit()) {
|
|
152
|
+
connection.pendingTransactionLayer = null;
|
|
153
|
+
connection.clearSavepoints();
|
|
154
|
+
logger.warn('Commit Transaction', this._tableName, 'Stale commit detected, rolling back', { connectionId: connection.connectionId });
|
|
155
|
+
throw new QuereusError(`Commit failed: concurrent update on table ${this._tableName}. Retry.`, StatusCode.BUSY);
|
|
156
|
+
}
|
|
138
157
|
}
|
|
158
|
+
|
|
139
159
|
pendingLayer.markCommitted();
|
|
140
160
|
this._currentCommittedLayer = pendingLayer;
|
|
141
161
|
logger.debugLog(`[Commit ${connection.connectionId}] CurrentCommittedLayer set to ${pendingLayer.getLayerId()} for ${this._tableName}`);
|
|
@@ -216,6 +236,7 @@ export class MemoryTableManager {
|
|
|
216
236
|
} else {
|
|
217
237
|
logger.debugLog(`[Collapse] No layers collapsed for ${this._tableName}. Current: ${this._currentCommittedLayer.getLayerId()}`);
|
|
218
238
|
}
|
|
239
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
219
240
|
} catch (e: any) {
|
|
220
241
|
logger.error('Collapse Layers', this._tableName, e);
|
|
221
242
|
} finally {
|
|
@@ -307,7 +328,8 @@ export class MemoryTableManager {
|
|
|
307
328
|
connection: MemoryTableConnection,
|
|
308
329
|
operation: 'insert' | 'update' | 'delete',
|
|
309
330
|
values: Row | undefined,
|
|
310
|
-
oldKeyValues?: Row
|
|
331
|
+
oldKeyValues?: Row,
|
|
332
|
+
onConflict: ConflictResolution = ConflictResolution.ABORT
|
|
311
333
|
): Promise<Row | undefined> {
|
|
312
334
|
this.validateMutationPermissions(operation);
|
|
313
335
|
|
|
@@ -315,7 +337,6 @@ export class MemoryTableManager {
|
|
|
315
337
|
this.ensureTransactionLayer(connection);
|
|
316
338
|
|
|
317
339
|
const targetLayer = connection.pendingTransactionLayer!;
|
|
318
|
-
const onConflict = this.extractConflictResolution(values);
|
|
319
340
|
this.cleanConflictResolutionFromValues(values);
|
|
320
341
|
|
|
321
342
|
try {
|
|
@@ -370,11 +391,12 @@ export class MemoryTableManager {
|
|
|
370
391
|
}
|
|
371
392
|
}
|
|
372
393
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
394
|
+
// Deprecated: conflict resolution is now passed explicitly to performMutation
|
|
395
|
+
private extractConflictResolution(values: Row | undefined): ConflictResolution {
|
|
396
|
+
return (values && (values as any)._onConflict)
|
|
397
|
+
? (values as any)._onConflict as ConflictResolution
|
|
398
|
+
: ConflictResolution.ABORT;
|
|
399
|
+
}
|
|
378
400
|
|
|
379
401
|
private shouldSkipPkCheck(values: Row | undefined): boolean {
|
|
380
402
|
return !!(values && (values as any)._skipPkCheck);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { BTree } from 'inheritree';
|
|
1
|
+
import type { BTree, Path } from 'inheritree';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* A mutation-safe iterator for BTree that automatically handles tree mutations
|
|
@@ -33,7 +33,7 @@ export async function* safeIterate<TKey, TValue>(tree: BTree<TKey, TValue>, isAs
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
/* Attempts to move the path to the nearest valid position if not found - preferring the direction of the iteration */
|
|
36
|
-
function moveNearest<TKey, TValue>(tree: BTree<TKey, TValue>, isAscending: boolean, path:
|
|
36
|
+
function moveNearest<TKey, TValue>(tree: BTree<TKey, TValue>, isAscending: boolean, path: Path<TKey, TValue>): void {
|
|
37
37
|
if (!path.on) {
|
|
38
38
|
// If not found, the path will point to the closest "crack". All we need to do is move off of it in the correct direction
|
|
39
39
|
if (isAscending) {
|
|
@@ -46,4 +46,4 @@ function moveNearest<TKey, TValue>(tree: BTree<TKey, TValue>, isAscending: boole
|
|
|
46
46
|
if (!path.on) tree.moveNext(path);
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
-
}
|
|
49
|
+
}
|
|
@@ -1,229 +1,229 @@
|
|
|
1
|
-
import { BTree } from 'inheritree';
|
|
2
|
-
import type { TableSchema } from '../../../schema/table.js';
|
|
3
|
-
import { MemoryIndex } from '../index.js';
|
|
4
|
-
import type { Row } from '../../../common/types.js';
|
|
5
|
-
import type { BTreeKeyForPrimary, BTreeKeyForIndex, MemoryIndexEntry } from '../types.js';
|
|
6
|
-
import type { Layer } from './interface.js';
|
|
7
|
-
import { createLogger } from '../../../common/logger.js';
|
|
8
|
-
import { createPrimaryKeyFunctions } from '../utils/primary-key.js';
|
|
9
|
-
import { QuereusError } from '../../../common/errors.js';
|
|
10
|
-
|
|
11
|
-
const log = createLogger('vtab:memory:layer:transaction');
|
|
12
|
-
const warnLog = log.extend('warn');
|
|
13
|
-
|
|
14
|
-
let transactionLayerCounter = 1000;
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Represents a set of modifications (inserts, updates, deletes) applied
|
|
18
|
-
* on top of a parent Layer using inherited BTrees with copy-on-write semantics.
|
|
19
|
-
* These layers are immutable once committed.
|
|
20
|
-
*/
|
|
21
|
-
export class TransactionLayer implements Layer {
|
|
22
|
-
private readonly layerId: number;
|
|
23
|
-
public readonly parentLayer: Layer;
|
|
24
|
-
private readonly tableSchemaAtCreation: TableSchema; // Schema when this layer was started
|
|
25
|
-
|
|
26
|
-
// Primary modifications BTree that inherits from parent
|
|
27
|
-
private primaryModifications: BTree<BTreeKeyForPrimary, Row>;
|
|
28
|
-
|
|
29
|
-
// Secondary index BTrees that inherit from parent's indexes
|
|
30
|
-
private secondaryIndexes: Map<string, MemoryIndex>;
|
|
31
|
-
|
|
32
|
-
private _isCommitted: boolean = false;
|
|
33
|
-
|
|
34
|
-
// Cache for BTree funcs to avoid recalculation
|
|
35
|
-
private btreeFuncsCacheForKeyExtraction: Map<string | 'primary', {
|
|
36
|
-
primaryKeyExtractorFromRow: (row: Row) => BTreeKeyForPrimary;
|
|
37
|
-
indexKeyExtractorFromRow?: (row: Row) => BTreeKeyForIndex;
|
|
38
|
-
primaryKeyComparator: (a: BTreeKeyForPrimary, b: BTreeKeyForPrimary) => number;
|
|
39
|
-
indexKeyComparator?: (a: BTreeKeyForIndex, b: BTreeKeyForIndex) => number;
|
|
40
|
-
}> = new Map();
|
|
41
|
-
|
|
42
|
-
constructor(parent: Layer) {
|
|
43
|
-
this.layerId = transactionLayerCounter++;
|
|
44
|
-
this.parentLayer = parent;
|
|
45
|
-
this.tableSchemaAtCreation = parent.getSchema(); // Schema is fixed at creation
|
|
46
|
-
|
|
47
|
-
// Initialize primary modifications BTree with parent's primary tree as base
|
|
48
|
-
const { primaryKeyExtractorFromRow, primaryKeyComparator } = this.getPkExtractorsAndComparators(this.tableSchemaAtCreation);
|
|
49
|
-
const btreeKeyFromValue = (value: Row): BTreeKeyForPrimary => {
|
|
50
|
-
const result = primaryKeyExtractorFromRow(value);
|
|
51
|
-
return result;
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
const parentPrimaryTree = parent.getModificationTree('primary');
|
|
55
|
-
|
|
56
|
-
this.primaryModifications = new BTree(
|
|
57
|
-
btreeKeyFromValue,
|
|
58
|
-
primaryKeyComparator,
|
|
59
|
-
parentPrimaryTree || undefined // Use parent's primary tree as base
|
|
60
|
-
);
|
|
61
|
-
|
|
62
|
-
// Initialize secondary indexes that inherit from parent's secondary indexes
|
|
63
|
-
this.secondaryIndexes = new Map();
|
|
64
|
-
this.initializeSecondaryIndexes();
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
private initializeSecondaryIndexes(): void {
|
|
68
|
-
const schema = this.tableSchemaAtCreation;
|
|
69
|
-
if (!schema.indexes) return;
|
|
70
|
-
|
|
71
|
-
for (const indexSchema of schema.indexes) {
|
|
72
|
-
const parentSecondaryTree = this.parentLayer.getSecondaryIndexTree?.(indexSchema.name);
|
|
73
|
-
// Create MemoryIndex with inherited BTree
|
|
74
|
-
const memoryIndex = new MemoryIndex(
|
|
75
|
-
indexSchema,
|
|
76
|
-
schema.columns,
|
|
77
|
-
parentSecondaryTree || undefined // Use parent's secondary index tree as base
|
|
78
|
-
);
|
|
79
|
-
this.secondaryIndexes.set(indexSchema.name, memoryIndex);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
getLayerId(): number {
|
|
84
|
-
return this.layerId;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
getParent(): Layer {
|
|
88
|
-
return this.parentLayer;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
getSchema(): TableSchema {
|
|
92
|
-
// Return the schema as it was when this transaction started
|
|
93
|
-
return this.tableSchemaAtCreation;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
isCommitted(): boolean {
|
|
97
|
-
return this._isCommitted;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/** Marks this layer as committed. Should only be done by MemoryTable. */
|
|
101
|
-
markCommitted(): void {
|
|
102
|
-
if (!this._isCommitted) {
|
|
103
|
-
this._isCommitted = true;
|
|
104
|
-
// With inherited BTrees, we don't need to freeze complex change tracking structures
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
public getPkExtractorsAndComparators(schema: TableSchema): {
|
|
109
|
-
primaryKeyExtractorFromRow: (row: Row) => BTreeKeyForPrimary;
|
|
110
|
-
primaryKeyComparator: (a: BTreeKeyForPrimary, b: BTreeKeyForPrimary) => number
|
|
111
|
-
} {
|
|
112
|
-
if (schema !== this.tableSchemaAtCreation) {
|
|
113
|
-
warnLog("TransactionLayer.getPkExtractorsAndComparators called with a schema different from its creation schema. Using creation schema.");
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Use the centralized primary key functions instead of duplicating the logic
|
|
117
|
-
// This ensures consistent handling of empty primary key definitions
|
|
118
|
-
const pkFunctions = createPrimaryKeyFunctions(this.tableSchemaAtCreation);
|
|
119
|
-
return {
|
|
120
|
-
primaryKeyExtractorFromRow: pkFunctions.extractFromRow,
|
|
121
|
-
primaryKeyComparator: pkFunctions.compare
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
getModificationTree(indexName: string | 'primary'): BTree<BTreeKeyForPrimary, Row> | null {
|
|
126
|
-
if (indexName === 'primary') return this.primaryModifications;
|
|
127
|
-
return null; // Secondary indexes are accessed via getSecondaryIndexTree
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
getSecondaryIndexTree(indexName: string): BTree<BTreeKeyForIndex, MemoryIndexEntry> | null {
|
|
131
|
-
return this.secondaryIndexes.get(indexName)?.data ?? null;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/** Records an insert or update in this transaction layer */
|
|
135
|
-
recordUpsert(primaryKey: BTreeKeyForPrimary, newRowData: Row, oldRowDataIfUpdate?: Row | null): void {
|
|
136
|
-
if (this._isCommitted) throw new QuereusError("Cannot modify a committed layer");
|
|
137
|
-
|
|
138
|
-
this.primaryModifications.upsert(newRowData);
|
|
139
|
-
|
|
140
|
-
// Update secondary indexes
|
|
141
|
-
const schema = this.getSchema();
|
|
142
|
-
if (schema.indexes) {
|
|
143
|
-
for (const indexSchema of schema.indexes) {
|
|
144
|
-
const memoryIndex = this.secondaryIndexes.get(indexSchema.name);
|
|
145
|
-
if (!memoryIndex) continue;
|
|
146
|
-
|
|
147
|
-
if (oldRowDataIfUpdate) { // UPDATE
|
|
148
|
-
const oldIndexKey = memoryIndex.keyFromRow(oldRowDataIfUpdate);
|
|
149
|
-
const newIndexKey = memoryIndex.keyFromRow(newRowData);
|
|
150
|
-
|
|
151
|
-
// If index key changed, remove old and add new
|
|
152
|
-
if (memoryIndex.compareKeys(oldIndexKey, newIndexKey) !== 0) {
|
|
153
|
-
memoryIndex.removeEntry(oldIndexKey, primaryKey);
|
|
154
|
-
memoryIndex.addEntry(newIndexKey, primaryKey);
|
|
155
|
-
} else {
|
|
156
|
-
// Index key is same, but we might need to update the entry
|
|
157
|
-
// With inherited BTrees, the existing entry will be copied on write
|
|
158
|
-
memoryIndex.addEntry(newIndexKey, primaryKey);
|
|
159
|
-
}
|
|
160
|
-
} else { // INSERT
|
|
161
|
-
const newIndexKey = memoryIndex.keyFromRow(newRowData);
|
|
162
|
-
memoryIndex.addEntry(newIndexKey, primaryKey);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/** Records a delete in this transaction layer */
|
|
169
|
-
recordDelete(primaryKey: BTreeKeyForPrimary, oldRowDataForIndexes: Row): void {
|
|
170
|
-
if (this._isCommitted) throw new QuereusError("Cannot modify a committed layer");
|
|
171
|
-
|
|
172
|
-
// Find the existing entry
|
|
173
|
-
const existingPath = this.primaryModifications.find(primaryKey);
|
|
174
|
-
if (existingPath.on) {
|
|
175
|
-
// Entry exists (locally or inherited) - use deleteAt to remove it
|
|
176
|
-
this.primaryModifications.deleteAt(existingPath);
|
|
177
|
-
}
|
|
178
|
-
// If key doesn't exist, there's nothing to delete - no deletion marker needed
|
|
179
|
-
// Inheritree's copy-on-write semantics handle this properly
|
|
180
|
-
|
|
181
|
-
// Update secondary indexes to remove entries
|
|
182
|
-
const schema = this.getSchema();
|
|
183
|
-
if (schema.indexes) {
|
|
184
|
-
for (const indexSchema of schema.indexes) {
|
|
185
|
-
const memoryIndex = this.secondaryIndexes.get(indexSchema.name);
|
|
186
|
-
if (!memoryIndex) continue;
|
|
187
|
-
|
|
188
|
-
const oldIndexKey = memoryIndex.keyFromRow(oldRowDataForIndexes);
|
|
189
|
-
memoryIndex.removeEntry(oldIndexKey, primaryKey);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
public hasChanges(): boolean {
|
|
195
|
-
// Check if primary modifications BTree has any entries beyond its base
|
|
196
|
-
if (this.primaryModifications.getCount() > 0) {
|
|
197
|
-
// Note: getCount() might include inherited entries, so we need a better way
|
|
198
|
-
// to check if this layer has modifications. This depends on inheritree's API.
|
|
199
|
-
// For now, assume any count > 0 means changes (might need refinement)
|
|
200
|
-
return true;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
// Check secondary indexes for changes
|
|
204
|
-
for (const memoryIndex of this.secondaryIndexes.values()) {
|
|
205
|
-
if (memoryIndex.size > 0) {
|
|
206
|
-
// Same caveat as above - this might include inherited entries
|
|
207
|
-
return true;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
return false;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* Detaches this layer's BTrees from their base, making them self-contained.
|
|
216
|
-
* This should be called when the layer becomes the new effective base.
|
|
217
|
-
*/
|
|
218
|
-
public clearBase(): void {
|
|
219
|
-
// Clear base for primary modifications
|
|
220
|
-
if (typeof (this.primaryModifications as any).clearBase === 'function') {
|
|
221
|
-
(this.primaryModifications as any).clearBase();
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// Clear base for secondary indexes
|
|
225
|
-
for (const memoryIndex of this.secondaryIndexes.values()) {
|
|
226
|
-
memoryIndex.clearBase();
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
1
|
+
import { BTree } from 'inheritree';
|
|
2
|
+
import type { TableSchema } from '../../../schema/table.js';
|
|
3
|
+
import { MemoryIndex } from '../index.js';
|
|
4
|
+
import type { Row } from '../../../common/types.js';
|
|
5
|
+
import type { BTreeKeyForPrimary, BTreeKeyForIndex, MemoryIndexEntry } from '../types.js';
|
|
6
|
+
import type { Layer } from './interface.js';
|
|
7
|
+
import { createLogger } from '../../../common/logger.js';
|
|
8
|
+
import { createPrimaryKeyFunctions } from '../utils/primary-key.js';
|
|
9
|
+
import { QuereusError } from '../../../common/errors.js';
|
|
10
|
+
|
|
11
|
+
const log = createLogger('vtab:memory:layer:transaction');
|
|
12
|
+
const warnLog = log.extend('warn');
|
|
13
|
+
|
|
14
|
+
let transactionLayerCounter = 1000;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Represents a set of modifications (inserts, updates, deletes) applied
|
|
18
|
+
* on top of a parent Layer using inherited BTrees with copy-on-write semantics.
|
|
19
|
+
* These layers are immutable once committed.
|
|
20
|
+
*/
|
|
21
|
+
export class TransactionLayer implements Layer {
|
|
22
|
+
private readonly layerId: number;
|
|
23
|
+
public readonly parentLayer: Layer;
|
|
24
|
+
private readonly tableSchemaAtCreation: TableSchema; // Schema when this layer was started
|
|
25
|
+
|
|
26
|
+
// Primary modifications BTree that inherits from parent
|
|
27
|
+
private primaryModifications: BTree<BTreeKeyForPrimary, Row>;
|
|
28
|
+
|
|
29
|
+
// Secondary index BTrees that inherit from parent's indexes
|
|
30
|
+
private secondaryIndexes: Map<string, MemoryIndex>;
|
|
31
|
+
|
|
32
|
+
private _isCommitted: boolean = false;
|
|
33
|
+
|
|
34
|
+
// Cache for BTree funcs to avoid recalculation
|
|
35
|
+
private btreeFuncsCacheForKeyExtraction: Map<string | 'primary', {
|
|
36
|
+
primaryKeyExtractorFromRow: (row: Row) => BTreeKeyForPrimary;
|
|
37
|
+
indexKeyExtractorFromRow?: (row: Row) => BTreeKeyForIndex;
|
|
38
|
+
primaryKeyComparator: (a: BTreeKeyForPrimary, b: BTreeKeyForPrimary) => number;
|
|
39
|
+
indexKeyComparator?: (a: BTreeKeyForIndex, b: BTreeKeyForIndex) => number;
|
|
40
|
+
}> = new Map();
|
|
41
|
+
|
|
42
|
+
constructor(parent: Layer) {
|
|
43
|
+
this.layerId = transactionLayerCounter++;
|
|
44
|
+
this.parentLayer = parent;
|
|
45
|
+
this.tableSchemaAtCreation = parent.getSchema(); // Schema is fixed at creation
|
|
46
|
+
|
|
47
|
+
// Initialize primary modifications BTree with parent's primary tree as base
|
|
48
|
+
const { primaryKeyExtractorFromRow, primaryKeyComparator } = this.getPkExtractorsAndComparators(this.tableSchemaAtCreation);
|
|
49
|
+
const btreeKeyFromValue = (value: Row): BTreeKeyForPrimary => {
|
|
50
|
+
const result = primaryKeyExtractorFromRow(value);
|
|
51
|
+
return result;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const parentPrimaryTree = parent.getModificationTree('primary');
|
|
55
|
+
|
|
56
|
+
this.primaryModifications = new BTree(
|
|
57
|
+
btreeKeyFromValue,
|
|
58
|
+
primaryKeyComparator,
|
|
59
|
+
parentPrimaryTree || undefined // Use parent's primary tree as base
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
// Initialize secondary indexes that inherit from parent's secondary indexes
|
|
63
|
+
this.secondaryIndexes = new Map();
|
|
64
|
+
this.initializeSecondaryIndexes();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
private initializeSecondaryIndexes(): void {
|
|
68
|
+
const schema = this.tableSchemaAtCreation;
|
|
69
|
+
if (!schema.indexes) return;
|
|
70
|
+
|
|
71
|
+
for (const indexSchema of schema.indexes) {
|
|
72
|
+
const parentSecondaryTree = this.parentLayer.getSecondaryIndexTree?.(indexSchema.name);
|
|
73
|
+
// Create MemoryIndex with inherited BTree
|
|
74
|
+
const memoryIndex = new MemoryIndex(
|
|
75
|
+
indexSchema,
|
|
76
|
+
schema.columns,
|
|
77
|
+
parentSecondaryTree || undefined // Use parent's secondary index tree as base
|
|
78
|
+
);
|
|
79
|
+
this.secondaryIndexes.set(indexSchema.name, memoryIndex);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
getLayerId(): number {
|
|
84
|
+
return this.layerId;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
getParent(): Layer {
|
|
88
|
+
return this.parentLayer;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
getSchema(): TableSchema {
|
|
92
|
+
// Return the schema as it was when this transaction started
|
|
93
|
+
return this.tableSchemaAtCreation;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
isCommitted(): boolean {
|
|
97
|
+
return this._isCommitted;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Marks this layer as committed. Should only be done by MemoryTable. */
|
|
101
|
+
markCommitted(): void {
|
|
102
|
+
if (!this._isCommitted) {
|
|
103
|
+
this._isCommitted = true;
|
|
104
|
+
// With inherited BTrees, we don't need to freeze complex change tracking structures
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
public getPkExtractorsAndComparators(schema: TableSchema): {
|
|
109
|
+
primaryKeyExtractorFromRow: (row: Row) => BTreeKeyForPrimary;
|
|
110
|
+
primaryKeyComparator: (a: BTreeKeyForPrimary, b: BTreeKeyForPrimary) => number
|
|
111
|
+
} {
|
|
112
|
+
if (schema !== this.tableSchemaAtCreation) {
|
|
113
|
+
warnLog("TransactionLayer.getPkExtractorsAndComparators called with a schema different from its creation schema. Using creation schema.");
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Use the centralized primary key functions instead of duplicating the logic
|
|
117
|
+
// This ensures consistent handling of empty primary key definitions
|
|
118
|
+
const pkFunctions = createPrimaryKeyFunctions(this.tableSchemaAtCreation);
|
|
119
|
+
return {
|
|
120
|
+
primaryKeyExtractorFromRow: pkFunctions.extractFromRow,
|
|
121
|
+
primaryKeyComparator: pkFunctions.compare
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
getModificationTree(indexName: string | 'primary'): BTree<BTreeKeyForPrimary, Row> | null {
|
|
126
|
+
if (indexName === 'primary') return this.primaryModifications;
|
|
127
|
+
return null; // Secondary indexes are accessed via getSecondaryIndexTree
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
getSecondaryIndexTree(indexName: string): BTree<BTreeKeyForIndex, MemoryIndexEntry> | null {
|
|
131
|
+
return this.secondaryIndexes.get(indexName)?.data ?? null;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** Records an insert or update in this transaction layer */
|
|
135
|
+
recordUpsert(primaryKey: BTreeKeyForPrimary, newRowData: Row, oldRowDataIfUpdate?: Row | null): void {
|
|
136
|
+
if (this._isCommitted) throw new QuereusError("Cannot modify a committed layer");
|
|
137
|
+
|
|
138
|
+
this.primaryModifications.upsert(newRowData);
|
|
139
|
+
|
|
140
|
+
// Update secondary indexes
|
|
141
|
+
const schema = this.getSchema();
|
|
142
|
+
if (schema.indexes) {
|
|
143
|
+
for (const indexSchema of schema.indexes) {
|
|
144
|
+
const memoryIndex = this.secondaryIndexes.get(indexSchema.name);
|
|
145
|
+
if (!memoryIndex) continue;
|
|
146
|
+
|
|
147
|
+
if (oldRowDataIfUpdate) { // UPDATE
|
|
148
|
+
const oldIndexKey = memoryIndex.keyFromRow(oldRowDataIfUpdate);
|
|
149
|
+
const newIndexKey = memoryIndex.keyFromRow(newRowData);
|
|
150
|
+
|
|
151
|
+
// If index key changed, remove old and add new
|
|
152
|
+
if (memoryIndex.compareKeys(oldIndexKey, newIndexKey) !== 0) {
|
|
153
|
+
memoryIndex.removeEntry(oldIndexKey, primaryKey);
|
|
154
|
+
memoryIndex.addEntry(newIndexKey, primaryKey);
|
|
155
|
+
} else {
|
|
156
|
+
// Index key is same, but we might need to update the entry
|
|
157
|
+
// With inherited BTrees, the existing entry will be copied on write
|
|
158
|
+
memoryIndex.addEntry(newIndexKey, primaryKey);
|
|
159
|
+
}
|
|
160
|
+
} else { // INSERT
|
|
161
|
+
const newIndexKey = memoryIndex.keyFromRow(newRowData);
|
|
162
|
+
memoryIndex.addEntry(newIndexKey, primaryKey);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** Records a delete in this transaction layer */
|
|
169
|
+
recordDelete(primaryKey: BTreeKeyForPrimary, oldRowDataForIndexes: Row): void {
|
|
170
|
+
if (this._isCommitted) throw new QuereusError("Cannot modify a committed layer");
|
|
171
|
+
|
|
172
|
+
// Find the existing entry
|
|
173
|
+
const existingPath = this.primaryModifications.find(primaryKey);
|
|
174
|
+
if (existingPath.on) {
|
|
175
|
+
// Entry exists (locally or inherited) - use deleteAt to remove it
|
|
176
|
+
this.primaryModifications.deleteAt(existingPath);
|
|
177
|
+
}
|
|
178
|
+
// If key doesn't exist, there's nothing to delete - no deletion marker needed
|
|
179
|
+
// Inheritree's copy-on-write semantics handle this properly
|
|
180
|
+
|
|
181
|
+
// Update secondary indexes to remove entries
|
|
182
|
+
const schema = this.getSchema();
|
|
183
|
+
if (schema.indexes) {
|
|
184
|
+
for (const indexSchema of schema.indexes) {
|
|
185
|
+
const memoryIndex = this.secondaryIndexes.get(indexSchema.name);
|
|
186
|
+
if (!memoryIndex) continue;
|
|
187
|
+
|
|
188
|
+
const oldIndexKey = memoryIndex.keyFromRow(oldRowDataForIndexes);
|
|
189
|
+
memoryIndex.removeEntry(oldIndexKey, primaryKey);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
public hasChanges(): boolean {
|
|
195
|
+
// Check if primary modifications BTree has any entries beyond its base
|
|
196
|
+
if (this.primaryModifications.getCount() > 0) {
|
|
197
|
+
// Note: getCount() might include inherited entries, so we need a better way
|
|
198
|
+
// to check if this layer has modifications. This depends on inheritree's API.
|
|
199
|
+
// For now, assume any count > 0 means changes (might need refinement)
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Check secondary indexes for changes
|
|
204
|
+
for (const memoryIndex of this.secondaryIndexes.values()) {
|
|
205
|
+
if (memoryIndex.size > 0) {
|
|
206
|
+
// Same caveat as above - this might include inherited entries
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Detaches this layer's BTrees from their base, making them self-contained.
|
|
216
|
+
* This should be called when the layer becomes the new effective base.
|
|
217
|
+
*/
|
|
218
|
+
public clearBase(): void {
|
|
219
|
+
// Clear base for primary modifications
|
|
220
|
+
if (typeof (this.primaryModifications as any).clearBase === 'function') {
|
|
221
|
+
(this.primaryModifications as any).clearBase();
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Clear base for secondary indexes
|
|
225
|
+
for (const memoryIndex of this.secondaryIndexes.values()) {
|
|
226
|
+
memoryIndex.clearBase();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|