@quereus/quereus 0.2.1 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (760) hide show
  1. package/README.md +12 -1
  2. package/dist/src/common/errors.js.map +1 -1
  3. package/dist/src/common/json-types.d.ts +11 -0
  4. package/dist/src/common/json-types.d.ts.map +1 -0
  5. package/dist/src/common/json-types.js +3 -0
  6. package/dist/src/common/json-types.js.map +1 -0
  7. package/dist/src/common/types.d.ts +1 -0
  8. package/dist/src/common/types.d.ts.map +1 -1
  9. package/dist/src/core/database-options.d.ts +2 -2
  10. package/dist/src/core/database-options.d.ts.map +1 -1
  11. package/dist/src/core/database-options.js.map +1 -1
  12. package/dist/src/core/database.d.ts +61 -14
  13. package/dist/src/core/database.d.ts.map +1 -1
  14. package/dist/src/core/database.js +481 -54
  15. package/dist/src/core/database.js.map +1 -1
  16. package/dist/src/core/statement.d.ts.map +1 -1
  17. package/dist/src/core/statement.js +3 -1
  18. package/dist/src/core/statement.js.map +1 -1
  19. package/dist/src/func/builtins/builtin-window-functions.d.ts.map +1 -1
  20. package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
  21. package/dist/src/func/builtins/datetime.d.ts +2 -0
  22. package/dist/src/func/builtins/datetime.d.ts.map +1 -1
  23. package/dist/src/func/builtins/datetime.js +39 -0
  24. package/dist/src/func/builtins/datetime.js.map +1 -1
  25. package/dist/src/func/builtins/explain.d.ts +1 -0
  26. package/dist/src/func/builtins/explain.d.ts.map +1 -1
  27. package/dist/src/func/builtins/explain.js +159 -36
  28. package/dist/src/func/builtins/explain.js.map +1 -1
  29. package/dist/src/func/builtins/index.d.ts.map +1 -1
  30. package/dist/src/func/builtins/index.js +5 -2
  31. package/dist/src/func/builtins/index.js.map +1 -1
  32. package/dist/src/func/builtins/json-helpers.d.ts +8 -8
  33. package/dist/src/func/builtins/json-helpers.d.ts.map +1 -1
  34. package/dist/src/func/builtins/json-helpers.js +3 -3
  35. package/dist/src/func/builtins/json-helpers.js.map +1 -1
  36. package/dist/src/func/builtins/json-tvf.d.ts.map +1 -1
  37. package/dist/src/func/builtins/json-tvf.js +1 -1
  38. package/dist/src/func/builtins/json-tvf.js.map +1 -1
  39. package/dist/src/func/builtins/json.d.ts.map +1 -1
  40. package/dist/src/func/builtins/json.js +3 -2
  41. package/dist/src/func/builtins/json.js.map +1 -1
  42. package/dist/src/func/builtins/schema.d.ts.map +1 -1
  43. package/dist/src/func/builtins/schema.js +22 -1
  44. package/dist/src/func/builtins/schema.js.map +1 -1
  45. package/dist/src/func/context.d.ts.map +1 -1
  46. package/dist/src/func/context.js +5 -0
  47. package/dist/src/func/context.js.map +1 -1
  48. package/dist/src/func/registration.d.ts +2 -1
  49. package/dist/src/func/registration.d.ts.map +1 -1
  50. package/dist/src/func/registration.js.map +1 -1
  51. package/dist/src/index.d.ts +2 -2
  52. package/dist/src/index.d.ts.map +1 -1
  53. package/dist/src/index.js +2 -2
  54. package/dist/src/index.js.map +1 -1
  55. package/dist/src/parser/ast.d.ts +83 -4
  56. package/dist/src/parser/ast.d.ts.map +1 -1
  57. package/dist/src/parser/lexer.d.ts +11 -0
  58. package/dist/src/parser/lexer.d.ts.map +1 -1
  59. package/dist/src/parser/lexer.js +29 -21
  60. package/dist/src/parser/lexer.js.map +1 -1
  61. package/dist/src/parser/parser.d.ts +16 -0
  62. package/dist/src/parser/parser.d.ts.map +1 -1
  63. package/dist/src/parser/parser.js +542 -26
  64. package/dist/src/parser/parser.js.map +1 -1
  65. package/dist/src/parser/visitor.d.ts.map +1 -1
  66. package/dist/src/parser/visitor.js +1 -0
  67. package/dist/src/parser/visitor.js.map +1 -1
  68. package/dist/src/planner/analysis/binding-collector.d.ts +5 -0
  69. package/dist/src/planner/analysis/binding-collector.d.ts.map +1 -0
  70. package/dist/src/planner/analysis/binding-collector.js +73 -0
  71. package/dist/src/planner/analysis/binding-collector.js.map +1 -0
  72. package/dist/src/planner/analysis/const-evaluator.js +1 -1
  73. package/dist/src/planner/analysis/const-evaluator.js.map +1 -1
  74. package/dist/src/planner/analysis/const-pass.d.ts.map +1 -1
  75. package/dist/src/planner/analysis/const-pass.js +1 -1
  76. package/dist/src/planner/analysis/const-pass.js.map +1 -1
  77. package/dist/src/planner/analysis/constraint-extractor.d.ts +67 -31
  78. package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
  79. package/dist/src/planner/analysis/constraint-extractor.js +513 -84
  80. package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
  81. package/dist/src/planner/analysis/predicate-normalizer.d.ts +17 -0
  82. package/dist/src/planner/analysis/predicate-normalizer.d.ts.map +1 -0
  83. package/dist/src/planner/analysis/predicate-normalizer.js +222 -0
  84. package/dist/src/planner/analysis/predicate-normalizer.js.map +1 -0
  85. package/dist/src/planner/building/alter-table.d.ts.map +1 -1
  86. package/dist/src/planner/building/alter-table.js +5 -2
  87. package/dist/src/planner/building/alter-table.js.map +1 -1
  88. package/dist/src/planner/building/block.d.ts.map +1 -1
  89. package/dist/src/planner/building/block.js +16 -0
  90. package/dist/src/planner/building/block.js.map +1 -1
  91. package/dist/src/planner/building/constraint-builder.d.ts +1 -1
  92. package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
  93. package/dist/src/planner/building/constraint-builder.js +52 -3
  94. package/dist/src/planner/building/constraint-builder.js.map +1 -1
  95. package/dist/src/planner/building/create-assertion.d.ts +5 -0
  96. package/dist/src/planner/building/create-assertion.d.ts.map +1 -0
  97. package/dist/src/planner/building/create-assertion.js +5 -0
  98. package/dist/src/planner/building/create-assertion.js.map +1 -0
  99. package/dist/src/planner/building/declare-schema.d.ts +8 -0
  100. package/dist/src/planner/building/declare-schema.d.ts.map +1 -0
  101. package/dist/src/planner/building/declare-schema.js +14 -0
  102. package/dist/src/planner/building/declare-schema.js.map +1 -0
  103. package/dist/src/planner/building/delete.d.ts.map +1 -1
  104. package/dist/src/planner/building/delete.js +37 -5
  105. package/dist/src/planner/building/delete.js.map +1 -1
  106. package/dist/src/planner/building/drop-assertion.d.ts +5 -0
  107. package/dist/src/planner/building/drop-assertion.d.ts.map +1 -0
  108. package/dist/src/planner/building/drop-assertion.js +8 -0
  109. package/dist/src/planner/building/drop-assertion.js.map +1 -0
  110. package/dist/src/planner/building/expression.d.ts.map +1 -1
  111. package/dist/src/planner/building/expression.js +1 -0
  112. package/dist/src/planner/building/expression.js.map +1 -1
  113. package/dist/src/planner/building/function-call.d.ts.map +1 -1
  114. package/dist/src/planner/building/function-call.js +2 -1
  115. package/dist/src/planner/building/function-call.js.map +1 -1
  116. package/dist/src/planner/building/insert.d.ts.map +1 -1
  117. package/dist/src/planner/building/insert.js +67 -10
  118. package/dist/src/planner/building/insert.js.map +1 -1
  119. package/dist/src/planner/building/pragma.d.ts.map +1 -1
  120. package/dist/src/planner/building/pragma.js +1 -0
  121. package/dist/src/planner/building/pragma.js.map +1 -1
  122. package/dist/src/planner/building/schema-resolution.d.ts +2 -2
  123. package/dist/src/planner/building/schema-resolution.d.ts.map +1 -1
  124. package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
  125. package/dist/src/planner/building/select-aggregates.js +3 -2
  126. package/dist/src/planner/building/select-aggregates.js.map +1 -1
  127. package/dist/src/planner/building/select-compound.d.ts +2 -2
  128. package/dist/src/planner/building/select-compound.d.ts.map +1 -1
  129. package/dist/src/planner/building/select-compound.js +10 -1
  130. package/dist/src/planner/building/select-compound.js.map +1 -1
  131. package/dist/src/planner/building/select-context.d.ts +3 -3
  132. package/dist/src/planner/building/select-context.d.ts.map +1 -1
  133. package/dist/src/planner/building/select-context.js.map +1 -1
  134. package/dist/src/planner/building/select-modifiers.d.ts +6 -5
  135. package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
  136. package/dist/src/planner/building/select-modifiers.js +5 -4
  137. package/dist/src/planner/building/select-modifiers.js.map +1 -1
  138. package/dist/src/planner/building/select-projections.d.ts.map +1 -1
  139. package/dist/src/planner/building/select-projections.js +4 -5
  140. package/dist/src/planner/building/select-projections.js.map +1 -1
  141. package/dist/src/planner/building/select-window.d.ts.map +1 -1
  142. package/dist/src/planner/building/select-window.js +6 -3
  143. package/dist/src/planner/building/select-window.js.map +1 -1
  144. package/dist/src/planner/building/select.d.ts +3 -3
  145. package/dist/src/planner/building/select.d.ts.map +1 -1
  146. package/dist/src/planner/building/select.js +18 -8
  147. package/dist/src/planner/building/select.js.map +1 -1
  148. package/dist/src/planner/building/table-function.d.ts.map +1 -1
  149. package/dist/src/planner/building/table-function.js +1 -1
  150. package/dist/src/planner/building/table-function.js.map +1 -1
  151. package/dist/src/planner/building/table.d.ts +5 -3
  152. package/dist/src/planner/building/table.d.ts.map +1 -1
  153. package/dist/src/planner/building/table.js +7 -2
  154. package/dist/src/planner/building/table.js.map +1 -1
  155. package/dist/src/planner/building/update.d.ts.map +1 -1
  156. package/dist/src/planner/building/update.js +38 -6
  157. package/dist/src/planner/building/update.js.map +1 -1
  158. package/dist/src/planner/building/with.d.ts +3 -3
  159. package/dist/src/planner/building/with.d.ts.map +1 -1
  160. package/dist/src/planner/building/with.js.map +1 -1
  161. package/dist/src/planner/debug.d.ts.map +1 -1
  162. package/dist/src/planner/debug.js.map +1 -1
  163. package/dist/src/planner/framework/characteristics.d.ts +235 -0
  164. package/dist/src/planner/framework/characteristics.d.ts.map +1 -0
  165. package/dist/src/planner/framework/characteristics.js +299 -0
  166. package/dist/src/planner/framework/characteristics.js.map +1 -0
  167. package/dist/src/planner/framework/context.d.ts +16 -5
  168. package/dist/src/planner/framework/context.d.ts.map +1 -1
  169. package/dist/src/planner/framework/context.js +2 -0
  170. package/dist/src/planner/framework/context.js.map +1 -1
  171. package/dist/src/planner/framework/pass.d.ts +116 -0
  172. package/dist/src/planner/framework/pass.d.ts.map +1 -0
  173. package/dist/src/planner/framework/pass.js +236 -0
  174. package/dist/src/planner/framework/pass.js.map +1 -0
  175. package/dist/src/planner/nodes/aggregate-node.d.ts +16 -6
  176. package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
  177. package/dist/src/planner/nodes/aggregate-node.js +40 -4
  178. package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
  179. package/dist/src/planner/nodes/array-index-node.js.map +1 -1
  180. package/dist/src/planner/nodes/cache-node.d.ts +5 -2
  181. package/dist/src/planner/nodes/cache-node.d.ts.map +1 -1
  182. package/dist/src/planner/nodes/cache-node.js +6 -0
  183. package/dist/src/planner/nodes/cache-node.js.map +1 -1
  184. package/dist/src/planner/nodes/constraint-check-node.d.ts +10 -2
  185. package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
  186. package/dist/src/planner/nodes/constraint-check-node.js +12 -4
  187. package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
  188. package/dist/src/planner/nodes/create-assertion-node.d.ts +22 -0
  189. package/dist/src/planner/nodes/create-assertion-node.d.ts.map +1 -0
  190. package/dist/src/planner/nodes/create-assertion-node.js +41 -0
  191. package/dist/src/planner/nodes/create-assertion-node.js.map +1 -0
  192. package/dist/src/planner/nodes/create-index-node.js +2 -2
  193. package/dist/src/planner/nodes/create-index-node.js.map +1 -1
  194. package/dist/src/planner/nodes/create-table-node.js +2 -2
  195. package/dist/src/planner/nodes/create-table-node.js.map +1 -1
  196. package/dist/src/planner/nodes/cte-node.d.ts +17 -2
  197. package/dist/src/planner/nodes/cte-node.d.ts.map +1 -1
  198. package/dist/src/planner/nodes/cte-node.js +9 -1
  199. package/dist/src/planner/nodes/cte-node.js.map +1 -1
  200. package/dist/src/planner/nodes/cte-reference-node.js +1 -1
  201. package/dist/src/planner/nodes/cte-reference-node.js.map +1 -1
  202. package/dist/src/planner/nodes/declarative-schema.d.ts +62 -0
  203. package/dist/src/planner/nodes/declarative-schema.d.ts.map +1 -0
  204. package/dist/src/planner/nodes/declarative-schema.js +181 -0
  205. package/dist/src/planner/nodes/declarative-schema.js.map +1 -0
  206. package/dist/src/planner/nodes/delete-node.d.ts +8 -3
  207. package/dist/src/planner/nodes/delete-node.d.ts.map +1 -1
  208. package/dist/src/planner/nodes/delete-node.js +10 -2
  209. package/dist/src/planner/nodes/delete-node.js.map +1 -1
  210. package/dist/src/planner/nodes/distinct-node.d.ts +3 -2
  211. package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
  212. package/dist/src/planner/nodes/distinct-node.js +17 -4
  213. package/dist/src/planner/nodes/distinct-node.js.map +1 -1
  214. package/dist/src/planner/nodes/dml-executor-node.d.ts +1 -1
  215. package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
  216. package/dist/src/planner/nodes/drop-assertion-node.d.ts +21 -0
  217. package/dist/src/planner/nodes/drop-assertion-node.d.ts.map +1 -0
  218. package/dist/src/planner/nodes/drop-assertion-node.js +41 -0
  219. package/dist/src/planner/nodes/drop-assertion-node.js.map +1 -0
  220. package/dist/src/planner/nodes/drop-table-node.d.ts.map +1 -1
  221. package/dist/src/planner/nodes/drop-table-node.js +1 -0
  222. package/dist/src/planner/nodes/drop-table-node.js.map +1 -1
  223. package/dist/src/planner/nodes/filter.d.ts +8 -3
  224. package/dist/src/planner/nodes/filter.d.ts.map +1 -1
  225. package/dist/src/planner/nodes/filter.js +44 -0
  226. package/dist/src/planner/nodes/filter.js.map +1 -1
  227. package/dist/src/planner/nodes/insert-node.d.ts +9 -3
  228. package/dist/src/planner/nodes/insert-node.d.ts.map +1 -1
  229. package/dist/src/planner/nodes/insert-node.js +11 -2
  230. package/dist/src/planner/nodes/insert-node.js.map +1 -1
  231. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts +3 -4
  232. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.d.ts.map +1 -1
  233. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js +1 -16
  234. package/dist/src/planner/nodes/internal-recursive-cte-ref-node.js.map +1 -1
  235. package/dist/src/planner/nodes/join-node.d.ts +12 -3
  236. package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
  237. package/dist/src/planner/nodes/join-node.js +111 -2
  238. package/dist/src/planner/nodes/join-node.js.map +1 -1
  239. package/dist/src/planner/nodes/limit-offset.d.ts +7 -3
  240. package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
  241. package/dist/src/planner/nodes/limit-offset.js +15 -0
  242. package/dist/src/planner/nodes/limit-offset.js.map +1 -1
  243. package/dist/src/planner/nodes/plan-node-type.d.ts +8 -0
  244. package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
  245. package/dist/src/planner/nodes/plan-node-type.js +8 -0
  246. package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
  247. package/dist/src/planner/nodes/plan-node.d.ts +9 -9
  248. package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
  249. package/dist/src/planner/nodes/plan-node.js +3 -3
  250. package/dist/src/planner/nodes/plan-node.js.map +1 -1
  251. package/dist/src/planner/nodes/pragma.d.ts +2 -1
  252. package/dist/src/planner/nodes/pragma.d.ts.map +1 -1
  253. package/dist/src/planner/nodes/pragma.js +3 -1
  254. package/dist/src/planner/nodes/pragma.js.map +1 -1
  255. package/dist/src/planner/nodes/project-node.d.ts +16 -3
  256. package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
  257. package/dist/src/planner/nodes/project-node.js +82 -2
  258. package/dist/src/planner/nodes/project-node.js.map +1 -1
  259. package/dist/src/planner/nodes/recursive-cte-node.d.ts +2 -2
  260. package/dist/src/planner/nodes/recursive-cte-node.d.ts.map +1 -1
  261. package/dist/src/planner/nodes/recursive-cte-node.js +1 -1
  262. package/dist/src/planner/nodes/recursive-cte-node.js.map +1 -1
  263. package/dist/src/planner/nodes/reference.d.ts +13 -4
  264. package/dist/src/planner/nodes/reference.d.ts.map +1 -1
  265. package/dist/src/planner/nodes/reference.js +16 -0
  266. package/dist/src/planner/nodes/reference.js.map +1 -1
  267. package/dist/src/planner/nodes/remote-query-node.d.ts +37 -0
  268. package/dist/src/planner/nodes/remote-query-node.d.ts.map +1 -0
  269. package/dist/src/planner/nodes/remote-query-node.js +63 -0
  270. package/dist/src/planner/nodes/remote-query-node.js.map +1 -0
  271. package/dist/src/planner/nodes/retrieve-node.d.ts +46 -0
  272. package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -0
  273. package/dist/src/planner/nodes/retrieve-node.js +77 -0
  274. package/dist/src/planner/nodes/retrieve-node.js.map +1 -0
  275. package/dist/src/planner/nodes/returning-node.d.ts +4 -3
  276. package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
  277. package/dist/src/planner/nodes/returning-node.js +44 -3
  278. package/dist/src/planner/nodes/returning-node.js.map +1 -1
  279. package/dist/src/planner/nodes/sequencing-node.d.ts +1 -1
  280. package/dist/src/planner/nodes/sequencing-node.d.ts.map +1 -1
  281. package/dist/src/planner/nodes/sequencing-node.js.map +1 -1
  282. package/dist/src/planner/nodes/set-operation-node.d.ts +1 -1
  283. package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
  284. package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
  285. package/dist/src/planner/nodes/sort.d.ts +11 -2
  286. package/dist/src/planner/nodes/sort.d.ts.map +1 -1
  287. package/dist/src/planner/nodes/sort.js +23 -2
  288. package/dist/src/planner/nodes/sort.js.map +1 -1
  289. package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
  290. package/dist/src/planner/nodes/stream-aggregate.js +4 -1
  291. package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
  292. package/dist/src/planner/nodes/table-access-nodes.d.ts +7 -1
  293. package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
  294. package/dist/src/planner/nodes/table-access-nodes.js +22 -4
  295. package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
  296. package/dist/src/planner/nodes/table-function-call.d.ts +2 -1
  297. package/dist/src/planner/nodes/table-function-call.d.ts.map +1 -1
  298. package/dist/src/planner/nodes/table-function-call.js +12 -5
  299. package/dist/src/planner/nodes/table-function-call.js.map +1 -1
  300. package/dist/src/planner/nodes/transaction-node.js +2 -2
  301. package/dist/src/planner/nodes/transaction-node.js.map +1 -1
  302. package/dist/src/planner/nodes/update-node.d.ts +7 -1
  303. package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
  304. package/dist/src/planner/nodes/update-node.js +11 -2
  305. package/dist/src/planner/nodes/update-node.js.map +1 -1
  306. package/dist/src/planner/nodes/view-reference-node.js.map +1 -1
  307. package/dist/src/planner/nodes/window-function.js.map +1 -1
  308. package/dist/src/planner/nodes/window-node.js.map +1 -1
  309. package/dist/src/planner/optimizer-tuning.d.ts +11 -0
  310. package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
  311. package/dist/src/planner/optimizer-tuning.js +6 -0
  312. package/dist/src/planner/optimizer-tuning.js.map +1 -1
  313. package/dist/src/planner/optimizer.d.ts +17 -3
  314. package/dist/src/planner/optimizer.d.ts.map +1 -1
  315. package/dist/src/planner/optimizer.js +159 -67
  316. package/dist/src/planner/optimizer.js.map +1 -1
  317. package/dist/src/planner/planning-context.d.ts +5 -3
  318. package/dist/src/planner/planning-context.d.ts.map +1 -1
  319. package/dist/src/planner/planning-context.js +2 -0
  320. package/dist/src/planner/planning-context.js.map +1 -1
  321. package/dist/src/planner/resolve.d.ts +3 -2
  322. package/dist/src/planner/resolve.d.ts.map +1 -1
  323. package/dist/src/planner/resolve.js +6 -5
  324. package/dist/src/planner/resolve.js.map +1 -1
  325. package/dist/src/planner/rules/access/rule-select-access-path.d.ts +8 -3
  326. package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
  327. package/dist/src/planner/rules/access/rule-select-access-path.js +206 -47
  328. package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
  329. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts +10 -3
  330. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts.map +1 -1
  331. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js +95 -87
  332. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
  333. package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts +8 -2
  334. package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts.map +1 -1
  335. package/dist/src/planner/rules/cache/rule-cte-optimization.js +24 -13
  336. package/dist/src/planner/rules/cache/rule-cte-optimization.js.map +1 -1
  337. package/dist/src/planner/rules/cache/rule-materialization-advisory.d.ts +9 -2
  338. package/dist/src/planner/rules/cache/rule-materialization-advisory.d.ts.map +1 -1
  339. package/dist/src/planner/rules/cache/rule-materialization-advisory.js +14 -7
  340. package/dist/src/planner/rules/cache/rule-materialization-advisory.js.map +1 -1
  341. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.d.ts +9 -3
  342. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.d.ts.map +1 -1
  343. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js +34 -37
  344. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js.map +1 -1
  345. package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts +14 -0
  346. package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -0
  347. package/dist/src/planner/rules/join/rule-join-greedy-commute.js +33 -0
  348. package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -0
  349. package/dist/src/planner/rules/join/rule-join-key-inference.d.ts +11 -0
  350. package/dist/src/planner/rules/join/rule-join-key-inference.d.ts.map +1 -0
  351. package/dist/src/planner/rules/join/rule-join-key-inference.js +32 -0
  352. package/dist/src/planner/rules/join/rule-join-key-inference.js.map +1 -0
  353. package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts +4 -0
  354. package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts.map +1 -0
  355. package/dist/src/planner/rules/join/rule-quickpick-enumeration.js +233 -0
  356. package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +1 -0
  357. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts +21 -0
  358. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts.map +1 -0
  359. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +125 -0
  360. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -0
  361. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts +21 -0
  362. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -0
  363. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +261 -0
  364. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -0
  365. package/dist/src/planner/scopes/registered.d.ts +1 -0
  366. package/dist/src/planner/scopes/registered.d.ts.map +1 -1
  367. package/dist/src/planner/scopes/registered.js +7 -0
  368. package/dist/src/planner/scopes/registered.js.map +1 -1
  369. package/dist/src/planner/stats/index.d.ts +0 -17
  370. package/dist/src/planner/stats/index.d.ts.map +1 -1
  371. package/dist/src/planner/stats/index.js +0 -58
  372. package/dist/src/planner/stats/index.js.map +1 -1
  373. package/dist/src/planner/util/deferred-constraint.d.ts +14 -0
  374. package/dist/src/planner/util/deferred-constraint.d.ts.map +1 -0
  375. package/dist/src/planner/util/deferred-constraint.js +85 -0
  376. package/dist/src/planner/util/deferred-constraint.js.map +1 -0
  377. package/dist/src/planner/util/key-utils.d.ts +15 -0
  378. package/dist/src/planner/util/key-utils.d.ts.map +1 -0
  379. package/dist/src/planner/util/key-utils.js +43 -0
  380. package/dist/src/planner/util/key-utils.js.map +1 -0
  381. package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
  382. package/dist/src/planner/validation/plan-validator.js +1 -0
  383. package/dist/src/planner/validation/plan-validator.js.map +1 -1
  384. package/dist/src/runtime/deferred-constraint-queue.d.ts +33 -0
  385. package/dist/src/runtime/deferred-constraint-queue.d.ts.map +1 -0
  386. package/dist/src/runtime/deferred-constraint-queue.js +172 -0
  387. package/dist/src/runtime/deferred-constraint-queue.js.map +1 -0
  388. package/dist/src/runtime/emission-context.d.ts +9 -3
  389. package/dist/src/runtime/emission-context.d.ts.map +1 -1
  390. package/dist/src/runtime/emission-context.js +5 -1
  391. package/dist/src/runtime/emission-context.js.map +1 -1
  392. package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
  393. package/dist/src/runtime/emit/add-constraint.js +22 -4
  394. package/dist/src/runtime/emit/add-constraint.js.map +1 -1
  395. package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
  396. package/dist/src/runtime/emit/aggregate.js +3 -2
  397. package/dist/src/runtime/emit/aggregate.js.map +1 -1
  398. package/dist/src/runtime/emit/array-index.js.map +1 -1
  399. package/dist/src/runtime/emit/binary.d.ts.map +1 -1
  400. package/dist/src/runtime/emit/binary.js +9 -2
  401. package/dist/src/runtime/emit/binary.js.map +1 -1
  402. package/dist/src/runtime/emit/cache.d.ts.map +1 -1
  403. package/dist/src/runtime/emit/cache.js +1 -1
  404. package/dist/src/runtime/emit/cache.js.map +1 -1
  405. package/dist/src/runtime/emit/cast.d.ts.map +1 -1
  406. package/dist/src/runtime/emit/cast.js.map +1 -1
  407. package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
  408. package/dist/src/runtime/emit/constraint-check.js +110 -23
  409. package/dist/src/runtime/emit/constraint-check.js.map +1 -1
  410. package/dist/src/runtime/emit/create-assertion.d.ts +5 -0
  411. package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -0
  412. package/dist/src/runtime/emit/create-assertion.js +70 -0
  413. package/dist/src/runtime/emit/create-assertion.js.map +1 -0
  414. package/dist/src/runtime/emit/cte-reference.d.ts.map +1 -1
  415. package/dist/src/runtime/emit/cte-reference.js.map +1 -1
  416. package/dist/src/runtime/emit/cte.d.ts.map +1 -1
  417. package/dist/src/runtime/emit/cte.js.map +1 -1
  418. package/dist/src/runtime/emit/distinct.d.ts.map +1 -1
  419. package/dist/src/runtime/emit/distinct.js.map +1 -1
  420. package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
  421. package/dist/src/runtime/emit/dml-executor.js +17 -9
  422. package/dist/src/runtime/emit/dml-executor.js.map +1 -1
  423. package/dist/src/runtime/emit/drop-assertion.d.ts +5 -0
  424. package/dist/src/runtime/emit/drop-assertion.d.ts.map +1 -0
  425. package/dist/src/runtime/emit/drop-assertion.js +30 -0
  426. package/dist/src/runtime/emit/drop-assertion.js.map +1 -0
  427. package/dist/src/runtime/emit/filter.d.ts.map +1 -1
  428. package/dist/src/runtime/emit/filter.js.map +1 -1
  429. package/dist/src/runtime/emit/join.d.ts.map +1 -1
  430. package/dist/src/runtime/emit/join.js.map +1 -1
  431. package/dist/src/runtime/emit/limit-offset.d.ts.map +1 -1
  432. package/dist/src/runtime/emit/limit-offset.js.map +1 -1
  433. package/dist/src/runtime/emit/pragma.js.map +1 -1
  434. package/dist/src/runtime/emit/project.d.ts.map +1 -1
  435. package/dist/src/runtime/emit/project.js.map +1 -1
  436. package/dist/src/runtime/emit/recursive-cte.d.ts.map +1 -1
  437. package/dist/src/runtime/emit/recursive-cte.js +1 -1
  438. package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
  439. package/dist/src/runtime/emit/remote-query.d.ts +9 -0
  440. package/dist/src/runtime/emit/remote-query.d.ts.map +1 -0
  441. package/dist/src/runtime/emit/remote-query.js +30 -0
  442. package/dist/src/runtime/emit/remote-query.js.map +1 -0
  443. package/dist/src/runtime/emit/retrieve.d.ts +5 -0
  444. package/dist/src/runtime/emit/retrieve.d.ts.map +1 -0
  445. package/dist/src/runtime/emit/retrieve.js +9 -0
  446. package/dist/src/runtime/emit/retrieve.js.map +1 -0
  447. package/dist/src/runtime/emit/returning.d.ts.map +1 -1
  448. package/dist/src/runtime/emit/returning.js +1 -1
  449. package/dist/src/runtime/emit/returning.js.map +1 -1
  450. package/dist/src/runtime/emit/scalar-function.d.ts.map +1 -1
  451. package/dist/src/runtime/emit/scalar-function.js.map +1 -1
  452. package/dist/src/runtime/emit/scan.d.ts.map +1 -1
  453. package/dist/src/runtime/emit/scan.js +20 -5
  454. package/dist/src/runtime/emit/scan.js.map +1 -1
  455. package/dist/src/runtime/emit/schema-declarative.d.ts +8 -0
  456. package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -0
  457. package/dist/src/runtime/emit/schema-declarative.js +163 -0
  458. package/dist/src/runtime/emit/schema-declarative.js.map +1 -0
  459. package/dist/src/runtime/emit/sequencing.d.ts.map +1 -1
  460. package/dist/src/runtime/emit/sequencing.js.map +1 -1
  461. package/dist/src/runtime/emit/set-operation.d.ts.map +1 -1
  462. package/dist/src/runtime/emit/set-operation.js +6 -6
  463. package/dist/src/runtime/emit/set-operation.js.map +1 -1
  464. package/dist/src/runtime/emit/sort.d.ts.map +1 -1
  465. package/dist/src/runtime/emit/sort.js.map +1 -1
  466. package/dist/src/runtime/emit/subquery.d.ts +1 -1
  467. package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
  468. package/dist/src/runtime/emit/subquery.js +6 -6
  469. package/dist/src/runtime/emit/subquery.js.map +1 -1
  470. package/dist/src/runtime/emit/transaction.d.ts.map +1 -1
  471. package/dist/src/runtime/emit/transaction.js +48 -8
  472. package/dist/src/runtime/emit/transaction.js.map +1 -1
  473. package/dist/src/runtime/emit/values.d.ts.map +1 -1
  474. package/dist/src/runtime/emit/values.js.map +1 -1
  475. package/dist/src/runtime/emit/window.d.ts.map +1 -1
  476. package/dist/src/runtime/emit/window.js.map +1 -1
  477. package/dist/src/runtime/emitters.d.ts.map +1 -1
  478. package/dist/src/runtime/emitters.js +1 -0
  479. package/dist/src/runtime/emitters.js.map +1 -1
  480. package/dist/src/runtime/register.d.ts.map +1 -1
  481. package/dist/src/runtime/register.js +16 -2
  482. package/dist/src/runtime/register.js.map +1 -1
  483. package/dist/src/runtime/scheduler.js.map +1 -1
  484. package/dist/src/runtime/types.d.ts +2 -2
  485. package/dist/src/runtime/types.d.ts.map +1 -1
  486. package/dist/src/runtime/types.js +4 -1
  487. package/dist/src/runtime/types.js.map +1 -1
  488. package/dist/src/runtime/utils.d.ts +2 -2
  489. package/dist/src/runtime/utils.d.ts.map +1 -1
  490. package/dist/src/runtime/utils.js +1 -0
  491. package/dist/src/runtime/utils.js.map +1 -1
  492. package/dist/src/schema/assertion.d.ts +19 -0
  493. package/dist/src/schema/assertion.d.ts.map +1 -0
  494. package/dist/src/schema/assertion.js +2 -0
  495. package/dist/src/schema/assertion.js.map +1 -0
  496. package/dist/src/schema/catalog.d.ts +44 -0
  497. package/dist/src/schema/catalog.d.ts.map +1 -0
  498. package/dist/src/schema/catalog.js +148 -0
  499. package/dist/src/schema/catalog.js.map +1 -0
  500. package/dist/src/schema/change-events.d.ts +2 -2
  501. package/dist/src/schema/change-events.d.ts.map +1 -1
  502. package/dist/src/schema/column.d.ts +2 -0
  503. package/dist/src/schema/column.d.ts.map +1 -1
  504. package/dist/src/schema/column.js.map +1 -1
  505. package/dist/src/schema/declared-schema-manager.d.ts +42 -0
  506. package/dist/src/schema/declared-schema-manager.d.ts.map +1 -0
  507. package/dist/src/schema/declared-schema-manager.js +71 -0
  508. package/dist/src/schema/declared-schema-manager.js.map +1 -0
  509. package/dist/src/schema/function.d.ts +3 -2
  510. package/dist/src/schema/function.d.ts.map +1 -1
  511. package/dist/src/schema/function.js.map +1 -1
  512. package/dist/src/schema/manager.d.ts +8 -3
  513. package/dist/src/schema/manager.d.ts.map +1 -1
  514. package/dist/src/schema/manager.js +32 -3
  515. package/dist/src/schema/manager.js.map +1 -1
  516. package/dist/src/schema/schema-differ.d.ts +34 -0
  517. package/dist/src/schema/schema-differ.d.ts.map +1 -0
  518. package/dist/src/schema/schema-differ.js +157 -0
  519. package/dist/src/schema/schema-differ.js.map +1 -0
  520. package/dist/src/schema/schema-hasher.d.ts +10 -0
  521. package/dist/src/schema/schema-hasher.d.ts.map +1 -0
  522. package/dist/src/schema/schema-hasher.js +39 -0
  523. package/dist/src/schema/schema-hasher.js.map +1 -0
  524. package/dist/src/schema/schema.d.ts +7 -0
  525. package/dist/src/schema/schema.d.ts.map +1 -1
  526. package/dist/src/schema/schema.js +19 -0
  527. package/dist/src/schema/schema.js.map +1 -1
  528. package/dist/src/schema/table.d.ts +28 -3
  529. package/dist/src/schema/table.d.ts.map +1 -1
  530. package/dist/src/schema/table.js +17 -2
  531. package/dist/src/schema/table.js.map +1 -1
  532. package/dist/src/schema/window-function.d.ts.map +1 -1
  533. package/dist/src/schema/window-function.js.map +1 -1
  534. package/dist/src/util/ast-stringify.d.ts.map +1 -1
  535. package/dist/src/util/ast-stringify.js +116 -3
  536. package/dist/src/util/ast-stringify.js.map +1 -1
  537. package/dist/src/util/environment.js.map +1 -1
  538. package/dist/src/util/plugin-loader.d.ts +25 -2
  539. package/dist/src/util/plugin-loader.d.ts.map +1 -1
  540. package/dist/src/util/plugin-loader.js +180 -2
  541. package/dist/src/util/plugin-loader.js.map +1 -1
  542. package/dist/src/util/row-descriptor.d.ts +1 -1
  543. package/dist/src/util/row-descriptor.d.ts.map +1 -1
  544. package/dist/src/util/row-descriptor.js.map +1 -1
  545. package/dist/src/util/serialization.d.ts +3 -0
  546. package/dist/src/util/serialization.d.ts.map +1 -1
  547. package/dist/src/util/serialization.js +1 -0
  548. package/dist/src/util/serialization.js.map +1 -1
  549. package/dist/src/vtab/best-access-plan.d.ts +1 -1
  550. package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
  551. package/dist/src/vtab/best-access-plan.js +1 -0
  552. package/dist/src/vtab/best-access-plan.js.map +1 -1
  553. package/dist/src/vtab/manifest.d.ts.map +1 -1
  554. package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
  555. package/dist/src/vtab/memory/layer/base.js +2 -0
  556. package/dist/src/vtab/memory/layer/base.js.map +1 -1
  557. package/dist/src/vtab/memory/layer/manager.d.ts +2 -1
  558. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  559. package/dist/src/vtab/memory/layer/manager.js +24 -6
  560. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  561. package/dist/src/vtab/memory/layer/safe-iterate.d.ts.map +1 -1
  562. package/dist/src/vtab/memory/layer/safe-iterate.js.map +1 -1
  563. package/dist/src/vtab/memory/module.d.ts.map +1 -1
  564. package/dist/src/vtab/memory/module.js +5 -0
  565. package/dist/src/vtab/memory/module.js.map +1 -1
  566. package/dist/src/vtab/memory/table.d.ts +2 -1
  567. package/dist/src/vtab/memory/table.d.ts.map +1 -1
  568. package/dist/src/vtab/memory/table.js +3 -2
  569. package/dist/src/vtab/memory/table.js.map +1 -1
  570. package/dist/src/vtab/memory/utils/logging.d.ts +2 -2
  571. package/dist/src/vtab/memory/utils/logging.d.ts.map +1 -1
  572. package/dist/src/vtab/memory/utils/logging.js +6 -3
  573. package/dist/src/vtab/memory/utils/logging.js.map +1 -1
  574. package/dist/src/vtab/module.d.ts +25 -0
  575. package/dist/src/vtab/module.d.ts.map +1 -1
  576. package/dist/src/vtab/table.d.ts +17 -4
  577. package/dist/src/vtab/table.d.ts.map +1 -1
  578. package/dist/src/vtab/table.js.map +1 -1
  579. package/package.json +4 -2
  580. package/src/common/errors.ts +1 -1
  581. package/src/common/json-types.ts +16 -0
  582. package/src/common/types.ts +2 -0
  583. package/src/core/database-options.ts +8 -8
  584. package/src/core/database.ts +537 -71
  585. package/src/core/statement.ts +3 -1
  586. package/src/func/builtins/builtin-window-functions.ts +11 -10
  587. package/src/func/builtins/datetime.ts +42 -0
  588. package/src/func/builtins/explain.ts +186 -44
  589. package/src/func/builtins/index.ts +5 -2
  590. package/src/func/builtins/json-helpers.ts +21 -21
  591. package/src/func/builtins/json-tvf.ts +8 -9
  592. package/src/func/builtins/json.ts +10 -9
  593. package/src/func/builtins/schema.ts +24 -4
  594. package/src/func/context.ts +7 -0
  595. package/src/func/registration.ts +5 -1
  596. package/src/index.ts +2 -2
  597. package/src/parser/ast.ts +582 -481
  598. package/src/parser/lexer.ts +27 -21
  599. package/src/parser/parser.ts +3336 -2776
  600. package/src/parser/visitor.ts +1 -0
  601. package/src/planner/analysis/binding-collector.ts +83 -0
  602. package/src/planner/analysis/const-evaluator.ts +1 -1
  603. package/src/planner/analysis/const-pass.ts +3 -2
  604. package/src/planner/analysis/constraint-extractor.ts +610 -123
  605. package/src/planner/analysis/predicate-normalizer.ts +237 -0
  606. package/src/planner/building/alter-table.ts +3 -1
  607. package/src/planner/building/block.ts +93 -78
  608. package/src/planner/building/constraint-builder.ts +173 -114
  609. package/src/planner/building/create-assertion.ts +7 -0
  610. package/src/planner/building/declare-schema.ts +22 -0
  611. package/src/planner/building/delete.ts +214 -171
  612. package/src/planner/building/drop-assertion.ts +11 -0
  613. package/src/planner/building/expression.ts +1 -0
  614. package/src/planner/building/function-call.ts +6 -5
  615. package/src/planner/building/insert.ts +428 -349
  616. package/src/planner/building/pragma.ts +1 -0
  617. package/src/planner/building/schema-resolution.ts +176 -176
  618. package/src/planner/building/select-aggregates.ts +5 -3
  619. package/src/planner/building/select-compound.ts +22 -13
  620. package/src/planner/building/select-context.ts +6 -6
  621. package/src/planner/building/select-modifiers.ts +8 -7
  622. package/src/planner/building/select-projections.ts +177 -176
  623. package/src/planner/building/select-window.ts +259 -253
  624. package/src/planner/building/select.ts +531 -520
  625. package/src/planner/building/table-function.ts +49 -48
  626. package/src/planner/building/table.ts +9 -3
  627. package/src/planner/building/update.ts +319 -270
  628. package/src/planner/building/with.ts +7 -7
  629. package/src/planner/debug.ts +1 -0
  630. package/src/planner/framework/characteristics.ts +503 -0
  631. package/src/planner/framework/context.ts +23 -6
  632. package/src/planner/framework/pass.ts +354 -0
  633. package/src/planner/nodes/aggregate-node.ts +52 -7
  634. package/src/planner/nodes/array-index-node.ts +1 -1
  635. package/src/planner/nodes/cache-node.ts +11 -2
  636. package/src/planner/nodes/constraint-check-node.ts +14 -5
  637. package/src/planner/nodes/create-assertion-node.ts +51 -0
  638. package/src/planner/nodes/create-index-node.ts +2 -2
  639. package/src/planner/nodes/create-table-node.ts +2 -2
  640. package/src/planner/nodes/cte-node.ts +30 -4
  641. package/src/planner/nodes/cte-reference-node.ts +2 -2
  642. package/src/planner/nodes/declarative-schema.ts +221 -0
  643. package/src/planner/nodes/delete-node.ts +102 -96
  644. package/src/planner/nodes/distinct-node.ts +20 -6
  645. package/src/planner/nodes/dml-executor-node.ts +1 -1
  646. package/src/planner/nodes/drop-assertion-node.ts +50 -0
  647. package/src/planner/nodes/drop-table-node.ts +1 -0
  648. package/src/planner/nodes/filter.ts +56 -3
  649. package/src/planner/nodes/insert-node.ts +126 -120
  650. package/src/planner/nodes/internal-recursive-cte-ref-node.ts +5 -20
  651. package/src/planner/nodes/join-node.ts +122 -4
  652. package/src/planner/nodes/limit-offset.ts +132 -113
  653. package/src/planner/nodes/plan-node-type.ts +95 -87
  654. package/src/planner/nodes/plan-node.ts +8 -8
  655. package/src/planner/nodes/pragma.ts +6 -3
  656. package/src/planner/nodes/project-node.ts +101 -7
  657. package/src/planner/nodes/recursive-cte-node.ts +6 -6
  658. package/src/planner/nodes/reference.ts +334 -312
  659. package/src/planner/nodes/remote-query-node.ts +73 -0
  660. package/src/planner/nodes/retrieve-node.ts +86 -0
  661. package/src/planner/nodes/returning-node.ts +52 -10
  662. package/src/planner/nodes/sequencing-node.ts +2 -2
  663. package/src/planner/nodes/set-operation-node.ts +3 -3
  664. package/src/planner/nodes/sort.ts +33 -4
  665. package/src/planner/nodes/stream-aggregate.ts +5 -1
  666. package/src/planner/nodes/table-access-nodes.ts +31 -6
  667. package/src/planner/nodes/table-function-call.ts +134 -127
  668. package/src/planner/nodes/transaction-node.ts +2 -2
  669. package/src/planner/nodes/update-node.ts +138 -132
  670. package/src/planner/nodes/view-reference-node.ts +1 -1
  671. package/src/planner/nodes/window-function.ts +2 -2
  672. package/src/planner/nodes/window-node.ts +1 -1
  673. package/src/planner/optimizer-tuning.ts +18 -0
  674. package/src/planner/optimizer.ts +171 -96
  675. package/src/planner/planning-context.ts +10 -3
  676. package/src/planner/resolve.ts +10 -9
  677. package/src/planner/rules/README.md +96 -96
  678. package/src/planner/rules/access/rule-select-access-path.ts +384 -184
  679. package/src/planner/rules/aggregate/rule-aggregate-streaming.ts +118 -104
  680. package/src/planner/rules/cache/rule-cte-optimization.ts +29 -16
  681. package/src/planner/rules/cache/rule-materialization-advisory.ts +14 -7
  682. package/src/planner/rules/cache/rule-mutating-subquery-cache.ts +38 -44
  683. package/src/planner/rules/join/rule-join-greedy-commute.ts +48 -0
  684. package/src/planner/rules/join/rule-join-key-inference.ts +35 -0
  685. package/src/planner/rules/join/rule-quickpick-enumeration.ts +267 -0
  686. package/src/planner/rules/predicate/rule-predicate-pushdown.ts +144 -0
  687. package/src/planner/rules/retrieve/rule-grow-retrieve.ts +337 -0
  688. package/src/planner/scopes/registered.ts +8 -0
  689. package/src/planner/stats/index.ts +0 -65
  690. package/src/planner/util/key-utils.ts +46 -0
  691. package/src/planner/validation/plan-validator.ts +5 -3
  692. package/src/runtime/deferred-constraint-queue.ts +196 -0
  693. package/src/runtime/emission-context.ts +11 -5
  694. package/src/runtime/emit/add-constraint.ts +26 -5
  695. package/src/runtime/emit/aggregate.ts +9 -7
  696. package/src/runtime/emit/array-index.ts +2 -2
  697. package/src/runtime/emit/binary.ts +26 -8
  698. package/src/runtime/emit/cache.ts +2 -2
  699. package/src/runtime/emit/cast.ts +2 -2
  700. package/src/runtime/emit/constraint-check.ts +148 -26
  701. package/src/runtime/emit/create-assertion.ts +82 -0
  702. package/src/runtime/emit/cte-reference.ts +2 -2
  703. package/src/runtime/emit/cte.ts +2 -2
  704. package/src/runtime/emit/distinct.ts +2 -2
  705. package/src/runtime/emit/dml-executor.ts +20 -12
  706. package/src/runtime/emit/drop-assertion.ts +45 -0
  707. package/src/runtime/emit/filter.ts +4 -4
  708. package/src/runtime/emit/join.ts +8 -7
  709. package/src/runtime/emit/limit-offset.ts +2 -2
  710. package/src/runtime/emit/pragma.ts +2 -2
  711. package/src/runtime/emit/project.ts +2 -2
  712. package/src/runtime/emit/recursive-cte.ts +2 -2
  713. package/src/runtime/emit/remote-query.ts +47 -0
  714. package/src/runtime/emit/retrieve.ts +15 -0
  715. package/src/runtime/emit/returning.ts +4 -4
  716. package/src/runtime/emit/scalar-function.ts +2 -2
  717. package/src/runtime/emit/scan.ts +29 -13
  718. package/src/runtime/emit/schema-declarative.ts +205 -0
  719. package/src/runtime/emit/sequencing.ts +3 -3
  720. package/src/runtime/emit/set-operation.ts +7 -7
  721. package/src/runtime/emit/sort.ts +2 -2
  722. package/src/runtime/emit/subquery.ts +10 -10
  723. package/src/runtime/emit/transaction.ts +46 -8
  724. package/src/runtime/emit/values.ts +2 -2
  725. package/src/runtime/emit/window.ts +3 -3
  726. package/src/runtime/emitters.ts +1 -0
  727. package/src/runtime/register.ts +150 -135
  728. package/src/runtime/scheduler.ts +2 -2
  729. package/src/runtime/types.ts +10 -7
  730. package/src/runtime/utils.ts +3 -2
  731. package/src/schema/assertion.ts +21 -0
  732. package/src/schema/catalog.ts +208 -0
  733. package/src/schema/change-events.ts +2 -2
  734. package/src/schema/column.ts +2 -0
  735. package/src/schema/declared-schema-manager.ts +82 -0
  736. package/src/schema/function.ts +5 -2
  737. package/src/schema/manager.ts +742 -709
  738. package/src/schema/schema-differ.ts +214 -0
  739. package/src/schema/schema-hasher.ts +44 -0
  740. package/src/schema/schema.ts +23 -0
  741. package/src/schema/table.ts +398 -364
  742. package/src/schema/window-function.ts +2 -0
  743. package/src/util/ast-stringify.ts +869 -764
  744. package/src/util/environment.ts +2 -2
  745. package/src/util/plugin-loader.ts +232 -7
  746. package/src/util/row-descriptor.ts +1 -1
  747. package/src/util/serialization.ts +2 -0
  748. package/src/vtab/best-access-plan.ts +2 -1
  749. package/src/vtab/manifest.ts +1 -0
  750. package/src/vtab/memory/index.ts +178 -178
  751. package/src/vtab/memory/layer/base.ts +275 -273
  752. package/src/vtab/memory/layer/interface.ts +47 -47
  753. package/src/vtab/memory/layer/manager.ts +33 -11
  754. package/src/vtab/memory/layer/safe-iterate.ts +3 -3
  755. package/src/vtab/memory/layer/transaction.ts +229 -229
  756. package/src/vtab/memory/module.ts +24 -18
  757. package/src/vtab/memory/table.ts +256 -253
  758. package/src/vtab/memory/utils/logging.ts +6 -3
  759. package/src/vtab/module.ts +170 -140
  760. package/src/vtab/table.ts +162 -143
@@ -12,15 +12,23 @@ import { Parser, ParseError } from '../parser/parser.js';
12
12
  import { buildBlock } from '../planner/building/block.js';
13
13
  import { emitPlanNode } from '../runtime/emitters.js';
14
14
  import { Scheduler } from '../runtime/scheduler.js';
15
+ import { BlockNode } from '../planner/nodes/block.js';
15
16
  import { BuildTimeDependencyTracker } from '../planner/planning-context.js';
16
17
  import { ParameterScope } from '../planner/scopes/param.js';
17
18
  import { GlobalScope } from '../planner/scopes/global.js';
19
+ import { FilterNode } from '../planner/nodes/filter.js';
20
+ import { BinaryOpNode } from '../planner/nodes/scalar.js';
21
+ import { ParameterReferenceNode, ColumnReferenceNode, TableReferenceNode } from '../planner/nodes/reference.js';
18
22
  import { registerEmitters } from '../runtime/register.js';
19
23
  import { serializePlanTree, formatPlanTree } from '../planner/debug.js';
20
24
  import { EmissionContext } from '../runtime/emission-context.js';
21
25
  import { Optimizer, DEFAULT_TUNING } from '../planner/optimizer.js';
22
26
  import { registerBuiltinWindowFunctions } from '../func/builtins/builtin-window-functions.js';
23
27
  import { DatabaseOptionsManager } from './database-options.js';
28
+ import { isAsyncIterable } from '../runtime/utils.js';
29
+ import { DeclaredSchemaManager } from '../schema/declared-schema-manager.js';
30
+ import { analyzeRowSpecific } from '../planner/analysis/constraint-extractor.js';
31
+ import { DeferredConstraintQueue } from '../runtime/deferred-constraint-queue.js';
24
32
  const log = createLogger('core:database');
25
33
  const warnLog = log.extend('warn');
26
34
  const errorLog = log.extend('error');
@@ -31,6 +39,7 @@ const debugLog = log.extend('debug');
31
39
  */
32
40
  export class Database {
33
41
  schemaManager;
42
+ declaredSchemaManager;
34
43
  isOpen = true;
35
44
  statements = new Set();
36
45
  isAutocommit = true; // Manages transaction state
@@ -40,8 +49,15 @@ export class Database {
40
49
  optimizer;
41
50
  options;
42
51
  instructionTracer;
52
+ /** Per-transaction change tracking: base table name → serialized PK tuples */
53
+ changeLog = new Map();
54
+ /** Savepoint layers for change tracking */
55
+ changeLogLayers = [];
56
+ /** Deferred constraint evaluation queue */
57
+ deferredConstraints = new DeferredConstraintQueue(this);
43
58
  constructor() {
44
59
  this.schemaManager = new SchemaManager(this);
60
+ this.declaredSchemaManager = new DeclaredSchemaManager();
45
61
  this.options = new DatabaseOptionsManager();
46
62
  log("Database instance created.");
47
63
  // Register built-in functions
@@ -85,9 +101,8 @@ export class Database {
85
101
  validatePlan: event.newValue
86
102
  }
87
103
  };
88
- // Recreate optimizer with new tuning
89
- this.optimizer = new Optimizer(newTuning);
90
- log('Optimizer recreated with validate_plan = %s', event.newValue);
104
+ this.updateOptimizerTuning(newTuning);
105
+ log('Optimizer tuning updated with validate_plan = %s', event.newValue);
91
106
  }
92
107
  });
93
108
  this.options.registerOption('default_vtab_module', {
@@ -182,7 +197,7 @@ export class Database {
182
197
  }
183
198
  if (batch.length === 0)
184
199
  return;
185
- const needsImplicitTransaction = batch.length > 1
200
+ const needsImplicitTransaction = batch.length >= 1
186
201
  && this.isAutocommit
187
202
  // has explicit transaction
188
203
  && !batch.some(ast => ast.type === 'begin' || ast.type === 'commit' || ast.type === 'rollback' || ast.type === 'savepoint' || ast.type === 'release');
@@ -204,7 +219,7 @@ export class Database {
204
219
  const scheduler = new Scheduler(rootInstruction);
205
220
  const runtimeCtx = {
206
221
  db: this,
207
- stmt: null, // No persistent Statement object for transient exec statements
222
+ stmt: undefined,
208
223
  params: params ?? {},
209
224
  context: new Map(),
210
225
  tableContexts: new Map(),
@@ -215,7 +230,8 @@ export class Database {
215
230
  // Nothing to do with the result, this is executed for side effects only
216
231
  }
217
232
  catch (err) {
218
- executionError = err instanceof QuereusError ? err : new QuereusError(err.message, StatusCode.ERROR, err);
233
+ const error = err instanceof Error ? err : new Error(String(err));
234
+ executionError = error instanceof QuereusError ? error : new QuereusError(error.message, StatusCode.ERROR, error);
219
235
  break; // Stop processing further statements on error
220
236
  }
221
237
  // No explicit finalize for transient plan/scheduler used in exec loop
@@ -223,16 +239,11 @@ export class Database {
223
239
  }
224
240
  finally {
225
241
  if (needsImplicitTransaction) {
226
- try {
227
- if (executionError) {
228
- await this.rollbackImplicitTransaction();
229
- }
230
- else {
231
- await this.commitImplicitTransaction();
232
- }
242
+ if (executionError) {
243
+ await this.rollbackImplicitTransaction();
233
244
  }
234
- catch (txError) {
235
- errorLog(`Error during implicit transaction ${executionError ? 'rollback' : 'commit'}: %O`, txError);
245
+ else {
246
+ await this.commitImplicitTransaction();
236
247
  }
237
248
  }
238
249
  }
@@ -359,7 +370,7 @@ export class Database {
359
370
  * Registers a user-defined aggregate function.
360
371
  *
361
372
  * @param name The name of the SQL function.
362
- * @param options Configuration: { numArgs: number, flags?: number, initialState?: any }.
373
+ * @param options Configuration: { numArgs: number, flags?: number, initialState?: unknown }.
363
374
  * @param stepFunc The function called for each row (accumulator, ...args) => newAccumulator.
364
375
  * @param finalFunc The function called at the end (accumulator) => finalResult.
365
376
  */
@@ -438,6 +449,10 @@ export class Database {
438
449
  this.checkOpen();
439
450
  return this.options.getOption(option);
440
451
  }
452
+ /** Update optimizer tuning in place */
453
+ updateOptimizerTuning(tuning) {
454
+ this.optimizer.updateTuning(tuning);
455
+ }
441
456
  /**
442
457
  * Registers a user-defined collation sequence.
443
458
  * @param name The name of the collation sequence (case-insensitive).
@@ -480,6 +495,125 @@ export class Database {
480
495
  _getCollation(name) {
481
496
  return getCollation(name);
482
497
  }
498
+ /** Serialize a composite primary key tuple for set storage */
499
+ serializeKeyTuple(values) {
500
+ // JSON serialization is sufficient because SqlValue is JSON-safe in this engine
501
+ return JSON.stringify(values);
502
+ }
503
+ /** Add a key tuple to the current change log for a base table */
504
+ addChange(baseTable, keyTuple) {
505
+ const target = this.changeLogLayers.length > 0
506
+ ? this.changeLogLayers[this.changeLogLayers.length - 1]
507
+ : this.changeLog;
508
+ const key = baseTable.toLowerCase();
509
+ if (!target.has(key))
510
+ target.set(key, new Set());
511
+ target.get(key).add(this.serializeKeyTuple(keyTuple));
512
+ }
513
+ _queueDeferredConstraintRow(baseTable, constraintName, row, descriptor, evaluator, connectionId, contextRow, contextDescriptor) {
514
+ this.deferredConstraints.enqueue(baseTable, constraintName, row, descriptor, evaluator, connectionId, contextRow, contextDescriptor);
515
+ }
516
+ /** @internal Flag to prevent new connections from starting transactions during constraint evaluation */
517
+ evaluatingDeferredConstraints = false;
518
+ /** @internal Flag indicating we're in a coordinated multi-connection commit */
519
+ inCoordinatedCommit = false;
520
+ async runDeferredRowConstraints() {
521
+ this.evaluatingDeferredConstraints = true;
522
+ try {
523
+ await this.deferredConstraints.runDeferredRows();
524
+ }
525
+ finally {
526
+ this.evaluatingDeferredConstraints = false;
527
+ }
528
+ }
529
+ /** @internal Check if we should skip auto-beginning transactions on newly registered connections */
530
+ _isEvaluatingDeferredConstraints() {
531
+ return this.evaluatingDeferredConstraints;
532
+ }
533
+ /** @internal Mark start of coordinated multi-connection commit */
534
+ _beginCoordinatedCommit() {
535
+ this.inCoordinatedCommit = true;
536
+ }
537
+ /** @internal Mark end of coordinated multi-connection commit */
538
+ _endCoordinatedCommit() {
539
+ this.inCoordinatedCommit = false;
540
+ }
541
+ /** @internal Check if we're in a coordinated commit (allows sibling layer validation) */
542
+ _inCoordinatedCommit() {
543
+ return this.inCoordinatedCommit;
544
+ }
545
+ /** Public API used by DML emitters to record changes */
546
+ _recordInsert(baseTable, newKey) {
547
+ this.addChange(baseTable, newKey);
548
+ }
549
+ _recordDelete(baseTable, oldKey) {
550
+ this.addChange(baseTable, oldKey);
551
+ }
552
+ _recordUpdate(baseTable, oldKey, newKey) {
553
+ this.addChange(baseTable, oldKey);
554
+ // If the PK changed, also record the new key
555
+ if (this.serializeKeyTuple(oldKey) !== this.serializeKeyTuple(newKey)) {
556
+ this.addChange(baseTable, newKey);
557
+ }
558
+ }
559
+ /** Savepoint change tracking */
560
+ _beginSavepointLayer() {
561
+ this.changeLogLayers.push(new Map());
562
+ this.deferredConstraints.beginLayer();
563
+ }
564
+ _rollbackSavepointLayer() {
565
+ // Discard the top layer
566
+ this.changeLogLayers.pop();
567
+ this.deferredConstraints.rollbackLayer();
568
+ }
569
+ _releaseSavepointLayer() {
570
+ // Merge the top layer into previous or main log
571
+ const top = this.changeLogLayers.pop();
572
+ if (!top)
573
+ return;
574
+ const target = this.changeLogLayers.length > 0 ? this.changeLogLayers[this.changeLogLayers.length - 1] : this.changeLog;
575
+ for (const [table, set] of top) {
576
+ if (!target.has(table))
577
+ target.set(table, new Set());
578
+ const tgt = target.get(table);
579
+ for (const k of set)
580
+ tgt.add(k);
581
+ }
582
+ this.deferredConstraints.releaseLayer();
583
+ }
584
+ getChangedBaseTables() {
585
+ const result = new Set();
586
+ const collect = (m) => {
587
+ for (const [t, s] of m) {
588
+ if (s.size > 0)
589
+ result.add(t);
590
+ }
591
+ };
592
+ collect(this.changeLog);
593
+ for (const layer of this.changeLogLayers)
594
+ collect(layer);
595
+ return result;
596
+ }
597
+ _clearChangeLog() {
598
+ this.changeLog.clear();
599
+ this.changeLogLayers = [];
600
+ this.deferredConstraints.clear();
601
+ }
602
+ /**
603
+ * Marks that an explicit SQL BEGIN has started a transaction.
604
+ * Ensures subsequently registered connections also begin a transaction.
605
+ */
606
+ markExplicitTransactionStart() {
607
+ this.inTransaction = true;
608
+ this.isAutocommit = false;
609
+ }
610
+ /**
611
+ * Marks that an explicit SQL COMMIT/ROLLBACK has ended the transaction.
612
+ */
613
+ markExplicitTransactionEnd() {
614
+ this.inTransaction = false;
615
+ this.isAutocommit = true;
616
+ }
483
617
  /**
484
618
  * Prepares, binds parameters, executes, and yields result rows for a query.
485
619
  * This is a high-level convenience method for iterating over query results.
@@ -537,9 +671,10 @@ export class Database {
537
671
  try {
538
672
  ast = parser.parse(originalSqlString);
539
673
  }
540
- catch (e) {
541
- errorLog("Failed to parse SQL for query plan: %O", e);
542
- throw new QuereusError(`Parse error: ${e.message}`, StatusCode.ERROR, e);
674
+ catch (err) {
675
+ const error = err instanceof Error ? err : new Error(String(err));
676
+ errorLog("Failed to parse SQL for query plan: %O", error);
677
+ throw error;
543
678
  }
544
679
  }
545
680
  else {
@@ -616,7 +751,8 @@ export class Database {
616
751
  cteNodes: new Map(),
617
752
  schemaDependencies: new BuildTimeDependencyTracker(),
618
753
  schemaCache: new Map(),
619
- cteReferenceCache: new Map()
754
+ cteReferenceCache: new Map(),
755
+ outputScopes: new Map()
620
756
  };
621
757
  return buildBlock(ctx, statements);
622
758
  }
@@ -628,8 +764,9 @@ export class Database {
628
764
  this.activeConnections.set(connection.connectionId, connection);
629
765
  debugLog(`Registered connection ${connection.connectionId} for table ${connection.tableName}`);
630
766
  // If we're already in a transaction (implicit or explicit),
631
- // start a transaction on this new connection
632
- if (this.inTransaction) {
767
+ // start a transaction on this new connection UNLESS we're evaluating deferred constraints
768
+ // (during which subqueries should read committed state without creating new transaction layers)
769
+ if (this.inTransaction && !this.evaluatingDeferredConstraints) {
633
770
  try {
634
771
  await connection.begin();
635
772
  debugLog(`Started transaction on newly registered connection ${connection.connectionId}`);
@@ -639,6 +776,9 @@ export class Database {
639
776
  // Don't throw here - just log the error to avoid breaking connection registration
640
777
  }
641
778
  }
779
+ else if (this.evaluatingDeferredConstraints) {
780
+ debugLog(`Skipped transaction begin on connection ${connection.connectionId} (evaluating deferred constraints)`);
781
+ }
642
782
  }
643
783
  /**
644
784
  * @internal Unregisters an active VirtualTable connection.
@@ -670,8 +810,13 @@ export class Database {
670
810
  * @returns Array of connections for the table
671
811
  */
672
812
  getConnectionsForTable(tableName) {
813
+ const normalized = tableName.toLowerCase();
814
+ const simpleName = normalized.includes('.') ? normalized.substring(normalized.lastIndexOf('.') + 1) : normalized;
673
815
  return Array.from(this.activeConnections.values())
674
- .filter(conn => conn.tableName === tableName);
816
+ .filter(conn => {
817
+ const connName = conn.tableName.toLowerCase();
818
+ return connName === normalized || connName === simpleName;
819
+ });
675
820
  }
676
821
  /**
677
822
  * @internal Gets all active connections.
@@ -702,21 +847,6 @@ export class Database {
702
847
  if (!this.isOpen)
703
848
  throw new MisuseError("Database is closed");
704
849
  }
705
- /** Helper to execute simple commands (BEGIN, COMMIT, ROLLBACK) internally
706
- * This method is for commands that don't produce rows and don't need complex parameter handling.
707
- */
708
- async execSimple(sqlCommand) {
709
- let stmt = null;
710
- try {
711
- stmt = this.prepare(sqlCommand);
712
- await stmt.run();
713
- }
714
- finally {
715
- if (stmt) {
716
- await stmt.finalize();
717
- }
718
- }
719
- }
720
850
  /**
721
851
  * Begin an implicit transaction and coordinate with virtual table connections
722
852
  */
@@ -743,24 +873,318 @@ export class Database {
743
873
  */
744
874
  async commitImplicitTransaction() {
745
875
  debugLog("Database: Committing implicit transaction.");
746
- // Commit all active connections first
747
- const connections = this.getAllConnections();
748
- const commitPromises = connections.map(async (connection) => {
876
+ try {
877
+ const connectionsToCommit = this.getAllConnections();
878
+ // Evaluate global assertions and deferred row constraints BEFORE committing connections. If violated, rollback and abort.
879
+ await this.runGlobalAssertions();
880
+ await this.runDeferredRowConstraints();
881
+ // Mark coordinated commit to relax layer validation for sibling layers
882
+ this._beginCoordinatedCommit();
749
883
  try {
750
- await connection.commit();
884
+ // Commit only the original connections (not any opened during constraint evaluation)
885
+ // Commit sequentially to avoid race conditions with layer promotion
886
+ for (const connection of connectionsToCommit) {
887
+ try {
888
+ await connection.commit();
889
+ }
890
+ catch (error) {
891
+ errorLog(`Error committing transaction on connection ${connection.connectionId}: %O`, error);
892
+ throw error;
893
+ }
894
+ }
751
895
  }
752
- catch (error) {
753
- errorLog(`Error committing transaction on connection ${connection.connectionId}: %O`, error);
754
- throw error;
896
+ finally {
897
+ this._endCoordinatedCommit();
755
898
  }
756
- });
757
- await Promise.all(commitPromises);
758
- // Reset database state
759
- this.inTransaction = false;
760
- this.isAutocommit = true;
761
- this.inImplicitTransaction = false;
762
- // DON'T disconnect connections after successful commit - leave them for subsequent queries
763
- // The data in committed connections should be visible to future operations
899
+ }
900
+ catch (e) {
901
+ // On pre-commit assertion failure (or commit error), rollback all connections
902
+ const conns = this.getAllConnections();
903
+ await Promise.allSettled(conns.map(c => c.rollback()));
904
+ throw e;
905
+ }
906
+ finally {
907
+ this.inTransaction = false;
908
+ this.isAutocommit = true;
909
+ this.inImplicitTransaction = false;
910
+ this._clearChangeLog();
911
+ }
912
+ }
913
+ async runGlobalAssertions() {
914
+ const assertions = this.schemaManager.getAllAssertions();
915
+ if (assertions.length === 0)
916
+ return;
917
+ // Only evaluate assertions impacted by changed base tables
918
+ const changedBases = this.getChangedBaseTables();
919
+ if (changedBases.size === 0)
920
+ return;
921
+ for (const assertion of assertions) {
922
+ const planSql = assertion.violationSql;
923
+ const parser = new Parser();
924
+ let ast;
925
+ try {
926
+ ast = parser.parse(planSql);
927
+ }
928
+ catch (err) {
929
+ const error = err instanceof Error ? err : new Error(String(err));
930
+ throw new QuereusError(`Failed to parse deferred assertion '${assertion.name}': ${error.message}`, StatusCode.INTERNAL, error);
931
+ }
932
+ const plan = this._buildPlan([ast]);
933
+ const analyzed = this.optimizer.optimizeForAnalysis(plan, this);
934
+ // Collect base tables and relationKeys in this plan
935
+ const relationKeyToBase = new Map();
936
+ const baseTablesInPlan = new Set();
937
+ this.collectTables(analyzed, relationKeyToBase, baseTablesInPlan);
938
+ // Determine impact: if assertion has no dependencies, treat as global and always impacted.
939
+ const hasDeps = baseTablesInPlan.size > 0;
940
+ let impacted = !hasDeps;
941
+ if (hasDeps) {
942
+ for (const b of baseTablesInPlan) {
943
+ if (changedBases.has(b)) {
944
+ impacted = true;
945
+ break;
946
+ }
947
+ }
948
+ }
949
+ if (!impacted)
950
+ continue;
951
+ // Classify instances as row/global
952
+ const classifications = analyzeRowSpecific(analyzed);
953
+ // If any changed base appears as a global instance, run full violation query once
954
+ let requiresGlobal = false;
955
+ for (const [relKey, klass] of classifications) {
956
+ if (klass === 'global') {
957
+ const base = relationKeyToBase.get(relKey);
958
+ if (base && changedBases.has(base)) {
959
+ requiresGlobal = true;
960
+ break;
961
+ }
962
+ }
963
+ }
964
+ if (requiresGlobal) {
965
+ await this.executeViolationOnce(assertion.name, assertion.violationSql);
966
+ continue;
967
+ }
968
+ // Collect row-specific references that correspond to changed bases
969
+ const rowSpecificChanged = [];
970
+ for (const [relKey, klass] of classifications) {
971
+ if (klass !== 'row')
972
+ continue;
973
+ const base = relationKeyToBase.get(relKey);
974
+ if (base && changedBases.has(base))
975
+ rowSpecificChanged.push({ relKey, base });
976
+ }
977
+ if (rowSpecificChanged.length === 0) {
978
+ // No row-specific changed refs (or no refs at all) → run once globally.
979
+ await this.executeViolationOnce(assertion.name, assertion.violationSql);
980
+ continue;
981
+ }
982
+ // Execute parameterized variants per changed key for each row-specific reference; early-exit on violation
983
+ for (const { relKey, base } of rowSpecificChanged) {
984
+ await this.executeViolationPerChangedKeys(assertion.name, assertion.violationSql, analyzed, relKey, base);
985
+ }
986
+ }
987
+ }
988
+ async executeViolationOnce(assertionName, sql) {
989
+ const stmt = await this.prepare(sql);
990
+ try {
991
+ for await (const _ of stmt.all()) {
992
+ throw new QuereusError(`Integrity assertion failed: ${assertionName}`, StatusCode.CONSTRAINT);
993
+ }
994
+ }
995
+ finally {
996
+ await stmt.finalize();
997
+ }
998
+ }
999
+ async executeViolationOnceFromPlan(assertionName, plan) {
1000
+ const optimizedPlan = this.optimizer.optimize(plan, this);
1001
+ const emissionContext = new EmissionContext(this);
1002
+ const rootInstruction = emitPlanNode(optimizedPlan, emissionContext);
1003
+ const scheduler = new Scheduler(rootInstruction);
1004
+ const runtimeCtx = {
1005
+ db: this,
1006
+ stmt: undefined,
1007
+ params: {},
1008
+ context: new Map(),
1009
+ tableContexts: new Map(),
1010
+ tracer: this.instructionTracer,
1011
+ enableMetrics: this.options.getBooleanOption('runtime_stats'),
1012
+ };
1013
+ const result = await scheduler.run(runtimeCtx);
1014
+ if (isAsyncIterable(result)) {
1015
+ for await (const _ of result) {
1016
+ throw new QuereusError(`CHECK constraint failed: ${assertionName}`, StatusCode.CONSTRAINT);
1017
+ }
1018
+ }
1019
+ }
1020
+ async executeViolationPerChangedKeysFromPlan(assertionName, analyzed, targetRelationKey, base) {
1021
+ const changedKeyTuples = this.getChangedKeyTuples(base);
1022
+ if (changedKeyTuples.length === 0)
1023
+ return;
1024
+ // Find PK indices for the base table
1025
+ const [schemaName, tableName] = base.split('.');
1026
+ const table = this._findTable(tableName, schemaName);
1027
+ if (!table) {
1028
+ throw new QuereusError(`Constraint references unknown table ${base}`, StatusCode.INTERNAL);
1029
+ }
1030
+ const pkIndices = table.primaryKeyDefinition.map(def => def.index);
1031
+ // Prepare a rewritten plan with an injected Filter on the target relationKey
1032
+ const rewritten = this.injectPkFilter(analyzed, targetRelationKey, base, pkIndices);
1033
+ const optimizedPlan = this.optimizer.optimize(rewritten, this);
1034
+ // Emit and execute for each changed PK tuple; stop on first violation row.
1035
+ const emissionContext = new EmissionContext(this);
1036
+ const rootInstruction = emitPlanNode(optimizedPlan, emissionContext);
1037
+ const scheduler = new Scheduler(rootInstruction);
1038
+ for (const tuple of changedKeyTuples) {
1039
+ const params = {};
1040
+ for (let i = 0; i < pkIndices.length; i++) {
1041
+ params[`pk${i}`] = tuple[i];
1042
+ }
1043
+ const runtimeCtx = {
1044
+ db: this,
1045
+ stmt: undefined,
1046
+ params,
1047
+ context: new Map(),
1048
+ tableContexts: new Map(),
1049
+ tracer: this.instructionTracer,
1050
+ enableMetrics: this.options.getBooleanOption('runtime_stats'),
1051
+ };
1052
+ // Run and detect first output row (violation)
1053
+ const result = await scheduler.run(runtimeCtx);
1054
+ if (isAsyncIterable(result)) {
1055
+ for await (const _ of result) {
1056
+ throw new QuereusError(`CHECK constraint failed: ${assertionName}`, StatusCode.CONSTRAINT);
1057
+ }
1058
+ }
1059
+ }
1060
+ }
1061
+ /** Execute a parameterized variant of the assertion once per changed key for a specific row-specific relationKey. */
1062
+ async executeViolationPerChangedKeys(assertionName, violationSql, analyzed, targetRelationKey, base) {
1063
+ const changedKeyTuples = this.getChangedKeyTuples(base);
1064
+ if (changedKeyTuples.length === 0)
1065
+ return;
1066
+ // Find PK indices for the base table
1067
+ const [schemaName, tableName] = base.split('.');
1068
+ const table = this._findTable(tableName, schemaName);
1069
+ if (!table) {
1070
+ throw new QuereusError(`Assertion references unknown table ${base}`, StatusCode.INTERNAL);
1071
+ }
1072
+ const pkIndices = table.primaryKeyDefinition.map(def => def.index);
1073
+ // Prepare a rewritten plan with an injected Filter on the target relationKey
1074
+ const rewritten = this.injectPkFilter(analyzed, targetRelationKey, base, pkIndices);
1075
+ const optimizedPlan = this.optimizer.optimize(rewritten, this);
1076
+ // Emit and execute for each changed PK tuple; stop on first violation row.
1077
+ const emissionContext = new EmissionContext(this);
1078
+ const rootInstruction = emitPlanNode(optimizedPlan, emissionContext);
1079
+ const scheduler = new Scheduler(rootInstruction);
1080
+ for (const tuple of changedKeyTuples) {
1081
+ const params = {};
1082
+ for (let i = 0; i < pkIndices.length; i++) {
1083
+ params[`pk${i}`] = tuple[i];
1084
+ }
1085
+ const runtimeCtx = {
1086
+ db: this,
1087
+ stmt: undefined,
1088
+ params,
1089
+ context: new Map(),
1090
+ tableContexts: new Map(),
1091
+ tracer: this.instructionTracer,
1092
+ enableMetrics: this.options.getBooleanOption('runtime_stats'),
1093
+ };
1094
+ // Run and detect first output row (violation)
1095
+ const result = await scheduler.run(runtimeCtx);
1096
+ if (isAsyncIterable(result)) {
1097
+ for await (const _ of result) {
1098
+ throw new QuereusError(`Integrity assertion failed: ${assertionName}`, StatusCode.CONSTRAINT);
1099
+ }
1100
+ }
1101
+ }
1102
+ }
1103
+ /** Gather all changed PK tuples for a base table across layers */
1104
+ getChangedKeyTuples(base) {
1105
+ const lower = base.toLowerCase();
1106
+ const tuples = [];
1107
+ const collect = (m) => {
1108
+ const set = m.get(lower);
1109
+ if (!set)
1110
+ return;
1111
+ for (const s of set)
1112
+ tuples.push(JSON.parse(s));
1113
+ };
1114
+ collect(this.changeLog);
1115
+ for (const layer of this.changeLogLayers)
1116
+ collect(layer);
1117
+ return tuples;
1118
+ }
1119
+ /** Inject an equality Filter with named parameters :pk0, :pk1, ... at the earliest reference of targetRelationKey. */
1120
+ injectPkFilter(block, targetRelationKey, base, pkIndices) {
1121
+ const newStatements = block.getChildren().map(stmt => this.rewriteForPkFilter(stmt, targetRelationKey, base, pkIndices));
1122
+ if (newStatements.every((s, i) => s === block.getChildren()[i]))
1123
+ return block;
1124
+ return this.createBlockWithNewStatements(block, newStatements);
1125
+ }
1126
+ rewriteForPkFilter(node, targetRelationKey, base, pkIndices) {
1127
+ // If this node is the target TableReference instance, wrap with a Filter
1128
+ const maybe = this.tryWrapTableReference(node, targetRelationKey, base, pkIndices);
1129
+ if (maybe)
1130
+ return maybe;
1131
+ const originalChildren = node.getChildren();
1132
+ if (!originalChildren || originalChildren.length === 0)
1133
+ return node;
1134
+ const rewrittenChildren = originalChildren.map(child => this.rewriteForPkFilter(child, targetRelationKey, base, pkIndices));
1135
+ const changed = rewrittenChildren.some((c, i) => c !== originalChildren[i]);
1136
+ return changed ? node.withChildren(rewrittenChildren) : node;
1137
+ }
1138
+ tryWrapTableReference(node, targetRelationKey, base, pkIndices) {
1139
+ if (!(node instanceof TableReferenceNode))
1140
+ return null;
1141
+ const tableSchema = node.tableSchema;
1142
+ const schemaName = tableSchema.schemaName;
1143
+ const tableName = tableSchema.name;
1144
+ const relName = `${schemaName}.${tableName}`.toLowerCase();
1145
+ const relKey = `${relName}#${node.id ?? 'unknown'}`;
1146
+ if (relKey !== targetRelationKey)
1147
+ return null;
1148
+ // Build predicate: AND(col_pk_i = :pk{i}) for all PK columns
1149
+ const relational = node;
1150
+ const scope = relational.scope;
1151
+ const attributes = relational.getAttributes();
1152
+ const makeColumnRef = (colIndex) => {
1153
+ const attr = attributes[colIndex];
1154
+ const expr = { type: 'column', name: attr.name, table: tableName, schema: schemaName };
1155
+ return new ColumnReferenceNode(scope, expr, attr.type, attr.id, colIndex);
1156
+ };
1157
+ const makeParamRef = (i, type) => {
1158
+ const pexpr = { type: 'parameter', name: `pk${i}` };
1159
+ return new ParameterReferenceNode(scope, pexpr, `pk${i}`, type);
1160
+ };
1161
+ let predicate = null;
1162
+ for (let i = 0; i < pkIndices.length; i++) {
1163
+ const colIdx = pkIndices[i];
1164
+ const left = makeColumnRef(colIdx);
1165
+ const right = makeParamRef(i, attributes[colIdx].type);
1166
+ const bexpr = { type: 'binary', operator: '=', left: left.expression, right: right.expression };
1167
+ const eqNode = new BinaryOpNode(scope, bexpr, left, right);
1168
+ predicate = predicate
1169
+ ? new BinaryOpNode(scope, { type: 'binary', operator: 'AND', left: predicate.expression, right: eqNode.expression }, predicate, eqNode)
1170
+ : eqNode;
1171
+ }
1172
+ if (!predicate)
1173
+ return null;
1174
+ // Wrap the table reference with a FilterNode
1175
+ return new FilterNode(scope, relational, predicate);
1176
+ }
1177
+ collectTables(node, relToBase, bases) {
1178
+ for (const child of node.getChildren()) {
1179
+ this.collectTables(child, relToBase, bases);
1180
+ }
1181
+ if (node instanceof TableReferenceNode) {
1182
+ const schema = node.tableSchema;
1183
+ const baseName = `${schema.schemaName}.${schema.name}`.toLowerCase();
1184
+ bases.add(baseName);
1185
+ const relKey = `${baseName}#${node.id ?? 'unknown'}`;
1186
+ relToBase.set(relKey, baseName);
1187
+ }
764
1188
  }
765
1189
  /**
766
1190
  * Rollback an implicit transaction and coordinate with virtual table connections
@@ -775,7 +1199,7 @@ export class Database {
775
1199
  }
776
1200
  catch (error) {
777
1201
  errorLog(`Error rolling back transaction on connection ${connection.connectionId}: %O`, error);
778
- // Don't throw here - we want to rollback as many as possible
1202
+ // Continue attempting rollback for other connections.
779
1203
  }
780
1204
  });
781
1205
  await Promise.allSettled(rollbackPromises);
@@ -784,5 +1208,8 @@ export class Database {
784
1208
  this.isAutocommit = true;
785
1209
  this.inImplicitTransaction = false;
786
1210
  }
1211
+ createBlockWithNewStatements(block, statements) {
1212
+ return new BlockNode(block.scope, statements, block.parameters);
1213
+ }
787
1214
  }
788
1215
  //# sourceMappingURL=database.js.map