@quereus/quereus 0.2.0 → 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 +2 -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 +3 -3
  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 +84 -6
  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 +2 -2
  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 +38 -6
  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 +68 -11
  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 +39 -7
  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 +12 -4
  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 +2 -2
  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 +112 -25
  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 +31 -6
  529. package/dist/src/schema/table.d.ts.map +1 -1
  530. package/dist/src/schema/table.js +27 -12
  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 +18 -5
  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 +5 -3
  580. package/src/common/errors.ts +1 -1
  581. package/src/common/json-types.ts +16 -0
  582. package/src/common/types.ts +3 -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 +3 -3
  597. package/src/parser/ast.ts +582 -484
  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 +16 -7
  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 +2 -2
  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 +150 -28
  701. package/src/runtime/emit/create-assertion.ts +82 -0
  702. package/src/runtime/emit/cte-reference.ts +2 -2
  703. package/src/runtime/emit/cte.ts +2 -2
  704. package/src/runtime/emit/distinct.ts +2 -2
  705. package/src/runtime/emit/dml-executor.ts +20 -12
  706. package/src/runtime/emit/drop-assertion.ts +45 -0
  707. package/src/runtime/emit/filter.ts +4 -4
  708. package/src/runtime/emit/join.ts +8 -7
  709. package/src/runtime/emit/limit-offset.ts +2 -2
  710. package/src/runtime/emit/pragma.ts +2 -2
  711. package/src/runtime/emit/project.ts +2 -2
  712. package/src/runtime/emit/recursive-cte.ts +2 -2
  713. package/src/runtime/emit/remote-query.ts +47 -0
  714. package/src/runtime/emit/retrieve.ts +15 -0
  715. package/src/runtime/emit/returning.ts +4 -4
  716. package/src/runtime/emit/scalar-function.ts +2 -2
  717. package/src/runtime/emit/scan.ts +29 -13
  718. package/src/runtime/emit/schema-declarative.ts +205 -0
  719. package/src/runtime/emit/sequencing.ts +3 -3
  720. package/src/runtime/emit/set-operation.ts +7 -7
  721. package/src/runtime/emit/sort.ts +2 -2
  722. package/src/runtime/emit/subquery.ts +10 -10
  723. package/src/runtime/emit/transaction.ts +46 -8
  724. package/src/runtime/emit/values.ts +2 -2
  725. package/src/runtime/emit/window.ts +3 -3
  726. package/src/runtime/emitters.ts +1 -0
  727. package/src/runtime/register.ts +150 -135
  728. package/src/runtime/scheduler.ts +2 -2
  729. package/src/runtime/types.ts +10 -7
  730. package/src/runtime/utils.ts +3 -2
  731. package/src/schema/assertion.ts +21 -0
  732. package/src/schema/catalog.ts +208 -0
  733. package/src/schema/change-events.ts +2 -2
  734. package/src/schema/column.ts +2 -0
  735. package/src/schema/declared-schema-manager.ts +82 -0
  736. package/src/schema/function.ts +5 -2
  737. package/src/schema/manager.ts +742 -709
  738. package/src/schema/schema-differ.ts +214 -0
  739. package/src/schema/schema-hasher.ts +44 -0
  740. package/src/schema/schema.ts +23 -0
  741. package/src/schema/table.ts +398 -364
  742. package/src/schema/window-function.ts +2 -0
  743. package/src/util/ast-stringify.ts +869 -764
  744. package/src/util/environment.ts +2 -2
  745. package/src/util/plugin-loader.ts +184 -0
  746. package/src/util/row-descriptor.ts +1 -1
  747. package/src/util/serialization.ts +2 -0
  748. package/src/vtab/best-access-plan.ts +2 -1
  749. package/src/vtab/manifest.ts +1 -0
  750. package/src/vtab/memory/index.ts +178 -178
  751. package/src/vtab/memory/layer/base.ts +275 -273
  752. package/src/vtab/memory/layer/interface.ts +47 -47
  753. package/src/vtab/memory/layer/manager.ts +33 -11
  754. package/src/vtab/memory/layer/safe-iterate.ts +3 -3
  755. package/src/vtab/memory/layer/transaction.ts +229 -229
  756. package/src/vtab/memory/module.ts +24 -18
  757. package/src/vtab/memory/table.ts +256 -253
  758. package/src/vtab/memory/utils/logging.ts +6 -3
  759. package/src/vtab/module.ts +170 -140
  760. package/src/vtab/table.ts +162 -143
@@ -1,5 +1,5 @@
1
1
  import type { RecursiveCTENode } from '../../planner/nodes/recursive-cte-node.js';
2
- import type { Instruction, RuntimeContext } from '../types.js';
2
+ import type { Instruction, InstructionRun, RuntimeContext } from '../types.js';
3
3
  import type { EmissionContext } from '../emission-context.js';
4
4
  import { emitCallFromPlan, emitPlanNode } from '../emitters.js';
5
5
  import type { Row } from '../../common/types.js';
@@ -102,7 +102,7 @@ export function emitRecursiveCTE(plan: RecursiveCTENode, ctx: EmissionContext):
102
102
 
103
103
  return {
104
104
  params: [baseCaseInstruction, recursiveCaseInstruction],
105
- run,
105
+ run: run as InstructionRun,
106
106
  note: `recursiveCTE(${plan.cteName})`
107
107
  };
108
108
  }
@@ -0,0 +1,47 @@
1
+ import type { Instruction, RuntimeContext } from '../types.js';
2
+ import type { EmissionContext } from '../emission-context.js';
3
+ import type { Row } from '../../common/types.js';
4
+ import { QuereusError } from '../../common/errors.js';
5
+ import { StatusCode } from '../../common/types.js';
6
+ import type { RemoteQueryNode } from '../../planner/nodes/remote-query-node.js';
7
+ import type { AnyVirtualTableModule } from '../../vtab/module.js';
8
+
9
+ /**
10
+ * Emitter for RemoteQueryNode.
11
+ * Calls the virtual table's xExecutePlan() method to execute the pushed-down pipeline.
12
+ */
13
+ export function emitRemoteQuery(plan: RemoteQueryNode, _ctx: EmissionContext): Instruction {
14
+ async function* run(rctx: RuntimeContext): AsyncIterable<Row> {
15
+ // Retrieve virtual table connection via module context
16
+ const { tableRef, moduleCtx } = plan;
17
+ // Get the table instance - need to resolve this from the table reference
18
+ const tableSchema = tableRef.tableSchema;
19
+ const vtabModule = (moduleCtx as { vtabModule?: AnyVirtualTableModule } | undefined)?.vtabModule ?? tableRef.vtabModule;
20
+
21
+ // Connect to the table to get the instance
22
+ const table = vtabModule.xConnect(
23
+ rctx.db,
24
+ undefined, // pAux
25
+ tableSchema.vtabModuleName,
26
+ tableSchema.schemaName,
27
+ tableSchema.name,
28
+ {} // empty config for now
29
+ );
30
+
31
+ if (!table.xExecutePlan) {
32
+ throw new QuereusError(
33
+ `Virtual table module for '${tableSchema.name}' does not implement xExecutePlan() ` +
34
+ `despite indicating support via supports() method.`,
35
+ StatusCode.INTERNAL
36
+ );
37
+ }
38
+
39
+ yield* table.xExecutePlan(rctx.db, plan.source, plan.moduleCtx);
40
+ }
41
+
42
+ return {
43
+ params: [],
44
+ run,
45
+ note: `remoteQuery(${plan.tableRef.tableSchema.name})`
46
+ };
47
+ }
@@ -0,0 +1,15 @@
1
+ import type { RetrieveNode } from '../../planner/nodes/retrieve-node.js';
2
+ import type { Instruction } from '../types.js';
3
+ import type { EmissionContext } from '../emission-context.js';
4
+ import { QuereusError } from '../../common/errors.js';
5
+ import { StatusCode } from '../../common/types.js';
6
+
7
+ export function emitRetrieve(plan: RetrieveNode, _ctx: EmissionContext): Instruction {
8
+ // RetrieveNode should always be rewritten by the optimizer's access path selection rule
9
+ // If we reach this point, it means the optimizer failed to convert it to a physical node
10
+ throw new QuereusError(
11
+ `RetrieveNode for table '${plan.tableRef.tableSchema.name}' was not rewritten to a physical access node. ` +
12
+ `This indicates the virtual table module has no supported access method (neither supports() nor getBestAccessPlan()).`,
13
+ StatusCode.INTERNAL
14
+ );
15
+ }
@@ -1,6 +1,6 @@
1
1
  import type { ReturningNode } from '../../planner/nodes/returning-node.js';
2
- import type { Instruction, RuntimeContext } from '../types.js';
3
- import type { Row } from '../../common/types.js';
2
+ import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
3
+ import type { Row, OutputValue } from '../../common/types.js';
4
4
  import type { EmissionContext } from '../emission-context.js';
5
5
  import { emitPlanNode, emitCallFromPlan } from '../emitters.js';
6
6
  import { buildRowDescriptor } from '../../util/row-descriptor.js';
@@ -19,7 +19,7 @@ export function emitReturning(plan: ReturningNode, ctx: EmissionContext): Instru
19
19
  async function* run(
20
20
  rctx: RuntimeContext,
21
21
  executorRows: AsyncIterable<Row>,
22
- ...projectionCallbacks: Array<(ctx: RuntimeContext) => any>
22
+ ...projectionCallbacks: Array<(ctx: RuntimeContext) => OutputValue>
23
23
  ): AsyncIterable<Row> {
24
24
  // Project the results from the executor rows
25
25
  yield* withRowContextGenerator(rctx, sourceRowDescriptor, executorRows, async function* (_sourceRow) {
@@ -35,7 +35,7 @@ export function emitReturning(plan: ReturningNode, ctx: EmissionContext): Instru
35
35
 
36
36
  return {
37
37
  params: [executorInstruction, ...projectionEvaluators],
38
- run,
38
+ run: run as InstructionRun,
39
39
  note: `returning(${plan.projections.length} cols)`
40
40
  };
41
41
  }
@@ -1,5 +1,5 @@
1
1
  import type { ScalarFunctionCallNode } from '../../planner/nodes/function.js';
2
- import type { Instruction, RuntimeContext } from '../types.js';
2
+ import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
3
3
  import { emitPlanNode, createValidatedInstruction } from '../emitters.js';
4
4
  import { QuereusError } from '../../common/errors.js';
5
5
  import { StatusCode, type SqlValue, type OutputValue } from '../../common/types.js';
@@ -36,7 +36,7 @@ export function emitScalarFunctionCall(plan: ScalarFunctionCallNode, ctx: Emissi
36
36
 
37
37
  return createValidatedInstruction(
38
38
  [...operandExprs],
39
- run as any,
39
+ run as InstructionRun,
40
40
  ctx,
41
41
  `${plan.expression.name}(${plan.operands.length})`
42
42
  );
@@ -2,10 +2,10 @@ import { StatusCode, type Row } from "../../common/types.js";
2
2
  import { SeqScanNode, IndexScanNode, IndexSeekNode } from "../../planner/nodes/table-access-nodes.js";
3
3
  import { QuereusError } from "../../common/errors.js";
4
4
  import type { VirtualTable } from "../../vtab/table.js";
5
- import type { BaseModuleConfig } from "../../vtab/module.js";
5
+ import type { BaseModuleConfig, AnyVirtualTableModule } from "../../vtab/module.js";
6
6
  import type { Instruction, RuntimeContext } from "../types.js";
7
7
  import type { EmissionContext } from "../emission-context.js";
8
- import { createValidatedInstruction } from "../emitters.js";
8
+ import { createValidatedInstruction, emitPlanNode } from "../emitters.js";
9
9
  import { disconnectVTable } from "../utils.js";
10
10
  import { buildRowDescriptor } from "../../util/row-descriptor.js";
11
11
  import { createRowSlot } from "../context-helpers.js";
@@ -30,9 +30,9 @@ export function emitSeqScan(plan: SeqScanNode | IndexScanNode | IndexSeekNode, c
30
30
  // Capture the module info key for runtime retrieval
31
31
  const moduleKey = `vtab_module:${schema.vtabModuleName}`;
32
32
 
33
- async function* run(runtimeCtx: RuntimeContext): AsyncIterable<Row> {
33
+ async function* run(runtimeCtx: RuntimeContext, ...dynamicArgs: any[]): AsyncIterable<Row> {
34
34
  // Use the captured module info instead of doing a fresh lookup
35
- const capturedModuleInfo = ctx.getCapturedSchemaObject<{ module: any, auxData?: unknown }>(moduleKey);
35
+ const capturedModuleInfo = ctx.getCapturedSchemaObject<{ module: AnyVirtualTableModule, auxData?: unknown }>(moduleKey);
36
36
  if (!capturedModuleInfo) {
37
37
  throw new QuereusError(`Virtual table module '${schema.vtabModuleName}' was not captured during emission`, StatusCode.INTERNAL);
38
38
  }
@@ -43,8 +43,8 @@ export function emitSeqScan(plan: SeqScanNode | IndexScanNode | IndexSeekNode, c
43
43
  }
44
44
 
45
45
  let vtabInstance: VirtualTable;
46
- try {
47
- const options: BaseModuleConfig = {}; // TODO: Populate options from plan.source.tableSchema.vtabArgs or similar if needed
46
+ try {
47
+ const options: BaseModuleConfig = (schema.vtabArgs ?? {}) as BaseModuleConfig;
48
48
  vtabInstance = module.xConnect(
49
49
  runtimeCtx.db,
50
50
  capturedModuleInfo.auxData,
@@ -66,7 +66,15 @@ export function emitSeqScan(plan: SeqScanNode | IndexScanNode | IndexSeekNode, c
66
66
 
67
67
  const rowSlot = createRowSlot(runtimeCtx, rowDescriptor);
68
68
  try {
69
- const asyncRowIterable = vtabInstance.xQuery(plan.filterInfo);
69
+ // If this is an IndexSeek with dynamic seek keys, populate args from params
70
+ const effectiveFilterInfo = (() => {
71
+ if (plan instanceof IndexSeekNode && dynamicArgs && dynamicArgs.length > 0) {
72
+ return { ...plan.filterInfo, args: dynamicArgs };
73
+ }
74
+ return plan.filterInfo;
75
+ })();
76
+
77
+ const asyncRowIterable = vtabInstance.xQuery(effectiveFilterInfo);
70
78
  for await (const row of asyncRowIterable) {
71
79
  rowSlot.set(row);
72
80
  yield row;
@@ -81,10 +89,18 @@ export function emitSeqScan(plan: SeqScanNode | IndexScanNode | IndexSeekNode, c
81
89
  }
82
90
  }
83
91
 
84
- return createValidatedInstruction(
85
- [],
86
- run,
87
- ctx,
88
- `${plan.nodeType}(${schema.name})`
89
- );
92
+ // Emit parameter instructions for dynamic seek keys (IndexSeek only)
93
+ const params: Instruction[] = [];
94
+ if (plan instanceof IndexSeekNode) {
95
+ for (const key of plan.getSeekKeys()) {
96
+ params.push(emitPlanNode(key, ctx));
97
+ }
98
+ }
99
+
100
+ return createValidatedInstruction(
101
+ params,
102
+ run,
103
+ ctx,
104
+ `${plan.nodeType}(${schema.name})`
105
+ );
90
106
  }
@@ -0,0 +1,205 @@
1
+ import type { EmissionContext } from '../emission-context.js';
2
+ import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
3
+ import { createLogger } from '../../common/logger.js';
4
+ import { StatusCode, type Row, type SqlValue } from '../../common/types.js';
5
+ import { QuereusError } from '../../common/errors.js';
6
+ import { collectSchemaCatalog } from '../../schema/catalog.js';
7
+ import { computeSchemaDiff, generateMigrationDDL } from '../../schema/schema-differ.js';
8
+ import { computeShortSchemaHash } from '../../schema/schema-hasher.js';
9
+ import type * as AST from '../../parser/ast.js';
10
+ import type { PlanNode } from '../../planner/nodes/plan-node.js';
11
+
12
+ const log = createLogger('runtime:emit:declare');
13
+
14
+ export function emitDeclareSchema(plan: PlanNode, _ctx: EmissionContext): Instruction {
15
+ const declareStmt = (plan as unknown as { statementAst: AST.DeclareSchemaStmt }).statementAst;
16
+
17
+ const run = (rctx: RuntimeContext): Row => {
18
+ const schemaName = declareStmt.schemaName || 'main';
19
+ log('DECLARE SCHEMA %s', schemaName);
20
+
21
+ // Clear previous declaration and seed data for this schema
22
+ rctx.db.declaredSchemaManager.clearSeedData(schemaName);
23
+
24
+ // Store the declared schema
25
+ rctx.db.declaredSchemaManager.setDeclaredSchema(schemaName, declareStmt);
26
+
27
+ // Process seed data if present
28
+ for (const item of declareStmt.items) {
29
+ if (item.type === 'declaredSeed' && item.seedData) {
30
+ const tableName = item.tableName;
31
+ const rows = Array.from(item.seedData) as Array<SqlValue[]>;
32
+ rctx.db.declaredSchemaManager.setSeedData(schemaName, tableName, rows);
33
+ log('Stored seed data for %s.%s (%d rows)', schemaName, tableName, rows.length);
34
+ }
35
+ }
36
+
37
+ // Return empty row to satisfy type system (void result)
38
+ return [];
39
+ };
40
+
41
+ return {
42
+ params: [],
43
+ run: run as InstructionRun,
44
+ note: `declare schema ${declareStmt.schemaName || 'main'}`
45
+ };
46
+ }
47
+
48
+ export function emitDiffSchema(plan: PlanNode, _ctx: EmissionContext): Instruction {
49
+ const diffStmt = (plan as unknown as { statementAst: AST.DiffSchemaStmt }).statementAst;
50
+
51
+ const run = async function* (rctx: RuntimeContext): AsyncIterable<Row> {
52
+ const schemaName = diffStmt.schemaName || 'main';
53
+ log('DIFF SCHEMA %s', schemaName);
54
+
55
+ // Get declared schema
56
+ const declaredSchema = rctx.db.declaredSchemaManager.getDeclaredSchema(schemaName);
57
+ if (!declaredSchema) {
58
+ throw new QuereusError(`No declared schema found for '${schemaName}'`, StatusCode.ERROR);
59
+ }
60
+
61
+ // Collect actual catalog
62
+ const actualCatalog = collectSchemaCatalog(rctx.db, schemaName);
63
+
64
+ // Compute diff
65
+ const diff = computeSchemaDiff(declaredSchema, actualCatalog);
66
+
67
+ // Generate migration DDL statements
68
+ const migrationStatements = generateMigrationDDL(diff, schemaName);
69
+
70
+ // Return each DDL statement as a row
71
+ // This allows users to fetch the DDL and execute it themselves with custom logic
72
+ for (const ddl of migrationStatements) {
73
+ yield [ddl];
74
+ }
75
+ };
76
+
77
+ return {
78
+ params: [],
79
+ run: run as InstructionRun,
80
+ note: `diff schema ${diffStmt.schemaName || 'main'}`
81
+ };
82
+ }
83
+
84
+ export function emitApplySchema(plan: PlanNode, _ctx: EmissionContext): Instruction {
85
+ const applyStmt = (plan as unknown as { statementAst: AST.ApplySchemaStmt }).statementAst;
86
+
87
+ const run = async (rctx: RuntimeContext): Promise<Row> => {
88
+ const schemaName = applyStmt.schemaName || 'main';
89
+ log('APPLY SCHEMA %s', schemaName);
90
+
91
+ // Get declared schema
92
+ const declaredSchema = rctx.db.declaredSchemaManager.getDeclaredSchema(schemaName);
93
+ if (!declaredSchema) {
94
+ throw new QuereusError(`No declared schema found for '${schemaName}'`, StatusCode.ERROR);
95
+ }
96
+
97
+ // Ensure the target schema exists (create if it doesn't, except for main/temp)
98
+ const lowerSchemaName = schemaName.toLowerCase();
99
+ if (lowerSchemaName !== 'main' && lowerSchemaName !== 'temp') {
100
+ if (!rctx.db.schemaManager.getSchema(schemaName)) {
101
+ rctx.db.schemaManager.addSchema(schemaName);
102
+ log('Created schema: %s', schemaName);
103
+ }
104
+ }
105
+
106
+ // Collect actual catalog
107
+ const actualCatalog = collectSchemaCatalog(rctx.db, schemaName);
108
+
109
+ // Compute diff
110
+ const diff = computeSchemaDiff(declaredSchema, actualCatalog);
111
+
112
+ // Generate migration DDL
113
+ const migrationStatements = generateMigrationDDL(diff, schemaName);
114
+
115
+ // Execute each migration statement
116
+ for (const ddl of migrationStatements) {
117
+ log('Executing migration DDL: %s', ddl);
118
+ try {
119
+ await rctx.db.exec(ddl);
120
+ } catch (e) {
121
+ log('Migration failed for DDL: %s', ddl);
122
+ throw e;
123
+ }
124
+ }
125
+
126
+ // Apply seed data if requested
127
+ if (applyStmt.withSeed) {
128
+ const allSeedData = rctx.db.declaredSchemaManager.getAllSeedData(schemaName);
129
+ log('Seed data available for %d tables', allSeedData.size);
130
+ for (const [tableName, rows] of allSeedData) {
131
+ log('Applying seed data to %s.%s (%d rows)', schemaName, tableName, rows.length);
132
+
133
+ // Qualify table name with schema if not main
134
+ const qualifiedTableName = (schemaName && schemaName.toLowerCase() !== 'main')
135
+ ? `${schemaName}.${tableName}`
136
+ : tableName;
137
+
138
+ // Delete existing rows, then insert seed rows in one batch
139
+ const deleteAndInsertSql = [
140
+ `DELETE FROM ${qualifiedTableName}`,
141
+ ...rows.map(row => {
142
+ const values = row.map(v =>
143
+ v === null ? 'NULL' :
144
+ typeof v === 'string' ? `'${v.replace(/'/g, "''")}'` :
145
+ typeof v === 'number' || typeof v === 'bigint' ? String(v) :
146
+ 'NULL'
147
+ ).join(', ');
148
+ return `INSERT INTO ${qualifiedTableName} VALUES (${values})`;
149
+ })
150
+ ].join('; ');
151
+
152
+ log('Executing seed SQL (length=%d): %s', deleteAndInsertSql.length, deleteAndInsertSql);
153
+ try {
154
+ await rctx.db.exec(deleteAndInsertSql);
155
+ log('Seed application succeeded for table %s', tableName);
156
+ } catch (e) {
157
+ log('Seed application failed for table %s: %O', tableName, e);
158
+ throw e;
159
+ }
160
+ }
161
+ }
162
+
163
+ // Return empty row to satisfy type system (void result)
164
+ return [];
165
+ };
166
+
167
+ return {
168
+ params: [],
169
+ run: run as InstructionRun,
170
+ note: `apply schema ${applyStmt.schemaName || 'main'}${applyStmt.withSeed ? ' with seed' : ''}`
171
+ };
172
+ }
173
+
174
+ export function emitExplainSchema(plan: PlanNode, _ctx: EmissionContext): Instruction {
175
+ const explainStmt = (plan as unknown as { statementAst: AST.ExplainSchemaStmt }).statementAst;
176
+
177
+ const run = async function* (rctx: RuntimeContext): AsyncIterable<Row> {
178
+ const schemaName = explainStmt.schemaName || 'main';
179
+ log('EXPLAIN SCHEMA %s', schemaName);
180
+
181
+ // Get declared schema
182
+ const declaredSchema = rctx.db.declaredSchemaManager.getDeclaredSchema(schemaName);
183
+ if (!declaredSchema) {
184
+ throw new QuereusError(`No declared schema found for '${schemaName}'`, StatusCode.ERROR);
185
+ }
186
+
187
+ // Compute hash
188
+ const hash = await computeShortSchemaHash(declaredSchema);
189
+
190
+ // Return hash with version if specified
191
+ const result = explainStmt.version
192
+ ? `version:${explainStmt.version},hash:${hash}`
193
+ : `hash:${hash}`;
194
+
195
+ yield [result];
196
+ };
197
+
198
+ return {
199
+ params: [],
200
+ run: run as InstructionRun,
201
+ note: `explain schema ${explainStmt.schemaName || 'main'}`
202
+ };
203
+ }
204
+
205
+
@@ -1,7 +1,7 @@
1
1
  import type { SequencingNode } from '../../planner/nodes/sequencing-node.js';
2
- import type { Instruction, RuntimeContext } from '../types.js';
2
+ import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
3
3
  import { emitPlanNode } from '../emitters.js';
4
- import { type Row } from '../../common/types.js';
4
+ import type { Row } from '../../common/types.js';
5
5
  import type { EmissionContext } from '../emission-context.js';
6
6
 
7
7
  export function emitSequencing(plan: SequencingNode, ctx: EmissionContext): Instruction {
@@ -18,7 +18,7 @@ export function emitSequencing(plan: SequencingNode, ctx: EmissionContext): Inst
18
18
 
19
19
  return {
20
20
  params: [sourceInstruction],
21
- run: run as any,
21
+ run: run as InstructionRun,
22
22
  note: `sequencing(${plan.sequenceColumnName})`
23
23
  };
24
24
  }
@@ -1,5 +1,5 @@
1
1
  import type { SetOperationNode } from '../../planner/nodes/set-operation-node.js';
2
- import type { Instruction, RuntimeContext } from '../types.js';
2
+ import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
3
3
  import type { EmissionContext } from '../emission-context.js';
4
4
  import { emitPlanNode } from '../emitters.js';
5
5
  import type { Row } from '../../common/types.js';
@@ -87,25 +87,25 @@ export function emitSetOperation(plan: SetOperationNode, ctx: EmissionContext):
87
87
  }
88
88
  }
89
89
 
90
- let runFunc: any;
90
+ let run: InstructionRun;
91
91
  switch (plan.op) {
92
92
  case 'unionAll':
93
- runFunc = runUnionAll;
93
+ run = runUnionAll as InstructionRun;
94
94
  break;
95
95
  case 'union':
96
- runFunc = runUnionDistinct;
96
+ run = runUnionDistinct as InstructionRun;
97
97
  break;
98
98
  case 'intersect':
99
- runFunc = runIntersect;
99
+ run = runIntersect as InstructionRun;
100
100
  break;
101
101
  case 'except':
102
- runFunc = runExcept;
102
+ run = runExcept as InstructionRun;
103
103
  break;
104
104
  }
105
105
 
106
106
  return {
107
107
  params: [leftInst, rightInst],
108
- run: runFunc as any,
108
+ run,
109
109
  note: plan.op
110
110
  };
111
111
  }
@@ -1,5 +1,5 @@
1
1
  import type { SortNode } from '../../planner/nodes/sort.js';
2
- import type { Instruction, RuntimeContext } from '../types.js';
2
+ import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
3
3
  import { emitPlanNode, emitCallFromPlan } from '../emitters.js';
4
4
  import { type SqlValue, type Row, type MaybePromise } from '../../common/types.js';
5
5
  import type { EmissionContext } from '../emission-context.js';
@@ -69,7 +69,7 @@ export function emitSort(plan: SortNode, ctx: EmissionContext): Instruction {
69
69
 
70
70
  return {
71
71
  params: [sourceInstruction, ...sortKeyInstructions],
72
- run: run as any,
72
+ run: run as InstructionRun,
73
73
  note: `sort(${plan.sortKeys.length} keys)`
74
74
  };
75
75
  }
@@ -1,17 +1,17 @@
1
+ import type { InNode, ExistsNode, ScalarSubqueryNode } from '../../planner/nodes/subquery.js';
1
2
  import type { Instruction, InstructionRun, RuntimeContext } from '../types.js';
2
- import type { InNode, ScalarSubqueryNode, ExistsNode } from '../../planner/nodes/subquery.js';
3
3
  import { emitPlanNode } from '../emitters.js';
4
4
  import type { SqlValue, Row } from '../../common/types.js';
5
- import { compareSqlValuesFast, resolveCollation } from '../../util/comparison.js';
6
5
  import type { EmissionContext } from '../emission-context.js';
7
6
  import { QuereusError } from '../../common/errors.js';
8
7
  import { StatusCode } from '../../common/types.js';
9
8
  import { BTree } from 'inheritree';
9
+ import { compareSqlValuesFast, resolveCollation } from '../../util/comparison.js';
10
10
  import { ConstantNode } from '../../planner/nodes/plan-node.js';
11
11
 
12
12
  export function emitScalarSubquery(plan: ScalarSubqueryNode, ctx: EmissionContext): Instruction {
13
13
 
14
- async function run(rctx: RuntimeContext, input: AsyncIterable<Row>): Promise<SqlValue> {
14
+ async function run(_rctx: RuntimeContext, input: AsyncIterable<Row>): Promise<SqlValue> {
15
15
  let result: SqlValue = null;
16
16
  let seen = false;
17
17
 
@@ -33,7 +33,7 @@ export function emitScalarSubquery(plan: ScalarSubqueryNode, ctx: EmissionContex
33
33
 
34
34
  return {
35
35
  params: [innerInstruction],
36
- run,
36
+ run: run as InstructionRun,
37
37
  note: 'SCALAR_SUBQUERY'
38
38
  };
39
39
  }
@@ -77,7 +77,7 @@ export function emitIn(plan: InNode, ctx: EmissionContext): Instruction {
77
77
 
78
78
  return {
79
79
  params: [sourceInstruction, conditionExpr],
80
- run: runSubqueryStreaming as any,
80
+ run: runSubqueryStreaming as InstructionRun,
81
81
  note: `IN (subquery)`
82
82
  };
83
83
  } else if (plan.values) {
@@ -116,7 +116,7 @@ export function emitIn(plan: InNode, ctx: EmissionContext): Instruction {
116
116
 
117
117
  if (values.some(val => val instanceof Promise)) {
118
118
  // Must resolve promises at runtime
119
- runFunc = async (rctx: RuntimeContext, condition: SqlValue): Promise<SqlValue> => {
119
+ runFunc = (async (rctx: RuntimeContext, condition: SqlValue): Promise<SqlValue> => {
120
120
  const resolved = await Promise.all(values);
121
121
 
122
122
  for (const value of resolved) {
@@ -128,7 +128,7 @@ export function emitIn(plan: InNode, ctx: EmissionContext): Instruction {
128
128
  }
129
129
 
130
130
  return innerConstantRun(rctx, condition);
131
- }
131
+ }) as InstructionRun;
132
132
  } else {
133
133
  for (const value of values) {
134
134
  if (value === null) {
@@ -137,7 +137,7 @@ export function emitIn(plan: InNode, ctx: EmissionContext): Instruction {
137
137
  }
138
138
  tree.insert(value as SqlValue);
139
139
  }
140
- runFunc = innerConstantRun;
140
+ runFunc = innerConstantRun as InstructionRun;
141
141
  }
142
142
 
143
143
  const conditionExpr = emitPlanNode(plan.condition, ctx);
@@ -176,7 +176,7 @@ export function emitIn(plan: InNode, ctx: EmissionContext): Instruction {
176
176
 
177
177
  return {
178
178
  params: [conditionExpr, ...valueExprs],
179
- run: runDynamicValues as any,
179
+ run: runDynamicValues as InstructionRun,
180
180
  note: `IN (${plan.values.length} dynamic values)`
181
181
  };
182
182
  }
@@ -197,7 +197,7 @@ export function emitExists(plan: ExistsNode, ctx: EmissionContext): Instruction
197
197
 
198
198
  return {
199
199
  params: [innerInstruction],
200
- run,
200
+ run: run as InstructionRun,
201
201
  note: 'EXISTS'
202
202
  };
203
203
  }
@@ -39,6 +39,10 @@ export function emitTransaction(plan: TransactionNode, _ctx: EmissionContext): I
39
39
  throw error;
40
40
  }
41
41
  }
42
+ // Reflect explicit transaction state in Database
43
+ rctx.db.markExplicitTransactionStart();
44
+ // Reset any prior change tracking at the start of an explicit transaction
45
+ rctx.db._clearChangeLog();
42
46
  return null;
43
47
  };
44
48
  note = `BEGIN ${plan.mode || 'DEFERRED'}`;
@@ -46,17 +50,40 @@ export function emitTransaction(plan: TransactionNode, _ctx: EmissionContext): I
46
50
  }
47
51
  case 'commit': {
48
52
  run = async (rctx: RuntimeContext) => {
49
- const connections = rctx.db.getAllConnections();
50
- log(`COMMIT: Found ${connections.length} active connections`);
53
+ // Snapshot connections before evaluating deferred constraints
54
+ // (constraint evaluation may open additional connections that shouldn't be committed)
55
+ const connectionsToCommit = rctx.db.getAllConnections();
56
+ log(`COMMIT: Found ${connectionsToCommit.length} active connections`);
51
57
 
52
- for (const connection of connections) {
58
+ try {
59
+ // Evaluate global assertions and deferred row-level constraints BEFORE committing connections.
60
+ await rctx.db.runGlobalAssertions();
61
+ await rctx.db.runDeferredRowConstraints();
62
+
63
+ // Mark coordinated commit to relax layer validation for sibling layers
64
+ rctx.db._beginCoordinatedCommit();
53
65
  try {
54
- await connection.commit();
55
- log(`COMMIT: Successfully called on connection ${connection.connectionId}`);
56
- } catch (error) {
57
- log(`COMMIT: Error on connection ${connection.connectionId}: %O`, error);
58
- throw error;
66
+ // Commit sequentially to avoid race conditions with layer promotion
67
+ for (const connection of connectionsToCommit) {
68
+ try {
69
+ await connection.commit();
70
+ log(`COMMIT: Successfully called on connection ${connection.connectionId}`);
71
+ } catch (error) {
72
+ log(`COMMIT: Error on connection ${connection.connectionId}: %O`, error);
73
+ throw error;
74
+ }
75
+ }
76
+ } finally {
77
+ rctx.db._endCoordinatedCommit();
59
78
  }
79
+ } catch (e) {
80
+ // If assertions fail (or a commit throws), rollback all connections
81
+ await Promise.allSettled(rctx.db.getAllConnections().map(c => c.rollback()));
82
+ throw e;
83
+ } finally {
84
+ // Always mark end of explicit transaction and clear change tracking
85
+ rctx.db.markExplicitTransactionEnd();
86
+ rctx.db._clearChangeLog();
60
87
  }
61
88
  return null;
62
89
  };
@@ -80,6 +107,8 @@ export function emitTransaction(plan: TransactionNode, _ctx: EmissionContext): I
80
107
  throw error;
81
108
  }
82
109
  }
110
+ // Discard top change layer
111
+ rctx.db._rollbackSavepointLayer();
83
112
  return null;
84
113
  };
85
114
  note = `ROLLBACK TO SAVEPOINT ${plan.savepoint}`;
@@ -97,6 +126,9 @@ export function emitTransaction(plan: TransactionNode, _ctx: EmissionContext): I
97
126
  throw error;
98
127
  }
99
128
  }
129
+ // Reflect explicit transaction end and clear change tracking
130
+ rctx.db.markExplicitTransactionEnd();
131
+ rctx.db._clearChangeLog();
100
132
  return null;
101
133
  };
102
134
  note = 'ROLLBACK';
@@ -122,6 +154,10 @@ export function emitTransaction(plan: TransactionNode, _ctx: EmissionContext): I
122
154
  throw error;
123
155
  }
124
156
  }
157
+ // Mark database as in explicit transaction (savepoints require explicit transaction context)
158
+ rctx.db.markExplicitTransactionStart();
159
+ // Track change layer
160
+ rctx.db._beginSavepointLayer();
125
161
  return null;
126
162
  };
127
163
  note = `SAVEPOINT ${plan.savepoint}`;
@@ -146,6 +182,8 @@ export function emitTransaction(plan: TransactionNode, _ctx: EmissionContext): I
146
182
  throw error;
147
183
  }
148
184
  }
185
+ // Merge top change layer into below
186
+ rctx.db._releaseSavepointLayer();
149
187
  return null;
150
188
  };
151
189
  note = `RELEASE SAVEPOINT ${plan.savepoint}`;