@quereus/quereus 0.2.1 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (760) hide show
  1. package/README.md +12 -1
  2. package/dist/src/common/errors.js.map +1 -1
  3. package/dist/src/common/json-types.d.ts +11 -0
  4. package/dist/src/common/json-types.d.ts.map +1 -0
  5. package/dist/src/common/json-types.js +3 -0
  6. package/dist/src/common/json-types.js.map +1 -0
  7. package/dist/src/common/types.d.ts +1 -0
  8. package/dist/src/common/types.d.ts.map +1 -1
  9. package/dist/src/core/database-options.d.ts +2 -2
  10. package/dist/src/core/database-options.d.ts.map +1 -1
  11. package/dist/src/core/database-options.js.map +1 -1
  12. package/dist/src/core/database.d.ts +61 -14
  13. package/dist/src/core/database.d.ts.map +1 -1
  14. package/dist/src/core/database.js +481 -54
  15. package/dist/src/core/database.js.map +1 -1
  16. package/dist/src/core/statement.d.ts.map +1 -1
  17. package/dist/src/core/statement.js +3 -1
  18. package/dist/src/core/statement.js.map +1 -1
  19. package/dist/src/func/builtins/builtin-window-functions.d.ts.map +1 -1
  20. package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
  21. package/dist/src/func/builtins/datetime.d.ts +2 -0
  22. package/dist/src/func/builtins/datetime.d.ts.map +1 -1
  23. package/dist/src/func/builtins/datetime.js +39 -0
  24. package/dist/src/func/builtins/datetime.js.map +1 -1
  25. package/dist/src/func/builtins/explain.d.ts +1 -0
  26. package/dist/src/func/builtins/explain.d.ts.map +1 -1
  27. package/dist/src/func/builtins/explain.js +159 -36
  28. package/dist/src/func/builtins/explain.js.map +1 -1
  29. package/dist/src/func/builtins/index.d.ts.map +1 -1
  30. package/dist/src/func/builtins/index.js +5 -2
  31. package/dist/src/func/builtins/index.js.map +1 -1
  32. package/dist/src/func/builtins/json-helpers.d.ts +8 -8
  33. package/dist/src/func/builtins/json-helpers.d.ts.map +1 -1
  34. package/dist/src/func/builtins/json-helpers.js +3 -3
  35. package/dist/src/func/builtins/json-helpers.js.map +1 -1
  36. package/dist/src/func/builtins/json-tvf.d.ts.map +1 -1
  37. package/dist/src/func/builtins/json-tvf.js +1 -1
  38. package/dist/src/func/builtins/json-tvf.js.map +1 -1
  39. package/dist/src/func/builtins/json.d.ts.map +1 -1
  40. package/dist/src/func/builtins/json.js +3 -2
  41. package/dist/src/func/builtins/json.js.map +1 -1
  42. package/dist/src/func/builtins/schema.d.ts.map +1 -1
  43. package/dist/src/func/builtins/schema.js +22 -1
  44. package/dist/src/func/builtins/schema.js.map +1 -1
  45. package/dist/src/func/context.d.ts.map +1 -1
  46. package/dist/src/func/context.js +5 -0
  47. package/dist/src/func/context.js.map +1 -1
  48. package/dist/src/func/registration.d.ts +2 -1
  49. package/dist/src/func/registration.d.ts.map +1 -1
  50. package/dist/src/func/registration.js.map +1 -1
  51. package/dist/src/index.d.ts +2 -2
  52. package/dist/src/index.d.ts.map +1 -1
  53. package/dist/src/index.js +2 -2
  54. package/dist/src/index.js.map +1 -1
  55. package/dist/src/parser/ast.d.ts +83 -4
  56. package/dist/src/parser/ast.d.ts.map +1 -1
  57. package/dist/src/parser/lexer.d.ts +11 -0
  58. package/dist/src/parser/lexer.d.ts.map +1 -1
  59. package/dist/src/parser/lexer.js +29 -21
  60. package/dist/src/parser/lexer.js.map +1 -1
  61. package/dist/src/parser/parser.d.ts +16 -0
  62. package/dist/src/parser/parser.d.ts.map +1 -1
  63. package/dist/src/parser/parser.js +542 -26
  64. package/dist/src/parser/parser.js.map +1 -1
  65. package/dist/src/parser/visitor.d.ts.map +1 -1
  66. package/dist/src/parser/visitor.js +1 -0
  67. package/dist/src/parser/visitor.js.map +1 -1
  68. package/dist/src/planner/analysis/binding-collector.d.ts +5 -0
  69. package/dist/src/planner/analysis/binding-collector.d.ts.map +1 -0
  70. package/dist/src/planner/analysis/binding-collector.js +73 -0
  71. package/dist/src/planner/analysis/binding-collector.js.map +1 -0
  72. package/dist/src/planner/analysis/const-evaluator.js +1 -1
  73. package/dist/src/planner/analysis/const-evaluator.js.map +1 -1
  74. package/dist/src/planner/analysis/const-pass.d.ts.map +1 -1
  75. package/dist/src/planner/analysis/const-pass.js +1 -1
  76. package/dist/src/planner/analysis/const-pass.js.map +1 -1
  77. package/dist/src/planner/analysis/constraint-extractor.d.ts +67 -31
  78. package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
  79. package/dist/src/planner/analysis/constraint-extractor.js +513 -84
  80. package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
  81. package/dist/src/planner/analysis/predicate-normalizer.d.ts +17 -0
  82. package/dist/src/planner/analysis/predicate-normalizer.d.ts.map +1 -0
  83. package/dist/src/planner/analysis/predicate-normalizer.js +222 -0
  84. package/dist/src/planner/analysis/predicate-normalizer.js.map +1 -0
  85. package/dist/src/planner/building/alter-table.d.ts.map +1 -1
  86. package/dist/src/planner/building/alter-table.js +5 -2
  87. package/dist/src/planner/building/alter-table.js.map +1 -1
  88. package/dist/src/planner/building/block.d.ts.map +1 -1
  89. package/dist/src/planner/building/block.js +16 -0
  90. package/dist/src/planner/building/block.js.map +1 -1
  91. package/dist/src/planner/building/constraint-builder.d.ts +1 -1
  92. package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
  93. package/dist/src/planner/building/constraint-builder.js +52 -3
  94. package/dist/src/planner/building/constraint-builder.js.map +1 -1
  95. package/dist/src/planner/building/create-assertion.d.ts +5 -0
  96. package/dist/src/planner/building/create-assertion.d.ts.map +1 -0
  97. package/dist/src/planner/building/create-assertion.js +5 -0
  98. package/dist/src/planner/building/create-assertion.js.map +1 -0
  99. package/dist/src/planner/building/declare-schema.d.ts +8 -0
  100. package/dist/src/planner/building/declare-schema.d.ts.map +1 -0
  101. package/dist/src/planner/building/declare-schema.js +14 -0
  102. package/dist/src/planner/building/declare-schema.js.map +1 -0
  103. package/dist/src/planner/building/delete.d.ts.map +1 -1
  104. package/dist/src/planner/building/delete.js +37 -5
  105. package/dist/src/planner/building/delete.js.map +1 -1
  106. package/dist/src/planner/building/drop-assertion.d.ts +5 -0
  107. package/dist/src/planner/building/drop-assertion.d.ts.map +1 -0
  108. package/dist/src/planner/building/drop-assertion.js +8 -0
  109. package/dist/src/planner/building/drop-assertion.js.map +1 -0
  110. package/dist/src/planner/building/expression.d.ts.map +1 -1
  111. package/dist/src/planner/building/expression.js +1 -0
  112. package/dist/src/planner/building/expression.js.map +1 -1
  113. package/dist/src/planner/building/function-call.d.ts.map +1 -1
  114. package/dist/src/planner/building/function-call.js +2 -1
  115. package/dist/src/planner/building/function-call.js.map +1 -1
  116. package/dist/src/planner/building/insert.d.ts.map +1 -1
  117. package/dist/src/planner/building/insert.js +67 -10
  118. package/dist/src/planner/building/insert.js.map +1 -1
  119. package/dist/src/planner/building/pragma.d.ts.map +1 -1
  120. package/dist/src/planner/building/pragma.js +1 -0
  121. package/dist/src/planner/building/pragma.js.map +1 -1
  122. package/dist/src/planner/building/schema-resolution.d.ts +2 -2
  123. package/dist/src/planner/building/schema-resolution.d.ts.map +1 -1
  124. package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
  125. package/dist/src/planner/building/select-aggregates.js +3 -2
  126. package/dist/src/planner/building/select-aggregates.js.map +1 -1
  127. package/dist/src/planner/building/select-compound.d.ts +2 -2
  128. package/dist/src/planner/building/select-compound.d.ts.map +1 -1
  129. package/dist/src/planner/building/select-compound.js +10 -1
  130. package/dist/src/planner/building/select-compound.js.map +1 -1
  131. package/dist/src/planner/building/select-context.d.ts +3 -3
  132. package/dist/src/planner/building/select-context.d.ts.map +1 -1
  133. package/dist/src/planner/building/select-context.js.map +1 -1
  134. package/dist/src/planner/building/select-modifiers.d.ts +6 -5
  135. package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
  136. package/dist/src/planner/building/select-modifiers.js +5 -4
  137. package/dist/src/planner/building/select-modifiers.js.map +1 -1
  138. package/dist/src/planner/building/select-projections.d.ts.map +1 -1
  139. package/dist/src/planner/building/select-projections.js +4 -5
  140. package/dist/src/planner/building/select-projections.js.map +1 -1
  141. package/dist/src/planner/building/select-window.d.ts.map +1 -1
  142. package/dist/src/planner/building/select-window.js +6 -3
  143. package/dist/src/planner/building/select-window.js.map +1 -1
  144. package/dist/src/planner/building/select.d.ts +3 -3
  145. package/dist/src/planner/building/select.d.ts.map +1 -1
  146. package/dist/src/planner/building/select.js +18 -8
  147. package/dist/src/planner/building/select.js.map +1 -1
  148. package/dist/src/planner/building/table-function.d.ts.map +1 -1
  149. package/dist/src/planner/building/table-function.js +1 -1
  150. package/dist/src/planner/building/table-function.js.map +1 -1
  151. package/dist/src/planner/building/table.d.ts +5 -3
  152. package/dist/src/planner/building/table.d.ts.map +1 -1
  153. package/dist/src/planner/building/table.js +7 -2
  154. package/dist/src/planner/building/table.js.map +1 -1
  155. package/dist/src/planner/building/update.d.ts.map +1 -1
  156. package/dist/src/planner/building/update.js +38 -6
  157. package/dist/src/planner/building/update.js.map +1 -1
  158. package/dist/src/planner/building/with.d.ts +3 -3
  159. package/dist/src/planner/building/with.d.ts.map +1 -1
  160. package/dist/src/planner/building/with.js.map +1 -1
  161. package/dist/src/planner/debug.d.ts.map +1 -1
  162. package/dist/src/planner/debug.js.map +1 -1
  163. package/dist/src/planner/framework/characteristics.d.ts +235 -0
  164. package/dist/src/planner/framework/characteristics.d.ts.map +1 -0
  165. package/dist/src/planner/framework/characteristics.js +299 -0
  166. package/dist/src/planner/framework/characteristics.js.map +1 -0
  167. package/dist/src/planner/framework/context.d.ts +16 -5
  168. package/dist/src/planner/framework/context.d.ts.map +1 -1
  169. package/dist/src/planner/framework/context.js +2 -0
  170. package/dist/src/planner/framework/context.js.map +1 -1
  171. package/dist/src/planner/framework/pass.d.ts +116 -0
  172. package/dist/src/planner/framework/pass.d.ts.map +1 -0
  173. package/dist/src/planner/framework/pass.js +236 -0
  174. package/dist/src/planner/framework/pass.js.map +1 -0
  175. package/dist/src/planner/nodes/aggregate-node.d.ts +16 -6
  176. package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
  177. package/dist/src/planner/nodes/aggregate-node.js +40 -4
  178. package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
  179. package/dist/src/planner/nodes/array-index-node.js.map +1 -1
  180. package/dist/src/planner/nodes/cache-node.d.ts +5 -2
  181. package/dist/src/planner/nodes/cache-node.d.ts.map +1 -1
  182. package/dist/src/planner/nodes/cache-node.js +6 -0
  183. package/dist/src/planner/nodes/cache-node.js.map +1 -1
  184. package/dist/src/planner/nodes/constraint-check-node.d.ts +10 -2
  185. package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
  186. package/dist/src/planner/nodes/constraint-check-node.js +12 -4
  187. package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
  188. package/dist/src/planner/nodes/create-assertion-node.d.ts +22 -0
  189. package/dist/src/planner/nodes/create-assertion-node.d.ts.map +1 -0
  190. package/dist/src/planner/nodes/create-assertion-node.js +41 -0
  191. package/dist/src/planner/nodes/create-assertion-node.js.map +1 -0
  192. package/dist/src/planner/nodes/create-index-node.js +2 -2
  193. package/dist/src/planner/nodes/create-index-node.js.map +1 -1
  194. package/dist/src/planner/nodes/create-table-node.js +2 -2
  195. package/dist/src/planner/nodes/create-table-node.js.map +1 -1
  196. package/dist/src/planner/nodes/cte-node.d.ts +17 -2
  197. package/dist/src/planner/nodes/cte-node.d.ts.map +1 -1
  198. package/dist/src/planner/nodes/cte-node.js +9 -1
  199. package/dist/src/planner/nodes/cte-node.js.map +1 -1
  200. package/dist/src/planner/nodes/cte-reference-node.js +1 -1
  201. package/dist/src/planner/nodes/cte-reference-node.js.map +1 -1
  202. package/dist/src/planner/nodes/declarative-schema.d.ts +62 -0
  203. package/dist/src/planner/nodes/declarative-schema.d.ts.map +1 -0
  204. package/dist/src/planner/nodes/declarative-schema.js +181 -0
  205. package/dist/src/planner/nodes/declarative-schema.js.map +1 -0
  206. package/dist/src/planner/nodes/delete-node.d.ts +8 -3
  207. package/dist/src/planner/nodes/delete-node.d.ts.map +1 -1
  208. package/dist/src/planner/nodes/delete-node.js +10 -2
  209. package/dist/src/planner/nodes/delete-node.js.map +1 -1
  210. package/dist/src/planner/nodes/distinct-node.d.ts +3 -2
  211. package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
  212. package/dist/src/planner/nodes/distinct-node.js +17 -4
  213. package/dist/src/planner/nodes/distinct-node.js.map +1 -1
  214. package/dist/src/planner/nodes/dml-executor-node.d.ts +1 -1
  215. package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
  216. package/dist/src/planner/nodes/drop-assertion-node.d.ts +21 -0
  217. package/dist/src/planner/nodes/drop-assertion-node.d.ts.map +1 -0
  218. package/dist/src/planner/nodes/drop-assertion-node.js +41 -0
  219. package/dist/src/planner/nodes/drop-assertion-node.js.map +1 -0
  220. package/dist/src/planner/nodes/drop-table-node.d.ts.map +1 -1
  221. package/dist/src/planner/nodes/drop-table-node.js +1 -0
  222. package/dist/src/planner/nodes/drop-table-node.js.map +1 -1
  223. package/dist/src/planner/nodes/filter.d.ts +8 -3
  224. package/dist/src/planner/nodes/filter.d.ts.map +1 -1
  225. package/dist/src/planner/nodes/filter.js +44 -0
  226. package/dist/src/planner/nodes/filter.js.map +1 -1
  227. package/dist/src/planner/nodes/insert-node.d.ts +9 -3
  228. package/dist/src/planner/nodes/insert-node.d.ts.map +1 -1
  229. package/dist/src/planner/nodes/insert-node.js +11 -2
  230. package/dist/src/planner/nodes/insert-node.js.map +1 -1
  231. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts +3 -4
  232. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts.map +1 -1
  233. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js +1 -16
  234. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js.map +1 -1
  235. package/dist/src/planner/nodes/join-node.d.ts +12 -3
  236. package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
  237. package/dist/src/planner/nodes/join-node.js +111 -2
  238. package/dist/src/planner/nodes/join-node.js.map +1 -1
  239. package/dist/src/planner/nodes/limit-offset.d.ts +7 -3
  240. package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
  241. package/dist/src/planner/nodes/limit-offset.js +15 -0
  242. package/dist/src/planner/nodes/limit-offset.js.map +1 -1
  243. package/dist/src/planner/nodes/plan-node-type.d.ts +8 -0
  244. package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
  245. package/dist/src/planner/nodes/plan-node-type.js +8 -0
  246. package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
  247. package/dist/src/planner/nodes/plan-node.d.ts +9 -9
  248. package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
  249. package/dist/src/planner/nodes/plan-node.js +3 -3
  250. package/dist/src/planner/nodes/plan-node.js.map +1 -1
  251. package/dist/src/planner/nodes/pragma.d.ts +2 -1
  252. package/dist/src/planner/nodes/pragma.d.ts.map +1 -1
  253. package/dist/src/planner/nodes/pragma.js +3 -1
  254. package/dist/src/planner/nodes/pragma.js.map +1 -1
  255. package/dist/src/planner/nodes/project-node.d.ts +16 -3
  256. package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
  257. package/dist/src/planner/nodes/project-node.js +82 -2
  258. package/dist/src/planner/nodes/project-node.js.map +1 -1
  259. package/dist/src/planner/nodes/recursive-cte-node.d.ts +2 -2
  260. package/dist/src/planner/nodes/recursive-cte-node.d.ts.map +1 -1
  261. package/dist/src/planner/nodes/recursive-cte-node.js +1 -1
  262. package/dist/src/planner/nodes/recursive-cte-node.js.map +1 -1
  263. package/dist/src/planner/nodes/reference.d.ts +13 -4
  264. package/dist/src/planner/nodes/reference.d.ts.map +1 -1
  265. package/dist/src/planner/nodes/reference.js +16 -0
  266. package/dist/src/planner/nodes/reference.js.map +1 -1
  267. package/dist/src/planner/nodes/remote-query-node.d.ts +37 -0
  268. package/dist/src/planner/nodes/remote-query-node.d.ts.map +1 -0
  269. package/dist/src/planner/nodes/remote-query-node.js +63 -0
  270. package/dist/src/planner/nodes/remote-query-node.js.map +1 -0
  271. package/dist/src/planner/nodes/retrieve-node.d.ts +46 -0
  272. package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -0
  273. package/dist/src/planner/nodes/retrieve-node.js +77 -0
  274. package/dist/src/planner/nodes/retrieve-node.js.map +1 -0
  275. package/dist/src/planner/nodes/returning-node.d.ts +4 -3
  276. package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
  277. package/dist/src/planner/nodes/returning-node.js +44 -3
  278. package/dist/src/planner/nodes/returning-node.js.map +1 -1
  279. package/dist/src/planner/nodes/sequencing-node.d.ts +1 -1
  280. package/dist/src/planner/nodes/sequencing-node.d.ts.map +1 -1
  281. package/dist/src/planner/nodes/sequencing-node.js.map +1 -1
  282. package/dist/src/planner/nodes/set-operation-node.d.ts +1 -1
  283. package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
  284. package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
  285. package/dist/src/planner/nodes/sort.d.ts +11 -2
  286. package/dist/src/planner/nodes/sort.d.ts.map +1 -1
  287. package/dist/src/planner/nodes/sort.js +23 -2
  288. package/dist/src/planner/nodes/sort.js.map +1 -1
  289. package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
  290. package/dist/src/planner/nodes/stream-aggregate.js +4 -1
  291. package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
  292. package/dist/src/planner/nodes/table-access-nodes.d.ts +7 -1
  293. package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
  294. package/dist/src/planner/nodes/table-access-nodes.js +22 -4
  295. package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
  296. package/dist/src/planner/nodes/table-function-call.d.ts +2 -1
  297. package/dist/src/planner/nodes/table-function-call.d.ts.map +1 -1
  298. package/dist/src/planner/nodes/table-function-call.js +12 -5
  299. package/dist/src/planner/nodes/table-function-call.js.map +1 -1
  300. package/dist/src/planner/nodes/transaction-node.js +2 -2
  301. package/dist/src/planner/nodes/transaction-node.js.map +1 -1
  302. package/dist/src/planner/nodes/update-node.d.ts +7 -1
  303. package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
  304. package/dist/src/planner/nodes/update-node.js +11 -2
  305. package/dist/src/planner/nodes/update-node.js.map +1 -1
  306. package/dist/src/planner/nodes/view-reference-node.js.map +1 -1
  307. package/dist/src/planner/nodes/window-function.js.map +1 -1
  308. package/dist/src/planner/nodes/window-node.js.map +1 -1
  309. package/dist/src/planner/optimizer-tuning.d.ts +11 -0
  310. package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
  311. package/dist/src/planner/optimizer-tuning.js +6 -0
  312. package/dist/src/planner/optimizer-tuning.js.map +1 -1
  313. package/dist/src/planner/optimizer.d.ts +17 -3
  314. package/dist/src/planner/optimizer.d.ts.map +1 -1
  315. package/dist/src/planner/optimizer.js +159 -67
  316. package/dist/src/planner/optimizer.js.map +1 -1
  317. package/dist/src/planner/planning-context.d.ts +5 -3
  318. package/dist/src/planner/planning-context.d.ts.map +1 -1
  319. package/dist/src/planner/planning-context.js +2 -0
  320. package/dist/src/planner/planning-context.js.map +1 -1
  321. package/dist/src/planner/resolve.d.ts +3 -2
  322. package/dist/src/planner/resolve.d.ts.map +1 -1
  323. package/dist/src/planner/resolve.js +6 -5
  324. package/dist/src/planner/resolve.js.map +1 -1
  325. package/dist/src/planner/rules/access/rule-select-access-path.d.ts +8 -3
  326. package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
  327. package/dist/src/planner/rules/access/rule-select-access-path.js +206 -47
  328. package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
  329. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts +10 -3
  330. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts.map +1 -1
  331. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js +95 -87
  332. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
  333. package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts +8 -2
  334. package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts.map +1 -1
  335. package/dist/src/planner/rules/cache/rule-cte-optimization.js +24 -13
  336. package/dist/src/planner/rules/cache/rule-cte-optimization.js.map +1 -1
  337. package/dist/src/planner/rules/cache/rule-materialization-advisory.d.ts +9 -2
  338. package/dist/src/planner/rules/cache/rule-materialization-advisory.d.ts.map +1 -1
  339. package/dist/src/planner/rules/cache/rule-materialization-advisory.js +14 -7
  340. package/dist/src/planner/rules/cache/rule-materialization-advisory.js.map +1 -1
  341. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.d.ts +9 -3
  342. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.d.ts.map +1 -1
  343. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js +34 -37
  344. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js.map +1 -1
  345. package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts +14 -0
  346. package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -0
  347. package/dist/src/planner/rules/join/rule-join-greedy-commute.js +33 -0
  348. package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -0
  349. package/dist/src/planner/rules/join/rule-join-key-inference.d.ts +11 -0
  350. package/dist/src/planner/rules/join/rule-join-key-inference.d.ts.map +1 -0
  351. package/dist/src/planner/rules/join/rule-join-key-inference.js +32 -0
  352. package/dist/src/planner/rules/join/rule-join-key-inference.js.map +1 -0
  353. package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts +4 -0
  354. package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts.map +1 -0
  355. package/dist/src/planner/rules/join/rule-quickpick-enumeration.js +233 -0
  356. package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +1 -0
  357. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts +21 -0
  358. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts.map +1 -0
  359. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +125 -0
  360. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -0
  361. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts +21 -0
  362. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -0
  363. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +261 -0
  364. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -0
  365. package/dist/src/planner/scopes/registered.d.ts +1 -0
  366. package/dist/src/planner/scopes/registered.d.ts.map +1 -1
  367. package/dist/src/planner/scopes/registered.js +7 -0
  368. package/dist/src/planner/scopes/registered.js.map +1 -1
  369. package/dist/src/planner/stats/index.d.ts +0 -17
  370. package/dist/src/planner/stats/index.d.ts.map +1 -1
  371. package/dist/src/planner/stats/index.js +0 -58
  372. package/dist/src/planner/stats/index.js.map +1 -1
  373. package/dist/src/planner/util/deferred-constraint.d.ts +14 -0
  374. package/dist/src/planner/util/deferred-constraint.d.ts.map +1 -0
  375. package/dist/src/planner/util/deferred-constraint.js +85 -0
  376. package/dist/src/planner/util/deferred-constraint.js.map +1 -0
  377. package/dist/src/planner/util/key-utils.d.ts +15 -0
  378. package/dist/src/planner/util/key-utils.d.ts.map +1 -0
  379. package/dist/src/planner/util/key-utils.js +43 -0
  380. package/dist/src/planner/util/key-utils.js.map +1 -0
  381. package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
  382. package/dist/src/planner/validation/plan-validator.js +1 -0
  383. package/dist/src/planner/validation/plan-validator.js.map +1 -1
  384. package/dist/src/runtime/deferred-constraint-queue.d.ts +33 -0
  385. package/dist/src/runtime/deferred-constraint-queue.d.ts.map +1 -0
  386. package/dist/src/runtime/deferred-constraint-queue.js +172 -0
  387. package/dist/src/runtime/deferred-constraint-queue.js.map +1 -0
  388. package/dist/src/runtime/emission-context.d.ts +9 -3
  389. package/dist/src/runtime/emission-context.d.ts.map +1 -1
  390. package/dist/src/runtime/emission-context.js +5 -1
  391. package/dist/src/runtime/emission-context.js.map +1 -1
  392. package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
  393. package/dist/src/runtime/emit/add-constraint.js +22 -4
  394. package/dist/src/runtime/emit/add-constraint.js.map +1 -1
  395. package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
  396. package/dist/src/runtime/emit/aggregate.js +3 -2
  397. package/dist/src/runtime/emit/aggregate.js.map +1 -1
  398. package/dist/src/runtime/emit/array-index.js.map +1 -1
  399. package/dist/src/runtime/emit/binary.d.ts.map +1 -1
  400. package/dist/src/runtime/emit/binary.js +9 -2
  401. package/dist/src/runtime/emit/binary.js.map +1 -1
  402. package/dist/src/runtime/emit/cache.d.ts.map +1 -1
  403. package/dist/src/runtime/emit/cache.js +1 -1
  404. package/dist/src/runtime/emit/cache.js.map +1 -1
  405. package/dist/src/runtime/emit/cast.d.ts.map +1 -1
  406. package/dist/src/runtime/emit/cast.js.map +1 -1
  407. package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
  408. package/dist/src/runtime/emit/constraint-check.js +110 -23
  409. package/dist/src/runtime/emit/constraint-check.js.map +1 -1
  410. package/dist/src/runtime/emit/create-assertion.d.ts +5 -0
  411. package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -0
  412. package/dist/src/runtime/emit/create-assertion.js +70 -0
  413. package/dist/src/runtime/emit/create-assertion.js.map +1 -0
  414. package/dist/src/runtime/emit/cte-reference.d.ts.map +1 -1
  415. package/dist/src/runtime/emit/cte-reference.js.map +1 -1
  416. package/dist/src/runtime/emit/cte.d.ts.map +1 -1
  417. package/dist/src/runtime/emit/cte.js.map +1 -1
  418. package/dist/src/runtime/emit/distinct.d.ts.map +1 -1
  419. package/dist/src/runtime/emit/distinct.js.map +1 -1
  420. package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
  421. package/dist/src/runtime/emit/dml-executor.js +17 -9
  422. package/dist/src/runtime/emit/dml-executor.js.map +1 -1
  423. package/dist/src/runtime/emit/drop-assertion.d.ts +5 -0
  424. package/dist/src/runtime/emit/drop-assertion.d.ts.map +1 -0
  425. package/dist/src/runtime/emit/drop-assertion.js +30 -0
  426. package/dist/src/runtime/emit/drop-assertion.js.map +1 -0
  427. package/dist/src/runtime/emit/filter.d.ts.map +1 -1
  428. package/dist/src/runtime/emit/filter.js.map +1 -1
  429. package/dist/src/runtime/emit/join.d.ts.map +1 -1
  430. package/dist/src/runtime/emit/join.js.map +1 -1
  431. package/dist/src/runtime/emit/limit-offset.d.ts.map +1 -1
  432. package/dist/src/runtime/emit/limit-offset.js.map +1 -1
  433. package/dist/src/runtime/emit/pragma.js.map +1 -1
  434. package/dist/src/runtime/emit/project.d.ts.map +1 -1
  435. package/dist/src/runtime/emit/project.js.map +1 -1
  436. package/dist/src/runtime/emit/recursive-cte.d.ts.map +1 -1
  437. package/dist/src/runtime/emit/recursive-cte.js +1 -1
  438. package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
  439. package/dist/src/runtime/emit/remote-query.d.ts +9 -0
  440. package/dist/src/runtime/emit/remote-query.d.ts.map +1 -0
  441. package/dist/src/runtime/emit/remote-query.js +30 -0
  442. package/dist/src/runtime/emit/remote-query.js.map +1 -0
  443. package/dist/src/runtime/emit/retrieve.d.ts +5 -0
  444. package/dist/src/runtime/emit/retrieve.d.ts.map +1 -0
  445. package/dist/src/runtime/emit/retrieve.js +9 -0
  446. package/dist/src/runtime/emit/retrieve.js.map +1 -0
  447. package/dist/src/runtime/emit/returning.d.ts.map +1 -1
  448. package/dist/src/runtime/emit/returning.js +1 -1
  449. package/dist/src/runtime/emit/returning.js.map +1 -1
  450. package/dist/src/runtime/emit/scalar-function.d.ts.map +1 -1
  451. package/dist/src/runtime/emit/scalar-function.js.map +1 -1
  452. package/dist/src/runtime/emit/scan.d.ts.map +1 -1
  453. package/dist/src/runtime/emit/scan.js +20 -5
  454. package/dist/src/runtime/emit/scan.js.map +1 -1
  455. package/dist/src/runtime/emit/schema-declarative.d.ts +8 -0
  456. package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -0
  457. package/dist/src/runtime/emit/schema-declarative.js +163 -0
  458. package/dist/src/runtime/emit/schema-declarative.js.map +1 -0
  459. package/dist/src/runtime/emit/sequencing.d.ts.map +1 -1
  460. package/dist/src/runtime/emit/sequencing.js.map +1 -1
  461. package/dist/src/runtime/emit/set-operation.d.ts.map +1 -1
  462. package/dist/src/runtime/emit/set-operation.js +6 -6
  463. package/dist/src/runtime/emit/set-operation.js.map +1 -1
  464. package/dist/src/runtime/emit/sort.d.ts.map +1 -1
  465. package/dist/src/runtime/emit/sort.js.map +1 -1
  466. package/dist/src/runtime/emit/subquery.d.ts +1 -1
  467. package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
  468. package/dist/src/runtime/emit/subquery.js +6 -6
  469. package/dist/src/runtime/emit/subquery.js.map +1 -1
  470. package/dist/src/runtime/emit/transaction.d.ts.map +1 -1
  471. package/dist/src/runtime/emit/transaction.js +48 -8
  472. package/dist/src/runtime/emit/transaction.js.map +1 -1
  473. package/dist/src/runtime/emit/values.d.ts.map +1 -1
  474. package/dist/src/runtime/emit/values.js.map +1 -1
  475. package/dist/src/runtime/emit/window.d.ts.map +1 -1
  476. package/dist/src/runtime/emit/window.js.map +1 -1
  477. package/dist/src/runtime/emitters.d.ts.map +1 -1
  478. package/dist/src/runtime/emitters.js +1 -0
  479. package/dist/src/runtime/emitters.js.map +1 -1
  480. package/dist/src/runtime/register.d.ts.map +1 -1
  481. package/dist/src/runtime/register.js +16 -2
  482. package/dist/src/runtime/register.js.map +1 -1
  483. package/dist/src/runtime/scheduler.js.map +1 -1
  484. package/dist/src/runtime/types.d.ts +2 -2
  485. package/dist/src/runtime/types.d.ts.map +1 -1
  486. package/dist/src/runtime/types.js +4 -1
  487. package/dist/src/runtime/types.js.map +1 -1
  488. package/dist/src/runtime/utils.d.ts +2 -2
  489. package/dist/src/runtime/utils.d.ts.map +1 -1
  490. package/dist/src/runtime/utils.js +1 -0
  491. package/dist/src/runtime/utils.js.map +1 -1
  492. package/dist/src/schema/assertion.d.ts +19 -0
  493. package/dist/src/schema/assertion.d.ts.map +1 -0
  494. package/dist/src/schema/assertion.js +2 -0
  495. package/dist/src/schema/assertion.js.map +1 -0
  496. package/dist/src/schema/catalog.d.ts +44 -0
  497. package/dist/src/schema/catalog.d.ts.map +1 -0
  498. package/dist/src/schema/catalog.js +148 -0
  499. package/dist/src/schema/catalog.js.map +1 -0
  500. package/dist/src/schema/change-events.d.ts +2 -2
  501. package/dist/src/schema/change-events.d.ts.map +1 -1
  502. package/dist/src/schema/column.d.ts +2 -0
  503. package/dist/src/schema/column.d.ts.map +1 -1
  504. package/dist/src/schema/column.js.map +1 -1
  505. package/dist/src/schema/declared-schema-manager.d.ts +42 -0
  506. package/dist/src/schema/declared-schema-manager.d.ts.map +1 -0
  507. package/dist/src/schema/declared-schema-manager.js +71 -0
  508. package/dist/src/schema/declared-schema-manager.js.map +1 -0
  509. package/dist/src/schema/function.d.ts +3 -2
  510. package/dist/src/schema/function.d.ts.map +1 -1
  511. package/dist/src/schema/function.js.map +1 -1
  512. package/dist/src/schema/manager.d.ts +8 -3
  513. package/dist/src/schema/manager.d.ts.map +1 -1
  514. package/dist/src/schema/manager.js +32 -3
  515. package/dist/src/schema/manager.js.map +1 -1
  516. package/dist/src/schema/schema-differ.d.ts +34 -0
  517. package/dist/src/schema/schema-differ.d.ts.map +1 -0
  518. package/dist/src/schema/schema-differ.js +157 -0
  519. package/dist/src/schema/schema-differ.js.map +1 -0
  520. package/dist/src/schema/schema-hasher.d.ts +10 -0
  521. package/dist/src/schema/schema-hasher.d.ts.map +1 -0
  522. package/dist/src/schema/schema-hasher.js +39 -0
  523. package/dist/src/schema/schema-hasher.js.map +1 -0
  524. package/dist/src/schema/schema.d.ts +7 -0
  525. package/dist/src/schema/schema.d.ts.map +1 -1
  526. package/dist/src/schema/schema.js +19 -0
  527. package/dist/src/schema/schema.js.map +1 -1
  528. package/dist/src/schema/table.d.ts +28 -3
  529. package/dist/src/schema/table.d.ts.map +1 -1
  530. package/dist/src/schema/table.js +17 -2
  531. package/dist/src/schema/table.js.map +1 -1
  532. package/dist/src/schema/window-function.d.ts.map +1 -1
  533. package/dist/src/schema/window-function.js.map +1 -1
  534. package/dist/src/util/ast-stringify.d.ts.map +1 -1
  535. package/dist/src/util/ast-stringify.js +116 -3
  536. package/dist/src/util/ast-stringify.js.map +1 -1
  537. package/dist/src/util/environment.js.map +1 -1
  538. package/dist/src/util/plugin-loader.d.ts +25 -2
  539. package/dist/src/util/plugin-loader.d.ts.map +1 -1
  540. package/dist/src/util/plugin-loader.js +180 -2
  541. package/dist/src/util/plugin-loader.js.map +1 -1
  542. package/dist/src/util/row-descriptor.d.ts +1 -1
  543. package/dist/src/util/row-descriptor.d.ts.map +1 -1
  544. package/dist/src/util/row-descriptor.js.map +1 -1
  545. package/dist/src/util/serialization.d.ts +3 -0
  546. package/dist/src/util/serialization.d.ts.map +1 -1
  547. package/dist/src/util/serialization.js +1 -0
  548. package/dist/src/util/serialization.js.map +1 -1
  549. package/dist/src/vtab/best-access-plan.d.ts +1 -1
  550. package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
  551. package/dist/src/vtab/best-access-plan.js +1 -0
  552. package/dist/src/vtab/best-access-plan.js.map +1 -1
  553. package/dist/src/vtab/manifest.d.ts.map +1 -1
  554. package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
  555. package/dist/src/vtab/memory/layer/base.js +2 -0
  556. package/dist/src/vtab/memory/layer/base.js.map +1 -1
  557. package/dist/src/vtab/memory/layer/manager.d.ts +2 -1
  558. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  559. package/dist/src/vtab/memory/layer/manager.js +24 -6
  560. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  561. package/dist/src/vtab/memory/layer/safe-iterate.d.ts.map +1 -1
  562. package/dist/src/vtab/memory/layer/safe-iterate.js.map +1 -1
  563. package/dist/src/vtab/memory/module.d.ts.map +1 -1
  564. package/dist/src/vtab/memory/module.js +5 -0
  565. package/dist/src/vtab/memory/module.js.map +1 -1
  566. package/dist/src/vtab/memory/table.d.ts +2 -1
  567. package/dist/src/vtab/memory/table.d.ts.map +1 -1
  568. package/dist/src/vtab/memory/table.js +3 -2
  569. package/dist/src/vtab/memory/table.js.map +1 -1
  570. package/dist/src/vtab/memory/utils/logging.d.ts +2 -2
  571. package/dist/src/vtab/memory/utils/logging.d.ts.map +1 -1
  572. package/dist/src/vtab/memory/utils/logging.js +6 -3
  573. package/dist/src/vtab/memory/utils/logging.js.map +1 -1
  574. package/dist/src/vtab/module.d.ts +25 -0
  575. package/dist/src/vtab/module.d.ts.map +1 -1
  576. package/dist/src/vtab/table.d.ts +17 -4
  577. package/dist/src/vtab/table.d.ts.map +1 -1
  578. package/dist/src/vtab/table.js.map +1 -1
  579. package/package.json +4 -2
  580. package/src/common/errors.ts +1 -1
  581. package/src/common/json-types.ts +16 -0
  582. package/src/common/types.ts +2 -0
  583. package/src/core/database-options.ts +8 -8
  584. package/src/core/database.ts +537 -71
  585. package/src/core/statement.ts +3 -1
  586. package/src/func/builtins/builtin-window-functions.ts +11 -10
  587. package/src/func/builtins/datetime.ts +42 -0
  588. package/src/func/builtins/explain.ts +186 -44
  589. package/src/func/builtins/index.ts +5 -2
  590. package/src/func/builtins/json-helpers.ts +21 -21
  591. package/src/func/builtins/json-tvf.ts +8 -9
  592. package/src/func/builtins/json.ts +10 -9
  593. package/src/func/builtins/schema.ts +24 -4
  594. package/src/func/context.ts +7 -0
  595. package/src/func/registration.ts +5 -1
  596. package/src/index.ts +2 -2
  597. package/src/parser/ast.ts +582 -481
  598. package/src/parser/lexer.ts +27 -21
  599. package/src/parser/parser.ts +3336 -2776
  600. package/src/parser/visitor.ts +1 -0
  601. package/src/planner/analysis/binding-collector.ts +83 -0
  602. package/src/planner/analysis/const-evaluator.ts +1 -1
  603. package/src/planner/analysis/const-pass.ts +3 -2
  604. package/src/planner/analysis/constraint-extractor.ts +610 -123
  605. package/src/planner/analysis/predicate-normalizer.ts +237 -0
  606. package/src/planner/building/alter-table.ts +3 -1
  607. package/src/planner/building/block.ts +93 -78
  608. package/src/planner/building/constraint-builder.ts +173 -114
  609. package/src/planner/building/create-assertion.ts +7 -0
  610. package/src/planner/building/declare-schema.ts +22 -0
  611. package/src/planner/building/delete.ts +214 -171
  612. package/src/planner/building/drop-assertion.ts +11 -0
  613. package/src/planner/building/expression.ts +1 -0
  614. package/src/planner/building/function-call.ts +6 -5
  615. package/src/planner/building/insert.ts +428 -349
  616. package/src/planner/building/pragma.ts +1 -0
  617. package/src/planner/building/schema-resolution.ts +176 -176
  618. package/src/planner/building/select-aggregates.ts +5 -3
  619. package/src/planner/building/select-compound.ts +22 -13
  620. package/src/planner/building/select-context.ts +6 -6
  621. package/src/planner/building/select-modifiers.ts +8 -7
  622. package/src/planner/building/select-projections.ts +177 -176
  623. package/src/planner/building/select-window.ts +259 -253
  624. package/src/planner/building/select.ts +531 -520
  625. package/src/planner/building/table-function.ts +49 -48
  626. package/src/planner/building/table.ts +9 -3
  627. package/src/planner/building/update.ts +319 -270
  628. package/src/planner/building/with.ts +7 -7
  629. package/src/planner/debug.ts +1 -0
  630. package/src/planner/framework/characteristics.ts +503 -0
  631. package/src/planner/framework/context.ts +23 -6
  632. package/src/planner/framework/pass.ts +354 -0
  633. package/src/planner/nodes/aggregate-node.ts +52 -7
  634. package/src/planner/nodes/array-index-node.ts +1 -1
  635. package/src/planner/nodes/cache-node.ts +11 -2
  636. package/src/planner/nodes/constraint-check-node.ts +14 -5
  637. package/src/planner/nodes/create-assertion-node.ts +51 -0
  638. package/src/planner/nodes/create-index-node.ts +2 -2
  639. package/src/planner/nodes/create-table-node.ts +2 -2
  640. package/src/planner/nodes/cte-node.ts +30 -4
  641. package/src/planner/nodes/cte-reference-node.ts +2 -2
  642. package/src/planner/nodes/declarative-schema.ts +221 -0
  643. package/src/planner/nodes/delete-node.ts +102 -96
  644. package/src/planner/nodes/distinct-node.ts +20 -6
  645. package/src/planner/nodes/dml-executor-node.ts +1 -1
  646. package/src/planner/nodes/drop-assertion-node.ts +50 -0
  647. package/src/planner/nodes/drop-table-node.ts +1 -0
  648. package/src/planner/nodes/filter.ts +56 -3
  649. package/src/planner/nodes/insert-node.ts +126 -120
  650. package/src/planner/nodes/internal-recursive-cte-ref-node.ts +5 -20
  651. package/src/planner/nodes/join-node.ts +122 -4
  652. package/src/planner/nodes/limit-offset.ts +132 -113
  653. package/src/planner/nodes/plan-node-type.ts +95 -87
  654. package/src/planner/nodes/plan-node.ts +8 -8
  655. package/src/planner/nodes/pragma.ts +6 -3
  656. package/src/planner/nodes/project-node.ts +101 -7
  657. package/src/planner/nodes/recursive-cte-node.ts +6 -6
  658. package/src/planner/nodes/reference.ts +334 -312
  659. package/src/planner/nodes/remote-query-node.ts +73 -0
  660. package/src/planner/nodes/retrieve-node.ts +86 -0
  661. package/src/planner/nodes/returning-node.ts +52 -10
  662. package/src/planner/nodes/sequencing-node.ts +2 -2
  663. package/src/planner/nodes/set-operation-node.ts +3 -3
  664. package/src/planner/nodes/sort.ts +33 -4
  665. package/src/planner/nodes/stream-aggregate.ts +5 -1
  666. package/src/planner/nodes/table-access-nodes.ts +31 -6
  667. package/src/planner/nodes/table-function-call.ts +134 -127
  668. package/src/planner/nodes/transaction-node.ts +2 -2
  669. package/src/planner/nodes/update-node.ts +138 -132
  670. package/src/planner/nodes/view-reference-node.ts +1 -1
  671. package/src/planner/nodes/window-function.ts +2 -2
  672. package/src/planner/nodes/window-node.ts +1 -1
  673. package/src/planner/optimizer-tuning.ts +18 -0
  674. package/src/planner/optimizer.ts +171 -96
  675. package/src/planner/planning-context.ts +10 -3
  676. package/src/planner/resolve.ts +10 -9
  677. package/src/planner/rules/README.md +96 -96
  678. package/src/planner/rules/access/rule-select-access-path.ts +384 -184
  679. package/src/planner/rules/aggregate/rule-aggregate-streaming.ts +118 -104
  680. package/src/planner/rules/cache/rule-cte-optimization.ts +29 -16
  681. package/src/planner/rules/cache/rule-materialization-advisory.ts +14 -7
  682. package/src/planner/rules/cache/rule-mutating-subquery-cache.ts +38 -44
  683. package/src/planner/rules/join/rule-join-greedy-commute.ts +48 -0
  684. package/src/planner/rules/join/rule-join-key-inference.ts +35 -0
  685. package/src/planner/rules/join/rule-quickpick-enumeration.ts +267 -0
  686. package/src/planner/rules/predicate/rule-predicate-pushdown.ts +144 -0
  687. package/src/planner/rules/retrieve/rule-grow-retrieve.ts +337 -0
  688. package/src/planner/scopes/registered.ts +8 -0
  689. package/src/planner/stats/index.ts +0 -65
  690. package/src/planner/util/key-utils.ts +46 -0
  691. package/src/planner/validation/plan-validator.ts +5 -3
  692. package/src/runtime/deferred-constraint-queue.ts +196 -0
  693. package/src/runtime/emission-context.ts +11 -5
  694. package/src/runtime/emit/add-constraint.ts +26 -5
  695. package/src/runtime/emit/aggregate.ts +9 -7
  696. package/src/runtime/emit/array-index.ts +2 -2
  697. package/src/runtime/emit/binary.ts +26 -8
  698. package/src/runtime/emit/cache.ts +2 -2
  699. package/src/runtime/emit/cast.ts +2 -2
  700. package/src/runtime/emit/constraint-check.ts +148 -26
  701. package/src/runtime/emit/create-assertion.ts +82 -0
  702. package/src/runtime/emit/cte-reference.ts +2 -2
  703. package/src/runtime/emit/cte.ts +2 -2
  704. package/src/runtime/emit/distinct.ts +2 -2
  705. package/src/runtime/emit/dml-executor.ts +20 -12
  706. package/src/runtime/emit/drop-assertion.ts +45 -0
  707. package/src/runtime/emit/filter.ts +4 -4
  708. package/src/runtime/emit/join.ts +8 -7
  709. package/src/runtime/emit/limit-offset.ts +2 -2
  710. package/src/runtime/emit/pragma.ts +2 -2
  711. package/src/runtime/emit/project.ts +2 -2
  712. package/src/runtime/emit/recursive-cte.ts +2 -2
  713. package/src/runtime/emit/remote-query.ts +47 -0
  714. package/src/runtime/emit/retrieve.ts +15 -0
  715. package/src/runtime/emit/returning.ts +4 -4
  716. package/src/runtime/emit/scalar-function.ts +2 -2
  717. package/src/runtime/emit/scan.ts +29 -13
  718. package/src/runtime/emit/schema-declarative.ts +205 -0
  719. package/src/runtime/emit/sequencing.ts +3 -3
  720. package/src/runtime/emit/set-operation.ts +7 -7
  721. package/src/runtime/emit/sort.ts +2 -2
  722. package/src/runtime/emit/subquery.ts +10 -10
  723. package/src/runtime/emit/transaction.ts +46 -8
  724. package/src/runtime/emit/values.ts +2 -2
  725. package/src/runtime/emit/window.ts +3 -3
  726. package/src/runtime/emitters.ts +1 -0
  727. package/src/runtime/register.ts +150 -135
  728. package/src/runtime/scheduler.ts +2 -2
  729. package/src/runtime/types.ts +10 -7
  730. package/src/runtime/utils.ts +3 -2
  731. package/src/schema/assertion.ts +21 -0
  732. package/src/schema/catalog.ts +208 -0
  733. package/src/schema/change-events.ts +2 -2
  734. package/src/schema/column.ts +2 -0
  735. package/src/schema/declared-schema-manager.ts +82 -0
  736. package/src/schema/function.ts +5 -2
  737. package/src/schema/manager.ts +742 -709
  738. package/src/schema/schema-differ.ts +214 -0
  739. package/src/schema/schema-hasher.ts +44 -0
  740. package/src/schema/schema.ts +23 -0
  741. package/src/schema/table.ts +398 -364
  742. package/src/schema/window-function.ts +2 -0
  743. package/src/util/ast-stringify.ts +869 -764
  744. package/src/util/environment.ts +2 -2
  745. package/src/util/plugin-loader.ts +232 -7
  746. package/src/util/row-descriptor.ts +1 -1
  747. package/src/util/serialization.ts +2 -0
  748. package/src/vtab/best-access-plan.ts +2 -1
  749. package/src/vtab/manifest.ts +1 -0
  750. package/src/vtab/memory/index.ts +178 -178
  751. package/src/vtab/memory/layer/base.ts +275 -273
  752. package/src/vtab/memory/layer/interface.ts +47 -47
  753. package/src/vtab/memory/layer/manager.ts +33 -11
  754. package/src/vtab/memory/layer/safe-iterate.ts +3 -3
  755. package/src/vtab/memory/layer/transaction.ts +229 -229
  756. package/src/vtab/memory/module.ts +24 -18
  757. package/src/vtab/memory/table.ts +256 -253
  758. package/src/vtab/memory/utils/logging.ts +6 -3
  759. package/src/vtab/module.ts +170 -140
  760. package/src/vtab/table.ts +162 -143
@@ -1,148 +1,162 @@
1
1
  /**
2
2
  * Rule: Aggregate Streaming
3
3
  *
4
- * Transforms: AggregateNode → StreamAggregateNode (with Sort if needed)
5
- * Conditions: Logical aggregate node needs physical implementation
6
- * Benefits: Enables streaming aggregation with proper grouping order
4
+ * Required Characteristics:
5
+ * - Node must support aggregation operations (AggregationCapable interface)
6
+ * - Node must be relational (produces rows)
7
+ * - Node must be read-only (no side effects for streaming)
8
+ *
9
+ * Applied When:
10
+ * - Logical aggregate node needs physical streaming implementation
11
+ * - Source data can be processed incrementally
12
+ *
13
+ * Benefits: Enables streaming aggregation with proper grouping order, memory efficient processing
7
14
  */
8
15
 
9
16
  import { createLogger } from '../../../common/logger.js';
10
- import type { PlanNode } from '../../nodes/plan-node.js';
17
+ import type { PlanNode, ScalarPlanNode, Attribute } from '../../nodes/plan-node.js';
11
18
  import type { OptContext } from '../../framework/context.js';
12
- import { AggregateNode } from '../../nodes/aggregate-node.js';
13
19
  import { StreamAggregateNode } from '../../nodes/stream-aggregate.js';
14
20
  import { SortNode } from '../../nodes/sort.js';
21
+ import {
22
+ PlanNodeCharacteristics,
23
+ CapabilityDetectors,
24
+ type AggregationCapable
25
+ } from '../../framework/characteristics.js';
15
26
 
16
27
  const log = createLogger('optimizer:rule:aggregate-streaming');
17
28
 
18
29
  export function ruleAggregateStreaming(node: PlanNode, _context: OptContext): PlanNode | null {
19
- // Guard: only apply to AggregateNode
20
- if (!(node instanceof AggregateNode)) {
30
+ // Guard: node must support aggregation operations
31
+ if (!CapabilityDetectors.isAggregating(node)) {
21
32
  return null;
22
33
  }
23
34
 
24
35
  log('Applying aggregate streaming rule to node %s', node.id);
25
36
 
26
- // Source is already optimized by framework
27
- const source = node.source;
28
-
29
- // For now, always use StreamAggregate
30
- // TODO: Check if source is ordered on groupBy columns
31
- // TODO: Consider HashAggregate for unordered inputs
32
-
33
- if (node.groupBy.length > 0) {
34
- // Need to ensure ordering for streaming aggregate
35
- // For now, always insert a sort
36
- // TODO: Check if source already provides the required ordering
37
- const sortKeys = node.groupBy.map(expr => ({
38
- expression: expr,
39
- direction: 'asc' as const,
40
- nulls: undefined
41
- }));
37
+ // Get aggregation characteristics
38
+ const aggregateNode = node as AggregationCapable;
39
+ const groupingKeys = aggregateNode.getGroupingKeys();
40
+ const aggregateExpressions = aggregateNode.getAggregateExpressions();
42
41
 
43
- const sortNode = new SortNode(node.scope, source, sortKeys);
42
+ // Check if we can stream the aggregation over the source
43
+ const source = aggregateNode.getSource();
44
44
 
45
- // Create combined attributes: AggregateNode attributes + source attributes
46
- // This ensures both GROUP BY/aggregate AND source column attribute IDs are preserved
47
- const aggregateAttrs = node.getAttributes();
48
- const sourceAttrs = node.source.getAttributes();
49
-
50
- // Deduplicate by column NAME to avoid duplicate columns like 'id'
51
- // (The same logical column can have different attribute IDs between aggregate and source)
52
- const seenNames = new Set<string>();
53
- const combinedAttrs: typeof aggregateAttrs = [];
54
-
55
- // Add aggregate attributes first (GROUP BY + aggregates)
56
- for (const attr of aggregateAttrs) {
57
- combinedAttrs.push(attr);
58
- seenNames.add(attr.name);
59
- }
45
+ // Check if streaming aggregation is beneficial
46
+ if (!aggregateNode.canStreamAggregate()) {
47
+ log('Node cannot use streaming aggregation, skipping');
48
+ return null;
49
+ }
60
50
 
61
- // Add source attributes that aren't already present by name
62
- for (const attr of sourceAttrs) {
63
- if (!seenNames.has(attr.name)) {
64
- combinedAttrs.push(attr);
65
- seenNames.add(attr.name);
66
- }
51
+ if (groupingKeys.length > 0) {
52
+ // Need to ensure ordering for streaming aggregate
53
+ // Check if source already provides the required ordering
54
+ const sourceOrdering = PlanNodeCharacteristics.getOrdering(source);
55
+ const needsSort = !isOrderedForGrouping(sourceOrdering, groupingKeys);
56
+
57
+ let sortedSource = source;
58
+ if (needsSort) {
59
+ // Insert sort to ensure proper grouping order
60
+ const sortKeys = groupingKeys.map(expr => ({
61
+ expression: expr,
62
+ direction: 'asc' as const,
63
+ nulls: undefined
64
+ }));
65
+
66
+ sortedSource = new SortNode(node.scope, source, sortKeys);
67
+ log('Inserted sort for grouping keys');
68
+ } else {
69
+ log('Source already provides required ordering for streaming');
67
70
  }
68
71
 
69
- // Final safety-pass: filter duplicates that may have slipped through
70
- const uniqueByName = new Set<string>();
71
- const deduped: typeof combinedAttrs = [];
72
- for (const attr of combinedAttrs) {
73
- if (!uniqueByName.has(attr.name)) {
74
- deduped.push(attr);
75
- uniqueByName.add(attr.name);
76
- }
77
- }
72
+ // Create combined attributes preserving attribute IDs
73
+ const finalAttrs = combineAttributes(node.getAttributes(), source.getAttributes());
78
74
 
79
- const finalAttrs = deduped;
75
+ // Convert aggregate expressions to match StreamAggregateNode interface
76
+ const streamAggregates = aggregateExpressions.map(agg => ({
77
+ expression: agg.expr,
78
+ alias: agg.alias
79
+ }));
80
80
 
81
81
  const result = new StreamAggregateNode(
82
82
  node.scope,
83
- sortNode,
84
- node.groupBy,
85
- node.aggregates,
83
+ sortedSource,
84
+ groupingKeys,
85
+ streamAggregates,
86
86
  undefined, // estimatedCostOverride
87
- finalAttrs // unique list
87
+ finalAttrs
88
88
  );
89
89
 
90
- // Let framework set physical properties via markPhysical()
91
- // Both SortNode and StreamAggregateNode have getPhysical() methods
92
-
93
- log('Transformed AggregateNode to StreamAggregateNode with sort');
90
+ log('Transformed aggregation to StreamAggregateNode with %s', needsSort ? 'sort' : 'existing order');
94
91
  return result;
95
92
  } else {
96
93
  // No GROUP BY - can stream aggregate without sorting
97
- // Create combined attributes: AggregateNode attributes + source attributes
98
- // This ensures both GROUP BY/aggregate AND source column attribute IDs are preserved
99
- const aggregateAttrs = node.getAttributes();
100
- const sourceAttrs = node.source.getAttributes();
101
-
102
- // Deduplicate by column NAME to avoid duplicate columns like 'id'
103
- // (The same logical column can have different attribute IDs between aggregate and source)
104
- const seenNames = new Set<string>();
105
- const combinedAttrs: typeof aggregateAttrs = [];
106
-
107
- // Add aggregate attributes first (GROUP BY + aggregates)
108
- for (const attr of aggregateAttrs) {
109
- combinedAttrs.push(attr);
110
- seenNames.add(attr.name);
111
- }
112
-
113
- // Add source attributes that aren't already present by name
114
- for (const attr of sourceAttrs) {
115
- if (!seenNames.has(attr.name)) {
116
- combinedAttrs.push(attr);
117
- seenNames.add(attr.name);
118
- }
119
- }
94
+ const finalAttrs = combineAttributes(node.getAttributes(), source.getAttributes());
120
95
 
121
- // Final safety-pass: filter duplicates that may have slipped through
122
- const uniqueByName = new Set<string>();
123
- const deduped: typeof combinedAttrs = [];
124
- for (const attr of combinedAttrs) {
125
- if (!uniqueByName.has(attr.name)) {
126
- deduped.push(attr);
127
- uniqueByName.add(attr.name);
128
- }
129
- }
130
-
131
- const finalAttrs = deduped;
96
+ // Convert aggregate expressions to match StreamAggregateNode interface
97
+ const streamAggregates = aggregateExpressions.map(agg => ({
98
+ expression: agg.expr,
99
+ alias: agg.alias
100
+ }));
132
101
 
133
102
  const result = new StreamAggregateNode(
134
103
  node.scope,
135
104
  source,
136
- node.groupBy,
137
- node.aggregates,
105
+ groupingKeys,
106
+ streamAggregates,
138
107
  undefined, // estimatedCostOverride
139
- finalAttrs // unique list
108
+ finalAttrs
140
109
  );
141
110
 
142
- // Let framework set physical properties via markPhysical()
143
- // StreamAggregateNode has getPhysical() method
144
-
145
- log('Transformed AggregateNode to StreamAggregateNode without sort');
111
+ log('Transformed aggregation to StreamAggregateNode without sort');
146
112
  return result;
147
113
  }
148
114
  }
115
+
116
+ /**
117
+ * Check if source ordering matches grouping requirements for streaming
118
+ */
119
+ function isOrderedForGrouping(
120
+ _ordering: { column: number; desc: boolean }[] | undefined,
121
+ _groupingKeys: readonly ScalarPlanNode[]
122
+ ): boolean {
123
+ // TODO: Implement proper ordering analysis
124
+ // For now, conservatively return false to always sort
125
+ // This should check if the ordering covers all grouping keys in order
126
+ return false;
127
+ }
128
+
129
+ /**
130
+ * Combine attributes from aggregate and source, avoiding duplicates by name
131
+ * This preserves attribute IDs while ensuring unique column names
132
+ */
133
+ function combineAttributes(aggregateAttrs: readonly Attribute[], sourceAttrs: readonly Attribute[]): Attribute[] {
134
+ const seenNames = new Set<string>();
135
+ const combinedAttrs: Attribute[] = [];
136
+
137
+ // Add aggregate attributes first (GROUP BY + aggregates)
138
+ for (const attr of aggregateAttrs) {
139
+ combinedAttrs.push(attr);
140
+ seenNames.add(attr.name);
141
+ }
142
+
143
+ // Add source attributes that aren't already present by name
144
+ for (const attr of sourceAttrs) {
145
+ if (!seenNames.has(attr.name)) {
146
+ combinedAttrs.push(attr);
147
+ seenNames.add(attr.name);
148
+ }
149
+ }
150
+
151
+ // Final deduplication pass
152
+ const uniqueByName = new Set<string>();
153
+ const deduped: any[] = [];
154
+ for (const attr of combinedAttrs) {
155
+ if (!uniqueByName.has(attr.name)) {
156
+ deduped.push(attr);
157
+ uniqueByName.add(attr.name);
158
+ }
159
+ }
160
+
161
+ return deduped;
162
+ }
@@ -1,8 +1,14 @@
1
1
  /**
2
2
  * Rule: CTE Optimization
3
3
  *
4
- * Transforms: CTENode → CTENode (with caching when beneficial)
5
- * Conditions: CTE would benefit from materialization/caching
4
+ * Required Characteristics:
5
+ * - Node must support CTE operations (CTECapable interface)
6
+ * - Node must be relational (produces rows)
7
+ * - Source must be cacheable for materialization
8
+ *
9
+ * Applied When:
10
+ * - CTE would benefit from materialization/caching based on cost analysis
11
+ *
6
12
  * Benefits: Reduces redundant computation for repeated CTE access
7
13
  */
8
14
 
@@ -11,37 +17,43 @@ import type { PlanNode } from '../../nodes/plan-node.js';
11
17
  import type { OptContext } from '../../framework/context.js';
12
18
  import { CTENode } from '../../nodes/cte-node.js';
13
19
  import { CacheNode } from '../../nodes/cache-node.js';
14
- import { PlanNodeType } from '../../nodes/plan-node-type.js';
20
+ import { CapabilityDetectors, CachingAnalysis, PlanNodeCharacteristics, type CTECapable } from '../../framework/characteristics.js';
15
21
 
16
22
  const log = createLogger('optimizer:rule:cte-optimization');
17
23
 
18
24
  export function ruleCteOptimization(node: PlanNode, context: OptContext): PlanNode | null {
19
- // Guard: only apply to CTENode
20
- if (!(node instanceof CTENode)) {
25
+ // Guard: node must support CTE operations
26
+ if (!CapabilityDetectors.isCTE(node)) {
21
27
  return null;
22
28
  }
23
29
 
24
- log('Optimizing CTENode %s', node.cteName);
30
+ // Get CTE characteristics
31
+ const cteNode = node as CTECapable;
32
+ log('Optimizing CTE %s', cteNode.cteName);
25
33
 
26
34
  // Source is already optimized by framework
27
- const source = node.source;
35
+ const source = cteNode.getCTESource();
28
36
 
29
37
  // Heuristics for when to cache CTEs:
30
38
  // 1. CTE has materialization hint
31
39
  // 2. CTE is estimated to be reasonably sized
32
40
  // 3. CTE is not already cached
33
- const sourceSize = source.estimatedRows ?? context.tuning.defaultRowEstimate;
41
+ const sourceSize = PlanNodeCharacteristics.estimatesRows(source);
42
+ const isAlreadyCached = CapabilityDetectors.isCached(source) && source.isCached();
34
43
  const shouldCache = (
35
- node.materializationHint === 'materialized' ||
44
+ cteNode.materializationHint === 'materialized' ||
36
45
  (sourceSize > 0 && sourceSize < context.tuning.cte.maxSizeForCaching)
37
- ) && source.nodeType !== PlanNodeType.Cache;
46
+ ) && !isAlreadyCached;
38
47
 
39
48
  if (shouldCache) {
40
- log('Adding cache to CTE %s (estimated rows: %d)', node.cteName, sourceSize);
49
+ log('Adding cache to CTE %s (estimated rows: %d)', cteNode.cteName, sourceSize);
50
+
51
+ // Use characteristics-based cache threshold calculation
41
52
  const cacheThreshold = Math.min(
42
- sourceSize * context.tuning.cte.cacheThresholdMultiplier,
53
+ CachingAnalysis.getCacheThreshold(source),
43
54
  context.tuning.cte.maxCacheThreshold
44
55
  );
56
+
45
57
  const cachedSource = new CacheNode(
46
58
  source.scope,
47
59
  source,
@@ -49,13 +61,14 @@ export function ruleCteOptimization(node: PlanNode, context: OptContext): PlanNo
49
61
  cacheThreshold
50
62
  );
51
63
 
64
+ // Create new CTE with cached source (specific to CTENode implementation)
52
65
  const result = new CTENode(
53
66
  node.scope,
54
- node.cteName,
55
- node.columns,
67
+ cteNode.cteName,
68
+ cteNode.columns,
56
69
  cachedSource,
57
- node.materializationHint,
58
- node.isRecursive
70
+ cteNode.materializationHint,
71
+ cteNode.isRecursive
59
72
  );
60
73
 
61
74
  log('Created CTE with caching');
@@ -1,8 +1,15 @@
1
1
  /**
2
2
  * Rule: Materialization Advisory
3
3
  *
4
- * Transforms: Any relational node → CacheNode (when beneficial)
5
- * Conditions: Node would benefit from caching based on reference analysis
4
+ * Required Characteristics:
5
+ * - Node must be non-relational with relational children
6
+ * - Children must be cacheable based on reference analysis
7
+ * - Children must benefit from materialization
8
+ *
9
+ * Applied When:
10
+ * - Transition from non-relational to relational subtrees
11
+ * - Relational subtrees would benefit from caching
12
+ *
6
13
  * Benefits: Reduces redundant computation for repeated scans and loop contexts
7
14
  */
8
15
 
@@ -10,6 +17,7 @@ import { createLogger } from '../../../common/logger.js';
10
17
  import type { PlanNode } from '../../nodes/plan-node.js';
11
18
  import type { OptContext } from '../../framework/context.js';
12
19
  import { MaterializationAdvisory } from '../../cache/materialization-advisory.js';
20
+ import { PlanNodeCharacteristics } from '../../framework/characteristics.js';
13
21
 
14
22
  const log = createLogger('optimizer:rule:materialization-advisory');
15
23
 
@@ -17,9 +25,8 @@ export function ruleMaterializationAdvisory(node: PlanNode, context: OptContext)
17
25
  // Apply this rule when we're at a non-relational node that has relational children
18
26
  // This captures transitions into relational subtrees (queries, subqueries, CTEs, etc.)
19
27
 
20
- // Check if this is a non-relational node
21
- const nodeType = node.getType();
22
- if (nodeType.typeClass === 'relation') {
28
+ // Check if this is a non-relational node using characteristics
29
+ if (PlanNodeCharacteristics.isRelational(node)) {
23
30
  // This is already a relational node, don't apply here
24
31
  return null;
25
32
  }
@@ -31,7 +38,7 @@ export function ruleMaterializationAdvisory(node: PlanNode, context: OptContext)
31
38
  return null;
32
39
  }
33
40
 
34
- log('Applying materialization advisory at transition from %s to relational children', node.nodeType);
41
+ log('Applying materialization advisory at transition from %s to relational children', node.getType().typeClass);
35
42
 
36
43
  try {
37
44
  // Create advisory with current tuning parameters
@@ -45,7 +52,7 @@ export function ruleMaterializationAdvisory(node: PlanNode, context: OptContext)
45
52
  const transformedRelation = advisory.analyzeAndTransform(relation);
46
53
  if (transformedRelation !== relation) {
47
54
  anyTransformed = true;
48
- log('Transformed relational subtree under %s', node.nodeType);
55
+ log('Transformed relational subtree under %s node', node.getType().typeClass);
49
56
  }
50
57
  }
51
58
 
@@ -1,51 +1,55 @@
1
1
  /**
2
2
  * Rule: Mutating Subquery Cache Injection
3
3
  *
4
- * Transforms: JoinNode with mutating right side → JoinNode with cached right side
5
- * Conditions: Right side contains operations with readonly=false physical property
4
+ * Required Characteristics:
5
+ * - Node must be a join operation (JoinCapable interface)
6
+ * - Right side must contain operations with side effects (readonly=false)
7
+ * - Right side must not already be cached
8
+ *
9
+ * Applied When:
10
+ * - Join has mutating operations on right side that could be executed multiple times
11
+ *
6
12
  * Benefits: Prevents mutating subqueries from being executed multiple times in nested loop joins
7
13
  */
8
14
 
9
15
  import { createLogger } from '../../../common/logger.js';
10
16
  import { PlanNode } from '../../nodes/plan-node.js';
11
17
  import type { OptContext } from '../../framework/context.js';
12
- import { JoinNode } from '../../nodes/join-node.js';
13
18
  import { CacheNode } from '../../nodes/cache-node.js';
14
- import { PlanNodeType } from '../../nodes/plan-node-type.js';
19
+ import { JoinNode } from '../../nodes/join-node.js';
20
+ import { PlanNodeCharacteristics, CapabilityDetectors, CachingAnalysis, type JoinCapable } from '../../framework/characteristics.js';
15
21
 
16
22
  const log = createLogger('optimizer:rule:mutating-subquery-cache');
17
23
 
18
- export function ruleMutatingSubqueryCache(node: PlanNode, context: OptContext): PlanNode | null {
19
- // Guard: only apply to JoinNode
20
- if (!(node instanceof JoinNode)) {
24
+ export function ruleMutatingSubqueryCache(node: PlanNode, _context: OptContext): PlanNode | null {
25
+ // Guard: node must support join operations
26
+ if (!CapabilityDetectors.isJoin(node)) {
21
27
  return null;
22
28
  }
23
29
 
24
- log('Checking JoinNode for operations with side effects on right side');
30
+ log('Checking join operation for side effects on right side');
25
31
 
26
- // Check if the right side contains operations with side effects
27
- const rightSide = node.right;
28
- const hasSideEffects = containsOperationsWithSideEffects(rightSide);
32
+ // Get join-specific characteristics
33
+ const joinNode = node as JoinCapable;
34
+ const rightSide = joinNode.getRightSource();
29
35
 
36
+ // Check if right side contains operations with side effects
37
+ const hasSideEffects = containsOperationsWithSideEffects(rightSide);
30
38
  if (!hasSideEffects) {
31
39
  log('Right side does not contain operations with side effects, skipping');
32
40
  return null;
33
41
  }
34
42
 
35
43
  // Check if right side is already cached
36
- if (rightSide.nodeType === PlanNodeType.Cache) {
44
+ if (CapabilityDetectors.isCached(rightSide) && rightSide.isCached()) {
37
45
  log('Right side is already cached, skipping');
38
46
  return null;
39
47
  }
40
48
 
41
49
  log('Detected operations with side effects on right side of join, injecting cache');
42
50
 
43
- // Calculate appropriate cache threshold
44
- const estimatedRows = rightSide.estimatedRows ?? context.tuning.defaultRowEstimate;
45
- const threshold = Math.min(
46
- Math.max(estimatedRows * context.tuning.join.cacheThresholdMultiplier, 1000),
47
- context.tuning.join.maxCacheThreshold
48
- );
51
+ // Calculate appropriate cache threshold using characteristics
52
+ const threshold = CachingAnalysis.getCacheThreshold(rightSide);
49
53
 
50
54
  // Wrap the right side with a cache node
51
55
  const cachedRightSide = new CacheNode(
@@ -56,13 +60,16 @@ export function ruleMutatingSubqueryCache(node: PlanNode, context: OptContext):
56
60
  );
57
61
 
58
62
  // Create new join node with cached right side
63
+ // Note: We still need to use specific constructor since we don't have a generic join builder yet
59
64
  const result = new JoinNode(
60
65
  node.scope,
61
- node.left, // Left side unchanged
62
- cachedRightSide, // Right side now cached
63
- node.joinType,
64
- node.condition,
65
- node.usingColumns
66
+ joinNode.getLeftSource(),
67
+ cachedRightSide,
68
+ joinNode.getJoinType(),
69
+ joinNode.getJoinCondition(),
70
+ // Special case: for JOINs, we also need to check if any of the join conditions
71
+ // reference columns from the mutating subquery (via USING clause)
72
+ joinNode.getUsingColumns()
66
73
  );
67
74
 
68
75
  log('Successfully injected cache for operations with side effects (threshold: %d)', threshold);
@@ -71,40 +78,27 @@ export function ruleMutatingSubqueryCache(node: PlanNode, context: OptContext):
71
78
 
72
79
  /**
73
80
  * Recursively check if a plan tree contains operations with side effects
81
+ * Uses characteristics-based analysis instead of hard-coded node type checks
74
82
  */
75
83
  function containsOperationsWithSideEffects(node: PlanNode): boolean {
76
- // Check if this node has side effects using physical properties
77
- if (hasNodeSideEffects(node)) {
84
+ // Check this node's characteristics
85
+ if (PlanNodeCharacteristics.hasSideEffects(node)) {
78
86
  return true;
79
87
  }
80
88
 
81
- // Recursively check children
89
+ // Recursively check all children
82
90
  for (const child of node.getChildren()) {
83
91
  if (containsOperationsWithSideEffects(child)) {
84
92
  return true;
85
93
  }
86
94
  }
87
95
 
88
- // Check relational children if available
89
- if ('getRelations' in node) {
90
- for (const relation of (node as any).getRelations()) {
91
- if (containsOperationsWithSideEffects(relation)) {
92
- return true;
93
- }
96
+ // Check relational children if available (preserved for compatibility)
97
+ for (const relation of node.getRelations()) {
98
+ if (containsOperationsWithSideEffects(relation)) {
99
+ return true;
94
100
  }
95
101
  }
96
102
 
97
103
  return false;
98
104
  }
99
-
100
- /**
101
- * Check if a node has side effects using physical properties
102
- */
103
- function hasNodeSideEffects(node: PlanNode): boolean {
104
- // By the time rules run, all children should have physical properties set by the framework
105
- if (!node.physical) {
106
- throw new Error(`Internal error: Node ${node.nodeType}:${node.id} missing physical properties during rule application`);
107
- }
108
-
109
- return PlanNode.hasSideEffects(node.physical);
110
- }
@@ -0,0 +1,48 @@
1
+ import { createLogger } from '../../../common/logger.js';
2
+ import type { PlanNode, RelationalPlanNode } from '../../nodes/plan-node.js';
3
+ import type { OptContext } from '../../framework/context.js';
4
+ import { JoinNode } from '../../nodes/join-node.js';
5
+
6
+ const log = createLogger('optimizer:rule:join-greedy-commute');
7
+
8
+ /**
9
+ * Rule: Join Greedy Commute
10
+ *
11
+ * Simple heuristic: for INNER joins, prefer the smaller input on the left to drive nested-loop-like cost.
12
+ * This uses children estimatedRows (influenced by pushdown/growth) and swaps left/right when beneficial.
13
+ *
14
+ * Safety:
15
+ * - INNER joins are commutative; ColumnReferenceNode uses attribute IDs, so swapping sides preserves semantics.
16
+ * - We do NOT change associativity; we only commute immediate children of a JoinNode.
17
+ */
18
+ export function ruleJoinGreedyCommute(node: PlanNode, _context: OptContext): PlanNode | null {
19
+ if (!(node instanceof JoinNode)) return null;
20
+ if (node.joinType !== 'inner' && node.joinType !== 'cross') return null;
21
+
22
+ const leftRows = node.getLeftSource().estimatedRows ?? Number.POSITIVE_INFINITY;
23
+ const rightRows = node.getRightSource().estimatedRows ?? Number.POSITIVE_INFINITY;
24
+
25
+ // Prefer known finite estimatedRows; also detect <=1 row driver on either side
26
+ const leftIsSingleton = node.getLeftSource().physical.uniqueKeys?.some(k => k.length === 0) === true;
27
+ const rightIsSingleton = node.getRightSource().physical.uniqueKeys?.some(k => k.length === 0) === true;
28
+
29
+ // If right is strictly better driver (smaller or singleton), swap
30
+ const shouldSwap = (rightIsSingleton && !leftIsSingleton) || (!rightIsSingleton && !leftIsSingleton && rightRows < leftRows);
31
+ if (!shouldSwap) return null;
32
+
33
+ log('Commuting join children to place smaller input on the left (leftRows=%s, rightRows=%s)', String(leftRows), String(rightRows));
34
+
35
+ // Swap children; condition stays the same (attribute IDs are stable)
36
+ const swapped = new JoinNode(
37
+ node.scope,
38
+ node.getRightSource() as RelationalPlanNode,
39
+ node.getLeftSource() as RelationalPlanNode,
40
+ node.getJoinType(),
41
+ node.getJoinCondition(),
42
+ node.getUsingColumns()
43
+ );
44
+
45
+ return swapped;
46
+ }
47
+
48
+
@@ -0,0 +1,35 @@
1
+ import { createLogger } from '../../../common/logger.js';
2
+ import type { PlanNode } from '../../nodes/plan-node.js';
3
+ import type { OptContext } from '../../framework/context.js';
4
+ import { JoinNode } from '../../nodes/join-node.js';
5
+ import { BinaryOpNode } from '../../nodes/scalar.js';
6
+ import { ColumnReferenceNode } from '../../nodes/reference.js';
7
+
8
+ const log = createLogger('optimizer:rule:join-key-inference');
9
+
10
+ /**
11
+ * Rule: Join Key Inference
12
+ *
13
+ * Detect simple equi-join predicates (left.col = right.pk) and propagate
14
+ * inner/cross join unique keys (already handled by JoinNode.computePhysical),
15
+ * with a hook for future FK->PK inference (not implemented here yet).
16
+ */
17
+ export function ruleJoinKeyInference(node: PlanNode, _context: OptContext): PlanNode | null {
18
+ if (!(node instanceof JoinNode)) return null;
19
+ if (node.joinType !== 'inner' && node.joinType !== 'cross') return null;
20
+
21
+ const cond = node.getJoinCondition();
22
+ if (!cond || !(cond instanceof BinaryOpNode)) return null;
23
+ if (cond.expression.operator !== '=') return null;
24
+
25
+ // Simple left.col = right.col pattern check; placeholder for future FK->PK detection
26
+ const leftIsCol = cond.left instanceof ColumnReferenceNode;
27
+ const rightIsCol = cond.right instanceof ColumnReferenceNode;
28
+ if (!leftIsCol || !rightIsCol) return null;
29
+
30
+ log('Detected equi-join predicate; JoinNode.computePhysical will preserve side keys');
31
+ // No structural change needed now; computePhysical on JoinNode already preserves side keys
32
+ return null;
33
+ }
34
+
35
+