@quereus/quereus 3.2.1 → 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 (935) 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 -106
  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 +795 -120
  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 +277 -8
  98. package/dist/src/parser/parser.d.ts.map +1 -1
  99. package/dist/src/parser/parser.js +1393 -471
  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/binding-extractor.d.ts.map +1 -1
  115. package/dist/src/planner/analysis/binding-extractor.js +9 -6
  116. package/dist/src/planner/analysis/binding-extractor.js.map +1 -1
  117. package/dist/src/planner/analysis/change-scope.d.ts +34 -4
  118. package/dist/src/planner/analysis/change-scope.d.ts.map +1 -1
  119. package/dist/src/planner/analysis/change-scope.js +115 -7
  120. package/dist/src/planner/analysis/change-scope.js.map +1 -1
  121. package/dist/src/planner/analysis/check-extraction.d.ts +36 -2
  122. package/dist/src/planner/analysis/check-extraction.d.ts.map +1 -1
  123. package/dist/src/planner/analysis/check-extraction.js +174 -46
  124. package/dist/src/planner/analysis/check-extraction.js.map +1 -1
  125. package/dist/src/planner/analysis/coarsened-key.d.ts +109 -0
  126. package/dist/src/planner/analysis/coarsened-key.d.ts.map +1 -0
  127. package/dist/src/planner/analysis/coarsened-key.js +228 -0
  128. package/dist/src/planner/analysis/coarsened-key.js.map +1 -0
  129. package/dist/src/planner/analysis/comparison-collation.d.ts +216 -0
  130. package/dist/src/planner/analysis/comparison-collation.d.ts.map +1 -0
  131. package/dist/src/planner/analysis/comparison-collation.js +341 -0
  132. package/dist/src/planner/analysis/comparison-collation.js.map +1 -0
  133. package/dist/src/planner/analysis/constraint-extractor.d.ts +13 -1
  134. package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
  135. package/dist/src/planner/analysis/constraint-extractor.js +220 -21
  136. package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
  137. package/dist/src/planner/analysis/coverage-prover.d.ts +321 -0
  138. package/dist/src/planner/analysis/coverage-prover.d.ts.map +1 -0
  139. package/dist/src/planner/analysis/coverage-prover.js +1038 -0
  140. package/dist/src/planner/analysis/coverage-prover.js.map +1 -0
  141. package/dist/src/planner/analysis/key-filter.d.ts +22 -0
  142. package/dist/src/planner/analysis/key-filter.d.ts.map +1 -0
  143. package/dist/src/planner/analysis/key-filter.js +105 -0
  144. package/dist/src/planner/analysis/key-filter.js.map +1 -0
  145. package/dist/src/planner/analysis/partial-unique-extraction.d.ts +36 -1
  146. package/dist/src/planner/analysis/partial-unique-extraction.d.ts.map +1 -1
  147. package/dist/src/planner/analysis/partial-unique-extraction.js +148 -22
  148. package/dist/src/planner/analysis/partial-unique-extraction.js.map +1 -1
  149. package/dist/src/planner/analysis/predicate-normalizer.d.ts.map +1 -1
  150. package/dist/src/planner/analysis/predicate-normalizer.js +30 -1
  151. package/dist/src/planner/analysis/predicate-normalizer.js.map +1 -1
  152. package/dist/src/planner/analysis/predicate-shape.d.ts +36 -1
  153. package/dist/src/planner/analysis/predicate-shape.d.ts.map +1 -1
  154. package/dist/src/planner/analysis/predicate-shape.js +51 -13
  155. package/dist/src/planner/analysis/predicate-shape.js.map +1 -1
  156. package/dist/src/planner/analysis/query-rewrite-matcher.d.ts +314 -0
  157. package/dist/src/planner/analysis/query-rewrite-matcher.d.ts.map +1 -0
  158. package/dist/src/planner/analysis/query-rewrite-matcher.js +1081 -0
  159. package/dist/src/planner/analysis/query-rewrite-matcher.js.map +1 -0
  160. package/dist/src/planner/analysis/scalar-invertibility.d.ts +92 -0
  161. package/dist/src/planner/analysis/scalar-invertibility.d.ts.map +1 -0
  162. package/dist/src/planner/analysis/scalar-invertibility.js +129 -0
  163. package/dist/src/planner/analysis/scalar-invertibility.js.map +1 -0
  164. package/dist/src/planner/analysis/update-lineage.d.ts +196 -0
  165. package/dist/src/planner/analysis/update-lineage.d.ts.map +1 -0
  166. package/dist/src/planner/analysis/update-lineage.js +322 -0
  167. package/dist/src/planner/analysis/update-lineage.js.map +1 -0
  168. package/dist/src/planner/analysis/view-complement.d.ts +42 -0
  169. package/dist/src/planner/analysis/view-complement.d.ts.map +1 -0
  170. package/dist/src/planner/analysis/view-complement.js +54 -0
  171. package/dist/src/planner/analysis/view-complement.js.map +1 -0
  172. package/dist/src/planner/building/alter-table.d.ts +1 -1
  173. package/dist/src/planner/building/alter-table.d.ts.map +1 -1
  174. package/dist/src/planner/building/alter-table.js +211 -2
  175. package/dist/src/planner/building/alter-table.js.map +1 -1
  176. package/dist/src/planner/building/block.d.ts.map +1 -1
  177. package/dist/src/planner/building/block.js +18 -1
  178. package/dist/src/planner/building/block.js.map +1 -1
  179. package/dist/src/planner/building/constraint-builder.d.ts +33 -5
  180. package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
  181. package/dist/src/planner/building/constraint-builder.js +63 -28
  182. package/dist/src/planner/building/constraint-builder.js.map +1 -1
  183. package/dist/src/planner/building/create-view.d.ts +9 -0
  184. package/dist/src/planner/building/create-view.d.ts.map +1 -1
  185. package/dist/src/planner/building/create-view.js +41 -12
  186. package/dist/src/planner/building/create-view.js.map +1 -1
  187. package/dist/src/planner/building/ddl.d.ts.map +1 -1
  188. package/dist/src/planner/building/ddl.js +94 -0
  189. package/dist/src/planner/building/ddl.js.map +1 -1
  190. package/dist/src/planner/building/declare-schema.d.ts +1 -0
  191. package/dist/src/planner/building/declare-schema.d.ts.map +1 -1
  192. package/dist/src/planner/building/declare-schema.js +4 -1
  193. package/dist/src/planner/building/declare-schema.js.map +1 -1
  194. package/dist/src/planner/building/default-scope.d.ts +26 -0
  195. package/dist/src/planner/building/default-scope.d.ts.map +1 -0
  196. package/dist/src/planner/building/default-scope.js +41 -0
  197. package/dist/src/planner/building/default-scope.js.map +1 -0
  198. package/dist/src/planner/building/delete.d.ts +19 -1
  199. package/dist/src/planner/building/delete.d.ts.map +1 -1
  200. package/dist/src/planner/building/delete.js +116 -34
  201. package/dist/src/planner/building/delete.js.map +1 -1
  202. package/dist/src/planner/building/dml-target.d.ts +118 -0
  203. package/dist/src/planner/building/dml-target.d.ts.map +1 -0
  204. package/dist/src/planner/building/dml-target.js +282 -0
  205. package/dist/src/planner/building/dml-target.js.map +1 -0
  206. package/dist/src/planner/building/drop-index.d.ts.map +1 -1
  207. package/dist/src/planner/building/drop-index.js +4 -1
  208. package/dist/src/planner/building/drop-index.js.map +1 -1
  209. package/dist/src/planner/building/drop-view.d.ts.map +1 -1
  210. package/dist/src/planner/building/drop-view.js +4 -2
  211. package/dist/src/planner/building/drop-view.js.map +1 -1
  212. package/dist/src/planner/building/expression.d.ts.map +1 -1
  213. package/dist/src/planner/building/expression.js +60 -21
  214. package/dist/src/planner/building/expression.js.map +1 -1
  215. package/dist/src/planner/building/foreign-key-builder.d.ts +30 -0
  216. package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
  217. package/dist/src/planner/building/foreign-key-builder.js +160 -129
  218. package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
  219. package/dist/src/planner/building/insert.d.ts +45 -2
  220. package/dist/src/planner/building/insert.d.ts.map +1 -1
  221. package/dist/src/planner/building/insert.js +257 -88
  222. package/dist/src/planner/building/insert.js.map +1 -1
  223. package/dist/src/planner/building/lens-auxiliary-access.d.ts +22 -0
  224. package/dist/src/planner/building/lens-auxiliary-access.d.ts.map +1 -0
  225. package/dist/src/planner/building/lens-auxiliary-access.js +132 -0
  226. package/dist/src/planner/building/lens-auxiliary-access.js.map +1 -0
  227. package/dist/src/planner/building/materialized-view.d.ts +16 -0
  228. package/dist/src/planner/building/materialized-view.d.ts.map +1 -0
  229. package/dist/src/planner/building/materialized-view.js +57 -0
  230. package/dist/src/planner/building/materialized-view.js.map +1 -0
  231. package/dist/src/planner/building/returning-star.d.ts +32 -0
  232. package/dist/src/planner/building/returning-star.d.ts.map +1 -0
  233. package/dist/src/planner/building/returning-star.js +45 -0
  234. package/dist/src/planner/building/returning-star.js.map +1 -0
  235. package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
  236. package/dist/src/planner/building/select-aggregates.js +51 -13
  237. package/dist/src/planner/building/select-aggregates.js.map +1 -1
  238. package/dist/src/planner/building/select-compound.d.ts.map +1 -1
  239. package/dist/src/planner/building/select-compound.js +84 -11
  240. package/dist/src/planner/building/select-compound.js.map +1 -1
  241. package/dist/src/planner/building/select-context.d.ts +10 -2
  242. package/dist/src/planner/building/select-context.d.ts.map +1 -1
  243. package/dist/src/planner/building/select-context.js +7 -1
  244. package/dist/src/planner/building/select-context.js.map +1 -1
  245. package/dist/src/planner/building/select-modifiers.js +6 -0
  246. package/dist/src/planner/building/select-modifiers.js.map +1 -1
  247. package/dist/src/planner/building/select-ordinal.d.ts +18 -0
  248. package/dist/src/planner/building/select-ordinal.d.ts.map +1 -1
  249. package/dist/src/planner/building/select-ordinal.js +30 -0
  250. package/dist/src/planner/building/select-ordinal.js.map +1 -1
  251. package/dist/src/planner/building/select-projections.d.ts +8 -2
  252. package/dist/src/planner/building/select-projections.d.ts.map +1 -1
  253. package/dist/src/planner/building/select-projections.js +26 -4
  254. package/dist/src/planner/building/select-projections.js.map +1 -1
  255. package/dist/src/planner/building/select-window.d.ts.map +1 -1
  256. package/dist/src/planner/building/select-window.js +8 -5
  257. package/dist/src/planner/building/select-window.js.map +1 -1
  258. package/dist/src/planner/building/select.d.ts.map +1 -1
  259. package/dist/src/planner/building/select.js +164 -59
  260. package/dist/src/planner/building/select.js.map +1 -1
  261. package/dist/src/planner/building/set-object-tags.d.ts +7 -0
  262. package/dist/src/planner/building/set-object-tags.d.ts.map +1 -0
  263. package/dist/src/planner/building/set-object-tags.js +38 -0
  264. package/dist/src/planner/building/set-object-tags.js.map +1 -0
  265. package/dist/src/planner/building/tag-diagnostics.d.ts +27 -0
  266. package/dist/src/planner/building/tag-diagnostics.d.ts.map +1 -0
  267. package/dist/src/planner/building/tag-diagnostics.js +37 -0
  268. package/dist/src/planner/building/tag-diagnostics.js.map +1 -0
  269. package/dist/src/planner/building/update.d.ts +18 -1
  270. package/dist/src/planner/building/update.d.ts.map +1 -1
  271. package/dist/src/planner/building/update.js +134 -58
  272. package/dist/src/planner/building/update.js.map +1 -1
  273. package/dist/src/planner/building/view-mutation-builder.d.ts +15 -0
  274. package/dist/src/planner/building/view-mutation-builder.d.ts.map +1 -0
  275. package/dist/src/planner/building/view-mutation-builder.js +1158 -0
  276. package/dist/src/planner/building/view-mutation-builder.js.map +1 -0
  277. package/dist/src/planner/building/with.d.ts +11 -0
  278. package/dist/src/planner/building/with.d.ts.map +1 -1
  279. package/dist/src/planner/building/with.js +48 -10
  280. package/dist/src/planner/building/with.js.map +1 -1
  281. package/dist/src/planner/cost/index.d.ts +83 -0
  282. package/dist/src/planner/cost/index.d.ts.map +1 -1
  283. package/dist/src/planner/cost/index.js +114 -0
  284. package/dist/src/planner/cost/index.js.map +1 -1
  285. package/dist/src/planner/framework/characteristics.d.ts +38 -4
  286. package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
  287. package/dist/src/planner/framework/characteristics.js +50 -6
  288. package/dist/src/planner/framework/characteristics.js.map +1 -1
  289. package/dist/src/planner/framework/pass.d.ts.map +1 -1
  290. package/dist/src/planner/framework/pass.js +2 -1
  291. package/dist/src/planner/framework/pass.js.map +1 -1
  292. package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
  293. package/dist/src/planner/framework/physical-utils.js +7 -1
  294. package/dist/src/planner/framework/physical-utils.js.map +1 -1
  295. package/dist/src/planner/framework/registry.d.ts +39 -1
  296. package/dist/src/planner/framework/registry.d.ts.map +1 -1
  297. package/dist/src/planner/framework/registry.js +18 -2
  298. package/dist/src/planner/framework/registry.js.map +1 -1
  299. package/dist/src/planner/mutation/backward-body.d.ts +131 -0
  300. package/dist/src/planner/mutation/backward-body.d.ts.map +1 -0
  301. package/dist/src/planner/mutation/backward-body.js +135 -0
  302. package/dist/src/planner/mutation/backward-body.js.map +1 -0
  303. package/dist/src/planner/mutation/cte-flatten.d.ts +17 -0
  304. package/dist/src/planner/mutation/cte-flatten.d.ts.map +1 -0
  305. package/dist/src/planner/mutation/cte-flatten.js +364 -0
  306. package/dist/src/planner/mutation/cte-flatten.js.map +1 -0
  307. package/dist/src/planner/mutation/decomposition.d.ts +273 -0
  308. package/dist/src/planner/mutation/decomposition.d.ts.map +1 -0
  309. package/dist/src/planner/mutation/decomposition.js +1719 -0
  310. package/dist/src/planner/mutation/decomposition.js.map +1 -0
  311. package/dist/src/planner/mutation/lens-enforcement.d.ts +165 -0
  312. package/dist/src/planner/mutation/lens-enforcement.d.ts.map +1 -0
  313. package/dist/src/planner/mutation/lens-enforcement.js +745 -0
  314. package/dist/src/planner/mutation/lens-enforcement.js.map +1 -0
  315. package/dist/src/planner/mutation/multi-source.d.ts +568 -0
  316. package/dist/src/planner/mutation/multi-source.d.ts.map +1 -0
  317. package/dist/src/planner/mutation/multi-source.js +2915 -0
  318. package/dist/src/planner/mutation/multi-source.js.map +1 -0
  319. package/dist/src/planner/mutation/mutation-diagnostic.d.ts +37 -0
  320. package/dist/src/planner/mutation/mutation-diagnostic.d.ts.map +1 -0
  321. package/dist/src/planner/mutation/mutation-diagnostic.js +24 -0
  322. package/dist/src/planner/mutation/mutation-diagnostic.js.map +1 -0
  323. package/dist/src/planner/mutation/mutation-tags.d.ts +33 -0
  324. package/dist/src/planner/mutation/mutation-tags.d.ts.map +1 -0
  325. package/dist/src/planner/mutation/mutation-tags.js +31 -0
  326. package/dist/src/planner/mutation/mutation-tags.js.map +1 -0
  327. package/dist/src/planner/mutation/propagate.d.ts +97 -0
  328. package/dist/src/planner/mutation/propagate.d.ts.map +1 -0
  329. package/dist/src/planner/mutation/propagate.js +220 -0
  330. package/dist/src/planner/mutation/propagate.js.map +1 -0
  331. package/dist/src/planner/mutation/scope-transform.d.ts +181 -0
  332. package/dist/src/planner/mutation/scope-transform.d.ts.map +1 -0
  333. package/dist/src/planner/mutation/scope-transform.js +574 -0
  334. package/dist/src/planner/mutation/scope-transform.js.map +1 -0
  335. package/dist/src/planner/mutation/set-op.d.ts +242 -0
  336. package/dist/src/planner/mutation/set-op.d.ts.map +1 -0
  337. package/dist/src/planner/mutation/set-op.js +1687 -0
  338. package/dist/src/planner/mutation/set-op.js.map +1 -0
  339. package/dist/src/planner/mutation/single-source.d.ts +261 -0
  340. package/dist/src/planner/mutation/single-source.d.ts.map +1 -0
  341. package/dist/src/planner/mutation/single-source.js +1096 -0
  342. package/dist/src/planner/mutation/single-source.js.map +1 -0
  343. package/dist/src/planner/nodes/aggregate-node.d.ts +6 -4
  344. package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
  345. package/dist/src/planner/nodes/aggregate-node.js +11 -9
  346. package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
  347. package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
  348. package/dist/src/planner/nodes/alias-node.js +5 -1
  349. package/dist/src/planner/nodes/alias-node.js.map +1 -1
  350. package/dist/src/planner/nodes/alter-table-node.d.ts +124 -1
  351. package/dist/src/planner/nodes/alter-table-node.d.ts.map +1 -1
  352. package/dist/src/planner/nodes/alter-table-node.js +27 -0
  353. package/dist/src/planner/nodes/alter-table-node.js.map +1 -1
  354. package/dist/src/planner/nodes/analyze-node.d.ts +2 -1
  355. package/dist/src/planner/nodes/analyze-node.d.ts.map +1 -1
  356. package/dist/src/planner/nodes/analyze-node.js +21 -1
  357. package/dist/src/planner/nodes/analyze-node.js.map +1 -1
  358. package/dist/src/planner/nodes/asserted-keys-node.d.ts +43 -0
  359. package/dist/src/planner/nodes/asserted-keys-node.d.ts.map +1 -0
  360. package/dist/src/planner/nodes/asserted-keys-node.js +99 -0
  361. package/dist/src/planner/nodes/asserted-keys-node.js.map +1 -0
  362. package/dist/src/planner/nodes/async-gather-node.d.ts.map +1 -1
  363. package/dist/src/planner/nodes/async-gather-node.js +33 -8
  364. package/dist/src/planner/nodes/async-gather-node.js.map +1 -1
  365. package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -1
  366. package/dist/src/planner/nodes/bloom-join-node.js +2 -1
  367. package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
  368. package/dist/src/planner/nodes/create-view-node.d.ts +7 -2
  369. package/dist/src/planner/nodes/create-view-node.d.ts.map +1 -1
  370. package/dist/src/planner/nodes/create-view-node.js +4 -1
  371. package/dist/src/planner/nodes/create-view-node.js.map +1 -1
  372. package/dist/src/planner/nodes/declarative-schema.d.ts +13 -1
  373. package/dist/src/planner/nodes/declarative-schema.d.ts.map +1 -1
  374. package/dist/src/planner/nodes/declarative-schema.js +32 -0
  375. package/dist/src/planner/nodes/declarative-schema.js.map +1 -1
  376. package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
  377. package/dist/src/planner/nodes/distinct-node.js +2 -0
  378. package/dist/src/planner/nodes/distinct-node.js.map +1 -1
  379. package/dist/src/planner/nodes/dml-executor-node.d.ts +29 -1
  380. package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
  381. package/dist/src/planner/nodes/dml-executor-node.js +27 -3
  382. package/dist/src/planner/nodes/dml-executor-node.js.map +1 -1
  383. package/dist/src/planner/nodes/eager-prefetch-node.d.ts.map +1 -1
  384. package/dist/src/planner/nodes/eager-prefetch-node.js +2 -0
  385. package/dist/src/planner/nodes/eager-prefetch-node.js.map +1 -1
  386. package/dist/src/planner/nodes/envelope-scan-node.d.ts +42 -0
  387. package/dist/src/planner/nodes/envelope-scan-node.d.ts.map +1 -0
  388. package/dist/src/planner/nodes/envelope-scan-node.js +62 -0
  389. package/dist/src/planner/nodes/envelope-scan-node.js.map +1 -0
  390. package/dist/src/planner/nodes/fanout-lookup-join-node.d.ts.map +1 -1
  391. package/dist/src/planner/nodes/fanout-lookup-join-node.js +11 -1
  392. package/dist/src/planner/nodes/fanout-lookup-join-node.js.map +1 -1
  393. package/dist/src/planner/nodes/filter.d.ts.map +1 -1
  394. package/dist/src/planner/nodes/filter.js +63 -13
  395. package/dist/src/planner/nodes/filter.js.map +1 -1
  396. package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
  397. package/dist/src/planner/nodes/hash-aggregate.js +6 -16
  398. package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
  399. package/dist/src/planner/nodes/join-node.d.ts +41 -1
  400. package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
  401. package/dist/src/planner/nodes/join-node.js +78 -8
  402. package/dist/src/planner/nodes/join-node.js.map +1 -1
  403. package/dist/src/planner/nodes/join-utils.d.ts +33 -6
  404. package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
  405. package/dist/src/planner/nodes/join-utils.js +131 -10
  406. package/dist/src/planner/nodes/join-utils.js.map +1 -1
  407. package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts +104 -0
  408. package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts.map +1 -0
  409. package/dist/src/planner/nodes/lens-auxiliary-access-node.js +91 -0
  410. package/dist/src/planner/nodes/lens-auxiliary-access-node.js.map +1 -0
  411. package/dist/src/planner/nodes/limit-offset.d.ts +12 -0
  412. package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
  413. package/dist/src/planner/nodes/limit-offset.js +52 -3
  414. package/dist/src/planner/nodes/limit-offset.js.map +1 -1
  415. package/dist/src/planner/nodes/materialized-view-nodes.d.ts +69 -0
  416. package/dist/src/planner/nodes/materialized-view-nodes.d.ts.map +1 -0
  417. package/dist/src/planner/nodes/materialized-view-nodes.js +111 -0
  418. package/dist/src/planner/nodes/materialized-view-nodes.js.map +1 -0
  419. package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
  420. package/dist/src/planner/nodes/merge-join-node.js +2 -1
  421. package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
  422. package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -1
  423. package/dist/src/planner/nodes/ordinal-slice-node.js +2 -0
  424. package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -1
  425. package/dist/src/planner/nodes/plan-node-type.d.ts +9 -0
  426. package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
  427. package/dist/src/planner/nodes/plan-node-type.js +9 -0
  428. package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
  429. package/dist/src/planner/nodes/plan-node.d.ts +265 -5
  430. package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
  431. package/dist/src/planner/nodes/plan-node.js.map +1 -1
  432. package/dist/src/planner/nodes/pragma.d.ts +2 -1
  433. package/dist/src/planner/nodes/pragma.d.ts.map +1 -1
  434. package/dist/src/planner/nodes/pragma.js +12 -0
  435. package/dist/src/planner/nodes/pragma.js.map +1 -1
  436. package/dist/src/planner/nodes/project-node.d.ts +14 -1
  437. package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
  438. package/dist/src/planner/nodes/project-node.js +103 -16
  439. package/dist/src/planner/nodes/project-node.js.map +1 -1
  440. package/dist/src/planner/nodes/reference.d.ts.map +1 -1
  441. package/dist/src/planner/nodes/reference.js +63 -30
  442. package/dist/src/planner/nodes/reference.js.map +1 -1
  443. package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -1
  444. package/dist/src/planner/nodes/retrieve-node.js +7 -0
  445. package/dist/src/planner/nodes/retrieve-node.js.map +1 -1
  446. package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
  447. package/dist/src/planner/nodes/returning-node.js +10 -3
  448. package/dist/src/planner/nodes/returning-node.js.map +1 -1
  449. package/dist/src/planner/nodes/scalar.d.ts +20 -0
  450. package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
  451. package/dist/src/planner/nodes/scalar.js +71 -14
  452. package/dist/src/planner/nodes/scalar.js.map +1 -1
  453. package/dist/src/planner/nodes/set-object-tags-node.d.ts +39 -0
  454. package/dist/src/planner/nodes/set-object-tags-node.d.ts.map +1 -0
  455. package/dist/src/planner/nodes/set-object-tags-node.js +41 -0
  456. package/dist/src/planner/nodes/set-object-tags-node.js.map +1 -0
  457. package/dist/src/planner/nodes/set-operation-node.d.ts +123 -1
  458. package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
  459. package/dist/src/planner/nodes/set-operation-node.js +302 -18
  460. package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
  461. package/dist/src/planner/nodes/single-row.d.ts.map +1 -1
  462. package/dist/src/planner/nodes/single-row.js +3 -0
  463. package/dist/src/planner/nodes/single-row.js.map +1 -1
  464. package/dist/src/planner/nodes/sort.d.ts.map +1 -1
  465. package/dist/src/planner/nodes/sort.js +8 -7
  466. package/dist/src/planner/nodes/sort.js.map +1 -1
  467. package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
  468. package/dist/src/planner/nodes/stream-aggregate.js +8 -23
  469. package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
  470. package/dist/src/planner/nodes/subquery.d.ts +2 -0
  471. package/dist/src/planner/nodes/subquery.d.ts.map +1 -1
  472. package/dist/src/planner/nodes/subquery.js +18 -2
  473. package/dist/src/planner/nodes/subquery.js.map +1 -1
  474. package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
  475. package/dist/src/planner/nodes/table-access-nodes.js +23 -3
  476. package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
  477. package/dist/src/planner/nodes/table-function-call.js +6 -0
  478. package/dist/src/planner/nodes/table-function-call.js.map +1 -1
  479. package/dist/src/planner/nodes/values-node.d.ts +3 -1
  480. package/dist/src/planner/nodes/values-node.d.ts.map +1 -1
  481. package/dist/src/planner/nodes/values-node.js +26 -0
  482. package/dist/src/planner/nodes/values-node.js.map +1 -1
  483. package/dist/src/planner/nodes/view-mutation-node.d.ts +259 -0
  484. package/dist/src/planner/nodes/view-mutation-node.d.ts.map +1 -0
  485. package/dist/src/planner/nodes/view-mutation-node.js +273 -0
  486. package/dist/src/planner/nodes/view-mutation-node.js.map +1 -0
  487. package/dist/src/planner/nodes/window-function.d.ts +17 -1
  488. package/dist/src/planner/nodes/window-function.d.ts.map +1 -1
  489. package/dist/src/planner/nodes/window-function.js +15 -1
  490. package/dist/src/planner/nodes/window-function.js.map +1 -1
  491. package/dist/src/planner/nodes/window-node.js +3 -3
  492. package/dist/src/planner/nodes/window-node.js.map +1 -1
  493. package/dist/src/planner/optimizer.d.ts.map +1 -1
  494. package/dist/src/planner/optimizer.js +372 -39
  495. package/dist/src/planner/optimizer.js.map +1 -1
  496. package/dist/src/planner/planning-context.d.ts +1 -1
  497. package/dist/src/planner/planning-context.d.ts.map +1 -1
  498. package/dist/src/planner/rules/access/lens-access-form-matcher.d.ts +70 -0
  499. package/dist/src/planner/rules/access/lens-access-form-matcher.d.ts.map +1 -0
  500. package/dist/src/planner/rules/access/lens-access-form-matcher.js +156 -0
  501. package/dist/src/planner/rules/access/lens-access-form-matcher.js.map +1 -0
  502. package/dist/src/planner/rules/access/rule-lens-auxiliary-access.d.ts +31 -0
  503. package/dist/src/planner/rules/access/rule-lens-auxiliary-access.d.ts.map +1 -0
  504. package/dist/src/planner/rules/access/rule-lens-auxiliary-access.js +176 -0
  505. package/dist/src/planner/rules/access/rule-lens-auxiliary-access.js.map +1 -0
  506. package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
  507. package/dist/src/planner/rules/access/rule-select-access-path.js +435 -37
  508. package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
  509. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.d.ts.map +1 -1
  510. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js +8 -27
  511. package/dist/src/planner/rules/aggregate/rule-aggregate-streaming.js.map +1 -1
  512. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts +9 -3
  513. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts.map +1 -1
  514. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js +56 -5
  515. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js.map +1 -1
  516. package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.d.ts +39 -0
  517. package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.d.ts.map +1 -0
  518. package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js +616 -0
  519. package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js.map +1 -0
  520. package/dist/src/planner/rules/cache/rule-scalar-cse.d.ts.map +1 -1
  521. package/dist/src/planner/rules/cache/rule-scalar-cse.js +8 -1
  522. package/dist/src/planner/rules/cache/rule-scalar-cse.js.map +1 -1
  523. package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts +8 -7
  524. package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts.map +1 -1
  525. package/dist/src/planner/rules/distinct/rule-distinct-elimination.js +14 -21
  526. package/dist/src/planner/rules/distinct/rule-distinct-elimination.js.map +1 -1
  527. package/dist/src/planner/rules/join/equi-pair-extractor.d.ts +36 -0
  528. package/dist/src/planner/rules/join/equi-pair-extractor.d.ts.map +1 -1
  529. package/dist/src/planner/rules/join/equi-pair-extractor.js +42 -5
  530. package/dist/src/planner/rules/join/equi-pair-extractor.js.map +1 -1
  531. package/dist/src/planner/rules/join/rule-fanout-batched-outer.d.ts.map +1 -1
  532. package/dist/src/planner/rules/join/rule-fanout-batched-outer.js +10 -0
  533. package/dist/src/planner/rules/join/rule-fanout-batched-outer.js.map +1 -1
  534. package/dist/src/planner/rules/join/rule-fanout-lookup-join.js +25 -9
  535. package/dist/src/planner/rules/join/rule-fanout-lookup-join.js.map +1 -1
  536. package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.d.ts +130 -0
  537. package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.d.ts.map +1 -0
  538. package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.js +206 -0
  539. package/dist/src/planner/rules/join/rule-inner-join-existence-recovery.js.map +1 -0
  540. package/dist/src/planner/rules/join/rule-join-elimination.d.ts +67 -14
  541. package/dist/src/planner/rules/join/rule-join-elimination.d.ts.map +1 -1
  542. package/dist/src/planner/rules/join/rule-join-elimination.js +81 -25
  543. package/dist/src/planner/rules/join/rule-join-elimination.js.map +1 -1
  544. package/dist/src/planner/rules/join/rule-join-existence-pruning.d.ts +84 -0
  545. package/dist/src/planner/rules/join/rule-join-existence-pruning.d.ts.map +1 -0
  546. package/dist/src/planner/rules/join/rule-join-existence-pruning.js +138 -0
  547. package/dist/src/planner/rules/join/rule-join-existence-pruning.js.map +1 -0
  548. package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -1
  549. package/dist/src/planner/rules/join/rule-join-greedy-commute.js +19 -1
  550. package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -1
  551. package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
  552. package/dist/src/planner/rules/join/rule-join-physical-selection.js +14 -2
  553. package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
  554. package/dist/src/planner/rules/join/rule-lateral-top1-asof.d.ts.map +1 -1
  555. package/dist/src/planner/rules/join/rule-lateral-top1-asof.js +5 -2
  556. package/dist/src/planner/rules/join/rule-lateral-top1-asof.js.map +1 -1
  557. package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts.map +1 -1
  558. package/dist/src/planner/rules/join/rule-monotonic-merge-join.js +4 -0
  559. package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -1
  560. package/dist/src/planner/rules/join/rule-quickpick-enumeration.d.ts.map +1 -1
  561. package/dist/src/planner/rules/join/rule-quickpick-enumeration.js +10 -0
  562. package/dist/src/planner/rules/join/rule-quickpick-enumeration.js.map +1 -1
  563. package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.d.ts +286 -0
  564. package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.d.ts.map +1 -0
  565. package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.js +548 -0
  566. package/dist/src/planner/rules/join/rule-semijoin-existence-recovery.js.map +1 -0
  567. package/dist/src/planner/rules/parallel/rule-async-gather-union-all.d.ts.map +1 -1
  568. package/dist/src/planner/rules/parallel/rule-async-gather-union-all.js +9 -1
  569. package/dist/src/planner/rules/parallel/rule-async-gather-union-all.js.map +1 -1
  570. package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.d.ts.map +1 -1
  571. package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.js +7 -0
  572. package/dist/src/planner/rules/parallel/rule-async-gather-zip-by-key.js.map +1 -1
  573. package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.d.ts.map +1 -1
  574. package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.js +10 -1
  575. package/dist/src/planner/rules/parallel/rule-eager-prefetch-probe.js.map +1 -1
  576. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts.map +1 -1
  577. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js +10 -1
  578. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js.map +1 -1
  579. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts.map +1 -1
  580. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js +18 -0
  581. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js.map +1 -1
  582. package/dist/src/planner/rules/predicate/rule-filter-contradiction.d.ts.map +1 -1
  583. package/dist/src/planner/rules/predicate/rule-filter-contradiction.js +7 -0
  584. package/dist/src/planner/rules/predicate/rule-filter-contradiction.js.map +1 -1
  585. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts.map +1 -1
  586. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js +9 -0
  587. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js.map +1 -1
  588. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +13 -3
  589. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -1
  590. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +2 -2
  591. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
  592. package/dist/src/planner/rules/retrieve/rule-projection-pruning.d.ts.map +1 -1
  593. package/dist/src/planner/rules/retrieve/rule-projection-pruning.js +14 -0
  594. package/dist/src/planner/rules/retrieve/rule-projection-pruning.js.map +1 -1
  595. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts +16 -0
  596. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts.map +1 -1
  597. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js +47 -4
  598. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js.map +1 -1
  599. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts.map +1 -1
  600. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js +8 -0
  601. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js.map +1 -1
  602. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts.map +1 -1
  603. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js +7 -0
  604. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js.map +1 -1
  605. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -1
  606. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +12 -0
  607. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
  608. package/dist/src/planner/rules/window/rule-monotonic-window.js +1 -1
  609. package/dist/src/planner/rules/window/rule-monotonic-window.js.map +1 -1
  610. package/dist/src/planner/type-utils.d.ts +14 -0
  611. package/dist/src/planner/type-utils.d.ts.map +1 -1
  612. package/dist/src/planner/type-utils.js +66 -21
  613. package/dist/src/planner/type-utils.js.map +1 -1
  614. package/dist/src/planner/util/fd-utils.d.ts +228 -36
  615. package/dist/src/planner/util/fd-utils.d.ts.map +1 -1
  616. package/dist/src/planner/util/fd-utils.js +501 -84
  617. package/dist/src/planner/util/fd-utils.js.map +1 -1
  618. package/dist/src/planner/util/ind-utils.d.ts +27 -1
  619. package/dist/src/planner/util/ind-utils.d.ts.map +1 -1
  620. package/dist/src/planner/util/ind-utils.js +80 -6
  621. package/dist/src/planner/util/ind-utils.js.map +1 -1
  622. package/dist/src/planner/util/key-utils.d.ts +26 -3
  623. package/dist/src/planner/util/key-utils.d.ts.map +1 -1
  624. package/dist/src/planner/util/key-utils.js +182 -33
  625. package/dist/src/planner/util/key-utils.js.map +1 -1
  626. package/dist/src/planner/util/set-op-wrapper.d.ts +37 -0
  627. package/dist/src/planner/util/set-op-wrapper.d.ts.map +1 -0
  628. package/dist/src/planner/util/set-op-wrapper.js +82 -0
  629. package/dist/src/planner/util/set-op-wrapper.js.map +1 -0
  630. package/dist/src/planner/validation/plan-validator.d.ts.map +1 -1
  631. package/dist/src/planner/validation/plan-validator.js +1 -0
  632. package/dist/src/planner/validation/plan-validator.js.map +1 -1
  633. package/dist/src/runtime/context-helpers.d.ts +13 -1
  634. package/dist/src/runtime/context-helpers.d.ts.map +1 -1
  635. package/dist/src/runtime/context-helpers.js +7 -1
  636. package/dist/src/runtime/context-helpers.js.map +1 -1
  637. package/dist/src/runtime/delta-executor.d.ts +30 -1
  638. package/dist/src/runtime/delta-executor.d.ts.map +1 -1
  639. package/dist/src/runtime/delta-executor.js +38 -4
  640. package/dist/src/runtime/delta-executor.js.map +1 -1
  641. package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
  642. package/dist/src/runtime/emit/add-constraint.js +38 -5
  643. package/dist/src/runtime/emit/add-constraint.js.map +1 -1
  644. package/dist/src/runtime/emit/aggregate.d.ts.map +1 -1
  645. package/dist/src/runtime/emit/aggregate.js +10 -8
  646. package/dist/src/runtime/emit/aggregate.js.map +1 -1
  647. package/dist/src/runtime/emit/alter-table.d.ts +1 -1
  648. package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
  649. package/dist/src/runtime/emit/alter-table.js +664 -108
  650. package/dist/src/runtime/emit/alter-table.js.map +1 -1
  651. package/dist/src/runtime/emit/analyze.d.ts.map +1 -1
  652. package/dist/src/runtime/emit/analyze.js +2 -1
  653. package/dist/src/runtime/emit/analyze.js.map +1 -1
  654. package/dist/src/runtime/emit/asof-scan.d.ts.map +1 -1
  655. package/dist/src/runtime/emit/asof-scan.js +24 -9
  656. package/dist/src/runtime/emit/asof-scan.js.map +1 -1
  657. package/dist/src/runtime/emit/asserted-keys.d.ts +13 -0
  658. package/dist/src/runtime/emit/asserted-keys.d.ts.map +1 -0
  659. package/dist/src/runtime/emit/asserted-keys.js +13 -0
  660. package/dist/src/runtime/emit/asserted-keys.js.map +1 -0
  661. package/dist/src/runtime/emit/between.d.ts.map +1 -1
  662. package/dist/src/runtime/emit/between.js +24 -19
  663. package/dist/src/runtime/emit/between.js.map +1 -1
  664. package/dist/src/runtime/emit/binary.d.ts.map +1 -1
  665. package/dist/src/runtime/emit/binary.js +24 -36
  666. package/dist/src/runtime/emit/binary.js.map +1 -1
  667. package/dist/src/runtime/emit/block.d.ts.map +1 -1
  668. package/dist/src/runtime/emit/block.js +11 -2
  669. package/dist/src/runtime/emit/block.js.map +1 -1
  670. package/dist/src/runtime/emit/bloom-join.d.ts.map +1 -1
  671. package/dist/src/runtime/emit/bloom-join.js +12 -4
  672. package/dist/src/runtime/emit/bloom-join.js.map +1 -1
  673. package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
  674. package/dist/src/runtime/emit/constraint-check.js +50 -1
  675. package/dist/src/runtime/emit/constraint-check.js.map +1 -1
  676. package/dist/src/runtime/emit/create-table.d.ts.map +1 -1
  677. package/dist/src/runtime/emit/create-table.js +8 -0
  678. package/dist/src/runtime/emit/create-table.js.map +1 -1
  679. package/dist/src/runtime/emit/create-view.d.ts.map +1 -1
  680. package/dist/src/runtime/emit/create-view.js +16 -1
  681. package/dist/src/runtime/emit/create-view.js.map +1 -1
  682. package/dist/src/runtime/emit/delete.d.ts.map +1 -1
  683. package/dist/src/runtime/emit/delete.js +15 -5
  684. package/dist/src/runtime/emit/delete.js.map +1 -1
  685. package/dist/src/runtime/emit/dml-executor.d.ts +27 -0
  686. package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
  687. package/dist/src/runtime/emit/dml-executor.js +413 -193
  688. package/dist/src/runtime/emit/dml-executor.js.map +1 -1
  689. package/dist/src/runtime/emit/drop-table.d.ts.map +1 -1
  690. package/dist/src/runtime/emit/drop-table.js +10 -0
  691. package/dist/src/runtime/emit/drop-table.js.map +1 -1
  692. package/dist/src/runtime/emit/drop-view.d.ts.map +1 -1
  693. package/dist/src/runtime/emit/drop-view.js +17 -0
  694. package/dist/src/runtime/emit/drop-view.js.map +1 -1
  695. package/dist/src/runtime/emit/envelope-scan.d.ts +13 -0
  696. package/dist/src/runtime/emit/envelope-scan.d.ts.map +1 -0
  697. package/dist/src/runtime/emit/envelope-scan.js +22 -0
  698. package/dist/src/runtime/emit/envelope-scan.js.map +1 -0
  699. package/dist/src/runtime/emit/join.d.ts +10 -2
  700. package/dist/src/runtime/emit/join.d.ts.map +1 -1
  701. package/dist/src/runtime/emit/join.js +128 -38
  702. package/dist/src/runtime/emit/join.js.map +1 -1
  703. package/dist/src/runtime/emit/lens-auxiliary-access.d.ts +16 -0
  704. package/dist/src/runtime/emit/lens-auxiliary-access.d.ts.map +1 -0
  705. package/dist/src/runtime/emit/lens-auxiliary-access.js +16 -0
  706. package/dist/src/runtime/emit/lens-auxiliary-access.js.map +1 -0
  707. package/dist/src/runtime/emit/materialized-view-helpers.d.ts +640 -0
  708. package/dist/src/runtime/emit/materialized-view-helpers.d.ts.map +1 -0
  709. package/dist/src/runtime/emit/materialized-view-helpers.js +2576 -0
  710. package/dist/src/runtime/emit/materialized-view-helpers.js.map +1 -0
  711. package/dist/src/runtime/emit/materialized-view.d.ts +31 -0
  712. package/dist/src/runtime/emit/materialized-view.d.ts.map +1 -0
  713. package/dist/src/runtime/emit/materialized-view.js +187 -0
  714. package/dist/src/runtime/emit/materialized-view.js.map +1 -0
  715. package/dist/src/runtime/emit/merge-join.d.ts.map +1 -1
  716. package/dist/src/runtime/emit/merge-join.js +19 -5
  717. package/dist/src/runtime/emit/merge-join.js.map +1 -1
  718. package/dist/src/runtime/emit/project.d.ts.map +1 -1
  719. package/dist/src/runtime/emit/project.js +10 -5
  720. package/dist/src/runtime/emit/project.js.map +1 -1
  721. package/dist/src/runtime/emit/schema-declarative.d.ts +1 -0
  722. package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -1
  723. package/dist/src/runtime/emit/schema-declarative.js +101 -5
  724. package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
  725. package/dist/src/runtime/emit/set-object-tags.d.ts +16 -0
  726. package/dist/src/runtime/emit/set-object-tags.d.ts.map +1 -0
  727. package/dist/src/runtime/emit/set-object-tags.js +57 -0
  728. package/dist/src/runtime/emit/set-object-tags.js.map +1 -0
  729. package/dist/src/runtime/emit/set-operation.d.ts.map +1 -1
  730. package/dist/src/runtime/emit/set-operation.js +140 -24
  731. package/dist/src/runtime/emit/set-operation.js.map +1 -1
  732. package/dist/src/runtime/emit/subquery.d.ts.map +1 -1
  733. package/dist/src/runtime/emit/subquery.js +110 -5
  734. package/dist/src/runtime/emit/subquery.js.map +1 -1
  735. package/dist/src/runtime/emit/unary.d.ts.map +1 -1
  736. package/dist/src/runtime/emit/unary.js +34 -6
  737. package/dist/src/runtime/emit/unary.js.map +1 -1
  738. package/dist/src/runtime/emit/view-mutation.d.ts +70 -0
  739. package/dist/src/runtime/emit/view-mutation.d.ts.map +1 -0
  740. package/dist/src/runtime/emit/view-mutation.js +299 -0
  741. package/dist/src/runtime/emit/view-mutation.js.map +1 -0
  742. package/dist/src/runtime/emit/window.js +29 -5
  743. package/dist/src/runtime/emit/window.js.map +1 -1
  744. package/dist/src/runtime/foreign-key-actions.d.ts +66 -3
  745. package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -1
  746. package/dist/src/runtime/foreign-key-actions.js +580 -172
  747. package/dist/src/runtime/foreign-key-actions.js.map +1 -1
  748. package/dist/src/runtime/parallel-driver.d.ts +4 -1
  749. package/dist/src/runtime/parallel-driver.d.ts.map +1 -1
  750. package/dist/src/runtime/parallel-driver.js +5 -1
  751. package/dist/src/runtime/parallel-driver.js.map +1 -1
  752. package/dist/src/runtime/register.d.ts.map +1 -1
  753. package/dist/src/runtime/register.js +17 -1
  754. package/dist/src/runtime/register.js.map +1 -1
  755. package/dist/src/runtime/types.d.ts +10 -0
  756. package/dist/src/runtime/types.d.ts.map +1 -1
  757. package/dist/src/runtime/types.js.map +1 -1
  758. package/dist/src/schema/basis-backfill.d.ts +63 -0
  759. package/dist/src/schema/basis-backfill.d.ts.map +1 -0
  760. package/dist/src/schema/basis-backfill.js +161 -0
  761. package/dist/src/schema/basis-backfill.js.map +1 -0
  762. package/dist/src/schema/catalog.d.ts +115 -1
  763. package/dist/src/schema/catalog.d.ts.map +1 -1
  764. package/dist/src/schema/catalog.js +249 -22
  765. package/dist/src/schema/catalog.js.map +1 -1
  766. package/dist/src/schema/change-events.d.ts +42 -1
  767. package/dist/src/schema/change-events.d.ts.map +1 -1
  768. package/dist/src/schema/change-events.js.map +1 -1
  769. package/dist/src/schema/column.d.ts +16 -0
  770. package/dist/src/schema/column.d.ts.map +1 -1
  771. package/dist/src/schema/column.js.map +1 -1
  772. package/dist/src/schema/constraint-builder.d.ts +182 -0
  773. package/dist/src/schema/constraint-builder.d.ts.map +1 -0
  774. package/dist/src/schema/constraint-builder.js +424 -0
  775. package/dist/src/schema/constraint-builder.js.map +1 -0
  776. package/dist/src/schema/ddl-generator.d.ts +86 -1
  777. package/dist/src/schema/ddl-generator.d.ts.map +1 -1
  778. package/dist/src/schema/ddl-generator.js +316 -20
  779. package/dist/src/schema/ddl-generator.js.map +1 -1
  780. package/dist/src/schema/declared-schema-manager.d.ts +51 -0
  781. package/dist/src/schema/declared-schema-manager.d.ts.map +1 -1
  782. package/dist/src/schema/declared-schema-manager.js +61 -0
  783. package/dist/src/schema/declared-schema-manager.js.map +1 -1
  784. package/dist/src/schema/derivation.d.ts +106 -0
  785. package/dist/src/schema/derivation.d.ts.map +1 -0
  786. package/dist/src/schema/derivation.js +25 -0
  787. package/dist/src/schema/derivation.js.map +1 -0
  788. package/dist/src/schema/function.d.ts +13 -0
  789. package/dist/src/schema/function.d.ts.map +1 -1
  790. package/dist/src/schema/function.js.map +1 -1
  791. package/dist/src/schema/lens-ack.d.ts +90 -0
  792. package/dist/src/schema/lens-ack.d.ts.map +1 -0
  793. package/dist/src/schema/lens-ack.js +361 -0
  794. package/dist/src/schema/lens-ack.js.map +1 -0
  795. package/dist/src/schema/lens-compiler.d.ts +62 -0
  796. package/dist/src/schema/lens-compiler.d.ts.map +1 -0
  797. package/dist/src/schema/lens-compiler.js +1594 -0
  798. package/dist/src/schema/lens-compiler.js.map +1 -0
  799. package/dist/src/schema/lens-fk-discovery.d.ts +175 -0
  800. package/dist/src/schema/lens-fk-discovery.d.ts.map +1 -0
  801. package/dist/src/schema/lens-fk-discovery.js +336 -0
  802. package/dist/src/schema/lens-fk-discovery.js.map +1 -0
  803. package/dist/src/schema/lens-prover.d.ts +336 -0
  804. package/dist/src/schema/lens-prover.d.ts.map +1 -0
  805. package/dist/src/schema/lens-prover.js +1988 -0
  806. package/dist/src/schema/lens-prover.js.map +1 -0
  807. package/dist/src/schema/lens.d.ts +254 -0
  808. package/dist/src/schema/lens.d.ts.map +1 -0
  809. package/dist/src/schema/lens.js +21 -0
  810. package/dist/src/schema/lens.js.map +1 -0
  811. package/dist/src/schema/manager.d.ts +676 -18
  812. package/dist/src/schema/manager.d.ts.map +1 -1
  813. package/dist/src/schema/manager.js +1573 -238
  814. package/dist/src/schema/manager.js.map +1 -1
  815. package/dist/src/schema/mapping-advertisement-tags.d.ts +39 -0
  816. package/dist/src/schema/mapping-advertisement-tags.d.ts.map +1 -0
  817. package/dist/src/schema/mapping-advertisement-tags.js +216 -0
  818. package/dist/src/schema/mapping-advertisement-tags.js.map +1 -0
  819. package/dist/src/schema/rename-rewriter.d.ts +45 -4
  820. package/dist/src/schema/rename-rewriter.d.ts.map +1 -1
  821. package/dist/src/schema/rename-rewriter.js +412 -19
  822. package/dist/src/schema/rename-rewriter.js.map +1 -1
  823. package/dist/src/schema/reserved-tags-policy.d.ts +32 -0
  824. package/dist/src/schema/reserved-tags-policy.d.ts.map +1 -0
  825. package/dist/src/schema/reserved-tags-policy.js +34 -0
  826. package/dist/src/schema/reserved-tags-policy.js.map +1 -0
  827. package/dist/src/schema/reserved-tags.d.ts +170 -0
  828. package/dist/src/schema/reserved-tags.d.ts.map +1 -0
  829. package/dist/src/schema/reserved-tags.js +507 -0
  830. package/dist/src/schema/reserved-tags.js.map +1 -0
  831. package/dist/src/schema/schema-differ.d.ts +158 -2
  832. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  833. package/dist/src/schema/schema-differ.js +1460 -78
  834. package/dist/src/schema/schema-differ.js.map +1 -1
  835. package/dist/src/schema/schema-hasher.d.ts +8 -3
  836. package/dist/src/schema/schema-hasher.d.ts.map +1 -1
  837. package/dist/src/schema/schema-hasher.js +22 -2
  838. package/dist/src/schema/schema-hasher.js.map +1 -1
  839. package/dist/src/schema/schema.d.ts +25 -1
  840. package/dist/src/schema/schema.d.ts.map +1 -1
  841. package/dist/src/schema/schema.js +36 -2
  842. package/dist/src/schema/schema.js.map +1 -1
  843. package/dist/src/schema/table.d.ts +259 -10
  844. package/dist/src/schema/table.d.ts.map +1 -1
  845. package/dist/src/schema/table.js +309 -26
  846. package/dist/src/schema/table.js.map +1 -1
  847. package/dist/src/schema/unique-enforcement.d.ts +78 -0
  848. package/dist/src/schema/unique-enforcement.d.ts.map +1 -0
  849. package/dist/src/schema/unique-enforcement.js +93 -0
  850. package/dist/src/schema/unique-enforcement.js.map +1 -0
  851. package/dist/src/schema/view.d.ts +83 -2
  852. package/dist/src/schema/view.d.ts.map +1 -1
  853. package/dist/src/schema/view.js +67 -1
  854. package/dist/src/schema/view.js.map +1 -1
  855. package/dist/src/schema/window-function.d.ts +9 -1
  856. package/dist/src/schema/window-function.d.ts.map +1 -1
  857. package/dist/src/schema/window-function.js.map +1 -1
  858. package/dist/src/types/temporal-types.d.ts.map +1 -1
  859. package/dist/src/types/temporal-types.js +71 -36
  860. package/dist/src/types/temporal-types.js.map +1 -1
  861. package/dist/src/util/comparison.d.ts +24 -0
  862. package/dist/src/util/comparison.d.ts.map +1 -1
  863. package/dist/src/util/comparison.js +34 -0
  864. package/dist/src/util/comparison.js.map +1 -1
  865. package/dist/src/util/mutation-statement.d.ts.map +1 -1
  866. package/dist/src/util/mutation-statement.js +4 -1
  867. package/dist/src/util/mutation-statement.js.map +1 -1
  868. package/dist/src/util/serialization.d.ts +9 -0
  869. package/dist/src/util/serialization.d.ts.map +1 -1
  870. package/dist/src/util/serialization.js +26 -0
  871. package/dist/src/util/serialization.js.map +1 -1
  872. package/dist/src/vtab/backing-host.d.ts +286 -0
  873. package/dist/src/vtab/backing-host.d.ts.map +1 -0
  874. package/dist/src/vtab/backing-host.js +118 -0
  875. package/dist/src/vtab/backing-host.js.map +1 -0
  876. package/dist/src/vtab/best-access-plan.d.ts +21 -0
  877. package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
  878. package/dist/src/vtab/best-access-plan.js.map +1 -1
  879. package/dist/src/vtab/capabilities.d.ts +5 -5
  880. package/dist/src/vtab/capabilities.d.ts.map +1 -1
  881. package/dist/src/vtab/mapping-advertisement.d.ts +163 -0
  882. package/dist/src/vtab/mapping-advertisement.d.ts.map +1 -0
  883. package/dist/src/vtab/mapping-advertisement.js +2 -0
  884. package/dist/src/vtab/mapping-advertisement.js.map +1 -0
  885. package/dist/src/vtab/memory/index.d.ts +64 -4
  886. package/dist/src/vtab/memory/index.d.ts.map +1 -1
  887. package/dist/src/vtab/memory/index.js +119 -12
  888. package/dist/src/vtab/memory/index.js.map +1 -1
  889. package/dist/src/vtab/memory/layer/base.d.ts +38 -1
  890. package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
  891. package/dist/src/vtab/memory/layer/base.js +112 -24
  892. package/dist/src/vtab/memory/layer/base.js.map +1 -1
  893. package/dist/src/vtab/memory/layer/manager.d.ts +291 -4
  894. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  895. package/dist/src/vtab/memory/layer/manager.js +1050 -91
  896. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  897. package/dist/src/vtab/memory/layer/plan-filter.d.ts.map +1 -1
  898. package/dist/src/vtab/memory/layer/plan-filter.js +35 -6
  899. package/dist/src/vtab/memory/layer/plan-filter.js.map +1 -1
  900. package/dist/src/vtab/memory/layer/scan-layer.d.ts.map +1 -1
  901. package/dist/src/vtab/memory/layer/scan-layer.js +66 -14
  902. package/dist/src/vtab/memory/layer/scan-layer.js.map +1 -1
  903. package/dist/src/vtab/memory/layer/scan-plan.d.ts +14 -0
  904. package/dist/src/vtab/memory/layer/scan-plan.d.ts.map +1 -1
  905. package/dist/src/vtab/memory/layer/scan-plan.js +27 -4
  906. package/dist/src/vtab/memory/layer/scan-plan.js.map +1 -1
  907. package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
  908. package/dist/src/vtab/memory/layer/transaction.js +5 -1
  909. package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
  910. package/dist/src/vtab/memory/module.d.ts +17 -0
  911. package/dist/src/vtab/memory/module.d.ts.map +1 -1
  912. package/dist/src/vtab/memory/module.js +82 -3
  913. package/dist/src/vtab/memory/module.js.map +1 -1
  914. package/dist/src/vtab/memory/table.d.ts.map +1 -1
  915. package/dist/src/vtab/memory/table.js +15 -5
  916. package/dist/src/vtab/memory/table.js.map +1 -1
  917. package/dist/src/vtab/memory/types.d.ts +20 -2
  918. package/dist/src/vtab/memory/types.d.ts.map +1 -1
  919. package/dist/src/vtab/memory/utils/predicate.d.ts.map +1 -1
  920. package/dist/src/vtab/memory/utils/predicate.js +46 -24
  921. package/dist/src/vtab/memory/utils/predicate.js.map +1 -1
  922. package/dist/src/vtab/memory/utils/primary-key-encode.d.ts +31 -0
  923. package/dist/src/vtab/memory/utils/primary-key-encode.d.ts.map +1 -0
  924. package/dist/src/vtab/memory/utils/primary-key-encode.js +101 -0
  925. package/dist/src/vtab/memory/utils/primary-key-encode.js.map +1 -0
  926. package/dist/src/vtab/memory/utils/primary-key.d.ts +8 -0
  927. package/dist/src/vtab/memory/utils/primary-key.d.ts.map +1 -1
  928. package/dist/src/vtab/memory/utils/primary-key.js +12 -5
  929. package/dist/src/vtab/memory/utils/primary-key.js.map +1 -1
  930. package/dist/src/vtab/module.d.ts +203 -4
  931. package/dist/src/vtab/module.d.ts.map +1 -1
  932. package/dist/src/vtab/table.d.ts +9 -0
  933. package/dist/src/vtab/table.d.ts.map +1 -1
  934. package/dist/src/vtab/table.js.map +1 -1
  935. package/package.json +6 -5
@@ -5,10 +5,11 @@ import { getVTable, disconnectVTable } from '../utils.js';
5
5
  import { ConflictResolution } from '../../common/constants.js';
6
6
  import { extractOldRowFromFlat, extractNewRowFromFlat } from '../../util/row-descriptor.js';
7
7
  import { buildInsertStatement, buildUpdateStatement, buildDeleteStatement } from '../../util/mutation-statement.js';
8
+ import { isMaintainedTable } from '../../schema/derivation.js';
8
9
  import { hasNativeEventSupport } from '../../util/event-support.js';
9
10
  import { sqlValuesEqual } from '../../util/comparison.js';
10
11
  import { withAsyncRowContext } from '../context-helpers.js';
11
- import { executeForeignKeyActions, assertTransitiveRestrictsForParentMutation } from '../foreign-key-actions.js';
12
+ import { executeForeignKeyActionsAndLens, assertTransitiveRestrictsForParentMutation } from '../foreign-key-actions.js';
12
13
  /**
13
14
  * Module-scope counter producing unique statement-savepoint names across
14
15
  * concurrent emissions. Names must be unique within the TransactionManager's
@@ -16,6 +17,19 @@ import { executeForeignKeyActions, assertTransitiveRestrictsForParentMutation }
16
17
  * (e.g. FK cascade during the parent insert).
17
18
  */
18
19
  let stmtSavepointCounter = 0;
20
+ /**
21
+ * Returns true when the table's owning *module* natively emits data events.
22
+ * The gate must consult the MODULE, not the vtab instance: StoreModule exposes
23
+ * getEventEmitter only at the module level — its table instances do not — so an
24
+ * instance check spuriously reports "no native support" and the engine double-emits
25
+ * alongside the module's native emitter. Mirrors the schema-event gate in
26
+ * schema/manager.ts (emitAutoSchemaEventIfNeeded).
27
+ */
28
+ function moduleHasNativeDataEvents(ctx, tableSchema) {
29
+ const moduleName = tableSchema.vtabModuleName;
30
+ const moduleReg = moduleName ? ctx.db._getVtabModule(moduleName) : undefined;
31
+ return hasNativeEventSupport(moduleReg?.module);
32
+ }
19
33
  /**
20
34
  * Emit an automatic data change event for modules without native event support.
21
35
  */
@@ -31,8 +45,82 @@ function emitAutoDataEvent(ctx, tableSchema, type, key, oldRow, newRow, changedC
31
45
  remote: false, // Auto-emitted events are always local
32
46
  });
33
47
  }
48
+ /**
49
+ * Synchronously drive row-time (write-through) materialized-view maintenance for
50
+ * one source row-write, immediately after the change is recorded. A no-op fast
51
+ * path (one synchronous map lookup) when no `row-time` MV depends on `tableKey`,
52
+ * so non-covered tables pay effectively nothing. The maintenance writes the
53
+ * covering MV's backing table within the same transaction (visible mid-statement;
54
+ * committed/rolled-back in lockstep with this write) — see
55
+ * `core/database-materialized-views.ts` § row-time write-through.
56
+ *
57
+ * `cache` is the per-statement {@link BackingConnectionCache} the generator owns: it
58
+ * amortizes the backing-connection resolution over the whole statement (one scan per
59
+ * backing instead of one per source row) while still applying each bounded-delta arm's
60
+ * ops immediately, so within-statement enforcement visibility is unchanged.
61
+ *
62
+ * `deferred` is the per-statement deferred-rebuild set the generator owns: a full-rebuild
63
+ * covering MV is marked dirty here (not applied per row) and rebuilt once at the
64
+ * end-of-statement flush ({@link runWithStatementSavepoints}). Bounded-delta arms stay
65
+ * per-row-immediate.
66
+ */
67
+ async function maintainRowTimeStructures(ctx, tableKey, change, cache, deferred) {
68
+ if (!ctx.db._hasRowTimeCoveringStructures(tableKey))
69
+ return;
70
+ await ctx.db._maintainRowTimeCoveringStructures(tableKey, change, cache, deferred);
71
+ }
72
+ /**
73
+ * Evaluate the per-statement mutation-context evaluators once, producing the
74
+ * context row passed to the mutation-statement builders (or undefined when
75
+ * there are no context evaluators). Shared by all three DML generators.
76
+ */
77
+ async function evaluateContextRow(ctx, contextEvaluators) {
78
+ if (contextEvaluators.length === 0)
79
+ return undefined;
80
+ const contextRow = [];
81
+ for (const evaluator of contextEvaluators) {
82
+ contextRow.push(await evaluator(ctx));
83
+ }
84
+ return contextRow;
85
+ }
86
+ /**
87
+ * Engine-level READONLY backstop for maintained tables — the defense-in-depth
88
+ * second net behind plan-time write-through dispatch.
89
+ *
90
+ * A maintained table's rows are *derived* (it carries a {@link TableDerivation};
91
+ * `schema/derivation.ts`). The only engine surfaces permitted to write them are
92
+ * the privileged backing-host paths (`applyMaintenance` / `replaceContents`, the
93
+ * attach/refresh reconcile, the store rehydrate-refill, the isolation flush
94
+ * `trustedWrite`) — none of which route through the DML executor. User DML naming
95
+ * a maintained table is rewritten to **write-through** against the body's base
96
+ * source at plan time (the three DML builders' view-mutation dispatch + the
97
+ * resolved-schema backstop), so a `DmlExecutorNode` whose target still carries a
98
+ * derivation can only be a plan-time mis-dispatch — a direct-write plan that
99
+ * would silently diverge the derived contents from the source. This converts that
100
+ * whole bug class into a loud READONLY error at emit time.
101
+ *
102
+ * Keyed structurally on `derivation` presence ({@link isMaintainedTable}) — never
103
+ * on the table name. Emit-time (a single prepare-time check), not per-row: zero
104
+ * runtime cost, and re-checked on every re-plan because `set / drop maintained`
105
+ * invalidate the `'table'` statement-cache dependency. Exported so a spec test can
106
+ * exercise it directly with a derivation-bearing schema: the backstop is
107
+ * deliberately unreachable from SQL (plan-time dispatch routes every reachable
108
+ * spelling away from it), so the exported guard plus the one wiring call site is
109
+ * the honest pin.
110
+ */
111
+ export function assertNotMaintainedTableTarget(tableSchema) {
112
+ if (isMaintainedTable(tableSchema)) {
113
+ throw new QuereusError(`table '${tableSchema.schemaName}.${tableSchema.name}' is a maintained table — its contents are derived `
114
+ + `and may not be written directly (user DML routes through write-through; this plan bypassed the dispatch — engine bug)`, StatusCode.READONLY);
115
+ }
116
+ }
34
117
  export function emitDmlExecutor(plan, ctx) {
35
118
  const tableSchema = plan.table.tableSchema;
119
+ // READONLY backstop: a DmlExecutorNode targeting a maintained table is a
120
+ // plan-time mis-dispatch (user DML should have been rewritten to write-through
121
+ // against the base source). Reject loudly rather than letting a direct write
122
+ // silently diverge the derived contents — see assertNotMaintainedTableTarget.
123
+ assertNotMaintainedTableTarget(tableSchema);
36
124
  // Pre-calculate primary key column indices from schema (needed for update/delete)
37
125
  const pkColumnIndicesInSchema = tableSchema.primaryKeyDefinition.map(pkColDef => pkColDef.index);
38
126
  // Emit mutation context evaluators if present
@@ -179,39 +267,43 @@ export function emitDmlExecutor(plan, ctx) {
179
267
  }
180
268
  return err;
181
269
  }
182
- // INSERT ----------------------------------------------------
183
- // Number of context evaluators (used to split params in runInsert)
184
- const numContextEvaluators = contextEvaluatorInstructions.length;
185
- async function* runInsert(ctx, rows, ...allEvaluators) {
186
- // Split evaluators: first numContextEvaluators are context, rest are upsert
187
- const contextEvaluators = allEvaluators.slice(0, numContextEvaluators);
188
- const upsertEvaluators = allEvaluators.slice(numContextEvaluators);
189
- // Ensure we're in a transaction before any mutations (lazy/JIT transaction start)
190
- await ctx.db._ensureTransaction();
191
- const vtab = await getVTable(ctx, tableSchema);
192
- const needsAutoEvents = ctx.db.hasDataListeners() && !hasNativeEventSupport(vtab);
193
- // Evaluate mutation context once per statement
194
- let contextRow;
195
- if (contextEvaluators.length > 0) {
196
- contextRow = [];
197
- for (const evaluator of contextEvaluators) {
198
- const value = await evaluator(ctx);
199
- contextRow.push(value);
200
- }
201
- }
202
- // OR FAIL needs per-row rollback so a later row's failure doesn't undo prior rows.
203
- // We open a savepoint, do the row's work, release on success, rollback on error.
204
- const isFailMode = plan.onConflict === ConflictResolution.FAIL;
270
+ /**
271
+ * Shared statement-/row-level savepoint scaffold for multi-row DML, used by
272
+ * all three generators. Owns the savepoint lifecycle that makes a multi-row
273
+ * mutation atomic inside an explicit transaction, plus the per-row OR FAIL
274
+ * savepoint that keeps prior rows while undoing only the failing row.
275
+ * INSERT/UPDATE/DELETE reduce to a `processRow` closure carrying the
276
+ * operation-specific body (vtab.update + bookkeeping + FK actions + events).
277
+ *
278
+ * - non-FAIL (ABORT default / IGNORE / REPLACE / ROLLBACK): one
279
+ * statement-scope savepoint, released after the loop completes and
280
+ * rolled-back-and-released on ANY throw escaping the loop — whether from
281
+ * the source iterator (e.g. a ConstraintCheckNode above the executor
282
+ * raising NOT NULL / CHECK before a row is yielded) or from `processRow`
283
+ * (a vtab-returned constraint, or a RESTRICT pre-check). This is the
284
+ * statement-atomicity guarantee, mirroring SQLite's implicit
285
+ * per-statement savepoint: all of a statement's row effects apply or none.
286
+ * - OR FAIL: per-row savepoint, released on success, rolled back on throw,
287
+ * so the failing row's partial work (incl. a row-time backing write that
288
+ * lands before a later maintenance throw) is undone while earlier rows
289
+ * survive. FAIL deliberately skips the statement-scope wrap.
290
+ *
291
+ * Always uses the broadcast savepoint helpers so per-connection savepoint
292
+ * stacks stay in lockstep with the TransactionManager's stack — including a
293
+ * connection registered lazily mid-statement (the row-time backing
294
+ * connection registers on the first maintenance call; Database.registerConnection
295
+ * replays the active savepoint depth onto it, which already includes the
296
+ * statement savepoint created before the row loop).
297
+ */
298
+ async function* runWithStatementSavepoints(ctx, vtab, rows, isFailMode, processRow, deferredRebuilds, backingConnCache) {
205
299
  let failSavepointCounter = 0;
206
- // For non-FAIL modes (ABORT default / IGNORE / REPLACE / ROLLBACK) we wrap
207
- // the whole statement in a savepoint so a mid-statement constraint failure
208
- // unwinds partial writes from earlier rows. Use the broadcast helper so
209
- // per-connection savepoint stacks stay in lockstep with the
210
- // TransactionManager's stack (otherwise an outer user-level SAVEPOINT
211
- // could index into a stale placeholder).
212
- const wrapStatementSavepoint = !isFailMode;
213
- const stmtSavepointName = wrapStatementSavepoint
214
- ? `__or_abort_${stmtSavepointCounter++}`
300
+ // For non-FAIL modes wrap the whole statement so a mid-statement failure
301
+ // unwinds partial writes from earlier rows. FAIL keeps prior rows, so it
302
+ // uses the per-row savepoint (opened inside the loop) instead. Share the
303
+ // module-scope counter so a cascade-nested savepoint name (e.g. an FK
304
+ // cascade UPDATE during a parent UPDATE) can't collide with the parent's.
305
+ const stmtSavepointName = !isFailMode
306
+ ? `__stmt_atomic_${stmtSavepointCounter++}`
215
307
  : undefined;
216
308
  if (stmtSavepointName) {
217
309
  await ctx.db._createSavepointBroadcast(stmtSavepointName);
@@ -219,14 +311,9 @@ export function emitDmlExecutor(plan, ctx) {
219
311
  try {
220
312
  try {
221
313
  for await (const flatRow of rows) {
222
- // OR FAIL per-row savepoint. Like the statement-scope wrap above,
223
- // we use the broadcast helper so per-connection savepoint stacks
224
- // stay in lockstep with TransactionManager's. If a new connection
225
- // registers mid-row (e.g. via CTE materialization that
226
- // instantiates a new memory-backed table), Database.registerConnection
227
- // replays the active depth onto it — without broadcasting our
228
- // create here, that replay would offset its stack by one and a
229
- // subsequent user-level ROLLBACK TO would restore the wrong layer.
314
+ // OR FAIL per-row savepoint. Broadcast (not the bare variant)
315
+ // so a connection registering mid-row keeps its stack in
316
+ // lockstep see the doc comment above.
230
317
  let savepointName;
231
318
  if (isFailMode) {
232
319
  savepointName = `__or_fail_${failSavepointCounter++}`;
@@ -235,7 +322,7 @@ export function emitDmlExecutor(plan, ctx) {
235
322
  let rowToYield;
236
323
  let succeeded = false;
237
324
  try {
238
- rowToYield = await processInsertRow(ctx, vtab, needsAutoEvents, flatRow, contextRow, runtimeUpsertClauses, upsertEvaluators);
325
+ rowToYield = await processRow(flatRow);
239
326
  succeeded = true;
240
327
  }
241
328
  catch (e) {
@@ -243,8 +330,9 @@ export function emitDmlExecutor(plan, ctx) {
243
330
  await ctx.db._rollbackAndReleaseSavepointBroadcast(savepointName);
244
331
  savepointName = undefined;
245
332
  }
246
- // Translate plain constraint violations to FAIL/ROLLBACK error subclasses
247
- // so the iterator-level cleanup picks the right finalization branch.
333
+ // Translate plain constraint violations to FAIL/ROLLBACK error
334
+ // subclasses so the iterator-level cleanup picks the right
335
+ // finalization branch.
248
336
  throw translateConflictError(e, plan.onConflict);
249
337
  }
250
338
  if (succeeded && savepointName) {
@@ -254,6 +342,14 @@ export function emitDmlExecutor(plan, ctx) {
254
342
  yield rowToYield;
255
343
  }
256
344
  }
345
+ // End-of-statement boundary: drain the deferred full-rebuild set NOW — after
346
+ // every source row has been applied (so each rebuild reads all this
347
+ // statement's writes) and BEFORE the statement savepoint releases (so a
348
+ // failed rebuild rolls the whole statement back). Inside the try, so a flush
349
+ // error routes to the rollback branch below. A no-op when nothing deferred.
350
+ if (deferredRebuilds.size > 0) {
351
+ await ctx.db._flushDeferredRebuilds(deferredRebuilds, backingConnCache);
352
+ }
257
353
  if (stmtSavepointName) {
258
354
  await ctx.db._releaseSavepointBroadcast(stmtSavepointName);
259
355
  }
@@ -262,6 +358,19 @@ export function emitDmlExecutor(plan, ctx) {
262
358
  if (stmtSavepointName) {
263
359
  await ctx.db._rollbackAndReleaseSavepointBroadcast(stmtSavepointName);
264
360
  }
361
+ else if (deferredRebuilds.size > 0) {
362
+ // OR FAIL keeps the rows that already succeeded (it runs with no
363
+ // statement-scope savepoint), so a mid-statement abort does NOT unwind
364
+ // them. Their deferred full-rebuild MVs must therefore still be flushed
365
+ // before the conflict error propagates — otherwise the backing would lag
366
+ // the surviving source rows mid-transaction (read(MV) != evaluate(body)).
367
+ // The failing row's own per-row savepoint already reverted its writes, so
368
+ // the rebuild re-evaluates over exactly the surviving rows. The original
369
+ // conflict error is re-thrown after the flush. (A flush failure here is a
370
+ // genuine maintenance error and supersedes the conflict error, matching
371
+ // "a maintenance error fails the source write".)
372
+ await ctx.db._flushDeferredRebuilds(deferredRebuilds, backingConnCache);
373
+ }
265
374
  throw e;
266
375
  }
267
376
  }
@@ -269,6 +378,62 @@ export function emitDmlExecutor(plan, ctx) {
269
378
  await disconnectVTable(ctx, vtab);
270
379
  }
271
380
  }
381
+ // INSERT ----------------------------------------------------
382
+ // Number of context evaluators (used to split params in runInsert)
383
+ const numContextEvaluators = contextEvaluatorInstructions.length;
384
+ async function* runInsert(ctx, rows, ...allEvaluators) {
385
+ // Split evaluators: first numContextEvaluators are context, rest are upsert
386
+ const contextEvaluators = allEvaluators.slice(0, numContextEvaluators);
387
+ const upsertEvaluators = allEvaluators.slice(numContextEvaluators);
388
+ // Ensure we're in a transaction before any mutations (lazy/JIT transaction start)
389
+ await ctx.db._ensureTransaction();
390
+ const vtab = await getVTable(ctx, tableSchema);
391
+ const needsAutoEvents = ctx.db._needsDataEvents() && !moduleHasNativeDataEvents(ctx, tableSchema);
392
+ const contextRow = await evaluateContextRow(ctx, contextEvaluators);
393
+ // Per-statement backing-connection cache: resolve each covering MV's backing
394
+ // connection once for the whole statement rather than once per source row.
395
+ const backingConnCache = new Map();
396
+ // Per-statement deferred full-rebuild set (MV keys): full-rebuild covering MVs
397
+ // are marked dirty during the row loop and rebuilt once at the end-of-statement
398
+ // flush in runWithStatementSavepoints.
399
+ const deferredRebuilds = new Set();
400
+ const isFailMode = plan.onConflict === ConflictResolution.FAIL;
401
+ // Stamp the per-row mutation ordinal so a column `default` referencing
402
+ // `mutation_ordinal()` (a per-row surrogate allocator) resolves to the 1-based
403
+ // position of the row being produced. The defaults are evaluated upstream as
404
+ // each row is *pulled*, so the ordinal is set BEFORE pulling — see
405
+ // `stampMutationOrdinal`.
406
+ yield* runWithStatementSavepoints(ctx, vtab, stampMutationOrdinal(ctx, rows), isFailMode, (flatRow) => processInsertRow(ctx, vtab, needsAutoEvents, flatRow, contextRow, runtimeUpsertClauses, upsertEvaluators, backingConnCache, deferredRebuilds), deferredRebuilds, backingConnCache);
407
+ }
408
+ /**
409
+ * Wrap the INSERT source so `rctx.mutationOrdinal` holds the 1-based ordinal of the
410
+ * row about to be produced. The column-default projection runs upstream when each
411
+ * row is *pulled*, so the ordinal is set immediately before `it.next()` — that pull
412
+ * drives the default evaluation for exactly that row, and `mutation_ordinal()` reads
413
+ * the just-set value. Saved/restored so a nested mutation (an FK cascade, a
414
+ * row-time backing write) does not see a stale ordinal, and cleared in `finally` so
415
+ * it never leaks past the statement.
416
+ */
417
+ async function* stampMutationOrdinal(rctx, rows) {
418
+ const saved = rctx.mutationOrdinal;
419
+ const it = rows[Symbol.asyncIterator]();
420
+ let ordinal = 0;
421
+ try {
422
+ while (true) {
423
+ rctx.mutationOrdinal = ordinal + 1;
424
+ const next = await it.next();
425
+ if (next.done)
426
+ break;
427
+ ordinal += 1;
428
+ yield next.value;
429
+ }
430
+ }
431
+ finally {
432
+ rctx.mutationOrdinal = saved;
433
+ if (it.return)
434
+ await it.return();
435
+ }
436
+ }
272
437
  /**
273
438
  * Performs a single row's INSERT side-effects (vtab.update + bookkeeping +
274
439
  * UPSERT handling + REPLACE handling). Returns the row to yield downstream,
@@ -276,8 +441,9 @@ export function emitDmlExecutor(plan, ctx) {
276
441
  *
277
442
  * Throws ConstraintError on violations the executor cannot recover from.
278
443
  */
279
- async function processInsertRow(ctx, vtab, needsAutoEvents, flatRow, contextRow, runtimeUpsertClauses, upsertEvaluators) {
444
+ async function processInsertRow(ctx, vtab, needsAutoEvents, flatRow, contextRow, runtimeUpsertClauses, upsertEvaluators, backingConnCache, deferredRebuilds) {
280
445
  const newRow = extractNewRowFromFlat(flatRow, tableSchema.columns.length);
446
+ const tableKey = `${tableSchema.schemaName}.${tableSchema.name}`;
281
447
  let mutationStatement;
282
448
  if (vtab.wantStatements) {
283
449
  mutationStatement = buildInsertStatement(tableSchema, newRow, contextRow);
@@ -304,8 +470,9 @@ export function emitDmlExecutor(plan, ctx) {
304
470
  if (!updateResult)
305
471
  return undefined;
306
472
  const existingKeyValues = pkColumnIndicesInSchema.map(idx => result.existingRow[idx]);
307
- ctx.db._recordUpdate(`${tableSchema.schemaName}.${tableSchema.name}`, result.existingRow, updateResult.updatedRow, pkColumnIndicesInSchema);
308
- await executeForeignKeyActions(ctx.db, tableSchema, 'update', result.existingRow, updateResult.updatedRow);
473
+ ctx.db._recordUpdate(tableKey, result.existingRow, updateResult.updatedRow, pkColumnIndicesInSchema);
474
+ await maintainRowTimeStructures(ctx, tableKey, { op: 'update', oldRow: result.existingRow, newRow: updateResult.updatedRow }, backingConnCache, deferredRebuilds);
475
+ await executeForeignKeyActionsAndLens(ctx.db, tableSchema, 'update', result.existingRow, updateResult.updatedRow, plan.lensRouted);
309
476
  if (needsAutoEvents) {
310
477
  const changedColumns = [];
311
478
  for (let i = 0; i < tableSchema.columns.length; i++) {
@@ -325,12 +492,16 @@ export function emitDmlExecutor(plan, ctx) {
325
492
  if (!result.row) {
326
493
  return undefined;
327
494
  }
328
- const tableKey = `${tableSchema.schemaName}.${tableSchema.name}`;
495
+ // Internal REPLACE evictions (rows at OTHER PKs removed to resolve a non-PK
496
+ // UNIQUE conflict) run the full delete pipeline here, before the new row's
497
+ // own bookkeeping — evict-then-write, matching the substrate journal order.
498
+ await processEvictions(ctx, needsAutoEvents, tableKey, result.evictedRows, backingConnCache, deferredRebuilds);
329
499
  const replacedRow = result.replacedRow;
330
500
  if (replacedRow) {
331
501
  const newKeyValues = pkColumnIndicesInSchema.map(idx => newRow[idx]);
332
502
  ctx.db._recordUpdate(tableKey, replacedRow, newRow, pkColumnIndicesInSchema);
333
- await executeForeignKeyActions(ctx.db, tableSchema, 'delete', replacedRow);
503
+ await maintainRowTimeStructures(ctx, tableKey, { op: 'update', oldRow: replacedRow, newRow }, backingConnCache, deferredRebuilds);
504
+ await executeForeignKeyActionsAndLens(ctx.db, tableSchema, 'delete', replacedRow, undefined, plan.lensRouted);
334
505
  if (needsAutoEvents) {
335
506
  const changedColumns = [];
336
507
  for (let i = 0; i < tableSchema.columns.length; i++) {
@@ -344,176 +515,225 @@ export function emitDmlExecutor(plan, ctx) {
344
515
  else {
345
516
  const pkValues = pkColumnIndicesInSchema.map(idx => newRow[idx]);
346
517
  ctx.db._recordInsert(tableKey, newRow, pkColumnIndicesInSchema);
518
+ await maintainRowTimeStructures(ctx, tableKey, { op: 'insert', newRow }, backingConnCache, deferredRebuilds);
347
519
  if (needsAutoEvents) {
348
520
  emitAutoDataEvent(ctx, tableSchema, 'insert', pkValues, undefined, [...newRow]);
349
521
  }
350
522
  }
351
523
  return flatRow;
352
524
  }
525
+ /**
526
+ * Drive the full delete pipeline for every internal REPLACE eviction reported
527
+ * in `evictedRows` — rows at *other PKs* a substrate removed to resolve a non-PK
528
+ * UNIQUE conflict for this same `vtab.update()` call. The substrate deletes the
529
+ * row from its own storage but cannot run the cross-cutting post-write steps
530
+ * (change-tracking, row-time MV maintenance, FK cascade, auto-events) — those
531
+ * live solely here. So each evicted row is processed as a full DELETE, exactly
532
+ * like {@link processDeleteRow}'s own bookkeeping.
533
+ *
534
+ * Called *before* the writing row's own insert/update bookkeeping so the
535
+ * eviction's row-time maintenance and FK cascade land in the substrate's
536
+ * evict-then-write order (a later same-key backing write must not be undone by
537
+ * an earlier-PK eviction's delete).
538
+ */
539
+ async function processEvictions(ctx, needsAutoEvents, tableKey, evictedRows, backingConnCache, deferredRebuilds) {
540
+ if (!evictedRows || evictedRows.length === 0)
541
+ return;
542
+ for (const evicted of evictedRows) {
543
+ // RESTRICT / NO ACTION enforcement for the eviction's would-be delete.
544
+ // The substrate already physically removed the evicted row inside
545
+ // vtab.update(), so there is no pre-mutation point. Run the transitive
546
+ // RESTRICT scan post-eviction (the child rows it keys off remain) and,
547
+ // on a violation, throw — runWithStatementSavepoints rolls back the
548
+ // statement savepoint, unwinding both the eviction and the writing row.
549
+ // Mirrors the pre-check processDeleteRow runs for a plain DELETE.
550
+ //
551
+ // lensRouted = false (the default) on both FK calls: an internal REPLACE
552
+ // eviction is a physical basis effect (a row at another PK the substrate
553
+ // removed to resolve a non-PK UNIQUE conflict), not a write through the
554
+ // lens, so it bears only physical (basis-declared) FK semantics.
555
+ await assertTransitiveRestrictsForParentMutation(ctx.db, tableSchema, 'delete', evicted);
556
+ const evictedKeyValues = pkColumnIndicesInSchema.map(idx => evicted[idx]);
557
+ ctx.db._recordDelete(tableKey, evicted, pkColumnIndicesInSchema);
558
+ await maintainRowTimeStructures(ctx, tableKey, { op: 'delete', oldRow: evicted }, backingConnCache, deferredRebuilds);
559
+ await executeForeignKeyActionsAndLens(ctx.db, tableSchema, 'delete', evicted);
560
+ if (needsAutoEvents) {
561
+ emitAutoDataEvent(ctx, tableSchema, 'delete', evictedKeyValues, [...evicted]);
562
+ }
563
+ }
564
+ }
353
565
  // UPDATE ----------------------------------------------------
354
566
  async function* runUpdate(ctx, rows, ...contextEvaluators) {
355
567
  // Ensure we're in a transaction before any mutations (lazy/JIT transaction start)
356
568
  await ctx.db._ensureTransaction();
357
569
  const vtab = await getVTable(ctx, tableSchema);
358
- const needsAutoEvents = ctx.db.hasDataListeners() && !hasNativeEventSupport(vtab);
359
- // Evaluate mutation context once per statement
360
- let contextRow;
361
- if (contextEvaluators.length > 0) {
362
- contextRow = [];
363
- for (const evaluator of contextEvaluators) {
364
- const value = await evaluator(ctx);
365
- contextRow.push(value);
570
+ const needsAutoEvents = ctx.db._needsDataEvents() && !moduleHasNativeDataEvents(ctx, tableSchema);
571
+ const contextRow = await evaluateContextRow(ctx, contextEvaluators);
572
+ // Per-statement backing-connection cache + deferred full-rebuild set (see runInsert).
573
+ const backingConnCache = new Map();
574
+ const deferredRebuilds = new Set();
575
+ const isFailMode = plan.onConflict === ConflictResolution.FAIL;
576
+ yield* runWithStatementSavepoints(ctx, vtab, rows, isFailMode, (flatRow) => processUpdateRow(ctx, vtab, needsAutoEvents, flatRow, contextRow, backingConnCache, deferredRebuilds), deferredRebuilds, backingConnCache);
577
+ }
578
+ /**
579
+ * Performs a single row's UPDATE side-effects (RESTRICT pre-check +
580
+ * vtab.update + REPLACE eviction + bookkeeping + FK actions + events).
581
+ * Returns the row to yield downstream, or undefined if the row was not
582
+ * updated (row not found). Throws ConstraintError on violations the executor
583
+ * cannot recover from; the caller (runWithStatementSavepoints) translates it
584
+ * for FAIL/ROLLBACK modes.
585
+ */
586
+ async function processUpdateRow(ctx, vtab, needsAutoEvents, flatRow, contextRow, backingConnCache, deferredRebuilds) {
587
+ const oldRow = extractOldRowFromFlat(flatRow, tableSchema.columns.length);
588
+ const newRow = extractNewRowFromFlat(flatRow, tableSchema.columns.length);
589
+ const tableKey = `${tableSchema.schemaName}.${tableSchema.name}`;
590
+ // Extract primary key values from the OLD row (these identify which row to update)
591
+ const keyValues = pkColumnIndicesInSchema.map(pkColIdx => {
592
+ if (pkColIdx >= oldRow.length) {
593
+ throw new QuereusError(`PK column index ${pkColIdx} out of bounds for OLD row length ${oldRow.length} in UPDATE on '${tableSchema.name}'.`, StatusCode.INTERNAL);
366
594
  }
595
+ return oldRow[pkColIdx];
596
+ });
597
+ // Build mutation statement if logging is enabled
598
+ let mutationStatement;
599
+ if (vtab.wantStatements) {
600
+ mutationStatement = buildUpdateStatement(tableSchema, newRow, keyValues, contextRow);
367
601
  }
368
- try {
369
- for await (const flatRow of rows) {
370
- const oldRow = extractOldRowFromFlat(flatRow, tableSchema.columns.length);
371
- const newRow = extractNewRowFromFlat(flatRow, tableSchema.columns.length);
372
- // Extract primary key values from the OLD row (these identify which row to update)
373
- const keyValues = pkColumnIndicesInSchema.map(pkColIdx => {
374
- if (pkColIdx >= oldRow.length) {
375
- throw new QuereusError(`PK column index ${pkColIdx} out of bounds for OLD row length ${oldRow.length} in UPDATE on '${tableSchema.name}'.`, StatusCode.INTERNAL);
376
- }
377
- return oldRow[pkColIdx];
378
- });
379
- // Build mutation statement if logging is enabled
380
- let mutationStatement;
381
- if (vtab.wantStatements) {
382
- mutationStatement = buildUpdateStatement(tableSchema, newRow, keyValues, contextRow);
383
- }
384
- // Defense-in-depth RESTRICT enforcement: the plan-time `NOT EXISTS`
385
- // check is the primary path, but some vtab modules evaluate the
386
- // embedded subquery differently from a plain row scan. Pre-walk
387
- // the transitive cascade closure so RESTRICTs at any depth fire
388
- // BEFORE vtab.update — needed for rowid-mode backends (lamina)
389
- // where post-mutation OLD-value scans dereference through the
390
- // just-mutated parent and find zero rows.
391
- await assertTransitiveRestrictsForParentMutation(ctx.db, tableSchema, 'update', oldRow, newRow);
392
- const args = {
393
- operation: 'update',
394
- values: newRow,
395
- oldKeyValues: keyValues,
396
- // Pass undefined when there's no statement-level OR clause so the vtab
397
- // can fall back to per-constraint defaultConflict directives. The memory
398
- // module treats undefined as ABORT when no constraint default is set.
399
- onConflict: plan.onConflict,
400
- mutationStatement
401
- };
402
- const result = await vtab.update(args);
403
- // Handle constraint violations
404
- if (isConstraintViolation(result)) {
405
- const baseErr = new ConstraintError(result.message ?? `${result.constraint} constraint failed`, StatusCode.CONSTRAINT);
406
- throw translateConflictError(baseErr, plan.onConflict);
407
- }
408
- // Skip if row was not updated (row not found returns ok with no row)
409
- if (!result.row) {
410
- continue;
411
- }
412
- // If the UPDATE moved this row onto an occupied PK under REPLACE,
413
- // the vtab returns the displaced row. Surface its deletion BEFORE
414
- // the move bookkeeping so change tracking, FK cascade, and auto-events
415
- // see the same evict-then-move sequence the vtab journals (manager.ts
416
- // records delete(newPk, evicted) before the move). Running the
417
- // eviction's FK cascade first also avoids ON UPDATE CASCADE pulling
418
- // children onto PK_new and then having an unrelated ON DELETE CASCADE
419
- // for the evicted row wipe them out.
420
- if (result.replacedRow) {
421
- const evictedKeyValues = pkColumnIndicesInSchema.map(idx => result.replacedRow[idx]);
422
- ctx.db._recordDelete(`${tableSchema.schemaName}.${tableSchema.name}`, result.replacedRow, pkColumnIndicesInSchema);
423
- await executeForeignKeyActions(ctx.db, tableSchema, 'delete', result.replacedRow);
424
- if (needsAutoEvents) {
425
- emitAutoDataEvent(ctx, tableSchema, 'delete', evictedKeyValues, [...result.replacedRow]);
426
- }
427
- }
428
- // Track change (UPDATE): pass full rows so the change capture can
429
- // project the columns any active subscription cares about.
430
- ctx.db._recordUpdate(`${tableSchema.schemaName}.${tableSchema.name}`, oldRow, newRow, pkColumnIndicesInSchema);
431
- // Execute FK cascading actions (CASCADE, SET NULL, SET DEFAULT)
432
- await executeForeignKeyActions(ctx.db, tableSchema, 'update', oldRow, newRow);
433
- // Emit auto event for modules without native event support
434
- if (needsAutoEvents) {
435
- // Compute changed columns
436
- const changedColumns = [];
437
- for (let i = 0; i < tableSchema.columns.length; i++) {
438
- const oldVal = oldRow[i];
439
- const newVal = newRow[i];
440
- if (!sqlValuesEqual(oldVal, newVal)) {
441
- changedColumns.push(tableSchema.columns[i].name);
442
- }
443
- }
444
- emitAutoDataEvent(ctx, tableSchema, 'update', keyValues, [...oldRow], [...newRow], changedColumns);
445
- }
446
- yield flatRow;
602
+ // Defense-in-depth RESTRICT enforcement: the plan-time `NOT EXISTS`
603
+ // check is the primary path, but some vtab modules evaluate the
604
+ // embedded subquery differently from a plain row scan. Pre-walk
605
+ // the transitive cascade closure so RESTRICTs at any depth fire
606
+ // BEFORE vtab.update needed for rowid-mode backends (lamina)
607
+ // where post-mutation OLD-value scans dereference through the
608
+ // just-mutated parent and find zero rows.
609
+ await assertTransitiveRestrictsForParentMutation(ctx.db, tableSchema, 'update', oldRow, newRow, plan.lensRouted);
610
+ const args = {
611
+ operation: 'update',
612
+ values: newRow,
613
+ oldKeyValues: keyValues,
614
+ // Pass undefined when there's no statement-level OR clause so the vtab
615
+ // can fall back to per-constraint defaultConflict directives. The memory
616
+ // module treats undefined as ABORT when no constraint default is set.
617
+ onConflict: plan.onConflict,
618
+ mutationStatement
619
+ };
620
+ const result = await vtab.update(args);
621
+ // Handle constraint violations caller translates for FAIL/ROLLBACK.
622
+ if (isConstraintViolation(result)) {
623
+ throw new ConstraintError(result.message ?? `${result.constraint} constraint failed`, StatusCode.CONSTRAINT);
624
+ }
625
+ // Skip if row was not updated (row not found returns ok with no row)
626
+ if (!result.row) {
627
+ return undefined;
628
+ }
629
+ // If the UPDATE moved this row onto an occupied PK under REPLACE,
630
+ // the vtab returns the displaced row. Surface its deletion BEFORE
631
+ // the move bookkeeping so change tracking, FK cascade, and auto-events
632
+ // see the same evict-then-move sequence the vtab journals (manager.ts
633
+ // records delete(newPk, evicted) before the move). Running the
634
+ // eviction's FK cascade first also avoids ON UPDATE CASCADE pulling
635
+ // children onto PK_new and then having an unrelated ON DELETE CASCADE
636
+ // for the evicted row wipe them out.
637
+ if (result.replacedRow) {
638
+ const evictedKeyValues = pkColumnIndicesInSchema.map(idx => result.replacedRow[idx]);
639
+ ctx.db._recordDelete(tableKey, result.replacedRow, pkColumnIndicesInSchema);
640
+ await maintainRowTimeStructures(ctx, tableKey, { op: 'delete', oldRow: result.replacedRow }, backingConnCache, deferredRebuilds);
641
+ await executeForeignKeyActionsAndLens(ctx.db, tableSchema, 'delete', result.replacedRow, undefined, plan.lensRouted);
642
+ if (needsAutoEvents) {
643
+ emitAutoDataEvent(ctx, tableSchema, 'delete', evictedKeyValues, [...result.replacedRow]);
447
644
  }
448
645
  }
449
- finally {
450
- await disconnectVTable(ctx, vtab);
646
+ // Internal REPLACE evictions (rows at OTHER PKs removed to resolve a non-PK
647
+ // UNIQUE conflict for this same update) run the full delete pipeline here,
648
+ // after any same-PK replacedRow handling and before the moved row's own
649
+ // bookkeeping — evict-then-write, matching the substrate journal order.
650
+ await processEvictions(ctx, needsAutoEvents, tableKey, result.evictedRows, backingConnCache, deferredRebuilds);
651
+ // Track change (UPDATE): pass full rows so the change capture can
652
+ // project the columns any active subscription cares about.
653
+ ctx.db._recordUpdate(tableKey, oldRow, newRow, pkColumnIndicesInSchema);
654
+ await maintainRowTimeStructures(ctx, tableKey, { op: 'update', oldRow, newRow }, backingConnCache, deferredRebuilds);
655
+ // Execute FK cascading actions (CASCADE, SET NULL, SET DEFAULT)
656
+ await executeForeignKeyActionsAndLens(ctx.db, tableSchema, 'update', oldRow, newRow, plan.lensRouted);
657
+ // Emit auto event for modules without native event support
658
+ if (needsAutoEvents) {
659
+ // Compute changed columns
660
+ const changedColumns = [];
661
+ for (let i = 0; i < tableSchema.columns.length; i++) {
662
+ const oldVal = oldRow[i];
663
+ const newVal = newRow[i];
664
+ if (!sqlValuesEqual(oldVal, newVal)) {
665
+ changedColumns.push(tableSchema.columns[i].name);
666
+ }
667
+ }
668
+ emitAutoDataEvent(ctx, tableSchema, 'update', keyValues, [...oldRow], [...newRow], changedColumns);
451
669
  }
670
+ return flatRow;
452
671
  }
453
672
  // DELETE ----------------------------------------------------
454
673
  async function* runDelete(ctx, rows, ...contextEvaluators) {
455
674
  // Ensure we're in a transaction before any mutations (lazy/JIT transaction start)
456
675
  await ctx.db._ensureTransaction();
457
676
  const vtab = await getVTable(ctx, tableSchema);
458
- const needsAutoEvents = ctx.db.hasDataListeners() && !hasNativeEventSupport(vtab);
459
- // Evaluate mutation context once per statement
460
- let contextRow;
461
- if (contextEvaluators.length > 0) {
462
- contextRow = [];
463
- for (const evaluator of contextEvaluators) {
464
- const value = await evaluator(ctx);
465
- contextRow.push(value);
677
+ const needsAutoEvents = ctx.db._needsDataEvents() && !moduleHasNativeDataEvents(ctx, tableSchema);
678
+ const contextRow = await evaluateContextRow(ctx, contextEvaluators);
679
+ // Per-statement backing-connection cache + deferred full-rebuild set (see runInsert).
680
+ const backingConnCache = new Map();
681
+ const deferredRebuilds = new Set();
682
+ const isFailMode = plan.onConflict === ConflictResolution.FAIL;
683
+ yield* runWithStatementSavepoints(ctx, vtab, rows, isFailMode, (flatRow) => processDeleteRow(ctx, vtab, needsAutoEvents, flatRow, contextRow, backingConnCache, deferredRebuilds), deferredRebuilds, backingConnCache);
684
+ }
685
+ /**
686
+ * Performs a single row's DELETE side-effects (RESTRICT pre-check +
687
+ * vtab.update + bookkeeping + FK actions + events). Returns the row to yield
688
+ * downstream, or undefined if the row was not deleted (row not found).
689
+ * Throws ConstraintError / RESTRICT errors; the caller
690
+ * (runWithStatementSavepoints) translates constraint violations for
691
+ * FAIL/ROLLBACK modes.
692
+ */
693
+ async function processDeleteRow(ctx, vtab, needsAutoEvents, flatRow, contextRow, backingConnCache, deferredRebuilds) {
694
+ const oldRow = extractOldRowFromFlat(flatRow, tableSchema.columns.length);
695
+ const tableKey = `${tableSchema.schemaName}.${tableSchema.name}`;
696
+ const keyValues = pkColumnIndicesInSchema.map(pkColIdx => {
697
+ if (pkColIdx >= oldRow.length) {
698
+ throw new QuereusError(`PK column index ${pkColIdx} out of bounds for OLD row length ${oldRow.length} in DELETE on '${tableSchema.name}'.`, StatusCode.INTERNAL);
466
699
  }
700
+ return oldRow[pkColIdx];
701
+ });
702
+ // Build mutation statement if logging is enabled
703
+ let mutationStatement;
704
+ if (vtab.wantStatements) {
705
+ mutationStatement = buildDeleteStatement(tableSchema, keyValues, contextRow);
467
706
  }
468
- try {
469
- for await (const flatRow of rows) {
470
- const oldRow = extractOldRowFromFlat(flatRow, tableSchema.columns.length);
471
- const keyValues = pkColumnIndicesInSchema.map(pkColIdx => {
472
- if (pkColIdx >= oldRow.length) {
473
- throw new QuereusError(`PK column index ${pkColIdx} out of bounds for OLD row length ${oldRow.length} in DELETE on '${tableSchema.name}'.`, StatusCode.INTERNAL);
474
- }
475
- return oldRow[pkColIdx];
476
- });
477
- // Build mutation statement if logging is enabled
478
- let mutationStatement;
479
- if (vtab.wantStatements) {
480
- mutationStatement = buildDeleteStatement(tableSchema, keyValues, contextRow);
481
- }
482
- // Defense-in-depth RESTRICT enforcement — see comment on the UPDATE
483
- // path above.
484
- await assertTransitiveRestrictsForParentMutation(ctx.db, tableSchema, 'delete', oldRow);
485
- const args = {
486
- operation: 'delete',
487
- values: undefined,
488
- oldKeyValues: keyValues,
489
- onConflict: plan.onConflict ?? ConflictResolution.ABORT,
490
- mutationStatement
491
- };
492
- const result = await vtab.update(args);
493
- // Handle constraint violations (unlikely for DELETE, but be consistent)
494
- if (isConstraintViolation(result)) {
495
- const baseErr = new ConstraintError(result.message ?? `${result.constraint} constraint failed`, StatusCode.CONSTRAINT);
496
- throw translateConflictError(baseErr, plan.onConflict);
497
- }
498
- // Skip if row was not deleted (row not found returns ok with no row)
499
- if (!result.row) {
500
- continue;
501
- }
502
- // Track change (DELETE): record OLD row + PK indices so capture
503
- // can project the columns subscribers care about.
504
- ctx.db._recordDelete(`${tableSchema.schemaName}.${tableSchema.name}`, oldRow, pkColumnIndicesInSchema);
505
- // Execute FK cascading actions (CASCADE, SET NULL, SET DEFAULT)
506
- await executeForeignKeyActions(ctx.db, tableSchema, 'delete', oldRow);
507
- // Emit auto event for modules without native event support
508
- if (needsAutoEvents) {
509
- emitAutoDataEvent(ctx, tableSchema, 'delete', keyValues, [...oldRow]);
510
- }
511
- yield flatRow;
512
- }
707
+ // Defense-in-depth RESTRICT enforcement — see comment on the UPDATE
708
+ // path above.
709
+ await assertTransitiveRestrictsForParentMutation(ctx.db, tableSchema, 'delete', oldRow, undefined, plan.lensRouted);
710
+ const args = {
711
+ operation: 'delete',
712
+ values: undefined,
713
+ oldKeyValues: keyValues,
714
+ onConflict: plan.onConflict ?? ConflictResolution.ABORT,
715
+ mutationStatement
716
+ };
717
+ const result = await vtab.update(args);
718
+ // Handle constraint violations (unlikely for DELETE, but be consistent).
719
+ if (isConstraintViolation(result)) {
720
+ throw new ConstraintError(result.message ?? `${result.constraint} constraint failed`, StatusCode.CONSTRAINT);
513
721
  }
514
- finally {
515
- await disconnectVTable(ctx, vtab);
722
+ // Skip if row was not deleted (row not found returns ok with no row)
723
+ if (!result.row) {
724
+ return undefined;
516
725
  }
726
+ // Track change (DELETE): record OLD row + PK indices so capture
727
+ // can project the columns subscribers care about.
728
+ ctx.db._recordDelete(tableKey, oldRow, pkColumnIndicesInSchema);
729
+ await maintainRowTimeStructures(ctx, tableKey, { op: 'delete', oldRow }, backingConnCache, deferredRebuilds);
730
+ // Execute FK cascading actions (CASCADE, SET NULL, SET DEFAULT)
731
+ await executeForeignKeyActionsAndLens(ctx.db, tableSchema, 'delete', oldRow, undefined, plan.lensRouted);
732
+ // Emit auto event for modules without native event support
733
+ if (needsAutoEvents) {
734
+ emitAutoDataEvent(ctx, tableSchema, 'delete', keyValues, [...oldRow]);
735
+ }
736
+ return flatRow;
517
737
  }
518
738
  // Select the correct generator based on operation
519
739
  let run;