@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
@@ -2,11 +2,13 @@ import { Schema } from './schema.js';
2
2
  import { normalizeCollationName } from '../util/comparison.js';
3
3
  import { quereusError, QuereusError, RelationNotFoundError } from '../common/errors.js';
4
4
  import { StatusCode } from '../common/types.js';
5
- import { buildColumnIndexMap, columnDefToSchema, findPKDefinition, opsToMask, mutationContextVarToSchema, extractGeneratedColumnDependencies, topoSortGeneratedColumns, requireVtabModule, resolveNamedConstraintClass, appendIndexToTableSchema } from './table.js';
5
+ import { foldDefaultToType } from '../types/validation.js';
6
+ import { buildColumnIndexMap, columnDefToSchema, findPKDefinition, opsToMask, mutationContextVarToSchema, extractGeneratedColumnDependencies, topoSortGeneratedColumns, requireVtabModule, resolveNamedConstraintClass, appendIndexToTableSchema, collectDeclaredConstraintNames, disambiguateAutoConstraintName } from './table.js';
6
7
  import { buildUniqueConstraintSchema, buildForeignKeyConstraintSchema, validateForeignKeyCollations } from './constraint-builder.js';
8
+ import { buildColumnSourceResolver } from './column-source-resolver.js';
7
9
  import { normalizeBackingModule } from './view.js';
8
10
  import { isMaintainedTable } from './derivation.js';
9
- import { isHiddenImplicitIndex, isImplicitCoveringIndex, findExposedImplicitConstraintIndex, assertNoDuplicateUniqueConstraints } from './catalog.js';
11
+ import { isHiddenImplicitIndex, isImplicitCoveringIndex, findExposedImplicitConstraintIndex, assertNoDuplicateUniqueConstraints, assertNoDuplicateUniqueConstraintBackingNames, assertNoDuplicateConstraintNames } from './catalog.js';
10
12
  import { assertCatalogObjectPersistable } from './catalog-persistability.js';
11
13
  import { buildLensBasisFkGate } from './lens-fk-discovery.js';
12
14
  import { createLogger } from '../common/logger.js';
@@ -63,6 +65,18 @@ function maintainedImportFromTableStmt(stmt) {
63
65
  tags: stmt.tags,
64
66
  };
65
67
  }
68
+ /**
69
+ * Shared rejection for a non-deterministic call found in a schema-level expression
70
+ * at declaration time — one wording across the CHECK and GENERATED gates, so the
71
+ * two surfaces cannot drift apart in how they explain the same rule.
72
+ *
73
+ * @param site Where the call was found, e.g. `CHECK constraint 'c' on table 't'`.
74
+ */
75
+ function nonDeterministicDeclarationError(site, offendingExpr) {
76
+ return new QuereusError(`Non-deterministic expression not allowed in ${site}. ` +
77
+ `Function '${offendingExpr.name}' is not deterministic. ` +
78
+ `Use mutation context to pass non-deterministic values (e.g., WITH CONTEXT (timestamp = datetime('now'))).`, StatusCode.ERROR);
79
+ }
66
80
  /**
67
81
  * Manages all schemas associated with a database connection (main, temp, attached).
68
82
  * Handles lookup resolution according to SQLite's rules.
@@ -1470,14 +1484,20 @@ export class SchemaManager {
1470
1484
  }
1471
1485
  /**
1472
1486
  * Extracts CHECK constraints from AST column and table constraint definitions.
1487
+ *
1488
+ * An unnamed column-level CHECK is minted `_check_<col>`; two on one column are
1489
+ * legal, so the mint disambiguates through the statement-wide `takenNames` set
1490
+ * (`_check_b`, then `_check_b_2`) — see `disambiguateAutoConstraintName`. An
1491
+ * unnamed table-level CHECK keeps no name at all (unchanged), so it cannot
1492
+ * collide.
1473
1493
  */
1474
- extractCheckConstraints(astColumns, astConstraints) {
1494
+ extractCheckConstraints(astColumns, astConstraints, takenNames) {
1475
1495
  const result = [];
1476
1496
  for (const colDef of astColumns) {
1477
1497
  for (const con of colDef.constraints ?? []) {
1478
1498
  if (con.type === 'check' && con.expr) {
1479
1499
  result.push({
1480
- name: con.name ?? `_check_${colDef.name}`,
1500
+ name: con.name ?? disambiguateAutoConstraintName(`_check_${colDef.name}`, takenNames),
1481
1501
  expr: con.expr,
1482
1502
  operations: opsToMask(con.operations),
1483
1503
  defaultConflict: con.onConflict,
@@ -1504,7 +1524,7 @@ export class SchemaManager {
1504
1524
  * Resolves column indices in the child table. Parent table resolution is deferred
1505
1525
  * to enforcement time (the parent table may not exist yet during declarative schema setup).
1506
1526
  */
1507
- extractForeignKeys(astColumns, astConstraints, columnIndexMap, tableName, schemaName) {
1527
+ extractForeignKeys(astColumns, astConstraints, columnIndexMap, tableName, schemaName, takenNames) {
1508
1528
  const result = [];
1509
1529
  // Column-level foreign keys
1510
1530
  for (const colDef of astColumns) {
@@ -1521,11 +1541,13 @@ export class SchemaManager {
1521
1541
  throw new QuereusError(`FK constraint '${con.name ?? `_fk_${tableName}_${colDef.name}`}' on table '${tableName}': child column count (1) does not match parent column count (${fk.columns.length})`, StatusCode.ERROR);
1522
1542
  }
1523
1543
  result.push({
1524
- name: con.name ?? `_fk_${tableName}_${colDef.name}`,
1544
+ // Two FKs on one child column (different parents) are legal SQL,
1545
+ // so a colliding mint disambiguates (`_fk_C_x`, then `_fk_C_x_2`)
1546
+ // rather than rejecting — see `disambiguateAutoConstraintName`.
1547
+ name: con.name ?? disambiguateAutoConstraintName(`_fk_${tableName}_${colDef.name}`, takenNames),
1525
1548
  columns: Object.freeze([childColIndex]),
1526
1549
  referencedTable: fk.table,
1527
1550
  referencedSchema: fk.schema ?? schemaName,
1528
- referencedColumns: Object.freeze([]), // resolved at enforcement time
1529
1551
  referencedColumnNames: fk.columns, // deferred resolution via resolveReferencedColumns
1530
1552
  onDelete: fk.onDelete ?? 'restrict',
1531
1553
  onUpdate: fk.onUpdate ?? 'restrict',
@@ -1539,7 +1561,7 @@ export class SchemaManager {
1539
1561
  // `ADD CONSTRAINT` path and CREATE TABLE produce byte-identical schemas.
1540
1562
  for (const con of astConstraints ?? []) {
1541
1563
  if (con.type === 'foreignKey' && con.foreignKey && con.columns) {
1542
- result.push(buildForeignKeyConstraintSchema(con, columnIndexMap, tableName, schemaName));
1564
+ result.push(buildForeignKeyConstraintSchema(con, columnIndexMap, tableName, schemaName, takenNames));
1543
1565
  }
1544
1566
  }
1545
1567
  return result;
@@ -1597,17 +1619,25 @@ export class SchemaManager {
1597
1619
  const defaultNotNull = defaultNullability === 'not_null';
1598
1620
  const astColumns = stmt.columns || [];
1599
1621
  const { columns, pkDefinition, pkDefaultConflict } = this.buildColumnSchemas(astColumns, stmt.constraints, defaultNotNull, defaultCollation);
1600
- const checkConstraints = this.extractCheckConstraints(astColumns, stmt.constraints);
1622
+ // Statement-wide taken-set the CHECK / FK mint sites disambiguate against:
1623
+ // seeded with every user-written constraint name up front, then accumulating
1624
+ // each mint, so a colliding auto-name gets a `_<N>` suffix instead of
1625
+ // producing two constraints one name addresses. Shared across the extractors
1626
+ // — one name space, not three.
1627
+ const takenConstraintNames = collectDeclaredConstraintNames(astColumns, stmt.constraints);
1628
+ const checkConstraints = this.extractCheckConstraints(astColumns, stmt.constraints, takenConstraintNames);
1601
1629
  const columnIndexMap = buildColumnIndexMap(columns);
1602
- const foreignKeys = this.extractForeignKeys(astColumns, stmt.constraints, columnIndexMap, tableName, targetSchemaName);
1630
+ const foreignKeys = this.extractForeignKeys(astColumns, stmt.constraints, columnIndexMap, tableName, targetSchemaName, takenConstraintNames);
1603
1631
  const uniqueConstraints = this.extractUniqueConstraints(astColumns, stmt.constraints, columnIndexMap);
1604
1632
  const mutationContextSchemas = stmt.contextDefinitions
1605
1633
  ? stmt.contextDefinitions.map(varDef => mutationContextVarToSchema(varDef, defaultNotNull))
1606
1634
  : undefined;
1607
1635
  // Extract generated-column dependencies and validate that they form a DAG.
1608
1636
  // Cycle detection runs before module.create so an invalid schema never
1609
- // reaches storage.
1610
- const rawGenDeps = extractGeneratedColumnDependencies(columns, tableName);
1637
+ // reaches storage. The catalog resolver serves the scope-aware analysis's
1638
+ // inner-FROM questions; the table being created is answered from the
1639
+ // in-flight `columns` (it is not in the catalog yet).
1640
+ const rawGenDeps = extractGeneratedColumnDependencies(columns, tableName, targetSchemaName, buildColumnSourceResolver(this.db));
1611
1641
  const genTopoOrder = rawGenDeps.size > 0
1612
1642
  ? topoSortGeneratedColumns(columns, rawGenDeps)
1613
1643
  : undefined;
@@ -1646,6 +1676,13 @@ export class SchemaManager {
1646
1676
  * registered or executed; its compiled effective body is registered as a
1647
1677
  * `ViewSchema`. Module association / indexes / storage are rejected upstream
1648
1678
  * by the lens compiler before this is called.
1679
+ *
1680
+ * NOTE: `assertNoDuplicateConstraintNames` is deliberately NOT run here — it
1681
+ * guards `createTable` only. A logical table is never a `DROP CONSTRAINT` /
1682
+ * `RENAME CONSTRAINT` target, so a colliding user-written name in a lens
1683
+ * declaration costs nothing today; running the guard would instead risk
1684
+ * refusing a lens declaration that deployed before the guard existed. Revisit
1685
+ * if named-constraint lifecycle verbs ever address a logical table.
1649
1686
  */
1650
1687
  buildLogicalTableSchema(stmt, schemaName) {
1651
1688
  const tableName = stmt.table.name;
@@ -1655,9 +1692,12 @@ export class SchemaManager {
1655
1692
  const defaultCollation = normalizeCollationName(this.db.options.getStringOption('default_collation'));
1656
1693
  const astColumns = stmt.columns || [];
1657
1694
  const { columns, pkDefinition, pkDefaultConflict } = this.buildColumnSchemas(astColumns, stmt.constraints, defaultNotNull, defaultCollation);
1658
- const checkConstraints = this.extractCheckConstraints(astColumns, stmt.constraints);
1695
+ // Same statement-wide mint disambiguation as buildTableSchemaFromAST, so a
1696
+ // logical spec and the physical table it describes mint identical names.
1697
+ const takenConstraintNames = collectDeclaredConstraintNames(astColumns, stmt.constraints);
1698
+ const checkConstraints = this.extractCheckConstraints(astColumns, stmt.constraints, takenConstraintNames);
1659
1699
  const columnIndexMap = buildColumnIndexMap(columns);
1660
- const foreignKeys = this.extractForeignKeys(astColumns, stmt.constraints, columnIndexMap, tableName, schemaName);
1700
+ const foreignKeys = this.extractForeignKeys(astColumns, stmt.constraints, columnIndexMap, tableName, schemaName, takenConstraintNames);
1661
1701
  const uniqueConstraints = this.extractUniqueConstraints(astColumns, stmt.constraints, columnIndexMap);
1662
1702
  return {
1663
1703
  name: tableName,
@@ -1791,6 +1831,7 @@ export class SchemaManager {
1791
1831
  schemaDependencies: new BuildTimeDependencyTracker(),
1792
1832
  schemaCache: new Map(),
1793
1833
  cteReferenceCache: new Map(),
1834
+ cteDescriptors: new Map(),
1794
1835
  outputScopes: new Map()
1795
1836
  };
1796
1837
  }
@@ -1908,30 +1949,76 @@ export class SchemaManager {
1908
1949
  });
1909
1950
  if (allowNonDeterministic)
1910
1951
  continue;
1911
- let offendingExpr;
1912
- traverseAst(cc.expr, {
1913
- enterNode: (node) => {
1914
- if (offendingExpr)
1915
- return false;
1916
- if (node.type !== 'function')
1917
- return;
1918
- const fnNode = node;
1919
- const argCount = fnNode.args?.length ?? 0;
1920
- const funcSchema = this.findFunction(fnNode.name, argCount)
1921
- ?? this.findFunction(fnNode.name, -1);
1922
- if (funcSchema && (funcSchema.flags & FunctionFlags.DETERMINISTIC) === 0) {
1923
- offendingExpr = fnNode;
1924
- return false;
1925
- }
1926
- },
1927
- });
1952
+ const offendingExpr = this.findNonDeterministicCall(cc.expr);
1928
1953
  if (offendingExpr) {
1929
- throw new QuereusError(`Non-deterministic expression not allowed in CHECK constraint '${constraintName}' on table '${tableName}'. ` +
1930
- `Function '${offendingExpr.name}' is not deterministic. ` +
1931
- `Use mutation context to pass non-deterministic values (e.g., WITH CONTEXT (timestamp = datetime('now'))).`, StatusCode.ERROR);
1954
+ throw nonDeterministicDeclarationError(`CHECK constraint '${constraintName}' on table '${tableName}'`, offendingExpr);
1932
1955
  }
1933
1956
  }
1934
1957
  }
1958
+ /**
1959
+ * Validates that `GENERATED ALWAYS AS` expressions don't call non-deterministic
1960
+ * functions, so a declaration no write could ever satisfy is refused where it is
1961
+ * written rather than at every later INSERT/UPDATE.
1962
+ *
1963
+ * Called from {@link createTable} beside the CHECK / DEFAULT gates rather than from
1964
+ * the shared {@link buildTableSchemaFromAST}, and for the same reason those two are:
1965
+ * the import/rehydrate path shares that builder, and `nondeterministic_schema` is a
1966
+ * *session* option — a table legitimately declared while the pragma was on must still
1967
+ * reload into a session that has it off, instead of failing the whole catalog open.
1968
+ * `ALTER TABLE ADD COLUMN` runs its own equivalent gate (see
1969
+ * `planner/building/alter-table.ts`), so both authoring surfaces agree.
1970
+ *
1971
+ * NOTE: the sibling generated-column gate — `unboundQualifierError` in `./table.ts`,
1972
+ * reached from the builder — deliberately DOES fire on reload, and the two are not
1973
+ * meant to converge. A body naming something nothing binds is unwritable in every
1974
+ * session, so no reload of it can be legitimate; a non-deterministic body is
1975
+ * legitimately writable whenever the pragma is on, so rejecting it on reload would
1976
+ * close a database this same build opened. Revisit both together if reload ever
1977
+ * gains a general "refuse schemas no write can satisfy" pass.
1978
+ */
1979
+ validateGeneratedColumnDeterminism(columns, tableName, allowNonDeterministic = false) {
1980
+ if (allowNonDeterministic)
1981
+ return;
1982
+ for (const col of columns) {
1983
+ if (!col.generated || !col.generatedExpr)
1984
+ continue;
1985
+ const offendingExpr = this.findNonDeterministicCall(col.generatedExpr);
1986
+ if (offendingExpr) {
1987
+ throw nonDeterministicDeclarationError(`GENERATED ALWAYS AS for column '${col.name}' in table '${tableName}'`, offendingExpr);
1988
+ }
1989
+ }
1990
+ }
1991
+ /**
1992
+ * The first function call under `expr` whose registry entry lacks
1993
+ * `FunctionFlags.DETERMINISTIC`, or undefined if every call is deterministic.
1994
+ * A name the registry cannot resolve is skipped — an unknown function still
1995
+ * surfaces at write time, not here.
1996
+ *
1997
+ * Shared by the CHECK and GENERATED declaration-time gates. Both walk the raw
1998
+ * AST rather than building the expression the way {@link validateDefaultDeterminism}
1999
+ * does: their bodies name the table's own columns, whose scope does not exist
2000
+ * yet at declaration time.
2001
+ */
2002
+ findNonDeterministicCall(expr) {
2003
+ let offendingExpr;
2004
+ traverseAst(expr, {
2005
+ enterNode: (node) => {
2006
+ if (offendingExpr)
2007
+ return false;
2008
+ if (node.type !== 'function')
2009
+ return;
2010
+ const fnNode = node;
2011
+ const argCount = fnNode.args?.length ?? 0;
2012
+ const funcSchema = this.findFunction(fnNode.name, argCount)
2013
+ ?? this.findFunction(fnNode.name, -1);
2014
+ if (funcSchema && (funcSchema.flags & FunctionFlags.DETERMINISTIC) === 0) {
2015
+ offendingExpr = fnNode;
2016
+ return false;
2017
+ }
2018
+ },
2019
+ });
2020
+ return offendingExpr;
2021
+ }
1935
2022
  /**
1936
2023
  * Registers a table schema after module.create() returns, correcting
1937
2024
  * name/schema if the module returned different values.
@@ -1995,7 +2082,7 @@ export class SchemaManager {
1995
2082
  }
1996
2083
  throw new QuereusError(`Index ${indexName} already exists on table ${tableName}`, StatusCode.CONSTRAINT, undefined, stmt.index.loc?.start.line, stmt.index.loc?.start.column);
1997
2084
  }
1998
- // Index names are unique per schema, not per table (docs/sql-ddl.md §6.3).
2085
+ // Index names are unique per schema, not per table (docs/sql-vtab.md §6.3).
1999
2086
  // Every by-name index resolver — `dropIndex`, `updateIndexTags`, sync's
2000
2087
  // `findIndexOwner` — locates the owning table by first-match scan over the
2001
2088
  // schema's tables, and "first" is registration order, which is not stable
@@ -2084,7 +2171,7 @@ export class SchemaManager {
2084
2171
  * schema-wide name-uniqueness check ({@link findIndexNameOwnerElsewhere}) and
2085
2172
  * `@quereus/sync`'s replicated index DDL all funnel here.
2086
2173
  *
2087
- * Index names are unique per schema, not per table (docs/sql-ddl.md §6.3), and
2174
+ * Index names are unique per schema, not per table (docs/sql-vtab.md §6.3), and
2088
2175
  * {@link createIndex} rejects a name already taken elsewhere in the schema, so
2089
2176
  * first-match is unambiguous by construction. That invariant is what makes
2090
2177
  * replication safe: a replicated `drop index "main"."idx"` carries no table name
@@ -2347,6 +2434,25 @@ export class SchemaManager {
2347
2434
  const allowNonDet = this.db.options.getBooleanOption('nondeterministic_schema');
2348
2435
  this.validateDefaultDeterminism(baseTableSchema.columns, tableName, hasMutationContext, allowNonDet);
2349
2436
  this.validateCheckConstraintDeterminism(baseTableSchema.checkConstraints, tableName, allowNonDet);
2437
+ this.validateGeneratedColumnDeterminism(baseTableSchema.columns, tableName, allowNonDet);
2438
+ // A literal DEFAULT must be convertible to its own column's declared type — the same
2439
+ // check ADD COLUMN and SET NOT NULL backfill already run — so an unconvertible one is
2440
+ // refused here rather than surfacing later as an INSERT failure blaming the insert
2441
+ // instead of the declaration. Engine-side and pre-`module.create`, same rationale as
2442
+ // the guards below: one gate covers every backend, and a refusal leaves no storage
2443
+ // behind. Non-literal defaults (a function call, `new.<col>`, a bare column reference)
2444
+ // fold to `undefined` and stay deferred to write time, unchanged.
2445
+ for (const col of baseTableSchema.columns) {
2446
+ foldDefaultToType(col.defaultValue, col.logicalType, col.name);
2447
+ }
2448
+ // Refuse a CREATE TABLE carrying two user-written constraint names that collide —
2449
+ // one case-folded name space across CHECK / UNIQUE / FK, so the same-class shape
2450
+ // (DROP removes both) and the cross-class shape (permanently un-droppable as
2451
+ // ambiguous) are both refused at birth. Same rule every ALTER path enforces via
2452
+ // `assertConstraintNameFree`; reads the raw declaration, so engine-minted names
2453
+ // (two unnamed CHECKs on one column — legal) are not compared. Placement shares
2454
+ // the duplicate-UNIQUE guard's rationale below.
2455
+ assertNoDuplicateConstraintNames(stmt.columns ?? [], stmt.constraints, `create table '${tableName}'`);
2350
2456
  // Refuse a CREATE TABLE that declares the same plain UNIQUE twice — the same rule
2351
2457
  // `ALTER TABLE ADD CONSTRAINT` / `ADD COLUMN … unique` apply, so a duplicate is
2352
2458
  // refused identically wherever it is written. Before `module.create`, so the
@@ -2355,6 +2461,32 @@ export class SchemaManager {
2355
2461
  // still open a catalog written before this guard existed (same placement rationale
2356
2462
  // as the FK-collation check below).
2357
2463
  assertNoDuplicateUniqueConstraints(baseTableSchema.uniqueConstraints ?? [], baseTableSchema.columns, `create table '${tableName}'`);
2464
+ // Two DIFFERENT UNIQUE constraints (different column sets, so the duplicate guard
2465
+ // above passes) may still derive ONE backing structure name — via a constraint name
2466
+ // written with the engine's reserved `_uc_` prefix, or via the `_`-joined auto-name
2467
+ // colliding on ordinary column names (`unique (a_b)` beside `unique (a, b)`). The
2468
+ // second constraint then adopts the first's structure and is enforced by one keyed on
2469
+ // the OTHER constraint's columns, so it silently stops rejecting duplicates. Every
2470
+ // ALTER path refuses this; refused here too, so one declaration gets one answer
2471
+ // wherever it is written. After the duplicate guard (a genuine duplicate must keep its
2472
+ // constraint-worded message) and before `module.create` (a refusal leaves no storage).
2473
+ assertNoDuplicateUniqueConstraintBackingNames(baseTableSchema.uniqueConstraints ?? [], baseTableSchema.columns, `create table '${tableName}'`);
2474
+ // Ask every registered module whether it could durably persist this table's
2475
+ // definition — the same veto CREATE VIEW / CREATE MATERIALIZED VIEW / the RENAME
2476
+ // dependent scan already run (see assertCatalogObjectPersistable). Without it, a
2477
+ // definition the storage backend cannot encode (e.g. an unpaired surrogate in a
2478
+ // column name or a DEFAULT/CHECK string literal) creates successfully and then is
2479
+ // silently dropped by the swallowing SchemaChangeNotifier / persist-queue layers —
2480
+ // worse, if the table is never touched again, nothing ever surfaces the loss.
2481
+ // Before `module.create`, same as the duplicate-UNIQUE guard above, so a refusal
2482
+ // leaves no storage behind. `baseTableSchema` (pre-`module.create`) rather than the
2483
+ // post-create `completeTableSchema` is safe here: the veto reads only the rendered
2484
+ // DDL text, and the one thing `finalizeCreatedTableSchema` still changes —
2485
+ // collation reconciliation — can only substitute an engine-known collation name,
2486
+ // never introduce an unencodable character. Not run on the import/rehydrate path
2487
+ // (`buildTableSchemaFromAST` itself, `importTable`/`importDDL`) — a catalog written
2488
+ // before this guard existed must still open.
2489
+ assertCatalogObjectPersistable(this.db, 'table', baseTableSchema);
2358
2490
  let tableInstance;
2359
2491
  try {
2360
2492
  // `preferBacking` (set only by the maintained-table create path) routes