@quereus/quereus 0.16.4 → 0.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +372 -345
- package/dist/src/common/errors.d.ts +2 -18
- package/dist/src/common/errors.d.ts.map +1 -1
- package/dist/src/common/errors.js +6 -29
- package/dist/src/common/errors.js.map +1 -1
- package/dist/src/common/types.d.ts +8 -0
- package/dist/src/common/types.d.ts.map +1 -1
- package/dist/src/common/types.js +20 -0
- package/dist/src/common/types.js.map +1 -1
- package/dist/src/core/database-assertions.d.ts +19 -2
- package/dist/src/core/database-assertions.d.ts.map +1 -1
- package/dist/src/core/database-assertions.js +113 -32
- package/dist/src/core/database-assertions.js.map +1 -1
- package/dist/src/core/database-events.d.ts +17 -0
- package/dist/src/core/database-events.d.ts.map +1 -1
- package/dist/src/core/database-events.js +39 -2
- package/dist/src/core/database-events.js.map +1 -1
- package/dist/src/core/database-transaction.d.ts +31 -4
- package/dist/src/core/database-transaction.d.ts.map +1 -1
- package/dist/src/core/database-transaction.js +68 -2
- package/dist/src/core/database-transaction.js.map +1 -1
- package/dist/src/core/database.d.ts +17 -4
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +189 -154
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/statement.d.ts +8 -2
- package/dist/src/core/statement.d.ts.map +1 -1
- package/dist/src/core/statement.js +54 -71
- package/dist/src/core/statement.js.map +1 -1
- package/dist/src/emit/ast-stringify.d.ts +1 -0
- package/dist/src/emit/ast-stringify.d.ts.map +1 -1
- package/dist/src/emit/ast-stringify.js +12 -2
- package/dist/src/emit/ast-stringify.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 +75 -0
- package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
- package/dist/src/func/builtins/conversion.js +9 -12
- package/dist/src/func/builtins/conversion.js.map +1 -1
- package/dist/src/func/builtins/datetime.d.ts +21 -0
- package/dist/src/func/builtins/datetime.d.ts.map +1 -1
- package/dist/src/func/builtins/datetime.js +452 -368
- package/dist/src/func/builtins/datetime.js.map +1 -1
- package/dist/src/func/builtins/explain.d.ts.map +1 -1
- package/dist/src/func/builtins/explain.js +15 -3
- 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 -12
- package/dist/src/func/builtins/index.js.map +1 -1
- package/dist/src/func/builtins/json-helpers.js +1 -1
- package/dist/src/func/builtins/json-helpers.js.map +1 -1
- package/dist/src/func/builtins/json.d.ts.map +1 -1
- package/dist/src/func/builtins/json.js +2 -5
- 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 +30 -32
- package/dist/src/func/builtins/schema.js.map +1 -1
- package/dist/src/func/builtins/string.d.ts.map +1 -1
- package/dist/src/func/builtins/string.js +40 -64
- package/dist/src/func/builtins/string.js.map +1 -1
- package/dist/src/func/builtins/timespan.d.ts.map +1 -1
- package/dist/src/func/builtins/timespan.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 +9 -2
- package/dist/src/parser/ast.d.ts.map +1 -1
- package/dist/src/parser/lexer.d.ts +1 -0
- package/dist/src/parser/lexer.d.ts.map +1 -1
- package/dist/src/parser/lexer.js +3 -0
- package/dist/src/parser/lexer.js.map +1 -1
- package/dist/src/parser/parser.d.ts +11 -1
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +75 -135
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/planner/analysis/const-evaluator.d.ts.map +1 -1
- package/dist/src/planner/analysis/const-evaluator.js +6 -3
- package/dist/src/planner/analysis/const-evaluator.js.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts +2 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +154 -22
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/building/alter-table.d.ts.map +1 -1
- package/dist/src/planner/building/alter-table.js +18 -1
- package/dist/src/planner/building/alter-table.js.map +1 -1
- package/dist/src/planner/building/analyze.d.ts +5 -0
- package/dist/src/planner/building/analyze.d.ts.map +1 -0
- package/dist/src/planner/building/analyze.js +5 -0
- package/dist/src/planner/building/analyze.js.map +1 -0
- package/dist/src/planner/building/block.d.ts.map +1 -1
- package/dist/src/planner/building/block.js +3 -0
- package/dist/src/planner/building/block.js.map +1 -1
- package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
- package/dist/src/planner/building/constraint-builder.js +25 -3
- package/dist/src/planner/building/constraint-builder.js.map +1 -1
- package/dist/src/planner/building/delete.d.ts.map +1 -1
- package/dist/src/planner/building/delete.js +11 -0
- package/dist/src/planner/building/delete.js.map +1 -1
- package/dist/src/planner/building/drop-assertion.d.ts.map +1 -1
- package/dist/src/planner/building/drop-assertion.js +2 -1
- package/dist/src/planner/building/drop-assertion.js.map +1 -1
- package/dist/src/planner/building/expression.d.ts.map +1 -1
- package/dist/src/planner/building/expression.js +55 -7
- package/dist/src/planner/building/expression.js.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.d.ts +16 -0
- package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -0
- package/dist/src/planner/building/foreign-key-builder.js +269 -0
- package/dist/src/planner/building/foreign-key-builder.js.map +1 -0
- package/dist/src/planner/building/function-call.d.ts.map +1 -1
- package/dist/src/planner/building/function-call.js +3 -2
- 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 +91 -10
- package/dist/src/planner/building/insert.js.map +1 -1
- package/dist/src/planner/building/schema-resolution.d.ts +4 -0
- package/dist/src/planner/building/schema-resolution.d.ts.map +1 -1
- package/dist/src/planner/building/schema-resolution.js +14 -3
- package/dist/src/planner/building/schema-resolution.js.map +1 -1
- package/dist/src/planner/building/select-aggregates.d.ts +1 -0
- package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.js +118 -3
- package/dist/src/planner/building/select-aggregates.js.map +1 -1
- package/dist/src/planner/building/select-modifiers.js +3 -3
- package/dist/src/planner/building/select-modifiers.js.map +1 -1
- package/dist/src/planner/building/select-window.js +9 -8
- package/dist/src/planner/building/select-window.js.map +1 -1
- package/dist/src/planner/building/select.d.ts.map +1 -1
- package/dist/src/planner/building/select.js +21 -10
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/building/table.d.ts.map +1 -1
- package/dist/src/planner/building/table.js +5 -3
- 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 +30 -1
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/building/with.js +1 -1
- package/dist/src/planner/building/with.js.map +1 -1
- package/dist/src/planner/cache/reference-graph.d.ts +1 -1
- package/dist/src/planner/cache/reference-graph.js +1 -1
- package/dist/src/planner/cost/index.d.ts +10 -3
- package/dist/src/planner/cost/index.d.ts.map +1 -1
- package/dist/src/planner/cost/index.js +17 -3
- package/dist/src/planner/cost/index.js.map +1 -1
- package/dist/src/planner/debug.js +1 -1
- package/dist/src/planner/debug.js.map +1 -1
- package/dist/src/planner/framework/characteristics.d.ts +1 -1
- package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
- package/dist/src/planner/framework/pass.d.ts +3 -1
- package/dist/src/planner/framework/pass.d.ts.map +1 -1
- package/dist/src/planner/framework/pass.js +62 -18
- package/dist/src/planner/framework/pass.js.map +1 -1
- package/dist/src/planner/framework/physical-utils.d.ts +5 -0
- package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
- package/dist/src/planner/framework/physical-utils.js +19 -0
- package/dist/src/planner/framework/physical-utils.js.map +1 -1
- package/dist/src/planner/framework/trace.d.ts.map +1 -1
- package/dist/src/planner/framework/trace.js +3 -2
- package/dist/src/planner/framework/trace.js.map +1 -1
- package/dist/src/planner/nodes/alias-node.d.ts +2 -1
- package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/alias-node.js +8 -0
- package/dist/src/planner/nodes/alias-node.js.map +1 -1
- package/dist/src/planner/nodes/alter-table-node.d.ts +42 -0
- package/dist/src/planner/nodes/alter-table-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/alter-table-node.js +55 -0
- package/dist/src/planner/nodes/alter-table-node.js.map +1 -0
- package/dist/src/planner/nodes/analyze-node.d.ts +25 -0
- package/dist/src/planner/nodes/analyze-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/analyze-node.js +83 -0
- package/dist/src/planner/nodes/analyze-node.js.map +1 -0
- package/dist/src/planner/nodes/bloom-join-node.d.ts +66 -0
- package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/bloom-join-node.js +200 -0
- package/dist/src/planner/nodes/bloom-join-node.js.map +1 -0
- package/dist/src/planner/nodes/constraint-check-node.d.ts +1 -1
- package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/cte-reference-node.js +7 -7
- package/dist/src/planner/nodes/cte-reference-node.js.map +1 -1
- package/dist/src/planner/nodes/join-node.d.ts +9 -1
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +69 -79
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.d.ts +60 -0
- package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/merge-join-node.js +207 -0
- package/dist/src/planner/nodes/merge-join-node.js.map +1 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts +1 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.js +1 -0
- package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
- package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/project-node.js +3 -2
- package/dist/src/planner/nodes/project-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts +2 -1
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +6 -2
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/returning-node.js +3 -2
- package/dist/src/planner/nodes/returning-node.js.map +1 -1
- package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/subquery.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/nodes/update-node.d.ts +2 -0
- package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/update-node.js +2 -1
- package/dist/src/planner/nodes/update-node.js.map +1 -1
- package/dist/src/planner/nodes/window-function.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-function.js +7 -7
- package/dist/src/planner/nodes/window-function.js.map +1 -1
- package/dist/src/planner/nodes/window-node.d.ts +2 -2
- package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-node.js +9 -14
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +40 -2
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/planning-context.d.ts.map +1 -1
- package/dist/src/planner/planning-context.js +1 -6
- package/dist/src/planner/planning-context.js.map +1 -1
- package/dist/src/planner/resolve.d.ts.map +1 -1
- package/dist/src/planner/resolve.js.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js +157 -28
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js +27 -6
- package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-in-subquery-cache.d.ts +19 -0
- package/dist/src/planner/rules/cache/rule-in-subquery-cache.d.ts.map +1 -0
- package/dist/src/planner/rules/cache/rule-in-subquery-cache.js +53 -0
- package/dist/src/planner/rules/cache/rule-in-subquery-cache.js.map +1 -0
- 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 +5 -0
- package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js.map +1 -1
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts +18 -0
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts.map +1 -0
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.js +37 -0
- package/dist/src/planner/rules/distinct/rule-distinct-elimination.js.map +1 -0
- package/dist/src/planner/rules/join/rule-join-key-inference.d.ts +8 -3
- package/dist/src/planner/rules/join/rule-join-key-inference.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-key-inference.js +28 -17
- package/dist/src/planner/rules/join/rule-join-key-inference.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts +16 -0
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-join-physical-selection.js +216 -0
- package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -0
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +34 -4
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts +23 -0
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -0
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +293 -0
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -0
- package/dist/src/planner/scopes/multi.d.ts +3 -2
- package/dist/src/planner/scopes/multi.d.ts.map +1 -1
- package/dist/src/planner/scopes/multi.js +32 -7
- package/dist/src/planner/scopes/multi.js.map +1 -1
- package/dist/src/planner/scopes/shadow.d.ts +20 -0
- package/dist/src/planner/scopes/shadow.d.ts.map +1 -0
- package/dist/src/planner/scopes/shadow.js +31 -0
- package/dist/src/planner/scopes/shadow.js.map +1 -0
- package/dist/src/planner/stats/analyze.d.ts +17 -0
- package/dist/src/planner/stats/analyze.d.ts.map +1 -0
- package/dist/src/planner/stats/analyze.js +114 -0
- package/dist/src/planner/stats/analyze.js.map +1 -0
- package/dist/src/planner/stats/catalog-stats.d.ts +80 -0
- package/dist/src/planner/stats/catalog-stats.d.ts.map +1 -0
- package/dist/src/planner/stats/catalog-stats.js +248 -0
- package/dist/src/planner/stats/catalog-stats.js.map +1 -0
- package/dist/src/planner/stats/histogram.d.ts +24 -0
- package/dist/src/planner/stats/histogram.d.ts.map +1 -0
- package/dist/src/planner/stats/histogram.js +142 -0
- package/dist/src/planner/stats/histogram.js.map +1 -0
- package/dist/src/planner/type-utils.d.ts.map +1 -1
- package/dist/src/planner/type-utils.js +8 -2
- package/dist/src/planner/type-utils.js.map +1 -1
- package/dist/src/planner/util/key-utils.d.ts +48 -2
- package/dist/src/planner/util/key-utils.d.ts.map +1 -1
- package/dist/src/planner/util/key-utils.js +123 -0
- package/dist/src/planner/util/key-utils.js.map +1 -1
- package/dist/src/planner/validation/determinism-validator.d.ts +9 -0
- package/dist/src/planner/validation/determinism-validator.d.ts.map +1 -1
- package/dist/src/planner/validation/determinism-validator.js +11 -0
- package/dist/src/planner/validation/determinism-validator.js.map +1 -1
- 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/context-helpers.d.ts +34 -10
- package/dist/src/runtime/context-helpers.d.ts.map +1 -1
- package/dist/src/runtime/context-helpers.js +115 -39
- package/dist/src/runtime/context-helpers.js.map +1 -1
- package/dist/src/runtime/deferred-constraint-queue.d.ts +0 -1
- package/dist/src/runtime/deferred-constraint-queue.d.ts.map +1 -1
- package/dist/src/runtime/deferred-constraint-queue.js +10 -23
- package/dist/src/runtime/deferred-constraint-queue.js.map +1 -1
- package/dist/src/runtime/descriptor-helpers.d.ts +7 -0
- package/dist/src/runtime/descriptor-helpers.d.ts.map +1 -0
- package/dist/src/runtime/descriptor-helpers.js +24 -0
- package/dist/src/runtime/descriptor-helpers.js.map +1 -0
- package/dist/src/runtime/emission-context.d.ts +7 -1
- package/dist/src/runtime/emission-context.d.ts.map +1 -1
- package/dist/src/runtime/emission-context.js +16 -0
- package/dist/src/runtime/emission-context.js.map +1 -1
- package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
- package/dist/src/runtime/emit/aggregate.js +97 -93
- package/dist/src/runtime/emit/aggregate.js.map +1 -1
- package/dist/src/runtime/emit/alter-table.d.ts +5 -0
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -0
- package/dist/src/runtime/emit/alter-table.js +209 -0
- package/dist/src/runtime/emit/alter-table.js.map +1 -0
- package/dist/src/runtime/emit/analyze.d.ts +9 -0
- package/dist/src/runtime/emit/analyze.d.ts.map +1 -0
- package/dist/src/runtime/emit/analyze.js +72 -0
- package/dist/src/runtime/emit/analyze.js.map +1 -0
- package/dist/src/runtime/emit/array-index.d.ts.map +1 -1
- package/dist/src/runtime/emit/array-index.js +4 -2
- package/dist/src/runtime/emit/array-index.js.map +1 -1
- package/dist/src/runtime/emit/between.d.ts.map +1 -1
- package/dist/src/runtime/emit/between.js +8 -20
- package/dist/src/runtime/emit/between.js.map +1 -1
- package/dist/src/runtime/emit/binary.d.ts.map +1 -1
- package/dist/src/runtime/emit/binary.js +155 -126
- package/dist/src/runtime/emit/binary.js.map +1 -1
- package/dist/src/runtime/emit/bloom-join.d.ts +12 -0
- package/dist/src/runtime/emit/bloom-join.d.ts.map +1 -0
- package/dist/src/runtime/emit/bloom-join.js +114 -0
- package/dist/src/runtime/emit/bloom-join.js.map +1 -0
- package/dist/src/runtime/emit/cache.js +2 -2
- 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 +31 -117
- 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 +2 -24
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/cte-reference.d.ts.map +1 -1
- package/dist/src/runtime/emit/cte-reference.js +11 -5
- package/dist/src/runtime/emit/cte-reference.js.map +1 -1
- package/dist/src/runtime/emit/distinct.d.ts.map +1 -1
- package/dist/src/runtime/emit/distinct.js +21 -12
- 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 +5 -1
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/drop-assertion.d.ts.map +1 -1
- package/dist/src/runtime/emit/drop-assertion.js +2 -0
- package/dist/src/runtime/emit/drop-assertion.js.map +1 -1
- package/dist/src/runtime/emit/filter.d.ts.map +1 -1
- package/dist/src/runtime/emit/filter.js +26 -7
- package/dist/src/runtime/emit/filter.js.map +1 -1
- package/dist/src/runtime/emit/internal-recursive-cte-ref.d.ts.map +1 -1
- package/dist/src/runtime/emit/internal-recursive-cte-ref.js +11 -5
- package/dist/src/runtime/emit/internal-recursive-cte-ref.js.map +1 -1
- package/dist/src/runtime/emit/join.d.ts +1 -1
- package/dist/src/runtime/emit/join.d.ts.map +1 -1
- package/dist/src/runtime/emit/join.js +44 -33
- package/dist/src/runtime/emit/join.js.map +1 -1
- package/dist/src/runtime/emit/merge-join.d.ts +14 -0
- package/dist/src/runtime/emit/merge-join.d.ts.map +1 -0
- package/dist/src/runtime/emit/merge-join.js +152 -0
- package/dist/src/runtime/emit/merge-join.js.map +1 -0
- package/dist/src/runtime/emit/parameter.d.ts.map +1 -1
- package/dist/src/runtime/emit/parameter.js +10 -32
- package/dist/src/runtime/emit/parameter.js.map +1 -1
- package/dist/src/runtime/emit/project.d.ts.map +1 -1
- package/dist/src/runtime/emit/project.js +22 -12
- 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 +5 -9
- package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
- package/dist/src/runtime/emit/returning.d.ts.map +1 -1
- package/dist/src/runtime/emit/returning.js +14 -8
- package/dist/src/runtime/emit/returning.js.map +1 -1
- package/dist/src/runtime/emit/scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/scan.js +4 -1
- package/dist/src/runtime/emit/scan.js.map +1 -1
- package/dist/src/runtime/emit/set-operation.d.ts.map +1 -1
- package/dist/src/runtime/emit/set-operation.js +8 -5
- package/dist/src/runtime/emit/set-operation.js.map +1 -1
- package/dist/src/runtime/emit/sort.js +2 -2
- package/dist/src/runtime/emit/sort.js.map +1 -1
- package/dist/src/runtime/emit/subquery.js +2 -2
- package/dist/src/runtime/emit/subquery.js.map +1 -1
- package/dist/src/runtime/emit/table-valued-function.d.ts.map +1 -1
- package/dist/src/runtime/emit/table-valued-function.js +21 -7
- package/dist/src/runtime/emit/table-valued-function.js.map +1 -1
- package/dist/src/runtime/emit/transaction.d.ts.map +1 -1
- package/dist/src/runtime/emit/transaction.js +18 -46
- package/dist/src/runtime/emit/transaction.js.map +1 -1
- package/dist/src/runtime/emit/unary.js +2 -2
- package/dist/src/runtime/emit/unary.js.map +1 -1
- package/dist/src/runtime/emit/update.d.ts.map +1 -1
- package/dist/src/runtime/emit/update.js +43 -21
- package/dist/src/runtime/emit/update.js.map +1 -1
- package/dist/src/runtime/emit/window.d.ts.map +1 -1
- package/dist/src/runtime/emit/window.js +368 -126
- package/dist/src/runtime/emit/window.js.map +1 -1
- package/dist/src/runtime/foreign-key-actions.d.ts +15 -0
- package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -0
- package/dist/src/runtime/foreign-key-actions.js +109 -0
- package/dist/src/runtime/foreign-key-actions.js.map +1 -0
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +8 -0
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/runtime/scheduler.d.ts.map +1 -1
- package/dist/src/runtime/scheduler.js +4 -1
- package/dist/src/runtime/scheduler.js.map +1 -1
- package/dist/src/runtime/types.d.ts +6 -5
- package/dist/src/runtime/types.d.ts.map +1 -1
- package/dist/src/runtime/types.js.map +1 -1
- package/dist/src/schema/change-events.d.ts +36 -8
- package/dist/src/schema/change-events.d.ts.map +1 -1
- package/dist/src/schema/change-events.js.map +1 -1
- package/dist/src/schema/column.d.ts +5 -1
- package/dist/src/schema/column.d.ts.map +1 -1
- package/dist/src/schema/column.js +1 -2
- package/dist/src/schema/column.js.map +1 -1
- package/dist/src/schema/manager.d.ts +54 -4
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +353 -313
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/schema-differ.js +3 -3
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/schema.d.ts +1 -1
- package/dist/src/schema/schema.js +2 -2
- package/dist/src/schema/schema.js.map +1 -1
- package/dist/src/schema/table.d.ts +49 -0
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +30 -11
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/types/builtin-types.d.ts.map +1 -1
- package/dist/src/types/builtin-types.js +26 -95
- package/dist/src/types/builtin-types.js.map +1 -1
- package/dist/src/types/index.d.ts +1 -1
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/index.js +1 -1
- package/dist/src/types/index.js.map +1 -1
- package/dist/src/types/json-type.d.ts.map +1 -1
- package/dist/src/types/json-type.js +28 -40
- package/dist/src/types/json-type.js.map +1 -1
- package/dist/src/types/logical-type.d.ts +6 -0
- package/dist/src/types/logical-type.d.ts.map +1 -1
- package/dist/src/types/logical-type.js +12 -0
- package/dist/src/types/logical-type.js.map +1 -1
- package/dist/src/types/temporal-types.d.ts.map +1 -1
- package/dist/src/types/temporal-types.js +8 -37
- package/dist/src/types/temporal-types.js.map +1 -1
- package/dist/src/util/async-iterator.d.ts +30 -0
- package/dist/src/util/async-iterator.d.ts.map +1 -0
- package/dist/src/util/async-iterator.js +101 -0
- package/dist/src/util/async-iterator.js.map +1 -0
- package/dist/src/util/coercion.d.ts +4 -5
- package/dist/src/util/coercion.d.ts.map +1 -1
- package/dist/src/util/coercion.js +10 -14
- package/dist/src/util/coercion.js.map +1 -1
- package/dist/src/util/comparison.d.ts +34 -21
- package/dist/src/util/comparison.d.ts.map +1 -1
- package/dist/src/util/comparison.js +77 -43
- package/dist/src/util/comparison.js.map +1 -1
- package/dist/src/util/environment.d.ts +0 -8
- package/dist/src/util/environment.d.ts.map +1 -1
- package/dist/src/util/environment.js +0 -12
- package/dist/src/util/environment.js.map +1 -1
- package/dist/src/util/key-serializer.d.ts +33 -0
- package/dist/src/util/key-serializer.d.ts.map +1 -0
- package/dist/src/util/key-serializer.js +95 -0
- package/dist/src/util/key-serializer.js.map +1 -0
- package/dist/src/util/plugin-helper.d.ts.map +1 -1
- package/dist/src/util/plugin-helper.js +21 -45
- package/dist/src/util/plugin-helper.js.map +1 -1
- package/dist/src/util/serialization.d.ts +1 -0
- package/dist/src/util/serialization.d.ts.map +1 -1
- package/dist/src/util/serialization.js +8 -1
- package/dist/src/util/serialization.js.map +1 -1
- package/dist/src/util/working-table-iterable.d.ts +6 -5
- package/dist/src/util/working-table-iterable.d.ts.map +1 -1
- package/dist/src/util/working-table-iterable.js +8 -15
- package/dist/src/util/working-table-iterable.js.map +1 -1
- package/dist/src/vtab/best-access-plan.d.ts +12 -0
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js +22 -0
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/events.d.ts.map +1 -1
- package/dist/src/vtab/events.js +6 -3
- package/dist/src/vtab/events.js.map +1 -1
- package/dist/src/vtab/manifest.d.ts +3 -1
- package/dist/src/vtab/manifest.d.ts.map +1 -1
- package/dist/src/vtab/memory/index.d.ts +2 -2
- package/dist/src/vtab/memory/index.d.ts.map +1 -1
- package/dist/src/vtab/memory/index.js +4 -7
- package/dist/src/vtab/memory/index.js.map +1 -1
- package/dist/src/vtab/memory/layer/base-cursor.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base-cursor.js +37 -9
- package/dist/src/vtab/memory/layer/base-cursor.js.map +1 -1
- package/dist/src/vtab/memory/layer/base.js +1 -1
- package/dist/src/vtab/memory/layer/base.js.map +1 -1
- package/dist/src/vtab/memory/layer/connection.d.ts +11 -7
- package/dist/src/vtab/memory/layer/connection.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/connection.js +32 -44
- package/dist/src/vtab/memory/layer/connection.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +15 -3
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +85 -37
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/layer/scan-plan.d.ts +2 -0
- package/dist/src/vtab/memory/layer/scan-plan.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/scan-plan.js +153 -78
- package/dist/src/vtab/memory/layer/scan-plan.js.map +1 -1
- package/dist/src/vtab/memory/layer/transaction-cursor.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/transaction-cursor.js +39 -9
- package/dist/src/vtab/memory/layer/transaction-cursor.js.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.d.ts +1 -0
- package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.js +6 -20
- package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts +14 -24
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +88 -283
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/memory/table.d.ts +9 -0
- package/dist/src/vtab/memory/table.d.ts.map +1 -1
- package/dist/src/vtab/memory/table.js +121 -18
- package/dist/src/vtab/memory/table.js.map +1 -1
- package/dist/src/vtab/memory/types.d.ts +1 -0
- package/dist/src/vtab/memory/types.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/primary-key.js.map +1 -1
- package/dist/src/vtab/module.d.ts +13 -0
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/dist/src/vtab/table.d.ts +9 -0
- package/dist/src/vtab/table.d.ts.map +1 -1
- package/dist/src/vtab/table.js.map +1 -1
- package/package.json +2 -2
|
@@ -20,6 +20,7 @@ export class TransactionLayer {
|
|
|
20
20
|
// Secondary index BTrees that inherit from parent's indexes
|
|
21
21
|
secondaryIndexes;
|
|
22
22
|
_isCommitted = false;
|
|
23
|
+
_hasModifications = false;
|
|
23
24
|
/** Pending changes for event emission. Null if tracking disabled. */
|
|
24
25
|
pendingChanges = null;
|
|
25
26
|
// Cache for BTree funcs to avoid recalculation
|
|
@@ -101,6 +102,7 @@ export class TransactionLayer {
|
|
|
101
102
|
if (source.pendingChanges) {
|
|
102
103
|
this.pendingChanges = [...source.pendingChanges];
|
|
103
104
|
}
|
|
105
|
+
this._hasModifications = source._hasModifications;
|
|
104
106
|
}
|
|
105
107
|
getPkExtractorsAndComparators(schema) {
|
|
106
108
|
if (schema !== this.tableSchemaAtCreation) {
|
|
@@ -126,6 +128,7 @@ export class TransactionLayer {
|
|
|
126
128
|
recordUpsert(primaryKey, newRowData, oldRowDataIfUpdate) {
|
|
127
129
|
if (this._isCommitted)
|
|
128
130
|
throw new QuereusError("Cannot modify a committed layer");
|
|
131
|
+
this._hasModifications = true;
|
|
129
132
|
this.primaryModifications.upsert(newRowData);
|
|
130
133
|
// Track change for event emission
|
|
131
134
|
if (this.pendingChanges) {
|
|
@@ -168,6 +171,7 @@ export class TransactionLayer {
|
|
|
168
171
|
recordDelete(primaryKey, oldRowDataForIndexes) {
|
|
169
172
|
if (this._isCommitted)
|
|
170
173
|
throw new QuereusError("Cannot modify a committed layer");
|
|
174
|
+
this._hasModifications = true;
|
|
171
175
|
// Find the existing entry
|
|
172
176
|
const existingPath = this.primaryModifications.find(primaryKey);
|
|
173
177
|
if (existingPath.on) {
|
|
@@ -197,32 +201,14 @@ export class TransactionLayer {
|
|
|
197
201
|
}
|
|
198
202
|
}
|
|
199
203
|
hasChanges() {
|
|
200
|
-
|
|
201
|
-
if (this.primaryModifications.getCount() > 0) {
|
|
202
|
-
// Note: getCount() might include inherited entries, so we need a better way
|
|
203
|
-
// to check if this layer has modifications. This depends on inheritree's API.
|
|
204
|
-
// For now, assume any count > 0 means changes (might need refinement)
|
|
205
|
-
return true;
|
|
206
|
-
}
|
|
207
|
-
// Check secondary indexes for changes
|
|
208
|
-
for (const memoryIndex of this.secondaryIndexes.values()) {
|
|
209
|
-
if (memoryIndex.size > 0) {
|
|
210
|
-
// Same caveat as above - this might include inherited entries
|
|
211
|
-
return true;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
return false;
|
|
204
|
+
return this._hasModifications;
|
|
215
205
|
}
|
|
216
206
|
/**
|
|
217
207
|
* Detaches this layer's BTrees from their base, making them self-contained.
|
|
218
208
|
* This should be called when the layer becomes the new effective base.
|
|
219
209
|
*/
|
|
220
210
|
clearBase() {
|
|
221
|
-
|
|
222
|
-
if (typeof this.primaryModifications.clearBase === 'function') {
|
|
223
|
-
this.primaryModifications.clearBase();
|
|
224
|
-
}
|
|
225
|
-
// Clear base for secondary indexes
|
|
211
|
+
this.primaryModifications.clearBase();
|
|
226
212
|
for (const memoryIndex of this.secondaryIndexes.values()) {
|
|
227
213
|
memoryIndex.clearBase();
|
|
228
214
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../../../src/vtab/memory/layer/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI1C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,MAAM,GAAG,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC;AAC1D,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAEnC,IAAI,uBAAuB,GAAG,IAAI,CAAC;AAYnC;;;;GAIG;AACH,MAAM,OAAO,gBAAgB;IACX,OAAO,CAAS;IACjB,WAAW,CAAQ;IAClB,qBAAqB,CAAc,CAAC,qCAAqC;IAE1F,wDAAwD;IAChD,oBAAoB,CAAiC;IAE7D,4DAA4D;IACpD,gBAAgB,CAA2B;IAE3C,YAAY,GAAY,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../../../../src/vtab/memory/layer/transaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Database } from '../../core/database.js';
|
|
2
2
|
import { type TableSchema, type IndexSchema } from '../../schema/table.js';
|
|
3
3
|
import { MemoryTable } from './table.js';
|
|
4
|
-
import type { VirtualTableModule } from '../module.js';
|
|
4
|
+
import type { VirtualTableModule, SchemaChangeInfo } from '../module.js';
|
|
5
5
|
import { MemoryTableManager } from './layer/manager.js';
|
|
6
6
|
import type { MemoryTableConfig } from './types.js';
|
|
7
7
|
import type { BestAccessPlanRequest, BestAccessPlanResult } from '../best-access-plan.js';
|
|
@@ -32,15 +32,11 @@ export declare class MemoryTableModule implements VirtualTableModule<MemoryTable
|
|
|
32
32
|
/**
|
|
33
33
|
* Connects to an existing memory table definition
|
|
34
34
|
*/
|
|
35
|
-
connect(db: Database, pAux: unknown, moduleName: string, schemaName: string, tableName: string,
|
|
35
|
+
connect(db: Database, pAux: unknown, moduleName: string, schemaName: string, tableName: string, options: MemoryTableConfig, _tableSchema?: TableSchema): Promise<MemoryTable>;
|
|
36
36
|
/**
|
|
37
37
|
* Modern, type-safe access planning interface
|
|
38
38
|
*/
|
|
39
39
|
getBestAccessPlan(db: Database, tableInfo: TableSchema, request: BestAccessPlanRequest): BestAccessPlanResult;
|
|
40
|
-
/**
|
|
41
|
-
* Build column metadata for access planning
|
|
42
|
-
*/
|
|
43
|
-
private buildColumnMetadata;
|
|
44
40
|
/**
|
|
45
41
|
* Find the best access plan for the given request
|
|
46
42
|
*/
|
|
@@ -50,7 +46,9 @@ export declare class MemoryTableModule implements VirtualTableModule<MemoryTable
|
|
|
50
46
|
*/
|
|
51
47
|
private evaluateIndexAccess;
|
|
52
48
|
/**
|
|
53
|
-
* Find equality matches for index columns
|
|
49
|
+
* Find equality matches for index columns (prefix matching).
|
|
50
|
+
* Handles `=`, single-value `IN`, and multi-value `IN` as equality constraints.
|
|
51
|
+
* Returns the total cardinality (product of IN list sizes) for cost estimation.
|
|
54
52
|
*/
|
|
55
53
|
private findEqualityMatches;
|
|
56
54
|
/**
|
|
@@ -65,28 +63,20 @@ export declare class MemoryTableModule implements VirtualTableModule<MemoryTable
|
|
|
65
63
|
* Check if an index can satisfy ordering requirements
|
|
66
64
|
*/
|
|
67
65
|
private indexSatisfiesOrdering;
|
|
68
|
-
private createPlanningContext;
|
|
69
66
|
private gatherAvailableIndexes;
|
|
70
|
-
private findBestPlan;
|
|
71
|
-
private createInitialPlan;
|
|
72
|
-
private evaluateIndexPlan;
|
|
73
|
-
private evaluateEqualityPlan;
|
|
74
|
-
private findEqualityConstraints;
|
|
75
|
-
private canUseEqualityPlan;
|
|
76
|
-
private evaluateRangePlan;
|
|
77
|
-
private findRangeBounds;
|
|
78
|
-
private evaluateOrderByConsumption;
|
|
79
|
-
private checkOrderByConsumption;
|
|
80
|
-
private adjustPlanTypeForOrder;
|
|
81
|
-
private ensureFallbackPlan;
|
|
82
|
-
private populateIndexInfoOutput;
|
|
83
|
-
private buildConstraintUsage;
|
|
84
|
-
private buildIndexString;
|
|
85
|
-
private createArgvMapping;
|
|
86
67
|
/**
|
|
87
68
|
* Destroys a memory table and frees associated resources
|
|
88
69
|
*/
|
|
89
70
|
destroy(db: Database, pAux: unknown, moduleName: string, schemaName: string, tableName: string): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Renames a memory table's internal registration key.
|
|
73
|
+
* Called by the ALTER TABLE RENAME TO emitter after schema update.
|
|
74
|
+
*/
|
|
75
|
+
renameTable(schemaName: string, oldName: string, newName: string): void;
|
|
76
|
+
/**
|
|
77
|
+
* Alters an existing memory table's structure (ADD/DROP/RENAME COLUMN).
|
|
78
|
+
*/
|
|
79
|
+
alterTable(db: Database, schemaName: string, tableName: string, change: SchemaChangeInfo): Promise<TableSchema>;
|
|
90
80
|
/**
|
|
91
81
|
* Creates an index on a memory table
|
|
92
82
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../src/vtab/memory/module.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAqB,MAAM,uBAAuB,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../src/vtab/memory/module.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAqB,MAAM,uBAAuB,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAqC,MAAM,wBAAwB,CAAC;AAC7H,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAI7D;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,kBAAkB,CAAC,WAAW,EAAE,iBAAiB,CAAC;IAC3F,SAAgB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAa;IACpE,OAAO,CAAC,YAAY,CAAC,CAAqB;gBAE9B,YAAY,CAAC,EAAE,kBAAkB;IAI7C;;OAEG;IACH,eAAe,IAAI,kBAAkB,GAAG,SAAS;IAIjD;;;OAGG;IACH,eAAe,IAAI,kBAAkB;IAUrC;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAuC1E;;OAEG;IACG,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,YAAY,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAcnL;;OAEG;IACH,iBAAiB,CAChB,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,qBAAqB,GAC5B,oBAAoB;IAmBvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8C1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAuD3B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAwC3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAwBtB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyB7B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqB9B,OAAO,CAAC,sBAAsB;IAgB9B;;OAEG;IACG,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBpH;;;OAGG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAWvE;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;IA0BrH;;OAEG;IACG,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAiB/G"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { QuereusError } from '../../common/errors.js';
|
|
2
2
|
import { StatusCode } from '../../common/types.js';
|
|
3
3
|
import { MemoryTable } from './table.js';
|
|
4
|
-
import { IndexConstraintOp } from '../../common/constants.js';
|
|
5
4
|
import { MemoryTableManager } from './layer/manager.js';
|
|
6
5
|
import { createMemoryTableLoggers } from './utils/logging.js';
|
|
7
6
|
import { AccessPlanBuilder, validateAccessPlan } from '../best-access-plan.js';
|
|
@@ -67,7 +66,7 @@ export class MemoryTableModule {
|
|
|
67
66
|
/**
|
|
68
67
|
* Connects to an existing memory table definition
|
|
69
68
|
*/
|
|
70
|
-
async connect(db, pAux, moduleName, schemaName, tableName,
|
|
69
|
+
async connect(db, pAux, moduleName, schemaName, tableName, options, _tableSchema) {
|
|
71
70
|
const tableKey = `${schemaName}.${tableName}`.toLowerCase();
|
|
72
71
|
const existingManager = this.tables.get(tableKey);
|
|
73
72
|
if (!existingManager) {
|
|
@@ -75,15 +74,17 @@ export class MemoryTableModule {
|
|
|
75
74
|
}
|
|
76
75
|
logger.operation('Connect Table', tableName, { schema: schemaName });
|
|
77
76
|
// Create a new MemoryTable instance connected to the existing manager
|
|
78
|
-
return new MemoryTable(db, this, existingManager);
|
|
77
|
+
return new MemoryTable(db, this, existingManager, options._readCommitted);
|
|
79
78
|
}
|
|
80
79
|
/**
|
|
81
80
|
* Modern, type-safe access planning interface
|
|
82
81
|
*/
|
|
83
82
|
getBestAccessPlan(db, tableInfo, request) {
|
|
84
83
|
logger.debugLog(`[getBestAccessPlan] Planning access for ${tableInfo.name} with ${request.filters.length} filters`);
|
|
85
|
-
// Get table size estimate for cost calculations
|
|
86
|
-
|
|
84
|
+
// Get table size estimate for cost calculations.
|
|
85
|
+
// The schema defaults estimatedRows to 0 at creation time, so treat 0 as
|
|
86
|
+
// "unknown" and fall back to a reasonable default to avoid degenerate costs.
|
|
87
|
+
const estimatedTableSize = request.estimatedRows || 1000;
|
|
87
88
|
// Find the best access strategy
|
|
88
89
|
const bestPlan = this.findBestAccessPlan(tableInfo, request, estimatedTableSize);
|
|
89
90
|
// Validate the plan before returning
|
|
@@ -91,22 +92,17 @@ export class MemoryTableModule {
|
|
|
91
92
|
logger.debugLog(`[getBestAccessPlan] Selected plan: ${bestPlan.explains} (cost: ${bestPlan.cost}, rows: ${bestPlan.rows})`);
|
|
92
93
|
return bestPlan;
|
|
93
94
|
}
|
|
94
|
-
/**
|
|
95
|
-
* Build column metadata for access planning
|
|
96
|
-
*/
|
|
97
|
-
buildColumnMetadata(tableInfo) {
|
|
98
|
-
return tableInfo.columns.map((col, index) => ({
|
|
99
|
-
index,
|
|
100
|
-
name: col.name,
|
|
101
|
-
type: col.logicalType,
|
|
102
|
-
isPrimaryKey: tableInfo.primaryKeyDefinition.some(pk => pk.index === index),
|
|
103
|
-
isUnique: col.primaryKey // Primary key columns are unique, others would be determined by constraints/indexes
|
|
104
|
-
}));
|
|
105
|
-
}
|
|
106
95
|
/**
|
|
107
96
|
* Find the best access plan for the given request
|
|
108
97
|
*/
|
|
109
98
|
findBestAccessPlan(tableInfo, request, estimatedTableSize) {
|
|
99
|
+
// NOTE: IS NULL / IS NOT NULL optimization is not yet wired up.
|
|
100
|
+
// The constraint extractor produces these as unary expressions which
|
|
101
|
+
// are not currently extracted as PredicateConstraints. When that support
|
|
102
|
+
// is added, a handleNullConstraints pre-pass should be re-introduced
|
|
103
|
+
// here — but it must also produce a proper empty-result physical node
|
|
104
|
+
// (not just rows=0 on a plan lacking indexName/seekColumnIndexes, which
|
|
105
|
+
// would fall through to SeqScan and return all rows).
|
|
110
106
|
const availableIndexes = this.gatherAvailableIndexes(tableInfo);
|
|
111
107
|
let bestPlan;
|
|
112
108
|
// Try to find an index-based plan
|
|
@@ -144,24 +140,36 @@ export class MemoryTableModule {
|
|
|
144
140
|
.setHandledFilters(new Array(request.filters.length).fill(false))
|
|
145
141
|
.build();
|
|
146
142
|
}
|
|
147
|
-
// Check for equality constraints on index columns
|
|
143
|
+
// Check for equality constraints on index columns (prefix matching)
|
|
148
144
|
const equalityMatches = this.findEqualityMatches(indexCols, request.filters);
|
|
149
145
|
if (equalityMatches.matchCount === indexCols.length) {
|
|
150
|
-
// Perfect equality match - index seek
|
|
146
|
+
// Perfect equality match on all index columns - index seek (or multi-seek for IN)
|
|
147
|
+
const seekCols = indexCols.slice(0, equalityMatches.matchCount).map(c => c.index);
|
|
148
|
+
const { inCardinality } = equalityMatches;
|
|
149
|
+
const isMultiSeek = inCardinality > 1;
|
|
151
150
|
return AccessPlanBuilder
|
|
152
|
-
.eqMatch(
|
|
151
|
+
.eqMatch(inCardinality)
|
|
153
152
|
.setHandledFilters(equalityMatches.handledFilters)
|
|
154
|
-
.setIsSet(
|
|
155
|
-
.
|
|
153
|
+
.setIsSet(!isMultiSeek)
|
|
154
|
+
.setIndexName(index.name)
|
|
155
|
+
.setSeekColumns(seekCols)
|
|
156
|
+
.setExplanation(`Index ${isMultiSeek ? `multi-seek(${inCardinality})` : 'seek'} on ${index.name}`)
|
|
156
157
|
.build();
|
|
157
158
|
}
|
|
159
|
+
// NOTE: Prefix-equality + trailing-range on composite indexes is not yet
|
|
160
|
+
// supported at the physical scan level (partial prefix seek on composite
|
|
161
|
+
// B-tree keys requires composite range bounds). Fall through to
|
|
162
|
+
// range-on-first-column check, which the runtime can execute correctly.
|
|
158
163
|
// Check for range constraints on first index column
|
|
159
164
|
const rangeMatch = this.findRangeMatch(indexCols[0], request.filters);
|
|
160
165
|
if (rangeMatch.hasRange) {
|
|
161
166
|
const estimatedRangeRows = Math.max(1, Math.floor(estimatedTableSize / 4));
|
|
167
|
+
const seekCols = [indexCols[0].index];
|
|
162
168
|
return AccessPlanBuilder
|
|
163
169
|
.rangeScan(estimatedRangeRows)
|
|
164
170
|
.setHandledFilters(rangeMatch.handledFilters)
|
|
171
|
+
.setIndexName(index.name)
|
|
172
|
+
.setSeekColumns(seekCols)
|
|
165
173
|
.setExplanation(`Index range scan on ${index.name}`)
|
|
166
174
|
.build();
|
|
167
175
|
}
|
|
@@ -172,30 +180,42 @@ export class MemoryTableModule {
|
|
|
172
180
|
.build();
|
|
173
181
|
}
|
|
174
182
|
/**
|
|
175
|
-
* Find equality matches for index columns
|
|
183
|
+
* Find equality matches for index columns (prefix matching).
|
|
184
|
+
* Handles `=`, single-value `IN`, and multi-value `IN` as equality constraints.
|
|
185
|
+
* Returns the total cardinality (product of IN list sizes) for cost estimation.
|
|
176
186
|
*/
|
|
177
187
|
findEqualityMatches(indexCols, filters) {
|
|
178
188
|
const handledFilters = new Array(filters.length).fill(false);
|
|
179
189
|
let matchCount = 0;
|
|
190
|
+
let inCardinality = 1;
|
|
180
191
|
for (const indexCol of indexCols) {
|
|
181
192
|
let foundMatch = false;
|
|
182
193
|
for (let i = 0; i < filters.length; i++) {
|
|
183
194
|
const filter = filters[i];
|
|
184
|
-
if (filter.columnIndex
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
195
|
+
if (filter.columnIndex !== indexCol.index || !filter.usable)
|
|
196
|
+
continue;
|
|
197
|
+
// Direct equality (value may be undefined for parameter bindings —
|
|
198
|
+
// the actual value is supplied at runtime via seek key expressions)
|
|
199
|
+
if (filter.op === '=') {
|
|
188
200
|
handledFilters[i] = true;
|
|
189
201
|
foundMatch = true;
|
|
190
202
|
matchCount++;
|
|
191
203
|
break;
|
|
192
204
|
}
|
|
205
|
+
// IN constraint — treat as equality for prefix matching
|
|
206
|
+
if (filter.op === 'IN' && Array.isArray(filter.value) && filter.value.length > 0) {
|
|
207
|
+
handledFilters[i] = true;
|
|
208
|
+
foundMatch = true;
|
|
209
|
+
matchCount++;
|
|
210
|
+
inCardinality *= filter.value.length;
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
193
213
|
}
|
|
194
214
|
if (!foundMatch) {
|
|
195
215
|
break; // Can't use remaining index columns
|
|
196
216
|
}
|
|
197
217
|
}
|
|
198
|
-
return { matchCount, handledFilters };
|
|
218
|
+
return { matchCount, handledFilters, inCardinality };
|
|
199
219
|
}
|
|
200
220
|
/**
|
|
201
221
|
* Find range match for a column
|
|
@@ -206,7 +226,7 @@ export class MemoryTableModule {
|
|
|
206
226
|
let hasUpper = false;
|
|
207
227
|
for (let i = 0; i < filters.length; i++) {
|
|
208
228
|
const filter = filters[i];
|
|
209
|
-
if (filter.columnIndex === indexCol.index && filter.usable
|
|
229
|
+
if (filter.columnIndex === indexCol.index && filter.usable) {
|
|
210
230
|
if (filter.op === '>' || filter.op === '>=') {
|
|
211
231
|
handledFilters[i] = true;
|
|
212
232
|
hasLower = true;
|
|
@@ -257,22 +277,6 @@ export class MemoryTableModule {
|
|
|
257
277
|
}
|
|
258
278
|
return true;
|
|
259
279
|
}
|
|
260
|
-
createPlanningContext(_tableInfo, _indexInfo) {
|
|
261
|
-
return {
|
|
262
|
-
// Plan type constants
|
|
263
|
-
PLAN_TYPE_FULL_ASC: 0,
|
|
264
|
-
PLAN_TYPE_FULL_DESC: 1,
|
|
265
|
-
PLAN_TYPE_EQ: 2,
|
|
266
|
-
PLAN_TYPE_RANGE_ASC: 3,
|
|
267
|
-
PLAN_TYPE_RANGE_DESC: 4,
|
|
268
|
-
// Utility functions
|
|
269
|
-
encodeIdxNum: (indexId, planType) => {
|
|
270
|
-
return (indexId << 3) | planType;
|
|
271
|
-
},
|
|
272
|
-
// Table size estimate for costing
|
|
273
|
-
tableSize: 1000,
|
|
274
|
-
};
|
|
275
|
-
}
|
|
276
280
|
gatherAvailableIndexes(tableInfo) {
|
|
277
281
|
const availableIndexes = [];
|
|
278
282
|
// Add pseudo-index for primary key
|
|
@@ -285,244 +289,6 @@ export class MemoryTableModule {
|
|
|
285
289
|
availableIndexes.push(...(tableInfo.indexes ?? []));
|
|
286
290
|
return availableIndexes;
|
|
287
291
|
}
|
|
288
|
-
findBestPlan(context, availableIndexes, indexInfo) {
|
|
289
|
-
let bestPlan = this.createInitialPlan(context);
|
|
290
|
-
for (const [indexId, index] of availableIndexes.entries()) {
|
|
291
|
-
const indexPlan = this.evaluateIndexPlan(context, index, indexId, indexInfo);
|
|
292
|
-
if (indexPlan.cost < bestPlan.cost) {
|
|
293
|
-
bestPlan = indexPlan;
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
return this.ensureFallbackPlan(bestPlan, context, availableIndexes);
|
|
297
|
-
}
|
|
298
|
-
createInitialPlan(context) {
|
|
299
|
-
return {
|
|
300
|
-
indexId: -1,
|
|
301
|
-
planType: context.PLAN_TYPE_FULL_ASC,
|
|
302
|
-
cost: context.tableSize * 10.0,
|
|
303
|
-
rows: BigInt(context.tableSize),
|
|
304
|
-
usedConstraintIndices: new Set(),
|
|
305
|
-
orderByConsumed: false,
|
|
306
|
-
isDesc: false,
|
|
307
|
-
};
|
|
308
|
-
}
|
|
309
|
-
evaluateIndexPlan(context, index, indexId, indexInfo) {
|
|
310
|
-
let currentPlan = this.createInitialPlan(context);
|
|
311
|
-
currentPlan.indexId = indexId;
|
|
312
|
-
// Evaluate equality plan
|
|
313
|
-
const equalityPlan = this.evaluateEqualityPlan(context, index, indexId, indexInfo);
|
|
314
|
-
if (equalityPlan && equalityPlan.cost < currentPlan.cost) {
|
|
315
|
-
currentPlan = equalityPlan;
|
|
316
|
-
}
|
|
317
|
-
// Evaluate range plan
|
|
318
|
-
const rangePlan = this.evaluateRangePlan(context, index, indexId, indexInfo, currentPlan);
|
|
319
|
-
if (rangePlan && rangePlan.cost < currentPlan.cost) {
|
|
320
|
-
currentPlan = rangePlan;
|
|
321
|
-
}
|
|
322
|
-
// Check ORDER BY consumption
|
|
323
|
-
const orderOptimizedPlan = this.evaluateOrderByConsumption(context, index, indexInfo, currentPlan);
|
|
324
|
-
if (orderOptimizedPlan) {
|
|
325
|
-
currentPlan = orderOptimizedPlan;
|
|
326
|
-
}
|
|
327
|
-
return currentPlan;
|
|
328
|
-
}
|
|
329
|
-
evaluateEqualityPlan(context, index, indexId, indexInfo) {
|
|
330
|
-
const indexCols = index.columns;
|
|
331
|
-
const eqConstraints = this.findEqualityConstraints(indexCols, indexInfo);
|
|
332
|
-
if (!this.canUseEqualityPlan(indexCols, eqConstraints)) {
|
|
333
|
-
logger.debugLog(`[xBestIndex] Cannot use EQ plan for index ${index.name} - missing constraints`);
|
|
334
|
-
return null;
|
|
335
|
-
}
|
|
336
|
-
const planEqCost = Math.log2(context.tableSize + 1) + 1.0;
|
|
337
|
-
const planEqRows = BigInt(1);
|
|
338
|
-
logger.debugLog(`[xBestIndex] EQ Plan viable for index ${index.name}. Cost: ${planEqCost}`);
|
|
339
|
-
return {
|
|
340
|
-
indexId: indexId,
|
|
341
|
-
planType: context.PLAN_TYPE_EQ,
|
|
342
|
-
cost: planEqCost,
|
|
343
|
-
rows: planEqRows,
|
|
344
|
-
usedConstraintIndices: new Set(eqConstraints.values()),
|
|
345
|
-
orderByConsumed: true,
|
|
346
|
-
isDesc: false
|
|
347
|
-
};
|
|
348
|
-
}
|
|
349
|
-
findEqualityConstraints(indexCols, indexInfo) {
|
|
350
|
-
const eqConstraints = new Map();
|
|
351
|
-
for (const [k, indexCol] of indexCols.entries()) {
|
|
352
|
-
const colIndex = indexCol.index;
|
|
353
|
-
let foundConstraint = false;
|
|
354
|
-
for (let i = 0; i < indexInfo.nConstraint; i++) {
|
|
355
|
-
const constraint = indexInfo.aConstraint[i];
|
|
356
|
-
if (constraint.iColumn === colIndex &&
|
|
357
|
-
constraint.op === IndexConstraintOp.EQ &&
|
|
358
|
-
constraint.usable) {
|
|
359
|
-
eqConstraints.set(colIndex, i);
|
|
360
|
-
foundConstraint = true;
|
|
361
|
-
logger.debugLog(`[xBestIndex] Found EQ constraint ${i} for column ${colIndex}`);
|
|
362
|
-
break;
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
if (!foundConstraint) {
|
|
366
|
-
logger.debugLog(`[xBestIndex] No EQ constraint for index column ${k} (schema idx ${colIndex})`);
|
|
367
|
-
return new Map(); // Can't use equality plan without all columns
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
return eqConstraints;
|
|
371
|
-
}
|
|
372
|
-
canUseEqualityPlan(indexCols, eqConstraints) {
|
|
373
|
-
return indexCols.length > 0 && eqConstraints.size === indexCols.length;
|
|
374
|
-
}
|
|
375
|
-
evaluateRangePlan(context, index, indexId, indexInfo, currentPlan) {
|
|
376
|
-
const indexCols = index.columns;
|
|
377
|
-
const firstIndexColIdx = indexCols[0]?.index ?? -2;
|
|
378
|
-
const rangeBounds = this.findRangeBounds(firstIndexColIdx, indexInfo);
|
|
379
|
-
if (!rangeBounds.lowerBound && !rangeBounds.upperBound) {
|
|
380
|
-
return null;
|
|
381
|
-
}
|
|
382
|
-
const planRangeRows = BigInt(Math.max(1, Math.floor(context.tableSize / 4)));
|
|
383
|
-
const planRangeCost = Math.log2(context.tableSize + 1) * 2.0 + Number(planRangeRows);
|
|
384
|
-
if (planRangeCost >= currentPlan.cost) {
|
|
385
|
-
return null;
|
|
386
|
-
}
|
|
387
|
-
const usedIndices = new Set();
|
|
388
|
-
if (rangeBounds.lowerBound)
|
|
389
|
-
usedIndices.add(rangeBounds.lowerBound.index);
|
|
390
|
-
if (rangeBounds.upperBound)
|
|
391
|
-
usedIndices.add(rangeBounds.upperBound.index);
|
|
392
|
-
return {
|
|
393
|
-
...currentPlan,
|
|
394
|
-
planType: context.PLAN_TYPE_RANGE_ASC,
|
|
395
|
-
cost: planRangeCost,
|
|
396
|
-
rows: planRangeRows,
|
|
397
|
-
usedConstraintIndices: usedIndices,
|
|
398
|
-
orderByConsumed: false
|
|
399
|
-
};
|
|
400
|
-
}
|
|
401
|
-
findRangeBounds(firstColIndex, indexInfo) {
|
|
402
|
-
let lowerBound = null;
|
|
403
|
-
let upperBound = null;
|
|
404
|
-
for (let i = 0; i < indexInfo.nConstraint; i++) {
|
|
405
|
-
const constraint = indexInfo.aConstraint[i];
|
|
406
|
-
if (constraint.iColumn === firstColIndex && constraint.usable) {
|
|
407
|
-
if (constraint.op === IndexConstraintOp.GT || constraint.op === IndexConstraintOp.GE) {
|
|
408
|
-
if (!lowerBound || constraint.op > lowerBound.op) {
|
|
409
|
-
lowerBound = { index: i, op: constraint.op };
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
else if (constraint.op === IndexConstraintOp.LT || constraint.op === IndexConstraintOp.LE) {
|
|
413
|
-
if (!upperBound || constraint.op < upperBound.op) {
|
|
414
|
-
upperBound = { index: i, op: constraint.op };
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
return { lowerBound, upperBound };
|
|
420
|
-
}
|
|
421
|
-
evaluateOrderByConsumption(context, index, indexInfo, currentPlan) {
|
|
422
|
-
if (indexInfo.nOrderBy === 0) {
|
|
423
|
-
return null;
|
|
424
|
-
}
|
|
425
|
-
const indexCols = index.columns;
|
|
426
|
-
const orderByConsumption = this.checkOrderByConsumption(indexCols, indexInfo);
|
|
427
|
-
if (!orderByConsumption.canConsume) {
|
|
428
|
-
return null;
|
|
429
|
-
}
|
|
430
|
-
const indexScanIsDesc = indexCols[0]?.desc ?? false;
|
|
431
|
-
const requiresDescScan = orderByConsumption.isDesc !== indexScanIsDesc;
|
|
432
|
-
const basePlanType = currentPlan.planType;
|
|
433
|
-
if (basePlanType === context.PLAN_TYPE_FULL_ASC || basePlanType === context.PLAN_TYPE_RANGE_ASC) {
|
|
434
|
-
return {
|
|
435
|
-
...currentPlan,
|
|
436
|
-
orderByConsumed: true,
|
|
437
|
-
isDesc: orderByConsumption.isDesc,
|
|
438
|
-
planType: this.adjustPlanTypeForOrder(context, basePlanType, requiresDescScan),
|
|
439
|
-
cost: currentPlan.cost * 0.9 // Prefer consuming order
|
|
440
|
-
};
|
|
441
|
-
}
|
|
442
|
-
return null;
|
|
443
|
-
}
|
|
444
|
-
checkOrderByConsumption(indexCols, indexInfo) {
|
|
445
|
-
if (indexInfo.nOrderBy === 0 || indexCols.length < indexInfo.nOrderBy) {
|
|
446
|
-
return { canConsume: false, isDesc: false };
|
|
447
|
-
}
|
|
448
|
-
const isOrderDesc = indexInfo.aOrderBy[0].desc;
|
|
449
|
-
for (let k = 0; k < indexInfo.nOrderBy; k++) {
|
|
450
|
-
const orderByCol = indexInfo.aOrderBy[k];
|
|
451
|
-
const indexCol = indexCols[k];
|
|
452
|
-
if (orderByCol.iColumn !== indexCol.index || orderByCol.desc !== isOrderDesc) {
|
|
453
|
-
return { canConsume: false, isDesc: false };
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
return { canConsume: true, isDesc: isOrderDesc };
|
|
457
|
-
}
|
|
458
|
-
adjustPlanTypeForOrder(context, basePlanType, requiresDescScan) {
|
|
459
|
-
if (basePlanType === context.PLAN_TYPE_FULL_ASC) {
|
|
460
|
-
return requiresDescScan ? context.PLAN_TYPE_FULL_DESC : context.PLAN_TYPE_FULL_ASC;
|
|
461
|
-
}
|
|
462
|
-
else { // RANGE_ASC
|
|
463
|
-
return requiresDescScan ? context.PLAN_TYPE_RANGE_DESC : context.PLAN_TYPE_RANGE_ASC;
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
ensureFallbackPlan(bestPlan, context, availableIndexes) {
|
|
467
|
-
if (bestPlan.indexId === -1) {
|
|
468
|
-
const primaryIndex = availableIndexes.findIndex(idx => idx.name === '_primary_');
|
|
469
|
-
bestPlan.indexId = primaryIndex >= 0 ? primaryIndex : 0;
|
|
470
|
-
bestPlan.planType = context.PLAN_TYPE_FULL_ASC;
|
|
471
|
-
bestPlan.cost = context.tableSize * 10.0;
|
|
472
|
-
bestPlan.rows = BigInt(context.tableSize);
|
|
473
|
-
bestPlan.usedConstraintIndices.clear();
|
|
474
|
-
bestPlan.orderByConsumed = false;
|
|
475
|
-
}
|
|
476
|
-
return bestPlan;
|
|
477
|
-
}
|
|
478
|
-
populateIndexInfoOutput(indexInfo, bestPlan, availableIndexes) {
|
|
479
|
-
const context = this.createPlanningContext({}, indexInfo);
|
|
480
|
-
indexInfo.idxNum = context.encodeIdxNum(bestPlan.indexId, bestPlan.planType);
|
|
481
|
-
indexInfo.estimatedCost = bestPlan.cost;
|
|
482
|
-
indexInfo.estimatedRows = bestPlan.rows;
|
|
483
|
-
indexInfo.orderByConsumed = bestPlan.orderByConsumed;
|
|
484
|
-
indexInfo.idxFlags = (bestPlan.planType === context.PLAN_TYPE_EQ) ? 1 : 0;
|
|
485
|
-
this.buildConstraintUsage(indexInfo, bestPlan);
|
|
486
|
-
this.buildIndexString(indexInfo, bestPlan, availableIndexes);
|
|
487
|
-
}
|
|
488
|
-
buildConstraintUsage(indexInfo, bestPlan) {
|
|
489
|
-
const constraintUsage = Array.from({ length: indexInfo.nConstraint }, () => ({
|
|
490
|
-
argvIndex: 0,
|
|
491
|
-
omit: false
|
|
492
|
-
}));
|
|
493
|
-
let currentArg = 1;
|
|
494
|
-
bestPlan.usedConstraintIndices.forEach((constraintIndex) => {
|
|
495
|
-
constraintUsage[constraintIndex].argvIndex = currentArg++;
|
|
496
|
-
constraintUsage[constraintIndex].omit = (bestPlan.planType === 2); // PLAN_TYPE_EQ
|
|
497
|
-
});
|
|
498
|
-
indexInfo.aConstraintUsage = constraintUsage;
|
|
499
|
-
}
|
|
500
|
-
buildIndexString(indexInfo, bestPlan, availableIndexes) {
|
|
501
|
-
const chosenIndex = availableIndexes[bestPlan.indexId];
|
|
502
|
-
const idxStrParts = [
|
|
503
|
-
`idx=${chosenIndex?.name ?? 'unknown'}(${bestPlan.indexId})`,
|
|
504
|
-
`plan=${bestPlan.planType}`
|
|
505
|
-
];
|
|
506
|
-
if (bestPlan.orderByConsumed) {
|
|
507
|
-
idxStrParts.push(`ordCons=${bestPlan.isDesc ? 'DESC' : 'ASC'}`);
|
|
508
|
-
}
|
|
509
|
-
if (bestPlan.usedConstraintIndices.size > 0) {
|
|
510
|
-
const argvMapping = this.createArgvMapping(indexInfo.aConstraintUsage);
|
|
511
|
-
if (argvMapping.length > 0) {
|
|
512
|
-
idxStrParts.push(`argvMap=[${argvMapping.join(',')}]`);
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
indexInfo.idxStr = idxStrParts.join(';');
|
|
516
|
-
}
|
|
517
|
-
createArgvMapping(constraintUsage) {
|
|
518
|
-
return constraintUsage
|
|
519
|
-
.map((usage, constraintIdx) => ({
|
|
520
|
-
argIdx: usage.argvIndex,
|
|
521
|
-
constraintIdx
|
|
522
|
-
}))
|
|
523
|
-
.filter(item => item.argIdx > 0)
|
|
524
|
-
.map(item => `[${item.argIdx},${item.constraintIdx}]`);
|
|
525
|
-
}
|
|
526
292
|
/**
|
|
527
293
|
* Destroys a memory table and frees associated resources
|
|
528
294
|
*/
|
|
@@ -543,6 +309,45 @@ export class MemoryTableModule {
|
|
|
543
309
|
logger.operation('Destroy Table', tableName, { schema: schemaName });
|
|
544
310
|
}
|
|
545
311
|
}
|
|
312
|
+
/**
|
|
313
|
+
* Renames a memory table's internal registration key.
|
|
314
|
+
* Called by the ALTER TABLE RENAME TO emitter after schema update.
|
|
315
|
+
*/
|
|
316
|
+
renameTable(schemaName, oldName, newName) {
|
|
317
|
+
const oldKey = `${schemaName}.${oldName}`.toLowerCase();
|
|
318
|
+
const newKey = `${schemaName}.${newName}`.toLowerCase();
|
|
319
|
+
const manager = this.tables.get(oldKey);
|
|
320
|
+
if (manager) {
|
|
321
|
+
manager.renameTable(newName);
|
|
322
|
+
this.tables.delete(oldKey);
|
|
323
|
+
this.tables.set(newKey, manager);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Alters an existing memory table's structure (ADD/DROP/RENAME COLUMN).
|
|
328
|
+
*/
|
|
329
|
+
async alterTable(db, schemaName, tableName, change) {
|
|
330
|
+
const tableKey = `${schemaName}.${tableName}`.toLowerCase();
|
|
331
|
+
const manager = this.tables.get(tableKey);
|
|
332
|
+
if (!manager) {
|
|
333
|
+
throw new QuereusError(`Memory table '${tableName}' not found in schema '${schemaName}'. Cannot alter.`, StatusCode.ERROR);
|
|
334
|
+
}
|
|
335
|
+
switch (change.type) {
|
|
336
|
+
case 'addColumn':
|
|
337
|
+
await manager.addColumn(change.columnDef);
|
|
338
|
+
break;
|
|
339
|
+
case 'dropColumn':
|
|
340
|
+
await manager.dropColumn(change.columnName);
|
|
341
|
+
break;
|
|
342
|
+
case 'renameColumn':
|
|
343
|
+
if (!change.newColumnDefAst) {
|
|
344
|
+
throw new QuereusError('RENAME COLUMN requires a new column definition AST', StatusCode.INTERNAL);
|
|
345
|
+
}
|
|
346
|
+
await manager.renameColumn(change.oldName, change.newColumnDefAst);
|
|
347
|
+
break;
|
|
348
|
+
}
|
|
349
|
+
return manager.tableSchema;
|
|
350
|
+
}
|
|
546
351
|
/**
|
|
547
352
|
* Creates an index on a memory table
|
|
548
353
|
*/
|