@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.
- package/README.md +2 -0
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +17 -69
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/package.json +7 -4
- package/test/README.md +173 -0
- package/test/logic/01-basic.sqllogic +39 -0
- package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
- package/test/logic/01.2-strings.sqllogic +43 -0
- package/test/logic/01.5-insert-select.sqllogic +237 -0
- package/test/logic/01.6-update-extras.sqllogic +118 -0
- package/test/logic/01.7-update-from.sqllogic +67 -0
- package/test/logic/01.8-delete-extras.sqllogic +122 -0
- package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
- package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
- package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
- package/test/logic/01.9-query-expr-values.sqllogic +111 -0
- package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
- package/test/logic/02-filters.sqllogic +54 -0
- package/test/logic/02-smoke.sqllogic +62 -0
- package/test/logic/02.1-bind-parameters.sqllogic +223 -0
- package/test/logic/03-expressions.sqllogic +190 -0
- package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
- package/test/logic/03.4-defaults.sqllogic +554 -0
- package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
- package/test/logic/03.5-tvf.sqllogic +61 -0
- package/test/logic/03.6-type-system.sqllogic +544 -0
- package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
- package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
- package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
- package/test/logic/03.8-not-precedence.sqllogic +255 -0
- package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
- package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
- package/test/logic/04-order-by.sqllogic +38 -0
- package/test/logic/04-transactions.sqllogic +239 -0
- package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
- package/test/logic/05-vtab_memory.sqllogic +50 -0
- package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
- package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
- package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
- package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
- package/test/logic/06-builtin_functions.sqllogic +149 -0
- package/test/logic/06.1-string-functions.sqllogic +92 -0
- package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
- package/test/logic/06.2-math-functions.sqllogic +82 -0
- package/test/logic/06.3-schema.sqllogic +48 -0
- package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
- package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
- package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
- package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
- package/test/logic/06.3.4-view-info.sqllogic +378 -0
- package/test/logic/06.3.5-column-info.sqllogic +347 -0
- package/test/logic/06.3.6-schema-views.sqllogic +29 -0
- package/test/logic/06.4-schema-search-path.sqllogic +354 -0
- package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
- package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
- package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
- package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
- package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
- package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
- package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
- package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
- package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
- package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
- package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
- package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
- package/test/logic/06.7-json-extended.sqllogic +53 -0
- package/test/logic/06.8-json-path-operators.sqllogic +99 -0
- package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
- package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
- package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
- package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
- package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
- package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
- package/test/logic/07-aggregates.sqllogic +193 -0
- package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
- package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
- package/test/logic/07.3-group-by-extras.sqllogic +602 -0
- package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
- package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
- package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
- package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
- package/test/logic/07.5-window.sqllogic +1941 -0
- package/test/logic/07.5.1-window-named.sqllogic +13 -0
- package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
- package/test/logic/07.6-subqueries.sqllogic +78 -0
- package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
- package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
- package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
- package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
- package/test/logic/07.7.1-in-extras.sqllogic +158 -0
- package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
- package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
- package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
- package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
- package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
- package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
- package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
- package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
- package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
- package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
- package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
- package/test/logic/07.9-in-value-list.sqllogic +154 -0
- package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
- package/test/logic/08-views.sqllogic +64 -0
- package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
- package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
- package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
- package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
- package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
- package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
- package/test/logic/09-set_operations.sqllogic +244 -0
- package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
- package/test/logic/10-distinct_datatypes.sqllogic +127 -0
- package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
- package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
- package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
- package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
- package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
- package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
- package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
- package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
- package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
- package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
- package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
- package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
- package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
- package/test/logic/10.2-column-features.sqllogic +365 -0
- package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
- package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
- package/test/logic/10.3-function-features.sqllogic +247 -0
- package/test/logic/10.4-schema-scale.sqllogic +168 -0
- package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
- package/test/logic/10.5-indexes.sqllogic +164 -0
- package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
- package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
- package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
- package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
- package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
- package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
- package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
- package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
- package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
- package/test/logic/100.1-where-extras.sqllogic +163 -0
- package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
- package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
- package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
- package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
- package/test/logic/102-unique-constraints.sqllogic +145 -0
- package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
- package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
- package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
- package/test/logic/102.2-unique-collation.sqllogic +181 -0
- package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
- package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
- package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
- package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
- package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
- package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
- package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
- package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
- package/test/logic/108-cardinality-estimation.sqllogic +146 -0
- package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
- package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
- package/test/logic/11-joins.sqllogic +86 -0
- package/test/logic/11.1-join-using.sqllogic +267 -0
- package/test/logic/11.2-comma-join.sqllogic +35 -0
- package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
- package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
- package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
- package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
- package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
- package/test/logic/12-empty-primary-key.sqllogic +124 -0
- package/test/logic/12-join_padding_order.sqllogic +58 -0
- package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
- package/test/logic/13-cte.sqllogic +137 -0
- package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
- package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
- package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
- package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
- package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
- package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
- package/test/logic/13.4-cte-extras.sqllogic +98 -0
- package/test/logic/13.5-cte-join-order.sqllogic +166 -0
- package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
- package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
- package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
- package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
- package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
- package/test/logic/14-utilities.sqllogic +168 -0
- package/test/logic/15-timespan.sqllogic +279 -0
- package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
- package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
- package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
- package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
- package/test/logic/16-epoch.sqllogic +187 -0
- package/test/logic/17-weekday-modifier.sqllogic +78 -0
- package/test/logic/18-json-string-escapes.sqllogic +86 -0
- package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
- package/test/logic/20-empty-single-row.sqllogic +261 -0
- package/test/logic/21-null-edge-cases.sqllogic +227 -0
- package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
- package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
- package/test/logic/21.2-between-edges.sqllogic +157 -0
- package/test/logic/22-boundary-values.sqllogic +175 -0
- package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
- package/test/logic/24-builtin-branches.sqllogic +611 -0
- package/test/logic/24.1-substr-extras.sqllogic +75 -0
- package/test/logic/24.2-random-extras.sqllogic +39 -0
- package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
- package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
- package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
- package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
- package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
- package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
- package/test/logic/26-join-edge-cases.sqllogic +333 -0
- package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
- package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
- package/test/logic/26.3-join-on-constants.sqllogic +61 -0
- package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
- package/test/logic/27-window-edge-cases.sqllogic +206 -0
- package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
- package/test/logic/27.2-window-exclude.sqllogic +13 -0
- package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
- package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
- package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
- package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
- package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
- package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
- package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
- package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
- package/test/logic/40-constraints.sqllogic +418 -0
- package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
- package/test/logic/40.2-check-extras.sqllogic +683 -0
- package/test/logic/41-alter-table.sqllogic +191 -0
- package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
- package/test/logic/41-fk-cross-schema.sqllogic +155 -0
- package/test/logic/41-fk-extended-targets.sqllogic +173 -0
- package/test/logic/41-foreign-keys.sqllogic +1001 -0
- package/test/logic/41-generated-column-errors.sqllogic +225 -0
- package/test/logic/41-generated-column-extras.sqllogic +598 -0
- package/test/logic/41-generated-column-scope.sqllogic +329 -0
- package/test/logic/41-generated-columns.sqllogic +361 -0
- package/test/logic/41.1-alter-pk.sqllogic +230 -0
- package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
- package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
- package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
- package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
- package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
- package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
- package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
- package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
- package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
- package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
- package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
- package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
- package/test/logic/41.2-alter-column.sqllogic +382 -0
- package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
- package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
- package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
- package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
- package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
- package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
- package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
- package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
- package/test/logic/41.5-alter-misc.sqllogic +48 -0
- package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
- package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
- package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
- package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
- package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
- package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
- package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
- package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
- package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
- package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
- package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
- package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
- package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
- package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
- package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
- package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
- package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
- package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
- package/test/logic/42-committed-snapshot.sqllogic +254 -0
- package/test/logic/42-returning.sqllogic +159 -0
- package/test/logic/42.1-returning-extras.sqllogic +232 -0
- package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
- package/test/logic/43-default-nullability.sqllogic +131 -0
- package/test/logic/43-transition-constraints.sqllogic +341 -0
- package/test/logic/43.1-default-collation.sqllogic +140 -0
- package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
- package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
- package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
- package/test/logic/44-determinism-validation.sqllogic +164 -0
- package/test/logic/44-orthogonality.sqllogic +146 -0
- package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
- package/test/logic/45-udf-determinism.sqllogic +39 -0
- package/test/logic/46-mutation-context.sqllogic +595 -0
- package/test/logic/47-upsert.sqllogic +255 -0
- package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
- package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
- package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
- package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
- package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
- package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
- package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
- package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
- package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
- package/test/logic/49-reference-graph.sqllogic +84 -0
- package/test/logic/50-declarative-schema.sqllogic +2550 -0
- package/test/logic/50-metadata-tags.sqllogic +1033 -0
- package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
- package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
- package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
- package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +210 -0
- package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
- package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
- package/test/logic/51-lens-foundation.sqllogic +147 -0
- package/test/logic/51-materialized-views.sqllogic +376 -0
- package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
- package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
- package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
- package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
- package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
- package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
- package/test/logic/52-lens-overrides.sqllogic +566 -0
- package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
- package/test/logic/53-reserved-tags.sqllogic +252 -0
- package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
- package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
- package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
- package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
- package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
- package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
- package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
- package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
- package/test/logic/55-lens-prover.sqllogic +202 -0
- package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
- package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
- package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
- package/test/logic/81-quickpick.sqllogic +24 -0
- package/test/logic/82-bloom-join.sqllogic +185 -0
- package/test/logic/83-merge-join.sqllogic +280 -0
- package/test/logic/84-asof-scan.sqllogic +238 -0
- package/test/logic/84-key-cardinality.sqllogic +50 -0
- package/test/logic/85-relational-const-folding.sqllogic +51 -0
- package/test/logic/86-scalar-cse.sqllogic +42 -0
- package/test/logic/90-error_paths.sqllogic +114 -0
- package/test/logic/90.1-parse-errors.sqllogic +77 -0
- package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
- package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
- package/test/logic/90.3-expression-errors.sqllogic +43 -0
- package/test/logic/90.4-dml-errors.sqllogic +47 -0
- package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
- package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
- package/test/logic/90.6-select-error-paths.sqllogic +57 -0
- package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
- package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
- package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
- package/test/logic/93.1-view-error-paths.sqllogic +74 -0
- package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
- package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
- package/test/logic/93.4-view-mutation.sqllogic +4881 -0
- package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
- package/test/logic/93.5-authored-inverse.sqllogic +415 -0
- package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
- package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
- package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
- package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
- package/test/logic/95-assertions.sqllogic +1417 -0
- package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
- package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
- package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
- package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
- package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
- package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
- package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
- package/test/logic/drop-unique-index.sqllogic +88 -0
- 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\""}]
|