@quereus/quereus 4.20.1 → 4.20.3

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 (380) hide show
  1. package/README.md +2 -0
  2. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  3. package/dist/src/schema/schema-differ.js +17 -69
  4. package/dist/src/schema/schema-differ.js.map +1 -1
  5. package/package.json +7 -4
  6. package/test/README.md +173 -0
  7. package/test/logic/01-basic.sqllogic +39 -0
  8. package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
  9. package/test/logic/01.2-strings.sqllogic +43 -0
  10. package/test/logic/01.5-insert-select.sqllogic +237 -0
  11. package/test/logic/01.6-update-extras.sqllogic +118 -0
  12. package/test/logic/01.7-update-from.sqllogic +67 -0
  13. package/test/logic/01.8-delete-extras.sqllogic +122 -0
  14. package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
  15. package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
  16. package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
  17. package/test/logic/01.9-query-expr-values.sqllogic +111 -0
  18. package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
  19. package/test/logic/02-filters.sqllogic +54 -0
  20. package/test/logic/02-smoke.sqllogic +62 -0
  21. package/test/logic/02.1-bind-parameters.sqllogic +223 -0
  22. package/test/logic/03-expressions.sqllogic +190 -0
  23. package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
  24. package/test/logic/03.4-defaults.sqllogic +554 -0
  25. package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
  26. package/test/logic/03.5-tvf.sqllogic +61 -0
  27. package/test/logic/03.6-type-system.sqllogic +544 -0
  28. package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
  29. package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
  30. package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
  31. package/test/logic/03.8-not-precedence.sqllogic +255 -0
  32. package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
  33. package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
  34. package/test/logic/04-order-by.sqllogic +38 -0
  35. package/test/logic/04-transactions.sqllogic +239 -0
  36. package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
  37. package/test/logic/05-vtab_memory.sqllogic +50 -0
  38. package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
  39. package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
  40. package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
  41. package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
  42. package/test/logic/06-builtin_functions.sqllogic +149 -0
  43. package/test/logic/06.1-string-functions.sqllogic +92 -0
  44. package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
  45. package/test/logic/06.2-math-functions.sqllogic +82 -0
  46. package/test/logic/06.3-schema.sqllogic +48 -0
  47. package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
  48. package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
  49. package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
  50. package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
  51. package/test/logic/06.3.4-view-info.sqllogic +378 -0
  52. package/test/logic/06.3.5-column-info.sqllogic +347 -0
  53. package/test/logic/06.3.6-schema-views.sqllogic +29 -0
  54. package/test/logic/06.4-schema-search-path.sqllogic +354 -0
  55. package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
  56. package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
  57. package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
  58. package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
  59. package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
  60. package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
  61. package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
  62. package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
  63. package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
  64. package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
  65. package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
  66. package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
  67. package/test/logic/06.7-json-extended.sqllogic +53 -0
  68. package/test/logic/06.8-json-path-operators.sqllogic +99 -0
  69. package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
  70. package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
  71. package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
  72. package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
  73. package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
  74. package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
  75. package/test/logic/07-aggregates.sqllogic +193 -0
  76. package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
  77. package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
  78. package/test/logic/07.3-group-by-extras.sqllogic +602 -0
  79. package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
  80. package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
  81. package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
  82. package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
  83. package/test/logic/07.5-window.sqllogic +1941 -0
  84. package/test/logic/07.5.1-window-named.sqllogic +13 -0
  85. package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
  86. package/test/logic/07.6-subqueries.sqllogic +78 -0
  87. package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
  88. package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
  89. package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
  90. package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
  91. package/test/logic/07.7.1-in-extras.sqllogic +158 -0
  92. package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
  93. package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
  94. package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
  95. package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
  96. package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
  97. package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
  98. package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
  99. package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
  100. package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
  101. package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
  102. package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
  103. package/test/logic/07.9-in-value-list.sqllogic +154 -0
  104. package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
  105. package/test/logic/08-views.sqllogic +64 -0
  106. package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
  107. package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
  108. package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
  109. package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
  110. package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
  111. package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
  112. package/test/logic/09-set_operations.sqllogic +244 -0
  113. package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
  114. package/test/logic/10-distinct_datatypes.sqllogic +127 -0
  115. package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
  116. package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
  117. package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
  118. package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
  119. package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
  120. package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
  121. package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
  122. package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
  123. package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
  124. package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
  125. package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
  126. package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
  127. package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
  128. package/test/logic/10.2-column-features.sqllogic +365 -0
  129. package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
  130. package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
  131. package/test/logic/10.3-function-features.sqllogic +247 -0
  132. package/test/logic/10.4-schema-scale.sqllogic +168 -0
  133. package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
  134. package/test/logic/10.5-indexes.sqllogic +164 -0
  135. package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
  136. package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
  137. package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
  138. package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
  139. package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
  140. package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
  141. package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
  142. package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
  143. package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
  144. package/test/logic/100.1-where-extras.sqllogic +163 -0
  145. package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
  146. package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
  147. package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
  148. package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
  149. package/test/logic/102-unique-constraints.sqllogic +145 -0
  150. package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
  151. package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
  152. package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
  153. package/test/logic/102.2-unique-collation.sqllogic +181 -0
  154. package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
  155. package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
  156. package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
  157. package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
  158. package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
  159. package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
  160. package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
  161. package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
  162. package/test/logic/108-cardinality-estimation.sqllogic +146 -0
  163. package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
  164. package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
  165. package/test/logic/11-joins.sqllogic +86 -0
  166. package/test/logic/11.1-join-using.sqllogic +267 -0
  167. package/test/logic/11.2-comma-join.sqllogic +35 -0
  168. package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
  169. package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
  170. package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
  171. package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
  172. package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
  173. package/test/logic/12-empty-primary-key.sqllogic +124 -0
  174. package/test/logic/12-join_padding_order.sqllogic +58 -0
  175. package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
  176. package/test/logic/13-cte.sqllogic +137 -0
  177. package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
  178. package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
  179. package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
  180. package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
  181. package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
  182. package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
  183. package/test/logic/13.4-cte-extras.sqllogic +98 -0
  184. package/test/logic/13.5-cte-join-order.sqllogic +166 -0
  185. package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
  186. package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
  187. package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
  188. package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
  189. package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
  190. package/test/logic/14-utilities.sqllogic +168 -0
  191. package/test/logic/15-timespan.sqllogic +279 -0
  192. package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
  193. package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
  194. package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
  195. package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
  196. package/test/logic/16-epoch.sqllogic +187 -0
  197. package/test/logic/17-weekday-modifier.sqllogic +78 -0
  198. package/test/logic/18-json-string-escapes.sqllogic +86 -0
  199. package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
  200. package/test/logic/20-empty-single-row.sqllogic +261 -0
  201. package/test/logic/21-null-edge-cases.sqllogic +227 -0
  202. package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
  203. package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
  204. package/test/logic/21.2-between-edges.sqllogic +157 -0
  205. package/test/logic/22-boundary-values.sqllogic +175 -0
  206. package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
  207. package/test/logic/24-builtin-branches.sqllogic +611 -0
  208. package/test/logic/24.1-substr-extras.sqllogic +75 -0
  209. package/test/logic/24.2-random-extras.sqllogic +39 -0
  210. package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
  211. package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
  212. package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
  213. package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
  214. package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
  215. package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
  216. package/test/logic/26-join-edge-cases.sqllogic +333 -0
  217. package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
  218. package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
  219. package/test/logic/26.3-join-on-constants.sqllogic +61 -0
  220. package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
  221. package/test/logic/27-window-edge-cases.sqllogic +206 -0
  222. package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
  223. package/test/logic/27.2-window-exclude.sqllogic +13 -0
  224. package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
  225. package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
  226. package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
  227. package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
  228. package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
  229. package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
  230. package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
  231. package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
  232. package/test/logic/40-constraints.sqllogic +418 -0
  233. package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
  234. package/test/logic/40.2-check-extras.sqllogic +683 -0
  235. package/test/logic/41-alter-table.sqllogic +191 -0
  236. package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
  237. package/test/logic/41-fk-cross-schema.sqllogic +155 -0
  238. package/test/logic/41-fk-extended-targets.sqllogic +173 -0
  239. package/test/logic/41-foreign-keys.sqllogic +1001 -0
  240. package/test/logic/41-generated-column-errors.sqllogic +225 -0
  241. package/test/logic/41-generated-column-extras.sqllogic +598 -0
  242. package/test/logic/41-generated-column-scope.sqllogic +329 -0
  243. package/test/logic/41-generated-columns.sqllogic +361 -0
  244. package/test/logic/41.1-alter-pk.sqllogic +230 -0
  245. package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
  246. package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
  247. package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
  248. package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
  249. package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
  250. package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
  251. package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
  252. package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
  253. package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
  254. package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
  255. package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
  256. package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
  257. package/test/logic/41.2-alter-column.sqllogic +382 -0
  258. package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
  259. package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
  260. package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
  261. package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
  262. package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
  263. package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
  264. package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
  265. package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
  266. package/test/logic/41.5-alter-misc.sqllogic +48 -0
  267. package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
  268. package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
  269. package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
  270. package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
  271. package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
  272. package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
  273. package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
  274. package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
  275. package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
  276. package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
  277. package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
  278. package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
  279. package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
  280. package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
  281. package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
  282. package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
  283. package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
  284. package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
  285. package/test/logic/42-committed-snapshot.sqllogic +254 -0
  286. package/test/logic/42-returning.sqllogic +159 -0
  287. package/test/logic/42.1-returning-extras.sqllogic +232 -0
  288. package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
  289. package/test/logic/43-default-nullability.sqllogic +131 -0
  290. package/test/logic/43-transition-constraints.sqllogic +341 -0
  291. package/test/logic/43.1-default-collation.sqllogic +140 -0
  292. package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
  293. package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
  294. package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
  295. package/test/logic/44-determinism-validation.sqllogic +164 -0
  296. package/test/logic/44-orthogonality.sqllogic +146 -0
  297. package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
  298. package/test/logic/45-udf-determinism.sqllogic +39 -0
  299. package/test/logic/46-mutation-context.sqllogic +595 -0
  300. package/test/logic/47-upsert.sqllogic +255 -0
  301. package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
  302. package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
  303. package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
  304. package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
  305. package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
  306. package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
  307. package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
  308. package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
  309. package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
  310. package/test/logic/49-reference-graph.sqllogic +84 -0
  311. package/test/logic/50-declarative-schema.sqllogic +2550 -0
  312. package/test/logic/50-metadata-tags.sqllogic +1033 -0
  313. package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
  314. package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
  315. package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
  316. package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +210 -0
  317. package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
  318. package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
  319. package/test/logic/51-lens-foundation.sqllogic +147 -0
  320. package/test/logic/51-materialized-views.sqllogic +376 -0
  321. package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
  322. package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
  323. package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
  324. package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
  325. package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
  326. package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
  327. package/test/logic/52-lens-overrides.sqllogic +566 -0
  328. package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
  329. package/test/logic/53-reserved-tags.sqllogic +252 -0
  330. package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
  331. package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
  332. package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
  333. package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
  334. package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
  335. package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
  336. package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
  337. package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
  338. package/test/logic/55-lens-prover.sqllogic +202 -0
  339. package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
  340. package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
  341. package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
  342. package/test/logic/81-quickpick.sqllogic +24 -0
  343. package/test/logic/82-bloom-join.sqllogic +185 -0
  344. package/test/logic/83-merge-join.sqllogic +280 -0
  345. package/test/logic/84-asof-scan.sqllogic +238 -0
  346. package/test/logic/84-key-cardinality.sqllogic +50 -0
  347. package/test/logic/85-relational-const-folding.sqllogic +51 -0
  348. package/test/logic/86-scalar-cse.sqllogic +42 -0
  349. package/test/logic/90-error_paths.sqllogic +114 -0
  350. package/test/logic/90.1-parse-errors.sqllogic +77 -0
  351. package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
  352. package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
  353. package/test/logic/90.3-expression-errors.sqllogic +43 -0
  354. package/test/logic/90.4-dml-errors.sqllogic +47 -0
  355. package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
  356. package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
  357. package/test/logic/90.6-select-error-paths.sqllogic +57 -0
  358. package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
  359. package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
  360. package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
  361. package/test/logic/93.1-view-error-paths.sqllogic +74 -0
  362. package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
  363. package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
  364. package/test/logic/93.4-view-mutation.sqllogic +4881 -0
  365. package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
  366. package/test/logic/93.5-authored-inverse.sqllogic +415 -0
  367. package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
  368. package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
  369. package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
  370. package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
  371. package/test/logic/95-assertions.sqllogic +1417 -0
  372. package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
  373. package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
  374. package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
  375. package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
  376. package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
  377. package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
  378. package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
  379. package/test/logic/drop-unique-index.sqllogic +88 -0
  380. package/test/logic/pushdown-test.sqllogic +36 -0
@@ -0,0 +1,274 @@
1
+ -- ALTER TABLE DROP COLUMN vs. the table's OWN foreign keys.
2
+ --
3
+ -- A foreign key records which of its own table's columns it constrains by POSITION
4
+ -- (`foreignKeys[].columns` is an array of indices into that table's column list), so a
5
+ -- DROP COLUMN has to renumber them — exactly as it already renumbers the primary key,
6
+ -- the secondary indexes and the UNIQUE constraints. A key that loses any of its child
7
+ -- columns is removed outright rather than narrowed (a key missing a child column is a
8
+ -- different constraint against the parent's key). Left unshifted, a surviving key's
9
+ -- index either dangles past the end of the column array (raw TypeError on the next
10
+ -- enforced write) or silently slides onto an unrelated column.
11
+ --
12
+ -- These cases run under both the memory module (`yarn test`) and the store module
13
+ -- (`yarn test:store`, which additionally round-trips the corrected keys through the
14
+ -- persisted DDL). Assertions read `foreign_key_info`, which is module-agnostic and
15
+ -- resolves the `from` column as `columns[fk.columns[seq]].name` — the very read that
16
+ -- raises on a dangling index.
17
+ --
18
+ -- NOTE: the `-- error:` lines match the auto-generated constraint name (`_fk_<table>_<cols>`)
19
+ -- on purpose — the name proves WHICH column is being enforced, which a generic `foreign key`
20
+ -- match would not. If that naming convention ever changes, update these expectations; the
21
+ -- convention itself is pinned by `41.4-alter-add-column-constraints.sqllogic` § 7e.
22
+ --
23
+ -- Most keys here are declared with `create table`; § 10 covers the same rule for a key
24
+ -- an `alter table add column … references …` created, which is also the shape the engine
25
+ -- reverts by dropping the just-added column.
26
+
27
+ pragma foreign_keys = true;
28
+
29
+ create table FkP (pid integer primary key);
30
+ insert into FkP values (1), (2);
31
+
32
+ -- ===================================================================
33
+ -- 1. A key whose child column sits AFTER the dropped one shifts down and
34
+ -- keeps constraining the same column.
35
+ -- ===================================================================
36
+
37
+ create table FkShift (id integer primary key, a integer, fkcol integer references FkP(pid));
38
+ insert into FkShift values (1, 10, 1);
39
+
40
+ -- Drop `a`, which precedes the FK child column: the recorded position 2 must become 1.
41
+ alter table FkShift drop column a;
42
+
43
+ -- Introspection resolves the child column (a dangling index throws here instead).
44
+ select "from", "to" from foreign_key_info('FkShift');
45
+ → [{"from":"fkcol","to":"pid"}]
46
+
47
+ -- Still enforced, and against the CORRECT column: an orphan is rejected. The
48
+ -- constraint named in the error is the one declared on `fkcol`, not a slid-over key.
49
+ insert into FkShift values (2, 99);
50
+ -- error: _fk_fkshift_fkcol
51
+
52
+ -- ...while a value present in the parent is accepted.
53
+ insert into FkShift values (3, 2);
54
+ select count(*) as c from FkShift;
55
+ → [{"c":2}]
56
+
57
+ -- ===================================================================
58
+ -- 2. Dropping the key's ONLY child column removes the whole key — it must not
59
+ -- slide onto the next column along. This is the silent-corruption case: with
60
+ -- the key left in place, position 1 now names the unrelated text column `z`,
61
+ -- which the engine would then check against the parent's integer key.
62
+ -- ===================================================================
63
+
64
+ create table FkGone (id integer primary key, fkcol integer references FkP(pid), z text);
65
+ insert into FkGone values (1, 1, 'a');
66
+ alter table FkGone drop column fkcol;
67
+
68
+ -- No key survives, so `foreignKeys` is back to empty.
69
+ select count(*) as c from foreign_key_info('FkGone');
70
+ → [{"c":0}]
71
+
72
+ -- `z` is unconstrained: a text value that is no parent key inserts cleanly.
73
+ insert into FkGone values (11, 'r');
74
+ select count(*) as c from FkGone;
75
+ → [{"c":2}]
76
+
77
+ -- ===================================================================
78
+ -- 3. A MULTI-column key that loses one of its columns is removed in full —
79
+ -- not narrowed to its surviving columns.
80
+ -- ===================================================================
81
+
82
+ create table FkP2 (a integer, b integer, primary key (a, b));
83
+ insert into FkP2 values (1, 2);
84
+
85
+ create table FkMulti (id integer primary key, x integer, y integer, foreign key (x, y) references FkP2(a, b));
86
+ insert into FkMulti values (1, 1, 2);
87
+
88
+ -- Enforced over the pair while both columns exist.
89
+ insert into FkMulti values (2, 9, 9);
90
+ -- error: _fk_fkmulti_x_y
91
+
92
+ alter table FkMulti drop column y;
93
+ select count(*) as c from foreign_key_info('FkMulti');
94
+ → [{"c":0}]
95
+
96
+ -- `x` alone is no longer constrained against FkP2.a — a narrowed leftover key
97
+ -- would have rejected this.
98
+ insert into FkMulti values (3, 77);
99
+ select count(*) as c from FkMulti;
100
+ → [{"c":2}]
101
+
102
+ -- ===================================================================
103
+ -- 4. Control: dropping a column the key does NOT use leaves it enforcing.
104
+ -- ===================================================================
105
+
106
+ create table FkKeep (id integer primary key, fkcol integer references FkP(pid), z text);
107
+ insert into FkKeep values (1, 1, 'a');
108
+
109
+ -- `z` is the trailing column — no recorded position changes.
110
+ alter table FkKeep drop column z;
111
+ select "from", "to" from foreign_key_info('FkKeep');
112
+ → [{"from":"fkcol","to":"pid"}]
113
+
114
+ insert into FkKeep values (2, 99);
115
+ -- error: _fk_fkkeep_fkcol
116
+ insert into FkKeep values (3, 2);
117
+ select count(*) as c from FkKeep;
118
+ → [{"c":2}]
119
+
120
+ -- ===================================================================
121
+ -- 5. Two keys, one dropped and one shifted in the same statement: the partition
122
+ -- must remove `f1`'s key AND renumber `f2`'s from position 2 to 1.
123
+ -- ===================================================================
124
+
125
+ create table FkTwo (id integer primary key, f1 integer references FkP(pid), f2 integer references FkP(pid));
126
+ insert into FkTwo values (1, 1, 2);
127
+ alter table FkTwo drop column f1;
128
+
129
+ select "from", "to" from foreign_key_info('FkTwo');
130
+ → [{"from":"f2","to":"pid"}]
131
+
132
+ -- The survivor enforces over f2, not over the vacated slot — and the error names
133
+ -- f2's own constraint, so the shift landed on the right column.
134
+ insert into FkTwo values (2, 99);
135
+ -- error: _fk_fktwo_f2
136
+ insert into FkTwo values (3, 1);
137
+ select count(*) as c from FkTwo;
138
+ → [{"c":2}]
139
+
140
+ -- ===================================================================
141
+ -- 6. A referential ACTION still fires correctly after a preceding drop — the
142
+ -- cascade path reads the same child column indices.
143
+ -- ===================================================================
144
+
145
+ create table FkCascP (pid integer primary key);
146
+ insert into FkCascP values (1), (2);
147
+
148
+ create table FkCasc (id integer primary key, a integer, fkcol integer references FkCascP(pid) on delete cascade);
149
+ insert into FkCasc values (1, 10, 1);
150
+ insert into FkCasc values (2, 20, 2);
151
+
152
+ -- Drop the column preceding the FK child column, then trigger the cascade.
153
+ alter table FkCasc drop column a;
154
+ delete from FkCascP where pid = 1;
155
+
156
+ -- Only the child of the deleted parent went away.
157
+ select id, fkcol from FkCasc order by id;
158
+ → [{"id":2,"fkcol":2}]
159
+
160
+ -- ===================================================================
161
+ -- 7. Declaration shape is irrelevant to the shift: an explicitly NAMED key,
162
+ -- a MULTI-column key whose columns all move, and an `on update` action all
163
+ -- renumber the same way. (The partition never reads `name`, and the actions
164
+ -- read the shifted child positions.)
165
+ -- ===================================================================
166
+
167
+ create table FkNamed (id integer primary key, a integer, fkcol integer, constraint fk_named foreign key (fkcol) references FkP(pid));
168
+ insert into FkNamed values (1, 10, 1);
169
+ alter table FkNamed drop column a;
170
+ select "from", "to", name from foreign_key_info('FkNamed');
171
+ → [{"from":"fkcol","to":"pid","name":"fk_named"}]
172
+ insert into FkNamed values (2, 99);
173
+ -- error: fk_named
174
+
175
+ -- Both child positions of a composite key move down one.
176
+ create table FkMultiShift (id integer primary key, dead integer, x integer, y integer, foreign key (x, y) references FkP2(a, b));
177
+ insert into FkMultiShift values (1, 0, 1, 2);
178
+ alter table FkMultiShift drop column dead;
179
+ select "from", "to", seq from foreign_key_info('FkMultiShift') order by seq;
180
+ → [{"from":"x","to":"a","seq":0},{"from":"y","to":"b","seq":1}]
181
+ insert into FkMultiShift values (2, 9, 9);
182
+ -- error: _fk_fkmultishift_x_y
183
+ insert into FkMultiShift values (3, 1, 2);
184
+ select count(*) as c from FkMultiShift;
185
+ → [{"c":2}]
186
+
187
+ -- `on update cascade` rewrites the child through the shifted position.
188
+ create table FkUpP (pid integer primary key);
189
+ insert into FkUpP values (1);
190
+ create table FkUpC (id integer primary key, dead integer, fkcol integer references FkUpP(pid) on update cascade);
191
+ insert into FkUpC values (1, 0, 1);
192
+ alter table FkUpC drop column dead;
193
+ update FkUpP set pid = 5 where pid = 1;
194
+ select id, fkcol from FkUpC;
195
+ → [{"id":1,"fkcol":5}]
196
+
197
+ -- ===================================================================
198
+ -- 8. A DEFERRED key still resolves at COMMIT against the shifted position.
199
+ -- ===================================================================
200
+
201
+ create table FkDef (id integer primary key, dead integer, fkcol integer references FkP(pid) deferrable initially deferred);
202
+ alter table FkDef drop column dead;
203
+ begin;
204
+ insert into FkDef values (1, 7);
205
+ insert into FkP values (7);
206
+ commit;
207
+ select id, fkcol from FkDef;
208
+ → [{"id":1,"fkcol":7}]
209
+
210
+ -- ===================================================================
211
+ -- 9. A SELF-referential key shifts on the child side and keeps resolving its
212
+ -- parent column by name against the narrowed table.
213
+ -- ===================================================================
214
+
215
+ create table FkSelf (id integer primary key, a integer, parent_id integer null references FkSelf(id));
216
+ insert into FkSelf values (1, 10, null);
217
+ alter table FkSelf drop column a;
218
+ select "from", "to" from foreign_key_info('FkSelf');
219
+ → [{"from":"parent_id","to":"id"}]
220
+ insert into FkSelf values (2, 1);
221
+ insert into FkSelf values (3, 77);
222
+ -- error: _fk_fkself_parent_id
223
+ select count(*) as c from FkSelf;
224
+ → [{"c":2}]
225
+
226
+ -- ===================================================================
227
+ -- 10. A key created by `add column … references …` is removed by dropping that
228
+ -- same column — the shape the engine's own ADD COLUMN revert path takes.
229
+ -- ===================================================================
230
+
231
+ create table FkAdded (id integer primary key, z text);
232
+ insert into FkAdded values (1, 'a');
233
+ alter table FkAdded add column fkcol integer null references FkP(pid);
234
+ select count(*) as c from foreign_key_info('FkAdded');
235
+ → [{"c":1}]
236
+ alter table FkAdded drop column fkcol;
237
+ select count(*) as c from foreign_key_info('FkAdded');
238
+ → [{"c":0}]
239
+
240
+ -- ===================================================================
241
+ -- 11. DROP COLUMN lands *between* a deferred check being queued and the COMMIT
242
+ -- that evaluates it. The parked check carries a row image and a plan frozen
243
+ -- at write time, so a column vanishing under it on either side is the shape
244
+ -- most likely to mismatch arity. Case 8 above drops before the transaction;
245
+ -- these drop inside it.
246
+ -- ===================================================================
247
+
248
+ -- parent side
249
+ create table FkMidP (pid integer primary key, extra text);
250
+ create table FkMidC (id integer primary key,
251
+ fkcol integer null references FkMidP(pid) deferrable initially deferred);
252
+
253
+ begin;
254
+ insert into FkMidC values (10, 1);
255
+ insert into FkMidP values (1, 'x');
256
+ alter table FkMidP drop column extra;
257
+ commit;
258
+
259
+ select id, fkcol from FkMidC;
260
+ → [{"id":10,"fkcol":1}]
261
+
262
+ -- child side (the table the parked row itself belongs to)
263
+ create table FkMid2P (pid integer primary key);
264
+ create table FkMid2C (id integer primary key, extra text,
265
+ fkcol integer null references FkMid2P(pid) deferrable initially deferred);
266
+
267
+ begin;
268
+ insert into FkMid2C values (10, 'x', 1);
269
+ insert into FkMid2P values (1);
270
+ alter table FkMid2C drop column extra;
271
+ commit;
272
+
273
+ select id, fkcol from FkMid2C;
274
+ → [{"id":10,"fkcol":1}]
@@ -0,0 +1,169 @@
1
+ -- 41.10.1-alter-drop-column-unique-index.sqllogic
2
+ --
3
+ -- requires-capability: standalone-index-ddl
4
+ --
5
+ -- Subject: `ALTER TABLE … DROP COLUMN` over a standalone `CREATE INDEX` that spans the
6
+ -- dropped column — which of the two fates the index meets, and whether the rows it
7
+ -- indexes are still answered correctly afterwards.
8
+ --
9
+ -- A UNIQUE index spanning the dropped column must be removed OUTRIGHT, not narrowed to
10
+ -- its surviving columns — narrowing invents a UNIQUE the table never declared, and one
11
+ -- nothing enforces (the matching derived UNIQUE constraint is removed, since a
12
+ -- constraint missing one of its columns is a different, stronger constraint). A
13
+ -- narrowed survivor would then be reported by index_info, trusted by the planner's
14
+ -- at-most-one-matching-row proofs, and re-persisted as a real CREATE UNIQUE INDEX.
15
+ -- A plain (non-unique) index is narrowed instead, and survives.
16
+ --
17
+ -- Sections 4 and 5 index rows written BEFORE the drop, which is what exercises a
18
+ -- module's obligation to reshape the index's PHYSICAL structure — re-encode the one the
19
+ -- drop narrowed (its key holds one fewer column value), tear down the one it removed. A
20
+ -- module that only rewrites the schema answers a later indexed lookup SHORT (the narrowed
21
+ -- case) or DOUBLE (a same-named index rebuilt over a store still holding the removed
22
+ -- index's entries).
23
+ --
24
+ -- Every case runs under the memory module (`yarn test`) and the store module
25
+ -- (`yarn test:store`); the assertions read module-agnostic engine introspection.
26
+
27
+ -- ===================================================================
28
+ -- 1. A UNIQUE index spanning the dropped column is removed outright
29
+ -- ===================================================================
30
+
31
+ create table DcUx (id integer primary key, b integer, c integer);
32
+ create unique index ux_bc on DcUx (b, c);
33
+ alter table DcUx drop column b;
34
+ -- run
35
+
36
+ -- Neither the index nor its derived constraint survives.
37
+ select count(*) as c from index_info('DcUx');
38
+ → [{"c":0}]
39
+ select count(*) as c from unique_constraint_info('DcUx');
40
+ → [{"c":0}]
41
+
42
+ -- And nothing is enforced over the surviving column: duplicate c values are accepted,
43
+ -- which is correct — no UNIQUE over (c) was ever declared.
44
+ insert into DcUx values (1, 5);
45
+ insert into DcUx values (2, 5);
46
+ select count(*) as c from DcUx;
47
+ → [{"c":2}]
48
+
49
+ drop table DcUx;
50
+ -- run
51
+
52
+ -- ===================================================================
53
+ -- 2. A UNIQUE index that keeps every column is renumbered, not dropped
54
+ -- ===================================================================
55
+
56
+ create table DcKeep (id integer primary key, b integer, c integer, d integer);
57
+ create unique index ux_cd on DcKeep (c, d);
58
+ insert into DcKeep values (1, 9, 10, 11);
59
+ alter table DcKeep drop column b;
60
+ -- run
61
+
62
+ -- Survives over its own (renumbered) columns, still unique.
63
+ select index_name, column_name from index_info('DcKeep') order by column_name;
64
+ → [{"index_name":"ux_cd","column_name":"c"},{"index_name":"ux_cd","column_name":"d"}]
65
+
66
+ insert into DcKeep values (2, 10, 11);
67
+ -- error: UNIQUE
68
+
69
+ insert into DcKeep values (3, 10, 12);
70
+ select count(*) as c from DcKeep;
71
+ → [{"c":2}]
72
+
73
+ drop table DcKeep;
74
+ -- run
75
+
76
+ -- ===================================================================
77
+ -- 3. A plain (non-unique) index spanning the dropped column is narrowed —
78
+ -- it constrains nothing, so the surviving columns remain a usable index
79
+ -- ===================================================================
80
+
81
+ create table DcPlain (id integer primary key, b integer, c integer);
82
+ create index ix_bc on DcPlain (b, c);
83
+ alter table DcPlain drop column b;
84
+ -- run
85
+
86
+ select index_name, column_name from index_info('DcPlain');
87
+ → [{"index_name":"ix_bc","column_name":"c"}]
88
+
89
+ -- Duplicates are fine on a plain index, and the index still serves lookups.
90
+ insert into DcPlain values (1, 5);
91
+ insert into DcPlain values (2, 5);
92
+ select count(*) as c from DcPlain where c = 5;
93
+ → [{"c":2}]
94
+
95
+ drop table DcPlain;
96
+ -- run
97
+
98
+ -- ===================================================================
99
+ -- 4. A narrowed index still answers lookups over rows indexed BEFORE the drop
100
+ -- ===================================================================
101
+ --
102
+ -- The pre-drop rows are the point: their index entries were written under the WIDE key
103
+ -- (b's value ahead of c's) while every later seek computes the NARROW one. A module that
104
+ -- leaves them unreshaped answers the seek short — `c = 100` finds nothing — and a later
105
+ -- DELETE cannot match its own entries, so they orphan.
106
+
107
+ create table DcPre (id integer primary key, b integer, c integer);
108
+ create index ix_bc on DcPre (b, c);
109
+ insert into DcPre values (1, 10, 100);
110
+ insert into DcPre values (2, 20, 200);
111
+ alter table DcPre drop column b;
112
+ -- run
113
+
114
+ select index_name, column_name from index_info('DcPre');
115
+ → [{"index_name":"ix_bc","column_name":"c"}]
116
+
117
+ -- Each pre-drop row is reachable through the narrowed index, exactly once.
118
+ select id from DcPre where c = 100;
119
+ → [{"id":1}]
120
+ select id from DcPre where c > 0 order by id;
121
+ → [{"id":1},{"id":2}]
122
+
123
+ -- A row inserted after the drop joins them under the same encoding.
124
+ insert into DcPre values (3, 300);
125
+ select id from DcPre where c > 150 order by id;
126
+ → [{"id":2},{"id":3}]
127
+
128
+ -- DELETE recomputes each index key: a table drained through the index leaves no row
129
+ -- findable, pre-drop or post-drop.
130
+ delete from DcPre;
131
+ select count(*) as n from DcPre;
132
+ → [{"n":0}]
133
+ select count(*) as n from DcPre where c > 0;
134
+ → [{"n":0}]
135
+
136
+ drop table DcPre;
137
+ -- run
138
+
139
+ -- ===================================================================
140
+ -- 5. Re-creating an index under the REMOVED index's name gets a clean structure
141
+ -- ===================================================================
142
+ --
143
+ -- The single-column index collapses (its only column is gone), so its name is free again.
144
+ -- A module that left the removed index's physical structure behind hands it to the new
145
+ -- index of the same name, which then holds both encodings — a range scan yields each row
146
+ -- twice, and a count is doubled.
147
+
148
+ create table DcReuse (id integer primary key, b integer, c integer);
149
+ create index ix_b on DcReuse (b);
150
+ insert into DcReuse values (1, 10, 100);
151
+ insert into DcReuse values (2, 20, 200);
152
+ alter table DcReuse drop column b;
153
+ -- run
154
+
155
+ select count(*) as n from index_info('DcReuse');
156
+ → [{"n":0}]
157
+
158
+ create index ix_b on DcReuse (c);
159
+ -- run
160
+
161
+ select id from DcReuse where c > 0 order by id;
162
+ → [{"id":1},{"id":2}]
163
+ select count(*) as n from DcReuse where c > 0;
164
+ → [{"n":2}]
165
+ select id from DcReuse where c = 100;
166
+ → [{"id":1}]
167
+
168
+ drop table DcReuse;
169
+ -- run