@quereus/quereus 4.15.2 → 4.17.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.
Files changed (193) hide show
  1. package/dist/src/core/database-auto-analyze.d.ts +258 -0
  2. package/dist/src/core/database-auto-analyze.d.ts.map +1 -0
  3. package/dist/src/core/database-auto-analyze.js +616 -0
  4. package/dist/src/core/database-auto-analyze.js.map +1 -0
  5. package/dist/src/core/database-materialized-views.d.ts +42 -1
  6. package/dist/src/core/database-materialized-views.d.ts.map +1 -1
  7. package/dist/src/core/database-materialized-views.js +76 -3
  8. package/dist/src/core/database-materialized-views.js.map +1 -1
  9. package/dist/src/core/database-transaction.d.ts +17 -0
  10. package/dist/src/core/database-transaction.d.ts.map +1 -1
  11. package/dist/src/core/database-transaction.js +37 -0
  12. package/dist/src/core/database-transaction.js.map +1 -1
  13. package/dist/src/core/database.d.ts +8 -1
  14. package/dist/src/core/database.d.ts.map +1 -1
  15. package/dist/src/core/database.js +135 -5
  16. package/dist/src/core/database.js.map +1 -1
  17. package/dist/src/index.d.ts +1 -1
  18. package/dist/src/index.d.ts.map +1 -1
  19. package/dist/src/index.js +1 -1
  20. package/dist/src/index.js.map +1 -1
  21. package/dist/src/planner/analysis/change-scope.d.ts.map +1 -1
  22. package/dist/src/planner/analysis/change-scope.js +8 -8
  23. package/dist/src/planner/analysis/change-scope.js.map +1 -1
  24. package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
  25. package/dist/src/planner/analysis/constraint-extractor.js +27 -14
  26. package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
  27. package/dist/src/planner/analysis/expression-fingerprint.d.ts.map +1 -1
  28. package/dist/src/planner/analysis/expression-fingerprint.js +23 -2
  29. package/dist/src/planner/analysis/expression-fingerprint.js.map +1 -1
  30. package/dist/src/planner/analysis/mv-body-functions.d.ts +46 -0
  31. package/dist/src/planner/analysis/mv-body-functions.d.ts.map +1 -0
  32. package/dist/src/planner/analysis/mv-body-functions.js +65 -0
  33. package/dist/src/planner/analysis/mv-body-functions.js.map +1 -0
  34. package/dist/src/planner/analysis/predicate-shape.d.ts +32 -4
  35. package/dist/src/planner/analysis/predicate-shape.d.ts.map +1 -1
  36. package/dist/src/planner/analysis/predicate-shape.js +37 -5
  37. package/dist/src/planner/analysis/predicate-shape.js.map +1 -1
  38. package/dist/src/planner/analysis/query-rewrite-matcher.d.ts +2 -2
  39. package/dist/src/planner/analysis/query-rewrite-matcher.d.ts.map +1 -1
  40. package/dist/src/planner/analysis/query-rewrite-matcher.js +46 -6
  41. package/dist/src/planner/analysis/query-rewrite-matcher.js.map +1 -1
  42. package/dist/src/planner/analysis/sat-checker.js +2 -5
  43. package/dist/src/planner/analysis/sat-checker.js.map +1 -1
  44. package/dist/src/planner/building/select-aggregates.d.ts +17 -5
  45. package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
  46. package/dist/src/planner/building/select-aggregates.js +122 -79
  47. package/dist/src/planner/building/select-aggregates.js.map +1 -1
  48. package/dist/src/planner/building/select-modifiers.d.ts +1 -1
  49. package/dist/src/planner/building/select.d.ts.map +1 -1
  50. package/dist/src/planner/building/select.js +73 -55
  51. package/dist/src/planner/building/select.js.map +1 -1
  52. package/dist/src/planner/cost/index.d.ts +14 -0
  53. package/dist/src/planner/cost/index.d.ts.map +1 -1
  54. package/dist/src/planner/cost/index.js +19 -0
  55. package/dist/src/planner/cost/index.js.map +1 -1
  56. package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
  57. package/dist/src/planner/nodes/limit-offset.js +3 -2
  58. package/dist/src/planner/nodes/limit-offset.js.map +1 -1
  59. package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
  60. package/dist/src/planner/nodes/table-access-nodes.js +31 -7
  61. package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
  62. package/dist/src/planner/optimizer-tuning.d.ts +10 -6
  63. package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
  64. package/dist/src/planner/optimizer-tuning.js.map +1 -1
  65. package/dist/src/planner/optimizer.d.ts.map +1 -1
  66. package/dist/src/planner/optimizer.js +24 -0
  67. package/dist/src/planner/optimizer.js.map +1 -1
  68. package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts.map +1 -1
  69. package/dist/src/planner/rules/access/rule-monotonic-range-access.js +8 -4
  70. package/dist/src/planner/rules/access/rule-monotonic-range-access.js.map +1 -1
  71. package/dist/src/planner/rules/access/rule-select-access-path.d.ts +14 -0
  72. package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
  73. package/dist/src/planner/rules/access/rule-select-access-path.js +5 -1
  74. package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
  75. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts +3 -1
  76. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts.map +1 -1
  77. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js +8 -3
  78. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js.map +1 -1
  79. package/dist/src/planner/rules/aggregate/rule-minmax-index-boundary.d.ts +47 -0
  80. package/dist/src/planner/rules/aggregate/rule-minmax-index-boundary.d.ts.map +1 -0
  81. package/dist/src/planner/rules/aggregate/rule-minmax-index-boundary.js +200 -0
  82. package/dist/src/planner/rules/aggregate/rule-minmax-index-boundary.js.map +1 -0
  83. package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.d.ts +29 -0
  84. package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.d.ts.map +1 -1
  85. package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.js +55 -16
  86. package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.js.map +1 -1
  87. package/dist/src/planner/rules/join/index-nested-loop.d.ts +96 -22
  88. package/dist/src/planner/rules/join/index-nested-loop.d.ts.map +1 -1
  89. package/dist/src/planner/rules/join/index-nested-loop.js +401 -82
  90. package/dist/src/planner/rules/join/index-nested-loop.js.map +1 -1
  91. package/dist/src/planner/rules/join/rule-fanout-batched-outer.d.ts +20 -0
  92. package/dist/src/planner/rules/join/rule-fanout-batched-outer.d.ts.map +1 -1
  93. package/dist/src/planner/rules/join/rule-fanout-batched-outer.js +23 -4
  94. package/dist/src/planner/rules/join/rule-fanout-batched-outer.js.map +1 -1
  95. package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -1
  96. package/dist/src/planner/rules/join/rule-join-greedy-commute.js +7 -0
  97. package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -1
  98. package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts +19 -2
  99. package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
  100. package/dist/src/planner/rules/join/rule-join-physical-selection.js +262 -40
  101. package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
  102. package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.d.ts.map +1 -1
  103. package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.js +2 -1
  104. package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.js.map +1 -1
  105. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts +21 -0
  106. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -1
  107. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +24 -6
  108. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
  109. package/dist/src/planner/rules/shared/access-leaf.d.ts +12 -12
  110. package/dist/src/planner/rules/shared/access-leaf.d.ts.map +1 -1
  111. package/dist/src/planner/rules/shared/access-leaf.js +3 -14
  112. package/dist/src/planner/rules/shared/access-leaf.js.map +1 -1
  113. package/dist/src/planner/stats/analyze.d.ts.map +1 -1
  114. package/dist/src/planner/stats/analyze.js +9 -3
  115. package/dist/src/planner/stats/analyze.js.map +1 -1
  116. package/dist/src/planner/stats/catalog-stats.d.ts.map +1 -1
  117. package/dist/src/planner/stats/catalog-stats.js +6 -10
  118. package/dist/src/planner/stats/catalog-stats.js.map +1 -1
  119. package/dist/src/planner/type-utils.d.ts.map +1 -1
  120. package/dist/src/planner/type-utils.js +3 -5
  121. package/dist/src/planner/type-utils.js.map +1 -1
  122. package/dist/src/planner/util/fd-utils.d.ts.map +1 -1
  123. package/dist/src/planner/util/fd-utils.js +4 -7
  124. package/dist/src/planner/util/fd-utils.js.map +1 -1
  125. package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
  126. package/dist/src/runtime/emit/alter-table.js +58 -4
  127. package/dist/src/runtime/emit/alter-table.js.map +1 -1
  128. package/dist/src/runtime/emit/analyze.d.ts.map +1 -1
  129. package/dist/src/runtime/emit/analyze.js +1 -2
  130. package/dist/src/runtime/emit/analyze.js.map +1 -1
  131. package/dist/src/runtime/emit/binary.d.ts.map +1 -1
  132. package/dist/src/runtime/emit/binary.js +5 -3
  133. package/dist/src/runtime/emit/binary.js.map +1 -1
  134. package/dist/src/runtime/emit/fanout-lookup-join.d.ts.map +1 -1
  135. package/dist/src/runtime/emit/fanout-lookup-join.js +9 -1
  136. package/dist/src/runtime/emit/fanout-lookup-join.js.map +1 -1
  137. package/dist/src/runtime/emit/limit-offset.d.ts.map +1 -1
  138. package/dist/src/runtime/emit/limit-offset.js +50 -24
  139. package/dist/src/runtime/emit/limit-offset.js.map +1 -1
  140. package/dist/src/runtime/emit/materialized-view-helpers.d.ts +33 -2
  141. package/dist/src/runtime/emit/materialized-view-helpers.d.ts.map +1 -1
  142. package/dist/src/runtime/emit/materialized-view-helpers.js +61 -5
  143. package/dist/src/runtime/emit/materialized-view-helpers.js.map +1 -1
  144. package/dist/src/runtime/emit/materialized-view.d.ts.map +1 -1
  145. package/dist/src/runtime/emit/materialized-view.js +6 -1
  146. package/dist/src/runtime/emit/materialized-view.js.map +1 -1
  147. package/dist/src/runtime/emit/ordinal-slice.d.ts.map +1 -1
  148. package/dist/src/runtime/emit/ordinal-slice.js +8 -0
  149. package/dist/src/runtime/emit/ordinal-slice.js.map +1 -1
  150. package/dist/src/schema/derivation.d.ts +15 -1
  151. package/dist/src/schema/derivation.d.ts.map +1 -1
  152. package/dist/src/schema/derivation.js.map +1 -1
  153. package/dist/src/schema/function.d.ts +9 -4
  154. package/dist/src/schema/function.d.ts.map +1 -1
  155. package/dist/src/schema/function.js +11 -9
  156. package/dist/src/schema/function.js.map +1 -1
  157. package/dist/src/schema/schema.d.ts +14 -3
  158. package/dist/src/schema/schema.d.ts.map +1 -1
  159. package/dist/src/schema/schema.js +20 -2
  160. package/dist/src/schema/schema.js.map +1 -1
  161. package/dist/src/schema/table.d.ts +27 -0
  162. package/dist/src/schema/table.d.ts.map +1 -1
  163. package/dist/src/schema/table.js +55 -0
  164. package/dist/src/schema/table.js.map +1 -1
  165. package/dist/src/schema/unique-enforcement.d.ts +6 -13
  166. package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
  167. package/dist/src/schema/unique-enforcement.js +8 -17
  168. package/dist/src/schema/unique-enforcement.js.map +1 -1
  169. package/dist/src/util/comparison.d.ts +19 -0
  170. package/dist/src/util/comparison.d.ts.map +1 -1
  171. package/dist/src/util/comparison.js +22 -0
  172. package/dist/src/util/comparison.js.map +1 -1
  173. package/dist/src/vtab/best-access-plan.d.ts +34 -0
  174. package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
  175. package/dist/src/vtab/best-access-plan.js +64 -0
  176. package/dist/src/vtab/best-access-plan.js.map +1 -1
  177. package/dist/src/vtab/index-descriptor.d.ts +9 -0
  178. package/dist/src/vtab/index-descriptor.d.ts.map +1 -1
  179. package/dist/src/vtab/index-descriptor.js +15 -0
  180. package/dist/src/vtab/index-descriptor.js.map +1 -1
  181. package/dist/src/vtab/memory/layer/manager.d.ts +11 -9
  182. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  183. package/dist/src/vtab/memory/layer/manager.js +12 -43
  184. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  185. package/dist/src/vtab/memory/module.d.ts +18 -0
  186. package/dist/src/vtab/memory/module.d.ts.map +1 -1
  187. package/dist/src/vtab/memory/module.js +176 -24
  188. package/dist/src/vtab/memory/module.js.map +1 -1
  189. package/dist/src/vtab/memory/table.d.ts +27 -3
  190. package/dist/src/vtab/memory/table.d.ts.map +1 -1
  191. package/dist/src/vtab/memory/table.js +28 -59
  192. package/dist/src/vtab/memory/table.js.map +1 -1
  193. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"index-nested-loop.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/index-nested-loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index-nested-loop.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/index-nested-loop.ts"],"names":[],"mappings":"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"}
@@ -67,8 +67,28 @@
67
67
  *
68
68
  * **Idempotence.** After the rewrite `outerMode === 'batched'`, so a second
69
69
  * firing returns null immediately.
70
+ *
71
+ * **Two callers, one flip.** The gates, the prefetch wrap and the node rebuild
72
+ * live in {@link toBatchedOuter}; this rule is a thin wrapper over it, and
73
+ * `rule-join-physical-selection` calls it directly to turn an index-nested-loop
74
+ * candidate into a priced one-branch batched fan-out. One owner means the two
75
+ * callers cannot drift, and — because a one-branch fan-out left in serial mode
76
+ * is strictly worse than the join it replaces (per-row forking, no overlap) —
77
+ * the selection rule never enters a serial fan-out into its comparison: if
78
+ * this function declines, there is no batched candidate at all.
70
79
  */
71
80
  import type { OptContext } from '../../framework/context.js';
81
+ import type { OptimizerTuning } from '../../optimizer-tuning.js';
72
82
  import type { PlanNode } from '../../nodes/plan-node.js';
83
+ import { FanOutLookupJoinNode } from '../../nodes/fanout-lookup-join-node.js';
84
+ /**
85
+ * The serial→batched flip: every gate, the `EagerPrefetchNode` wrap and the
86
+ * node rebuild, in one function so no caller can obtain batched mode without
87
+ * the wrap (the wrap is load-bearing correctness — see the module comment's
88
+ * *Outer-source isolation*). Returns null when any gate declines, including on
89
+ * a node that is already batched (idempotence — `ruleFanOutBatchedOuter` later
90
+ * re-visits nodes `rule-join-physical-selection` already flipped).
91
+ */
92
+ export declare function toBatchedOuter(node: FanOutLookupJoinNode, tuning: OptimizerTuning['parallel']): FanOutLookupJoinNode | null;
73
93
  export declare function ruleFanOutBatchedOuter(node: PlanNode, context: OptContext): PlanNode | null;
74
94
  //# sourceMappingURL=rule-fanout-batched-outer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rule-fanout-batched-outer.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-fanout-batched-outer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAsB,MAAM,0BAA0B,CAAC;AA0B7E,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CA8D3F"}
1
+ {"version":3,"file":"rule-fanout-batched-outer.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-fanout-batched-outer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8EG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAsB,MAAM,0BAA0B,CAAC;AAE7E,OAAO,EAAE,oBAAoB,EAAqB,MAAM,wCAAwC,CAAC;AAwBjG;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC7B,IAAI,EAAE,oBAAoB,EAC1B,MAAM,EAAE,eAAe,CAAC,UAAU,CAAC,GACjC,oBAAoB,GAAG,IAAI,CA4D7B;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAG3F"}
@@ -67,6 +67,15 @@
67
67
  *
68
68
  * **Idempotence.** After the rewrite `outerMode === 'batched'`, so a second
69
69
  * firing returns null immediately.
70
+ *
71
+ * **Two callers, one flip.** The gates, the prefetch wrap and the node rebuild
72
+ * live in {@link toBatchedOuter}; this rule is a thin wrapper over it, and
73
+ * `rule-join-physical-selection` calls it directly to turn an index-nested-loop
74
+ * candidate into a priced one-branch batched fan-out. One owner means the two
75
+ * callers cannot drift, and — because a one-branch fan-out left in serial mode
76
+ * is strictly worse than the join it replaces (per-row forking, no overlap) —
77
+ * the selection rule never enters a serial fan-out into its comparison: if
78
+ * this function declines, there is no batched candidate at all.
70
79
  */
71
80
  import { createLogger } from '../../../common/logger.js';
72
81
  import { PlanNodeType } from '../../nodes/plan-node-type.js';
@@ -93,12 +102,17 @@ function outerRowEstimate(node) {
93
102
  return outerRowEstimate(relations[0]);
94
103
  return undefined;
95
104
  }
96
- export function ruleFanOutBatchedOuter(node, context) {
97
- if (!(node instanceof FanOutLookupJoinNode))
98
- return null;
105
+ /**
106
+ * The serial→batched flip: every gate, the `EagerPrefetchNode` wrap and the
107
+ * node rebuild, in one function so no caller can obtain batched mode without
108
+ * the wrap (the wrap is load-bearing correctness — see the module comment's
109
+ * *Outer-source isolation*). Returns null when any gate declines, including on
110
+ * a node that is already batched (idempotence — `ruleFanOutBatchedOuter` later
111
+ * re-visits nodes `rule-join-physical-selection` already flipped).
112
+ */
113
+ export function toBatchedOuter(node, tuning) {
99
114
  if (node.outerMode === 'batched')
100
115
  return null; // idempotence
101
- const tuning = context.tuning.parallel;
102
116
  const branchCount = node.branches.length;
103
117
  // Cross-branch batched outer is owned by the cross-mode ticket; only flip
104
118
  // clusters whose branches are all at-most-one. `cross-left` is a 1:n cross
@@ -146,4 +160,9 @@ export function ruleFanOutBatchedOuter(node, context) {
146
160
  log('Flipping FanOutLookupJoin %s to batched outer mode (branches=%d, maxLatency=%d ms, outerRows=%s, globalCap=%d)', node.id, branchCount, maxLatency, String(outerRows), tuning.outerBatchConcurrency);
147
161
  return new FanOutLookupJoinNode(node.scope, outer, node.branches, node.concurrencyCap, node.preserveAttributeIds, 'batched');
148
162
  }
163
+ export function ruleFanOutBatchedOuter(node, context) {
164
+ if (!(node instanceof FanOutLookupJoinNode))
165
+ return null;
166
+ return toBatchedOuter(node, context.tuning.parallel);
167
+ }
149
168
  //# sourceMappingURL=rule-fanout-batched-outer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rule-fanout-batched-outer.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-fanout-batched-outer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rule-fanout-batched-outer.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-fanout-batched-outer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rule-join-greedy-commute.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-greedy-commute.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAsB,MAAM,0BAA0B,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAe7D;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CA8C3F"}
1
+ {"version":3,"file":"rule-join-greedy-commute.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-greedy-commute.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAsB,MAAM,0BAA0B,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAe7D;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAqD3F"}
@@ -42,6 +42,13 @@ export function ruleJoinGreedyCommute(node, _context) {
42
42
  log('join-greedy-commute skipped: a side has side effects');
43
43
  return null;
44
44
  }
45
+ // NOTE: this row-count arm reads the LOGICAL `estimatedRows` getter, which the
46
+ // physical access nodes (Alias / Retrieve / IndexScan …) do not define — so for
47
+ // table-backed inputs both sides read Infinity and `rightRows < leftRows` never
48
+ // holds; only the singleton-FD arm below fires for them. Tracked by
49
+ // backlog/bug-row-estimate-conflates-unknown-and-zero (fix it there, via
50
+ // `physicalSourceRows`). Two-table joins get their orientation decided later in
51
+ // rule-join-physical-selection's index-nested-loop seek-side election instead.
45
52
  const leftRows = node.getLeftSource().estimatedRows ?? Number.POSITIVE_INFINITY;
46
53
  const rightRows = node.getRightSource().estimatedRows ?? Number.POSITIVE_INFINITY;
47
54
  // Prefer known finite estimatedRows; also detect <=1 row driver on either side
@@ -1 +1 @@
1
- {"version":3,"file":"rule-join-greedy-commute.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-greedy-commute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,MAAM,GAAG,GAAG,YAAY,CAAC,oCAAoC,CAAC,CAAC;AAE/D,6DAA6D;AAC7D,SAAS,WAAW,CAAC,IAAwB;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC;IAC7C,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,aAAa,KAAK,CAAC,CAAC;IAC9D,OAAO,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAc,EAAE,QAAoB;IACxE,IAAI,CAAC,CAAC,IAAI,YAAY,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAExE,qEAAqE;IACrE,+EAA+E;IAC/E,8EAA8E;IAC9E,+EAA+E;IAC/E,gFAAgF;IAChF,yDAAyD;IACzD,IAAI,oBAAoB,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;QAC9F,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4EAA4E;IAC5E,6EAA6E;IAC7E,IAAI,uBAAuB,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,EAAwB,CAAC;WACxF,uBAAuB,CAAC,qBAAqB,CAAC,IAAI,CAAC,cAAc,EAAwB,CAAC,EAAE,CAAC;QAChG,GAAG,CAAC,sDAAsD,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,aAAa,IAAI,MAAM,CAAC,iBAAiB,CAAC;IAChF,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,aAAa,IAAI,MAAM,CAAC,iBAAiB,CAAC;IAElF,+EAA+E;IAC/E,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IAE5D,kEAAkE;IAClE,MAAM,UAAU,GAAG,CAAC,gBAAgB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,gBAAgB,IAAI,CAAC,eAAe,IAAI,SAAS,GAAG,QAAQ,CAAC,CAAC;IAC7H,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,GAAG,CAAC,wFAAwF,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAEnI,qEAAqE;IACrE,MAAM,OAAO,GAAG,IAAI,QAAQ,CAC1B,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,cAAc,EAAwB,EAC3C,IAAI,CAAC,aAAa,EAAwB,EAC1C,IAAI,CAAC,WAAW,EAAE,EAClB,IAAI,CAAC,gBAAgB,EAAE,EACvB,IAAI,CAAC,eAAe,EAAE,CACvB,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"rule-join-greedy-commute.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-greedy-commute.ts"],"names":[],"mappings":"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"}
@@ -13,8 +13,25 @@
13
13
  * `index-nested-loop.ts`) is cheaper than the plain nested loop
14
14
  *
15
15
  * Benefits: Replaces the O(n*m) nested loop with an O(n+m) hash/merge join, or
16
- * with an O(n·seek) index-nested-loop when the inner side's module can answer
17
- * an equality seek on the join key
16
+ * with an O(n·seek) index-nested-loop when one side's module can answer an
17
+ * equality seek on the join key. For an INNER join the index-nested-loop is
18
+ * offered in BOTH orientations (seek the right driven by the left, and the
19
+ * mirror: seek the left driven by the right) and the cheaper wins — this rule
20
+ * is the only place a two-table join's orientation can be decided with the
21
+ * module's own seek-versus-scan answers in hand (`rule-join-greedy-commute`'s
22
+ * row-count arm never fires for table-backed inputs, and QuickPick returns
23
+ * immediately for fewer than three relations).
24
+ *
25
+ * Each index-nested-loop orientation whose seek PROVABLY returns at most one
26
+ * row per outer row (`IndexNestedLoopCandidate.atMostOne`) is additionally
27
+ * offered as a one-branch `FanOutLookupJoinNode` in `batched` outer mode —
28
+ * the same seek, driven by the fan-out's cross-row pipelined runtime so many
29
+ * seeks are in flight at once and a high-latency module's round trip is
30
+ * amortized across them. The decision is made HERE, as a priced candidate,
31
+ * not by a later rewrite rule: a post-pass would only ever see index-NL joins
32
+ * that already won at one-seek-at-a-time prices, and under latency those
33
+ * mostly lose to hash join. Batching changes the price, so the price has to
34
+ * be in the comparison. See `tryBatchedIndexNestedLoop`.
18
35
  */
19
36
  import type { PlanNode } from '../../nodes/plan-node.js';
20
37
  import type { OptContext } from '../../framework/context.js';
@@ -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;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAiD,MAAM,0BAA0B,CAAC;AACxG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAmD7D,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CA+O9F"}
1
+ {"version":3,"file":"rule-join-physical-selection.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-physical-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAiD,MAAM,0BAA0B,CAAC;AACxG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AA8M7D,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAkV9F"}
@@ -13,22 +13,166 @@
13
13
  * `index-nested-loop.ts`) is cheaper than the plain nested loop
14
14
  *
15
15
  * Benefits: Replaces the O(n*m) nested loop with an O(n+m) hash/merge join, or
16
- * with an O(n·seek) index-nested-loop when the inner side's module can answer
17
- * an equality seek on the join key
16
+ * with an O(n·seek) index-nested-loop when one side's module can answer an
17
+ * equality seek on the join key. For an INNER join the index-nested-loop is
18
+ * offered in BOTH orientations (seek the right driven by the left, and the
19
+ * mirror: seek the left driven by the right) and the cheaper wins — this rule
20
+ * is the only place a two-table join's orientation can be decided with the
21
+ * module's own seek-versus-scan answers in hand (`rule-join-greedy-commute`'s
22
+ * row-count arm never fires for table-backed inputs, and QuickPick returns
23
+ * immediately for fewer than three relations).
24
+ *
25
+ * Each index-nested-loop orientation whose seek PROVABLY returns at most one
26
+ * row per outer row (`IndexNestedLoopCandidate.atMostOne`) is additionally
27
+ * offered as a one-branch `FanOutLookupJoinNode` in `batched` outer mode —
28
+ * the same seek, driven by the fan-out's cross-row pipelined runtime so many
29
+ * seeks are in flight at once and a high-latency module's round trip is
30
+ * amortized across them. The decision is made HERE, as a priced candidate,
31
+ * not by a later rewrite rule: a post-pass would only ever see index-NL joins
32
+ * that already won at one-seek-at-a-time prices, and under latency those
33
+ * mostly lose to hash join. Batching changes the price, so the price has to
34
+ * be in the comparison. See `tryBatchedIndexNestedLoop`.
18
35
  */
19
36
  import { createLogger } from '../../../common/logger.js';
20
37
  import { JoinNode } from '../../nodes/join-node.js';
21
38
  import { BloomJoinNode } from '../../nodes/bloom-join-node.js';
22
39
  import { MergeJoinNode } from '../../nodes/merge-join-node.js';
23
40
  import { SortNode } from '../../nodes/sort.js';
41
+ import { FilterNode } from '../../nodes/filter.js';
24
42
  import { ColumnReferenceNode } from '../../nodes/reference.js';
25
- import { nestedLoopJoinCost, hashJoinCost, mergeJoinCost } from '../../cost/index.js';
43
+ import { FanOutLookupJoinNode } from '../../nodes/fanout-lookup-join-node.js';
44
+ import { nestedLoopJoinCost, hashJoinCost, mergeJoinCost, batchedIndexNestedLoopJoinCost, } from '../../cost/index.js';
45
+ import { toBatchedOuter } from './rule-fanout-batched-outer.js';
26
46
  import { extractEquiPairs, isOrderedOnEquiPairs, reorderEquiPairsForMerge, } from './equi-pair-extractor.js';
27
47
  import { PlanNodeCharacteristics } from '../../framework/characteristics.js';
28
48
  import { readsColumnsOf } from '../../cache/correlation-detector.js';
29
49
  import { physicalSourceRows } from '../../util/row-estimates.js';
30
50
  import { tryIndexNestedLoop } from './index-nested-loop.js';
51
+ import { nestedLoopRightOpensOnce } from '../cache/rule-nested-loop-right-cache.js';
31
52
  const log = createLogger('optimizer:rule:join-physical-selection');
53
+ /** Flip every pair so left=old right / right=old left; spread keeps the collation flags. */
54
+ function mirrorEquiPairs(pairs) {
55
+ return pairs.map(p => ({ ...p, leftAttrId: p.rightAttrId, rightAttrId: p.leftAttrId }));
56
+ }
57
+ /**
58
+ * Whether the index-nested-loop may also be tried with the sides exchanged
59
+ * (seek the LEFT input, drive from the right). Only a plain inner join
60
+ * commutes: `left` / `semi` / `anti` are left-driven by definition (a mirrored
61
+ * `left` join is a `right` join, which the emitter drives from the other
62
+ * side); an `exists … as` join appends its flag columns after both sides with
63
+ * a resolved `side` per flag, so a swap would have to flip and re-derive them
64
+ * — excluded rather than attempted. A write in either subtree forbids the swap
65
+ * because it reorders user-visible execution — the same refusal the hash
66
+ * build/probe swap makes below.
67
+ */
68
+ function mayMirrorIndexNestedLoop(node) {
69
+ return node.joinType === 'inner'
70
+ && !node.hasExistenceColumns
71
+ && !PlanNodeCharacteristics.subtreeHasSideEffects(node.left)
72
+ && !PlanNodeCharacteristics.subtreeHasSideEffects(node.right);
73
+ }
74
+ /**
75
+ * First-row latency the PLAIN nested loop pays for opening its inner (right)
76
+ * side: once if that side is opened once per join — already materialized, or
77
+ * about to be wrapped in a `CacheNode` by `rule-nested-loop-right-cache` — and
78
+ * otherwise once per outer row, because the emitter re-opens the inner pipeline
79
+ * for every left row.
80
+ *
81
+ * That question belongs to the cache rule and is answered by its own exported
82
+ * predicate; this rule must never restate the gates behind it. Note it is the
83
+ * open-count question, NOT plain cacheability: this rule re-visits a join the
84
+ * cache rule has already rewritten, and on that visit the right side is cached
85
+ * (so it opens once) while `canCacheNestedLoopRight` reports false (so there is
86
+ * nothing left to wrap).
87
+ *
88
+ * NOTE: the predicate partly describes rules that have not run yet, and answers
89
+ * two cases pessimistically/optimistically:
90
+ * - An impure right side that `mutating-subquery-cache` (also later in this
91
+ * pass) will wrap reads as "opens per row" through the purity gate, so the
92
+ * plain nested loop is over-charged. Unreachable in practice —
93
+ * index-nested-loop declines an impure inner outright and the hash
94
+ * build/probe swap refuses too, so the over-charge has no cheaper rival to
95
+ * hand the win to. If a candidate that tolerates an impure inner ever
96
+ * appears, teach the predicate about the mutating-subquery rule rather than
97
+ * duplicating its gates here.
98
+ * - A semi/anti join breaks out of the inner scan on the first match, so its
99
+ * cache buffer only lands after the first UNMATCHED outer row (see the driver
100
+ * gate's own NOTE): a match-heavy semi join really can re-open the inner per
101
+ * outer row while this charges it once. Optimistic by at most
102
+ * (outerRows - 1) x latency, in the same direction the work term is already
103
+ * pessimistic (it charges a full inner scan per outer row for a loop that
104
+ * breaks early). Revisit together if a high-latency module ever makes
105
+ * semi/anti plans regress; picking one side of the range is not obviously
106
+ * better than the other while both terms are this coarse.
107
+ */
108
+ function nestedLoopInnerLatency(node, context, outerRows, innerLatencyMs) {
109
+ // Short-circuit before `nestedLoopRightOpensOnce`, whose size gate walks the
110
+ // whole right subtree: with no latency to charge the answer is 0 either way.
111
+ // Every in-tree module reports 0, so this keeps the walk off the hot path.
112
+ if (innerLatencyMs === 0)
113
+ return 0;
114
+ return nestedLoopRightOpensOnce(node, context) ? innerLatencyMs : outerRows * innerLatencyMs;
115
+ }
116
+ /**
117
+ * The index-nested-loop candidate re-driven as a one-branch `FanOutLookupJoinNode`
118
+ * in `batched` outer mode, priced — or null when this orientation has no
119
+ * batched candidate. Building the node and asking `toBatchedOuter`'s gates in
120
+ * one step is what keeps the price and the plan from ever disagreeing; a
121
+ * serial fan-out is never entered into the comparison (strictly worse than the
122
+ * join it replaces: per-row forking, no overlap).
123
+ *
124
+ * The branch is the rebuilt inner under a `Filter` carrying the join's ON
125
+ * condition — a fan-out branch has no residual slot, and this is the same
126
+ * construction `rule-fanout-lookup-join` uses for its spine branches. The
127
+ * condition's outer-side column references resolve through
128
+ * `RuntimeContext.context` exactly as the seek's own correlated keys do. A
129
+ * Filter cannot add rows, so it cannot break the at-most-one claim; for a LEFT
130
+ * join, filtering the single row away yields an empty branch, which
131
+ * `atMostOne-left` NULL-pads — LEFT-join semantics. `concurrencyCap` is 1: one
132
+ * branch; the cross-row budget is the batched driver's `outerBatchConcurrency`.
133
+ * `connectionKey` stays unset so the emitter falls back to the active
134
+ * connection, as `rule-fanout-lookup-join` does.
135
+ *
136
+ * Price: `batchedIndexNestedLoopJoinCost` with the number of seeks in flight
137
+ * for one branch — `min(outerBatchConcurrency, maxOuterReadAhead)`, the
138
+ * driver's global permit budget bounded by its read-ahead window (mirrors
139
+ * `deriveReadAhead` at `branchCount = 1`; see the coupling comment there) —
140
+ * plus one open of the outer side, the same charge the serial index-NL pays.
141
+ *
142
+ * NOTE: a `USING` join that takes this path loses its `JoinNode.usingColumns`
143
+ * label — the fan-out has no equivalent field, and the label only ever fed
144
+ * EXPLAIN's `JOIN USING(...)` rendering (`buildJoinAttributes` ignores it, so
145
+ * no attribute layout changes). It renders as a fan-out instead.
146
+ * NOTE: the row estimate changes slightly — `FanOutLookupJoinNode` reports the
147
+ * outer's cardinality for an at-most-one branch (an upper bound for `inner`,
148
+ * exact for `left`) where `JoinNode` used `estimateJoinRows`. Known, not chased.
149
+ */
150
+ function tryBatchedIndexNestedLoop(join, outer, candidate, joinType, preserveAttrs, outerRows, outerLatencyMs, tuning) {
151
+ if (!candidate || !candidate.atMostOne)
152
+ return null;
153
+ // Outcome-preserving short-circuit, not a restated gate: at zero latency the
154
+ // batched price equals the serial one (the only term batching divides is the
155
+ // latency), and a strict `<` after the serial entry can never pick it — so
156
+ // skip building nodes the comparison could not choose. Every in-tree module
157
+ // reports 0, which keeps node construction off the golden-sweep hot path.
158
+ if (candidate.perSeekLatencyMs === 0)
159
+ return null;
160
+ const inner = candidate.newInner;
161
+ // `condition` is defined — the caller extracted equi pairs from it.
162
+ const branch = {
163
+ child: new FilterNode(join.scope, inner, join.condition),
164
+ mode: joinType === 'left' ? 'atMostOne-left' : 'atMostOne-inner',
165
+ outputAttrs: inner.getAttributes(),
166
+ concurrencySafe: inner.physical.concurrencySafe !== false,
167
+ };
168
+ const serial = new FanOutLookupJoinNode(join.scope, outer, [branch], 1, preserveAttrs, 'serial');
169
+ const batched = toBatchedOuter(serial, tuning);
170
+ if (!batched)
171
+ return null;
172
+ const inFlight = Math.min(tuning.outerBatchConcurrency, tuning.maxOuterReadAhead);
173
+ const cost = batchedIndexNestedLoopJoinCost(outerRows, candidate.rowsPerSeek, candidate.perSeekLatencyMs, inFlight) + outerLatencyMs;
174
+ return { node: batched, cost };
175
+ }
32
176
  /**
33
177
  * Create a SortNode that sorts a source on the equi-pair columns for this side.
34
178
  */
@@ -87,34 +231,101 @@ export function ruleJoinPhysicalSelection(node, context) {
87
231
  // logical-getter read (which yielded undefined → 100).
88
232
  const leftRows = physicalSourceRows(node.left.physical, node.left) || 100;
89
233
  const rightRows = physicalSourceRows(node.right.physical, node.right) || 100;
90
- const nlCost = nestedLoopJoinCost(leftRows, rightRows);
234
+ // Latency accounting, applied uniformly to every candidate below: a candidate
235
+ // is charged ONE open of its outer side plus however many opens of its inner
236
+ // side it performs. `expectedLatencyMs` is a subtree's first-row latency
237
+ // (0 for every in-process module), treated as ms-equivalent engine cost.
238
+ // Charged locally here, not inside the shared cost functions, which other
239
+ // callers use latency-free.
240
+ const leftLatencyMs = node.left.physical.expectedLatencyMs ?? 0;
241
+ const rightLatencyMs = node.right.physical.expectedLatencyMs ?? 0;
242
+ // Plain nested loop: one open of the left, and one open of the right per left
243
+ // row unless the right side is already materialized or the cache rule is
244
+ // about to make it so.
245
+ const nlCost = nestedLoopJoinCost(leftRows, rightRows)
246
+ + leftLatencyMs
247
+ + nestedLoopInnerLatency(node, context, leftRows, rightLatencyMs);
91
248
  // Index-nested-loop candidate: the logical JoinNode survives with its right
92
249
  // leaf replaced by a per-outer-row correlated IndexSeek. Considered BEFORE
93
250
  // the existence early-return below — index-NL keeps the nested-loop emitter
94
251
  // (the only one that derives `exists … as` flag bits) and `withChildren`
95
252
  // threads `existence` verbatim, so existence joins CAN take this path,
96
253
  // unlike hash/merge which drop the appended flag column.
97
- const indexNL = tryIndexNestedLoop(node, extracted.equiPairs, leftRows, context);
98
- // Rebuild with the seek-bearing right side, KEEPING the ON condition on the
254
+ const indexNL = tryIndexNestedLoop(joinType, node.left, node.right, extracted.equiPairs, leftRows, context);
255
+ // Mirrored candidate: seek the LEFT input, drive from the right. Whether a
256
+ // table landed on the left or the right was decided long before anything
257
+ // knew which side had a usable index, so the un-mirrored candidate alone can
258
+ // read a whole table the join had a perfectly good index for. The cost
259
+ // formula is linear in the outer row count, so this is fed `rightRows` —
260
+ // the mirror is only cheap when the NEW outer is the small side.
261
+ const mirroredNL = mayMirrorIndexNestedLoop(node)
262
+ ? tryIndexNestedLoop('inner', node.right, node.left, mirrorEquiPairs(extracted.equiPairs), rightRows, context)
263
+ : null;
264
+ // Each index-nested-loop orientation opens its outer side once; the per-seek
265
+ // charge for its INNER side is already inside `indexNestedLoopJoinCost`
266
+ // (`tryIndexNestedLoop` feeds it `inner.physical.expectedLatencyMs`, which is
267
+ // the RIGHT side's for the un-mirrored candidate and the LEFT side's for the
268
+ // mirror). Absent candidates cost Infinity so they never win a comparison.
269
+ const indexNLCost = indexNL ? indexNL.cost + leftLatencyMs : Infinity;
270
+ const mirroredNLCost = mirroredNL ? mirroredNL.cost + rightLatencyMs : Infinity;
271
+ // Rebuild with the seek-bearing inner side, KEEPING the ON condition on the
99
272
  // join. It is redundant when the seek is exact, but it is the safety net
100
273
  // when the seek over-fetches (a COARSER_SAFE collation cover, a module
101
274
  // returning a superset) — and it costs one predicate evaluation per emitted
102
- // row, not per scanned row.
275
+ // row, not per scanned row. `condition` is defined — equi pairs were
276
+ // extracted from it above.
103
277
  const rebuildWithIndexNL = () => {
104
278
  log('Selecting index-nested-loop join (cost=%.2f) for %d outer rows', indexNL.cost, leftRows);
105
- // `condition` is defined — equi pairs were extracted from it above.
106
- return node.withChildren([node.left, indexNL.newRight, node.condition]);
279
+ return node.withChildren([node.left, indexNL.newInner, node.condition]);
280
+ };
281
+ // The mirrored rebuild is a NEW JoinNode with the children exchanged —
282
+ // `withChildren` re-uses the node's own slot order and cannot express the
283
+ // swap. The ON condition and `usingColumns` carry over verbatim: both refer
284
+ // to attributes by id, and `buildJoinAttributes` concatenates the two
285
+ // sides' Attribute objects as-is (no `preserveAttributeIds` list is passed),
286
+ // so the swap changes the join's attribute ORDER, never an attribute id.
287
+ // Order is harmless: column references resolve by id at runtime, every
288
+ // positional consumer derives its row descriptor from this node's own
289
+ // `getAttributes()` at emit time, the nested-loop emitter yields
290
+ // `[...leftRow, ...rightRow]` where "left" is now the old right on both
291
+ // sides of that equation, and `JoinNode.computePhysical` advertises no
292
+ // `ordering` — so no ancestor Sort was elided on the strength of the join's
293
+ // emission order. What DOES change is the order rows come out in for a query
294
+ // without ORDER BY, which is permitted (hash join already does it).
295
+ // `existence` is omitted: `mayMirrorIndexNestedLoop` excludes flag joins.
296
+ const rebuildWithMirroredNL = () => {
297
+ log('Selecting mirrored index-nested-loop join (cost=%.2f) for %d outer rows (sides exchanged)', mirroredNL.cost, rightRows);
298
+ return new JoinNode(node.scope, node.right, mirroredNL.newInner, 'inner', node.condition, node.usingColumns);
107
299
  };
108
300
  // A join exposing `exists … as` match flags stays the nested-loop JoinNode (the
109
301
  // only emitter that derives the flag bit); the physical Bloom/Merge variants do
110
302
  // not carry or emit the appended flag column, so converting would drop it. Read
111
303
  // half: existence joins forgo hash/merge selection — documented limitation.
112
304
  // Index-NL remains available (see above): only plain NL and index-NL compete.
305
+ // (`mirroredNL` is null here — the mirror gate excludes existence joins.)
113
306
  if (node.hasExistenceColumns) {
114
- if (indexNL && indexNL.cost < nlCost)
307
+ if (indexNLCost < nlCost)
115
308
  return rebuildWithIndexNL();
116
309
  return null;
117
310
  }
311
+ // Preserve attribute IDs from the logical JoinNode. Also pins the un-mirrored
312
+ // batched fan-out's layout: the logical join's `[...left, ...right]` (right
313
+ // nullable-widened for LEFT) is exactly the fan-out's `[...outer, ...branch]`
314
+ // with `isLeftBranchMode` widening, so attribute identity carries verbatim.
315
+ const preserveAttrs = node.getAttributes().slice();
316
+ // Batched index-nested-loop candidates: each proved-at-most-one orientation
317
+ // re-driven as a one-branch batched fan-out. Only `inner` / `left` — the
318
+ // fan-out node has no semi/anti mode, and existence joins returned above
319
+ // (no existence-flag support either). The mirrored one passes no
320
+ // `preserveAttrs` and lets the node derive `[...right, ...leftRebuilt]`,
321
+ // matching what `rebuildWithMirroredNL` produces. Absent candidates cost
322
+ // Infinity, as above.
323
+ const batchedNL = joinType === 'inner' || joinType === 'left'
324
+ ? tryBatchedIndexNestedLoop(node, node.left, indexNL, joinType, preserveAttrs, leftRows, leftLatencyMs, context.tuning.parallel)
325
+ : null;
326
+ const mirroredBatchedNL = tryBatchedIndexNestedLoop(node, node.right, mirroredNL, 'inner', undefined, rightRows, rightLatencyMs, context.tuning.parallel);
327
+ const batchedNLCost = batchedNL ? batchedNL.cost : Infinity;
328
+ const mirroredBatchedNLCost = mirroredBatchedNL ? mirroredBatchedNL.cost : Infinity;
118
329
  // Hash join cost: build side is the smaller input
119
330
  const buildRows = Math.min(leftRows, rightRows);
120
331
  const probeRows = Math.max(leftRows, rightRows);
@@ -144,44 +355,60 @@ export function ruleJoinPhysicalSelection(node, context) {
144
355
  const mergeCostValue = mergeAvailable
145
356
  ? mergeJoinCost(leftRows, rightRows, !leftOrdered, !rightOrdered)
146
357
  : Infinity;
147
- // Hash and merge each scan the inner side once, so the inner subtree's
148
- // first-row latency is charged ONCE to each — locally here, not in the
149
- // shared cost functions (which other callers use latency-free). Index-NL's
150
- // formula charges it per outer row (per seek). Plain nested-loop's formula
151
- // is deliberately left alone: it is the no-change fallback, and if it wins
152
- // nothing is rewritten.
153
- //
154
- // NOTE: that last exemption biases against index-NL once a module reports a
155
- // nonzero `expectedLatencyMs` — plain NL re-opens the right side per outer
156
- // row too, so it pays the same per-seek latency but is charged none, and can
157
- // win a comparison against the strictly cheaper index-NL. Harmless today
158
- // (both shipped modules report 0). If a high-latency module appears, charge
159
- // plain NL `outerRows * latency` here rather than dropping it from index-NL.
160
- const rightLatencyMs = node.right.physical.expectedLatencyMs ?? 0;
358
+ // Hash and merge each open both sides exactly once (build then probe / merge
359
+ // two streams), so each is charged one open of each side.
360
+ const hashTotal = hashCostValue + leftLatencyMs + rightLatencyMs;
361
+ const mergeTotal = mergeCostValue + leftLatencyMs + rightLatencyMs;
161
362
  let bestAlgo = 'nested-loop';
162
363
  let bestCost = nlCost;
163
- if (hashCostValue + rightLatencyMs < bestCost) {
364
+ if (hashTotal < bestCost) {
164
365
  bestAlgo = 'hash';
165
- bestCost = hashCostValue + rightLatencyMs;
366
+ bestCost = hashTotal;
166
367
  }
167
- if (mergeCostValue + rightLatencyMs < bestCost) {
368
+ if (mergeTotal < bestCost) {
168
369
  bestAlgo = 'merge';
169
- bestCost = mergeCostValue + rightLatencyMs;
370
+ bestCost = mergeTotal;
170
371
  }
171
- if (indexNL && indexNL.cost < bestCost) {
372
+ if (indexNLCost < bestCost) {
172
373
  bestAlgo = 'index-nl';
173
- bestCost = indexNL.cost;
374
+ bestCost = indexNLCost;
375
+ }
376
+ if (batchedNLCost < bestCost) {
377
+ bestAlgo = 'index-nl-batched';
378
+ bestCost = batchedNLCost;
379
+ }
380
+ if (mirroredNLCost < bestCost) {
381
+ bestAlgo = 'index-nl-mirrored';
382
+ bestCost = mirroredNLCost;
383
+ }
384
+ if (mirroredBatchedNLCost < bestCost) {
385
+ bestAlgo = 'index-nl-mirrored-batched';
386
+ bestCost = mirroredBatchedNLCost;
174
387
  }
388
+ // `%d` not `%.2f`: `debug` has no precision formatter and passes the token through verbatim.
389
+ const COSTS = 'nl=%d, hash=%d, merge=%d, index-nl=%d, index-nl-batched=%d, index-nl-mirrored=%d, index-nl-mirrored-batched=%d';
390
+ const costArgs = [nlCost, hashTotal, mergeTotal, indexNLCost, batchedNLCost, mirroredNLCost, mirroredBatchedNLCost];
175
391
  if (bestAlgo === 'nested-loop') {
176
- log('Nested loop cheapest (nl=%.2f, hash=%.2f, merge=%.2f, indexNL=%.2f) for %d x %d rows', nlCost, hashCostValue, mergeCostValue, indexNL?.cost ?? Infinity, leftRows, rightRows);
392
+ log(`Nested loop cheapest (${COSTS}) for %d x %d rows`, ...costArgs, leftRows, rightRows);
177
393
  return null;
178
394
  }
179
395
  if (bestAlgo === 'index-nl') {
180
396
  return rebuildWithIndexNL();
181
397
  }
182
- log('Selecting %s join (nl=%.2f, hash=%.2f, merge=%.2f, indexNL=%.2f) for %d x %d rows', bestAlgo, nlCost, hashCostValue, mergeCostValue, indexNL?.cost ?? Infinity, leftRows, rightRows);
183
- // Preserve attribute IDs from the logical JoinNode
184
- const preserveAttrs = node.getAttributes().slice();
398
+ if (bestAlgo === 'index-nl-mirrored') {
399
+ return rebuildWithMirroredNL();
400
+ }
401
+ // The batched node is already built — price and plan came from the same
402
+ // construction — so a win returns it verbatim.
403
+ if (bestAlgo === 'index-nl-batched') {
404
+ log(`Selecting batched index-nested-loop join (${COSTS}) for %d outer rows`, ...costArgs, leftRows);
405
+ return batchedNL.node;
406
+ }
407
+ if (bestAlgo === 'index-nl-mirrored-batched') {
408
+ log(`Selecting mirrored batched index-nested-loop join (${COSTS}) for %d outer rows (sides exchanged)`, ...costArgs, rightRows);
409
+ return mirroredBatchedNL.node;
410
+ }
411
+ log(`Selecting %s join (${COSTS}) for %d x %d rows`, bestAlgo, ...costArgs, leftRows, rightRows);
185
412
  if (bestAlgo === 'merge') {
186
413
  // Build merge join, inserting SortNodes if needed
187
414
  let leftSource = node.left;
@@ -218,12 +445,7 @@ export function ruleJoinPhysicalSelection(node, context) {
218
445
  // Swap: left becomes build, right becomes probe
219
446
  probeSource = node.right;
220
447
  buildSource = node.left;
221
- // Flip equi-pair directions; spread so the collation flags survive.
222
- equiPairs = extracted.equiPairs.map(p => ({
223
- ...p,
224
- leftAttrId: p.rightAttrId,
225
- rightAttrId: p.leftAttrId
226
- }));
448
+ equiPairs = mirrorEquiPairs(extracted.equiPairs);
227
449
  // INVARIANT: a physical join's advertised attribute order IS its emitted
228
450
  // row layout. `emitBloomJoin` yields `[...leftRow, ...rightRow]` — that is,
229
451
  // probe-then-build — and `getType()`, `combineJoinKeys` and