@quereus/quereus 4.20.0 → 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 (400) hide show
  1. package/README.md +2 -0
  2. package/dist/src/common/types.d.ts +4 -4
  3. package/dist/src/index.d.ts +1 -1
  4. package/dist/src/index.d.ts.map +1 -1
  5. package/dist/src/index.js +3 -2
  6. package/dist/src/index.js.map +1 -1
  7. package/dist/src/schema/catalog-rendering.js +13 -1
  8. package/dist/src/schema/catalog-rendering.js.map +1 -1
  9. package/dist/src/schema/catalog.d.ts +35 -2
  10. package/dist/src/schema/catalog.d.ts.map +1 -1
  11. package/dist/src/schema/catalog.js +42 -33
  12. package/dist/src/schema/catalog.js.map +1 -1
  13. package/dist/src/schema/schema-differ.d.ts +1 -1
  14. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  15. package/dist/src/schema/schema-differ.js +195 -33
  16. package/dist/src/schema/schema-differ.js.map +1 -1
  17. package/dist/src/schema/unique-enforcement.d.ts +23 -1
  18. package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
  19. package/dist/src/schema/unique-enforcement.js +43 -1
  20. package/dist/src/schema/unique-enforcement.js.map +1 -1
  21. package/dist/src/vtab/memory/layer/manager.d.ts +15 -12
  22. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  23. package/dist/src/vtab/memory/layer/manager.js +87 -100
  24. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  25. package/package.json +7 -4
  26. package/test/README.md +173 -0
  27. package/test/logic/01-basic.sqllogic +39 -0
  28. package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
  29. package/test/logic/01.2-strings.sqllogic +43 -0
  30. package/test/logic/01.5-insert-select.sqllogic +237 -0
  31. package/test/logic/01.6-update-extras.sqllogic +118 -0
  32. package/test/logic/01.7-update-from.sqllogic +67 -0
  33. package/test/logic/01.8-delete-extras.sqllogic +122 -0
  34. package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
  35. package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
  36. package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
  37. package/test/logic/01.9-query-expr-values.sqllogic +111 -0
  38. package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
  39. package/test/logic/02-filters.sqllogic +54 -0
  40. package/test/logic/02-smoke.sqllogic +62 -0
  41. package/test/logic/02.1-bind-parameters.sqllogic +223 -0
  42. package/test/logic/03-expressions.sqllogic +190 -0
  43. package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
  44. package/test/logic/03.4-defaults.sqllogic +554 -0
  45. package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
  46. package/test/logic/03.5-tvf.sqllogic +61 -0
  47. package/test/logic/03.6-type-system.sqllogic +544 -0
  48. package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
  49. package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
  50. package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
  51. package/test/logic/03.8-not-precedence.sqllogic +255 -0
  52. package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
  53. package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
  54. package/test/logic/04-order-by.sqllogic +38 -0
  55. package/test/logic/04-transactions.sqllogic +239 -0
  56. package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
  57. package/test/logic/05-vtab_memory.sqllogic +50 -0
  58. package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
  59. package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
  60. package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
  61. package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
  62. package/test/logic/06-builtin_functions.sqllogic +149 -0
  63. package/test/logic/06.1-string-functions.sqllogic +92 -0
  64. package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
  65. package/test/logic/06.2-math-functions.sqllogic +82 -0
  66. package/test/logic/06.3-schema.sqllogic +48 -0
  67. package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
  68. package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
  69. package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
  70. package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
  71. package/test/logic/06.3.4-view-info.sqllogic +378 -0
  72. package/test/logic/06.3.5-column-info.sqllogic +347 -0
  73. package/test/logic/06.3.6-schema-views.sqllogic +29 -0
  74. package/test/logic/06.4-schema-search-path.sqllogic +354 -0
  75. package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
  76. package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
  77. package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
  78. package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
  79. package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
  80. package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
  81. package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
  82. package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
  83. package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
  84. package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
  85. package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
  86. package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
  87. package/test/logic/06.7-json-extended.sqllogic +53 -0
  88. package/test/logic/06.8-json-path-operators.sqllogic +99 -0
  89. package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
  90. package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
  91. package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
  92. package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
  93. package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
  94. package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
  95. package/test/logic/07-aggregates.sqllogic +193 -0
  96. package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
  97. package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
  98. package/test/logic/07.3-group-by-extras.sqllogic +602 -0
  99. package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
  100. package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
  101. package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
  102. package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
  103. package/test/logic/07.5-window.sqllogic +1941 -0
  104. package/test/logic/07.5.1-window-named.sqllogic +13 -0
  105. package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
  106. package/test/logic/07.6-subqueries.sqllogic +78 -0
  107. package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
  108. package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
  109. package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
  110. package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
  111. package/test/logic/07.7.1-in-extras.sqllogic +158 -0
  112. package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
  113. package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
  114. package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
  115. package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
  116. package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
  117. package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
  118. package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
  119. package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
  120. package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
  121. package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
  122. package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
  123. package/test/logic/07.9-in-value-list.sqllogic +154 -0
  124. package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
  125. package/test/logic/08-views.sqllogic +64 -0
  126. package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
  127. package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
  128. package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
  129. package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
  130. package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
  131. package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
  132. package/test/logic/09-set_operations.sqllogic +244 -0
  133. package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
  134. package/test/logic/10-distinct_datatypes.sqllogic +127 -0
  135. package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
  136. package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
  137. package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
  138. package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
  139. package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
  140. package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
  141. package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
  142. package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
  143. package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
  144. package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
  145. package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
  146. package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
  147. package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
  148. package/test/logic/10.2-column-features.sqllogic +365 -0
  149. package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
  150. package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
  151. package/test/logic/10.3-function-features.sqllogic +247 -0
  152. package/test/logic/10.4-schema-scale.sqllogic +168 -0
  153. package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
  154. package/test/logic/10.5-indexes.sqllogic +164 -0
  155. package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
  156. package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
  157. package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
  158. package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
  159. package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
  160. package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
  161. package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
  162. package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
  163. package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
  164. package/test/logic/100.1-where-extras.sqllogic +163 -0
  165. package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
  166. package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
  167. package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
  168. package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
  169. package/test/logic/102-unique-constraints.sqllogic +145 -0
  170. package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
  171. package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
  172. package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
  173. package/test/logic/102.2-unique-collation.sqllogic +181 -0
  174. package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
  175. package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
  176. package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
  177. package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
  178. package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
  179. package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
  180. package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
  181. package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
  182. package/test/logic/108-cardinality-estimation.sqllogic +146 -0
  183. package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
  184. package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
  185. package/test/logic/11-joins.sqllogic +86 -0
  186. package/test/logic/11.1-join-using.sqllogic +267 -0
  187. package/test/logic/11.2-comma-join.sqllogic +35 -0
  188. package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
  189. package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
  190. package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
  191. package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
  192. package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
  193. package/test/logic/12-empty-primary-key.sqllogic +124 -0
  194. package/test/logic/12-join_padding_order.sqllogic +58 -0
  195. package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
  196. package/test/logic/13-cte.sqllogic +137 -0
  197. package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
  198. package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
  199. package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
  200. package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
  201. package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
  202. package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
  203. package/test/logic/13.4-cte-extras.sqllogic +98 -0
  204. package/test/logic/13.5-cte-join-order.sqllogic +166 -0
  205. package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
  206. package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
  207. package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
  208. package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
  209. package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
  210. package/test/logic/14-utilities.sqllogic +168 -0
  211. package/test/logic/15-timespan.sqllogic +279 -0
  212. package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
  213. package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
  214. package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
  215. package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
  216. package/test/logic/16-epoch.sqllogic +187 -0
  217. package/test/logic/17-weekday-modifier.sqllogic +78 -0
  218. package/test/logic/18-json-string-escapes.sqllogic +86 -0
  219. package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
  220. package/test/logic/20-empty-single-row.sqllogic +261 -0
  221. package/test/logic/21-null-edge-cases.sqllogic +227 -0
  222. package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
  223. package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
  224. package/test/logic/21.2-between-edges.sqllogic +157 -0
  225. package/test/logic/22-boundary-values.sqllogic +175 -0
  226. package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
  227. package/test/logic/24-builtin-branches.sqllogic +611 -0
  228. package/test/logic/24.1-substr-extras.sqllogic +75 -0
  229. package/test/logic/24.2-random-extras.sqllogic +39 -0
  230. package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
  231. package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
  232. package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
  233. package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
  234. package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
  235. package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
  236. package/test/logic/26-join-edge-cases.sqllogic +333 -0
  237. package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
  238. package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
  239. package/test/logic/26.3-join-on-constants.sqllogic +61 -0
  240. package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
  241. package/test/logic/27-window-edge-cases.sqllogic +206 -0
  242. package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
  243. package/test/logic/27.2-window-exclude.sqllogic +13 -0
  244. package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
  245. package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
  246. package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
  247. package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
  248. package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
  249. package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
  250. package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
  251. package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
  252. package/test/logic/40-constraints.sqllogic +418 -0
  253. package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
  254. package/test/logic/40.2-check-extras.sqllogic +683 -0
  255. package/test/logic/41-alter-table.sqllogic +191 -0
  256. package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
  257. package/test/logic/41-fk-cross-schema.sqllogic +155 -0
  258. package/test/logic/41-fk-extended-targets.sqllogic +173 -0
  259. package/test/logic/41-foreign-keys.sqllogic +1001 -0
  260. package/test/logic/41-generated-column-errors.sqllogic +225 -0
  261. package/test/logic/41-generated-column-extras.sqllogic +598 -0
  262. package/test/logic/41-generated-column-scope.sqllogic +329 -0
  263. package/test/logic/41-generated-columns.sqllogic +361 -0
  264. package/test/logic/41.1-alter-pk.sqllogic +230 -0
  265. package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
  266. package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
  267. package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
  268. package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
  269. package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
  270. package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
  271. package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
  272. package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
  273. package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
  274. package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
  275. package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
  276. package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
  277. package/test/logic/41.2-alter-column.sqllogic +382 -0
  278. package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
  279. package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
  280. package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
  281. package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
  282. package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
  283. package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
  284. package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
  285. package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
  286. package/test/logic/41.5-alter-misc.sqllogic +48 -0
  287. package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
  288. package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
  289. package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
  290. package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
  291. package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
  292. package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
  293. package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
  294. package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
  295. package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
  296. package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
  297. package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
  298. package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
  299. package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
  300. package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
  301. package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
  302. package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
  303. package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
  304. package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
  305. package/test/logic/42-committed-snapshot.sqllogic +254 -0
  306. package/test/logic/42-returning.sqllogic +159 -0
  307. package/test/logic/42.1-returning-extras.sqllogic +232 -0
  308. package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
  309. package/test/logic/43-default-nullability.sqllogic +131 -0
  310. package/test/logic/43-transition-constraints.sqllogic +341 -0
  311. package/test/logic/43.1-default-collation.sqllogic +140 -0
  312. package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
  313. package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
  314. package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
  315. package/test/logic/44-determinism-validation.sqllogic +164 -0
  316. package/test/logic/44-orthogonality.sqllogic +146 -0
  317. package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
  318. package/test/logic/45-udf-determinism.sqllogic +39 -0
  319. package/test/logic/46-mutation-context.sqllogic +595 -0
  320. package/test/logic/47-upsert.sqllogic +255 -0
  321. package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
  322. package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
  323. package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
  324. package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
  325. package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
  326. package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
  327. package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
  328. package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
  329. package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
  330. package/test/logic/49-reference-graph.sqllogic +84 -0
  331. package/test/logic/50-declarative-schema.sqllogic +2550 -0
  332. package/test/logic/50-metadata-tags.sqllogic +1033 -0
  333. package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
  334. package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
  335. package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
  336. package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +173 -0
  337. package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
  338. package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
  339. package/test/logic/51-lens-foundation.sqllogic +147 -0
  340. package/test/logic/51-materialized-views.sqllogic +376 -0
  341. package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
  342. package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
  343. package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
  344. package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
  345. package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
  346. package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
  347. package/test/logic/52-lens-overrides.sqllogic +566 -0
  348. package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
  349. package/test/logic/53-reserved-tags.sqllogic +252 -0
  350. package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
  351. package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
  352. package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
  353. package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
  354. package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
  355. package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
  356. package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
  357. package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
  358. package/test/logic/55-lens-prover.sqllogic +202 -0
  359. package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
  360. package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
  361. package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
  362. package/test/logic/81-quickpick.sqllogic +24 -0
  363. package/test/logic/82-bloom-join.sqllogic +185 -0
  364. package/test/logic/83-merge-join.sqllogic +280 -0
  365. package/test/logic/84-asof-scan.sqllogic +238 -0
  366. package/test/logic/84-key-cardinality.sqllogic +50 -0
  367. package/test/logic/85-relational-const-folding.sqllogic +51 -0
  368. package/test/logic/86-scalar-cse.sqllogic +42 -0
  369. package/test/logic/90-error_paths.sqllogic +114 -0
  370. package/test/logic/90.1-parse-errors.sqllogic +77 -0
  371. package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
  372. package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
  373. package/test/logic/90.3-expression-errors.sqllogic +43 -0
  374. package/test/logic/90.4-dml-errors.sqllogic +47 -0
  375. package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
  376. package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
  377. package/test/logic/90.6-select-error-paths.sqllogic +57 -0
  378. package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
  379. package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
  380. package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
  381. package/test/logic/93.1-view-error-paths.sqllogic +74 -0
  382. package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
  383. package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
  384. package/test/logic/93.4-view-mutation.sqllogic +4881 -0
  385. package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
  386. package/test/logic/93.5-authored-inverse.sqllogic +415 -0
  387. package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
  388. package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
  389. package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
  390. package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
  391. package/test/logic/95-assertions.sqllogic +1417 -0
  392. package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
  393. package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
  394. package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
  395. package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
  396. package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
  397. package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
  398. package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
  399. package/test/logic/drop-unique-index.sqllogic +88 -0
  400. package/test/logic/pushdown-test.sqllogic +36 -0
@@ -0,0 +1,540 @@
1
+ -- 105.1-vtab-memory-index-mutation-kills.sqllogic
2
+ -- Mutation-killing tests targeting the SECONDARY-INDEX paths of packages/quereus/src/vtab/memory/
3
+ -- (module.ts index matching / ordering, table.ts index maintenance and comparators)
4
+ --
5
+ -- requires-capability: standalone-index-ddl
6
+ --
7
+ -- Carved out of 105-vtab-memory-mutation-kills: about 25 of that file's 40 sections reach
8
+ -- the memory module through PRIMARY KEY paths alone (NULL handling, PK ordering, full-scan
9
+ -- fallback, savepoints, transaction isolation, ALTER / RENAME TABLE, connection lifecycle,
10
+ -- upsert, composite PK). The sections below all build a standalone secondary index to reach
11
+ -- the code under test, so they live here and leave the rest runnable on a backend without
12
+ -- first-class CREATE INDEX.
13
+ --
14
+ -- MEMORY-ONLY, like its parent: these are white-box mutation tests against src/vtab/memory/
15
+ -- internals (listed in MEMORY_ONLY_FILES in logic.spec.ts).
16
+ --
17
+ -- Section numbers keep their original 105 labels so cross-references still resolve.
18
+
19
+ -- ===================================================================
20
+ -- SECTION 5: Index equality matching / prefix matching (module.ts:325-363)
21
+ -- ===================================================================
22
+
23
+ create table idx_eq (id integer primary key, a integer, b integer, c integer);
24
+ create index idx_ab on idx_eq (a, b);
25
+ insert into idx_eq values (1, 10, 100, 1000), (2, 10, 200, 2000), (3, 20, 100, 3000), (4, 20, 200, 4000), (5, 30, 300, 5000);
26
+
27
+ -- Exact match on full composite index (a, b)
28
+ select id from idx_eq where a = 10 and b = 200;
29
+ → [{"id": 2}]
30
+
31
+ -- Prefix match on first column of composite index
32
+ select id from idx_eq where a = 20 order by id;
33
+ → [{"id": 3}, {"id": 4}]
34
+
35
+ -- No match
36
+ select id from idx_eq where a = 99;
37
+ → []
38
+
39
+ -- IN on first index column
40
+ select id from idx_eq where a in (10, 30) order by id;
41
+ → [{"id": 1}, {"id": 2}, {"id": 5}]
42
+
43
+ -- IN on second index column with equality on first (composite)
44
+ select id from idx_eq where a = 10 and b in (100, 200) order by id;
45
+ → [{"id": 1}, {"id": 2}]
46
+
47
+ -- IN with single value (treated as equality)
48
+ select id from idx_eq where a in (20) order by id;
49
+ → [{"id": 3}, {"id": 4}]
50
+
51
+ drop table idx_eq;
52
+
53
+ -- ===================================================================
54
+ -- SECTION 6: Index range matching (module.ts:368-389)
55
+ -- ===================================================================
56
+
57
+ create table idx_range (id integer primary key, val integer);
58
+ create index idx_val on idx_range (val);
59
+ insert into idx_range values (1, 10), (2, 20), (3, 30), (4, 40), (5, 50);
60
+
61
+ -- Greater than
62
+ select id from idx_range where val > 25 order by id;
63
+ → [{"id": 3}, {"id": 4}, {"id": 5}]
64
+
65
+ -- Greater than or equal
66
+ select id from idx_range where val >= 30 order by id;
67
+ → [{"id": 3}, {"id": 4}, {"id": 5}]
68
+
69
+ -- Less than
70
+ select id from idx_range where val < 25 order by id;
71
+ → [{"id": 1}, {"id": 2}]
72
+
73
+ -- Less than or equal
74
+ select id from idx_range where val <= 20 order by id;
75
+ → [{"id": 1}, {"id": 2}]
76
+
77
+ -- Between (range with both bounds)
78
+ select id from idx_range where val >= 20 and val <= 40 order by id;
79
+ → [{"id": 2}, {"id": 3}, {"id": 4}]
80
+
81
+ -- Half-open range (lower bound only)
82
+ select id from idx_range where val > 40 order by id;
83
+ → [{"id": 5}]
84
+
85
+ -- Half-open range (upper bound only)
86
+ select id from idx_range where val < 20 order by id;
87
+ → [{"id": 1}]
88
+
89
+ -- Range that matches no rows
90
+ select id from idx_range where val > 100;
91
+ → []
92
+
93
+ -- Range on PK column
94
+ select id from idx_range where id > 2 and id < 5 order by id;
95
+ → [{"id": 3}, {"id": 4}]
96
+
97
+ drop table idx_range;
98
+
99
+ -- ===================================================================
100
+ -- SECTION 7: Prefix-equality + trailing-range on composite index (module.ts:264-281)
101
+ -- ===================================================================
102
+
103
+ create table prefix_range (id integer primary key, cat integer, score integer, detail text);
104
+ create index idx_cat_score on prefix_range (cat, score);
105
+ insert into prefix_range values
106
+ (1, 1, 10, 'a'), (2, 1, 20, 'b'), (3, 1, 30, 'c'),
107
+ (4, 2, 15, 'd'), (5, 2, 25, 'e'), (6, 2, 35, 'f');
108
+
109
+ -- Equality on first column + range on second column
110
+ select id from prefix_range where cat = 1 and score > 15 order by id;
111
+ → [{"id": 2}, {"id": 3}]
112
+
113
+ select id from prefix_range where cat = 2 and score <= 25 order by id;
114
+ → [{"id": 4}, {"id": 5}]
115
+
116
+ select id from prefix_range where cat = 1 and score >= 10 and score <= 20 order by id;
117
+ → [{"id": 1}, {"id": 2}]
118
+
119
+ drop table prefix_range;
120
+
121
+ -- ===================================================================
122
+ -- SECTION 8: Ordering from index (module.ts:414-461)
123
+ -- ===================================================================
124
+
125
+ create table idx_order (id integer primary key, name text, score integer);
126
+ create index idx_name_asc on idx_order (name);
127
+ create index idx_score_desc on idx_order (score desc);
128
+ insert into idx_order values (1, 'Charlie', 90), (2, 'Alice', 80), (3, 'Bob', 95), (4, 'David', 85);
129
+
130
+ -- ORDER BY indexed column ascending
131
+ select name from idx_order order by name;
132
+ → [{"name": "Alice"}, {"name": "Bob"}, {"name": "Charlie"}, {"name": "David"}]
133
+
134
+ -- ORDER BY indexed column descending (requires DESC index)
135
+ select score from idx_order order by score desc;
136
+ → [{"score": 95}, {"score": 90}, {"score": 85}, {"score": 80}]
137
+
138
+ -- ORDER BY non-indexed column still works (external sort)
139
+ select name from idx_order order by id desc;
140
+ → [{"name": "David"}, {"name": "Bob"}, {"name": "Alice"}, {"name": "Charlie"}]
141
+
142
+ drop table idx_order;
143
+
144
+ -- Composite index ordering
145
+ create table comp_order (id integer primary key, a integer, b integer);
146
+ create index idx_ab on comp_order (a, b);
147
+ insert into comp_order values (1, 1, 30), (2, 1, 10), (3, 2, 20), (4, 2, 10), (5, 1, 20);
148
+
149
+ -- ORDER BY matches composite index prefix
150
+ select id, a, b from comp_order order by a, b;
151
+ → [{"id": 2, "a": 1, "b": 10}, {"id": 5, "a": 1, "b": 20}, {"id": 1, "a": 1, "b": 30}, {"id": 4, "a": 2, "b": 10}, {"id": 3, "a": 2, "b": 20}]
152
+
153
+ drop table comp_order;
154
+
155
+ -- ===================================================================
156
+ -- SECTION 10: Multi-column secondary indexes
157
+ -- ===================================================================
158
+
159
+ create table multi_idx (id integer primary key, x integer, y integer, z text);
160
+ create index idx_xy on multi_idx (x, y);
161
+ insert into multi_idx values (1, 10, 1, 'a'), (2, 10, 2, 'b'), (3, 20, 1, 'c'), (4, 20, 2, 'd'), (5, 10, 1, 'e');
162
+
163
+ -- Equality on both columns
164
+ select id from multi_idx where x = 10 and y = 1 order by id;
165
+ → [{"id": 1}, {"id": 5}]
166
+
167
+ -- Equality on first only
168
+ select id from multi_idx where x = 20 order by id;
169
+ → [{"id": 3}, {"id": 4}]
170
+
171
+ -- Range on second column with equality on first
172
+ select id from multi_idx where x = 10 and y > 1 order by id;
173
+ → [{"id": 2}]
174
+
175
+ drop table multi_idx;
176
+
177
+ -- ===================================================================
178
+ -- SECTION 11: DESC secondary indexes (table.ts:411-428 getIndexComparator)
179
+ -- ===================================================================
180
+
181
+ create table desc_idx (id integer primary key, score integer, name text);
182
+ create index idx_score_d on desc_idx (score desc);
183
+ insert into desc_idx values (1, 90, 'Alice'), (2, 70, 'Bob'), (3, 85, 'Charlie'), (4, 95, 'David');
184
+
185
+ -- ORDER BY score DESC should leverage the DESC index
186
+ select name from desc_idx order by score desc;
187
+ → [{"name": "David"}, {"name": "Alice"}, {"name": "Charlie"}, {"name": "Bob"}]
188
+
189
+ -- Range on DESC indexed column
190
+ select name from desc_idx where score >= 85 order by score desc;
191
+ → [{"name": "David"}, {"name": "Alice"}, {"name": "Charlie"}]
192
+
193
+ select name from desc_idx where score < 90 order by id;
194
+ → [{"name": "Bob"}, {"name": "Charlie"}]
195
+
196
+ drop table desc_idx;
197
+
198
+ -- Mixed ASC/DESC composite index
199
+ create table mixed_dir (id integer primary key, a integer, b integer);
200
+ create index idx_a_asc_b_desc on mixed_dir (a, b desc);
201
+ insert into mixed_dir values (1, 1, 30), (2, 1, 10), (3, 1, 20), (4, 2, 10), (5, 2, 20);
202
+
203
+ -- Equality on a, range on b (DESC)
204
+ select id, a, b from mixed_dir where a = 1 order by a, b desc;
205
+ → [{"id": 1, "a": 1, "b": 30}, {"id": 3, "a": 1, "b": 20}, {"id": 2, "a": 1, "b": 10}]
206
+
207
+ drop table mixed_dir;
208
+
209
+ -- ===================================================================
210
+ -- SECTION 16: Index CREATE/DROP on populated tables
211
+ -- ===================================================================
212
+
213
+ create table idx_pop (id integer primary key, category text, value integer);
214
+ insert into idx_pop values (1, 'A', 100), (2, 'B', 200), (3, 'A', 300), (4, 'C', 150), (5, 'B', 250);
215
+
216
+ -- Create index on populated table
217
+ create index idx_cat on idx_pop (category);
218
+
219
+ -- Query using the new index
220
+ select id from idx_pop where category = 'A' order by id;
221
+ → [{"id": 1}, {"id": 3}]
222
+
223
+ select id from idx_pop where category = 'B' order by id;
224
+ → [{"id": 2}, {"id": 5}]
225
+
226
+ -- Create composite index on populated table
227
+ create index idx_cat_val on idx_pop (category, value);
228
+
229
+ -- Query using composite index
230
+ select id from idx_pop where category = 'B' and value > 200;
231
+ → [{"id": 5}]
232
+
233
+ -- Drop index and verify queries still work
234
+ drop index idx_cat;
235
+ select id from idx_pop where category = 'C';
236
+ → [{"id": 4}]
237
+
238
+ -- Re-create the dropped index
239
+ create index idx_cat on idx_pop (category);
240
+ select id from idx_pop where category = 'A' order by id;
241
+ → [{"id": 1}, {"id": 3}]
242
+
243
+ -- Insert after index creation
244
+ insert into idx_pop values (6, 'A', 350);
245
+ select id from idx_pop where category = 'A' order by id;
246
+ → [{"id": 1}, {"id": 3}, {"id": 6}]
247
+
248
+ -- Delete and verify index consistency
249
+ delete from idx_pop where id = 3;
250
+ select id from idx_pop where category = 'A' order by id;
251
+ → [{"id": 1}, {"id": 6}]
252
+
253
+ drop table idx_pop;
254
+
255
+ -- ===================================================================
256
+ -- SECTION 21: Transaction with index modifications
257
+ -- ===================================================================
258
+
259
+ create table tx_idx (id integer primary key, category text, val integer);
260
+ insert into tx_idx values (1, 'A', 10), (2, 'B', 20), (3, 'A', 30);
261
+ create index idx_tx_cat on tx_idx (category);
262
+
263
+ -- Insert within transaction then commit — index is consistent
264
+ begin;
265
+ insert into tx_idx values (4, 'A', 40);
266
+ commit;
267
+ select id from tx_idx where category = 'A' order by id;
268
+ → [{"id": 1}, {"id": 3}, {"id": 4}]
269
+
270
+ -- Delete committed row and verify via index
271
+ delete from tx_idx where id = 4;
272
+ select id from tx_idx where category = 'A' order by id;
273
+ → [{"id": 1}, {"id": 3}]
274
+
275
+ -- Update indexed column and verify via index
276
+ update tx_idx set category = 'C' where id = 2;
277
+ select id from tx_idx where category = 'B';
278
+ → []
279
+ select id from tx_idx where category = 'C';
280
+ → [{"id": 2}]
281
+
282
+ -- Restore
283
+ update tx_idx set category = 'B' where id = 2;
284
+ select id from tx_idx where category = 'B';
285
+ → [{"id": 2}]
286
+
287
+ drop table tx_idx;
288
+
289
+ -- ===================================================================
290
+ -- SECTION 24: Unique index constraint enforcement
291
+ -- ===================================================================
292
+
293
+ create table uniq_test (id integer primary key, email text null, name text);
294
+ create unique index idx_email on uniq_test (email);
295
+ insert into uniq_test values (1, 'alice@test.com', 'Alice'), (2, 'bob@test.com', 'Bob');
296
+
297
+ -- Duplicate unique index value should fail
298
+ insert into uniq_test values (3, 'alice@test.com', 'Alice2');
299
+ -- error: UNIQUE constraint
300
+
301
+ -- Unique lookup
302
+ select name from uniq_test where email = 'bob@test.com';
303
+ → [{"name": "Bob"}]
304
+
305
+ -- Update to a conflicting unique value should fail
306
+ update uniq_test set email = 'alice@test.com' where id = 2;
307
+ -- error: UNIQUE constraint
308
+
309
+ -- Update unique column to a non-conflicting value should succeed
310
+ update uniq_test set email = 'charlie@test.com' where id = 2;
311
+ select email from uniq_test where id = 2;
312
+ → [{"email": "charlie@test.com"}]
313
+
314
+ -- NULL values in unique index (multiple NULLs are allowed)
315
+ insert into uniq_test values (10, null, 'Charlie');
316
+ insert into uniq_test values (11, null, 'David');
317
+ select count(*) as cnt from uniq_test where email is null;
318
+ → [{"cnt": 2}]
319
+
320
+ drop table uniq_test;
321
+
322
+ -- ===================================================================
323
+ -- SECTION 25: SAVEPOINT with mutations on indexed table
324
+ -- ===================================================================
325
+
326
+ create table sp_idx (id integer primary key, category text);
327
+ create index idx_sp_cat on sp_idx (category);
328
+ insert into sp_idx values (1, 'A'), (2, 'B'), (3, 'A');
329
+
330
+ begin;
331
+ savepoint s1;
332
+ insert into sp_idx values (4, 'C');
333
+ update sp_idx set category = 'D' where id = 1;
334
+
335
+ -- Index should reflect pending changes
336
+ select id from sp_idx where category = 'C';
337
+ → [{"id": 4}]
338
+ select id from sp_idx where category = 'A';
339
+ → [{"id": 3}]
340
+ select id from sp_idx where category = 'D';
341
+ → [{"id": 1}]
342
+
343
+ rollback to savepoint s1;
344
+
345
+ -- After rollback, index should be consistent with pre-savepoint state
346
+ select id from sp_idx where category = 'A' order by id;
347
+ → [{"id": 1}, {"id": 3}]
348
+ select id from sp_idx where category = 'C';
349
+ → []
350
+ select id from sp_idx where category = 'D';
351
+ → []
352
+
353
+ commit;
354
+
355
+ drop table sp_idx;
356
+
357
+ -- ===================================================================
358
+ -- SECTION 26: Large-ish dataset for index effectiveness
359
+ -- ===================================================================
360
+
361
+ create table bulk_t (id integer primary key, grp integer, val text);
362
+ create index idx_grp on bulk_t (grp);
363
+
364
+ -- Insert multiple groups
365
+ insert into bulk_t values (1, 1, 'a1'), (2, 1, 'a2'), (3, 1, 'a3');
366
+ insert into bulk_t values (4, 2, 'b1'), (5, 2, 'b2');
367
+ insert into bulk_t values (6, 3, 'c1'), (7, 3, 'c2'), (8, 3, 'c3'), (9, 3, 'c4');
368
+ insert into bulk_t values (10, 4, 'd1');
369
+
370
+ -- Count per group using index
371
+ select grp, count(*) as cnt from bulk_t group by grp order by grp;
372
+ → [{"grp": 1, "cnt": 3}, {"grp": 2, "cnt": 2}, {"grp": 3, "cnt": 4}, {"grp": 4, "cnt": 1}]
373
+
374
+ -- IN on indexed column
375
+ select id from bulk_t where grp in (1, 3) order by id;
376
+ → [{"id": 1}, {"id": 2}, {"id": 3}, {"id": 6}, {"id": 7}, {"id": 8}, {"id": 9}]
377
+
378
+ -- Range on indexed column
379
+ select id from bulk_t where grp >= 3 order by id;
380
+ → [{"id": 6}, {"id": 7}, {"id": 8}, {"id": 9}, {"id": 10}]
381
+
382
+ drop table bulk_t;
383
+
384
+ -- ===================================================================
385
+ -- SECTION 31: Index on non-integer types
386
+ -- ===================================================================
387
+
388
+ create table text_idx (id integer primary key, label text null);
389
+ create index idx_label on text_idx (label);
390
+ insert into text_idx values (1, 'banana'), (2, 'apple'), (3, 'cherry'), (4, 'apple'), (5, null);
391
+
392
+ -- Equality on text index
393
+ select id from text_idx where label = 'apple' order by id;
394
+ → [{"id": 2}, {"id": 4}]
395
+
396
+ -- IS NULL through index
397
+ select id from text_idx where label is null;
398
+ → [{"id": 5}]
399
+
400
+ -- ORDER BY text indexed column
401
+ select label from text_idx where label is not null order by label;
402
+ → [{"label": "apple"}, {"label": "apple"}, {"label": "banana"}, {"label": "cherry"}]
403
+
404
+ drop table text_idx;
405
+
406
+ -- ===================================================================
407
+ -- SECTION 32: Index on text column (basic)
408
+ -- ===================================================================
409
+
410
+ create table text_ci (id integer primary key, name text);
411
+ insert into text_ci values (1, 'Alice'), (2, 'bob'), (3, 'CHARLIE');
412
+ create index idx_name_ci on text_ci (name);
413
+
414
+ -- Index works on text columns
415
+ select id from text_ci where name = 'bob';
416
+ → [{"id": 2}]
417
+
418
+ -- ORDER BY text indexed column
419
+ select name from text_ci order by name;
420
+ → [{"name": "Alice"}, {"name": "CHARLIE"}, {"name": "bob"}]
421
+
422
+ drop table text_ci;
423
+
424
+ -- ===================================================================
425
+ -- SECTION 33: ALTER TABLE + index interaction
426
+ -- ===================================================================
427
+
428
+ create table alt_idx (id integer primary key, a integer, b text);
429
+ create index idx_a on alt_idx (a);
430
+ insert into alt_idx values (1, 10, 'x'), (2, 20, 'y');
431
+
432
+ -- ADD COLUMN — existing index should still work
433
+ alter table alt_idx add column c integer null;
434
+ select id from alt_idx where a = 10;
435
+ → [{"id": 1}]
436
+
437
+ -- Insert with new column
438
+ insert into alt_idx values (3, 10, 'z', 100);
439
+ select id from alt_idx where a = 10 order by id;
440
+ → [{"id": 1}, {"id": 3}]
441
+
442
+ -- RENAME COLUMN on non-indexed column — index should still work
443
+ alter table alt_idx rename column b to label;
444
+ select id from alt_idx where a = 20;
445
+ → [{"id": 2}]
446
+
447
+ -- DROP COLUMN on non-indexed column — index should still work
448
+ alter table alt_idx drop column label;
449
+ select id from alt_idx where a = 10 order by id;
450
+ → [{"id": 1}, {"id": 3}]
451
+
452
+ drop table alt_idx;
453
+
454
+ -- ===================================================================
455
+ -- SECTION 35: Multiple secondary indexes on same table
456
+ -- ===================================================================
457
+
458
+ create table multi_sec (id integer primary key, a integer, b text, c integer);
459
+ create index idx_ms_a on multi_sec (a);
460
+ create index idx_ms_b on multi_sec (b);
461
+ create index idx_ms_c on multi_sec (c);
462
+ insert into multi_sec values (1, 10, 'x', 100), (2, 20, 'y', 200), (3, 10, 'z', 100), (4, 30, 'x', 300);
463
+
464
+ -- Use each index independently
465
+ select id from multi_sec where a = 10 order by id;
466
+ → [{"id": 1}, {"id": 3}]
467
+
468
+ select id from multi_sec where b = 'x' order by id;
469
+ → [{"id": 1}, {"id": 4}]
470
+
471
+ select id from multi_sec where c = 100 order by id;
472
+ → [{"id": 1}, {"id": 3}]
473
+
474
+ -- Multiple filter columns — planner chooses best index
475
+ select id from multi_sec where a = 10 and c = 100 order by id;
476
+ → [{"id": 1}, {"id": 3}]
477
+
478
+ drop table multi_sec;
479
+
480
+ -- ===================================================================
481
+ -- SECTION 38: DELETE with index and verify index consistency
482
+ -- ===================================================================
483
+
484
+ create table del_idx (id integer primary key, tag text);
485
+ create index idx_tag on del_idx (tag);
486
+ insert into del_idx values (1, 'A'), (2, 'B'), (3, 'A'), (4, 'B'), (5, 'C');
487
+
488
+ -- Delete some rows
489
+ delete from del_idx where tag = 'A';
490
+
491
+ -- Verify through index
492
+ select id from del_idx where tag = 'A';
493
+ → []
494
+
495
+ select id from del_idx where tag = 'B' order by id;
496
+ → [{"id": 2}, {"id": 4}]
497
+
498
+ select count(*) as cnt from del_idx;
499
+ → [{"cnt": 3}]
500
+
501
+ -- Delete all remaining
502
+ delete from del_idx;
503
+ select count(*) as cnt from del_idx;
504
+ → [{"cnt": 0}]
505
+
506
+ -- Insert after full delete — index should still work
507
+ insert into del_idx values (10, 'X');
508
+ select id from del_idx where tag = 'X';
509
+ → [{"id": 10}]
510
+
511
+ drop table del_idx;
512
+
513
+ -- ===================================================================
514
+ -- SECTION 39: UPDATE affecting indexed columns
515
+ -- ===================================================================
516
+
517
+ create table upd_idx (id integer primary key, category text, priority integer);
518
+ create index idx_upd_cat on upd_idx (category);
519
+ create index idx_upd_pri on upd_idx (priority);
520
+ insert into upd_idx values (1, 'A', 1), (2, 'A', 2), (3, 'B', 1), (4, 'B', 3);
521
+
522
+ -- Update indexed column
523
+ update upd_idx set category = 'C' where id = 1;
524
+
525
+ -- Old index value should not find the row
526
+ select id from upd_idx where category = 'A';
527
+ → [{"id": 2}]
528
+
529
+ -- New index value should find it
530
+ select id from upd_idx where category = 'C';
531
+ → [{"id": 1}]
532
+
533
+ -- Update another indexed column
534
+ update upd_idx set priority = 10 where id = 3;
535
+ select id from upd_idx where priority = 1;
536
+ → [{"id": 1}]
537
+ select id from upd_idx where priority = 10;
538
+ → [{"id": 3}]
539
+
540
+ drop table upd_idx;