@quereus/quereus 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 -0
  539. package/dist/src/util/plugin-loader.d.ts.map +1 -1
  540. package/dist/src/util/plugin-loader.js +137 -0
  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 +184 -0
  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,270 +1,319 @@
1
- import type * as AST from '../../parser/ast.js';
2
- import type { PlanningContext } from '../planning-context.js';
3
- import { UpdateNode, type UpdateAssignment } from '../nodes/update-node.js';
4
- import { DmlExecutorNode } from '../nodes/dml-executor-node.js';
5
- import { buildTableReference } from './table.js';
6
- import { buildExpression } from './expression.js';
7
- import { PlanNode, type RelationalPlanNode, type ScalarPlanNode } from '../nodes/plan-node.js';
8
- import { FilterNode } from '../nodes/filter.js';
9
- import { QuereusError } from '../../common/errors.js';
10
- import { StatusCode } from '../../common/types.js';
11
- import { RegisteredScope } from '../scopes/registered.js';
12
- import { ColumnReferenceNode } from '../nodes/reference.js';
13
- import { SinkNode } from '../nodes/sink-node.js';
14
- import { ConstraintCheckNode } from '../nodes/constraint-check-node.js';
15
- import { RowOpFlag } from '../../schema/table.js';
16
- import { ReturningNode } from '../nodes/returning-node.js';
17
- import { buildOldNewRowDescriptors } from '../../util/row-descriptor.js';
18
- import { buildConstraintChecks } from './constraint-builder.js';
19
-
20
- export function buildUpdateStmt(
21
- ctx: PlanningContext,
22
- stmt: AST.UpdateStmt,
23
- ): PlanNode {
24
- const tableReference = buildTableReference({ type: 'table', table: stmt.table }, ctx);
25
-
26
- // Plan the source of rows to update. This is typically the table itself, potentially filtered.
27
- let sourceNode: RelationalPlanNode = buildTableReference({ type: 'table', table: stmt.table }, ctx);
28
-
29
- // Create a new scope with the table columns registered for column resolution
30
- const tableScope = new RegisteredScope(ctx.scope);
31
- const sourceAttributes = sourceNode.getAttributes();
32
- sourceNode.getType().columns.forEach((c, i) => {
33
- const attr = sourceAttributes[i];
34
- tableScope.registerSymbol(c.name.toLowerCase(), (exp, s) =>
35
- new ColumnReferenceNode(s, exp as AST.ColumnExpr, c.type, attr.id, i));
36
- });
37
-
38
- // Create a new planning context with the updated scope for WHERE clause resolution
39
- const updateCtx = { ...ctx, scope: tableScope };
40
-
41
- if (stmt.where) {
42
- const filterExpression = buildExpression(updateCtx, stmt.where);
43
- sourceNode = new FilterNode(updateCtx.scope, sourceNode, filterExpression);
44
- }
45
-
46
- const assignments: UpdateAssignment[] = stmt.assignments.map(assign => {
47
- // TODO: Validate assign.column against tableReference.tableSchema
48
- const targetColumn: AST.ColumnExpr = { type: 'column', name: assign.column, table: stmt.table.name, schema: stmt.table.schema };
49
- return {
50
- targetColumn, // Keep as AST for now, emitter can resolve index
51
- value: buildExpression(updateCtx, assign.value),
52
- };
53
- });
54
-
55
- // Create OLD/NEW attributes for UPDATE (used for both RETURNING and non-RETURNING paths)
56
- const oldAttributes = tableReference.tableSchema.columns.map((col) => ({
57
- id: PlanNode.nextAttrId(),
58
- name: col.name,
59
- type: {
60
- typeClass: 'scalar' as const,
61
- affinity: col.affinity,
62
- nullable: !col.notNull,
63
- isReadOnly: false
64
- },
65
- sourceRelation: `OLD.${tableReference.tableSchema.name}`
66
- }));
67
-
68
- const newAttributes = tableReference.tableSchema.columns.map((col) => ({
69
- id: PlanNode.nextAttrId(),
70
- name: col.name,
71
- type: {
72
- typeClass: 'scalar' as const,
73
- affinity: col.affinity,
74
- nullable: !col.notNull,
75
- isReadOnly: false
76
- },
77
- sourceRelation: `NEW.${tableReference.tableSchema.name}`
78
- }));
79
-
80
- const { oldRowDescriptor, newRowDescriptor, flatRowDescriptor } = buildOldNewRowDescriptors(oldAttributes, newAttributes);
81
-
82
- // Build constraint checks at plan time
83
- const constraintChecks = buildConstraintChecks(
84
- updateCtx,
85
- tableReference.tableSchema,
86
- RowOpFlag.UPDATE,
87
- oldAttributes,
88
- newAttributes,
89
- flatRowDescriptor
90
- );
91
-
92
- if (stmt.returning && stmt.returning.length > 0) {
93
- // For RETURNING, create coordinated attribute IDs like we do for INSERT
94
- const returningScope = new RegisteredScope(updateCtx.scope);
95
-
96
- // Create consistent attribute IDs for all table columns (both NEW and OLD)
97
- const newColumnAttributeIds: number[] = [];
98
- const oldColumnAttributeIds: number[] = [];
99
- newAttributes.forEach((attr, columnIndex) => {
100
- newColumnAttributeIds[columnIndex] = attr.id;
101
- });
102
- oldAttributes.forEach((attr, columnIndex) => {
103
- oldColumnAttributeIds[columnIndex] = attr.id;
104
- });
105
-
106
- tableReference.tableSchema.columns.forEach((tableColumn, columnIndex) => {
107
- const newAttributeId = newAttributes[columnIndex].id;
108
- const oldAttributeId = oldAttributes[columnIndex].id;
109
-
110
- // Register the unqualified column name in the RETURNING scope (defaults to NEW values)
111
- returningScope.registerSymbol(tableColumn.name.toLowerCase(), (exp, s) => {
112
- return new ColumnReferenceNode(
113
- s,
114
- exp as AST.ColumnExpr,
115
- {
116
- typeClass: 'scalar',
117
- affinity: tableColumn.affinity,
118
- nullable: !tableColumn.notNull,
119
- isReadOnly: false
120
- },
121
- newAttributeId,
122
- columnIndex
123
- );
124
- });
125
-
126
- // Also register the table-qualified form (table.column) - defaults to NEW values
127
- const tblQualified = `${tableReference.tableSchema.name.toLowerCase()}.${tableColumn.name.toLowerCase()}`;
128
- returningScope.registerSymbol(tblQualified, (exp, s) =>
129
- new ColumnReferenceNode(
130
- s,
131
- exp as AST.ColumnExpr,
132
- {
133
- typeClass: 'scalar',
134
- affinity: tableColumn.affinity,
135
- nullable: !tableColumn.notNull,
136
- isReadOnly: false
137
- },
138
- newAttributeId,
139
- columnIndex
140
- )
141
- );
142
-
143
- // Register NEW.column for UPDATE RETURNING (updated values)
144
- returningScope.registerSymbol(`new.${tableColumn.name.toLowerCase()}`, (exp, s) =>
145
- new ColumnReferenceNode(
146
- s,
147
- exp as AST.ColumnExpr,
148
- {
149
- typeClass: 'scalar',
150
- affinity: tableColumn.affinity,
151
- nullable: !tableColumn.notNull,
152
- isReadOnly: false
153
- },
154
- newAttributeId,
155
- columnIndex
156
- )
157
- );
158
-
159
- // Register OLD.column for UPDATE RETURNING (original values)
160
- returningScope.registerSymbol(`old.${tableColumn.name.toLowerCase()}`, (exp, s) =>
161
- new ColumnReferenceNode(
162
- s,
163
- exp as AST.ColumnExpr,
164
- {
165
- typeClass: 'scalar',
166
- affinity: tableColumn.affinity,
167
- nullable: !tableColumn.notNull,
168
- isReadOnly: false
169
- },
170
- oldAttributeId,
171
- columnIndex
172
- )
173
- );
174
- });
175
-
176
- const returningProjections = stmt.returning.map(rc => {
177
- // TODO: Support RETURNING *
178
- if (rc.type === 'all') throw new QuereusError('RETURNING * not yet supported', StatusCode.UNSUPPORTED);
179
-
180
- // Infer alias from column name if not explicitly provided
181
- let alias = rc.alias;
182
- if (!alias && rc.expr.type === 'column') {
183
- // For qualified column references like NEW.id or OLD.id, normalize to lowercase
184
- if (rc.expr.table) {
185
- alias = `${rc.expr.table.toLowerCase()}.${rc.expr.name.toLowerCase()}`;
186
- } else {
187
- alias = rc.expr.name.toLowerCase();
188
- }
189
- }
190
-
191
- const columnIndex = tableReference.tableSchema.columns.findIndex(col => col.name.toLowerCase() === (rc.expr.type === 'column' ? rc.expr.name.toLowerCase() : ''));
192
- const projAttributeId = rc.expr.type === 'column' && columnIndex !== -1 ? newColumnAttributeIds[columnIndex] : undefined;
193
-
194
- return {
195
- node: buildExpression({ ...updateCtx, scope: returningScope }, rc.expr) as ScalarPlanNode,
196
- alias: alias,
197
- attributeId: projAttributeId
198
- };
199
- });
200
-
201
- // Create UpdateNode with both row descriptors for RETURNING coordination
202
- const updateNodeWithDescriptor = new UpdateNode(
203
- updateCtx.scope,
204
- tableReference,
205
- assignments,
206
- sourceNode,
207
- stmt.onConflict,
208
- oldRowDescriptor,
209
- newRowDescriptor,
210
- flatRowDescriptor
211
- );
212
-
213
- // For returning, we still need to execute the update before projecting
214
- // Always inject ConstraintCheckNode for UPDATE operations (provides required metadata)
215
- const constraintCheckNode = new ConstraintCheckNode(
216
- updateCtx.scope,
217
- updateNodeWithDescriptor,
218
- tableReference,
219
- RowOpFlag.UPDATE,
220
- oldRowDescriptor,
221
- newRowDescriptor,
222
- flatRowDescriptor,
223
- constraintChecks
224
- );
225
-
226
- const updateExecutorNode = new DmlExecutorNode(
227
- updateCtx.scope,
228
- constraintCheckNode,
229
- tableReference,
230
- 'update'
231
- );
232
-
233
- // Return the RETURNING results from the executed update
234
- return new ReturningNode(updateCtx.scope, updateExecutorNode, returningProjections);
235
- }
236
-
237
- // Step 1: Create UpdateNode that produces updated rows (but doesn't execute them)
238
- // Create newRowDescriptor and oldRowDescriptor for constraint checking with NEW/OLD references
239
- const updateNode = new UpdateNode(
240
- updateCtx.scope,
241
- tableReference,
242
- assignments,
243
- sourceNode,
244
- stmt.onConflict,
245
- oldRowDescriptor,
246
- newRowDescriptor,
247
- flatRowDescriptor
248
- );
249
-
250
- // Step 2: inject constraint checking AFTER update row generation
251
- const constraintCheckNode = new ConstraintCheckNode(
252
- updateCtx.scope,
253
- updateNode,
254
- tableReference,
255
- RowOpFlag.UPDATE,
256
- oldRowDescriptor,
257
- newRowDescriptor,
258
- flatRowDescriptor,
259
- constraintChecks
260
- );
261
-
262
- const updateExecutorNode = new DmlExecutorNode(
263
- updateCtx.scope,
264
- constraintCheckNode,
265
- tableReference,
266
- 'update'
267
- );
268
-
269
- return new SinkNode(updateCtx.scope, updateExecutorNode, 'update');
270
- }
1
+ import type * as AST from '../../parser/ast.js';
2
+ import type { PlanningContext } from '../planning-context.js';
3
+ import { UpdateNode, type UpdateAssignment } from '../nodes/update-node.js';
4
+ import { DmlExecutorNode } from '../nodes/dml-executor-node.js';
5
+ import { buildTableReference } from './table.js';
6
+ import { buildExpression } from './expression.js';
7
+ import { PlanNode, type RelationalPlanNode, type ScalarPlanNode, type Attribute, type RowDescriptor } from '../nodes/plan-node.js';
8
+ import { FilterNode } from '../nodes/filter.js';
9
+ import { QuereusError } from '../../common/errors.js';
10
+ import { StatusCode } from '../../common/types.js';
11
+ import { RegisteredScope } from '../scopes/registered.js';
12
+ import { ColumnReferenceNode } from '../nodes/reference.js';
13
+ import { SinkNode } from '../nodes/sink-node.js';
14
+ import { ConstraintCheckNode } from '../nodes/constraint-check-node.js';
15
+ import { RowOpFlag } from '../../schema/table.js';
16
+ import { ReturningNode } from '../nodes/returning-node.js';
17
+ import { buildOldNewRowDescriptors } from '../../util/row-descriptor.js';
18
+ import { buildConstraintChecks } from './constraint-builder.js';
19
+
20
+ export function buildUpdateStmt(
21
+ ctx: PlanningContext,
22
+ stmt: AST.UpdateStmt,
23
+ ): PlanNode {
24
+ const tableRetrieve = buildTableReference({ type: 'table', table: stmt.table }, ctx);
25
+ const tableReference = tableRetrieve.tableRef; // Extract the actual TableReferenceNode
26
+
27
+ // Process mutation context assignments if present
28
+ const mutationContextValues = new Map<string, ScalarPlanNode>();
29
+ const contextAttributes: Attribute[] = [];
30
+
31
+ if (stmt.contextValues && tableReference.tableSchema.mutationContext) {
32
+ // Create context attributes
33
+ tableReference.tableSchema.mutationContext.forEach((contextVar) => {
34
+ contextAttributes.push({
35
+ id: PlanNode.nextAttrId(),
36
+ name: contextVar.name,
37
+ type: {
38
+ typeClass: 'scalar' as const,
39
+ affinity: contextVar.affinity,
40
+ nullable: !contextVar.notNull,
41
+ isReadOnly: true
42
+ },
43
+ sourceRelation: `context.${tableReference.tableSchema.name}`
44
+ });
45
+ });
46
+
47
+ // Build context value expressions (evaluated in the base scope, before table scope)
48
+ stmt.contextValues.forEach((assignment) => {
49
+ const valueExpr = buildExpression(ctx, assignment.value) as ScalarPlanNode;
50
+ mutationContextValues.set(assignment.name, valueExpr);
51
+ });
52
+ }
53
+
54
+ // Plan the source of rows to update. This is typically the table itself, potentially filtered.
55
+ let sourceNode: RelationalPlanNode = buildTableReference({ type: 'table', table: stmt.table }, ctx);
56
+
57
+ // Create a new scope with the table columns registered for column resolution
58
+ const tableScope = new RegisteredScope(ctx.scope);
59
+ const sourceAttributes = sourceNode.getAttributes();
60
+ sourceNode.getType().columns.forEach((c, i) => {
61
+ const attr = sourceAttributes[i];
62
+ tableScope.registerSymbol(c.name.toLowerCase(), (exp, s) =>
63
+ new ColumnReferenceNode(s, exp as AST.ColumnExpr, c.type, attr.id, i));
64
+ });
65
+
66
+ // Create a new planning context with the updated scope for WHERE clause resolution
67
+ const updateCtx = { ...ctx, scope: tableScope };
68
+
69
+ if (stmt.where) {
70
+ const filterExpression = buildExpression(updateCtx, stmt.where);
71
+ sourceNode = new FilterNode(updateCtx.scope, sourceNode, filterExpression);
72
+ }
73
+
74
+ const assignments: UpdateAssignment[] = stmt.assignments.map(assign => {
75
+ // TODO: Validate assign.column against tableReference.tableSchema
76
+ const targetColumn: AST.ColumnExpr = { type: 'column', name: assign.column, table: stmt.table.name, schema: stmt.table.schema };
77
+ return {
78
+ targetColumn, // Keep as AST for now, emitter can resolve index
79
+ value: buildExpression(updateCtx, assign.value),
80
+ };
81
+ });
82
+
83
+ // Create OLD/NEW attributes for UPDATE (used for both RETURNING and non-RETURNING paths)
84
+ const oldAttributes = tableReference.tableSchema.columns.map((col) => ({
85
+ id: PlanNode.nextAttrId(),
86
+ name: col.name,
87
+ type: {
88
+ typeClass: 'scalar' as const,
89
+ affinity: col.affinity,
90
+ nullable: !col.notNull,
91
+ isReadOnly: false
92
+ },
93
+ sourceRelation: `OLD.${tableReference.tableSchema.name}`
94
+ }));
95
+
96
+ const newAttributes = tableReference.tableSchema.columns.map((col) => ({
97
+ id: PlanNode.nextAttrId(),
98
+ name: col.name,
99
+ type: {
100
+ typeClass: 'scalar' as const,
101
+ affinity: col.affinity,
102
+ nullable: !col.notNull,
103
+ isReadOnly: false
104
+ },
105
+ sourceRelation: `NEW.${tableReference.tableSchema.name}`
106
+ }));
107
+
108
+ const { oldRowDescriptor, newRowDescriptor, flatRowDescriptor } = buildOldNewRowDescriptors(oldAttributes, newAttributes);
109
+
110
+ // Build context descriptor if we have context attributes
111
+ const contextDescriptor: RowDescriptor = contextAttributes.length > 0 ? [] : undefined as any;
112
+ if (contextDescriptor) {
113
+ contextAttributes.forEach((attr, index) => {
114
+ contextDescriptor[attr.id] = index;
115
+ });
116
+ }
117
+
118
+ // Build constraint checks at plan time
119
+ const constraintChecks = buildConstraintChecks(
120
+ updateCtx,
121
+ tableReference.tableSchema,
122
+ RowOpFlag.UPDATE,
123
+ oldAttributes,
124
+ newAttributes,
125
+ flatRowDescriptor,
126
+ contextAttributes
127
+ );
128
+
129
+ if (stmt.returning && stmt.returning.length > 0) {
130
+ // For RETURNING, create coordinated attribute IDs like we do for INSERT
131
+ const returningScope = new RegisteredScope(updateCtx.scope);
132
+
133
+ // Create consistent attribute IDs for all table columns (both NEW and OLD)
134
+ const newColumnAttributeIds: number[] = [];
135
+ const oldColumnAttributeIds: number[] = [];
136
+ newAttributes.forEach((attr, columnIndex) => {
137
+ newColumnAttributeIds[columnIndex] = attr.id;
138
+ });
139
+ oldAttributes.forEach((attr, columnIndex) => {
140
+ oldColumnAttributeIds[columnIndex] = attr.id;
141
+ });
142
+
143
+ tableReference.tableSchema.columns.forEach((tableColumn, columnIndex) => {
144
+ const newAttributeId = newAttributes[columnIndex].id;
145
+ const oldAttributeId = oldAttributes[columnIndex].id;
146
+
147
+ // Register the unqualified column name in the RETURNING scope (defaults to NEW values)
148
+ returningScope.registerSymbol(tableColumn.name.toLowerCase(), (exp, s) => {
149
+ return new ColumnReferenceNode(
150
+ s,
151
+ exp as AST.ColumnExpr,
152
+ {
153
+ typeClass: 'scalar',
154
+ affinity: tableColumn.affinity,
155
+ nullable: !tableColumn.notNull,
156
+ isReadOnly: false
157
+ },
158
+ newAttributeId,
159
+ columnIndex
160
+ );
161
+ });
162
+
163
+ // Also register the table-qualified form (table.column) - defaults to NEW values
164
+ const tblQualified = `${tableReference.tableSchema.name.toLowerCase()}.${tableColumn.name.toLowerCase()}`;
165
+ returningScope.registerSymbol(tblQualified, (exp, s) =>
166
+ new ColumnReferenceNode(
167
+ s,
168
+ exp as AST.ColumnExpr,
169
+ {
170
+ typeClass: 'scalar',
171
+ affinity: tableColumn.affinity,
172
+ nullable: !tableColumn.notNull,
173
+ isReadOnly: false
174
+ },
175
+ newAttributeId,
176
+ columnIndex
177
+ )
178
+ );
179
+
180
+ // Register NEW.column for UPDATE RETURNING (updated values)
181
+ returningScope.registerSymbol(`new.${tableColumn.name.toLowerCase()}`, (exp, s) =>
182
+ new ColumnReferenceNode(
183
+ s,
184
+ exp as AST.ColumnExpr,
185
+ {
186
+ typeClass: 'scalar',
187
+ affinity: tableColumn.affinity,
188
+ nullable: !tableColumn.notNull,
189
+ isReadOnly: false
190
+ },
191
+ newAttributeId,
192
+ columnIndex
193
+ )
194
+ );
195
+
196
+ // Register OLD.column for UPDATE RETURNING (original values)
197
+ returningScope.registerSymbol(`old.${tableColumn.name.toLowerCase()}`, (exp, s) =>
198
+ new ColumnReferenceNode(
199
+ s,
200
+ exp as AST.ColumnExpr,
201
+ {
202
+ typeClass: 'scalar',
203
+ affinity: tableColumn.affinity,
204
+ nullable: !tableColumn.notNull,
205
+ isReadOnly: false
206
+ },
207
+ oldAttributeId,
208
+ columnIndex
209
+ )
210
+ );
211
+ });
212
+
213
+ const returningProjections = stmt.returning.map(rc => {
214
+ // TODO: Support RETURNING *
215
+ if (rc.type === 'all') throw new QuereusError('RETURNING * not yet supported', StatusCode.UNSUPPORTED);
216
+
217
+ // Infer alias from column name if not explicitly provided
218
+ let alias = rc.alias;
219
+ if (!alias && rc.expr.type === 'column') {
220
+ // For qualified column references like NEW.id or OLD.id, normalize to lowercase
221
+ if (rc.expr.table) {
222
+ alias = `${rc.expr.table.toLowerCase()}.${rc.expr.name.toLowerCase()}`;
223
+ } else {
224
+ alias = rc.expr.name.toLowerCase();
225
+ }
226
+ }
227
+
228
+ const columnIndex = tableReference.tableSchema.columns.findIndex(col => col.name.toLowerCase() === (rc.expr.type === 'column' ? rc.expr.name.toLowerCase() : ''));
229
+ const projAttributeId = rc.expr.type === 'column' && columnIndex !== -1 ? newColumnAttributeIds[columnIndex] : undefined;
230
+
231
+ return {
232
+ node: buildExpression({ ...updateCtx, scope: returningScope }, rc.expr) as ScalarPlanNode,
233
+ alias: alias,
234
+ attributeId: projAttributeId
235
+ };
236
+ });
237
+
238
+ // Create UpdateNode with both row descriptors for RETURNING coordination
239
+ const updateNodeWithDescriptor = new UpdateNode(
240
+ updateCtx.scope,
241
+ tableReference,
242
+ assignments,
243
+ sourceNode,
244
+ stmt.onConflict,
245
+ oldRowDescriptor,
246
+ newRowDescriptor,
247
+ flatRowDescriptor,
248
+ mutationContextValues.size > 0 ? mutationContextValues : undefined,
249
+ contextAttributes.length > 0 ? contextAttributes : undefined,
250
+ contextDescriptor
251
+ );
252
+
253
+ // For returning, we still need to execute the update before projecting
254
+ // Always inject ConstraintCheckNode for UPDATE operations (provides required metadata)
255
+ const constraintCheckNode = new ConstraintCheckNode(
256
+ updateCtx.scope,
257
+ updateNodeWithDescriptor,
258
+ tableReference,
259
+ RowOpFlag.UPDATE,
260
+ oldRowDescriptor,
261
+ newRowDescriptor,
262
+ flatRowDescriptor,
263
+ constraintChecks,
264
+ mutationContextValues.size > 0 ? mutationContextValues : undefined,
265
+ contextAttributes.length > 0 ? contextAttributes : undefined,
266
+ contextDescriptor
267
+ );
268
+
269
+ const updateExecutorNode = new DmlExecutorNode(
270
+ updateCtx.scope,
271
+ constraintCheckNode,
272
+ tableReference,
273
+ 'update'
274
+ );
275
+
276
+ // Return the RETURNING results from the executed update
277
+ return new ReturningNode(updateCtx.scope, updateExecutorNode, returningProjections);
278
+ }
279
+
280
+ // Step 1: Create UpdateNode that produces updated rows (but doesn't execute them)
281
+ // Create newRowDescriptor and oldRowDescriptor for constraint checking with NEW/OLD references
282
+ const updateNode = new UpdateNode(
283
+ updateCtx.scope,
284
+ tableReference,
285
+ assignments,
286
+ sourceNode,
287
+ stmt.onConflict,
288
+ oldRowDescriptor,
289
+ newRowDescriptor,
290
+ flatRowDescriptor,
291
+ mutationContextValues.size > 0 ? mutationContextValues : undefined,
292
+ contextAttributes.length > 0 ? contextAttributes : undefined,
293
+ contextDescriptor
294
+ );
295
+
296
+ // Step 2: inject constraint checking AFTER update row generation
297
+ const constraintCheckNode = new ConstraintCheckNode(
298
+ updateCtx.scope,
299
+ updateNode,
300
+ tableReference,
301
+ RowOpFlag.UPDATE,
302
+ oldRowDescriptor,
303
+ newRowDescriptor,
304
+ flatRowDescriptor,
305
+ constraintChecks,
306
+ mutationContextValues.size > 0 ? mutationContextValues : undefined,
307
+ contextAttributes.length > 0 ? contextAttributes : undefined,
308
+ contextDescriptor
309
+ );
310
+
311
+ const updateExecutorNode = new DmlExecutorNode(
312
+ updateCtx.scope,
313
+ constraintCheckNode,
314
+ tableReference,
315
+ 'update'
316
+ );
317
+
318
+ return new SinkNode(updateCtx.scope, updateExecutorNode, 'update');
319
+ }
@@ -1,6 +1,6 @@
1
1
  import type * as AST from '../../parser/ast.js';
2
2
  import type { PlanningContext } from '../planning-context.js';
3
- import { CTENode, type CTEPlanNode } from '../nodes/cte-node.js';
3
+ import { CTENode, type CTEPlanNode, type CTEScopeNode } from '../nodes/cte-node.js';
4
4
  import { RecursiveCTENode } from '../nodes/recursive-cte-node.js';
5
5
  import { InternalRecursiveCTERefNode } from '../nodes/internal-recursive-cte-ref-node.js';
6
6
  import { buildSelectStmt } from './select.js';
@@ -17,8 +17,8 @@ import { ColumnReferenceNode } from '../nodes/reference.js';
17
17
  export function buildWithClause(
18
18
  ctx: PlanningContext,
19
19
  withClause: AST.WithClause
20
- ): Map<string, CTEPlanNode> {
21
- const cteNodes = new Map<string, CTEPlanNode>();
20
+ ): Map<string, CTEScopeNode> {
21
+ const cteNodes = new Map<string, CTEScopeNode>();
22
22
 
23
23
  // Check for duplicate CTE names
24
24
  const cteNames = new Set<string>();
@@ -36,7 +36,7 @@ export function buildWithClause(
36
36
  // Build each CTE in order
37
37
  // Note: For recursive CTEs, we may need to handle forward references
38
38
  for (const cte of withClause.ctes) {
39
- const cteNode = buildCommonTableExpr(ctx, cte, withClause.recursive, cteNodes, withClause.options);
39
+ const cteNode = buildCommonTableExpr(ctx, cte, withClause.recursive, cteNodes, withClause.options) as CTEScopeNode;
40
40
  cteNodes.set(cte.name.toLowerCase(), cteNode);
41
41
  }
42
42
 
@@ -50,7 +50,7 @@ export function buildCommonTableExpr(
50
50
  ctx: PlanningContext,
51
51
  cte: AST.CommonTableExpr,
52
52
  isRecursive: boolean,
53
- existingCTEs: Map<string, CTEPlanNode>,
53
+ existingCTEs: Map<string, CTEScopeNode>,
54
54
  options?: AST.WithClauseOptions
55
55
  ): CTEPlanNode {
56
56
  // Create a context that includes previously defined CTEs in scope
@@ -61,7 +61,7 @@ export function buildCommonTableExpr(
61
61
  const cteScope = new RegisteredScope(ctx.scope);
62
62
  for (const [cteName, cteNode] of existingCTEs) {
63
63
  const attributes = cteNode.getAttributes();
64
- cteNode.getType().columns.forEach((col: any, i: number) => {
64
+ cteNode.getType().columns.forEach((col, i) => {
65
65
  const attr = attributes[i];
66
66
  // Register CTE columns with qualified names only to avoid conflicts with table columns
67
67
  const qualifiedColumnName = `${cteName}.${col.name.toLowerCase()}`;
@@ -167,7 +167,7 @@ function buildRecursiveCTE(
167
167
 
168
168
  // Build the recursive case query with a simple replacement strategy
169
169
  // We'll replace CTE references with the internal recursive reference during the FROM clause processing
170
- const recursiveCteMap = new Map<string, any>();
170
+ const recursiveCteMap = new Map<string, CTEScopeNode>();
171
171
  recursiveCteMap.set(cte.name.toLowerCase(), internalRefNode);
172
172
 
173
173
  // Build the recursive case query