@quereus/quereus 4.4.1 → 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 +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/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 +4 -0
- package/dist/src/func/registration.d.ts.map +1 -1
- package/dist/src/func/registration.js +1 -0
- package/dist/src/func/registration.js.map +1 -1
- package/dist/src/index.d.ts +3 -3
- 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/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 +33 -3
- package/dist/src/planner/analysis/comparison-collation.d.ts.map +1 -1
- package/dist/src/planner/analysis/comparison-collation.js +36 -2
- 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/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.map +1 -1
- package/dist/src/planner/analysis/query-rewrite-matcher.js +8 -27
- package/dist/src/planner/analysis/query-rewrite-matcher.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/expression.d.ts.map +1 -1
- package/dist/src/planner/building/expression.js +1 -104
- package/dist/src/planner/building/expression.js.map +1 -1
- package/dist/src/planner/building/function-call.d.ts.map +1 -1
- package/dist/src/planner/building/function-call.js +8 -0
- package/dist/src/planner/building/function-call.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/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/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/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/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 +49 -0
- 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 +31 -11
- package/dist/src/planner/rules/access/rule-select-access-path.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-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-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 +90 -9
- package/dist/src/runtime/deferred-constraint-queue.js.map +1 -1
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/alter-table.js +6 -0
- 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 +8 -3
- 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 +4 -38
- 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 +2 -23
- 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 +6 -35
- 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/constraint-check.d.ts.map +1 -1
- package/dist/src/runtime/emit/constraint-check.js +32 -8
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
- package/dist/src/runtime/emit/dml-executor.js +26 -23
- 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/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 +36 -15
- 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/merge-join.d.ts.map +1 -1
- package/dist/src/runtime/emit/merge-join.js +15 -8
- 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/parallel-driver.d.ts +5 -2
- package/dist/src/runtime/parallel-driver.d.ts.map +1 -1
- package/dist/src/runtime/parallel-driver.js +6 -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 +7 -0
- package/dist/src/runtime/types.d.ts.map +1 -1
- package/dist/src/runtime/types.js.map +1 -1
- package/dist/src/schema/function.d.ts +9 -0
- package/dist/src/schema/function.d.ts.map +1 -1
- package/dist/src/schema/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/util/comparison.d.ts +25 -0
- package/dist/src/util/comparison.d.ts.map +1 -1
- package/dist/src/util/comparison.js +31 -0
- 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/memory/layer/base.d.ts +6 -4
- package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/base.js +6 -4
- package/dist/src/vtab/memory/layer/base.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +60 -18
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +100 -39
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.d.ts +15 -6
- package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/transaction.js +26 -11
- 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 +51 -39
- 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 +9 -2
- package/dist/src/vtab/memory/table.js.map +1 -1
- package/dist/src/vtab/table.d.ts +9 -1
- package/dist/src/vtab/table.d.ts.map +1 -1
- package/dist/src/vtab/table.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { asRun } from '../types.js';
|
|
2
2
|
import { emitCallFromPlan, emitPlanNode } from '../emitters.js';
|
|
3
3
|
import { createLogger } from '../../common/logger.js';
|
|
4
|
-
import {
|
|
4
|
+
import { BINARY_COLLATION } from '../../util/comparison.js';
|
|
5
5
|
import { buildRowDescriptor } from '../../util/row-descriptor.js';
|
|
6
6
|
import { effectiveCollationOfTypes } from '../../planner/analysis/comparison-collation.js';
|
|
7
|
+
import { makeOperandComparator } from './operand-comparator.js';
|
|
8
|
+
import { ANY_TYPE } from '../../types/builtin-types.js';
|
|
7
9
|
import { createRowSlot } from '../context-helpers.js';
|
|
8
10
|
import { joinOutputRow } from './join-output.js';
|
|
9
11
|
import { resolveMaybe } from '../async-util.js';
|
|
@@ -26,10 +28,13 @@ export function emitLoopJoin(plan, ctx) {
|
|
|
26
28
|
const leftRowDescriptor = buildRowDescriptor(leftAttributes);
|
|
27
29
|
const rightAttributes = plan.right.getAttributes();
|
|
28
30
|
const rightRowDescriptor = buildRowDescriptor(rightAttributes);
|
|
29
|
-
// Pre-resolve USING column indices and
|
|
30
|
-
// USING compares the two sides' same-named columns, so each pair resolves
|
|
31
|
-
// through the shared provenance lattice — `using (k)` agrees with the
|
|
32
|
-
// spelled-out `l.k = r.k` regardless of side order
|
|
31
|
+
// Pre-resolve USING column indices and per-column comparators at emit time.
|
|
32
|
+
// USING compares the two sides' same-named columns, so each pair resolves its
|
|
33
|
+
// collation through the shared provenance lattice — `using (k)` agrees with the
|
|
34
|
+
// spelled-out `l.k = r.k` regardless of side order — and its comparator through
|
|
35
|
+
// `makeOperandComparator`, the one copy of the routing rule `emitComparisonOp`
|
|
36
|
+
// uses, so the two also agree on declared-type semantics (see
|
|
37
|
+
// {@link evaluateUsingCondition}).
|
|
33
38
|
const usingResolved = plan.usingColumns?.map(columnName => {
|
|
34
39
|
const lowerName = columnName.toLowerCase();
|
|
35
40
|
const leftIndex = leftAttributes.findIndex(attr => attr.name.toLowerCase() === lowerName);
|
|
@@ -39,7 +44,8 @@ export function emitLoopJoin(plan, ctx) {
|
|
|
39
44
|
const collationFunc = leftType && rightType
|
|
40
45
|
? ctx.resolveCollation(effectiveCollationOfTypes(leftType, rightType))
|
|
41
46
|
: BINARY_COLLATION;
|
|
42
|
-
|
|
47
|
+
const compare = makeOperandComparator(leftType?.logicalType ?? ANY_TYPE, rightType?.logicalType ?? ANY_TYPE, collationFunc);
|
|
48
|
+
return { leftIndex, rightIndex, compare };
|
|
43
49
|
});
|
|
44
50
|
// Existence (`exists … as`) flags appended after both sides. The flag is the
|
|
45
51
|
// ACTUAL match bit the outer-join null-extension already computes (NOT a
|
|
@@ -201,21 +207,36 @@ export function emitLoopJoin(plan, ctx) {
|
|
|
201
207
|
};
|
|
202
208
|
}
|
|
203
209
|
/**
|
|
204
|
-
* Evaluates USING condition
|
|
205
|
-
* All index lookups
|
|
206
|
-
* Uses compareSqlValuesFast for safe cross-type comparison.
|
|
210
|
+
* Evaluates a USING condition from pre-resolved column indices and comparators.
|
|
211
|
+
* All index lookups, collation resolution and comparator routing happen at emit time.
|
|
207
212
|
*
|
|
208
|
-
*
|
|
209
|
-
*
|
|
210
|
-
*
|
|
211
|
-
*
|
|
213
|
+
* `using (k)` means exactly `l.k = r.k`, so each column compares through
|
|
214
|
+
* {@link makeOperandComparator} — the one copy of the routing rule
|
|
215
|
+
* `emitComparisonOp` uses. A USING column pairing a semantic-ordering type with a
|
|
216
|
+
* plain one (TIMESPAN `d` against TEXT `d`) therefore takes the same runtime
|
|
217
|
+
* duration check `=` takes and reports 'PT1H' ≡ 'PT60M'; a same-type pair takes the
|
|
218
|
+
* type's own compare. A NULL on either side fails the column outright, mirroring
|
|
219
|
+
* `emitComparisonOp`'s `v1 === null || v2 === null ⇒ null` guard: `l.k = r.k` is
|
|
220
|
+
* UNKNOWN, not true, when both are NULL. The comparators themselves rank NULL/NULL as
|
|
221
|
+
* equal (they are ordering functions, where NULL is a value), so the guard belongs
|
|
222
|
+
* here — without it a nested-loop USING join emits rows the hash-keyed path and the
|
|
223
|
+
* spelled-out ON form both drop.
|
|
224
|
+
*
|
|
225
|
+
* NOTE: USING skips the plan-time cross-type coercion `=` gets, so a JSON column
|
|
226
|
+
* paired with a TEXT one still compares as OBJECT-vs-TEXT storage classes and never
|
|
227
|
+
* matches. Tracked as `bug-using-join-skips-cross-type-coercion`.
|
|
212
228
|
*/
|
|
213
229
|
function evaluateUsingCondition(leftRow, rightRow, resolved) {
|
|
214
|
-
for (const { leftIndex, rightIndex,
|
|
230
|
+
for (const { leftIndex, rightIndex, compare } of resolved) {
|
|
215
231
|
if (leftIndex === -1 || rightIndex === -1) {
|
|
216
232
|
return false;
|
|
217
233
|
}
|
|
218
|
-
|
|
234
|
+
const leftValue = leftRow[leftIndex];
|
|
235
|
+
const rightValue = rightRow[rightIndex];
|
|
236
|
+
if (leftValue === null || rightValue === null) {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
if (compare(leftValue, rightValue) !== 0) {
|
|
219
240
|
return false;
|
|
220
241
|
}
|
|
221
242
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"join.js","sourceRoot":"","sources":["../../../../src/runtime/emit/join.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGhE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"join.js","sourceRoot":"","sources":["../../../../src/runtime/emit/join.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { KeySetSemiJoinNode, KeySetPushdown } from '../../planner/nodes/key-set-semi-join-node.js';
|
|
2
|
+
import type { Instruction } from '../types.js';
|
|
3
|
+
import type { EmissionContext } from '../emission-context.js';
|
|
4
|
+
import type { SqlValue } from '../../common/types.js';
|
|
5
|
+
import type { FilterInfo } from '../../vtab/filter-info.js';
|
|
6
|
+
/**
|
|
7
|
+
* Rewrite a full-scan FilterInfo into the single-column `plan=5` multi-seek the
|
|
8
|
+
* literal-IN arm of `rule-select-access-path` produces for `where col in (…)` —
|
|
9
|
+
* one EQ constraint per key, `argvIndex` 1…K, `inCount=<K>` in the idxStr
|
|
10
|
+
* (`seekWidth` omitted ⇒ 1). Every downstream consumer
|
|
11
|
+
* (`StoreTable.scanMultiSeek`, the memory vtab's scan-plan builder,
|
|
12
|
+
* `IsolatedTable.buildConstraintMatcher`) consumes it unchanged because it
|
|
13
|
+
* cannot be told apart from a literal list.
|
|
14
|
+
*
|
|
15
|
+
* Exported for the plan-time/runtime shape-equivalence unit test.
|
|
16
|
+
*/
|
|
17
|
+
export declare function stampMultiSeek(base: FilterInfo, pushdown: KeySetPushdown, keys: readonly SqlValue[]): FilterInfo;
|
|
18
|
+
/**
|
|
19
|
+
* Emit a KeySetSemiJoin: drain the key source once into a set, decide
|
|
20
|
+
* seek-vs-scan, then stream the target probing every row against the set.
|
|
21
|
+
*
|
|
22
|
+
* The probe is unconditional — the pushdown only changes how many rows the
|
|
23
|
+
* target emits. The target leaf is emitted through `emitSeqScan`'s
|
|
24
|
+
* `FilterInfoOverride` hook (the OrdinalSlice pattern): the override reads the
|
|
25
|
+
* per-execution state this run() stamped and either leaves the full-scan
|
|
26
|
+
* FilterInfo untouched or replaces it with the multi-seek.
|
|
27
|
+
*/
|
|
28
|
+
export declare function emitKeySetSemiJoin(plan: KeySetSemiJoinNode, ctx: EmissionContext): Instruction;
|
|
29
|
+
//# sourceMappingURL=key-set-semi-join.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-set-semi-join.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/key-set-semi-join.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAC;AACxG,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAC;AAI/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAO,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAK3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAc5D;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC7B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,SAAS,QAAQ,EAAE,GACvB,UAAU,CA0BZ;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,eAAe,GAAG,WAAW,CAuG9F"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { asRun } from '../types.js';
|
|
2
|
+
import { emitPlanNode } from '../emitters.js';
|
|
3
|
+
import { emitSeqScan } from './scan.js';
|
|
4
|
+
import { StatusCode } from '../../common/types.js';
|
|
5
|
+
import { QuereusError, throwIfAborted } from '../../common/errors.js';
|
|
6
|
+
import { IndexConstraintOp } from '../../common/constants.js';
|
|
7
|
+
import { encodeIdxStr, makeIdxStrSpec } from '../../vtab/idx-str.js';
|
|
8
|
+
import { buildJoinKeyExtractor } from './join-key-extractor.js';
|
|
9
|
+
import { compareSqlValuesFast, normalizeCollationName } from '../../util/comparison.js';
|
|
10
|
+
import { createLogger } from '../../common/logger.js';
|
|
11
|
+
const log = createLogger('runtime:emit:key-set-semi-join');
|
|
12
|
+
/**
|
|
13
|
+
* Rewrite a full-scan FilterInfo into the single-column `plan=5` multi-seek the
|
|
14
|
+
* literal-IN arm of `rule-select-access-path` produces for `where col in (…)` —
|
|
15
|
+
* one EQ constraint per key, `argvIndex` 1…K, `inCount=<K>` in the idxStr
|
|
16
|
+
* (`seekWidth` omitted ⇒ 1). Every downstream consumer
|
|
17
|
+
* (`StoreTable.scanMultiSeek`, the memory vtab's scan-plan builder,
|
|
18
|
+
* `IsolatedTable.buildConstraintMatcher`) consumes it unchanged because it
|
|
19
|
+
* cannot be told apart from a literal list.
|
|
20
|
+
*
|
|
21
|
+
* Exported for the plan-time/runtime shape-equivalence unit test.
|
|
22
|
+
*/
|
|
23
|
+
export function stampMultiSeek(base, pushdown, keys) {
|
|
24
|
+
const constraints = keys.map((_v, i) => ({
|
|
25
|
+
constraint: { iColumn: pushdown.seekColumnIndex, op: IndexConstraintOp.EQ, usable: true },
|
|
26
|
+
argvIndex: i + 1,
|
|
27
|
+
}));
|
|
28
|
+
const idxStr = encodeIdxStr(makeIdxStrSpec(pushdown.indexName, 'multiSeek', new Map([['inCount', String(keys.length)]])));
|
|
29
|
+
return {
|
|
30
|
+
...base,
|
|
31
|
+
idxStr,
|
|
32
|
+
constraints,
|
|
33
|
+
args: keys,
|
|
34
|
+
accessPath: pushdown.accessPath,
|
|
35
|
+
indexInfoOutput: {
|
|
36
|
+
...base.indexInfoOutput,
|
|
37
|
+
idxStr,
|
|
38
|
+
nConstraint: constraints.length,
|
|
39
|
+
aConstraint: constraints.map(c => c.constraint),
|
|
40
|
+
aConstraintUsage: constraints.map(c => ({ argvIndex: c.argvIndex, omit: true })),
|
|
41
|
+
estimatedRows: BigInt(keys.length),
|
|
42
|
+
// An ordering-only leaf stamps orderByConsumed vacuously (nothing above
|
|
43
|
+
// the replaced hash join consumed its order); the multi-seek is not an
|
|
44
|
+
// ordering plan, so report false — matching the literal-IN arm's shape.
|
|
45
|
+
orderByConsumed: false,
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Emit a KeySetSemiJoin: drain the key source once into a set, decide
|
|
51
|
+
* seek-vs-scan, then stream the target probing every row against the set.
|
|
52
|
+
*
|
|
53
|
+
* The probe is unconditional — the pushdown only changes how many rows the
|
|
54
|
+
* target emits. The target leaf is emitted through `emitSeqScan`'s
|
|
55
|
+
* `FilterInfoOverride` hook (the OrdinalSlice pattern): the override reads the
|
|
56
|
+
* per-execution state this run() stamped and either leaves the full-scan
|
|
57
|
+
* FilterInfo untouched or replaces it with the multi-seek.
|
|
58
|
+
*/
|
|
59
|
+
export function emitKeySetSemiJoin(plan, ctx) {
|
|
60
|
+
const targetAttributes = plan.target.getAttributes();
|
|
61
|
+
const keyAttributes = plan.keySource.getAttributes();
|
|
62
|
+
const targetColIdx = plan.target.getAttributeIndex().get(plan.targetAttrId) ?? -1;
|
|
63
|
+
const keyColIdx = plan.keySource.getAttributeIndex().get(plan.keyAttrId) ?? -1;
|
|
64
|
+
if (targetColIdx === -1 || keyColIdx === -1) {
|
|
65
|
+
throw new QuereusError(`KeySetSemiJoin: could not resolve join attr IDs ${plan.targetAttrId}=${plan.keyAttrId}`, StatusCode.INTERNAL);
|
|
66
|
+
}
|
|
67
|
+
// Same serialized-key pipeline as the bloom join it replaces — both sides
|
|
68
|
+
// MUST agree bit-for-bit (see join-key-extractor.ts).
|
|
69
|
+
const extractKey = buildJoinKeyExtractor([[targetAttributes[targetColIdx].type, keyAttributes[keyColIdx].type]], ctx);
|
|
70
|
+
const targetIndices = [targetColIdx];
|
|
71
|
+
const keyIndices = [keyColIdx];
|
|
72
|
+
// Seek keys are sorted under the INDEX's leading-key-column collation so the
|
|
73
|
+
// stamped multi-seek arrives in index-key order — required by the isolation
|
|
74
|
+
// overlay's ascending-merge assumption and what makes emission deterministic.
|
|
75
|
+
const seekCollation = ctx.resolveCollation(normalizeCollationName(plan.pushdown.accessPath.index.keyColumns[0].collation ?? 'BINARY'));
|
|
76
|
+
const seekSign = plan.pushdown.seekDescending ? -1 : 1;
|
|
77
|
+
const stateByCtx = new WeakMap();
|
|
78
|
+
const targetInstruction = emitSeqScan(plan.target, ctx, (base, rctx) => {
|
|
79
|
+
const state = stateByCtx.get(rctx);
|
|
80
|
+
if (!state) {
|
|
81
|
+
// The scheduler always runs the target as a child of this node's
|
|
82
|
+
// run(), so a missing state entry is a scheduling bug. A silent
|
|
83
|
+
// full-scan fallback here would be correct but would hide that bug
|
|
84
|
+
// indefinitely — mirrors OrdinalSlice's guard.
|
|
85
|
+
throw new QuereusError('KeySetSemiJoin target executed without key-set initialization', StatusCode.INTERNAL);
|
|
86
|
+
}
|
|
87
|
+
if (!state.seekKeys)
|
|
88
|
+
return base; // scan fallback — unchanged FilterInfo
|
|
89
|
+
return stampMultiSeek(base, plan.pushdown, state.seekKeys);
|
|
90
|
+
});
|
|
91
|
+
const keySourceInstruction = emitPlanNode(plan.keySource, ctx);
|
|
92
|
+
async function* run(rctx, targetRows, keyRows) {
|
|
93
|
+
// === Drain the key source completely into the probe set. Per distinct
|
|
94
|
+
// probe string, keep the FIRST raw value seen as the seek value.
|
|
95
|
+
// NOTE: under a nested-loop rescan this re-drains the key source each
|
|
96
|
+
// pass. Correct but wasteful; the right side is uncorrelated by rule
|
|
97
|
+
// construction, so caching it is a pure optimization that only matters
|
|
98
|
+
// if this shape ever shows up under an NLJ inner.
|
|
99
|
+
const probe = new Set();
|
|
100
|
+
const seekByProbe = new Map();
|
|
101
|
+
for await (const keyRow of keyRows) {
|
|
102
|
+
throwIfAborted(rctx.signal);
|
|
103
|
+
const key = extractKey(keyRow, keyIndices);
|
|
104
|
+
if (key === null)
|
|
105
|
+
continue; // NULL keys can't match
|
|
106
|
+
if (!probe.has(key)) {
|
|
107
|
+
probe.add(key);
|
|
108
|
+
seekByProbe.set(key, keyRow[keyColIdx]);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// An empty build side means the semi join emits nothing — the target
|
|
112
|
+
// must not be opened at all.
|
|
113
|
+
if (probe.size === 0) {
|
|
114
|
+
log('Key set empty — target not opened');
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const push = probe.size <= Math.min(plan.pushdown.maxKeys, plan.pushdown.breakEvenKeys);
|
|
118
|
+
let seekKeys = null;
|
|
119
|
+
if (push) {
|
|
120
|
+
seekKeys = [...seekByProbe.values()]
|
|
121
|
+
.sort((a, b) => seekSign * compareSqlValuesFast(a, b, seekCollation));
|
|
122
|
+
}
|
|
123
|
+
log('Key set drained: %d distinct keys, %s (breakEven=%d, max=%d)', probe.size, push ? 'seeking' : 'scanning', plan.pushdown.breakEvenKeys, plan.pushdown.maxKeys);
|
|
124
|
+
stateByCtx.set(rctx, { probe, seekKeys });
|
|
125
|
+
try {
|
|
126
|
+
for await (const targetRow of targetRows) {
|
|
127
|
+
const key = extractKey(targetRow, targetIndices);
|
|
128
|
+
if (key !== null && probe.has(key)) {
|
|
129
|
+
yield targetRow;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
stateByCtx.delete(rctx);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
params: [targetInstruction, keySourceInstruction],
|
|
139
|
+
run: asRun(run),
|
|
140
|
+
note: `key-set semi join (${plan.pushdown.indexName})`,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=key-set-semi-join.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-set-semi-join.js","sourceRoot":"","sources":["../../../../src/runtime/emit/key-set-semi-join.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-join.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/merge-join.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAC;AAI/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAiC9D;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,eAAe,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"merge-join.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/merge-join.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAC;AAI/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAiC9D;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,eAAe,GAAG,WAAW,CAwKpF"}
|
|
@@ -56,20 +56,27 @@ export function emitMergeJoin(plan, ctx) {
|
|
|
56
56
|
// lattice (explicit > declared > default > BINARY) so a merge key compares
|
|
57
57
|
// identically to the same `l.k = r.k` under any other join algorithm and the
|
|
58
58
|
// nested-loop fallback. Throws on an explicit/declared conflict — a loud
|
|
59
|
-
// backstop:
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
// physical
|
|
63
|
-
//
|
|
64
|
-
//
|
|
65
|
-
//
|
|
59
|
+
// backstop: the extractor declines conflicting pairs outright. LOCKSTEP:
|
|
60
|
+
// merge additionally needs both inputs sorted under THIS collation, and the
|
|
61
|
+
// physical ordering property is collation-blind — so the selection rules
|
|
62
|
+
// (`rule-join-physical-selection`, `rule-monotonic-merge-join`) admit merge
|
|
63
|
+
// only for pairs tagged `collationsMatch` (both sides declare the same
|
|
64
|
+
// collation, making the resolved key collation equal each input's declared
|
|
65
|
+
// sort collation; see EquiJoinPair.collationsMatch in join-utils.ts).
|
|
66
|
+
// Mismatched pairs go to hash join, whose emitter has no ordering premise.
|
|
66
67
|
const collationName = effectiveCollationOfTypes(leftAttributes[li].type, rightAttributes[ri].type);
|
|
67
68
|
const collationFunc = ctx.resolveCollation(collationName);
|
|
68
69
|
// When both sides declare the SAME semantic-ordering logical type (TIMESPAN,
|
|
69
70
|
// JSON), advance/match under the type's compare — the inputs are sorted by it
|
|
70
71
|
// (Sort and index order are typed since the semantic-ordering change), so a
|
|
71
72
|
// collation/text compare here would advance the wrong side and drop matches.
|
|
72
|
-
//
|
|
73
|
+
// Plain pairs (neither side semantic-ordering) keep the storage-class +
|
|
74
|
+
// collation compare. LOCKSTEP: a MIXED pair never arrives —
|
|
75
|
+
// `equi-pair-extractor`'s semantic-ordering gate declines it, because merge
|
|
76
|
+
// needs both inputs sorted in THIS comparator's order and a `timespan` side is
|
|
77
|
+
// sorted by elapsed time while a `text` side is sorted by text, so no single
|
|
78
|
+
// comparator merges them. That is why the gate declines rather than
|
|
79
|
+
// canonicalizing; see its docstring.
|
|
73
80
|
const leftLogical = leftAttributes[li].type.logicalType;
|
|
74
81
|
const rightLogical = rightAttributes[ri].type.logicalType;
|
|
75
82
|
keyComparators.push(leftLogical === rightLogical && hasSemanticOrdering(leftLogical)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-join.js","sourceRoot":"","sources":["../../../../src/runtime/emit/merge-join.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGhE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE5G,OAAO,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,GAAG,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAC;AAEpD;;;;GAIG;AACH,SAAS,WAAW,CACnB,OAAY,EACZ,QAAa,EACb,WAAqB,EACrB,YAAsB,EACtB,WAAwD;IAExD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC5C,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,GAAG,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;IAC3B,CAAC;IACD,OAAO,CAAC,CAAC;AACV,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,IAAmB,EAAE,GAAoB;IACtE,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IACjD,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IAEnD,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;IAC7D,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC;IAE/D,2DAA2D;IAC3D,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,cAAc,GAAgD,EAAE,CAAC;IACvE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;IAClD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QAClD,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,mDAAmD,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3G,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrB,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtB,wEAAwE;QACxE,2EAA2E;QAC3E,6EAA6E;QAC7E,yEAAyE;QACzE,
|
|
1
|
+
{"version":3,"file":"merge-join.js","sourceRoot":"","sources":["../../../../src/runtime/emit/merge-join.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { SqlValue } from "../../common/types.js";
|
|
2
|
+
import type { CollationFunction, LogicalType } from "../../types/logical-type.js";
|
|
3
|
+
/** Three-way comparison of a probe value against one operand value. */
|
|
4
|
+
export type OperandComparator = (probe: SqlValue, operand: SqlValue) => number;
|
|
5
|
+
/**
|
|
6
|
+
* Comparator for a group of declared operand types that are all compared against
|
|
7
|
+
* one another, selecting the SAME path `emitComparisonOp` would select for the
|
|
8
|
+
* equivalent binary comparison, so every comparison construct and its desugared
|
|
9
|
+
* form agree:
|
|
10
|
+
* - every operand declares the same semantic-ordering type (TIMESPAN, JSON) ⇒ that
|
|
11
|
+
* type's compare, matching the operator's typed fast path;
|
|
12
|
+
* - no operand is temporal and all share a category (all numeric or all textual) ⇒
|
|
13
|
+
* plain storage-class + collation compare, matching the operator's same-category
|
|
14
|
+
* fast path. Notably a plain TEXT column holding duration-shaped text ('PT30M')
|
|
15
|
+
* stays text-ordered here, exactly as `>=` leaves it;
|
|
16
|
+
* - otherwise ⇒ a runtime duration check first, matching the operator's generic path.
|
|
17
|
+
* This is what makes `greatest(timespan_col, 'PT30M')` rank by elapsed time even
|
|
18
|
+
* though the literal declares TEXT.
|
|
19
|
+
*
|
|
20
|
+
* This is THE one copy of the routing rule — {@link makeOperandComparator} is the
|
|
21
|
+
* two-operand case of it — so BETWEEN, `=`, simple CASE and the comparison builtins
|
|
22
|
+
* cannot drift apart. The collation must already be resolved through the shared
|
|
23
|
+
* provenance lattice (`planner/analysis/comparison-collation.ts`) by the caller.
|
|
24
|
+
*/
|
|
25
|
+
export declare function makeGroupComparator(logicals: readonly LogicalType[], collationFunc: CollationFunction): OperandComparator;
|
|
26
|
+
/**
|
|
27
|
+
* Comparator for ONE operand of a "probe against N independently-typed operands"
|
|
28
|
+
* construct (a BETWEEN bound, a simple-CASE WHEN value, a `nullif` pair) — the
|
|
29
|
+
* two-operand case of {@link makeGroupComparator}.
|
|
30
|
+
*/
|
|
31
|
+
export declare function makeOperandComparator(probeLogical: LogicalType, operandLogical: LogicalType, collationFunc: CollationFunction): OperandComparator;
|
|
32
|
+
/**
|
|
33
|
+
* Build the collation suffix for an instruction note over per-operand collations:
|
|
34
|
+
* nothing when every operand resolved to BINARY, a single name when they all agree,
|
|
35
|
+
* or the slash-joined per-operand list when they differ (BETWEEN's `lower/upper`
|
|
36
|
+
* generalizes to a simple CASE's one entry per WHEN clause). So `explain` shows what
|
|
37
|
+
* each operand is actually compared under.
|
|
38
|
+
*/
|
|
39
|
+
export declare function formatOperandCollationNote(collationNames: readonly string[]): string;
|
|
40
|
+
//# sourceMappingURL=operand-comparator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operand-comparator.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/operand-comparator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAGlF,uEAAuE;AACvE,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,KAAK,MAAM,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,SAAS,WAAW,EAAE,EAChC,aAAa,EAAE,iBAAiB,GAC9B,iBAAiB,CAanB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACpC,YAAY,EAAE,WAAW,EACzB,cAAc,EAAE,WAAW,EAC3B,aAAa,EAAE,iBAAiB,GAC9B,iBAAiB,CAEnB;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAOpF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { compareSqlValuesFast, createTypedComparator, hasSemanticOrdering } from "../../util/comparison.js";
|
|
2
|
+
import { tryTemporalCompare } from "./temporal-arithmetic.js";
|
|
3
|
+
/**
|
|
4
|
+
* Comparator for a group of declared operand types that are all compared against
|
|
5
|
+
* one another, selecting the SAME path `emitComparisonOp` would select for the
|
|
6
|
+
* equivalent binary comparison, so every comparison construct and its desugared
|
|
7
|
+
* form agree:
|
|
8
|
+
* - every operand declares the same semantic-ordering type (TIMESPAN, JSON) ⇒ that
|
|
9
|
+
* type's compare, matching the operator's typed fast path;
|
|
10
|
+
* - no operand is temporal and all share a category (all numeric or all textual) ⇒
|
|
11
|
+
* plain storage-class + collation compare, matching the operator's same-category
|
|
12
|
+
* fast path. Notably a plain TEXT column holding duration-shaped text ('PT30M')
|
|
13
|
+
* stays text-ordered here, exactly as `>=` leaves it;
|
|
14
|
+
* - otherwise ⇒ a runtime duration check first, matching the operator's generic path.
|
|
15
|
+
* This is what makes `greatest(timespan_col, 'PT30M')` rank by elapsed time even
|
|
16
|
+
* though the literal declares TEXT.
|
|
17
|
+
*
|
|
18
|
+
* This is THE one copy of the routing rule — {@link makeOperandComparator} is the
|
|
19
|
+
* two-operand case of it — so BETWEEN, `=`, simple CASE and the comparison builtins
|
|
20
|
+
* cannot drift apart. The collation must already be resolved through the shared
|
|
21
|
+
* provenance lattice (`planner/analysis/comparison-collation.ts`) by the caller.
|
|
22
|
+
*/
|
|
23
|
+
export function makeGroupComparator(logicals, collationFunc) {
|
|
24
|
+
const first = logicals[0];
|
|
25
|
+
if (first && logicals.every(l => l === first) && hasSemanticOrdering(first)) {
|
|
26
|
+
return createTypedComparator(first, collationFunc);
|
|
27
|
+
}
|
|
28
|
+
const needsTemporalCheck = logicals.some(l => l.isTemporal);
|
|
29
|
+
const sameCategory = logicals.every(l => l.isNumeric) || logicals.every(l => l.isTextual);
|
|
30
|
+
if (!needsTemporalCheck && sameCategory) {
|
|
31
|
+
return (a, b) => compareSqlValuesFast(a, b, collationFunc);
|
|
32
|
+
}
|
|
33
|
+
return (a, b) => tryTemporalCompare(a, b) ?? compareSqlValuesFast(a, b, collationFunc);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Comparator for ONE operand of a "probe against N independently-typed operands"
|
|
37
|
+
* construct (a BETWEEN bound, a simple-CASE WHEN value, a `nullif` pair) — the
|
|
38
|
+
* two-operand case of {@link makeGroupComparator}.
|
|
39
|
+
*/
|
|
40
|
+
export function makeOperandComparator(probeLogical, operandLogical, collationFunc) {
|
|
41
|
+
return makeGroupComparator([probeLogical, operandLogical], collationFunc);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Build the collation suffix for an instruction note over per-operand collations:
|
|
45
|
+
* nothing when every operand resolved to BINARY, a single name when they all agree,
|
|
46
|
+
* or the slash-joined per-operand list when they differ (BETWEEN's `lower/upper`
|
|
47
|
+
* generalizes to a simple CASE's one entry per WHEN clause). So `explain` shows what
|
|
48
|
+
* each operand is actually compared under.
|
|
49
|
+
*/
|
|
50
|
+
export function formatOperandCollationNote(collationNames) {
|
|
51
|
+
if (collationNames.length === 0)
|
|
52
|
+
return '';
|
|
53
|
+
const first = collationNames[0];
|
|
54
|
+
if (collationNames.every(name => name === first)) {
|
|
55
|
+
return first !== 'BINARY' ? ` ${first}` : '';
|
|
56
|
+
}
|
|
57
|
+
return ` ${collationNames.join('/')}`;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=operand-comparator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operand-comparator.js","sourceRoot":"","sources":["../../../../src/runtime/emit/operand-comparator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE5G,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAK9D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,mBAAmB,CAClC,QAAgC,EAChC,aAAgC;IAEhC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7E,OAAO,qBAAqB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,kBAAkB,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC1F,IAAI,CAAC,kBAAkB,IAAI,YAAY,EAAE,CAAC;QACzC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;AACxF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACpC,YAAyB,EACzB,cAA2B,EAC3B,aAAgC;IAEhC,OAAO,mBAAmB,CAAC,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,aAAa,CAAC,CAAC;AAC3E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CAAC,cAAiC;IAC3E,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAItG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAM9D;;;;;;;;GAQG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAChC,cAAc,EAAE,UAAU,EAC1B,UAAU,EAAE,cAAc,EAC1B,WAAW,EAAE,QAAQ,EAAE,KACnB,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC;;;;;;GAMG;AACH,wBAAgB,WAAW,CAC1B,IAAI,EAAE,WAAW,GAAG,aAAa,GAAG,aAAa,EACjD,GAAG,EAAE,eAAe,EACpB,kBAAkB,CAAC,EAAE,kBAAkB,GACrC,WAAW,
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAItG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAM9D;;;;;;;;GAQG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAChC,cAAc,EAAE,UAAU,EAC1B,UAAU,EAAE,cAAc,EAC1B,WAAW,EAAE,QAAQ,EAAE,KACnB,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC;;;;;;GAMG;AACH,wBAAgB,WAAW,CAC1B,IAAI,EAAE,WAAW,GAAG,aAAa,GAAG,aAAa,EACjD,GAAG,EAAE,eAAe,EACpB,kBAAkB,CAAC,EAAE,kBAAkB,GACrC,WAAW,CAoJb"}
|
|
@@ -58,16 +58,25 @@ export function emitSeqScan(plan, ctx, filterInfoOverride) {
|
|
|
58
58
|
vtabInstance = cachedInstance;
|
|
59
59
|
}
|
|
60
60
|
else {
|
|
61
|
+
// `schema.name` is the name this scan was EMITTED against. A deferred constraint
|
|
62
|
+
// evaluates a plan frozen at row-write time, so an `ALTER TABLE ... RENAME TO`
|
|
63
|
+
// later in the same transaction leaves that name pointing at nothing. The queue
|
|
64
|
+
// stamps the entry's old→new mapping onto the context while it evaluates; resolve
|
|
65
|
+
// through it so we connect under the name the table carries now. Undefined for
|
|
66
|
+
// every other execution, so this costs one optional lookup. Nothing else in this
|
|
67
|
+
// scan is name-bound — `schema.columns`, the row descriptor and the `FilterInfo`
|
|
68
|
+
// are positional, and a table rename changes no column.
|
|
69
|
+
const effectiveName = runtimeCtx.tableNameRemap?.get(`${schema.schemaName}.${schema.name}`.toLowerCase()) ?? schema.name;
|
|
61
70
|
try {
|
|
62
71
|
const options = {
|
|
63
72
|
...(schema.vtabArgs ?? {}),
|
|
64
73
|
...(source.readCommitted ? { _readCommitted: true } : {})
|
|
65
74
|
};
|
|
66
|
-
vtabInstance = await module.connect(runtimeCtx.db, capturedModuleInfo.auxData, schema.vtabModuleName, schema.schemaName,
|
|
75
|
+
vtabInstance = await module.connect(runtimeCtx.db, capturedModuleInfo.auxData, schema.vtabModuleName, schema.schemaName, effectiveName, options);
|
|
67
76
|
}
|
|
68
77
|
catch (e) {
|
|
69
78
|
const message = e instanceof Error ? e.message : String(e);
|
|
70
|
-
throw new QuereusError(`Module '${schema.vtabModuleName}' connect failed for table '${
|
|
79
|
+
throw new QuereusError(`Module '${schema.vtabModuleName}' connect failed for table '${effectiveName}': ${message}`, e instanceof QuereusError ? e.code : StatusCode.ERROR, e instanceof Error ? e : undefined);
|
|
71
80
|
}
|
|
72
81
|
if (connectionCache) {
|
|
73
82
|
connectionCache.set(scanConnectionKey, vtabInstance);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../../src/runtime/emit/scan.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../../src/runtime/emit/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,8 +42,11 @@ export declare class ParallelDriver {
|
|
|
42
42
|
* parent's entries — set/delete in one fork do not leak to siblings or parent;
|
|
43
43
|
* - **shared** references to read-mostly state: `db`, `stmt`, `params`,
|
|
44
44
|
* `enableMetrics`, `mutationOrdinal`, `signal`, `tracer`, `activeConnection`,
|
|
45
|
-
* `contextTracker`, `planStack`, `executionMemo`,
|
|
46
|
-
* `cteMaterializations`, `inSetProbes`.
|
|
45
|
+
* `tableNameRemap`, `contextTracker`, `planStack`, `executionMemo`,
|
|
46
|
+
* `scanConnections`, `cacheStates`, `cteMaterializations`, `inSetProbes`.
|
|
47
|
+
* (`tableNameRemap` is the deferred-constraint queue's per-entry old→new table
|
|
48
|
+
* name map; shared by reference and read-only, so a scan leaf inside a fork
|
|
49
|
+
* resolves the same post-rename name the parent would.)
|
|
47
50
|
* (`signal` is shared so every
|
|
48
51
|
* branch honors the same cooperative cancellation — the table-scan leaf reads
|
|
49
52
|
* `rctx.signal`.) (`mutationOrdinal` is a per-row INSERT/envelope
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parallel-driver.d.ts","sourceRoot":"","sources":["../../../src/runtime/parallel-driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAIN,qBAAqB,EACrB,qBAAqB,EAErB,MAAM,kBAAkB,CAAC;AAE1B;;;;GAIG;AACH,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,sFAAsF;IACtF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,oGAAoG;AACpG,MAAM,WAAW,iBAAiB,CAAC,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,qBAAa,cAAc;IAC1B
|
|
1
|
+
{"version":3,"file":"parallel-driver.d.ts","sourceRoot":"","sources":["../../../src/runtime/parallel-driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAIN,qBAAqB,EACrB,qBAAqB,EAErB,MAAM,kBAAkB,CAAC;AAE1B;;;;GAIG;AACH,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,sFAAsF;IACtF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,oGAAoG;AACpG,MAAM,WAAW,iBAAiB,CAAC,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,qBAAa,cAAc;IAC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsDG;IACH,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE;IA+CvD;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,CAAC,EACN,SAAS,EAAE,aAAa,CAAC,CAAC,GAAG,EAAE,cAAc,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,EACnE,KAAK,EAAE,aAAa,CAAC,cAAc,CAAC,EACpC,IAAI,CAAC,EAAE,oBAAoB,GACzB,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;CAQtC"}
|
|
@@ -27,8 +27,11 @@ export class ParallelDriver {
|
|
|
27
27
|
* parent's entries — set/delete in one fork do not leak to siblings or parent;
|
|
28
28
|
* - **shared** references to read-mostly state: `db`, `stmt`, `params`,
|
|
29
29
|
* `enableMetrics`, `mutationOrdinal`, `signal`, `tracer`, `activeConnection`,
|
|
30
|
-
* `contextTracker`, `planStack`, `executionMemo`,
|
|
31
|
-
* `cteMaterializations`, `inSetProbes`.
|
|
30
|
+
* `tableNameRemap`, `contextTracker`, `planStack`, `executionMemo`,
|
|
31
|
+
* `scanConnections`, `cacheStates`, `cteMaterializations`, `inSetProbes`.
|
|
32
|
+
* (`tableNameRemap` is the deferred-constraint queue's per-entry old→new table
|
|
33
|
+
* name map; shared by reference and read-only, so a scan leaf inside a fork
|
|
34
|
+
* resolves the same post-rename name the parent would.)
|
|
32
35
|
* (`signal` is shared so every
|
|
33
36
|
* branch honors the same cooperative cancellation — the table-scan leaf reads
|
|
34
37
|
* `rctx.signal`.) (`mutationOrdinal` is a per-row INSERT/envelope
|
|
@@ -95,6 +98,7 @@ export class ParallelDriver {
|
|
|
95
98
|
tableContexts: childTableContexts,
|
|
96
99
|
tracer: rctx.tracer,
|
|
97
100
|
activeConnection: rctx.activeConnection,
|
|
101
|
+
tableNameRemap: rctx.tableNameRemap,
|
|
98
102
|
enableMetrics: rctx.enableMetrics,
|
|
99
103
|
mutationOrdinal: rctx.mutationOrdinal,
|
|
100
104
|
signal: rctx.signal,
|