@quereus/quereus 4.10.0 → 4.12.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 (457) hide show
  1. package/dist/src/common/type-inference.d.ts +12 -6
  2. package/dist/src/common/type-inference.d.ts.map +1 -1
  3. package/dist/src/common/type-inference.js +12 -24
  4. package/dist/src/common/type-inference.js.map +1 -1
  5. package/dist/src/core/database-assertions.d.ts.map +1 -1
  6. package/dist/src/core/database-assertions.js +7 -5
  7. package/dist/src/core/database-assertions.js.map +1 -1
  8. package/dist/src/core/database-events.d.ts +4 -3
  9. package/dist/src/core/database-events.d.ts.map +1 -1
  10. package/dist/src/core/database-events.js +4 -3
  11. package/dist/src/core/database-events.js.map +1 -1
  12. package/dist/src/core/database-materialized-views-analysis.d.ts +1 -3
  13. package/dist/src/core/database-materialized-views-analysis.d.ts.map +1 -1
  14. package/dist/src/core/database-materialized-views-analysis.js +1 -11
  15. package/dist/src/core/database-materialized-views-analysis.js.map +1 -1
  16. package/dist/src/core/database-materialized-views-plan-builders.d.ts.map +1 -1
  17. package/dist/src/core/database-materialized-views-plan-builders.js +12 -10
  18. package/dist/src/core/database-materialized-views-plan-builders.js.map +1 -1
  19. package/dist/src/core/database.d.ts.map +1 -1
  20. package/dist/src/core/database.js +13 -2
  21. package/dist/src/core/database.js.map +1 -1
  22. package/dist/src/core/derived-row-validator.d.ts.map +1 -1
  23. package/dist/src/core/derived-row-validator.js +14 -2
  24. package/dist/src/core/derived-row-validator.js.map +1 -1
  25. package/dist/src/core/param.d.ts +9 -0
  26. package/dist/src/core/param.d.ts.map +1 -1
  27. package/dist/src/core/param.js +21 -1
  28. package/dist/src/core/param.js.map +1 -1
  29. package/dist/src/core/statement.d.ts.map +1 -1
  30. package/dist/src/core/statement.js +38 -15
  31. package/dist/src/core/statement.js.map +1 -1
  32. package/dist/src/func/builtins/aggregate.d.ts.map +1 -1
  33. package/dist/src/func/builtins/aggregate.js +7 -2
  34. package/dist/src/func/builtins/aggregate.js.map +1 -1
  35. package/dist/src/func/builtins/builtin-window-functions.d.ts.map +1 -1
  36. package/dist/src/func/builtins/builtin-window-functions.js +27 -11
  37. package/dist/src/func/builtins/builtin-window-functions.js.map +1 -1
  38. package/dist/src/func/builtins/datetime.d.ts.map +1 -1
  39. package/dist/src/func/builtins/datetime.js +8 -3
  40. package/dist/src/func/builtins/datetime.js.map +1 -1
  41. package/dist/src/func/builtins/explain.d.ts.map +1 -1
  42. package/dist/src/func/builtins/explain.js +9 -29
  43. package/dist/src/func/builtins/explain.js.map +1 -1
  44. package/dist/src/func/builtins/json-tvf.d.ts.map +1 -1
  45. package/dist/src/func/builtins/json-tvf.js +14 -7
  46. package/dist/src/func/builtins/json-tvf.js.map +1 -1
  47. package/dist/src/func/builtins/return-types.d.ts +29 -0
  48. package/dist/src/func/builtins/return-types.d.ts.map +1 -1
  49. package/dist/src/func/builtins/return-types.js +4 -1
  50. package/dist/src/func/builtins/return-types.js.map +1 -1
  51. package/dist/src/func/builtins/scalar.d.ts.map +1 -1
  52. package/dist/src/func/builtins/scalar.js +22 -67
  53. package/dist/src/func/builtins/scalar.js.map +1 -1
  54. package/dist/src/func/builtins/schema.d.ts.map +1 -1
  55. package/dist/src/func/builtins/schema.js +26 -16
  56. package/dist/src/func/builtins/schema.js.map +1 -1
  57. package/dist/src/index.d.ts +1 -1
  58. package/dist/src/index.d.ts.map +1 -1
  59. package/dist/src/index.js +6 -1
  60. package/dist/src/index.js.map +1 -1
  61. package/dist/src/parser/parser.d.ts.map +1 -1
  62. package/dist/src/parser/parser.js +5 -3
  63. package/dist/src/parser/parser.js.map +1 -1
  64. package/dist/src/parser/visitor.d.ts +16 -0
  65. package/dist/src/parser/visitor.d.ts.map +1 -1
  66. package/dist/src/parser/visitor.js +16 -0
  67. package/dist/src/parser/visitor.js.map +1 -1
  68. package/dist/src/planner/analysis/assertion-plan.d.ts +33 -0
  69. package/dist/src/planner/analysis/assertion-plan.d.ts.map +1 -0
  70. package/dist/src/planner/analysis/assertion-plan.js +39 -0
  71. package/dist/src/planner/analysis/assertion-plan.js.map +1 -0
  72. package/dist/src/planner/analysis/binary-operator-class.d.ts +55 -0
  73. package/dist/src/planner/analysis/binary-operator-class.d.ts.map +1 -0
  74. package/dist/src/planner/analysis/binary-operator-class.js +57 -0
  75. package/dist/src/planner/analysis/binary-operator-class.js.map +1 -0
  76. package/dist/src/planner/analysis/binding-extractor.d.ts +9 -3
  77. package/dist/src/planner/analysis/binding-extractor.d.ts.map +1 -1
  78. package/dist/src/planner/analysis/binding-extractor.js +11 -16
  79. package/dist/src/planner/analysis/binding-extractor.js.map +1 -1
  80. package/dist/src/planner/analysis/change-scope.d.ts.map +1 -1
  81. package/dist/src/planner/analysis/change-scope.js +19 -6
  82. package/dist/src/planner/analysis/change-scope.js.map +1 -1
  83. package/dist/src/planner/analysis/check-extraction.d.ts +1 -7
  84. package/dist/src/planner/analysis/check-extraction.d.ts.map +1 -1
  85. package/dist/src/planner/analysis/check-extraction.js.map +1 -1
  86. package/dist/src/planner/analysis/comparison-collation.d.ts +17 -0
  87. package/dist/src/planner/analysis/comparison-collation.d.ts.map +1 -1
  88. package/dist/src/planner/analysis/comparison-collation.js +17 -5
  89. package/dist/src/planner/analysis/comparison-collation.js.map +1 -1
  90. package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
  91. package/dist/src/planner/analysis/constraint-extractor.js +18 -18
  92. package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
  93. package/dist/src/planner/analysis/coverage-prover.d.ts +11 -7
  94. package/dist/src/planner/analysis/coverage-prover.d.ts.map +1 -1
  95. package/dist/src/planner/analysis/coverage-prover.js +11 -7
  96. package/dist/src/planner/analysis/coverage-prover.js.map +1 -1
  97. package/dist/src/planner/analysis/equi-correlation.d.ts +1 -1
  98. package/dist/src/planner/analysis/equi-correlation.js +1 -1
  99. package/dist/src/planner/analysis/expression-fingerprint.d.ts.map +1 -1
  100. package/dist/src/planner/analysis/expression-fingerprint.js +0 -2
  101. package/dist/src/planner/analysis/expression-fingerprint.js.map +1 -1
  102. package/dist/src/planner/analysis/key-filter.d.ts.map +1 -1
  103. package/dist/src/planner/analysis/key-filter.js +2 -3
  104. package/dist/src/planner/analysis/key-filter.js.map +1 -1
  105. package/dist/src/planner/analysis/relation-key.d.ts +104 -0
  106. package/dist/src/planner/analysis/relation-key.d.ts.map +1 -0
  107. package/dist/src/planner/analysis/relation-key.js +121 -0
  108. package/dist/src/planner/analysis/relation-key.js.map +1 -0
  109. package/dist/src/planner/analysis/scalar-param-usage.d.ts.map +1 -1
  110. package/dist/src/planner/analysis/scalar-param-usage.js +12 -4
  111. package/dist/src/planner/analysis/scalar-param-usage.js.map +1 -1
  112. package/dist/src/planner/analysis/set-op-type-merge.d.ts +9 -3
  113. package/dist/src/planner/analysis/set-op-type-merge.d.ts.map +1 -1
  114. package/dist/src/planner/analysis/set-op-type-merge.js +22 -8
  115. package/dist/src/planner/analysis/set-op-type-merge.js.map +1 -1
  116. package/dist/src/planner/building/alter-table.d.ts.map +1 -1
  117. package/dist/src/planner/building/alter-table.js +31 -23
  118. package/dist/src/planner/building/alter-table.js.map +1 -1
  119. package/dist/src/planner/building/analyze.d.ts.map +1 -1
  120. package/dist/src/planner/building/analyze.js +21 -0
  121. package/dist/src/planner/building/analyze.js.map +1 -1
  122. package/dist/src/planner/building/block.d.ts.map +1 -1
  123. package/dist/src/planner/building/block.js +222 -82
  124. package/dist/src/planner/building/block.js.map +1 -1
  125. package/dist/src/planner/building/constraint-builder.d.ts +3 -2
  126. package/dist/src/planner/building/constraint-builder.d.ts.map +1 -1
  127. package/dist/src/planner/building/constraint-builder.js +20 -27
  128. package/dist/src/planner/building/constraint-builder.js.map +1 -1
  129. package/dist/src/planner/building/delete.d.ts.map +1 -1
  130. package/dist/src/planner/building/delete.js +8 -25
  131. package/dist/src/planner/building/delete.js.map +1 -1
  132. package/dist/src/planner/building/expression.d.ts.map +1 -1
  133. package/dist/src/planner/building/expression.js +11 -3
  134. package/dist/src/planner/building/expression.js.map +1 -1
  135. package/dist/src/planner/building/foreign-key-builder.d.ts +19 -8
  136. package/dist/src/planner/building/foreign-key-builder.d.ts.map +1 -1
  137. package/dist/src/planner/building/foreign-key-builder.js +56 -37
  138. package/dist/src/planner/building/foreign-key-builder.js.map +1 -1
  139. package/dist/src/planner/building/generated-column-scope.d.ts +58 -0
  140. package/dist/src/planner/building/generated-column-scope.d.ts.map +1 -0
  141. package/dist/src/planner/building/generated-column-scope.js +117 -0
  142. package/dist/src/planner/building/generated-column-scope.js.map +1 -0
  143. package/dist/src/planner/building/insert.d.ts.map +1 -1
  144. package/dist/src/planner/building/insert.js +36 -60
  145. package/dist/src/planner/building/insert.js.map +1 -1
  146. package/dist/src/planner/building/mutation-context.d.ts +63 -0
  147. package/dist/src/planner/building/mutation-context.d.ts.map +1 -0
  148. package/dist/src/planner/building/mutation-context.js +126 -0
  149. package/dist/src/planner/building/mutation-context.js.map +1 -0
  150. package/dist/src/planner/building/select-aggregates.d.ts +73 -132
  151. package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
  152. package/dist/src/planner/building/select-aggregates.js +405 -81
  153. package/dist/src/planner/building/select-aggregates.js.map +1 -1
  154. package/dist/src/planner/building/select-modifiers.d.ts +37 -8
  155. package/dist/src/planner/building/select-modifiers.d.ts.map +1 -1
  156. package/dist/src/planner/building/select-modifiers.js +8 -9
  157. package/dist/src/planner/building/select-modifiers.js.map +1 -1
  158. package/dist/src/planner/building/select-ordinal.d.ts +6 -0
  159. package/dist/src/planner/building/select-ordinal.d.ts.map +1 -1
  160. package/dist/src/planner/building/select-ordinal.js +1 -1
  161. package/dist/src/planner/building/select-ordinal.js.map +1 -1
  162. package/dist/src/planner/building/select-window.d.ts +2 -2
  163. package/dist/src/planner/building/select-window.d.ts.map +1 -1
  164. package/dist/src/planner/building/select-window.js +82 -101
  165. package/dist/src/planner/building/select-window.js.map +1 -1
  166. package/dist/src/planner/building/select.d.ts.map +1 -1
  167. package/dist/src/planner/building/select.js +78 -33
  168. package/dist/src/planner/building/select.js.map +1 -1
  169. package/dist/src/planner/building/update.d.ts.map +1 -1
  170. package/dist/src/planner/building/update.js +21 -32
  171. package/dist/src/planner/building/update.js.map +1 -1
  172. package/dist/src/planner/building/view-mutation-builder.d.ts.map +1 -1
  173. package/dist/src/planner/building/view-mutation-builder.js +329 -14
  174. package/dist/src/planner/building/view-mutation-builder.js.map +1 -1
  175. package/dist/src/planner/building/with.d.ts +6 -0
  176. package/dist/src/planner/building/with.d.ts.map +1 -1
  177. package/dist/src/planner/building/with.js +52 -3
  178. package/dist/src/planner/building/with.js.map +1 -1
  179. package/dist/src/planner/cache/correlation-detector.d.ts.map +1 -1
  180. package/dist/src/planner/cache/correlation-detector.js +44 -17
  181. package/dist/src/planner/cache/correlation-detector.js.map +1 -1
  182. package/dist/src/planner/framework/physical-utils.d.ts +6 -0
  183. package/dist/src/planner/framework/physical-utils.d.ts.map +1 -1
  184. package/dist/src/planner/framework/physical-utils.js +6 -0
  185. package/dist/src/planner/framework/physical-utils.js.map +1 -1
  186. package/dist/src/planner/mutation/lens-enforcement.d.ts +123 -0
  187. package/dist/src/planner/mutation/lens-enforcement.d.ts.map +1 -1
  188. package/dist/src/planner/mutation/lens-enforcement.js +362 -5
  189. package/dist/src/planner/mutation/lens-enforcement.js.map +1 -1
  190. package/dist/src/planner/mutation/mutation-diagnostic.d.ts +1 -1
  191. package/dist/src/planner/mutation/mutation-diagnostic.d.ts.map +1 -1
  192. package/dist/src/planner/mutation/mutation-diagnostic.js.map +1 -1
  193. package/dist/src/planner/nodes/alter-table-node.d.ts +15 -11
  194. package/dist/src/planner/nodes/alter-table-node.d.ts.map +1 -1
  195. package/dist/src/planner/nodes/alter-table-node.js +5 -0
  196. package/dist/src/planner/nodes/alter-table-node.js.map +1 -1
  197. package/dist/src/planner/nodes/bloom-join-node.d.ts.map +1 -1
  198. package/dist/src/planner/nodes/bloom-join-node.js +7 -0
  199. package/dist/src/planner/nodes/bloom-join-node.js.map +1 -1
  200. package/dist/src/planner/nodes/constraint-check-node.d.ts +16 -0
  201. package/dist/src/planner/nodes/constraint-check-node.d.ts.map +1 -1
  202. package/dist/src/planner/nodes/constraint-check-node.js.map +1 -1
  203. package/dist/src/planner/nodes/plan-node-type.d.ts +1 -1
  204. package/dist/src/planner/nodes/plan-node-type.d.ts.map +1 -1
  205. package/dist/src/planner/nodes/plan-node-type.js +1 -1
  206. package/dist/src/planner/nodes/plan-node-type.js.map +1 -1
  207. package/dist/src/planner/nodes/pragma.d.ts.map +1 -1
  208. package/dist/src/planner/nodes/pragma.js +5 -2
  209. package/dist/src/planner/nodes/pragma.js.map +1 -1
  210. package/dist/src/planner/nodes/reference.d.ts.map +1 -1
  211. package/dist/src/planner/nodes/reference.js +9 -1
  212. package/dist/src/planner/nodes/reference.js.map +1 -1
  213. package/dist/src/planner/nodes/scalar.d.ts.map +1 -1
  214. package/dist/src/planner/nodes/scalar.js +117 -91
  215. package/dist/src/planner/nodes/scalar.js.map +1 -1
  216. package/dist/src/planner/nodes/sequence-node.d.ts +50 -0
  217. package/dist/src/planner/nodes/sequence-node.d.ts.map +1 -0
  218. package/dist/src/planner/nodes/sequence-node.js +96 -0
  219. package/dist/src/planner/nodes/sequence-node.js.map +1 -0
  220. package/dist/src/planner/nodes/values-node.d.ts +8 -0
  221. package/dist/src/planner/nodes/values-node.d.ts.map +1 -1
  222. package/dist/src/planner/nodes/values-node.js +29 -6
  223. package/dist/src/planner/nodes/values-node.js.map +1 -1
  224. package/dist/src/planner/nodes/view-mutation-node.d.ts +43 -1
  225. package/dist/src/planner/nodes/view-mutation-node.d.ts.map +1 -1
  226. package/dist/src/planner/nodes/view-mutation-node.js +27 -6
  227. package/dist/src/planner/nodes/view-mutation-node.js.map +1 -1
  228. package/dist/src/planner/nodes/window-node.d.ts +33 -4
  229. package/dist/src/planner/nodes/window-node.d.ts.map +1 -1
  230. package/dist/src/planner/nodes/window-node.js +80 -36
  231. package/dist/src/planner/nodes/window-node.js.map +1 -1
  232. package/dist/src/planner/planning-context.d.ts +38 -1
  233. package/dist/src/planner/planning-context.d.ts.map +1 -1
  234. package/dist/src/planner/rules/access/rule-key-set-seek.d.ts.map +1 -1
  235. package/dist/src/planner/rules/access/rule-key-set-seek.js +8 -3
  236. package/dist/src/planner/rules/access/rule-key-set-seek.js.map +1 -1
  237. package/dist/src/planner/rules/join/rule-fanout-lookup-join.js +18 -12
  238. package/dist/src/planner/rules/join/rule-fanout-lookup-join.js.map +1 -1
  239. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +4 -3
  240. package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
  241. package/dist/src/planner/rules/window/rule-monotonic-window.d.ts.map +1 -1
  242. package/dist/src/planner/rules/window/rule-monotonic-window.js +6 -0
  243. package/dist/src/planner/rules/window/rule-monotonic-window.js.map +1 -1
  244. package/dist/src/planner/scopes/param.d.ts.map +1 -1
  245. package/dist/src/planner/scopes/param.js +10 -5
  246. package/dist/src/planner/scopes/param.js.map +1 -1
  247. package/dist/src/planner/util/ind-utils.d.ts +25 -8
  248. package/dist/src/planner/util/ind-utils.d.ts.map +1 -1
  249. package/dist/src/planner/util/ind-utils.js +53 -10
  250. package/dist/src/planner/util/ind-utils.js.map +1 -1
  251. package/dist/src/planner/util/key-utils.d.ts +7 -7
  252. package/dist/src/planner/util/key-utils.js +9 -9
  253. package/dist/src/planner/util/key-utils.js.map +1 -1
  254. package/dist/src/runtime/delta-executor.d.ts.map +1 -1
  255. package/dist/src/runtime/delta-executor.js +7 -2
  256. package/dist/src/runtime/delta-executor.js.map +1 -1
  257. package/dist/src/runtime/emit/add-constraint.d.ts.map +1 -1
  258. package/dist/src/runtime/emit/add-constraint.js +50 -15
  259. package/dist/src/runtime/emit/add-constraint.js.map +1 -1
  260. package/dist/src/runtime/emit/alter-schema-event.d.ts +2 -43
  261. package/dist/src/runtime/emit/alter-schema-event.d.ts.map +1 -1
  262. package/dist/src/runtime/emit/alter-schema-event.js +2 -53
  263. package/dist/src/runtime/emit/alter-schema-event.js.map +1 -1
  264. package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
  265. package/dist/src/runtime/emit/alter-table.js +70 -26
  266. package/dist/src/runtime/emit/alter-table.js.map +1 -1
  267. package/dist/src/runtime/emit/analyze.d.ts.map +1 -1
  268. package/dist/src/runtime/emit/analyze.js +7 -0
  269. package/dist/src/runtime/emit/analyze.js.map +1 -1
  270. package/dist/src/runtime/emit/assertion-rename-helpers.d.ts.map +1 -1
  271. package/dist/src/runtime/emit/assertion-rename-helpers.js +2 -3
  272. package/dist/src/runtime/emit/assertion-rename-helpers.js.map +1 -1
  273. package/dist/src/runtime/emit/binary.d.ts +5 -0
  274. package/dist/src/runtime/emit/binary.d.ts.map +1 -1
  275. package/dist/src/runtime/emit/binary.js +22 -22
  276. package/dist/src/runtime/emit/binary.js.map +1 -1
  277. package/dist/src/runtime/emit/block.d.ts.map +1 -1
  278. package/dist/src/runtime/emit/block.js +9 -3
  279. package/dist/src/runtime/emit/block.js.map +1 -1
  280. package/dist/src/runtime/emit/constraint-check.d.ts.map +1 -1
  281. package/dist/src/runtime/emit/constraint-check.js +22 -13
  282. package/dist/src/runtime/emit/constraint-check.js.map +1 -1
  283. package/dist/src/runtime/emit/create-assertion.d.ts.map +1 -1
  284. package/dist/src/runtime/emit/create-assertion.js +71 -70
  285. package/dist/src/runtime/emit/create-assertion.js.map +1 -1
  286. package/dist/src/runtime/emit/create-index.d.ts.map +1 -1
  287. package/dist/src/runtime/emit/create-index.js +8 -3
  288. package/dist/src/runtime/emit/create-index.js.map +1 -1
  289. package/dist/src/runtime/emit/create-table.d.ts.map +1 -1
  290. package/dist/src/runtime/emit/create-table.js +20 -10
  291. package/dist/src/runtime/emit/create-table.js.map +1 -1
  292. package/dist/src/runtime/emit/create-view.d.ts.map +1 -1
  293. package/dist/src/runtime/emit/create-view.js +51 -44
  294. package/dist/src/runtime/emit/create-view.js.map +1 -1
  295. package/dist/src/runtime/emit/ddl-event-scope.d.ts +71 -0
  296. package/dist/src/runtime/emit/ddl-event-scope.d.ts.map +1 -0
  297. package/dist/src/runtime/emit/ddl-event-scope.js +80 -0
  298. package/dist/src/runtime/emit/ddl-event-scope.js.map +1 -0
  299. package/dist/src/runtime/emit/dml-executor.d.ts.map +1 -1
  300. package/dist/src/runtime/emit/dml-executor.js +28 -24
  301. package/dist/src/runtime/emit/dml-executor.js.map +1 -1
  302. package/dist/src/runtime/emit/drop-assertion.d.ts.map +1 -1
  303. package/dist/src/runtime/emit/drop-assertion.js +23 -17
  304. package/dist/src/runtime/emit/drop-assertion.js.map +1 -1
  305. package/dist/src/runtime/emit/drop-index.d.ts.map +1 -1
  306. package/dist/src/runtime/emit/drop-index.js +7 -2
  307. package/dist/src/runtime/emit/drop-index.js.map +1 -1
  308. package/dist/src/runtime/emit/drop-table.d.ts.map +1 -1
  309. package/dist/src/runtime/emit/drop-table.js +16 -10
  310. package/dist/src/runtime/emit/drop-table.js.map +1 -1
  311. package/dist/src/runtime/emit/drop-view.d.ts.map +1 -1
  312. package/dist/src/runtime/emit/drop-view.js +50 -43
  313. package/dist/src/runtime/emit/drop-view.js.map +1 -1
  314. package/dist/src/runtime/emit/insert.d.ts.map +1 -1
  315. package/dist/src/runtime/emit/insert.js +2 -1
  316. package/dist/src/runtime/emit/insert.js.map +1 -1
  317. package/dist/src/runtime/emit/materialized-view.d.ts.map +1 -1
  318. package/dist/src/runtime/emit/materialized-view.js +87 -67
  319. package/dist/src/runtime/emit/materialized-view.js.map +1 -1
  320. package/dist/src/runtime/emit/schema-declarative.d.ts +8 -0
  321. package/dist/src/runtime/emit/schema-declarative.d.ts.map +1 -1
  322. package/dist/src/runtime/emit/schema-declarative.js +128 -25
  323. package/dist/src/runtime/emit/schema-declarative.js.map +1 -1
  324. package/dist/src/runtime/emit/sequence.d.ts +17 -0
  325. package/dist/src/runtime/emit/sequence.d.ts.map +1 -0
  326. package/dist/src/runtime/emit/sequence.js +40 -0
  327. package/dist/src/runtime/emit/sequence.js.map +1 -0
  328. package/dist/src/runtime/emit/set-object-tags.d.ts.map +1 -1
  329. package/dist/src/runtime/emit/set-object-tags.js +40 -32
  330. package/dist/src/runtime/emit/set-object-tags.js.map +1 -1
  331. package/dist/src/runtime/emit/table-valued-function.d.ts.map +1 -1
  332. package/dist/src/runtime/emit/table-valued-function.js +3 -2
  333. package/dist/src/runtime/emit/table-valued-function.js.map +1 -1
  334. package/dist/src/runtime/emit/update.js +3 -3
  335. package/dist/src/runtime/emit/update.js.map +1 -1
  336. package/dist/src/runtime/emit/view-mutation.d.ts.map +1 -1
  337. package/dist/src/runtime/emit/view-mutation.js +45 -3
  338. package/dist/src/runtime/emit/view-mutation.js.map +1 -1
  339. package/dist/src/runtime/foreign-key-actions.d.ts.map +1 -1
  340. package/dist/src/runtime/foreign-key-actions.js +9 -10
  341. package/dist/src/runtime/foreign-key-actions.js.map +1 -1
  342. package/dist/src/runtime/register.d.ts.map +1 -1
  343. package/dist/src/runtime/register.js +3 -2
  344. package/dist/src/runtime/register.js.map +1 -1
  345. package/dist/src/runtime/row-constraints.d.ts +14 -8
  346. package/dist/src/runtime/row-constraints.d.ts.map +1 -1
  347. package/dist/src/runtime/row-constraints.js +41 -15
  348. package/dist/src/runtime/row-constraints.js.map +1 -1
  349. package/dist/src/runtime/strict-representation.d.ts +11 -6
  350. package/dist/src/runtime/strict-representation.d.ts.map +1 -1
  351. package/dist/src/runtime/strict-representation.js +1 -44
  352. package/dist/src/runtime/strict-representation.js.map +1 -1
  353. package/dist/src/schema/assertion.d.ts +25 -2
  354. package/dist/src/schema/assertion.d.ts.map +1 -1
  355. package/dist/src/schema/assertion.js.map +1 -1
  356. package/dist/src/schema/catalog-rendering.d.ts +38 -0
  357. package/dist/src/schema/catalog-rendering.d.ts.map +1 -0
  358. package/dist/src/schema/catalog-rendering.js +171 -0
  359. package/dist/src/schema/catalog-rendering.js.map +1 -0
  360. package/dist/src/schema/catalog.d.ts +94 -5
  361. package/dist/src/schema/catalog.d.ts.map +1 -1
  362. package/dist/src/schema/catalog.js +159 -21
  363. package/dist/src/schema/catalog.js.map +1 -1
  364. package/dist/src/schema/column-source-resolver.d.ts +9 -5
  365. package/dist/src/schema/column-source-resolver.d.ts.map +1 -1
  366. package/dist/src/schema/column-source-resolver.js +9 -5
  367. package/dist/src/schema/column-source-resolver.js.map +1 -1
  368. package/dist/src/schema/constraint-builder.d.ts +23 -7
  369. package/dist/src/schema/constraint-builder.d.ts.map +1 -1
  370. package/dist/src/schema/constraint-builder.js +60 -16
  371. package/dist/src/schema/constraint-builder.js.map +1 -1
  372. package/dist/src/schema/declared-schema-manager.d.ts +50 -0
  373. package/dist/src/schema/declared-schema-manager.d.ts.map +1 -1
  374. package/dist/src/schema/declared-schema-manager.js +52 -0
  375. package/dist/src/schema/declared-schema-manager.js.map +1 -1
  376. package/dist/src/schema/expr-scope/frame.d.ts +65 -0
  377. package/dist/src/schema/expr-scope/frame.d.ts.map +1 -0
  378. package/dist/src/schema/expr-scope/frame.js +104 -0
  379. package/dist/src/schema/expr-scope/frame.js.map +1 -0
  380. package/dist/src/schema/expr-scope/walk.d.ts +40 -0
  381. package/dist/src/schema/expr-scope/walk.d.ts.map +1 -0
  382. package/dist/src/schema/expr-scope/walk.js +260 -0
  383. package/dist/src/schema/expr-scope/walk.js.map +1 -0
  384. package/dist/src/schema/generated-column-refs.d.ts +41 -0
  385. package/dist/src/schema/generated-column-refs.d.ts.map +1 -0
  386. package/dist/src/schema/generated-column-refs.js +124 -0
  387. package/dist/src/schema/generated-column-refs.js.map +1 -0
  388. package/dist/src/schema/lens-ack.d.ts.map +1 -1
  389. package/dist/src/schema/lens-ack.js +5 -2
  390. package/dist/src/schema/lens-ack.js.map +1 -1
  391. package/dist/src/schema/lens-compiler.d.ts.map +1 -1
  392. package/dist/src/schema/lens-compiler.js +9 -1
  393. package/dist/src/schema/lens-compiler.js.map +1 -1
  394. package/dist/src/schema/lens-prover.d.ts +7 -2
  395. package/dist/src/schema/lens-prover.d.ts.map +1 -1
  396. package/dist/src/schema/lens-prover.js +105 -11
  397. package/dist/src/schema/lens-prover.js.map +1 -1
  398. package/dist/src/schema/lens.d.ts +12 -0
  399. package/dist/src/schema/lens.d.ts.map +1 -1
  400. package/dist/src/schema/lens.js +10 -0
  401. package/dist/src/schema/lens.js.map +1 -1
  402. package/dist/src/schema/manager.d.ts +48 -1
  403. package/dist/src/schema/manager.d.ts.map +1 -1
  404. package/dist/src/schema/manager.js +168 -36
  405. package/dist/src/schema/manager.js.map +1 -1
  406. package/dist/src/schema/rename/self-qualifier-strip.d.ts +16 -10
  407. package/dist/src/schema/rename/self-qualifier-strip.d.ts.map +1 -1
  408. package/dist/src/schema/rename/self-qualifier-strip.js +30 -213
  409. package/dist/src/schema/rename/self-qualifier-strip.js.map +1 -1
  410. package/dist/src/schema/rename-rewriter.d.ts +4 -3
  411. package/dist/src/schema/rename-rewriter.d.ts.map +1 -1
  412. package/dist/src/schema/rename-rewriter.js +4 -3
  413. package/dist/src/schema/rename-rewriter.js.map +1 -1
  414. package/dist/src/schema/schema-differ.d.ts +54 -6
  415. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  416. package/dist/src/schema/schema-differ.js +108 -42
  417. package/dist/src/schema/schema-differ.js.map +1 -1
  418. package/dist/src/schema/schema-hasher.d.ts +12 -0
  419. package/dist/src/schema/schema-hasher.d.ts.map +1 -1
  420. package/dist/src/schema/schema-hasher.js +28 -10
  421. package/dist/src/schema/schema-hasher.js.map +1 -1
  422. package/dist/src/schema/table.d.ts +117 -19
  423. package/dist/src/schema/table.d.ts.map +1 -1
  424. package/dist/src/schema/table.js +213 -71
  425. package/dist/src/schema/table.js.map +1 -1
  426. package/dist/src/types/comparison-coercion.d.ts +5 -1
  427. package/dist/src/types/comparison-coercion.d.ts.map +1 -1
  428. package/dist/src/types/comparison-coercion.js +21 -5
  429. package/dist/src/types/comparison-coercion.js.map +1 -1
  430. package/dist/src/types/representation.d.ts +65 -0
  431. package/dist/src/types/representation.d.ts.map +1 -0
  432. package/dist/src/types/representation.js +63 -0
  433. package/dist/src/types/representation.js.map +1 -0
  434. package/dist/src/types/validation.d.ts +76 -22
  435. package/dist/src/types/validation.d.ts.map +1 -1
  436. package/dist/src/types/validation.js +110 -31
  437. package/dist/src/types/validation.js.map +1 -1
  438. package/dist/src/vtab/best-access-plan.d.ts +10 -0
  439. package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
  440. package/dist/src/vtab/best-access-plan.js +16 -0
  441. package/dist/src/vtab/best-access-plan.js.map +1 -1
  442. package/dist/src/vtab/capabilities.d.ts +72 -4
  443. package/dist/src/vtab/capabilities.d.ts.map +1 -1
  444. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  445. package/dist/src/vtab/memory/layer/manager.js +17 -13
  446. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  447. package/dist/src/vtab/module.d.ts +13 -7
  448. package/dist/src/vtab/module.d.ts.map +1 -1
  449. package/package.json +3 -3
  450. package/dist/src/planner/nodes/array-index-node.d.ts +0 -22
  451. package/dist/src/planner/nodes/array-index-node.d.ts.map +0 -1
  452. package/dist/src/planner/nodes/array-index-node.js +0 -41
  453. package/dist/src/planner/nodes/array-index-node.js.map +0 -1
  454. package/dist/src/runtime/emit/array-index.d.ts +0 -5
  455. package/dist/src/runtime/emit/array-index.d.ts.map +0 -1
  456. package/dist/src/runtime/emit/array-index.js +0 -22
  457. package/dist/src/runtime/emit/array-index.js.map +0 -1
@@ -1,6 +1,7 @@
1
1
  import { asRun } from '../types.js';
2
2
  import { createMaintainedTable } from './materialized-view-helpers.js';
3
3
  import { assertDdlTransactionPolicy } from './ddl-transaction-policy.js';
4
+ import { withStatementScopedSchemaEvents } from './ddl-event-scope.js';
4
5
  export function emitCreateTable(plan, _ctx) {
5
6
  async function run(rctx) {
6
7
  // Strict-policy gate (see ddl-transaction-policy.ts). The owning module is the
@@ -14,16 +15,25 @@ export function emitCreateTable(plan, _ctx) {
14
15
  }
15
16
  // Ensure we're in a transaction before DDL (lazy/JIT transaction start)
16
17
  await rctx.db._ensureTransaction();
17
- if (plan.statementAst.maintained) {
18
- // `create table … maintained as <body>` — the declared-shape maintained
19
- // form: shape-verify against the body BEFORE registration, then create +
20
- // attach-to-empty through the shared attach core (all-or-nothing).
21
- await createMaintainedTable(rctx.db, plan.statementAst);
22
- return null;
23
- }
24
- await rctx.db.schemaManager.createTable(plan.statementAst);
25
- // The specific error handling for IF NOT EXISTS is within SchemaManager.defineTable.
26
- return null; // Explicitly return null for successful void operations
18
+ // Both arms run under the statement-scoped schema-event scope (see
19
+ // ddl-event-scope.ts). The maintained arm creates the backing table — announced —
20
+ // and fills it afterwards, so a fill that violates a declared constraint would
21
+ // otherwise announce a create and a drop for a statement that did nothing. The
22
+ // plain arm can fail after `module.create` too (the FK-collation check in
23
+ // SchemaManager.createTable), by which point an emitter-backed module has already
24
+ // announced.
25
+ return withStatementScopedSchemaEvents(rctx, async () => {
26
+ if (plan.statementAst.maintained) {
27
+ // `create table … maintained as <body>` — the declared-shape maintained
28
+ // form: shape-verify against the body BEFORE registration, then create +
29
+ // attach-to-empty through the shared attach core (all-or-nothing).
30
+ await createMaintainedTable(rctx.db, plan.statementAst);
31
+ return null;
32
+ }
33
+ await rctx.db.schemaManager.createTable(plan.statementAst);
34
+ // The specific error handling for IF NOT EXISTS is within SchemaManager.defineTable.
35
+ return null; // Explicitly return null for successful void operations
36
+ });
27
37
  }
28
38
  return { params: [], run: asRun(run), note: `createTable(${plan.statementAst.table.name})` };
29
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create-table.js","sourceRoot":"","sources":["../../../../src/runtime/emit/create-table.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAEzE,MAAM,UAAU,eAAe,CAAC,IAAqB,EAAE,IAAqB;IAC3E,KAAK,UAAU,GAAG,CAAC,IAAoB;QACtC,+EAA+E;QAC/E,yEAAyE;QACzE,gFAAgF;QAChF,4BAA4B;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,wBAAwB,EAAE,CAAC;QACpG,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC9D,IAAI,SAAS,EAAE,MAAM,EAAE,CAAC;YACvB,0BAA0B,CACzB,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,UAAU,EACrC,gBAAgB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,CAC9C,CAAC;QACH,CAAC;QAED,wEAAwE;QACxE,MAAM,IAAI,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC;QAEnC,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;YAClC,wEAAwE;YACxE,yEAAyE;YACzE,mEAAmE;YACnE,MAAM,qBAAqB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC;QACb,CAAC;QAED,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3D,qFAAqF;QAErF,OAAO,IAAI,CAAC,CAAC,wDAAwD;IACtE,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,eAAe,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;AAC9F,CAAC"}
1
+ {"version":3,"file":"create-table.js","sourceRoot":"","sources":["../../../../src/runtime/emit/create-table.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AAEvE,MAAM,UAAU,eAAe,CAAC,IAAqB,EAAE,IAAqB;IAC3E,KAAK,UAAU,GAAG,CAAC,IAAoB;QACtC,+EAA+E;QAC/E,yEAAyE;QACzE,gFAAgF;QAChF,4BAA4B;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,wBAAwB,EAAE,CAAC;QACpG,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC9D,IAAI,SAAS,EAAE,MAAM,EAAE,CAAC;YACvB,0BAA0B,CACzB,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,UAAU,EACrC,gBAAgB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,CAC9C,CAAC;QACH,CAAC;QAED,wEAAwE;QACxE,MAAM,IAAI,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC;QAEnC,mEAAmE;QACnE,kFAAkF;QAClF,+EAA+E;QAC/E,+EAA+E;QAC/E,0EAA0E;QAC1E,kFAAkF;QAClF,aAAa;QACb,OAAO,+BAA+B,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YACvD,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;gBAClC,wEAAwE;gBACxE,yEAAyE;gBACzE,mEAAmE;gBACnE,MAAM,qBAAqB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gBACxD,OAAO,IAAI,CAAC;YACb,CAAC;YAED,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3D,qFAAqF;YAErF,OAAO,IAAI,CAAC,CAAC,wDAAwD;QACtE,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,eAAe,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC;AAC9F,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-view.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/create-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAM9D,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,GAAG,WAAW,CAsEvF"}
1
+ {"version":3,"file":"create-view.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/create-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAO9D,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,GAAG,WAAW,CA4EvF"}
@@ -1,55 +1,62 @@
1
1
  import { QuereusError } from '../../common/errors.js';
2
2
  import { StatusCode } from '../../common/types.js';
3
3
  import { assertCatalogObjectPersistable } from '../../schema/catalog-persistability.js';
4
+ import { withStatementScopedSchemaEvents } from './ddl-event-scope.js';
4
5
  export function emitCreateView(plan, _ctx) {
5
6
  async function run(rctx) {
6
7
  // Ensure we're in a transaction before DDL (lazy/JIT transaction start)
7
8
  await rctx.db._ensureTransaction();
8
- // Check if view already exists
9
- const existingView = rctx.db.schemaManager.getView(plan.schemaName, plan.viewName);
10
- if (existingView && !plan.ifNotExists) {
11
- throw new QuereusError(`View '${plan.schemaName}.${plan.viewName}' already exists`, StatusCode.ERROR);
12
- }
13
- if (existingView && plan.ifNotExists) {
14
- // View exists but IF NOT EXISTS was specified, so this is a no-op
15
- return null;
16
- }
17
- // Create the view schema. Any `with defaults (…)` rides inside
18
- // plan.selectStmt (→ selectAst), so there is no separate field to thread.
19
- const viewSchema = {
20
- name: plan.viewName,
21
- schemaName: plan.schemaName,
22
- sql: plan.sql,
23
- selectAst: plan.selectStmt,
24
- columns: plan.columns,
25
- tags: plan.tags,
26
- };
27
- // Add the view to the schema manager
28
- const schema = rctx.db.schemaManager.getSchema(plan.schemaName);
29
- if (!schema) {
30
- throw new QuereusError(`Schema '${plan.schemaName}' does not exist`, StatusCode.ERROR);
31
- }
32
- // Refuse up front if a registered module could not durably persist this
33
- // definition — the persistence itself is fire-and-forget (see
34
- // assertCatalogObjectPersistable), so this is the only place the failure can
35
- // reach the statement. Nothing has been mutated yet, so a throw is a clean no-op.
36
- assertCatalogObjectPersistable(rctx.db, 'view', viewSchema);
37
- schema.addView(viewSchema);
38
- // Fire view_added so a store-backed catalog can persist this view. Fired
39
- // here (not from Schema.addView) so only user/declarative DDL views are
40
- // persisted; internal views (lens bodies, etc.) register via schema.addView
41
- // directly and are deliberately excluded. Not reached on the IF NOT EXISTS
42
- // no-op above.
43
- rctx.db.schemaManager.getChangeNotifier().notifyChange({
44
- type: 'view_added',
45
- // Stored names of the registered ViewSchema — see
46
- // SchemaManager.canonicalSchemaName for the emitter/stored-name invariant
47
- // (plan.schemaName is already canonical via the builder, so they coincide).
48
- schemaName: viewSchema.schemaName,
49
- objectName: viewSchema.name,
50
- newObject: viewSchema,
9
+ // Statement-scoped schema-event scope. This statement raises nothing on the public
10
+ // schema channel today (`view_added` is an internal catalog notification), so the
11
+ // scope is a no-op — it is here so the invariant holds by construction: see
12
+ // ddl-event-scope.ts.
13
+ return withStatementScopedSchemaEvents(rctx, async () => {
14
+ // Check if view already exists
15
+ const existingView = rctx.db.schemaManager.getView(plan.schemaName, plan.viewName);
16
+ if (existingView && !plan.ifNotExists) {
17
+ throw new QuereusError(`View '${plan.schemaName}.${plan.viewName}' already exists`, StatusCode.ERROR);
18
+ }
19
+ if (existingView && plan.ifNotExists) {
20
+ // View exists but IF NOT EXISTS was specified, so this is a no-op
21
+ return null;
22
+ }
23
+ // Create the view schema. Any `with defaults (…)` rides inside
24
+ // plan.selectStmt (→ selectAst), so there is no separate field to thread.
25
+ const viewSchema = {
26
+ name: plan.viewName,
27
+ schemaName: plan.schemaName,
28
+ sql: plan.sql,
29
+ selectAst: plan.selectStmt,
30
+ columns: plan.columns,
31
+ tags: plan.tags,
32
+ };
33
+ // Add the view to the schema manager
34
+ const schema = rctx.db.schemaManager.getSchema(plan.schemaName);
35
+ if (!schema) {
36
+ throw new QuereusError(`Schema '${plan.schemaName}' does not exist`, StatusCode.ERROR);
37
+ }
38
+ // Refuse up front if a registered module could not durably persist this
39
+ // definition — the persistence itself is fire-and-forget (see
40
+ // assertCatalogObjectPersistable), so this is the only place the failure can
41
+ // reach the statement. Nothing has been mutated yet, so a throw is a clean no-op.
42
+ assertCatalogObjectPersistable(rctx.db, 'view', viewSchema);
43
+ schema.addView(viewSchema);
44
+ // Fire view_added so a store-backed catalog can persist this view. Fired
45
+ // here (not from Schema.addView) so only user/declarative DDL views are
46
+ // persisted; internal views (lens bodies, etc.) register via schema.addView
47
+ // directly and are deliberately excluded. Not reached on the IF NOT EXISTS
48
+ // no-op above.
49
+ rctx.db.schemaManager.getChangeNotifier().notifyChange({
50
+ type: 'view_added',
51
+ // Stored names of the registered ViewSchema — see
52
+ // SchemaManager.canonicalSchemaName for the emitter/stored-name invariant
53
+ // (plan.schemaName is already canonical via the builder, so they coincide).
54
+ schemaName: viewSchema.schemaName,
55
+ objectName: viewSchema.name,
56
+ newObject: viewSchema,
57
+ });
58
+ return null; // Explicitly return null for successful void operations
51
59
  });
52
- return null; // Explicitly return null for successful void operations
53
60
  }
54
61
  return {
55
62
  params: [],
@@ -1 +1 @@
1
- {"version":3,"file":"create-view.js","sourceRoot":"","sources":["../../../../src/runtime/emit/create-view.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAiB,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AAExF,MAAM,UAAU,cAAc,CAAC,IAAoB,EAAE,IAAqB;IACzE,KAAK,UAAU,GAAG,CAAC,IAAoB;QACtC,wEAAwE;QACxE,MAAM,IAAI,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC;QAEnC,+BAA+B;QAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEnF,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,IAAI,YAAY,CACrB,SAAS,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,kBAAkB,EAC3D,UAAU,CAAC,KAAK,CAChB,CAAC;QACH,CAAC;QAED,IAAI,YAAY,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,kEAAkE;YAClE,OAAO,IAAI,CAAC;QACb,CAAC;QAED,+DAA+D;QAC/D,0EAA0E;QAC1E,MAAM,UAAU,GAAe;YAC9B,IAAI,EAAE,IAAI,CAAC,QAAQ;YACnB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;SACf,CAAC;QAEF,qCAAqC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,IAAI,YAAY,CACrB,WAAW,IAAI,CAAC,UAAU,kBAAkB,EAC5C,UAAU,CAAC,KAAK,CAChB,CAAC;QACH,CAAC;QAED,wEAAwE;QACxE,8DAA8D;QAC9D,6EAA6E;QAC7E,kFAAkF;QAClF,8BAA8B,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAE5D,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAE3B,yEAAyE;QACzE,wEAAwE;QACxE,4EAA4E;QAC5E,2EAA2E;QAC3E,eAAe;QACf,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC,YAAY,CAAC;YACtD,IAAI,EAAE,YAAY;YAClB,kDAAkD;YAClD,0EAA0E;YAC1E,4EAA4E;YAC5E,UAAU,EAAE,UAAU,CAAC,UAAU;YACjC,UAAU,EAAE,UAAU,CAAC,IAAI;YAC3B,SAAS,EAAE,UAAU;SACrB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,CAAC,wDAAwD;IACtE,CAAC;IAED,OAAO;QACN,MAAM,EAAE,EAAE;QACV,GAAG;QACH,IAAI,EAAE,cAAc,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,GAAG;KACvD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"create-view.js","sourceRoot":"","sources":["../../../../src/runtime/emit/create-view.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAiB,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AACxF,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AAEvE,MAAM,UAAU,cAAc,CAAC,IAAoB,EAAE,IAAqB;IACzE,KAAK,UAAU,GAAG,CAAC,IAAoB;QACtC,wEAAwE;QACxE,MAAM,IAAI,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC;QAEnC,mFAAmF;QACnF,kFAAkF;QAClF,4EAA4E;QAC5E,sBAAsB;QACtB,OAAO,+BAA+B,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YACvD,+BAA+B;YAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEnF,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACvC,MAAM,IAAI,YAAY,CACrB,SAAS,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,kBAAkB,EAC3D,UAAU,CAAC,KAAK,CAChB,CAAC;YACH,CAAC;YAED,IAAI,YAAY,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtC,kEAAkE;gBAClE,OAAO,IAAI,CAAC;YACb,CAAC;YAED,+DAA+D;YAC/D,0EAA0E;YAC1E,MAAM,UAAU,GAAe;gBAC9B,IAAI,EAAE,IAAI,CAAC,QAAQ;gBACnB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,SAAS,EAAE,IAAI,CAAC,UAAU;gBAC1B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;aACf,CAAC;YAEF,qCAAqC;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAChE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACb,MAAM,IAAI,YAAY,CACrB,WAAW,IAAI,CAAC,UAAU,kBAAkB,EAC5C,UAAU,CAAC,KAAK,CAChB,CAAC;YACH,CAAC;YAED,wEAAwE;YACxE,8DAA8D;YAC9D,6EAA6E;YAC7E,kFAAkF;YAClF,8BAA8B,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YAE5D,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAE3B,yEAAyE;YACzE,wEAAwE;YACxE,4EAA4E;YAC5E,2EAA2E;YAC3E,eAAe;YACf,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC,YAAY,CAAC;gBACtD,IAAI,EAAE,YAAY;gBAClB,kDAAkD;gBAClD,0EAA0E;gBAC1E,4EAA4E;gBAC5E,UAAU,EAAE,UAAU,CAAC,UAAU;gBACjC,UAAU,EAAE,UAAU,CAAC,IAAI;gBAC3B,SAAS,EAAE,UAAU;aACrB,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,CAAC,wDAAwD;QACtE,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,OAAO;QACN,MAAM,EAAE,EAAE;QACV,GAAG;QACH,IAAI,EAAE,cAAc,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,GAAG;KACvD,CAAC;AACH,CAAC"}
@@ -0,0 +1,71 @@
1
+ import type { RuntimeContext } from '../types.js';
2
+ /**
3
+ * Runs one whole DDL statement with its schema events made RETRACTABLE: if `fn` throws,
4
+ * every schema event batched since the call is dropped before the error propagates, so a
5
+ * statement that unwound announces nothing at all.
6
+ *
7
+ * The other half of the "one event per statement, on the success path only" rule. The
8
+ * engine's own auto emits satisfy the rule by construction (they sit at the tail of the
9
+ * catalog mutation, past any throw), but a backend that emits for ITSELF cannot: it emits
10
+ * from inside `module.create` / `module.alterTable` / `module.destroy`, which is not the end
11
+ * of the statement. Two demonstrated leaks:
12
+ *
13
+ * - `alter table … add column <inline constraint>` installs each constraint through further
14
+ * module calls; a failure there runs `revertAddColumn` — by which point the module's
15
+ * announcement, carrying the statement's SQL, already sits in the transaction's batch.
16
+ * - `create table … maintained as <body>` creates the backing table (announced) and fills it
17
+ * afterwards; a fill that violates a declared constraint drops the table again, so
18
+ * subscribers see a create followed by a drop for a statement that did nothing. This one
19
+ * leaks on the ENGINE's path too, because the drop's own auto emit is a second statement's
20
+ * worth of announcement inside one failing statement.
21
+ *
22
+ * A syncing peer that re-executed either announcement would diverge from the device where the
23
+ * statement failed.
24
+ *
25
+ * ## The rule
26
+ *
27
+ * **Every DDL statement emitter opens this scope around its `run()` body** — including the
28
+ * ones that raise no schema event today (`create view`, the assertion verbs, the tag arms).
29
+ * The point is that the invariant holds by construction: if one of those ever starts
30
+ * announcing, it cannot reintroduce the class. Check it against the DDL block of
31
+ * `runtime/register.ts`.
32
+ *
33
+ * **The declarative statements (`apply schema` and friends) deliberately do NOT open one.**
34
+ * `emitApplySchema` generates migration DDL and runs each generated statement through
35
+ * `db._execWithinTransaction`. A failure on statement 5 leaves statements 1–4 *applied* —
36
+ * there is no catalog rollback, and inside an explicit transaction the user may still commit.
37
+ * Those four really happened and must stay announced; a scope around the whole apply would
38
+ * retract them. The per-statement rule gives the right answer there for free: each generated
39
+ * sub-statement runs its own emitter, so each opens and spends its own scope.
40
+ *
41
+ * ## Call shape
42
+ *
43
+ * Call it INSIDE the emitter's `run()` — after `assertDdlTransactionPolicy` and
44
+ * `await db._ensureTransaction()`, so the mark is taken with batching already on. Retraction
45
+ * is a no-op without a batch, which is correct: the events were delivered synchronously and
46
+ * nothing can call them back. Placement is not load-bearing for correctness (the watermark is
47
+ * a lifetime-monotonic counter), but keeping it identical everywhere makes the invariant
48
+ * readable.
49
+ *
50
+ * Only the SCHEMA channel is retracted — see
51
+ * {@link DatabaseEventEmitter.discardSchemaEventsSince} for why touching the data channel here
52
+ * would swallow earlier statements' committed writes.
53
+ *
54
+ * NOTE: retraction is the right answer only while a failed statement's catalog change does not
55
+ * OUTLIVE the failure — the same condition the `apply schema` carve-out above turns on. It
56
+ * holds today by placement: every engine auto emit sits at the tail of its catalog mutation
57
+ * (`SchemaManager.createTable` / `createIndex` / `dropIndex` / `dropTable` / `createBackingTable`),
58
+ * and the only post-emit work any DDL emitter still does — `dropMaintainedTable`'s
59
+ * `materialized_view_removed` notify — cannot throw, because `SchemaChangeNotifier.notifyChange`
60
+ * swallows listener errors. If a DDL emitter ever gains work that runs AFTER a catalog change
61
+ * landed and can throw, this scope would un-announce a change the catalog kept; that arm needs
62
+ * the carve-out treatment (its own inner scope, or no scope), not a wider one.
63
+ *
64
+ * NOTE: nothing nests these scopes today (`apply schema` is unwrapped, and the one ALTER arm
65
+ * that runs nested SQL — the ALTER PRIMARY KEY shadow rebuild — does it under
66
+ * `withPublicEventsSuppressed`, so it batches no events at all). If an arm ever did nest one,
67
+ * the outer failure would retract the inner statement's events too, which is the wanted
68
+ * reading: the outer statement unwound, so everything it did announces nothing.
69
+ */
70
+ export declare function withStatementScopedSchemaEvents<T>(rctx: RuntimeContext, fn: () => Promise<T>): Promise<T>;
71
+ //# sourceMappingURL=ddl-event-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ddl-event-scope.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/ddl-event-scope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AACH,wBAAsB,+BAA+B,CAAC,CAAC,EACtD,IAAI,EAAE,cAAc,EACpB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAClB,OAAO,CAAC,CAAC,CAAC,CASZ"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Runs one whole DDL statement with its schema events made RETRACTABLE: if `fn` throws,
3
+ * every schema event batched since the call is dropped before the error propagates, so a
4
+ * statement that unwound announces nothing at all.
5
+ *
6
+ * The other half of the "one event per statement, on the success path only" rule. The
7
+ * engine's own auto emits satisfy the rule by construction (they sit at the tail of the
8
+ * catalog mutation, past any throw), but a backend that emits for ITSELF cannot: it emits
9
+ * from inside `module.create` / `module.alterTable` / `module.destroy`, which is not the end
10
+ * of the statement. Two demonstrated leaks:
11
+ *
12
+ * - `alter table … add column <inline constraint>` installs each constraint through further
13
+ * module calls; a failure there runs `revertAddColumn` — by which point the module's
14
+ * announcement, carrying the statement's SQL, already sits in the transaction's batch.
15
+ * - `create table … maintained as <body>` creates the backing table (announced) and fills it
16
+ * afterwards; a fill that violates a declared constraint drops the table again, so
17
+ * subscribers see a create followed by a drop for a statement that did nothing. This one
18
+ * leaks on the ENGINE's path too, because the drop's own auto emit is a second statement's
19
+ * worth of announcement inside one failing statement.
20
+ *
21
+ * A syncing peer that re-executed either announcement would diverge from the device where the
22
+ * statement failed.
23
+ *
24
+ * ## The rule
25
+ *
26
+ * **Every DDL statement emitter opens this scope around its `run()` body** — including the
27
+ * ones that raise no schema event today (`create view`, the assertion verbs, the tag arms).
28
+ * The point is that the invariant holds by construction: if one of those ever starts
29
+ * announcing, it cannot reintroduce the class. Check it against the DDL block of
30
+ * `runtime/register.ts`.
31
+ *
32
+ * **The declarative statements (`apply schema` and friends) deliberately do NOT open one.**
33
+ * `emitApplySchema` generates migration DDL and runs each generated statement through
34
+ * `db._execWithinTransaction`. A failure on statement 5 leaves statements 1–4 *applied* —
35
+ * there is no catalog rollback, and inside an explicit transaction the user may still commit.
36
+ * Those four really happened and must stay announced; a scope around the whole apply would
37
+ * retract them. The per-statement rule gives the right answer there for free: each generated
38
+ * sub-statement runs its own emitter, so each opens and spends its own scope.
39
+ *
40
+ * ## Call shape
41
+ *
42
+ * Call it INSIDE the emitter's `run()` — after `assertDdlTransactionPolicy` and
43
+ * `await db._ensureTransaction()`, so the mark is taken with batching already on. Retraction
44
+ * is a no-op without a batch, which is correct: the events were delivered synchronously and
45
+ * nothing can call them back. Placement is not load-bearing for correctness (the watermark is
46
+ * a lifetime-monotonic counter), but keeping it identical everywhere makes the invariant
47
+ * readable.
48
+ *
49
+ * Only the SCHEMA channel is retracted — see
50
+ * {@link DatabaseEventEmitter.discardSchemaEventsSince} for why touching the data channel here
51
+ * would swallow earlier statements' committed writes.
52
+ *
53
+ * NOTE: retraction is the right answer only while a failed statement's catalog change does not
54
+ * OUTLIVE the failure — the same condition the `apply schema` carve-out above turns on. It
55
+ * holds today by placement: every engine auto emit sits at the tail of its catalog mutation
56
+ * (`SchemaManager.createTable` / `createIndex` / `dropIndex` / `dropTable` / `createBackingTable`),
57
+ * and the only post-emit work any DDL emitter still does — `dropMaintainedTable`'s
58
+ * `materialized_view_removed` notify — cannot throw, because `SchemaChangeNotifier.notifyChange`
59
+ * swallows listener errors. If a DDL emitter ever gains work that runs AFTER a catalog change
60
+ * landed and can throw, this scope would un-announce a change the catalog kept; that arm needs
61
+ * the carve-out treatment (its own inner scope, or no scope), not a wider one.
62
+ *
63
+ * NOTE: nothing nests these scopes today (`apply schema` is unwrapped, and the one ALTER arm
64
+ * that runs nested SQL — the ALTER PRIMARY KEY shadow rebuild — does it under
65
+ * `withPublicEventsSuppressed`, so it batches no events at all). If an arm ever did nest one,
66
+ * the outer failure would retract the inner statement's events too, which is the wanted
67
+ * reading: the outer statement unwound, so everything it did announces nothing.
68
+ */
69
+ export async function withStatementScopedSchemaEvents(rctx, fn) {
70
+ const emitter = rctx.db._getEventEmitter();
71
+ const watermark = emitter.beginSchemaEventScope();
72
+ try {
73
+ return await fn();
74
+ }
75
+ catch (err) {
76
+ emitter.discardSchemaEventsSince(watermark);
77
+ throw err;
78
+ }
79
+ }
80
+ //# sourceMappingURL=ddl-event-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ddl-event-scope.js","sourceRoot":"","sources":["../../../../src/runtime/emit/ddl-event-scope.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AACH,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACpD,IAAoB,EACpB,EAAoB;IAEpB,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAClD,IAAI,CAAC;QACJ,OAAO,MAAM,EAAE,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,GAAG,CAAC;IACX,CAAC;AACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"dml-executor.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/dml-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAA+C,MAAM,aAAa,CAAC;AAO5F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAiTzD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAQ7E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,eAAe,GAAG,WAAW,CAywCxF"}
1
+ {"version":3,"file":"dml-executor.d.ts","sourceRoot":"","sources":["../../../../src/runtime/emit/dml-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAA+C,MAAM,aAAa,CAAC;AAO5F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAgTzD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAQ7E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,eAAe,GAAG,WAAW,CAixCxF"}
@@ -10,7 +10,7 @@ import { isMaintainedTable } from '../../schema/derivation.js';
10
10
  import { hasNativeEventSupport } from '../../util/event-support.js';
11
11
  import { sqlValueIdentical, compareSqlValuesFast, BINARY_COLLATION } from '../../util/comparison.js';
12
12
  import { uniqueEnforcementComparators } from '../../schema/unique-enforcement.js';
13
- import { validateAndParse } from '../../types/validation.js';
13
+ import { buildCellCoercion } from '../../types/validation.js';
14
14
  import { withAsyncRowContext } from '../context-helpers.js';
15
15
  import { REPR_STRICT } from '../strict-flags.js';
16
16
  import { assertRowConforms } from '../strict-representation.js';
@@ -279,7 +279,11 @@ export function emitDmlExecutor(plan, ctx) {
279
279
  for (const attr of plan.contextAttributes) {
280
280
  const valueNode = plan.mutationContextValues.get(attr.name);
281
281
  if (!valueNode) {
282
- throw new QuereusError(`Missing mutation context value for '${attr.name}'`, StatusCode.INTERNAL);
282
+ // Invariant, not user input: the DML builders fill EVERY declared context
283
+ // slot — the supplied value expression, or a NULL literal when the statement
284
+ // omitted the variable (planner/building/mutation-context.ts). A gap here
285
+ // would silently shift the evaluated context row against contextDescriptor.
286
+ throw new QuereusError(`Internal: no mutation context evaluator for '${attr.name}'`, StatusCode.INTERNAL);
283
287
  }
284
288
  const instruction = emitCallFromPlan(valueNode, ctx);
285
289
  contextEvaluatorInstructions.push(instruction);
@@ -326,12 +330,14 @@ export function emitDmlExecutor(plan, ctx) {
326
330
  else {
327
331
  runtime.assignmentIndices.set(colIndex, evaluatorIndex);
328
332
  }
329
- // Same static-type rule as emitUpdate: convert only when the
330
- // assignment expression's type is not the column's declared type.
331
- // Applies to a generated value too — it is written to the same cell.
333
+ // Same decision as emitUpdate, from the same helper: convert unless the
334
+ // assignment expression's type IS the column's declared type AND the
335
+ // value already inhabits it. Applies to a generated value too — it is
336
+ // written to the same cell.
332
337
  const column = tableSchema.columns[colIndex];
333
- if (valueNode.getType().logicalType !== column.logicalType) {
334
- runtime.assignmentCoercions.set(colIndex, column);
338
+ const coerce = buildCellCoercion(valueNode.getType().logicalType, column.logicalType, column.name);
339
+ if (coerce) {
340
+ runtime.assignmentCoercions.set(colIndex, coerce);
335
341
  }
336
342
  }
337
343
  // Keep topological order (drive off the plan's list, not map order).
@@ -377,11 +383,9 @@ export function emitDmlExecutor(plan, ctx) {
377
383
  notNullDefaults: upsertValidation.notNullDefaults.map((d, i) => ({
378
384
  columnIndex: d.columnIndex,
379
385
  evaluatorIndex: defaultStart + i,
380
- // Same static-type rule as everywhere else a DEFAULT is substituted after
381
- // the emitters' conversion pass — see NotNullDefaultRuntime.coerceColumn.
382
- coerceColumn: d.defaultNode.getType().logicalType !== tableSchema.columns[d.columnIndex].logicalType
383
- ? tableSchema.columns[d.columnIndex]
384
- : undefined,
386
+ // Same decision as everywhere else a DEFAULT is substituted after the
387
+ // emitters' conversion pass — see NotNullDefaultRuntime.coerce.
388
+ coerce: buildCellCoercion(d.defaultNode.getType().logicalType, tableSchema.columns[d.columnIndex].logicalType, tableSchema.columns[d.columnIndex].name),
385
389
  })),
386
390
  flatDescriptor: upsertValidation.flatRowDescriptor,
387
391
  combinedDescriptor: plan.contextDescriptor
@@ -461,7 +465,7 @@ export function emitDmlExecutor(plan, ctx) {
461
465
  const notNullDefaults = validation.notNullDefaults.map(d => ({
462
466
  columnIndex: d.columnIndex,
463
467
  evaluator: upsertEvaluators[d.evaluatorIndex],
464
- coerceColumn: d.coerceColumn,
468
+ coerce: d.coerce,
465
469
  }));
466
470
  const useContext = contextRow !== undefined && validation.combinedDescriptor !== undefined;
467
471
  const descriptor = useContext ? validation.combinedDescriptor : validation.flatDescriptor;
@@ -514,12 +518,12 @@ export function emitDmlExecutor(plan, ctx) {
514
518
  return await evaluator(rctx);
515
519
  });
516
520
  });
517
- // Convert to the declared column type when the assignment's static
518
- // type requires it (see assignmentCoercions) — `existingRow` is a
519
- // stored row, so the composed updatedRow is then fully declared-form.
520
- const coerceColumn = clause.assignmentCoercions?.get(colIndex);
521
- if (coerceColumn) {
522
- value = validateAndParse(value, coerceColumn.logicalType, coerceColumn.name);
521
+ // Convert to the declared column type as the assignment requires (see
522
+ // assignmentCoercions) — `existingRow` is a stored row, so the composed
523
+ // updatedRow is then fully declared-form.
524
+ const coerce = clause.assignmentCoercions?.get(colIndex);
525
+ if (coerce) {
526
+ value = coerce(value);
523
527
  }
524
528
  updatedRow[colIndex] = value;
525
529
  }
@@ -547,9 +551,9 @@ export function emitDmlExecutor(plan, ctx) {
547
551
  await withAsyncRowContext(rctx, clause.generatedRowDescriptor, () => updatedRow, async () => {
548
552
  for (const { colIndex, evaluatorIndex } of clause.generatedAssignments) {
549
553
  let value = await upsertEvaluators[evaluatorIndex](rctx);
550
- const coerceColumn = clause.assignmentCoercions?.get(colIndex);
551
- if (coerceColumn) {
552
- value = validateAndParse(value, coerceColumn.logicalType, coerceColumn.name);
554
+ const coerce = clause.assignmentCoercions?.get(colIndex);
555
+ if (coerce) {
556
+ value = coerce(value);
553
557
  }
554
558
  updatedRow[colIndex] = value;
555
559
  }
@@ -1033,7 +1037,7 @@ export function emitDmlExecutor(plan, ctx) {
1033
1037
  // replaced by key accumulation + one chunked probe per FK at the
1034
1038
  // end-of-statement boundary. The plan side made the same gate decision
1035
1039
  // and skipped the per-row NOT EXISTS checks.
1036
- const batchableFks = getBatchableRestrictFks(ctx.db.schemaManager, tableSchema, 'update', plan.onConflict, plan.lensRouted);
1040
+ const batchableFks = getBatchableRestrictFks(ctx.db, tableSchema, 'update', plan.onConflict, plan.lensRouted);
1037
1041
  const fkRestrictBatch = batchableFks ? createParentRestrictBatch(batchableFks) : undefined;
1038
1042
  // Physical Halloween avoidance: unless the target module guarantees per-scan
1039
1043
  // snapshot isolation, fully drain the source match set (closing the scan
@@ -1170,7 +1174,7 @@ export function emitDmlExecutor(plan, ctx) {
1170
1174
  // Batched parent-side RESTRICT enforcement — see the matching note in
1171
1175
  // runUpdate (per-execution state; one chunked probe per FK at the
1172
1176
  // end-of-statement boundary when the gate admits the statement).
1173
- const batchableFks = getBatchableRestrictFks(ctx.db.schemaManager, tableSchema, 'delete', plan.onConflict, plan.lensRouted);
1177
+ const batchableFks = getBatchableRestrictFks(ctx.db, tableSchema, 'delete', plan.onConflict, plan.lensRouted);
1174
1178
  const fkRestrictBatch = batchableFks ? createParentRestrictBatch(batchableFks) : undefined;
1175
1179
  // Physical Halloween avoidance — see the matching note in runUpdate. Unless
1176
1180
  // the target module guarantees per-scan snapshot isolation, drain the source