@quereus/quereus 4.6.0 → 4.8.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 (584) hide show
  1. package/README.md +2 -2
  2. package/dist/src/common/errors.d.ts +17 -0
  3. package/dist/src/common/errors.d.ts.map +1 -1
  4. package/dist/src/common/errors.js +21 -0
  5. package/dist/src/common/errors.js.map +1 -1
  6. package/dist/src/common/types.d.ts +19 -0
  7. package/dist/src/common/types.d.ts.map +1 -1
  8. package/dist/src/common/types.js.map +1 -1
  9. package/dist/src/core/database-assertions.d.ts +4 -3
  10. package/dist/src/core/database-assertions.d.ts.map +1 -1
  11. package/dist/src/core/database-assertions.js +44 -14
  12. package/dist/src/core/database-assertions.js.map +1 -1
  13. package/dist/src/core/database-events.d.ts +62 -0
  14. package/dist/src/core/database-events.d.ts.map +1 -1
  15. package/dist/src/core/database-events.js +88 -2
  16. package/dist/src/core/database-events.js.map +1 -1
  17. package/dist/src/core/database-internal.d.ts +5 -2
  18. package/dist/src/core/database-internal.d.ts.map +1 -1
  19. package/dist/src/core/database-materialized-views-plan-builders.d.ts.map +1 -1
  20. package/dist/src/core/database-materialized-views-plan-builders.js +4 -2
  21. package/dist/src/core/database-materialized-views-plan-builders.js.map +1 -1
  22. package/dist/src/core/database-materialized-views-plans.d.ts +12 -2
  23. package/dist/src/core/database-materialized-views-plans.d.ts.map +1 -1
  24. package/dist/src/core/database-materialized-views.d.ts +46 -0
  25. package/dist/src/core/database-materialized-views.d.ts.map +1 -1
  26. package/dist/src/core/database-materialized-views.js +75 -4
  27. package/dist/src/core/database-materialized-views.js.map +1 -1
  28. package/dist/src/core/database.d.ts +48 -2
  29. package/dist/src/core/database.d.ts.map +1 -1
  30. package/dist/src/core/database.js +222 -11
  31. package/dist/src/core/database.js.map +1 -1
  32. package/dist/src/core/derived-row-validator.d.ts.map +1 -1
  33. package/dist/src/core/derived-row-validator.js +7 -1
  34. package/dist/src/core/derived-row-validator.js.map +1 -1
  35. package/dist/src/core/statement.d.ts.map +1 -1
  36. package/dist/src/core/statement.js +101 -5
  37. package/dist/src/core/statement.js.map +1 -1
  38. package/dist/src/emit/ast-stringify.d.ts +18 -2
  39. package/dist/src/emit/ast-stringify.d.ts.map +1 -1
  40. package/dist/src/emit/ast-stringify.js +22 -4
  41. package/dist/src/emit/ast-stringify.js.map +1 -1
  42. package/dist/src/func/builtins/explain.d.ts.map +1 -1
  43. package/dist/src/func/builtins/explain.js +19 -5
  44. package/dist/src/func/builtins/explain.js.map +1 -1
  45. package/dist/src/func/builtins/scalar.d.ts.map +1 -1
  46. package/dist/src/func/builtins/scalar.js +24 -20
  47. package/dist/src/func/builtins/scalar.js.map +1 -1
  48. package/dist/src/func/builtins/schema.d.ts.map +1 -1
  49. package/dist/src/func/builtins/schema.js +32 -5
  50. package/dist/src/func/builtins/schema.js.map +1 -1
  51. package/dist/src/index.d.ts +9 -5
  52. package/dist/src/index.d.ts.map +1 -1
  53. package/dist/src/index.js +7 -5
  54. package/dist/src/index.js.map +1 -1
  55. package/dist/src/parser/ast.d.ts +58 -1
  56. package/dist/src/parser/ast.d.ts.map +1 -1
  57. package/dist/src/parser/parser.js +1 -1
  58. package/dist/src/parser/parser.js.map +1 -1
  59. package/dist/src/parser/utils.d.ts +13 -1
  60. package/dist/src/parser/utils.d.ts.map +1 -1
  61. package/dist/src/parser/utils.js +14 -0
  62. package/dist/src/parser/utils.js.map +1 -1
  63. package/dist/src/planner/analysis/assertion-classifier.d.ts.map +1 -1
  64. package/dist/src/planner/analysis/assertion-classifier.js +7 -2
  65. package/dist/src/planner/analysis/assertion-classifier.js.map +1 -1
  66. package/dist/src/planner/analysis/assertion-hoist-cache.d.ts.map +1 -1
  67. package/dist/src/planner/analysis/assertion-hoist-cache.js +5 -0
  68. package/dist/src/planner/analysis/assertion-hoist-cache.js.map +1 -1
  69. package/dist/src/planner/analysis/change-scope.d.ts +11 -3
  70. package/dist/src/planner/analysis/change-scope.d.ts.map +1 -1
  71. package/dist/src/planner/analysis/change-scope.js +5 -4
  72. package/dist/src/planner/analysis/change-scope.js.map +1 -1
  73. package/dist/src/planner/analysis/coverage-prover.d.ts.map +1 -1
  74. package/dist/src/planner/analysis/coverage-prover.js +13 -5
  75. package/dist/src/planner/analysis/coverage-prover.js.map +1 -1
  76. package/dist/src/planner/analysis/equi-correlation.d.ts +6 -1
  77. package/dist/src/planner/analysis/equi-correlation.d.ts.map +1 -1
  78. package/dist/src/planner/analysis/equi-correlation.js +8 -1
  79. package/dist/src/planner/analysis/equi-correlation.js.map +1 -1
  80. package/dist/src/planner/analysis/predicate-dependencies.d.ts +34 -0
  81. package/dist/src/planner/analysis/predicate-dependencies.d.ts.map +1 -0
  82. package/dist/src/planner/analysis/predicate-dependencies.js +60 -0
  83. package/dist/src/planner/analysis/predicate-dependencies.js.map +1 -0
  84. package/dist/src/planner/analysis/query-rewrite-matcher.d.ts +1 -1
  85. package/dist/src/planner/analysis/query-rewrite-matcher.d.ts.map +1 -1
  86. package/dist/src/planner/analysis/query-rewrite-matcher.js +0 -26
  87. package/dist/src/planner/analysis/query-rewrite-matcher.js.map +1 -1
  88. package/dist/src/planner/building/alter-table.d.ts.map +1 -1
  89. package/dist/src/planner/building/alter-table.js +53 -17
  90. package/dist/src/planner/building/alter-table.js.map +1 -1
  91. package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
  92. package/dist/src/planner/building/constraint-builder.js +9 -5
  93. package/dist/src/planner/building/constraint-builder.js.map +1 -1
  94. package/dist/src/planner/building/create-assertion.d.ts.map +1 -1
  95. package/dist/src/planner/building/create-assertion.js +72 -1
  96. package/dist/src/planner/building/create-assertion.js.map +1 -1
  97. package/dist/src/planner/building/create-view.d.ts +6 -1
  98. package/dist/src/planner/building/create-view.d.ts.map +1 -1
  99. package/dist/src/planner/building/create-view.js +12 -3
  100. package/dist/src/planner/building/create-view.js.map +1 -1
  101. package/dist/src/planner/building/ddl.d.ts.map +1 -1
  102. package/dist/src/planner/building/ddl.js +6 -2
  103. package/dist/src/planner/building/ddl.js.map +1 -1
  104. package/dist/src/planner/building/delete.d.ts.map +1 -1
  105. package/dist/src/planner/building/delete.js +23 -10
  106. package/dist/src/planner/building/delete.js.map +1 -1
  107. package/dist/src/planner/building/dml-target.d.ts.map +1 -1
  108. package/dist/src/planner/building/dml-target.js +4 -0
  109. package/dist/src/planner/building/dml-target.js.map +1 -1
  110. package/dist/src/planner/building/drop-assertion.d.ts.map +1 -1
  111. package/dist/src/planner/building/drop-assertion.js +3 -1
  112. package/dist/src/planner/building/drop-assertion.js.map +1 -1
  113. package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
  114. package/dist/src/planner/building/foreign-key-builder.js +7 -5
  115. package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
  116. package/dist/src/planner/building/function-call.d.ts +35 -0
  117. package/dist/src/planner/building/function-call.d.ts.map +1 -1
  118. package/dist/src/planner/building/function-call.js +53 -40
  119. package/dist/src/planner/building/function-call.js.map +1 -1
  120. package/dist/src/planner/building/insert.d.ts.map +1 -1
  121. package/dist/src/planner/building/insert.js +185 -48
  122. package/dist/src/planner/building/insert.js.map +1 -1
  123. package/dist/src/planner/building/materialized-view.d.ts.map +1 -1
  124. package/dist/src/planner/building/materialized-view.js +3 -1
  125. package/dist/src/planner/building/materialized-view.js.map +1 -1
  126. package/dist/src/planner/building/schema-authored-context.d.ts +69 -0
  127. package/dist/src/planner/building/schema-authored-context.d.ts.map +1 -0
  128. package/dist/src/planner/building/schema-authored-context.js +75 -0
  129. package/dist/src/planner/building/schema-authored-context.js.map +1 -0
  130. package/dist/src/planner/building/schema-resolution.d.ts.map +1 -1
  131. package/dist/src/planner/building/schema-resolution.js +7 -4
  132. package/dist/src/planner/building/schema-resolution.js.map +1 -1
  133. package/dist/src/planner/building/select-aggregates.d.ts +187 -2
  134. package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
  135. package/dist/src/planner/building/select-aggregates.js +414 -81
  136. package/dist/src/planner/building/select-aggregates.js.map +1 -1
  137. package/dist/src/planner/building/select-compound.js +2 -2
  138. package/dist/src/planner/building/select-compound.js.map +1 -1
  139. package/dist/src/planner/building/select-context.d.ts +91 -0
  140. package/dist/src/planner/building/select-context.d.ts.map +1 -1
  141. package/dist/src/planner/building/select-context.js +113 -0
  142. package/dist/src/planner/building/select-context.js.map +1 -1
  143. package/dist/src/planner/building/select-modifiers.d.ts +10 -3
  144. package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
  145. package/dist/src/planner/building/select-modifiers.js +29 -8
  146. package/dist/src/planner/building/select-modifiers.js.map +1 -1
  147. package/dist/src/planner/building/select-ordinal.d.ts +64 -19
  148. package/dist/src/planner/building/select-ordinal.d.ts.map +1 -1
  149. package/dist/src/planner/building/select-ordinal.js +79 -30
  150. package/dist/src/planner/building/select-ordinal.js.map +1 -1
  151. package/dist/src/planner/building/select-projections.d.ts +1 -1
  152. package/dist/src/planner/building/select-projections.d.ts.map +1 -1
  153. package/dist/src/planner/building/select-projections.js +18 -11
  154. package/dist/src/planner/building/select-projections.js.map +1 -1
  155. package/dist/src/planner/building/select-window.d.ts +13 -3
  156. package/dist/src/planner/building/select-window.d.ts.map +1 -1
  157. package/dist/src/planner/building/select-window.js +142 -37
  158. package/dist/src/planner/building/select-window.js.map +1 -1
  159. package/dist/src/planner/building/select.d.ts.map +1 -1
  160. package/dist/src/planner/building/select.js +129 -59
  161. package/dist/src/planner/building/select.js.map +1 -1
  162. package/dist/src/planner/building/update.d.ts.map +1 -1
  163. package/dist/src/planner/building/update.js +27 -13
  164. package/dist/src/planner/building/update.js.map +1 -1
  165. package/dist/src/planner/building/view-mutation-builder.d.ts +1 -1
  166. package/dist/src/planner/building/view-mutation-builder.d.ts.map +1 -1
  167. package/dist/src/planner/building/view-mutation-builder.js +102 -8
  168. package/dist/src/planner/building/view-mutation-builder.js.map +1 -1
  169. package/dist/src/planner/building/with.d.ts.map +1 -1
  170. package/dist/src/planner/building/with.js +34 -4
  171. package/dist/src/planner/building/with.js.map +1 -1
  172. package/dist/src/planner/cache/correlation-detector.d.ts +15 -0
  173. package/dist/src/planner/cache/correlation-detector.d.ts.map +1 -1
  174. package/dist/src/planner/cache/correlation-detector.js +26 -0
  175. package/dist/src/planner/cache/correlation-detector.js.map +1 -1
  176. package/dist/src/planner/cache/materialization-advisory.d.ts +7 -0
  177. package/dist/src/planner/cache/materialization-advisory.d.ts.map +1 -1
  178. package/dist/src/planner/cache/materialization-advisory.js +12 -3
  179. package/dist/src/planner/cache/materialization-advisory.js.map +1 -1
  180. package/dist/src/planner/framework/characteristics.d.ts +9 -0
  181. package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
  182. package/dist/src/planner/framework/characteristics.js.map +1 -1
  183. package/dist/src/planner/framework/pass.d.ts +2 -0
  184. package/dist/src/planner/framework/pass.d.ts.map +1 -1
  185. package/dist/src/planner/framework/pass.js +15 -0
  186. package/dist/src/planner/framework/pass.js.map +1 -1
  187. package/dist/src/planner/mutation/backward-body.d.ts.map +1 -1
  188. package/dist/src/planner/mutation/backward-body.js +4 -1
  189. package/dist/src/planner/mutation/backward-body.js.map +1 -1
  190. package/dist/src/planner/mutation/body-context.d.ts +23 -0
  191. package/dist/src/planner/mutation/body-context.d.ts.map +1 -0
  192. package/dist/src/planner/mutation/body-context.js +26 -0
  193. package/dist/src/planner/mutation/body-context.js.map +1 -0
  194. package/dist/src/planner/mutation/cte-flatten.js +15 -2
  195. package/dist/src/planner/mutation/cte-flatten.js.map +1 -1
  196. package/dist/src/planner/mutation/decomposition.d.ts +8 -0
  197. package/dist/src/planner/mutation/decomposition.d.ts.map +1 -1
  198. package/dist/src/planner/mutation/decomposition.js +8 -3
  199. package/dist/src/planner/mutation/decomposition.js.map +1 -1
  200. package/dist/src/planner/mutation/lens-enforcement.js +1 -1
  201. package/dist/src/planner/mutation/multi-source.d.ts +7 -0
  202. package/dist/src/planner/mutation/multi-source.d.ts.map +1 -1
  203. package/dist/src/planner/mutation/multi-source.js +5 -0
  204. package/dist/src/planner/mutation/multi-source.js.map +1 -1
  205. package/dist/src/planner/mutation/mutation-diagnostic.d.ts +1 -1
  206. package/dist/src/planner/mutation/mutation-diagnostic.d.ts.map +1 -1
  207. package/dist/src/planner/mutation/mutation-diagnostic.js.map +1 -1
  208. package/dist/src/planner/mutation/scope-transform.d.ts +32 -0
  209. package/dist/src/planner/mutation/scope-transform.d.ts.map +1 -1
  210. package/dist/src/planner/mutation/scope-transform.js +181 -33
  211. package/dist/src/planner/mutation/scope-transform.js.map +1 -1
  212. package/dist/src/planner/mutation/set-op.d.ts.map +1 -1
  213. package/dist/src/planner/mutation/set-op.js +66 -16
  214. package/dist/src/planner/mutation/set-op.js.map +1 -1
  215. package/dist/src/planner/mutation/single-source.d.ts.map +1 -1
  216. package/dist/src/planner/mutation/single-source.js +100 -24
  217. package/dist/src/planner/mutation/single-source.js.map +1 -1
  218. package/dist/src/planner/nodes/add-constraint-node.d.ts +15 -1
  219. package/dist/src/planner/nodes/add-constraint-node.d.ts.map +1 -1
  220. package/dist/src/planner/nodes/add-constraint-node.js +10 -1
  221. package/dist/src/planner/nodes/add-constraint-node.js.map +1 -1
  222. package/dist/src/planner/nodes/aggregate-node.d.ts +14 -5
  223. package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
  224. package/dist/src/planner/nodes/aggregate-node.js +28 -21
  225. package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
  226. package/dist/src/planner/nodes/alter-table-node.d.ts +27 -2
  227. package/dist/src/planner/nodes/alter-table-node.d.ts.map +1 -1
  228. package/dist/src/planner/nodes/alter-table-node.js +49 -2
  229. package/dist/src/planner/nodes/alter-table-node.js.map +1 -1
  230. package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
  231. package/dist/src/planner/nodes/constraint-check-node.js +17 -19
  232. package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
  233. package/dist/src/planner/nodes/create-assertion-node.d.ts +2 -1
  234. package/dist/src/planner/nodes/create-assertion-node.d.ts.map +1 -1
  235. package/dist/src/planner/nodes/create-assertion-node.js +5 -2
  236. package/dist/src/planner/nodes/create-assertion-node.js.map +1 -1
  237. package/dist/src/planner/nodes/cte-node.d.ts +19 -9
  238. package/dist/src/planner/nodes/cte-node.d.ts.map +1 -1
  239. package/dist/src/planner/nodes/cte-node.js +25 -9
  240. package/dist/src/planner/nodes/cte-node.js.map +1 -1
  241. package/dist/src/planner/nodes/delete-node.d.ts +20 -2
  242. package/dist/src/planner/nodes/delete-node.d.ts.map +1 -1
  243. package/dist/src/planner/nodes/delete-node.js +11 -2
  244. package/dist/src/planner/nodes/delete-node.js.map +1 -1
  245. package/dist/src/planner/nodes/dml-executor-node.d.ts +58 -1
  246. package/dist/src/planner/nodes/dml-executor-node.d.ts.map +1 -1
  247. package/dist/src/planner/nodes/dml-executor-node.js +107 -15
  248. package/dist/src/planner/nodes/dml-executor-node.js.map +1 -1
  249. package/dist/src/planner/nodes/drop-assertion-node.d.ts +2 -1
  250. package/dist/src/planner/nodes/drop-assertion-node.d.ts.map +1 -1
  251. package/dist/src/planner/nodes/drop-assertion-node.js +5 -2
  252. package/dist/src/planner/nodes/drop-assertion-node.js.map +1 -1
  253. package/dist/src/planner/nodes/filter.d.ts.map +1 -1
  254. package/dist/src/planner/nodes/filter.js +12 -6
  255. package/dist/src/planner/nodes/filter.js.map +1 -1
  256. package/dist/src/planner/nodes/hash-aggregate.d.ts +0 -5
  257. package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
  258. package/dist/src/planner/nodes/hash-aggregate.js +17 -20
  259. package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
  260. package/dist/src/planner/nodes/insert-node.d.ts +19 -2
  261. package/dist/src/planner/nodes/insert-node.d.ts.map +1 -1
  262. package/dist/src/planner/nodes/insert-node.js +10 -2
  263. package/dist/src/planner/nodes/insert-node.js.map +1 -1
  264. package/dist/src/planner/nodes/key-set-semi-join-node.d.ts +42 -10
  265. package/dist/src/planner/nodes/key-set-semi-join-node.d.ts.map +1 -1
  266. package/dist/src/planner/nodes/key-set-semi-join-node.js +85 -16
  267. package/dist/src/planner/nodes/key-set-semi-join-node.js.map +1 -1
  268. package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts +5 -0
  269. package/dist/src/planner/nodes/lens-auxiliary-access-node.d.ts.map +1 -1
  270. package/dist/src/planner/nodes/lens-auxiliary-access-node.js.map +1 -1
  271. package/dist/src/planner/nodes/plan-node.d.ts +5 -0
  272. package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
  273. package/dist/src/planner/nodes/plan-node.js +12 -0
  274. package/dist/src/planner/nodes/plan-node.js.map +1 -1
  275. package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
  276. package/dist/src/planner/nodes/project-node.js +16 -35
  277. package/dist/src/planner/nodes/project-node.js.map +1 -1
  278. package/dist/src/planner/nodes/retrieve-node.d.ts +16 -2
  279. package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -1
  280. package/dist/src/planner/nodes/retrieve-node.js +8 -1
  281. package/dist/src/planner/nodes/retrieve-node.js.map +1 -1
  282. package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
  283. package/dist/src/planner/nodes/returning-node.js +13 -32
  284. package/dist/src/planner/nodes/returning-node.js.map +1 -1
  285. package/dist/src/planner/nodes/stream-aggregate.d.ts +0 -5
  286. package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
  287. package/dist/src/planner/nodes/stream-aggregate.js +18 -24
  288. package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
  289. package/dist/src/planner/nodes/table-access-nodes.d.ts +89 -1
  290. package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
  291. package/dist/src/planner/nodes/table-access-nodes.js +64 -2
  292. package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
  293. package/dist/src/planner/nodes/update-node.d.ts +19 -2
  294. package/dist/src/planner/nodes/update-node.d.ts.map +1 -1
  295. package/dist/src/planner/nodes/update-node.js +10 -2
  296. package/dist/src/planner/nodes/update-node.js.map +1 -1
  297. package/dist/src/planner/optimizer.d.ts +18 -0
  298. package/dist/src/planner/optimizer.d.ts.map +1 -1
  299. package/dist/src/planner/optimizer.js +59 -10
  300. package/dist/src/planner/optimizer.js.map +1 -1
  301. package/dist/src/planner/planning-context.d.ts +24 -0
  302. package/dist/src/planner/planning-context.d.ts.map +1 -1
  303. package/dist/src/planner/planning-context.js.map +1 -1
  304. package/dist/src/planner/rules/access/rule-key-set-seek.d.ts +78 -20
  305. package/dist/src/planner/rules/access/rule-key-set-seek.d.ts.map +1 -1
  306. package/dist/src/planner/rules/access/rule-key-set-seek.js +297 -71
  307. package/dist/src/planner/rules/access/rule-key-set-seek.js.map +1 -1
  308. package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts.map +1 -1
  309. package/dist/src/planner/rules/access/rule-monotonic-range-access.js +2 -2
  310. package/dist/src/planner/rules/access/rule-monotonic-range-access.js.map +1 -1
  311. package/dist/src/planner/rules/access/rule-select-access-path.d.ts +11 -1
  312. package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
  313. package/dist/src/planner/rules/access/rule-select-access-path.js +46 -2
  314. package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
  315. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts +7 -4
  316. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts.map +1 -1
  317. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js +39 -5
  318. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js.map +1 -1
  319. package/dist/src/planner/rules/cache/rule-cte-optimization.d.ts.map +1 -1
  320. package/dist/src/planner/rules/cache/rule-cte-optimization.js +6 -2
  321. package/dist/src/planner/rules/cache/rule-cte-optimization.js.map +1 -1
  322. package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js +10 -3
  323. package/dist/src/planner/rules/cache/rule-materialized-view-rewrite.js.map +1 -1
  324. package/dist/src/planner/rules/join/index-nested-loop.d.ts.map +1 -1
  325. package/dist/src/planner/rules/join/index-nested-loop.js +13 -7
  326. package/dist/src/planner/rules/join/index-nested-loop.js.map +1 -1
  327. package/dist/src/planner/rules/join/rule-fanout-lookup-join.d.ts +4 -0
  328. package/dist/src/planner/rules/join/rule-fanout-lookup-join.d.ts.map +1 -1
  329. package/dist/src/planner/rules/join/rule-fanout-lookup-join.js +50 -15
  330. package/dist/src/planner/rules/join/rule-fanout-lookup-join.js.map +1 -1
  331. package/dist/src/planner/rules/join/rule-join-elimination.d.ts +6 -0
  332. package/dist/src/planner/rules/join/rule-join-elimination.d.ts.map +1 -1
  333. package/dist/src/planner/rules/join/rule-join-elimination.js +25 -9
  334. package/dist/src/planner/rules/join/rule-join-elimination.js.map +1 -1
  335. package/dist/src/planner/rules/join/rule-join-key-inference.d.ts +7 -0
  336. package/dist/src/planner/rules/join/rule-join-key-inference.d.ts.map +1 -1
  337. package/dist/src/planner/rules/join/rule-join-key-inference.js +23 -11
  338. package/dist/src/planner/rules/join/rule-join-key-inference.js.map +1 -1
  339. package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts +2 -2
  340. package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
  341. package/dist/src/planner/rules/join/rule-join-physical-selection.js +46 -16
  342. package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
  343. package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts +2 -0
  344. package/dist/src/planner/rules/join/rule-monotonic-merge-join.d.ts.map +1 -1
  345. package/dist/src/planner/rules/join/rule-monotonic-merge-join.js +14 -0
  346. package/dist/src/planner/rules/join/rule-monotonic-merge-join.js.map +1 -1
  347. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts +2 -2
  348. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts.map +1 -1
  349. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js +19 -22
  350. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js.map +1 -1
  351. package/dist/src/planner/rules/predicate/rule-filter-selectivity.d.ts +33 -19
  352. package/dist/src/planner/rules/predicate/rule-filter-selectivity.d.ts.map +1 -1
  353. package/dist/src/planner/rules/predicate/rule-filter-selectivity.js +37 -18
  354. package/dist/src/planner/rules/predicate/rule-filter-selectivity.js.map +1 -1
  355. package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.d.ts +6 -3
  356. package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.d.ts.map +1 -1
  357. package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.js +6 -3
  358. package/dist/src/planner/rules/predicate/rule-join-predicate-pushdown.js.map +1 -1
  359. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.d.ts.map +1 -1
  360. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js +11 -21
  361. package/dist/src/planner/rules/predicate/rule-predicate-pushdown.js.map +1 -1
  362. package/dist/src/planner/rules/shared/access-leaf.d.ts +16 -3
  363. package/dist/src/planner/rules/shared/access-leaf.d.ts.map +1 -1
  364. package/dist/src/planner/rules/shared/access-leaf.js +21 -5
  365. package/dist/src/planner/rules/shared/access-leaf.js.map +1 -1
  366. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js +1 -1
  367. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js.map +1 -1
  368. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js +1 -1
  369. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js.map +1 -1
  370. package/dist/src/planner/stored-body-context.d.ts +57 -0
  371. package/dist/src/planner/stored-body-context.d.ts.map +1 -0
  372. package/dist/src/planner/stored-body-context.js +64 -0
  373. package/dist/src/planner/stored-body-context.js.map +1 -0
  374. package/dist/src/planner/util/ind-utils.d.ts +28 -20
  375. package/dist/src/planner/util/ind-utils.d.ts.map +1 -1
  376. package/dist/src/planner/util/ind-utils.js +36 -27
  377. package/dist/src/planner/util/ind-utils.js.map +1 -1
  378. package/dist/src/planner/util/key-utils.d.ts +19 -4
  379. package/dist/src/planner/util/key-utils.d.ts.map +1 -1
  380. package/dist/src/planner/util/key-utils.js +23 -7
  381. package/dist/src/planner/util/key-utils.js.map +1 -1
  382. package/dist/src/planner/util/output-names.d.ts +12 -0
  383. package/dist/src/planner/util/output-names.d.ts.map +1 -0
  384. package/dist/src/planner/util/output-names.js +20 -0
  385. package/dist/src/planner/util/output-names.js.map +1 -0
  386. package/dist/src/planner/util/row-estimates.d.ts +11 -0
  387. package/dist/src/planner/util/row-estimates.d.ts.map +1 -1
  388. package/dist/src/planner/util/row-estimates.js +28 -0
  389. package/dist/src/planner/util/row-estimates.js.map +1 -1
  390. package/dist/src/runtime/deferred-constraint-queue.d.ts.map +1 -1
  391. package/dist/src/runtime/deferred-constraint-queue.js +3 -2
  392. package/dist/src/runtime/deferred-constraint-queue.js.map +1 -1
  393. package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
  394. package/dist/src/runtime/emit/add-constraint.js +22 -6
  395. package/dist/src/runtime/emit/add-constraint.js.map +1 -1
  396. package/dist/src/runtime/emit/alter-schema-event.d.ts +59 -4
  397. package/dist/src/runtime/emit/alter-schema-event.d.ts.map +1 -1
  398. package/dist/src/runtime/emit/alter-schema-event.js +63 -4
  399. package/dist/src/runtime/emit/alter-schema-event.js.map +1 -1
  400. package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
  401. package/dist/src/runtime/emit/alter-table.js +212 -92
  402. package/dist/src/runtime/emit/alter-table.js.map +1 -1
  403. package/dist/src/runtime/emit/analyze.d.ts.map +1 -1
  404. package/dist/src/runtime/emit/analyze.js +15 -4
  405. package/dist/src/runtime/emit/analyze.js.map +1 -1
  406. package/dist/src/runtime/emit/assertion-drop-guard.d.ts +37 -0
  407. package/dist/src/runtime/emit/assertion-drop-guard.d.ts.map +1 -0
  408. package/dist/src/runtime/emit/assertion-drop-guard.js +59 -0
  409. package/dist/src/runtime/emit/assertion-drop-guard.js.map +1 -0
  410. package/dist/src/runtime/emit/assertion-rename-helpers.d.ts +33 -0
  411. package/dist/src/runtime/emit/assertion-rename-helpers.d.ts.map +1 -0
  412. package/dist/src/runtime/emit/assertion-rename-helpers.js +124 -0
  413. package/dist/src/runtime/emit/assertion-rename-helpers.js.map +1 -0
  414. package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
  415. package/dist/src/runtime/emit/constraint-check.js +10 -227
  416. package/dist/src/runtime/emit/constraint-check.js.map +1 -1
  417. package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -1
  418. package/dist/src/runtime/emit/create-assertion.js +31 -14
  419. package/dist/src/runtime/emit/create-assertion.js.map +1 -1
  420. package/dist/src/runtime/emit/cte.d.ts.map +1 -1
  421. package/dist/src/runtime/emit/cte.js +11 -6
  422. package/dist/src/runtime/emit/cte.js.map +1 -1
  423. package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
  424. package/dist/src/runtime/emit/dml-executor.js +169 -1
  425. package/dist/src/runtime/emit/dml-executor.js.map +1 -1
  426. package/dist/src/runtime/emit/drop-assertion.js +8 -8
  427. package/dist/src/runtime/emit/drop-assertion.js.map +1 -1
  428. package/dist/src/runtime/emit/drop-column-guards.d.ts +151 -0
  429. package/dist/src/runtime/emit/drop-column-guards.d.ts.map +1 -0
  430. package/dist/src/runtime/emit/drop-column-guards.js +230 -0
  431. package/dist/src/runtime/emit/drop-column-guards.js.map +1 -0
  432. package/dist/src/runtime/emit/drop-table.d.ts.map +1 -1
  433. package/dist/src/runtime/emit/drop-table.js +6 -0
  434. package/dist/src/runtime/emit/drop-table.js.map +1 -1
  435. package/dist/src/runtime/emit/drop-view.d.ts.map +1 -1
  436. package/dist/src/runtime/emit/drop-view.js +4 -0
  437. package/dist/src/runtime/emit/drop-view.js.map +1 -1
  438. package/dist/src/runtime/emit/key-set-semi-join.d.ts.map +1 -1
  439. package/dist/src/runtime/emit/key-set-semi-join.js +5 -3
  440. package/dist/src/runtime/emit/key-set-semi-join.js.map +1 -1
  441. package/dist/src/runtime/emit/materialized-view-helpers.d.ts +4 -4
  442. package/dist/src/runtime/emit/materialized-view-helpers.d.ts.map +1 -1
  443. package/dist/src/runtime/emit/materialized-view-helpers.js +34 -22
  444. package/dist/src/runtime/emit/materialized-view-helpers.js.map +1 -1
  445. package/dist/src/runtime/emit/materialized-view.d.ts.map +1 -1
  446. package/dist/src/runtime/emit/materialized-view.js +7 -2
  447. package/dist/src/runtime/emit/materialized-view.js.map +1 -1
  448. package/dist/src/runtime/emit/recursive-cte.d.ts.map +1 -1
  449. package/dist/src/runtime/emit/recursive-cte.js +4 -5
  450. package/dist/src/runtime/emit/recursive-cte.js.map +1 -1
  451. package/dist/src/runtime/emit/remote-query.d.ts.map +1 -1
  452. package/dist/src/runtime/emit/remote-query.js +8 -3
  453. package/dist/src/runtime/emit/remote-query.js.map +1 -1
  454. package/dist/src/runtime/emit/scan.d.ts.map +1 -1
  455. package/dist/src/runtime/emit/scan.js +4 -1
  456. package/dist/src/runtime/emit/scan.js.map +1 -1
  457. package/dist/src/runtime/emit/schema-declarative.js +2 -2
  458. package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
  459. package/dist/src/runtime/emit/update.d.ts.map +1 -1
  460. package/dist/src/runtime/emit/update.js +18 -6
  461. package/dist/src/runtime/emit/update.js.map +1 -1
  462. package/dist/src/runtime/parallel-driver.d.ts +4 -3
  463. package/dist/src/runtime/parallel-driver.d.ts.map +1 -1
  464. package/dist/src/runtime/parallel-driver.js +8 -3
  465. package/dist/src/runtime/parallel-driver.js.map +1 -1
  466. package/dist/src/runtime/row-constraints.d.ts +85 -0
  467. package/dist/src/runtime/row-constraints.d.ts.map +1 -0
  468. package/dist/src/runtime/row-constraints.js +239 -0
  469. package/dist/src/runtime/row-constraints.js.map +1 -0
  470. package/dist/src/runtime/types.d.ts +18 -11
  471. package/dist/src/runtime/types.d.ts.map +1 -1
  472. package/dist/src/runtime/types.js.map +1 -1
  473. package/dist/src/runtime/utils.d.ts.map +1 -1
  474. package/dist/src/runtime/utils.js +11 -0
  475. package/dist/src/runtime/utils.js.map +1 -1
  476. package/dist/src/schema/assertion.d.ts +14 -1
  477. package/dist/src/schema/assertion.d.ts.map +1 -1
  478. package/dist/src/schema/assertion.js +14 -1
  479. package/dist/src/schema/assertion.js.map +1 -1
  480. package/dist/src/schema/catalog-persistability.js +19 -3
  481. package/dist/src/schema/catalog-persistability.js.map +1 -1
  482. package/dist/src/schema/catalog.d.ts +6 -0
  483. package/dist/src/schema/catalog.d.ts.map +1 -1
  484. package/dist/src/schema/catalog.js +26 -36
  485. package/dist/src/schema/catalog.js.map +1 -1
  486. package/dist/src/schema/column-source-resolver.d.ts +18 -0
  487. package/dist/src/schema/column-source-resolver.d.ts.map +1 -0
  488. package/dist/src/schema/column-source-resolver.js +22 -0
  489. package/dist/src/schema/column-source-resolver.js.map +1 -0
  490. package/dist/src/schema/constraint-builder.d.ts.map +1 -1
  491. package/dist/src/schema/constraint-builder.js +7 -1
  492. package/dist/src/schema/constraint-builder.js.map +1 -1
  493. package/dist/src/schema/ddl-generator.js +8 -0
  494. package/dist/src/schema/ddl-generator.js.map +1 -1
  495. package/dist/src/schema/lens-compiler.d.ts.map +1 -1
  496. package/dist/src/schema/lens-compiler.js +203 -51
  497. package/dist/src/schema/lens-compiler.js.map +1 -1
  498. package/dist/src/schema/lens-prover.d.ts +2 -3
  499. package/dist/src/schema/lens-prover.d.ts.map +1 -1
  500. package/dist/src/schema/lens-prover.js +19 -11
  501. package/dist/src/schema/lens-prover.js.map +1 -1
  502. package/dist/src/schema/manager.d.ts +30 -12
  503. package/dist/src/schema/manager.d.ts.map +1 -1
  504. package/dist/src/schema/manager.js +49 -17
  505. package/dist/src/schema/manager.js.map +1 -1
  506. package/dist/src/schema/rename-rewriter.d.ts +142 -0
  507. package/dist/src/schema/rename-rewriter.d.ts.map +1 -1
  508. package/dist/src/schema/rename-rewriter.js +254 -9
  509. package/dist/src/schema/rename-rewriter.js.map +1 -1
  510. package/dist/src/schema/reserved-tags.d.ts +1 -1
  511. package/dist/src/schema/reserved-tags.d.ts.map +1 -1
  512. package/dist/src/schema/reserved-tags.js +4 -3
  513. package/dist/src/schema/reserved-tags.js.map +1 -1
  514. package/dist/src/schema/schema-differ.d.ts +16 -0
  515. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  516. package/dist/src/schema/schema-differ.js +122 -11
  517. package/dist/src/schema/schema-differ.js.map +1 -1
  518. package/dist/src/schema/view.d.ts +11 -0
  519. package/dist/src/schema/view.d.ts.map +1 -1
  520. package/dist/src/schema/view.js +12 -0
  521. package/dist/src/schema/view.js.map +1 -1
  522. package/dist/src/types/builtin-types.d.ts +38 -0
  523. package/dist/src/types/builtin-types.d.ts.map +1 -1
  524. package/dist/src/types/builtin-types.js +77 -26
  525. package/dist/src/types/builtin-types.js.map +1 -1
  526. package/dist/src/types/index.d.ts +1 -1
  527. package/dist/src/types/index.d.ts.map +1 -1
  528. package/dist/src/types/index.js +1 -1
  529. package/dist/src/types/index.js.map +1 -1
  530. package/dist/src/util/abort-signal.d.ts +25 -0
  531. package/dist/src/util/abort-signal.d.ts.map +1 -0
  532. package/dist/src/util/abort-signal.js +40 -0
  533. package/dist/src/util/abort-signal.js.map +1 -0
  534. package/dist/src/util/{working-table-iterable.d.ts → array-row-iterable.d.ts} +6 -6
  535. package/dist/src/util/array-row-iterable.d.ts.map +1 -0
  536. package/dist/src/util/{working-table-iterable.js → array-row-iterable.js} +6 -6
  537. package/dist/src/util/array-row-iterable.js.map +1 -0
  538. package/dist/src/vtab/concurrency.d.ts +15 -0
  539. package/dist/src/vtab/concurrency.d.ts.map +1 -1
  540. package/dist/src/vtab/concurrency.js +17 -0
  541. package/dist/src/vtab/concurrency.js.map +1 -1
  542. package/dist/src/vtab/events.d.ts +3 -0
  543. package/dist/src/vtab/events.d.ts.map +1 -1
  544. package/dist/src/vtab/events.js.map +1 -1
  545. package/dist/src/vtab/manifest.d.ts +15 -0
  546. package/dist/src/vtab/manifest.d.ts.map +1 -1
  547. package/dist/src/vtab/memory/layer/base.d.ts +10 -0
  548. package/dist/src/vtab/memory/layer/base.d.ts.map +1 -1
  549. package/dist/src/vtab/memory/layer/base.js +10 -0
  550. package/dist/src/vtab/memory/layer/base.js.map +1 -1
  551. package/dist/src/vtab/memory/layer/interface.d.ts +24 -0
  552. package/dist/src/vtab/memory/layer/interface.d.ts.map +1 -1
  553. package/dist/src/vtab/memory/layer/manager.d.ts +21 -3
  554. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  555. package/dist/src/vtab/memory/layer/manager.js +107 -157
  556. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  557. package/dist/src/vtab/memory/layer/transaction.d.ts +11 -0
  558. package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
  559. package/dist/src/vtab/memory/layer/transaction.js +19 -0
  560. package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
  561. package/dist/src/vtab/memory/module.d.ts +57 -1
  562. package/dist/src/vtab/memory/module.d.ts.map +1 -1
  563. package/dist/src/vtab/memory/module.js +103 -2
  564. package/dist/src/vtab/memory/module.js.map +1 -1
  565. package/dist/src/vtab/memory/table.d.ts +12 -1
  566. package/dist/src/vtab/memory/table.d.ts.map +1 -1
  567. package/dist/src/vtab/memory/table.js +12 -1
  568. package/dist/src/vtab/memory/table.js.map +1 -1
  569. package/dist/src/vtab/module.d.ts +59 -2
  570. package/dist/src/vtab/module.d.ts.map +1 -1
  571. package/dist/src/vtab/table.d.ts +8 -1
  572. package/dist/src/vtab/table.d.ts.map +1 -1
  573. package/dist/src/vtab/table.js.map +1 -1
  574. package/dist/src/vtab/test-support/commit-stall.d.ts +53 -0
  575. package/dist/src/vtab/test-support/commit-stall.d.ts.map +1 -0
  576. package/dist/src/vtab/test-support/commit-stall.js +73 -0
  577. package/dist/src/vtab/test-support/commit-stall.js.map +1 -0
  578. package/dist/src/vtab/test-support/committed-read-conformance.d.ts +96 -0
  579. package/dist/src/vtab/test-support/committed-read-conformance.d.ts.map +1 -0
  580. package/dist/src/vtab/test-support/committed-read-conformance.js +364 -0
  581. package/dist/src/vtab/test-support/committed-read-conformance.js.map +1 -0
  582. package/package.json +3 -3
  583. package/dist/src/util/working-table-iterable.d.ts.map +0 -1
  584. package/dist/src/util/working-table-iterable.js.map +0 -1
@@ -430,11 +430,22 @@ export class MemoryTableManager {
430
430
  const connection = this.connections.get(connectionId);
431
431
  if (!connection)
432
432
  return;
433
- // If the connection still has an un-committed pending layer, defer
434
- // disconnect until the layer is either committed or rolled back by the
435
- // transaction coordinator. This avoids accidental rollback during
436
- // implicit transactions.
437
- if (connection.pendingTransactionLayer && !connection.pendingTransactionLayer.isCommitted()) {
433
+ // If the connection still holds uncommitted work, defer disconnect until it is
434
+ // either committed or rolled back by the transaction coordinator. This avoids
435
+ // accidental rollback during implicit transactions.
436
+ //
437
+ // `hasOpenWork()` rather than an uncommitted pending layer: an eager savepoint moves
438
+ // the connection's uncommitted rows into `readLayer` and nulls
439
+ // `pendingTransactionLayer`, so the narrower test dropped a connection that was still
440
+ // reading — and writing, at commit — a live layer, hiding it from `isLayerInUse` while
441
+ // the collapse below ran.
442
+ //
443
+ // NOTE: deferral has no timeout, so a transaction abandoned without commit or rollback
444
+ // keeps this connection — and the layer chain it reads — reachable for the table's
445
+ // lifetime. The same was already true of an abandoned pending layer; if abandoned
446
+ // transactions ever show up as a leak, the fix is a reaper over `connections`, not a
447
+ // narrower test here.
448
+ if (connection.hasOpenWork()) {
438
449
  logger.debugLog(`[Disconnect] Deferring disconnect of connection ${connectionId} while transaction pending for ${this._tableName}`);
439
450
  return;
440
451
  }
@@ -468,16 +479,7 @@ export class MemoryTableManager {
468
479
  if (!connection.pendingTransactionLayer
469
480
  && connection.readLayer !== this._currentCommittedLayer
470
481
  && connection.readLayer instanceof TransactionLayer) {
471
- let walker = connection.readLayer.getParent();
472
- let isAhead = false;
473
- while (walker) {
474
- if (walker === this._currentCommittedLayer) {
475
- isAhead = true;
476
- break;
477
- }
478
- walker = walker.getParent();
479
- }
480
- if (isAhead) {
482
+ if (this.chainContains(connection.readLayer, this._currentCommittedLayer)) {
481
483
  if (connection.readLayer.getSchema() === this.tableSchema) {
482
484
  connection.pendingTransactionLayer = new TransactionLayer(connection.readLayer);
483
485
  if (this.eventEmitter?.hasDataListeners?.()) {
@@ -525,17 +527,7 @@ export class MemoryTableManager {
525
527
  // Case C — no common ancestor reachable: a genuinely stale commit. Roll
526
528
  // back with BUSY outside a coordinated commit (the caller can retry);
527
529
  // inside one, preserve the prior wholesale fallback.
528
- let headIsAncestorOfPending = false;
529
- {
530
- let cur = pendingLayer;
531
- while (cur) {
532
- if (cur === this._currentCommittedLayer) {
533
- headIsAncestorOfPending = true;
534
- break;
535
- }
536
- cur = cur.getParent();
537
- }
538
- }
530
+ const headIsAncestorOfPending = this.chainContains(pendingLayer, this._currentCommittedLayer);
539
531
  let committedLayer;
540
532
  let changes;
541
533
  if (headIsAncestorOfPending) {
@@ -747,44 +739,13 @@ export class MemoryTableManager {
747
739
  return;
748
740
  }
749
741
  logger.debugLog(`[Collapse] Acquired lock for ${this._tableName}`);
750
- let collapsedCount = 0;
751
- const maxCollapseIterations = 10; // Prevent infinite loops
752
- let iterations = 0;
753
- // Continue collapsing layers as long as it's safe to do so
754
- while (iterations < maxCollapseIterations &&
755
- this._currentCommittedLayer instanceof TransactionLayer &&
756
- this._currentCommittedLayer.isCommitted()) {
757
- const layerToPromote = this._currentCommittedLayer;
758
- const parentLayer = layerToPromote.getParent();
759
- if (!parentLayer) {
760
- logger.error('Collapse Layers', this._tableName, 'Committed TransactionLayer has no parent', { layerId: layerToPromote.getLayerId() });
761
- break;
762
- }
763
- // Check if anyone is still using the parent layer or any of its ancestors
764
- if (this.isLayerInUse(parentLayer)) {
765
- logger.debugLog(`[Collapse] Parent layer ${parentLayer.getLayerId()} or its ancestors in use. Cannot collapse layer ${layerToPromote.getLayerId()}.`);
766
- break;
767
- }
768
- logger.debugLog(`[Collapse] Promoting layer ${layerToPromote.getLayerId()} to become independent from parent ${parentLayer.getLayerId()} for ${this._tableName}`);
769
- // With inherited BTrees, "collapsing" means making the transaction layer independent
770
- // by calling clearBase() on its BTrees, effectively making it the new base data
771
- layerToPromote.clearBase();
772
- // Update connections that were reading from the collapsed parent layer
773
- for (const conn of this.connections.values()) {
774
- if (conn.readLayer === parentLayer) {
775
- // Update connections to read from the now-independent transaction layer
776
- conn.readLayer = layerToPromote;
777
- logger.debugLog(`[Collapse] Connection ${conn.connectionId} updated to read from independent layer ${layerToPromote.getLayerId()}`);
778
- }
779
- }
780
- collapsedCount++;
781
- iterations++;
782
- // The layer is now independent, but check if we can collapse further
783
- // by examining if this layer can be promoted above its (now detached) parent
784
- logger.debugLog(`[Collapse] Layer ${layerToPromote.getLayerId()} is now independent for ${this._tableName}`);
785
- }
786
- if (collapsedCount > 0) {
787
- logger.operation('Collapse Layers', this._tableName, { collapsedCount, iterations });
742
+ // At most ONE promotion per call, and no loop: promoting detaches the head's
743
+ // BTrees from their base but leaves the head exactly where it is, so there is
744
+ // never a second layer to promote afterwards. (The former `while` re-tested
745
+ // `_currentCommittedLayer`, which its body never reassigned, and so re-ran
746
+ // `clearBase()` on the same layer up to ten times per call.)
747
+ if (this.promoteCommittedHead()) {
748
+ logger.operation('Collapse Layers', this._tableName, { collapsedCount: 1 });
788
749
  }
789
750
  else {
790
751
  logger.debugLog(`[Collapse] No layers collapsed for ${this._tableName}. Current: ${this._currentCommittedLayer.getLayerId()}`);
@@ -802,33 +763,88 @@ export class MemoryTableManager {
802
763
  }
803
764
  }
804
765
  /**
805
- * Checks if a layer is currently in use by any connections.
806
- * This includes checking if any connection is reading from the layer,
807
- * has it as a pending transaction layer, or has it as a savepoint.
766
+ * Detaches the committed head from its parent (`clearBase()`), so the chain below it
767
+ * can be released. Returns whether it did.
768
+ *
769
+ * Caller holds the collapse latch.
770
+ */
771
+ promoteCommittedHead() {
772
+ if (!(this._currentCommittedLayer instanceof TransactionLayer))
773
+ return false;
774
+ if (!this._currentCommittedLayer.isCommitted())
775
+ return false;
776
+ const layerToPromote = this._currentCommittedLayer;
777
+ const parentLayer = layerToPromote.getParent();
778
+ if (!parentLayer) {
779
+ logger.error('Collapse Layers', this._tableName, 'Committed TransactionLayer has no parent', { layerId: layerToPromote.getLayerId() });
780
+ return false;
781
+ }
782
+ // A layer any child has EVER derived from must not be promoted. `clearBase()` drops
783
+ // the base pointer, which removes the base's whole contribution from the tree's
784
+ // `chainVersion()` — and every already-derived child snapshotted that total when it
785
+ // was built, so each one's next `checkBase()` raises `MutatedBaseError` although no
786
+ // row moved. inheritree forbids it for a second reason too: the detached tree keeps
787
+ // sharing nodes by identity with its former base, so the base-immutability contract
788
+ // outlives the call.
789
+ //
790
+ // The connection-based check below cannot cover this: `disconnect` detaches
791
+ // still-live connections from `this.connections`, so the map is not an authoritative
792
+ // liveness registry. The signal has to live on the layer.
793
+ //
794
+ // NOTE: the derived-child counter never decrements (no layer-destruction hook exists),
795
+ // so a long-lived table whose head always has a child may never collapse. If
796
+ // layer-chain memory growth ever shows up, switch the promotion to inheritree's
797
+ // `BTree.flatten()` — a real O(n) independent copy that leaves the old tree valid for
798
+ // its children — behind a chain-depth threshold, rather than loosening this guard.
799
+ if (layerToPromote.hasDerivedChildren()) {
800
+ logger.debugLog(`[Collapse] Layer ${layerToPromote.getLayerId()} has derived children. Cannot promote it for ${this._tableName}.`);
801
+ return false;
802
+ }
803
+ // Check if anyone is still using the parent layer or any of its ancestors
804
+ if (this.isLayerInUse(parentLayer)) {
805
+ logger.debugLog(`[Collapse] Parent layer ${parentLayer.getLayerId()} or its ancestors in use. Cannot collapse layer ${layerToPromote.getLayerId()}.`);
806
+ return false;
807
+ }
808
+ logger.debugLog(`[Collapse] Promoting layer ${layerToPromote.getLayerId()} to become independent from parent ${parentLayer.getLayerId()} for ${this._tableName}`);
809
+ // With inherited BTrees, "collapsing" means making the transaction layer independent
810
+ // by calling clearBase() on its BTrees, effectively making it the new base data
811
+ layerToPromote.clearBase();
812
+ // No connection needs re-pointing off `parentLayer`: `isLayerInUse` above returns true
813
+ // for a connection whose read or pending chain reaches it — reading it directly
814
+ // included — so reaching here proves no attached connection holds it.
815
+ logger.debugLog(`[Collapse] Layer ${layerToPromote.getLayerId()} is now independent for ${this._tableName}`);
816
+ return true;
817
+ }
818
+ /**
819
+ * Whether any attached connection's read or write view still reaches `layer` — as its
820
+ * read layer, its pending layer, or an ancestor of either.
821
+ *
822
+ * BOTH chains are walked, and each all the way to the chain root. An eager savepoint
823
+ * (`MemoryTableConnection.createSavepoint`) moves the connection's uncommitted layer into
824
+ * `readLayer` and leaves `pendingTransactionLayer` null, so walking only the pending chain
825
+ * misses exactly the connection whose live snapshot the collapse would strand.
826
+ *
827
+ * Necessary but NOT sufficient as a collapse precondition: `disconnect` can drop a still-live
828
+ * connection from `this.connections` (it stays registered on the Database and is committed
829
+ * later), so a layer this reports unused may still have live derived trees. That is what
830
+ * {@link Layer.hasDerivedChildren} covers.
808
831
  */
809
832
  isLayerInUse(layer) {
810
833
  for (const conn of this.connections.values()) {
811
- // Check if connection is reading from this layer
812
- if (conn.readLayer === layer) {
834
+ if (this.chainContains(conn.readLayer, layer))
813
835
  return true;
814
- }
815
- // Check if connection has this layer as pending transaction
816
- if (conn.pendingTransactionLayer === layer) {
836
+ if (conn.pendingTransactionLayer && this.chainContains(conn.pendingTransactionLayer, layer))
817
837
  return true;
818
- }
819
- // Check if connection has this layer in its parent chain
820
- let currentLayer = conn.pendingTransactionLayer?.getParent();
821
- while (currentLayer) {
822
- if (currentLayer === layer) {
823
- return true;
824
- }
825
- if (currentLayer instanceof TransactionLayer) {
826
- currentLayer = currentLayer.getParent();
827
- }
828
- else {
829
- break;
830
- }
831
- }
838
+ }
839
+ return false;
840
+ }
841
+ /** Whether `layer` is `from` itself or any of its ancestors. */
842
+ chainContains(from, layer) {
843
+ let cur = from;
844
+ while (cur) {
845
+ if (cur === layer)
846
+ return true;
847
+ cur = cur.getParent();
832
848
  }
833
849
  return false;
834
850
  }
@@ -1448,13 +1464,9 @@ export class MemoryTableManager {
1448
1464
  // (`readLayer.getSchema() === this.tableSchema`) and drops the transaction's staged
1449
1465
  // rows at COMMIT.
1450
1466
  this.adoptSchemaOnOpenLayers(renamed);
1451
- // Emit schema change event
1452
- this.eventEmitter?.emitSchemaChange?.({
1453
- type: 'alter',
1454
- objectType: 'table',
1455
- schemaName: this.schemaName,
1456
- objectName: newName,
1457
- });
1467
+ // No emit here (or in any other ALTER-arm manager method): the module-level
1468
+ // `alterTable`/`renameTable` raises the statement's ONE schema event, gated on the
1469
+ // engine-set `change.ddl` — so a wrapper-driven manager call announces nothing.
1458
1470
  }
1459
1471
  /**
1460
1472
  * Atomically replaces the entire committed contents with `rows` by building a
@@ -1854,20 +1866,6 @@ export class MemoryTableManager {
1854
1866
  this.tableSchema = finalNewTableSchema;
1855
1867
  this.initializePrimaryKeyFunctions();
1856
1868
  this.installReshapeOnOpenLayers(finalNewTableSchema, reshapePlans);
1857
- // Emit schema change event.
1858
- // NOTE: the event names the added column but not its position, which is fine while
1859
- // the only non-append caller is an in-process wrapper that rebuilds its view from the
1860
- // post-change schema. An append never invalidates an existing column index; an insert
1861
- // does. If a position ever becomes SQL-reachable, anything that caches a column index
1862
- // across this swap (planner caches, prepared statements, a wrapper's own schema
1863
- // snapshot) needs to learn the insert point — so the event would have to carry it.
1864
- this.eventEmitter?.emitSchemaChange?.({
1865
- type: 'alter',
1866
- objectType: 'column',
1867
- schemaName: this.schemaName,
1868
- objectName: this._tableName,
1869
- columnName: newColumnSchema.name,
1870
- });
1871
1869
  logger.operation('Add Column', this._tableName, { columnName: newColumnSchema.name });
1872
1870
  }
1873
1871
  catch (e) {
@@ -1945,14 +1943,6 @@ export class MemoryTableManager {
1945
1943
  this.implicitCoveringStructures.delete(key);
1946
1944
  this.initializePrimaryKeyFunctions();
1947
1945
  this.installReshapeOnOpenLayers(finalNewTableSchema, reshapePlans);
1948
- // Emit schema change event
1949
- this.eventEmitter?.emitSchemaChange?.({
1950
- type: 'drop',
1951
- objectType: 'column',
1952
- schemaName: this.schemaName,
1953
- objectName: this._tableName,
1954
- columnName,
1955
- });
1956
1946
  logger.operation('Drop Column', this._tableName, { columnName });
1957
1947
  }
1958
1948
  catch (e) {
@@ -2056,15 +2046,6 @@ export class MemoryTableManager {
2056
2046
  // silently dropped at COMMIT. Covered by
2057
2047
  // `test/logic/41.8-alter-savepoint-staged-rows.sqllogic`.
2058
2048
  this.adoptSchemaOnOpenLayers(finalNewTableSchema);
2059
- // Emit schema change event
2060
- this.eventEmitter?.emitSchemaChange?.({
2061
- type: 'alter',
2062
- objectType: 'column',
2063
- schemaName: this.schemaName,
2064
- objectName: this._tableName,
2065
- columnName: newColumnName,
2066
- oldColumnName: oldName,
2067
- });
2068
2049
  logger.operation('Rename Column', this._tableName, { oldName, newName: newColumnName });
2069
2050
  }
2070
2051
  catch (e) {
@@ -2143,13 +2124,6 @@ export class MemoryTableManager {
2143
2124
  this.tableSchema = plan.newSchema;
2144
2125
  this.initializePrimaryKeyFunctions();
2145
2126
  this.propagateAlterColumnToOpenLayers(plan);
2146
- this.eventEmitter?.emitSchemaChange?.({
2147
- type: 'alter',
2148
- objectType: 'column',
2149
- schemaName: this.schemaName,
2150
- objectName: this._tableName,
2151
- columnName: change.columnName,
2152
- });
2153
2127
  logger.operation('Alter Column', this._tableName, { columnName: change.columnName });
2154
2128
  }
2155
2129
  catch (e) {
@@ -2245,12 +2219,6 @@ export class MemoryTableManager {
2245
2219
  for (const { layer, prepared } of plans) {
2246
2220
  layer.installRekeyedPrimaryKeyColumns(newSchema, prepared);
2247
2221
  }
2248
- this.eventEmitter?.emitSchemaChange?.({
2249
- type: 'alter',
2250
- objectType: 'table',
2251
- schemaName: this.schemaName,
2252
- objectName: this._tableName,
2253
- });
2254
2222
  logger.operation('Alter Primary Key', this._tableName, {
2255
2223
  columns: newSchema.primaryKeyDefinition.map(def => def.index),
2256
2224
  });
@@ -2647,12 +2615,6 @@ export class MemoryTableManager {
2647
2615
  // stops enforcing for the rest of it; harmless for CHECK/FK (they re-freeze an
2648
2616
  // equivalent schema, holding no per-layer structure).
2649
2617
  this.adoptSchemaOnOpenLayers(newSchema);
2650
- this.eventEmitter?.emitSchemaChange?.({
2651
- type: 'alter',
2652
- objectType: 'table',
2653
- schemaName: this.schemaName,
2654
- objectName: this._tableName,
2655
- });
2656
2618
  logger.operation('Drop Constraint', this._tableName, { constraintName });
2657
2619
  }
2658
2620
  catch (e) {
@@ -2733,12 +2695,6 @@ export class MemoryTableManager {
2733
2695
  // check (`readLayer.getSchema() === this.tableSchema`) skips a savepoint snapshot
2734
2696
  // restored across this ALTER and drops the transaction's staged rows at COMMIT.
2735
2697
  this.adoptSchemaOnOpenLayers(newSchema);
2736
- this.eventEmitter?.emitSchemaChange?.({
2737
- type: 'alter',
2738
- objectType: 'table',
2739
- schemaName: this.schemaName,
2740
- objectName: this._tableName,
2741
- });
2742
2698
  logger.operation('Rename Constraint', this._tableName, { oldName, newName });
2743
2699
  }
2744
2700
  catch (e) {
@@ -2791,12 +2747,6 @@ export class MemoryTableManager {
2791
2747
  else {
2792
2748
  throw new QuereusError(`MemoryTable ADD CONSTRAINT does not support constraint type '${constraint.type}'`, StatusCode.UNSUPPORTED);
2793
2749
  }
2794
- this.eventEmitter?.emitSchemaChange?.({
2795
- type: 'alter',
2796
- objectType: 'table',
2797
- schemaName: this.schemaName,
2798
- objectName: this._tableName,
2799
- });
2800
2750
  logger.operation('Add Constraint', this._tableName, { type: constraint.type, name: constraint.name });
2801
2751
  }
2802
2752
  catch (e) {
@@ -2977,8 +2927,8 @@ export class MemoryTableManager {
2977
2927
  // loop above misses it, so after an in-transaction schema change (e.g. ALTER TABLE ADD
2978
2928
  // COLUMN, now permitted inside an explicit transaction) it keeps reading a stale
2979
2929
  // pre-change layer carrying the OLD column shape — the materialized-view-source-stale-read
2980
- // bug. A detached connection always has `pendingTransactionLayer === null` (disconnect
2981
- // defers while a pending layer is uncommitted), so this never discards in-flight writes.
2930
+ // bug. A detached connection never holds open work (`disconnect` defers while
2931
+ // `hasOpenWork()`), so this never discards in-flight writes.
2982
2932
  this.repointRegisteredConnections();
2983
2933
  // Re-pointing `readLayer` is not enough: a savepoint taken while a connection held no
2984
2934
  // pending layer stored the layer it was READING as the view to restore. Consolidation