@quereus/quereus 0.1.0 → 0.2.1

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 (477) hide show
  1. package/README.md +47 -23
  2. package/dist/src/common/types.d.ts +1 -0
  3. package/dist/src/common/types.d.ts.map +1 -1
  4. package/dist/src/core/database.d.ts +22 -4
  5. package/dist/src/core/database.d.ts.map +1 -1
  6. package/dist/src/core/database.js +44 -6
  7. package/dist/src/core/database.js.map +1 -1
  8. package/dist/src/core/statement.d.ts +0 -7
  9. package/dist/src/core/statement.d.ts.map +1 -1
  10. package/dist/src/core/statement.js +1 -51
  11. package/dist/src/core/statement.js.map +1 -1
  12. package/dist/src/func/builtins/explain.d.ts.map +1 -1
  13. package/dist/src/func/builtins/explain.js +0 -11
  14. package/dist/src/func/builtins/explain.js.map +1 -1
  15. package/dist/src/index.d.ts +13 -5
  16. package/dist/src/index.d.ts.map +1 -1
  17. package/dist/src/index.js +5 -2
  18. package/dist/src/index.js.map +1 -1
  19. package/dist/src/parser/ast.d.ts +10 -4
  20. package/dist/src/parser/ast.d.ts.map +1 -1
  21. package/dist/src/parser/parser.d.ts.map +1 -1
  22. package/dist/src/parser/parser.js +40 -44
  23. package/dist/src/parser/parser.js.map +1 -1
  24. package/dist/src/planner/analysis/const-pass.d.ts.map +1 -1
  25. package/dist/src/planner/analysis/const-pass.js +12 -6
  26. package/dist/src/planner/analysis/const-pass.js.map +1 -1
  27. package/dist/src/planner/building/constraint-builder.d.ts +11 -0
  28. package/dist/src/planner/building/constraint-builder.d.ts.map +1 -0
  29. package/dist/src/planner/building/constraint-builder.js +79 -0
  30. package/dist/src/planner/building/constraint-builder.js.map +1 -0
  31. package/dist/src/planner/building/delete.d.ts.map +1 -1
  32. package/dist/src/planner/building/delete.js +7 -4
  33. package/dist/src/planner/building/delete.js.map +1 -1
  34. package/dist/src/planner/building/expression.d.ts +3 -0
  35. package/dist/src/planner/building/expression.d.ts.map +1 -1
  36. package/dist/src/planner/building/expression.js +33 -7
  37. package/dist/src/planner/building/expression.js.map +1 -1
  38. package/dist/src/planner/building/insert.d.ts.map +1 -1
  39. package/dist/src/planner/building/insert.js +5 -2
  40. package/dist/src/planner/building/insert.js.map +1 -1
  41. package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
  42. package/dist/src/planner/building/select-aggregates.js +46 -9
  43. package/dist/src/planner/building/select-aggregates.js.map +1 -1
  44. package/dist/src/planner/building/select-context.js +20 -11
  45. package/dist/src/planner/building/select-context.js.map +1 -1
  46. package/dist/src/planner/building/select-modifiers.d.ts +5 -3
  47. package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
  48. package/dist/src/planner/building/select-modifiers.js +29 -20
  49. package/dist/src/planner/building/select-modifiers.js.map +1 -1
  50. package/dist/src/planner/building/select-projections.d.ts +3 -1
  51. package/dist/src/planner/building/select-projections.d.ts.map +1 -1
  52. package/dist/src/planner/building/select-projections.js +15 -20
  53. package/dist/src/planner/building/select-projections.js.map +1 -1
  54. package/dist/src/planner/building/select-window.d.ts.map +1 -1
  55. package/dist/src/planner/building/select-window.js +6 -3
  56. package/dist/src/planner/building/select-window.js.map +1 -1
  57. package/dist/src/planner/building/select.d.ts +25 -2
  58. package/dist/src/planner/building/select.d.ts.map +1 -1
  59. package/dist/src/planner/building/select.js +147 -24
  60. package/dist/src/planner/building/select.js.map +1 -1
  61. package/dist/src/planner/building/table.d.ts +0 -10
  62. package/dist/src/planner/building/table.d.ts.map +1 -1
  63. package/dist/src/planner/building/table.js +1 -35
  64. package/dist/src/planner/building/table.js.map +1 -1
  65. package/dist/src/planner/building/update.d.ts.map +1 -1
  66. package/dist/src/planner/building/update.js +8 -5
  67. package/dist/src/planner/building/update.js.map +1 -1
  68. package/dist/src/planner/building/with.d.ts.map +1 -1
  69. package/dist/src/planner/building/with.js +7 -8
  70. package/dist/src/planner/building/with.js.map +1 -1
  71. package/dist/src/planner/cache/correlation-detector.d.ts +11 -0
  72. package/dist/src/planner/cache/correlation-detector.d.ts.map +1 -0
  73. package/dist/src/planner/cache/correlation-detector.js +73 -0
  74. package/dist/src/planner/cache/correlation-detector.js.map +1 -0
  75. package/dist/src/planner/cache/materialization-advisory.d.ts +12 -18
  76. package/dist/src/planner/cache/materialization-advisory.d.ts.map +1 -1
  77. package/dist/src/planner/cache/materialization-advisory.js +65 -46
  78. package/dist/src/planner/cache/materialization-advisory.js.map +1 -1
  79. package/dist/src/planner/cache/reference-graph.d.ts +14 -9
  80. package/dist/src/planner/cache/reference-graph.d.ts.map +1 -1
  81. package/dist/src/planner/cache/reference-graph.js +93 -84
  82. package/dist/src/planner/cache/reference-graph.js.map +1 -1
  83. package/dist/src/planner/debug.d.ts +25 -0
  84. package/dist/src/planner/debug.d.ts.map +1 -1
  85. package/dist/src/planner/debug.js +127 -0
  86. package/dist/src/planner/debug.js.map +1 -1
  87. package/dist/src/planner/framework/context.d.ts +11 -0
  88. package/dist/src/planner/framework/context.d.ts.map +1 -1
  89. package/dist/src/planner/framework/context.js +25 -2
  90. package/dist/src/planner/framework/context.js.map +1 -1
  91. package/dist/src/planner/framework/registry.d.ts +3 -7
  92. package/dist/src/planner/framework/registry.d.ts.map +1 -1
  93. package/dist/src/planner/framework/registry.js +20 -31
  94. package/dist/src/planner/framework/registry.js.map +1 -1
  95. package/dist/src/planner/nodes/add-constraint-node.d.ts +2 -1
  96. package/dist/src/planner/nodes/add-constraint-node.d.ts.map +1 -1
  97. package/dist/src/planner/nodes/add-constraint-node.js +3 -0
  98. package/dist/src/planner/nodes/add-constraint-node.js.map +1 -1
  99. package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
  100. package/dist/src/planner/nodes/aggregate-node.js +6 -4
  101. package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
  102. package/dist/src/planner/nodes/cache-node.d.ts.map +1 -1
  103. package/dist/src/planner/nodes/cache-node.js +2 -2
  104. package/dist/src/planner/nodes/cache-node.js.map +1 -1
  105. package/dist/src/planner/nodes/constraint-check-node.d.ts +13 -6
  106. package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
  107. package/dist/src/planner/nodes/constraint-check-node.js +38 -12
  108. package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
  109. package/dist/src/planner/nodes/create-index-node.d.ts +2 -1
  110. package/dist/src/planner/nodes/create-index-node.d.ts.map +1 -1
  111. package/dist/src/planner/nodes/create-index-node.js +3 -0
  112. package/dist/src/planner/nodes/create-index-node.js.map +1 -1
  113. package/dist/src/planner/nodes/create-table-node.d.ts +2 -1
  114. package/dist/src/planner/nodes/create-table-node.d.ts.map +1 -1
  115. package/dist/src/planner/nodes/create-table-node.js +3 -0
  116. package/dist/src/planner/nodes/create-table-node.js.map +1 -1
  117. package/dist/src/planner/nodes/create-view-node.d.ts +2 -1
  118. package/dist/src/planner/nodes/create-view-node.d.ts.map +1 -1
  119. package/dist/src/planner/nodes/create-view-node.js +3 -0
  120. package/dist/src/planner/nodes/create-view-node.js.map +1 -1
  121. package/dist/src/planner/nodes/cte-node.d.ts +1 -1
  122. package/dist/src/planner/nodes/cte-node.d.ts.map +1 -1
  123. package/dist/src/planner/nodes/cte-node.js +33 -12
  124. package/dist/src/planner/nodes/cte-node.js.map +1 -1
  125. package/dist/src/planner/nodes/cte-reference-node.d.ts +18 -4
  126. package/dist/src/planner/nodes/cte-reference-node.d.ts.map +1 -1
  127. package/dist/src/planner/nodes/cte-reference-node.js +40 -10
  128. package/dist/src/planner/nodes/cte-reference-node.js.map +1 -1
  129. package/dist/src/planner/nodes/delete-node.d.ts +4 -3
  130. package/dist/src/planner/nodes/delete-node.d.ts.map +1 -1
  131. package/dist/src/planner/nodes/delete-node.js +20 -6
  132. package/dist/src/planner/nodes/delete-node.js.map +1 -1
  133. package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
  134. package/dist/src/planner/nodes/distinct-node.js +2 -2
  135. package/dist/src/planner/nodes/distinct-node.js.map +1 -1
  136. package/dist/src/planner/nodes/dml-executor-node.d.ts +1 -1
  137. package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
  138. package/dist/src/planner/nodes/dml-executor-node.js +2 -2
  139. package/dist/src/planner/nodes/dml-executor-node.js.map +1 -1
  140. package/dist/src/planner/nodes/drop-table-node.d.ts +2 -1
  141. package/dist/src/planner/nodes/drop-table-node.d.ts.map +1 -1
  142. package/dist/src/planner/nodes/drop-table-node.js +3 -0
  143. package/dist/src/planner/nodes/drop-table-node.js.map +1 -1
  144. package/dist/src/planner/nodes/drop-view-node.d.ts +2 -1
  145. package/dist/src/planner/nodes/drop-view-node.d.ts.map +1 -1
  146. package/dist/src/planner/nodes/drop-view-node.js +3 -0
  147. package/dist/src/planner/nodes/drop-view-node.js.map +1 -1
  148. package/dist/src/planner/nodes/filter.d.ts.map +1 -1
  149. package/dist/src/planner/nodes/filter.js +3 -3
  150. package/dist/src/planner/nodes/filter.js.map +1 -1
  151. package/dist/src/planner/nodes/insert-node.d.ts +2 -1
  152. package/dist/src/planner/nodes/insert-node.d.ts.map +1 -1
  153. package/dist/src/planner/nodes/insert-node.js +18 -5
  154. package/dist/src/planner/nodes/insert-node.js.map +1 -1
  155. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts +28 -0
  156. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts.map +1 -0
  157. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js +69 -0
  158. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js.map +1 -0
  159. package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
  160. package/dist/src/planner/nodes/join-node.js +3 -3
  161. package/dist/src/planner/nodes/join-node.js.map +1 -1
  162. package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
  163. package/dist/src/planner/nodes/limit-offset.js +2 -2
  164. package/dist/src/planner/nodes/limit-offset.js.map +1 -1
  165. package/dist/src/planner/nodes/plan-node-type.d.ts +1 -1
  166. package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
  167. package/dist/src/planner/nodes/plan-node-type.js +1 -1
  168. package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
  169. package/dist/src/planner/nodes/plan-node.d.ts +23 -0
  170. package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
  171. package/dist/src/planner/nodes/plan-node.js +25 -2
  172. package/dist/src/planner/nodes/plan-node.js.map +1 -1
  173. package/dist/src/planner/nodes/project-node.d.ts +5 -1
  174. package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
  175. package/dist/src/planner/nodes/project-node.js +39 -20
  176. package/dist/src/planner/nodes/project-node.js.map +1 -1
  177. package/dist/src/planner/nodes/recursive-cte-node.d.ts +2 -2
  178. package/dist/src/planner/nodes/recursive-cte-node.d.ts.map +1 -1
  179. package/dist/src/planner/nodes/recursive-cte-node.js +20 -8
  180. package/dist/src/planner/nodes/recursive-cte-node.js.map +1 -1
  181. package/dist/src/planner/nodes/reference.d.ts.map +1 -1
  182. package/dist/src/planner/nodes/reference.js +4 -2
  183. package/dist/src/planner/nodes/reference.js.map +1 -1
  184. package/dist/src/planner/nodes/returning-node.d.ts +1 -1
  185. package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
  186. package/dist/src/planner/nodes/returning-node.js +21 -13
  187. package/dist/src/planner/nodes/returning-node.js.map +1 -1
  188. package/dist/src/planner/nodes/scalar.d.ts +26 -2
  189. package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
  190. package/dist/src/planner/nodes/scalar.js +82 -10
  191. package/dist/src/planner/nodes/scalar.js.map +1 -1
  192. package/dist/src/planner/nodes/sequencing-node.d.ts.map +1 -1
  193. package/dist/src/planner/nodes/sequencing-node.js +2 -2
  194. package/dist/src/planner/nodes/sequencing-node.js.map +1 -1
  195. package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
  196. package/dist/src/planner/nodes/set-operation-node.js +3 -3
  197. package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
  198. package/dist/src/planner/nodes/single-row.d.ts +4 -2
  199. package/dist/src/planner/nodes/single-row.d.ts.map +1 -1
  200. package/dist/src/planner/nodes/single-row.js +3 -0
  201. package/dist/src/planner/nodes/single-row.js.map +1 -1
  202. package/dist/src/planner/nodes/sink-node.d.ts +1 -1
  203. package/dist/src/planner/nodes/sink-node.d.ts.map +1 -1
  204. package/dist/src/planner/nodes/sink-node.js +4 -4
  205. package/dist/src/planner/nodes/sink-node.js.map +1 -1
  206. package/dist/src/planner/nodes/sort.d.ts.map +1 -1
  207. package/dist/src/planner/nodes/sort.js +2 -2
  208. package/dist/src/planner/nodes/sort.js.map +1 -1
  209. package/dist/src/planner/nodes/stream-aggregate.d.ts +1 -0
  210. package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
  211. package/dist/src/planner/nodes/stream-aggregate.js +64 -11
  212. package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
  213. package/dist/src/planner/nodes/subquery.d.ts +4 -4
  214. package/dist/src/planner/nodes/subquery.d.ts.map +1 -1
  215. package/dist/src/planner/nodes/subquery.js +68 -23
  216. package/dist/src/planner/nodes/subquery.js.map +1 -1
  217. package/dist/src/planner/nodes/table-access-nodes.d.ts +83 -0
  218. package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -0
  219. package/dist/src/planner/nodes/table-access-nodes.js +226 -0
  220. package/dist/src/planner/nodes/table-access-nodes.js.map +1 -0
  221. package/dist/src/planner/nodes/update-node.d.ts +4 -2
  222. package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
  223. package/dist/src/planner/nodes/update-node.js +26 -13
  224. package/dist/src/planner/nodes/update-node.js.map +1 -1
  225. package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
  226. package/dist/src/planner/nodes/window-node.js +25 -23
  227. package/dist/src/planner/nodes/window-node.js.map +1 -1
  228. package/dist/src/planner/optimizer.d.ts.map +1 -1
  229. package/dist/src/planner/optimizer.js +46 -50
  230. package/dist/src/planner/optimizer.js.map +1 -1
  231. package/dist/src/planner/planning-context.d.ts +13 -0
  232. package/dist/src/planner/planning-context.d.ts.map +1 -1
  233. package/dist/src/planner/planning-context.js.map +1 -1
  234. package/dist/src/planner/rules/access/rule-select-access-path.d.ts +1 -1
  235. package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
  236. package/dist/src/planner/rules/access/rule-select-access-path.js +59 -53
  237. package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
  238. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts.map +1 -1
  239. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js +62 -2
  240. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
  241. package/dist/src/planner/rules/cache/rule-materialization-advisory.d.ts.map +1 -1
  242. package/dist/src/planner/rules/cache/rule-materialization-advisory.js +31 -24
  243. package/dist/src/planner/rules/cache/rule-materialization-advisory.js.map +1 -1
  244. package/dist/src/planner/scopes/base.d.ts +0 -10
  245. package/dist/src/planner/scopes/base.d.ts.map +1 -1
  246. package/dist/src/planner/scopes/base.js +0 -14
  247. package/dist/src/planner/scopes/base.js.map +1 -1
  248. package/dist/src/planner/scopes/empty.d.ts +0 -2
  249. package/dist/src/planner/scopes/empty.d.ts.map +1 -1
  250. package/dist/src/planner/scopes/empty.js +0 -8
  251. package/dist/src/planner/scopes/empty.js.map +1 -1
  252. package/dist/src/planner/scopes/multi.d.ts.map +1 -1
  253. package/dist/src/planner/scopes/multi.js +0 -1
  254. package/dist/src/planner/scopes/multi.js.map +1 -1
  255. package/dist/src/planner/scopes/param.d.ts.map +1 -1
  256. package/dist/src/planner/scopes/param.js +0 -1
  257. package/dist/src/planner/scopes/param.js.map +1 -1
  258. package/dist/src/planner/scopes/registered.d.ts +0 -10
  259. package/dist/src/planner/scopes/registered.d.ts.map +1 -1
  260. package/dist/src/planner/scopes/registered.js +1 -17
  261. package/dist/src/planner/scopes/registered.js.map +1 -1
  262. package/dist/src/planner/scopes/scope.d.ts +0 -8
  263. package/dist/src/planner/scopes/scope.d.ts.map +1 -1
  264. package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
  265. package/dist/src/planner/validation/plan-validator.js +1 -7
  266. package/dist/src/planner/validation/plan-validator.js.map +1 -1
  267. package/dist/src/runtime/context-helpers.d.ts +45 -0
  268. package/dist/src/runtime/context-helpers.d.ts.map +1 -0
  269. package/dist/src/runtime/context-helpers.js +139 -0
  270. package/dist/src/runtime/context-helpers.js.map +1 -0
  271. package/dist/src/runtime/emission-context.d.ts +1 -0
  272. package/dist/src/runtime/emission-context.d.ts.map +1 -1
  273. package/dist/src/runtime/emission-context.js +2 -1
  274. package/dist/src/runtime/emission-context.js.map +1 -1
  275. package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
  276. package/dist/src/runtime/emit/aggregate.js +119 -86
  277. package/dist/src/runtime/emit/aggregate.js.map +1 -1
  278. package/dist/src/runtime/emit/between.d.ts +5 -0
  279. package/dist/src/runtime/emit/between.d.ts.map +1 -0
  280. package/dist/src/runtime/emit/between.js +38 -0
  281. package/dist/src/runtime/emit/between.js.map +1 -0
  282. package/dist/src/runtime/emit/binary.d.ts +0 -1
  283. package/dist/src/runtime/emit/binary.d.ts.map +1 -1
  284. package/dist/src/runtime/emit/binary.js +0 -36
  285. package/dist/src/runtime/emit/binary.js.map +1 -1
  286. package/dist/src/runtime/emit/column-reference.d.ts.map +1 -1
  287. package/dist/src/runtime/emit/column-reference.js +2 -26
  288. package/dist/src/runtime/emit/column-reference.js.map +1 -1
  289. package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
  290. package/dist/src/runtime/emit/constraint-check.js +16 -123
  291. package/dist/src/runtime/emit/constraint-check.js.map +1 -1
  292. package/dist/src/runtime/emit/cte-reference.d.ts.map +1 -1
  293. package/dist/src/runtime/emit/cte-reference.js +16 -48
  294. package/dist/src/runtime/emit/cte-reference.js.map +1 -1
  295. package/dist/src/runtime/emit/distinct.d.ts.map +1 -1
  296. package/dist/src/runtime/emit/distinct.js +2 -8
  297. package/dist/src/runtime/emit/distinct.js.map +1 -1
  298. package/dist/src/runtime/emit/filter.d.ts.map +1 -1
  299. package/dist/src/runtime/emit/filter.js +6 -13
  300. package/dist/src/runtime/emit/filter.js.map +1 -1
  301. package/dist/src/runtime/emit/internal-recursive-cte-ref.d.ts +5 -0
  302. package/dist/src/runtime/emit/internal-recursive-cte-ref.d.ts.map +1 -0
  303. package/dist/src/runtime/emit/internal-recursive-cte-ref.js +23 -0
  304. package/dist/src/runtime/emit/internal-recursive-cte-ref.js.map +1 -0
  305. package/dist/src/runtime/emit/join.d.ts.map +1 -1
  306. package/dist/src/runtime/emit/join.js +40 -40
  307. package/dist/src/runtime/emit/join.js.map +1 -1
  308. package/dist/src/runtime/emit/project.d.ts.map +1 -1
  309. package/dist/src/runtime/emit/project.js +13 -13
  310. package/dist/src/runtime/emit/project.js.map +1 -1
  311. package/dist/src/runtime/emit/recursive-cte.d.ts.map +1 -1
  312. package/dist/src/runtime/emit/recursive-cte.js +3 -14
  313. package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
  314. package/dist/src/runtime/emit/returning.d.ts.map +1 -1
  315. package/dist/src/runtime/emit/returning.js +7 -14
  316. package/dist/src/runtime/emit/returning.js.map +1 -1
  317. package/dist/src/runtime/emit/scan.d.ts +5 -2
  318. package/dist/src/runtime/emit/scan.d.ts.map +1 -1
  319. package/dist/src/runtime/emit/scan.js +21 -17
  320. package/dist/src/runtime/emit/scan.js.map +1 -1
  321. package/dist/src/runtime/emit/sort.d.ts.map +1 -1
  322. package/dist/src/runtime/emit/sort.js +8 -11
  323. package/dist/src/runtime/emit/sort.js.map +1 -1
  324. package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
  325. package/dist/src/runtime/emit/subquery.js +95 -40
  326. package/dist/src/runtime/emit/subquery.js.map +1 -1
  327. package/dist/src/runtime/emit/table-valued-function.d.ts.map +1 -1
  328. package/dist/src/runtime/emit/table-valued-function.js +7 -22
  329. package/dist/src/runtime/emit/table-valued-function.js.map +1 -1
  330. package/dist/src/runtime/emit/update.d.ts.map +1 -1
  331. package/dist/src/runtime/emit/update.js +20 -27
  332. package/dist/src/runtime/emit/update.js.map +1 -1
  333. package/dist/src/runtime/emit/window.d.ts.map +1 -1
  334. package/dist/src/runtime/emit/window.js +55 -83
  335. package/dist/src/runtime/emit/window.js.map +1 -1
  336. package/dist/src/runtime/emitters.d.ts.map +1 -1
  337. package/dist/src/runtime/emitters.js +49 -1
  338. package/dist/src/runtime/emitters.js.map +1 -1
  339. package/dist/src/runtime/register.d.ts.map +1 -1
  340. package/dist/src/runtime/register.js +5 -4
  341. package/dist/src/runtime/register.js.map +1 -1
  342. package/dist/src/runtime/scheduler.d.ts.map +1 -1
  343. package/dist/src/runtime/scheduler.js +47 -42
  344. package/dist/src/runtime/scheduler.js.map +1 -1
  345. package/dist/src/runtime/types.d.ts +34 -0
  346. package/dist/src/runtime/types.d.ts.map +1 -1
  347. package/dist/src/runtime/types.js +21 -0
  348. package/dist/src/runtime/types.js.map +1 -1
  349. package/dist/src/schema/manager.d.ts.map +1 -1
  350. package/dist/src/schema/manager.js +29 -16
  351. package/dist/src/schema/manager.js.map +1 -1
  352. package/dist/src/schema/table.d.ts +4 -4
  353. package/dist/src/schema/table.d.ts.map +1 -1
  354. package/dist/src/schema/table.js +10 -10
  355. package/dist/src/schema/table.js.map +1 -1
  356. package/dist/src/util/plugin-loader.d.ts +10 -1
  357. package/dist/src/util/plugin-loader.d.ts.map +1 -1
  358. package/dist/src/util/plugin-loader.js +56 -1
  359. package/dist/src/util/plugin-loader.js.map +1 -1
  360. package/dist/src/util/working-table-iterable.d.ts.map +1 -1
  361. package/dist/src/util/working-table-iterable.js +8 -8
  362. package/dist/src/util/working-table-iterable.js.map +1 -1
  363. package/dist/src/vtab/manifest.d.ts +36 -0
  364. package/dist/src/vtab/manifest.d.ts.map +1 -1
  365. package/dist/src/vtab/table.d.ts +1 -1
  366. package/dist/src/vtab/table.d.ts.map +1 -1
  367. package/package.json +8 -3
  368. package/src/common/types.ts +1 -0
  369. package/src/core/database.ts +48 -6
  370. package/src/core/statement.ts +1 -49
  371. package/src/func/builtins/explain.ts +0 -11
  372. package/src/index.ts +39 -5
  373. package/src/parser/ast.ts +12 -6
  374. package/src/parser/parser.ts +45 -52
  375. package/src/planner/analysis/const-pass.ts +281 -270
  376. package/src/planner/building/constraint-builder.ts +114 -0
  377. package/src/planner/building/delete.ts +18 -5
  378. package/src/planner/building/expression.ts +35 -7
  379. package/src/planner/building/insert.ts +16 -3
  380. package/src/planner/building/select-aggregates.ts +57 -11
  381. package/src/planner/building/select-context.ts +22 -12
  382. package/src/planner/building/select-modifiers.ts +35 -21
  383. package/src/planner/building/select-projections.ts +25 -26
  384. package/src/planner/building/select-window.ts +14 -9
  385. package/src/planner/building/select.ts +163 -31
  386. package/src/planner/building/table.ts +1 -40
  387. package/src/planner/building/update.ts +22 -7
  388. package/src/planner/building/with.ts +12 -13
  389. package/src/planner/cache/correlation-detector.ts +83 -0
  390. package/src/planner/cache/materialization-advisory.ts +71 -50
  391. package/src/planner/cache/reference-graph.ts +115 -91
  392. package/src/planner/debug.ts +163 -0
  393. package/src/planner/framework/context.ts +36 -2
  394. package/src/planner/framework/registry.ts +261 -274
  395. package/src/planner/nodes/add-constraint-node.ts +5 -1
  396. package/src/planner/nodes/aggregate-node.ts +6 -4
  397. package/src/planner/nodes/cache-node.ts +2 -2
  398. package/src/planner/nodes/constraint-check-node.ts +49 -15
  399. package/src/planner/nodes/create-index-node.ts +5 -1
  400. package/src/planner/nodes/create-table-node.ts +5 -1
  401. package/src/planner/nodes/create-view-node.ts +5 -1
  402. package/src/planner/nodes/cte-node.ts +45 -14
  403. package/src/planner/nodes/cte-reference-node.ts +49 -13
  404. package/src/planner/nodes/delete-node.ts +31 -7
  405. package/src/planner/nodes/distinct-node.ts +2 -2
  406. package/src/planner/nodes/dml-executor-node.ts +3 -3
  407. package/src/planner/nodes/drop-table-node.ts +5 -1
  408. package/src/planner/nodes/drop-view-node.ts +5 -1
  409. package/src/planner/nodes/filter.ts +3 -3
  410. package/src/planner/nodes/function.ts +93 -93
  411. package/src/planner/nodes/insert-node.ts +28 -5
  412. package/src/planner/nodes/internal-recursive-cte-ref-node.ts +76 -0
  413. package/src/planner/nodes/join-node.ts +3 -3
  414. package/src/planner/nodes/limit-offset.ts +2 -2
  415. package/src/planner/nodes/plan-node-type.ts +1 -1
  416. package/src/planner/nodes/plan-node.ts +39 -2
  417. package/src/planner/nodes/project-node.ts +39 -19
  418. package/src/planner/nodes/recursive-cte-node.ts +37 -9
  419. package/src/planner/nodes/reference.ts +4 -2
  420. package/src/planner/nodes/returning-node.ts +25 -13
  421. package/src/planner/nodes/scalar.ts +95 -11
  422. package/src/planner/nodes/sequencing-node.ts +2 -2
  423. package/src/planner/nodes/set-operation-node.ts +3 -3
  424. package/src/planner/nodes/single-row.ts +7 -2
  425. package/src/planner/nodes/sink-node.ts +5 -5
  426. package/src/planner/nodes/sort.ts +2 -2
  427. package/src/planner/nodes/stream-aggregate.ts +76 -12
  428. package/src/planner/nodes/subquery.ts +90 -27
  429. package/src/planner/nodes/{physical-access-nodes.ts → table-access-nodes.ts} +6 -6
  430. package/src/planner/nodes/update-node.ts +31 -13
  431. package/src/planner/nodes/window-node.ts +28 -22
  432. package/src/planner/optimizer.ts +257 -263
  433. package/src/planner/planning-context.ts +15 -0
  434. package/src/planner/rules/access/rule-select-access-path.ts +68 -64
  435. package/src/planner/rules/aggregate/rule-aggregate-streaming.ts +74 -2
  436. package/src/planner/rules/cache/rule-materialization-advisory.ts +31 -27
  437. package/src/planner/scopes/base.ts +0 -17
  438. package/src/planner/scopes/empty.ts +0 -10
  439. package/src/planner/scopes/multi.ts +0 -1
  440. package/src/planner/scopes/param.ts +0 -1
  441. package/src/planner/scopes/registered.ts +1 -20
  442. package/src/planner/scopes/scope.ts +0 -12
  443. package/src/planner/validation/plan-validator.ts +1 -8
  444. package/src/runtime/context-helpers.ts +191 -0
  445. package/src/runtime/emission-context.ts +5 -2
  446. package/src/runtime/emit/aggregate.ts +131 -85
  447. package/src/runtime/emit/between.ts +51 -0
  448. package/src/runtime/emit/binary.ts +0 -46
  449. package/src/runtime/emit/column-reference.ts +3 -36
  450. package/src/runtime/emit/constraint-check.ts +19 -144
  451. package/src/runtime/emit/cte-reference.ts +23 -60
  452. package/src/runtime/emit/distinct.ts +2 -7
  453. package/src/runtime/emit/filter.ts +6 -13
  454. package/src/runtime/emit/internal-recursive-cte-ref.ts +37 -0
  455. package/src/runtime/emit/join.ts +45 -43
  456. package/src/runtime/emit/project.ts +18 -12
  457. package/src/runtime/emit/recursive-cte.ts +3 -12
  458. package/src/runtime/emit/returning.ts +7 -14
  459. package/src/runtime/emit/scan.ts +25 -23
  460. package/src/runtime/emit/sort.ts +8 -11
  461. package/src/runtime/emit/subquery.ts +108 -48
  462. package/src/runtime/emit/table-valued-function.ts +7 -20
  463. package/src/runtime/emit/update.ts +22 -29
  464. package/src/runtime/emit/window.ts +74 -88
  465. package/src/runtime/emitters.ts +52 -1
  466. package/src/runtime/register.ts +5 -4
  467. package/src/runtime/scheduler.ts +54 -54
  468. package/src/runtime/types.ts +45 -0
  469. package/src/schema/manager.ts +34 -19
  470. package/src/schema/table.ts +8 -8
  471. package/src/util/plugin-loader.ts +78 -4
  472. package/src/util/working-table-iterable.ts +15 -7
  473. package/src/vtab/manifest.ts +42 -0
  474. package/src/vtab/table.ts +1 -1
  475. package/src/planner/nodes/scan.ts +0 -103
  476. package/src/planner/rules/physical/rule-mark-physical.ts +0 -37
  477. package/src/runtime/emit/table-reference.ts +0 -92
@@ -1,5 +1,5 @@
1
1
  import { PlanNodeType } from './plan-node-type.js';
2
- import { PlanNode, type RelationalPlanNode, type ScalarPlanNode, type UnaryRelationalNode, type Attribute } from './plan-node.js';
2
+ import { PlanNode, type RelationalPlanNode, type ScalarPlanNode, type UnaryRelationalNode, type Attribute, isRelationalNode } from './plan-node.js';
3
3
  import type { RelationType } from '../../common/datatype.js';
4
4
  import type { Scope } from '../scopes/scope.js';
5
5
  import { Cached } from '../../util/cached.js';
@@ -95,7 +95,8 @@ export class AggregateNode extends PlanNode implements UnaryRelationalNode {
95
95
  id: PlanNode.nextAttrId(),
96
96
  name,
97
97
  type: expr.getType(),
98
- sourceRelation: `${this.nodeType}:${this.id}`
98
+ sourceRelation: `${this.nodeType}:${this.id}`,
99
+ relationName: 'aggregate' // AggregateNode creates new relation context
99
100
  });
100
101
  });
101
102
 
@@ -105,7 +106,8 @@ export class AggregateNode extends PlanNode implements UnaryRelationalNode {
105
106
  id: PlanNode.nextAttrId(),
106
107
  name: agg.alias,
107
108
  type: agg.expression.getType(),
108
- sourceRelation: `${this.nodeType}:${this.id}`
109
+ sourceRelation: `${this.nodeType}:${this.id}`,
110
+ relationName: 'aggregate' // AggregateNode creates new relation context
109
111
  });
110
112
  });
111
113
 
@@ -139,7 +141,7 @@ export class AggregateNode extends PlanNode implements UnaryRelationalNode {
139
141
  const newAggregateExpressions = restChildren.slice(this.groupBy.length);
140
142
 
141
143
  // Type check
142
- if (!('getAttributes' in newSource) || typeof (newSource as any).getAttributes !== 'function') {
144
+ if (!isRelationalNode(newSource)) {
143
145
  quereusError('AggregateNode: first child must be a RelationalPlanNode', StatusCode.INTERNAL);
144
146
  }
145
147
 
@@ -1,5 +1,5 @@
1
1
  import { PlanNodeType } from './plan-node-type.js';
2
- import { PlanNode, type RelationalPlanNode, type UnaryRelationalNode, type Attribute } from './plan-node.js';
2
+ import { PlanNode, type RelationalPlanNode, type UnaryRelationalNode, type Attribute, isRelationalNode } from './plan-node.js';
3
3
  import type { RelationType } from '../../common/datatype.js';
4
4
  import type { Scope } from '../scopes/scope.js';
5
5
  import { StatusCode } from '../../common/types.js';
@@ -58,7 +58,7 @@ export class CacheNode extends PlanNode implements UnaryRelationalNode {
58
58
  const [newSource] = newChildren;
59
59
 
60
60
  // Type check
61
- if (!('getAttributes' in newSource) || typeof (newSource as any).getAttributes !== 'function') {
61
+ if (!isRelationalNode(newSource)) {
62
62
  quereusError('CacheNode: child must be a RelationalPlanNode', StatusCode.INTERNAL);
63
63
  }
64
64
 
@@ -1,9 +1,15 @@
1
1
  import type { Scope } from '../scopes/scope.js';
2
- import { PlanNode, type RelationalPlanNode, type Attribute, type RowDescriptor } from './plan-node.js';
2
+ import { PlanNode, type RelationalPlanNode, type Attribute, type RowDescriptor, type ScalarPlanNode, isRelationalNode } from './plan-node.js';
3
3
  import { PlanNodeType } from './plan-node-type.js';
4
4
  import type { TableReferenceNode } from './reference.js';
5
5
  import type { RelationType } from '../../common/datatype.js';
6
- import type { RowOp } from '../../schema/table.js';
6
+ import type { RowOpFlag } from '../../schema/table.js';
7
+ import type { RowConstraintSchema } from '../../schema/table.js';
8
+
9
+ export interface ConstraintCheck {
10
+ constraint: RowConstraintSchema; // The constraint metadata
11
+ expression: ScalarPlanNode; // Pre-built expression node
12
+ }
7
13
 
8
14
  /**
9
15
  * Represents constraint checking for DML operations.
@@ -16,9 +22,11 @@ export class ConstraintCheckNode extends PlanNode implements RelationalPlanNode
16
22
  scope: Scope,
17
23
  public readonly source: RelationalPlanNode,
18
24
  public readonly table: TableReferenceNode,
19
- public readonly operation: RowOp,
20
- public readonly oldRowDescriptor?: RowDescriptor,
21
- public readonly newRowDescriptor?: RowDescriptor,
25
+ public readonly operation: RowOpFlag,
26
+ public readonly oldRowDescriptor: RowDescriptor | undefined,
27
+ public readonly newRowDescriptor: RowDescriptor | undefined,
28
+ public readonly flatRowDescriptor: RowDescriptor,
29
+ public readonly constraintChecks: ConstraintCheck[]
22
30
  ) {
23
31
  super(scope);
24
32
  }
@@ -37,26 +45,47 @@ export class ConstraintCheckNode extends PlanNode implements RelationalPlanNode
37
45
  }
38
46
 
39
47
  getChildren(): readonly PlanNode[] {
40
- return [this.source];
48
+ const children: PlanNode[] = [this.source];
49
+ // Add all constraint expression nodes as children so optimizer can see them
50
+ this.constraintChecks.forEach(check => {
51
+ children.push(check.expression);
52
+ });
53
+ return children;
41
54
  }
42
55
 
43
56
  withChildren(newChildren: readonly PlanNode[]): PlanNode {
44
- if (newChildren.length !== 1) {
45
- throw new Error(`ConstraintCheckNode expects 1 child, got ${newChildren.length}`);
57
+ const expectedChildren = 1 + this.constraintChecks.length;
58
+ if (newChildren.length !== expectedChildren) {
59
+ throw new Error(`ConstraintCheckNode expects ${expectedChildren} children, got ${newChildren.length}`);
46
60
  }
47
61
 
48
- const [newSource] = newChildren;
62
+ const [newSource, ...newConstraintExprs] = newChildren;
49
63
 
50
- // Type check
51
- if (!('getAttributes' in newSource) || typeof (newSource as any).getAttributes !== 'function') {
52
- throw new Error('ConstraintCheckNode: child must be a RelationalPlanNode');
64
+ // Type check the source
65
+ if (!isRelationalNode(newSource)) {
66
+ throw new Error('ConstraintCheckNode: first child must be a RelationalPlanNode');
67
+ }
68
+
69
+ // Type check constraint expressions
70
+ for (let i = 0; i < newConstraintExprs.length; i++) {
71
+ const expr = newConstraintExprs[i];
72
+ if (!('getType' in expr) || typeof (expr as any).getType !== 'function') {
73
+ throw new Error(`ConstraintCheckNode: constraint child ${i + 1} must be a ScalarPlanNode`);
74
+ }
53
75
  }
54
76
 
55
77
  // Return same instance if nothing changed
56
- if (newSource === this.source) {
78
+ if (newSource === this.source &&
79
+ newConstraintExprs.every((expr, i) => expr === this.constraintChecks[i].expression)) {
57
80
  return this;
58
81
  }
59
82
 
83
+ // Rebuild constraint checks with new expressions
84
+ const newConstraintChecks = this.constraintChecks.map((check, i) => ({
85
+ ...check,
86
+ expression: newConstraintExprs[i] as ScalarPlanNode
87
+ }));
88
+
60
89
  // Create new instance
61
90
  return new ConstraintCheckNode(
62
91
  this.scope,
@@ -64,7 +93,9 @@ export class ConstraintCheckNode extends PlanNode implements RelationalPlanNode
64
93
  this.table,
65
94
  this.operation,
66
95
  this.oldRowDescriptor,
67
- this.newRowDescriptor
96
+ this.newRowDescriptor,
97
+ this.flatRowDescriptor,
98
+ newConstraintChecks
68
99
  );
69
100
  }
70
101
 
@@ -76,7 +107,8 @@ export class ConstraintCheckNode extends PlanNode implements RelationalPlanNode
76
107
  const opName = this.operation === 1 ? 'INSERT' :
77
108
  this.operation === 2 ? 'UPDATE' :
78
109
  this.operation === 4 ? 'DELETE' : 'UNKNOWN';
79
- return `CHECK CONSTRAINTS ON ${opName}`;
110
+ const constraintCount = this.constraintChecks.length;
111
+ return `CHECK ${constraintCount} CONSTRAINTS ON ${opName}`;
80
112
  }
81
113
 
82
114
  override getLogicalAttributes(): Record<string, unknown> {
@@ -88,6 +120,8 @@ export class ConstraintCheckNode extends PlanNode implements RelationalPlanNode
88
120
  table: this.table.tableSchema.name,
89
121
  schema: this.table.tableSchema.schemaName,
90
122
  operation: opName,
123
+ constraintCount: this.constraintChecks.length,
124
+ constraintNames: this.constraintChecks.map(c => c.constraint.name || '_unnamed'),
91
125
  hasOldDescriptor: !!this.oldRowDescriptor,
92
126
  hasNewDescriptor: !!this.newRowDescriptor,
93
127
  };
@@ -1,6 +1,6 @@
1
1
  import type * as AST from '../../parser/ast.js';
2
2
  import type { Scope } from '../scopes/scope.js';
3
- import { VoidNode } from './plan-node.js';
3
+ import { PhysicalProperties, VoidNode } from './plan-node.js';
4
4
  import { PlanNodeType } from './plan-node-type.js';
5
5
  import { expressionToString } from '../../util/ast-stringify.js';
6
6
 
@@ -34,4 +34,8 @@ export class CreateIndexNode extends VoidNode {
34
34
  statement: expressionToString(this.statementAst as any) // Convert AST to string
35
35
  };
36
36
  }
37
+
38
+ override computePhysical(_children: readonly PhysicalProperties[]): Partial<PhysicalProperties> {
39
+ return { readonly: false };
40
+ }
37
41
  }
@@ -1,6 +1,6 @@
1
1
  import type * as AST from '../../parser/ast.js';
2
2
  import type { Scope } from '../scopes/scope.js';
3
- import { VoidNode } from './plan-node.js';
3
+ import { PhysicalProperties, VoidNode } from './plan-node.js';
4
4
  import { PlanNodeType } from './plan-node-type.js';
5
5
  import { expressionToString } from '../../util/ast-stringify.js';
6
6
 
@@ -28,4 +28,8 @@ export class CreateTableNode extends VoidNode {
28
28
  statement: expressionToString(this.statementAst as any) // Convert AST to string
29
29
  };
30
30
  }
31
+
32
+ override computePhysical(_children: readonly PhysicalProperties[]): Partial<PhysicalProperties> {
33
+ return { readonly: false };
34
+ }
31
35
  }
@@ -1,5 +1,5 @@
1
1
  import type * as AST from '../../parser/ast.js';
2
- import { VoidNode } from './plan-node.js';
2
+ import { PhysicalProperties, VoidNode } from './plan-node.js';
3
3
  import { PlanNodeType } from './plan-node-type.js';
4
4
  import type { Scope } from '../scopes/scope.js';
5
5
 
@@ -37,4 +37,8 @@ export class CreateViewNode extends VoidNode {
37
37
  selectSql: this.sql
38
38
  };
39
39
  }
40
+
41
+ override computePhysical(_children: readonly PhysicalProperties[]): Partial<PhysicalProperties> {
42
+ return { readonly: false };
43
+ }
40
44
  }
@@ -1,4 +1,4 @@
1
- import { PlanNode, type UnaryRelationalNode, type RelationalPlanNode, type Attribute, type TableDescriptor } from './plan-node.js';
1
+ import { PlanNode, type UnaryRelationalNode, type RelationalPlanNode, type Attribute, type TableDescriptor, isRelationalNode } from './plan-node.js';
2
2
  import type { RelationType } from '../../common/datatype.js';
3
3
  import { PlanNodeType } from './plan-node-type.js';
4
4
  import type { Scope } from '../scopes/scope.js';
@@ -41,17 +41,27 @@ export class CTENode extends PlanNode implements CTEPlanNode {
41
41
 
42
42
  private buildAttributes(): Attribute[] {
43
43
  const queryAttributes = this.source.getAttributes();
44
-
45
- // Use explicit column names if provided, otherwise use query output column names
46
44
  const queryType = this.source.getType();
47
45
  const columnNames = this.columns || queryType.columns.map((c: any) => c.name);
48
46
 
49
- return queryAttributes.map((attr: any, index: number) => ({
50
- id: PlanNode.nextAttrId(),
51
- name: columnNames[index] || attr.name,
52
- type: attr.type,
53
- sourceRelation: `cte:${this.cteName}`
54
- }));
47
+ return columnNames.map((name: string) => {
48
+ const srcAttr = queryAttributes.find(a => a.name.toLowerCase() === name.toLowerCase());
49
+ let resolvedType: any = srcAttr?.type;
50
+ if (!resolvedType) {
51
+ const colMeta = queryType.columns.find((c: any) => c.name.toLowerCase() === name.toLowerCase());
52
+ resolvedType = colMeta?.type;
53
+ }
54
+ // Fallback: generic TEXT scalar if nothing else is available (should not normally happen)
55
+ if (!resolvedType) {
56
+ resolvedType = { typeClass: 'scalar', affinity: 'TEXT', nullable: true, isReadOnly: false } as any;
57
+ }
58
+ return {
59
+ id: srcAttr?.id ?? PlanNode.nextAttrId(),
60
+ name,
61
+ type: resolvedType,
62
+ sourceRelation: `cte:${this.cteName}`
63
+ };
64
+ });
55
65
  }
56
66
 
57
67
  private buildType(): RelationType {
@@ -77,8 +87,8 @@ export class CTENode extends PlanNode implements CTEPlanNode {
77
87
  return this.typeCache.value;
78
88
  }
79
89
 
80
- getChildren(): readonly [] {
81
- return [];
90
+ getChildren(): readonly [RelationalPlanNode] {
91
+ return [this.source];
82
92
  }
83
93
 
84
94
  getRelations(): readonly [RelationalPlanNode] {
@@ -86,10 +96,31 @@ export class CTENode extends PlanNode implements CTEPlanNode {
86
96
  }
87
97
 
88
98
  withChildren(newChildren: readonly PlanNode[]): PlanNode {
89
- if (newChildren.length !== 0) {
90
- throw new Error(`CTENode expects 0 children, got ${newChildren.length}`);
99
+ if (newChildren.length !== 1) {
100
+ throw new Error(`CTENode expects 1 child, got ${newChildren.length}`);
101
+ }
102
+
103
+ const [newSource] = newChildren;
104
+
105
+ // Type check
106
+ if (!isRelationalNode(newSource)) {
107
+ throw new Error('CTENode: child must be a RelationalPlanNode');
108
+ }
109
+
110
+ // Return same instance if nothing changed
111
+ if (newSource === this.source) {
112
+ return this;
91
113
  }
92
- return this; // No children in getChildren(), source is accessed via getRelations()
114
+
115
+ // Create new instance with updated source
116
+ return new CTENode(
117
+ this.scope,
118
+ this.cteName,
119
+ this.columns,
120
+ newSource as RelationalPlanNode,
121
+ this.materializationHint,
122
+ this.isRecursive
123
+ );
93
124
  }
94
125
 
95
126
  override toString(): string {
@@ -1,4 +1,4 @@
1
- import { PlanNode, type UnaryRelationalNode, type RelationalPlanNode, type Attribute } from './plan-node.js';
1
+ import { PlanNode, type RelationalPlanNode, type Attribute } from './plan-node.js';
2
2
  import type { RelationType } from '../../common/datatype.js';
3
3
  import { PlanNodeType } from './plan-node-type.js';
4
4
  import type { Scope } from '../scopes/scope.js';
@@ -9,30 +9,46 @@ import { Cached } from '../../util/cached.js';
9
9
  * Plan node for referencing a CTE in a FROM clause.
10
10
  * This points to a materialized CTE result.
11
11
  */
12
- export class CTEReferenceNode extends PlanNode implements UnaryRelationalNode {
12
+ export class CTEReferenceNode extends PlanNode implements RelationalPlanNode {
13
13
  readonly nodeType = PlanNodeType.CTEReference;
14
+ private static nextRefId = 1;
15
+ public readonly referenceId: number;
14
16
 
17
+ // Cache of attributes to avoid regenerating new IDs on each plan rewrite
15
18
  private attributesCache: Cached<Attribute[]>;
16
19
  private typeCache: Cached<RelationType>;
17
20
 
18
21
  constructor(
19
22
  scope: Scope,
20
23
  public readonly source: CTEPlanNode,
21
- public readonly alias?: string
24
+ public readonly alias?: string,
25
+ /**
26
+ * Optionally provide an attribute list to preserve attribute IDs across
27
+ * plan rewrites (e.g. when `withChildren` creates a new instance). When
28
+ * omitted, a fresh list will be generated the first time it is requested.
29
+ */
30
+ private readonly existingAttributes?: Attribute[]
22
31
  ) {
23
32
  super(scope, 5); // Low cost since CTEs are materialized
24
- this.attributesCache = new Cached(() => this.buildAttributes());
33
+ this.referenceId = CTEReferenceNode.nextRefId++;
34
+ this.attributesCache = new Cached(() => this.existingAttributes ?? this.buildAttributes());
25
35
  this.typeCache = new Cached(() => this.buildType());
26
36
  }
27
37
 
28
38
  private buildAttributes(): Attribute[] {
29
- // Preserve original attribute IDs from the CTE to ensure proper context resolution
30
- // especially important for recursive CTEs where working table substitution occurs
39
+ // CRITICAL: Always create fresh attribute IDs for each CTE reference instance.
40
+ // Since we now cache CTEReferenceNode instances per alias in buildFrom(),
41
+ // each alias gets its own unique set of attribute IDs that remain consistent
42
+ // throughout the planning and execution phases.
43
+ const relationName = this.alias || this.source.cteName;
44
+ // Only use fresh IDs when we have an alias that differs from the CTE name
45
+ const useFreshIds = this.alias !== undefined && this.alias.toLowerCase() !== this.source.cteName.toLowerCase();
31
46
  return this.source.getAttributes().map((attr: any) => ({
32
- id: attr.id, // Preserve original ID instead of creating new one
47
+ id: useFreshIds ? PlanNode.nextAttrId() : attr.id,
33
48
  name: attr.name,
34
49
  type: attr.type,
35
- sourceRelation: `cte_ref:${this.source.cteName}`
50
+ sourceRelation: `cte_ref:${this.source.cteName}`,
51
+ relationName
36
52
  }));
37
53
  }
38
54
 
@@ -59,8 +75,8 @@ export class CTEReferenceNode extends PlanNode implements UnaryRelationalNode {
59
75
  return this.typeCache.value;
60
76
  }
61
77
 
62
- getChildren(): readonly [] {
63
- return [];
78
+ getChildren(): readonly [CTEPlanNode] {
79
+ return [this.source];
64
80
  }
65
81
 
66
82
  getRelations(): readonly [RelationalPlanNode] {
@@ -68,10 +84,30 @@ export class CTEReferenceNode extends PlanNode implements UnaryRelationalNode {
68
84
  }
69
85
 
70
86
  withChildren(newChildren: readonly PlanNode[]): PlanNode {
71
- if (newChildren.length !== 0) {
72
- throw new Error(`CTEReferenceNode expects 0 children, got ${newChildren.length}`);
87
+ if (newChildren.length !== 1) {
88
+ throw new Error(`CTEReferenceNode expects 1 child, got ${newChildren.length}`);
89
+ }
90
+
91
+ const [newSource] = newChildren;
92
+
93
+ // Type check
94
+ if (newSource.nodeType !== PlanNodeType.CTE && newSource.nodeType !== PlanNodeType.RecursiveCTE) {
95
+ throw new Error(`CTEReferenceNode: child (${newSource.nodeType}) must be a CTEPlanNode`);
73
96
  }
74
- return this; // No children in getChildren(), source is accessed via getRelations()
97
+
98
+ // Return same instance if nothing changed
99
+ if (newSource === this.source) {
100
+ return this;
101
+ }
102
+
103
+ // Create new instance with updated source
104
+ return new CTEReferenceNode(
105
+ this.scope,
106
+ newSource as CTEPlanNode,
107
+ this.alias,
108
+ // Preserve the original attribute list so IDs remain stable across rewrites
109
+ this.getAttributes()
110
+ );
75
111
  }
76
112
 
77
113
  override toString(): string {
@@ -1,5 +1,5 @@
1
1
  import type { Scope } from '../scopes/scope.js';
2
- import { PlanNode, type RelationalPlanNode, type Attribute, type RowDescriptor } from './plan-node.js';
2
+ import { PlanNode, type RelationalPlanNode, type Attribute, type RowDescriptor, type PhysicalProperties, isRelationalNode } from './plan-node.js';
3
3
  import { PlanNodeType } from './plan-node-type.js';
4
4
  import type { TableReferenceNode } from './reference.js';
5
5
  import type { RelationType } from '../../common/datatype.js';
@@ -14,7 +14,7 @@ export class DeleteNode extends PlanNode implements RelationalPlanNode {
14
14
  constructor(
15
15
  scope: Scope,
16
16
  public readonly table: TableReferenceNode,
17
- public readonly source: RelationalPlanNode, // Typically a FilterNode wrapping a TableScanNode
17
+ public readonly source: RelationalPlanNode, // Typically a FilterNode wrapping a TableReferenceNode
18
18
  public readonly oldRowDescriptor?: RowDescriptor, // For constraint checking
19
19
  public readonly flatRowDescriptor?: RowDescriptor,
20
20
  ) {
@@ -38,15 +38,39 @@ export class DeleteNode extends PlanNode implements RelationalPlanNode {
38
38
  return [this.source, this.table];
39
39
  }
40
40
 
41
- getChildren(): readonly [] {
42
- return [];
41
+ getChildren(): readonly PlanNode[] {
42
+ // Return the source relation as a child so optimizer can traverse it
43
+ return [this.source];
43
44
  }
44
45
 
45
46
  withChildren(newChildren: readonly PlanNode[]): PlanNode {
46
- if (newChildren.length !== 0) {
47
- throw new Error(`DeleteNode expects 0 children, got ${newChildren.length}`);
47
+ if (newChildren.length !== 1) {
48
+ throw new Error(`DeleteNode expects 1 child (source), got ${newChildren.length}`);
48
49
  }
49
- return this; // No children in getChildren(), source is accessed via getRelations()
50
+
51
+ const newSource = newChildren[0] as RelationalPlanNode;
52
+ if (!isRelationalNode(newSource)) {
53
+ throw new Error('DeleteNode: child must be a RelationalPlanNode');
54
+ }
55
+
56
+ if (newSource === this.source) {
57
+ return this;
58
+ }
59
+
60
+ return new DeleteNode(
61
+ this.scope,
62
+ this.table,
63
+ newSource,
64
+ this.oldRowDescriptor,
65
+ this.flatRowDescriptor
66
+ );
67
+ }
68
+
69
+ computePhysical(): Partial<PhysicalProperties> {
70
+ return {
71
+ readonly: false, // DELETE has side effects
72
+ estimatedRows: this.source.estimatedRows
73
+ };
50
74
  }
51
75
 
52
76
  get estimatedRows(): number | undefined {
@@ -1,5 +1,5 @@
1
1
  import { PlanNodeType } from './plan-node-type.js';
2
- import { PlanNode, type RelationalPlanNode, type UnaryRelationalNode, type Attribute } from './plan-node.js';
2
+ import { PlanNode, type RelationalPlanNode, type UnaryRelationalNode, type Attribute, isRelationalNode } from './plan-node.js';
3
3
  import type { RelationType } from '../../common/datatype.js';
4
4
  import type { Scope } from '../scopes/scope.js';
5
5
  import { quereusError } from '../../common/errors.js';
@@ -75,7 +75,7 @@ export class DistinctNode extends PlanNode implements UnaryRelationalNode {
75
75
  const [newSource] = newChildren;
76
76
 
77
77
  // Type check
78
- if (!('getAttributes' in newSource) || typeof (newSource as any).getAttributes !== 'function') {
78
+ if (!isRelationalNode(newSource)) {
79
79
  quereusError('DistinctNode: child must be a RelationalPlanNode', StatusCode.INTERNAL);
80
80
  }
81
81
 
@@ -1,10 +1,10 @@
1
1
  import type { Scope } from '../scopes/scope.js';
2
- import { PlanNode, type RelationalPlanNode, type Attribute, type PhysicalProperties } from './plan-node.js';
2
+ import { PlanNode, type RelationalPlanNode, type Attribute, type PhysicalProperties, isRelationalNode } from './plan-node.js';
3
3
  import { PlanNodeType } from './plan-node-type.js';
4
4
  import type { TableReferenceNode } from './reference.js';
5
5
  import type { RelationType } from '../../common/datatype.js';
6
6
  import type { ConflictResolution } from '../../common/constants.js';
7
- import { RowOp } from '../../parser/ast.js';
7
+ import { RowOp } from '../../common/types.js';
8
8
 
9
9
  /**
10
10
  * Executes actual database insert/update/delete operations after constraint validation.
@@ -48,7 +48,7 @@ export class DmlExecutorNode extends PlanNode implements RelationalPlanNode {
48
48
  const [newSource] = newChildren;
49
49
 
50
50
  // Type check
51
- if (!('getAttributes' in newSource) || typeof (newSource as any).getAttributes !== 'function') {
51
+ if (!isRelationalNode(newSource)) {
52
52
  throw new Error('UpdateExecutorNode: child must be a RelationalPlanNode');
53
53
  }
54
54
 
@@ -1,5 +1,5 @@
1
1
  import type { Scope } from '../scopes/scope.js';
2
- import { VoidNode } from './plan-node.js';
2
+ import { PhysicalProperties, VoidNode } from './plan-node.js';
3
3
  import { PlanNodeType } from './plan-node-type.js';
4
4
  import type * as AST from '../../parser/ast.js';
5
5
  import { expressionToString } from '../../util/ast-stringify.js';
@@ -28,4 +28,8 @@ export class DropTableNode extends VoidNode {
28
28
  statement: expressionToString(this.statementAst as any)
29
29
  };
30
30
  }
31
+
32
+ override computePhysical(_children: readonly PhysicalProperties[]): Partial<PhysicalProperties> {
33
+ return { readonly: false };
34
+ }
31
35
  }
@@ -1,4 +1,4 @@
1
- import { VoidNode } from './plan-node.js';
1
+ import { PhysicalProperties, VoidNode } from './plan-node.js';
2
2
  import { PlanNodeType } from './plan-node-type.js';
3
3
  import type { Scope } from '../scopes/scope.js';
4
4
 
@@ -30,4 +30,8 @@ export class DropViewNode extends VoidNode {
30
30
  ifExists: this.ifExists
31
31
  };
32
32
  }
33
+
34
+ override computePhysical(_children: readonly PhysicalProperties[]): Partial<PhysicalProperties> {
35
+ return { readonly: false };
36
+ }
33
37
  }
@@ -1,5 +1,5 @@
1
1
  import { PlanNodeType } from './plan-node-type.js';
2
- import { PlanNode, type RelationalPlanNode, type ScalarPlanNode, type UnaryRelationalNode, type Attribute } from './plan-node.js';
2
+ import { PlanNode, type RelationalPlanNode, type ScalarPlanNode, type UnaryRelationalNode, type Attribute, isRelationalNode, isScalarNode } from './plan-node.js';
3
3
  import type { RelationType } from '../../common/datatype.js';
4
4
  import type { Scope } from '../scopes/scope.js';
5
5
  import { formatExpression } from '../../util/plan-formatter.js';
@@ -69,10 +69,10 @@ export class FilterNode extends PlanNode implements UnaryRelationalNode {
69
69
  const [newSource, newPredicate] = newChildren;
70
70
 
71
71
  // Type check
72
- if (!('getAttributes' in newSource) || typeof (newSource as any).getAttributes !== 'function') {
72
+ if (!isRelationalNode(newSource)) {
73
73
  quereusError('FilterNode: first child must be a RelationalPlanNode', StatusCode.INTERNAL);
74
74
  }
75
- if (!('expression' in newPredicate)) {
75
+ if (!isScalarNode(newPredicate)) {
76
76
  quereusError('FilterNode: second child must be a ScalarPlanNode', StatusCode.INTERNAL);
77
77
  }
78
78