@quereus/quereus 4.20.1 → 4.20.2

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 (377) hide show
  1. package/README.md +2 -0
  2. package/package.json +7 -4
  3. package/test/README.md +173 -0
  4. package/test/logic/01-basic.sqllogic +39 -0
  5. package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
  6. package/test/logic/01.2-strings.sqllogic +43 -0
  7. package/test/logic/01.5-insert-select.sqllogic +237 -0
  8. package/test/logic/01.6-update-extras.sqllogic +118 -0
  9. package/test/logic/01.7-update-from.sqllogic +67 -0
  10. package/test/logic/01.8-delete-extras.sqllogic +122 -0
  11. package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
  12. package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
  13. package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
  14. package/test/logic/01.9-query-expr-values.sqllogic +111 -0
  15. package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
  16. package/test/logic/02-filters.sqllogic +54 -0
  17. package/test/logic/02-smoke.sqllogic +62 -0
  18. package/test/logic/02.1-bind-parameters.sqllogic +223 -0
  19. package/test/logic/03-expressions.sqllogic +190 -0
  20. package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
  21. package/test/logic/03.4-defaults.sqllogic +554 -0
  22. package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
  23. package/test/logic/03.5-tvf.sqllogic +61 -0
  24. package/test/logic/03.6-type-system.sqllogic +544 -0
  25. package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
  26. package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
  27. package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
  28. package/test/logic/03.8-not-precedence.sqllogic +255 -0
  29. package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
  30. package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
  31. package/test/logic/04-order-by.sqllogic +38 -0
  32. package/test/logic/04-transactions.sqllogic +239 -0
  33. package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
  34. package/test/logic/05-vtab_memory.sqllogic +50 -0
  35. package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
  36. package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
  37. package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
  38. package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
  39. package/test/logic/06-builtin_functions.sqllogic +149 -0
  40. package/test/logic/06.1-string-functions.sqllogic +92 -0
  41. package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
  42. package/test/logic/06.2-math-functions.sqllogic +82 -0
  43. package/test/logic/06.3-schema.sqllogic +48 -0
  44. package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
  45. package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
  46. package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
  47. package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
  48. package/test/logic/06.3.4-view-info.sqllogic +378 -0
  49. package/test/logic/06.3.5-column-info.sqllogic +347 -0
  50. package/test/logic/06.3.6-schema-views.sqllogic +29 -0
  51. package/test/logic/06.4-schema-search-path.sqllogic +354 -0
  52. package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
  53. package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
  54. package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
  55. package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
  56. package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
  57. package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
  58. package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
  59. package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
  60. package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
  61. package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
  62. package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
  63. package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
  64. package/test/logic/06.7-json-extended.sqllogic +53 -0
  65. package/test/logic/06.8-json-path-operators.sqllogic +99 -0
  66. package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
  67. package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
  68. package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
  69. package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
  70. package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
  71. package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
  72. package/test/logic/07-aggregates.sqllogic +193 -0
  73. package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
  74. package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
  75. package/test/logic/07.3-group-by-extras.sqllogic +602 -0
  76. package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
  77. package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
  78. package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
  79. package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
  80. package/test/logic/07.5-window.sqllogic +1941 -0
  81. package/test/logic/07.5.1-window-named.sqllogic +13 -0
  82. package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
  83. package/test/logic/07.6-subqueries.sqllogic +78 -0
  84. package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
  85. package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
  86. package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
  87. package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
  88. package/test/logic/07.7.1-in-extras.sqllogic +158 -0
  89. package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
  90. package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
  91. package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
  92. package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
  93. package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
  94. package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
  95. package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
  96. package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
  97. package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
  98. package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
  99. package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
  100. package/test/logic/07.9-in-value-list.sqllogic +154 -0
  101. package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
  102. package/test/logic/08-views.sqllogic +64 -0
  103. package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
  104. package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
  105. package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
  106. package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
  107. package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
  108. package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
  109. package/test/logic/09-set_operations.sqllogic +244 -0
  110. package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
  111. package/test/logic/10-distinct_datatypes.sqllogic +127 -0
  112. package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
  113. package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
  114. package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
  115. package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
  116. package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
  117. package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
  118. package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
  119. package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
  120. package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
  121. package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
  122. package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
  123. package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
  124. package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
  125. package/test/logic/10.2-column-features.sqllogic +365 -0
  126. package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
  127. package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
  128. package/test/logic/10.3-function-features.sqllogic +247 -0
  129. package/test/logic/10.4-schema-scale.sqllogic +168 -0
  130. package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
  131. package/test/logic/10.5-indexes.sqllogic +164 -0
  132. package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
  133. package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
  134. package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
  135. package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
  136. package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
  137. package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
  138. package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
  139. package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
  140. package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
  141. package/test/logic/100.1-where-extras.sqllogic +163 -0
  142. package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
  143. package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
  144. package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
  145. package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
  146. package/test/logic/102-unique-constraints.sqllogic +145 -0
  147. package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
  148. package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
  149. package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
  150. package/test/logic/102.2-unique-collation.sqllogic +181 -0
  151. package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
  152. package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
  153. package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
  154. package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
  155. package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
  156. package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
  157. package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
  158. package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
  159. package/test/logic/108-cardinality-estimation.sqllogic +146 -0
  160. package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
  161. package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
  162. package/test/logic/11-joins.sqllogic +86 -0
  163. package/test/logic/11.1-join-using.sqllogic +267 -0
  164. package/test/logic/11.2-comma-join.sqllogic +35 -0
  165. package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
  166. package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
  167. package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
  168. package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
  169. package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
  170. package/test/logic/12-empty-primary-key.sqllogic +124 -0
  171. package/test/logic/12-join_padding_order.sqllogic +58 -0
  172. package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
  173. package/test/logic/13-cte.sqllogic +137 -0
  174. package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
  175. package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
  176. package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
  177. package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
  178. package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
  179. package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
  180. package/test/logic/13.4-cte-extras.sqllogic +98 -0
  181. package/test/logic/13.5-cte-join-order.sqllogic +166 -0
  182. package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
  183. package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
  184. package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
  185. package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
  186. package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
  187. package/test/logic/14-utilities.sqllogic +168 -0
  188. package/test/logic/15-timespan.sqllogic +279 -0
  189. package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
  190. package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
  191. package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
  192. package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
  193. package/test/logic/16-epoch.sqllogic +187 -0
  194. package/test/logic/17-weekday-modifier.sqllogic +78 -0
  195. package/test/logic/18-json-string-escapes.sqllogic +86 -0
  196. package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
  197. package/test/logic/20-empty-single-row.sqllogic +261 -0
  198. package/test/logic/21-null-edge-cases.sqllogic +227 -0
  199. package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
  200. package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
  201. package/test/logic/21.2-between-edges.sqllogic +157 -0
  202. package/test/logic/22-boundary-values.sqllogic +175 -0
  203. package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
  204. package/test/logic/24-builtin-branches.sqllogic +611 -0
  205. package/test/logic/24.1-substr-extras.sqllogic +75 -0
  206. package/test/logic/24.2-random-extras.sqllogic +39 -0
  207. package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
  208. package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
  209. package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
  210. package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
  211. package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
  212. package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
  213. package/test/logic/26-join-edge-cases.sqllogic +333 -0
  214. package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
  215. package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
  216. package/test/logic/26.3-join-on-constants.sqllogic +61 -0
  217. package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
  218. package/test/logic/27-window-edge-cases.sqllogic +206 -0
  219. package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
  220. package/test/logic/27.2-window-exclude.sqllogic +13 -0
  221. package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
  222. package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
  223. package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
  224. package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
  225. package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
  226. package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
  227. package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
  228. package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
  229. package/test/logic/40-constraints.sqllogic +418 -0
  230. package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
  231. package/test/logic/40.2-check-extras.sqllogic +683 -0
  232. package/test/logic/41-alter-table.sqllogic +191 -0
  233. package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
  234. package/test/logic/41-fk-cross-schema.sqllogic +155 -0
  235. package/test/logic/41-fk-extended-targets.sqllogic +173 -0
  236. package/test/logic/41-foreign-keys.sqllogic +1001 -0
  237. package/test/logic/41-generated-column-errors.sqllogic +225 -0
  238. package/test/logic/41-generated-column-extras.sqllogic +598 -0
  239. package/test/logic/41-generated-column-scope.sqllogic +329 -0
  240. package/test/logic/41-generated-columns.sqllogic +361 -0
  241. package/test/logic/41.1-alter-pk.sqllogic +230 -0
  242. package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
  243. package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
  244. package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
  245. package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
  246. package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
  247. package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
  248. package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
  249. package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
  250. package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
  251. package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
  252. package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
  253. package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
  254. package/test/logic/41.2-alter-column.sqllogic +382 -0
  255. package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
  256. package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
  257. package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
  258. package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
  259. package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
  260. package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
  261. package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
  262. package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
  263. package/test/logic/41.5-alter-misc.sqllogic +48 -0
  264. package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
  265. package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
  266. package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
  267. package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
  268. package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
  269. package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
  270. package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
  271. package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
  272. package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
  273. package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
  274. package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
  275. package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
  276. package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
  277. package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
  278. package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
  279. package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
  280. package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
  281. package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
  282. package/test/logic/42-committed-snapshot.sqllogic +254 -0
  283. package/test/logic/42-returning.sqllogic +159 -0
  284. package/test/logic/42.1-returning-extras.sqllogic +232 -0
  285. package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
  286. package/test/logic/43-default-nullability.sqllogic +131 -0
  287. package/test/logic/43-transition-constraints.sqllogic +341 -0
  288. package/test/logic/43.1-default-collation.sqllogic +140 -0
  289. package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
  290. package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
  291. package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
  292. package/test/logic/44-determinism-validation.sqllogic +164 -0
  293. package/test/logic/44-orthogonality.sqllogic +146 -0
  294. package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
  295. package/test/logic/45-udf-determinism.sqllogic +39 -0
  296. package/test/logic/46-mutation-context.sqllogic +595 -0
  297. package/test/logic/47-upsert.sqllogic +255 -0
  298. package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
  299. package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
  300. package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
  301. package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
  302. package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
  303. package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
  304. package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
  305. package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
  306. package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
  307. package/test/logic/49-reference-graph.sqllogic +84 -0
  308. package/test/logic/50-declarative-schema.sqllogic +2550 -0
  309. package/test/logic/50-metadata-tags.sqllogic +1033 -0
  310. package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
  311. package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
  312. package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
  313. package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +173 -0
  314. package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
  315. package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
  316. package/test/logic/51-lens-foundation.sqllogic +147 -0
  317. package/test/logic/51-materialized-views.sqllogic +376 -0
  318. package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
  319. package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
  320. package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
  321. package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
  322. package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
  323. package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
  324. package/test/logic/52-lens-overrides.sqllogic +566 -0
  325. package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
  326. package/test/logic/53-reserved-tags.sqllogic +252 -0
  327. package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
  328. package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
  329. package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
  330. package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
  331. package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
  332. package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
  333. package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
  334. package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
  335. package/test/logic/55-lens-prover.sqllogic +202 -0
  336. package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
  337. package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
  338. package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
  339. package/test/logic/81-quickpick.sqllogic +24 -0
  340. package/test/logic/82-bloom-join.sqllogic +185 -0
  341. package/test/logic/83-merge-join.sqllogic +280 -0
  342. package/test/logic/84-asof-scan.sqllogic +238 -0
  343. package/test/logic/84-key-cardinality.sqllogic +50 -0
  344. package/test/logic/85-relational-const-folding.sqllogic +51 -0
  345. package/test/logic/86-scalar-cse.sqllogic +42 -0
  346. package/test/logic/90-error_paths.sqllogic +114 -0
  347. package/test/logic/90.1-parse-errors.sqllogic +77 -0
  348. package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
  349. package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
  350. package/test/logic/90.3-expression-errors.sqllogic +43 -0
  351. package/test/logic/90.4-dml-errors.sqllogic +47 -0
  352. package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
  353. package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
  354. package/test/logic/90.6-select-error-paths.sqllogic +57 -0
  355. package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
  356. package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
  357. package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
  358. package/test/logic/93.1-view-error-paths.sqllogic +74 -0
  359. package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
  360. package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
  361. package/test/logic/93.4-view-mutation.sqllogic +4881 -0
  362. package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
  363. package/test/logic/93.5-authored-inverse.sqllogic +415 -0
  364. package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
  365. package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
  366. package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
  367. package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
  368. package/test/logic/95-assertions.sqllogic +1417 -0
  369. package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
  370. package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
  371. package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
  372. package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
  373. package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
  374. package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
  375. package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
  376. package/test/logic/drop-unique-index.sqllogic +88 -0
  377. package/test/logic/pushdown-test.sqllogic +36 -0
@@ -0,0 +1,314 @@
1
+ -- 54-covering-mv-enforcement.sqllogic — row-time UNIQUE enforcement routed
2
+ -- through an explicit covering materialized view's backing table
3
+ -- (covering-structure-mv-rowtime-enforcement). The covering MV
4
+ -- `select <uc-cols>, <pk> from T order by <uc-cols>` is both *covering* (the
5
+ -- prover links it to the UNIQUE constraint) and row-time (every MV is row-time
6
+ -- maintained, so its backing is consistent mid-statement), so
7
+ -- `findIndexForConstraint` prefers it over the auto-index and the source PK is
8
+ -- recovered from the MV projection to resolve IGNORE / ABORT / REPLACE against
9
+ -- the correct source row.
10
+ --
11
+ -- This file runs under BOTH the memory module (`yarn test`) and the store module
12
+ -- (`yarn test:store`); under the store the source table is a store table while the
13
+ -- covering MV's backing table is always the memory module, queried through the db.
14
+
15
+ -- ===================================
16
+ -- 1. INSERT — default ABORT, OR IGNORE, OR REPLACE through the covering MV.
17
+ -- ===================================
18
+
19
+ create table t (id integer primary key, x integer not null, y integer not null, unique (x, y));
20
+ create materialized view ix as select x, y, id from t order by x, y;
21
+ insert into t values (1, 5, 5);
22
+
23
+ -- default ABORT: a duplicate (x,y) with a different PK is rejected
24
+ insert into t values (2, 5, 5);
25
+ -- error: UNIQUE constraint failed
26
+
27
+ select id, x, y from t order by id;
28
+ → [{"id":1,"x":5,"y":5}]
29
+
30
+ -- OR IGNORE: the duplicate is silently skipped
31
+ insert or ignore into t values (2, 5, 5);
32
+ select id, x, y from t order by id;
33
+ → [{"id":1,"x":5,"y":5}]
34
+
35
+ -- OR REPLACE: the prior source row (recovered by PK = 1) is evicted, the new row lands
36
+ insert or replace into t values (10, 5, 5);
37
+ select id, x, y from t order by id;
38
+ → [{"id":10,"x":5,"y":5}]
39
+ -- The internal REPLACE eviction is now reported via `UpdateResult.evictedRows`, so the
40
+ -- DML executor's eviction pipeline maintains the covering MV's backing uniformly across
41
+ -- memory, direct store, AND the isolation-wrapped store path (yarn test:store) — the MV
42
+ -- shows only id=10 on every path (internal-eviction-reporting).
43
+ select x, y, id from ix order by x, y;
44
+ → [{"x":5,"y":5,"id":10}]
45
+
46
+ -- ===================================
47
+ -- 2. Multi-row INSERT with an intra-statement duplicate (reads-own-writes through
48
+ -- the coordinated backing connection mid-statement).
49
+ -- ===================================
50
+
51
+ create table m (id integer primary key, x integer not null, y integer not null, unique (x, y));
52
+ create materialized view m_ix as select x, y, id from m order by x, y;
53
+
54
+ -- ABORT: the second row collides with the first written earlier in the statement
55
+ insert into m values (1, 7, 7), (2, 7, 7);
56
+ -- error: UNIQUE constraint failed
57
+
58
+ select count(*) as n from m;
59
+ → [{"n":0}]
60
+
61
+ -- OR IGNORE: the first row lands, the intra-statement duplicate is skipped
62
+ insert or ignore into m values (1, 7, 7), (2, 7, 7);
63
+ select id, x, y from m order by id;
64
+ → [{"id":1,"x":7,"y":7}]
65
+
66
+ -- ===================================
67
+ -- 3. UPDATE — moving a row onto an existing UC value (default ABORT), and a
68
+ -- schema-level ON CONFLICT REPLACE default that evicts + maintains the backing.
69
+ -- ===================================
70
+
71
+ create table u (id integer primary key, x integer not null, y integer not null, unique (x, y));
72
+ create materialized view u_ix as select x, y, id from u order by x, y;
73
+ insert into u values (1, 5, 5), (2, 6, 6);
74
+
75
+ -- moving id=1 onto (6,6) collides with id=2 (UPDATE OR <action> is unsupported,
76
+ -- so the constraint's ABORT default governs)
77
+ update u set x = 6, y = 6 where id = 1;
78
+ -- error: UNIQUE constraint failed
79
+
80
+ select id, x, y from u order by id;
81
+ → [{"id":1,"x":5,"y":5},{"id":2,"x":6,"y":6}]
82
+
83
+ create table ur (id integer primary key, x integer not null, y integer not null, unique (x, y) on conflict replace);
84
+ create materialized view ur_ix as select x, y, id from ur order by x, y;
85
+ insert into ur values (1, 5, 5), (2, 6, 6);
86
+
87
+ -- the REPLACE default drives eviction of id=2 when id=1 moves onto (6,6)
88
+ update ur set x = 6, y = 6 where id = 1;
89
+ select id, x, y from ur order by id;
90
+ → [{"id":1,"x":6,"y":6}]
91
+ -- the evicted id=2 is reported via `evictedRows`, so its backing entry is removed and
92
+ -- the moved id=1 is maintained — the covering MV shows only (6,6,id=1) on every path.
93
+ select x, y, id from ur_ix order by x, y;
94
+ → [{"x":6,"y":6,"id":1}]
95
+
96
+ -- ===================================
97
+ -- 4. UPDATE that changes the PK only (UC value unchanged) is NOT a self-conflict.
98
+ -- The internal old-row delete bypasses the row-time hook, leaving id=1's backing
99
+ -- entry transiently present; the live-source validation must skip that stale
100
+ -- candidate rather than raise a phantom conflict.
101
+ -- ===================================
102
+
103
+ create table pk (id integer primary key, x integer not null, y integer not null, unique (x, y));
104
+ create materialized view pk_ix as select x, y, id from pk order by x, y;
105
+ insert into pk values (1, 5, 5);
106
+
107
+ update pk set id = 10 where id = 1;
108
+ select id, x, y from pk order by id;
109
+ → [{"id":10,"x":5,"y":5}]
110
+ select x, y, id from pk_ix order by x, y;
111
+ → [{"x":5,"y":5,"id":10}]
112
+
113
+ -- ===================================
114
+ -- 5. Partial covering MV — a source row outside the predicate is not checked.
115
+ -- ===================================
116
+ -- Lives in 54.1-covering-mv-partial-enforcement: a partial UNIQUE can only be spelled
117
+ -- as `create unique index … where …`, so it needs standalone index DDL.
118
+
119
+ -- ===================================
120
+ -- 6. A covering MV declared with bare DDL (the only form now — every MV is
121
+ -- row-time maintained) routes enforcement through the MV just like the explicit
122
+ -- cases above. The auto-index also still enforces, so the constraint holds.
123
+ -- ===================================
124
+
125
+ create table man (id integer primary key, x integer not null, y integer not null, unique (x, y));
126
+ create materialized view man_ix as select x, y, id from man order by x, y;
127
+ insert into man values (1, 5, 5);
128
+ insert into man values (2, 5, 5);
129
+ -- error: UNIQUE constraint failed
130
+ select id, x, y from man order by id;
131
+ → [{"id":1,"x":5,"y":5}]
132
+
133
+ -- ===================================
134
+ -- 7. Covering MV that is ALSO a chain link. The level-1 MV `cix` is the covering
135
+ -- structure enforcing UNIQUE(x,y) on `ct`; it is itself the source of a level-2
136
+ -- MV `cix2`. UNIQUE enforcement still routes through the level-1 covering MV
137
+ -- (intra-statement reads-own-writes on its backing), and each level-1 backing
138
+ -- write cascades to the level-2 MV so it stays row-time consistent — including a
139
+ -- full statement rollback when a later row aborts. (A constraint proved by a
140
+ -- *downstream* MV — the prover seeing through the chain to the base table — is the
141
+ -- lens layer's concern, tracked in `lens-prover-and-attachment`; this case covers
142
+ -- the in-reach level-1 covering MV whose backing then cascades.)
143
+ -- ===================================
144
+
145
+ create table ct (id integer primary key, x integer not null, y integer not null, unique (x, y));
146
+ create materialized view cix as select x, y, id from ct order by x, y;
147
+ create materialized view cix2 as select x, y, id from cix;
148
+ insert into ct values (1, 5, 5);
149
+
150
+ -- the level-2 MV reflects the cascade from the first insert
151
+ select x, y, id from cix2 order by x, y;
152
+ → [{"x":5,"y":5,"id":1}]
153
+
154
+ -- ABORT: an intra-statement duplicate (x,y)=(7,7) is detected via the covering MV;
155
+ -- the whole statement rolls back, leaving the cascaded level-2 MV consistent too.
156
+ insert into ct values (10, 7, 7), (11, 7, 7);
157
+ -- error: UNIQUE constraint failed
158
+ select x, y, id from cix2 order by x, y;
159
+ → [{"x":5,"y":5,"id":1}]
160
+
161
+ -- OR IGNORE: the first new row lands and cascades to level 2; the intra-statement
162
+ -- duplicate is skipped (the covering MV's backing reflects the earlier same-statement
163
+ -- row), so level 2 ends with exactly the surviving rows.
164
+ insert or ignore into ct values (10, 7, 7), (11, 7, 7);
165
+ select x, y, id from cix2 order by x, y;
166
+ → [{"x":5,"y":5,"id":1},{"x":7,"y":7,"id":10}]
167
+
168
+ -- a plain duplicate against a committed row is still rejected by the covering MV
169
+ insert into ct values (12, 5, 5);
170
+ -- error: UNIQUE constraint failed
171
+ select id, x, y from ct order by id;
172
+ → [{"id":1,"x":5,"y":5},{"id":10,"x":7,"y":7}]
173
+
174
+ -- ===================================
175
+ -- 8. Covering MV that ALSO carries a deterministic computed column
176
+ -- (materialized-view-rowtime-expression-projections). The UC columns and PK stay
177
+ -- passthrough (so the prover still links it as the covering structure and the
178
+ -- source PK is recoverable for conflict resolution); the extra computed column is
179
+ -- just stored and maintained alongside. Enforcement (ABORT / REPLACE) is unchanged,
180
+ -- and the computed column tracks the surviving row through a REPLACE eviction.
181
+ -- ===================================
182
+
183
+ create table ce (id integer primary key, x integer not null, y integer not null, unique (x, y));
184
+ create materialized view ce_ix as select x, y, id, x + y as sxy from ce order by x, y;
185
+ insert into ce values (1, 5, 5);
186
+ select x, y, id, sxy from ce_ix order by x, y;
187
+ → [{"x":5,"y":5,"id":1,"sxy":10}]
188
+
189
+ -- default ABORT through the covering MV (the extra computed column does not perturb
190
+ -- the inverse PK/UC map, which reads only the passthrough projectors)
191
+ insert into ce values (2, 5, 5);
192
+ -- error: UNIQUE constraint failed
193
+ select id, x, y from ce order by id;
194
+ → [{"id":1,"x":5,"y":5}]
195
+
196
+ -- OR REPLACE: id=1 evicted, id=10 lands; the computed sxy is maintained for the
197
+ -- surviving row
198
+ insert or replace into ce values (10, 5, 5);
199
+ select id, x, y from ce order by id;
200
+ → [{"id":10,"x":5,"y":5}]
201
+
202
+ -- ===================================
203
+ -- 9. Per-statement maintenance batching must NOT hide an earlier same-statement row
204
+ -- from a later row's enforcement scan (materialized-view-rowtime-per-statement-
205
+ -- batching). The batching change amortizes the backing-connection *resolution* over
206
+ -- the statement but still applies each row's maintenance immediately, so a later row
207
+ -- in the SAME bulk statement sees every earlier row's backing entry. These cases are
208
+ -- the regression guard for that invariant: a duplicate buried deep in a bulk INSERT,
209
+ -- and an intra-statement OR REPLACE, both resolve against the just-written rows.
210
+ -- ===================================
211
+
212
+ create table bb (id integer primary key, x integer not null, y integer not null, unique (x, y));
213
+ create materialized view bb_ix as select x, y, id from bb order by x, y;
214
+ insert into bb values (100, 1, 1);
215
+
216
+ -- ABORT: a LATER row (#5) duplicates an EARLIER row of the SAME statement (#3). The
217
+ -- covering MV's backing reflects rows 1..4 written earlier this statement, so the
218
+ -- duplicate is detected and the WHOLE statement rolls back — neither the bulk rows
219
+ -- nor any backing delta survive (only the pre-existing row remains).
220
+ insert into bb values (1, 10, 10), (2, 20, 20), (3, 30, 30), (4, 40, 40), (5, 30, 30);
221
+ -- error: UNIQUE constraint failed
222
+ select id, x, y from bb order by id;
223
+ → [{"id":100,"x":1,"y":1}]
224
+
225
+ -- OR IGNORE: rows 1..4 land and are maintained; row 5 (the intra-statement duplicate
226
+ -- of row 3, seen via the backing) is skipped. The surviving set proves the earlier
227
+ -- same-statement row was visible to the later row's enforcement scan.
228
+ insert or ignore into bb values (1, 10, 10), (2, 20, 20), (3, 30, 30), (4, 40, 40), (5, 30, 30);
229
+ select id, x, y from bb order by id;
230
+ → [{"id":1,"x":10,"y":10},{"id":2,"x":20,"y":20},{"id":3,"x":30,"y":30},{"id":4,"x":40,"y":40},{"id":100,"x":1,"y":1}]
231
+
232
+ -- OR REPLACE: an intra-statement duplicate evicts the just-written earlier same-statement
233
+ -- row (recovered from the backing this statement wrote) and the later row lands. Two rows
234
+ -- of one statement share (x,y)=(7,7): row 1 (id=1) is written, then row 2 (id=2) collides
235
+ -- with it and REPLACE evicts id=1 — end state is id=2 only.
236
+ create table rr (id integer primary key, x integer not null, y integer not null, unique (x, y));
237
+ create materialized view rr_ix as select x, y, id from rr order by x, y;
238
+ insert or replace into rr values (1, 7, 7), (2, 7, 7);
239
+ select id, x, y from rr order by id;
240
+ → [{"id":2,"x":7,"y":7}]
241
+ -- the intra-statement eviction of id=1 is reported via `evictedRows`; its backing entry
242
+ -- is removed and id=2 maintained — the covering MV shows only (7,7,id=2) on every path.
243
+ select x, y, id from rr_ix order by x, y;
244
+ → [{"x":7,"y":7,"id":2}]
245
+
246
+ -- ===================================
247
+ -- 10. Per-statement batching must preserve covering-UNIQUE enforcement visibility on the
248
+ -- UPDATE path too (materialized-view-rowtime-per-statement-batching). The update
249
+ -- generator owns the same per-statement BackingConnectionCache as insert, and a
250
+ -- covering UNIQUE is enforced inside the source vtab's update path
251
+ -- (manager.performUpdate → checkUniqueConstraints → checkUniqueViaMaterializedView,
252
+ -- scanning the MV backing). §9 covered only INSERT; this guards UPDATE.
253
+ --
254
+ -- A single bulk UPDATE moves id=1 and id=2 onto the SAME covered value. Whichever
255
+ -- row is processed second has its enforcement scan observe the first row's
256
+ -- same-statement backing write and the whole statement aborts — order-independent
257
+ -- (were the connection cache to hide the earlier same-statement update, both rows
258
+ -- would silently reach x=100). Asserts source end-state only (store-safe).
259
+ -- ===================================
260
+
261
+ create table ub (id integer primary key, x integer not null, unique (x));
262
+ create materialized view ub_ix as select x, id from ub order by x;
263
+ insert into ub values (1, 1), (2, 2), (3, 3);
264
+
265
+ update ub set x = 100 where id in (1, 2);
266
+ -- error: UNIQUE constraint failed
267
+ select id, x from ub order by id;
268
+ → [{"id":1,"x":1},{"id":2,"x":2},{"id":3,"x":3}]
269
+
270
+ -- ===================================
271
+ -- 11. Write-through to a covering MV (materialized-view-dml-write-through). DML
272
+ -- targeting the covering MV's *name* is rewritten to target the source table
273
+ -- (write-through via view updateability) and re-planned through the base-table
274
+ -- builder, so the source write is UNIQUE-enforced through the same covering MV's
275
+ -- backing it would be for a direct source write. A conflicting write-through is
276
+ -- therefore resolved (ABORT / IGNORE / REPLACE) against the live backing exactly
277
+ -- as a direct source write is — write-through and covering enforcement compose
278
+ -- with no extra wiring. Asserts source end-state only (store-safe).
279
+ -- ===================================
280
+
281
+ create table wt (id integer primary key, x integer not null, y integer not null, unique (x, y));
282
+ create materialized view wt_ix as select x, y, id from wt order by x, y;
283
+
284
+ -- the first write-through INSERT lands in the source
285
+ insert into wt_ix (id, x, y) values (1, 5, 5);
286
+ select id, x, y from wt order by id;
287
+ → [{"id":1,"x":5,"y":5}]
288
+
289
+ -- default ABORT: a write-through INSERT duplicating (x,y) with a new PK is rejected
290
+ insert into wt_ix (id, x, y) values (2, 5, 5);
291
+ -- error: UNIQUE constraint failed
292
+ select id, x, y from wt order by id;
293
+ → [{"id":1,"x":5,"y":5}]
294
+
295
+ -- OR IGNORE through the MV: the duplicate is silently skipped
296
+ insert or ignore into wt_ix (id, x, y) values (2, 5, 5);
297
+ select id, x, y from wt order by id;
298
+ → [{"id":1,"x":5,"y":5}]
299
+
300
+ -- OR REPLACE through the MV: the prior source row (recovered by PK = 1 from the backing)
301
+ -- is evicted, the new row lands
302
+ insert or replace into wt_ix (id, x, y) values (10, 5, 5);
303
+ select id, x, y from wt order by id;
304
+ → [{"id":10,"x":5,"y":5}]
305
+
306
+ -- UPDATE through the MV moving a row onto an existing UC value is rejected (ABORT
307
+ -- default; UPDATE OR <action> is unsupported, so the constraint default governs)
308
+ create table wu (id integer primary key, x integer not null, y integer not null, unique (x, y));
309
+ create materialized view wu_ix as select x, y, id from wu order by x, y;
310
+ insert into wu_ix (id, x, y) values (1, 5, 5), (2, 6, 6);
311
+ update wu_ix set x = 6, y = 6 where id = 1;
312
+ -- error: UNIQUE constraint failed
313
+ select id, x, y from wu order by id;
314
+ → [{"id":1,"x":5,"y":5},{"id":2,"x":6,"y":6}]
@@ -0,0 +1,34 @@
1
+ -- 54.1-covering-mv-partial-enforcement.sqllogic
2
+ --
3
+ -- requires-capability: standalone-index-ddl
4
+ --
5
+ -- Carved out of 54-covering-mv-enforcement: every other section declares the UNIQUE the
6
+ -- covering materialized view proves against inline or table-level. A PARTIAL UNIQUE has
7
+ -- no declarative spelling in this engine — `create unique index … where …` is the only
8
+ -- way to express it — so this section is the file's index DDL.
9
+ --
10
+ -- Subject: a partial covering MV enforces its partial UNIQUE only over source rows
11
+ -- inside the predicate; rows outside it never conflict.
12
+
13
+ -- ===================================
14
+ -- Partial covering MV — a source row outside the predicate is not checked.
15
+ -- ===================================
16
+
17
+ create table p (id integer primary key, x integer not null, y integer not null, active integer not null);
18
+ create unique index p_uq on p (x, y) where active = 1;
19
+ create materialized view p_ix as select x, y, id from p where active = 1 order by x, y;
20
+
21
+ insert into p values (1, 5, 5, 1);
22
+ -- an out-of-scope row sharing (x,y) does NOT conflict
23
+ insert into p values (2, 5, 5, 0);
24
+ -- two out-of-scope rows sharing (x,y) do NOT conflict
25
+ insert into p values (3, 8, 8, 0), (4, 8, 8, 0);
26
+ select count(*) as n from p;
27
+ → [{"n":4}]
28
+
29
+ -- a second in-scope row sharing (x,y) DOES conflict
30
+ insert into p values (5, 5, 5, 1);
31
+ -- error: UNIQUE constraint failed
32
+
33
+ select count(*) as n from p;
34
+ → [{"n":4}]
@@ -0,0 +1,89 @@
1
+ -- 55-internal-eviction-reporting.sqllogic — a secondary-UNIQUE REPLACE eviction (a new
2
+ -- row collides on a NON-PK UNIQUE with an existing row at a DIFFERENT primary key) is
3
+ -- reported to the DML executor via `UpdateResult.evictedRows`, so the executor runs the
4
+ -- full delete pipeline for the evicted row: FK ON DELETE actions, change-tracking, and
5
+ -- events. Before internal-eviction-reporting the eviction happened invisibly inside the
6
+ -- substrate's update(), so none of those cross-cuts fired for it.
7
+ --
8
+ -- This file runs under BOTH the memory module (`yarn test`) and the store module
9
+ -- (`yarn test:store`, which wraps the store in the isolation layer). The FK cascades
10
+ -- below are driven by the executor, so they must fire on every substrate.
11
+
12
+ PRAGMA foreign_keys = true;
13
+
14
+ -- ===================================
15
+ -- 1. NON-COVERED (plain UNIQUE index/scan, no covering MV) — FK ON DELETE CASCADE on the
16
+ -- evictee's children. This validates the FK fix independently of the covering-MV path:
17
+ -- the UNIQUE(email) conflict is detected by the auto-index (memory) / source scan
18
+ -- (store), and the eviction must still cascade.
19
+ -- ===================================
20
+
21
+ create table p1 (id integer primary key, email text not null, unique (email));
22
+ create table c1 (cid integer primary key, pid integer not null, foreign key (pid) references p1(id) on delete cascade);
23
+ insert into p1 values (1, 'a@x');
24
+ insert into c1 values (10, 1), (11, 1);
25
+
26
+ -- secondary-UNIQUE REPLACE: new row (id=2, email='a@x') collides on UNIQUE(email) with
27
+ -- id=1 (a DIFFERENT PK), evicting id=1; id=1's children cascade away.
28
+ insert or replace into p1 values (2, 'a@x');
29
+ select id, email from p1 order by id;
30
+ → [{"id":2,"email":"a@x"}]
31
+ select cid, pid from c1 order by cid;
32
+ → []
33
+
34
+ -- ===================================
35
+ -- 2. NON-COVERED — FK ON DELETE SET NULL nulls the evictee's children instead of deleting.
36
+ -- ===================================
37
+
38
+ create table p2 (id integer primary key, email text not null, unique (email));
39
+ create table c2 (cid integer primary key, pid integer null, foreign key (pid) references p2(id) on delete set null);
40
+ insert into p2 values (1, 'b@x');
41
+ insert into c2 values (10, 1);
42
+
43
+ insert or replace into p2 values (2, 'b@x');
44
+ select id, email from p2 order by id;
45
+ → [{"id":2,"email":"b@x"}]
46
+ select cid, pid from c2 order by cid;
47
+ → [{"cid":10,"pid":null}]
48
+
49
+ -- ===================================
50
+ -- 3. NON-COVERED — UPDATE that moves a row onto an occupied secondary-UNIQUE value under a
51
+ -- schema-level ON CONFLICT REPLACE default evicts the row at the other PK and cascades.
52
+ -- (UPDATE OR <action> is unsupported, so the constraint default governs.)
53
+ -- ===================================
54
+
55
+ create table p4 (id integer primary key, email text not null, unique (email) on conflict replace);
56
+ create table c4 (cid integer primary key, pid integer not null, foreign key (pid) references p4(id) on delete cascade);
57
+ insert into p4 values (1, 'm@x'), (2, 'n@x');
58
+ insert into c4 values (20, 2);
59
+
60
+ -- moving id=1 onto email='n@x' collides with id=2; the REPLACE default evicts id=2,
61
+ -- cascading away id=2's child.
62
+ update p4 set email = 'n@x' where id = 1;
63
+ select id, email from p4 order by id;
64
+ → [{"id":1,"email":"n@x"}]
65
+ select cid, pid from c4 order by cid;
66
+ → []
67
+
68
+ -- ===================================
69
+ -- 4. COVERED (covering materialized view) — the FK ON DELETE CASCADE fires for the eviction
70
+ -- AND the covering MV's backing is maintained for it, on every substrate (the isolation
71
+ -- layer now gets covering-MV backing consistency for free, via the executor's eviction
72
+ -- pipeline rather than its own merged-view detection).
73
+ -- ===================================
74
+
75
+ create table p3 (id integer primary key, x integer not null, y integer not null, unique (x, y));
76
+ create materialized view p3_ix as select x, y, id from p3 order by x, y;
77
+ create table c3 (cid integer primary key, pid integer not null, foreign key (pid) references p3(id) on delete cascade);
78
+ insert into p3 values (1, 5, 5);
79
+ insert into c3 values (10, 1);
80
+
81
+ insert or replace into p3 values (2, 5, 5);
82
+ select id, x, y from p3 order by id;
83
+ → [{"id":2,"x":5,"y":5}]
84
+ -- the evicted parent's child cascaded away
85
+ select cid, pid from c3 order by cid;
86
+ → []
87
+ -- the covering MV's backing reflects only the surviving row (id=2)
88
+ select x, y, id from p3_ix order by x, y;
89
+ → [{"x":5,"y":5,"id":2}]
@@ -0,0 +1,202 @@
1
+ -- Lens prover + constraint attachment (docs/lens.md §§ Constraint Attachment /
2
+ -- Coverage checklist; ticket `lens-prover-and-attachment`).
3
+ --
4
+ -- Exercises the prover's user-visible contract through the full SQL pipeline:
5
+ -- the deploy-blocking coverage-checklist errors, and the read-only mutation gate
6
+ -- for a logical table whose primary key is not reconstructible at the lens
7
+ -- boundary. (Per-obligation classification + the advisory report are unit-tested
8
+ -- in test/lens-prover.spec.ts; the live per-write enforcement of row-local /
9
+ -- set-level / FK obligations is the follow-up `lens-constraint-enforcement-wiring`.)
10
+
11
+ -- ===================================
12
+ -- 1. A proved logical schema deploys and reads through the lens
13
+ -- ===================================
14
+
15
+ declare schema basis1 {
16
+ table t (
17
+ id integer primary key,
18
+ name text
19
+ )
20
+ }
21
+
22
+ -- run
23
+
24
+ apply schema basis1;
25
+
26
+ -- run
27
+
28
+ insert into basis1.t values (1, 'alpha'), (2, 'beta');
29
+
30
+ -- run
31
+
32
+ declare logical schema app1 {
33
+ table t (
34
+ id integer primary key,
35
+ name text,
36
+ unique (id)
37
+ )
38
+ }
39
+
40
+ -- run
41
+
42
+ -- Explicit basis binding (the shared-DB sqllogic harness accumulates basis
43
+ -- schemas across scenarios, so default-basis inference would be ambiguous).
44
+ declare lens for app1 over basis1 { }
45
+
46
+ -- run
47
+
48
+ apply schema app1;
49
+
50
+ -- run
51
+
52
+ select * from app1.t order by id;
53
+ → [{"id": 1, "name": "alpha"}, {"id": 2, "name": "beta"}]
54
+
55
+ -- ===================================
56
+ -- 2. Type mismatch blocks the deploy (logical int over basis text)
57
+ -- ===================================
58
+
59
+ declare schema basis2 {
60
+ table t (
61
+ id text primary key
62
+ )
63
+ }
64
+
65
+ -- run
66
+
67
+ apply schema basis2;
68
+
69
+ -- run
70
+
71
+ declare logical schema app2 {
72
+ table t (
73
+ id integer primary key
74
+ )
75
+ }
76
+
77
+ -- run
78
+
79
+ declare lens for app2 over basis2 { }
80
+
81
+ -- run
82
+
83
+ apply schema app2;
84
+ -- error: lens.type-mismatch
85
+
86
+ -- ===================================
87
+ -- 3. Nullability mismatch blocks the deploy (NOT NULL logical over nullable basis)
88
+ -- ===================================
89
+
90
+ declare schema basis3 {
91
+ table t (
92
+ id integer primary key,
93
+ note text null
94
+ )
95
+ }
96
+
97
+ -- run
98
+
99
+ apply schema basis3;
100
+
101
+ -- run
102
+
103
+ declare logical schema app3 {
104
+ table t (
105
+ id integer primary key,
106
+ note text
107
+ )
108
+ }
109
+
110
+ -- run
111
+
112
+ declare lens for app3 over basis3 { }
113
+
114
+ -- run
115
+
116
+ apply schema app3;
117
+ -- error: lens.nullability-mismatch
118
+
119
+ -- ===================================
120
+ -- 4. A check over a computed (non-invertible) column is unrealizable
121
+ -- ===================================
122
+
123
+ declare schema basis4 {
124
+ table src (
125
+ id integer primary key,
126
+ v integer
127
+ )
128
+ }
129
+
130
+ -- run
131
+
132
+ apply schema basis4;
133
+
134
+ -- run
135
+
136
+ declare logical schema app4 {
137
+ table m (
138
+ id integer primary key,
139
+ doubled integer,
140
+ constraint pos check (doubled >= 0)
141
+ )
142
+ }
143
+
144
+ -- run
145
+
146
+ declare lens for app4 over basis4 {
147
+ view m as select id, v * 2 as doubled from basis4.src
148
+ }
149
+
150
+ -- run
151
+
152
+ apply schema app4;
153
+ -- error: lens.unrealizable-constraint
154
+
155
+ -- ===================================
156
+ -- 5. A non-reconstructible primary key deploys read-only; reads work, writes error
157
+ -- ===================================
158
+
159
+ declare schema basis5 {
160
+ table src (
161
+ id integer primary key,
162
+ v integer
163
+ )
164
+ }
165
+
166
+ -- run
167
+
168
+ apply schema basis5;
169
+
170
+ -- run
171
+
172
+ insert into basis5.src values (1, 10);
173
+
174
+ -- run
175
+
176
+ declare logical schema app5 {
177
+ table m (
178
+ k integer primary key,
179
+ v integer
180
+ )
181
+ }
182
+
183
+ -- run
184
+
185
+ -- `k` maps to a computed expression (v + 1) — not reconstructible at the boundary.
186
+ declare lens for app5 over basis5 {
187
+ view m as select v + 1 as k, v from basis5.src
188
+ }
189
+
190
+ -- run
191
+
192
+ apply schema app5;
193
+
194
+ -- run
195
+
196
+ -- Reads still resolve through the lens.
197
+ select k, v from app5.m;
198
+ → [{"k": 11, "v": 10}]
199
+
200
+ -- Any mutation errors at the lens boundary.
201
+ insert into app5.m (k, v) values (5, 4);
202
+ -- error: read-only