@quereus/quereus 0.16.4 → 0.17.1

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 (533) hide show
  1. package/README.md +372 -345
  2. package/dist/src/common/errors.d.ts +2 -18
  3. package/dist/src/common/errors.d.ts.map +1 -1
  4. package/dist/src/common/errors.js +6 -29
  5. package/dist/src/common/errors.js.map +1 -1
  6. package/dist/src/common/types.d.ts +8 -0
  7. package/dist/src/common/types.d.ts.map +1 -1
  8. package/dist/src/common/types.js +20 -0
  9. package/dist/src/common/types.js.map +1 -1
  10. package/dist/src/core/database-assertions.d.ts +19 -2
  11. package/dist/src/core/database-assertions.d.ts.map +1 -1
  12. package/dist/src/core/database-assertions.js +113 -32
  13. package/dist/src/core/database-assertions.js.map +1 -1
  14. package/dist/src/core/database-events.d.ts +17 -0
  15. package/dist/src/core/database-events.d.ts.map +1 -1
  16. package/dist/src/core/database-events.js +39 -2
  17. package/dist/src/core/database-events.js.map +1 -1
  18. package/dist/src/core/database-transaction.d.ts +31 -4
  19. package/dist/src/core/database-transaction.d.ts.map +1 -1
  20. package/dist/src/core/database-transaction.js +68 -2
  21. package/dist/src/core/database-transaction.js.map +1 -1
  22. package/dist/src/core/database.d.ts +17 -4
  23. package/dist/src/core/database.d.ts.map +1 -1
  24. package/dist/src/core/database.js +189 -154
  25. package/dist/src/core/database.js.map +1 -1
  26. package/dist/src/core/statement.d.ts +8 -2
  27. package/dist/src/core/statement.d.ts.map +1 -1
  28. package/dist/src/core/statement.js +54 -71
  29. package/dist/src/core/statement.js.map +1 -1
  30. package/dist/src/emit/ast-stringify.d.ts +1 -0
  31. package/dist/src/emit/ast-stringify.d.ts.map +1 -1
  32. package/dist/src/emit/ast-stringify.js +12 -2
  33. package/dist/src/emit/ast-stringify.js.map +1 -1
  34. package/dist/src/func/builtins/builtin-window-functions.d.ts.map +1 -1
  35. package/dist/src/func/builtins/builtin-window-functions.js +75 -0
  36. package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
  37. package/dist/src/func/builtins/conversion.js +9 -12
  38. package/dist/src/func/builtins/conversion.js.map +1 -1
  39. package/dist/src/func/builtins/datetime.d.ts +21 -0
  40. package/dist/src/func/builtins/datetime.d.ts.map +1 -1
  41. package/dist/src/func/builtins/datetime.js +452 -368
  42. package/dist/src/func/builtins/datetime.js.map +1 -1
  43. package/dist/src/func/builtins/explain.d.ts.map +1 -1
  44. package/dist/src/func/builtins/explain.js +15 -3
  45. package/dist/src/func/builtins/explain.js.map +1 -1
  46. package/dist/src/func/builtins/index.d.ts.map +1 -1
  47. package/dist/src/func/builtins/index.js +5 -12
  48. package/dist/src/func/builtins/index.js.map +1 -1
  49. package/dist/src/func/builtins/json-helpers.js +1 -1
  50. package/dist/src/func/builtins/json-helpers.js.map +1 -1
  51. package/dist/src/func/builtins/json.d.ts.map +1 -1
  52. package/dist/src/func/builtins/json.js +2 -5
  53. package/dist/src/func/builtins/json.js.map +1 -1
  54. package/dist/src/func/builtins/schema.d.ts.map +1 -1
  55. package/dist/src/func/builtins/schema.js +30 -32
  56. package/dist/src/func/builtins/schema.js.map +1 -1
  57. package/dist/src/func/builtins/string.d.ts.map +1 -1
  58. package/dist/src/func/builtins/string.js +40 -64
  59. package/dist/src/func/builtins/string.js.map +1 -1
  60. package/dist/src/func/builtins/timespan.d.ts.map +1 -1
  61. package/dist/src/func/builtins/timespan.js.map +1 -1
  62. package/dist/src/index.d.ts +2 -2
  63. package/dist/src/index.d.ts.map +1 -1
  64. package/dist/src/index.js +2 -2
  65. package/dist/src/index.js.map +1 -1
  66. package/dist/src/parser/ast.d.ts +9 -2
  67. package/dist/src/parser/ast.d.ts.map +1 -1
  68. package/dist/src/parser/lexer.d.ts +1 -0
  69. package/dist/src/parser/lexer.d.ts.map +1 -1
  70. package/dist/src/parser/lexer.js +3 -0
  71. package/dist/src/parser/lexer.js.map +1 -1
  72. package/dist/src/parser/parser.d.ts +11 -1
  73. package/dist/src/parser/parser.d.ts.map +1 -1
  74. package/dist/src/parser/parser.js +75 -135
  75. package/dist/src/parser/parser.js.map +1 -1
  76. package/dist/src/planner/analysis/const-evaluator.d.ts.map +1 -1
  77. package/dist/src/planner/analysis/const-evaluator.js +6 -3
  78. package/dist/src/planner/analysis/const-evaluator.js.map +1 -1
  79. package/dist/src/planner/analysis/constraint-extractor.d.ts +2 -1
  80. package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
  81. package/dist/src/planner/analysis/constraint-extractor.js +154 -22
  82. package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
  83. package/dist/src/planner/building/alter-table.d.ts.map +1 -1
  84. package/dist/src/planner/building/alter-table.js +18 -1
  85. package/dist/src/planner/building/alter-table.js.map +1 -1
  86. package/dist/src/planner/building/analyze.d.ts +5 -0
  87. package/dist/src/planner/building/analyze.d.ts.map +1 -0
  88. package/dist/src/planner/building/analyze.js +5 -0
  89. package/dist/src/planner/building/analyze.js.map +1 -0
  90. package/dist/src/planner/building/block.d.ts.map +1 -1
  91. package/dist/src/planner/building/block.js +3 -0
  92. package/dist/src/planner/building/block.js.map +1 -1
  93. package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
  94. package/dist/src/planner/building/constraint-builder.js +25 -3
  95. package/dist/src/planner/building/constraint-builder.js.map +1 -1
  96. package/dist/src/planner/building/delete.d.ts.map +1 -1
  97. package/dist/src/planner/building/delete.js +11 -0
  98. package/dist/src/planner/building/delete.js.map +1 -1
  99. package/dist/src/planner/building/drop-assertion.d.ts.map +1 -1
  100. package/dist/src/planner/building/drop-assertion.js +2 -1
  101. package/dist/src/planner/building/drop-assertion.js.map +1 -1
  102. package/dist/src/planner/building/expression.d.ts.map +1 -1
  103. package/dist/src/planner/building/expression.js +55 -7
  104. package/dist/src/planner/building/expression.js.map +1 -1
  105. package/dist/src/planner/building/foreign-key-builder.d.ts +16 -0
  106. package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -0
  107. package/dist/src/planner/building/foreign-key-builder.js +269 -0
  108. package/dist/src/planner/building/foreign-key-builder.js.map +1 -0
  109. package/dist/src/planner/building/function-call.d.ts.map +1 -1
  110. package/dist/src/planner/building/function-call.js +3 -2
  111. package/dist/src/planner/building/function-call.js.map +1 -1
  112. package/dist/src/planner/building/insert.d.ts.map +1 -1
  113. package/dist/src/planner/building/insert.js +91 -10
  114. package/dist/src/planner/building/insert.js.map +1 -1
  115. package/dist/src/planner/building/schema-resolution.d.ts +4 -0
  116. package/dist/src/planner/building/schema-resolution.d.ts.map +1 -1
  117. package/dist/src/planner/building/schema-resolution.js +14 -3
  118. package/dist/src/planner/building/schema-resolution.js.map +1 -1
  119. package/dist/src/planner/building/select-aggregates.d.ts +1 -0
  120. package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
  121. package/dist/src/planner/building/select-aggregates.js +118 -3
  122. package/dist/src/planner/building/select-aggregates.js.map +1 -1
  123. package/dist/src/planner/building/select-modifiers.js +3 -3
  124. package/dist/src/planner/building/select-modifiers.js.map +1 -1
  125. package/dist/src/planner/building/select-window.js +9 -8
  126. package/dist/src/planner/building/select-window.js.map +1 -1
  127. package/dist/src/planner/building/select.d.ts.map +1 -1
  128. package/dist/src/planner/building/select.js +21 -10
  129. package/dist/src/planner/building/select.js.map +1 -1
  130. package/dist/src/planner/building/table.d.ts.map +1 -1
  131. package/dist/src/planner/building/table.js +5 -3
  132. package/dist/src/planner/building/table.js.map +1 -1
  133. package/dist/src/planner/building/update.d.ts.map +1 -1
  134. package/dist/src/planner/building/update.js +30 -1
  135. package/dist/src/planner/building/update.js.map +1 -1
  136. package/dist/src/planner/building/with.js +1 -1
  137. package/dist/src/planner/building/with.js.map +1 -1
  138. package/dist/src/planner/cache/reference-graph.d.ts +1 -1
  139. package/dist/src/planner/cache/reference-graph.js +1 -1
  140. package/dist/src/planner/cost/index.d.ts +10 -3
  141. package/dist/src/planner/cost/index.d.ts.map +1 -1
  142. package/dist/src/planner/cost/index.js +17 -3
  143. package/dist/src/planner/cost/index.js.map +1 -1
  144. package/dist/src/planner/debug.js +1 -1
  145. package/dist/src/planner/debug.js.map +1 -1
  146. package/dist/src/planner/framework/characteristics.d.ts +1 -1
  147. package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
  148. package/dist/src/planner/framework/pass.d.ts +3 -1
  149. package/dist/src/planner/framework/pass.d.ts.map +1 -1
  150. package/dist/src/planner/framework/pass.js +62 -18
  151. package/dist/src/planner/framework/pass.js.map +1 -1
  152. package/dist/src/planner/framework/physical-utils.d.ts +5 -0
  153. package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
  154. package/dist/src/planner/framework/physical-utils.js +19 -0
  155. package/dist/src/planner/framework/physical-utils.js.map +1 -1
  156. package/dist/src/planner/framework/trace.d.ts.map +1 -1
  157. package/dist/src/planner/framework/trace.js +3 -2
  158. package/dist/src/planner/framework/trace.js.map +1 -1
  159. package/dist/src/planner/nodes/alias-node.d.ts +2 -1
  160. package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
  161. package/dist/src/planner/nodes/alias-node.js +8 -0
  162. package/dist/src/planner/nodes/alias-node.js.map +1 -1
  163. package/dist/src/planner/nodes/alter-table-node.d.ts +42 -0
  164. package/dist/src/planner/nodes/alter-table-node.d.ts.map +1 -0
  165. package/dist/src/planner/nodes/alter-table-node.js +55 -0
  166. package/dist/src/planner/nodes/alter-table-node.js.map +1 -0
  167. package/dist/src/planner/nodes/analyze-node.d.ts +25 -0
  168. package/dist/src/planner/nodes/analyze-node.d.ts.map +1 -0
  169. package/dist/src/planner/nodes/analyze-node.js +83 -0
  170. package/dist/src/planner/nodes/analyze-node.js.map +1 -0
  171. package/dist/src/planner/nodes/bloom-join-node.d.ts +66 -0
  172. package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -0
  173. package/dist/src/planner/nodes/bloom-join-node.js +200 -0
  174. package/dist/src/planner/nodes/bloom-join-node.js.map +1 -0
  175. package/dist/src/planner/nodes/constraint-check-node.d.ts +1 -1
  176. package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
  177. package/dist/src/planner/nodes/cte-reference-node.js +7 -7
  178. package/dist/src/planner/nodes/cte-reference-node.js.map +1 -1
  179. package/dist/src/planner/nodes/join-node.d.ts +9 -1
  180. package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
  181. package/dist/src/planner/nodes/join-node.js +69 -79
  182. package/dist/src/planner/nodes/join-node.js.map +1 -1
  183. package/dist/src/planner/nodes/merge-join-node.d.ts +60 -0
  184. package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -0
  185. package/dist/src/planner/nodes/merge-join-node.js +207 -0
  186. package/dist/src/planner/nodes/merge-join-node.js.map +1 -0
  187. package/dist/src/planner/nodes/plan-node-type.d.ts +1 -0
  188. package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
  189. package/dist/src/planner/nodes/plan-node-type.js +1 -0
  190. package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
  191. package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
  192. package/dist/src/planner/nodes/project-node.js +3 -2
  193. package/dist/src/planner/nodes/project-node.js.map +1 -1
  194. package/dist/src/planner/nodes/reference.d.ts +2 -1
  195. package/dist/src/planner/nodes/reference.d.ts.map +1 -1
  196. package/dist/src/planner/nodes/reference.js +6 -2
  197. package/dist/src/planner/nodes/reference.js.map +1 -1
  198. package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
  199. package/dist/src/planner/nodes/returning-node.js +3 -2
  200. package/dist/src/planner/nodes/returning-node.js.map +1 -1
  201. package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
  202. package/dist/src/planner/nodes/subquery.js.map +1 -1
  203. package/dist/src/planner/nodes/table-access-nodes.js +1 -1
  204. package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
  205. package/dist/src/planner/nodes/update-node.d.ts +2 -0
  206. package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
  207. package/dist/src/planner/nodes/update-node.js +2 -1
  208. package/dist/src/planner/nodes/update-node.js.map +1 -1
  209. package/dist/src/planner/nodes/window-function.d.ts.map +1 -1
  210. package/dist/src/planner/nodes/window-function.js +7 -7
  211. package/dist/src/planner/nodes/window-function.js.map +1 -1
  212. package/dist/src/planner/nodes/window-node.d.ts +2 -2
  213. package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
  214. package/dist/src/planner/nodes/window-node.js +9 -14
  215. package/dist/src/planner/nodes/window-node.js.map +1 -1
  216. package/dist/src/planner/optimizer.d.ts.map +1 -1
  217. package/dist/src/planner/optimizer.js +40 -2
  218. package/dist/src/planner/optimizer.js.map +1 -1
  219. package/dist/src/planner/planning-context.d.ts.map +1 -1
  220. package/dist/src/planner/planning-context.js +1 -6
  221. package/dist/src/planner/planning-context.js.map +1 -1
  222. package/dist/src/planner/resolve.d.ts.map +1 -1
  223. package/dist/src/planner/resolve.js.map +1 -1
  224. package/dist/src/planner/rules/access/rule-select-access-path.js +157 -28
  225. package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
  226. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts.map +1 -1
  227. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js +27 -6
  228. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
  229. package/dist/src/planner/rules/cache/rule-in-subquery-cache.d.ts +19 -0
  230. package/dist/src/planner/rules/cache/rule-in-subquery-cache.d.ts.map +1 -0
  231. package/dist/src/planner/rules/cache/rule-in-subquery-cache.js +53 -0
  232. package/dist/src/planner/rules/cache/rule-in-subquery-cache.js.map +1 -0
  233. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.d.ts.map +1 -1
  234. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js +5 -0
  235. package/dist/src/planner/rules/cache/rule-mutating-subquery-cache.js.map +1 -1
  236. package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts +18 -0
  237. package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts.map +1 -0
  238. package/dist/src/planner/rules/distinct/rule-distinct-elimination.js +37 -0
  239. package/dist/src/planner/rules/distinct/rule-distinct-elimination.js.map +1 -0
  240. package/dist/src/planner/rules/join/rule-join-key-inference.d.ts +8 -3
  241. package/dist/src/planner/rules/join/rule-join-key-inference.d.ts.map +1 -1
  242. package/dist/src/planner/rules/join/rule-join-key-inference.js +28 -17
  243. package/dist/src/planner/rules/join/rule-join-key-inference.js.map +1 -1
  244. package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts +16 -0
  245. package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -0
  246. package/dist/src/planner/rules/join/rule-join-physical-selection.js +216 -0
  247. package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -0
  248. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -1
  249. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +34 -4
  250. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
  251. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts +23 -0
  252. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -0
  253. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +293 -0
  254. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -0
  255. package/dist/src/planner/scopes/multi.d.ts +3 -2
  256. package/dist/src/planner/scopes/multi.d.ts.map +1 -1
  257. package/dist/src/planner/scopes/multi.js +32 -7
  258. package/dist/src/planner/scopes/multi.js.map +1 -1
  259. package/dist/src/planner/scopes/shadow.d.ts +20 -0
  260. package/dist/src/planner/scopes/shadow.d.ts.map +1 -0
  261. package/dist/src/planner/scopes/shadow.js +31 -0
  262. package/dist/src/planner/scopes/shadow.js.map +1 -0
  263. package/dist/src/planner/stats/analyze.d.ts +17 -0
  264. package/dist/src/planner/stats/analyze.d.ts.map +1 -0
  265. package/dist/src/planner/stats/analyze.js +114 -0
  266. package/dist/src/planner/stats/analyze.js.map +1 -0
  267. package/dist/src/planner/stats/catalog-stats.d.ts +80 -0
  268. package/dist/src/planner/stats/catalog-stats.d.ts.map +1 -0
  269. package/dist/src/planner/stats/catalog-stats.js +248 -0
  270. package/dist/src/planner/stats/catalog-stats.js.map +1 -0
  271. package/dist/src/planner/stats/histogram.d.ts +24 -0
  272. package/dist/src/planner/stats/histogram.d.ts.map +1 -0
  273. package/dist/src/planner/stats/histogram.js +142 -0
  274. package/dist/src/planner/stats/histogram.js.map +1 -0
  275. package/dist/src/planner/type-utils.d.ts.map +1 -1
  276. package/dist/src/planner/type-utils.js +8 -2
  277. package/dist/src/planner/type-utils.js.map +1 -1
  278. package/dist/src/planner/util/key-utils.d.ts +48 -2
  279. package/dist/src/planner/util/key-utils.d.ts.map +1 -1
  280. package/dist/src/planner/util/key-utils.js +123 -0
  281. package/dist/src/planner/util/key-utils.js.map +1 -1
  282. package/dist/src/planner/validation/determinism-validator.d.ts +9 -0
  283. package/dist/src/planner/validation/determinism-validator.d.ts.map +1 -1
  284. package/dist/src/planner/validation/determinism-validator.js +11 -0
  285. package/dist/src/planner/validation/determinism-validator.js.map +1 -1
  286. package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
  287. package/dist/src/planner/validation/plan-validator.js +1 -0
  288. package/dist/src/planner/validation/plan-validator.js.map +1 -1
  289. package/dist/src/runtime/context-helpers.d.ts +34 -10
  290. package/dist/src/runtime/context-helpers.d.ts.map +1 -1
  291. package/dist/src/runtime/context-helpers.js +115 -39
  292. package/dist/src/runtime/context-helpers.js.map +1 -1
  293. package/dist/src/runtime/deferred-constraint-queue.d.ts +0 -1
  294. package/dist/src/runtime/deferred-constraint-queue.d.ts.map +1 -1
  295. package/dist/src/runtime/deferred-constraint-queue.js +10 -23
  296. package/dist/src/runtime/deferred-constraint-queue.js.map +1 -1
  297. package/dist/src/runtime/descriptor-helpers.d.ts +7 -0
  298. package/dist/src/runtime/descriptor-helpers.d.ts.map +1 -0
  299. package/dist/src/runtime/descriptor-helpers.js +24 -0
  300. package/dist/src/runtime/descriptor-helpers.js.map +1 -0
  301. package/dist/src/runtime/emission-context.d.ts +7 -1
  302. package/dist/src/runtime/emission-context.d.ts.map +1 -1
  303. package/dist/src/runtime/emission-context.js +16 -0
  304. package/dist/src/runtime/emission-context.js.map +1 -1
  305. package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
  306. package/dist/src/runtime/emit/aggregate.js +97 -93
  307. package/dist/src/runtime/emit/aggregate.js.map +1 -1
  308. package/dist/src/runtime/emit/alter-table.d.ts +5 -0
  309. package/dist/src/runtime/emit/alter-table.d.ts.map +1 -0
  310. package/dist/src/runtime/emit/alter-table.js +209 -0
  311. package/dist/src/runtime/emit/alter-table.js.map +1 -0
  312. package/dist/src/runtime/emit/analyze.d.ts +9 -0
  313. package/dist/src/runtime/emit/analyze.d.ts.map +1 -0
  314. package/dist/src/runtime/emit/analyze.js +72 -0
  315. package/dist/src/runtime/emit/analyze.js.map +1 -0
  316. package/dist/src/runtime/emit/array-index.d.ts.map +1 -1
  317. package/dist/src/runtime/emit/array-index.js +4 -2
  318. package/dist/src/runtime/emit/array-index.js.map +1 -1
  319. package/dist/src/runtime/emit/between.d.ts.map +1 -1
  320. package/dist/src/runtime/emit/between.js +8 -20
  321. package/dist/src/runtime/emit/between.js.map +1 -1
  322. package/dist/src/runtime/emit/binary.d.ts.map +1 -1
  323. package/dist/src/runtime/emit/binary.js +155 -126
  324. package/dist/src/runtime/emit/binary.js.map +1 -1
  325. package/dist/src/runtime/emit/bloom-join.d.ts +12 -0
  326. package/dist/src/runtime/emit/bloom-join.d.ts.map +1 -0
  327. package/dist/src/runtime/emit/bloom-join.js +114 -0
  328. package/dist/src/runtime/emit/bloom-join.js.map +1 -0
  329. package/dist/src/runtime/emit/cache.js +2 -2
  330. package/dist/src/runtime/emit/cache.js.map +1 -1
  331. package/dist/src/runtime/emit/cast.d.ts.map +1 -1
  332. package/dist/src/runtime/emit/cast.js +31 -117
  333. package/dist/src/runtime/emit/cast.js.map +1 -1
  334. package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
  335. package/dist/src/runtime/emit/constraint-check.js +2 -24
  336. package/dist/src/runtime/emit/constraint-check.js.map +1 -1
  337. package/dist/src/runtime/emit/cte-reference.d.ts.map +1 -1
  338. package/dist/src/runtime/emit/cte-reference.js +11 -5
  339. package/dist/src/runtime/emit/cte-reference.js.map +1 -1
  340. package/dist/src/runtime/emit/distinct.d.ts.map +1 -1
  341. package/dist/src/runtime/emit/distinct.js +21 -12
  342. package/dist/src/runtime/emit/distinct.js.map +1 -1
  343. package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
  344. package/dist/src/runtime/emit/dml-executor.js +5 -1
  345. package/dist/src/runtime/emit/dml-executor.js.map +1 -1
  346. package/dist/src/runtime/emit/drop-assertion.d.ts.map +1 -1
  347. package/dist/src/runtime/emit/drop-assertion.js +2 -0
  348. package/dist/src/runtime/emit/drop-assertion.js.map +1 -1
  349. package/dist/src/runtime/emit/filter.d.ts.map +1 -1
  350. package/dist/src/runtime/emit/filter.js +26 -7
  351. package/dist/src/runtime/emit/filter.js.map +1 -1
  352. package/dist/src/runtime/emit/internal-recursive-cte-ref.d.ts.map +1 -1
  353. package/dist/src/runtime/emit/internal-recursive-cte-ref.js +11 -5
  354. package/dist/src/runtime/emit/internal-recursive-cte-ref.js.map +1 -1
  355. package/dist/src/runtime/emit/join.d.ts +1 -1
  356. package/dist/src/runtime/emit/join.d.ts.map +1 -1
  357. package/dist/src/runtime/emit/join.js +44 -33
  358. package/dist/src/runtime/emit/join.js.map +1 -1
  359. package/dist/src/runtime/emit/merge-join.d.ts +14 -0
  360. package/dist/src/runtime/emit/merge-join.d.ts.map +1 -0
  361. package/dist/src/runtime/emit/merge-join.js +152 -0
  362. package/dist/src/runtime/emit/merge-join.js.map +1 -0
  363. package/dist/src/runtime/emit/parameter.d.ts.map +1 -1
  364. package/dist/src/runtime/emit/parameter.js +10 -32
  365. package/dist/src/runtime/emit/parameter.js.map +1 -1
  366. package/dist/src/runtime/emit/project.d.ts.map +1 -1
  367. package/dist/src/runtime/emit/project.js +22 -12
  368. package/dist/src/runtime/emit/project.js.map +1 -1
  369. package/dist/src/runtime/emit/recursive-cte.d.ts.map +1 -1
  370. package/dist/src/runtime/emit/recursive-cte.js +5 -9
  371. package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
  372. package/dist/src/runtime/emit/returning.d.ts.map +1 -1
  373. package/dist/src/runtime/emit/returning.js +14 -8
  374. package/dist/src/runtime/emit/returning.js.map +1 -1
  375. package/dist/src/runtime/emit/scan.d.ts.map +1 -1
  376. package/dist/src/runtime/emit/scan.js +4 -1
  377. package/dist/src/runtime/emit/scan.js.map +1 -1
  378. package/dist/src/runtime/emit/set-operation.d.ts.map +1 -1
  379. package/dist/src/runtime/emit/set-operation.js +8 -5
  380. package/dist/src/runtime/emit/set-operation.js.map +1 -1
  381. package/dist/src/runtime/emit/sort.js +2 -2
  382. package/dist/src/runtime/emit/sort.js.map +1 -1
  383. package/dist/src/runtime/emit/subquery.js +2 -2
  384. package/dist/src/runtime/emit/subquery.js.map +1 -1
  385. package/dist/src/runtime/emit/table-valued-function.d.ts.map +1 -1
  386. package/dist/src/runtime/emit/table-valued-function.js +21 -7
  387. package/dist/src/runtime/emit/table-valued-function.js.map +1 -1
  388. package/dist/src/runtime/emit/transaction.d.ts.map +1 -1
  389. package/dist/src/runtime/emit/transaction.js +18 -46
  390. package/dist/src/runtime/emit/transaction.js.map +1 -1
  391. package/dist/src/runtime/emit/unary.js +2 -2
  392. package/dist/src/runtime/emit/unary.js.map +1 -1
  393. package/dist/src/runtime/emit/update.d.ts.map +1 -1
  394. package/dist/src/runtime/emit/update.js +43 -21
  395. package/dist/src/runtime/emit/update.js.map +1 -1
  396. package/dist/src/runtime/emit/window.d.ts.map +1 -1
  397. package/dist/src/runtime/emit/window.js +368 -126
  398. package/dist/src/runtime/emit/window.js.map +1 -1
  399. package/dist/src/runtime/foreign-key-actions.d.ts +15 -0
  400. package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -0
  401. package/dist/src/runtime/foreign-key-actions.js +109 -0
  402. package/dist/src/runtime/foreign-key-actions.js.map +1 -0
  403. package/dist/src/runtime/register.d.ts.map +1 -1
  404. package/dist/src/runtime/register.js +8 -0
  405. package/dist/src/runtime/register.js.map +1 -1
  406. package/dist/src/runtime/scheduler.d.ts.map +1 -1
  407. package/dist/src/runtime/scheduler.js +4 -1
  408. package/dist/src/runtime/scheduler.js.map +1 -1
  409. package/dist/src/runtime/types.d.ts +6 -5
  410. package/dist/src/runtime/types.d.ts.map +1 -1
  411. package/dist/src/runtime/types.js.map +1 -1
  412. package/dist/src/schema/change-events.d.ts +36 -8
  413. package/dist/src/schema/change-events.d.ts.map +1 -1
  414. package/dist/src/schema/change-events.js.map +1 -1
  415. package/dist/src/schema/column.d.ts +5 -1
  416. package/dist/src/schema/column.d.ts.map +1 -1
  417. package/dist/src/schema/column.js +1 -2
  418. package/dist/src/schema/column.js.map +1 -1
  419. package/dist/src/schema/manager.d.ts +54 -4
  420. package/dist/src/schema/manager.d.ts.map +1 -1
  421. package/dist/src/schema/manager.js +353 -313
  422. package/dist/src/schema/manager.js.map +1 -1
  423. package/dist/src/schema/schema-differ.js +3 -3
  424. package/dist/src/schema/schema-differ.js.map +1 -1
  425. package/dist/src/schema/schema.d.ts +1 -1
  426. package/dist/src/schema/schema.js +2 -2
  427. package/dist/src/schema/schema.js.map +1 -1
  428. package/dist/src/schema/table.d.ts +49 -0
  429. package/dist/src/schema/table.d.ts.map +1 -1
  430. package/dist/src/schema/table.js +30 -11
  431. package/dist/src/schema/table.js.map +1 -1
  432. package/dist/src/types/builtin-types.d.ts.map +1 -1
  433. package/dist/src/types/builtin-types.js +26 -95
  434. package/dist/src/types/builtin-types.js.map +1 -1
  435. package/dist/src/types/index.d.ts +1 -1
  436. package/dist/src/types/index.d.ts.map +1 -1
  437. package/dist/src/types/index.js +1 -1
  438. package/dist/src/types/index.js.map +1 -1
  439. package/dist/src/types/json-type.d.ts.map +1 -1
  440. package/dist/src/types/json-type.js +28 -40
  441. package/dist/src/types/json-type.js.map +1 -1
  442. package/dist/src/types/logical-type.d.ts +6 -0
  443. package/dist/src/types/logical-type.d.ts.map +1 -1
  444. package/dist/src/types/logical-type.js +12 -0
  445. package/dist/src/types/logical-type.js.map +1 -1
  446. package/dist/src/types/temporal-types.d.ts.map +1 -1
  447. package/dist/src/types/temporal-types.js +8 -37
  448. package/dist/src/types/temporal-types.js.map +1 -1
  449. package/dist/src/util/async-iterator.d.ts +30 -0
  450. package/dist/src/util/async-iterator.d.ts.map +1 -0
  451. package/dist/src/util/async-iterator.js +101 -0
  452. package/dist/src/util/async-iterator.js.map +1 -0
  453. package/dist/src/util/coercion.d.ts +4 -5
  454. package/dist/src/util/coercion.d.ts.map +1 -1
  455. package/dist/src/util/coercion.js +10 -14
  456. package/dist/src/util/coercion.js.map +1 -1
  457. package/dist/src/util/comparison.d.ts +34 -21
  458. package/dist/src/util/comparison.d.ts.map +1 -1
  459. package/dist/src/util/comparison.js +77 -43
  460. package/dist/src/util/comparison.js.map +1 -1
  461. package/dist/src/util/environment.d.ts +0 -8
  462. package/dist/src/util/environment.d.ts.map +1 -1
  463. package/dist/src/util/environment.js +0 -12
  464. package/dist/src/util/environment.js.map +1 -1
  465. package/dist/src/util/key-serializer.d.ts +33 -0
  466. package/dist/src/util/key-serializer.d.ts.map +1 -0
  467. package/dist/src/util/key-serializer.js +95 -0
  468. package/dist/src/util/key-serializer.js.map +1 -0
  469. package/dist/src/util/plugin-helper.d.ts.map +1 -1
  470. package/dist/src/util/plugin-helper.js +21 -45
  471. package/dist/src/util/plugin-helper.js.map +1 -1
  472. package/dist/src/util/serialization.d.ts +1 -0
  473. package/dist/src/util/serialization.d.ts.map +1 -1
  474. package/dist/src/util/serialization.js +8 -1
  475. package/dist/src/util/serialization.js.map +1 -1
  476. package/dist/src/util/working-table-iterable.d.ts +6 -5
  477. package/dist/src/util/working-table-iterable.d.ts.map +1 -1
  478. package/dist/src/util/working-table-iterable.js +8 -15
  479. package/dist/src/util/working-table-iterable.js.map +1 -1
  480. package/dist/src/vtab/best-access-plan.d.ts +12 -0
  481. package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
  482. package/dist/src/vtab/best-access-plan.js +22 -0
  483. package/dist/src/vtab/best-access-plan.js.map +1 -1
  484. package/dist/src/vtab/events.d.ts.map +1 -1
  485. package/dist/src/vtab/events.js +6 -3
  486. package/dist/src/vtab/events.js.map +1 -1
  487. package/dist/src/vtab/manifest.d.ts +3 -1
  488. package/dist/src/vtab/manifest.d.ts.map +1 -1
  489. package/dist/src/vtab/memory/index.d.ts +2 -2
  490. package/dist/src/vtab/memory/index.d.ts.map +1 -1
  491. package/dist/src/vtab/memory/index.js +4 -7
  492. package/dist/src/vtab/memory/index.js.map +1 -1
  493. package/dist/src/vtab/memory/layer/base-cursor.d.ts.map +1 -1
  494. package/dist/src/vtab/memory/layer/base-cursor.js +37 -9
  495. package/dist/src/vtab/memory/layer/base-cursor.js.map +1 -1
  496. package/dist/src/vtab/memory/layer/base.js +1 -1
  497. package/dist/src/vtab/memory/layer/base.js.map +1 -1
  498. package/dist/src/vtab/memory/layer/connection.d.ts +11 -7
  499. package/dist/src/vtab/memory/layer/connection.d.ts.map +1 -1
  500. package/dist/src/vtab/memory/layer/connection.js +32 -44
  501. package/dist/src/vtab/memory/layer/connection.js.map +1 -1
  502. package/dist/src/vtab/memory/layer/manager.d.ts +15 -3
  503. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  504. package/dist/src/vtab/memory/layer/manager.js +85 -37
  505. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  506. package/dist/src/vtab/memory/layer/scan-plan.d.ts +2 -0
  507. package/dist/src/vtab/memory/layer/scan-plan.d.ts.map +1 -1
  508. package/dist/src/vtab/memory/layer/scan-plan.js +153 -78
  509. package/dist/src/vtab/memory/layer/scan-plan.js.map +1 -1
  510. package/dist/src/vtab/memory/layer/transaction-cursor.d.ts.map +1 -1
  511. package/dist/src/vtab/memory/layer/transaction-cursor.js +39 -9
  512. package/dist/src/vtab/memory/layer/transaction-cursor.js.map +1 -1
  513. package/dist/src/vtab/memory/layer/transaction.d.ts +1 -0
  514. package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
  515. package/dist/src/vtab/memory/layer/transaction.js +6 -20
  516. package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
  517. package/dist/src/vtab/memory/module.d.ts +14 -24
  518. package/dist/src/vtab/memory/module.d.ts.map +1 -1
  519. package/dist/src/vtab/memory/module.js +88 -283
  520. package/dist/src/vtab/memory/module.js.map +1 -1
  521. package/dist/src/vtab/memory/table.d.ts +9 -0
  522. package/dist/src/vtab/memory/table.d.ts.map +1 -1
  523. package/dist/src/vtab/memory/table.js +121 -18
  524. package/dist/src/vtab/memory/table.js.map +1 -1
  525. package/dist/src/vtab/memory/types.d.ts +1 -0
  526. package/dist/src/vtab/memory/types.d.ts.map +1 -1
  527. package/dist/src/vtab/memory/utils/primary-key.js.map +1 -1
  528. package/dist/src/vtab/module.d.ts +13 -0
  529. package/dist/src/vtab/module.d.ts.map +1 -1
  530. package/dist/src/vtab/table.d.ts +9 -0
  531. package/dist/src/vtab/table.d.ts.map +1 -1
  532. package/dist/src/vtab/table.js.map +1 -1
  533. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  import { createLogger } from '../common/logger.js';
2
- import { MisuseError, quereusError, QuereusError } from '../common/errors.js';
2
+ import { MisuseError, QuereusError } from '../common/errors.js';
3
3
  import { StatusCode } from '../common/types.js';
4
4
  import { Statement } from './statement.js';
5
5
  import { SchemaManager } from '../schema/manager.js';
@@ -7,11 +7,12 @@ import { BUILTIN_FUNCTIONS } from '../func/builtins/index.js';
7
7
  import { createScalarFunction, createAggregateFunction } from '../func/registration.js';
8
8
  import { FunctionFlags } from '../common/constants.js';
9
9
  import { MemoryTableModule } from '../vtab/memory/module.js';
10
- import { BINARY_COLLATION, getCollation, NOCASE_COLLATION, registerCollation, RTRIM_COLLATION } from '../util/comparison.js';
11
- import { Parser, ParseError } from '../parser/parser.js';
10
+ import { BINARY_COLLATION, NOCASE_COLLATION, RTRIM_COLLATION } from '../util/comparison.js';
11
+ import { Parser } 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 { RowContextMap } from '../runtime/context-helpers.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';
@@ -23,13 +24,35 @@ import { registerBuiltinWindowFunctions } from '../func/builtins/builtin-window-
23
24
  import { DatabaseOptionsManager } from './database-options.js';
24
25
  import { DeclaredSchemaManager } from '../schema/declared-schema-manager.js';
25
26
  import { DeferredConstraintQueue } from '../runtime/deferred-constraint-queue.js';
27
+ import { registerType as registerTypeInRegistry } from '../types/registry.js';
26
28
  import { getParameterTypes } from './param.js';
27
29
  import { rowToObject } from './utils.js';
30
+ import { wrapAsyncIterator } from '../util/async-iterator.js';
28
31
  import { DatabaseEventEmitter, } from './database-events.js';
29
32
  import { TransactionManager } from './database-transaction.js';
30
33
  import { AssertionEvaluator } from './database-assertions.js';
31
34
  const log = createLogger('core:database');
32
35
  const errorLog = log.extend('error');
36
+ /** Parse a comma-separated schema path string into an array of trimmed, non-empty names. */
37
+ function parseSchemaPath(pathString) {
38
+ if (!pathString)
39
+ return undefined;
40
+ const parts = pathString.split(',').map(s => s.trim()).filter(s => s.length > 0);
41
+ return parts.length > 0 ? parts : undefined;
42
+ }
43
+ /** Extract a VTableEventEmitter from a module if it supports one. */
44
+ function tryGetEventEmitter(module) {
45
+ const asSource = module;
46
+ if (typeof asSource.getEventEmitter !== 'function')
47
+ return undefined;
48
+ const emitter = asSource.getEventEmitter();
49
+ if (!emitter || typeof emitter !== 'object')
50
+ return undefined;
51
+ const typed = emitter;
52
+ if (typeof typed.onDataChange !== 'function' && typeof typed.onSchemaChange !== 'function')
53
+ return undefined;
54
+ return emitter;
55
+ }
33
56
  /**
34
57
  * Represents a connection to an Quereus database (in-memory in this port).
35
58
  * Manages schema, prepared statements, virtual tables, and functions.
@@ -57,6 +80,8 @@ export class Database {
57
80
  transactionManager;
58
81
  /** Assertion evaluation */
59
82
  assertionEvaluator;
83
+ /** Per-database collation registry */
84
+ collations = new Map();
60
85
  constructor() {
61
86
  this.schemaManager = new SchemaManager(this);
62
87
  this.declaredSchemaManager = new DeclaredSchemaManager();
@@ -64,11 +89,6 @@ export class Database {
64
89
  log("Database instance created.");
65
90
  // Register built-in functions
66
91
  this.registerBuiltinFunctions();
67
- // Register default virtual table modules via SchemaManager
68
- // The SchemaManager.defaultVTabModuleName is already initialized (e.g. to 'memory')
69
- // No need to set defaultVtabModuleName explicitly here unless it's different from SchemaManager's init value.
70
- // this.schemaManager.setDefaultVTabModuleName('memory'); // Already 'memory' by default in SchemaManager
71
- // this.schemaManager.setDefaultVTabArgs([]); // Already [] by default in SchemaManager
72
92
  this.schemaManager.registerModule('memory', new MemoryTableModule());
73
93
  // Register built-in collations
74
94
  this.registerDefaultCollations();
@@ -176,6 +196,12 @@ export class Database {
176
196
  defaultValue: false,
177
197
  description: 'Enable plan stack tracing',
178
198
  });
199
+ this.options.registerOption('foreign_keys', {
200
+ type: 'boolean',
201
+ defaultValue: false,
202
+ aliases: ['fk_enforcement'],
203
+ description: 'Enable foreign key constraint enforcement (default off for backwards compatibility)',
204
+ });
179
205
  }
180
206
  /** @internal Registers default built-in SQL functions */
181
207
  registerBuiltinFunctions() {
@@ -192,10 +218,10 @@ export class Database {
192
218
  }
193
219
  /** @internal Registers default collation sequences */
194
220
  registerDefaultCollations() {
195
- // Register the built-in collations
196
- registerCollation('BINARY', BINARY_COLLATION);
197
- registerCollation('NOCASE', NOCASE_COLLATION);
198
- registerCollation('RTRIM', RTRIM_COLLATION);
221
+ // Register the built-in collations into per-instance registry
222
+ this.collations.set('BINARY', BINARY_COLLATION);
223
+ this.collations.set('NOCASE', NOCASE_COLLATION);
224
+ this.collations.set('RTRIM', RTRIM_COLLATION);
199
225
  log("Default collations registered (BINARY, NOCASE, RTRIM)");
200
226
  }
201
227
  /**
@@ -341,6 +367,21 @@ export class Database {
341
367
  _isImplicitTransaction() {
342
368
  return this.transactionManager.isImplicitTransaction();
343
369
  }
370
+ /**
371
+ * Commits or rolls back an implicit transaction based on success.
372
+ * No-op if no implicit transaction is active.
373
+ * @internal
374
+ */
375
+ async _finalizeImplicitTransaction(success) {
376
+ if (this.transactionManager.isImplicitTransaction()) {
377
+ if (success) {
378
+ await this._commitTransaction();
379
+ }
380
+ else {
381
+ await this._rollbackTransaction();
382
+ }
383
+ }
384
+ }
344
385
  /**
345
386
  * Upgrades an implicit transaction to explicit.
346
387
  * @internal
@@ -354,18 +395,26 @@ export class Database {
354
395
  * Used as the innermost execution primitive.
355
396
  */
356
397
  async _executeSingleStatement(statementAst, params) {
357
- const plan = this._buildPlan([statementAst], params);
398
+ const { plan } = this._buildPlan([statementAst], params);
358
399
  if (plan.statements.length === 0)
359
400
  return; // No-op for this AST
360
401
  const optimizedPlan = this.optimizer.optimize(plan, this);
361
402
  const emissionContext = new EmissionContext(this);
362
403
  const rootInstruction = emitPlanNode(optimizedPlan, emissionContext);
363
404
  const scheduler = new Scheduler(rootInstruction);
405
+ // Normalize array params to a record keyed by 1-based index, matching Statement.bindAll
406
+ let boundArgs = {};
407
+ if (Array.isArray(params)) {
408
+ params.forEach((value, index) => { boundArgs[index + 1] = value; });
409
+ }
410
+ else if (params) {
411
+ boundArgs = { ...params };
412
+ }
364
413
  const runtimeCtx = {
365
414
  db: this,
366
415
  stmt: undefined,
367
- params: params ?? {},
368
- context: new Map(),
416
+ params: boundArgs,
417
+ context: new RowContextMap(),
369
418
  tableContexts: new Map(),
370
419
  tracer: this.instructionTracer,
371
420
  enableMetrics: this.options.getBooleanOption('runtime_stats'),
@@ -386,15 +435,7 @@ export class Database {
386
435
  * Parses SQL into a statement batch.
387
436
  */
388
437
  _parseSql(sql) {
389
- const parser = new Parser();
390
- try {
391
- return parser.parseAll(sql);
392
- }
393
- catch (e) {
394
- if (e instanceof ParseError)
395
- throw new QuereusError(`Parse error: ${e.message}`, StatusCode.ERROR, e);
396
- throw e;
397
- }
438
+ return new Parser().parseAll(sql);
398
439
  }
399
440
  // ============================================================================
400
441
  // Statement Execution - Public API
@@ -465,6 +506,21 @@ export class Database {
465
506
  */
466
507
  registerModule(name, module, auxData) {
467
508
  this.checkOpen();
509
+ if (typeof name !== 'string' || !name) {
510
+ throw new MisuseError('registerModule: name must be a non-empty string');
511
+ }
512
+ if (!module || typeof module !== 'object') {
513
+ throw new MisuseError('registerModule: module must be an object');
514
+ }
515
+ if (typeof module.create !== 'function') {
516
+ throw new MisuseError('registerModule: module.create must be a function');
517
+ }
518
+ if (typeof module.connect !== 'function') {
519
+ throw new MisuseError('registerModule: module.connect must be a function');
520
+ }
521
+ if (typeof module.destroy !== 'function') {
522
+ throw new MisuseError('registerModule: module.destroy must be a function');
523
+ }
468
524
  this.schemaManager.registerModule(name, module, auxData);
469
525
  // Check if the module has a getEventEmitter method and hook it up
470
526
  this.hookModuleEvents(name, module);
@@ -474,18 +530,10 @@ export class Database {
474
530
  * @internal
475
531
  */
476
532
  hookModuleEvents(name, module) {
477
- // Check if module has getEventEmitter method
478
- const getEmitter = module.getEventEmitter;
479
- if (typeof getEmitter === 'function') {
480
- const emitter = getEmitter.call(module);
481
- if (emitter && typeof emitter === 'object') {
482
- // Check if emitter has the expected methods
483
- const vtabEmitter = emitter;
484
- if (typeof vtabEmitter.onDataChange === 'function' || typeof vtabEmitter.onSchemaChange === 'function') {
485
- this.eventEmitter.hookModuleEmitter(name, emitter);
486
- log('Hooked event emitter for module: %s', name);
487
- }
488
- }
533
+ const emitter = tryGetEventEmitter(module);
534
+ if (emitter) {
535
+ this.eventEmitter.hookModuleEmitter(name, emitter);
536
+ log('Hooked event emitter for module: %s', name);
489
537
  }
490
538
  }
491
539
  // ============================================================================
@@ -608,6 +656,8 @@ export class Database {
608
656
  const finalizePromises = Array.from(this.statements).map(stmt => stmt.finalize());
609
657
  await Promise.allSettled(finalizePromises); // Wait even if some fail
610
658
  this.statements.clear();
659
+ // Clean up assertion evaluator (unsubscribe schema change listener, clear plan cache)
660
+ this.assertionEvaluator.dispose();
611
661
  // Clear schemas, ensuring VTabs are potentially disconnected
612
662
  // This will also call destroy on VTabs via SchemaManager.clearAll -> schema.clearTables -> schemaManager.dropTable
613
663
  this.schemaManager.clearAll();
@@ -638,6 +688,18 @@ export class Database {
638
688
  }
639
689
  this.schemaManager.getMainSchema().addTable(definition);
640
690
  }
691
+ /** Wraps function registration with consistent error logging and re-throw. */
692
+ registerFunctionWithErrorHandling(funcType, funcName, numArgs, register) {
693
+ try {
694
+ register();
695
+ }
696
+ catch (e) {
697
+ errorLog(`Failed to register ${funcType} function ${funcName}/${numArgs}: %O`, e);
698
+ if (e instanceof QuereusError)
699
+ throw e;
700
+ throw new QuereusError(`Failed to register ${funcType} function ${funcName}/${numArgs}: ${e instanceof Error ? e.message : String(e)}`, StatusCode.ERROR, e instanceof Error ? e : undefined);
701
+ }
702
+ }
641
703
  /**
642
704
  * Registers a user-defined scalar function.
643
705
  *
@@ -650,16 +712,9 @@ export class Database {
650
712
  const baseFlags = (options.deterministic ? FunctionFlags.DETERMINISTIC : 0) | FunctionFlags.UTF8;
651
713
  const flags = options.flags ?? baseFlags;
652
714
  const schema = createScalarFunction({ name, numArgs: options.numArgs, flags }, func);
653
- try {
715
+ this.registerFunctionWithErrorHandling('scalar', name, options.numArgs, () => {
654
716
  this.schemaManager.getMainSchema().addFunction(schema);
655
- }
656
- catch (e) {
657
- errorLog(`Failed to register scalar function ${name}/${options.numArgs}: %O`, e);
658
- if (e instanceof Error)
659
- throw e;
660
- else
661
- quereusError(String(e));
662
- }
717
+ });
663
718
  }
664
719
  /**
665
720
  * Registers a user-defined aggregate function.
@@ -673,16 +728,9 @@ export class Database {
673
728
  this.checkOpen();
674
729
  const flags = options.flags ?? FunctionFlags.UTF8;
675
730
  const schema = createAggregateFunction({ name, numArgs: options.numArgs, flags, initialValue: options.initialState }, stepFunc, finalFunc);
676
- try {
731
+ this.registerFunctionWithErrorHandling('aggregate', name, options.numArgs, () => {
677
732
  this.schemaManager.getMainSchema().addFunction(schema);
678
- }
679
- catch (e) {
680
- errorLog(`Failed to register aggregate function ${name}/${options.numArgs}: %O`, e);
681
- if (e instanceof Error)
682
- throw e;
683
- else
684
- quereusError(String(e));
685
- }
733
+ });
686
734
  }
687
735
  /**
688
736
  * Registers a function using a pre-defined FunctionSchema.
@@ -692,16 +740,35 @@ export class Database {
692
740
  */
693
741
  registerFunction(schema) {
694
742
  this.checkOpen();
695
- try {
696
- this.schemaManager.getMainSchema().addFunction(schema);
743
+ if (!schema || typeof schema !== 'object') {
744
+ throw new MisuseError('registerFunction: schema must be an object');
697
745
  }
698
- catch (e) {
699
- errorLog(`Failed to register function ${schema.name}/${schema.numArgs}: %O`, e);
700
- if (e instanceof Error)
701
- throw e;
702
- else
703
- quereusError(String(e));
746
+ if (typeof schema.name !== 'string' || !schema.name) {
747
+ throw new MisuseError('registerFunction: schema.name must be a non-empty string');
704
748
  }
749
+ if (!Number.isInteger(schema.numArgs) || schema.numArgs < -1) {
750
+ throw new MisuseError('registerFunction: schema.numArgs must be an integer >= -1');
751
+ }
752
+ // Validate that appropriate implementation functions exist
753
+ if ('stepFunction' in schema) {
754
+ if (typeof schema.stepFunction !== 'function') {
755
+ throw new MisuseError('registerFunction: aggregate schema.stepFunction must be a function');
756
+ }
757
+ if (typeof schema.finalizeFunction !== 'function') {
758
+ throw new MisuseError('registerFunction: aggregate schema.finalizeFunction must be a function');
759
+ }
760
+ }
761
+ else if ('implementation' in schema) {
762
+ if (typeof schema.implementation !== 'function') {
763
+ throw new MisuseError('registerFunction: schema.implementation must be a function');
764
+ }
765
+ }
766
+ else {
767
+ throw new MisuseError('registerFunction: schema must have implementation (scalar/TVF) or stepFunction+finalizeFunction (aggregate)');
768
+ }
769
+ this.registerFunctionWithErrorHandling('user', schema.name, schema.numArgs, () => {
770
+ this.schemaManager.getMainSchema().addFunction(schema);
771
+ });
705
772
  }
706
773
  /** Sets only the name of the default module. */
707
774
  setDefaultVtabName(name) {
@@ -756,8 +823,7 @@ export class Database {
756
823
  */
757
824
  getSchemaPath() {
758
825
  this.checkOpen();
759
- const pathString = this.options.getStringOption('schema_path');
760
- return pathString.split(',').map(s => s.trim()).filter(s => s.length > 0);
826
+ return parseSchemaPath(this.options.getStringOption('schema_path')) ?? [];
761
827
  }
762
828
  /**
763
829
  * Set database configuration options
@@ -800,8 +866,18 @@ export class Database {
800
866
  */
801
867
  registerCollation(name, func) {
802
868
  this.checkOpen();
803
- registerCollation(name, func);
804
- log('Registered collation: %s', name);
869
+ if (typeof name !== 'string' || !name) {
870
+ throw new MisuseError('registerCollation: name must be a non-empty string');
871
+ }
872
+ if (typeof func !== 'function') {
873
+ throw new MisuseError('registerCollation: func must be a function');
874
+ }
875
+ const upperName = name.toUpperCase();
876
+ if (this.collations.has(upperName)) {
877
+ log('Overwriting existing collation: %s', upperName);
878
+ }
879
+ this.collations.set(upperName, func);
880
+ log('Registered collation: %s', upperName);
805
881
  }
806
882
  /**
807
883
  * Registers a custom logical type.
@@ -821,8 +897,31 @@ export class Database {
821
897
  */
822
898
  registerType(name, definition) {
823
899
  this.checkOpen();
824
- const { registerType } = require('../types/registry.js');
825
- registerType(name, definition);
900
+ if (typeof name !== 'string' || !name) {
901
+ throw new MisuseError('registerType: name must be a non-empty string');
902
+ }
903
+ if (!definition || typeof definition !== 'object') {
904
+ throw new MisuseError('registerType: definition must be an object');
905
+ }
906
+ if (typeof definition.name !== 'string' || !definition.name) {
907
+ throw new MisuseError('registerType: definition.name must be a non-empty string');
908
+ }
909
+ // Validate physicalType is a valid enum value (0-5)
910
+ if (typeof definition.physicalType !== 'number' || !Number.isInteger(definition.physicalType) || definition.physicalType < 0 || definition.physicalType > 5) {
911
+ throw new MisuseError('registerType: definition.physicalType must be a valid PhysicalType enum value (0-5)');
912
+ }
913
+ if (definition.name.toLowerCase() !== name.toLowerCase()) {
914
+ throw new QuereusError(`Type name mismatch: registerType('${name}', ...) does not match definition.name '${definition.name}'`, StatusCode.ERROR);
915
+ }
916
+ try {
917
+ registerTypeInRegistry(definition);
918
+ }
919
+ catch (e) {
920
+ errorLog('Failed to register type %s: %O', name, e);
921
+ if (e instanceof QuereusError)
922
+ throw e;
923
+ throw new QuereusError(`Failed to register type '${name}': ${e instanceof Error ? e.message : String(e)}`, StatusCode.ERROR, e instanceof Error ? e : undefined);
924
+ }
826
925
  log('Registered type: %s', name);
827
926
  }
828
927
  /**
@@ -843,7 +942,7 @@ export class Database {
843
942
  }
844
943
  /** @internal Gets a registered collation function */
845
944
  _getCollation(name) {
846
- return getCollation(name);
945
+ return this.collations.get(name.toUpperCase());
847
946
  }
848
947
  _queueDeferredConstraintRow(baseTable, constraintName, row, descriptor, evaluator, connectionId, contextRow, contextDescriptor) {
849
948
  this.deferredConstraints.enqueue(baseTable, constraintName, row, descriptor, evaluator, connectionId, contextRow, contextDescriptor);
@@ -869,15 +968,17 @@ export class Database {
869
968
  _recordUpdate(baseTable, oldKey, newKey) {
870
969
  this.transactionManager.recordUpdate(baseTable, oldKey, newKey);
871
970
  }
872
- /** Savepoint change tracking */
873
- _beginSavepointLayer() {
874
- this.transactionManager.beginSavepointLayer();
971
+ /** Create a named savepoint, returning its depth index */
972
+ _createSavepoint(name) {
973
+ return this.transactionManager.createSavepoint(name);
875
974
  }
876
- _rollbackSavepointLayer() {
877
- this.transactionManager.rollbackSavepointLayer();
975
+ /** Release a named savepoint (merges layers down to target), returns target depth */
976
+ _releaseSavepoint(name) {
977
+ return this.transactionManager.releaseSavepoint(name);
878
978
  }
879
- _releaseSavepointLayer() {
880
- this.transactionManager.releaseSavepointLayer();
979
+ /** Rollback to a named savepoint (discards layers down to target) */
980
+ _rollbackToSavepoint(name) {
981
+ return this.transactionManager.rollbackToSavepoint(name);
881
982
  }
882
983
  _clearChangeLog() {
883
984
  this.transactionManager.clearChangeLog();
@@ -910,56 +1011,7 @@ export class Database {
910
1011
  * ```
911
1012
  */
912
1013
  eval(sql, params) {
913
- // Create the generator that does the actual work
914
- const generator = this._evalGenerator(sql, params);
915
- // Track whether the transaction has been finalized
916
- let transactionFinalized = false;
917
- // Helper to finalize the implicit transaction (idempotent)
918
- const finalizeImplicitTransaction = async (commit) => {
919
- if (transactionFinalized)
920
- return;
921
- transactionFinalized = true;
922
- if (this.transactionManager.isImplicitTransaction()) {
923
- if (commit) {
924
- await this._commitTransaction();
925
- }
926
- else {
927
- await this._rollbackTransaction();
928
- }
929
- }
930
- };
931
- // Wrap the generator to intercept return() and throw()
932
- const wrappedIterator = {
933
- [Symbol.asyncIterator]() {
934
- return this;
935
- },
936
- async next() {
937
- return generator.next();
938
- },
939
- async return(value) {
940
- // Called on early termination (break, return, etc.)
941
- // Commit the implicit transaction before delegating to the generator
942
- try {
943
- await finalizeImplicitTransaction(true);
944
- }
945
- finally {
946
- // Delegate to generator.return() to trigger cleanup (finally block)
947
- return generator.return(value);
948
- }
949
- },
950
- async throw(error) {
951
- // Called when an error is thrown into the iterator
952
- // Rollback the implicit transaction before delegating
953
- try {
954
- await finalizeImplicitTransaction(false);
955
- }
956
- finally {
957
- // Delegate to generator.throw() to propagate the error
958
- return generator.throw(error);
959
- }
960
- }
961
- };
962
- return wrappedIterator;
1014
+ return wrapAsyncIterator(this._evalGenerator(sql, params), (commit) => this._finalizeImplicitTransaction(commit));
963
1015
  }
964
1016
  /**
965
1017
  * Internal generator for eval() that yields result rows.
@@ -968,27 +1020,20 @@ export class Database {
968
1020
  */
969
1021
  async *_evalGenerator(sql, params) {
970
1022
  this.checkOpen();
971
- // Acquire mutex for the entire iteration
972
1023
  const releaseMutex = await this._acquireExecMutex();
973
1024
  let stmt = null;
974
- let normalCompletion = false;
975
1025
  try {
976
- // Execute - transactions are started JIT by runtime when needed
977
1026
  stmt = this.prepare(sql);
978
1027
  if (stmt.astBatch.length === 0) {
979
- // No statements, yield nothing.
980
- normalCompletion = true;
981
1028
  return;
982
1029
  }
983
1030
  if (stmt.astBatch.length > 1) {
984
1031
  // Multi-statement batch: execute all but the last statement,
985
1032
  // then yield results from the last statement
986
1033
  const batch = this._parseSql(sql);
987
- // Execute all statements except the last one
988
1034
  for (let i = 0; i < batch.length - 1; i++) {
989
1035
  await this._executeSingleStatement(batch[i], params);
990
1036
  }
991
- // Now prepare and execute the last statement to yield its results
992
1037
  const lastStmt = new Statement(this, [batch[batch.length - 1]]);
993
1038
  this.statements.add(lastStmt);
994
1039
  try {
@@ -1002,25 +1047,11 @@ export class Database {
1002
1047
  }
1003
1048
  }
1004
1049
  else {
1005
- // Single statement: execute and yield results
1006
1050
  const names = stmt.getColumnNames();
1007
1051
  for await (const row of stmt._iterateRowsRaw(params)) {
1008
1052
  yield rowToObject(row, names);
1009
1053
  }
1010
1054
  }
1011
- normalCompletion = true;
1012
- // Commit implicit transaction on normal completion
1013
- // (The wrapper also handles this for early termination via return())
1014
- if (this.transactionManager.isImplicitTransaction()) {
1015
- await this._commitTransaction();
1016
- }
1017
- }
1018
- catch (err) {
1019
- // Rollback implicit transaction on error
1020
- if (this.transactionManager.isImplicitTransaction()) {
1021
- await this._rollbackTransaction();
1022
- }
1023
- throw err;
1024
1055
  }
1025
1056
  finally {
1026
1057
  if (stmt) {
@@ -1040,7 +1071,7 @@ export class Database {
1040
1071
  ast = parser.parse(originalSqlString);
1041
1072
  }
1042
1073
  catch (err) {
1043
- const error = err instanceof Error ? err : new Error(String(err));
1074
+ const error = err instanceof QuereusError ? err : new QuereusError(String(err), StatusCode.ERROR, err instanceof Error ? err : undefined);
1044
1075
  errorLog("Failed to parse SQL for query plan: %O", error);
1045
1076
  throw error;
1046
1077
  }
@@ -1048,7 +1079,7 @@ export class Database {
1048
1079
  else {
1049
1080
  ast = sqlOrAst;
1050
1081
  }
1051
- const plan = this._buildPlan([ast]);
1082
+ const { plan } = this._buildPlan([ast]);
1052
1083
  if (plan.statements.length === 0)
1053
1084
  return plan; // No-op for this AST
1054
1085
  return this.optimizer.optimize(plan, this);
@@ -1086,7 +1117,6 @@ export class Database {
1086
1117
  this.checkOpen();
1087
1118
  log('Preparing SQL with debug options: %s', sql);
1088
1119
  const stmt = new Statement(this, sql);
1089
- // Set debug options on the statement
1090
1120
  stmt._debugOptions = debug;
1091
1121
  this.statements.add(stmt);
1092
1122
  return stmt;
@@ -1116,21 +1146,22 @@ export class Database {
1116
1146
  // This ParameterScope is for the entire batch. It has globalScope as its parent.
1117
1147
  const parameterScope = new ParameterScope(globalScope, parameterTypes);
1118
1148
  // Get default schema path from options
1119
- const schemaPathString = this.options.getStringOption('schema_path');
1120
- const schemaPath = schemaPathString ? schemaPathString.split(',').map(s => s.trim()).filter(s => s.length > 0) : undefined;
1149
+ const schemaPath = parseSchemaPath(this.options.getStringOption('schema_path'));
1150
+ const schemaDependencies = new BuildTimeDependencyTracker();
1121
1151
  const ctx = {
1122
1152
  db: this,
1123
1153
  schemaManager: this.schemaManager,
1124
1154
  parameters: paramsOrTypes instanceof Map ? {} : (paramsOrTypes ?? {}),
1125
1155
  scope: parameterScope,
1126
1156
  cteNodes: new Map(),
1127
- schemaDependencies: new BuildTimeDependencyTracker(),
1157
+ schemaDependencies,
1128
1158
  schemaCache: new Map(),
1129
1159
  cteReferenceCache: new Map(),
1130
1160
  outputScopes: new Map(),
1131
1161
  schemaPath
1132
1162
  };
1133
- return buildBlock(ctx, statements);
1163
+ const plan = buildBlock(ctx, statements);
1164
+ return { plan, schemaDependencies };
1134
1165
  }
1135
1166
  /**
1136
1167
  * @internal Registers an active VirtualTable connection for transaction management.
@@ -1226,5 +1257,9 @@ export class Database {
1226
1257
  async runGlobalAssertions() {
1227
1258
  await this.assertionEvaluator.runGlobalAssertions();
1228
1259
  }
1260
+ /** @internal Invalidate cached assertion plan (called on DROP ASSERTION) */
1261
+ invalidateAssertionCache(name) {
1262
+ this.assertionEvaluator.invalidateAssertion(name);
1263
+ }
1229
1264
  }
1230
1265
  //# sourceMappingURL=database.js.map