@quereus/quereus 2.7.0 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. package/dist/src/common/errors.d.ts +21 -0
  2. package/dist/src/common/errors.d.ts.map +1 -1
  3. package/dist/src/common/errors.js +29 -0
  4. package/dist/src/common/errors.js.map +1 -1
  5. package/dist/src/core/database.d.ts.map +1 -1
  6. package/dist/src/core/database.js +20 -7
  7. package/dist/src/core/database.js.map +1 -1
  8. package/dist/src/core/statement.d.ts.map +1 -1
  9. package/dist/src/core/statement.js +15 -5
  10. package/dist/src/core/statement.js.map +1 -1
  11. package/dist/src/emit/ast-stringify.d.ts.map +1 -1
  12. package/dist/src/emit/ast-stringify.js +0 -4
  13. package/dist/src/emit/ast-stringify.js.map +1 -1
  14. package/dist/src/func/builtins/explain.d.ts.map +1 -1
  15. package/dist/src/func/builtins/explain.js +39 -36
  16. package/dist/src/func/builtins/explain.js.map +1 -1
  17. package/dist/src/func/builtins/json-helpers.d.ts +1 -1
  18. package/dist/src/func/builtins/json-helpers.d.ts.map +1 -1
  19. package/dist/src/func/builtins/json-helpers.js.map +1 -1
  20. package/dist/src/func/builtins/json.d.ts.map +1 -1
  21. package/dist/src/func/builtins/json.js +5 -7
  22. package/dist/src/func/builtins/json.js.map +1 -1
  23. package/dist/src/func/builtins/scalar.d.ts.map +1 -1
  24. package/dist/src/func/builtins/scalar.js +17 -2
  25. package/dist/src/func/builtins/scalar.js.map +1 -1
  26. package/dist/src/func/builtins/string.d.ts.map +1 -1
  27. package/dist/src/func/builtins/string.js +4 -2
  28. package/dist/src/func/builtins/string.js.map +1 -1
  29. package/dist/src/parser/ast.d.ts +4 -3
  30. package/dist/src/parser/ast.d.ts.map +1 -1
  31. package/dist/src/parser/lexer.d.ts.map +1 -1
  32. package/dist/src/parser/lexer.js +8 -48
  33. package/dist/src/parser/lexer.js.map +1 -1
  34. package/dist/src/parser/parser.d.ts.map +1 -1
  35. package/dist/src/parser/parser.js +43 -11
  36. package/dist/src/parser/parser.js.map +1 -1
  37. package/dist/src/parser/utils.d.ts +10 -1
  38. package/dist/src/parser/utils.d.ts.map +1 -1
  39. package/dist/src/parser/utils.js +23 -0
  40. package/dist/src/parser/utils.js.map +1 -1
  41. package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
  42. package/dist/src/planner/analysis/constraint-extractor.js +0 -1
  43. package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
  44. package/dist/src/planner/building/constraint-builder.d.ts +12 -1
  45. package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
  46. package/dist/src/planner/building/constraint-builder.js +60 -1
  47. package/dist/src/planner/building/constraint-builder.js.map +1 -1
  48. package/dist/src/planner/building/create-view.d.ts.map +1 -1
  49. package/dist/src/planner/building/create-view.js +16 -0
  50. package/dist/src/planner/building/create-view.js.map +1 -1
  51. package/dist/src/planner/building/delete.d.ts.map +1 -1
  52. package/dist/src/planner/building/delete.js +13 -7
  53. package/dist/src/planner/building/delete.js.map +1 -1
  54. package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
  55. package/dist/src/planner/building/foreign-key-builder.js +27 -17
  56. package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
  57. package/dist/src/planner/building/insert.d.ts.map +1 -1
  58. package/dist/src/planner/building/insert.js +51 -43
  59. package/dist/src/planner/building/insert.js.map +1 -1
  60. package/dist/src/planner/building/select-aggregates.d.ts +4 -1
  61. package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
  62. package/dist/src/planner/building/select-aggregates.js +122 -21
  63. package/dist/src/planner/building/select-aggregates.js.map +1 -1
  64. package/dist/src/planner/building/select-modifiers.d.ts +6 -2
  65. package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
  66. package/dist/src/planner/building/select-modifiers.js +20 -5
  67. package/dist/src/planner/building/select-modifiers.js.map +1 -1
  68. package/dist/src/planner/building/select-ordinal.d.ts +20 -0
  69. package/dist/src/planner/building/select-ordinal.d.ts.map +1 -0
  70. package/dist/src/planner/building/select-ordinal.js +62 -0
  71. package/dist/src/planner/building/select-ordinal.js.map +1 -0
  72. package/dist/src/planner/building/select.d.ts.map +1 -1
  73. package/dist/src/planner/building/select.js +78 -19
  74. package/dist/src/planner/building/select.js.map +1 -1
  75. package/dist/src/planner/building/update.d.ts.map +1 -1
  76. package/dist/src/planner/building/update.js +38 -27
  77. package/dist/src/planner/building/update.js.map +1 -1
  78. package/dist/src/planner/building/with.d.ts.map +1 -1
  79. package/dist/src/planner/building/with.js +25 -2
  80. package/dist/src/planner/building/with.js.map +1 -1
  81. package/dist/src/planner/framework/characteristics.d.ts +3 -1
  82. package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
  83. package/dist/src/planner/framework/characteristics.js +7 -0
  84. package/dist/src/planner/framework/characteristics.js.map +1 -1
  85. package/dist/src/planner/framework/physical-utils.d.ts +22 -1
  86. package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
  87. package/dist/src/planner/framework/physical-utils.js +47 -0
  88. package/dist/src/planner/framework/physical-utils.js.map +1 -1
  89. package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
  90. package/dist/src/planner/nodes/alias-node.js +2 -0
  91. package/dist/src/planner/nodes/alias-node.js.map +1 -1
  92. package/dist/src/planner/nodes/asof-scan-node.d.ts +137 -0
  93. package/dist/src/planner/nodes/asof-scan-node.d.ts.map +1 -0
  94. package/dist/src/planner/nodes/asof-scan-node.js +223 -0
  95. package/dist/src/planner/nodes/asof-scan-node.js.map +1 -0
  96. package/dist/src/planner/nodes/constraint-check-node.d.ts +25 -1
  97. package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
  98. package/dist/src/planner/nodes/constraint-check-node.js +36 -6
  99. package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
  100. package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
  101. package/dist/src/planner/nodes/distinct-node.js +7 -0
  102. package/dist/src/planner/nodes/distinct-node.js.map +1 -1
  103. package/dist/src/planner/nodes/filter.d.ts.map +1 -1
  104. package/dist/src/planner/nodes/filter.js +8 -2
  105. package/dist/src/planner/nodes/filter.js.map +1 -1
  106. package/dist/src/planner/nodes/function.d.ts +11 -1
  107. package/dist/src/planner/nodes/function.d.ts.map +1 -1
  108. package/dist/src/planner/nodes/function.js +94 -1
  109. package/dist/src/planner/nodes/function.js.map +1 -1
  110. package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
  111. package/dist/src/planner/nodes/hash-aggregate.js +2 -0
  112. package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
  113. package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
  114. package/dist/src/planner/nodes/join-node.js +10 -2
  115. package/dist/src/planner/nodes/join-node.js.map +1 -1
  116. package/dist/src/planner/nodes/join-utils.d.ts +19 -1
  117. package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
  118. package/dist/src/planner/nodes/join-utils.js +46 -0
  119. package/dist/src/planner/nodes/join-utils.js.map +1 -1
  120. package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
  121. package/dist/src/planner/nodes/limit-offset.js +2 -0
  122. package/dist/src/planner/nodes/limit-offset.js.map +1 -1
  123. package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
  124. package/dist/src/planner/nodes/merge-join-node.js +4 -1
  125. package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
  126. package/dist/src/planner/nodes/ordinal-slice-node.d.ts +50 -0
  127. package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -0
  128. package/dist/src/planner/nodes/ordinal-slice-node.js +127 -0
  129. package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -0
  130. package/dist/src/planner/nodes/plan-node-type.d.ts +2 -0
  131. package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
  132. package/dist/src/planner/nodes/plan-node-type.js +2 -0
  133. package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
  134. package/dist/src/planner/nodes/plan-node.d.ts +130 -1
  135. package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
  136. package/dist/src/planner/nodes/plan-node.js +49 -0
  137. package/dist/src/planner/nodes/plan-node.js.map +1 -1
  138. package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
  139. package/dist/src/planner/nodes/project-node.js +6 -1
  140. package/dist/src/planner/nodes/project-node.js.map +1 -1
  141. package/dist/src/planner/nodes/recursive-cte-node.d.ts +5 -3
  142. package/dist/src/planner/nodes/recursive-cte-node.d.ts.map +1 -1
  143. package/dist/src/planner/nodes/recursive-cte-node.js +24 -8
  144. package/dist/src/planner/nodes/recursive-cte-node.js.map +1 -1
  145. package/dist/src/planner/nodes/reference.d.ts +4 -1
  146. package/dist/src/planner/nodes/reference.d.ts.map +1 -1
  147. package/dist/src/planner/nodes/reference.js +16 -0
  148. package/dist/src/planner/nodes/reference.js.map +1 -1
  149. package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
  150. package/dist/src/planner/nodes/returning-node.js +5 -12
  151. package/dist/src/planner/nodes/returning-node.js.map +1 -1
  152. package/dist/src/planner/nodes/scalar.d.ts +7 -1
  153. package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
  154. package/dist/src/planner/nodes/scalar.js +100 -1
  155. package/dist/src/planner/nodes/scalar.js.map +1 -1
  156. package/dist/src/planner/nodes/set-operation-node.d.ts +2 -1
  157. package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
  158. package/dist/src/planner/nodes/set-operation-node.js +9 -0
  159. package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
  160. package/dist/src/planner/nodes/sort.d.ts.map +1 -1
  161. package/dist/src/planner/nodes/sort.js +20 -0
  162. package/dist/src/planner/nodes/sort.js.map +1 -1
  163. package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
  164. package/dist/src/planner/nodes/stream-aggregate.js +2 -0
  165. package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
  166. package/dist/src/planner/nodes/table-access-nodes.d.ts +37 -2
  167. package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
  168. package/dist/src/planner/nodes/table-access-nodes.js +87 -10
  169. package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
  170. package/dist/src/planner/nodes/update-node.d.ts +1 -3
  171. package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
  172. package/dist/src/planner/nodes/update-node.js +3 -9
  173. package/dist/src/planner/nodes/update-node.js.map +1 -1
  174. package/dist/src/planner/nodes/window-node.d.ts +61 -2
  175. package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
  176. package/dist/src/planner/nodes/window-node.js +64 -3
  177. package/dist/src/planner/nodes/window-node.js.map +1 -1
  178. package/dist/src/planner/optimizer-tuning.d.ts +9 -0
  179. package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
  180. package/dist/src/planner/optimizer-tuning.js +3 -0
  181. package/dist/src/planner/optimizer-tuning.js.map +1 -1
  182. package/dist/src/planner/optimizer.d.ts.map +1 -1
  183. package/dist/src/planner/optimizer.js +91 -0
  184. package/dist/src/planner/optimizer.js.map +1 -1
  185. package/dist/src/planner/rules/access/rule-asof-strategy-select.d.ts +30 -0
  186. package/dist/src/planner/rules/access/rule-asof-strategy-select.d.ts.map +1 -0
  187. package/dist/src/planner/rules/access/rule-asof-strategy-select.js +112 -0
  188. package/dist/src/planner/rules/access/rule-asof-strategy-select.js.map +1 -0
  189. package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.d.ts +33 -0
  190. package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.d.ts.map +1 -0
  191. package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.js +162 -0
  192. package/dist/src/planner/rules/access/rule-monotonic-limit-pushdown.js.map +1 -0
  193. package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts +29 -0
  194. package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts.map +1 -0
  195. package/dist/src/planner/rules/access/rule-monotonic-range-access.js +175 -0
  196. package/dist/src/planner/rules/access/rule-monotonic-range-access.js.map +1 -0
  197. package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
  198. package/dist/src/planner/rules/access/rule-select-access-path.js +53 -36
  199. package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
  200. package/dist/src/planner/rules/join/equi-pair-extractor.d.ts +61 -0
  201. package/dist/src/planner/rules/join/equi-pair-extractor.d.ts.map +1 -0
  202. package/dist/src/planner/rules/join/equi-pair-extractor.js +155 -0
  203. package/dist/src/planner/rules/join/equi-pair-extractor.js.map +1 -0
  204. package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
  205. package/dist/src/planner/rules/join/rule-join-physical-selection.js +3 -123
  206. package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
  207. package/dist/src/planner/rules/join/rule-lateral-top1-asof.d.ts +21 -0
  208. package/dist/src/planner/rules/join/rule-lateral-top1-asof.d.ts.map +1 -0
  209. package/dist/src/planner/rules/join/rule-lateral-top1-asof.js +405 -0
  210. package/dist/src/planner/rules/join/rule-lateral-top1-asof.js.map +1 -0
  211. package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts +31 -0
  212. package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts.map +1 -0
  213. package/dist/src/planner/rules/join/rule-monotonic-merge-join.js +113 -0
  214. package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -0
  215. package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts.map +1 -1
  216. package/dist/src/planner/rules/join/rule-quickpick-enumeration.js +7 -3
  217. package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +1 -1
  218. package/dist/src/planner/rules/predicate/rule-filter-merge.js.map +1 -1
  219. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -1
  220. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -1
  221. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +161 -9
  222. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
  223. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -1
  224. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +2 -2
  225. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
  226. package/dist/src/planner/rules/window/rule-monotonic-window.d.ts +47 -0
  227. package/dist/src/planner/rules/window/rule-monotonic-window.d.ts.map +1 -0
  228. package/dist/src/planner/rules/window/rule-monotonic-window.js +341 -0
  229. package/dist/src/planner/rules/window/rule-monotonic-window.js.map +1 -0
  230. package/dist/src/runtime/context-helpers.d.ts +9 -0
  231. package/dist/src/runtime/context-helpers.d.ts.map +1 -1
  232. package/dist/src/runtime/context-helpers.js +5 -0
  233. package/dist/src/runtime/context-helpers.js.map +1 -1
  234. package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
  235. package/dist/src/runtime/emit/alter-table.js +286 -7
  236. package/dist/src/runtime/emit/alter-table.js.map +1 -1
  237. package/dist/src/runtime/emit/asof-scan.d.ts +10 -0
  238. package/dist/src/runtime/emit/asof-scan.d.ts.map +1 -0
  239. package/dist/src/runtime/emit/asof-scan.js +467 -0
  240. package/dist/src/runtime/emit/asof-scan.js.map +1 -0
  241. package/dist/src/runtime/emit/binary.d.ts.map +1 -1
  242. package/dist/src/runtime/emit/binary.js +12 -7
  243. package/dist/src/runtime/emit/binary.js.map +1 -1
  244. package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
  245. package/dist/src/runtime/emit/constraint-check.js +145 -62
  246. package/dist/src/runtime/emit/constraint-check.js.map +1 -1
  247. package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -1
  248. package/dist/src/runtime/emit/create-assertion.js +6 -6
  249. package/dist/src/runtime/emit/create-assertion.js.map +1 -1
  250. package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
  251. package/dist/src/runtime/emit/dml-executor.js +133 -76
  252. package/dist/src/runtime/emit/dml-executor.js.map +1 -1
  253. package/dist/src/runtime/emit/ordinal-slice.d.ts +13 -0
  254. package/dist/src/runtime/emit/ordinal-slice.d.ts.map +1 -0
  255. package/dist/src/runtime/emit/ordinal-slice.js +89 -0
  256. package/dist/src/runtime/emit/ordinal-slice.js.map +1 -0
  257. package/dist/src/runtime/emit/recursive-cte.d.ts.map +1 -1
  258. package/dist/src/runtime/emit/recursive-cte.js +61 -10
  259. package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
  260. package/dist/src/runtime/emit/returning.d.ts.map +1 -1
  261. package/dist/src/runtime/emit/returning.js +9 -4
  262. package/dist/src/runtime/emit/returning.js.map +1 -1
  263. package/dist/src/runtime/emit/scalar-function.d.ts.map +1 -1
  264. package/dist/src/runtime/emit/scalar-function.js +2 -1
  265. package/dist/src/runtime/emit/scalar-function.js.map +1 -1
  266. package/dist/src/runtime/emit/scan.d.ts +19 -3
  267. package/dist/src/runtime/emit/scan.d.ts.map +1 -1
  268. package/dist/src/runtime/emit/scan.js +12 -8
  269. package/dist/src/runtime/emit/scan.js.map +1 -1
  270. package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -1
  271. package/dist/src/runtime/emit/schema-declarative.js +91 -14
  272. package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
  273. package/dist/src/runtime/emit/table-valued-function.d.ts.map +1 -1
  274. package/dist/src/runtime/emit/table-valued-function.js +4 -2
  275. package/dist/src/runtime/emit/table-valued-function.js.map +1 -1
  276. package/dist/src/runtime/emit/update.d.ts.map +1 -1
  277. package/dist/src/runtime/emit/update.js +8 -5
  278. package/dist/src/runtime/emit/update.js.map +1 -1
  279. package/dist/src/runtime/emit/window.d.ts.map +1 -1
  280. package/dist/src/runtime/emit/window.js +732 -37
  281. package/dist/src/runtime/emit/window.js.map +1 -1
  282. package/dist/src/runtime/foreign-key-actions.js +7 -6
  283. package/dist/src/runtime/foreign-key-actions.js.map +1 -1
  284. package/dist/src/runtime/register.d.ts.map +1 -1
  285. package/dist/src/runtime/register.js +4 -0
  286. package/dist/src/runtime/register.js.map +1 -1
  287. package/dist/src/schema/catalog.d.ts +12 -0
  288. package/dist/src/schema/catalog.d.ts.map +1 -1
  289. package/dist/src/schema/catalog.js +47 -6
  290. package/dist/src/schema/catalog.js.map +1 -1
  291. package/dist/src/schema/column.d.ts +7 -0
  292. package/dist/src/schema/column.d.ts.map +1 -1
  293. package/dist/src/schema/column.js.map +1 -1
  294. package/dist/src/schema/function.d.ts +28 -3
  295. package/dist/src/schema/function.d.ts.map +1 -1
  296. package/dist/src/schema/function.js.map +1 -1
  297. package/dist/src/schema/manager.d.ts +42 -6
  298. package/dist/src/schema/manager.d.ts.map +1 -1
  299. package/dist/src/schema/manager.js +175 -23
  300. package/dist/src/schema/manager.js.map +1 -1
  301. package/dist/src/schema/rename-rewriter.d.ts +4 -0
  302. package/dist/src/schema/rename-rewriter.d.ts.map +1 -0
  303. package/dist/src/schema/rename-rewriter.js +506 -0
  304. package/dist/src/schema/rename-rewriter.js.map +1 -0
  305. package/dist/src/schema/schema-differ.d.ts +18 -1
  306. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  307. package/dist/src/schema/schema-differ.js +344 -42
  308. package/dist/src/schema/schema-differ.js.map +1 -1
  309. package/dist/src/schema/table.d.ts +65 -2
  310. package/dist/src/schema/table.d.ts.map +1 -1
  311. package/dist/src/schema/table.js +144 -0
  312. package/dist/src/schema/table.js.map +1 -1
  313. package/dist/src/types/logical-type.d.ts +11 -0
  314. package/dist/src/types/logical-type.d.ts.map +1 -1
  315. package/dist/src/types/logical-type.js.map +1 -1
  316. package/dist/src/util/ast-literal.d.ts +11 -0
  317. package/dist/src/util/ast-literal.d.ts.map +1 -0
  318. package/dist/src/util/ast-literal.js +26 -0
  319. package/dist/src/util/ast-literal.js.map +1 -0
  320. package/dist/src/util/async-iterator.d.ts +2 -1
  321. package/dist/src/util/async-iterator.d.ts.map +1 -1
  322. package/dist/src/util/async-iterator.js +4 -4
  323. package/dist/src/util/async-iterator.js.map +1 -1
  324. package/dist/src/util/patterns.d.ts.map +1 -1
  325. package/dist/src/util/patterns.js +58 -10
  326. package/dist/src/util/patterns.js.map +1 -1
  327. package/dist/src/vtab/best-access-plan.d.ts +48 -0
  328. package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
  329. package/dist/src/vtab/best-access-plan.js +29 -0
  330. package/dist/src/vtab/best-access-plan.js.map +1 -1
  331. package/dist/src/vtab/filter-info.d.ts +14 -0
  332. package/dist/src/vtab/filter-info.d.ts.map +1 -1
  333. package/dist/src/vtab/memory/index.d.ts +8 -0
  334. package/dist/src/vtab/memory/index.d.ts.map +1 -1
  335. package/dist/src/vtab/memory/index.js +11 -0
  336. package/dist/src/vtab/memory/index.js.map +1 -1
  337. package/dist/src/vtab/memory/layer/base.d.ts +8 -1
  338. package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
  339. package/dist/src/vtab/memory/layer/base.js +36 -2
  340. package/dist/src/vtab/memory/layer/base.js.map +1 -1
  341. package/dist/src/vtab/memory/layer/manager.d.ts +5 -1
  342. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  343. package/dist/src/vtab/memory/layer/manager.js +63 -13
  344. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  345. package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
  346. package/dist/src/vtab/memory/layer/transaction.js +21 -2
  347. package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
  348. package/dist/src/vtab/memory/module.d.ts +45 -2
  349. package/dist/src/vtab/memory/module.d.ts.map +1 -1
  350. package/dist/src/vtab/memory/module.js +268 -27
  351. package/dist/src/vtab/memory/module.js.map +1 -1
  352. package/dist/src/vtab/memory/utils/predicate.d.ts +27 -0
  353. package/dist/src/vtab/memory/utils/predicate.d.ts.map +1 -0
  354. package/dist/src/vtab/memory/utils/predicate.js +182 -0
  355. package/dist/src/vtab/memory/utils/predicate.js.map +1 -0
  356. package/dist/src/vtab/module.d.ts +24 -0
  357. package/dist/src/vtab/module.d.ts.map +1 -1
  358. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"rule-join-physical-selection.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-physical-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAiD,MAAM,0BAA0B,CAAC;AACxG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AA6K7D,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAiJ/F"}
1
+ {"version":3,"file":"rule-join-physical-selection.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-physical-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAiD,MAAM,0BAA0B,CAAC;AACxG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AA+C7D,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAqI/F"}
@@ -15,118 +15,10 @@ import { JoinNode } from '../../nodes/join-node.js';
15
15
  import { BloomJoinNode } from '../../nodes/bloom-join-node.js';
16
16
  import { MergeJoinNode } from '../../nodes/merge-join-node.js';
17
17
  import { SortNode } from '../../nodes/sort.js';
18
- import { BinaryOpNode } from '../../nodes/scalar.js';
19
18
  import { ColumnReferenceNode } from '../../nodes/reference.js';
20
- import { normalizePredicate } from '../../analysis/predicate-normalizer.js';
21
19
  import { nestedLoopJoinCost, hashJoinCost, mergeJoinCost } from '../../cost/index.js';
22
- import { PlanNodeCharacteristics } from '../../framework/characteristics.js';
20
+ import { extractEquiPairs, extractEquiPairsFromUsing, isOrderedOnEquiPairs, reorderEquiPairsForMerge, } from './equi-pair-extractor.js';
23
21
  const log = createLogger('optimizer:rule:join-physical-selection');
24
- /**
25
- * Extract equi-join pairs and residual predicates from an ON condition.
26
- * Returns null if no equi-pairs found.
27
- */
28
- function extractEquiPairs(condition, leftAttrIds, rightAttrIds) {
29
- if (!condition)
30
- return null;
31
- const norm = normalizePredicate(condition);
32
- const equiPairs = [];
33
- const residuals = [];
34
- // Walk AND-tree and classify each conjunct
35
- const stack = [norm];
36
- while (stack.length) {
37
- const n = stack.pop();
38
- if (n instanceof BinaryOpNode && n.expression.operator === 'AND') {
39
- stack.push(n.left, n.right);
40
- continue;
41
- }
42
- // Check for equi-join: col_ref = col_ref across left/right
43
- let isEqui = false;
44
- if (n instanceof BinaryOpNode && n.expression.operator === '=') {
45
- if (n.left instanceof ColumnReferenceNode && n.right instanceof ColumnReferenceNode) {
46
- const lId = n.left.attributeId;
47
- const rId = n.right.attributeId;
48
- if (leftAttrIds.has(lId) && rightAttrIds.has(rId)) {
49
- equiPairs.push({ leftAttrId: lId, rightAttrId: rId });
50
- isEqui = true;
51
- }
52
- else if (leftAttrIds.has(rId) && rightAttrIds.has(lId)) {
53
- equiPairs.push({ leftAttrId: rId, rightAttrId: lId });
54
- isEqui = true;
55
- }
56
- }
57
- }
58
- if (!isEqui) {
59
- residuals.push(n);
60
- }
61
- }
62
- if (equiPairs.length === 0)
63
- return null;
64
- // Combine residuals back into an AND-tree
65
- let residual;
66
- if (residuals.length > 0) {
67
- residual = residuals.reduce((acc, cur) => new BinaryOpNode(cur.scope, { type: 'binary', operator: 'AND' }, acc, cur));
68
- }
69
- return { equiPairs, residual };
70
- }
71
- /**
72
- * Check if a source's ordering covers the given equi-pair columns.
73
- * Returns true if the source is already sorted ascending on the equi-pair
74
- * columns in the exact order the equi-pairs specify. Positional matching
75
- * is required because the merge-join emitter compares keys in equi-pair
76
- * order; a mismatch (e.g. source sorted (b, a) vs equi-pairs (a, b))
77
- * would break the linear-scan invariant.
78
- */
79
- function isOrderedOnEquiPairs(source, equiPairs, side) {
80
- const ordering = PlanNodeCharacteristics.getOrdering(source);
81
- if (!ordering || ordering.length === 0)
82
- return false;
83
- if (equiPairs.length > ordering.length)
84
- return false;
85
- const attrs = source.getAttributes();
86
- for (let i = 0; i < equiPairs.length; i++) {
87
- const attrId = side === 'left' ? equiPairs[i].leftAttrId : equiPairs[i].rightAttrId;
88
- const idx = attrs.findIndex(a => a.id === attrId);
89
- if (idx === -1)
90
- return false;
91
- // Ordering entry at position i must match this equi-pair column and
92
- // must be ascending (merge join's compareKeys assumes ASC order).
93
- if (ordering[i].column !== idx || ordering[i].desc)
94
- return false;
95
- }
96
- return true;
97
- }
98
- /**
99
- * Reorder equi-pairs to match the left source's physical ordering prefix.
100
- * The merge-join emitter compares keys in equi-pair order, so the pairs
101
- * must align with both sources' sort order. Returns null if the pairs
102
- * cannot be reordered to match both sides simultaneously.
103
- */
104
- function reorderEquiPairsForMerge(equiPairs, left, right) {
105
- const leftOrdering = PlanNodeCharacteristics.getOrdering(left);
106
- if (!leftOrdering || leftOrdering.length < equiPairs.length)
107
- return null;
108
- const leftAttrs = left.getAttributes();
109
- // Build a map from left column index → equi-pair index
110
- const colToEqIdx = new Map();
111
- for (let i = 0; i < equiPairs.length; i++) {
112
- const attrIdx = leftAttrs.findIndex(a => a.id === equiPairs[i].leftAttrId);
113
- if (attrIdx === -1)
114
- return null;
115
- colToEqIdx.set(attrIdx, i);
116
- }
117
- // Reorder to match the left ordering prefix
118
- const reordered = [];
119
- for (let i = 0; i < equiPairs.length; i++) {
120
- const eqIdx = colToEqIdx.get(leftOrdering[i].column);
121
- if (eqIdx === undefined || leftOrdering[i].desc)
122
- return null;
123
- reordered.push(equiPairs[eqIdx]);
124
- }
125
- // Verify the reordered pairs also match the right source's ordering
126
- if (!isOrderedOnEquiPairs(right, reordered, 'right'))
127
- return null;
128
- return reordered;
129
- }
130
22
  /**
131
23
  * Create a SortNode that sorts a source on the equi-pair columns for this side.
132
24
  */
@@ -137,7 +29,7 @@ function createSortForEquiPairs(source, equiPairs, side, scope) {
137
29
  const idx = attrs.findIndex(a => a.id === attrId);
138
30
  const attr = attrs[idx];
139
31
  // Create a ColumnReferenceNode for this attribute
140
- const colRef = new ColumnReferenceNode(scope, { type: 'column', table: '', column: attr.name, schema: '' }, attr.type, attr.id, idx);
32
+ const colRef = new ColumnReferenceNode(scope, { type: 'column', table: '', name: attr.name, schema: '' }, attr.type, attr.id, idx);
141
33
  return {
142
34
  expression: colRef,
143
35
  direction: 'asc',
@@ -165,19 +57,7 @@ export function ruleJoinPhysicalSelection(node, _context) {
165
57
  extracted = extractEquiPairs(node.condition, leftAttrIds, rightAttrIds);
166
58
  }
167
59
  else if (node.usingColumns) {
168
- // Convert USING columns to equi-pairs
169
- const equiPairs = [];
170
- for (const colName of node.usingColumns) {
171
- const lowerName = colName.toLowerCase();
172
- const leftAttr = leftAttrs.find(a => a.name.toLowerCase() === lowerName);
173
- const rightAttr = rightAttrs.find(a => a.name.toLowerCase() === lowerName);
174
- if (leftAttr && rightAttr) {
175
- equiPairs.push({ leftAttrId: leftAttr.id, rightAttrId: rightAttr.id });
176
- }
177
- }
178
- if (equiPairs.length > 0) {
179
- extracted = { equiPairs, residual: undefined };
180
- }
60
+ extracted = extractEquiPairsFromUsing(node.usingColumns, leftAttrs, rightAttrs);
181
61
  }
182
62
  if (!extracted || extracted.equiPairs.length === 0)
183
63
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"rule-join-physical-selection.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-physical-selection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rule-join-physical-selection.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-physical-selection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Rule: Recognize lateral-top-1 over asof predicate, replace with AsofScanNode.
3
+ *
4
+ * Pattern (the rule peels through these in any nesting order, ignoring AliasNode):
5
+ *
6
+ * JoinNode (joinType ∈ {inner, left, cross} with `on true` or no condition)
7
+ * left: Left
8
+ * right: AliasNode? | ProjectNode | LimitOffsetNode(LIMIT 1, no OFFSET) | SortNode
9
+ * ...peeled in any nesting order...
10
+ * └─ FilterNode (ANDed: q.K op left.K AND q.P_i = left.P_i ...)
11
+ * └─ <physical right> with monotonicOn(K) and accessCapabilities.asofRight
12
+ *
13
+ * The right side must be correlated against the left (uses outer columns). On
14
+ * a successful match we emit an AsofScanNode preserving the JoinNode's output
15
+ * attribute IDs; otherwise we return null and the existing physical-join
16
+ * selection takes over.
17
+ */
18
+ import type { PlanNode } from '../../nodes/plan-node.js';
19
+ import type { OptContext } from '../../framework/context.js';
20
+ export declare function ruleLateralTop1Asof(node: PlanNode, context: OptContext): PlanNode | null;
21
+ //# sourceMappingURL=rule-lateral-top1-asof.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-lateral-top1-asof.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-lateral-top1-asof.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAiD,MAAM,0BAA0B,CAAC;AAExG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAmT7D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAgGxF"}
@@ -0,0 +1,405 @@
1
+ /**
2
+ * Rule: Recognize lateral-top-1 over asof predicate, replace with AsofScanNode.
3
+ *
4
+ * Pattern (the rule peels through these in any nesting order, ignoring AliasNode):
5
+ *
6
+ * JoinNode (joinType ∈ {inner, left, cross} with `on true` or no condition)
7
+ * left: Left
8
+ * right: AliasNode? | ProjectNode | LimitOffsetNode(LIMIT 1, no OFFSET) | SortNode
9
+ * ...peeled in any nesting order...
10
+ * └─ FilterNode (ANDed: q.K op left.K AND q.P_i = left.P_i ...)
11
+ * └─ <physical right> with monotonicOn(K) and accessCapabilities.asofRight
12
+ *
13
+ * The right side must be correlated against the left (uses outer columns). On
14
+ * a successful match we emit an AsofScanNode preserving the JoinNode's output
15
+ * attribute IDs; otherwise we return null and the existing physical-join
16
+ * selection takes over.
17
+ */
18
+ import { createLogger } from '../../../common/logger.js';
19
+ import { isRelationalNode } from '../../nodes/plan-node.js';
20
+ import { JoinNode } from '../../nodes/join-node.js';
21
+ import { AsofScanNode } from '../../nodes/asof-scan-node.js';
22
+ import { ProjectNode } from '../../nodes/project-node.js';
23
+ import { LimitOffsetNode } from '../../nodes/limit-offset.js';
24
+ import { SortNode } from '../../nodes/sort.js';
25
+ import { FilterNode } from '../../nodes/filter.js';
26
+ import { AliasNode } from '../../nodes/alias-node.js';
27
+ import { BinaryOpNode, LiteralNode } from '../../nodes/scalar.js';
28
+ import { ColumnReferenceNode, TableReferenceNode } from '../../nodes/reference.js';
29
+ import { RetrieveNode } from '../../nodes/retrieve-node.js';
30
+ import { isCorrelatedSubquery } from '../../cache/correlation-detector.js';
31
+ const log = createLogger('optimizer:rule:lateral-top1-asof');
32
+ /**
33
+ * Peel the right subtree of the lateral, looking for the canonical
34
+ * (Project | LimitOffset | Sort | Alias)* → Filter chain.
35
+ */
36
+ function peelLateral(right) {
37
+ let project;
38
+ let limit;
39
+ let sort;
40
+ let cursor = right;
41
+ let safety = 16;
42
+ while (safety-- > 0) {
43
+ if (cursor instanceof AliasNode) {
44
+ cursor = cursor.source;
45
+ continue;
46
+ }
47
+ if (cursor instanceof ProjectNode) {
48
+ if (project)
49
+ return null; // multiple Projects not handled
50
+ project = cursor;
51
+ cursor = cursor.source;
52
+ continue;
53
+ }
54
+ if (cursor instanceof LimitOffsetNode) {
55
+ if (limit)
56
+ return null;
57
+ limit = cursor;
58
+ cursor = cursor.source;
59
+ continue;
60
+ }
61
+ if (cursor instanceof SortNode) {
62
+ if (sort)
63
+ return null;
64
+ sort = cursor;
65
+ cursor = cursor.source;
66
+ continue;
67
+ }
68
+ break;
69
+ }
70
+ if (!limit || !sort || !(cursor instanceof FilterNode))
71
+ return null;
72
+ return { filter: cursor, limit, sort, project };
73
+ }
74
+ /** Verify that the limit is the literal integer 1 and there's no offset. */
75
+ function isLimitOne(limit) {
76
+ if (limit.offset && !isLiteralZeroOrUndefined(limit.offset))
77
+ return false;
78
+ if (!limit.limit)
79
+ return false;
80
+ if (!(limit.limit instanceof LiteralNode))
81
+ return false;
82
+ const v = limit.limit.expression.value;
83
+ if (typeof v === 'number')
84
+ return v === 1;
85
+ if (typeof v === 'bigint')
86
+ return v === 1n;
87
+ return false;
88
+ }
89
+ /** A null-or-zero literal for OFFSET. */
90
+ function isLiteralZeroOrUndefined(node) {
91
+ if (!(node instanceof LiteralNode))
92
+ return false;
93
+ const v = node.expression.value;
94
+ if (v === null || v === undefined)
95
+ return true;
96
+ if (typeof v === 'number')
97
+ return v === 0;
98
+ if (typeof v === 'bigint')
99
+ return v === 0n;
100
+ return false;
101
+ }
102
+ /**
103
+ * Verify the SortNode has a single key that is a trivial column reference and
104
+ * a definite direction. Returns the attribute id and direction, or null.
105
+ */
106
+ function extractSortAttrId(sort) {
107
+ if (sort.sortKeys.length !== 1)
108
+ return null;
109
+ const key = sort.sortKeys[0];
110
+ if (key.direction !== 'desc' && key.direction !== 'asc')
111
+ return null;
112
+ if (!(key.expression instanceof ColumnReferenceNode))
113
+ return null;
114
+ return { attrId: key.expression.attributeId, direction: key.direction };
115
+ }
116
+ /** Walk an AND tree, returning each leaf conjunct. */
117
+ function flattenAnd(node) {
118
+ const result = [];
119
+ const stack = [node];
120
+ while (stack.length) {
121
+ const cur = stack.pop();
122
+ if (cur instanceof BinaryOpNode && cur.expression.operator === 'AND') {
123
+ stack.push(cur.left, cur.right);
124
+ }
125
+ else {
126
+ result.push(cur);
127
+ }
128
+ }
129
+ return result;
130
+ }
131
+ /**
132
+ * Classify each conjunct of the lateral's Filter.
133
+ *
134
+ * `rightAttrIds` is the set of attribute IDs defined within the lateral's
135
+ * inner subtree (anything below the Filter). The asof inequality must
136
+ * resolve to (right K op left K); equalities must resolve to (right P = left P).
137
+ *
138
+ * Returns null when any conjunct does not fit the asof shape.
139
+ */
140
+ function classifyPredicates(conjuncts, rightAttrIds) {
141
+ let asof;
142
+ const partition = [];
143
+ for (const c of conjuncts) {
144
+ if (!(c instanceof BinaryOpNode))
145
+ return null;
146
+ if (!(c.left instanceof ColumnReferenceNode) || !(c.right instanceof ColumnReferenceNode))
147
+ return null;
148
+ const op = c.expression.operator;
149
+ const lAttrId = c.left.attributeId;
150
+ const rAttrId = c.right.attributeId;
151
+ const lFromRight = rightAttrIds.has(lAttrId);
152
+ const rFromRight = rightAttrIds.has(rAttrId);
153
+ // Both sides referencing the same side are not valid asof shape.
154
+ if (lFromRight === rFromRight)
155
+ return null;
156
+ // Canonicalize as (right side, left side).
157
+ const rightAttrId = lFromRight ? lAttrId : rAttrId;
158
+ const leftAttrId = lFromRight ? rAttrId : lAttrId;
159
+ if (op === '=') {
160
+ partition.push({ leftAttrId, rightAttrId });
161
+ continue;
162
+ }
163
+ // Asof inequality. Two directions are supported:
164
+ // 'desc' — right ≤ left (latest right ≤ left); strict variant: right < left.
165
+ // 'asc' — right ≥ left (earliest right ≥ left); strict variant: right > left.
166
+ // All operator forms canonicalize to (right op left) before mapping:
167
+ // - q.K <= t.K → desc, strict=false - q.K >= t.K → asc, strict=false
168
+ // - q.K < t.K → desc, strict=true - q.K > t.K → asc, strict=true
169
+ // - t.K >= q.K → desc, strict=false - t.K <= q.K → asc, strict=false
170
+ // - t.K > q.K → desc, strict=true - t.K < q.K → asc, strict=true
171
+ let strict;
172
+ let direction;
173
+ if (lFromRight) {
174
+ // op is between (right.col, left.col)
175
+ if (op === '<=') {
176
+ strict = false;
177
+ direction = 'desc';
178
+ }
179
+ else if (op === '<') {
180
+ strict = true;
181
+ direction = 'desc';
182
+ }
183
+ else if (op === '>=') {
184
+ strict = false;
185
+ direction = 'asc';
186
+ }
187
+ else if (op === '>') {
188
+ strict = true;
189
+ direction = 'asc';
190
+ }
191
+ }
192
+ else {
193
+ // op is between (left.col, right.col); flip
194
+ if (op === '>=') {
195
+ strict = false;
196
+ direction = 'desc';
197
+ }
198
+ else if (op === '>') {
199
+ strict = true;
200
+ direction = 'desc';
201
+ }
202
+ else if (op === '<=') {
203
+ strict = false;
204
+ direction = 'asc';
205
+ }
206
+ else if (op === '<') {
207
+ strict = true;
208
+ direction = 'asc';
209
+ }
210
+ }
211
+ if (strict === undefined || direction === undefined)
212
+ return null;
213
+ if (asof)
214
+ return null; // multiple asof inequalities — bail
215
+ asof = { rightAttrId, leftAttrId, strict, direction };
216
+ }
217
+ if (!asof)
218
+ return null;
219
+ return { asof, partition };
220
+ }
221
+ /**
222
+ * Find the table reference at the bottom of a structural pipeline (Filter →
223
+ * AliasNode → ProjectNode → ... → Retrieve → TableReference).
224
+ *
225
+ * Returns null when the chain branches or terminates before reaching a leaf
226
+ * that's a direct TableReference.
227
+ */
228
+ function findTableReference(node) {
229
+ let cur = node;
230
+ let safety = 64;
231
+ while (safety-- > 0) {
232
+ if (cur instanceof TableReferenceNode)
233
+ return cur;
234
+ if (cur instanceof RetrieveNode) {
235
+ cur = cur.tableRef;
236
+ continue;
237
+ }
238
+ const relChildren = cur.getChildren().filter(isRelationalNode);
239
+ if (relChildren.length !== 1)
240
+ return null;
241
+ cur = relChildren[0];
242
+ }
243
+ return null;
244
+ }
245
+ /**
246
+ * Probe the table's vtab module to see if its best-access plan would advertise
247
+ * `supportsAsofRight` and `monotonicOn` on `column` for an ordered, unfiltered
248
+ * scan. If the module lacks `getBestAccessPlan`, returns false.
249
+ */
250
+ function tableAdvertisesAsof(context, tableRef, column) {
251
+ const vtabModule = tableRef.vtabModule;
252
+ if (!vtabModule.getBestAccessPlan)
253
+ return false;
254
+ const tableSchema = tableRef.tableSchema;
255
+ const columns = tableSchema.columns.map((col, index) => ({
256
+ index,
257
+ name: col.name,
258
+ type: col.logicalType,
259
+ isPrimaryKey: col.primaryKey || false,
260
+ isUnique: col.primaryKey || false,
261
+ }));
262
+ const request = {
263
+ columns,
264
+ filters: [],
265
+ requiredOrdering: [{ columnIndex: column, desc: false }],
266
+ estimatedRows: tableRef.estimatedRows ?? undefined,
267
+ };
268
+ try {
269
+ const plan = vtabModule.getBestAccessPlan(context.db, tableSchema, request);
270
+ if (!plan.supportsAsofRight)
271
+ return false;
272
+ if (!plan.monotonicOn)
273
+ return false;
274
+ if (plan.monotonicOn.columnIndex !== column)
275
+ return false;
276
+ return true;
277
+ }
278
+ catch {
279
+ return false;
280
+ }
281
+ }
282
+ function isTriviallyTrue(condition) {
283
+ if (condition instanceof LiteralNode) {
284
+ const v = condition.expression.value;
285
+ return v === true || v === 1 || v === 1n;
286
+ }
287
+ return false;
288
+ }
289
+ /**
290
+ * Build right output column indices and preserve the projection's attribute IDs
291
+ * (so the parent of the JoinNode keeps seeing the same attribute IDs after the
292
+ * rewrite).
293
+ *
294
+ * Returns null when any projection isn't a trivial column reference into the
295
+ * Filter source.
296
+ */
297
+ function resolveProjectedRightAttrs(project, joinAttrs, leftAttrCount, filterSourceAttrs) {
298
+ const filterIdToIndex = new Map(filterSourceAttrs.map((a, i) => [a.id, i]));
299
+ const rightOutputAttrs = joinAttrs.slice(leftAttrCount);
300
+ if (!project) {
301
+ // No projection — emit the filter source's columns directly. Attribute
302
+ // IDs match the filter source already (Project/Alias would have wrapped
303
+ // otherwise).
304
+ return {
305
+ columnIndices: filterSourceAttrs.map((_, i) => i),
306
+ attrs: rightOutputAttrs.slice(),
307
+ };
308
+ }
309
+ // With a projection: each projection node must be a trivial column ref into
310
+ // the filter source. Map its source attribute id → column index.
311
+ const projections = project.projections;
312
+ if (projections.length !== rightOutputAttrs.length)
313
+ return null;
314
+ const columnIndices = [];
315
+ for (let i = 0; i < projections.length; i++) {
316
+ const projNode = projections[i].node;
317
+ if (!(projNode instanceof ColumnReferenceNode))
318
+ return null;
319
+ const idx = filterIdToIndex.get(projNode.attributeId);
320
+ if (idx === undefined)
321
+ return null;
322
+ columnIndices.push(idx);
323
+ }
324
+ return {
325
+ columnIndices,
326
+ attrs: rightOutputAttrs.slice(),
327
+ };
328
+ }
329
+ export function ruleLateralTop1Asof(node, context) {
330
+ if (!(node instanceof JoinNode))
331
+ return null;
332
+ const joinType = node.joinType;
333
+ // LATERAL is meaningful for inner / left / cross with `ON TRUE` (or no condition).
334
+ if (joinType !== 'inner' && joinType !== 'left' && joinType !== 'cross')
335
+ return null;
336
+ // JoinNode condition must be absent or trivially true (LATERAL ON TRUE).
337
+ if (node.condition && !isTriviallyTrue(node.condition))
338
+ return null;
339
+ // Right subtree must be correlated against the outer (left) attributes.
340
+ if (!isCorrelatedSubquery(node.right))
341
+ return null;
342
+ const peeled = peelLateral(node.right);
343
+ if (!peeled)
344
+ return null;
345
+ if (!isLimitOne(peeled.limit))
346
+ return null;
347
+ const sortInfo = extractSortAttrId(peeled.sort);
348
+ if (sortInfo === null)
349
+ return null;
350
+ // The Filter's source defines the right attribute set we'll classify against.
351
+ const filterSourceAttrs = peeled.filter.source.getAttributes();
352
+ const rightAttrIds = new Set(filterSourceAttrs.map(a => a.id));
353
+ const conjuncts = flattenAnd(peeled.filter.predicate);
354
+ const classified = classifyPredicates(conjuncts, rightAttrIds);
355
+ if (!classified)
356
+ return null;
357
+ // Sort key must match the asof match attribute on the right.
358
+ if (classified.asof.rightAttrId !== sortInfo.attrId)
359
+ return null;
360
+ // Sort direction must match the asof direction (desc → latest-le, asc → earliest-ge).
361
+ if (sortInfo.direction !== classified.asof.direction)
362
+ return null;
363
+ // Locate the underlying table reference at the bottom of the lateral.
364
+ const tableRef = findTableReference(peeled.filter.source);
365
+ if (!tableRef) {
366
+ log('Right subtree does not bottom out in a TableReference');
367
+ return null;
368
+ }
369
+ // Translate the asof match attribute id to a table column index.
370
+ const tableAttrs = tableRef.getAttributes();
371
+ const matchColumnIdx = tableAttrs.findIndex(a => a.id === classified.asof.rightAttrId);
372
+ if (matchColumnIdx === -1) {
373
+ log('Asof match attr %d is not a column of the underlying table', classified.asof.rightAttrId);
374
+ return null;
375
+ }
376
+ // Probe the vtab module for asofRight + monotonicOn(K).
377
+ if (!tableAdvertisesAsof(context, tableRef, matchColumnIdx)) {
378
+ log('Vtab module does not advertise monotonicOn(col=%d) + asofRight', matchColumnIdx);
379
+ return null;
380
+ }
381
+ // Left must be monotonic on the match attribute (its cursor cannot regress
382
+ // per partition). Without this, the streaming scan would produce wrong rows
383
+ // for left rows whose match value decreases. We require global
384
+ // monotonicOn(left.matchAttr) — stronger than "monotonic within partition"
385
+ // but the only check we can make uniformly. The user can wrap the left in
386
+ // `ORDER BY matchAttr` to satisfy this.
387
+ const leftMonotonic = node.left.physical?.monotonicOn?.find(m => m.attrId === classified.asof.leftAttrId);
388
+ if (!leftMonotonic) {
389
+ log('Left input is not monotonicOn(left.matchAttr=%d); skipping asof rewrite', classified.asof.leftAttrId);
390
+ return null;
391
+ }
392
+ // Resolve the right output projection (preserving the original Project's
393
+ // attribute IDs so the parent of the join keeps the same IDs after rewrite).
394
+ const joinAttrs = node.getAttributes();
395
+ const leftAttrCount = node.left.getAttributes().length;
396
+ const projection = resolveProjectedRightAttrs(peeled.project, joinAttrs, leftAttrCount, filterSourceAttrs);
397
+ if (!projection) {
398
+ log('Lateral projection is non-trivial; skipping');
399
+ return null;
400
+ }
401
+ const asof = new AsofScanNode(node.scope, node.left, peeled.filter.source, { leftAttrId: classified.asof.leftAttrId, rightAttrId: classified.asof.rightAttrId }, classified.partition, classified.asof.strict, classified.asof.direction, joinType === 'left', projection.columnIndices, projection.attrs);
402
+ log('Recognized lateral-top-1 asof: outer=%s, direction=%s, strict=%s, partitions=%d', joinType === 'left', classified.asof.direction, classified.asof.strict, classified.partition.length);
403
+ return asof;
404
+ }
405
+ //# sourceMappingURL=rule-lateral-top1-asof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-lateral-top1-asof.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-lateral-top1-asof.ts"],"names":[],"mappings":"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"}