@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
@@ -6,16 +6,24 @@ import { OptimizerTuning, DEFAULT_TUNING } from './optimizer-tuning.js';
6
6
  // Re-export for convenience
7
7
  export { DEFAULT_TUNING };
8
8
 
9
- import { applyRules, registerRules, createRule } from './framework/registry.js';
9
+ import { applyRules } from './framework/registry.js';
10
10
  import { tracePhaseStart, tracePhaseEnd, traceNodeStart, traceNodeEnd } from './framework/trace.js';
11
11
  import { defaultStatsProvider, type StatsProvider } from './stats/index.js';
12
12
  import { createOptContext, type OptContext } from './framework/context.js';
13
+ import type { OptimizerDiagnostics } from './framework/context.js';
14
+ import { PassManager, PassId } from './framework/pass.js';
13
15
  // Phase 2 rules
14
16
  import { ruleMaterializationAdvisory } from './rules/cache/rule-materialization-advisory.js';
15
17
  // Phase 1.5 rules
16
18
  import { ruleSelectAccessPath } from './rules/access/rule-select-access-path.js';
19
+ import { ruleGrowRetrieve } from './rules/retrieve/rule-grow-retrieve.js';
20
+ import { rulePredicatePushdown } from './rules/predicate/rule-predicate-pushdown.js';
21
+ import { ruleJoinKeyInference } from './rules/join/rule-join-key-inference.js';
22
+ import { ruleJoinGreedyCommute } from './rules/join/rule-join-greedy-commute.js';
23
+ // Predicate pushdown rules
17
24
  // Core optimization rules
18
25
  import { ruleAggregateStreaming } from './rules/aggregate/rule-aggregate-streaming.js';
26
+ import { ruleQuickPickJoinEnumeration } from './rules/join/rule-quickpick-enumeration.js';
19
27
  // Constraint rules removed - now handled in builders for correctness
20
28
  import { ruleCteOptimization } from './rules/cache/rule-cte-optimization.js';
21
29
  import { ruleMutatingSubqueryCache } from './rules/cache/rule-mutating-subquery-cache.js';
@@ -32,114 +40,157 @@ const log = createLogger('optimizer');
32
40
  */
33
41
  export class Optimizer {
34
42
  private readonly stats: StatsProvider;
43
+ private readonly passManager: PassManager;
44
+ private lastDiagnostics: OptimizerDiagnostics | null = null;
45
+ public tuning: OptimizerTuning;
35
46
 
36
47
  constructor(
37
- public readonly tuning: OptimizerTuning = DEFAULT_TUNING,
48
+ tuning: OptimizerTuning = DEFAULT_TUNING,
38
49
  stats?: StatsProvider
39
50
  ) {
40
51
  this.stats = stats ?? defaultStatsProvider;
52
+ this.passManager = new PassManager();
53
+ this.tuning = tuning;
41
54
 
42
- // Ensure global framework rules are registered once
43
- Optimizer.ensureGlobalRulesRegistered();
55
+ // Register rules to their appropriate passes only (no legacy globals)
56
+ this.registerRulesToPasses();
57
+ }
58
+
59
+ updateTuning(tuning: OptimizerTuning): void {
60
+ this.tuning = tuning;
44
61
  }
45
62
 
46
63
  private static globalRulesRegistered = false;
47
64
 
48
65
  /**
49
- * Ensure global framework rules are registered only once
66
+ * Legacy method removed; keep empty to avoid duplicate registrations
50
67
  */
51
- private static ensureGlobalRulesRegistered(): void {
52
- if (Optimizer.globalRulesRegistered) {
53
- return;
54
- }
55
- Optimizer.globalRulesRegistered = true;
56
68
 
57
- const toRegister = [];
69
+ /**
70
+ * Register rules with their appropriate passes
71
+ */
72
+ private registerRulesToPasses(): void {
73
+ // Structural pass rules (top-down) - for operations that need parent context
74
+ // Register grow-retrieve for ALL relational node types
75
+ // The rule itself will determine if growth is possible
76
+ const relationalNodeTypes = [
77
+ PlanNodeType.Filter,
78
+ PlanNodeType.Project,
79
+ PlanNodeType.Sort,
80
+ PlanNodeType.LimitOffset,
81
+ PlanNodeType.Aggregate,
82
+ PlanNodeType.Distinct,
83
+ PlanNodeType.Join,
84
+ PlanNodeType.Window,
85
+ // Add any other relational node types as needed
86
+ ];
58
87
 
59
- // Note: Single-pass constant folding is done before rules
88
+ for (const nodeType of relationalNodeTypes) {
89
+ this.passManager.addRuleToPass(PassId.Structural, {
90
+ id: `grow-retrieve-${nodeType}`,
91
+ nodeType,
92
+ phase: 'rewrite',
93
+ fn: ruleGrowRetrieve,
94
+ priority: 10
95
+ });
96
+ }
60
97
 
61
- // Mutating subquery cache injection - critical for correctness
62
- toRegister.push(createRule(
63
- 'mutating-subquery-cache',
64
- PlanNodeType.Join,
65
- 'rewrite',
66
- ruleMutatingSubqueryCache,
67
- 20 // Very high priority - correctness fix to prevent multiple execution
68
- ));
69
-
70
- // Phase 1.5 rules
71
- toRegister.push(createRule(
72
- 'select-access-path',
73
- PlanNodeType.TableReference,
74
- 'impl',
75
- ruleSelectAccessPath,
76
- 25 // High priority - fundamental access path selection
77
- ));
78
-
79
- // Core optimization rules (converted from old system)
80
- toRegister.push(createRule(
81
- 'aggregate-streaming',
82
- PlanNodeType.Aggregate,
83
- 'impl',
84
- ruleAggregateStreaming,
85
- 40 // High priority - fundamental logical→physical transformation
86
- ));
87
-
88
- // toRegister.push(createRule(
89
- // 'project-optimization',
90
- // PlanNodeType.Project,
91
- // 'impl',
92
- // ruleProjectOptimization,
93
- // 50 // Medium priority - basic optimization
94
- // ));
95
-
96
- // toRegister.push(createRule(
97
- // 'filter-optimization',
98
- // PlanNodeType.Filter,
99
- // 'impl',
100
- // ruleFilterOptimization,
101
- // 50 // Medium priority - basic optimization
102
- // ));
103
-
104
- toRegister.push(createRule(
105
- 'cte-optimization',
98
+ // Join key inference (structural/characteristic)
99
+ this.passManager.addRuleToPass(PassId.Structural, {
100
+ id: 'join-key-inference',
101
+ nodeType: PlanNodeType.Join,
102
+ phase: 'rewrite',
103
+ fn: ruleJoinKeyInference,
104
+ priority: 15
105
+ });
106
+
107
+ // Greedy join commute: place smaller input on the left to improve nested-loop-like costs
108
+ this.passManager.addRuleToPass(PassId.Structural, {
109
+ id: 'join-greedy-commute',
110
+ nodeType: PlanNodeType.Join,
111
+ phase: 'rewrite',
112
+ fn: ruleJoinGreedyCommute,
113
+ priority: 16
114
+ });
115
+
116
+ this.passManager.addRuleToPass(PassId.Structural, {
117
+ id: 'predicate-pushdown',
118
+ nodeType: PlanNodeType.Filter,
119
+ phase: 'rewrite',
120
+ fn: rulePredicatePushdown,
121
+ priority: 20
122
+ });
123
+
124
+ // Physical pass rules (bottom-up) - for logical to physical transformations
125
+ this.passManager.addRuleToPass(PassId.Physical, {
126
+ id: 'select-access-path',
127
+ nodeType: PlanNodeType.Retrieve,
128
+ phase: 'impl',
129
+ fn: ruleSelectAccessPath,
130
+ priority: 10
131
+ });
132
+
133
+ // QuickPick join enumeration (optional via tuning)
134
+ this.passManager.addRuleToPass(PassId.Physical, {
135
+ id: 'quickpick-join-enumeration',
136
+ nodeType: PlanNodeType.Join,
137
+ phase: 'impl',
138
+ fn: ruleQuickPickJoinEnumeration,
139
+ priority: 5
140
+ });
141
+
142
+ this.passManager.addRuleToPass(PassId.Physical, {
143
+ id: 'aggregate-streaming',
144
+ nodeType: PlanNodeType.Aggregate,
145
+ phase: 'impl',
146
+ fn: ruleAggregateStreaming,
147
+ priority: 20
148
+ });
149
+
150
+ // Post-optimization pass rules (bottom-up) - for cleanup and caching
151
+ this.passManager.addRuleToPass(PassId.PostOptimization, {
152
+ id: 'mutating-subquery-cache',
153
+ nodeType: PlanNodeType.Join,
154
+ phase: 'rewrite',
155
+ fn: ruleMutatingSubqueryCache,
156
+ priority: 10
157
+ });
158
+
159
+ this.passManager.addRuleToPass(PassId.PostOptimization, {
160
+ id: 'cte-optimization',
161
+ nodeType: PlanNodeType.CTE,
162
+ phase: 'rewrite',
163
+ fn: ruleCteOptimization,
164
+ priority: 20
165
+ });
166
+
167
+ // Register materialization advisory for multiple node types
168
+ const nodeTypesForMaterialization = [
169
+ PlanNodeType.Block,
170
+ PlanNodeType.ScalarSubquery,
171
+ PlanNodeType.Exists,
172
+ PlanNodeType.In,
173
+ PlanNodeType.Insert,
174
+ PlanNodeType.Update,
175
+ PlanNodeType.Delete,
106
176
  PlanNodeType.CTE,
107
- 'impl',
108
- ruleCteOptimization,
109
- 70 // Lower priority - caching optimization
110
- ));
111
-
112
- // Phase 2 rules - Materialization advisory
113
- // TODO: Can we apply this more generally rather than assuming certain node types?
114
- // Register for all node types that can have relational children
115
- const nodeTypesWithRelationalChildren = [
116
- PlanNodeType.Block, // Contains statements
117
- PlanNodeType.ScalarSubquery, // Contains relational subquery
118
- PlanNodeType.Exists, // Contains relational subquery
119
- PlanNodeType.In, // Can contain relational subquery
120
- PlanNodeType.Insert, // Has source relation
121
- PlanNodeType.Update, // Has source relation
122
- PlanNodeType.Delete, // Has source relation
123
- PlanNodeType.CTE, // Has definition relation
124
- PlanNodeType.RecursiveCTE, // Has anchor/recursive relations
125
- PlanNodeType.Returning, // Wraps DML operations
126
- // Scalar nodes that might contain subqueries
127
- PlanNodeType.ScalarFunctionCall, // Function args might be subqueries
128
- PlanNodeType.CaseExpr, // CASE conditions might be subqueries
177
+ PlanNodeType.RecursiveCTE,
178
+ PlanNodeType.Returning,
179
+ PlanNodeType.ScalarFunctionCall,
180
+ PlanNodeType.CaseExpr,
129
181
  ];
130
182
 
131
- for (const nodeType of nodeTypesWithRelationalChildren) {
132
- toRegister.push(createRule(
133
- 'materialization-advisory',
183
+ for (const nodeType of nodeTypesForMaterialization) {
184
+ this.passManager.addRuleToPass(PassId.PostOptimization, {
185
+ id: `materialization-advisory-${nodeType}`,
134
186
  nodeType,
135
- 'rewrite',
136
- ruleMaterializationAdvisory,
137
- 90 // Low priority - run last for global analysis
138
- ));
187
+ phase: 'rewrite',
188
+ fn: ruleMaterializationAdvisory,
189
+ priority: 30
190
+ });
139
191
  }
140
192
 
141
- // Register all rules at once
142
- registerRules(toRegister);
193
+ log('Registered rules to optimization passes');
143
194
  }
144
195
 
145
196
  /**
@@ -153,18 +204,17 @@ export class Optimizer {
153
204
 
154
205
  tracePhaseStart('optimization');
155
206
  try {
156
- // Phase 0: Single-pass constant folding before other rules
157
- log('Running constant folding pre-pass');
158
- const constantFoldedPlan = this.performConstantFolding(plan, context);
207
+ // Execute all optimization passes
208
+ const optimizedPlan = this.passManager.execute(plan, context);
159
209
 
160
- // Continue with rule-based optimization
161
- const result = this.optimizeNode(constantFoldedPlan, context);
210
+ // Capture diagnostics snapshot for external consumers
211
+ this.lastDiagnostics = { ...context.diagnostics };
162
212
 
163
- // Phase 3: Validate the physical plan before returning
213
+ // Final validation (if enabled)
164
214
  if (this.tuning.debug.validatePlan) {
165
215
  log('Running plan validation');
166
216
  try {
167
- validatePhysicalTree(result);
217
+ validatePhysicalTree(optimizedPlan);
168
218
  log('Plan validation passed');
169
219
  } catch (error) {
170
220
  log('Plan validation failed: %s', error);
@@ -172,12 +222,32 @@ export class Optimizer {
172
222
  }
173
223
  }
174
224
 
175
- return result;
225
+ return optimizedPlan;
176
226
  } finally {
177
227
  tracePhaseEnd('optimization');
178
228
  }
179
229
  }
180
230
 
231
+ /**
232
+ * Run only non-physical passes to obtain a structurally rewritten logical plan
233
+ * suitable for pre-physical analysis (e.g., row-specific classification).
234
+ */
235
+ optimizeForAnalysis(plan: PlanNode, db: Database): PlanNode {
236
+ log('Starting pre-physical analysis optimization of plan', plan.nodeType);
237
+
238
+ const context = createOptContext(this, this.stats, this.tuning, db);
239
+ tracePhaseStart('pre-physical-analysis');
240
+ try {
241
+ // Execute only structural pass(es) and constant folding
242
+ const folded = this.performConstantFolding(plan, context);
243
+ const structuralOnly = this.passManager.executeUpTo(folded, context, PassId.Structural);
244
+ this.lastDiagnostics = { ...context.diagnostics };
245
+ return structuralOnly;
246
+ } finally {
247
+ tracePhaseEnd('pre-physical-analysis');
248
+ }
249
+ }
250
+
181
251
  /**
182
252
  * Perform single-pass constant folding over the entire plan tree
183
253
  */
@@ -254,4 +324,9 @@ export class Optimizer {
254
324
  getStats(): StatsProvider {
255
325
  return this.stats;
256
326
  }
327
+
328
+ /** Get diagnostics from the last optimization run */
329
+ getLastDiagnostics(): OptimizerDiagnostics | null {
330
+ return this.lastDiagnostics;
331
+ }
257
332
  }
@@ -2,8 +2,8 @@ import type { SqlParameters } from '../common/types.js';
2
2
  import type { Database } from '../core/database.js';
3
3
  import type { SchemaManager } from '../schema/manager.js';
4
4
  import type { Scope } from './scopes/scope.js';
5
- import type { ScalarPlanNode } from './nodes/plan-node.js';
6
- import type { CTEPlanNode } from './nodes/cte-node.js';
5
+ import type { PlanNode, ScalarPlanNode } from './nodes/plan-node.js';
6
+ import type { CTEScopeNode } from './nodes/cte-node.js';
7
7
  import type { CTEReferenceNode } from './nodes/cte-reference-node.js';
8
8
 
9
9
  /**
@@ -17,6 +17,7 @@ export interface DebugOptions {
17
17
  /** Enable instruction program output */
18
18
  showProgram?: boolean;
19
19
  /** Custom debug context for additional logging */
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
21
  debugContext?: Record<string, any>;
21
22
  }
22
23
 
@@ -36,12 +37,14 @@ export interface SchemaDependency {
36
37
  */
37
38
  export class BuildTimeDependencyTracker {
38
39
  private dependencies = new Set<string>();
40
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
39
41
  private resolvedObjects = new Map<string, WeakRef<any>>();
40
42
  private invalidationCallbacks = new Set<() => void>();
41
43
 
42
44
  /**
43
45
  * Records a dependency on a schema object and stores a weak reference to it.
44
46
  */
47
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
45
48
  recordDependency(dep: SchemaDependency, object: any): void {
46
49
  const key = this.dependencyKey(dep);
47
50
  this.dependencies.add(key);
@@ -163,7 +166,7 @@ export interface PlanningContext {
163
166
  * This map contains all CTEs from the current WITH clause and any parent WITH clauses,
164
167
  * allowing subqueries in expressions to resolve CTE references correctly.
165
168
  */
166
- readonly cteNodes?: Map<string, CTEPlanNode>;
169
+ readonly cteNodes?: Map<string, CTEScopeNode>;
167
170
 
168
171
  /**
169
172
  * Schema dependency tracker for this planning session.
@@ -173,6 +176,7 @@ export interface PlanningContext {
173
176
  /**
174
177
  * Schema object cache for resolved objects during planning.
175
178
  */
179
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
176
180
  readonly schemaCache: Map<string, any>;
177
181
 
178
182
  /**
@@ -180,4 +184,7 @@ export interface PlanningContext {
180
184
  * to the same CTE with the same alias. Key format: "cteName:alias"
181
185
  */
182
186
  cteReferenceCache?: Map<string, CTEReferenceNode>;
187
+
188
+ /** maps a RelationalPlanNode to its column scope during building */
189
+ readonly outputScopes: Map<PlanNode, Scope>;
183
190
  }
@@ -3,6 +3,7 @@ import * as AST from "../parser/ast.js";
3
3
  import { ColumnReferenceNode, FunctionReferenceNode, ParameterReferenceNode, TableReferenceNode } from "./nodes/reference.js";
4
4
  import { QuereusError } from "../common/errors.js";
5
5
  import { StatusCode } from "../common/types.js";
6
+ import { isScalarNode, type ScalarPlanNode } from "./nodes/plan-node.js";
6
7
 
7
8
  export function resolveTable(scope: Scope, exp: AST.IdentifierExpr, selectedSchema: string = 'main'): TableReferenceNode | typeof Ambiguous | undefined {
8
9
  // table: [schema.]name
@@ -28,7 +29,7 @@ export function resolveTable(scope: Scope, exp: AST.IdentifierExpr, selectedSche
28
29
  // throw new QuereusError(`${idName} isn't a pragma`, StatusCode.ERROR);
29
30
  // }
30
31
 
31
- export function resolveColumn(scope: Scope, exp: AST.ColumnExpr, selectedSchema: string = 'main'): ColumnReferenceNode | typeof Ambiguous | undefined {
32
+ export function resolveColumn(scope: Scope, exp: AST.ColumnExpr, selectedSchema: string = 'main'): ScalarPlanNode | typeof Ambiguous | undefined {
32
33
  const schemaQualifier = exp.schema;
33
34
  const tableQualifier = exp.table;
34
35
  const columnName = exp.name;
@@ -38,8 +39,8 @@ export function resolveColumn(scope: Scope, exp: AST.ColumnExpr, selectedSchema:
38
39
  // Fully qualified: schema.table.column
39
40
  const symbolKey = `${schemaQualifier}.${tableQualifier}.${columnName}`;
40
41
  const result = scope.resolveSymbol(symbolKey, exp);
41
- if (result === Ambiguous || result instanceof ColumnReferenceNode) {
42
- return result;
42
+ if (result === Ambiguous || (result && isScalarNode(result))) {
43
+ return result as ScalarPlanNode | typeof Ambiguous;
43
44
  }
44
45
  throw new QuereusError(`${symbolKey} isn't a column`, StatusCode.ERROR);
45
46
  } else {
@@ -47,15 +48,15 @@ export function resolveColumn(scope: Scope, exp: AST.ColumnExpr, selectedSchema:
47
48
  // Try without schema first, then with schema if that fails
48
49
  const unqualifiedKey = `${tableQualifier}.${columnName}`;
49
50
  const result = scope.resolveSymbol(unqualifiedKey, exp);
50
- if (result === Ambiguous || result instanceof ColumnReferenceNode) {
51
- return result;
51
+ if (result === Ambiguous || (result && isScalarNode(result))) {
52
+ return result as ScalarPlanNode | typeof Ambiguous;
52
53
  }
53
54
 
54
55
  // If unqualified fails, try with the selected schema
55
56
  const qualifiedKey = `${selectedSchema}.${tableQualifier}.${columnName}`;
56
57
  const qualifiedResult = scope.resolveSymbol(qualifiedKey, exp);
57
- if (qualifiedResult === Ambiguous || qualifiedResult instanceof ColumnReferenceNode) {
58
- return qualifiedResult;
58
+ if (qualifiedResult === Ambiguous || (qualifiedResult && isScalarNode(qualifiedResult))) {
59
+ return qualifiedResult as ScalarPlanNode | typeof Ambiguous;
59
60
  }
60
61
 
61
62
  throw new QuereusError(`${unqualifiedKey} isn't a column`, StatusCode.ERROR);
@@ -63,8 +64,8 @@ export function resolveColumn(scope: Scope, exp: AST.ColumnExpr, selectedSchema:
63
64
  } else {
64
65
  // Unqualified: column
65
66
  const result = scope.resolveSymbol(columnName, exp);
66
- if (result === Ambiguous || result instanceof ColumnReferenceNode) {
67
- return result;
67
+ if (result === Ambiguous || (result && isScalarNode(result))) {
68
+ return result as ScalarPlanNode | typeof Ambiguous;
68
69
  }
69
70
  throw new QuereusError(`Column not found: ${columnName}`, StatusCode.ERROR);
70
71
  }
@@ -1,96 +1,96 @@
1
- # Optimizer Rules Directory
2
-
3
- This directory contains optimization rules for the Quereus Titan optimizer, organized by functional area.
4
-
5
- ## Directory Structure
6
-
7
- ```
8
- rules/
9
- ├── rewrite/ # Logical-to-logical transformations
10
- │ ├── predicate-pushdown/
11
- │ ├── join-reordering/
12
- │ └── subquery-rewrite/
13
- ├── access/ # Table access path optimization
14
- │ ├── index-selection/
15
- │ └── scan-strategy/
16
- ├── join/ # Join algorithm selection and optimization
17
- │ ├── algorithm-selection/
18
- │ └── join-ordering/
19
- ├── aggregate/ # Aggregation optimization
20
- │ ├── streaming/
21
- │ └── hash-aggregate/
22
- ├── cache/ # Caching and materialization
23
- │ ├── materialization/
24
- │ └── cache-injection/
25
- └── physical/ # Physical property propagation
26
- ├── ordering/
27
- └── uniqueness/
28
- ```
29
-
30
- ## Rule Categories
31
-
32
- ### Rewrite Rules (Logical → Logical)
33
- Transform logical plan structure without changing to physical nodes:
34
- - Predicate pushdown
35
- - Join reordering based on cardinality
36
- - Subquery → join conversions
37
- - Constant folding and elimination
38
-
39
- ### Access Rules (Logical → Physical)
40
- Choose optimal table access strategies:
41
- - Index vs. sequential scan selection
42
- - Index seek vs. scan decisions
43
- - Column pruning integration
44
-
45
- ### Join Rules (Logical → Physical)
46
- Select join algorithms and optimize join trees:
47
- - Nested loop vs. hash join selection
48
- - Join order optimization
49
- - Cache injection for inner sides
50
-
51
- ### Aggregate Rules (Logical → Physical)
52
- Choose aggregation implementation strategies:
53
- - Stream vs. hash aggregation
54
- - Sort requirement analysis
55
- - Grouping optimization
56
-
57
- ### Cache Rules
58
- Inject caching where beneficial:
59
- - CTE materialization decisions
60
- - Nested loop inner caching
61
- - Spill-to-disk strategies
62
-
63
- ### Physical Rules
64
- Propagate and optimize physical properties:
65
- - Ordering preservation and requirements
66
- - Uniqueness key propagation
67
- - Constant and deterministic flags
68
-
69
- ## Rule Naming Convention
70
-
71
- Rules follow the pattern: `rule-<description>.ts`
72
-
73
- Examples:
74
- - `rule-predicate-pushdown.ts`
75
- - `rule-aggregate-streaming.ts`
76
- - `rule-join-hash-conversion.ts`
77
- - `rule-cache-cte-materialization.ts`
78
-
79
- ## Implementation Requirements
80
-
81
- Each rule must:
82
- 1. Follow the function signature: `(node: PlanNode, optimizer: Optimizer) => PlanNode | null`
83
- 2. Include comprehensive unit tests in co-located `.spec.ts` file
84
- 3. Use consistent logging with `createLogger('optimizer:rule:<name>')`
85
- 4. Preserve attribute IDs when creating new nodes
86
- 5. Set appropriate physical properties using `PlanNode.setDefaultPhysical()`
87
-
88
- ## Getting Started
89
-
90
- 1. Choose the appropriate category directory
91
- 2. Copy the rule template from `docs/optimizer-conventions.md`
92
- 3. Implement the rule following the established patterns
93
- 4. Add comprehensive unit tests
94
- 5. Register the rule in the appropriate registry file
95
-
96
- See `docs/optimizer-conventions.md` for detailed implementation guidelines.
1
+ # Optimizer Rules Directory
2
+
3
+ This directory contains optimization rules for the Quereus Titan optimizer, organized by functional area.
4
+
5
+ ## Directory Structure
6
+
7
+ ```
8
+ rules/
9
+ ├── rewrite/ # Logical-to-logical transformations
10
+ │ ├── predicate-pushdown/
11
+ │ ├── join-reordering/
12
+ │ └── subquery-rewrite/
13
+ ├── access/ # Table access path optimization
14
+ │ ├── index-selection/
15
+ │ └── scan-strategy/
16
+ ├── join/ # Join algorithm selection and optimization
17
+ │ ├── algorithm-selection/
18
+ │ └── join-ordering/
19
+ ├── aggregate/ # Aggregation optimization
20
+ │ ├── streaming/
21
+ │ └── hash-aggregate/
22
+ ├── cache/ # Caching and materialization
23
+ │ ├── materialization/
24
+ │ └── cache-injection/
25
+ └── physical/ # Physical property propagation
26
+ ├── ordering/
27
+ └── uniqueness/
28
+ ```
29
+
30
+ ## Rule Categories
31
+
32
+ ### Rewrite Rules (Logical → Logical)
33
+ Transform logical plan structure without changing to physical nodes:
34
+ - Retrieve growth (modules handle pushdown via Retrieve pipelines)
35
+ - Join reordering based on cardinality
36
+ - Subquery → join conversions
37
+ - Constant folding and elimination
38
+
39
+ ### Access Rules (Logical → Physical)
40
+ Choose optimal table access strategies:
41
+ - Index vs. sequential scan selection
42
+ - Index seek vs. scan decisions
43
+ - Column pruning integration
44
+
45
+ ### Join Rules (Logical → Physical)
46
+ Select join algorithms and optimize join trees:
47
+ - Nested loop vs. hash join selection
48
+ - Join order optimization
49
+ - Cache injection for inner sides
50
+
51
+ ### Aggregate Rules (Logical → Physical)
52
+ Choose aggregation implementation strategies:
53
+ - Stream vs. hash aggregation
54
+ - Sort requirement analysis
55
+ - Grouping optimization
56
+
57
+ ### Cache Rules
58
+ Inject caching where beneficial:
59
+ - CTE materialization decisions
60
+ - Nested loop inner caching
61
+ - Spill-to-disk strategies
62
+
63
+ ### Physical Rules
64
+ Propagate and optimize physical properties:
65
+ - Ordering preservation and requirements
66
+ - Uniqueness key propagation
67
+ - Constant and deterministic flags
68
+
69
+ ## Rule Naming Convention
70
+
71
+ Rules follow the pattern: `rule-<description>.ts`
72
+
73
+ Examples:
74
+ - `rule-grow-retrieve.ts`
75
+ - `rule-aggregate-streaming.ts`
76
+ - `rule-join-hash-conversion.ts`
77
+ - `rule-cache-cte-materialization.ts`
78
+
79
+ ## Implementation Requirements
80
+
81
+ Each rule must:
82
+ 1. Follow the function signature: `(node: PlanNode, optimizer: Optimizer) => PlanNode | null`
83
+ 2. Include comprehensive unit tests in co-located `.spec.ts` file
84
+ 3. Use consistent logging with `createLogger('optimizer:rule:<name>')`
85
+ 4. Preserve attribute IDs when creating new nodes
86
+ 5. Set appropriate physical properties using `PlanNode.setDefaultPhysical()`
87
+
88
+ ## Getting Started
89
+
90
+ 1. Choose the appropriate category directory
91
+ 2. Copy the rule template from `docs/optimizer-conventions.md`
92
+ 3. Implement the rule following the established patterns
93
+ 4. Add comprehensive unit tests
94
+ 5. Register the rule in the appropriate registry file
95
+
96
+ See `docs/optimizer-conventions.md` for detailed implementation guidelines.