@quereus/quereus 2.8.0 → 3.0.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 (454) hide show
  1. package/README.md +224 -222
  2. package/dist/src/core/database-assertions.d.ts +36 -16
  3. package/dist/src/core/database-assertions.d.ts.map +1 -1
  4. package/dist/src/core/database-assertions.js +222 -118
  5. package/dist/src/core/database-assertions.js.map +1 -1
  6. package/dist/src/core/database-transaction.d.ts +96 -13
  7. package/dist/src/core/database-transaction.d.ts.map +1 -1
  8. package/dist/src/core/database-transaction.js +294 -35
  9. package/dist/src/core/database-transaction.js.map +1 -1
  10. package/dist/src/core/database-watchers.d.ts +58 -0
  11. package/dist/src/core/database-watchers.d.ts.map +1 -0
  12. package/dist/src/core/database-watchers.js +206 -0
  13. package/dist/src/core/database-watchers.js.map +1 -0
  14. package/dist/src/core/database.d.ts +78 -5
  15. package/dist/src/core/database.d.ts.map +1 -1
  16. package/dist/src/core/database.js +120 -20
  17. package/dist/src/core/database.js.map +1 -1
  18. package/dist/src/core/statement.d.ts +9 -0
  19. package/dist/src/core/statement.d.ts.map +1 -1
  20. package/dist/src/core/statement.js +29 -0
  21. package/dist/src/core/statement.js.map +1 -1
  22. package/dist/src/core/table-handle.d.ts +45 -0
  23. package/dist/src/core/table-handle.d.ts.map +1 -0
  24. package/dist/src/core/table-handle.js +54 -0
  25. package/dist/src/core/table-handle.js.map +1 -0
  26. package/dist/src/emit/ast-stringify.d.ts.map +1 -1
  27. package/dist/src/emit/ast-stringify.js +0 -3
  28. package/dist/src/emit/ast-stringify.js.map +1 -1
  29. package/dist/src/func/builtins/conversion.d.ts.map +1 -1
  30. package/dist/src/func/builtins/conversion.js +12 -1
  31. package/dist/src/func/builtins/conversion.js.map +1 -1
  32. package/dist/src/func/builtins/explain.d.ts.map +1 -1
  33. package/dist/src/func/builtins/explain.js +22 -8
  34. package/dist/src/func/builtins/explain.js.map +1 -1
  35. package/dist/src/func/builtins/generation.d.ts.map +1 -1
  36. package/dist/src/func/builtins/generation.js +26 -1
  37. package/dist/src/func/builtins/generation.js.map +1 -1
  38. package/dist/src/func/builtins/index.d.ts.map +1 -1
  39. package/dist/src/func/builtins/index.js +5 -1
  40. package/dist/src/func/builtins/index.js.map +1 -1
  41. package/dist/src/func/builtins/json-tvf.d.ts.map +1 -1
  42. package/dist/src/func/builtins/json-tvf.js +16 -2
  43. package/dist/src/func/builtins/json-tvf.js.map +1 -1
  44. package/dist/src/func/builtins/schema.d.ts +4 -0
  45. package/dist/src/func/builtins/schema.d.ts.map +1 -1
  46. package/dist/src/func/builtins/schema.js +270 -11
  47. package/dist/src/func/builtins/schema.js.map +1 -1
  48. package/dist/src/func/registration.d.ts +19 -1
  49. package/dist/src/func/registration.d.ts.map +1 -1
  50. package/dist/src/func/registration.js +8 -3
  51. package/dist/src/func/registration.js.map +1 -1
  52. package/dist/src/index.d.ts +7 -1
  53. package/dist/src/index.d.ts.map +1 -1
  54. package/dist/src/index.js +5 -0
  55. package/dist/src/index.js.map +1 -1
  56. package/dist/src/parser/ast.d.ts +3 -2
  57. package/dist/src/parser/ast.d.ts.map +1 -1
  58. package/dist/src/parser/parser.d.ts.map +1 -1
  59. package/dist/src/parser/parser.js +25 -8
  60. package/dist/src/parser/parser.js.map +1 -1
  61. package/dist/src/planner/analysis/assertion-classifier.d.ts +71 -0
  62. package/dist/src/planner/analysis/assertion-classifier.d.ts.map +1 -0
  63. package/dist/src/planner/analysis/assertion-classifier.js +286 -0
  64. package/dist/src/planner/analysis/assertion-classifier.js.map +1 -0
  65. package/dist/src/planner/analysis/assertion-hoist-cache.d.ts +34 -0
  66. package/dist/src/planner/analysis/assertion-hoist-cache.d.ts.map +1 -0
  67. package/dist/src/planner/analysis/assertion-hoist-cache.js +119 -0
  68. package/dist/src/planner/analysis/assertion-hoist-cache.js.map +1 -0
  69. package/dist/src/planner/analysis/binding-extractor.d.ts +58 -0
  70. package/dist/src/planner/analysis/binding-extractor.d.ts.map +1 -0
  71. package/dist/src/planner/analysis/binding-extractor.js +110 -0
  72. package/dist/src/planner/analysis/binding-extractor.js.map +1 -0
  73. package/dist/src/planner/analysis/change-scope.d.ts +184 -0
  74. package/dist/src/planner/analysis/change-scope.d.ts.map +1 -0
  75. package/dist/src/planner/analysis/change-scope.js +825 -0
  76. package/dist/src/planner/analysis/change-scope.js.map +1 -0
  77. package/dist/src/planner/analysis/check-extraction.d.ts +29 -0
  78. package/dist/src/planner/analysis/check-extraction.d.ts.map +1 -0
  79. package/dist/src/planner/analysis/check-extraction.js +420 -0
  80. package/dist/src/planner/analysis/check-extraction.js.map +1 -0
  81. package/dist/src/planner/analysis/constraint-extractor.d.ts +47 -7
  82. package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
  83. package/dist/src/planner/analysis/constraint-extractor.js +169 -92
  84. package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
  85. package/dist/src/planner/analysis/partial-unique-extraction.d.ts +68 -0
  86. package/dist/src/planner/analysis/partial-unique-extraction.d.ts.map +1 -0
  87. package/dist/src/planner/analysis/partial-unique-extraction.js +347 -0
  88. package/dist/src/planner/analysis/partial-unique-extraction.js.map +1 -0
  89. package/dist/src/planner/analysis/predicate-conjuncts.d.ts +14 -0
  90. package/dist/src/planner/analysis/predicate-conjuncts.d.ts.map +1 -0
  91. package/dist/src/planner/analysis/predicate-conjuncts.js +31 -0
  92. package/dist/src/planner/analysis/predicate-conjuncts.js.map +1 -0
  93. package/dist/src/planner/analysis/predicate-shape.d.ts +52 -0
  94. package/dist/src/planner/analysis/predicate-shape.d.ts.map +1 -0
  95. package/dist/src/planner/analysis/predicate-shape.js +119 -0
  96. package/dist/src/planner/analysis/predicate-shape.js.map +1 -0
  97. package/dist/src/planner/analysis/sat-checker.d.ts +43 -0
  98. package/dist/src/planner/analysis/sat-checker.d.ts.map +1 -0
  99. package/dist/src/planner/analysis/sat-checker.js +393 -0
  100. package/dist/src/planner/analysis/sat-checker.js.map +1 -0
  101. package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
  102. package/dist/src/planner/building/foreign-key-builder.js +3 -2
  103. package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
  104. package/dist/src/planner/building/select.js +14 -2
  105. package/dist/src/planner/building/select.js.map +1 -1
  106. package/dist/src/planner/building/table.d.ts.map +1 -1
  107. package/dist/src/planner/building/table.js +1 -1
  108. package/dist/src/planner/building/table.js.map +1 -1
  109. package/dist/src/planner/building/update.d.ts.map +1 -1
  110. package/dist/src/planner/building/update.js +10 -6
  111. package/dist/src/planner/building/update.js.map +1 -1
  112. package/dist/src/planner/framework/characteristics.d.ts +13 -2
  113. package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
  114. package/dist/src/planner/framework/characteristics.js +31 -5
  115. package/dist/src/planner/framework/characteristics.js.map +1 -1
  116. package/dist/src/planner/framework/pass.d.ts.map +1 -1
  117. package/dist/src/planner/framework/pass.js +46 -16
  118. package/dist/src/planner/framework/pass.js.map +1 -1
  119. package/dist/src/planner/framework/physical-utils.d.ts +21 -9
  120. package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
  121. package/dist/src/planner/framework/physical-utils.js +47 -31
  122. package/dist/src/planner/framework/physical-utils.js.map +1 -1
  123. package/dist/src/planner/nodes/aggregate-node.d.ts +25 -0
  124. package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
  125. package/dist/src/planner/nodes/aggregate-node.js +75 -8
  126. package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
  127. package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
  128. package/dist/src/planner/nodes/alias-node.js +8 -1
  129. package/dist/src/planner/nodes/alias-node.js.map +1 -1
  130. package/dist/src/planner/nodes/asof-scan-node.d.ts +137 -0
  131. package/dist/src/planner/nodes/asof-scan-node.d.ts.map +1 -0
  132. package/dist/src/planner/nodes/asof-scan-node.js +237 -0
  133. package/dist/src/planner/nodes/asof-scan-node.js.map +1 -0
  134. package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -1
  135. package/dist/src/planner/nodes/bloom-join-node.js +19 -9
  136. package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
  137. package/dist/src/planner/nodes/constraint-check-node.d.ts +3 -0
  138. package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
  139. package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
  140. package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
  141. package/dist/src/planner/nodes/distinct-node.js +17 -6
  142. package/dist/src/planner/nodes/distinct-node.js.map +1 -1
  143. package/dist/src/planner/nodes/empty-relation-node.d.ts +27 -0
  144. package/dist/src/planner/nodes/empty-relation-node.d.ts.map +1 -0
  145. package/dist/src/planner/nodes/empty-relation-node.js +61 -0
  146. package/dist/src/planner/nodes/empty-relation-node.js.map +1 -0
  147. package/dist/src/planner/nodes/filter.d.ts.map +1 -1
  148. package/dist/src/planner/nodes/filter.js +67 -5
  149. package/dist/src/planner/nodes/filter.js.map +1 -1
  150. package/dist/src/planner/nodes/function.d.ts +11 -1
  151. package/dist/src/planner/nodes/function.d.ts.map +1 -1
  152. package/dist/src/planner/nodes/function.js +94 -1
  153. package/dist/src/planner/nodes/function.js.map +1 -1
  154. package/dist/src/planner/nodes/hash-aggregate.d.ts +1 -1
  155. package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
  156. package/dist/src/planner/nodes/hash-aggregate.js +10 -6
  157. package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
  158. package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
  159. package/dist/src/planner/nodes/join-node.js +21 -10
  160. package/dist/src/planner/nodes/join-node.js.map +1 -1
  161. package/dist/src/planner/nodes/join-utils.d.ts +42 -1
  162. package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
  163. package/dist/src/planner/nodes/join-utils.js +132 -0
  164. package/dist/src/planner/nodes/join-utils.js.map +1 -1
  165. package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
  166. package/dist/src/planner/nodes/limit-offset.js +8 -1
  167. package/dist/src/planner/nodes/limit-offset.js.map +1 -1
  168. package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
  169. package/dist/src/planner/nodes/merge-join-node.js +22 -9
  170. package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
  171. package/dist/src/planner/nodes/ordinal-slice-node.d.ts +50 -0
  172. package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -0
  173. package/dist/src/planner/nodes/ordinal-slice-node.js +130 -0
  174. package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -0
  175. package/dist/src/planner/nodes/plan-node-type.d.ts +3 -0
  176. package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
  177. package/dist/src/planner/nodes/plan-node-type.js +3 -0
  178. package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
  179. package/dist/src/planner/nodes/plan-node.d.ts +316 -5
  180. package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
  181. package/dist/src/planner/nodes/plan-node.js +49 -0
  182. package/dist/src/planner/nodes/plan-node.js.map +1 -1
  183. package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
  184. package/dist/src/planner/nodes/project-node.js +78 -28
  185. package/dist/src/planner/nodes/project-node.js.map +1 -1
  186. package/dist/src/planner/nodes/reference.d.ts +27 -2
  187. package/dist/src/planner/nodes/reference.d.ts.map +1 -1
  188. package/dist/src/planner/nodes/reference.js +117 -1
  189. package/dist/src/planner/nodes/reference.js.map +1 -1
  190. package/dist/src/planner/nodes/retrieve-node.d.ts +9 -1
  191. package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -1
  192. package/dist/src/planner/nodes/retrieve-node.js +21 -0
  193. package/dist/src/planner/nodes/retrieve-node.js.map +1 -1
  194. package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
  195. package/dist/src/planner/nodes/returning-node.js +64 -28
  196. package/dist/src/planner/nodes/returning-node.js.map +1 -1
  197. package/dist/src/planner/nodes/scalar.d.ts +8 -1
  198. package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
  199. package/dist/src/planner/nodes/scalar.js +112 -1
  200. package/dist/src/planner/nodes/scalar.js.map +1 -1
  201. package/dist/src/planner/nodes/set-operation-node.d.ts +2 -1
  202. package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
  203. package/dist/src/planner/nodes/set-operation-node.js +24 -0
  204. package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
  205. package/dist/src/planner/nodes/single-row.d.ts.map +1 -1
  206. package/dist/src/planner/nodes/single-row.js +3 -1
  207. package/dist/src/planner/nodes/single-row.js.map +1 -1
  208. package/dist/src/planner/nodes/sort.d.ts.map +1 -1
  209. package/dist/src/planner/nodes/sort.js +28 -1
  210. package/dist/src/planner/nodes/sort.js.map +1 -1
  211. package/dist/src/planner/nodes/stream-aggregate.d.ts +1 -1
  212. package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
  213. package/dist/src/planner/nodes/stream-aggregate.js +10 -8
  214. package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
  215. package/dist/src/planner/nodes/table-access-nodes.d.ts +40 -5
  216. package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
  217. package/dist/src/planner/nodes/table-access-nodes.js +113 -18
  218. package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
  219. package/dist/src/planner/nodes/table-function-call.d.ts +4 -1
  220. package/dist/src/planner/nodes/table-function-call.d.ts.map +1 -1
  221. package/dist/src/planner/nodes/table-function-call.js +224 -14
  222. package/dist/src/planner/nodes/table-function-call.js.map +1 -1
  223. package/dist/src/planner/nodes/update-node.d.ts +1 -3
  224. package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
  225. package/dist/src/planner/nodes/update-node.js +3 -9
  226. package/dist/src/planner/nodes/update-node.js.map +1 -1
  227. package/dist/src/planner/nodes/window-node.d.ts +61 -2
  228. package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
  229. package/dist/src/planner/nodes/window-node.js +71 -3
  230. package/dist/src/planner/nodes/window-node.js.map +1 -1
  231. package/dist/src/planner/optimizer-tuning.d.ts +38 -1
  232. package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
  233. package/dist/src/planner/optimizer-tuning.js +6 -0
  234. package/dist/src/planner/optimizer-tuning.js.map +1 -1
  235. package/dist/src/planner/optimizer.d.ts.map +1 -1
  236. package/dist/src/planner/optimizer.js +278 -0
  237. package/dist/src/planner/optimizer.js.map +1 -1
  238. package/dist/src/planner/rules/access/rule-asof-strategy-select.d.ts +30 -0
  239. package/dist/src/planner/rules/access/rule-asof-strategy-select.d.ts.map +1 -0
  240. package/dist/src/planner/rules/access/rule-asof-strategy-select.js +112 -0
  241. package/dist/src/planner/rules/access/rule-asof-strategy-select.js.map +1 -0
  242. package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.d.ts +33 -0
  243. package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.d.ts.map +1 -0
  244. package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.js +162 -0
  245. package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.js.map +1 -0
  246. package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts +29 -0
  247. package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts.map +1 -0
  248. package/dist/src/planner/rules/access/rule-monotonic-range-access.js +175 -0
  249. package/dist/src/planner/rules/access/rule-monotonic-range-access.js.map +1 -0
  250. package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
  251. package/dist/src/planner/rules/access/rule-select-access-path.js +53 -17
  252. package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
  253. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts +30 -0
  254. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts.map +1 -0
  255. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js +116 -0
  256. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js.map +1 -0
  257. package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts +7 -7
  258. package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts.map +1 -1
  259. package/dist/src/planner/rules/distinct/rule-distinct-elimination.js +18 -16
  260. package/dist/src/planner/rules/distinct/rule-distinct-elimination.js.map +1 -1
  261. package/dist/src/planner/rules/join/equi-pair-extractor.d.ts +61 -0
  262. package/dist/src/planner/rules/join/equi-pair-extractor.d.ts.map +1 -0
  263. package/dist/src/planner/rules/join/equi-pair-extractor.js +155 -0
  264. package/dist/src/planner/rules/join/equi-pair-extractor.js.map +1 -0
  265. package/dist/src/planner/rules/join/rule-join-elimination.d.ts +56 -0
  266. package/dist/src/planner/rules/join/rule-join-elimination.d.ts.map +1 -0
  267. package/dist/src/planner/rules/join/rule-join-elimination.js +326 -0
  268. package/dist/src/planner/rules/join/rule-join-elimination.js.map +1 -0
  269. package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -1
  270. package/dist/src/planner/rules/join/rule-join-greedy-commute.js +10 -2
  271. package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -1
  272. package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
  273. package/dist/src/planner/rules/join/rule-join-physical-selection.js +2 -122
  274. package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
  275. package/dist/src/planner/rules/join/rule-lateral-top1-asof.d.ts +21 -0
  276. package/dist/src/planner/rules/join/rule-lateral-top1-asof.d.ts.map +1 -0
  277. package/dist/src/planner/rules/join/rule-lateral-top1-asof.js +405 -0
  278. package/dist/src/planner/rules/join/rule-lateral-top1-asof.js.map +1 -0
  279. package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts +31 -0
  280. package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts.map +1 -0
  281. package/dist/src/planner/rules/join/rule-monotonic-merge-join.js +113 -0
  282. package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -0
  283. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts +20 -0
  284. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts.map +1 -0
  285. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js +181 -0
  286. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js.map +1 -0
  287. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts +46 -0
  288. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts.map +1 -0
  289. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js +156 -0
  290. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js.map +1 -0
  291. package/dist/src/planner/rules/predicate/rule-filter-contradiction.d.ts +30 -0
  292. package/dist/src/planner/rules/predicate/rule-filter-contradiction.d.ts.map +1 -0
  293. package/dist/src/planner/rules/predicate/rule-filter-contradiction.js +60 -0
  294. package/dist/src/planner/rules/predicate/rule-filter-contradiction.js.map +1 -0
  295. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts +45 -0
  296. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts.map +1 -0
  297. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js +210 -0
  298. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js.map +1 -0
  299. package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.d.ts +29 -0
  300. package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.d.ts.map +1 -0
  301. package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.js +161 -0
  302. package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.js.map +1 -0
  303. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts +39 -0
  304. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts.map +1 -0
  305. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js +91 -0
  306. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js.map +1 -0
  307. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts +35 -0
  308. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts.map +1 -0
  309. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js +74 -0
  310. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js.map +1 -0
  311. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts +27 -0
  312. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts.map +1 -0
  313. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js +103 -0
  314. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js.map +1 -0
  315. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -1
  316. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +1 -25
  317. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
  318. package/dist/src/planner/rules/window/rule-monotonic-window.d.ts +47 -0
  319. package/dist/src/planner/rules/window/rule-monotonic-window.d.ts.map +1 -0
  320. package/dist/src/planner/rules/window/rule-monotonic-window.js +341 -0
  321. package/dist/src/planner/rules/window/rule-monotonic-window.js.map +1 -0
  322. package/dist/src/planner/scopes/global.js +2 -2
  323. package/dist/src/planner/scopes/global.js.map +1 -1
  324. package/dist/src/planner/type-utils.d.ts.map +1 -1
  325. package/dist/src/planner/type-utils.js +11 -0
  326. package/dist/src/planner/type-utils.js.map +1 -1
  327. package/dist/src/planner/util/fd-utils.d.ts +245 -0
  328. package/dist/src/planner/util/fd-utils.d.ts.map +1 -0
  329. package/dist/src/planner/util/fd-utils.js +1416 -0
  330. package/dist/src/planner/util/fd-utils.js.map +1 -0
  331. package/dist/src/planner/util/ind-utils.d.ts +79 -0
  332. package/dist/src/planner/util/ind-utils.d.ts.map +1 -0
  333. package/dist/src/planner/util/ind-utils.js +146 -0
  334. package/dist/src/planner/util/ind-utils.js.map +1 -0
  335. package/dist/src/planner/util/key-utils.d.ts +75 -14
  336. package/dist/src/planner/util/key-utils.d.ts.map +1 -1
  337. package/dist/src/planner/util/key-utils.js +234 -57
  338. package/dist/src/planner/util/key-utils.js.map +1 -1
  339. package/dist/src/runtime/context-helpers.d.ts +9 -0
  340. package/dist/src/runtime/context-helpers.d.ts.map +1 -1
  341. package/dist/src/runtime/context-helpers.js +5 -0
  342. package/dist/src/runtime/context-helpers.js.map +1 -1
  343. package/dist/src/runtime/delta-executor.d.ts +134 -0
  344. package/dist/src/runtime/delta-executor.d.ts.map +1 -0
  345. package/dist/src/runtime/delta-executor.js +382 -0
  346. package/dist/src/runtime/delta-executor.js.map +1 -0
  347. package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
  348. package/dist/src/runtime/emit/alter-table.js +52 -16
  349. package/dist/src/runtime/emit/alter-table.js.map +1 -1
  350. package/dist/src/runtime/emit/asof-scan.d.ts +10 -0
  351. package/dist/src/runtime/emit/asof-scan.d.ts.map +1 -0
  352. package/dist/src/runtime/emit/asof-scan.js +467 -0
  353. package/dist/src/runtime/emit/asof-scan.js.map +1 -0
  354. package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
  355. package/dist/src/runtime/emit/constraint-check.js +20 -0
  356. package/dist/src/runtime/emit/constraint-check.js.map +1 -1
  357. package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -1
  358. package/dist/src/runtime/emit/create-assertion.js +3 -2
  359. package/dist/src/runtime/emit/create-assertion.js.map +1 -1
  360. package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
  361. package/dist/src/runtime/emit/dml-executor.js +40 -13
  362. package/dist/src/runtime/emit/dml-executor.js.map +1 -1
  363. package/dist/src/runtime/emit/drop-assertion.js +1 -1
  364. package/dist/src/runtime/emit/drop-assertion.js.map +1 -1
  365. package/dist/src/runtime/emit/empty-relation.d.ts +5 -0
  366. package/dist/src/runtime/emit/empty-relation.d.ts.map +1 -0
  367. package/dist/src/runtime/emit/empty-relation.js +11 -0
  368. package/dist/src/runtime/emit/empty-relation.js.map +1 -0
  369. package/dist/src/runtime/emit/ordinal-slice.d.ts +13 -0
  370. package/dist/src/runtime/emit/ordinal-slice.d.ts.map +1 -0
  371. package/dist/src/runtime/emit/ordinal-slice.js +89 -0
  372. package/dist/src/runtime/emit/ordinal-slice.js.map +1 -0
  373. package/dist/src/runtime/emit/returning.d.ts.map +1 -1
  374. package/dist/src/runtime/emit/returning.js +9 -4
  375. package/dist/src/runtime/emit/returning.js.map +1 -1
  376. package/dist/src/runtime/emit/scan.d.ts +19 -3
  377. package/dist/src/runtime/emit/scan.d.ts.map +1 -1
  378. package/dist/src/runtime/emit/scan.js +12 -8
  379. package/dist/src/runtime/emit/scan.js.map +1 -1
  380. package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -1
  381. package/dist/src/runtime/emit/schema-declarative.js +91 -14
  382. package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
  383. package/dist/src/runtime/emit/window.d.ts.map +1 -1
  384. package/dist/src/runtime/emit/window.js +732 -37
  385. package/dist/src/runtime/emit/window.js.map +1 -1
  386. package/dist/src/runtime/foreign-key-actions.d.ts +16 -0
  387. package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -1
  388. package/dist/src/runtime/foreign-key-actions.js +86 -5
  389. package/dist/src/runtime/foreign-key-actions.js.map +1 -1
  390. package/dist/src/runtime/register.d.ts.map +1 -1
  391. package/dist/src/runtime/register.js +6 -0
  392. package/dist/src/runtime/register.js.map +1 -1
  393. package/dist/src/schema/assertion.d.ts +8 -0
  394. package/dist/src/schema/assertion.d.ts.map +1 -1
  395. package/dist/src/schema/catalog.d.ts +10 -0
  396. package/dist/src/schema/catalog.d.ts.map +1 -1
  397. package/dist/src/schema/catalog.js +29 -6
  398. package/dist/src/schema/catalog.js.map +1 -1
  399. package/dist/src/schema/change-events.d.ts +5 -1
  400. package/dist/src/schema/change-events.d.ts.map +1 -1
  401. package/dist/src/schema/change-events.js.map +1 -1
  402. package/dist/src/schema/function.d.ts +89 -1
  403. package/dist/src/schema/function.d.ts.map +1 -1
  404. package/dist/src/schema/function.js +31 -0
  405. package/dist/src/schema/function.js.map +1 -1
  406. package/dist/src/schema/manager.d.ts +43 -0
  407. package/dist/src/schema/manager.d.ts.map +1 -1
  408. package/dist/src/schema/manager.js +105 -4
  409. package/dist/src/schema/manager.js.map +1 -1
  410. package/dist/src/schema/rename-rewriter.d.ts.map +1 -1
  411. package/dist/src/schema/rename-rewriter.js +303 -102
  412. package/dist/src/schema/rename-rewriter.js.map +1 -1
  413. package/dist/src/schema/schema-differ.d.ts +18 -1
  414. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  415. package/dist/src/schema/schema-differ.js +307 -42
  416. package/dist/src/schema/schema-differ.js.map +1 -1
  417. package/dist/src/schema/table.d.ts +21 -2
  418. package/dist/src/schema/table.d.ts.map +1 -1
  419. package/dist/src/schema/table.js +17 -8
  420. package/dist/src/schema/table.js.map +1 -1
  421. package/dist/src/types/logical-type.d.ts +11 -0
  422. package/dist/src/types/logical-type.d.ts.map +1 -1
  423. package/dist/src/types/logical-type.js.map +1 -1
  424. package/dist/src/types/temporal-types.d.ts.map +1 -1
  425. package/dist/src/types/temporal-types.js +32 -0
  426. package/dist/src/types/temporal-types.js.map +1 -1
  427. package/dist/src/util/ast-literal.d.ts +11 -0
  428. package/dist/src/util/ast-literal.d.ts.map +1 -0
  429. package/dist/src/util/ast-literal.js +26 -0
  430. package/dist/src/util/ast-literal.js.map +1 -0
  431. package/dist/src/vtab/best-access-plan.d.ts +41 -0
  432. package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
  433. package/dist/src/vtab/best-access-plan.js +29 -0
  434. package/dist/src/vtab/best-access-plan.js.map +1 -1
  435. package/dist/src/vtab/events.d.ts +9 -0
  436. package/dist/src/vtab/events.d.ts.map +1 -1
  437. package/dist/src/vtab/events.js +19 -0
  438. package/dist/src/vtab/events.js.map +1 -1
  439. package/dist/src/vtab/filter-info.d.ts +14 -0
  440. package/dist/src/vtab/filter-info.d.ts.map +1 -1
  441. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  442. package/dist/src/vtab/memory/layer/manager.js +24 -5
  443. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  444. package/dist/src/vtab/memory/module.d.ts +39 -1
  445. package/dist/src/vtab/memory/module.d.ts.map +1 -1
  446. package/dist/src/vtab/memory/module.js +206 -44
  447. package/dist/src/vtab/memory/module.js.map +1 -1
  448. package/dist/src/vtab/memory/utils/predicate.d.ts +2 -1
  449. package/dist/src/vtab/memory/utils/predicate.d.ts.map +1 -1
  450. package/dist/src/vtab/memory/utils/predicate.js +32 -1
  451. package/dist/src/vtab/memory/utils/predicate.js.map +1 -1
  452. package/dist/src/vtab/module.d.ts +24 -0
  453. package/dist/src/vtab/module.d.ts.map +1 -1
  454. package/package.json +3 -3
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Rule: AsofScan strategy selection (hash → merge).
3
+ *
4
+ * Promotes an `AsofScanNode` from the default `'hash'` strategy to the
5
+ * co-streaming `'merge'` strategy when:
6
+ *
7
+ * - Both children advertise `physical.ordering` whose leading
8
+ * `partitionAttrs.length + 1` entries form `[partition cols..., matchAttr]`.
9
+ * - At each partition position, left and right's attribute IDs pair up via
10
+ * a `partitionAttrs` equi-pair, in the same direction on both sides.
11
+ * - The trailing match-attr ordering on each side is ASC. The merge emitter
12
+ * walks both inputs forward — `direction='desc'` (latest right ≤ left)
13
+ * accumulates the largest qualifier seen; `direction='asc'` (earliest
14
+ * right ≥ left) returns the first qualifier. Both forms assume ASC sort
15
+ * on the matchAttr; that aligns with how access-path `monotonicOn` is
16
+ * advertised today (always ascending).
17
+ * - The right's estimated row count meets the configured
18
+ * `tuning.asof.mergeRowThreshold` — below it, hash's constant factors win.
19
+ *
20
+ * Bails to `null` (leaving the hash strategy) on any failure.
21
+ *
22
+ * The merge strategy streams memory O(1) and emits as left rows arrive,
23
+ * unlike the hash variant's O(R) buffering and full-right-arrival latency.
24
+ * Cost is O(L + R) for both — only constant factors differ — so this is a
25
+ * predicate-driven rewrite rather than enumerate-and-cost.
26
+ */
27
+ import { createLogger } from '../../../common/logger.js';
28
+ import { AsofScanNode } from '../../nodes/asof-scan-node.js';
29
+ const log = createLogger('optimizer:rule:asof-strategy-select');
30
+ /**
31
+ * Translate the leading `prefixLen` ordering entries on a child to
32
+ * (attrId, desc) pairs. Returns null when the ordering is shorter than
33
+ * required or contains entries that do not map to a known attribute.
34
+ */
35
+ function mapLeadingOrdering(ordering, attrs, prefixLen) {
36
+ if (!ordering || ordering.length < prefixLen)
37
+ return null;
38
+ const out = [];
39
+ for (let i = 0; i < prefixLen; i++) {
40
+ const entry = ordering[i];
41
+ const attr = attrs[entry.column];
42
+ if (!attr)
43
+ return null;
44
+ out.push({ attrId: attr.id, desc: entry.desc });
45
+ }
46
+ return out;
47
+ }
48
+ export function ruleAsofStrategySelect(node, ctx) {
49
+ if (!(node instanceof AsofScanNode))
50
+ return null;
51
+ if (node.strategy !== 'hash')
52
+ return null;
53
+ const partitionLen = node.partitionAttrs.length;
54
+ const prefixLen = partitionLen + 1;
55
+ const leftAttrs = node.left.getAttributes();
56
+ const rightAttrs = node.right.getAttributes();
57
+ const leftOrdering = mapLeadingOrdering(node.left.physical.ordering, leftAttrs, prefixLen);
58
+ if (!leftOrdering) {
59
+ log('Left does not provide a long enough ordering prefix (need %d)', prefixLen);
60
+ return null;
61
+ }
62
+ const rightOrdering = mapLeadingOrdering(node.right.physical.ordering, rightAttrs, prefixLen);
63
+ if (!rightOrdering) {
64
+ log('Right does not provide a long enough ordering prefix (need %d)', prefixLen);
65
+ return null;
66
+ }
67
+ // Partition prefix: at each ordering position, left's attr-id must be the
68
+ // `leftAttrId` of one of the partition pairs; the same position on the
69
+ // right must carry the corresponding `rightAttrId`. Directions must match.
70
+ const remainingPairs = node.partitionAttrs.slice();
71
+ for (let i = 0; i < partitionLen; i++) {
72
+ const leftEntry = leftOrdering[i];
73
+ const rightEntry = rightOrdering[i];
74
+ if (leftEntry.desc !== rightEntry.desc) {
75
+ log('Direction mismatch at partition position %d (left=%s, right=%s)', i, leftEntry.desc ? 'desc' : 'asc', rightEntry.desc ? 'desc' : 'asc');
76
+ return null;
77
+ }
78
+ const pairIdx = remainingPairs.findIndex(p => p.leftAttrId === leftEntry.attrId && p.rightAttrId === rightEntry.attrId);
79
+ if (pairIdx < 0) {
80
+ log('Position %d (left=%d, right=%d) does not pair via partitionAttrs', i, leftEntry.attrId, rightEntry.attrId);
81
+ return null;
82
+ }
83
+ remainingPairs.splice(pairIdx, 1);
84
+ }
85
+ // Trailing entry on each side must be the asof match attribute, ASC.
86
+ // The merge emitter walks both inputs forward; that requires ascending
87
+ // match-attr ordering on both sides regardless of the asof direction.
88
+ const tailLeft = leftOrdering[partitionLen];
89
+ const tailRight = rightOrdering[partitionLen];
90
+ if (tailLeft.attrId !== node.matchAttr.leftAttrId) {
91
+ log('Left ordering tail (attr=%d) is not the match attr (attr=%d)', tailLeft.attrId, node.matchAttr.leftAttrId);
92
+ return null;
93
+ }
94
+ if (tailRight.attrId !== node.matchAttr.rightAttrId) {
95
+ log('Right ordering tail (attr=%d) is not the match attr (attr=%d)', tailRight.attrId, node.matchAttr.rightAttrId);
96
+ return null;
97
+ }
98
+ if (tailLeft.desc || tailRight.desc) {
99
+ log('Match-attr ordering must be ASC on both sides (left=%s, right=%s)', tailLeft.desc ? 'desc' : 'asc', tailRight.desc ? 'desc' : 'asc');
100
+ return null;
101
+ }
102
+ // Threshold gate.
103
+ const tuning = ctx.tuning;
104
+ const rightRows = node.right.estimatedRows ?? tuning.defaultRowEstimate;
105
+ if (rightRows < tuning.asof.mergeRowThreshold) {
106
+ log('Right estimated rows (%d) below merge threshold (%d); keeping hash', rightRows, tuning.asof.mergeRowThreshold);
107
+ return null;
108
+ }
109
+ log('Promoting AsofScan to merge strategy (rightRows=%d, partitionCols=%d)', rightRows, partitionLen);
110
+ return node.withStrategy('merge');
111
+ }
112
+ //# sourceMappingURL=rule-asof-strategy-select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-asof-strategy-select.js","sourceRoot":"","sources":["../../../../../src/planner/rules/access/rule-asof-strategy-select.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,MAAM,GAAG,GAAG,YAAY,CAAC,qCAAqC,CAAC,CAAC;AAOhE;;;;GAIG;AACH,SAAS,kBAAkB,CAC1B,QAAkE,EAClE,KAAgC,EAChC,SAAiB;IAEjB,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,SAAS;QAAE,OAAO,IAAI,CAAC;IAC1D,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAc,EAAE,GAAe;IACrE,IAAI,CAAC,CAAC,IAAI,YAAY,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAE1C,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;IAChD,MAAM,SAAS,GAAG,YAAY,GAAG,CAAC,CAAC;IAEnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IAE9C,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC3F,IAAI,CAAC,YAAY,EAAE,CAAC;QACnB,GAAG,CAAC,+DAA+D,EAAE,SAAS,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,aAAa,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC9F,IAAI,CAAC,aAAa,EAAE,CAAC;QACpB,GAAG,CAAC,gEAAgE,EAAE,SAAS,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC;IACb,CAAC;IAED,0EAA0E;IAC1E,uEAAuE;IACvE,2EAA2E;IAC3E,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC;YACxC,GAAG,CAAC,iEAAiE,EACpE,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,IAAI,CAAC;QACb,CAAC;QACD,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAC5C,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC,WAAW,KAAK,UAAU,CAAC,MAAM,CAAC,CAAC;QAC3E,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YACjB,GAAG,CAAC,kEAAkE,EACrE,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC;QACb,CAAC;QACD,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,qEAAqE;IACrE,uEAAuE;IACvE,sEAAsE;IACtE,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QACnD,GAAG,CAAC,8DAA8D,EACjE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;QACrD,GAAG,CAAC,+DAA+D,EAClE,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;QACrC,GAAG,CAAC,mEAAmE,EACtE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAC9B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,kBAAkB;IAClB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,MAAM,CAAC,kBAAkB,CAAC;IACxE,IAAI,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/C,GAAG,CAAC,oEAAoE,EACvE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC;IACb,CAAC;IAED,GAAG,CAAC,uEAAuE,EAC1E,SAAS,EAAE,YAAY,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Rule: Monotonic LIMIT/OFFSET pushdown
3
+ *
4
+ * Pattern (the rule peels through these in order, top-down from the
5
+ * LimitOffsetNode toward the leaf):
6
+ *
7
+ * LimitOffsetNode
8
+ * └─ SortNode? (single trivial column ref matching leaf monotonicOn)
9
+ * └─ (ProjectNode | AliasNode)* (only trivial column-reference projections)
10
+ * └─ IndexScan / IndexSeek / SeqScan
11
+ * (advertises monotonicOn AND accessCapabilities.ordinalSeek)
12
+ *
13
+ * On a successful match, the entire `LimitOffset[/Sort]/.../leaf` subtree is
14
+ * replaced with `…/OrdinalSlice(leaf)` — the OrdinalSlice slots in directly
15
+ * above the leaf, threading the resolved offset/limit into the leaf's
16
+ * FilterInfo so the vtab can seek directly to the kth row in O(log N)
17
+ * instead of buffering k+n rows.
18
+ *
19
+ * Trivial Project nodes (all projections are bare ColumnReferenceNodes) and
20
+ * Alias wrappers preserve row count and order, so we can descend through
21
+ * them — the OrdinalSlice still slices the leaf in monotonic order.
22
+ *
23
+ * The rule rejects all of:
24
+ * - `Sort` whose key isn't a single trivial column ref into the leaf
25
+ * - `Sort` direction mismatching the advertised `monotonicOn.direction`
26
+ * - any non-trivial intermediate node (Filter, Distinct, Aggregate, etc.)
27
+ * - leaf advertising `monotonicOn` but not `ordinalSeek`
28
+ * - multi-key `ORDER BY`
29
+ */
30
+ import type { PlanNode } from '../../nodes/plan-node.js';
31
+ import type { OptContext } from '../../framework/context.js';
32
+ export declare function ruleMonotonicLimitPushdown(node: PlanNode, _context: OptContext): PlanNode | null;
33
+ //# sourceMappingURL=rule-monotonic-limit-pushdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-monotonic-limit-pushdown.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/access/rule-monotonic-limit-pushdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAsB,MAAM,0BAA0B,CAAC;AAE7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AA+F7D,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CA0EhG"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Rule: Monotonic LIMIT/OFFSET pushdown
3
+ *
4
+ * Pattern (the rule peels through these in order, top-down from the
5
+ * LimitOffsetNode toward the leaf):
6
+ *
7
+ * LimitOffsetNode
8
+ * └─ SortNode? (single trivial column ref matching leaf monotonicOn)
9
+ * └─ (ProjectNode | AliasNode)* (only trivial column-reference projections)
10
+ * └─ IndexScan / IndexSeek / SeqScan
11
+ * (advertises monotonicOn AND accessCapabilities.ordinalSeek)
12
+ *
13
+ * On a successful match, the entire `LimitOffset[/Sort]/.../leaf` subtree is
14
+ * replaced with `…/OrdinalSlice(leaf)` — the OrdinalSlice slots in directly
15
+ * above the leaf, threading the resolved offset/limit into the leaf's
16
+ * FilterInfo so the vtab can seek directly to the kth row in O(log N)
17
+ * instead of buffering k+n rows.
18
+ *
19
+ * Trivial Project nodes (all projections are bare ColumnReferenceNodes) and
20
+ * Alias wrappers preserve row count and order, so we can descend through
21
+ * them — the OrdinalSlice still slices the leaf in monotonic order.
22
+ *
23
+ * The rule rejects all of:
24
+ * - `Sort` whose key isn't a single trivial column ref into the leaf
25
+ * - `Sort` direction mismatching the advertised `monotonicOn.direction`
26
+ * - any non-trivial intermediate node (Filter, Distinct, Aggregate, etc.)
27
+ * - leaf advertising `monotonicOn` but not `ordinalSeek`
28
+ * - multi-key `ORDER BY`
29
+ */
30
+ import { createLogger } from '../../../common/logger.js';
31
+ import { isRelationalNode } from '../../nodes/plan-node.js';
32
+ import { LimitOffsetNode } from '../../nodes/limit-offset.js';
33
+ import { SortNode } from '../../nodes/sort.js';
34
+ import { AliasNode } from '../../nodes/alias-node.js';
35
+ import { ProjectNode } from '../../nodes/project-node.js';
36
+ import { SeqScanNode, IndexScanNode, IndexSeekNode } from '../../nodes/table-access-nodes.js';
37
+ import { ColumnReferenceNode } from '../../nodes/reference.js';
38
+ import { OrdinalSliceNode } from '../../nodes/ordinal-slice-node.js';
39
+ const log = createLogger('optimizer:rule:monotonic-limit-pushdown');
40
+ function isAccessLeaf(node) {
41
+ return node instanceof SeqScanNode || node instanceof IndexScanNode || node instanceof IndexSeekNode;
42
+ }
43
+ /**
44
+ * A Project is "trivial" iff every projection is a bare ColumnReferenceNode.
45
+ * Trivial projects preserve row count, order, and per-row identity, so an
46
+ * OrdinalSlice underneath them still computes the right slice indices.
47
+ *
48
+ * Computed/expression projections might mutate cardinality (impossible for
49
+ * pure scalars, but the conservative check keeps the rule simple) or change
50
+ * the meaning of "kth row" if combined with subqueries; we exclude them.
51
+ */
52
+ function isTrivialProject(project) {
53
+ return project.projections.every(p => p.node instanceof ColumnReferenceNode);
54
+ }
55
+ /**
56
+ * Walk down from `chainRoot` toward the access leaf, descending only through
57
+ * trivial Project / Alias wrappers. Returns null if we hit a non-trivial node
58
+ * before reaching the leaf.
59
+ */
60
+ function peelToLeaf(chainRoot) {
61
+ let cursor = chainRoot;
62
+ let sort;
63
+ if (cursor instanceof SortNode) {
64
+ sort = cursor;
65
+ cursor = cursor.source;
66
+ }
67
+ let safety = 16;
68
+ while (safety-- > 0) {
69
+ if (isAccessLeaf(cursor)) {
70
+ return { leaf: cursor, chainRoot, sort };
71
+ }
72
+ if (cursor instanceof AliasNode) {
73
+ cursor = cursor.source;
74
+ continue;
75
+ }
76
+ if (cursor instanceof ProjectNode && isTrivialProject(cursor)) {
77
+ cursor = cursor.source;
78
+ continue;
79
+ }
80
+ return null;
81
+ }
82
+ return null;
83
+ }
84
+ /**
85
+ * Rebuild the chain `chainRoot → … → oldLeaf` with `oldLeaf` replaced by
86
+ * `newLeaf`. Each intermediate node is reconstructed via `withChildren`,
87
+ * preserving its other children (scalar inputs to Project / Sort).
88
+ */
89
+ function rebuildChain(chainRoot, oldLeaf, newLeaf) {
90
+ if (chainRoot === oldLeaf) {
91
+ return newLeaf;
92
+ }
93
+ const originalChildren = chainRoot.getChildren();
94
+ const newChildren = originalChildren.map(child => {
95
+ if (isRelationalNode(child)) {
96
+ return rebuildChain(child, oldLeaf, newLeaf);
97
+ }
98
+ return child;
99
+ });
100
+ return chainRoot.withChildren(newChildren);
101
+ }
102
+ export function ruleMonotonicLimitPushdown(node, _context) {
103
+ if (!(node instanceof LimitOffsetNode))
104
+ return null;
105
+ // Degenerate LimitOffset (no bounds) — nothing to push down.
106
+ if (!node.limit && !node.offset)
107
+ return null;
108
+ const peeled = peelToLeaf(node.source);
109
+ if (!peeled) {
110
+ log('Could not peel down to a physical access leaf from %s', node.source.nodeType);
111
+ return null;
112
+ }
113
+ const physical = peeled.leaf.physical;
114
+ if (!physical.accessCapabilities?.ordinalSeek) {
115
+ log('Leaf does not advertise ordinalSeek; skipping');
116
+ return null;
117
+ }
118
+ const monotonicOn = physical.monotonicOn;
119
+ if (!monotonicOn || monotonicOn.length === 0) {
120
+ log('Leaf advertises ordinalSeek but no monotonicOn; skipping');
121
+ return null;
122
+ }
123
+ const leafMonotonic = monotonicOn[0];
124
+ // If a Sort is present, it must be a single trivial column ref whose
125
+ // attribute id and direction match the leaf's monotonicOn[0].
126
+ if (peeled.sort) {
127
+ if (peeled.sort.sortKeys.length !== 1) {
128
+ log('Sort has %d keys; multi-key ORDER BY not supported', peeled.sort.sortKeys.length);
129
+ return null;
130
+ }
131
+ const key = peeled.sort.sortKeys[0];
132
+ if (!(key.expression instanceof ColumnReferenceNode)) {
133
+ log('Sort key is not a trivial column reference');
134
+ return null;
135
+ }
136
+ if (key.expression.attributeId !== leafMonotonic.attrId) {
137
+ log('Sort key attr=%d does not match leaf monotonicOn attr=%d', key.expression.attributeId, leafMonotonic.attrId);
138
+ return null;
139
+ }
140
+ if (key.direction !== leafMonotonic.direction) {
141
+ log('Sort direction %s does not match leaf monotonicOn direction %s', key.direction, leafMonotonic.direction);
142
+ return null;
143
+ }
144
+ }
145
+ // Build OrdinalSlice over the leaf, then re-stitch the chain above it.
146
+ const slice = new OrdinalSliceNode(node.scope, peeled.leaf, leafMonotonic.attrId, node.offset, node.limit, leafMonotonic.direction);
147
+ // `chainRoot` is the original LimitOffset.source — could be Sort, Project,
148
+ // Alias, or the leaf itself. We replace the leaf in that chain with the
149
+ // slice and drop the Sort if present (the slice preserves emit order).
150
+ let rewrittenSource;
151
+ if (peeled.sort) {
152
+ // Drop the Sort entirely: the slice's source already emits in the
153
+ // requested order, so re-sorting would be wasteful.
154
+ rewrittenSource = rebuildChain(peeled.sort.source, peeled.leaf, slice);
155
+ }
156
+ else {
157
+ rewrittenSource = rebuildChain(peeled.chainRoot, peeled.leaf, slice);
158
+ }
159
+ log('Replaced LimitOffset[/Sort]/leaf with OrdinalSlice (attr=%d, %s)', leafMonotonic.attrId, leafMonotonic.direction);
160
+ return rewrittenSource;
161
+ }
162
+ //# sourceMappingURL=rule-monotonic-limit-pushdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-monotonic-limit-pushdown.js","sourceRoot":"","sources":["../../../../../src/planner/rules/access/rule-monotonic-limit-pushdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAC9F,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAErE,MAAM,GAAG,GAAG,YAAY,CAAC,yCAAyC,CAAC,CAAC;AAIpE,SAAS,YAAY,CAAC,IAAc;IACnC,OAAO,IAAI,YAAY,WAAW,IAAI,IAAI,YAAY,aAAa,IAAI,IAAI,YAAY,aAAa,CAAC;AACtG,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,gBAAgB,CAAC,OAAoB;IAC7C,OAAO,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,YAAY,mBAAmB,CAAC,CAAC;AAC9E,CAAC;AAWD;;;;GAIG;AACH,SAAS,UAAU,CAAC,SAA6B;IAChD,IAAI,MAAM,GAAuB,SAAS,CAAC;IAC3C,IAAI,IAA0B,CAAC;IAE/B,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;QAChC,IAAI,GAAG,MAAM,CAAC;QACd,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,CAAC;IAED,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,OAAO,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QACrB,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC1C,CAAC;QACD,IAAI,MAAM,YAAY,SAAS,EAAE,CAAC;YACjC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACvB,SAAS;QACV,CAAC;QACD,IAAI,MAAM,YAAY,WAAW,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/D,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACvB,SAAS;QACV,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CACpB,SAA6B,EAC7B,OAAmB,EACnB,OAA2B;IAE3B,IAAI,SAAS,KAAM,OAAyC,EAAE,CAAC;QAC9D,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,MAAM,gBAAgB,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IACjD,MAAM,WAAW,GAAe,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QAC5D,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IACH,OAAO,SAAS,CAAC,YAAY,CAAC,WAAW,CAAuB,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAc,EAAE,QAAoB;IAC9E,IAAI,CAAC,CAAC,IAAI,YAAY,eAAe,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpD,6DAA6D;IAC7D,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAE7C,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,GAAG,CAAC,uDAAuD,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;IACtC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,WAAW,EAAE,CAAC;QAC/C,GAAG,CAAC,+CAA+C,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;IACzC,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9C,GAAG,CAAC,0DAA0D,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAErC,qEAAqE;IACrE,8DAA8D;IAC9D,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,GAAG,CAAC,oDAAoD,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACvF,OAAO,IAAI,CAAC;QACb,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,YAAY,mBAAmB,CAAC,EAAE,CAAC;YACtD,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;YACzD,GAAG,CAAC,0DAA0D,EAC7D,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,KAAK,aAAa,CAAC,SAAS,EAAE,CAAC;YAC/C,GAAG,CAAC,gEAAgE,EACnE,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED,uEAAuE;IACvE,MAAM,KAAK,GAAG,IAAI,gBAAgB,CACjC,IAAI,CAAC,KAAK,EACV,MAAM,CAAC,IAAI,EACX,aAAa,CAAC,MAAM,EACpB,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,KAAK,EACV,aAAa,CAAC,SAAS,CACvB,CAAC;IAEF,2EAA2E;IAC3E,wEAAwE;IACxE,uEAAuE;IACvE,IAAI,eAAmC,CAAC;IACxC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,kEAAkE;QAClE,oDAAoD;QACpD,eAAe,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACP,eAAe,GAAG,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC;IAED,GAAG,CAAC,kEAAkE,EACrE,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAChD,OAAO,eAAe,CAAC;AACxB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Rule: Monotonic range scan recognition
3
+ *
4
+ * Two responsibilities, gated by node type:
5
+ *
6
+ * 1. **Annotation (leaf nodes — IndexScan / IndexSeek / SeqScan)**:
7
+ * When the leaf advertises `monotonicOn(x)` and its `FilterInfo.constraints`
8
+ * carries a handled range/equality on `x`, set `physical.rangeBoundedOn` so
9
+ * EXPLAIN and downstream rules can read off the symbolic bound. This is a
10
+ * pure annotation — it does not change the row stream.
11
+ *
12
+ * 2. **Defensive `monotonicOn` drop (Filter directly above a leaf)**:
13
+ * If a `FilterNode` sits directly above a leaf that advertises
14
+ * `monotonicOn(x)` and the filter's predicate contains a range or equality
15
+ * on `x` (i.e., the vtab declined to handle the bound), the row stream
16
+ * emerging from the *Filter* is no longer monotonic over the WHERE-restricted
17
+ * set. Drop `monotonicOn` (and the implied `accessCapabilities`) from the
18
+ * leaf so downstream rules (asof, merge-join) don't make false assumptions.
19
+ *
20
+ * The rule runs in the PostOptimization pass so it sees physical leaves with
21
+ * lifted advertisements + resolved FilterInfo. The annotation reads off the
22
+ * leaf's own `FilterInfo.constraints` (the canonical record of which bounds
23
+ * the access path is walking with). The defensive escalation reads the parent
24
+ * Filter's predicate.
25
+ */
26
+ import type { PlanNode } from '../../nodes/plan-node.js';
27
+ import type { OptContext } from '../../framework/context.js';
28
+ export declare function ruleMonotonicRangeAccess(node: PlanNode, _ctx: OptContext): PlanNode | null;
29
+ //# sourceMappingURL=rule-monotonic-range-access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-monotonic-range-access.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/access/rule-monotonic-range-access.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAuN7D,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAQ1F"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Rule: Monotonic range scan recognition
3
+ *
4
+ * Two responsibilities, gated by node type:
5
+ *
6
+ * 1. **Annotation (leaf nodes — IndexScan / IndexSeek / SeqScan)**:
7
+ * When the leaf advertises `monotonicOn(x)` and its `FilterInfo.constraints`
8
+ * carries a handled range/equality on `x`, set `physical.rangeBoundedOn` so
9
+ * EXPLAIN and downstream rules can read off the symbolic bound. This is a
10
+ * pure annotation — it does not change the row stream.
11
+ *
12
+ * 2. **Defensive `monotonicOn` drop (Filter directly above a leaf)**:
13
+ * If a `FilterNode` sits directly above a leaf that advertises
14
+ * `monotonicOn(x)` and the filter's predicate contains a range or equality
15
+ * on `x` (i.e., the vtab declined to handle the bound), the row stream
16
+ * emerging from the *Filter* is no longer monotonic over the WHERE-restricted
17
+ * set. Drop `monotonicOn` (and the implied `accessCapabilities`) from the
18
+ * leaf so downstream rules (asof, merge-join) don't make false assumptions.
19
+ *
20
+ * The rule runs in the PostOptimization pass so it sees physical leaves with
21
+ * lifted advertisements + resolved FilterInfo. The annotation reads off the
22
+ * leaf's own `FilterInfo.constraints` (the canonical record of which bounds
23
+ * the access path is walking with). The defensive escalation reads the parent
24
+ * Filter's predicate.
25
+ */
26
+ import { createLogger } from '../../../common/logger.js';
27
+ import { IndexConstraintOp } from '../../../common/constants.js';
28
+ import { SeqScanNode, IndexScanNode, IndexSeekNode } from '../../nodes/table-access-nodes.js';
29
+ import { FilterNode } from '../../nodes/filter.js';
30
+ import { LiteralNode } from '../../nodes/scalar.js';
31
+ import { extractConstraints, createTableInfoFromNode } from '../../analysis/constraint-extractor.js';
32
+ const log = createLogger('optimizer:rule:monotonic-range-access');
33
+ function isAccessLeaf(node) {
34
+ return node instanceof SeqScanNode || node instanceof IndexScanNode || node instanceof IndexSeekNode;
35
+ }
36
+ const GE_OR_GT = new Set([IndexConstraintOp.GE, IndexConstraintOp.GT]);
37
+ const LE_OR_LT = new Set([IndexConstraintOp.LE, IndexConstraintOp.LT]);
38
+ /**
39
+ * Walk the leaf's `FilterInfo.constraints` looking for handled bounds on the
40
+ * given column index. Returns the synthesized RangeBounds (literals included
41
+ * when the corresponding seek key is a LiteralNode); returns null when no
42
+ * range/equality bound exists.
43
+ */
44
+ function extractRangeBounds(filterInfo, seekKeys, colIdx) {
45
+ const out = {};
46
+ let any = false;
47
+ for (const entry of filterInfo.constraints) {
48
+ const c = entry.constraint;
49
+ if (c.iColumn !== colIdx)
50
+ continue;
51
+ // argvIndex is 1-based into seekKeys (when seekKeys is the IndexSeekNode's seekKeys array).
52
+ const seekKey = seekKeys && entry.argvIndex >= 1 && entry.argvIndex <= seekKeys.length
53
+ ? seekKeys[entry.argvIndex - 1]
54
+ : undefined;
55
+ const valueLiteral = seekKey instanceof LiteralNode ? seekKey.expression.value : undefined;
56
+ if (GE_OR_GT.has(c.op)) {
57
+ const op = c.op === IndexConstraintOp.GE ? '>=' : '>';
58
+ out.lower = valueLiteral !== undefined ? { op, valueLiteral } : { op };
59
+ any = true;
60
+ }
61
+ else if (LE_OR_LT.has(c.op)) {
62
+ const op = c.op === IndexConstraintOp.LE ? '<=' : '<';
63
+ out.upper = valueLiteral !== undefined ? { op, valueLiteral } : { op };
64
+ any = true;
65
+ }
66
+ else if (c.op === IndexConstraintOp.EQ) {
67
+ // Equality is a degenerate range [v, v]. Lift to both bounds.
68
+ const lo = valueLiteral !== undefined ? { op: '>=', valueLiteral } : { op: '>=' };
69
+ const hi = valueLiteral !== undefined ? { op: '<=', valueLiteral } : { op: '<=' };
70
+ out.lower = lo;
71
+ out.upper = hi;
72
+ any = true;
73
+ }
74
+ }
75
+ return any ? out : null;
76
+ }
77
+ function findColIndexForAttr(leaf, attrId) {
78
+ const attrs = leaf.source.getAttributes();
79
+ for (let i = 0; i < attrs.length; i++) {
80
+ if (attrs[i].id === attrId)
81
+ return i;
82
+ }
83
+ return -1;
84
+ }
85
+ /** Clone a leaf, attaching `rangeBoundedOn` to its physical properties. */
86
+ function leafWithRangeBound(leaf, rb) {
87
+ if (leaf instanceof SeqScanNode) {
88
+ return new SeqScanNode(leaf.scope, leaf.source, leaf.filterInfo, undefined, rb, leaf.suppressMonotonic);
89
+ }
90
+ if (leaf instanceof IndexScanNode) {
91
+ return new IndexScanNode(leaf.scope, leaf.source, leaf.filterInfo, leaf.indexName, leaf.providesOrdering, undefined, leaf.advertisement, rb, leaf.suppressMonotonic);
92
+ }
93
+ // IndexSeekNode
94
+ return new IndexSeekNode(leaf.scope, leaf.source, leaf.filterInfo, leaf.indexName, leaf.seekKeys, leaf.isRange, leaf.providesOrdering, undefined, leaf.advertisement, rb, leaf.suppressMonotonic);
95
+ }
96
+ /** Clone a leaf, suppressing the lifted `monotonicOn` advertisement. */
97
+ function leafWithMonotonicSuppressed(leaf) {
98
+ if (leaf instanceof SeqScanNode) {
99
+ return new SeqScanNode(leaf.scope, leaf.source, leaf.filterInfo, undefined, leaf.rangeBoundedOn, true);
100
+ }
101
+ if (leaf instanceof IndexScanNode) {
102
+ return new IndexScanNode(leaf.scope, leaf.source, leaf.filterInfo, leaf.indexName, leaf.providesOrdering, undefined, leaf.advertisement, leaf.rangeBoundedOn, true);
103
+ }
104
+ return new IndexSeekNode(leaf.scope, leaf.source, leaf.filterInfo, leaf.indexName, leaf.seekKeys, leaf.isRange, leaf.providesOrdering, undefined, leaf.advertisement, leaf.rangeBoundedOn, true);
105
+ }
106
+ /**
107
+ * Annotation pass for a physical access leaf. Sets `rangeBoundedOn` when the
108
+ * leaf advertises `monotonicOn(x)` AND its FilterInfo carries a handled
109
+ * range/equality on `x`. No-op otherwise.
110
+ */
111
+ function applyAnnotation(leaf) {
112
+ // Don't re-annotate if we've already set rangeBoundedOn.
113
+ if (leaf.rangeBoundedOn)
114
+ return null;
115
+ const monotonicOn = leaf.physical.monotonicOn;
116
+ if (!monotonicOn || monotonicOn.length === 0)
117
+ return null;
118
+ const attrId = monotonicOn[0].attrId;
119
+ const colIdx = findColIndexForAttr(leaf, attrId);
120
+ if (colIdx < 0)
121
+ return null;
122
+ const seekKeys = leaf instanceof IndexSeekNode ? leaf.seekKeys : undefined;
123
+ const bounds = extractRangeBounds(leaf.filterInfo, seekKeys, colIdx);
124
+ if (!bounds)
125
+ return null;
126
+ const rb = {
127
+ attrId,
128
+ ...(bounds.lower ? { lower: bounds.lower } : {}),
129
+ ...(bounds.upper ? { upper: bounds.upper } : {}),
130
+ };
131
+ log('Annotating %s with rangeBoundedOn (attrId=%d)', leaf.nodeType, attrId);
132
+ return leafWithRangeBound(leaf, rb);
133
+ }
134
+ /**
135
+ * Defensive escalation: when a Filter sits directly above a leaf that
136
+ * advertises monotonicOn(x), and the Filter's predicate contains a range or
137
+ * equality on x, drop monotonicOn from the leaf — the row stream emerging
138
+ * from the Filter is not monotonic over the WHERE-restricted tuple set.
139
+ */
140
+ function applyDefensiveDrop(filter) {
141
+ if (!isAccessLeaf(filter.source))
142
+ return null;
143
+ const leaf = filter.source;
144
+ const monotonicOn = leaf.physical.monotonicOn;
145
+ if (!monotonicOn || monotonicOn.length === 0)
146
+ return null;
147
+ if (leaf.suppressMonotonic)
148
+ return null;
149
+ const attrId = monotonicOn[0].attrId;
150
+ const colIdx = findColIndexForAttr(leaf, attrId);
151
+ if (colIdx < 0)
152
+ return null;
153
+ // Walk the Filter predicate to see if it carries a range/equality on the
154
+ // monotonic column. We use the constraint extractor to canonicalize the
155
+ // predicate, then look for a constraint on the matching attribute id.
156
+ const tableInfo = createTableInfoFromNode(leaf.source);
157
+ const result = extractConstraints(filter.predicate, [tableInfo]);
158
+ const offending = result.allConstraints.some(c => c.attributeId === attrId &&
159
+ (c.op === '=' || c.op === '>' || c.op === '>=' || c.op === '<' || c.op === '<='));
160
+ if (!offending)
161
+ return null;
162
+ log('Filter directly above leaf carries unhandled range on monotonic attr %d; suppressing monotonicOn', attrId);
163
+ const newLeaf = leafWithMonotonicSuppressed(leaf);
164
+ return filter.withChildren([newLeaf, filter.predicate]);
165
+ }
166
+ export function ruleMonotonicRangeAccess(node, _ctx) {
167
+ if (node instanceof FilterNode) {
168
+ return applyDefensiveDrop(node);
169
+ }
170
+ if (isAccessLeaf(node)) {
171
+ return applyAnnotation(node);
172
+ }
173
+ return null;
174
+ }
175
+ //# sourceMappingURL=rule-monotonic-range-access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-monotonic-range-access.js","sourceRoot":"","sources":["../../../../../src/planner/rules/access/rule-monotonic-range-access.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rule-select-access-path.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/access/rule-select-access-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,0BAA0B,CAAC;AAEzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAmB7D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CA0DzF"}
1
+ {"version":3,"file":"rule-select-access-path.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/access/rule-select-access-path.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,0BAA0B,CAAC;AAEzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAoC7D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CA0EzF"}