@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,208 @@
1
+ -- schema-foreign-keys.sqllogic - Testing foreign_key_info() TVF
2
+
3
+ -- ===================================================================
4
+ -- Setup: Parent tables
5
+ -- ===================================================================
6
+
7
+ CREATE TABLE authors (
8
+ id INTEGER PRIMARY KEY,
9
+ name TEXT NOT NULL
10
+ );
11
+
12
+ CREATE TABLE categories (
13
+ id INTEGER PRIMARY KEY,
14
+ label TEXT NOT NULL
15
+ );
16
+
17
+ -- ===================================================================
18
+ -- Test 1: Basic single-column FK
19
+ -- ===================================================================
20
+
21
+ CREATE TABLE books (
22
+ id INTEGER PRIMARY KEY,
23
+ title TEXT NOT NULL,
24
+ author_id INTEGER,
25
+ FOREIGN KEY (author_id) REFERENCES authors(id)
26
+ );
27
+
28
+ SELECT id, "table", "from", referenced_table, "to", on_update, on_delete, "deferred", seq
29
+ FROM foreign_key_info('books');
30
+ → [{"id":0,"table":"books","from":"author_id","referenced_table":"authors","to":"id","on_update":"restrict","on_delete":"restrict","deferred":0,"seq":0}]
31
+
32
+ -- ===================================================================
33
+ -- Test 2: Table with no FKs returns empty result
34
+ -- ===================================================================
35
+
36
+ SELECT count(*) as cnt FROM foreign_key_info('authors');
37
+ → [{"cnt":0}]
38
+
39
+ -- ===================================================================
40
+ -- Test 3: Named constraint
41
+ -- ===================================================================
42
+
43
+ CREATE TABLE articles (
44
+ id INTEGER PRIMARY KEY,
45
+ author_id INTEGER,
46
+ CONSTRAINT fk_article_author FOREIGN KEY (author_id) REFERENCES authors(id)
47
+ );
48
+
49
+ SELECT id, name, "from", "to" FROM foreign_key_info('articles');
50
+ → [{"id":0,"name":"fk_article_author","from":"author_id","to":"id"}]
51
+
52
+ DROP TABLE articles;
53
+
54
+ -- ===================================================================
55
+ -- Test 4: ON DELETE/UPDATE actions
56
+ -- ===================================================================
57
+
58
+ CREATE TABLE posts (
59
+ id INTEGER PRIMARY KEY,
60
+ author_id INTEGER,
61
+ FOREIGN KEY (author_id) REFERENCES authors(id) ON DELETE CASCADE ON UPDATE RESTRICT
62
+ );
63
+
64
+ SELECT on_update, on_delete FROM foreign_key_info('posts');
65
+ → [{"on_update":"restrict","on_delete":"cascade"}]
66
+
67
+ DROP TABLE posts;
68
+
69
+ -- ===================================================================
70
+ -- Test 5: Multiple FKs on one table — distinct id values
71
+ -- ===================================================================
72
+
73
+ CREATE TABLE tagged_books (
74
+ id INTEGER PRIMARY KEY,
75
+ author_id INTEGER,
76
+ category_id INTEGER,
77
+ FOREIGN KEY (author_id) REFERENCES authors(id),
78
+ FOREIGN KEY (category_id) REFERENCES categories(id)
79
+ );
80
+
81
+ SELECT id, "from", referenced_table FROM foreign_key_info('tagged_books') ORDER BY id;
82
+ → [{"id":0,"from":"author_id","referenced_table":"authors"},{"id":1,"from":"category_id","referenced_table":"categories"}]
83
+
84
+ DROP TABLE tagged_books;
85
+
86
+ -- ===================================================================
87
+ -- Test 6: Composite FK — multiple rows with same id, different seq
88
+ -- ===================================================================
89
+
90
+ CREATE TABLE composite_parent (
91
+ a INTEGER,
92
+ b INTEGER,
93
+ PRIMARY KEY (a, b)
94
+ );
95
+
96
+ CREATE TABLE composite_child (
97
+ id INTEGER PRIMARY KEY,
98
+ ref_a INTEGER,
99
+ ref_b INTEGER,
100
+ FOREIGN KEY (ref_a, ref_b) REFERENCES composite_parent(a, b)
101
+ );
102
+
103
+ SELECT id, "from", "to", seq FROM foreign_key_info('composite_child') ORDER BY seq;
104
+ → [{"id":0,"from":"ref_a","to":"a","seq":0},{"id":0,"from":"ref_b","to":"b","seq":1}]
105
+
106
+ DROP TABLE composite_child;
107
+ DROP TABLE composite_parent;
108
+
109
+ -- ===================================================================
110
+ -- Test 7: Auto-generated constraint name for unnamed constraints
111
+ -- ===================================================================
112
+
113
+ SELECT name FROM foreign_key_info('books');
114
+ → [{"name":"_fk_books_author_id"}]
115
+
116
+ -- ===================================================================
117
+ -- Test 8: Nonexistent table throws error
118
+ -- ===================================================================
119
+
120
+ SELECT * FROM foreign_key_info('nonexistent_table');
121
+ -- error: Table 'nonexistent_table' not found
122
+
123
+ -- ===================================================================
124
+ -- Test 9: Implicit single-column FK (no parent column list) resolves
125
+ -- to the parent's primary key
126
+ -- ===================================================================
127
+
128
+ CREATE TABLE imp_parent (pid INTEGER PRIMARY KEY, other INTEGER);
129
+ CREATE TABLE imp_child (id INTEGER PRIMARY KEY, x INTEGER REFERENCES imp_parent);
130
+
131
+ SELECT "from", "to" FROM foreign_key_info('imp_child');
132
+ → [{"from":"x","to":"pid"}]
133
+
134
+ DROP TABLE imp_child;
135
+ DROP TABLE imp_parent;
136
+
137
+ -- ===================================================================
138
+ -- Test 10: Implicit composite FK yields one row per parent primary-key
139
+ -- column, in primary-key order
140
+ -- ===================================================================
141
+
142
+ CREATE TABLE imp_parent2 (a INTEGER, b INTEGER, PRIMARY KEY (a, b));
143
+ CREATE TABLE imp_child2 (
144
+ id INTEGER PRIMARY KEY,
145
+ x INTEGER,
146
+ y INTEGER,
147
+ FOREIGN KEY (x, y) REFERENCES imp_parent2
148
+ );
149
+
150
+ SELECT "from", "to", seq FROM foreign_key_info('imp_child2') ORDER BY seq;
151
+ → [{"from":"x","to":"a","seq":0},{"from":"y","to":"b","seq":1}]
152
+
153
+ DROP TABLE imp_child2;
154
+ DROP TABLE imp_parent2;
155
+
156
+ -- ===================================================================
157
+ -- Test 11: Implicit FK whose parent table does not exist reports "to"
158
+ -- as NULL rather than raising
159
+ -- ===================================================================
160
+
161
+ CREATE TABLE imp_child3 (id INTEGER PRIMARY KEY, x INTEGER REFERENCES nonexistent_parent);
162
+
163
+ SELECT "from", "to" FROM foreign_key_info('imp_child3');
164
+ → [{"from":"x","to":null}]
165
+
166
+ DROP TABLE imp_child3;
167
+
168
+ -- ===================================================================
169
+ -- Test 12: Implicit FK wider than the parent's primary key reports the
170
+ -- unmatched positions as NULL rather than raising (enforcement skips
171
+ -- this malformed shape entirely)
172
+ -- ===================================================================
173
+
174
+ CREATE TABLE imp_parent4 (pid INTEGER PRIMARY KEY);
175
+ CREATE TABLE imp_child4 (
176
+ id INTEGER PRIMARY KEY,
177
+ x INTEGER,
178
+ y INTEGER,
179
+ FOREIGN KEY (x, y) REFERENCES imp_parent4
180
+ );
181
+
182
+ SELECT "from", "to", seq FROM foreign_key_info('imp_child4') ORDER BY seq;
183
+ → [{"from":"x","to":"pid","seq":0},{"from":"y","to":null,"seq":1}]
184
+
185
+ DROP TABLE imp_child4;
186
+ DROP TABLE imp_parent4;
187
+
188
+ -- ===================================================================
189
+ -- Test 13: Implicit FK to a parent that declares no primary key resolves
190
+ -- against the synthesized key Quereus gives every table
191
+ -- ===================================================================
192
+
193
+ CREATE TABLE imp_parent5 (a INTEGER);
194
+ CREATE TABLE imp_child5 (id INTEGER PRIMARY KEY, x INTEGER REFERENCES imp_parent5);
195
+
196
+ SELECT "from", "to" FROM foreign_key_info('imp_child5');
197
+ → [{"from":"x","to":"a"}]
198
+
199
+ DROP TABLE imp_child5;
200
+ DROP TABLE imp_parent5;
201
+
202
+ -- ===================================================================
203
+ -- Cleanup
204
+ -- ===================================================================
205
+
206
+ DROP TABLE books;
207
+ DROP TABLE categories;
208
+ DROP TABLE authors;
@@ -0,0 +1,202 @@
1
+ -- introspection-tags.sqllogic - Tag and rich-metadata exposure through introspection TVFs
2
+
3
+ -- ===================================================================
4
+ -- Setup
5
+ -- ===================================================================
6
+
7
+ CREATE TABLE Orders (
8
+ id INTEGER PRIMARY KEY,
9
+ name TEXT NOT NULL
10
+ ) WITH TAGS (display_name = 'Customer Orders', audit = true);
11
+
12
+ CREATE TABLE PlainTable (
13
+ id INTEGER PRIMARY KEY,
14
+ val TEXT
15
+ );
16
+
17
+ CREATE VIEW ActiveOrders AS SELECT * FROM Orders WHERE id > 0
18
+ WITH TAGS (cacheable = true, purpose = 'active orders filter');
19
+
20
+ CREATE VIEW PlainView AS SELECT * FROM PlainTable;
21
+
22
+ -- ===================================================================
23
+ -- schema() — tags on tables / views; null for untagged & functions
24
+ -- (index tags live in 06.3.3.1-introspection-tags-index — they need index DDL)
25
+ -- ===================================================================
26
+
27
+ SELECT name, json_extract(tags, '$.display_name') AS display_name
28
+ FROM schema() WHERE type = 'table' AND name = 'Orders';
29
+ → [{"name":"Orders","display_name":"Customer Orders"}]
30
+
31
+ SELECT tags FROM schema() WHERE type = 'table' AND name = 'PlainTable';
32
+ → [{"tags":null}]
33
+
34
+ SELECT json_extract(tags, '$.cacheable') AS cacheable,
35
+ json_extract(tags, '$.purpose') AS purpose
36
+ FROM schema() WHERE type = 'view' AND name = 'ActiveOrders';
37
+ → [{"cacheable":true,"purpose":"active orders filter"}]
38
+
39
+ SELECT tags FROM schema() WHERE type = 'view' AND name = 'PlainView';
40
+ → [{"tags":null}]
41
+
42
+ -- Functions never carry tags
43
+ SELECT count(*) AS bad FROM schema() WHERE type = 'function' AND tags IS NOT NULL;
44
+ → [{"bad":0}]
45
+
46
+ -- ===================================================================
47
+ -- table_info() — column-level tags, collation, generated flag
48
+ -- ===================================================================
49
+
50
+ CREATE TABLE Products (
51
+ id INTEGER PRIMARY KEY WITH TAGS (display_name = 'Product ID'),
52
+ name TEXT NOT NULL COLLATE NOCASE WITH TAGS (searchable = true),
53
+ price REAL NOT NULL,
54
+ discounted REAL GENERATED ALWAYS AS (price * 0.9),
55
+ snapshot REAL GENERATED ALWAYS AS (price + 1) STORED
56
+ );
57
+
58
+ SELECT name, json_extract(tags, '$.display_name') AS display_name,
59
+ json_extract(tags, '$.searchable') AS searchable
60
+ FROM table_info('Products') ORDER BY cid;
61
+ → [{"name":"id","display_name":"Product ID","searchable":null},{"name":"name","display_name":null,"searchable":true},{"name":"price","display_name":null,"searchable":null},{"name":"discounted","display_name":null,"searchable":null},{"name":"snapshot","display_name":null,"searchable":null}]
62
+
63
+ SELECT name, collation FROM table_info('Products') ORDER BY cid;
64
+ → [{"name":"id","collation":"BINARY"},{"name":"name","collation":"NOCASE"},{"name":"price","collation":"BINARY"},{"name":"discounted","collation":"BINARY"},{"name":"snapshot","collation":"BINARY"}]
65
+
66
+ SELECT name, "generated" FROM table_info('Products') ORDER BY cid;
67
+ → [{"name":"id","generated":0},{"name":"name","generated":0},{"name":"price","generated":0},{"name":"discounted","generated":1},{"name":"snapshot","generated":2}]
68
+
69
+ -- ===================================================================
70
+ -- foreign_key_info() — tags on FKs, repeated per seq row
71
+ -- ===================================================================
72
+
73
+ CREATE TABLE FkChild (
74
+ id INTEGER PRIMARY KEY,
75
+ order_id INTEGER,
76
+ CONSTRAINT fk_child_order FOREIGN KEY (order_id) REFERENCES Orders(id)
77
+ WITH TAGS (audit = true, purpose = 'links to orders')
78
+ );
79
+
80
+ SELECT name, json_extract(tags, '$.audit') AS audit,
81
+ json_extract(tags, '$.purpose') AS purpose
82
+ FROM foreign_key_info('FkChild');
83
+ → [{"name":"fk_child_order","audit":true,"purpose":"links to orders"}]
84
+
85
+ -- Composite FK: tags repeat across all seq rows
86
+ CREATE TABLE CompositeParent (
87
+ a INTEGER,
88
+ b INTEGER,
89
+ PRIMARY KEY (a, b)
90
+ );
91
+
92
+ CREATE TABLE CompositeChild (
93
+ id INTEGER PRIMARY KEY,
94
+ ref_a INTEGER,
95
+ ref_b INTEGER,
96
+ CONSTRAINT fk_composite FOREIGN KEY (ref_a, ref_b) REFERENCES CompositeParent(a, b)
97
+ WITH TAGS (kind = 'composite')
98
+ );
99
+
100
+ SELECT seq, json_extract(tags, '$.kind') AS kind
101
+ FROM foreign_key_info('CompositeChild') ORDER BY seq;
102
+ → [{"seq":0,"kind":"composite"},{"seq":1,"kind":"composite"}]
103
+
104
+ -- Untagged FK
105
+ SELECT tags FROM foreign_key_info('CompositeChild')
106
+ WHERE tags IS NOT NULL LIMIT 0;
107
+ → []
108
+
109
+ -- ===================================================================
110
+ -- index_info() — empty on a table with no indexes
111
+ -- (the populated column-by-column layout lives in
112
+ -- 06.3.3.1-introspection-tags-index — it needs index DDL)
113
+ -- ===================================================================
114
+
115
+ -- Empty result on a table with no indexes
116
+ SELECT count(*) AS cnt FROM index_info('PlainTable') WHERE index_name LIKE 'idx_%';
117
+ → [{"cnt":0}]
118
+
119
+ -- ===================================================================
120
+ -- check_constraint_info() — named CHECK with tags, unnamed without
121
+ -- ===================================================================
122
+
123
+ CREATE TABLE ChkTable (
124
+ id INTEGER PRIMARY KEY,
125
+ qty INTEGER,
126
+ CONSTRAINT chk_qty_positive CHECK (qty > 0) WITH TAGS (error_message = 'must be positive'),
127
+ CHECK (qty < 1000)
128
+ );
129
+
130
+ SELECT name, "deferrable", initially_deferred,
131
+ json_extract(tags, '$.error_message') AS msg
132
+ FROM check_constraint_info('ChkTable') ORDER BY id;
133
+ → [{"name":"chk_qty_positive","deferrable":0,"initially_deferred":0,"msg":"must be positive"},{"name":null,"deferrable":0,"initially_deferred":0,"msg":null}]
134
+
135
+ -- expr text round-trips through the AST stringifier
136
+ SELECT expr FROM check_constraint_info('ChkTable') WHERE name = 'chk_qty_positive';
137
+ → [{"expr":"qty > 0"}]
138
+
139
+ -- ===================================================================
140
+ -- unique_constraint_info() — named UNIQUE with tags, multi-column
141
+ -- ===================================================================
142
+
143
+ CREATE TABLE UqTable (
144
+ id INTEGER PRIMARY KEY,
145
+ email TEXT NOT NULL,
146
+ region TEXT NOT NULL,
147
+ code TEXT NOT NULL,
148
+ CONSTRAINT uq_email UNIQUE (email) WITH TAGS (error_message = 'email must be unique'),
149
+ UNIQUE (region, code)
150
+ );
151
+
152
+ SELECT id, name, seq, column_name, partial,
153
+ json_extract(tags, '$.error_message') AS msg
154
+ FROM unique_constraint_info('UqTable') ORDER BY id, seq;
155
+ → [{"id":0,"name":"uq_email","seq":0,"column_name":"email","partial":0,"msg":"email must be unique"},{"id":1,"name":null,"seq":0,"column_name":"region","partial":0,"msg":null},{"id":1,"name":null,"seq":1,"column_name":"code","partial":0,"msg":null}]
156
+
157
+ -- A partial unique INDEX synthesizing a partial unique constraint lives in
158
+ -- 06.3.3.1-introspection-tags-index (it needs standalone CREATE UNIQUE INDEX).
159
+
160
+ -- ===================================================================
161
+ -- assertion_info() — CREATE ASSERTION listing
162
+ -- ===================================================================
163
+
164
+ CREATE TABLE AssertData (id INTEGER PRIMARY KEY, val INTEGER);
165
+ -- run
166
+
167
+ CREATE ASSERTION val_positive CHECK (NOT EXISTS (SELECT 1 FROM AssertData WHERE val < 0));
168
+ CREATE ASSERTION val_bounded CHECK (NOT EXISTS (SELECT 1 FROM AssertData WHERE val > 100));
169
+ -- run
170
+
171
+ SELECT name, "deferrable", initially_deferred FROM assertion_info() ORDER BY name;
172
+ → [{"name":"val_bounded","deferrable":1,"initially_deferred":1},{"name":"val_positive","deferrable":1,"initially_deferred":1}]
173
+
174
+ -- violation_sql is non-empty
175
+ SELECT count(*) AS cnt FROM assertion_info() WHERE length(violation_sql) > 0;
176
+ → [{"cnt":2}]
177
+
178
+ -- dependent_tables is a JSON array of the base tables the body reads: one entry
179
+ -- per table reference, named `<schema>.<table>` lowercased
180
+ SELECT count(*) AS cnt FROM assertion_info() WHERE json_valid(dependent_tables) = 1;
181
+ → [{"cnt":2}]
182
+
183
+ SELECT name, json_array_length(dependent_tables) AS n, json_extract(dependent_tables, '$[0].base') AS base
184
+ FROM assertion_info() ORDER BY name;
185
+ → [{"name":"val_bounded","n":1,"base":"main.assertdata"},{"name":"val_positive","n":1,"base":"main.assertdata"}]
186
+
187
+ -- ===================================================================
188
+ -- Cleanup
189
+ -- ===================================================================
190
+ DROP ASSERTION val_bounded;
191
+ DROP ASSERTION val_positive;
192
+ DROP TABLE AssertData;
193
+ DROP TABLE UqTable;
194
+ DROP TABLE ChkTable;
195
+ DROP TABLE CompositeChild;
196
+ DROP TABLE CompositeParent;
197
+ DROP TABLE FkChild;
198
+ DROP TABLE Products;
199
+ DROP VIEW PlainView;
200
+ DROP VIEW ActiveOrders;
201
+ DROP TABLE PlainTable;
202
+ DROP TABLE Orders;
@@ -0,0 +1,74 @@
1
+ -- 06.3.3.1-introspection-tags-index.sqllogic - Index tags and index layout through introspection TVFs
2
+ --
3
+ -- requires-capability: standalone-index-ddl
4
+ --
5
+ -- Carved out of 06.3.3-introspection-tags: that file exposes tags and rich metadata
6
+ -- for tables, views, columns, foreign keys, CHECK constraints, non-index UNIQUE
7
+ -- constraints and assertions, none of which needs index DDL. The index-shaped parts
8
+ -- all do — an index is the only object they can be about — so they move here and the
9
+ -- rest stays runnable on a backend without first-class CREATE INDEX.
10
+ --
11
+ -- Subject: schema() reports an index's tags (and null when untagged), index_info()
12
+ -- reports the column-by-column layout with desc/unique/partial flags and tags, and a
13
+ -- partial unique index synthesizes a partial UNIQUE constraint in
14
+ -- unique_constraint_info().
15
+
16
+ -- ===================================================================
17
+ -- Setup
18
+ -- ===================================================================
19
+
20
+ CREATE TABLE Orders (
21
+ id INTEGER PRIMARY KEY,
22
+ name TEXT NOT NULL
23
+ ) WITH TAGS (display_name = 'Customer Orders', audit = true);
24
+
25
+ CREATE INDEX idx_orders_name ON Orders (name)
26
+ WITH TAGS (purpose = 'name lookup');
27
+
28
+ CREATE INDEX idx_orders_plain ON Orders (id);
29
+
30
+ -- ===================================================================
31
+ -- schema() — tags on indexes; null for untagged
32
+ -- ===================================================================
33
+
34
+ SELECT name, json_extract(tags, '$.purpose') AS purpose
35
+ FROM schema() WHERE type = 'index' AND name = 'idx_orders_name';
36
+ → [{"name":"idx_orders_name","purpose":"name lookup"}]
37
+
38
+ SELECT tags FROM schema() WHERE type = 'index' AND name = 'idx_orders_plain';
39
+ → [{"tags":null}]
40
+
41
+ -- ===================================================================
42
+ -- index_info() — column-by-column index layout, partial/unique/tags
43
+ -- ===================================================================
44
+
45
+ CREATE TABLE IdxTable (
46
+ id INTEGER PRIMARY KEY,
47
+ a TEXT,
48
+ b INTEGER,
49
+ status TEXT
50
+ );
51
+
52
+ CREATE INDEX idx_a_asc ON IdxTable (a) WITH TAGS (purpose = 'lookup');
53
+ CREATE INDEX idx_b_desc ON IdxTable (b DESC);
54
+ CREATE UNIQUE INDEX idx_a_unique ON IdxTable (a);
55
+ CREATE INDEX idx_a_partial ON IdxTable (a) WHERE status = 'active';
56
+
57
+ SELECT index_name, seq, column_name, "desc", "unique", partial,
58
+ json_extract(tags, '$.purpose') AS purpose
59
+ FROM index_info('IdxTable') ORDER BY index_name, seq;
60
+ → [{"index_name":"idx_a_asc","seq":0,"column_name":"a","desc":0,"unique":0,"partial":0,"purpose":"lookup"},{"index_name":"idx_a_partial","seq":0,"column_name":"a","desc":0,"unique":0,"partial":1,"purpose":null},{"index_name":"idx_a_unique","seq":0,"column_name":"a","desc":0,"unique":1,"partial":0,"purpose":null},{"index_name":"idx_b_desc","seq":0,"column_name":"b","desc":1,"unique":0,"partial":0,"purpose":null}]
61
+
62
+ -- ===================================================================
63
+ -- unique_constraint_info() — partial unique index synthesizes a partial constraint
64
+ -- ===================================================================
65
+
66
+ CREATE TABLE PuTable (
67
+ id INTEGER PRIMARY KEY,
68
+ code TEXT NOT NULL,
69
+ status TEXT NOT NULL
70
+ );
71
+ CREATE UNIQUE INDEX uq_pu_active ON PuTable (code) WHERE status = 'active';
72
+
73
+ SELECT name, partial FROM unique_constraint_info('PuTable');
74
+ → [{"name":"uq_pu_active","partial":1}]