@quereus/quereus 2.8.0 → 2.9.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/dist/src/emit/ast-stringify.d.ts.map +1 -1
- package/dist/src/emit/ast-stringify.js +0 -3
- package/dist/src/emit/ast-stringify.js.map +1 -1
- package/dist/src/parser/ast.d.ts +3 -2
- package/dist/src/parser/ast.d.ts.map +1 -1
- package/dist/src/parser/parser.d.ts.map +1 -1
- package/dist/src/parser/parser.js +13 -4
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
- package/dist/src/planner/building/foreign-key-builder.js +3 -2
- package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
- package/dist/src/planner/building/select.js +14 -2
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/building/update.d.ts.map +1 -1
- package/dist/src/planner/building/update.js +10 -6
- package/dist/src/planner/building/update.js.map +1 -1
- package/dist/src/planner/framework/characteristics.d.ts +3 -1
- package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
- package/dist/src/planner/framework/characteristics.js +7 -0
- package/dist/src/planner/framework/characteristics.js.map +1 -1
- package/dist/src/planner/framework/physical-utils.d.ts +22 -1
- package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
- package/dist/src/planner/framework/physical-utils.js +47 -0
- package/dist/src/planner/framework/physical-utils.js.map +1 -1
- package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/alias-node.js +2 -0
- package/dist/src/planner/nodes/alias-node.js.map +1 -1
- package/dist/src/planner/nodes/asof-scan-node.d.ts +137 -0
- package/dist/src/planner/nodes/asof-scan-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/asof-scan-node.js +223 -0
- package/dist/src/planner/nodes/asof-scan-node.js.map +1 -0
- package/dist/src/planner/nodes/constraint-check-node.d.ts +3 -0
- package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
- package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/distinct-node.js +7 -0
- package/dist/src/planner/nodes/distinct-node.js.map +1 -1
- package/dist/src/planner/nodes/filter.d.ts.map +1 -1
- package/dist/src/planner/nodes/filter.js +2 -0
- package/dist/src/planner/nodes/filter.js.map +1 -1
- package/dist/src/planner/nodes/function.d.ts +11 -1
- package/dist/src/planner/nodes/function.d.ts.map +1 -1
- package/dist/src/planner/nodes/function.js +94 -1
- package/dist/src/planner/nodes/function.js.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/hash-aggregate.js +2 -0
- package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-node.js +10 -2
- package/dist/src/planner/nodes/join-node.js.map +1 -1
- package/dist/src/planner/nodes/join-utils.d.ts +19 -1
- package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
- package/dist/src/planner/nodes/join-utils.js +46 -0
- package/dist/src/planner/nodes/join-utils.js.map +1 -1
- package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +2 -0
- package/dist/src/planner/nodes/limit-offset.js.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/merge-join-node.js +4 -1
- package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
- package/dist/src/planner/nodes/ordinal-slice-node.d.ts +50 -0
- package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -0
- package/dist/src/planner/nodes/ordinal-slice-node.js +127 -0
- package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts +2 -0
- package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node-type.js +2 -0
- package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
- package/dist/src/planner/nodes/plan-node.d.ts +130 -1
- package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/plan-node.js +49 -0
- package/dist/src/planner/nodes/plan-node.js.map +1 -1
- package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/project-node.js +6 -1
- package/dist/src/planner/nodes/project-node.js.map +1 -1
- package/dist/src/planner/nodes/reference.d.ts +4 -1
- package/dist/src/planner/nodes/reference.d.ts.map +1 -1
- package/dist/src/planner/nodes/reference.js +16 -0
- package/dist/src/planner/nodes/reference.js.map +1 -1
- package/dist/src/planner/nodes/scalar.d.ts +7 -1
- package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
- package/dist/src/planner/nodes/scalar.js +100 -1
- package/dist/src/planner/nodes/scalar.js.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts +2 -1
- package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/set-operation-node.js +9 -0
- package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
- package/dist/src/planner/nodes/sort.d.ts.map +1 -1
- package/dist/src/planner/nodes/sort.js +20 -0
- package/dist/src/planner/nodes/sort.js.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
- package/dist/src/planner/nodes/stream-aggregate.js +2 -0
- package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts +37 -2
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +87 -10
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/nodes/update-node.d.ts +1 -3
- package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/update-node.js +3 -9
- package/dist/src/planner/nodes/update-node.js.map +1 -1
- package/dist/src/planner/nodes/window-node.d.ts +61 -2
- package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
- package/dist/src/planner/nodes/window-node.js +64 -3
- package/dist/src/planner/nodes/window-node.js.map +1 -1
- package/dist/src/planner/optimizer-tuning.d.ts +9 -0
- package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
- package/dist/src/planner/optimizer-tuning.js +3 -0
- package/dist/src/planner/optimizer-tuning.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +91 -0
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/rules/access/rule-asof-strategy-select.d.ts +30 -0
- package/dist/src/planner/rules/access/rule-asof-strategy-select.d.ts.map +1 -0
- package/dist/src/planner/rules/access/rule-asof-strategy-select.js +112 -0
- package/dist/src/planner/rules/access/rule-asof-strategy-select.js.map +1 -0
- package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.d.ts +33 -0
- package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.d.ts.map +1 -0
- package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.js +162 -0
- package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.js.map +1 -0
- package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts +29 -0
- package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts.map +1 -0
- package/dist/src/planner/rules/access/rule-monotonic-range-access.js +175 -0
- package/dist/src/planner/rules/access/rule-monotonic-range-access.js.map +1 -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 -10
- 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 +61 -0
- package/dist/src/planner/rules/join/equi-pair-extractor.d.ts.map +1 -0
- package/dist/src/planner/rules/join/equi-pair-extractor.js +155 -0
- package/dist/src/planner/rules/join/equi-pair-extractor.js.map +1 -0
- 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 +2 -122
- package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.d.ts +21 -0
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.js +405 -0
- package/dist/src/planner/rules/join/rule-lateral-top1-asof.js.map +1 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts +31 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts.map +1 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js +113 -0
- package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -0
- package/dist/src/planner/rules/window/rule-monotonic-window.d.ts +47 -0
- package/dist/src/planner/rules/window/rule-monotonic-window.d.ts.map +1 -0
- package/dist/src/planner/rules/window/rule-monotonic-window.js +341 -0
- package/dist/src/planner/rules/window/rule-monotonic-window.js.map +1 -0
- package/dist/src/runtime/context-helpers.d.ts +9 -0
- package/dist/src/runtime/context-helpers.d.ts.map +1 -1
- package/dist/src/runtime/context-helpers.js +5 -0
- package/dist/src/runtime/context-helpers.js.map +1 -1
- package/dist/src/runtime/emit/asof-scan.d.ts +10 -0
- package/dist/src/runtime/emit/asof-scan.d.ts.map +1 -0
- package/dist/src/runtime/emit/asof-scan.js +467 -0
- package/dist/src/runtime/emit/asof-scan.js.map +1 -0
- package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
- package/dist/src/runtime/emit/constraint-check.js +20 -0
- package/dist/src/runtime/emit/constraint-check.js.map +1 -1
- package/dist/src/runtime/emit/ordinal-slice.d.ts +13 -0
- package/dist/src/runtime/emit/ordinal-slice.d.ts.map +1 -0
- package/dist/src/runtime/emit/ordinal-slice.js +89 -0
- package/dist/src/runtime/emit/ordinal-slice.js.map +1 -0
- package/dist/src/runtime/emit/returning.d.ts.map +1 -1
- package/dist/src/runtime/emit/returning.js +9 -4
- package/dist/src/runtime/emit/returning.js.map +1 -1
- package/dist/src/runtime/emit/scan.d.ts +19 -3
- package/dist/src/runtime/emit/scan.d.ts.map +1 -1
- package/dist/src/runtime/emit/scan.js +12 -8
- package/dist/src/runtime/emit/scan.js.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -1
- package/dist/src/runtime/emit/schema-declarative.js +91 -14
- package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
- package/dist/src/runtime/emit/window.d.ts.map +1 -1
- package/dist/src/runtime/emit/window.js +732 -37
- package/dist/src/runtime/emit/window.js.map +1 -1
- package/dist/src/runtime/foreign-key-actions.js +5 -4
- package/dist/src/runtime/foreign-key-actions.js.map +1 -1
- package/dist/src/runtime/register.d.ts.map +1 -1
- package/dist/src/runtime/register.js +4 -0
- package/dist/src/runtime/register.js.map +1 -1
- package/dist/src/schema/catalog.d.ts +10 -0
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +29 -6
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/function.d.ts +24 -0
- 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 +10 -0
- package/dist/src/schema/manager.d.ts.map +1 -1
- package/dist/src/schema/manager.js +10 -0
- package/dist/src/schema/manager.js.map +1 -1
- package/dist/src/schema/schema-differ.d.ts +18 -1
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +307 -42
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/types/logical-type.d.ts +11 -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/util/ast-literal.d.ts +11 -0
- package/dist/src/util/ast-literal.d.ts.map +1 -0
- package/dist/src/util/ast-literal.js +26 -0
- package/dist/src/util/ast-literal.js.map +1 -0
- package/dist/src/vtab/best-access-plan.d.ts +41 -0
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js +29 -0
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/filter-info.d.ts +14 -0
- package/dist/src/vtab/filter-info.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.d.ts +39 -1
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +206 -44
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/module.d.ts +24 -0
- package/dist/src/vtab/module.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helper: extract equi-join pairs and residual predicate from an ON
|
|
3
|
+
* condition. Used by both `rule-join-physical-selection` (ordering-based) and
|
|
4
|
+
* `rule-monotonic-merge-join` (MonotonicOn-based).
|
|
5
|
+
*/
|
|
6
|
+
import { BinaryOpNode } from '../../nodes/scalar.js';
|
|
7
|
+
import { ColumnReferenceNode } from '../../nodes/reference.js';
|
|
8
|
+
import { normalizePredicate } from '../../analysis/predicate-normalizer.js';
|
|
9
|
+
import { PlanNodeCharacteristics } from '../../framework/characteristics.js';
|
|
10
|
+
/**
|
|
11
|
+
* Check whether `source`'s `physical.ordering` covers the given equi-pair
|
|
12
|
+
* columns positionally for the chosen `side` (the merge-join emitter compares
|
|
13
|
+
* keys in equi-pair order, so the source must be ASC-sorted on each
|
|
14
|
+
* equi-pair attribute at exactly that position). Returns false on the first
|
|
15
|
+
* mismatch.
|
|
16
|
+
*/
|
|
17
|
+
export function isOrderedOnEquiPairs(source, equiPairs, side) {
|
|
18
|
+
const ordering = PlanNodeCharacteristics.getOrdering(source);
|
|
19
|
+
if (!ordering || ordering.length === 0)
|
|
20
|
+
return false;
|
|
21
|
+
if (equiPairs.length > ordering.length)
|
|
22
|
+
return false;
|
|
23
|
+
const attrs = source.getAttributes();
|
|
24
|
+
for (let i = 0; i < equiPairs.length; i++) {
|
|
25
|
+
const attrId = side === 'left' ? equiPairs[i].leftAttrId : equiPairs[i].rightAttrId;
|
|
26
|
+
const idx = attrs.findIndex(a => a.id === attrId);
|
|
27
|
+
if (idx === -1)
|
|
28
|
+
return false;
|
|
29
|
+
if (ordering[i].column !== idx || ordering[i].desc)
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Reorder equi-pairs so they line up with the left source's ordering prefix,
|
|
36
|
+
* and verify the right source agrees on the same reordered key sequence.
|
|
37
|
+
* Returns null when no reordering can satisfy both sides simultaneously.
|
|
38
|
+
*/
|
|
39
|
+
export function reorderEquiPairsForMerge(equiPairs, left, right) {
|
|
40
|
+
const leftOrdering = PlanNodeCharacteristics.getOrdering(left);
|
|
41
|
+
if (!leftOrdering || leftOrdering.length < equiPairs.length)
|
|
42
|
+
return null;
|
|
43
|
+
const leftAttrs = left.getAttributes();
|
|
44
|
+
const colToEqIdx = new Map();
|
|
45
|
+
for (let i = 0; i < equiPairs.length; i++) {
|
|
46
|
+
const attrIdx = leftAttrs.findIndex(a => a.id === equiPairs[i].leftAttrId);
|
|
47
|
+
if (attrIdx === -1)
|
|
48
|
+
return null;
|
|
49
|
+
colToEqIdx.set(attrIdx, i);
|
|
50
|
+
}
|
|
51
|
+
const reordered = [];
|
|
52
|
+
for (let i = 0; i < equiPairs.length; i++) {
|
|
53
|
+
const eqIdx = colToEqIdx.get(leftOrdering[i].column);
|
|
54
|
+
if (eqIdx === undefined || leftOrdering[i].desc)
|
|
55
|
+
return null;
|
|
56
|
+
reordered.push(equiPairs[eqIdx]);
|
|
57
|
+
}
|
|
58
|
+
if (!isOrderedOnEquiPairs(right, reordered, 'right'))
|
|
59
|
+
return null;
|
|
60
|
+
return reordered;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* True when both sides' physical ordering covers ALL equi-pairs in the
|
|
64
|
+
* exact (or reorderable) order required by the merge-join emitter. When this
|
|
65
|
+
* holds the ordering-based rule will produce a multi-key merge join with
|
|
66
|
+
* proper unique-key propagation; rules that demote pairs to residual should
|
|
67
|
+
* defer to that path instead of taking a single-pair merge.
|
|
68
|
+
*/
|
|
69
|
+
export function isMergeReadyOnAllPairs(left, right, equiPairs) {
|
|
70
|
+
if (isOrderedOnEquiPairs(left, equiPairs, 'left') && isOrderedOnEquiPairs(right, equiPairs, 'right')) {
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
if (equiPairs.length > 1) {
|
|
74
|
+
return reorderEquiPairsForMerge(equiPairs, left, right) !== null;
|
|
75
|
+
}
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
/** Combine an existing residual and a list of extra scalar conjuncts into a single AND-tree. */
|
|
79
|
+
export function combineResidual(base, extras) {
|
|
80
|
+
const all = [];
|
|
81
|
+
if (base)
|
|
82
|
+
all.push(base);
|
|
83
|
+
for (const e of extras)
|
|
84
|
+
all.push(e);
|
|
85
|
+
if (all.length === 0)
|
|
86
|
+
return undefined;
|
|
87
|
+
if (all.length === 1)
|
|
88
|
+
return all[0];
|
|
89
|
+
return all.reduce((acc, cur) => new BinaryOpNode(cur.scope, { type: 'binary', operator: 'AND', left: acc.expression, right: cur.expression }, acc, cur));
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Extract equi-join pairs and residual predicates from an ON condition.
|
|
93
|
+
* Returns null if no equi-pairs are found.
|
|
94
|
+
*/
|
|
95
|
+
export function extractEquiPairs(condition, leftAttrIds, rightAttrIds) {
|
|
96
|
+
if (!condition)
|
|
97
|
+
return null;
|
|
98
|
+
const norm = normalizePredicate(condition);
|
|
99
|
+
const equiPairs = [];
|
|
100
|
+
const equiPairNodes = [];
|
|
101
|
+
const residuals = [];
|
|
102
|
+
const stack = [norm];
|
|
103
|
+
while (stack.length) {
|
|
104
|
+
const n = stack.pop();
|
|
105
|
+
if (n instanceof BinaryOpNode && n.expression.operator === 'AND') {
|
|
106
|
+
stack.push(n.left, n.right);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
let isEqui = false;
|
|
110
|
+
if (n instanceof BinaryOpNode && n.expression.operator === '=') {
|
|
111
|
+
if (n.left instanceof ColumnReferenceNode && n.right instanceof ColumnReferenceNode) {
|
|
112
|
+
const lId = n.left.attributeId;
|
|
113
|
+
const rId = n.right.attributeId;
|
|
114
|
+
if (leftAttrIds.has(lId) && rightAttrIds.has(rId)) {
|
|
115
|
+
equiPairs.push({ leftAttrId: lId, rightAttrId: rId });
|
|
116
|
+
equiPairNodes.push(n);
|
|
117
|
+
isEqui = true;
|
|
118
|
+
}
|
|
119
|
+
else if (leftAttrIds.has(rId) && rightAttrIds.has(lId)) {
|
|
120
|
+
equiPairs.push({ leftAttrId: rId, rightAttrId: lId });
|
|
121
|
+
equiPairNodes.push(n);
|
|
122
|
+
isEqui = true;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (!isEqui) {
|
|
127
|
+
residuals.push(n);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (equiPairs.length === 0)
|
|
131
|
+
return null;
|
|
132
|
+
const residual = combineResidual(undefined, residuals);
|
|
133
|
+
return { equiPairs, residual, equiPairNodes };
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Convert USING-column names into equi-pairs given the left/right attributes.
|
|
137
|
+
* Returns null if no pairs could be matched.
|
|
138
|
+
*/
|
|
139
|
+
export function extractEquiPairsFromUsing(usingColumns, leftAttrs, rightAttrs) {
|
|
140
|
+
if (!usingColumns || usingColumns.length === 0)
|
|
141
|
+
return null;
|
|
142
|
+
const equiPairs = [];
|
|
143
|
+
for (const colName of usingColumns) {
|
|
144
|
+
const lower = colName.toLowerCase();
|
|
145
|
+
const leftAttr = leftAttrs.find(a => a.name.toLowerCase() === lower);
|
|
146
|
+
const rightAttr = rightAttrs.find(a => a.name.toLowerCase() === lower);
|
|
147
|
+
if (leftAttr && rightAttr) {
|
|
148
|
+
equiPairs.push({ leftAttrId: leftAttr.id, rightAttrId: rightAttr.id });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (equiPairs.length === 0)
|
|
152
|
+
return null;
|
|
153
|
+
return { equiPairs, residual: undefined, equiPairNodes: equiPairs.map(() => undefined) };
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=equi-pair-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"equi-pair-extractor.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/equi-pair-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-join-physical-selection.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-physical-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAiD,MAAM,0BAA0B,CAAC;AACxG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"rule-join-physical-selection.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-physical-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAiD,MAAM,0BAA0B,CAAC;AACxG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AA+C7D,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAqI/F"}
|
|
@@ -15,118 +15,10 @@ import { JoinNode } from '../../nodes/join-node.js';
|
|
|
15
15
|
import { BloomJoinNode } from '../../nodes/bloom-join-node.js';
|
|
16
16
|
import { MergeJoinNode } from '../../nodes/merge-join-node.js';
|
|
17
17
|
import { SortNode } from '../../nodes/sort.js';
|
|
18
|
-
import { BinaryOpNode } from '../../nodes/scalar.js';
|
|
19
18
|
import { ColumnReferenceNode } from '../../nodes/reference.js';
|
|
20
|
-
import { normalizePredicate } from '../../analysis/predicate-normalizer.js';
|
|
21
19
|
import { nestedLoopJoinCost, hashJoinCost, mergeJoinCost } from '../../cost/index.js';
|
|
22
|
-
import {
|
|
20
|
+
import { extractEquiPairs, extractEquiPairsFromUsing, isOrderedOnEquiPairs, reorderEquiPairsForMerge, } from './equi-pair-extractor.js';
|
|
23
21
|
const log = createLogger('optimizer:rule:join-physical-selection');
|
|
24
|
-
/**
|
|
25
|
-
* Extract equi-join pairs and residual predicates from an ON condition.
|
|
26
|
-
* Returns null if no equi-pairs found.
|
|
27
|
-
*/
|
|
28
|
-
function extractEquiPairs(condition, leftAttrIds, rightAttrIds) {
|
|
29
|
-
if (!condition)
|
|
30
|
-
return null;
|
|
31
|
-
const norm = normalizePredicate(condition);
|
|
32
|
-
const equiPairs = [];
|
|
33
|
-
const residuals = [];
|
|
34
|
-
// Walk AND-tree and classify each conjunct
|
|
35
|
-
const stack = [norm];
|
|
36
|
-
while (stack.length) {
|
|
37
|
-
const n = stack.pop();
|
|
38
|
-
if (n instanceof BinaryOpNode && n.expression.operator === 'AND') {
|
|
39
|
-
stack.push(n.left, n.right);
|
|
40
|
-
continue;
|
|
41
|
-
}
|
|
42
|
-
// Check for equi-join: col_ref = col_ref across left/right
|
|
43
|
-
let isEqui = false;
|
|
44
|
-
if (n instanceof BinaryOpNode && n.expression.operator === '=') {
|
|
45
|
-
if (n.left instanceof ColumnReferenceNode && n.right instanceof ColumnReferenceNode) {
|
|
46
|
-
const lId = n.left.attributeId;
|
|
47
|
-
const rId = n.right.attributeId;
|
|
48
|
-
if (leftAttrIds.has(lId) && rightAttrIds.has(rId)) {
|
|
49
|
-
equiPairs.push({ leftAttrId: lId, rightAttrId: rId });
|
|
50
|
-
isEqui = true;
|
|
51
|
-
}
|
|
52
|
-
else if (leftAttrIds.has(rId) && rightAttrIds.has(lId)) {
|
|
53
|
-
equiPairs.push({ leftAttrId: rId, rightAttrId: lId });
|
|
54
|
-
isEqui = true;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
if (!isEqui) {
|
|
59
|
-
residuals.push(n);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
if (equiPairs.length === 0)
|
|
63
|
-
return null;
|
|
64
|
-
// Combine residuals back into an AND-tree
|
|
65
|
-
let residual;
|
|
66
|
-
if (residuals.length > 0) {
|
|
67
|
-
residual = residuals.reduce((acc, cur) => new BinaryOpNode(cur.scope, { type: 'binary', operator: 'AND', left: acc.expression, right: cur.expression }, acc, cur));
|
|
68
|
-
}
|
|
69
|
-
return { equiPairs, residual };
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Check if a source's ordering covers the given equi-pair columns.
|
|
73
|
-
* Returns true if the source is already sorted ascending on the equi-pair
|
|
74
|
-
* columns in the exact order the equi-pairs specify. Positional matching
|
|
75
|
-
* is required because the merge-join emitter compares keys in equi-pair
|
|
76
|
-
* order; a mismatch (e.g. source sorted (b, a) vs equi-pairs (a, b))
|
|
77
|
-
* would break the linear-scan invariant.
|
|
78
|
-
*/
|
|
79
|
-
function isOrderedOnEquiPairs(source, equiPairs, side) {
|
|
80
|
-
const ordering = PlanNodeCharacteristics.getOrdering(source);
|
|
81
|
-
if (!ordering || ordering.length === 0)
|
|
82
|
-
return false;
|
|
83
|
-
if (equiPairs.length > ordering.length)
|
|
84
|
-
return false;
|
|
85
|
-
const attrs = source.getAttributes();
|
|
86
|
-
for (let i = 0; i < equiPairs.length; i++) {
|
|
87
|
-
const attrId = side === 'left' ? equiPairs[i].leftAttrId : equiPairs[i].rightAttrId;
|
|
88
|
-
const idx = attrs.findIndex(a => a.id === attrId);
|
|
89
|
-
if (idx === -1)
|
|
90
|
-
return false;
|
|
91
|
-
// Ordering entry at position i must match this equi-pair column and
|
|
92
|
-
// must be ascending (merge join's compareKeys assumes ASC order).
|
|
93
|
-
if (ordering[i].column !== idx || ordering[i].desc)
|
|
94
|
-
return false;
|
|
95
|
-
}
|
|
96
|
-
return true;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Reorder equi-pairs to match the left source's physical ordering prefix.
|
|
100
|
-
* The merge-join emitter compares keys in equi-pair order, so the pairs
|
|
101
|
-
* must align with both sources' sort order. Returns null if the pairs
|
|
102
|
-
* cannot be reordered to match both sides simultaneously.
|
|
103
|
-
*/
|
|
104
|
-
function reorderEquiPairsForMerge(equiPairs, left, right) {
|
|
105
|
-
const leftOrdering = PlanNodeCharacteristics.getOrdering(left);
|
|
106
|
-
if (!leftOrdering || leftOrdering.length < equiPairs.length)
|
|
107
|
-
return null;
|
|
108
|
-
const leftAttrs = left.getAttributes();
|
|
109
|
-
// Build a map from left column index → equi-pair index
|
|
110
|
-
const colToEqIdx = new Map();
|
|
111
|
-
for (let i = 0; i < equiPairs.length; i++) {
|
|
112
|
-
const attrIdx = leftAttrs.findIndex(a => a.id === equiPairs[i].leftAttrId);
|
|
113
|
-
if (attrIdx === -1)
|
|
114
|
-
return null;
|
|
115
|
-
colToEqIdx.set(attrIdx, i);
|
|
116
|
-
}
|
|
117
|
-
// Reorder to match the left ordering prefix
|
|
118
|
-
const reordered = [];
|
|
119
|
-
for (let i = 0; i < equiPairs.length; i++) {
|
|
120
|
-
const eqIdx = colToEqIdx.get(leftOrdering[i].column);
|
|
121
|
-
if (eqIdx === undefined || leftOrdering[i].desc)
|
|
122
|
-
return null;
|
|
123
|
-
reordered.push(equiPairs[eqIdx]);
|
|
124
|
-
}
|
|
125
|
-
// Verify the reordered pairs also match the right source's ordering
|
|
126
|
-
if (!isOrderedOnEquiPairs(right, reordered, 'right'))
|
|
127
|
-
return null;
|
|
128
|
-
return reordered;
|
|
129
|
-
}
|
|
130
22
|
/**
|
|
131
23
|
* Create a SortNode that sorts a source on the equi-pair columns for this side.
|
|
132
24
|
*/
|
|
@@ -165,19 +57,7 @@ export function ruleJoinPhysicalSelection(node, _context) {
|
|
|
165
57
|
extracted = extractEquiPairs(node.condition, leftAttrIds, rightAttrIds);
|
|
166
58
|
}
|
|
167
59
|
else if (node.usingColumns) {
|
|
168
|
-
|
|
169
|
-
const equiPairs = [];
|
|
170
|
-
for (const colName of node.usingColumns) {
|
|
171
|
-
const lowerName = colName.toLowerCase();
|
|
172
|
-
const leftAttr = leftAttrs.find(a => a.name.toLowerCase() === lowerName);
|
|
173
|
-
const rightAttr = rightAttrs.find(a => a.name.toLowerCase() === lowerName);
|
|
174
|
-
if (leftAttr && rightAttr) {
|
|
175
|
-
equiPairs.push({ leftAttrId: leftAttr.id, rightAttrId: rightAttr.id });
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
if (equiPairs.length > 0) {
|
|
179
|
-
extracted = { equiPairs, residual: undefined };
|
|
180
|
-
}
|
|
60
|
+
extracted = extractEquiPairsFromUsing(node.usingColumns, leftAttrs, rightAttrs);
|
|
181
61
|
}
|
|
182
62
|
if (!extracted || extracted.equiPairs.length === 0)
|
|
183
63
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-join-physical-selection.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-physical-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,aAAa,EAAqB,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"rule-join-physical-selection.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-physical-selection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: Recognize lateral-top-1 over asof predicate, replace with AsofScanNode.
|
|
3
|
+
*
|
|
4
|
+
* Pattern (the rule peels through these in any nesting order, ignoring AliasNode):
|
|
5
|
+
*
|
|
6
|
+
* JoinNode (joinType ∈ {inner, left, cross} with `on true` or no condition)
|
|
7
|
+
* left: Left
|
|
8
|
+
* right: AliasNode? | ProjectNode | LimitOffsetNode(LIMIT 1, no OFFSET) | SortNode
|
|
9
|
+
* ...peeled in any nesting order...
|
|
10
|
+
* └─ FilterNode (ANDed: q.K op left.K AND q.P_i = left.P_i ...)
|
|
11
|
+
* └─ <physical right> with monotonicOn(K) and accessCapabilities.asofRight
|
|
12
|
+
*
|
|
13
|
+
* The right side must be correlated against the left (uses outer columns). On
|
|
14
|
+
* a successful match we emit an AsofScanNode preserving the JoinNode's output
|
|
15
|
+
* attribute IDs; otherwise we return null and the existing physical-join
|
|
16
|
+
* selection takes over.
|
|
17
|
+
*/
|
|
18
|
+
import type { PlanNode } from '../../nodes/plan-node.js';
|
|
19
|
+
import type { OptContext } from '../../framework/context.js';
|
|
20
|
+
export declare function ruleLateralTop1Asof(node: PlanNode, context: OptContext): PlanNode | null;
|
|
21
|
+
//# sourceMappingURL=rule-lateral-top1-asof.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-lateral-top1-asof.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-lateral-top1-asof.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAiD,MAAM,0BAA0B,CAAC;AAExG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAmT7D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAgGxF"}
|