@quereus/quereus 0.2.1 → 0.4.5

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 (760) hide show
  1. package/README.md +12 -1
  2. package/dist/src/common/errors.js.map +1 -1
  3. package/dist/src/common/json-types.d.ts +11 -0
  4. package/dist/src/common/json-types.d.ts.map +1 -0
  5. package/dist/src/common/json-types.js +3 -0
  6. package/dist/src/common/json-types.js.map +1 -0
  7. package/dist/src/common/types.d.ts +1 -0
  8. package/dist/src/common/types.d.ts.map +1 -1
  9. package/dist/src/core/database-options.d.ts +2 -2
  10. package/dist/src/core/database-options.d.ts.map +1 -1
  11. package/dist/src/core/database-options.js.map +1 -1
  12. package/dist/src/core/database.d.ts +61 -14
  13. package/dist/src/core/database.d.ts.map +1 -1
  14. package/dist/src/core/database.js +481 -54
  15. package/dist/src/core/database.js.map +1 -1
  16. package/dist/src/core/statement.d.ts.map +1 -1
  17. package/dist/src/core/statement.js +3 -1
  18. package/dist/src/core/statement.js.map +1 -1
  19. package/dist/src/func/builtins/builtin-window-functions.d.ts.map +1 -1
  20. package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
  21. package/dist/src/func/builtins/datetime.d.ts +2 -0
  22. package/dist/src/func/builtins/datetime.d.ts.map +1 -1
  23. package/dist/src/func/builtins/datetime.js +39 -0
  24. package/dist/src/func/builtins/datetime.js.map +1 -1
  25. package/dist/src/func/builtins/explain.d.ts +1 -0
  26. package/dist/src/func/builtins/explain.d.ts.map +1 -1
  27. package/dist/src/func/builtins/explain.js +159 -36
  28. package/dist/src/func/builtins/explain.js.map +1 -1
  29. package/dist/src/func/builtins/index.d.ts.map +1 -1
  30. package/dist/src/func/builtins/index.js +5 -2
  31. package/dist/src/func/builtins/index.js.map +1 -1
  32. package/dist/src/func/builtins/json-helpers.d.ts +8 -8
  33. package/dist/src/func/builtins/json-helpers.d.ts.map +1 -1
  34. package/dist/src/func/builtins/json-helpers.js +3 -3
  35. package/dist/src/func/builtins/json-helpers.js.map +1 -1
  36. package/dist/src/func/builtins/json-tvf.d.ts.map +1 -1
  37. package/dist/src/func/builtins/json-tvf.js +1 -1
  38. package/dist/src/func/builtins/json-tvf.js.map +1 -1
  39. package/dist/src/func/builtins/json.d.ts.map +1 -1
  40. package/dist/src/func/builtins/json.js +3 -2
  41. package/dist/src/func/builtins/json.js.map +1 -1
  42. package/dist/src/func/builtins/schema.d.ts.map +1 -1
  43. package/dist/src/func/builtins/schema.js +22 -1
  44. package/dist/src/func/builtins/schema.js.map +1 -1
  45. package/dist/src/func/context.d.ts.map +1 -1
  46. package/dist/src/func/context.js +5 -0
  47. package/dist/src/func/context.js.map +1 -1
  48. package/dist/src/func/registration.d.ts +2 -1
  49. package/dist/src/func/registration.d.ts.map +1 -1
  50. package/dist/src/func/registration.js.map +1 -1
  51. package/dist/src/index.d.ts +2 -2
  52. package/dist/src/index.d.ts.map +1 -1
  53. package/dist/src/index.js +2 -2
  54. package/dist/src/index.js.map +1 -1
  55. package/dist/src/parser/ast.d.ts +83 -4
  56. package/dist/src/parser/ast.d.ts.map +1 -1
  57. package/dist/src/parser/lexer.d.ts +11 -0
  58. package/dist/src/parser/lexer.d.ts.map +1 -1
  59. package/dist/src/parser/lexer.js +29 -21
  60. package/dist/src/parser/lexer.js.map +1 -1
  61. package/dist/src/parser/parser.d.ts +16 -0
  62. package/dist/src/parser/parser.d.ts.map +1 -1
  63. package/dist/src/parser/parser.js +542 -26
  64. package/dist/src/parser/parser.js.map +1 -1
  65. package/dist/src/parser/visitor.d.ts.map +1 -1
  66. package/dist/src/parser/visitor.js +1 -0
  67. package/dist/src/parser/visitor.js.map +1 -1
  68. package/dist/src/planner/analysis/binding-collector.d.ts +5 -0
  69. package/dist/src/planner/analysis/binding-collector.d.ts.map +1 -0
  70. package/dist/src/planner/analysis/binding-collector.js +73 -0
  71. package/dist/src/planner/analysis/binding-collector.js.map +1 -0
  72. package/dist/src/planner/analysis/const-evaluator.js +1 -1
  73. package/dist/src/planner/analysis/const-evaluator.js.map +1 -1
  74. package/dist/src/planner/analysis/const-pass.d.ts.map +1 -1
  75. package/dist/src/planner/analysis/const-pass.js +1 -1
  76. package/dist/src/planner/analysis/const-pass.js.map +1 -1
  77. package/dist/src/planner/analysis/constraint-extractor.d.ts +67 -31
  78. package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
  79. package/dist/src/planner/analysis/constraint-extractor.js +513 -84
  80. package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
  81. package/dist/src/planner/analysis/predicate-normalizer.d.ts +17 -0
  82. package/dist/src/planner/analysis/predicate-normalizer.d.ts.map +1 -0
  83. package/dist/src/planner/analysis/predicate-normalizer.js +222 -0
  84. package/dist/src/planner/analysis/predicate-normalizer.js.map +1 -0
  85. package/dist/src/planner/building/alter-table.d.ts.map +1 -1
  86. package/dist/src/planner/building/alter-table.js +5 -2
  87. package/dist/src/planner/building/alter-table.js.map +1 -1
  88. package/dist/src/planner/building/block.d.ts.map +1 -1
  89. package/dist/src/planner/building/block.js +16 -0
  90. package/dist/src/planner/building/block.js.map +1 -1
  91. package/dist/src/planner/building/constraint-builder.d.ts +1 -1
  92. package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
  93. package/dist/src/planner/building/constraint-builder.js +52 -3
  94. package/dist/src/planner/building/constraint-builder.js.map +1 -1
  95. package/dist/src/planner/building/create-assertion.d.ts +5 -0
  96. package/dist/src/planner/building/create-assertion.d.ts.map +1 -0
  97. package/dist/src/planner/building/create-assertion.js +5 -0
  98. package/dist/src/planner/building/create-assertion.js.map +1 -0
  99. package/dist/src/planner/building/declare-schema.d.ts +8 -0
  100. package/dist/src/planner/building/declare-schema.d.ts.map +1 -0
  101. package/dist/src/planner/building/declare-schema.js +14 -0
  102. package/dist/src/planner/building/declare-schema.js.map +1 -0
  103. package/dist/src/planner/building/delete.d.ts.map +1 -1
  104. package/dist/src/planner/building/delete.js +37 -5
  105. package/dist/src/planner/building/delete.js.map +1 -1
  106. package/dist/src/planner/building/drop-assertion.d.ts +5 -0
  107. package/dist/src/planner/building/drop-assertion.d.ts.map +1 -0
  108. package/dist/src/planner/building/drop-assertion.js +8 -0
  109. package/dist/src/planner/building/drop-assertion.js.map +1 -0
  110. package/dist/src/planner/building/expression.d.ts.map +1 -1
  111. package/dist/src/planner/building/expression.js +1 -0
  112. package/dist/src/planner/building/expression.js.map +1 -1
  113. package/dist/src/planner/building/function-call.d.ts.map +1 -1
  114. package/dist/src/planner/building/function-call.js +2 -1
  115. package/dist/src/planner/building/function-call.js.map +1 -1
  116. package/dist/src/planner/building/insert.d.ts.map +1 -1
  117. package/dist/src/planner/building/insert.js +67 -10
  118. package/dist/src/planner/building/insert.js.map +1 -1
  119. package/dist/src/planner/building/pragma.d.ts.map +1 -1
  120. package/dist/src/planner/building/pragma.js +1 -0
  121. package/dist/src/planner/building/pragma.js.map +1 -1
  122. package/dist/src/planner/building/schema-resolution.d.ts +2 -2
  123. package/dist/src/planner/building/schema-resolution.d.ts.map +1 -1
  124. package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
  125. package/dist/src/planner/building/select-aggregates.js +3 -2
  126. package/dist/src/planner/building/select-aggregates.js.map +1 -1
  127. package/dist/src/planner/building/select-compound.d.ts +2 -2
  128. package/dist/src/planner/building/select-compound.d.ts.map +1 -1
  129. package/dist/src/planner/building/select-compound.js +10 -1
  130. package/dist/src/planner/building/select-compound.js.map +1 -1
  131. package/dist/src/planner/building/select-context.d.ts +3 -3
  132. package/dist/src/planner/building/select-context.d.ts.map +1 -1
  133. package/dist/src/planner/building/select-context.js.map +1 -1
  134. package/dist/src/planner/building/select-modifiers.d.ts +6 -5
  135. package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
  136. package/dist/src/planner/building/select-modifiers.js +5 -4
  137. package/dist/src/planner/building/select-modifiers.js.map +1 -1
  138. package/dist/src/planner/building/select-projections.d.ts.map +1 -1
  139. package/dist/src/planner/building/select-projections.js +4 -5
  140. package/dist/src/planner/building/select-projections.js.map +1 -1
  141. package/dist/src/planner/building/select-window.d.ts.map +1 -1
  142. package/dist/src/planner/building/select-window.js +6 -3
  143. package/dist/src/planner/building/select-window.js.map +1 -1
  144. package/dist/src/planner/building/select.d.ts +3 -3
  145. package/dist/src/planner/building/select.d.ts.map +1 -1
  146. package/dist/src/planner/building/select.js +18 -8
  147. package/dist/src/planner/building/select.js.map +1 -1
  148. package/dist/src/planner/building/table-function.d.ts.map +1 -1
  149. package/dist/src/planner/building/table-function.js +1 -1
  150. package/dist/src/planner/building/table-function.js.map +1 -1
  151. package/dist/src/planner/building/table.d.ts +5 -3
  152. package/dist/src/planner/building/table.d.ts.map +1 -1
  153. package/dist/src/planner/building/table.js +7 -2
  154. package/dist/src/planner/building/table.js.map +1 -1
  155. package/dist/src/planner/building/update.d.ts.map +1 -1
  156. package/dist/src/planner/building/update.js +38 -6
  157. package/dist/src/planner/building/update.js.map +1 -1
  158. package/dist/src/planner/building/with.d.ts +3 -3
  159. package/dist/src/planner/building/with.d.ts.map +1 -1
  160. package/dist/src/planner/building/with.js.map +1 -1
  161. package/dist/src/planner/debug.d.ts.map +1 -1
  162. package/dist/src/planner/debug.js.map +1 -1
  163. package/dist/src/planner/framework/characteristics.d.ts +235 -0
  164. package/dist/src/planner/framework/characteristics.d.ts.map +1 -0
  165. package/dist/src/planner/framework/characteristics.js +299 -0
  166. package/dist/src/planner/framework/characteristics.js.map +1 -0
  167. package/dist/src/planner/framework/context.d.ts +16 -5
  168. package/dist/src/planner/framework/context.d.ts.map +1 -1
  169. package/dist/src/planner/framework/context.js +2 -0
  170. package/dist/src/planner/framework/context.js.map +1 -1
  171. package/dist/src/planner/framework/pass.d.ts +116 -0
  172. package/dist/src/planner/framework/pass.d.ts.map +1 -0
  173. package/dist/src/planner/framework/pass.js +236 -0
  174. package/dist/src/planner/framework/pass.js.map +1 -0
  175. package/dist/src/planner/nodes/aggregate-node.d.ts +16 -6
  176. package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
  177. package/dist/src/planner/nodes/aggregate-node.js +40 -4
  178. package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
  179. package/dist/src/planner/nodes/array-index-node.js.map +1 -1
  180. package/dist/src/planner/nodes/cache-node.d.ts +5 -2
  181. package/dist/src/planner/nodes/cache-node.d.ts.map +1 -1
  182. package/dist/src/planner/nodes/cache-node.js +6 -0
  183. package/dist/src/planner/nodes/cache-node.js.map +1 -1
  184. package/dist/src/planner/nodes/constraint-check-node.d.ts +10 -2
  185. package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
  186. package/dist/src/planner/nodes/constraint-check-node.js +12 -4
  187. package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
  188. package/dist/src/planner/nodes/create-assertion-node.d.ts +22 -0
  189. package/dist/src/planner/nodes/create-assertion-node.d.ts.map +1 -0
  190. package/dist/src/planner/nodes/create-assertion-node.js +41 -0
  191. package/dist/src/planner/nodes/create-assertion-node.js.map +1 -0
  192. package/dist/src/planner/nodes/create-index-node.js +2 -2
  193. package/dist/src/planner/nodes/create-index-node.js.map +1 -1
  194. package/dist/src/planner/nodes/create-table-node.js +2 -2
  195. package/dist/src/planner/nodes/create-table-node.js.map +1 -1
  196. package/dist/src/planner/nodes/cte-node.d.ts +17 -2
  197. package/dist/src/planner/nodes/cte-node.d.ts.map +1 -1
  198. package/dist/src/planner/nodes/cte-node.js +9 -1
  199. package/dist/src/planner/nodes/cte-node.js.map +1 -1
  200. package/dist/src/planner/nodes/cte-reference-node.js +1 -1
  201. package/dist/src/planner/nodes/cte-reference-node.js.map +1 -1
  202. package/dist/src/planner/nodes/declarative-schema.d.ts +62 -0
  203. package/dist/src/planner/nodes/declarative-schema.d.ts.map +1 -0
  204. package/dist/src/planner/nodes/declarative-schema.js +181 -0
  205. package/dist/src/planner/nodes/declarative-schema.js.map +1 -0
  206. package/dist/src/planner/nodes/delete-node.d.ts +8 -3
  207. package/dist/src/planner/nodes/delete-node.d.ts.map +1 -1
  208. package/dist/src/planner/nodes/delete-node.js +10 -2
  209. package/dist/src/planner/nodes/delete-node.js.map +1 -1
  210. package/dist/src/planner/nodes/distinct-node.d.ts +3 -2
  211. package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
  212. package/dist/src/planner/nodes/distinct-node.js +17 -4
  213. package/dist/src/planner/nodes/distinct-node.js.map +1 -1
  214. package/dist/src/planner/nodes/dml-executor-node.d.ts +1 -1
  215. package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
  216. package/dist/src/planner/nodes/drop-assertion-node.d.ts +21 -0
  217. package/dist/src/planner/nodes/drop-assertion-node.d.ts.map +1 -0
  218. package/dist/src/planner/nodes/drop-assertion-node.js +41 -0
  219. package/dist/src/planner/nodes/drop-assertion-node.js.map +1 -0
  220. package/dist/src/planner/nodes/drop-table-node.d.ts.map +1 -1
  221. package/dist/src/planner/nodes/drop-table-node.js +1 -0
  222. package/dist/src/planner/nodes/drop-table-node.js.map +1 -1
  223. package/dist/src/planner/nodes/filter.d.ts +8 -3
  224. package/dist/src/planner/nodes/filter.d.ts.map +1 -1
  225. package/dist/src/planner/nodes/filter.js +44 -0
  226. package/dist/src/planner/nodes/filter.js.map +1 -1
  227. package/dist/src/planner/nodes/insert-node.d.ts +9 -3
  228. package/dist/src/planner/nodes/insert-node.d.ts.map +1 -1
  229. package/dist/src/planner/nodes/insert-node.js +11 -2
  230. package/dist/src/planner/nodes/insert-node.js.map +1 -1
  231. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts +3 -4
  232. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts.map +1 -1
  233. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js +1 -16
  234. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js.map +1 -1
  235. package/dist/src/planner/nodes/join-node.d.ts +12 -3
  236. package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
  237. package/dist/src/planner/nodes/join-node.js +111 -2
  238. package/dist/src/planner/nodes/join-node.js.map +1 -1
  239. package/dist/src/planner/nodes/limit-offset.d.ts +7 -3
  240. package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
  241. package/dist/src/planner/nodes/limit-offset.js +15 -0
  242. package/dist/src/planner/nodes/limit-offset.js.map +1 -1
  243. package/dist/src/planner/nodes/plan-node-type.d.ts +8 -0
  244. package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
  245. package/dist/src/planner/nodes/plan-node-type.js +8 -0
  246. package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
  247. package/dist/src/planner/nodes/plan-node.d.ts +9 -9
  248. package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
  249. package/dist/src/planner/nodes/plan-node.js +3 -3
  250. package/dist/src/planner/nodes/plan-node.js.map +1 -1
  251. package/dist/src/planner/nodes/pragma.d.ts +2 -1
  252. package/dist/src/planner/nodes/pragma.d.ts.map +1 -1
  253. package/dist/src/planner/nodes/pragma.js +3 -1
  254. package/dist/src/planner/nodes/pragma.js.map +1 -1
  255. package/dist/src/planner/nodes/project-node.d.ts +16 -3
  256. package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
  257. package/dist/src/planner/nodes/project-node.js +82 -2
  258. package/dist/src/planner/nodes/project-node.js.map +1 -1
  259. package/dist/src/planner/nodes/recursive-cte-node.d.ts +2 -2
  260. package/dist/src/planner/nodes/recursive-cte-node.d.ts.map +1 -1
  261. package/dist/src/planner/nodes/recursive-cte-node.js +1 -1
  262. package/dist/src/planner/nodes/recursive-cte-node.js.map +1 -1
  263. package/dist/src/planner/nodes/reference.d.ts +13 -4
  264. package/dist/src/planner/nodes/reference.d.ts.map +1 -1
  265. package/dist/src/planner/nodes/reference.js +16 -0
  266. package/dist/src/planner/nodes/reference.js.map +1 -1
  267. package/dist/src/planner/nodes/remote-query-node.d.ts +37 -0
  268. package/dist/src/planner/nodes/remote-query-node.d.ts.map +1 -0
  269. package/dist/src/planner/nodes/remote-query-node.js +63 -0
  270. package/dist/src/planner/nodes/remote-query-node.js.map +1 -0
  271. package/dist/src/planner/nodes/retrieve-node.d.ts +46 -0
  272. package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -0
  273. package/dist/src/planner/nodes/retrieve-node.js +77 -0
  274. package/dist/src/planner/nodes/retrieve-node.js.map +1 -0
  275. package/dist/src/planner/nodes/returning-node.d.ts +4 -3
  276. package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
  277. package/dist/src/planner/nodes/returning-node.js +44 -3
  278. package/dist/src/planner/nodes/returning-node.js.map +1 -1
  279. package/dist/src/planner/nodes/sequencing-node.d.ts +1 -1
  280. package/dist/src/planner/nodes/sequencing-node.d.ts.map +1 -1
  281. package/dist/src/planner/nodes/sequencing-node.js.map +1 -1
  282. package/dist/src/planner/nodes/set-operation-node.d.ts +1 -1
  283. package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
  284. package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
  285. package/dist/src/planner/nodes/sort.d.ts +11 -2
  286. package/dist/src/planner/nodes/sort.d.ts.map +1 -1
  287. package/dist/src/planner/nodes/sort.js +23 -2
  288. package/dist/src/planner/nodes/sort.js.map +1 -1
  289. package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
  290. package/dist/src/planner/nodes/stream-aggregate.js +4 -1
  291. package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
  292. package/dist/src/planner/nodes/table-access-nodes.d.ts +7 -1
  293. package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
  294. package/dist/src/planner/nodes/table-access-nodes.js +22 -4
  295. package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
  296. package/dist/src/planner/nodes/table-function-call.d.ts +2 -1
  297. package/dist/src/planner/nodes/table-function-call.d.ts.map +1 -1
  298. package/dist/src/planner/nodes/table-function-call.js +12 -5
  299. package/dist/src/planner/nodes/table-function-call.js.map +1 -1
  300. package/dist/src/planner/nodes/transaction-node.js +2 -2
  301. package/dist/src/planner/nodes/transaction-node.js.map +1 -1
  302. package/dist/src/planner/nodes/update-node.d.ts +7 -1
  303. package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
  304. package/dist/src/planner/nodes/update-node.js +11 -2
  305. package/dist/src/planner/nodes/update-node.js.map +1 -1
  306. package/dist/src/planner/nodes/view-reference-node.js.map +1 -1
  307. package/dist/src/planner/nodes/window-function.js.map +1 -1
  308. package/dist/src/planner/nodes/window-node.js.map +1 -1
  309. package/dist/src/planner/optimizer-tuning.d.ts +11 -0
  310. package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
  311. package/dist/src/planner/optimizer-tuning.js +6 -0
  312. package/dist/src/planner/optimizer-tuning.js.map +1 -1
  313. package/dist/src/planner/optimizer.d.ts +17 -3
  314. package/dist/src/planner/optimizer.d.ts.map +1 -1
  315. package/dist/src/planner/optimizer.js +159 -67
  316. package/dist/src/planner/optimizer.js.map +1 -1
  317. package/dist/src/planner/planning-context.d.ts +5 -3
  318. package/dist/src/planner/planning-context.d.ts.map +1 -1
  319. package/dist/src/planner/planning-context.js +2 -0
  320. package/dist/src/planner/planning-context.js.map +1 -1
  321. package/dist/src/planner/resolve.d.ts +3 -2
  322. package/dist/src/planner/resolve.d.ts.map +1 -1
  323. package/dist/src/planner/resolve.js +6 -5
  324. package/dist/src/planner/resolve.js.map +1 -1
  325. package/dist/src/planner/rules/access/rule-select-access-path.d.ts +8 -3
  326. package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
  327. package/dist/src/planner/rules/access/rule-select-access-path.js +206 -47
  328. package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
  329. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts +10 -3
  330. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts.map +1 -1
  331. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js +95 -87
  332. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
  333. package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts +8 -2
  334. package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts.map +1 -1
  335. package/dist/src/planner/rules/cache/rule-cte-optimization.js +24 -13
  336. package/dist/src/planner/rules/cache/rule-cte-optimization.js.map +1 -1
  337. package/dist/src/planner/rules/cache/rule-materialization-advisory.d.ts +9 -2
  338. package/dist/src/planner/rules/cache/rule-materialization-advisory.d.ts.map +1 -1
  339. package/dist/src/planner/rules/cache/rule-materialization-advisory.js +14 -7
  340. package/dist/src/planner/rules/cache/rule-materialization-advisory.js.map +1 -1
  341. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.d.ts +9 -3
  342. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.d.ts.map +1 -1
  343. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js +34 -37
  344. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js.map +1 -1
  345. package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts +14 -0
  346. package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -0
  347. package/dist/src/planner/rules/join/rule-join-greedy-commute.js +33 -0
  348. package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -0
  349. package/dist/src/planner/rules/join/rule-join-key-inference.d.ts +11 -0
  350. package/dist/src/planner/rules/join/rule-join-key-inference.d.ts.map +1 -0
  351. package/dist/src/planner/rules/join/rule-join-key-inference.js +32 -0
  352. package/dist/src/planner/rules/join/rule-join-key-inference.js.map +1 -0
  353. package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts +4 -0
  354. package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts.map +1 -0
  355. package/dist/src/planner/rules/join/rule-quickpick-enumeration.js +233 -0
  356. package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +1 -0
  357. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts +21 -0
  358. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts.map +1 -0
  359. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +125 -0
  360. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -0
  361. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts +21 -0
  362. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -0
  363. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +261 -0
  364. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -0
  365. package/dist/src/planner/scopes/registered.d.ts +1 -0
  366. package/dist/src/planner/scopes/registered.d.ts.map +1 -1
  367. package/dist/src/planner/scopes/registered.js +7 -0
  368. package/dist/src/planner/scopes/registered.js.map +1 -1
  369. package/dist/src/planner/stats/index.d.ts +0 -17
  370. package/dist/src/planner/stats/index.d.ts.map +1 -1
  371. package/dist/src/planner/stats/index.js +0 -58
  372. package/dist/src/planner/stats/index.js.map +1 -1
  373. package/dist/src/planner/util/deferred-constraint.d.ts +14 -0
  374. package/dist/src/planner/util/deferred-constraint.d.ts.map +1 -0
  375. package/dist/src/planner/util/deferred-constraint.js +85 -0
  376. package/dist/src/planner/util/deferred-constraint.js.map +1 -0
  377. package/dist/src/planner/util/key-utils.d.ts +15 -0
  378. package/dist/src/planner/util/key-utils.d.ts.map +1 -0
  379. package/dist/src/planner/util/key-utils.js +43 -0
  380. package/dist/src/planner/util/key-utils.js.map +1 -0
  381. package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
  382. package/dist/src/planner/validation/plan-validator.js +1 -0
  383. package/dist/src/planner/validation/plan-validator.js.map +1 -1
  384. package/dist/src/runtime/deferred-constraint-queue.d.ts +33 -0
  385. package/dist/src/runtime/deferred-constraint-queue.d.ts.map +1 -0
  386. package/dist/src/runtime/deferred-constraint-queue.js +172 -0
  387. package/dist/src/runtime/deferred-constraint-queue.js.map +1 -0
  388. package/dist/src/runtime/emission-context.d.ts +9 -3
  389. package/dist/src/runtime/emission-context.d.ts.map +1 -1
  390. package/dist/src/runtime/emission-context.js +5 -1
  391. package/dist/src/runtime/emission-context.js.map +1 -1
  392. package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
  393. package/dist/src/runtime/emit/add-constraint.js +22 -4
  394. package/dist/src/runtime/emit/add-constraint.js.map +1 -1
  395. package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
  396. package/dist/src/runtime/emit/aggregate.js +3 -2
  397. package/dist/src/runtime/emit/aggregate.js.map +1 -1
  398. package/dist/src/runtime/emit/array-index.js.map +1 -1
  399. package/dist/src/runtime/emit/binary.d.ts.map +1 -1
  400. package/dist/src/runtime/emit/binary.js +9 -2
  401. package/dist/src/runtime/emit/binary.js.map +1 -1
  402. package/dist/src/runtime/emit/cache.d.ts.map +1 -1
  403. package/dist/src/runtime/emit/cache.js +1 -1
  404. package/dist/src/runtime/emit/cache.js.map +1 -1
  405. package/dist/src/runtime/emit/cast.d.ts.map +1 -1
  406. package/dist/src/runtime/emit/cast.js.map +1 -1
  407. package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
  408. package/dist/src/runtime/emit/constraint-check.js +110 -23
  409. package/dist/src/runtime/emit/constraint-check.js.map +1 -1
  410. package/dist/src/runtime/emit/create-assertion.d.ts +5 -0
  411. package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -0
  412. package/dist/src/runtime/emit/create-assertion.js +70 -0
  413. package/dist/src/runtime/emit/create-assertion.js.map +1 -0
  414. package/dist/src/runtime/emit/cte-reference.d.ts.map +1 -1
  415. package/dist/src/runtime/emit/cte-reference.js.map +1 -1
  416. package/dist/src/runtime/emit/cte.d.ts.map +1 -1
  417. package/dist/src/runtime/emit/cte.js.map +1 -1
  418. package/dist/src/runtime/emit/distinct.d.ts.map +1 -1
  419. package/dist/src/runtime/emit/distinct.js.map +1 -1
  420. package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
  421. package/dist/src/runtime/emit/dml-executor.js +17 -9
  422. package/dist/src/runtime/emit/dml-executor.js.map +1 -1
  423. package/dist/src/runtime/emit/drop-assertion.d.ts +5 -0
  424. package/dist/src/runtime/emit/drop-assertion.d.ts.map +1 -0
  425. package/dist/src/runtime/emit/drop-assertion.js +30 -0
  426. package/dist/src/runtime/emit/drop-assertion.js.map +1 -0
  427. package/dist/src/runtime/emit/filter.d.ts.map +1 -1
  428. package/dist/src/runtime/emit/filter.js.map +1 -1
  429. package/dist/src/runtime/emit/join.d.ts.map +1 -1
  430. package/dist/src/runtime/emit/join.js.map +1 -1
  431. package/dist/src/runtime/emit/limit-offset.d.ts.map +1 -1
  432. package/dist/src/runtime/emit/limit-offset.js.map +1 -1
  433. package/dist/src/runtime/emit/pragma.js.map +1 -1
  434. package/dist/src/runtime/emit/project.d.ts.map +1 -1
  435. package/dist/src/runtime/emit/project.js.map +1 -1
  436. package/dist/src/runtime/emit/recursive-cte.d.ts.map +1 -1
  437. package/dist/src/runtime/emit/recursive-cte.js +1 -1
  438. package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
  439. package/dist/src/runtime/emit/remote-query.d.ts +9 -0
  440. package/dist/src/runtime/emit/remote-query.d.ts.map +1 -0
  441. package/dist/src/runtime/emit/remote-query.js +30 -0
  442. package/dist/src/runtime/emit/remote-query.js.map +1 -0
  443. package/dist/src/runtime/emit/retrieve.d.ts +5 -0
  444. package/dist/src/runtime/emit/retrieve.d.ts.map +1 -0
  445. package/dist/src/runtime/emit/retrieve.js +9 -0
  446. package/dist/src/runtime/emit/retrieve.js.map +1 -0
  447. package/dist/src/runtime/emit/returning.d.ts.map +1 -1
  448. package/dist/src/runtime/emit/returning.js +1 -1
  449. package/dist/src/runtime/emit/returning.js.map +1 -1
  450. package/dist/src/runtime/emit/scalar-function.d.ts.map +1 -1
  451. package/dist/src/runtime/emit/scalar-function.js.map +1 -1
  452. package/dist/src/runtime/emit/scan.d.ts.map +1 -1
  453. package/dist/src/runtime/emit/scan.js +20 -5
  454. package/dist/src/runtime/emit/scan.js.map +1 -1
  455. package/dist/src/runtime/emit/schema-declarative.d.ts +8 -0
  456. package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -0
  457. package/dist/src/runtime/emit/schema-declarative.js +163 -0
  458. package/dist/src/runtime/emit/schema-declarative.js.map +1 -0
  459. package/dist/src/runtime/emit/sequencing.d.ts.map +1 -1
  460. package/dist/src/runtime/emit/sequencing.js.map +1 -1
  461. package/dist/src/runtime/emit/set-operation.d.ts.map +1 -1
  462. package/dist/src/runtime/emit/set-operation.js +6 -6
  463. package/dist/src/runtime/emit/set-operation.js.map +1 -1
  464. package/dist/src/runtime/emit/sort.d.ts.map +1 -1
  465. package/dist/src/runtime/emit/sort.js.map +1 -1
  466. package/dist/src/runtime/emit/subquery.d.ts +1 -1
  467. package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
  468. package/dist/src/runtime/emit/subquery.js +6 -6
  469. package/dist/src/runtime/emit/subquery.js.map +1 -1
  470. package/dist/src/runtime/emit/transaction.d.ts.map +1 -1
  471. package/dist/src/runtime/emit/transaction.js +48 -8
  472. package/dist/src/runtime/emit/transaction.js.map +1 -1
  473. package/dist/src/runtime/emit/values.d.ts.map +1 -1
  474. package/dist/src/runtime/emit/values.js.map +1 -1
  475. package/dist/src/runtime/emit/window.d.ts.map +1 -1
  476. package/dist/src/runtime/emit/window.js.map +1 -1
  477. package/dist/src/runtime/emitters.d.ts.map +1 -1
  478. package/dist/src/runtime/emitters.js +1 -0
  479. package/dist/src/runtime/emitters.js.map +1 -1
  480. package/dist/src/runtime/register.d.ts.map +1 -1
  481. package/dist/src/runtime/register.js +16 -2
  482. package/dist/src/runtime/register.js.map +1 -1
  483. package/dist/src/runtime/scheduler.js.map +1 -1
  484. package/dist/src/runtime/types.d.ts +2 -2
  485. package/dist/src/runtime/types.d.ts.map +1 -1
  486. package/dist/src/runtime/types.js +4 -1
  487. package/dist/src/runtime/types.js.map +1 -1
  488. package/dist/src/runtime/utils.d.ts +2 -2
  489. package/dist/src/runtime/utils.d.ts.map +1 -1
  490. package/dist/src/runtime/utils.js +1 -0
  491. package/dist/src/runtime/utils.js.map +1 -1
  492. package/dist/src/schema/assertion.d.ts +19 -0
  493. package/dist/src/schema/assertion.d.ts.map +1 -0
  494. package/dist/src/schema/assertion.js +2 -0
  495. package/dist/src/schema/assertion.js.map +1 -0
  496. package/dist/src/schema/catalog.d.ts +44 -0
  497. package/dist/src/schema/catalog.d.ts.map +1 -0
  498. package/dist/src/schema/catalog.js +148 -0
  499. package/dist/src/schema/catalog.js.map +1 -0
  500. package/dist/src/schema/change-events.d.ts +2 -2
  501. package/dist/src/schema/change-events.d.ts.map +1 -1
  502. package/dist/src/schema/column.d.ts +2 -0
  503. package/dist/src/schema/column.d.ts.map +1 -1
  504. package/dist/src/schema/column.js.map +1 -1
  505. package/dist/src/schema/declared-schema-manager.d.ts +42 -0
  506. package/dist/src/schema/declared-schema-manager.d.ts.map +1 -0
  507. package/dist/src/schema/declared-schema-manager.js +71 -0
  508. package/dist/src/schema/declared-schema-manager.js.map +1 -0
  509. package/dist/src/schema/function.d.ts +3 -2
  510. package/dist/src/schema/function.d.ts.map +1 -1
  511. package/dist/src/schema/function.js.map +1 -1
  512. package/dist/src/schema/manager.d.ts +8 -3
  513. package/dist/src/schema/manager.d.ts.map +1 -1
  514. package/dist/src/schema/manager.js +32 -3
  515. package/dist/src/schema/manager.js.map +1 -1
  516. package/dist/src/schema/schema-differ.d.ts +34 -0
  517. package/dist/src/schema/schema-differ.d.ts.map +1 -0
  518. package/dist/src/schema/schema-differ.js +157 -0
  519. package/dist/src/schema/schema-differ.js.map +1 -0
  520. package/dist/src/schema/schema-hasher.d.ts +10 -0
  521. package/dist/src/schema/schema-hasher.d.ts.map +1 -0
  522. package/dist/src/schema/schema-hasher.js +39 -0
  523. package/dist/src/schema/schema-hasher.js.map +1 -0
  524. package/dist/src/schema/schema.d.ts +7 -0
  525. package/dist/src/schema/schema.d.ts.map +1 -1
  526. package/dist/src/schema/schema.js +19 -0
  527. package/dist/src/schema/schema.js.map +1 -1
  528. package/dist/src/schema/table.d.ts +28 -3
  529. package/dist/src/schema/table.d.ts.map +1 -1
  530. package/dist/src/schema/table.js +17 -2
  531. package/dist/src/schema/table.js.map +1 -1
  532. package/dist/src/schema/window-function.d.ts.map +1 -1
  533. package/dist/src/schema/window-function.js.map +1 -1
  534. package/dist/src/util/ast-stringify.d.ts.map +1 -1
  535. package/dist/src/util/ast-stringify.js +116 -3
  536. package/dist/src/util/ast-stringify.js.map +1 -1
  537. package/dist/src/util/environment.js.map +1 -1
  538. package/dist/src/util/plugin-loader.d.ts +25 -2
  539. package/dist/src/util/plugin-loader.d.ts.map +1 -1
  540. package/dist/src/util/plugin-loader.js +180 -2
  541. package/dist/src/util/plugin-loader.js.map +1 -1
  542. package/dist/src/util/row-descriptor.d.ts +1 -1
  543. package/dist/src/util/row-descriptor.d.ts.map +1 -1
  544. package/dist/src/util/row-descriptor.js.map +1 -1
  545. package/dist/src/util/serialization.d.ts +3 -0
  546. package/dist/src/util/serialization.d.ts.map +1 -1
  547. package/dist/src/util/serialization.js +1 -0
  548. package/dist/src/util/serialization.js.map +1 -1
  549. package/dist/src/vtab/best-access-plan.d.ts +1 -1
  550. package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
  551. package/dist/src/vtab/best-access-plan.js +1 -0
  552. package/dist/src/vtab/best-access-plan.js.map +1 -1
  553. package/dist/src/vtab/manifest.d.ts.map +1 -1
  554. package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
  555. package/dist/src/vtab/memory/layer/base.js +2 -0
  556. package/dist/src/vtab/memory/layer/base.js.map +1 -1
  557. package/dist/src/vtab/memory/layer/manager.d.ts +2 -1
  558. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  559. package/dist/src/vtab/memory/layer/manager.js +24 -6
  560. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  561. package/dist/src/vtab/memory/layer/safe-iterate.d.ts.map +1 -1
  562. package/dist/src/vtab/memory/layer/safe-iterate.js.map +1 -1
  563. package/dist/src/vtab/memory/module.d.ts.map +1 -1
  564. package/dist/src/vtab/memory/module.js +5 -0
  565. package/dist/src/vtab/memory/module.js.map +1 -1
  566. package/dist/src/vtab/memory/table.d.ts +2 -1
  567. package/dist/src/vtab/memory/table.d.ts.map +1 -1
  568. package/dist/src/vtab/memory/table.js +3 -2
  569. package/dist/src/vtab/memory/table.js.map +1 -1
  570. package/dist/src/vtab/memory/utils/logging.d.ts +2 -2
  571. package/dist/src/vtab/memory/utils/logging.d.ts.map +1 -1
  572. package/dist/src/vtab/memory/utils/logging.js +6 -3
  573. package/dist/src/vtab/memory/utils/logging.js.map +1 -1
  574. package/dist/src/vtab/module.d.ts +25 -0
  575. package/dist/src/vtab/module.d.ts.map +1 -1
  576. package/dist/src/vtab/table.d.ts +17 -4
  577. package/dist/src/vtab/table.d.ts.map +1 -1
  578. package/dist/src/vtab/table.js.map +1 -1
  579. package/package.json +4 -2
  580. package/src/common/errors.ts +1 -1
  581. package/src/common/json-types.ts +16 -0
  582. package/src/common/types.ts +2 -0
  583. package/src/core/database-options.ts +8 -8
  584. package/src/core/database.ts +537 -71
  585. package/src/core/statement.ts +3 -1
  586. package/src/func/builtins/builtin-window-functions.ts +11 -10
  587. package/src/func/builtins/datetime.ts +42 -0
  588. package/src/func/builtins/explain.ts +186 -44
  589. package/src/func/builtins/index.ts +5 -2
  590. package/src/func/builtins/json-helpers.ts +21 -21
  591. package/src/func/builtins/json-tvf.ts +8 -9
  592. package/src/func/builtins/json.ts +10 -9
  593. package/src/func/builtins/schema.ts +24 -4
  594. package/src/func/context.ts +7 -0
  595. package/src/func/registration.ts +5 -1
  596. package/src/index.ts +2 -2
  597. package/src/parser/ast.ts +582 -481
  598. package/src/parser/lexer.ts +27 -21
  599. package/src/parser/parser.ts +3336 -2776
  600. package/src/parser/visitor.ts +1 -0
  601. package/src/planner/analysis/binding-collector.ts +83 -0
  602. package/src/planner/analysis/const-evaluator.ts +1 -1
  603. package/src/planner/analysis/const-pass.ts +3 -2
  604. package/src/planner/analysis/constraint-extractor.ts +610 -123
  605. package/src/planner/analysis/predicate-normalizer.ts +237 -0
  606. package/src/planner/building/alter-table.ts +3 -1
  607. package/src/planner/building/block.ts +93 -78
  608. package/src/planner/building/constraint-builder.ts +173 -114
  609. package/src/planner/building/create-assertion.ts +7 -0
  610. package/src/planner/building/declare-schema.ts +22 -0
  611. package/src/planner/building/delete.ts +214 -171
  612. package/src/planner/building/drop-assertion.ts +11 -0
  613. package/src/planner/building/expression.ts +1 -0
  614. package/src/planner/building/function-call.ts +6 -5
  615. package/src/planner/building/insert.ts +428 -349
  616. package/src/planner/building/pragma.ts +1 -0
  617. package/src/planner/building/schema-resolution.ts +176 -176
  618. package/src/planner/building/select-aggregates.ts +5 -3
  619. package/src/planner/building/select-compound.ts +22 -13
  620. package/src/planner/building/select-context.ts +6 -6
  621. package/src/planner/building/select-modifiers.ts +8 -7
  622. package/src/planner/building/select-projections.ts +177 -176
  623. package/src/planner/building/select-window.ts +259 -253
  624. package/src/planner/building/select.ts +531 -520
  625. package/src/planner/building/table-function.ts +49 -48
  626. package/src/planner/building/table.ts +9 -3
  627. package/src/planner/building/update.ts +319 -270
  628. package/src/planner/building/with.ts +7 -7
  629. package/src/planner/debug.ts +1 -0
  630. package/src/planner/framework/characteristics.ts +503 -0
  631. package/src/planner/framework/context.ts +23 -6
  632. package/src/planner/framework/pass.ts +354 -0
  633. package/src/planner/nodes/aggregate-node.ts +52 -7
  634. package/src/planner/nodes/array-index-node.ts +1 -1
  635. package/src/planner/nodes/cache-node.ts +11 -2
  636. package/src/planner/nodes/constraint-check-node.ts +14 -5
  637. package/src/planner/nodes/create-assertion-node.ts +51 -0
  638. package/src/planner/nodes/create-index-node.ts +2 -2
  639. package/src/planner/nodes/create-table-node.ts +2 -2
  640. package/src/planner/nodes/cte-node.ts +30 -4
  641. package/src/planner/nodes/cte-reference-node.ts +2 -2
  642. package/src/planner/nodes/declarative-schema.ts +221 -0
  643. package/src/planner/nodes/delete-node.ts +102 -96
  644. package/src/planner/nodes/distinct-node.ts +20 -6
  645. package/src/planner/nodes/dml-executor-node.ts +1 -1
  646. package/src/planner/nodes/drop-assertion-node.ts +50 -0
  647. package/src/planner/nodes/drop-table-node.ts +1 -0
  648. package/src/planner/nodes/filter.ts +56 -3
  649. package/src/planner/nodes/insert-node.ts +126 -120
  650. package/src/planner/nodes/internal-recursive-cte-ref-node.ts +5 -20
  651. package/src/planner/nodes/join-node.ts +122 -4
  652. package/src/planner/nodes/limit-offset.ts +132 -113
  653. package/src/planner/nodes/plan-node-type.ts +95 -87
  654. package/src/planner/nodes/plan-node.ts +8 -8
  655. package/src/planner/nodes/pragma.ts +6 -3
  656. package/src/planner/nodes/project-node.ts +101 -7
  657. package/src/planner/nodes/recursive-cte-node.ts +6 -6
  658. package/src/planner/nodes/reference.ts +334 -312
  659. package/src/planner/nodes/remote-query-node.ts +73 -0
  660. package/src/planner/nodes/retrieve-node.ts +86 -0
  661. package/src/planner/nodes/returning-node.ts +52 -10
  662. package/src/planner/nodes/sequencing-node.ts +2 -2
  663. package/src/planner/nodes/set-operation-node.ts +3 -3
  664. package/src/planner/nodes/sort.ts +33 -4
  665. package/src/planner/nodes/stream-aggregate.ts +5 -1
  666. package/src/planner/nodes/table-access-nodes.ts +31 -6
  667. package/src/planner/nodes/table-function-call.ts +134 -127
  668. package/src/planner/nodes/transaction-node.ts +2 -2
  669. package/src/planner/nodes/update-node.ts +138 -132
  670. package/src/planner/nodes/view-reference-node.ts +1 -1
  671. package/src/planner/nodes/window-function.ts +2 -2
  672. package/src/planner/nodes/window-node.ts +1 -1
  673. package/src/planner/optimizer-tuning.ts +18 -0
  674. package/src/planner/optimizer.ts +171 -96
  675. package/src/planner/planning-context.ts +10 -3
  676. package/src/planner/resolve.ts +10 -9
  677. package/src/planner/rules/README.md +96 -96
  678. package/src/planner/rules/access/rule-select-access-path.ts +384 -184
  679. package/src/planner/rules/aggregate/rule-aggregate-streaming.ts +118 -104
  680. package/src/planner/rules/cache/rule-cte-optimization.ts +29 -16
  681. package/src/planner/rules/cache/rule-materialization-advisory.ts +14 -7
  682. package/src/planner/rules/cache/rule-mutating-subquery-cache.ts +38 -44
  683. package/src/planner/rules/join/rule-join-greedy-commute.ts +48 -0
  684. package/src/planner/rules/join/rule-join-key-inference.ts +35 -0
  685. package/src/planner/rules/join/rule-quickpick-enumeration.ts +267 -0
  686. package/src/planner/rules/predicate/rule-predicate-pushdown.ts +144 -0
  687. package/src/planner/rules/retrieve/rule-grow-retrieve.ts +337 -0
  688. package/src/planner/scopes/registered.ts +8 -0
  689. package/src/planner/stats/index.ts +0 -65
  690. package/src/planner/util/key-utils.ts +46 -0
  691. package/src/planner/validation/plan-validator.ts +5 -3
  692. package/src/runtime/deferred-constraint-queue.ts +196 -0
  693. package/src/runtime/emission-context.ts +11 -5
  694. package/src/runtime/emit/add-constraint.ts +26 -5
  695. package/src/runtime/emit/aggregate.ts +9 -7
  696. package/src/runtime/emit/array-index.ts +2 -2
  697. package/src/runtime/emit/binary.ts +26 -8
  698. package/src/runtime/emit/cache.ts +2 -2
  699. package/src/runtime/emit/cast.ts +2 -2
  700. package/src/runtime/emit/constraint-check.ts +148 -26
  701. package/src/runtime/emit/create-assertion.ts +82 -0
  702. package/src/runtime/emit/cte-reference.ts +2 -2
  703. package/src/runtime/emit/cte.ts +2 -2
  704. package/src/runtime/emit/distinct.ts +2 -2
  705. package/src/runtime/emit/dml-executor.ts +20 -12
  706. package/src/runtime/emit/drop-assertion.ts +45 -0
  707. package/src/runtime/emit/filter.ts +4 -4
  708. package/src/runtime/emit/join.ts +8 -7
  709. package/src/runtime/emit/limit-offset.ts +2 -2
  710. package/src/runtime/emit/pragma.ts +2 -2
  711. package/src/runtime/emit/project.ts +2 -2
  712. package/src/runtime/emit/recursive-cte.ts +2 -2
  713. package/src/runtime/emit/remote-query.ts +47 -0
  714. package/src/runtime/emit/retrieve.ts +15 -0
  715. package/src/runtime/emit/returning.ts +4 -4
  716. package/src/runtime/emit/scalar-function.ts +2 -2
  717. package/src/runtime/emit/scan.ts +29 -13
  718. package/src/runtime/emit/schema-declarative.ts +205 -0
  719. package/src/runtime/emit/sequencing.ts +3 -3
  720. package/src/runtime/emit/set-operation.ts +7 -7
  721. package/src/runtime/emit/sort.ts +2 -2
  722. package/src/runtime/emit/subquery.ts +10 -10
  723. package/src/runtime/emit/transaction.ts +46 -8
  724. package/src/runtime/emit/values.ts +2 -2
  725. package/src/runtime/emit/window.ts +3 -3
  726. package/src/runtime/emitters.ts +1 -0
  727. package/src/runtime/register.ts +150 -135
  728. package/src/runtime/scheduler.ts +2 -2
  729. package/src/runtime/types.ts +10 -7
  730. package/src/runtime/utils.ts +3 -2
  731. package/src/schema/assertion.ts +21 -0
  732. package/src/schema/catalog.ts +208 -0
  733. package/src/schema/change-events.ts +2 -2
  734. package/src/schema/column.ts +2 -0
  735. package/src/schema/declared-schema-manager.ts +82 -0
  736. package/src/schema/function.ts +5 -2
  737. package/src/schema/manager.ts +742 -709
  738. package/src/schema/schema-differ.ts +214 -0
  739. package/src/schema/schema-hasher.ts +44 -0
  740. package/src/schema/schema.ts +23 -0
  741. package/src/schema/table.ts +398 -364
  742. package/src/schema/window-function.ts +2 -0
  743. package/src/util/ast-stringify.ts +869 -764
  744. package/src/util/environment.ts +2 -2
  745. package/src/util/plugin-loader.ts +232 -7
  746. package/src/util/row-descriptor.ts +1 -1
  747. package/src/util/serialization.ts +2 -0
  748. package/src/vtab/best-access-plan.ts +2 -1
  749. package/src/vtab/manifest.ts +1 -0
  750. package/src/vtab/memory/index.ts +178 -178
  751. package/src/vtab/memory/layer/base.ts +275 -273
  752. package/src/vtab/memory/layer/interface.ts +47 -47
  753. package/src/vtab/memory/layer/manager.ts +33 -11
  754. package/src/vtab/memory/layer/safe-iterate.ts +3 -3
  755. package/src/vtab/memory/layer/transaction.ts +229 -229
  756. package/src/vtab/memory/module.ts +24 -18
  757. package/src/vtab/memory/table.ts +256 -253
  758. package/src/vtab/memory/utils/logging.ts +6 -3
  759. package/src/vtab/module.ts +170 -140
  760. package/src/vtab/table.ts +162 -143
@@ -1,520 +1,531 @@
1
- import type * as AST from '../../parser/ast.js';
2
- import { PlanNode, type RelationalPlanNode, type ScalarPlanNode } from '../nodes/plan-node.js';
3
- import { QuereusError } from '../../common/errors.js';
4
- import { StatusCode } from '../../common/types.js';
5
- import type { PlanningContext } from '../planning-context.js';
6
- import { SingleRowNode } from '../nodes/single-row.js';
7
- import { buildTableReference } from './table.js';
8
- import { AliasedScope } from '../scopes/aliased.js';
9
- import { RegisteredScope } from '../scopes/registered.js';
10
- import type { Scope } from '../scopes/scope.js';
11
- import { MultiScope } from '../scopes/multi.js';
12
- import { ProjectNode, type Projection } from '../nodes/project-node.js';
13
- import { buildExpression } from './expression.js';
14
- import { FilterNode } from '../nodes/filter.js';
15
- import { buildTableFunctionCall } from './table-function.js';
16
- import { CTEReferenceNode } from '../nodes/cte-reference-node.js';
17
- import { InternalRecursiveCTERefNode } from '../nodes/internal-recursive-cte-ref-node.js';
18
- import type { CTEPlanNode } from '../nodes/cte-node.js';
19
- import { JoinNode } from '../nodes/join-node.js';
20
- import { ColumnReferenceNode } from '../nodes/reference.js';
21
- import { ValuesNode } from '../nodes/values-node.js';
22
- import { createLogger } from '../../common/logger.js';
23
-
24
- // Import decomposed functionality
25
- import { buildWithContext } from './select-context.js';
26
- import { buildCompoundSelect } from './select-compound.js';
27
- import { analyzeSelectColumns, buildStarProjections } from './select-projections.js';
28
- import { buildAggregatePhase, buildFinalAggregateProjections } from './select-aggregates.js';
29
- import { buildWindowPhase } from './select-window.js';
30
- import { buildFinalProjections, applyDistinct, applyOrderBy, applyLimitOffset } from './select-modifiers.js';
31
- import { SortNode, type SortKey } from '../nodes/sort.js';
32
-
33
- import { buildInsertStmt } from './insert.js';
34
- import { buildUpdateStmt } from './update.js';
35
- import { buildDeleteStmt } from './delete.js';
36
-
37
- const logger = createLogger('planner:cte');
38
-
39
- /**
40
- * Creates an initial logical query plan for a SELECT statement.
41
- *
42
- * For this initial version, it only supports simple "SELECT ... FROM one_table" queries,
43
- * effectively returning a TableReferenceNode for that table.
44
- *
45
- * @param stmt The AST.SelectStmt to plan.
46
- * @param ctx The parent planning context for this SELECT statement.
47
- * @param parentCTEs A map of parent CTEs for compound statements.
48
- * @returns A BatchNode representing the plan for the SELECT statement.
49
- * @throws {QuereusError} If the FROM clause is missing, empty, or contains more than one source.
50
- */
51
- export function buildSelectStmt(
52
- ctx: PlanningContext,
53
- stmt: AST.SelectStmt,
54
- parentCTEs: Map<string, CTEPlanNode> = new Map(),
55
- /**
56
- * Whether ProjectNodes inside this SELECT should forward all input columns that are not explicitly
57
- * listed in the projection list. This is desirable for top-level queries (helps ORDER BY, window
58
- * functions, etc.) but must be switched off for scalar/IN/EXISTS sub-queries which are required to
59
- * expose only their declared columns.
60
- */
61
- preserveInputColumns: boolean = true
62
- ): PlanNode {
63
-
64
- // Phase 0: Handle WITH clause if present
65
- const { contextWithCTEs, cteNodes } = buildWithContext(ctx, stmt, parentCTEs);
66
-
67
- // Handle compound set operations (UNION / INTERSECT / EXCEPT)
68
- if (stmt.compound) {
69
- return buildCompoundSelect(stmt, contextWithCTEs, cteNodes,
70
- (ctx, stmt, parentCTEs) => buildSelectStmt(ctx, stmt, parentCTEs) as RelationalPlanNode);
71
- }
72
-
73
- // Phase 1: Plan FROM clause and determine local input relations for the current select scope
74
- const fromTables = !stmt.from || stmt.from.length === 0
75
- ? [SingleRowNode.instance]
76
- : stmt.from.map(from => buildFrom(from, contextWithCTEs, cteNodes));
77
-
78
- // Multiple FROM sources (from joins) are not supported - maybe never will be
79
- if (fromTables.length > 1) {
80
- throw new QuereusError(
81
- 'SELECT with multiple FROM sources (joins) not supported.',
82
- StatusCode.UNSUPPORTED, undefined, stmt.from![1].loc?.start.line, stmt.from![1].loc?.start.column
83
- );
84
- }
85
-
86
- // Phase 2: Create the main scope for this SELECT statement
87
- const columnScopes = fromTables.map(ft => (ft as any).columnScope || ft.scope).filter(Boolean);
88
- const selectScope = new MultiScope([...columnScopes, contextWithCTEs.scope]);
89
- let selectContext: PlanningContext = { ...contextWithCTEs, scope: selectScope };
90
-
91
- let input: RelationalPlanNode = fromTables[0];
92
-
93
- // Plan WHERE clause
94
- if (stmt.where) {
95
- const whereExpression = buildExpression(selectContext, stmt.where);
96
- input = new FilterNode(selectScope, input, whereExpression);
97
- }
98
-
99
- // Build projections based on the SELECT list
100
- const projections: Projection[] = [];
101
-
102
- // Analyze SELECT columns
103
- const {
104
- projections: columnProjections,
105
- aggregates,
106
- windowFunctions,
107
- hasAggregates,
108
- hasWindowFunctions
109
- } = analyzeSelectColumns(stmt.columns, selectContext);
110
-
111
- // Handle SELECT * separately
112
- for (const column of stmt.columns) {
113
- if (column.type === 'all') {
114
- const starProjections = buildStarProjections(column, input, selectScope);
115
- projections.push(...starProjections);
116
- }
117
- }
118
-
119
- // Add non-star projections
120
- projections.push(...columnProjections);
121
-
122
- // Process aggregates if present
123
- const aggregateResult = buildAggregatePhase(input, stmt, selectContext, aggregates, hasAggregates, projections);
124
- input = aggregateResult.output;
125
- let preAggregateSort = aggregateResult.preAggregateSort;
126
-
127
- // Update context if we have aggregates
128
- if (aggregateResult.aggregateScope) {
129
- selectContext = { ...selectContext, scope: aggregateResult.aggregateScope };
130
-
131
- // Build final projections if needed
132
- if (aggregateResult.needsFinalProjection) {
133
- const finalProjections = buildFinalAggregateProjections(stmt, selectContext, aggregateResult.aggregateScope);
134
- input = new ProjectNode(selectScope, input, finalProjections, undefined, undefined, preserveInputColumns);
135
- }
136
- }
137
-
138
- // Handle window functions if present
139
- if (hasWindowFunctions) {
140
- // Check if ORDER BY references columns not in SELECT before applying window functions
141
- let preWindowSort = false;
142
- if (stmt.orderBy) {
143
- const selectedColumns = new Set<string>();
144
- for (const column of stmt.columns) {
145
- if (column.type === 'column' && column.expr.type === 'column') {
146
- selectedColumns.add(column.expr.name.toLowerCase());
147
- }
148
- if (column.type === 'column' && column.alias) {
149
- selectedColumns.add(column.alias.toLowerCase());
150
- }
151
- }
152
-
153
- // Check if ORDER BY references columns not in SELECT
154
- for (const orderByClause of stmt.orderBy) {
155
- if (orderByClause.expr.type === 'column') {
156
- const orderColumn = orderByClause.expr.name.toLowerCase();
157
- if (!selectedColumns.has(orderColumn)) {
158
- // Apply ORDER BY before window projections
159
- const sortKeys: SortKey[] = stmt.orderBy.map(orderBy => ({
160
- expression: buildExpression(selectContext, orderBy.expr),
161
- direction: orderBy.direction,
162
- nulls: orderBy.nulls
163
- }));
164
- input = new SortNode(selectContext.scope, input, sortKeys);
165
- preWindowSort = true;
166
- break;
167
- }
168
- }
169
- }
170
- }
171
-
172
- input = buildWindowPhase(input, windowFunctions, selectContext, stmt);
173
-
174
- // Update context to include window output columns
175
- const windowOutputScope = new RegisteredScope(selectContext.scope);
176
- const windowAttributes = input.getAttributes();
177
- input.getType().columns.forEach((col, index) => {
178
- const attr = windowAttributes[index];
179
- windowOutputScope.registerSymbol(col.name.toLowerCase(), (exp, s) =>
180
- new ColumnReferenceNode(s, exp as AST.ColumnExpr, col.type, attr.id, index));
181
- });
182
-
183
- // Create combined scope that includes both original columns and window output
184
- const combinedScope = new MultiScope([windowOutputScope, selectScope]);
185
- selectContext = { ...selectContext, scope: combinedScope };
186
-
187
- // Don't apply ORDER BY again if we already did it
188
- if (preWindowSort) {
189
- preAggregateSort = true;
190
- }
191
- }
192
-
193
- // Handle final projections for non-aggregate, non-window cases
194
- if (!hasAggregates && !hasWindowFunctions) {
195
- const finalResult = buildFinalProjections(input, projections, selectScope, stmt, selectContext, preserveInputColumns);
196
- input = finalResult.output;
197
- selectContext = finalResult.finalContext;
198
- preAggregateSort = finalResult.preAggregateSort;
199
-
200
- // Apply final modifiers with projection scope for column alias resolution
201
- input = applyDistinct(input, stmt, selectScope);
202
- input = applyOrderBy(input, stmt, selectContext, preAggregateSort, finalResult.projectionScope);
203
- input = applyLimitOffset(input, stmt, selectContext, finalResult.projectionScope);
204
- } else {
205
- // Apply final modifiers without projection scope for aggregate/window cases
206
- input = applyDistinct(input, stmt, selectScope);
207
- input = applyOrderBy(input, stmt, selectContext, preAggregateSort);
208
- input = applyLimitOffset(input, stmt, selectContext);
209
- }
210
-
211
- return input;
212
- }
213
-
214
- /**
215
- * Creates a plan for a VALUES statement.
216
- *
217
- * @param ctx The planning context
218
- * @param stmt The AST.ValuesStmt to plan
219
- * @returns A ValuesNode representing the VALUES clause
220
- */
221
- export function buildValuesStmt(
222
- ctx: PlanningContext,
223
- stmt: AST.ValuesStmt
224
- ): ValuesNode {
225
- // Build each row of values
226
- const rows: ScalarPlanNode[][] = stmt.values.map(rowValues =>
227
- rowValues.map(valueExpr => buildExpression(ctx, valueExpr))
228
- );
229
-
230
- // Create the VALUES node
231
- return new ValuesNode(ctx.scope, rows);
232
- }
233
-
234
- /**
235
- * Processes a FROM clause item into a relational plan node.
236
- *
237
- * Handles different types of FROM items:
238
- * - Table references - creates a TableReferenceNode
239
- * - Subqueries - plans the subquery
240
- * - Joins - builds the join structure
241
- * - Table functions - creates a table function call node
242
- *
243
- * For a simple table reference, this calls buildTableReference which
244
- * returns a TableReferenceNode for that table.
245
- *
246
- * @param fromClause The FROM clause AST node to process
247
- * @param ctx The planning context
248
- * @returns A relational plan node representing the FROM clause
249
- */
250
- export function buildFrom(fromClause: AST.FromClause, parentContext: PlanningContext, cteNodes: Map<string, CTEPlanNode> = new Map()): RelationalPlanNode {
251
- let fromTable: RelationalPlanNode;
252
- let columnScope: Scope;
253
-
254
- if (fromClause.type === 'table') {
255
- const tableName = fromClause.table.name.toLowerCase();
256
-
257
- // Check if this is a CTE reference
258
- if (cteNodes.has(tableName)) {
259
- const cteNode = cteNodes.get(tableName)!;
260
-
261
- // Check if this is an internal recursive CTE reference
262
- if (cteNode instanceof InternalRecursiveCTERefNode) {
263
- // For internal recursive references, use the node directly
264
- fromTable = cteNode;
265
-
266
- // Create scope for internal recursive CTE columns
267
- const internalScope = new RegisteredScope(parentContext.scope);
268
- const internalAttributes = cteNode.getAttributes();
269
- cteNode.getType().columns.forEach((c, i) => {
270
- const attr = internalAttributes[i];
271
- internalScope.registerSymbol(c.name.toLowerCase(), (exp, s) =>
272
- new ColumnReferenceNode(s, exp as AST.ColumnExpr, c.type, attr.id, i));
273
- });
274
-
275
- if (fromClause.alias) {
276
- columnScope = new AliasedScope(internalScope, tableName, fromClause.alias.toLowerCase());
277
- } else {
278
- columnScope = new AliasedScope(internalScope, tableName, tableName);
279
- }
280
- } else {
281
- // Regular CTE reference - cache by CTE name + alias to ensure consistent attribute IDs
282
- const cacheKey = `${tableName}:${fromClause.alias || tableName}`;
283
-
284
- // Initialize cache if not exists
285
- if (!parentContext.cteReferenceCache) {
286
- parentContext.cteReferenceCache = new Map();
287
- }
288
-
289
- let cteRefNode: CTEReferenceNode;
290
- if (parentContext.cteReferenceCache.has(cacheKey)) {
291
- cteRefNode = parentContext.cteReferenceCache.get(cacheKey)!;
292
- const attrs = cteRefNode.getAttributes();
293
- logger(`Using cached CTE reference ${cacheKey}, attrs=[${attrs.map(a => a.id).join(',')}]`);
294
- } else {
295
- cteRefNode = new CTEReferenceNode(parentContext.scope, cteNode, fromClause.alias);
296
- parentContext.cteReferenceCache.set(cacheKey, cteRefNode);
297
- const attrs = cteRefNode.getAttributes();
298
- logger(`Created new CTE reference ${cacheKey}, attrs=[${attrs.map(a => a.id).join(',')}]`);
299
- }
300
-
301
- // Create scope for CTE columns using attributes from the reference node
302
- // CRITICAL: Use a closure to capture the reference node's attributes
303
- // This ensures all column references use the same attribute IDs
304
- const cteScope = new RegisteredScope(parentContext.scope);
305
- const refAttrs = cteRefNode.getAttributes();
306
- cteRefNode.getType().columns.forEach((c, i) => {
307
- const attr = refAttrs[i];
308
- cteScope.registerSymbol(c.name.toLowerCase(), (exp, s) => {
309
- // Always use the cached reference node's attribute ID
310
- return new ColumnReferenceNode(s, exp as AST.ColumnExpr, c.type, attr.id, i);
311
- });
312
- });
313
-
314
- if (fromClause.alias) {
315
- columnScope = new AliasedScope(cteScope, tableName, fromClause.alias.toLowerCase());
316
- } else {
317
- columnScope = new AliasedScope(cteScope, tableName, tableName);
318
- }
319
-
320
- // CRITICAL: Cache the reference node so later expression compilation uses the same attribute IDs
321
- (columnScope as any).referenceNode = cteRefNode;
322
-
323
- fromTable = cteRefNode;
324
- }
325
- } else {
326
- // Check if this is a view
327
- const schemaName = fromClause.table.schema || parentContext.db.schemaManager.getCurrentSchemaName();
328
- const viewSchema = parentContext.db.schemaManager.getView(schemaName, fromClause.table.name);
329
-
330
- if (viewSchema) {
331
- // Build the view's SELECT statement
332
- fromTable = buildSelectStmt(parentContext, viewSchema.selectAst, cteNodes) as RelationalPlanNode;
333
-
334
- // Create scope for view columns
335
- const viewScope = new RegisteredScope(parentContext.scope);
336
- const viewAttributes = fromTable.getAttributes();
337
- fromTable.getType().columns.forEach((c, i) => {
338
- const attr = viewAttributes[i];
339
- viewScope.registerSymbol(c.name.toLowerCase(), (exp, s) =>
340
- new ColumnReferenceNode(s, exp as AST.ColumnExpr, c.type, attr.id, i));
341
- });
342
-
343
- if (fromClause.alias) {
344
- columnScope = new AliasedScope(viewScope, fromClause.table.name.toLowerCase(), fromClause.alias.toLowerCase());
345
- } else {
346
- columnScope = new AliasedScope(viewScope, fromClause.table.name.toLowerCase(), fromClause.table.name.toLowerCase());
347
- }
348
- } else {
349
- // Regular table
350
- fromTable = buildTableReference(fromClause, parentContext);
351
-
352
- // Create scope for table columns
353
- const tableScope = new RegisteredScope(parentContext.scope);
354
- const tableAttributes = fromTable.getAttributes();
355
- fromTable.getType().columns.forEach((c, i) => {
356
- const attr = tableAttributes[i];
357
- tableScope.registerSymbol(c.name.toLowerCase(), (exp, s) =>
358
- new ColumnReferenceNode(s, exp as AST.ColumnExpr, c.type, attr.id, i));
359
- });
360
-
361
- if (fromClause.alias) {
362
- columnScope = new AliasedScope(tableScope, fromClause.table.name.toLowerCase(), fromClause.alias.toLowerCase());
363
- } else {
364
- columnScope = new AliasedScope(tableScope, fromClause.table.name.toLowerCase(), fromClause.table.name.toLowerCase());
365
- }
366
- }
367
- }
368
-
369
- } else if (fromClause.type === 'functionSource') {
370
- fromTable = buildTableFunctionCall(fromClause, parentContext);
371
-
372
- // Create scope for function columns
373
- const functionScope = new RegisteredScope(parentContext.scope);
374
- const functionAttributes = fromTable.getAttributes();
375
- fromTable.getType().columns.forEach((c, i) => {
376
- const attr = functionAttributes[i];
377
- functionScope.registerSymbol(c.name.toLowerCase(), (exp, s) =>
378
- new ColumnReferenceNode(s, exp as AST.ColumnExpr, c.type, attr.id, i));
379
- });
380
-
381
- if (fromClause.alias) {
382
- // Use the alias as the table name
383
- columnScope = new AliasedScope(functionScope, '', fromClause.alias.toLowerCase());
384
- } else {
385
- // Use the function name as the table name
386
- columnScope = new AliasedScope(functionScope, '', fromClause.name.name.toLowerCase());
387
- }
388
-
389
- } else if (fromClause.type === 'subquerySource') {
390
- // Build the subquery
391
- if (fromClause.subquery.type === 'select') {
392
- fromTable = buildSelectStmt(parentContext, fromClause.subquery, cteNodes) as RelationalPlanNode;
393
- } else if (fromClause.subquery.type === 'values') {
394
- fromTable = buildValuesStmt(parentContext, fromClause.subquery);
395
- } else {
396
- const exhaustiveCheck: never = fromClause.subquery;
397
- throw new QuereusError(`Unsupported subquery type: ${(exhaustiveCheck as any).type}`, StatusCode.INTERNAL);
398
- }
399
-
400
- // Create scope for subquery columns
401
- const subqueryScope = new RegisteredScope(parentContext.scope);
402
- const subqueryAttributes = fromTable.getAttributes();
403
-
404
- // Use provided column names or infer from subquery
405
- const columnNames = fromClause.columns || fromTable.getType().columns.map(c => c.name);
406
-
407
- columnNames.forEach((colName, i) => {
408
- if (i < subqueryAttributes.length) {
409
- const attr = subqueryAttributes[i];
410
- const columnType = fromTable.getType().columns[i]?.type || { typeClass: 'scalar', affinity: 'TEXT', nullable: true, isReadOnly: true };
411
- subqueryScope.registerSymbol(colName.toLowerCase(), (exp, s) =>
412
- new ColumnReferenceNode(s, exp as AST.ColumnExpr, columnType, attr.id, i));
413
- }
414
- });
415
-
416
- columnScope = new AliasedScope(subqueryScope, '', fromClause.alias.toLowerCase());
417
-
418
- } else if (fromClause.type === 'mutatingSubquerySource') {
419
- // Build the mutating subquery (DML with RETURNING)
420
- let dmlNode: RelationalPlanNode;
421
-
422
- if (fromClause.stmt.type === 'insert') {
423
- // Build INSERT without SinkNode wrapper since we need the RETURNING results
424
- dmlNode = buildInsertStmt(parentContext, fromClause.stmt) as RelationalPlanNode;
425
- } else if (fromClause.stmt.type === 'update') {
426
- // Build UPDATE without SinkNode wrapper since we need the RETURNING results
427
- dmlNode = buildUpdateStmt(parentContext, fromClause.stmt) as RelationalPlanNode;
428
- } else if (fromClause.stmt.type === 'delete') {
429
- // Build DELETE without SinkNode wrapper since we need the RETURNING results
430
- dmlNode = buildDeleteStmt(parentContext, fromClause.stmt) as RelationalPlanNode;
431
- } else {
432
- const exhaustiveCheck: never = fromClause.stmt;
433
- throw new QuereusError(`Unsupported mutating subquery type: ${(exhaustiveCheck as any).type}`, StatusCode.INTERNAL);
434
- }
435
-
436
- fromTable = dmlNode;
437
-
438
- // Create scope for mutating subquery columns
439
- const mutatingScope = new RegisteredScope(parentContext.scope);
440
- const mutatingAttributes = fromTable.getAttributes();
441
-
442
- // Use provided column names or infer from RETURNING clause
443
- const columnNames = fromClause.columns || fromTable.getType().columns.map(c => c.name);
444
-
445
- columnNames.forEach((colName, i) => {
446
- if (i < mutatingAttributes.length) {
447
- const attr = mutatingAttributes[i];
448
- const columnType = fromTable.getType().columns[i]?.type || { typeClass: 'scalar', affinity: 'TEXT', nullable: true, isReadOnly: false };
449
- mutatingScope.registerSymbol(colName.toLowerCase(), (exp, s) =>
450
- new ColumnReferenceNode(s, exp as AST.ColumnExpr, columnType, attr.id, i));
451
- }
452
- });
453
-
454
- columnScope = new AliasedScope(mutatingScope, '', fromClause.alias.toLowerCase());
455
-
456
- } else if (fromClause.type === 'join') {
457
- // Handle JOIN clauses
458
- return buildJoin(fromClause, parentContext, cteNodes);
459
- } else {
460
- // Handle the case where fromClause.type is not recognized
461
- const exhaustiveCheck: never = fromClause;
462
- throw new QuereusError(`Unsupported FROM clause type: ${(exhaustiveCheck as any).type}`, StatusCode.INTERNAL);
463
- }
464
-
465
- (fromTable as any).columnScope = columnScope;
466
- return fromTable;
467
- }
468
-
469
- /**
470
- * Builds a join plan node from an AST join clause
471
- */
472
- function buildJoin(joinClause: AST.JoinClause, parentContext: PlanningContext, cteNodes: Map<string, CTEPlanNode>): JoinNode {
473
- // Build left and right sides recursively
474
- const leftNode = buildFrom(joinClause.left, parentContext, cteNodes);
475
- const rightNode = buildFrom(joinClause.right, parentContext, cteNodes);
476
-
477
- // Extract column scopes from left and right nodes
478
- const leftScope = (leftNode as any).columnScope as Scope;
479
- const rightScope = (rightNode as any).columnScope as Scope;
480
-
481
- // Create a combined scope for the join that includes both left and right columns
482
- const combinedScope = new MultiScope([leftScope, rightScope]);
483
-
484
- // Create a new planning context with the combined scope for condition evaluation
485
- const joinContext: PlanningContext = {
486
- ...parentContext,
487
- scope: combinedScope
488
- };
489
-
490
- let condition: ScalarPlanNode | undefined;
491
- let usingColumns: string[] | undefined;
492
-
493
- // Handle ON condition
494
- if (joinClause.condition) {
495
- condition = buildExpression(joinContext, joinClause.condition);
496
- }
497
-
498
- // Handle USING columns
499
- if (joinClause.columns) {
500
- usingColumns = joinClause.columns;
501
- // Convert USING to ON condition: table1.col1 = table2.col1 AND table1.col2 = table2.col2 ...
502
- // For now, store the column names and let the emitter handle the condition
503
- // TODO: This could be improved by synthesizing the equality conditions here
504
- }
505
-
506
- const joinNode = new JoinNode(
507
- parentContext.scope,
508
- leftNode,
509
- rightNode,
510
- joinClause.joinType,
511
- condition,
512
- usingColumns
513
- );
514
-
515
- // Use the combined scope as the column scope for the join
516
- // This allows both qualified and unqualified column references to resolve properly
517
- (joinNode as any).columnScope = combinedScope;
518
-
519
- return joinNode;
520
- }
1
+ import type * as AST from '../../parser/ast.js';
2
+ import { PlanNode, type RelationalPlanNode, type ScalarPlanNode } from '../nodes/plan-node.js';
3
+ import { QuereusError } from '../../common/errors.js';
4
+ import { StatusCode } from '../../common/types.js';
5
+ import type { PlanningContext } from '../planning-context.js';
6
+ import { SingleRowNode } from '../nodes/single-row.js';
7
+ import { buildTableReference } from './table.js';
8
+ import { AliasedScope } from '../scopes/aliased.js';
9
+ import { RegisteredScope } from '../scopes/registered.js';
10
+ import type { Scope } from '../scopes/scope.js';
11
+ import { MultiScope } from '../scopes/multi.js';
12
+ import { ProjectNode, type Projection } from '../nodes/project-node.js';
13
+ import { buildExpression } from './expression.js';
14
+ import { FilterNode } from '../nodes/filter.js';
15
+ import { buildTableFunctionCall } from './table-function.js';
16
+ import { CTEReferenceNode } from '../nodes/cte-reference-node.js';
17
+ import { InternalRecursiveCTERefNode as _InternalRecursiveCTERefNode } from '../nodes/internal-recursive-cte-ref-node.js';
18
+ import type { CTEScopeNode, CTEPlanNode } from '../nodes/cte-node.js';
19
+ import { JoinNode } from '../nodes/join-node.js';
20
+ import { ColumnReferenceNode } from '../nodes/reference.js';
21
+ import { ValuesNode } from '../nodes/values-node.js';
22
+ import { createLogger } from '../../common/logger.js';
23
+
24
+ // Import decomposed functionality
25
+ import { buildWithContext } from './select-context.js';
26
+ import { buildCompoundSelect } from './select-compound.js';
27
+ import { analyzeSelectColumns, buildStarProjections } from './select-projections.js';
28
+ import { buildAggregatePhase, buildFinalAggregateProjections } from './select-aggregates.js';
29
+ import { buildWindowPhase } from './select-window.js';
30
+ import { buildFinalProjections, applyDistinct, applyOrderBy, applyLimitOffset } from './select-modifiers.js';
31
+ import { SortNode, type SortKey } from '../nodes/sort.js';
32
+
33
+ import { buildInsertStmt } from './insert.js';
34
+ import { buildUpdateStmt } from './update.js';
35
+ import { buildDeleteStmt } from './delete.js';
36
+ import { CapabilityDetectors } from '../framework/characteristics.js';
37
+
38
+ const logger = createLogger('planner:cte');
39
+
40
+ /**
41
+ * Creates an initial logical query plan for a SELECT statement.
42
+ *
43
+ * For this initial version, it only supports simple "SELECT ... FROM one_table" queries,
44
+ * effectively returning a TableReferenceNode for that table.
45
+ *
46
+ * @param stmt The AST.SelectStmt to plan.
47
+ * @param ctx The parent planning context for this SELECT statement.
48
+ * @param parentCTEs A map of parent CTEs for compound statements.
49
+ * @returns A BatchNode representing the plan for the SELECT statement.
50
+ * @throws {QuereusError} If the FROM clause is missing, empty, or contains more than one source.
51
+ */
52
+ export function buildSelectStmt(
53
+ ctx: PlanningContext,
54
+ stmt: AST.SelectStmt,
55
+ parentCTEs: Map<string, CTEScopeNode> = new Map(),
56
+ /**
57
+ * Whether ProjectNodes inside this SELECT should forward all input columns that are not explicitly
58
+ * listed in the projection list. This is desirable for top-level queries (helps ORDER BY, window
59
+ * functions, etc.) but must be switched off for scalar/IN/EXISTS sub-queries which are required to
60
+ * expose only their declared columns.
61
+ */
62
+ preserveInputColumns: boolean = true
63
+ ): PlanNode {
64
+
65
+ // Phase 0: Handle WITH clause if present
66
+ const { contextWithCTEs, cteNodes } = buildWithContext(ctx, stmt, parentCTEs);
67
+
68
+ // Handle compound set operations (UNION / INTERSECT / EXCEPT)
69
+ if (stmt.compound) {
70
+ return buildCompoundSelect(stmt, contextWithCTEs, cteNodes,
71
+ (ctx, stmt, parentCTEs) => buildSelectStmt(ctx, stmt, parentCTEs) as RelationalPlanNode);
72
+ }
73
+
74
+ // Phase 1: Plan FROM clause and determine local input relations for the current select scope
75
+ // Use the context that includes CTEs as well as the merged CTE map so that table references
76
+ // inside the FROM clause can correctly resolve to CTE definitions created by the WITH clause.
77
+ const fromTables = !stmt.from || stmt.from.length === 0
78
+ ? [SingleRowNode.instance]
79
+ : stmt.from.map(from => buildFrom(from, contextWithCTEs, cteNodes));
80
+
81
+ // Multiple FROM sources (from joins) are not supported - maybe never will be
82
+ if (fromTables.length > 1) {
83
+ throw new QuereusError(
84
+ 'SELECT with multiple FROM sources (joins) not supported.',
85
+ StatusCode.UNSUPPORTED, undefined, stmt.from![1].loc?.start.line, stmt.from![1].loc?.start.column
86
+ );
87
+ }
88
+
89
+ // Phase 2: Create the main scope for this SELECT statement
90
+ const columnScopes = fromTables.map(ft => ctx.outputScopes.get(ft) || ft.scope).filter(Boolean);
91
+ const selectScope = new MultiScope([...columnScopes, contextWithCTEs.scope]);
92
+ let selectContext: PlanningContext = { ...contextWithCTEs, scope: selectScope };
93
+
94
+ let input: RelationalPlanNode = fromTables[0];
95
+
96
+ // Plan WHERE clause
97
+ if (stmt.where) {
98
+ const whereExpression = buildExpression(selectContext, stmt.where);
99
+ input = new FilterNode(selectScope, input, whereExpression);
100
+ }
101
+
102
+ // Build projections based on the SELECT list
103
+ const projections: Projection[] = [];
104
+
105
+ // Analyze SELECT columns
106
+ const {
107
+ projections: columnProjections,
108
+ aggregates,
109
+ windowFunctions,
110
+ hasAggregates,
111
+ hasWindowFunctions
112
+ } = analyzeSelectColumns(stmt.columns, selectContext);
113
+
114
+ // Handle SELECT * separately
115
+ for (const column of stmt.columns) {
116
+ if (column.type === 'all') {
117
+ const starProjections = buildStarProjections(column, input, selectScope);
118
+ projections.push(...starProjections);
119
+ }
120
+ }
121
+
122
+ // Add non-star projections
123
+ projections.push(...columnProjections);
124
+
125
+ // Process aggregates if present
126
+ const aggregateResult = buildAggregatePhase(input, stmt, selectContext, aggregates, hasAggregates, projections);
127
+ input = aggregateResult.output;
128
+ let preAggregateSort = aggregateResult.preAggregateSort;
129
+
130
+ // Update context if we have aggregates
131
+ if (aggregateResult.aggregateScope) {
132
+ selectContext = { ...selectContext, scope: aggregateResult.aggregateScope };
133
+
134
+ // Build final projections if needed
135
+ if (aggregateResult.needsFinalProjection) {
136
+ const finalProjections = buildFinalAggregateProjections(stmt, selectContext, aggregateResult.aggregateScope);
137
+ input = new ProjectNode(selectScope, input, finalProjections, undefined, undefined, preserveInputColumns);
138
+ }
139
+ }
140
+
141
+ // Handle window functions if present
142
+ if (hasWindowFunctions) {
143
+ // Check if ORDER BY references columns not in SELECT before applying window functions
144
+ let preWindowSort = false;
145
+ if (stmt.orderBy) {
146
+ const selectedColumns = new Set<string>();
147
+ for (const column of stmt.columns) {
148
+ if (column.type === 'column' && column.expr.type === 'column') {
149
+ selectedColumns.add(column.expr.name.toLowerCase());
150
+ }
151
+ if (column.type === 'column' && column.alias) {
152
+ selectedColumns.add(column.alias.toLowerCase());
153
+ }
154
+ }
155
+
156
+ // Check if ORDER BY references columns not in SELECT
157
+ for (const orderByClause of stmt.orderBy) {
158
+ if (orderByClause.expr.type === 'column') {
159
+ const orderColumn = orderByClause.expr.name.toLowerCase();
160
+ if (!selectedColumns.has(orderColumn)) {
161
+ // Apply ORDER BY before window projections
162
+ const sortKeys: SortKey[] = stmt.orderBy.map(orderBy => ({
163
+ expression: buildExpression(selectContext, orderBy.expr),
164
+ direction: orderBy.direction,
165
+ nulls: orderBy.nulls
166
+ }));
167
+ input = new SortNode(selectContext.scope, input, sortKeys);
168
+ preWindowSort = true;
169
+ break;
170
+ }
171
+ }
172
+ }
173
+ }
174
+
175
+ input = buildWindowPhase(input, windowFunctions, selectContext, stmt);
176
+
177
+ // Update context to include window output columns
178
+ const windowOutputScope = new RegisteredScope(selectContext.scope);
179
+ const windowAttributes = input.getAttributes();
180
+ input.getType().columns.forEach((col, index) => {
181
+ const attr = windowAttributes[index];
182
+ windowOutputScope.registerSymbol(col.name.toLowerCase(), (exp, s) =>
183
+ new ColumnReferenceNode(s, exp as AST.ColumnExpr, col.type, attr.id, index));
184
+ });
185
+
186
+ // Create combined scope that includes both original columns and window output
187
+ const combinedScope = new MultiScope([windowOutputScope, selectScope]);
188
+ selectContext = { ...selectContext, scope: combinedScope };
189
+
190
+ // Don't apply ORDER BY again if we already did it
191
+ if (preWindowSort) {
192
+ preAggregateSort = true;
193
+ }
194
+ }
195
+
196
+ // Handle final projections for non-aggregate, non-window cases
197
+ if (!hasAggregates && !hasWindowFunctions) {
198
+ const finalResult = buildFinalProjections(input, projections, selectScope, stmt, selectContext, preserveInputColumns);
199
+ input = finalResult.output;
200
+ selectContext = finalResult.finalContext;
201
+ preAggregateSort = finalResult.preAggregateSort;
202
+
203
+ // Apply final modifiers with projection scope for column alias resolution
204
+ input = applyDistinct(input, stmt, selectScope);
205
+ input = applyOrderBy(input, stmt, selectContext, preAggregateSort, finalResult.projectionScope);
206
+ input = applyLimitOffset(input, stmt, selectContext, finalResult.projectionScope);
207
+ } else {
208
+ // Apply final modifiers without projection scope for aggregate/window cases
209
+ input = applyDistinct(input, stmt, selectScope);
210
+ input = applyOrderBy(input, stmt, selectContext, preAggregateSort);
211
+ input = applyLimitOffset(input, stmt, selectContext);
212
+ }
213
+
214
+ return input;
215
+ }
216
+
217
+ /**
218
+ * Creates a plan for a VALUES statement.
219
+ *
220
+ * @param ctx The planning context
221
+ * @param stmt The AST.ValuesStmt to plan
222
+ * @returns A ValuesNode representing the VALUES clause
223
+ */
224
+ export function buildValuesStmt(
225
+ ctx: PlanningContext,
226
+ stmt: AST.ValuesStmt
227
+ ): ValuesNode {
228
+ // Build each row of values
229
+ const rows: ScalarPlanNode[][] = stmt.values.map(rowValues =>
230
+ rowValues.map(valueExpr => buildExpression(ctx, valueExpr))
231
+ );
232
+
233
+ // Create the VALUES node
234
+ return new ValuesNode(ctx.scope, rows);
235
+ }
236
+
237
+ /**
238
+ * Processes a FROM clause item into a relational plan node.
239
+ *
240
+ * Handles different types of FROM items:
241
+ * - Table references - creates a TableReferenceNode
242
+ * - Subqueries - plans the subquery
243
+ * - Joins - builds the join structure
244
+ * - Table functions - creates a table function call node
245
+ *
246
+ * For a simple table reference, this calls buildTableReference which
247
+ * returns a TableReferenceNode for that table.
248
+ *
249
+ * @param fromClause The FROM clause AST node to process
250
+ * @param ctx The planning context
251
+ * @returns A relational plan node representing the FROM clause
252
+ */
253
+ export function buildFrom(fromClause: AST.FromClause, parentContext: PlanningContext, cteNodes: Map<string, CTEScopeNode> = new Map()): RelationalPlanNode {
254
+ let fromTable: RelationalPlanNode;
255
+ let columnScope: Scope;
256
+
257
+ if (fromClause.type === 'table') {
258
+ const tableName = fromClause.table.name.toLowerCase();
259
+
260
+ // Check if this is a CTE reference
261
+ if (cteNodes.has(tableName)) {
262
+ const cteNode = cteNodes.get(tableName)!;
263
+
264
+ // Check if this is an internal recursive CTE reference
265
+ if (CapabilityDetectors.isRecursiveCTERef(cteNode)) {
266
+ // For internal recursive references, use the node directly
267
+ fromTable = cteNode;
268
+
269
+ // Create scope for internal recursive CTE columns
270
+ const internalScope = new RegisteredScope(parentContext.scope);
271
+ const internalAttributes = cteNode.getAttributes();
272
+ cteNode.getType().columns.forEach((c, i) => {
273
+ const attr = internalAttributes[i];
274
+ internalScope.registerSymbol(c.name.toLowerCase(), (exp, s) =>
275
+ new ColumnReferenceNode(s, exp as AST.ColumnExpr, c.type, attr.id, i));
276
+ });
277
+
278
+ if (fromClause.alias) {
279
+ columnScope = new AliasedScope(internalScope, tableName, fromClause.alias.toLowerCase());
280
+ } else {
281
+ columnScope = new AliasedScope(internalScope, tableName, tableName);
282
+ }
283
+ } else {
284
+ // Regular CTE reference - cache by CTE name + alias to ensure consistent attribute IDs
285
+ const cacheKey = `${tableName}:${fromClause.alias || tableName}`;
286
+
287
+ // Initialize cache if not exists
288
+ if (!parentContext.cteReferenceCache) {
289
+ parentContext.cteReferenceCache = new Map();
290
+ }
291
+
292
+ let cteRefNode: CTEReferenceNode;
293
+ if (parentContext.cteReferenceCache.has(cacheKey)) {
294
+ cteRefNode = parentContext.cteReferenceCache.get(cacheKey)!;
295
+ const attrs = cteRefNode.getAttributes();
296
+ logger(`Using cached CTE reference ${cacheKey}, attrs=[${attrs.map(a => a.id).join(',')}]`);
297
+ } else {
298
+ cteRefNode = new CTEReferenceNode(parentContext.scope, cteNode as CTEPlanNode, fromClause.alias);
299
+ parentContext.cteReferenceCache.set(cacheKey, cteRefNode);
300
+ const attrs = cteRefNode.getAttributes();
301
+ logger(`Created new CTE reference ${cacheKey}, attrs=[${attrs.map(a => a.id).join(',')}]`);
302
+ }
303
+
304
+ // Create scope for CTE columns using attributes from the reference node
305
+ // CRITICAL: Use a closure to capture the reference node's attributes
306
+ // This ensures all column references use the same attribute IDs
307
+ const cteScope = new RegisteredScope(parentContext.scope);
308
+ const refAttrs = cteRefNode.getAttributes();
309
+ cteRefNode.getType().columns.forEach((c, i) => {
310
+ const attr = refAttrs[i];
311
+ cteScope.registerSymbol(c.name.toLowerCase(), (exp, s) => {
312
+ // Always use the cached reference node's attribute ID
313
+ return new ColumnReferenceNode(s, exp as AST.ColumnExpr, c.type, attr.id, i);
314
+ });
315
+ });
316
+
317
+ if (fromClause.alias) {
318
+ columnScope = new AliasedScope(cteScope, tableName, fromClause.alias.toLowerCase());
319
+ } else {
320
+ columnScope = new AliasedScope(cteScope, tableName, tableName);
321
+ }
322
+
323
+ // CRITICAL: Cache the reference node so later expression compilation uses the same attribute IDs
324
+ // TODO: replace this monkey patching with a proper interface
325
+ (columnScope as any).referenceNode = cteRefNode;
326
+
327
+ fromTable = cteRefNode;
328
+ }
329
+ } else {
330
+ // Check if this is a view
331
+ const schemaName = fromClause.table.schema || parentContext.db.schemaManager.getCurrentSchemaName();
332
+ const viewSchema = parentContext.db.schemaManager.getView(schemaName, fromClause.table.name);
333
+
334
+ if (viewSchema) {
335
+ // Build the view's SELECT statement
336
+ fromTable = buildSelectStmt(parentContext, viewSchema.selectAst, cteNodes) as RelationalPlanNode;
337
+
338
+ // Create scope for view columns
339
+ const viewScope = new RegisteredScope(parentContext.scope);
340
+ const viewAttributes = fromTable.getAttributes();
341
+ fromTable.getType().columns.forEach((c, i) => {
342
+ const attr = viewAttributes[i];
343
+ viewScope.registerSymbol(c.name.toLowerCase(), (exp, s) =>
344
+ new ColumnReferenceNode(s, exp as AST.ColumnExpr, c.type, attr.id, i));
345
+ });
346
+
347
+ if (fromClause.alias) {
348
+ columnScope = new AliasedScope(viewScope, fromClause.table.name.toLowerCase(), fromClause.alias.toLowerCase());
349
+ } else {
350
+ columnScope = new AliasedScope(viewScope, fromClause.table.name.toLowerCase(), fromClause.table.name.toLowerCase());
351
+ }
352
+ } else {
353
+ // Regular table
354
+ fromTable = buildTableReference(fromClause, parentContext);
355
+
356
+ // Create scope for table columns
357
+ const tableScope = new RegisteredScope(parentContext.scope);
358
+ const tableAttributes = fromTable.getAttributes();
359
+ fromTable.getType().columns.forEach((c, i) => {
360
+ const attr = tableAttributes[i];
361
+ tableScope.registerSymbol(c.name.toLowerCase(), (exp, s) =>
362
+ new ColumnReferenceNode(s, exp as AST.ColumnExpr, c.type, attr.id, i));
363
+ });
364
+
365
+ if (fromClause.alias) {
366
+ columnScope = new AliasedScope(tableScope, fromClause.table.name.toLowerCase(), fromClause.alias.toLowerCase());
367
+ } else {
368
+ columnScope = new AliasedScope(tableScope, fromClause.table.name.toLowerCase(), fromClause.table.name.toLowerCase());
369
+ }
370
+ }
371
+ }
372
+
373
+ } else if (fromClause.type === 'functionSource') {
374
+ fromTable = buildTableFunctionCall(fromClause, parentContext);
375
+
376
+ // Create scope for function columns
377
+ const functionScope = new RegisteredScope(parentContext.scope);
378
+ const functionAttributes = fromTable.getAttributes();
379
+ fromTable.getType().columns.forEach((c, i) => {
380
+ const attr = functionAttributes[i];
381
+ functionScope.registerSymbol(c.name.toLowerCase(), (exp, s) =>
382
+ new ColumnReferenceNode(s, exp as AST.ColumnExpr, c.type, attr.id, i));
383
+ });
384
+
385
+ if (fromClause.alias) {
386
+ // Use the alias as the table name
387
+ columnScope = new AliasedScope(functionScope, '', fromClause.alias.toLowerCase());
388
+ } else {
389
+ // Use the function name as the table name
390
+ columnScope = new AliasedScope(functionScope, '', fromClause.name.name.toLowerCase());
391
+ }
392
+
393
+ } else if (fromClause.type === 'subquerySource') {
394
+ // Build the subquery
395
+ if (fromClause.subquery.type === 'select') {
396
+ fromTable = buildSelectStmt(parentContext, fromClause.subquery, cteNodes) as RelationalPlanNode;
397
+ } else if (fromClause.subquery.type === 'values') {
398
+ fromTable = buildValuesStmt(parentContext, fromClause.subquery);
399
+ } else {
400
+ const exhaustiveCheck: never = fromClause.subquery;
401
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
402
+ throw new QuereusError(`Unsupported subquery type: ${(exhaustiveCheck as any).type}`, StatusCode.INTERNAL);
403
+ }
404
+
405
+ // Create scope for subquery columns
406
+ const subqueryScope = new RegisteredScope(parentContext.scope);
407
+ const subqueryAttributes = fromTable.getAttributes();
408
+
409
+ // Use provided column names or infer from subquery
410
+ const columnNames = fromClause.columns || fromTable.getType().columns.map(c => c.name);
411
+
412
+ columnNames.forEach((colName, i) => {
413
+ if (i < subqueryAttributes.length) {
414
+ const attr = subqueryAttributes[i];
415
+ const columnType = fromTable.getType().columns[i]?.type || { typeClass: 'scalar', affinity: 'TEXT', nullable: true, isReadOnly: true };
416
+ subqueryScope.registerSymbol(colName.toLowerCase(), (exp, s) =>
417
+ new ColumnReferenceNode(s, exp as AST.ColumnExpr, columnType, attr.id, i));
418
+ }
419
+ });
420
+
421
+ columnScope = new AliasedScope(subqueryScope, '', fromClause.alias.toLowerCase());
422
+
423
+ } else if (fromClause.type === 'mutatingSubquerySource') {
424
+ // Build the mutating subquery (DML with RETURNING)
425
+ let dmlNode: RelationalPlanNode;
426
+
427
+ if (fromClause.stmt.type === 'insert') {
428
+ // Build INSERT without SinkNode wrapper since we need the RETURNING results
429
+ dmlNode = buildInsertStmt(parentContext, fromClause.stmt) as RelationalPlanNode;
430
+ } else if (fromClause.stmt.type === 'update') {
431
+ // Build UPDATE without SinkNode wrapper since we need the RETURNING results
432
+ dmlNode = buildUpdateStmt(parentContext, fromClause.stmt) as RelationalPlanNode;
433
+ } else if (fromClause.stmt.type === 'delete') {
434
+ // Build DELETE without SinkNode wrapper since we need the RETURNING results
435
+ dmlNode = buildDeleteStmt(parentContext, fromClause.stmt) as RelationalPlanNode;
436
+ } else {
437
+ const exhaustiveCheck: never = fromClause.stmt;
438
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
439
+ throw new QuereusError(`Unsupported mutating subquery type: ${(exhaustiveCheck as any).type}`, StatusCode.INTERNAL);
440
+ }
441
+
442
+ fromTable = dmlNode;
443
+
444
+ // Create scope for mutating subquery columns
445
+ const mutatingScope = new RegisteredScope(parentContext.scope);
446
+ const mutatingAttributes = fromTable.getAttributes();
447
+
448
+ // Use provided column names or infer from RETURNING clause
449
+ const columnNames = fromClause.columns || fromTable.getType().columns.map(c => c.name);
450
+
451
+ columnNames.forEach((colName, i) => {
452
+ if (i < mutatingAttributes.length) {
453
+ const attr = mutatingAttributes[i];
454
+ const columnType = fromTable.getType().columns[i]?.type || { typeClass: 'scalar', affinity: 'TEXT', nullable: true, isReadOnly: false };
455
+ mutatingScope.registerSymbol(colName.toLowerCase(), (exp, s) =>
456
+ new ColumnReferenceNode(s, exp as AST.ColumnExpr, columnType, attr.id, i));
457
+ }
458
+ });
459
+
460
+ columnScope = new AliasedScope(mutatingScope, '', fromClause.alias.toLowerCase());
461
+
462
+ } else if (fromClause.type === 'join') {
463
+ // Handle JOIN clauses
464
+ return buildJoin(fromClause, parentContext, cteNodes);
465
+ } else {
466
+ // Handle the case where fromClause.type is not recognized
467
+ const exhaustiveCheck: never = fromClause;
468
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
469
+ throw new QuereusError(`Unsupported FROM clause type: ${(exhaustiveCheck as any).type}`, StatusCode.INTERNAL);
470
+ }
471
+
472
+ parentContext.outputScopes.set(fromTable, columnScope);
473
+ return fromTable;
474
+ }
475
+
476
+ /**
477
+ * Builds a join plan node from an AST join clause
478
+ */
479
+ function buildJoin(joinClause: AST.JoinClause, parentContext: PlanningContext, cteNodes: Map<string, CTEScopeNode>): JoinNode {
480
+ // Build left and right sides recursively
481
+ const leftNode = buildFrom(joinClause.left, parentContext, cteNodes);
482
+ const rightNode = buildFrom(joinClause.right, parentContext, cteNodes);
483
+
484
+ // Create a combined scope for join expressions
485
+ const leftScope = parentContext.outputScopes.get(leftNode);
486
+ const rightScope = parentContext.outputScopes.get(rightNode);
487
+ if (!leftScope || !rightScope) {
488
+ // This should not happen if buildFrom correctly populates the scopes
489
+ throw new QuereusError('Could not find output scope for join source', StatusCode.INTERNAL);
490
+ }
491
+
492
+ // Create a combined scope for the join that includes both left and right columns
493
+ const combinedScope = new MultiScope([leftScope, rightScope]);
494
+
495
+ // Create a new planning context with the combined scope for condition evaluation
496
+ const joinContext: PlanningContext = {
497
+ ...parentContext,
498
+ scope: combinedScope
499
+ };
500
+
501
+ let condition: ScalarPlanNode | undefined;
502
+ let usingColumns: string[] | undefined;
503
+
504
+ // Handle ON condition
505
+ if (joinClause.condition) {
506
+ condition = buildExpression(joinContext, joinClause.condition);
507
+ }
508
+
509
+ // Handle USING columns
510
+ if (joinClause.columns) {
511
+ usingColumns = joinClause.columns;
512
+ // Convert USING to ON condition: table1.col1 = table2.col1 AND table1.col2 = table2.col2 ...
513
+ // For now, store the column names and let the emitter handle the condition
514
+ // TODO: This could be improved by synthesizing the equality conditions here
515
+ }
516
+
517
+ const joinNode = new JoinNode(
518
+ parentContext.scope,
519
+ leftNode,
520
+ rightNode,
521
+ joinClause.joinType,
522
+ condition,
523
+ usingColumns
524
+ );
525
+
526
+ // Use the combined scope as the column scope for the join
527
+ // This allows both qualified and unqualified column references to resolve properly
528
+ parentContext.outputScopes.set(joinNode, combinedScope);
529
+
530
+ return joinNode;
531
+ }