@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,417 @@
1
+ -- json-coerce-once.sqllogic
2
+ -- A write's values are converted to declared column types exactly once, at the
3
+ -- DML emitter, driven by the static type of each cell's producing expression
4
+ -- (ticket json-coerce-once-at-dml-source). A JSON value that came OUT of storage
5
+ -- is already converted and must never be converted again: JSON's parse reads a
6
+ -- plain JS string as JSON source, so re-converting the stored text `9` turns it
7
+ -- into the number 9, and re-converting `abc` (not valid JSON source) throws.
8
+ -- No `using memory`, so store mode exercises the same rules on the store path.
9
+ -- Sibling file 06.9.1.1-json-coerce-once-index.sqllogic carries the index-DDL
10
+ -- cases; they need the `standalone-index-ddl` capability, which is declared
11
+ -- per file, so they cannot live here without gating this whole file.
12
+
13
+ -- UPDATE of a NON-JSON column must leave an untouched JSON column byte-identical:
14
+ -- a JSON string scalar whose text looks numeric must not silently become a number.
15
+ create table jco_num (j json primary key, v text);
16
+ insert into jco_num values ('"9"', 'a'), ('"9.0"', 'b');
17
+ update jco_num set v = 'X' where v = 'a';
18
+ -- run
19
+
20
+ -- The JSON output shape pins identity: "9" (string scalar) vs 9 (number).
21
+ select j, v from jco_num order by v;
22
+ → [{"j":"9","v":"X"},{"j":"9.0","v":"b"}]
23
+
24
+ -- Same shape where the stored JSON text is NOT valid JSON source: before the fix
25
+ -- this UPDATE failed with "Type conversion failed for column 'j'" even though the
26
+ -- statement never mentions j.
27
+ create table jco_txt (j json primary key, v text);
28
+ insert into jco_txt values ('"abc"', 'a');
29
+ update jco_txt set v = 'X';
30
+ -- run
31
+
32
+ select j, v from jco_txt;
33
+ → [{"j":"abc","v":"X"}]
34
+
35
+ -- The same UPDATE-of-a-sibling-column shape for the three text scalars that
36
+ -- would land in a DIFFERENT type if ever re-parsed: "true" (→ boolean),
37
+ -- "null" (→ SQL NULL — a present value would vanish), "[1,2]" (→ a list).
38
+ -- json_quote is the assertion of choice: it distinguishes the text scalar
39
+ -- "9" from the number 9, which a bare select of the column does not.
40
+ create table jco_shapes (j json primary key, v text);
41
+ insert into jco_shapes values ('"true"', 'a'), ('"null"', 'b'), ('"[1,2]"', 'c');
42
+ update jco_shapes set v = 'X' where v = 'a';
43
+ update jco_shapes set v = 'Y' where v = 'b';
44
+ update jco_shapes set v = 'Z' where v = 'c';
45
+ -- run
46
+
47
+ select json_quote(j) as jq, v from jco_shapes order by v;
48
+ → [{"jq":"\"true\"","v":"X"},{"jq":"\"null\"","v":"Y"},{"jq":"\"[1,2]\"","v":"Z"}]
49
+
50
+ -- INSERT ... SELECT of a JSON column: the source cell is already a JSON value
51
+ -- (static type JSON → skip conversion), so copying rows must neither re-parse
52
+ -- nor throw.
53
+ create table jco_src (id integer primary key, j json);
54
+ create table jco_dst (id integer primary key, j json);
55
+ insert into jco_src values (1, '"abc"'), (2, '"9"'), (3, '[2]'), (4, '{"a":1}');
56
+ insert into jco_dst select id, j from jco_src;
57
+ -- run
58
+
59
+ select id, j from jco_dst order by id;
60
+ → [{"id":1,"j":"abc"},{"id":2,"j":"9"},{"id":3,"j":[2]},{"id":4,"j":{"a":1}}]
61
+
62
+ -- Self-assignment: `set j = j` reads the stored (converted) value; assigning it
63
+ -- back must be a no-op, not a re-parse.
64
+ update jco_dst set j = j;
65
+ -- run
66
+
67
+ select id, j from jco_dst order by id;
68
+ → [{"id":1,"j":"abc"},{"id":2,"j":"9"},{"id":3,"j":[2]},{"id":4,"j":{"a":1}}]
69
+
70
+ -- Assigning a TEXT literal to a JSON column still converts: '"abc"' is JSON
71
+ -- source for the text value abc, and '[2]' is JSON source for a list.
72
+ update jco_dst set j = '"xyz"' where id = 1;
73
+ update jco_dst set j = '[5,6]' where id = 3;
74
+ -- run
75
+
76
+ select id, j from jco_dst where id in (1, 3) order by id;
77
+ → [{"id":1,"j":"xyz"},{"id":3,"j":[5,6]}]
78
+
79
+ -- ...and a literal that is not valid JSON source still fails, naming the column.
80
+ create table jco_err (id integer primary key, j json);
81
+ insert into jco_err values (1, 'abc');
82
+ -- error: Type conversion failed for column 'j'
83
+
84
+ -- A CHECK constraint on a table UPDATEd without mentioning its JSON column must
85
+ -- see the STORED JSON value, not a re-converted one. j holds the JSON text "9"
86
+ -- (a string scalar): under JSON's type rank a string never equals a number, so
87
+ -- `j <> 9` holds. Re-conversion would damage it into the NUMBER 9 and fail the
88
+ -- CHECK on an UPDATE that never touches j.
89
+ create table jco_chk (id integer primary key, j json, v text,
90
+ check (j <> 9));
91
+ insert into jco_chk values (1, '"9"', 'a');
92
+ update jco_chk set v = 'X';
93
+ -- run
94
+
95
+ select id, j, v from jco_chk;
96
+ → [{"id":1,"j":"9","v":"X"}]
97
+
98
+ -- ON CONFLICT DO UPDATE: the assignment's TEXT literal converts; excluded./stored
99
+ -- JSON references pass through untouched.
100
+ create table jco_upsert (id integer primary key, j json);
101
+ insert into jco_upsert values (1, '"abc"');
102
+ insert into jco_upsert values (1, '"zzz"')
103
+ on conflict (id) do update set j = excluded.j;
104
+ -- run
105
+
106
+ select id, j from jco_upsert;
107
+ → [{"id":1,"j":"zzz"}]
108
+
109
+ insert into jco_upsert values (1, '"proposed"')
110
+ on conflict (id) do update set j = '"lit"';
111
+ -- run
112
+
113
+ select id, j from jco_upsert;
114
+ → [{"id":1,"j":"lit"}]
115
+
116
+ -- JSON null converts to SQL NULL. Now that conversion happens before the NOT
117
+ -- NULL check, a NOT NULL JSON column rejects the text 'null' (previously the
118
+ -- check inspected the raw text, passed, and storage silently stored NULL).
119
+ create table jco_nn (id integer primary key, j json not null);
120
+ insert into jco_nn values (1, 'null');
121
+ -- error: NOT NULL constraint failed
122
+
123
+ -- A nullable JSON column stores it as SQL NULL, as before.
124
+ create table jco_nul (id integer primary key, j json null);
125
+ insert into jco_nul values (1, 'null');
126
+ -- run
127
+
128
+ select id, j, (j is null) as isnull from jco_nul;
129
+ → [{"id":1,"j":null,"isnull":true}]
130
+
131
+ -- A generated column must derive from the value that is actually STORED, not
132
+ -- from the raw assignment: emitUpdate converts the regular assignments before
133
+ -- the generated expressions read them. Otherwise `g` here would keep the
134
+ -- assignment's TEXT and store the object's serialization as a JSON *string*.
135
+ create table jco_gen (id integer primary key, j json, g json generated always as (j));
136
+ insert into jco_gen values (1, '"abc"');
137
+ update jco_gen set j = '{"k":1}';
138
+ -- run
139
+
140
+ select id, json_quote(j) as jq, json_quote(g) as gq from jco_gen;
141
+ → [{"id":1,"jq":"{\"k\":1}","gq":"{\"k\":1}"}]
142
+
143
+ -- `insert or replace` substitutes a NOT NULL column's DEFAULT after the row was
144
+ -- already converted, so the substituted cell converts on its own (its DEFAULT is
145
+ -- a TEXT literal, so it is JSON source).
146
+ create table jco_dflt (id integer primary key, j json not null default '"dflt"');
147
+ insert or replace into jco_dflt values (1, null);
148
+ -- run
149
+
150
+ select id, j from jco_dflt;
151
+ → [{"id":1,"j":"dflt"}]
152
+
153
+ -- ...and a DEFAULT that CONVERTS to SQL NULL (the JSON text 'null') does not
154
+ -- satisfy NOT NULL, even though the raw text is non-null.
155
+ create table jco_dflt_null (id integer primary key, j json not null default 'null');
156
+ insert or replace into jco_dflt_null values (1, null);
157
+ -- error: NOT NULL constraint failed
158
+
159
+ -- A DEFAULT whose static type already IS the column's (json() returns a native
160
+ -- value) is substituted untouched.
161
+ create table jco_dflt_json (id integer primary key, j json not null default (json('{"a":1}')));
162
+ insert or replace into jco_dflt_json values (1, null);
163
+ -- run
164
+
165
+ select id, j from jco_dflt_json;
166
+ → [{"id":1,"j":{"a":1}}]
167
+
168
+ -- ---------------------------------------------------------------------------
169
+ -- Set operations over a JSON branch and a TEXT branch (ticket
170
+ -- union-branch-value-not-converted-on-write). The set operation merges the
171
+ -- branch types symmetrically — the object-physical (JSON) side wins and the
172
+ -- TEXT branch is cast (leniently) to it — so each branch stores exactly what it
173
+ -- would have stored on its own, in EITHER arm order.
174
+ create table jco_u_src (id integer primary key, j json);
175
+ create table jco_u_dst (id integer primary key, j json);
176
+ insert into jco_u_src values (1, '"abc"');
177
+ -- run
178
+
179
+ -- JSON arm on the LEFT: the TEXT literal '"9"' must still convert (it used to
180
+ -- ride the advertised JSON type unconverted and store the raw 3-char text).
181
+ insert into jco_u_dst select id, j from jco_u_src union all select 3, '"9"';
182
+ -- run
183
+
184
+ select id, json_quote(j) as q from jco_u_dst order by id;
185
+ → [{"id":1,"q":"\"abc\""},{"id":3,"q":"\"9\""}]
186
+
187
+ -- JSON arm on the RIGHT: the stored JSON value must NOT be re-converted (it
188
+ -- used to ride the advertised TEXT type into a full re-parse, which throws on
189
+ -- the JSON string scalar abc).
190
+ delete from jco_u_dst;
191
+ insert into jco_u_dst select 3, '"9"' union all select id, j from jco_u_src;
192
+ -- run
193
+
194
+ select id, json_quote(j) as q from jco_u_dst order by id;
195
+ → [{"id":1,"q":"\"abc\""},{"id":3,"q":"\"9\""}]
196
+
197
+ -- The CTE form routes through the same set operation and must agree.
198
+ delete from jco_u_dst;
199
+ with u as (select id, j from jco_u_src union all select 3, '"9"')
200
+ insert into jco_u_dst select id, j from u;
201
+ -- run
202
+
203
+ select id, json_quote(j) as q from jco_u_dst order by id;
204
+ → [{"id":1,"q":"\"abc\""},{"id":3,"q":"\"9\""}]
205
+
206
+ -- Read side, no DML involved: both branches denote the JSON string abc, so
207
+ -- UNION must collapse them to ONE row — in either arm order.
208
+ select j from jco_u_src union select '"abc"';
209
+ → [{"j":"abc"}]
210
+
211
+ select '"abc"' as j union select j from jco_u_src;
212
+ → [{"j":"abc"}]
213
+
214
+ -- A predicate over the union output must match BOTH branches' rows.
215
+ select json_quote(x) as q from (select j as x from jco_u_src union all select '"abc"')
216
+ where x = json('"abc"');
217
+ → [{"q":"\"abc\""},{"q":"\"abc\""}]
218
+
219
+ -- The branch cast is lenient: text that is not JSON source falls back to the
220
+ -- raw string (a legitimate JSON string scalar) instead of erroring the read.
221
+ select j from jco_u_src union all select 'not json';
222
+ → [{"j":"abc"},{"j":"not json"}]
223
+
224
+ -- INTERSECT / EXCEPT compare across the aligned branches too.
225
+ select j from jco_u_src intersect select '"abc"';
226
+ → [{"j":"abc"}]
227
+
228
+ select j from jco_u_src except select '"abc"';
229
+ → []
230
+
231
+ -- JSON | JSON stays untouched on both sides (identical types — no cast, no
232
+ -- conversion at the DML).
233
+ delete from jco_u_dst;
234
+ insert into jco_u_dst select id, j from jco_u_src union all select 9, j from jco_u_src;
235
+ -- run
236
+
237
+ select id, json_quote(j) as q from jco_u_dst order by id;
238
+ → [{"id":1,"q":"\"abc\""},{"id":9,"q":"\"abc\""}]
239
+
240
+ -- ---------------------------------------------------------------------------
241
+ -- Write-path coverage (ticket json-native-form-write-path-coverage). The
242
+ -- scenarios above pin ordinary UPDATE, INSERT ... SELECT, upsert and generated
243
+ -- columns. The paths below all rewrite EXISTING rows through a different code
244
+ -- path — ALTER TABLE, transactions, savepoints, INSERT OR REPLACE, primary-key
245
+ -- relocation — and are where a future regression in the "convert exactly
246
+ -- once" invariant would actually land, because they rebuild rows rather than
247
+ -- passing them through untouched. (standalone CREATE INDEX is covered
248
+ -- separately, in 06.9.1.1-json-coerce-once-index.sqllogic — see the note
249
+ -- there on why it can't live in this file.)
250
+
251
+ -- ALTER TABLE ... ADD COLUMN with a plain default rewrites every row.
252
+ create table jco_wp_addcol (id integer primary key, j json);
253
+ insert into jco_wp_addcol values (1, '"9"'), (2, '"null"');
254
+ alter table jco_wp_addcol add column x integer default 5;
255
+ -- run
256
+
257
+ select id, json_quote(j) as jq, x from jco_wp_addcol order by id;
258
+ → [{"id":1,"jq":"\"9\"","x":5},{"id":2,"jq":"\"null\"","x":5}]
259
+
260
+ -- ...and with a NOT NULL default, which must also be satisfied per row.
261
+ create table jco_wp_addcol_nn (id integer primary key, j json);
262
+ insert into jco_wp_addcol_nn values (1, '"9"'), (2, '"null"');
263
+ alter table jco_wp_addcol_nn add column x text not null default 'z';
264
+ -- run
265
+
266
+ select id, json_quote(j) as jq, x from jco_wp_addcol_nn order by id;
267
+ → [{"id":1,"jq":"\"9\"","x":"z"},{"id":2,"jq":"\"null\"","x":"z"}]
268
+
269
+ -- ALTER TABLE ... ADD CONSTRAINT ... CHECK validates every existing row.
270
+ create table jco_wp_chk (id integer primary key, j json, v integer);
271
+ insert into jco_wp_chk values (1, '"9"', 1), (2, '"null"', 2);
272
+ alter table jco_wp_chk add constraint jco_wp_chk_v check (v > 0);
273
+ -- run
274
+
275
+ select id, json_quote(j) as jq from jco_wp_chk order by id;
276
+ → [{"id":1,"jq":"\"9\""},{"id":2,"jq":"\"null\""}]
277
+
278
+ -- ALTER TABLE ... ALTER COLUMN ... SET DATA TYPE on a SIBLING column rewrites
279
+ -- every row to convert that column — the untouched JSON column must ride along.
280
+ create table jco_wp_retype (id integer primary key, j json, v text);
281
+ insert into jco_wp_retype values (1, '"9"', '10'), (2, '"null"', '20');
282
+ alter table jco_wp_retype alter column v set data type integer;
283
+ -- run
284
+
285
+ select id, json_quote(j) as jq, v from jco_wp_retype order by id;
286
+ → [{"id":1,"jq":"\"9\"","v":10},{"id":2,"jq":"\"null\"","v":20}]
287
+
288
+ -- INSERT OR REPLACE onto an existing JSON primary key deletes and re-inserts
289
+ -- the row; the surviving key must be the CONFLICTING key, byte-identical.
290
+ create table jco_wp_replace (j json primary key, v text);
291
+ insert into jco_wp_replace values ('"9"', 'a');
292
+ insert or replace into jco_wp_replace values ('"9"', 'X');
293
+ -- run
294
+
295
+ select json_quote(j) as jq, v from jco_wp_replace;
296
+ → [{"jq":"\"9\"","v":"X"}]
297
+
298
+ -- DELETE then re-INSERT of the same JSON key exercises the same key bytes
299
+ -- through two separate DML statements rather than one.
300
+ create table jco_wp_delreins (j json primary key, v text);
301
+ insert into jco_wp_delreins values ('"9"', 'a');
302
+ delete from jco_wp_delreins where v = 'a';
303
+ insert into jco_wp_delreins values ('"9"', 'b');
304
+ -- run
305
+
306
+ select json_quote(j) as jq, v from jco_wp_delreins;
307
+ → [{"jq":"\"9\"","v":"b"}]
308
+
309
+ -- Two UPDATEs inside one transaction, then COMMIT.
310
+ create table jco_wp_tx (id integer primary key, j json, v integer);
311
+ insert into jco_wp_tx values (1, '"9"', 1), (2, '"null"', 2);
312
+ begin;
313
+ update jco_wp_tx set v = 10 where id = 1;
314
+ update jco_wp_tx set v = 20 where id = 2;
315
+ commit;
316
+ -- run
317
+
318
+ select id, json_quote(j) as jq, v from jco_wp_tx order by id;
319
+ → [{"id":1,"jq":"\"9\"","v":10},{"id":2,"jq":"\"null\"","v":20}]
320
+
321
+ -- UPDATE, SAVEPOINT, UPDATE, ROLLBACK TO SAVEPOINT, COMMIT: the row touched
322
+ -- before the savepoint keeps its change; the row touched after it reverts.
323
+ create table jco_wp_savepoint (id integer primary key, j json, v integer);
324
+ insert into jco_wp_savepoint values (1, '"9"', 1), (2, '"null"', 2);
325
+ begin;
326
+ update jco_wp_savepoint set v = 10 where id = 1;
327
+ savepoint s1;
328
+ update jco_wp_savepoint set v = 99 where id = 2;
329
+ rollback to savepoint s1;
330
+ commit;
331
+ -- run
332
+
333
+ select id, json_quote(j) as jq, v from jco_wp_savepoint order by id;
334
+ → [{"id":1,"jq":"\"9\"","v":10},{"id":2,"jq":"\"null\"","v":2}]
335
+
336
+ -- Relocate a JSON primary key (changing the key value moves the row's storage
337
+ -- position), then UPDATE the relocated row's sibling column.
338
+ create table jco_wp_reloc (j json primary key, v text);
339
+ insert into jco_wp_reloc values ('"9"', 'a');
340
+ update jco_wp_reloc set j = '"null"' where v = 'a';
341
+ -- run
342
+
343
+ select json_quote(j) as jq, v from jco_wp_reloc;
344
+ → [{"jq":"\"null\"","v":"a"}]
345
+
346
+ update jco_wp_reloc set v = 'b' where v = 'a';
347
+ -- run
348
+
349
+ select json_quote(j) as jq, v from jco_wp_reloc;
350
+ → [{"jq":"\"null\"","v":"b"}]
351
+
352
+ -- Repeated writes: non-repeatable conversion decays PROGRESSIVELY, so
353
+ -- checking only the last of several writes could miss a corruption introduced
354
+ -- (and then further corrupted) partway through. Check after each of three
355
+ -- successive UPDATEs of a sibling column, across all three shapes at once.
356
+ create table jco_wp_repeat (id integer primary key, j json, v integer);
357
+ insert into jco_wp_repeat values (1, '"9"', 1), (2, '"true"', 2), (3, '"[1,2]"', 3);
358
+
359
+ update jco_wp_repeat set v = v + 1;
360
+ -- run
361
+
362
+ select id, json_quote(j) as jq, v from jco_wp_repeat order by id;
363
+ → [{"id":1,"jq":"\"9\"","v":2},{"id":2,"jq":"\"true\"","v":3},{"id":3,"jq":"\"[1,2]\"","v":4}]
364
+
365
+ update jco_wp_repeat set v = v + 1;
366
+ -- run
367
+
368
+ select id, json_quote(j) as jq, v from jco_wp_repeat order by id;
369
+ → [{"id":1,"jq":"\"9\"","v":3},{"id":2,"jq":"\"true\"","v":4},{"id":3,"jq":"\"[1,2]\"","v":5}]
370
+
371
+ update jco_wp_repeat set v = v + 1;
372
+ -- run
373
+
374
+ select id, json_quote(j) as jq, v from jco_wp_repeat order by id;
375
+ → [{"id":1,"jq":"\"9\"","v":4},{"id":2,"jq":"\"true\"","v":5},{"id":3,"jq":"\"[1,2]\"","v":6}]
376
+
377
+ -- ALTER TABLE ... DROP COLUMN reshapes every row (one cell narrower), so the
378
+ -- surviving JSON cell moves position — a rebuild that must copy, not reconvert.
379
+ create table jco_wp_dropcol (id integer primary key, x integer, j json);
380
+ insert into jco_wp_dropcol values (1, 7, '"9"'), (2, 8, '"null"');
381
+ alter table jco_wp_dropcol drop column x;
382
+ -- run
383
+
384
+ select id, json_quote(j) as jq from jco_wp_dropcol order by id;
385
+ → [{"id":1,"jq":"\"9\""},{"id":2,"jq":"\"null\""}]
386
+
387
+ -- ALTER COLUMN ... SET NOT NULL backfills the sibling column's NULLs from its
388
+ -- DEFAULT, rewriting exactly the rows that held NULL.
389
+ create table jco_wp_setnn (id integer primary key, j json, v integer null default 7);
390
+ insert into jco_wp_setnn values (1, '"9"', null), (2, '"null"', 5);
391
+ alter table jco_wp_setnn alter column v set not null;
392
+ -- run
393
+
394
+ select id, json_quote(j) as jq, v from jco_wp_setnn order by id;
395
+ → [{"id":1,"jq":"\"9\"","v":7},{"id":2,"jq":"\"null\"","v":5}]
396
+
397
+ -- ALTER TABLE ... RENAME COLUMN of a sibling: schema-only in principle, but it
398
+ -- reissues the table's schema, which is where a re-coercing rebuild would hide.
399
+ create table jco_wp_rencol (id integer primary key, j json, v text);
400
+ insert into jco_wp_rencol values (1, '"9"', 'a'), (2, '"null"', 'b');
401
+ alter table jco_wp_rencol rename column v to w;
402
+ -- run
403
+
404
+ select id, json_quote(j) as jq, w from jco_wp_rencol order by id;
405
+ → [{"id":1,"jq":"\"9\"","w":"a"},{"id":2,"jq":"\"null\"","w":"b"}]
406
+
407
+ -- Whole-transaction ROLLBACK (not just to a savepoint): the discarded staged
408
+ -- rows must leave the committed JSON values exactly as they were.
409
+ create table jco_wp_rollback (id integer primary key, j json, v integer);
410
+ insert into jco_wp_rollback values (1, '"9"', 1), (2, '"[1,2]"', 2);
411
+ begin;
412
+ update jco_wp_rollback set v = 99;
413
+ rollback;
414
+ -- run
415
+
416
+ select id, json_quote(j) as jq, v from jco_wp_rollback order by id;
417
+ → [{"id":1,"jq":"\"9\"","v":1},{"id":2,"jq":"\"[1,2]\"","v":2}]
@@ -0,0 +1,39 @@
1
+ -- 06.9.1.1-json-coerce-once-index.sqllogic
2
+ --
3
+ -- requires-capability: standalone-index-ddl
4
+ --
5
+ -- Carved out of 06.9.1-json-coerce-once (ticket
6
+ -- json-native-form-write-path-coverage): CREATE INDEX needs standalone index
7
+ -- DDL, which not every backend implements, and the requires-capability
8
+ -- directive is whole-file — putting this case into the parent file would make
9
+ -- its much larger scenario set skippable too. Index DDL only; every other
10
+ -- write path stays in the parent file.
11
+ --
12
+ -- Subject: index DDL on a JSON column rebuilds every existing row's index
13
+ -- entry; the stored JSON text scalar must survive untouched (not re-parsed).
14
+
15
+ create table jco_ix (id integer primary key, j json);
16
+ insert into jco_ix values (1, '"9"'), (2, '"null"');
17
+ create index jco_ix_j on jco_ix (j);
18
+ -- run
19
+
20
+ select id, json_quote(j) as jq from jco_ix order by id;
21
+ → [{"id":1,"jq":"\"9\""},{"id":2,"jq":"\"null\""}]
22
+
23
+ -- CREATE UNIQUE INDEX additionally compares every existing row's key: a
24
+ -- re-parse here would make the JSON text scalars "9" and "9.0" collide as the
25
+ -- numbers 9 and 9.0, so a false UNIQUE violation is the failure shape.
26
+ create table jco_ix_u (id integer primary key, j json);
27
+ insert into jco_ix_u values (1, '"9"'), (2, '"9.0"');
28
+ create unique index jco_ix_u_j on jco_ix_u (j);
29
+ -- run
30
+
31
+ select id, json_quote(j) as jq from jco_ix_u order by id;
32
+ → [{"id":1,"jq":"\"9\""},{"id":2,"jq":"\"9.0\""}]
33
+
34
+ -- DROP INDEX rebuilds the table's schema; the stored values ride along.
35
+ drop index jco_ix_u_j;
36
+ -- run
37
+
38
+ select id, json_quote(j) as jq from jco_ix_u order by id;
39
+ → [{"id":1,"jq":"\"9\""},{"id":2,"jq":"\"9.0\""}]