@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,13 +1,25 @@
1
1
  import type { ConstraintCheckNode } from '../../planner/nodes/constraint-check-node.js';
2
- import type { Instruction, RuntimeContext } from '../types.js';
2
+ import type { Instruction, InstructionRun, RuntimeContext } from '../types.js';
3
3
  import type { Row } from '../../common/types.js';
4
4
  import type { EmissionContext } from '../emission-context.js';
5
5
  import { emitPlanNode, emitCallFromPlan } from '../emitters.js';
6
6
  import { QuereusError } from '../../common/errors.js';
7
7
  import { StatusCode, type SqlValue, type OutputValue } from '../../common/types.js';
8
8
  import type { RowConstraintSchema, TableSchema } from '../../schema/table.js';
9
- import { RowOp } from '../../schema/table.js';
10
- import { withAsyncRowContext } from '../context-helpers.js';
9
+ import type { RowDescriptor } from '../../planner/nodes/plan-node.js';
10
+ import { RowOpFlag } from '../../schema/table.js';
11
+ import { withAsyncRowContext, createRowSlot } from '../context-helpers.js';
12
+
13
+ interface ConstraintMetadataEntry {
14
+ schema: RowConstraintSchema;
15
+ flatRowDescriptor: RowDescriptor;
16
+ evaluator: (ctx: RuntimeContext) => OutputValue;
17
+ constraintName: string;
18
+ shouldDefer: boolean;
19
+ baseTable: string;
20
+ contextRow?: Row; // Mutation context row if present
21
+ contextDescriptor?: RowDescriptor; // Mutation context row descriptor
22
+ }
11
23
 
12
24
  export function emitConstraintCheck(plan: ConstraintCheckNode, ctx: EmissionContext): Instruction {
13
25
  // Get the table schema to access constraints
@@ -16,32 +28,102 @@ export function emitConstraintCheck(plan: ConstraintCheckNode, ctx: EmissionCont
16
28
  // Use the pre-built flat row descriptor from the plan
17
29
  const flatRowDescriptor = plan.flatRowDescriptor;
18
30
 
31
+ // Get mutation context from the plan (passed from DML builders)
32
+ const mutationContextValues = plan.mutationContextValues;
33
+ const contextAttributes = plan.contextAttributes;
34
+ const contextDescriptor = plan.contextDescriptor;
35
+
36
+ // Emit mutation context value evaluators if present
37
+ const contextEvaluatorInstructions: Instruction[] = [];
38
+ if (mutationContextValues && contextAttributes) {
39
+ for (const attr of contextAttributes) {
40
+ const valueExpr = mutationContextValues.get(attr.name);
41
+ if (valueExpr) {
42
+ contextEvaluatorInstructions.push(emitCallFromPlan(valueExpr, ctx));
43
+ }
44
+ }
45
+ }
46
+
19
47
  // Emit evaluator instructions for each pre-built constraint expression
20
48
  const checkEvaluators = plan.constraintChecks.map(check =>
21
49
  emitCallFromPlan(check.expression, ctx)
22
50
  );
23
51
 
24
- // Extract just the constraint metadata for the runtime checker
25
- const constraintMetadata = plan.constraintChecks.map(c => c.constraint);
52
+ const constraintMetadata: ConstraintMetadataEntry[] = plan.constraintChecks.map((check, idx) => {
53
+ const evaluatorInstruction = checkEvaluators[idx];
54
+ const constraintName = check.constraint.name ?? generateDefaultConstraintName(tableSchema, check.constraint);
55
+ return {
56
+ schema: check.constraint,
57
+ flatRowDescriptor: plan.flatRowDescriptor,
58
+ evaluator: evaluatorInstruction.run,
59
+ constraintName,
60
+ shouldDefer: Boolean(check.deferrable || check.initiallyDeferred || check.containsSubquery),
61
+ baseTable: `${tableSchema.schemaName}.${tableSchema.name}`,
62
+ contextRow: undefined,
63
+ contextDescriptor
64
+ };
65
+ });
26
66
 
27
67
  async function* run(rctx: RuntimeContext, inputRows: AsyncIterable<Row>, ...evaluatorFunctions: Array<(ctx: RuntimeContext) => OutputValue>): AsyncIterable<Row> {
28
68
  if (!inputRows) {
29
69
  return;
30
70
  }
31
71
 
32
- for await (const inputRow of inputRows) {
33
- const flatRow = inputRow;
72
+ // Evaluate mutation context values once per statement (not per row)
73
+ let contextRow: Row | undefined;
74
+ let contextSlot: ReturnType<typeof createRowSlot> | undefined;
75
+
76
+ if (contextEvaluatorInstructions.length > 0 && contextDescriptor) {
77
+ // Split evaluatorFunctions into context evaluators and constraint evaluators
78
+ const contextEvalFunctions = evaluatorFunctions.slice(0, contextEvaluatorInstructions.length);
79
+ const constraintEvalFunctions = evaluatorFunctions.slice(contextEvaluatorInstructions.length);
34
80
 
35
- const result = await withAsyncRowContext(rctx, flatRowDescriptor, () => flatRow, async () => {
36
- // Check all constraints that apply to this operation
37
- await checkConstraints(rctx, plan, tableSchema, flatRow, constraintMetadata, evaluatorFunctions);
81
+ // Evaluate all context values
82
+ contextRow = [];
83
+ for (const contextEvaluator of contextEvalFunctions) {
84
+ const value = await contextEvaluator(rctx) as SqlValue;
85
+ contextRow.push(value);
86
+ }
38
87
 
39
- // If all constraints pass, yield the flat row for downstream processing
40
- // All downstream operations (INSERT executor, DELETE executor, RETURNING) expect flat rows
41
- return flatRow;
88
+ // Store context row in metadata for deferred constraints
89
+ constraintMetadata.forEach(meta => {
90
+ meta.contextRow = contextRow;
42
91
  });
43
92
 
44
- yield result;
93
+ // Create a row slot for the mutation context that persists for the whole statement
94
+ contextSlot = createRowSlot(rctx, contextDescriptor);
95
+ contextSlot.set(contextRow);
96
+
97
+ // Use constraint evaluators for the rest of the function
98
+ evaluatorFunctions = constraintEvalFunctions;
99
+ }
100
+
101
+ try {
102
+ for await (const inputRow of inputRows) {
103
+ const flatRow = inputRow;
104
+
105
+ // If we have mutation context, compose it with the flat row for constraint evaluation
106
+ const combinedRow = contextRow ? [...contextRow, ...flatRow] : flatRow;
107
+ const combinedDescriptor = contextDescriptor && contextRow
108
+ ? composeCombinedDescriptor(contextDescriptor, flatRowDescriptor)
109
+ : flatRowDescriptor;
110
+
111
+ const result = await withAsyncRowContext(rctx, combinedDescriptor, () => combinedRow, async () => {
112
+ // Check all constraints that apply to this operation
113
+ await checkConstraints(rctx, plan, tableSchema, flatRow, constraintMetadata, evaluatorFunctions);
114
+
115
+ // If all constraints pass, yield the flat row for downstream processing
116
+ // All downstream operations (INSERT executor, DELETE executor, RETURNING) expect flat rows
117
+ return flatRow;
118
+ });
119
+
120
+ yield result;
121
+ }
122
+ } finally {
123
+ // Clean up context slot if we created one
124
+ if (contextSlot) {
125
+ contextSlot.close();
126
+ }
45
127
  }
46
128
  }
47
129
 
@@ -49,18 +131,45 @@ export function emitConstraintCheck(plan: ConstraintCheckNode, ctx: EmissionCont
49
131
  const sourceInstruction = emitPlanNode(plan.source, ctx);
50
132
 
51
133
  return {
52
- params: [sourceInstruction, ...checkEvaluators],
53
- run: run as any,
54
- note: `constraintCheck(${plan.operation}, ${plan.constraintChecks.length} checks)`
134
+ params: [sourceInstruction, ...contextEvaluatorInstructions, ...checkEvaluators],
135
+ run: run as InstructionRun,
136
+ note: `constraintCheck(${plan.operation}, ${contextEvaluatorInstructions.length} ctx, ${plan.constraintChecks.length} checks)`
55
137
  };
56
138
  }
57
139
 
140
+ /**
141
+ * Composes a combined row descriptor that includes both context and flat (OLD/NEW) descriptors.
142
+ * Context attributes come first, followed by OLD/NEW attributes with offset indices.
143
+ */
144
+ function composeCombinedDescriptor(contextDescriptor: RowDescriptor, flatRowDescriptor: RowDescriptor): RowDescriptor {
145
+ const combined: RowDescriptor = [];
146
+ const contextLength = Object.keys(contextDescriptor).filter(k => contextDescriptor[parseInt(k)] !== undefined).length;
147
+
148
+ // Copy context descriptor as-is (indices 0..contextLength-1)
149
+ for (const attrIdStr in contextDescriptor) {
150
+ const attrId = parseInt(attrIdStr);
151
+ if (contextDescriptor[attrId] !== undefined) {
152
+ combined[attrId] = contextDescriptor[attrId];
153
+ }
154
+ }
155
+
156
+ // Copy flat descriptor with offset indices (indices contextLength..end)
157
+ for (const attrIdStr in flatRowDescriptor) {
158
+ const attrId = parseInt(attrIdStr);
159
+ if (flatRowDescriptor[attrId] !== undefined) {
160
+ combined[attrId] = flatRowDescriptor[attrId] + contextLength;
161
+ }
162
+ }
163
+
164
+ return combined;
165
+ }
166
+
58
167
  async function checkConstraints(
59
168
  rctx: RuntimeContext,
60
169
  plan: ConstraintCheckNode,
61
170
  tableSchema: TableSchema,
62
171
  row: Row,
63
- constraintMetadata: Array<RowConstraintSchema>,
172
+ constraintMetadata: ConstraintMetadataEntry[],
64
173
  evaluatorFunctions: Array<(ctx: RuntimeContext) => OutputValue>
65
174
  ): Promise<void> {
66
175
  // Check PRIMARY KEY constraints (UNIQUE constraints on PK columns)
@@ -70,7 +179,7 @@ async function checkConstraints(
70
179
  await checkNotNullConstraints(rctx, plan, tableSchema, row);
71
180
 
72
181
  // Check CHECK constraints (both column-level and table-level)
73
- await checkCheckConstraints(rctx, plan, tableSchema, constraintMetadata, evaluatorFunctions);
182
+ await checkCheckConstraints(rctx, plan, tableSchema, row, constraintMetadata, evaluatorFunctions);
74
183
  }
75
184
 
76
185
  async function checkNotNullConstraints(
@@ -82,7 +191,7 @@ async function checkNotNullConstraints(
82
191
  // For INSERT operations, check NOT NULL on NEW values
83
192
  // For UPDATE operations, check NOT NULL on NEW values
84
193
  // DELETE operations don't need NOT NULL checks
85
- if (plan.operation === RowOp.DELETE) {
194
+ if (plan.operation === RowOpFlag.DELETE) {
86
195
  return;
87
196
  }
88
197
 
@@ -122,25 +231,38 @@ async function checkCheckConstraints(
122
231
  rctx: RuntimeContext,
123
232
  plan: ConstraintCheckNode,
124
233
  tableSchema: TableSchema,
125
- constraintMetadata: Array<RowConstraintSchema>,
234
+ row: Row,
235
+ constraintMetadata: ConstraintMetadataEntry[],
126
236
  evaluatorFunctions: Array<(ctx: RuntimeContext) => OutputValue>
127
237
  ): Promise<void> {
128
238
  // Evaluate each CHECK constraint using pre-built evaluators
129
239
  for (let i = 0; i < constraintMetadata.length; i++) {
130
- const constraint = constraintMetadata[i];
131
- const evaluator = evaluatorFunctions[i];
240
+ const metadata = constraintMetadata[i];
241
+ const evaluator = evaluatorFunctions[i] ?? metadata.evaluator;
242
+
243
+ if (metadata.shouldDefer) {
244
+ const activeConnectionId = rctx.activeConnection?.connectionId;
245
+ rctx.db._queueDeferredConstraintRow(
246
+ metadata.baseTable,
247
+ metadata.constraintName,
248
+ row.slice() as Row,
249
+ metadata.flatRowDescriptor,
250
+ evaluator,
251
+ activeConnectionId,
252
+ metadata.contextRow,
253
+ metadata.contextDescriptor
254
+ );
255
+ continue;
256
+ }
132
257
 
133
258
  try {
134
- // Use the evaluator function to get the constraint result
135
- const result = evaluator(rctx) as SqlValue;
259
+ const result = await evaluator(rctx) as SqlValue;
136
260
 
137
261
  // CHECK constraint passes if result is truthy or NULL
138
262
  // It fails only if result is false or 0 (SQLite-style numeric boolean)
139
263
  if (result === false || result === 0) {
140
- // Generate a proper constraint name if none was provided
141
- const constraintName = constraint.name || generateDefaultConstraintName(tableSchema, constraint);
142
264
  throw new QuereusError(
143
- `CHECK constraint failed: ${constraintName}`,
265
+ `CHECK constraint failed: ${metadata.constraintName}`,
144
266
  StatusCode.CONSTRAINT
145
267
  );
146
268
  }
@@ -0,0 +1,82 @@
1
+ import type { CreateAssertionNode } from '../../planner/nodes/create-assertion-node.js';
2
+ import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
3
+ import type { EmissionContext } from '../emission-context.js';
4
+ import { QuereusError } from '../../common/errors.js';
5
+ import { SqlValue, StatusCode } from '../../common/types.js';
6
+ import { createLogger } from '../../common/logger.js';
7
+ import type { IntegrityAssertionSchema, AssertionDependentTable } from '../../schema/assertion.js';
8
+ import { expressionToString } from '../../util/ast-stringify.js';
9
+
10
+ const log = createLogger('runtime:emit:create-assertion');
11
+
12
+ export function emitCreateAssertion(plan: CreateAssertionNode, _ctx: EmissionContext): Instruction {
13
+
14
+ async function run(rctx: RuntimeContext): Promise<SqlValue> {
15
+ // Convert the CHECK expression to SQL text for storage
16
+ // The CHECK expression should be negated to become a violation query:
17
+ // CHECK (condition) becomes "SELECT 1 WHERE NOT (condition)"
18
+ let violationSql: string;
19
+ try {
20
+ const exprSql = expressionToString(plan.checkExpression);
21
+ violationSql = `SELECT 1 WHERE NOT (${exprSql})`;
22
+ } catch (e) {
23
+ log('Failed to stringify assertion expression: %O', e);
24
+ // Fallback for complex expressions
25
+ violationSql = 'SELECT 1 WHERE FALSE'; // Never violates
26
+ }
27
+
28
+ // Create the assertion schema object
29
+ const assertionSchema: IntegrityAssertionSchema = {
30
+ name: plan.name,
31
+ violationSql,
32
+ deferrable: true, // Auto-deferred for multi-table constraints
33
+ initiallyDeferred: true,
34
+ dependentTables: []
35
+ };
36
+
37
+ // Discover dependent base tables (best-effort; conservative if any failure)
38
+ try {
39
+ const planNode = rctx.db.getPlan(violationSql);
40
+ const deps = new Map<string, AssertionDependentTable>();
41
+ (function collect(node: unknown) {
42
+ const anyNode = node as any;
43
+ if (anyNode && typeof anyNode.getRelations === 'function') {
44
+ for (const child of anyNode.getRelations()) collect(child);
45
+ }
46
+ if (anyNode?.tableSchema?.name && anyNode?.id !== undefined) {
47
+ const base = `${anyNode.tableSchema.schemaName}.${anyNode.tableSchema.name}`.toLowerCase();
48
+ const relationKey = `${base}#${anyNode.id}`;
49
+ if (!deps.has(relationKey)) deps.set(relationKey, { relationKey, base });
50
+ }
51
+ })(planNode);
52
+ assertionSchema.dependentTables = Array.from(deps.values());
53
+ log('Assertion %s dependencies discovered: %o', plan.name, assertionSchema.dependentTables);
54
+ } catch (depErr) {
55
+ log('Dependency discovery failed for assertion %s: %O', plan.name, depErr);
56
+ }
57
+
58
+ // Add to schema
59
+ const schemaManager = rctx.db.schemaManager;
60
+ const schema = schemaManager.getMainSchema(); // Store in main schema for now
61
+
62
+ // Check for existing assertion
63
+ const existing = schema.getAssertion(plan.name);
64
+ if (existing) {
65
+ throw new QuereusError(
66
+ `Assertion ${plan.name} already exists`,
67
+ StatusCode.CONSTRAINT
68
+ );
69
+ }
70
+
71
+ schema.addAssertion(assertionSchema);
72
+
73
+ log('Created assertion %s with violationSql: %s', plan.name, violationSql);
74
+ return null;
75
+ }
76
+
77
+ return {
78
+ params: [],
79
+ run: run as InstructionRun,
80
+ note: `createAssertion(${plan.name})`
81
+ };
82
+ }
@@ -2,7 +2,7 @@ import type { Row } from '../../common/types.js';
2
2
  import type { CTEReferenceNode } from '../../planner/nodes/cte-reference-node.js';
3
3
  import type { EmissionContext } from '../emission-context.js';
4
4
  import { emitPlanNode, createValidatedInstruction } from '../emitters.js';
5
- import type { Instruction, RuntimeContext } from '../types.js';
5
+ import type { Instruction, InstructionRun, RuntimeContext } from '../types.js';
6
6
  import { buildRowDescriptor } from '../../util/row-descriptor.js';
7
7
  import { withRowContextGenerator } from '../context-helpers.js';
8
8
  import { createLogger } from '../../common/logger.js';
@@ -31,7 +31,7 @@ export function emitCTEReference(plan: CTEReferenceNode, ctx: EmissionContext):
31
31
 
32
32
  return createValidatedInstruction(
33
33
  [cteInstruction],
34
- run as any,
34
+ run as InstructionRun,
35
35
  ctx,
36
36
  `cte_ref(${plan.source.cteName}${plan.alias ? ` AS ${plan.alias}` : ''})`
37
37
  );
@@ -1,5 +1,5 @@
1
1
  import type { CTENode } from '../../planner/nodes/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 { emitPlanNode } from '../emitters.js';
5
5
  import type { Row } from '../../common/types.js';
@@ -33,7 +33,7 @@ export function emitCTE(plan: CTENode, ctx: EmissionContext): Instruction {
33
33
 
34
34
  return {
35
35
  params: [queryInstruction],
36
- run: run as any,
36
+ run: run as InstructionRun,
37
37
  note: `cte(${plan.cteName})`
38
38
  };
39
39
  }
@@ -1,5 +1,5 @@
1
1
  import type { DistinctNode } from '../../planner/nodes/distinct-node.js';
2
- import type { Instruction, RuntimeContext } from '../types.js';
2
+ import type { Instruction, InstructionRun, RuntimeContext } from '../types.js';
3
3
  import { emitPlanNode } from '../emitters.js';
4
4
  import { type Row } from '../../common/types.js';
5
5
  import type { EmissionContext } from '../emission-context.js';
@@ -34,7 +34,7 @@ export function emitDistinct(plan: DistinctNode, ctx: EmissionContext): Instruct
34
34
 
35
35
  return {
36
36
  params: [sourceInstruction],
37
- run: run as any,
37
+ run: run as InstructionRun,
38
38
  note: 'distinct (btree-optimized)'
39
39
  };
40
40
  }
@@ -2,8 +2,9 @@ import type { DmlExecutorNode } from '../../planner/nodes/dml-executor-node.js';
2
2
  import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
3
3
  import { emitPlanNode } from '../emitters.js';
4
4
  import { QuereusError } from '../../common/errors.js';
5
- import { StatusCode, type Row } from '../../common/types.js';
5
+ import { StatusCode, type Row, type SqlValue } from '../../common/types.js';
6
6
  import { getVTable, disconnectVTable } from '../utils.js';
7
+ import { ConflictResolution } from '../../common/constants.js';
7
8
  import type { EmissionContext } from '../emission-context.js';
8
9
  import { extractOldRowFromFlat, extractNewRowFromFlat } from '../../util/row-descriptor.js';
9
10
 
@@ -21,8 +22,10 @@ export function emitDmlExecutor(plan: DmlExecutorNode, ctx: EmissionContext): In
21
22
  try {
22
23
  for await (const flatRow of rows) {
23
24
  const newRow = extractNewRowFromFlat(flatRow, tableSchema.columns.length);
24
- (newRow as any)._onConflict = plan.onConflict || 'abort';
25
- await vtab.xUpdate!('insert', newRow);
25
+ await vtab.xUpdate!('insert', newRow, undefined, plan.onConflict ?? ConflictResolution.ABORT);
26
+ // Track change (INSERT): record NEW primary key
27
+ const pkValues = tableSchema.primaryKeyDefinition.map(def => newRow[def.index]);
28
+ ctx.db._recordInsert(`${tableSchema.schemaName}.${tableSchema.name}`, pkValues);
26
29
  yield flatRow; // make OLD/NEW available downstream (e.g. RETURNING)
27
30
  }
28
31
  } finally {
@@ -39,13 +42,16 @@ export function emitDmlExecutor(plan: DmlExecutorNode, ctx: EmissionContext): In
39
42
  const newRow = extractNewRowFromFlat(flatRow, tableSchema.columns.length);
40
43
 
41
44
  // Extract primary key values from the OLD row (these identify which row to update)
42
- const keyValues = pkColumnIndicesInSchema.map(pkColIdx => {
45
+ const keyValues: SqlValue[] = pkColumnIndicesInSchema.map(pkColIdx => {
43
46
  if (pkColIdx >= oldRow.length) {
44
47
  throw new QuereusError(`PK column index ${pkColIdx} out of bounds for OLD row length ${oldRow.length} in UPDATE on '${tableSchema.name}'.`, StatusCode.INTERNAL);
45
48
  }
46
49
  return oldRow[pkColIdx];
47
50
  });
48
- await vtab.xUpdate!('update', newRow, keyValues);
51
+ await vtab.xUpdate!('update', newRow, keyValues, ConflictResolution.ABORT);
52
+ // Track change (UPDATE): record OLD and NEW primary keys
53
+ const newKeyValues: SqlValue[] = tableSchema.primaryKeyDefinition.map(pkColDef => newRow[pkColDef.index]);
54
+ ctx.db._recordUpdate(`${tableSchema.schemaName}.${tableSchema.name}`, keyValues, newKeyValues);
49
55
  yield flatRow;
50
56
  }
51
57
  } finally {
@@ -60,13 +66,15 @@ export function emitDmlExecutor(plan: DmlExecutorNode, ctx: EmissionContext): In
60
66
  for await (const flatRow of rows) {
61
67
  const oldRow = extractOldRowFromFlat(flatRow, tableSchema.columns.length);
62
68
 
63
- const keyValues = pkColumnIndicesInSchema.map(pkColIdx => {
69
+ const keyValues: SqlValue[] = pkColumnIndicesInSchema.map(pkColIdx => {
64
70
  if (pkColIdx >= oldRow.length) {
65
71
  throw new QuereusError(`PK column index ${pkColIdx} out of bounds for OLD row length ${oldRow.length} in DELETE on '${tableSchema.name}'.`, StatusCode.INTERNAL);
66
72
  }
67
73
  return oldRow[pkColIdx];
68
74
  });
69
- await vtab.xUpdate!('delete', undefined, keyValues);
75
+ await vtab.xUpdate!('delete', undefined, keyValues, ConflictResolution.ABORT);
76
+ // Track change (DELETE): record OLD primary key
77
+ ctx.db._recordDelete(`${tableSchema.schemaName}.${tableSchema.name}`, keyValues);
70
78
  yield flatRow;
71
79
  }
72
80
  } finally {
@@ -75,11 +83,11 @@ export function emitDmlExecutor(plan: DmlExecutorNode, ctx: EmissionContext): In
75
83
  }
76
84
 
77
85
  // Select the correct generator based on operation
78
- let runFunc: InstructionRun;
86
+ let run: InstructionRun;
79
87
  switch (plan.operation) {
80
- case 'insert': runFunc = runInsert; break;
81
- case 'update': runFunc = runUpdate; break;
82
- case 'delete': runFunc = runDelete; break;
88
+ case 'insert': run = runInsert as InstructionRun; break;
89
+ case 'update': run = runUpdate as InstructionRun; break;
90
+ case 'delete': run = runDelete as InstructionRun; break;
83
91
  default:
84
92
  throw new QuereusError(`Unknown DML operation: ${plan.operation}`, StatusCode.INTERNAL);
85
93
  }
@@ -88,7 +96,7 @@ export function emitDmlExecutor(plan: DmlExecutorNode, ctx: EmissionContext): In
88
96
 
89
97
  return {
90
98
  params: [sourceInstruction],
91
- run: runFunc,
99
+ run,
92
100
  note: `execute${plan.operation}(${plan.table.tableSchema.name})`
93
101
  };
94
102
  }
@@ -0,0 +1,45 @@
1
+ import type { DropAssertionNode } from '../../planner/nodes/drop-assertion-node.js';
2
+ import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
3
+ import type { EmissionContext } from '../emission-context.js';
4
+ import { QuereusError } from '../../common/errors.js';
5
+ import { SqlValue, StatusCode } from '../../common/types.js';
6
+ import { createLogger } from '../../common/logger.js';
7
+
8
+ const log = createLogger('runtime:emit:drop-assertion');
9
+
10
+ export function emitDropAssertion(plan: DropAssertionNode, _ctx: EmissionContext): Instruction {
11
+
12
+ async function run(rctx: RuntimeContext): Promise<SqlValue> {
13
+ const schemaManager = rctx.db.schemaManager;
14
+ const schema = schemaManager.getMainSchema(); // Look in main schema for now
15
+
16
+ const existing = schema.getAssertion(plan.name);
17
+ if (!existing) {
18
+ if (plan.ifExists) {
19
+ log('Assertion %s not found, but IF EXISTS specified', plan.name);
20
+ return null;
21
+ }
22
+ throw new QuereusError(
23
+ `Assertion ${plan.name} not found`,
24
+ StatusCode.NOTFOUND
25
+ );
26
+ }
27
+
28
+ const removed = schema.removeAssertion(plan.name);
29
+ if (!removed && !plan.ifExists) {
30
+ throw new QuereusError(
31
+ `Failed to remove assertion ${plan.name}`,
32
+ StatusCode.INTERNAL
33
+ );
34
+ }
35
+
36
+ log('Dropped assertion %s', plan.name);
37
+ return null;
38
+ }
39
+
40
+ return {
41
+ params: [],
42
+ run: run as InstructionRun,
43
+ note: `dropAssertion(${plan.name})`
44
+ };
45
+ }
@@ -1,7 +1,7 @@
1
1
  import type { FilterNode } from '../../planner/nodes/filter.js';
2
- import type { Instruction, RuntimeContext } from '../types.js';
2
+ import type { Instruction, InstructionRun, RuntimeContext } from '../types.js';
3
3
  import { emitPlanNode, emitCallFromPlan } from '../emitters.js';
4
- import { type Row } from '../../common/types.js';
4
+ import { OutputValue, type Row } from '../../common/types.js';
5
5
  import type { EmissionContext } from '../emission-context.js';
6
6
  import { buildRowDescriptor } from '../../util/row-descriptor.js';
7
7
  import { withRowContextGenerator } from '../context-helpers.js';
@@ -13,7 +13,7 @@ export function emitFilter(plan: FilterNode, ctx: EmissionContext): Instruction
13
13
  // Create row descriptor for source attributes
14
14
  const sourceRowDescriptor = buildRowDescriptor(plan.source.getAttributes());
15
15
 
16
- async function* run(ctx: RuntimeContext, source: AsyncIterable<Row>, predicate: (ctx: RuntimeContext) => any): AsyncIterable<Row> {
16
+ async function* run(ctx: RuntimeContext, source: AsyncIterable<Row>, predicate: (ctx: RuntimeContext) => OutputValue): AsyncIterable<Row> {
17
17
  yield* withRowContextGenerator(ctx, sourceRowDescriptor, source, async function* (sourceRow) {
18
18
  const result = await predicate(ctx);
19
19
  if (result) {
@@ -24,7 +24,7 @@ export function emitFilter(plan: FilterNode, ctx: EmissionContext): Instruction
24
24
 
25
25
  return {
26
26
  params: [sourceInstruction, predicateFunc],
27
- run: run as any,
27
+ run: run as InstructionRun,
28
28
  note: `filter(${plan.predicate.toString()})`
29
29
  };
30
30
  }
@@ -1,12 +1,13 @@
1
1
  import type { JoinNode } from '../../planner/nodes/join-node.js';
2
- import type { Instruction, RuntimeContext } from '../types.js';
2
+ import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
3
3
  import { emitCallFromPlan, emitPlanNode } from '../emitters.js';
4
- import type { Row } from '../../common/types.js';
4
+ import type { Row, OutputValue } from '../../common/types.js';
5
5
  import type { EmissionContext } from '../emission-context.js';
6
6
  import { createLogger } from '../../common/logger.js';
7
7
  import { compareSqlValues } from '../../util/comparison.js';
8
8
  import { buildRowDescriptor } from '../../util/row-descriptor.js';
9
9
  import { createRowSlot } from '../context-helpers.js';
10
+ import type { Attribute } from '../../planner/nodes/plan-node.js';
10
11
 
11
12
  const log = createLogger('runtime:emit:join');
12
13
 
@@ -23,7 +24,7 @@ export function emitLoopJoin(plan: JoinNode, ctx: EmissionContext): Instruction
23
24
  const rightRowDescriptor = buildRowDescriptor(rightAttributes);
24
25
 
25
26
  // NOTE: rightSource must be re-startable (optimizer facilitates through cache node)
26
- async function* run(rctx: RuntimeContext, leftSource: AsyncIterable<Row>, rightCallback: (ctx: RuntimeContext) => AsyncIterable<Row>, conditionCallback?: (ctx: RuntimeContext) => any): AsyncIterable<Row> {
27
+ async function* run(rctx: RuntimeContext, leftSource: AsyncIterable<Row>, rightCallback: (ctx: RuntimeContext) => AsyncIterable<Row>, conditionCallback?: (ctx: RuntimeContext) => OutputValue): AsyncIterable<Row> {
27
28
  const joinType = plan.joinType;
28
29
 
29
30
  log('Starting %s join between %d left attrs and %d right attrs',
@@ -106,7 +107,7 @@ export function emitLoopJoin(plan: JoinNode, ctx: EmissionContext): Instruction
106
107
 
107
108
  return {
108
109
  params,
109
- run: run as any,
110
+ run: run as InstructionRun,
110
111
  note: `${plan.joinType} join (nested loop)`
111
112
  };
112
113
  }
@@ -117,9 +118,9 @@ export function emitLoopJoin(plan: JoinNode, ctx: EmissionContext): Instruction
117
118
  function evaluateUsingCondition(
118
119
  leftRow: Row,
119
120
  rightRow: Row,
120
- usingColumns: string[],
121
- leftAttributes: any[],
122
- rightAttributes: any[]
121
+ usingColumns: readonly string[],
122
+ leftAttributes: readonly Attribute[],
123
+ rightAttributes: readonly Attribute[]
123
124
  ): boolean {
124
125
  for (const columnName of usingColumns) {
125
126
  const leftColName = columnName.toLowerCase();
@@ -1,5 +1,5 @@
1
1
  import type { LimitOffsetNode } from '../../planner/nodes/limit-offset.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, MaybePromise } from '../../common/types.js';
5
5
  import type { EmissionContext } from '../emission-context.js';
@@ -67,7 +67,7 @@ export function emitLimitOffset(plan: LimitOffsetNode, ctx: EmissionContext): In
67
67
 
68
68
  return {
69
69
  params,
70
- run: run as any,
70
+ run: run as InstructionRun,
71
71
  note: `limit_offset(${plan.limit ? 'LIMIT' : ''}${plan.limit && plan.offset ? ',' : ''}${plan.offset ? 'OFFSET' : ''})`
72
72
  };
73
73
  }
@@ -1,7 +1,7 @@
1
1
  import type { EmissionContext } from '../emission-context.js';
2
2
  import type { PragmaPlanNode } from '../../planner/nodes/pragma.js';
3
3
  import type { Instruction, RuntimeContext, InstructionRun } from '../types.js';
4
- import type { Row } from '../../common/types.js';
4
+ import type { Row, SqlValue } from '../../common/types.js';
5
5
  import { createLogger } from '../../common/logger.js';
6
6
  import { QuereusError } from '../../common/errors.js';
7
7
  import { StatusCode } from '../../common/types.js';
@@ -32,7 +32,7 @@ export function emitPragma(plan: PragmaPlanNode, _ctx: EmissionContext): Instruc
32
32
  log(`PRAGMA ${pragmaName} (reading)`);
33
33
 
34
34
  try {
35
- const currentValue = rctx.db.getOption(pragmaName);
35
+ const currentValue = rctx.db.getOption(pragmaName) as SqlValue;
36
36
  log(`Read option ${pragmaName} = ${currentValue}`);
37
37
  // Return as a single-row result with the pragma name as column
38
38
  yield [pragmaName, currentValue];
@@ -1,5 +1,5 @@
1
1
  import type { ProjectNode } from '../../planner/nodes/project-node.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 Row } from '../../common/types.js';
5
5
  import { type OutputValue } from '../../common/types.js';
@@ -40,7 +40,7 @@ export function emitProject(plan: ProjectNode, ctx: EmissionContext): Instructio
40
40
 
41
41
  return {
42
42
  params: [sourceInstruction, ...projectionFuncs],
43
- run: run as any,
43
+ run: run as InstructionRun,
44
44
  note: `project(${plan.projections.length} cols)`
45
45
  };
46
46
  }