@quereus/quereus 2.9.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/README.md +224 -222
  2. package/dist/src/core/database-assertions.d.ts +36 -16
  3. package/dist/src/core/database-assertions.d.ts.map +1 -1
  4. package/dist/src/core/database-assertions.js +222 -118
  5. package/dist/src/core/database-assertions.js.map +1 -1
  6. package/dist/src/core/database-transaction.d.ts +96 -13
  7. package/dist/src/core/database-transaction.d.ts.map +1 -1
  8. package/dist/src/core/database-transaction.js +294 -35
  9. package/dist/src/core/database-transaction.js.map +1 -1
  10. package/dist/src/core/database-watchers.d.ts +58 -0
  11. package/dist/src/core/database-watchers.d.ts.map +1 -0
  12. package/dist/src/core/database-watchers.js +206 -0
  13. package/dist/src/core/database-watchers.js.map +1 -0
  14. package/dist/src/core/database.d.ts +78 -5
  15. package/dist/src/core/database.d.ts.map +1 -1
  16. package/dist/src/core/database.js +120 -20
  17. package/dist/src/core/database.js.map +1 -1
  18. package/dist/src/core/statement.d.ts +9 -0
  19. package/dist/src/core/statement.d.ts.map +1 -1
  20. package/dist/src/core/statement.js +29 -0
  21. package/dist/src/core/statement.js.map +1 -1
  22. package/dist/src/core/table-handle.d.ts +45 -0
  23. package/dist/src/core/table-handle.d.ts.map +1 -0
  24. package/dist/src/core/table-handle.js +54 -0
  25. package/dist/src/core/table-handle.js.map +1 -0
  26. package/dist/src/func/builtins/conversion.d.ts.map +1 -1
  27. package/dist/src/func/builtins/conversion.js +12 -1
  28. package/dist/src/func/builtins/conversion.js.map +1 -1
  29. package/dist/src/func/builtins/explain.d.ts.map +1 -1
  30. package/dist/src/func/builtins/explain.js +22 -8
  31. package/dist/src/func/builtins/explain.js.map +1 -1
  32. package/dist/src/func/builtins/generation.d.ts.map +1 -1
  33. package/dist/src/func/builtins/generation.js +26 -1
  34. package/dist/src/func/builtins/generation.js.map +1 -1
  35. package/dist/src/func/builtins/index.d.ts.map +1 -1
  36. package/dist/src/func/builtins/index.js +5 -1
  37. package/dist/src/func/builtins/index.js.map +1 -1
  38. package/dist/src/func/builtins/json-tvf.d.ts.map +1 -1
  39. package/dist/src/func/builtins/json-tvf.js +16 -2
  40. package/dist/src/func/builtins/json-tvf.js.map +1 -1
  41. package/dist/src/func/builtins/schema.d.ts +4 -0
  42. package/dist/src/func/builtins/schema.d.ts.map +1 -1
  43. package/dist/src/func/builtins/schema.js +270 -11
  44. package/dist/src/func/builtins/schema.js.map +1 -1
  45. package/dist/src/func/registration.d.ts +19 -1
  46. package/dist/src/func/registration.d.ts.map +1 -1
  47. package/dist/src/func/registration.js +8 -3
  48. package/dist/src/func/registration.js.map +1 -1
  49. package/dist/src/index.d.ts +7 -1
  50. package/dist/src/index.d.ts.map +1 -1
  51. package/dist/src/index.js +5 -0
  52. package/dist/src/index.js.map +1 -1
  53. package/dist/src/parser/parser.d.ts.map +1 -1
  54. package/dist/src/parser/parser.js +12 -4
  55. package/dist/src/parser/parser.js.map +1 -1
  56. package/dist/src/planner/analysis/assertion-classifier.d.ts +71 -0
  57. package/dist/src/planner/analysis/assertion-classifier.d.ts.map +1 -0
  58. package/dist/src/planner/analysis/assertion-classifier.js +286 -0
  59. package/dist/src/planner/analysis/assertion-classifier.js.map +1 -0
  60. package/dist/src/planner/analysis/assertion-hoist-cache.d.ts +34 -0
  61. package/dist/src/planner/analysis/assertion-hoist-cache.d.ts.map +1 -0
  62. package/dist/src/planner/analysis/assertion-hoist-cache.js +119 -0
  63. package/dist/src/planner/analysis/assertion-hoist-cache.js.map +1 -0
  64. package/dist/src/planner/analysis/binding-extractor.d.ts +58 -0
  65. package/dist/src/planner/analysis/binding-extractor.d.ts.map +1 -0
  66. package/dist/src/planner/analysis/binding-extractor.js +110 -0
  67. package/dist/src/planner/analysis/binding-extractor.js.map +1 -0
  68. package/dist/src/planner/analysis/change-scope.d.ts +184 -0
  69. package/dist/src/planner/analysis/change-scope.d.ts.map +1 -0
  70. package/dist/src/planner/analysis/change-scope.js +825 -0
  71. package/dist/src/planner/analysis/change-scope.js.map +1 -0
  72. package/dist/src/planner/analysis/check-extraction.d.ts +29 -0
  73. package/dist/src/planner/analysis/check-extraction.d.ts.map +1 -0
  74. package/dist/src/planner/analysis/check-extraction.js +420 -0
  75. package/dist/src/planner/analysis/check-extraction.js.map +1 -0
  76. package/dist/src/planner/analysis/constraint-extractor.d.ts +47 -7
  77. package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
  78. package/dist/src/planner/analysis/constraint-extractor.js +186 -93
  79. package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
  80. package/dist/src/planner/analysis/partial-unique-extraction.d.ts +68 -0
  81. package/dist/src/planner/analysis/partial-unique-extraction.d.ts.map +1 -0
  82. package/dist/src/planner/analysis/partial-unique-extraction.js +347 -0
  83. package/dist/src/planner/analysis/partial-unique-extraction.js.map +1 -0
  84. package/dist/src/planner/analysis/predicate-conjuncts.d.ts +14 -0
  85. package/dist/src/planner/analysis/predicate-conjuncts.d.ts.map +1 -0
  86. package/dist/src/planner/analysis/predicate-conjuncts.js +31 -0
  87. package/dist/src/planner/analysis/predicate-conjuncts.js.map +1 -0
  88. package/dist/src/planner/analysis/predicate-shape.d.ts +52 -0
  89. package/dist/src/planner/analysis/predicate-shape.d.ts.map +1 -0
  90. package/dist/src/planner/analysis/predicate-shape.js +119 -0
  91. package/dist/src/planner/analysis/predicate-shape.js.map +1 -0
  92. package/dist/src/planner/analysis/sat-checker.d.ts +43 -0
  93. package/dist/src/planner/analysis/sat-checker.d.ts.map +1 -0
  94. package/dist/src/planner/analysis/sat-checker.js +393 -0
  95. package/dist/src/planner/analysis/sat-checker.js.map +1 -0
  96. package/dist/src/planner/building/table.d.ts.map +1 -1
  97. package/dist/src/planner/building/table.js +1 -1
  98. package/dist/src/planner/building/table.js.map +1 -1
  99. package/dist/src/planner/framework/characteristics.d.ts +10 -1
  100. package/dist/src/planner/framework/characteristics.d.ts.map +1 -1
  101. package/dist/src/planner/framework/characteristics.js +24 -5
  102. package/dist/src/planner/framework/characteristics.js.map +1 -1
  103. package/dist/src/planner/framework/context.d.ts +1 -8
  104. package/dist/src/planner/framework/context.d.ts.map +1 -1
  105. package/dist/src/planner/framework/context.js +4 -21
  106. package/dist/src/planner/framework/context.js.map +1 -1
  107. package/dist/src/planner/framework/pass.d.ts +18 -2
  108. package/dist/src/planner/framework/pass.d.ts.map +1 -1
  109. package/dist/src/planner/framework/pass.js +145 -46
  110. package/dist/src/planner/framework/pass.js.map +1 -1
  111. package/dist/src/planner/framework/physical-utils.d.ts +0 -9
  112. package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
  113. package/dist/src/planner/framework/physical-utils.js +0 -31
  114. package/dist/src/planner/framework/physical-utils.js.map +1 -1
  115. package/dist/src/planner/nodes/aggregate-node.d.ts +25 -0
  116. package/dist/src/planner/nodes/aggregate-node.d.ts.map +1 -1
  117. package/dist/src/planner/nodes/aggregate-node.js +75 -8
  118. package/dist/src/planner/nodes/aggregate-node.js.map +1 -1
  119. package/dist/src/planner/nodes/alias-node.d.ts.map +1 -1
  120. package/dist/src/planner/nodes/alias-node.js +6 -1
  121. package/dist/src/planner/nodes/alias-node.js.map +1 -1
  122. package/dist/src/planner/nodes/asof-scan-node.d.ts.map +1 -1
  123. package/dist/src/planner/nodes/asof-scan-node.js +17 -3
  124. package/dist/src/planner/nodes/asof-scan-node.js.map +1 -1
  125. package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -1
  126. package/dist/src/planner/nodes/bloom-join-node.js +19 -9
  127. package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
  128. package/dist/src/planner/nodes/distinct-node.d.ts.map +1 -1
  129. package/dist/src/planner/nodes/distinct-node.js +10 -6
  130. package/dist/src/planner/nodes/distinct-node.js.map +1 -1
  131. package/dist/src/planner/nodes/empty-relation-node.d.ts +27 -0
  132. package/dist/src/planner/nodes/empty-relation-node.d.ts.map +1 -0
  133. package/dist/src/planner/nodes/empty-relation-node.js +61 -0
  134. package/dist/src/planner/nodes/empty-relation-node.js.map +1 -0
  135. package/dist/src/planner/nodes/filter.d.ts.map +1 -1
  136. package/dist/src/planner/nodes/filter.js +65 -5
  137. package/dist/src/planner/nodes/filter.js.map +1 -1
  138. package/dist/src/planner/nodes/hash-aggregate.d.ts +1 -1
  139. package/dist/src/planner/nodes/hash-aggregate.d.ts.map +1 -1
  140. package/dist/src/planner/nodes/hash-aggregate.js +8 -6
  141. package/dist/src/planner/nodes/hash-aggregate.js.map +1 -1
  142. package/dist/src/planner/nodes/join-node.d.ts.map +1 -1
  143. package/dist/src/planner/nodes/join-node.js +12 -9
  144. package/dist/src/planner/nodes/join-node.js.map +1 -1
  145. package/dist/src/planner/nodes/join-utils.d.ts +24 -1
  146. package/dist/src/planner/nodes/join-utils.d.ts.map +1 -1
  147. package/dist/src/planner/nodes/join-utils.js +86 -0
  148. package/dist/src/planner/nodes/join-utils.js.map +1 -1
  149. package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
  150. package/dist/src/planner/nodes/limit-offset.js +6 -1
  151. package/dist/src/planner/nodes/limit-offset.js.map +1 -1
  152. package/dist/src/planner/nodes/merge-join-node.d.ts.map +1 -1
  153. package/dist/src/planner/nodes/merge-join-node.js +19 -9
  154. package/dist/src/planner/nodes/merge-join-node.js.map +1 -1
  155. package/dist/src/planner/nodes/ordinal-slice-node.d.ts.map +1 -1
  156. package/dist/src/planner/nodes/ordinal-slice-node.js +5 -2
  157. package/dist/src/planner/nodes/ordinal-slice-node.js.map +1 -1
  158. package/dist/src/planner/nodes/plan-node-type.d.ts +1 -0
  159. package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
  160. package/dist/src/planner/nodes/plan-node-type.js +1 -0
  161. package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
  162. package/dist/src/planner/nodes/plan-node.d.ts +186 -4
  163. package/dist/src/planner/nodes/plan-node.d.ts.map +1 -1
  164. package/dist/src/planner/nodes/plan-node.js.map +1 -1
  165. package/dist/src/planner/nodes/project-node.d.ts.map +1 -1
  166. package/dist/src/planner/nodes/project-node.js +75 -30
  167. package/dist/src/planner/nodes/project-node.js.map +1 -1
  168. package/dist/src/planner/nodes/reference.d.ts +24 -2
  169. package/dist/src/planner/nodes/reference.d.ts.map +1 -1
  170. package/dist/src/planner/nodes/reference.js +101 -1
  171. package/dist/src/planner/nodes/reference.js.map +1 -1
  172. package/dist/src/planner/nodes/retrieve-node.d.ts +9 -1
  173. package/dist/src/planner/nodes/retrieve-node.d.ts.map +1 -1
  174. package/dist/src/planner/nodes/retrieve-node.js +21 -0
  175. package/dist/src/planner/nodes/retrieve-node.js.map +1 -1
  176. package/dist/src/planner/nodes/returning-node.d.ts.map +1 -1
  177. package/dist/src/planner/nodes/returning-node.js +64 -28
  178. package/dist/src/planner/nodes/returning-node.js.map +1 -1
  179. package/dist/src/planner/nodes/scalar.d.ts +1 -0
  180. package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
  181. package/dist/src/planner/nodes/scalar.js +12 -0
  182. package/dist/src/planner/nodes/scalar.js.map +1 -1
  183. package/dist/src/planner/nodes/set-operation-node.d.ts.map +1 -1
  184. package/dist/src/planner/nodes/set-operation-node.js +15 -0
  185. package/dist/src/planner/nodes/set-operation-node.js.map +1 -1
  186. package/dist/src/planner/nodes/single-row.d.ts.map +1 -1
  187. package/dist/src/planner/nodes/single-row.js +3 -1
  188. package/dist/src/planner/nodes/single-row.js.map +1 -1
  189. package/dist/src/planner/nodes/sort.d.ts.map +1 -1
  190. package/dist/src/planner/nodes/sort.js +10 -3
  191. package/dist/src/planner/nodes/sort.js.map +1 -1
  192. package/dist/src/planner/nodes/stream-aggregate.d.ts +1 -1
  193. package/dist/src/planner/nodes/stream-aggregate.d.ts.map +1 -1
  194. package/dist/src/planner/nodes/stream-aggregate.js +8 -8
  195. package/dist/src/planner/nodes/stream-aggregate.js.map +1 -1
  196. package/dist/src/planner/nodes/table-access-nodes.d.ts +3 -3
  197. package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
  198. package/dist/src/planner/nodes/table-access-nodes.js +26 -8
  199. package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
  200. package/dist/src/planner/nodes/table-function-call.d.ts +4 -1
  201. package/dist/src/planner/nodes/table-function-call.d.ts.map +1 -1
  202. package/dist/src/planner/nodes/table-function-call.js +224 -14
  203. package/dist/src/planner/nodes/table-function-call.js.map +1 -1
  204. package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
  205. package/dist/src/planner/nodes/window-node.js +9 -2
  206. package/dist/src/planner/nodes/window-node.js.map +1 -1
  207. package/dist/src/planner/optimizer-tuning.d.ts +29 -1
  208. package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
  209. package/dist/src/planner/optimizer-tuning.js +3 -0
  210. package/dist/src/planner/optimizer-tuning.js.map +1 -1
  211. package/dist/src/planner/optimizer.d.ts.map +1 -1
  212. package/dist/src/planner/optimizer.js +187 -0
  213. package/dist/src/planner/optimizer.js.map +1 -1
  214. package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
  215. package/dist/src/planner/rules/access/rule-select-access-path.js +22 -7
  216. package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
  217. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts +30 -0
  218. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts.map +1 -0
  219. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js +116 -0
  220. package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js.map +1 -0
  221. package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts +7 -7
  222. package/dist/src/planner/rules/distinct/rule-distinct-elimination.d.ts.map +1 -1
  223. package/dist/src/planner/rules/distinct/rule-distinct-elimination.js +18 -16
  224. package/dist/src/planner/rules/distinct/rule-distinct-elimination.js.map +1 -1
  225. package/dist/src/planner/rules/join/rule-join-elimination.d.ts +56 -0
  226. package/dist/src/planner/rules/join/rule-join-elimination.d.ts.map +1 -0
  227. package/dist/src/planner/rules/join/rule-join-elimination.js +326 -0
  228. package/dist/src/planner/rules/join/rule-join-elimination.js.map +1 -0
  229. package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -1
  230. package/dist/src/planner/rules/join/rule-join-greedy-commute.js +10 -2
  231. package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -1
  232. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts +20 -0
  233. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.d.ts.map +1 -0
  234. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js +181 -0
  235. package/dist/src/planner/rules/predicate/rule-aggregate-predicate-pushdown.js.map +1 -0
  236. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts +46 -0
  237. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.d.ts.map +1 -0
  238. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js +156 -0
  239. package/dist/src/planner/rules/predicate/rule-empty-relation-folding.js.map +1 -0
  240. package/dist/src/planner/rules/predicate/rule-filter-contradiction.d.ts +30 -0
  241. package/dist/src/planner/rules/predicate/rule-filter-contradiction.d.ts.map +1 -0
  242. package/dist/src/planner/rules/predicate/rule-filter-contradiction.js +60 -0
  243. package/dist/src/planner/rules/predicate/rule-filter-contradiction.js.map +1 -0
  244. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts +45 -0
  245. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.d.ts.map +1 -0
  246. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js +210 -0
  247. package/dist/src/planner/rules/predicate/rule-predicate-inference-equivalence.js.map +1 -0
  248. package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.d.ts +29 -0
  249. package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.d.ts.map +1 -0
  250. package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.js +161 -0
  251. package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.js.map +1 -0
  252. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts +39 -0
  253. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.d.ts.map +1 -0
  254. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js +91 -0
  255. package/dist/src/planner/rules/sort/rule-orderby-fd-pruning.js.map +1 -0
  256. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts +35 -0
  257. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.d.ts.map +1 -0
  258. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js +74 -0
  259. package/dist/src/planner/rules/subquery/rule-anti-join-fk-empty.js.map +1 -0
  260. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts +27 -0
  261. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.d.ts.map +1 -0
  262. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js +103 -0
  263. package/dist/src/planner/rules/subquery/rule-semi-join-fk-trivial.js.map +1 -0
  264. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.d.ts.map +1 -1
  265. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js +1 -25
  266. package/dist/src/planner/rules/subquery/rule-subquery-decorrelation.js.map +1 -1
  267. package/dist/src/planner/scopes/global.js +2 -2
  268. package/dist/src/planner/scopes/global.js.map +1 -1
  269. package/dist/src/planner/type-utils.d.ts.map +1 -1
  270. package/dist/src/planner/type-utils.js +11 -0
  271. package/dist/src/planner/type-utils.js.map +1 -1
  272. package/dist/src/planner/util/fd-utils.d.ts +245 -0
  273. package/dist/src/planner/util/fd-utils.d.ts.map +1 -0
  274. package/dist/src/planner/util/fd-utils.js +1416 -0
  275. package/dist/src/planner/util/fd-utils.js.map +1 -0
  276. package/dist/src/planner/util/ind-utils.d.ts +79 -0
  277. package/dist/src/planner/util/ind-utils.d.ts.map +1 -0
  278. package/dist/src/planner/util/ind-utils.js +146 -0
  279. package/dist/src/planner/util/ind-utils.js.map +1 -0
  280. package/dist/src/planner/util/key-utils.d.ts +75 -14
  281. package/dist/src/planner/util/key-utils.d.ts.map +1 -1
  282. package/dist/src/planner/util/key-utils.js +234 -57
  283. package/dist/src/planner/util/key-utils.js.map +1 -1
  284. package/dist/src/runtime/delta-executor.d.ts +134 -0
  285. package/dist/src/runtime/delta-executor.d.ts.map +1 -0
  286. package/dist/src/runtime/delta-executor.js +382 -0
  287. package/dist/src/runtime/delta-executor.js.map +1 -0
  288. package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
  289. package/dist/src/runtime/emit/alter-table.js +70 -24
  290. package/dist/src/runtime/emit/alter-table.js.map +1 -1
  291. package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -1
  292. package/dist/src/runtime/emit/create-assertion.js +3 -2
  293. package/dist/src/runtime/emit/create-assertion.js.map +1 -1
  294. package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
  295. package/dist/src/runtime/emit/dml-executor.js +121 -41
  296. package/dist/src/runtime/emit/dml-executor.js.map +1 -1
  297. package/dist/src/runtime/emit/drop-assertion.js +1 -1
  298. package/dist/src/runtime/emit/drop-assertion.js.map +1 -1
  299. package/dist/src/runtime/emit/empty-relation.d.ts +5 -0
  300. package/dist/src/runtime/emit/empty-relation.d.ts.map +1 -0
  301. package/dist/src/runtime/emit/empty-relation.js +11 -0
  302. package/dist/src/runtime/emit/empty-relation.js.map +1 -0
  303. package/dist/src/runtime/foreign-key-actions.d.ts +39 -0
  304. package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -1
  305. package/dist/src/runtime/foreign-key-actions.js +219 -1
  306. package/dist/src/runtime/foreign-key-actions.js.map +1 -1
  307. package/dist/src/runtime/register.d.ts.map +1 -1
  308. package/dist/src/runtime/register.js +2 -0
  309. package/dist/src/runtime/register.js.map +1 -1
  310. package/dist/src/schema/assertion.d.ts +8 -0
  311. package/dist/src/schema/assertion.d.ts.map +1 -1
  312. package/dist/src/schema/change-events.d.ts +5 -1
  313. package/dist/src/schema/change-events.d.ts.map +1 -1
  314. package/dist/src/schema/change-events.js.map +1 -1
  315. package/dist/src/schema/function.d.ts +65 -1
  316. package/dist/src/schema/function.d.ts.map +1 -1
  317. package/dist/src/schema/function.js +31 -0
  318. package/dist/src/schema/function.js.map +1 -1
  319. package/dist/src/schema/manager.d.ts +33 -0
  320. package/dist/src/schema/manager.d.ts.map +1 -1
  321. package/dist/src/schema/manager.js +95 -4
  322. package/dist/src/schema/manager.js.map +1 -1
  323. package/dist/src/schema/rename-rewriter.d.ts +32 -0
  324. package/dist/src/schema/rename-rewriter.d.ts.map +1 -1
  325. package/dist/src/schema/rename-rewriter.js +392 -105
  326. package/dist/src/schema/rename-rewriter.js.map +1 -1
  327. package/dist/src/schema/table.d.ts +21 -2
  328. package/dist/src/schema/table.d.ts.map +1 -1
  329. package/dist/src/schema/table.js +17 -8
  330. package/dist/src/schema/table.js.map +1 -1
  331. package/dist/src/types/temporal-types.d.ts.map +1 -1
  332. package/dist/src/types/temporal-types.js +32 -0
  333. package/dist/src/types/temporal-types.js.map +1 -1
  334. package/dist/src/vtab/events.d.ts +9 -0
  335. package/dist/src/vtab/events.d.ts.map +1 -1
  336. package/dist/src/vtab/events.js +19 -0
  337. package/dist/src/vtab/events.js.map +1 -1
  338. package/dist/src/vtab/memory/layer/connection.d.ts +20 -8
  339. package/dist/src/vtab/memory/layer/connection.d.ts.map +1 -1
  340. package/dist/src/vtab/memory/layer/connection.js +95 -73
  341. package/dist/src/vtab/memory/layer/connection.js.map +1 -1
  342. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  343. package/dist/src/vtab/memory/layer/manager.js +91 -10
  344. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  345. package/dist/src/vtab/memory/layer/transaction.d.ts +0 -8
  346. package/dist/src/vtab/memory/layer/transaction.d.ts.map +1 -1
  347. package/dist/src/vtab/memory/layer/transaction.js +0 -15
  348. package/dist/src/vtab/memory/layer/transaction.js.map +1 -1
  349. package/dist/src/vtab/memory/table.d.ts.map +1 -1
  350. package/dist/src/vtab/memory/table.js +13 -2
  351. package/dist/src/vtab/memory/table.js.map +1 -1
  352. package/dist/src/vtab/memory/utils/predicate.d.ts +2 -1
  353. package/dist/src/vtab/memory/utils/predicate.d.ts.map +1 -1
  354. package/dist/src/vtab/memory/utils/predicate.js +32 -1
  355. package/dist/src/vtab/memory/utils/predicate.js.map +1 -1
  356. package/package.json +3 -3
@@ -0,0 +1,382 @@
1
+ /**
2
+ * Delta executor kernel.
3
+ *
4
+ * A reusable dispatcher that any change-driven consumer (assertions today;
5
+ * materialized views, reactive signals, triggers tomorrow) can register
6
+ * subscriptions against. The kernel inspects per-subscription bindings
7
+ * (`BindingMode`), collects the relevant changed binding tuples from the
8
+ * TransactionManager's change capture, applies a cost-based fallback to
9
+ * global re-evaluation when too many tuples would need per-binding dispatch,
10
+ * and invokes the subscription's `apply` once with the resulting batches.
11
+ *
12
+ * The kernel itself is stateless across runs; subscriptions own their own
13
+ * residual plan cache (no shared cache, since plan-shape generation is
14
+ * consumer-specific).
15
+ */
16
+ import { createLogger } from '../common/logger.js';
17
+ import { QuereusError } from '../common/errors.js';
18
+ import { StatusCode } from '../common/types.js';
19
+ const log = createLogger('runtime:delta-executor');
20
+ /**
21
+ * Coordinates delta dispatch across all registered subscriptions.
22
+ */
23
+ export class DeltaExecutor {
24
+ ctx;
25
+ subscriptions = new Set();
26
+ constructor(ctx) {
27
+ this.ctx = ctx;
28
+ }
29
+ /**
30
+ * Register a subscription. Returns a dispose handle that removes the
31
+ * subscription and calls its `dispose()`.
32
+ */
33
+ register(sub) {
34
+ this.subscriptions.add(sub);
35
+ let disposed = false;
36
+ return () => {
37
+ if (disposed)
38
+ return;
39
+ disposed = true;
40
+ this.subscriptions.delete(sub);
41
+ sub.dispose();
42
+ };
43
+ }
44
+ /** Dispose all subscriptions. */
45
+ disposeAll() {
46
+ for (const sub of this.subscriptions) {
47
+ sub.dispose();
48
+ }
49
+ this.subscriptions.clear();
50
+ }
51
+ /**
52
+ * Run all impacted subscriptions. Throws on the first subscription's
53
+ * `apply` rejection — exceptions are surfaced unchanged so the COMMIT
54
+ * path can roll back.
55
+ */
56
+ async runAll() {
57
+ if (this.subscriptions.size === 0)
58
+ return;
59
+ const changedBases = this.ctx.getChangedBaseTables();
60
+ if (changedBases.size === 0)
61
+ return;
62
+ // Snapshot subscriptions before iterating: a handler that registers a
63
+ // new subscription mid-fire must not see the current commit, and one
64
+ // that unsubscribes a peer must still see in-flight apply complete.
65
+ const snapshot = [...this.subscriptions];
66
+ for (const sub of snapshot) {
67
+ if (!this.subscriptions.has(sub))
68
+ continue;
69
+ await this.runOne(sub, changedBases);
70
+ }
71
+ }
72
+ async runOne(sub, changedBases) {
73
+ // Quick skip: if no dependency of the subscription changed at all.
74
+ let any = false;
75
+ for (const dep of sub.dependencies) {
76
+ if (changedBases.has(dep)) {
77
+ any = true;
78
+ break;
79
+ }
80
+ }
81
+ if (!any)
82
+ return;
83
+ const perRelationTuples = new Map();
84
+ const globalRelations = new Set();
85
+ for (const [relKey, binding] of sub.bindings) {
86
+ const base = sub.relationToBase.get(relKey);
87
+ if (!base || !changedBases.has(base))
88
+ continue;
89
+ if (binding.kind === 'global') {
90
+ globalRelations.add(relKey);
91
+ continue;
92
+ }
93
+ const cols = binding.kind === 'row' ? binding.keyColumns : binding.groupColumns;
94
+ const pkIndices = sub.pkIndicesByBase.get(base);
95
+ if (!pkIndices) {
96
+ // No PK known for this base — can't fetch tuples; fall back to global.
97
+ log('No PK for base %s; falling back to global for %s', base, sub.id);
98
+ globalRelations.add(relKey);
99
+ continue;
100
+ }
101
+ let tuples;
102
+ try {
103
+ tuples = this.ctx.getChangedTuples(base, cols, pkIndices);
104
+ }
105
+ catch (e) {
106
+ // The requested columns aren't registered. Fall back to global
107
+ // for safety — the subscription forgot to register a CaptureSpec.
108
+ log('getChangedTuples failed for %s on %s (%s); falling back to global', sub.id, base, e.message);
109
+ globalRelations.add(relKey);
110
+ continue;
111
+ }
112
+ if (tuples.length === 0) {
113
+ // Dependency changed but no captured tuples touched this binding —
114
+ // nothing to dispatch for this relation.
115
+ continue;
116
+ }
117
+ // Cost fallback: if the number of distinct binding tuples is a large
118
+ // fraction of the base table size, doing N per-binding runs is likely
119
+ // worse than one global run.
120
+ const rowCount = this.ctx.getRowCount?.(base);
121
+ if (rowCount !== undefined && rowCount > 0) {
122
+ const ratio = tuples.length / rowCount;
123
+ if (ratio >= this.ctx.deltaPerRowFallbackRatio) {
124
+ log('Cost fallback for %s on %s: %d/%d ≥ %s — running global', sub.id, base, tuples.length, rowCount, this.ctx.deltaPerRowFallbackRatio);
125
+ globalRelations.add(relKey);
126
+ continue;
127
+ }
128
+ }
129
+ perRelationTuples.set(relKey, tuples);
130
+ }
131
+ if (perRelationTuples.size === 0 && globalRelations.size === 0) {
132
+ return;
133
+ }
134
+ const input = { perRelationTuples, globalRelations };
135
+ await sub.apply(input);
136
+ }
137
+ }
138
+ /** Synthetic relation key for the i-th watch in a scope. */
139
+ function relKeyForWatch(table, watchIndex) {
140
+ return `${baseKeyFor(table)}#watch_${watchIndex}`;
141
+ }
142
+ function baseKeyFor(table) {
143
+ // Defensive: the contract on `QualifiedName` says lowercased, but
144
+ // hand-built `ChangeScope` values may not honor it. The change log is
145
+ // keyed lowercased, so non-lowercased deps would never match.
146
+ return `${table.schema}.${table.table}`.toLowerCase();
147
+ }
148
+ /**
149
+ * Stable string key for an SqlValue tuple, used to intersect kernel-emitted
150
+ * tuples against a watch's literal `values`.
151
+ */
152
+ function tupleKey(tuple) {
153
+ const parts = [];
154
+ for (const v of tuple) {
155
+ if (v === null)
156
+ parts.push('null');
157
+ else if (typeof v === 'bigint')
158
+ parts.push(`b:${v.toString()}`);
159
+ else if (typeof v === 'number')
160
+ parts.push(`n:${v}`);
161
+ else if (typeof v === 'string')
162
+ parts.push(`s:${v}`);
163
+ else if (typeof v === 'boolean')
164
+ parts.push(`B:${v}`);
165
+ else if (v instanceof Uint8Array)
166
+ parts.push(`x:${Array.from(v).map(b => b.toString(16).padStart(2, '0')).join('')}`);
167
+ else
168
+ parts.push(`j:${JSON.stringify(v)}`);
169
+ }
170
+ return parts.join('|');
171
+ }
172
+ /**
173
+ * Resolve a column name on a base table or throw a clear error.
174
+ */
175
+ function resolveColumn(qname, info, name) {
176
+ const idx = info.columnIndexMap.get(name.toLowerCase());
177
+ if (idx === undefined) {
178
+ throw new QuereusError(`watch: column '${name}' does not exist on ${qname.schema}.${qname.table}`, StatusCode.ERROR);
179
+ }
180
+ return idx;
181
+ }
182
+ /**
183
+ * Translate a public `ChangeScope` into a `DeltaSubscription` plus its
184
+ * capture-spec dispose handles. Pure shape-translation: callers (i.e.
185
+ * `Database.watch`) own validation of unbound parameters, schema-change
186
+ * invalidation, and registration with the executor.
187
+ *
188
+ * Throws synchronously if:
189
+ * - any referenced table no longer exists in the schema;
190
+ * - any column referenced in `key` / `groupBy` / `columns` does not exist
191
+ * on its table.
192
+ */
193
+ export function subscriptionFromChangeScope(scope, handler, id, ctx) {
194
+ const bindings = new Map();
195
+ const relationToBase = new Map();
196
+ const pkIndicesByBase = new Map();
197
+ const dependencies = new Set();
198
+ const captureDisposers = [];
199
+ const plans = [];
200
+ scope.watches.forEach((watch, i) => {
201
+ const info = ctx.resolveTable(watch.table);
202
+ if (!info) {
203
+ throw new QuereusError(`watch: table ${watch.table.schema}.${watch.table.table} does not exist`, StatusCode.ERROR);
204
+ }
205
+ const base = baseKeyFor(watch.table);
206
+ const relKey = relKeyForWatch(watch.table, i);
207
+ dependencies.add(base);
208
+ relationToBase.set(relKey, base);
209
+ if (!pkIndicesByBase.has(base)) {
210
+ pkIndicesByBase.set(base, info.pkIndices);
211
+ }
212
+ const extras = new Set();
213
+ const pkSet = new Set(info.pkIndices);
214
+ const recordExtras = (cols) => {
215
+ for (const c of cols) {
216
+ if (!pkSet.has(c))
217
+ extras.add(c);
218
+ }
219
+ };
220
+ let mode;
221
+ let literalValues = [];
222
+ switch (watch.scope.kind) {
223
+ case 'full': {
224
+ mode = { kind: 'global' };
225
+ if (watch.columns !== 'all') {
226
+ for (const name of watch.columns) {
227
+ const idx = resolveColumn(watch.table, info, name);
228
+ if (!pkSet.has(idx))
229
+ extras.add(idx);
230
+ }
231
+ }
232
+ break;
233
+ }
234
+ case 'rows': {
235
+ const keyCols = watch.scope.key.map(n => resolveColumn(watch.table, info, n));
236
+ literalValues = literalValuesOnly(watch.scope.values);
237
+ recordExtras(keyCols);
238
+ mode = { kind: 'row', keyColumns: keyCols };
239
+ break;
240
+ }
241
+ case 'groups': {
242
+ const groupCols = watch.scope.groupBy.map(n => resolveColumn(watch.table, info, n));
243
+ recordExtras(groupCols);
244
+ mode = { kind: 'group', groupColumns: groupCols };
245
+ break;
246
+ }
247
+ case 'rowsByGroup': {
248
+ const groupCols = watch.scope.groupBy.map(n => resolveColumn(watch.table, info, n));
249
+ literalValues = literalValuesOnly(watch.scope.values);
250
+ recordExtras(groupCols);
251
+ mode = { kind: 'group', groupColumns: groupCols };
252
+ break;
253
+ }
254
+ }
255
+ bindings.set(relKey, mode);
256
+ if (extras.size > 0) {
257
+ captureDisposers.push(ctx.registerCaptureSpec(base, { extraColumns: extras }));
258
+ }
259
+ plans.push({ watch, relKey, base, literalValues });
260
+ });
261
+ const apply = async (input) => {
262
+ const matched = [];
263
+ for (const plan of plans) {
264
+ const { watch, relKey, literalValues } = plan;
265
+ const isGlobal = input.globalRelations.has(relKey);
266
+ const kernelTuples = input.perRelationTuples.get(relKey);
267
+ if (!isGlobal && !kernelTuples) {
268
+ // No change for this watch's base; skip.
269
+ continue;
270
+ }
271
+ let hits;
272
+ let observable;
273
+ switch (watch.scope.kind) {
274
+ case 'full': {
275
+ // Column-narrowing for `full + columns` is best-effort in v1:
276
+ // we register a capture spec but always fire on any change.
277
+ hits = [];
278
+ // Fire whenever the table was touched (kernel signals via
279
+ // globalRelations for 'global' bindings).
280
+ observable = isGlobal;
281
+ break;
282
+ }
283
+ case 'rows': {
284
+ if (isGlobal) {
285
+ // Kernel fell back to global; we can't narrow precisely.
286
+ // Surface every literal value the watch was registered
287
+ // for so the handler treats them all as possibly-changed.
288
+ hits = literalValues;
289
+ observable = hits.length > 0;
290
+ }
291
+ else {
292
+ hits = intersectTuples(kernelTuples ?? [], literalValues);
293
+ observable = hits.length > 0;
294
+ }
295
+ break;
296
+ }
297
+ case 'groups': {
298
+ hits = isGlobal ? [] : (kernelTuples ?? []);
299
+ observable = hits.length > 0;
300
+ break;
301
+ }
302
+ case 'rowsByGroup': {
303
+ if (isGlobal) {
304
+ hits = literalValues;
305
+ }
306
+ else {
307
+ hits = intersectTuples(kernelTuples ?? [], literalValues);
308
+ }
309
+ observable = hits.length > 0;
310
+ break;
311
+ }
312
+ }
313
+ if (observable)
314
+ matched.push({ watch, hits });
315
+ }
316
+ if (matched.length === 0)
317
+ return;
318
+ const event = { matched, txnId: ctx.getCurrentTxnId() };
319
+ try {
320
+ const r = handler(event);
321
+ if (r && typeof r.then === 'function') {
322
+ await r;
323
+ }
324
+ }
325
+ catch (err) {
326
+ log('Watch handler %s threw: %O', id, err);
327
+ }
328
+ };
329
+ const subscription = {
330
+ id,
331
+ dependencies,
332
+ bindings,
333
+ relationToBase,
334
+ pkIndicesByBase,
335
+ apply,
336
+ dispose: () => { },
337
+ };
338
+ return { subscription, captureDisposers };
339
+ }
340
+ /**
341
+ * Filter a ScopeValue-tuple list to literal-only tuples.
342
+ *
343
+ * `Database.watch` rejects scopes with `unboundParameters.length > 0` up
344
+ * front, so by the time we reach here, any surviving `ParamScopeValue`
345
+ * placeholders represent a caller-side bug; we drop them defensively
346
+ * rather than throw deep in the runtime path.
347
+ */
348
+ function literalValuesOnly(values) {
349
+ const out = [];
350
+ for (const tuple of values) {
351
+ let allLiteral = true;
352
+ const lit = [];
353
+ for (const v of tuple) {
354
+ if (v !== null && typeof v === 'object' && !(v instanceof Uint8Array) && !Array.isArray(v) && v.kind === 'param') {
355
+ allLiteral = false;
356
+ break;
357
+ }
358
+ lit.push(v);
359
+ }
360
+ if (allLiteral)
361
+ out.push(lit);
362
+ }
363
+ return out;
364
+ }
365
+ function intersectTuples(kernel, watch) {
366
+ if (watch.length === 0)
367
+ return [];
368
+ const watchKeys = new Set();
369
+ for (const t of watch)
370
+ watchKeys.add(tupleKey(t));
371
+ const out = [];
372
+ const seen = new Set();
373
+ for (const kt of kernel) {
374
+ const k = tupleKey(kt);
375
+ if (!watchKeys.has(k) || seen.has(k))
376
+ continue;
377
+ seen.add(k);
378
+ out.push([...kt]);
379
+ }
380
+ return out;
381
+ }
382
+ //# sourceMappingURL=delta-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta-executor.js","sourceRoot":"","sources":["../../../src/runtime/delta-executor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"alter-table.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/alter-table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAkC,MAAM,aAAa,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,OAAO,KAAK,EAAE,WAAW,EAAE,0BAA0B,EAAmD,MAAM,uBAAuB,CAAC;AAUtI,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,GAAG,WAAW,CA2CvF;AA2mBD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAClC,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,EAAE,EAC1B,QAAQ,EAAE,0BAA0B,EAAE,GACpC,MAAM,CA4CR"}
1
+ {"version":3,"file":"alter-table.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/alter-table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAkC,MAAM,aAAa,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,OAAO,KAAK,EAAE,WAAW,EAAE,0BAA0B,EAAmD,MAAM,uBAAuB,CAAC;AAkBtI,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,GAAG,WAAW,CA2CvF;AAypBD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAClC,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,EAAE,EAC1B,QAAQ,EAAE,0BAA0B,EAAE,GACpC,MAAM,CAuCR"}
@@ -4,8 +4,15 @@ import { createLogger } from '../../common/logger.js';
4
4
  import { buildColumnIndexMap, opsToMask, withGeneratedColumnGraph } from '../../schema/table.js';
5
5
  import { MemoryTableModule } from '../../vtab/memory/module.js';
6
6
  import { quoteIdentifier, expressionToString, selectToString } from '../../emit/ast-stringify.js';
7
- import { renameTableInAst, renameColumnInAst } from '../../schema/rename-rewriter.js';
7
+ import { renameTableInAst, renameColumnInAst, renameColumnInCheckExpression } from '../../schema/rename-rewriter.js';
8
+ import { tryFoldLiteral } from '../../parser/utils.js';
8
9
  const log = createLogger('runtime:emit:alter-table');
10
+ function qualifyTableName(schemaName, tableName) {
11
+ const prefix = (schemaName && schemaName.toLowerCase() !== 'main')
12
+ ? `${quoteIdentifier(schemaName)}.`
13
+ : '';
14
+ return `${prefix}${quoteIdentifier(tableName)}`;
15
+ }
9
16
  export function emitAlterTable(plan, _ctx) {
10
17
  const tableSchema = plan.table.tableSchema;
11
18
  const action = plan.action;
@@ -142,11 +149,31 @@ async function runAddColumn(rctx, tableSchema, schema, columnDef) {
142
149
  if (columnDef.constraints?.some(c => c.type === 'primaryKey')) {
143
150
  throw new QuereusError(`Cannot add a PRIMARY KEY column via ALTER TABLE`, StatusCode.ERROR);
144
151
  }
152
+ // Reject non-foldable DEFAULT expressions at DDL time. ADD COLUMN backfills
153
+ // existing rows with the DEFAULT value, so the expression must evaluate to a
154
+ // concrete literal at ALTER time. Column references, bind parameters, and
155
+ // non-deterministic function calls don't fold and are rejected per the
156
+ // determinism rule (consistent with CREATE TABLE's DEFAULT validation).
157
+ const defaultConstraint = columnDef.constraints?.find(c => c.type === 'default');
158
+ if (defaultConstraint && defaultConstraint.expr && tryFoldLiteral(defaultConstraint.expr) === undefined) {
159
+ throw new QuereusError(`ALTER TABLE ADD COLUMN DEFAULT for '${columnDef.name}' must fold to a literal — column references, bind parameters, and non-deterministic expressions are not allowed`, StatusCode.ERROR);
160
+ }
145
161
  // Call module.alterTable for data + schema update
146
162
  const module = tableSchema.vtabModule;
147
163
  if (!module.alterTable) {
148
164
  throw new QuereusError(`Module for table '${tableSchema.name}' does not support ALTER TABLE ADD COLUMN`, StatusCode.UNSUPPORTED);
149
165
  }
166
+ // NOT NULL without a usable DEFAULT cannot backfill existing rows. A DEFAULT whose
167
+ // folded value is NULL is equivalent to "no DEFAULT" for this purpose. If the table
168
+ // is non-empty, reject before mutating any schema or data.
169
+ const hasNotNull = columnDef.constraints?.some(c => c.type === 'notNull') ?? false;
170
+ if (hasNotNull) {
171
+ const folded = defaultConstraint?.expr ? tryFoldLiteral(defaultConstraint.expr) : undefined;
172
+ const defaultIsNullish = !defaultConstraint || folded === undefined || folded === null;
173
+ if (defaultIsNullish) {
174
+ await validateNotNullBackfill(rctx, tableSchema, columnDef.name);
175
+ }
176
+ }
150
177
  // Extract column-level CHECK / FK constraints. Column-level UNIQUE is not enforced via
151
178
  // table-level constraints; the existing rejection path in the manager handles it.
152
179
  const newCheckConstraints = extractColumnLevelCheckConstraints(columnDef);
@@ -258,10 +285,7 @@ function extractColumnLevelForeignKeys(columnDef, defaultSchemaName) {
258
285
  * `not (<check_expr>)` is a violation and aborts the ALTER.
259
286
  */
260
287
  async function validateBackfillAgainstChecks(rctx, enhancedTableSchema, newCheckConstraints) {
261
- const schemaPrefix = (enhancedTableSchema.schemaName && enhancedTableSchema.schemaName.toLowerCase() !== 'main')
262
- ? `${quoteIdentifier(enhancedTableSchema.schemaName)}.`
263
- : '';
264
- const qualifiedTable = `${schemaPrefix}${quoteIdentifier(enhancedTableSchema.name)}`;
288
+ const qualifiedTable = qualifyTableName(enhancedTableSchema.schemaName, enhancedTableSchema.name);
265
289
  for (const cc of newCheckConstraints) {
266
290
  const checkSql = expressionToString(cc.expr);
267
291
  const sql = `select 1 from ${qualifiedTable} where not (${checkSql}) limit 1`;
@@ -281,6 +305,23 @@ async function validateBackfillAgainstChecks(rctx, enhancedTableSchema, newCheck
281
305
  }
282
306
  }
283
307
  }
308
+ /**
309
+ * Rejects ADD COLUMN ... NOT NULL when no usable DEFAULT is supplied and the
310
+ * table already has rows. The pre-mutation form means no rollback is needed —
311
+ * the schema and module state are still untouched at this point.
312
+ */
313
+ async function validateNotNullBackfill(rctx, tableSchema, newColumnName) {
314
+ const qualifiedTable = qualifyTableName(tableSchema.schemaName, tableSchema.name);
315
+ const stmt = rctx.db.prepare(`select 1 from ${qualifiedTable} limit 1`);
316
+ try {
317
+ for await (const _row of stmt._iterateRowsRaw()) {
318
+ throw new QuereusError(`NOT NULL constraint failed for column '${newColumnName}' added to ${tableSchema.schemaName}.${tableSchema.name} — column has no DEFAULT and existing rows cannot be backfilled`, StatusCode.CONSTRAINT);
319
+ }
320
+ }
321
+ finally {
322
+ await stmt.finalize();
323
+ }
324
+ }
284
325
  async function runDropColumn(rctx, tableSchema, schema, columnName) {
285
326
  const colIndex = tableSchema.columnIndexMap.get(columnName.toLowerCase());
286
327
  if (colIndex === undefined) {
@@ -529,10 +570,6 @@ async function rebuildMemoryTable(rctx, tableSchema, schema, module, survivingCo
529
570
  * the shadow table faithfully mirrors the original schema.
530
571
  */
531
572
  export function buildShadowTableDdl(tableSchema, shadowName, survivingColumns, newPkDef) {
532
- const schemaName = tableSchema.schemaName;
533
- const schemaPrefix = (schemaName && schemaName.toLowerCase() !== 'main')
534
- ? `${quoteIdentifier(schemaName)}.`
535
- : '';
536
573
  const colDefs = [];
537
574
  for (const colName of survivingColumns) {
538
575
  const idx = tableSchema.columnIndexMap.get(colName.toLowerCase());
@@ -556,7 +593,7 @@ export function buildShadowTableDdl(tableSchema, shadowName, survivingColumns, n
556
593
  entry += ' desc';
557
594
  pkColNames.push(entry);
558
595
  }
559
- let createDdl = `create table ${schemaPrefix}${quoteIdentifier(shadowName)} (${colDefs.join(', ')}`;
596
+ let createDdl = `create table ${qualifyTableName(tableSchema.schemaName, shadowName)} (${colDefs.join(', ')}`;
560
597
  createDdl += pkColNames.length > 0
561
598
  ? `, primary key (${pkColNames.join(', ')}))`
562
599
  : `)`;
@@ -577,21 +614,20 @@ export function buildShadowTableDdl(tableSchema, shadowName, survivingColumns, n
577
614
  async function rebuildViaShadowTable(rctx, tableSchema, schema, survivingColumns, newPkDef) {
578
615
  const tableName = tableSchema.name;
579
616
  const schemaName = tableSchema.schemaName;
580
- const schemaPrefix = (schemaName && schemaName.toLowerCase() !== 'main')
581
- ? `${quoteIdentifier(schemaName)}.`
582
- : '';
583
617
  const shadowName = `${tableName}__rekey_${Date.now()}`;
618
+ const qualifiedShadow = qualifyTableName(schemaName, shadowName);
619
+ const qualifiedTable = qualifyTableName(schemaName, tableName);
584
620
  const createDdl = buildShadowTableDdl(tableSchema, shadowName, survivingColumns, newPkDef);
585
621
  const projection = survivingColumns.map(c => quoteIdentifier(c)).join(', ');
586
622
  try {
587
623
  await rctx.db._execWithinTransaction(createDdl);
588
- await rctx.db._execWithinTransaction(`insert into ${schemaPrefix}${quoteIdentifier(shadowName)} (${projection}) select ${projection} from ${schemaPrefix}${quoteIdentifier(tableName)}`);
589
- await rctx.db._execWithinTransaction(`drop table ${schemaPrefix}${quoteIdentifier(tableName)}`);
590
- await rctx.db._execWithinTransaction(`alter table ${schemaPrefix}${quoteIdentifier(shadowName)} rename to ${quoteIdentifier(tableName)}`);
624
+ await rctx.db._execWithinTransaction(`insert into ${qualifiedShadow} (${projection}) select ${projection} from ${qualifiedTable}`);
625
+ await rctx.db._execWithinTransaction(`drop table ${qualifiedTable}`);
626
+ await rctx.db._execWithinTransaction(`alter table ${qualifiedShadow} rename to ${quoteIdentifier(tableName)}`);
591
627
  }
592
628
  catch (e) {
593
629
  try {
594
- await rctx.db._execWithinTransaction(`drop table if exists ${schemaPrefix}${quoteIdentifier(shadowName)}`);
630
+ await rctx.db._execWithinTransaction(`drop table if exists ${qualifiedShadow}`);
595
631
  }
596
632
  catch { /* ignore */ }
597
633
  throw e;
@@ -666,15 +702,21 @@ function rewriteTableForTableRename(table, renamedSchemaLower, oldName, newName)
666
702
  });
667
703
  }
668
704
  function propagateColumnRename(rctx, renamedSchemaName, tableName, oldCol, newCol) {
669
- const notifier = rctx.db.schemaManager.getChangeNotifier();
670
- for (const schema of rctx.db.schemaManager._getAllSchemas()) {
671
- propagateColumnRenameInSchema(schema, renamedSchemaName, tableName, oldCol, newCol, notifier);
705
+ const schemaManager = rctx.db.schemaManager;
706
+ const notifier = schemaManager.getChangeNotifier();
707
+ const resolveColumnInSource = (s, t, col) => {
708
+ const targetSchema = schemaManager.getSchema(s);
709
+ const targetTable = targetSchema?.getTable(t);
710
+ return targetTable?.columnIndexMap.has(col.toLowerCase()) ?? false;
711
+ };
712
+ for (const schema of schemaManager._getAllSchemas()) {
713
+ propagateColumnRenameInSchema(schema, renamedSchemaName, tableName, oldCol, newCol, notifier, resolveColumnInSource);
672
714
  }
673
715
  }
674
- function propagateColumnRenameInSchema(schema, renamedSchemaName, tableName, oldCol, newCol, notifier) {
716
+ function propagateColumnRenameInSchema(schema, renamedSchemaName, tableName, oldCol, newCol, notifier, resolveColumnInSource) {
675
717
  const renamedSchemaLower = renamedSchemaName.toLowerCase();
676
718
  for (const table of Array.from(schema.getAllTables())) {
677
- const updated = rewriteTableForColumnRename(table, renamedSchemaLower, tableName, oldCol, newCol);
719
+ const updated = rewriteTableForColumnRename(table, renamedSchemaLower, tableName, oldCol, newCol, resolveColumnInSource);
678
720
  if (updated !== table) {
679
721
  schema.addTable(updated);
680
722
  notifier.notifyChange({
@@ -696,12 +738,16 @@ function propagateColumnRenameInSchema(schema, renamedSchemaName, tableName, old
696
738
  }
697
739
  }
698
740
  }
699
- function rewriteTableForColumnRename(table, renamedSchemaLower, tableName, oldCol, newCol) {
741
+ function rewriteTableForColumnRename(table, renamedSchemaLower, tableName, oldCol, newCol, resolveColumnInSource) {
700
742
  const oldColLower = oldCol.toLowerCase();
701
743
  const tableLower = tableName.toLowerCase();
744
+ const isRenamedTable = table.schemaName.toLowerCase() === renamedSchemaLower &&
745
+ table.name.toLowerCase() === tableLower;
702
746
  let changed = false;
703
747
  const newChecks = table.checkConstraints.map(cc => {
704
- const rewrote = renameColumnInAst(cc.expr, tableName, oldCol, newCol, renamedSchemaLower);
748
+ const rewrote = isRenamedTable
749
+ ? renameColumnInCheckExpression(cc.expr, tableName, oldCol, newCol, renamedSchemaLower, resolveColumnInSource)
750
+ : renameColumnInAst(cc.expr, tableName, oldCol, newCol, renamedSchemaLower);
705
751
  if (!rewrote)
706
752
  return cc;
707
753
  changed = true;