@quereus/quereus 0.2.1 → 0.4.0

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