@quereus/quereus 4.4.0 → 4.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -1
- package/dist/src/common/types.d.ts +9 -0
- package/dist/src/common/types.d.ts.map +1 -1
- package/dist/src/common/types.js.map +1 -1
- package/dist/src/core/database-events.d.ts +49 -0
- package/dist/src/core/database-events.d.ts.map +1 -1
- package/dist/src/core/database-events.js +148 -0
- package/dist/src/core/database-events.js.map +1 -1
- package/dist/src/core/database-materialized-views-analysis.d.ts.map +1 -1
- package/dist/src/core/database-materialized-views-analysis.js +1 -0
- package/dist/src/core/database-materialized-views-analysis.js.map +1 -1
- package/dist/src/core/database-materialized-views-plan-builders.d.ts +2 -1
- package/dist/src/core/database-materialized-views-plan-builders.d.ts.map +1 -1
- package/dist/src/core/database-materialized-views-plan-builders.js +26 -5
- package/dist/src/core/database-materialized-views-plan-builders.js.map +1 -1
- package/dist/src/core/database-materialized-views-plans.d.ts +6 -3
- package/dist/src/core/database-materialized-views-plans.d.ts.map +1 -1
- package/dist/src/core/database-materialized-views.d.ts +3 -2
- package/dist/src/core/database-materialized-views.d.ts.map +1 -1
- package/dist/src/core/database-materialized-views.js +26 -5
- package/dist/src/core/database-materialized-views.js.map +1 -1
- package/dist/src/core/database.d.ts +5 -0
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +21 -1
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/core/internal-statement-cache.d.ts +18 -0
- package/dist/src/core/internal-statement-cache.d.ts.map +1 -0
- package/dist/src/core/internal-statement-cache.js +211 -0
- package/dist/src/core/internal-statement-cache.js.map +1 -0
- package/dist/src/func/builtins/aggregate.d.ts +13 -12
- package/dist/src/func/builtins/aggregate.d.ts.map +1 -1
- package/dist/src/func/builtins/aggregate.js +45 -67
- package/dist/src/func/builtins/aggregate.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 +63 -48
- package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
- package/dist/src/func/builtins/scalar.d.ts.map +1 -1
- package/dist/src/func/builtins/scalar.js +92 -3
- package/dist/src/func/builtins/scalar.js.map +1 -1
- package/dist/src/func/registration.d.ts +18 -1
- package/dist/src/func/registration.d.ts.map +1 -1
- package/dist/src/func/registration.js +26 -0
- package/dist/src/func/registration.js.map +1 -1
- package/dist/src/index.d.ts +10 -10
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +13 -12
- package/dist/src/index.js.map +1 -1
- package/dist/src/parser/parser.d.ts +6 -0
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +45 -34
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/planner/analysis/coarsened-key.d.ts +4 -3
- package/dist/src/planner/analysis/coarsened-key.d.ts.map +1 -1
- package/dist/src/planner/analysis/coarsened-key.js +37 -3
- package/dist/src/planner/analysis/coarsened-key.js.map +1 -1
- package/dist/src/planner/analysis/comparison-collation.d.ts +35 -3
- package/dist/src/planner/analysis/comparison-collation.d.ts.map +1 -1
- package/dist/src/planner/analysis/comparison-collation.js +37 -3
- package/dist/src/planner/analysis/comparison-collation.js.map +1 -1
- package/dist/src/planner/analysis/coverage-prover.d.ts +13 -2
- package/dist/src/planner/analysis/coverage-prover.d.ts.map +1 -1
- package/dist/src/planner/analysis/coverage-prover.js +10 -14
- package/dist/src/planner/analysis/coverage-prover.js.map +1 -1
- package/dist/src/planner/analysis/expression-fingerprint.d.ts.map +1 -1
- package/dist/src/planner/analysis/expression-fingerprint.js +29 -0
- package/dist/src/planner/analysis/expression-fingerprint.js.map +1 -1
- package/dist/src/planner/analysis/predicate-conjuncts.d.ts +10 -4
- package/dist/src/planner/analysis/predicate-conjuncts.d.ts.map +1 -1
- package/dist/src/planner/analysis/predicate-conjuncts.js +28 -7
- package/dist/src/planner/analysis/predicate-conjuncts.js.map +1 -1
- package/dist/src/planner/analysis/query-rewrite-matcher.d.ts +6 -0
- package/dist/src/planner/analysis/query-rewrite-matcher.d.ts.map +1 -1
- package/dist/src/planner/analysis/query-rewrite-matcher.js +19 -29
- package/dist/src/planner/analysis/query-rewrite-matcher.js.map +1 -1
- package/dist/src/planner/analysis/sat-checker.d.ts.map +1 -1
- package/dist/src/planner/analysis/sat-checker.js +43 -4
- package/dist/src/planner/analysis/sat-checker.js.map +1 -1
- package/dist/src/planner/analysis/scalar-subqueries.d.ts +22 -3
- package/dist/src/planner/analysis/scalar-subqueries.d.ts.map +1 -1
- package/dist/src/planner/analysis/scalar-subqueries.js +32 -3
- package/dist/src/planner/analysis/scalar-subqueries.js.map +1 -1
- package/dist/src/planner/analysis/set-op-type-merge.d.ts +64 -0
- package/dist/src/planner/analysis/set-op-type-merge.d.ts.map +1 -0
- package/dist/src/planner/analysis/set-op-type-merge.js +97 -0
- package/dist/src/planner/analysis/set-op-type-merge.js.map +1 -0
- package/dist/src/planner/building/coercion.d.ts +78 -0
- package/dist/src/planner/building/coercion.d.ts.map +1 -0
- package/dist/src/planner/building/coercion.js +137 -0
- package/dist/src/planner/building/coercion.js.map +1 -0
- package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
- package/dist/src/planner/building/constraint-builder.js +5 -18
- 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 +10 -3
- package/dist/src/planner/building/delete.js.map +1 -1
- package/dist/src/planner/building/expression.d.ts.map +1 -1
- package/dist/src/planner/building/expression.js +13 -35
- package/dist/src/planner/building/expression.js.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.d.ts +44 -1
- package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.js +54 -0
- package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
- package/dist/src/planner/building/function-call.d.ts.map +1 -1
- package/dist/src/planner/building/function-call.js +8 -0
- 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 +9 -12
- package/dist/src/planner/building/insert.js.map +1 -1
- package/dist/src/planner/building/select-compound.d.ts.map +1 -1
- package/dist/src/planner/building/select-compound.js +10 -6
- package/dist/src/planner/building/select-compound.js.map +1 -1
- package/dist/src/planner/building/update.d.ts.map +1 -1
- package/dist/src/planner/building/update.js +13 -4
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/cost/conjunct-cost.d.ts +42 -0
- package/dist/src/planner/cost/conjunct-cost.d.ts.map +1 -0
- package/dist/src/planner/cost/conjunct-cost.js +62 -0
- package/dist/src/planner/cost/conjunct-cost.js.map +1 -0
- package/dist/src/planner/framework/pass.js +3 -3
- package/dist/src/planner/mutation/propagate.d.ts.map +1 -1
- package/dist/src/planner/mutation/propagate.js +1 -0
- package/dist/src/planner/mutation/propagate.js.map +1 -1
- package/dist/src/planner/nodes/async-gather-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/async-gather-node.js +19 -8
- package/dist/src/planner/nodes/async-gather-node.js.map +1 -1
- package/dist/src/planner/nodes/bloom-join-node.d.ts +2 -0
- package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/bloom-join-node.js +10 -5
- package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.d.ts +0 -9
- package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/dml-executor-node.js.map +1 -1
- package/dist/src/planner/nodes/join-node.d.ts +5 -0
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +8 -1
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/join-utils.d.ts +57 -0
- package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-utils.js +47 -0
- package/dist/src/planner/nodes/join-utils.js.map +1 -1
- package/dist/src/planner/nodes/key-set-semi-join-node.d.ts +87 -0
- package/dist/src/planner/nodes/key-set-semi-join-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/key-set-semi-join-node.js +137 -0
- package/dist/src/planner/nodes/key-set-semi-join-node.js.map +1 -0
- package/dist/src/planner/nodes/merge-join-node.d.ts +2 -0
- package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.js +14 -6
- package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
- 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/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/scalar.js +26 -3
- package/dist/src/planner/nodes/scalar.js.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts +68 -16
- package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.js +147 -26
- package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts +19 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +13 -2
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +54 -12
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/rules/access/rule-key-set-seek.d.ts +68 -0
- package/dist/src/planner/rules/access/rule-key-set-seek.d.ts.map +1 -0
- package/dist/src/planner/rules/access/rule-key-set-seek.js +408 -0
- package/dist/src/planner/rules/access/rule-key-set-seek.js.map +1 -0
- package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-monotonic-range-access.js +2 -2
- package/dist/src/planner/rules/access/rule-monotonic-range-access.js.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts +27 -0
- 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 +74 -29
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js +23 -4
- package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js.map +1 -1
- package/dist/src/planner/rules/cache/rule-scalar-subquery-cache.d.ts +10 -8
- package/dist/src/planner/rules/cache/rule-scalar-subquery-cache.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-scalar-subquery-cache.js +10 -8
- package/dist/src/planner/rules/cache/rule-scalar-subquery-cache.js.map +1 -1
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts +67 -41
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts.map +1 -1
- package/dist/src/planner/rules/join/equi-pair-extractor.js +72 -36
- package/dist/src/planner/rules/join/equi-pair-extractor.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.js +14 -2
- package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js +11 -1
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts +1 -1
- package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js +1 -1
- package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.d.ts +30 -0
- package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.d.ts.map +1 -0
- package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.js +63 -0
- package/dist/src/planner/rules/predicate/rule-filter-conjunct-ordering.js.map +1 -0
- package/dist/src/planner/rules/predicate/rule-filter-selectivity.d.ts +17 -1
- package/dist/src/planner/rules/predicate/rule-filter-selectivity.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-filter-selectivity.js +206 -12
- package/dist/src/planner/rules/predicate/rule-filter-selectivity.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js +8 -1
- package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts +3 -1
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +13 -1
- package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +18 -3
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
- package/dist/src/planner/rules/shared/index-style-context.d.ts +17 -0
- package/dist/src/planner/rules/shared/index-style-context.d.ts.map +1 -1
- package/dist/src/planner/rules/shared/index-style-context.js +7 -0
- package/dist/src/planner/rules/shared/index-style-context.js.map +1 -1
- package/dist/src/planner/rules/subquery/rule-scalar-agg-decorrelation.js +4 -0
- package/dist/src/planner/rules/subquery/rule-scalar-agg-decorrelation.js.map +1 -1
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts +24 -6
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -1
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +175 -60
- package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
- package/dist/src/planner/stats/catalog-stats.d.ts +52 -0
- package/dist/src/planner/stats/catalog-stats.d.ts.map +1 -1
- package/dist/src/planner/stats/catalog-stats.js +151 -5
- package/dist/src/planner/stats/catalog-stats.js.map +1 -1
- package/dist/src/planner/stats/index.d.ts +15 -0
- package/dist/src/planner/stats/index.d.ts.map +1 -1
- package/dist/src/planner/stats/index.js.map +1 -1
- package/dist/src/planner/stats/selectivity-combine.d.ts +53 -0
- package/dist/src/planner/stats/selectivity-combine.d.ts.map +1 -0
- package/dist/src/planner/stats/selectivity-combine.js +75 -0
- package/dist/src/planner/stats/selectivity-combine.js.map +1 -0
- package/dist/src/planner/util/column-origins.d.ts +58 -0
- package/dist/src/planner/util/column-origins.d.ts.map +1 -0
- package/dist/src/planner/util/column-origins.js +90 -0
- package/dist/src/planner/util/column-origins.js.map +1 -0
- package/dist/src/runtime/deferred-constraint-queue.d.ts +40 -0
- package/dist/src/runtime/deferred-constraint-queue.d.ts.map +1 -1
- package/dist/src/runtime/deferred-constraint-queue.js +91 -0
- package/dist/src/runtime/deferred-constraint-queue.js.map +1 -1
- package/dist/src/runtime/emit/aggregate-setup.d.ts +49 -0
- package/dist/src/runtime/emit/aggregate-setup.d.ts.map +1 -0
- package/dist/src/runtime/emit/aggregate-setup.js +99 -0
- package/dist/src/runtime/emit/aggregate-setup.js.map +1 -0
- package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
- package/dist/src/runtime/emit/aggregate.js +4 -69
- package/dist/src/runtime/emit/aggregate.js.map +1 -1
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/alter-table.js +354 -165
- package/dist/src/runtime/emit/alter-table.js.map +1 -1
- package/dist/src/runtime/emit/asof-scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/asof-scan.js +11 -0
- package/dist/src/runtime/emit/asof-scan.js.map +1 -1
- package/dist/src/runtime/emit/between.d.ts.map +1 -1
- package/dist/src/runtime/emit/between.js +7 -12
- 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 +24 -25
- package/dist/src/runtime/emit/binary.js.map +1 -1
- package/dist/src/runtime/emit/bloom-join.d.ts.map +1 -1
- package/dist/src/runtime/emit/bloom-join.js +8 -16
- package/dist/src/runtime/emit/bloom-join.js.map +1 -1
- package/dist/src/runtime/emit/case.d.ts.map +1 -1
- package/dist/src/runtime/emit/case.js +40 -6
- package/dist/src/runtime/emit/case.js.map +1 -1
- package/dist/src/runtime/emit/cast.d.ts.map +1 -1
- package/dist/src/runtime/emit/cast.js +10 -23
- 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 +72 -51
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/create-view.d.ts.map +1 -1
- package/dist/src/runtime/emit/create-view.js +6 -0
- package/dist/src/runtime/emit/create-view.js.map +1 -1
- package/dist/src/runtime/emit/distinct.d.ts.map +1 -1
- package/dist/src/runtime/emit/distinct.js +6 -3
- 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 +188 -84
- package/dist/src/runtime/emit/dml-executor.js.map +1 -1
- package/dist/src/runtime/emit/filter.d.ts +18 -0
- package/dist/src/runtime/emit/filter.d.ts.map +1 -1
- package/dist/src/runtime/emit/filter.js +52 -10
- package/dist/src/runtime/emit/filter.js.map +1 -1
- package/dist/src/runtime/emit/hash-aggregate.d.ts.map +1 -1
- package/dist/src/runtime/emit/hash-aggregate.js +16 -65
- package/dist/src/runtime/emit/hash-aggregate.js.map +1 -1
- package/dist/src/runtime/emit/insert.d.ts.map +1 -1
- package/dist/src/runtime/emit/insert.js +18 -7
- package/dist/src/runtime/emit/insert.js.map +1 -1
- package/dist/src/runtime/emit/join-key-extractor.d.ts +46 -0
- package/dist/src/runtime/emit/join-key-extractor.d.ts.map +1 -0
- package/dist/src/runtime/emit/join-key-extractor.js +60 -0
- package/dist/src/runtime/emit/join-key-extractor.js.map +1 -0
- package/dist/src/runtime/emit/join.d.ts.map +1 -1
- package/dist/src/runtime/emit/join.js +37 -11
- package/dist/src/runtime/emit/join.js.map +1 -1
- package/dist/src/runtime/emit/key-set-semi-join.d.ts +29 -0
- package/dist/src/runtime/emit/key-set-semi-join.d.ts.map +1 -0
- package/dist/src/runtime/emit/key-set-semi-join.js +143 -0
- package/dist/src/runtime/emit/key-set-semi-join.js.map +1 -0
- package/dist/src/runtime/emit/materialized-view-helpers.d.ts +14 -1
- package/dist/src/runtime/emit/materialized-view-helpers.d.ts.map +1 -1
- package/dist/src/runtime/emit/materialized-view-helpers.js +33 -3
- package/dist/src/runtime/emit/materialized-view-helpers.js.map +1 -1
- package/dist/src/runtime/emit/materialized-view.d.ts.map +1 -1
- package/dist/src/runtime/emit/materialized-view.js +47 -6
- package/dist/src/runtime/emit/materialized-view.js.map +1 -1
- package/dist/src/runtime/emit/merge-join.d.ts.map +1 -1
- package/dist/src/runtime/emit/merge-join.js +32 -15
- package/dist/src/runtime/emit/merge-join.js.map +1 -1
- package/dist/src/runtime/emit/operand-comparator.d.ts +40 -0
- package/dist/src/runtime/emit/operand-comparator.d.ts.map +1 -0
- package/dist/src/runtime/emit/operand-comparator.js +59 -0
- package/dist/src/runtime/emit/operand-comparator.js.map +1 -0
- package/dist/src/runtime/emit/scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/scan.js +11 -2
- package/dist/src/runtime/emit/scan.js.map +1 -1
- package/dist/src/runtime/emit/set-object-tags.d.ts +8 -0
- package/dist/src/runtime/emit/set-object-tags.d.ts.map +1 -1
- package/dist/src/runtime/emit/set-object-tags.js +8 -0
- package/dist/src/runtime/emit/set-object-tags.js.map +1 -1
- package/dist/src/runtime/emit/set-operation.d.ts.map +1 -1
- package/dist/src/runtime/emit/set-operation.js +7 -4
- 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 +5 -2
- package/dist/src/runtime/emit/sort.js.map +1 -1
- package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
- package/dist/src/runtime/emit/subquery.js +113 -13
- package/dist/src/runtime/emit/subquery.js.map +1 -1
- package/dist/src/runtime/emit/temporal-arithmetic.d.ts +7 -0
- package/dist/src/runtime/emit/temporal-arithmetic.d.ts.map +1 -1
- package/dist/src/runtime/emit/temporal-arithmetic.js +15 -7
- package/dist/src/runtime/emit/temporal-arithmetic.js.map +1 -1
- package/dist/src/runtime/emit/update.d.ts.map +1 -1
- package/dist/src/runtime/emit/update.js +44 -3
- 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 +72 -55
- package/dist/src/runtime/emit/window.js.map +1 -1
- package/dist/src/runtime/foreign-key-actions.d.ts +36 -1
- package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -1
- package/dist/src/runtime/foreign-key-actions.js +238 -116
- package/dist/src/runtime/foreign-key-actions.js.map +1 -1
- package/dist/src/runtime/parallel-driver.d.ts +10 -2
- package/dist/src/runtime/parallel-driver.d.ts.map +1 -1
- package/dist/src/runtime/parallel-driver.js +12 -2
- package/dist/src/runtime/parallel-driver.js.map +1 -1
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +2 -0
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/runtime/types.d.ts +25 -0
- package/dist/src/runtime/types.d.ts.map +1 -1
- package/dist/src/runtime/types.js.map +1 -1
- package/dist/src/schema/catalog-persistability.d.ts +58 -0
- package/dist/src/schema/catalog-persistability.d.ts.map +1 -0
- package/dist/src/schema/catalog-persistability.js +87 -0
- package/dist/src/schema/catalog-persistability.js.map +1 -0
- package/dist/src/schema/catalog.d.ts +17 -1
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +25 -3
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/constraint-builder.d.ts +20 -22
- package/dist/src/schema/constraint-builder.d.ts.map +1 -1
- package/dist/src/schema/constraint-builder.js +43 -36
- package/dist/src/schema/constraint-builder.js.map +1 -1
- package/dist/src/schema/ddl-generator.d.ts +23 -0
- package/dist/src/schema/ddl-generator.d.ts.map +1 -1
- package/dist/src/schema/ddl-generator.js +27 -0
- package/dist/src/schema/ddl-generator.js.map +1 -1
- package/dist/src/schema/function.d.ts +39 -1
- 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 +28 -0
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +82 -14
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +51 -12
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/unique-enforcement.d.ts +31 -0
- package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
- package/dist/src/schema/unique-enforcement.js +37 -1
- package/dist/src/schema/unique-enforcement.js.map +1 -1
- package/dist/src/schema/window-function.d.ts +30 -10
- package/dist/src/schema/window-function.d.ts.map +1 -1
- package/dist/src/schema/window-function.js +20 -16
- package/dist/src/schema/window-function.js.map +1 -1
- package/dist/src/types/builtin-types.d.ts.map +1 -1
- package/dist/src/types/builtin-types.js +30 -4
- package/dist/src/types/builtin-types.js.map +1 -1
- package/dist/src/types/cast-semantics.d.ts +43 -0
- package/dist/src/types/cast-semantics.d.ts.map +1 -0
- package/dist/src/types/cast-semantics.js +59 -0
- package/dist/src/types/cast-semantics.js.map +1 -0
- 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 +31 -10
- package/dist/src/types/json-type.js.map +1 -1
- package/dist/src/types/logical-type.d.ts +22 -0
- package/dist/src/types/logical-type.d.ts.map +1 -1
- 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 +33 -11
- package/dist/src/types/temporal-types.js.map +1 -1
- package/dist/src/types/validation.d.ts +39 -1
- package/dist/src/types/validation.d.ts.map +1 -1
- package/dist/src/types/validation.js +60 -0
- package/dist/src/types/validation.js.map +1 -1
- package/dist/src/util/ast-spine-clone.d.ts +23 -0
- package/dist/src/util/ast-spine-clone.d.ts.map +1 -0
- package/dist/src/util/ast-spine-clone.js +41 -0
- package/dist/src/util/ast-spine-clone.js.map +1 -0
- package/dist/src/util/coercion.d.ts +13 -0
- package/dist/src/util/coercion.d.ts.map +1 -1
- package/dist/src/util/coercion.js +10 -1
- package/dist/src/util/coercion.js.map +1 -1
- package/dist/src/util/comparison.d.ts +114 -0
- package/dist/src/util/comparison.d.ts.map +1 -1
- package/dist/src/util/comparison.js +187 -27
- package/dist/src/util/comparison.js.map +1 -1
- package/dist/src/vtab/best-access-plan.d.ts +87 -0
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js +87 -0
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/manifest.d.ts +7 -0
- package/dist/src/vtab/manifest.d.ts.map +1 -1
- package/dist/src/vtab/memory/connection.d.ts +14 -1
- package/dist/src/vtab/memory/connection.d.ts.map +1 -1
- package/dist/src/vtab/memory/connection.js +20 -2
- package/dist/src/vtab/memory/connection.js.map +1 -1
- package/dist/src/vtab/memory/layer/base.d.ts +12 -5
- package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base.js +20 -9
- package/dist/src/vtab/memory/layer/base.js.map +1 -1
- package/dist/src/vtab/memory/layer/connection.d.ts +17 -0
- package/dist/src/vtab/memory/layer/connection.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/connection.js +26 -0
- package/dist/src/vtab/memory/layer/connection.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +156 -31
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +695 -158
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/layer/plan-filter.d.ts +41 -20
- package/dist/src/vtab/memory/layer/plan-filter.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/plan-filter.js +57 -27
- package/dist/src/vtab/memory/layer/plan-filter.js.map +1 -1
- package/dist/src/vtab/memory/layer/row-convert.d.ts +21 -0
- package/dist/src/vtab/memory/layer/row-convert.d.ts.map +1 -0
- package/dist/src/vtab/memory/layer/row-convert.js +30 -0
- package/dist/src/vtab/memory/layer/row-convert.js.map +1 -0
- package/dist/src/vtab/memory/layer/scan-layer.d.ts +6 -3
- package/dist/src/vtab/memory/layer/scan-layer.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/scan-layer.js +48 -34
- package/dist/src/vtab/memory/layer/scan-layer.js.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.d.ts +142 -19
- package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.js +237 -73
- package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts +14 -2
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +60 -41
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/memory/table.d.ts +1 -1
- package/dist/src/vtab/memory/table.d.ts.map +1 -1
- package/dist/src/vtab/memory/table.js +12 -4
- package/dist/src/vtab/memory/table.js.map +1 -1
- package/dist/src/vtab/memory/types.d.ts +27 -1
- package/dist/src/vtab/memory/types.d.ts.map +1 -1
- package/dist/src/vtab/memory/types.js +16 -1
- package/dist/src/vtab/memory/types.js.map +1 -1
- package/dist/src/vtab/memory/utils/primary-key.d.ts +9 -0
- package/dist/src/vtab/memory/utils/primary-key.d.ts.map +1 -1
- package/dist/src/vtab/memory/utils/primary-key.js +11 -0
- package/dist/src/vtab/memory/utils/primary-key.js.map +1 -1
- package/dist/src/vtab/module.d.ts +63 -0
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/dist/src/vtab/table.d.ts +33 -7
- package/dist/src/vtab/table.d.ts.map +1 -1
- package/dist/src/vtab/table.js.map +1 -1
- package/package.json +3 -3
- package/dist/src/planner/rules/cache/rule-in-subquery-cache.d.ts +0 -26
- package/dist/src/planner/rules/cache/rule-in-subquery-cache.d.ts.map +0 -1
- package/dist/src/planner/rules/cache/rule-in-subquery-cache.js +0 -66
- package/dist/src/planner/rules/cache/rule-in-subquery-cache.js.map +0 -1
|
@@ -1,28 +1,58 @@
|
|
|
1
|
+
import { keyParts, leadingKeyPart } from '../types.js';
|
|
1
2
|
import { IndexConstraintOp } from '../../../common/constants.js';
|
|
2
|
-
import { BINARY_COLLATION, compareSqlValuesFast } from '../../../util/comparison.js';
|
|
3
|
+
import { BINARY_COLLATION, compareSqlValuesFast, createTypedComparator } from '../../../util/comparison.js';
|
|
3
4
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* The scanned index's column definitions: the PK definition for the primary tree
|
|
6
|
+
* (falling back to the all-columns synthesized PK exactly as `createPrimaryKeyFunctions`
|
|
7
|
+
* does), or the named secondary index's columns. Undefined when the plan names an
|
|
8
|
+
* index the schema does not know — comparisons then fall back to storage-class +
|
|
9
|
+
* collation ordering, matching the degenerate unbounded walk such plans produce.
|
|
10
|
+
*/
|
|
11
|
+
function resolveIndexColumns(indexName, schema) {
|
|
12
|
+
if (indexName === 'primary') {
|
|
13
|
+
return schema.primaryKeyDefinition
|
|
14
|
+
?? schema.columns.map((col, index) => ({ index, collation: col.collation || 'BINARY' }));
|
|
15
|
+
}
|
|
16
|
+
return schema.indexes?.find(idx => idx.name === indexName)?.columns;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Resolves a plan's declared collation names and the scanned index's column logical
|
|
20
|
+
* types into ready-to-run comparators, once, ahead of the scan. Throws (via the
|
|
21
|
+
* resolver) if the plan names a collation that is not registered — an unresolvable
|
|
22
|
+
* collation is never downgraded to BINARY.
|
|
7
23
|
*
|
|
8
|
-
* NOTE: this runs once per `scanLayer` call, not per row. A BINARY
|
|
9
|
-
* common case) costs one empty array and
|
|
10
|
-
* up on a workload of very many tiny scans, memoize the result on the
|
|
11
|
-
* via a `WeakMap` keyed by `ScanPlan`.
|
|
24
|
+
* NOTE: this runs once per `scanLayer` call, not per row. A plain BINARY plan (the
|
|
25
|
+
* common case) costs one empty array and a couple of closures. If per-scan setup
|
|
26
|
+
* ever shows up on a workload of very many tiny scans, memoize the result on the
|
|
27
|
+
* plan object via a `WeakMap` keyed by `ScanPlan`.
|
|
12
28
|
*/
|
|
13
|
-
export function
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
29
|
+
export function resolveScanComparators(plan, schema, collationResolver) {
|
|
30
|
+
const indexColumns = resolveIndexColumns(plan.indexName, schema);
|
|
31
|
+
const comparatorAt = (position, collationName) => {
|
|
32
|
+
const collationFunc = collationName ? collationResolver(collationName) : BINARY_COLLATION;
|
|
33
|
+
const columnDef = indexColumns?.[position];
|
|
34
|
+
const logicalType = columnDef ? schema.columns[columnDef.index]?.logicalType : undefined;
|
|
35
|
+
// Mirror the tree's key comparator construction exactly (see interface doc).
|
|
36
|
+
return logicalType
|
|
37
|
+
? createTypedComparator(logicalType, collationFunc)
|
|
38
|
+
: (a, b) => compareSqlValuesFast(a, b, collationFunc);
|
|
39
|
+
};
|
|
40
|
+
const equalityPrefix = (plan.equalityPrefix ?? []).map((_, i) => comparatorAt(i, plan.equalityPrefixCollations?.[i]));
|
|
41
|
+
// The range bound applies to the leading index column, or — for a prefix-range
|
|
42
|
+
// plan — to the column immediately after the equality prefix (see scan-plan.ts).
|
|
43
|
+
const bound = comparatorAt(plan.equalityPrefix?.length ?? 0, plan.boundCollation);
|
|
44
|
+
// `!== 1`, not `> 1`: the zero-column (singleton) primary key's extractor returns
|
|
45
|
+
// `[]`, so it stores tuple keys too. `resolveIndexColumns` falls back to the
|
|
46
|
+
// synthesized all-columns definition exactly as `createPrimaryKeyFunctions` does,
|
|
47
|
+
// so the two arities cannot drift.
|
|
48
|
+
const keyIsTuple = (indexColumns?.length ?? 1) !== 1;
|
|
49
|
+
return { equalityPrefix, bound, keyIsTuple };
|
|
20
50
|
}
|
|
21
51
|
/**
|
|
22
52
|
* Checks whether a given BTree key satisfies the constraints in a ScanPlan.
|
|
23
53
|
* Handles equality, prefix-range, and simple bound constraints.
|
|
24
54
|
*/
|
|
25
|
-
export function planAppliesToKey(plan, key, keyComparator,
|
|
55
|
+
export function planAppliesToKey(plan, key, keyComparator, comparators) {
|
|
26
56
|
if (plan.equalityKey != null) {
|
|
27
57
|
return keyComparator(key, plan.equalityKey) === 0;
|
|
28
58
|
}
|
|
@@ -30,7 +60,7 @@ export function planAppliesToKey(plan, key, keyComparator, collations) {
|
|
|
30
60
|
// never true. Reachable when a parameter or correlated value binds NULL at
|
|
31
61
|
// runtime — plan-time literal NULLs never get here (constraint extraction
|
|
32
62
|
// declines range bounds; the access-path rule emits EmptyResult for seeks).
|
|
33
|
-
// Without this,
|
|
63
|
+
// Without this, the key comparators rank every key above a NULL bound (key
|
|
34
64
|
// ordering), so `col > ?` bound to NULL would admit every row, and a NULL
|
|
35
65
|
// prefix component would equality-match stored NULL index entries.
|
|
36
66
|
if (plan.lowerBound?.value === null || plan.upperBound?.value === null)
|
|
@@ -38,13 +68,13 @@ export function planAppliesToKey(plan, key, keyComparator, collations) {
|
|
|
38
68
|
if (plan.equalityPrefix?.some(v => v === null))
|
|
39
69
|
return false;
|
|
40
70
|
// Prefix-range: check prefix equality + trailing column bounds. The prefix and
|
|
41
|
-
// bound compares
|
|
42
|
-
// scan into `
|
|
43
|
-
//
|
|
71
|
+
// bound compares run under the index columns' typed comparators (resolved once per
|
|
72
|
+
// scan into `comparators`) so a non-BINARY or semantically-ordered seek matches
|
|
73
|
+
// exactly the window the tree's order defines.
|
|
44
74
|
if (plan.equalityPrefix) {
|
|
45
|
-
const keyArr =
|
|
75
|
+
const keyArr = keyParts(key, comparators.keyIsTuple);
|
|
46
76
|
for (let i = 0; i < plan.equalityPrefix.length; i++) {
|
|
47
|
-
if (
|
|
77
|
+
if (comparators.equalityPrefix[i](keyArr[i], plan.equalityPrefix[i]) !== 0)
|
|
48
78
|
return false;
|
|
49
79
|
}
|
|
50
80
|
const trailingValue = keyArr[plan.equalityPrefix.length];
|
|
@@ -57,19 +87,19 @@ export function planAppliesToKey(plan, key, keyComparator, collations) {
|
|
|
57
87
|
return false;
|
|
58
88
|
if (trailingValue !== undefined && trailingValue !== null) {
|
|
59
89
|
if (plan.lowerBound) {
|
|
60
|
-
const cmp =
|
|
90
|
+
const cmp = comparators.bound(trailingValue, plan.lowerBound.value);
|
|
61
91
|
if (cmp < 0 || (cmp === 0 && plan.lowerBound.op === IndexConstraintOp.GT))
|
|
62
92
|
return false;
|
|
63
93
|
}
|
|
64
94
|
if (plan.upperBound) {
|
|
65
|
-
const cmp =
|
|
95
|
+
const cmp = comparators.bound(trailingValue, plan.upperBound.value);
|
|
66
96
|
if (cmp > 0 || (cmp === 0 && plan.upperBound.op === IndexConstraintOp.LT))
|
|
67
97
|
return false;
|
|
68
98
|
}
|
|
69
99
|
}
|
|
70
100
|
return true;
|
|
71
101
|
}
|
|
72
|
-
const keyForBoundComparison =
|
|
102
|
+
const keyForBoundComparison = leadingKeyPart(key, comparators.keyIsTuple);
|
|
73
103
|
// A NULL bound-column value never satisfies a range comparison (`NULL <op> v` is
|
|
74
104
|
// NULL, never true), so a NULL key is excluded whenever a range bound is present.
|
|
75
105
|
// The seek covers the predicate (the planner drops the residual `Filter`), so this
|
|
@@ -79,12 +109,12 @@ export function planAppliesToKey(plan, key, keyComparator, collations) {
|
|
|
79
109
|
if (keyForBoundComparison === null && (plan.lowerBound || plan.upperBound))
|
|
80
110
|
return false;
|
|
81
111
|
if (plan.lowerBound && (keyForBoundComparison !== undefined && keyForBoundComparison !== null)) {
|
|
82
|
-
const cmp =
|
|
112
|
+
const cmp = comparators.bound(keyForBoundComparison, plan.lowerBound.value);
|
|
83
113
|
if (cmp < 0 || (cmp === 0 && plan.lowerBound.op === IndexConstraintOp.GT))
|
|
84
114
|
return false;
|
|
85
115
|
}
|
|
86
116
|
if (plan.upperBound && (keyForBoundComparison !== undefined && keyForBoundComparison !== null)) {
|
|
87
|
-
const cmp =
|
|
117
|
+
const cmp = comparators.bound(keyForBoundComparison, plan.upperBound.value);
|
|
88
118
|
if (cmp > 0 || (cmp === 0 && plan.upperBound.op === IndexConstraintOp.LT))
|
|
89
119
|
return false;
|
|
90
120
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-filter.js","sourceRoot":"","sources":["../../../../../src/vtab/memory/layer/plan-filter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plan-filter.js","sourceRoot":"","sources":["../../../../../src/vtab/memory/layer/plan-filter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAiB,MAAM,aAAa,CAAC;AAGtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAmC5G;;;;;;GAMG;AACH,SAAS,mBAAmB,CAC3B,SAA6B,EAC7B,MAAmB;IAEnB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,oBAAoB;eAC9B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,OAAO,CAAC;AACrE,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CACrC,IAAc,EACd,MAAmB,EACnB,iBAAoC;IAEpC,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAEjE,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,aAAiC,EAAmB,EAAE;QAC7F,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAC1F,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;QACzF,6EAA6E;QAC7E,OAAO,WAAW;YACjB,CAAC,CAAC,qBAAqB,CAAC,WAAW,EAAE,aAAa,CAAC;YACnD,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;IACxD,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC/D,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,+EAA+E;IAC/E,iFAAiF;IACjF,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAClF,kFAAkF;IAClF,6EAA6E;IAC7E,kFAAkF;IAClF,mCAAmC;IACnC,MAAM,UAAU,GAAG,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;IACrD,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC/B,IAAc,EACd,GAAa,EACb,aAAmD,EACnD,WAAoC;IAEpC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;QAC9B,OAAO,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,0EAA0E;IAC1E,2EAA2E;IAC3E,0EAA0E;IAC1E,4EAA4E;IAC5E,2EAA2E;IAC3E,0EAA0E;IAC1E,mEAAmE;IACnE,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACrF,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAE7D,+EAA+E;IAC/E,mFAAmF;IACnF,gFAAgF;IAChF,+CAA+C;IAC/C,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;QACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrD,IAAI,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;QAC1F,CAAC;QACD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACzD,6EAA6E;QAC7E,8EAA8E;QAC9E,+EAA+E;QAC/E,+EAA+E;QAC/E,kFAAkF;QAClF,IAAI,aAAa,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QACjF,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YAC3D,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrB,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACpE,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,iBAAiB,CAAC,EAAE,CAAC;oBAAE,OAAO,KAAK,CAAC;YACzF,CAAC;YACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrB,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACpE,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,iBAAiB,CAAC,EAAE,CAAC;oBAAE,OAAO,KAAK,CAAC;YACzF,CAAC;QACF,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,qBAAqB,GAAG,cAAc,CAAC,GAAG,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IAC1E,iFAAiF;IACjF,kFAAkF;IAClF,mFAAmF;IACnF,mFAAmF;IACnF,gFAAgF;IAChF,kFAAkF;IAClF,IAAI,qBAAqB,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IACzF,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,qBAAqB,KAAK,SAAS,IAAI,qBAAqB,KAAK,IAAI,CAAC,EAAE,CAAC;QAChG,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,qBAAqB,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC5E,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,iBAAiB,CAAC,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;IACzF,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,qBAAqB,KAAK,SAAS,IAAI,qBAAqB,KAAK,IAAI,CAAC,EAAE,CAAC;QAChG,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,qBAAqB,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC5E,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,iBAAiB,CAAC,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;IACzF,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Row, SqlValue } from '../../../common/types.js';
|
|
2
|
+
/** Replaces the value at one column index of a row with its post-ALTER form. */
|
|
3
|
+
export type RowMapper = (row: Row) => Row;
|
|
4
|
+
/**
|
|
5
|
+
* One row's worth of the value rewrite an `alter column … set data type` / `set not null`
|
|
6
|
+
* backfill performs: the value at `colIndex` run through `convert`. A NULL passes through
|
|
7
|
+
* untouched UNLESS `convertNulls` is set (the SET NOT NULL backfill maps null → DEFAULT).
|
|
8
|
+
* The row is returned unchanged — same object — when nothing needs converting.
|
|
9
|
+
*
|
|
10
|
+
* Shared by every site that has to agree on what "the converted row" is: the pre-mutation
|
|
11
|
+
* UNIQUE probe, the committed-base rewrite, and each open transaction layer's own-write
|
|
12
|
+
* rewrite. Callers differ only in whether they let a conversion failure propagate; the two
|
|
13
|
+
* rewrite sites keep the row as-is (the value is shadowed and unreadable — see their
|
|
14
|
+
* docstrings), the probe lets it throw.
|
|
15
|
+
*/
|
|
16
|
+
export declare function convertRowAtIndex(row: Row, colIndex: number, convert: (v: SqlValue) => SqlValue, convertNulls: boolean): Row;
|
|
17
|
+
/** Applies `mapRow` to a synchronous row stream (the memory module's own effective rows). */
|
|
18
|
+
export declare function mapRows(rows: Iterable<Row>, mapRow: RowMapper): Iterable<Row>;
|
|
19
|
+
/** Applies `mapRow` to an async row stream (a wrapper module's `EffectiveRowSource`). */
|
|
20
|
+
export declare function mapRowsAsync(rows: AsyncIterable<Row>, mapRow: RowMapper): AsyncIterable<Row>;
|
|
21
|
+
//# sourceMappingURL=row-convert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-convert.d.ts","sourceRoot":"","sources":["../../../../../src/vtab/memory/layer/row-convert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAE9D,gFAAgF;AAChF,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;AAE1C;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAChC,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,QAAQ,EAClC,YAAY,EAAE,OAAO,GACnB,GAAG,CAKL;AAED,6FAA6F;AAC7F,wBAAiB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAE9E;AAED,yFAAyF;AACzF,wBAAuB,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,CAEnG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One row's worth of the value rewrite an `alter column … set data type` / `set not null`
|
|
3
|
+
* backfill performs: the value at `colIndex` run through `convert`. A NULL passes through
|
|
4
|
+
* untouched UNLESS `convertNulls` is set (the SET NOT NULL backfill maps null → DEFAULT).
|
|
5
|
+
* The row is returned unchanged — same object — when nothing needs converting.
|
|
6
|
+
*
|
|
7
|
+
* Shared by every site that has to agree on what "the converted row" is: the pre-mutation
|
|
8
|
+
* UNIQUE probe, the committed-base rewrite, and each open transaction layer's own-write
|
|
9
|
+
* rewrite. Callers differ only in whether they let a conversion failure propagate; the two
|
|
10
|
+
* rewrite sites keep the row as-is (the value is shadowed and unreadable — see their
|
|
11
|
+
* docstrings), the probe lets it throw.
|
|
12
|
+
*/
|
|
13
|
+
export function convertRowAtIndex(row, colIndex, convert, convertNulls) {
|
|
14
|
+
const oldVal = row[colIndex];
|
|
15
|
+
if (oldVal === null && !convertNulls)
|
|
16
|
+
return row;
|
|
17
|
+
const newVal = convert(oldVal);
|
|
18
|
+
return row.map((v, i) => i === colIndex ? newVal : v);
|
|
19
|
+
}
|
|
20
|
+
/** Applies `mapRow` to a synchronous row stream (the memory module's own effective rows). */
|
|
21
|
+
export function* mapRows(rows, mapRow) {
|
|
22
|
+
for (const row of rows)
|
|
23
|
+
yield mapRow(row);
|
|
24
|
+
}
|
|
25
|
+
/** Applies `mapRow` to an async row stream (a wrapper module's `EffectiveRowSource`). */
|
|
26
|
+
export async function* mapRowsAsync(rows, mapRow) {
|
|
27
|
+
for await (const row of rows)
|
|
28
|
+
yield mapRow(row);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=row-convert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-convert.js","sourceRoot":"","sources":["../../../../../src/vtab/memory/layer/row-convert.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAChC,GAAQ,EACR,QAAgB,EAChB,OAAkC,EAClC,YAAqB;IAErB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7B,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,YAAY;QAAE,OAAO,GAAG,CAAC;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAQ,CAAC;AAC9D,CAAC;AAED,6FAA6F;AAC7F,MAAM,SAAS,CAAC,CAAC,OAAO,CAAC,IAAmB,EAAE,MAAiB;IAC9D,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,yFAAyF;AACzF,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,YAAY,CAAC,IAAwB,EAAE,MAAiB;IAC9E,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,IAAI;QAAE,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -5,9 +5,12 @@ import { type Row } from '../../../common/types.js';
|
|
|
5
5
|
* Scans a layer (base or transaction) according to a ScanPlan, yielding matching rows.
|
|
6
6
|
* Operates on the Layer interface — the inherited BTrees handle data inheritance transparently.
|
|
7
7
|
*
|
|
8
|
-
* The plan's collation
|
|
9
|
-
* here; {@link scanLayerResolved} does the work and
|
|
10
|
-
* recursion, so a multi-seek or multi-range plan
|
|
8
|
+
* The plan's collation names and the scanned index's column types are resolved into
|
|
9
|
+
* per-column comparators exactly once here; {@link scanLayerResolved} does the work and
|
|
10
|
+
* passes the functions down its own recursion, so a multi-seek or multi-range plan
|
|
11
|
+
* never re-resolves per sub-scan or per row. The comparators mirror the tree's own key
|
|
12
|
+
* comparator (typed — see plan-filter.ts), so bound filtering and early termination
|
|
13
|
+
* agree with the physical BTree order.
|
|
11
14
|
*/
|
|
12
15
|
export declare function scanLayer(layer: Layer, plan: ScanPlan): Iterable<Row>;
|
|
13
16
|
//# sourceMappingURL=scan-layer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan-layer.d.ts","sourceRoot":"","sources":["../../../../../src/vtab/memory/layer/scan-layer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"scan-layer.d.ts","sourceRoot":"","sources":["../../../../../src/vtab/memory/layer/scan-layer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAG5C,OAAO,EAAc,KAAK,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAmBhE;;;;;;;;;;GAUG;AACH,wBAAiB,SAAS,CACzB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,QAAQ,GACZ,QAAQ,CAAC,GAAG,CAAC,CAEf"}
|
|
@@ -1,36 +1,43 @@
|
|
|
1
|
+
import { keyParts, leadingKeyPart } from '../types.js';
|
|
1
2
|
import { IndexConstraintOp } from '../../../common/constants.js';
|
|
2
|
-
import { compareSqlValuesFast } from '../../../util/comparison.js';
|
|
3
3
|
import { StatusCode } from '../../../common/types.js';
|
|
4
4
|
import { safeIterate } from './safe-iterate.js';
|
|
5
5
|
import { QuereusError } from '../../../common/errors.js';
|
|
6
|
-
import { planAppliesToKey,
|
|
6
|
+
import { planAppliesToKey, resolveScanComparators } from './plan-filter.js';
|
|
7
7
|
/**
|
|
8
8
|
* True if a multi-seek key is SQL NULL (scalar) or contains any NULL component
|
|
9
9
|
* (composite tuple). Such a key contributes no match: `x IN (…, NULL)` is TRUE on
|
|
10
10
|
* a non-null equal element else NULL, so the WHERE excludes the row; for a tuple
|
|
11
11
|
* seek, a NULL in any component makes the row-value comparison NULL ⇒ no match.
|
|
12
|
+
*
|
|
13
|
+
* `keyIsTuple` comes from the scanned structure's arity (see the {@link BTreeKey}
|
|
14
|
+
* invariant) — sniffing it would read the JSON document `[null]` as a NULL-bearing
|
|
15
|
+
* tuple and silently drop the equality seek that should match it.
|
|
12
16
|
*/
|
|
13
|
-
function seekKeyHasNull(key) {
|
|
14
|
-
return
|
|
17
|
+
function seekKeyHasNull(key, keyIsTuple) {
|
|
18
|
+
return keyParts(key, keyIsTuple).some(v => v === null);
|
|
15
19
|
}
|
|
16
20
|
/**
|
|
17
21
|
* Scans a layer (base or transaction) according to a ScanPlan, yielding matching rows.
|
|
18
22
|
* Operates on the Layer interface — the inherited BTrees handle data inheritance transparently.
|
|
19
23
|
*
|
|
20
|
-
* The plan's collation
|
|
21
|
-
* here; {@link scanLayerResolved} does the work and
|
|
22
|
-
* recursion, so a multi-seek or multi-range plan
|
|
24
|
+
* The plan's collation names and the scanned index's column types are resolved into
|
|
25
|
+
* per-column comparators exactly once here; {@link scanLayerResolved} does the work and
|
|
26
|
+
* passes the functions down its own recursion, so a multi-seek or multi-range plan
|
|
27
|
+
* never re-resolves per sub-scan or per row. The comparators mirror the tree's own key
|
|
28
|
+
* comparator (typed — see plan-filter.ts), so bound filtering and early termination
|
|
29
|
+
* agree with the physical BTree order.
|
|
23
30
|
*/
|
|
24
31
|
export function* scanLayer(layer, plan) {
|
|
25
|
-
yield* scanLayerResolved(layer, plan,
|
|
32
|
+
yield* scanLayerResolved(layer, plan, resolveScanComparators(plan, layer.getSchema(), layer.collationResolver));
|
|
26
33
|
}
|
|
27
34
|
/**
|
|
28
|
-
* The scan body. `
|
|
29
|
-
* narrowing a plan (multi-seek → single key, multi-range → single range)
|
|
30
|
-
* which columns the prefix/bound
|
|
31
|
-
* down the recursion.
|
|
35
|
+
* The scan body. `comparators` holds the plan's already-resolved bound/prefix
|
|
36
|
+
* comparators; narrowing a plan (multi-seek → single key, multi-range → single range)
|
|
37
|
+
* never changes which columns the prefix/bound comparators describe, so the same
|
|
38
|
+
* functions are reused down the recursion.
|
|
32
39
|
*/
|
|
33
|
-
function* scanLayerResolved(layer, plan,
|
|
40
|
+
function* scanLayerResolved(layer, plan, comparators) {
|
|
34
41
|
// Multi-seek: iterate over multiple equality keys (e.g. `col IN (v1, v2, …)`).
|
|
35
42
|
// This is set-membership, not a bag, so two faults must be avoided:
|
|
36
43
|
// - A duplicate seek key (`IN (5, 5)`, or two case-variant literals that hit the
|
|
@@ -48,10 +55,10 @@ function* scanLayerResolved(layer, plan, collations) {
|
|
|
48
55
|
const { primaryKeyExtractorFromRow, primaryKeyEncoder: encodePk } = layer.getPkExtractorsAndComparators(seekSchema);
|
|
49
56
|
const seen = new Set();
|
|
50
57
|
for (const key of plan.equalityKeys) {
|
|
51
|
-
if (seekKeyHasNull(key))
|
|
58
|
+
if (seekKeyHasNull(key, comparators.keyIsTuple))
|
|
52
59
|
continue;
|
|
53
60
|
const singlePlan = { ...plan, equalityKey: key, equalityKeys: undefined };
|
|
54
|
-
for (const row of scanLayerResolved(layer, singlePlan,
|
|
61
|
+
for (const row of scanLayerResolved(layer, singlePlan, comparators)) {
|
|
55
62
|
const encoded = encodePk(primaryKeyExtractorFromRow(row));
|
|
56
63
|
// A key already in `seen` means this row was yielded by an earlier seek.
|
|
57
64
|
if (seen.has(encoded))
|
|
@@ -71,7 +78,7 @@ function* scanLayerResolved(layer, plan, collations) {
|
|
|
71
78
|
lowerBound: range.lowerBound,
|
|
72
79
|
upperBound: range.upperBound,
|
|
73
80
|
};
|
|
74
|
-
yield* scanLayerResolved(layer, singlePlan,
|
|
81
|
+
yield* scanLayerResolved(layer, singlePlan, comparators);
|
|
75
82
|
}
|
|
76
83
|
return;
|
|
77
84
|
}
|
|
@@ -86,7 +93,7 @@ function* scanLayerResolved(layer, plan, collations) {
|
|
|
86
93
|
// logic ⇒ no row matches. Short-circuit before `tree.get`: a literal `null`
|
|
87
94
|
// could otherwise match a stored NULL index entry for a composite key. Only
|
|
88
95
|
// `undefined` (no equality key) falls through to the full/range walk below.
|
|
89
|
-
if (seekKeyHasNull(plan.equalityKey))
|
|
96
|
+
if (seekKeyHasNull(plan.equalityKey, comparators.keyIsTuple))
|
|
90
97
|
return;
|
|
91
98
|
const value = tree.get(plan.equalityKey);
|
|
92
99
|
if (value) {
|
|
@@ -99,6 +106,11 @@ function* scanLayerResolved(layer, plan, collations) {
|
|
|
99
106
|
// that column descending. The synthesized all-columns fallback definition
|
|
100
107
|
// carries no `desc`, so the `?.` chain yields false there, which is correct.
|
|
101
108
|
const isDescFirstColumn = schema.primaryKeyDefinition?.[0]?.desc === true;
|
|
109
|
+
// NOTE: `> 1`, whereas the key-shape flag `comparators.keyIsTuple` uses `!== 1`.
|
|
110
|
+
// They differ only for the zero-column singleton PK, which stores `[]`: neither
|
|
111
|
+
// branch below can reach it (an `equalityPrefix` needs a PK column, and there is
|
|
112
|
+
// no column for a bound to constrain), so the seek key is never built for it. If a
|
|
113
|
+
// zero-arity plan ever does reach here, switch this to `keyIsTuple`.
|
|
102
114
|
const isComposite = (schema.primaryKeyDefinition?.length ?? schema.columns.length) > 1;
|
|
103
115
|
// Seek-start selection must depend on the *physical* walk direction, not just
|
|
104
116
|
// the key's declared direction. The four {isAscending}×{isDescFirstColumn}
|
|
@@ -141,13 +153,13 @@ function* scanLayerResolved(layer, plan, collations) {
|
|
|
141
153
|
for (const value of safeIterate(tree, isAscending, startKey, primaryKeyExtractorFromRow)) {
|
|
142
154
|
const row = value;
|
|
143
155
|
const primaryKey = primaryKeyExtractorFromRow(row);
|
|
144
|
-
if (!planAppliesToKey(plan, primaryKey, primaryKeyComparator,
|
|
156
|
+
if (!planAppliesToKey(plan, primaryKey, primaryKeyComparator, comparators)) {
|
|
145
157
|
// Early termination for prefix-range: break when prefix no longer matches
|
|
146
158
|
if (plan.equalityPrefix) {
|
|
147
|
-
const keyArr =
|
|
159
|
+
const keyArr = keyParts(primaryKey, comparators.keyIsTuple);
|
|
148
160
|
let prefixMismatch = false;
|
|
149
161
|
for (let i = 0; i < plan.equalityPrefix.length; i++) {
|
|
150
|
-
if (
|
|
162
|
+
if (comparators.equalityPrefix[i](keyArr[i], plan.equalityPrefix[i]) !== 0) {
|
|
151
163
|
prefixMismatch = true;
|
|
152
164
|
break;
|
|
153
165
|
}
|
|
@@ -159,17 +171,18 @@ function* scanLayerResolved(layer, plan, collations) {
|
|
|
159
171
|
// Past the bound we terminate at — early exit. We seek from one end
|
|
160
172
|
// and terminate at the other, so this is the complement of
|
|
161
173
|
// seekFromUpper and holds for both physical walk directions. The
|
|
162
|
-
// terminating compare uses the bound column's
|
|
163
|
-
//
|
|
164
|
-
|
|
174
|
+
// terminating compare uses the bound column's typed comparator (same
|
|
175
|
+
// construction as the tree's key comparator) so the walk terminates
|
|
176
|
+
// at the boundary of the tree's own order.
|
|
177
|
+
const keyForComparison = leadingKeyPart(primaryKey, comparators.keyIsTuple);
|
|
165
178
|
if (!seekFromUpper && plan.upperBound) {
|
|
166
|
-
const cmp =
|
|
179
|
+
const cmp = comparators.bound(keyForComparison, plan.upperBound.value);
|
|
167
180
|
if (cmp > 0 || (cmp === 0 && plan.upperBound.op === IndexConstraintOp.LT)) {
|
|
168
181
|
break;
|
|
169
182
|
}
|
|
170
183
|
}
|
|
171
184
|
else if (seekFromUpper && plan.lowerBound) {
|
|
172
|
-
const cmp =
|
|
185
|
+
const cmp = comparators.bound(keyForComparison, plan.lowerBound.value);
|
|
173
186
|
if (cmp < 0 || (cmp === 0 && plan.lowerBound.op === IndexConstraintOp.GT)) {
|
|
174
187
|
break;
|
|
175
188
|
}
|
|
@@ -199,7 +212,7 @@ function* scanLayerResolved(layer, plan, collations) {
|
|
|
199
212
|
if (plan.equalityKey !== undefined) {
|
|
200
213
|
// NULL equality is UNKNOWN ⇒ no rows (see the primary branch above). Only
|
|
201
214
|
// `undefined` falls through to the ordered walk.
|
|
202
|
-
if (seekKeyHasNull(plan.equalityKey))
|
|
215
|
+
if (seekKeyHasNull(plan.equalityKey, comparators.keyIsTuple))
|
|
203
216
|
return;
|
|
204
217
|
const indexEntry = indexTree.get(plan.equalityKey);
|
|
205
218
|
if (indexEntry && primaryTree) {
|
|
@@ -249,13 +262,13 @@ function* scanLayerResolved(layer, plan, collations) {
|
|
|
249
262
|
}
|
|
250
263
|
}
|
|
251
264
|
for (const indexEntry of safeIterate(indexTree, isAscending, startKey, entry => entry.indexKey)) {
|
|
252
|
-
if (!planAppliesToKey(plan, indexEntry.indexKey, primaryKeyComparator,
|
|
265
|
+
if (!planAppliesToKey(plan, indexEntry.indexKey, primaryKeyComparator, comparators)) {
|
|
253
266
|
// Early termination for prefix-range: break when prefix no longer matches
|
|
254
267
|
if (plan.equalityPrefix) {
|
|
255
|
-
const keyArr =
|
|
268
|
+
const keyArr = keyParts(indexEntry.indexKey, comparators.keyIsTuple);
|
|
256
269
|
let prefixMismatch = false;
|
|
257
270
|
for (let i = 0; i < plan.equalityPrefix.length; i++) {
|
|
258
|
-
if (
|
|
271
|
+
if (comparators.equalityPrefix[i](keyArr[i], plan.equalityPrefix[i]) !== 0) {
|
|
259
272
|
prefixMismatch = true;
|
|
260
273
|
break;
|
|
261
274
|
}
|
|
@@ -266,17 +279,18 @@ function* scanLayerResolved(layer, plan, collations) {
|
|
|
266
279
|
}
|
|
267
280
|
// Early termination: break once the leading column passes the bound we
|
|
268
281
|
// terminate at (the complement of seekFromUpper; holds for both
|
|
269
|
-
// physical walk directions). Uses the bound column's
|
|
270
|
-
//
|
|
271
|
-
|
|
282
|
+
// physical walk directions). Uses the bound column's typed comparator
|
|
283
|
+
// (same construction as the index tree's key comparator) so the walk
|
|
284
|
+
// terminates at the boundary of the tree's own order.
|
|
285
|
+
const keyForComparison = leadingKeyPart(indexEntry.indexKey, comparators.keyIsTuple);
|
|
272
286
|
if (!seekFromUpper && plan.upperBound) {
|
|
273
|
-
const cmp =
|
|
287
|
+
const cmp = comparators.bound(keyForComparison, plan.upperBound.value);
|
|
274
288
|
if (cmp > 0 || (cmp === 0 && plan.upperBound.op === IndexConstraintOp.LT)) {
|
|
275
289
|
break;
|
|
276
290
|
}
|
|
277
291
|
}
|
|
278
292
|
else if (seekFromUpper && plan.lowerBound) {
|
|
279
|
-
const cmp =
|
|
293
|
+
const cmp = comparators.bound(keyForComparison, plan.lowerBound.value);
|
|
280
294
|
if (cmp < 0 || (cmp === 0 && plan.lowerBound.op === IndexConstraintOp.GT)) {
|
|
281
295
|
break;
|
|
282
296
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan-layer.js","sourceRoot":"","sources":["../../../../../src/vtab/memory/layer/scan-layer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scan-layer.js","sourceRoot":"","sources":["../../../../../src/vtab/memory/layer/scan-layer.ts"],"names":[],"mappings":"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"}
|