@quereus/quereus 3.3.0 → 4.0.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 (900) hide show
  1. package/README.md +7 -0
  2. package/dist/src/common/datatype.d.ts +12 -0
  3. package/dist/src/common/datatype.d.ts.map +1 -1
  4. package/dist/src/common/datatype.js.map +1 -1
  5. package/dist/src/common/types.d.ts +24 -0
  6. package/dist/src/common/types.d.ts.map +1 -1
  7. package/dist/src/common/types.js.map +1 -1
  8. package/dist/src/core/database-assertions.d.ts +37 -9
  9. package/dist/src/core/database-assertions.d.ts.map +1 -1
  10. package/dist/src/core/database-assertions.js +62 -110
  11. package/dist/src/core/database-assertions.js.map +1 -1
  12. package/dist/src/core/database-events.d.ts +163 -0
  13. package/dist/src/core/database-events.d.ts.map +1 -1
  14. package/dist/src/core/database-events.js +235 -21
  15. package/dist/src/core/database-events.js.map +1 -1
  16. package/dist/src/core/database-external-changes.d.ts +28 -0
  17. package/dist/src/core/database-external-changes.d.ts.map +1 -0
  18. package/dist/src/core/database-external-changes.js +242 -0
  19. package/dist/src/core/database-external-changes.js.map +1 -0
  20. package/dist/src/core/database-internal.d.ts +50 -1
  21. package/dist/src/core/database-internal.d.ts.map +1 -1
  22. package/dist/src/core/database-materialized-views.d.ts +1253 -0
  23. package/dist/src/core/database-materialized-views.d.ts.map +1 -0
  24. package/dist/src/core/database-materialized-views.js +3064 -0
  25. package/dist/src/core/database-materialized-views.js.map +1 -0
  26. package/dist/src/core/database-options.d.ts +4 -0
  27. package/dist/src/core/database-options.d.ts.map +1 -1
  28. package/dist/src/core/database-options.js +10 -0
  29. package/dist/src/core/database-options.js.map +1 -1
  30. package/dist/src/core/database-transaction.d.ts +19 -3
  31. package/dist/src/core/database-transaction.d.ts.map +1 -1
  32. package/dist/src/core/database-transaction.js +30 -3
  33. package/dist/src/core/database-transaction.js.map +1 -1
  34. package/dist/src/core/database-watchers.d.ts +19 -0
  35. package/dist/src/core/database-watchers.d.ts.map +1 -1
  36. package/dist/src/core/database-watchers.js +63 -3
  37. package/dist/src/core/database-watchers.js.map +1 -1
  38. package/dist/src/core/database.d.ts +203 -11
  39. package/dist/src/core/database.d.ts.map +1 -1
  40. package/dist/src/core/database.js +493 -29
  41. package/dist/src/core/database.js.map +1 -1
  42. package/dist/src/core/derived-row-validator.d.ts +137 -0
  43. package/dist/src/core/derived-row-validator.d.ts.map +1 -0
  44. package/dist/src/core/derived-row-validator.js +314 -0
  45. package/dist/src/core/derived-row-validator.js.map +1 -0
  46. package/dist/src/core/statement.d.ts.map +1 -1
  47. package/dist/src/core/statement.js +30 -9
  48. package/dist/src/core/statement.js.map +1 -1
  49. package/dist/src/emit/ast-stringify.d.ts +135 -1
  50. package/dist/src/emit/ast-stringify.d.ts.map +1 -1
  51. package/dist/src/emit/ast-stringify.js +793 -118
  52. package/dist/src/emit/ast-stringify.js.map +1 -1
  53. package/dist/src/func/builtins/aggregate.d.ts.map +1 -1
  54. package/dist/src/func/builtins/aggregate.js +11 -10
  55. package/dist/src/func/builtins/aggregate.js.map +1 -1
  56. package/dist/src/func/builtins/builtin-window-functions.d.ts.map +1 -1
  57. package/dist/src/func/builtins/builtin-window-functions.js +32 -0
  58. package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
  59. package/dist/src/func/builtins/explain.d.ts +3 -0
  60. package/dist/src/func/builtins/explain.d.ts.map +1 -1
  61. package/dist/src/func/builtins/explain.js +229 -0
  62. package/dist/src/func/builtins/explain.js.map +1 -1
  63. package/dist/src/func/builtins/index.d.ts.map +1 -1
  64. package/dist/src/func/builtins/index.js +10 -2
  65. package/dist/src/func/builtins/index.js.map +1 -1
  66. package/dist/src/func/builtins/json.d.ts.map +1 -1
  67. package/dist/src/func/builtins/json.js +3 -2
  68. package/dist/src/func/builtins/json.js.map +1 -1
  69. package/dist/src/func/builtins/mutation.d.ts +2 -0
  70. package/dist/src/func/builtins/mutation.d.ts.map +1 -0
  71. package/dist/src/func/builtins/mutation.js +53 -0
  72. package/dist/src/func/builtins/mutation.js.map +1 -0
  73. package/dist/src/func/builtins/schema.d.ts +2 -0
  74. package/dist/src/func/builtins/schema.d.ts.map +1 -1
  75. package/dist/src/func/builtins/schema.js +713 -26
  76. package/dist/src/func/builtins/schema.js.map +1 -1
  77. package/dist/src/func/builtins/string.js +1 -1
  78. package/dist/src/func/builtins/string.js.map +1 -1
  79. package/dist/src/func/registration.d.ts +9 -0
  80. package/dist/src/func/registration.d.ts.map +1 -1
  81. package/dist/src/func/registration.js +4 -0
  82. package/dist/src/func/registration.js.map +1 -1
  83. package/dist/src/index.d.ts +25 -6
  84. package/dist/src/index.d.ts.map +1 -1
  85. package/dist/src/index.js +27 -3
  86. package/dist/src/index.js.map +1 -1
  87. package/dist/src/parser/ast.d.ts +353 -21
  88. package/dist/src/parser/ast.d.ts.map +1 -1
  89. package/dist/src/parser/index.d.ts +14 -1
  90. package/dist/src/parser/index.d.ts.map +1 -1
  91. package/dist/src/parser/index.js +19 -0
  92. package/dist/src/parser/index.js.map +1 -1
  93. package/dist/src/parser/lexer.d.ts +9 -0
  94. package/dist/src/parser/lexer.d.ts.map +1 -1
  95. package/dist/src/parser/lexer.js +9 -0
  96. package/dist/src/parser/lexer.js.map +1 -1
  97. package/dist/src/parser/parser.d.ts +276 -7
  98. package/dist/src/parser/parser.d.ts.map +1 -1
  99. package/dist/src/parser/parser.js +1387 -469
  100. package/dist/src/parser/parser.js.map +1 -1
  101. package/dist/src/parser/visitor.d.ts.map +1 -1
  102. package/dist/src/parser/visitor.js +12 -8
  103. package/dist/src/parser/visitor.js.map +1 -1
  104. package/dist/src/planner/analysis/assertion-classifier.d.ts.map +1 -1
  105. package/dist/src/planner/analysis/assertion-classifier.js +4 -0
  106. package/dist/src/planner/analysis/assertion-classifier.js.map +1 -1
  107. package/dist/src/planner/analysis/assertion-hoist-cache.d.ts.map +1 -1
  108. package/dist/src/planner/analysis/assertion-hoist-cache.js +8 -4
  109. package/dist/src/planner/analysis/assertion-hoist-cache.js.map +1 -1
  110. package/dist/src/planner/analysis/authored-inverse.d.ts +22 -0
  111. package/dist/src/planner/analysis/authored-inverse.d.ts.map +1 -0
  112. package/dist/src/planner/analysis/authored-inverse.js +267 -0
  113. package/dist/src/planner/analysis/authored-inverse.js.map +1 -0
  114. package/dist/src/planner/analysis/change-scope.d.ts +34 -4
  115. package/dist/src/planner/analysis/change-scope.d.ts.map +1 -1
  116. package/dist/src/planner/analysis/change-scope.js +108 -7
  117. package/dist/src/planner/analysis/change-scope.js.map +1 -1
  118. package/dist/src/planner/analysis/check-extraction.d.ts +36 -2
  119. package/dist/src/planner/analysis/check-extraction.d.ts.map +1 -1
  120. package/dist/src/planner/analysis/check-extraction.js +174 -46
  121. package/dist/src/planner/analysis/check-extraction.js.map +1 -1
  122. package/dist/src/planner/analysis/coarsened-key.d.ts +109 -0
  123. package/dist/src/planner/analysis/coarsened-key.d.ts.map +1 -0
  124. package/dist/src/planner/analysis/coarsened-key.js +228 -0
  125. package/dist/src/planner/analysis/coarsened-key.js.map +1 -0
  126. package/dist/src/planner/analysis/comparison-collation.d.ts +216 -0
  127. package/dist/src/planner/analysis/comparison-collation.d.ts.map +1 -0
  128. package/dist/src/planner/analysis/comparison-collation.js +341 -0
  129. package/dist/src/planner/analysis/comparison-collation.js.map +1 -0
  130. package/dist/src/planner/analysis/constraint-extractor.d.ts +3 -1
  131. package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
  132. package/dist/src/planner/analysis/constraint-extractor.js +192 -9
  133. package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
  134. package/dist/src/planner/analysis/coverage-prover.d.ts +321 -0
  135. package/dist/src/planner/analysis/coverage-prover.d.ts.map +1 -0
  136. package/dist/src/planner/analysis/coverage-prover.js +1038 -0
  137. package/dist/src/planner/analysis/coverage-prover.js.map +1 -0
  138. package/dist/src/planner/analysis/key-filter.d.ts +22 -0
  139. package/dist/src/planner/analysis/key-filter.d.ts.map +1 -0
  140. package/dist/src/planner/analysis/key-filter.js +105 -0
  141. package/dist/src/planner/analysis/key-filter.js.map +1 -0
  142. package/dist/src/planner/analysis/partial-unique-extraction.d.ts +36 -1
  143. package/dist/src/planner/analysis/partial-unique-extraction.d.ts.map +1 -1
  144. package/dist/src/planner/analysis/partial-unique-extraction.js +148 -22
  145. package/dist/src/planner/analysis/partial-unique-extraction.js.map +1 -1
  146. package/dist/src/planner/analysis/predicate-normalizer.d.ts.map +1 -1
  147. package/dist/src/planner/analysis/predicate-normalizer.js +30 -1
  148. package/dist/src/planner/analysis/predicate-normalizer.js.map +1 -1
  149. package/dist/src/planner/analysis/predicate-shape.d.ts +36 -1
  150. package/dist/src/planner/analysis/predicate-shape.d.ts.map +1 -1
  151. package/dist/src/planner/analysis/predicate-shape.js +51 -13
  152. package/dist/src/planner/analysis/predicate-shape.js.map +1 -1
  153. package/dist/src/planner/analysis/query-rewrite-matcher.d.ts +314 -0
  154. package/dist/src/planner/analysis/query-rewrite-matcher.d.ts.map +1 -0
  155. package/dist/src/planner/analysis/query-rewrite-matcher.js +1081 -0
  156. package/dist/src/planner/analysis/query-rewrite-matcher.js.map +1 -0
  157. package/dist/src/planner/analysis/scalar-invertibility.d.ts +92 -0
  158. package/dist/src/planner/analysis/scalar-invertibility.d.ts.map +1 -0
  159. package/dist/src/planner/analysis/scalar-invertibility.js +129 -0
  160. package/dist/src/planner/analysis/scalar-invertibility.js.map +1 -0
  161. package/dist/src/planner/analysis/update-lineage.d.ts +196 -0
  162. package/dist/src/planner/analysis/update-lineage.d.ts.map +1 -0
  163. package/dist/src/planner/analysis/update-lineage.js +322 -0
  164. package/dist/src/planner/analysis/update-lineage.js.map +1 -0
  165. package/dist/src/planner/analysis/view-complement.d.ts +42 -0
  166. package/dist/src/planner/analysis/view-complement.d.ts.map +1 -0
  167. package/dist/src/planner/analysis/view-complement.js +54 -0
  168. package/dist/src/planner/analysis/view-complement.js.map +1 -0
  169. package/dist/src/planner/building/alter-table.d.ts +1 -1
  170. package/dist/src/planner/building/alter-table.d.ts.map +1 -1
  171. package/dist/src/planner/building/alter-table.js +211 -2
  172. package/dist/src/planner/building/alter-table.js.map +1 -1
  173. package/dist/src/planner/building/block.d.ts.map +1 -1
  174. package/dist/src/planner/building/block.js +18 -1
  175. package/dist/src/planner/building/block.js.map +1 -1
  176. package/dist/src/planner/building/constraint-builder.d.ts +33 -5
  177. package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
  178. package/dist/src/planner/building/constraint-builder.js +63 -28
  179. package/dist/src/planner/building/constraint-builder.js.map +1 -1
  180. package/dist/src/planner/building/create-view.d.ts +9 -0
  181. package/dist/src/planner/building/create-view.d.ts.map +1 -1
  182. package/dist/src/planner/building/create-view.js +41 -12
  183. package/dist/src/planner/building/create-view.js.map +1 -1
  184. package/dist/src/planner/building/ddl.d.ts.map +1 -1
  185. package/dist/src/planner/building/ddl.js +94 -0
  186. package/dist/src/planner/building/ddl.js.map +1 -1
  187. package/dist/src/planner/building/declare-schema.d.ts +1 -0
  188. package/dist/src/planner/building/declare-schema.d.ts.map +1 -1
  189. package/dist/src/planner/building/declare-schema.js +4 -1
  190. package/dist/src/planner/building/declare-schema.js.map +1 -1
  191. package/dist/src/planner/building/default-scope.d.ts +26 -0
  192. package/dist/src/planner/building/default-scope.d.ts.map +1 -0
  193. package/dist/src/planner/building/default-scope.js +41 -0
  194. package/dist/src/planner/building/default-scope.js.map +1 -0
  195. package/dist/src/planner/building/delete.d.ts +19 -1
  196. package/dist/src/planner/building/delete.d.ts.map +1 -1
  197. package/dist/src/planner/building/delete.js +109 -30
  198. package/dist/src/planner/building/delete.js.map +1 -1
  199. package/dist/src/planner/building/dml-target.d.ts +118 -0
  200. package/dist/src/planner/building/dml-target.d.ts.map +1 -0
  201. package/dist/src/planner/building/dml-target.js +282 -0
  202. package/dist/src/planner/building/dml-target.js.map +1 -0
  203. package/dist/src/planner/building/drop-index.d.ts.map +1 -1
  204. package/dist/src/planner/building/drop-index.js +4 -1
  205. package/dist/src/planner/building/drop-index.js.map +1 -1
  206. package/dist/src/planner/building/drop-view.d.ts.map +1 -1
  207. package/dist/src/planner/building/drop-view.js +4 -2
  208. package/dist/src/planner/building/drop-view.js.map +1 -1
  209. package/dist/src/planner/building/expression.d.ts.map +1 -1
  210. package/dist/src/planner/building/expression.js +60 -21
  211. package/dist/src/planner/building/expression.js.map +1 -1
  212. package/dist/src/planner/building/foreign-key-builder.d.ts +30 -0
  213. package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
  214. package/dist/src/planner/building/foreign-key-builder.js +160 -129
  215. package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
  216. package/dist/src/planner/building/insert.d.ts +45 -2
  217. package/dist/src/planner/building/insert.d.ts.map +1 -1
  218. package/dist/src/planner/building/insert.js +257 -88
  219. package/dist/src/planner/building/insert.js.map +1 -1
  220. package/dist/src/planner/building/lens-auxiliary-access.d.ts +22 -0
  221. package/dist/src/planner/building/lens-auxiliary-access.d.ts.map +1 -0
  222. package/dist/src/planner/building/lens-auxiliary-access.js +132 -0
  223. package/dist/src/planner/building/lens-auxiliary-access.js.map +1 -0
  224. package/dist/src/planner/building/materialized-view.d.ts +16 -0
  225. package/dist/src/planner/building/materialized-view.d.ts.map +1 -0
  226. package/dist/src/planner/building/materialized-view.js +57 -0
  227. package/dist/src/planner/building/materialized-view.js.map +1 -0
  228. package/dist/src/planner/building/returning-star.d.ts +32 -0
  229. package/dist/src/planner/building/returning-star.d.ts.map +1 -0
  230. package/dist/src/planner/building/returning-star.js +45 -0
  231. package/dist/src/planner/building/returning-star.js.map +1 -0
  232. package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
  233. package/dist/src/planner/building/select-aggregates.js +47 -0
  234. package/dist/src/planner/building/select-aggregates.js.map +1 -1
  235. package/dist/src/planner/building/select-compound.d.ts.map +1 -1
  236. package/dist/src/planner/building/select-compound.js +84 -11
  237. package/dist/src/planner/building/select-compound.js.map +1 -1
  238. package/dist/src/planner/building/select-context.d.ts +10 -2
  239. package/dist/src/planner/building/select-context.d.ts.map +1 -1
  240. package/dist/src/planner/building/select-context.js +7 -1
  241. package/dist/src/planner/building/select-context.js.map +1 -1
  242. package/dist/src/planner/building/select-modifiers.js +6 -0
  243. package/dist/src/planner/building/select-modifiers.js.map +1 -1
  244. package/dist/src/planner/building/select-ordinal.d.ts +18 -0
  245. package/dist/src/planner/building/select-ordinal.d.ts.map +1 -1
  246. package/dist/src/planner/building/select-ordinal.js +30 -0
  247. package/dist/src/planner/building/select-ordinal.js.map +1 -1
  248. package/dist/src/planner/building/select-projections.d.ts +8 -2
  249. package/dist/src/planner/building/select-projections.d.ts.map +1 -1
  250. package/dist/src/planner/building/select-projections.js +26 -4
  251. package/dist/src/planner/building/select-projections.js.map +1 -1
  252. package/dist/src/planner/building/select-window.d.ts.map +1 -1
  253. package/dist/src/planner/building/select-window.js +8 -5
  254. package/dist/src/planner/building/select-window.js.map +1 -1
  255. package/dist/src/planner/building/select.d.ts.map +1 -1
  256. package/dist/src/planner/building/select.js +164 -59
  257. package/dist/src/planner/building/select.js.map +1 -1
  258. package/dist/src/planner/building/set-object-tags.d.ts +7 -0
  259. package/dist/src/planner/building/set-object-tags.d.ts.map +1 -0
  260. package/dist/src/planner/building/set-object-tags.js +38 -0
  261. package/dist/src/planner/building/set-object-tags.js.map +1 -0
  262. package/dist/src/planner/building/tag-diagnostics.d.ts +27 -0
  263. package/dist/src/planner/building/tag-diagnostics.d.ts.map +1 -0
  264. package/dist/src/planner/building/tag-diagnostics.js +37 -0
  265. package/dist/src/planner/building/tag-diagnostics.js.map +1 -0
  266. package/dist/src/planner/building/update.d.ts +18 -1
  267. package/dist/src/planner/building/update.d.ts.map +1 -1
  268. package/dist/src/planner/building/update.js +134 -58
  269. package/dist/src/planner/building/update.js.map +1 -1
  270. package/dist/src/planner/building/view-mutation-builder.d.ts +15 -0
  271. package/dist/src/planner/building/view-mutation-builder.d.ts.map +1 -0
  272. package/dist/src/planner/building/view-mutation-builder.js +1158 -0
  273. package/dist/src/planner/building/view-mutation-builder.js.map +1 -0
  274. package/dist/src/planner/building/with.d.ts +11 -0
  275. package/dist/src/planner/building/with.d.ts.map +1 -1
  276. package/dist/src/planner/building/with.js +48 -10
  277. package/dist/src/planner/building/with.js.map +1 -1
  278. package/dist/src/planner/cost/index.d.ts +83 -0
  279. package/dist/src/planner/cost/index.d.ts.map +1 -1
  280. package/dist/src/planner/cost/index.js +114 -0
  281. package/dist/src/planner/cost/index.js.map +1 -1
  282. package/dist/src/planner/framework/characteristics.d.ts +38 -4
  283. package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
  284. package/dist/src/planner/framework/characteristics.js +50 -6
  285. package/dist/src/planner/framework/characteristics.js.map +1 -1
  286. package/dist/src/planner/framework/pass.d.ts.map +1 -1
  287. package/dist/src/planner/framework/pass.js +2 -1
  288. package/dist/src/planner/framework/pass.js.map +1 -1
  289. package/dist/src/planner/framework/registry.d.ts +39 -1
  290. package/dist/src/planner/framework/registry.d.ts.map +1 -1
  291. package/dist/src/planner/framework/registry.js +18 -2
  292. package/dist/src/planner/framework/registry.js.map +1 -1
  293. package/dist/src/planner/mutation/backward-body.d.ts +131 -0
  294. package/dist/src/planner/mutation/backward-body.d.ts.map +1 -0
  295. package/dist/src/planner/mutation/backward-body.js +135 -0
  296. package/dist/src/planner/mutation/backward-body.js.map +1 -0
  297. package/dist/src/planner/mutation/cte-flatten.d.ts +17 -0
  298. package/dist/src/planner/mutation/cte-flatten.d.ts.map +1 -0
  299. package/dist/src/planner/mutation/cte-flatten.js +364 -0
  300. package/dist/src/planner/mutation/cte-flatten.js.map +1 -0
  301. package/dist/src/planner/mutation/decomposition.d.ts +273 -0
  302. package/dist/src/planner/mutation/decomposition.d.ts.map +1 -0
  303. package/dist/src/planner/mutation/decomposition.js +1719 -0
  304. package/dist/src/planner/mutation/decomposition.js.map +1 -0
  305. package/dist/src/planner/mutation/lens-enforcement.d.ts +165 -0
  306. package/dist/src/planner/mutation/lens-enforcement.d.ts.map +1 -0
  307. package/dist/src/planner/mutation/lens-enforcement.js +745 -0
  308. package/dist/src/planner/mutation/lens-enforcement.js.map +1 -0
  309. package/dist/src/planner/mutation/multi-source.d.ts +568 -0
  310. package/dist/src/planner/mutation/multi-source.d.ts.map +1 -0
  311. package/dist/src/planner/mutation/multi-source.js +2915 -0
  312. package/dist/src/planner/mutation/multi-source.js.map +1 -0
  313. package/dist/src/planner/mutation/mutation-diagnostic.d.ts +37 -0
  314. package/dist/src/planner/mutation/mutation-diagnostic.d.ts.map +1 -0
  315. package/dist/src/planner/mutation/mutation-diagnostic.js +24 -0
  316. package/dist/src/planner/mutation/mutation-diagnostic.js.map +1 -0
  317. package/dist/src/planner/mutation/mutation-tags.d.ts +33 -0
  318. package/dist/src/planner/mutation/mutation-tags.d.ts.map +1 -0
  319. package/dist/src/planner/mutation/mutation-tags.js +31 -0
  320. package/dist/src/planner/mutation/mutation-tags.js.map +1 -0
  321. package/dist/src/planner/mutation/propagate.d.ts +97 -0
  322. package/dist/src/planner/mutation/propagate.d.ts.map +1 -0
  323. package/dist/src/planner/mutation/propagate.js +220 -0
  324. package/dist/src/planner/mutation/propagate.js.map +1 -0
  325. package/dist/src/planner/mutation/scope-transform.d.ts +181 -0
  326. package/dist/src/planner/mutation/scope-transform.d.ts.map +1 -0
  327. package/dist/src/planner/mutation/scope-transform.js +574 -0
  328. package/dist/src/planner/mutation/scope-transform.js.map +1 -0
  329. package/dist/src/planner/mutation/set-op.d.ts +242 -0
  330. package/dist/src/planner/mutation/set-op.d.ts.map +1 -0
  331. package/dist/src/planner/mutation/set-op.js +1687 -0
  332. package/dist/src/planner/mutation/set-op.js.map +1 -0
  333. package/dist/src/planner/mutation/single-source.d.ts +261 -0
  334. package/dist/src/planner/mutation/single-source.d.ts.map +1 -0
  335. package/dist/src/planner/mutation/single-source.js +1096 -0
  336. package/dist/src/planner/mutation/single-source.js.map +1 -0
  337. package/dist/src/planner/nodes/aggregate-node.js +3 -3
  338. package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
  339. package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
  340. package/dist/src/planner/nodes/alias-node.js +5 -1
  341. package/dist/src/planner/nodes/alias-node.js.map +1 -1
  342. package/dist/src/planner/nodes/alter-table-node.d.ts +124 -1
  343. package/dist/src/planner/nodes/alter-table-node.d.ts.map +1 -1
  344. package/dist/src/planner/nodes/alter-table-node.js +27 -0
  345. package/dist/src/planner/nodes/alter-table-node.js.map +1 -1
  346. package/dist/src/planner/nodes/analyze-node.d.ts +2 -1
  347. package/dist/src/planner/nodes/analyze-node.d.ts.map +1 -1
  348. package/dist/src/planner/nodes/analyze-node.js +18 -1
  349. package/dist/src/planner/nodes/analyze-node.js.map +1 -1
  350. package/dist/src/planner/nodes/asserted-keys-node.d.ts +43 -0
  351. package/dist/src/planner/nodes/asserted-keys-node.d.ts.map +1 -0
  352. package/dist/src/planner/nodes/asserted-keys-node.js +99 -0
  353. package/dist/src/planner/nodes/asserted-keys-node.js.map +1 -0
  354. package/dist/src/planner/nodes/async-gather-node.d.ts.map +1 -1
  355. package/dist/src/planner/nodes/async-gather-node.js +33 -8
  356. package/dist/src/planner/nodes/async-gather-node.js.map +1 -1
  357. package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -1
  358. package/dist/src/planner/nodes/bloom-join-node.js +2 -1
  359. package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
  360. package/dist/src/planner/nodes/create-view-node.d.ts +7 -2
  361. package/dist/src/planner/nodes/create-view-node.d.ts.map +1 -1
  362. package/dist/src/planner/nodes/create-view-node.js +4 -1
  363. package/dist/src/planner/nodes/create-view-node.js.map +1 -1
  364. package/dist/src/planner/nodes/declarative-schema.d.ts +13 -1
  365. package/dist/src/planner/nodes/declarative-schema.d.ts.map +1 -1
  366. package/dist/src/planner/nodes/declarative-schema.js +32 -0
  367. package/dist/src/planner/nodes/declarative-schema.js.map +1 -1
  368. package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
  369. package/dist/src/planner/nodes/distinct-node.js +2 -0
  370. package/dist/src/planner/nodes/distinct-node.js.map +1 -1
  371. package/dist/src/planner/nodes/dml-executor-node.d.ts +29 -1
  372. package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
  373. package/dist/src/planner/nodes/dml-executor-node.js +27 -3
  374. package/dist/src/planner/nodes/dml-executor-node.js.map +1 -1
  375. package/dist/src/planner/nodes/eager-prefetch-node.d.ts.map +1 -1
  376. package/dist/src/planner/nodes/eager-prefetch-node.js +2 -0
  377. package/dist/src/planner/nodes/eager-prefetch-node.js.map +1 -1
  378. package/dist/src/planner/nodes/envelope-scan-node.d.ts +42 -0
  379. package/dist/src/planner/nodes/envelope-scan-node.d.ts.map +1 -0
  380. package/dist/src/planner/nodes/envelope-scan-node.js +62 -0
  381. package/dist/src/planner/nodes/envelope-scan-node.js.map +1 -0
  382. package/dist/src/planner/nodes/fanout-lookup-join-node.d.ts.map +1 -1
  383. package/dist/src/planner/nodes/fanout-lookup-join-node.js +11 -1
  384. package/dist/src/planner/nodes/fanout-lookup-join-node.js.map +1 -1
  385. package/dist/src/planner/nodes/filter.d.ts.map +1 -1
  386. package/dist/src/planner/nodes/filter.js +63 -13
  387. package/dist/src/planner/nodes/filter.js.map +1 -1
  388. package/dist/src/planner/nodes/join-node.d.ts +41 -1
  389. package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
  390. package/dist/src/planner/nodes/join-node.js +78 -8
  391. package/dist/src/planner/nodes/join-node.js.map +1 -1
  392. package/dist/src/planner/nodes/join-utils.d.ts +33 -6
  393. package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
  394. package/dist/src/planner/nodes/join-utils.js +124 -9
  395. package/dist/src/planner/nodes/join-utils.js.map +1 -1
  396. package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts +104 -0
  397. package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts.map +1 -0
  398. package/dist/src/planner/nodes/lens-auxiliary-access-node.js +91 -0
  399. package/dist/src/planner/nodes/lens-auxiliary-access-node.js.map +1 -0
  400. package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
  401. package/dist/src/planner/nodes/limit-offset.js +4 -5
  402. package/dist/src/planner/nodes/limit-offset.js.map +1 -1
  403. package/dist/src/planner/nodes/materialized-view-nodes.d.ts +69 -0
  404. package/dist/src/planner/nodes/materialized-view-nodes.d.ts.map +1 -0
  405. package/dist/src/planner/nodes/materialized-view-nodes.js +111 -0
  406. package/dist/src/planner/nodes/materialized-view-nodes.js.map +1 -0
  407. package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
  408. package/dist/src/planner/nodes/merge-join-node.js +2 -1
  409. package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
  410. package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -1
  411. package/dist/src/planner/nodes/ordinal-slice-node.js +2 -0
  412. package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -1
  413. package/dist/src/planner/nodes/plan-node-type.d.ts +9 -0
  414. package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
  415. package/dist/src/planner/nodes/plan-node-type.js +9 -0
  416. package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
  417. package/dist/src/planner/nodes/plan-node.d.ts +265 -5
  418. package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
  419. package/dist/src/planner/nodes/plan-node.js.map +1 -1
  420. package/dist/src/planner/nodes/pragma.d.ts +2 -1
  421. package/dist/src/planner/nodes/pragma.d.ts.map +1 -1
  422. package/dist/src/planner/nodes/pragma.js +12 -0
  423. package/dist/src/planner/nodes/pragma.js.map +1 -1
  424. package/dist/src/planner/nodes/project-node.d.ts +14 -1
  425. package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
  426. package/dist/src/planner/nodes/project-node.js +85 -11
  427. package/dist/src/planner/nodes/project-node.js.map +1 -1
  428. package/dist/src/planner/nodes/reference.d.ts.map +1 -1
  429. package/dist/src/planner/nodes/reference.js +62 -27
  430. package/dist/src/planner/nodes/reference.js.map +1 -1
  431. package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -1
  432. package/dist/src/planner/nodes/retrieve-node.js +7 -0
  433. package/dist/src/planner/nodes/retrieve-node.js.map +1 -1
  434. package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
  435. package/dist/src/planner/nodes/returning-node.js +10 -3
  436. package/dist/src/planner/nodes/returning-node.js.map +1 -1
  437. package/dist/src/planner/nodes/scalar.d.ts +20 -0
  438. package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
  439. package/dist/src/planner/nodes/scalar.js +71 -14
  440. package/dist/src/planner/nodes/scalar.js.map +1 -1
  441. package/dist/src/planner/nodes/set-object-tags-node.d.ts +39 -0
  442. package/dist/src/planner/nodes/set-object-tags-node.d.ts.map +1 -0
  443. package/dist/src/planner/nodes/set-object-tags-node.js +41 -0
  444. package/dist/src/planner/nodes/set-object-tags-node.js.map +1 -0
  445. package/dist/src/planner/nodes/set-operation-node.d.ts +123 -1
  446. package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
  447. package/dist/src/planner/nodes/set-operation-node.js +291 -18
  448. package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
  449. package/dist/src/planner/nodes/single-row.d.ts.map +1 -1
  450. package/dist/src/planner/nodes/single-row.js +3 -0
  451. package/dist/src/planner/nodes/single-row.js.map +1 -1
  452. package/dist/src/planner/nodes/sort.d.ts.map +1 -1
  453. package/dist/src/planner/nodes/sort.js +7 -6
  454. package/dist/src/planner/nodes/sort.js.map +1 -1
  455. package/dist/src/planner/nodes/subquery.d.ts +2 -0
  456. package/dist/src/planner/nodes/subquery.d.ts.map +1 -1
  457. package/dist/src/planner/nodes/subquery.js +18 -2
  458. package/dist/src/planner/nodes/subquery.js.map +1 -1
  459. package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
  460. package/dist/src/planner/nodes/table-access-nodes.js +23 -3
  461. package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
  462. package/dist/src/planner/nodes/table-function-call.js +6 -0
  463. package/dist/src/planner/nodes/table-function-call.js.map +1 -1
  464. package/dist/src/planner/nodes/values-node.d.ts +1 -0
  465. package/dist/src/planner/nodes/values-node.d.ts.map +1 -1
  466. package/dist/src/planner/nodes/values-node.js +16 -6
  467. package/dist/src/planner/nodes/values-node.js.map +1 -1
  468. package/dist/src/planner/nodes/view-mutation-node.d.ts +259 -0
  469. package/dist/src/planner/nodes/view-mutation-node.d.ts.map +1 -0
  470. package/dist/src/planner/nodes/view-mutation-node.js +273 -0
  471. package/dist/src/planner/nodes/view-mutation-node.js.map +1 -0
  472. package/dist/src/planner/nodes/window-function.d.ts +17 -1
  473. package/dist/src/planner/nodes/window-function.d.ts.map +1 -1
  474. package/dist/src/planner/nodes/window-function.js +15 -1
  475. package/dist/src/planner/nodes/window-function.js.map +1 -1
  476. package/dist/src/planner/nodes/window-node.js +2 -2
  477. package/dist/src/planner/nodes/window-node.js.map +1 -1
  478. package/dist/src/planner/optimizer.d.ts.map +1 -1
  479. package/dist/src/planner/optimizer.js +372 -39
  480. package/dist/src/planner/optimizer.js.map +1 -1
  481. package/dist/src/planner/planning-context.d.ts +1 -1
  482. package/dist/src/planner/planning-context.d.ts.map +1 -1
  483. package/dist/src/planner/rules/access/lens-access-form-matcher.d.ts +70 -0
  484. package/dist/src/planner/rules/access/lens-access-form-matcher.d.ts.map +1 -0
  485. package/dist/src/planner/rules/access/lens-access-form-matcher.js +156 -0
  486. package/dist/src/planner/rules/access/lens-access-form-matcher.js.map +1 -0
  487. package/dist/src/planner/rules/access/rule-lens-auxiliary-access.d.ts +31 -0
  488. package/dist/src/planner/rules/access/rule-lens-auxiliary-access.d.ts.map +1 -0
  489. package/dist/src/planner/rules/access/rule-lens-auxiliary-access.js +176 -0
  490. package/dist/src/planner/rules/access/rule-lens-auxiliary-access.js.map +1 -0
  491. package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
  492. package/dist/src/planner/rules/access/rule-select-access-path.js +435 -37
  493. package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
  494. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts.map +1 -1
  495. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js +9 -0
  496. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js.map +1 -1
  497. package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.d.ts +39 -0
  498. package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.d.ts.map +1 -0
  499. package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js +616 -0
  500. package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js.map +1 -0
  501. package/dist/src/planner/rules/cache/rule-scalar-cse.d.ts.map +1 -1
  502. package/dist/src/planner/rules/cache/rule-scalar-cse.js +8 -1
  503. package/dist/src/planner/rules/cache/rule-scalar-cse.js.map +1 -1
  504. package/dist/src/planner/rules/join/equi-pair-extractor.d.ts +36 -0
  505. package/dist/src/planner/rules/join/equi-pair-extractor.d.ts.map +1 -1
  506. package/dist/src/planner/rules/join/equi-pair-extractor.js +38 -1
  507. package/dist/src/planner/rules/join/equi-pair-extractor.js.map +1 -1
  508. package/dist/src/planner/rules/join/rule-fanout-batched-outer.d.ts.map +1 -1
  509. package/dist/src/planner/rules/join/rule-fanout-batched-outer.js +10 -0
  510. package/dist/src/planner/rules/join/rule-fanout-batched-outer.js.map +1 -1
  511. package/dist/src/planner/rules/join/rule-fanout-lookup-join.d.ts.map +1 -1
  512. package/dist/src/planner/rules/join/rule-fanout-lookup-join.js +19 -1
  513. package/dist/src/planner/rules/join/rule-fanout-lookup-join.js.map +1 -1
  514. package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.d.ts +130 -0
  515. package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.d.ts.map +1 -0
  516. package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.js +206 -0
  517. package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.js.map +1 -0
  518. package/dist/src/planner/rules/join/rule-join-elimination.d.ts +67 -14
  519. package/dist/src/planner/rules/join/rule-join-elimination.d.ts.map +1 -1
  520. package/dist/src/planner/rules/join/rule-join-elimination.js +81 -25
  521. package/dist/src/planner/rules/join/rule-join-elimination.js.map +1 -1
  522. package/dist/src/planner/rules/join/rule-join-existence-pruning.d.ts +84 -0
  523. package/dist/src/planner/rules/join/rule-join-existence-pruning.d.ts.map +1 -0
  524. package/dist/src/planner/rules/join/rule-join-existence-pruning.js +138 -0
  525. package/dist/src/planner/rules/join/rule-join-existence-pruning.js.map +1 -0
  526. package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -1
  527. package/dist/src/planner/rules/join/rule-join-greedy-commute.js +9 -1
  528. package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -1
  529. package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
  530. package/dist/src/planner/rules/join/rule-join-physical-selection.js +12 -1
  531. package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
  532. package/dist/src/planner/rules/join/rule-lateral-top1-asof.d.ts.map +1 -1
  533. package/dist/src/planner/rules/join/rule-lateral-top1-asof.js +4 -0
  534. package/dist/src/planner/rules/join/rule-lateral-top1-asof.js.map +1 -1
  535. package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts.map +1 -1
  536. package/dist/src/planner/rules/join/rule-monotonic-merge-join.js +4 -0
  537. package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -1
  538. package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts.map +1 -1
  539. package/dist/src/planner/rules/join/rule-quickpick-enumeration.js +10 -0
  540. package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +1 -1
  541. package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.d.ts +286 -0
  542. package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.d.ts.map +1 -0
  543. package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.js +548 -0
  544. package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.js.map +1 -0
  545. package/dist/src/planner/rules/parallel/rule-async-gather-union-all.d.ts.map +1 -1
  546. package/dist/src/planner/rules/parallel/rule-async-gather-union-all.js +9 -1
  547. package/dist/src/planner/rules/parallel/rule-async-gather-union-all.js.map +1 -1
  548. package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.d.ts.map +1 -1
  549. package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.js +7 -0
  550. package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.js.map +1 -1
  551. package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.d.ts.map +1 -1
  552. package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.js +10 -1
  553. package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.js.map +1 -1
  554. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts.map +1 -1
  555. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js +9 -0
  556. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js.map +1 -1
  557. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts.map +1 -1
  558. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js +18 -0
  559. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js.map +1 -1
  560. package/dist/src/planner/rules/predicate/rule-filter-contradiction.d.ts.map +1 -1
  561. package/dist/src/planner/rules/predicate/rule-filter-contradiction.js +7 -0
  562. package/dist/src/planner/rules/predicate/rule-filter-contradiction.js.map +1 -1
  563. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts.map +1 -1
  564. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js +9 -0
  565. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js.map +1 -1
  566. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +13 -3
  567. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -1
  568. package/dist/src/planner/rules/retrieve/rule-projection-pruning.d.ts.map +1 -1
  569. package/dist/src/planner/rules/retrieve/rule-projection-pruning.js +14 -0
  570. package/dist/src/planner/rules/retrieve/rule-projection-pruning.js.map +1 -1
  571. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts +1 -1
  572. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js +4 -4
  573. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js.map +1 -1
  574. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts.map +1 -1
  575. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js +8 -0
  576. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js.map +1 -1
  577. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts.map +1 -1
  578. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js +7 -0
  579. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js.map +1 -1
  580. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -1
  581. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +12 -0
  582. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
  583. package/dist/src/planner/type-utils.d.ts +14 -0
  584. package/dist/src/planner/type-utils.d.ts.map +1 -1
  585. package/dist/src/planner/type-utils.js +66 -21
  586. package/dist/src/planner/type-utils.js.map +1 -1
  587. package/dist/src/planner/util/fd-utils.d.ts +177 -43
  588. package/dist/src/planner/util/fd-utils.d.ts.map +1 -1
  589. package/dist/src/planner/util/fd-utils.js +396 -101
  590. package/dist/src/planner/util/fd-utils.js.map +1 -1
  591. package/dist/src/planner/util/ind-utils.d.ts +27 -1
  592. package/dist/src/planner/util/ind-utils.d.ts.map +1 -1
  593. package/dist/src/planner/util/ind-utils.js +80 -6
  594. package/dist/src/planner/util/ind-utils.js.map +1 -1
  595. package/dist/src/planner/util/key-utils.d.ts.map +1 -1
  596. package/dist/src/planner/util/key-utils.js +81 -12
  597. package/dist/src/planner/util/key-utils.js.map +1 -1
  598. package/dist/src/planner/util/set-op-wrapper.d.ts +37 -0
  599. package/dist/src/planner/util/set-op-wrapper.d.ts.map +1 -0
  600. package/dist/src/planner/util/set-op-wrapper.js +82 -0
  601. package/dist/src/planner/util/set-op-wrapper.js.map +1 -0
  602. package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
  603. package/dist/src/planner/validation/plan-validator.js +1 -0
  604. package/dist/src/planner/validation/plan-validator.js.map +1 -1
  605. package/dist/src/runtime/context-helpers.d.ts +13 -1
  606. package/dist/src/runtime/context-helpers.d.ts.map +1 -1
  607. package/dist/src/runtime/context-helpers.js +7 -1
  608. package/dist/src/runtime/context-helpers.js.map +1 -1
  609. package/dist/src/runtime/delta-executor.d.ts +30 -1
  610. package/dist/src/runtime/delta-executor.d.ts.map +1 -1
  611. package/dist/src/runtime/delta-executor.js +29 -4
  612. package/dist/src/runtime/delta-executor.js.map +1 -1
  613. package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
  614. package/dist/src/runtime/emit/add-constraint.js +38 -5
  615. package/dist/src/runtime/emit/add-constraint.js.map +1 -1
  616. package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
  617. package/dist/src/runtime/emit/aggregate.js +10 -8
  618. package/dist/src/runtime/emit/aggregate.js.map +1 -1
  619. package/dist/src/runtime/emit/alter-table.d.ts +1 -1
  620. package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
  621. package/dist/src/runtime/emit/alter-table.js +664 -108
  622. package/dist/src/runtime/emit/alter-table.js.map +1 -1
  623. package/dist/src/runtime/emit/analyze.d.ts.map +1 -1
  624. package/dist/src/runtime/emit/analyze.js +2 -1
  625. package/dist/src/runtime/emit/analyze.js.map +1 -1
  626. package/dist/src/runtime/emit/asof-scan.d.ts.map +1 -1
  627. package/dist/src/runtime/emit/asof-scan.js +18 -5
  628. package/dist/src/runtime/emit/asof-scan.js.map +1 -1
  629. package/dist/src/runtime/emit/asserted-keys.d.ts +13 -0
  630. package/dist/src/runtime/emit/asserted-keys.d.ts.map +1 -0
  631. package/dist/src/runtime/emit/asserted-keys.js +13 -0
  632. package/dist/src/runtime/emit/asserted-keys.js.map +1 -0
  633. package/dist/src/runtime/emit/between.d.ts.map +1 -1
  634. package/dist/src/runtime/emit/between.js +24 -19
  635. package/dist/src/runtime/emit/between.js.map +1 -1
  636. package/dist/src/runtime/emit/binary.d.ts.map +1 -1
  637. package/dist/src/runtime/emit/binary.js +5 -9
  638. package/dist/src/runtime/emit/binary.js.map +1 -1
  639. package/dist/src/runtime/emit/block.d.ts.map +1 -1
  640. package/dist/src/runtime/emit/block.js +11 -2
  641. package/dist/src/runtime/emit/block.js.map +1 -1
  642. package/dist/src/runtime/emit/bloom-join.d.ts.map +1 -1
  643. package/dist/src/runtime/emit/bloom-join.js +8 -2
  644. package/dist/src/runtime/emit/bloom-join.js.map +1 -1
  645. package/dist/src/runtime/emit/constraint-check.js +15 -0
  646. package/dist/src/runtime/emit/constraint-check.js.map +1 -1
  647. package/dist/src/runtime/emit/create-table.d.ts.map +1 -1
  648. package/dist/src/runtime/emit/create-table.js +8 -0
  649. package/dist/src/runtime/emit/create-table.js.map +1 -1
  650. package/dist/src/runtime/emit/create-view.d.ts.map +1 -1
  651. package/dist/src/runtime/emit/create-view.js +16 -1
  652. package/dist/src/runtime/emit/create-view.js.map +1 -1
  653. package/dist/src/runtime/emit/dml-executor.d.ts +27 -0
  654. package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
  655. package/dist/src/runtime/emit/dml-executor.js +413 -193
  656. package/dist/src/runtime/emit/dml-executor.js.map +1 -1
  657. package/dist/src/runtime/emit/drop-table.d.ts.map +1 -1
  658. package/dist/src/runtime/emit/drop-table.js +10 -0
  659. package/dist/src/runtime/emit/drop-table.js.map +1 -1
  660. package/dist/src/runtime/emit/drop-view.d.ts.map +1 -1
  661. package/dist/src/runtime/emit/drop-view.js +17 -0
  662. package/dist/src/runtime/emit/drop-view.js.map +1 -1
  663. package/dist/src/runtime/emit/envelope-scan.d.ts +13 -0
  664. package/dist/src/runtime/emit/envelope-scan.d.ts.map +1 -0
  665. package/dist/src/runtime/emit/envelope-scan.js +22 -0
  666. package/dist/src/runtime/emit/envelope-scan.js.map +1 -0
  667. package/dist/src/runtime/emit/join.d.ts +10 -2
  668. package/dist/src/runtime/emit/join.d.ts.map +1 -1
  669. package/dist/src/runtime/emit/join.js +128 -38
  670. package/dist/src/runtime/emit/join.js.map +1 -1
  671. package/dist/src/runtime/emit/lens-auxiliary-access.d.ts +16 -0
  672. package/dist/src/runtime/emit/lens-auxiliary-access.d.ts.map +1 -0
  673. package/dist/src/runtime/emit/lens-auxiliary-access.js +16 -0
  674. package/dist/src/runtime/emit/lens-auxiliary-access.js.map +1 -0
  675. package/dist/src/runtime/emit/materialized-view-helpers.d.ts +640 -0
  676. package/dist/src/runtime/emit/materialized-view-helpers.d.ts.map +1 -0
  677. package/dist/src/runtime/emit/materialized-view-helpers.js +2576 -0
  678. package/dist/src/runtime/emit/materialized-view-helpers.js.map +1 -0
  679. package/dist/src/runtime/emit/materialized-view.d.ts +31 -0
  680. package/dist/src/runtime/emit/materialized-view.d.ts.map +1 -0
  681. package/dist/src/runtime/emit/materialized-view.js +187 -0
  682. package/dist/src/runtime/emit/materialized-view.js.map +1 -0
  683. package/dist/src/runtime/emit/merge-join.d.ts.map +1 -1
  684. package/dist/src/runtime/emit/merge-join.js +15 -3
  685. package/dist/src/runtime/emit/merge-join.js.map +1 -1
  686. package/dist/src/runtime/emit/project.d.ts.map +1 -1
  687. package/dist/src/runtime/emit/project.js +10 -5
  688. package/dist/src/runtime/emit/project.js.map +1 -1
  689. package/dist/src/runtime/emit/schema-declarative.d.ts +1 -0
  690. package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -1
  691. package/dist/src/runtime/emit/schema-declarative.js +101 -5
  692. package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
  693. package/dist/src/runtime/emit/set-object-tags.d.ts +16 -0
  694. package/dist/src/runtime/emit/set-object-tags.d.ts.map +1 -0
  695. package/dist/src/runtime/emit/set-object-tags.js +57 -0
  696. package/dist/src/runtime/emit/set-object-tags.js.map +1 -0
  697. package/dist/src/runtime/emit/set-operation.d.ts.map +1 -1
  698. package/dist/src/runtime/emit/set-operation.js +140 -24
  699. package/dist/src/runtime/emit/set-operation.js.map +1 -1
  700. package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
  701. package/dist/src/runtime/emit/subquery.js +110 -5
  702. package/dist/src/runtime/emit/subquery.js.map +1 -1
  703. package/dist/src/runtime/emit/unary.d.ts.map +1 -1
  704. package/dist/src/runtime/emit/unary.js +34 -6
  705. package/dist/src/runtime/emit/unary.js.map +1 -1
  706. package/dist/src/runtime/emit/view-mutation.d.ts +70 -0
  707. package/dist/src/runtime/emit/view-mutation.d.ts.map +1 -0
  708. package/dist/src/runtime/emit/view-mutation.js +299 -0
  709. package/dist/src/runtime/emit/view-mutation.js.map +1 -0
  710. package/dist/src/runtime/emit/window.js +29 -5
  711. package/dist/src/runtime/emit/window.js.map +1 -1
  712. package/dist/src/runtime/foreign-key-actions.d.ts +66 -3
  713. package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -1
  714. package/dist/src/runtime/foreign-key-actions.js +580 -172
  715. package/dist/src/runtime/foreign-key-actions.js.map +1 -1
  716. package/dist/src/runtime/parallel-driver.d.ts +4 -1
  717. package/dist/src/runtime/parallel-driver.d.ts.map +1 -1
  718. package/dist/src/runtime/parallel-driver.js +5 -1
  719. package/dist/src/runtime/parallel-driver.js.map +1 -1
  720. package/dist/src/runtime/register.d.ts.map +1 -1
  721. package/dist/src/runtime/register.js +17 -1
  722. package/dist/src/runtime/register.js.map +1 -1
  723. package/dist/src/runtime/types.d.ts +10 -0
  724. package/dist/src/runtime/types.d.ts.map +1 -1
  725. package/dist/src/runtime/types.js.map +1 -1
  726. package/dist/src/schema/basis-backfill.d.ts +63 -0
  727. package/dist/src/schema/basis-backfill.d.ts.map +1 -0
  728. package/dist/src/schema/basis-backfill.js +161 -0
  729. package/dist/src/schema/basis-backfill.js.map +1 -0
  730. package/dist/src/schema/catalog.d.ts +115 -1
  731. package/dist/src/schema/catalog.d.ts.map +1 -1
  732. package/dist/src/schema/catalog.js +249 -22
  733. package/dist/src/schema/catalog.js.map +1 -1
  734. package/dist/src/schema/change-events.d.ts +42 -1
  735. package/dist/src/schema/change-events.d.ts.map +1 -1
  736. package/dist/src/schema/change-events.js.map +1 -1
  737. package/dist/src/schema/column.d.ts +16 -0
  738. package/dist/src/schema/column.d.ts.map +1 -1
  739. package/dist/src/schema/column.js.map +1 -1
  740. package/dist/src/schema/constraint-builder.d.ts +182 -0
  741. package/dist/src/schema/constraint-builder.d.ts.map +1 -0
  742. package/dist/src/schema/constraint-builder.js +424 -0
  743. package/dist/src/schema/constraint-builder.js.map +1 -0
  744. package/dist/src/schema/ddl-generator.d.ts +86 -1
  745. package/dist/src/schema/ddl-generator.d.ts.map +1 -1
  746. package/dist/src/schema/ddl-generator.js +316 -20
  747. package/dist/src/schema/ddl-generator.js.map +1 -1
  748. package/dist/src/schema/declared-schema-manager.d.ts +51 -0
  749. package/dist/src/schema/declared-schema-manager.d.ts.map +1 -1
  750. package/dist/src/schema/declared-schema-manager.js +61 -0
  751. package/dist/src/schema/declared-schema-manager.js.map +1 -1
  752. package/dist/src/schema/derivation.d.ts +106 -0
  753. package/dist/src/schema/derivation.d.ts.map +1 -0
  754. package/dist/src/schema/derivation.js +25 -0
  755. package/dist/src/schema/derivation.js.map +1 -0
  756. package/dist/src/schema/function.d.ts +13 -0
  757. package/dist/src/schema/function.d.ts.map +1 -1
  758. package/dist/src/schema/function.js.map +1 -1
  759. package/dist/src/schema/lens-ack.d.ts +90 -0
  760. package/dist/src/schema/lens-ack.d.ts.map +1 -0
  761. package/dist/src/schema/lens-ack.js +361 -0
  762. package/dist/src/schema/lens-ack.js.map +1 -0
  763. package/dist/src/schema/lens-compiler.d.ts +62 -0
  764. package/dist/src/schema/lens-compiler.d.ts.map +1 -0
  765. package/dist/src/schema/lens-compiler.js +1594 -0
  766. package/dist/src/schema/lens-compiler.js.map +1 -0
  767. package/dist/src/schema/lens-fk-discovery.d.ts +175 -0
  768. package/dist/src/schema/lens-fk-discovery.d.ts.map +1 -0
  769. package/dist/src/schema/lens-fk-discovery.js +336 -0
  770. package/dist/src/schema/lens-fk-discovery.js.map +1 -0
  771. package/dist/src/schema/lens-prover.d.ts +336 -0
  772. package/dist/src/schema/lens-prover.d.ts.map +1 -0
  773. package/dist/src/schema/lens-prover.js +1988 -0
  774. package/dist/src/schema/lens-prover.js.map +1 -0
  775. package/dist/src/schema/lens.d.ts +254 -0
  776. package/dist/src/schema/lens.d.ts.map +1 -0
  777. package/dist/src/schema/lens.js +21 -0
  778. package/dist/src/schema/lens.js.map +1 -0
  779. package/dist/src/schema/manager.d.ts +676 -18
  780. package/dist/src/schema/manager.d.ts.map +1 -1
  781. package/dist/src/schema/manager.js +1573 -238
  782. package/dist/src/schema/manager.js.map +1 -1
  783. package/dist/src/schema/mapping-advertisement-tags.d.ts +39 -0
  784. package/dist/src/schema/mapping-advertisement-tags.d.ts.map +1 -0
  785. package/dist/src/schema/mapping-advertisement-tags.js +216 -0
  786. package/dist/src/schema/mapping-advertisement-tags.js.map +1 -0
  787. package/dist/src/schema/rename-rewriter.d.ts +45 -4
  788. package/dist/src/schema/rename-rewriter.d.ts.map +1 -1
  789. package/dist/src/schema/rename-rewriter.js +412 -19
  790. package/dist/src/schema/rename-rewriter.js.map +1 -1
  791. package/dist/src/schema/reserved-tags-policy.d.ts +32 -0
  792. package/dist/src/schema/reserved-tags-policy.d.ts.map +1 -0
  793. package/dist/src/schema/reserved-tags-policy.js +34 -0
  794. package/dist/src/schema/reserved-tags-policy.js.map +1 -0
  795. package/dist/src/schema/reserved-tags.d.ts +170 -0
  796. package/dist/src/schema/reserved-tags.d.ts.map +1 -0
  797. package/dist/src/schema/reserved-tags.js +507 -0
  798. package/dist/src/schema/reserved-tags.js.map +1 -0
  799. package/dist/src/schema/schema-differ.d.ts +158 -2
  800. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  801. package/dist/src/schema/schema-differ.js +1460 -78
  802. package/dist/src/schema/schema-differ.js.map +1 -1
  803. package/dist/src/schema/schema-hasher.d.ts +8 -3
  804. package/dist/src/schema/schema-hasher.d.ts.map +1 -1
  805. package/dist/src/schema/schema-hasher.js +22 -2
  806. package/dist/src/schema/schema-hasher.js.map +1 -1
  807. package/dist/src/schema/schema.d.ts +25 -1
  808. package/dist/src/schema/schema.d.ts.map +1 -1
  809. package/dist/src/schema/schema.js +36 -2
  810. package/dist/src/schema/schema.js.map +1 -1
  811. package/dist/src/schema/table.d.ts +259 -10
  812. package/dist/src/schema/table.d.ts.map +1 -1
  813. package/dist/src/schema/table.js +309 -26
  814. package/dist/src/schema/table.js.map +1 -1
  815. package/dist/src/schema/unique-enforcement.d.ts +78 -0
  816. package/dist/src/schema/unique-enforcement.d.ts.map +1 -0
  817. package/dist/src/schema/unique-enforcement.js +93 -0
  818. package/dist/src/schema/unique-enforcement.js.map +1 -0
  819. package/dist/src/schema/view.d.ts +83 -2
  820. package/dist/src/schema/view.d.ts.map +1 -1
  821. package/dist/src/schema/view.js +67 -1
  822. package/dist/src/schema/view.js.map +1 -1
  823. package/dist/src/schema/window-function.d.ts +9 -1
  824. package/dist/src/schema/window-function.d.ts.map +1 -1
  825. package/dist/src/schema/window-function.js.map +1 -1
  826. package/dist/src/util/comparison.d.ts +24 -0
  827. package/dist/src/util/comparison.d.ts.map +1 -1
  828. package/dist/src/util/comparison.js +34 -0
  829. package/dist/src/util/comparison.js.map +1 -1
  830. package/dist/src/util/mutation-statement.d.ts.map +1 -1
  831. package/dist/src/util/mutation-statement.js +4 -1
  832. package/dist/src/util/mutation-statement.js.map +1 -1
  833. package/dist/src/util/serialization.d.ts +9 -0
  834. package/dist/src/util/serialization.d.ts.map +1 -1
  835. package/dist/src/util/serialization.js +26 -0
  836. package/dist/src/util/serialization.js.map +1 -1
  837. package/dist/src/vtab/backing-host.d.ts +286 -0
  838. package/dist/src/vtab/backing-host.d.ts.map +1 -0
  839. package/dist/src/vtab/backing-host.js +118 -0
  840. package/dist/src/vtab/backing-host.js.map +1 -0
  841. package/dist/src/vtab/best-access-plan.d.ts +21 -0
  842. package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
  843. package/dist/src/vtab/best-access-plan.js.map +1 -1
  844. package/dist/src/vtab/capabilities.d.ts +5 -5
  845. package/dist/src/vtab/capabilities.d.ts.map +1 -1
  846. package/dist/src/vtab/mapping-advertisement.d.ts +163 -0
  847. package/dist/src/vtab/mapping-advertisement.d.ts.map +1 -0
  848. package/dist/src/vtab/mapping-advertisement.js +2 -0
  849. package/dist/src/vtab/mapping-advertisement.js.map +1 -0
  850. package/dist/src/vtab/memory/index.d.ts +64 -4
  851. package/dist/src/vtab/memory/index.d.ts.map +1 -1
  852. package/dist/src/vtab/memory/index.js +119 -12
  853. package/dist/src/vtab/memory/index.js.map +1 -1
  854. package/dist/src/vtab/memory/layer/base.d.ts +38 -1
  855. package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
  856. package/dist/src/vtab/memory/layer/base.js +112 -24
  857. package/dist/src/vtab/memory/layer/base.js.map +1 -1
  858. package/dist/src/vtab/memory/layer/manager.d.ts +291 -4
  859. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  860. package/dist/src/vtab/memory/layer/manager.js +1050 -91
  861. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  862. package/dist/src/vtab/memory/layer/plan-filter.d.ts.map +1 -1
  863. package/dist/src/vtab/memory/layer/plan-filter.js +35 -6
  864. package/dist/src/vtab/memory/layer/plan-filter.js.map +1 -1
  865. package/dist/src/vtab/memory/layer/scan-layer.d.ts.map +1 -1
  866. package/dist/src/vtab/memory/layer/scan-layer.js +66 -14
  867. package/dist/src/vtab/memory/layer/scan-layer.js.map +1 -1
  868. package/dist/src/vtab/memory/layer/scan-plan.d.ts +14 -0
  869. package/dist/src/vtab/memory/layer/scan-plan.d.ts.map +1 -1
  870. package/dist/src/vtab/memory/layer/scan-plan.js +27 -4
  871. package/dist/src/vtab/memory/layer/scan-plan.js.map +1 -1
  872. package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
  873. package/dist/src/vtab/memory/layer/transaction.js +5 -1
  874. package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
  875. package/dist/src/vtab/memory/module.d.ts +17 -0
  876. package/dist/src/vtab/memory/module.d.ts.map +1 -1
  877. package/dist/src/vtab/memory/module.js +82 -3
  878. package/dist/src/vtab/memory/module.js.map +1 -1
  879. package/dist/src/vtab/memory/table.d.ts.map +1 -1
  880. package/dist/src/vtab/memory/table.js +15 -5
  881. package/dist/src/vtab/memory/table.js.map +1 -1
  882. package/dist/src/vtab/memory/types.d.ts +20 -2
  883. package/dist/src/vtab/memory/types.d.ts.map +1 -1
  884. package/dist/src/vtab/memory/utils/predicate.d.ts.map +1 -1
  885. package/dist/src/vtab/memory/utils/predicate.js +46 -24
  886. package/dist/src/vtab/memory/utils/predicate.js.map +1 -1
  887. package/dist/src/vtab/memory/utils/primary-key-encode.d.ts +31 -0
  888. package/dist/src/vtab/memory/utils/primary-key-encode.d.ts.map +1 -0
  889. package/dist/src/vtab/memory/utils/primary-key-encode.js +101 -0
  890. package/dist/src/vtab/memory/utils/primary-key-encode.js.map +1 -0
  891. package/dist/src/vtab/memory/utils/primary-key.d.ts +8 -0
  892. package/dist/src/vtab/memory/utils/primary-key.d.ts.map +1 -1
  893. package/dist/src/vtab/memory/utils/primary-key.js +12 -5
  894. package/dist/src/vtab/memory/utils/primary-key.js.map +1 -1
  895. package/dist/src/vtab/module.d.ts +203 -4
  896. package/dist/src/vtab/module.d.ts.map +1 -1
  897. package/dist/src/vtab/table.d.ts +9 -0
  898. package/dist/src/vtab/table.d.ts.map +1 -1
  899. package/dist/src/vtab/table.js.map +1 -1
  900. package/package.json +6 -5
@@ -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, NOCASE_COLLATION, RTRIM_COLLATION } from '../util/comparison.js';
10
+ import { BINARY_COLLATION, NOCASE_COLLATION, RTRIM_COLLATION, normalizeCollationName } from '../util/comparison.js';
11
11
  import { BUILTIN_NORMALIZERS } from '../util/key-serializer.js';
12
12
  import { Parser } from '../parser/parser.js';
13
13
  import { buildBlock } from '../planner/building/block.js';
14
14
  import { emitPlanNode } from '../runtime/emitters.js';
15
+ import { refreshMaintainedTable } from '../runtime/emit/materialized-view.js';
15
16
  import { Scheduler } from '../runtime/scheduler.js';
16
17
  import { createStrictRowContextMap, wrapTableContextsStrict } from '../runtime/strict-fork.js';
17
18
  import { BuildTimeDependencyTracker } from '../planner/planning-context.js';
@@ -23,6 +24,7 @@ import { EmissionContext } from '../runtime/emission-context.js';
23
24
  import { Optimizer, DEFAULT_TUNING } from '../planner/optimizer.js';
24
25
  import { registerBuiltinWindowFunctions } from '../func/builtins/builtin-window-functions.js';
25
26
  import { DatabaseOptionsManager } from './database-options.js';
27
+ import { MAINTENANCE_REBUILD_ROW_THRESHOLD } from '../planner/cost/index.js';
26
28
  import { DeclaredSchemaManager } from '../schema/declared-schema-manager.js';
27
29
  import { DeferredConstraintQueue } from '../runtime/deferred-constraint-queue.js';
28
30
  import { registerType as registerTypeInRegistry } from '../types/registry.js';
@@ -31,8 +33,10 @@ import { rowToObject } from './utils.js';
31
33
  import { wrapAsyncIterator } from '../util/async-iterator.js';
32
34
  import { DatabaseEventEmitter, } from './database-events.js';
33
35
  import { TransactionManager } from './database-transaction.js';
36
+ import { ingestExternalRowChangeBatch } from './database-external-changes.js';
34
37
  import { AssertionEvaluator } from './database-assertions.js';
35
38
  import { WatcherManager } from './database-watchers.js';
39
+ import { MaterializedViewManager } from './database-materialized-views.js';
36
40
  import { tryGetEventEmitter } from '../vtab/events.js';
37
41
  import { Table } from './table-handle.js';
38
42
  const log = createLogger('core:database');
@@ -65,6 +69,14 @@ export class Database {
65
69
  * transaction state, matching SQLite's behavior of serializing writes.
66
70
  */
67
71
  execMutex = Promise.resolve();
72
+ /**
73
+ * Depth of currently-held exec-mutex acquisitions. >0 while a statement
74
+ * (`exec`/`eval`), an external-change ingest, or an MV-refresh sweep holds the
75
+ * mutex. Read via {@link _isExecuting} so a re-entrant caller (e.g. a module
76
+ * `notifyLensDeployment` listener that would itself re-enter the engine) can
77
+ * detect it must defer rather than deadlock on the held mutex.
78
+ */
79
+ execMutexDepth = 0;
68
80
  /** Database-level event emitter for unified reactivity */
69
81
  eventEmitter = new DatabaseEventEmitter();
70
82
  /** Transaction management */
@@ -73,9 +85,15 @@ export class Database {
73
85
  assertionEvaluator;
74
86
  /** Post-commit watcher dispatch */
75
87
  watcherManager;
76
- /** Per-database collation registry comparator + optional key normalizer.
77
- * The normalizer is required for index participation; comparator-only
78
- * collations may still be used in ORDER BY but cannot back a compound index. */
88
+ /** Materialized-view schema-change staleness tracking */
89
+ materializedViewManager;
90
+ /** Per-database collation registry comparator + optional key normalizer +
91
+ * optional REPLICABLE assertion. The normalizer is required for index
92
+ * participation; comparator-only collations may still be used in ORDER BY but
93
+ * cannot back a compound index. `replicable` (stamped `true` on the built-ins,
94
+ * opt-in for a custom collation) is consulted only by the materialized-view
95
+ * replicable-collation gate when the backing host demands it
96
+ * (see {@link _isCollationReplicable}). */
79
97
  collations = new Map();
80
98
  constructor() {
81
99
  this.schemaManager = new SchemaManager(this);
@@ -96,6 +114,7 @@ export class Database {
96
114
  this.transactionManager = new TransactionManager(this);
97
115
  this.assertionEvaluator = new AssertionEvaluator(this);
98
116
  this.watcherManager = new WatcherManager(this);
117
+ this.materializedViewManager = new MaterializedViewManager(this);
99
118
  // Set up option change listeners
100
119
  this.setupOptionListeners();
101
120
  }
@@ -192,6 +211,21 @@ export class Database {
192
211
  log('Default column nullability changed to: %s', value);
193
212
  }
194
213
  });
214
+ this.options.registerOption('default_collation', {
215
+ type: 'string',
216
+ defaultValue: 'BINARY',
217
+ description: 'Default declared collation for columns with no explicit COLLATE (e.g. "BINARY", "NOCASE", "RTRIM", or any registered collation). Create-time authoring convenience only; the catalog stores concrete collations and persisted DDL always carries an explicit non-BINARY COLLATE.',
218
+ onChange: (event) => {
219
+ const value = event.newValue;
220
+ const normalized = normalizeCollationName(value);
221
+ // Validate at set time so a typo fails loudly, not at first comparison.
222
+ // The options framework rolls the value back when onChange throws.
223
+ if (this._getCollation(normalized) === undefined) {
224
+ throw new QuereusError(`Unknown collation '${value}' for default_collation`, StatusCode.ERROR);
225
+ }
226
+ log('Default collation changed to: %s', normalized);
227
+ }
228
+ });
195
229
  this.options.registerOption('schema_path', {
196
230
  type: 'string',
197
231
  defaultValue: 'main',
@@ -213,13 +247,49 @@ export class Database {
213
247
  aliases: ['fk_enforcement'],
214
248
  description: 'Enable foreign key constraint enforcement. When omitted, ON DELETE / ON UPDATE default to RESTRICT.',
215
249
  });
250
+ this.options.registerOption('nondeterministic_schema', {
251
+ type: 'boolean',
252
+ defaultValue: false,
253
+ aliases: ['allow_nondeterministic_schema_expressions'],
254
+ description: 'When true, permit non-deterministic expressions in DEFAULT, CHECK, and GENERATED ALWAYS AS clauses. ' +
255
+ 'Capture happens at the resolved-row frontier in vtab.update(); replay applies module-layer writes without re-evaluating constraints. ' +
256
+ 'Defaults to false (strict rejection) for backward compatibility.',
257
+ onChange: (event) => {
258
+ log('nondeterministic_schema changed to: %s', event.newValue);
259
+ }
260
+ });
261
+ this.options.registerOption('materialized_view_rebuild_row_threshold', {
262
+ type: 'number',
263
+ defaultValue: MAINTENANCE_REBUILD_ROW_THRESHOLD,
264
+ description: 'Largest source-row count for which a materialized view whose only sound maintenance ' +
265
+ 'strategy is a full body rebuild is accepted at create. A full-rebuild MV over a larger source ' +
266
+ 'is rejected (every write would re-scan the whole source). Set to 0 to disable the size reject ' +
267
+ '(accept any size). The check uses the largest participating source for a multi-source body.',
268
+ onChange: (event) => {
269
+ // Validate at set time so a bad value fails loudly; the options framework
270
+ // rolls the value back when onChange throws.
271
+ const value = event.newValue;
272
+ if (!Number.isFinite(value) || value < 0) {
273
+ throw new QuereusError(`Invalid materialized_view_rebuild_row_threshold ${event.newValue}: must be a non-negative number (0 disables the size reject)`, StatusCode.ERROR);
274
+ }
275
+ log('materialized_view_rebuild_row_threshold changed to: %s', value);
276
+ }
277
+ });
216
278
  }
217
279
  /** @internal Registers default built-in SQL functions */
218
280
  registerBuiltinFunctions() {
219
281
  const mainSchema = this.schemaManager.getMainSchema();
282
+ // Built-ins auto-qualify as REPLICABLE: Quereus implements its own collation,
283
+ // case-folding, and numeric formatting, so a deterministic builtin is
284
+ // bit-identical across peers' JS engines (see BaseFunctionSchema.replicable).
285
+ // This is the single seam that *knows* a schema is a builtin, so stamping here
286
+ // auto-qualifies all of them without editing ~100 definitions and without
287
+ // defaulting UDFs to replicable. Non-deterministic builtins (random, now, …) are
288
+ // stamped too — harmless, since the determinism gate rejects them first. Spread a
289
+ // COPY so the shared exported BUILTIN_FUNCTIONS constants are never mutated.
220
290
  BUILTIN_FUNCTIONS.forEach(funcDef => {
221
291
  try {
222
- mainSchema.addFunction(funcDef);
292
+ mainSchema.addFunction({ ...funcDef, replicable: true });
223
293
  }
224
294
  catch (e) {
225
295
  errorLog(`Failed to register built-in function ${funcDef.name}/${funcDef.numArgs}: %O`, e);
@@ -230,10 +300,15 @@ export class Database {
230
300
  /** @internal Registers default collation sequences */
231
301
  registerDefaultCollations() {
232
302
  // Register the built-in collations into per-instance registry, paired
233
- // with their key normalizers so they can back compound indexes.
234
- this.collations.set('BINARY', { comparator: BINARY_COLLATION, normalizer: BUILTIN_NORMALIZERS.BINARY });
235
- this.collations.set('NOCASE', { comparator: NOCASE_COLLATION, normalizer: BUILTIN_NORMALIZERS.NOCASE });
236
- this.collations.set('RTRIM', { comparator: RTRIM_COLLATION, normalizer: BUILTIN_NORMALIZERS.RTRIM });
303
+ // with their key normalizers so they can back compound indexes. Stamped
304
+ // `replicable: true` the built-ins are pure JS string operations (`<`/`>`,
305
+ // locale-independent `toLowerCase()`, ASCII-space trim), so they are
306
+ // bit-identical across peers' JS engines, exactly parallel to why built-in
307
+ // functions auto-qualify (see registerBuiltinFunctions). This is the single
308
+ // seam that *knows* a collation is a builtin.
309
+ this.collations.set('BINARY', { comparator: BINARY_COLLATION, normalizer: BUILTIN_NORMALIZERS.BINARY, replicable: true });
310
+ this.collations.set('NOCASE', { comparator: NOCASE_COLLATION, normalizer: BUILTIN_NORMALIZERS.NOCASE, replicable: true });
311
+ this.collations.set('RTRIM', { comparator: RTRIM_COLLATION, normalizer: BUILTIN_NORMALIZERS.RTRIM, replicable: true });
237
312
  log("Default collations registered (BINARY, NOCASE, RTRIM)");
238
313
  }
239
314
  /**
@@ -304,7 +379,32 @@ export class Database {
304
379
  releaseMutex = resolve;
305
380
  });
306
381
  await previousMutex;
307
- return releaseMutex;
382
+ // Mark the mutex held from acquisition until the returned release runs, so a
383
+ // re-entrant caller can detect it (see _isExecuting). The wrapper decrements
384
+ // at most once even if release is invoked more than once.
385
+ this.execMutexDepth++;
386
+ let released = false;
387
+ return () => {
388
+ if (!released) {
389
+ released = true;
390
+ this.execMutexDepth--;
391
+ }
392
+ releaseMutex();
393
+ };
394
+ }
395
+ /**
396
+ * True while the exec mutex is held — i.e. a statement (`exec`/`eval`), an
397
+ * external-change ingest, or an MV-refresh sweep is in flight. A caller that
398
+ * would re-enter the engine (acquire the mutex again) from inside such a context
399
+ * — e.g. a `notifyLensDeployment` module listener whose work calls
400
+ * `ingestExternalRowChanges` — MUST check this and defer that work to run after
401
+ * the current statement releases the mutex; re-entering synchronously deadlocks
402
+ * on the chained mutex. Deliberately part of the consumable type surface (kept out
403
+ * of the internal-only set) so a basis-backing host in another package can make
404
+ * that defer-vs-await decision.
405
+ */
406
+ _isExecuting() {
407
+ return this.execMutexDepth > 0;
308
408
  }
309
409
  /**
310
410
  * Executes a function with the execution mutex held.
@@ -631,6 +731,88 @@ export class Database {
631
731
  hasSchemaListeners() {
632
732
  return this.eventEmitter.hasSchemaListeners();
633
733
  }
734
+ /**
735
+ * @internal Whether the engine must generate/collect data-change events for
736
+ * this statement — true when any `onDataChange` OR `onTransactionCommit`
737
+ * listener is registered. The DML executor's auto-event gate consults this so a
738
+ * consumer subscribed only to the grouped transaction-commit channel still gets
739
+ * data events collected.
740
+ */
741
+ _needsDataEvents() {
742
+ return this.eventEmitter.needsDataEvents();
743
+ }
744
+ /**
745
+ * @internal Whether the engine must generate/collect schema-change events —
746
+ * true when any `onSchemaChange` OR `onTransactionCommit` listener is
747
+ * registered. Companion to {@link _needsDataEvents}; consulted by the schema
748
+ * manager's auto-event gate.
749
+ */
750
+ _needsSchemaEvents() {
751
+ return this.eventEmitter.needsSchemaEvents();
752
+ }
753
+ /**
754
+ * Subscribe to materialized-view key-coarsening **collision** events — the
755
+ * operational complement to the create-time key-coarsening warning. A
756
+ * {@link MaintenanceCollisionEvent} fires whenever row-time maintenance
757
+ * LWW-merges two distinct source-key tuples under one coarsened backing key K′
758
+ * (`docs/materialized-views.md` § Coarsened backing keys). Events share the
759
+ * transaction-batching discipline of the data/schema channels — delivered after
760
+ * the commit that realized the merge, dropped on rollback.
761
+ *
762
+ * @param listener Callback invoked for each committed collision
763
+ * @returns Unsubscribe function
764
+ *
765
+ * @example
766
+ * ```typescript
767
+ * const off = db.onMaintenanceCollision((e) => {
768
+ * console.warn(`coarsening collision on ${e.schemaName}.${e.tableName} ` +
769
+ * `at key ${JSON.stringify(e.key)} (columns: ${e.weakenedColumns.join(', ')})`);
770
+ * });
771
+ * ```
772
+ */
773
+ onMaintenanceCollision(listener) {
774
+ this.checkOpen();
775
+ return this.eventEmitter.onMaintenanceCollision(listener);
776
+ }
777
+ /**
778
+ * Read-only snapshot of the cumulative committed key-coarsening collision
779
+ * counter, keyed by lowercased qualified `schema.table` of the maintained
780
+ * table. Reflects only collisions that committed (consistent with event
781
+ * delivery) and is maintained whether or not a listener was ever subscribed.
782
+ */
783
+ getMaterializedViewCollisionStats() {
784
+ this.checkOpen();
785
+ return this.eventEmitter.getMaterializedViewCollisionStats();
786
+ }
787
+ /**
788
+ * Subscribe to grouped per-transaction commit batches — the authoritative
789
+ * "one logical transaction = one group" boundary. A
790
+ * {@link TransactionCommitBatch} fires **once** per committed transaction,
791
+ * carrying every data and schema event of that transaction across **all**
792
+ * tables, in flush order. Unlike the per-event {@link onDataChange} /
793
+ * {@link onSchemaChange} channels (which this does not replace — it is purely
794
+ * additive), a single subscription receives the whole transaction as one unit,
795
+ * which is what a consumer grouping changes by transaction (e.g. assigning one
796
+ * HLC per transaction) needs. Dropped on rollback; never fires for a
797
+ * transaction that produced no data/schema events.
798
+ *
799
+ * @param listener Callback invoked once per committed transaction
800
+ * @returns Unsubscribe function
801
+ *
802
+ * @example
803
+ * ```typescript
804
+ * const off = db.onTransactionCommit((batch) => {
805
+ * // All changes of one transaction, across all tables, in order.
806
+ * const local = batch.dataEvents.filter((e) => !e.remote);
807
+ * console.log(`committed ${local.length} local row changes, ` +
808
+ * `${batch.schemaEvents.length} schema changes`);
809
+ * });
810
+ * ```
811
+ */
812
+ onTransactionCommit(listener) {
813
+ this.checkOpen();
814
+ return this.eventEmitter.onTransactionCommit(listener);
815
+ }
634
816
  /**
635
817
  * Get the internal event emitter for advanced use cases.
636
818
  * @internal
@@ -688,6 +870,8 @@ export class Database {
688
870
  this.assertionEvaluator.dispose();
689
871
  // Clean up watcher manager (dispose all subscriptions + schema listener)
690
872
  this.watcherManager.dispose();
873
+ // Clean up materialized-view manager (unsubscribe schema listener)
874
+ this.materializedViewManager.dispose();
691
875
  // Clear schemas, ensuring VTabs are potentially disconnected
692
876
  // This will also call destroy on VTabs via SchemaManager.clearAll -> schema.clearTables -> schemaManager.dropTable
693
877
  this.schemaManager.clearAll();
@@ -741,7 +925,7 @@ export class Database {
741
925
  this.checkOpen();
742
926
  const baseFlags = (options.deterministic ? FunctionFlags.DETERMINISTIC : 0) | FunctionFlags.UTF8;
743
927
  const flags = options.flags ?? baseFlags;
744
- const schema = createScalarFunction({ name, numArgs: options.numArgs, flags }, func);
928
+ const schema = createScalarFunction({ name, numArgs: options.numArgs, flags, replicable: options.replicable }, func);
745
929
  this.registerFunctionWithErrorHandling('scalar', name, options.numArgs, () => {
746
930
  this.schemaManager.getMainSchema().addFunction(schema);
747
931
  });
@@ -757,7 +941,7 @@ export class Database {
757
941
  createAggregateFunction(name, options, stepFunc, finalFunc) {
758
942
  this.checkOpen();
759
943
  const flags = options.flags ?? FunctionFlags.UTF8;
760
- const schema = createAggregateFunction({ name, numArgs: options.numArgs, flags, initialValue: options.initialState }, stepFunc, finalFunc);
944
+ const schema = createAggregateFunction({ name, numArgs: options.numArgs, flags, replicable: options.replicable, initialValue: options.initialState }, stepFunc, finalFunc);
761
945
  this.registerFunctionWithErrorHandling('aggregate', name, options.numArgs, () => {
762
946
  this.schemaManager.getMainSchema().addFunction(schema);
763
947
  });
@@ -881,10 +1065,17 @@ export class Database {
881
1065
  * Registers a user-defined collation sequence.
882
1066
  * @param name The name of the collation sequence (case-insensitive).
883
1067
  * @param func The comparison function (a, b) => number (-1, 0, 1).
884
- * @param normalizer Optional key normalizer a function whose output equality
885
- * partitions strings into the same equivalence classes as `func` (modulo
886
- * total ordering). Required to make this collation usable as the key for a
887
- * compound index; ORDER BY / standalone comparisons work without it.
1068
+ * @param optionsOrNormalizer Either a bare key normalizer (the legacy positional
1069
+ * form) or an options object `{ normalizer?, replicable? }`:
1070
+ * - `normalizer` a function whose output equality partitions strings into the
1071
+ * same equivalence classes as `func` (modulo total ordering). Required to make
1072
+ * this collation usable as the key for a compound index; ORDER BY / standalone
1073
+ * comparisons work without it.
1074
+ * - `replicable` — assert this collation is **bit-identical across peers,
1075
+ * platforms, and app versions** (not merely deterministic). Consulted only by
1076
+ * the materialized-view replicable-collation gate when a backing host declares
1077
+ * `requiresReplicableDerivations`. Defaults to `false` — the conservative
1078
+ * default for a custom collation (built-ins auto-qualify).
888
1079
  * @example
889
1080
  * // Example: Create a custom collation for phone numbers
890
1081
  * db.registerCollation('PHONENUMBER', (a, b) => {
@@ -894,11 +1085,14 @@ export class Database {
894
1085
  * return numA < numB ? -1 : numA > numB ? 1 : 0;
895
1086
  * }, (s) => s.replace(/\D/g, ''));
896
1087
  *
1088
+ * // A locale-independent custom collation a replicating backing can host:
1089
+ * db.registerCollation('CODEPOINT', cmp, { replicable: true });
1090
+ *
897
1091
  * // Then use it in SQL:
898
1092
  * // SELECT * FROM contacts ORDER BY phone COLLATE PHONENUMBER;
899
1093
  * // CREATE INDEX phone_idx ON contacts(phone COLLATE PHONENUMBER);
900
1094
  */
901
- registerCollation(name, func, normalizer) {
1095
+ registerCollation(name, func, optionsOrNormalizer) {
902
1096
  this.checkOpen();
903
1097
  if (typeof name !== 'string' || !name) {
904
1098
  throw new MisuseError('registerCollation: name must be a non-empty string');
@@ -906,6 +1100,21 @@ export class Database {
906
1100
  if (typeof func !== 'function') {
907
1101
  throw new MisuseError('registerCollation: func must be a function');
908
1102
  }
1103
+ // A function-typed third arg is the legacy normalizer-only path (existing call
1104
+ // sites unchanged, `replicable` defaults to false); an object reads its fields;
1105
+ // any other non-undefined third arg is a misused legacy normalizer.
1106
+ let normalizer;
1107
+ let replicable = false;
1108
+ if (typeof optionsOrNormalizer === 'function') {
1109
+ normalizer = optionsOrNormalizer;
1110
+ }
1111
+ else if (typeof optionsOrNormalizer === 'object' && optionsOrNormalizer !== null) {
1112
+ normalizer = optionsOrNormalizer.normalizer;
1113
+ replicable = optionsOrNormalizer.replicable === true;
1114
+ }
1115
+ else if (optionsOrNormalizer !== undefined) {
1116
+ throw new MisuseError('registerCollation: normalizer must be a function when supplied');
1117
+ }
909
1118
  if (normalizer !== undefined && typeof normalizer !== 'function') {
910
1119
  throw new MisuseError('registerCollation: normalizer must be a function when supplied');
911
1120
  }
@@ -913,10 +1122,13 @@ export class Database {
913
1122
  if (this.collations.has(upperName)) {
914
1123
  log('Overwriting existing collation: %s', upperName);
915
1124
  }
916
- this.collations.set(upperName, normalizer !== undefined
917
- ? { comparator: func, normalizer }
918
- : { comparator: func });
919
- log('Registered collation: %s%s', upperName, normalizer !== undefined ? ' (with normalizer)' : '');
1125
+ const entry = { comparator: func };
1126
+ if (normalizer !== undefined)
1127
+ entry.normalizer = normalizer;
1128
+ if (replicable)
1129
+ entry.replicable = true;
1130
+ this.collations.set(upperName, entry);
1131
+ log('Registered collation: %s%s%s', upperName, normalizer !== undefined ? ' (with normalizer)' : '', replicable ? ' (replicable)' : '');
920
1132
  }
921
1133
  /**
922
1134
  * Registers a custom logical type.
@@ -997,6 +1209,16 @@ export class Database {
997
1209
  // resolves to the canonical built-in normalizer.
998
1210
  return BUILTIN_NORMALIZERS[upper];
999
1211
  }
1212
+ /** @internal True iff the named collation is asserted REPLICABLE — bit-identical
1213
+ * across peers/platforms/app-versions. Built-ins are stamped `replicable` at
1214
+ * registration; a custom collation opts in with `replicable: true`. An unknown
1215
+ * collation returns `false` defensively (an unknown collation in a derivation
1216
+ * body errors earlier at create). Consumed only by the materialized-view
1217
+ * replicable-collation gate when the backing host declares
1218
+ * `requiresReplicableDerivations`. */
1219
+ _isCollationReplicable(name) {
1220
+ return this.collations.get(name.toUpperCase())?.replicable === true;
1221
+ }
1000
1222
  _queueDeferredConstraintRow(baseTable, constraintName, row, descriptor, evaluator, connectionId, contextRow, contextDescriptor) {
1001
1223
  this.deferredConstraints.enqueue(baseTable, constraintName, row, descriptor, evaluator, connectionId, contextRow, contextDescriptor);
1002
1224
  }
@@ -1305,8 +1527,15 @@ export class Database {
1305
1527
  _findFunction(funcName, nArg) {
1306
1528
  return this.schemaManager.findFunction(funcName, nArg);
1307
1529
  }
1308
- /** @internal */
1309
- _buildPlan(statements, paramsOrTypes) {
1530
+ /**
1531
+ * @internal Build a fresh top-level {@link PlanningContext} (global parameter scope,
1532
+ * default schema path, an empty dependency tracker). The shared seam {@link _buildPlan}
1533
+ * builds its planning context from, and a throwaway context the static updateability
1534
+ * surfaces (`func/builtins/schema.ts`) use to plan a view body / run an insertability
1535
+ * probe — whose `schemaDependencies` are discarded (the read TVF already discards the body
1536
+ * plan's), so a fresh tracker per call is correct.
1537
+ */
1538
+ _buildProbeContext(paramsOrTypes) {
1310
1539
  const globalScope = new GlobalScope(this.schemaManager);
1311
1540
  // If we received parameter values, infer their types
1312
1541
  // If we received explicit parameter types, use them as-is
@@ -1317,21 +1546,24 @@ export class Database {
1317
1546
  const parameterScope = new ParameterScope(globalScope, parameterTypes);
1318
1547
  // Get default schema path from options
1319
1548
  const schemaPath = parseSchemaPath(this.options.getStringOption('schema_path'));
1320
- const schemaDependencies = new BuildTimeDependencyTracker();
1321
- const ctx = {
1549
+ return {
1322
1550
  db: this,
1323
1551
  schemaManager: this.schemaManager,
1324
1552
  parameters: paramsOrTypes instanceof Map ? {} : (paramsOrTypes ?? {}),
1325
1553
  scope: parameterScope,
1326
1554
  cteNodes: new Map(),
1327
- schemaDependencies,
1555
+ schemaDependencies: new BuildTimeDependencyTracker(),
1328
1556
  schemaCache: new Map(),
1329
1557
  cteReferenceCache: new Map(),
1330
1558
  outputScopes: new Map(),
1331
1559
  schemaPath
1332
1560
  };
1561
+ }
1562
+ /** @internal */
1563
+ _buildPlan(statements, paramsOrTypes) {
1564
+ const ctx = this._buildProbeContext(paramsOrTypes);
1333
1565
  const plan = buildBlock(ctx, statements);
1334
- return { plan, schemaDependencies };
1566
+ return { plan, schemaDependencies: ctx.schemaDependencies };
1335
1567
  }
1336
1568
  /**
1337
1569
  * @internal Registers an active VirtualTable connection for transaction management.
@@ -1453,8 +1685,36 @@ export class Database {
1453
1685
  if (!this.isOpen)
1454
1686
  throw new MisuseError("Database is closed");
1455
1687
  }
1456
- async runGlobalAssertions() {
1457
- await this.assertionEvaluator.runGlobalAssertions();
1688
+ async runGlobalAssertions(sink) {
1689
+ await this.assertionEvaluator.runGlobalAssertions(sink);
1690
+ }
1691
+ /** @internal Install (or clear, with `null`) the report-mode sink the next
1692
+ * commit's global-assertion pass collects into instead of throwing. Used by
1693
+ * the external-row ingestion seam around its implicit commit; see
1694
+ * {@link ingestExternalRowChanges} and `database-transaction.ts`. */
1695
+ _setPendingCommitAssertionSink(sink) {
1696
+ this.transactionManager.setPendingCommitAssertionSink(sink);
1697
+ }
1698
+ /** @internal Apply-mode RESTRICT suppression flag — see {@link _setFkRestrictSuppressed}. */
1699
+ _fkRestrictSuppressed = false;
1700
+ /** @internal Apply-mode RESTRICT suppression. While set, the parent-side FK
1701
+ * RESTRICT pre-checks ({@link assertTransitiveRestrictsForParentMutation} and its
1702
+ * callees) early-return — the trust-the-origin external-row apply path: the origin
1703
+ * already enforced RESTRICT at its own commit, so re-enforcing it on the receiver
1704
+ * would wedge the sync stream. Cascade / set-null / set-default propagation is
1705
+ * unaffected. Set for the duration of an apply batch (mutex held, so no concurrent
1706
+ * statement observes it) and honored by every nested cascade DML and MV-maintenance
1707
+ * FK pass. Returns the prior value so the caller restores it in a `finally`
1708
+ * (supports nesting). */
1709
+ _setFkRestrictSuppressed(value) {
1710
+ const prior = this._fkRestrictSuppressed;
1711
+ this._fkRestrictSuppressed = value;
1712
+ return prior;
1713
+ }
1714
+ /** @internal Whether apply-mode RESTRICT suppression is active — see
1715
+ * {@link _setFkRestrictSuppressed}. */
1716
+ _isFkRestrictSuppressed() {
1717
+ return this._fkRestrictSuppressed;
1458
1718
  }
1459
1719
  /**
1460
1720
  * Subscribe to changes described by a {@link ChangeScope}.
@@ -1486,6 +1746,210 @@ export class Database {
1486
1746
  async runPostCommitWatchers() {
1487
1747
  await this.watcherManager.runPostCommit();
1488
1748
  }
1749
+ /**
1750
+ * Fire all active watchers whose scope includes `schema.table`, as if the
1751
+ * whole table changed, **without** a local commit. For hosts whose tables
1752
+ * are backed by an external/replicated store (e.g. the optimystic vtab) that
1753
+ * learns of remote writes out-of-band, so the change never touches this
1754
+ * `Database`'s commit change-log and the post-commit watcher path would
1755
+ * otherwise never fire.
1756
+ *
1757
+ * Coarse by design: handlers receive a global (whole-table) {@link WatchEvent}
1758
+ * — `full` watches fire with empty `hits`; `rows`/`rowsByGroup` watches
1759
+ * surface all their registered literal values as possibly-changed; `groups`
1760
+ * fire with empty hits. Over-firing only costs the consumer an extra
1761
+ * re-query; it never misses a change. A no-op when no subscription matches.
1762
+ * Async to mirror the post-commit watcher path (handlers may be async).
1763
+ *
1764
+ * When the host has the actual row images, prefer the precise,
1765
+ * in-transaction {@link ingestExternalRowChanges} seam instead: row-granular
1766
+ * watch hits at commit, plus MV maintenance, assertion evaluation, and
1767
+ * opt-in FK actions.
1768
+ *
1769
+ * @param tableName The table whose watchers to fire.
1770
+ * @param schemaName Defaults to the current schema
1771
+ * (`schemaManager.getCurrentSchemaName()`).
1772
+ */
1773
+ async notifyExternalChange(tableName, schemaName) {
1774
+ this.checkOpen();
1775
+ const schema = schemaName ?? this.schemaManager.getCurrentSchemaName();
1776
+ const fqName = `${schema}.${tableName}`.toLowerCase();
1777
+ await this.watcherManager.notifyExternalTableChange(fqName);
1778
+ }
1779
+ /**
1780
+ * Batch ingestion seam for externally-applied row changes: drives the
1781
+ * post-write pipeline — change capture (`Database.watch` post-commit
1782
+ * dispatch + commit-time global assertions), batch-amortized row-time
1783
+ * materialized-view maintenance, and opt-in parent-side FK actions — for
1784
+ * writes the caller has already applied directly to module storage,
1785
+ * bypassing the DML executor. The precise, in-transaction alternative to
1786
+ * the coarse whole-table {@link notifyExternalChange}.
1787
+ *
1788
+ * `changes` is a flat ordered array; same-row changes must appear in event
1789
+ * order (each change's `oldRow` must be the true before-image of *that*
1790
+ * change — the prior change's `newRow`). The FK-actions facet re-reads
1791
+ * post-write merged storage and is order-independent for realistic batch
1792
+ * shapes (see `docs/sync.md` § Transactional Integrity During Sync for the
1793
+ * (E)/(F) exotic-topology caveats). The seam
1794
+ * trusts the origin — it re-validates NOTHING (no CHECK / NOT NULL /
1795
+ * UNIQUE / child-side FK existence), and it does NOT emit module data
1796
+ * events (the external writer owns those, including the `remote` flag).
1797
+ *
1798
+ * Transaction contract: runs inside the caller's active transaction when
1799
+ * one exists (the reported rows must already be visible to a vtab read
1800
+ * within it — the residual/full-rebuild maintenance arms re-read the
1801
+ * source); otherwise begins an implicit transaction it commits at batch
1802
+ * end. The batch's DERIVED effects are atomic via a batch savepoint; a
1803
+ * mid-batch error unwinds them all (the externally-applied storage rows
1804
+ * are NOT unwound by Quereus). Serialized via the exec mutex — do NOT call
1805
+ * from within statement execution or vtab callbacks (deadlock); the
1806
+ * two-arg `_maintainRowTimeCoveringStructures` is the seam for that
1807
+ * context. See `docs/materialized-views.md` § External row-change
1808
+ * ingestion for the full contract.
1809
+ *
1810
+ * Returns the collected commit-time global-assertion violations. With the
1811
+ * default `assertionFailureMode: 'throw'` a violation throws (and rolls the
1812
+ * batch's derived effects back) so the returned list is always empty; with
1813
+ * `'report'` — honored only for the seam-owned implicit transaction with
1814
+ * capture on — a violation is collected and the batch still commits (derived
1815
+ * effects land, watch dispatches), so the returned list names every violated
1816
+ * assertion. Empty in every other case.
1817
+ */
1818
+ async ingestExternalRowChanges(changes, options) {
1819
+ this.checkOpen();
1820
+ return ingestExternalRowChangeBatch(this, changes, options);
1821
+ }
1822
+ /** @internal Compile + register an MV for row-time write-through maintenance.
1823
+ * Throws on a body that is not row-time maintainable (the mandatory create-time gate). */
1824
+ registerMaterializedView(mv) {
1825
+ this.materializedViewManager.registerMaterializedView(mv);
1826
+ }
1827
+ /** @internal Detach an MV's row-time maintenance plan (DROP path). */
1828
+ unregisterMaterializedView(schemaName, name) {
1829
+ this.materializedViewManager.unregisterMaterializedView(schemaName, name);
1830
+ }
1831
+ /** @internal Force-mark an MV stale: detach its row-time plan and invalidate cached
1832
+ * backing reads so the next reference re-hits the build-time stale guard
1833
+ * (ALTER … RENAME propagation failure path). */
1834
+ markMaterializedViewStale(mv) {
1835
+ this.materializedViewManager.markMaterializedViewStale(mv);
1836
+ }
1837
+ /**
1838
+ * Refresh every maintained table (materialized view) in source-dependency
1839
+ * order, bringing each backing current with its sources. The convergence
1840
+ * point after a wholesale external load (e.g. a sync snapshot bootstrap) that
1841
+ * deferred row-time maintenance. Each MV is refreshed through the same
1842
+ * full-rebuild path as `refresh materialized view` (stale revalidation, shape
1843
+ * re-derivation/reshape, row-time re-registration, `stale` clear), so a
1844
+ * bounded-delta MV is full-rebuilt here too — convergence does not depend on
1845
+ * delta replay, and the full rebuild re-reads the complete source through the
1846
+ * vtab regardless of how its rows arrived (out-of-band direct-storage writes
1847
+ * included). MV-over-MV chains converge base-first: refresh is commit-first per
1848
+ * MV, so a base MV's backing is committed before a dependent's body re-reads it.
1849
+ *
1850
+ * NOT atomic across the sweep — the whole sweep is deliberately NOT wrapped in
1851
+ * one explicit transaction (refresh is commit-first per MV, so an enclosing
1852
+ * transaction would not make it atomic anyway). Each MV ensures/commits its own
1853
+ * implicit transaction exactly as the single-MV `refresh` does, so a failure
1854
+ * partway leaves earlier MVs converged; the caller (snapshot bootstrap) retries
1855
+ * the whole load idempotently.
1856
+ *
1857
+ * Serialized via the exec mutex like any statement — do NOT call from within
1858
+ * statement execution or a vtab callback (deadlock; same constraint as
1859
+ * `refresh materialized view` itself). Returns the refreshed MV identifiers
1860
+ * (for coarse watch notification); `[]` (no mutex, no transaction) when there
1861
+ * are no maintained tables. See `docs/materialized-views.md` § Converging all
1862
+ * materialized views.
1863
+ */
1864
+ async refreshAllMaterializedViews() {
1865
+ this.checkOpen();
1866
+ // Build the order BEFORE the mutex: it only reads catalog/plan state, and an
1867
+ // empty catalog must take no mutex and start no transaction.
1868
+ const order = this.materializedViewManager.materializedViewRefreshOrder();
1869
+ if (order.length === 0)
1870
+ return [];
1871
+ const refreshed = [];
1872
+ await this._withMutex(async () => {
1873
+ // Per-MV implicit-transaction scope mirrors `exec`'s per-statement boundary:
1874
+ // each refresh commits independently (commit-first), so a mid-sweep failure
1875
+ // leaves the already-refreshed MVs converged rather than rolling them back.
1876
+ for (const mv of order) {
1877
+ try {
1878
+ await this._ensureTransaction();
1879
+ const live = await refreshMaintainedTable(this, mv);
1880
+ if (this._isImplicitTransaction()) {
1881
+ await this._commitTransaction();
1882
+ }
1883
+ refreshed.push({ schemaName: live.schemaName, name: live.name });
1884
+ }
1885
+ catch (err) {
1886
+ if (this._isImplicitTransaction()) {
1887
+ await this._rollbackTransaction();
1888
+ }
1889
+ throw err;
1890
+ }
1891
+ }
1892
+ });
1893
+ return refreshed;
1894
+ }
1895
+ /** @internal Cheap synchronous guard for the per-row DML maintenance hook: true
1896
+ * iff a `row-time` covering structure reads `sourceBase` (lowercased or raw
1897
+ * `schema.table`). Lets a hot write path skip the maintenance call entirely when
1898
+ * no row-time MV depends on the written table. */
1899
+ _hasRowTimeCoveringStructures(sourceBase) {
1900
+ return this.materializedViewManager.hasRowTimePlanFor(sourceBase);
1901
+ }
1902
+ /** @internal Synchronously maintain every `row-time` covering structure on
1903
+ * `sourceBase` for one source row-write, before the writing statement observes
1904
+ * its own effects. Drives a per-row backing delta through the backing table's
1905
+ * coordinated transactional connection (reads-own-writes within the txn;
1906
+ * committed/rolled-back in lockstep with the source write). See
1907
+ * `database-materialized-views.ts` § row-time write-through.
1908
+ *
1909
+ * `cache` is the optional per-statement {@link BackingConnectionCache} the DML
1910
+ * generator threads in so the backing-connection resolution is amortized over the
1911
+ * whole statement (one scan per backing, not one per source row). The cold
1912
+ * eviction callers (memory `checkUniqueViaMaterializedView`, store-table.ts) omit
1913
+ * it and re-resolve the same connection deterministically — the `DatabaseInternal`
1914
+ * surface deliberately exposes only the two-arg form (a host reporting writes from
1915
+ * OUTSIDE a statement uses the batch-amortized {@link ingestExternalRowChanges}
1916
+ * seam instead).
1917
+ *
1918
+ * `deferred` is the optional per-statement deferred-rebuild set: a `'full-rebuild'`
1919
+ * plan is marked dirty in it (no per-row apply) and drained once at the
1920
+ * end-of-statement {@link _flushDeferredRebuilds}. The DML generator owns it; cold
1921
+ * callers omit it (and never name a full-rebuild MV, which is never a covering
1922
+ * structure — so an inline rebuild is at worst a safe, unreached fallback). */
1923
+ async _maintainRowTimeCoveringStructures(sourceBase, change, cache, deferred) {
1924
+ await this.materializedViewManager.maintainRowTime(sourceBase, change, cache, deferred);
1925
+ }
1926
+ /** @internal Drain the per-statement deferred full-rebuild set at the
1927
+ * end-of-statement boundary: rebuild every dirtied full-rebuild covering MV exactly
1928
+ * once and cascade each rebuild's delta onward (MV-over-MV). The DML generator calls
1929
+ * this after the row loop and before releasing the statement-atomicity savepoint, so
1930
+ * a failed rebuild rolls the whole statement back. `cache` is the same per-statement
1931
+ * {@link BackingConnectionCache} the row loop used. See
1932
+ * `database-materialized-views.ts` § flushDeferredRebuilds. */
1933
+ async _flushDeferredRebuilds(deferred, cache) {
1934
+ await this.materializedViewManager.flushDeferredRebuilds(deferred, cache);
1935
+ }
1936
+ /** @internal Resolve the linked, `row-time`, enforcement-ready covering MV for a
1937
+ * UNIQUE constraint on `schema.table`, or `undefined`. Synchronous (a map lookup
1938
+ * plus name/staleness checks) with an O(1) negative fast path, so the UNIQUE-check
1939
+ * path can consult it without async overhead. When it returns an MV, conflict
1940
+ * resolution routes through the covering MV's backing table (in preference to the
1941
+ * auto-index) — see `docs/materialized-views.md` § Covering structures. */
1942
+ _findRowTimeCoveringStructure(schemaName, tableName, uc) {
1943
+ return this.materializedViewManager.findRowTimeCoveringStructure(schemaName, tableName, uc);
1944
+ }
1945
+ /** @internal Point-look up a row-time covering MV's backing table for rows whose
1946
+ * backing columns equal `newRow`'s UNIQUE values, returning the conflicting
1947
+ * **source** PK(s) (excluding `newSourcePk`, the row being written). Reads-own-writes
1948
+ * through the backing table's coordinated connection. The caller validates each
1949
+ * candidate against its live source row and applies IGNORE/ABORT/REPLACE. */
1950
+ async _lookupCoveringConflicts(mv, uc, newRow, newSourcePk) {
1951
+ return this.materializedViewManager.lookupCoveringConflicts(mv, uc, newRow, newSourcePk);
1952
+ }
1489
1953
  /** @internal Invalidate cached assertion plan (called on DROP ASSERTION) */
1490
1954
  invalidateAssertionCache(name) {
1491
1955
  this.assertionEvaluator.invalidateAssertion(name);