@quereus/quereus 4.20.1 → 4.20.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- 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 +173 -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,48 @@
|
|
|
1
|
+
-- adapted from SQLite test/alter.test
|
|
2
|
+
-- ALTER TABLE: UTF-8 identifier handling and transaction interaction.
|
|
3
|
+
|
|
4
|
+
-- ===================================
|
|
5
|
+
-- 1. RENAME / ADD COLUMN with non-ASCII identifiers
|
|
6
|
+
-- ===================================
|
|
7
|
+
|
|
8
|
+
create table t_utf (id integer primary key, "naïve" text null);
|
|
9
|
+
insert into t_utf values (1, 'x');
|
|
10
|
+
|
|
11
|
+
alter table t_utf rename column "naïve" to "café";
|
|
12
|
+
|
|
13
|
+
select "café" from t_utf where id = 1;
|
|
14
|
+
→ [{"café":"x"}]
|
|
15
|
+
|
|
16
|
+
alter table t_utf rename to "tüble";
|
|
17
|
+
|
|
18
|
+
select count(*) as cnt from "tüble";
|
|
19
|
+
→ [{"cnt":1}]
|
|
20
|
+
|
|
21
|
+
drop table "tüble";
|
|
22
|
+
|
|
23
|
+
-- ===================================
|
|
24
|
+
-- 2. ALTER inside an explicit transaction
|
|
25
|
+
-- ===================================
|
|
26
|
+
-- Quereus DDL changes are applied immediately and are NOT rolled back by
|
|
27
|
+
-- transaction rollback (see 10.1-ddl-lifecycle).
|
|
28
|
+
|
|
29
|
+
create table t_tx (id integer primary key, a integer null);
|
|
30
|
+
insert into t_tx values (1, 10);
|
|
31
|
+
|
|
32
|
+
begin;
|
|
33
|
+
alter table t_tx add column b integer default 0;
|
|
34
|
+
insert into t_tx (id, a, b) values (2, 20, 200);
|
|
35
|
+
commit;
|
|
36
|
+
|
|
37
|
+
select * from t_tx order by id;
|
|
38
|
+
→ [{"id":1,"a":10,"b":0},{"id":2,"a":20,"b":200}]
|
|
39
|
+
|
|
40
|
+
-- rollback path: schema change persists per documented Quereus DDL semantics
|
|
41
|
+
begin;
|
|
42
|
+
alter table t_tx rename column a to alpha;
|
|
43
|
+
rollback;
|
|
44
|
+
|
|
45
|
+
select alpha from t_tx where id = 1;
|
|
46
|
+
→ [{"alpha":10}]
|
|
47
|
+
|
|
48
|
+
drop table t_tx;
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
-- 41.5-cross-schema-foreign-keys.sqllogic — a FOREIGN KEY whose parent table
|
|
2
|
+
-- lives in a different schema than the child, end to end: child-side EXISTS,
|
|
3
|
+
-- parent-side RESTRICT / CASCADE / SET NULL / SET DEFAULT, a maintained-table
|
|
4
|
+
-- parent, and FK introspection of the parent schema. Same-schema FK behaviour is
|
|
5
|
+
-- unchanged and stays covered by 41-foreign-keys.sqllogic.
|
|
6
|
+
|
|
7
|
+
pragma foreign_keys = true;
|
|
8
|
+
|
|
9
|
+
-- Register an auxiliary physical schema `s2`. Child / parent tables are created
|
|
10
|
+
-- imperatively below so each scenario reads like an ordinary CREATE TABLE.
|
|
11
|
+
declare schema s2 {}
|
|
12
|
+
apply schema s2;
|
|
13
|
+
-- run
|
|
14
|
+
|
|
15
|
+
-- ===================================================================
|
|
16
|
+
-- Child in s2 → parent in main: child-side INSERT validation
|
|
17
|
+
-- The synthesized EXISTS resolves the parent via its own (main) schema even
|
|
18
|
+
-- though the constraint is built under the child's (s2) schema.
|
|
19
|
+
-- ===================================================================
|
|
20
|
+
|
|
21
|
+
create table m (id integer primary key, label text);
|
|
22
|
+
insert into m values (1, 'one'), (2, 'two');
|
|
23
|
+
|
|
24
|
+
create table s2.child (
|
|
25
|
+
id integer primary key,
|
|
26
|
+
m_id integer null,
|
|
27
|
+
foreign key (m_id) references main.m(id) on delete restrict
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
-- parent row exists → ok
|
|
31
|
+
insert into s2.child values (1, 1);
|
|
32
|
+
select * from s2.child;
|
|
33
|
+
→ [{"id":1,"m_id":1}]
|
|
34
|
+
|
|
35
|
+
-- NULL FK column passes MATCH SIMPLE even across schemas
|
|
36
|
+
insert into s2.child values (2, null);
|
|
37
|
+
select id, m_id from s2.child order by id;
|
|
38
|
+
→ [{"id":1,"m_id":1},{"id":2,"m_id":null}]
|
|
39
|
+
|
|
40
|
+
-- orphan (no parent row 99 in main.m) → child-side EXISTS fails
|
|
41
|
+
insert into s2.child values (3, 99);
|
|
42
|
+
-- error: constraint failed
|
|
43
|
+
|
|
44
|
+
select count(*) as n from s2.child;
|
|
45
|
+
→ [{"n":2}]
|
|
46
|
+
|
|
47
|
+
-- ===================================================================
|
|
48
|
+
-- Parent-side RESTRICT: deleting / updating a referenced main.m row is blocked
|
|
49
|
+
-- by the cross-schema child in s2 (NOT EXISTS resolves the child via its schema).
|
|
50
|
+
-- ===================================================================
|
|
51
|
+
|
|
52
|
+
-- delete a referenced parent row → blocked
|
|
53
|
+
delete from m where id = 1;
|
|
54
|
+
-- error: constraint failed
|
|
55
|
+
|
|
56
|
+
select count(*) as n from m;
|
|
57
|
+
→ [{"n":2}]
|
|
58
|
+
|
|
59
|
+
-- delete an unreferenced parent row → ok
|
|
60
|
+
delete from m where id = 2;
|
|
61
|
+
select id from m order by id;
|
|
62
|
+
→ [{"id":1}]
|
|
63
|
+
|
|
64
|
+
drop table s2.child;
|
|
65
|
+
drop table m;
|
|
66
|
+
|
|
67
|
+
-- ===================================================================
|
|
68
|
+
-- ON DELETE CASCADE across schemas: deleting the main parent removes the s2 child
|
|
69
|
+
-- ===================================================================
|
|
70
|
+
|
|
71
|
+
create table mp (id integer primary key, v text);
|
|
72
|
+
create table s2.cc (
|
|
73
|
+
cid integer primary key,
|
|
74
|
+
p_id integer,
|
|
75
|
+
foreign key (p_id) references main.mp(id) on delete cascade
|
|
76
|
+
);
|
|
77
|
+
insert into mp values (1, 'a'), (2, 'b');
|
|
78
|
+
insert into s2.cc values (10, 1), (11, 1), (20, 2);
|
|
79
|
+
|
|
80
|
+
select count(*) as n from s2.cc;
|
|
81
|
+
→ [{"n":3}]
|
|
82
|
+
|
|
83
|
+
delete from mp where id = 1;
|
|
84
|
+
|
|
85
|
+
select count(*) as n from mp where id = 1;
|
|
86
|
+
→ [{"n":0}]
|
|
87
|
+
|
|
88
|
+
-- child rows referencing the deleted parent are gone
|
|
89
|
+
select cid from s2.cc order by cid;
|
|
90
|
+
→ [{"cid":20}]
|
|
91
|
+
|
|
92
|
+
drop table s2.cc;
|
|
93
|
+
drop table mp;
|
|
94
|
+
|
|
95
|
+
-- ===================================================================
|
|
96
|
+
-- ON DELETE SET NULL across schemas
|
|
97
|
+
-- ===================================================================
|
|
98
|
+
|
|
99
|
+
create table msn (id integer primary key, v text);
|
|
100
|
+
create table s2.csn (
|
|
101
|
+
cid integer primary key,
|
|
102
|
+
p_id integer null,
|
|
103
|
+
foreign key (p_id) references main.msn(id) on delete set null
|
|
104
|
+
);
|
|
105
|
+
insert into msn values (1, 'x'), (2, 'y');
|
|
106
|
+
insert into s2.csn values (1, 1), (2, 1), (3, 2);
|
|
107
|
+
|
|
108
|
+
delete from msn where id = 1;
|
|
109
|
+
|
|
110
|
+
select cid, p_id from s2.csn order by cid;
|
|
111
|
+
→ [{"cid":1,"p_id":null},{"cid":2,"p_id":null},{"cid":3,"p_id":2}]
|
|
112
|
+
|
|
113
|
+
drop table s2.csn;
|
|
114
|
+
drop table msn;
|
|
115
|
+
|
|
116
|
+
-- ===================================================================
|
|
117
|
+
-- ON DELETE SET DEFAULT across schemas
|
|
118
|
+
-- ===================================================================
|
|
119
|
+
|
|
120
|
+
create table msd (id integer primary key, v text);
|
|
121
|
+
create table s2.csd (
|
|
122
|
+
cid integer primary key,
|
|
123
|
+
p_id integer default 0,
|
|
124
|
+
foreign key (p_id) references main.msd(id) on delete set default
|
|
125
|
+
);
|
|
126
|
+
insert into msd values (0, 'default'), (1, 'one'), (2, 'two');
|
|
127
|
+
insert into s2.csd values (1, 1), (2, 1), (3, 2);
|
|
128
|
+
|
|
129
|
+
delete from msd where id = 1;
|
|
130
|
+
|
|
131
|
+
select cid, p_id from s2.csd order by cid;
|
|
132
|
+
→ [{"cid":1,"p_id":0},{"cid":2,"p_id":0},{"cid":3,"p_id":2}]
|
|
133
|
+
|
|
134
|
+
drop table s2.csd;
|
|
135
|
+
drop table msd;
|
|
136
|
+
|
|
137
|
+
-- ===================================================================
|
|
138
|
+
-- Maintained-table parent in main, child in s2: a maintenance delete of the
|
|
139
|
+
-- parent row must fire the cross-schema child's RESTRICT through the reverse-FK
|
|
140
|
+
-- index (keyed under the parent's schema, main).
|
|
141
|
+
-- ===================================================================
|
|
142
|
+
|
|
143
|
+
create table src (id integer primary key, v text);
|
|
144
|
+
create table mm (id integer primary key, v text) maintained as select id, v from src;
|
|
145
|
+
create table s2.cmm (
|
|
146
|
+
cid integer primary key,
|
|
147
|
+
m_id integer,
|
|
148
|
+
foreign key (m_id) references main.mm(id) on delete restrict
|
|
149
|
+
);
|
|
150
|
+
insert into src values (1, 'a'), (2, 'b');
|
|
151
|
+
insert into s2.cmm values (10, 1);
|
|
152
|
+
|
|
153
|
+
-- maintenance delete of mm(1) blocked by the cross-schema RESTRICT child
|
|
154
|
+
delete from src where id = 1;
|
|
155
|
+
-- error: violates RESTRICT
|
|
156
|
+
|
|
157
|
+
-- atomic rollback: source + maintained parent + child all intact
|
|
158
|
+
select id from mm order by id;
|
|
159
|
+
→ [{"id":1},{"id":2}]
|
|
160
|
+
select count(*) as n from s2.cmm;
|
|
161
|
+
→ [{"n":1}]
|
|
162
|
+
|
|
163
|
+
-- deleting the unreferenced parent row maintains cleanly
|
|
164
|
+
delete from src where id = 2;
|
|
165
|
+
select id from mm order by id;
|
|
166
|
+
→ [{"id":1}]
|
|
167
|
+
|
|
168
|
+
drop table s2.cmm;
|
|
169
|
+
drop table mm;
|
|
170
|
+
drop table src;
|
|
171
|
+
|
|
172
|
+
-- ===================================================================
|
|
173
|
+
-- Self-referencing FK declared with an explicit own-schema qualifier
|
|
174
|
+
-- (`references s2.tree` from s2.tree): resolves against the child's own schema,
|
|
175
|
+
-- validates at CREATE (table not yet registered), and enforces + cascades.
|
|
176
|
+
-- ===================================================================
|
|
177
|
+
|
|
178
|
+
create table s2.tree (
|
|
179
|
+
id integer primary key,
|
|
180
|
+
parent_id integer null,
|
|
181
|
+
foreign key (parent_id) references s2.tree(id) on delete cascade
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
-- root with NULL parent into an empty table → ok (MATCH SIMPLE)
|
|
185
|
+
insert into s2.tree values (1, null);
|
|
186
|
+
insert into s2.tree values (2, 1), (3, 1);
|
|
187
|
+
select id, parent_id from s2.tree order by id;
|
|
188
|
+
→ [{"id":1,"parent_id":null},{"id":2,"parent_id":1},{"id":3,"parent_id":1}]
|
|
189
|
+
|
|
190
|
+
-- orphan child → fails
|
|
191
|
+
insert into s2.tree values (4, 99);
|
|
192
|
+
-- error: constraint failed
|
|
193
|
+
|
|
194
|
+
-- cascade delete of the root removes its children
|
|
195
|
+
delete from s2.tree where id = 1;
|
|
196
|
+
select count(*) as n from s2.tree;
|
|
197
|
+
→ [{"n":0}]
|
|
198
|
+
|
|
199
|
+
drop table s2.tree;
|
|
200
|
+
|
|
201
|
+
-- ===================================================================
|
|
202
|
+
-- FK introspection across schemas (the reverse direction: child in main,
|
|
203
|
+
-- parent in s2). foreign_key_info surfaces the true parent schema. This also
|
|
204
|
+
-- exercises the child-side EXISTS against an s2 parent from a main child.
|
|
205
|
+
-- ===================================================================
|
|
206
|
+
|
|
207
|
+
create table s2.par (id integer primary key, label text);
|
|
208
|
+
create table mchild (
|
|
209
|
+
id integer primary key,
|
|
210
|
+
p_id integer,
|
|
211
|
+
foreign key (p_id) references s2.par(id) on delete restrict
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
select referenced_table, referenced_schema from foreign_key_info('mchild');
|
|
215
|
+
→ [{"referenced_table":"par","referenced_schema":"s2"}]
|
|
216
|
+
|
|
217
|
+
-- enforcement still holds with the parent in s2
|
|
218
|
+
insert into s2.par values (1, 'p1');
|
|
219
|
+
insert into mchild values (1, 1);
|
|
220
|
+
select * from mchild;
|
|
221
|
+
→ [{"id":1,"p_id":1}]
|
|
222
|
+
|
|
223
|
+
insert into mchild values (2, 99);
|
|
224
|
+
-- error: constraint failed
|
|
225
|
+
|
|
226
|
+
drop table mchild;
|
|
227
|
+
|
|
228
|
+
-- Implicit (no parent column list) cross-schema FK resolves against the
|
|
229
|
+
-- s2 parent's primary key, not just its own schema.
|
|
230
|
+
create table mchild2 (
|
|
231
|
+
id integer primary key,
|
|
232
|
+
p_id integer references s2.par
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
select referenced_table, referenced_schema, "to" from foreign_key_info('mchild2');
|
|
236
|
+
→ [{"referenced_table":"par","referenced_schema":"s2","to":"id"}]
|
|
237
|
+
|
|
238
|
+
drop table mchild2;
|
|
239
|
+
drop table s2.par;
|
|
240
|
+
|
|
241
|
+
-- Regression: an ordinary same-schema FK reports its own schema (not null),
|
|
242
|
+
-- unchanged from before this feature.
|
|
243
|
+
create table sm_parent (id integer primary key);
|
|
244
|
+
create table sm_child (
|
|
245
|
+
id integer primary key,
|
|
246
|
+
p_id integer,
|
|
247
|
+
foreign key (p_id) references sm_parent(id)
|
|
248
|
+
);
|
|
249
|
+
select referenced_table, referenced_schema from foreign_key_info('sm_child');
|
|
250
|
+
→ [{"referenced_table":"sm_parent","referenced_schema":"main"}]
|
|
251
|
+
|
|
252
|
+
drop table sm_child;
|
|
253
|
+
drop table sm_parent;
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
-- 41.6-alter-drop-rename-constraint.sqllogic
|
|
2
|
+
-- ALTER TABLE DROP CONSTRAINT / RENAME CONSTRAINT for named CHECK / UNIQUE /
|
|
3
|
+
-- FOREIGN KEY constraints. Behavioral assertions only (enforcement on/off after
|
|
4
|
+
-- the change + introspection via *_constraint_info TVFs), so this passes under
|
|
5
|
+
-- both `yarn test` (memory) and `yarn test:store`. Memory-specific covering-index
|
|
6
|
+
-- teardown is verified in alter-drop-rename-constraint.spec.ts.
|
|
7
|
+
|
|
8
|
+
pragma foreign_keys = true;
|
|
9
|
+
-- run
|
|
10
|
+
|
|
11
|
+
-- ============================================================
|
|
12
|
+
-- 1. DROP CONSTRAINT — named CHECK
|
|
13
|
+
-- ============================================================
|
|
14
|
+
create table c_chk (id integer primary key, qty integer, constraint chk_qty check (qty > 0));
|
|
15
|
+
insert into c_chk values (1, 5);
|
|
16
|
+
-- run
|
|
17
|
+
|
|
18
|
+
-- enforcement active: non-positive qty rejected
|
|
19
|
+
insert into c_chk values (2, -1);
|
|
20
|
+
-- error: check
|
|
21
|
+
|
|
22
|
+
-- introspection lists the named CHECK
|
|
23
|
+
select name from check_constraint_info('c_chk') where name = 'chk_qty';
|
|
24
|
+
→ [{"name":"chk_qty"}]
|
|
25
|
+
|
|
26
|
+
alter table c_chk drop constraint chk_qty;
|
|
27
|
+
-- run
|
|
28
|
+
|
|
29
|
+
-- no longer listed
|
|
30
|
+
select count(*) as c from check_constraint_info('c_chk') where name = 'chk_qty';
|
|
31
|
+
→ [{"c":0}]
|
|
32
|
+
|
|
33
|
+
-- enforcement gone: non-positive qty now accepted
|
|
34
|
+
insert into c_chk values (2, -1);
|
|
35
|
+
select qty from c_chk where id = 2;
|
|
36
|
+
→ [{"qty":-1}]
|
|
37
|
+
|
|
38
|
+
drop table c_chk;
|
|
39
|
+
-- run
|
|
40
|
+
|
|
41
|
+
-- ============================================================
|
|
42
|
+
-- 2. DROP CONSTRAINT — named UNIQUE (covering structure released)
|
|
43
|
+
-- ============================================================
|
|
44
|
+
create table u_drop (id integer primary key, email text, constraint uq_email unique (email));
|
|
45
|
+
insert into u_drop values (1, 'a@x'), (2, 'b@x');
|
|
46
|
+
-- run
|
|
47
|
+
|
|
48
|
+
-- enforcement active: duplicate rejected
|
|
49
|
+
insert into u_drop values (3, 'a@x');
|
|
50
|
+
-- error: unique
|
|
51
|
+
|
|
52
|
+
alter table u_drop drop constraint uq_email;
|
|
53
|
+
-- run
|
|
54
|
+
|
|
55
|
+
-- constraint gone
|
|
56
|
+
select count(*) as c from unique_constraint_info('u_drop') where name = 'uq_email';
|
|
57
|
+
→ [{"c":0}]
|
|
58
|
+
|
|
59
|
+
-- duplicate now accepted
|
|
60
|
+
insert into u_drop values (3, 'a@x');
|
|
61
|
+
select count(*) as c from u_drop;
|
|
62
|
+
→ [{"c":3}]
|
|
63
|
+
|
|
64
|
+
drop table u_drop;
|
|
65
|
+
-- run
|
|
66
|
+
|
|
67
|
+
-- ============================================================
|
|
68
|
+
-- 3. DROP CONSTRAINT — named FOREIGN KEY (enforcement disabled)
|
|
69
|
+
-- ============================================================
|
|
70
|
+
create table fk_parent (pid integer primary key);
|
|
71
|
+
insert into fk_parent values (1), (2);
|
|
72
|
+
create table fk_child (id integer primary key, pid integer, constraint fk_p foreign key (pid) references fk_parent(pid));
|
|
73
|
+
insert into fk_child values (1, 1);
|
|
74
|
+
-- run
|
|
75
|
+
|
|
76
|
+
-- enforcement active: orphan child rejected
|
|
77
|
+
insert into fk_child values (2, 99);
|
|
78
|
+
-- error:
|
|
79
|
+
|
|
80
|
+
select name from foreign_key_info('fk_child') where name = 'fk_p';
|
|
81
|
+
→ [{"name":"fk_p"}]
|
|
82
|
+
|
|
83
|
+
alter table fk_child drop constraint fk_p;
|
|
84
|
+
-- run
|
|
85
|
+
|
|
86
|
+
select count(*) as c from foreign_key_info('fk_child') where name = 'fk_p';
|
|
87
|
+
→ [{"c":0}]
|
|
88
|
+
|
|
89
|
+
-- enforcement gone: orphan child now accepted
|
|
90
|
+
insert into fk_child values (2, 99);
|
|
91
|
+
select pid from fk_child where id = 2;
|
|
92
|
+
→ [{"pid":99}]
|
|
93
|
+
|
|
94
|
+
drop table fk_child;
|
|
95
|
+
drop table fk_parent;
|
|
96
|
+
-- run
|
|
97
|
+
|
|
98
|
+
-- ============================================================
|
|
99
|
+
-- 4. RENAME CONSTRAINT — named CHECK
|
|
100
|
+
-- ============================================================
|
|
101
|
+
create table r_chk (id integer primary key, n integer, constraint chk_n check (n >= 0));
|
|
102
|
+
insert into r_chk values (1, 5);
|
|
103
|
+
-- run
|
|
104
|
+
|
|
105
|
+
alter table r_chk rename constraint chk_n to chk_nonneg;
|
|
106
|
+
-- run
|
|
107
|
+
|
|
108
|
+
-- old name gone, new name present
|
|
109
|
+
select count(*) as c from check_constraint_info('r_chk') where name = 'chk_n';
|
|
110
|
+
→ [{"c":0}]
|
|
111
|
+
|
|
112
|
+
select name from check_constraint_info('r_chk') where name = 'chk_nonneg';
|
|
113
|
+
→ [{"name":"chk_nonneg"}]
|
|
114
|
+
|
|
115
|
+
-- still enforces under the new name
|
|
116
|
+
insert into r_chk values (2, -1);
|
|
117
|
+
-- error: check
|
|
118
|
+
|
|
119
|
+
drop table r_chk;
|
|
120
|
+
-- run
|
|
121
|
+
|
|
122
|
+
-- ============================================================
|
|
123
|
+
-- 5. RENAME CONSTRAINT — named UNIQUE
|
|
124
|
+
-- ============================================================
|
|
125
|
+
create table r_unq (id integer primary key, email text, constraint uq_e unique (email));
|
|
126
|
+
insert into r_unq values (1, 'a');
|
|
127
|
+
-- run
|
|
128
|
+
|
|
129
|
+
alter table r_unq rename constraint uq_e to uq_email;
|
|
130
|
+
-- run
|
|
131
|
+
|
|
132
|
+
select name from unique_constraint_info('r_unq') where name = 'uq_email';
|
|
133
|
+
→ [{"name":"uq_email"}]
|
|
134
|
+
|
|
135
|
+
select count(*) as c from unique_constraint_info('r_unq') where name = 'uq_e';
|
|
136
|
+
→ [{"c":0}]
|
|
137
|
+
|
|
138
|
+
-- still enforces under the new name
|
|
139
|
+
insert into r_unq values (2, 'a');
|
|
140
|
+
-- error: unique
|
|
141
|
+
|
|
142
|
+
drop table r_unq;
|
|
143
|
+
-- run
|
|
144
|
+
|
|
145
|
+
-- ============================================================
|
|
146
|
+
-- 6. RENAME CONSTRAINT — named FOREIGN KEY
|
|
147
|
+
-- ============================================================
|
|
148
|
+
create table rfk_parent (pid integer primary key);
|
|
149
|
+
insert into rfk_parent values (1);
|
|
150
|
+
create table rfk_child (id integer primary key, pid integer, constraint fk_p foreign key (pid) references rfk_parent(pid));
|
|
151
|
+
-- run
|
|
152
|
+
|
|
153
|
+
alter table rfk_child rename constraint fk_p to fk_parent_ref;
|
|
154
|
+
-- run
|
|
155
|
+
|
|
156
|
+
select name from foreign_key_info('rfk_child') where name = 'fk_parent_ref';
|
|
157
|
+
→ [{"name":"fk_parent_ref"}]
|
|
158
|
+
|
|
159
|
+
-- still enforces under the new name
|
|
160
|
+
insert into rfk_child values (1, 99);
|
|
161
|
+
-- error:
|
|
162
|
+
|
|
163
|
+
drop table rfk_child;
|
|
164
|
+
drop table rfk_parent;
|
|
165
|
+
-- run
|
|
166
|
+
|
|
167
|
+
-- ============================================================
|
|
168
|
+
-- 7. Error cases
|
|
169
|
+
-- ============================================================
|
|
170
|
+
|
|
171
|
+
-- NOTFOUND
|
|
172
|
+
create table e_nf (id integer primary key, a integer, constraint c1 check (a > 0));
|
|
173
|
+
-- run
|
|
174
|
+
|
|
175
|
+
alter table e_nf drop constraint nope;
|
|
176
|
+
-- error: not found
|
|
177
|
+
|
|
178
|
+
alter table e_nf rename constraint nope to other;
|
|
179
|
+
-- error: not found
|
|
180
|
+
|
|
181
|
+
drop table e_nf;
|
|
182
|
+
-- run
|
|
183
|
+
|
|
184
|
+
-- Ambiguous: same name in two constraint classes. Formerly constructible right
|
|
185
|
+
-- here — which was exactly the defect: `drop constraint dup` reported the pair
|
|
186
|
+
-- ambiguous FOREVER, so neither could ever be removed. The state is now refused
|
|
187
|
+
-- at CREATE TABLE (see 10.1.4-create-table-duplicate-constraint-names), so the
|
|
188
|
+
-- resolver's ambiguity arm survives only as a defensive guard for catalogs
|
|
189
|
+
-- persisted before the guard existed.
|
|
190
|
+
create table e_amb (id integer primary key, a integer, constraint dup check (a > 0), constraint dup unique (a));
|
|
191
|
+
-- error: duplicate constraint name 'dup'
|
|
192
|
+
|
|
193
|
+
-- Collision: rename target already names a constraint
|
|
194
|
+
create table e_coll (id integer primary key, a integer, b integer, constraint u1 unique (a), constraint u2 unique (b));
|
|
195
|
+
-- run
|
|
196
|
+
|
|
197
|
+
alter table e_coll rename constraint u1 to u2;
|
|
198
|
+
-- error: already exists
|
|
199
|
+
|
|
200
|
+
drop table e_coll;
|
|
201
|
+
-- run
|
|
202
|
+
|
|
203
|
+
-- The negative control for a UNIQUE derived from CREATE UNIQUE INDEX (DROP CONSTRAINT
|
|
204
|
+
-- cannot target it) lives in 41.6.1-alter-drop-constraint-index-derived.
|
|
205
|
+
|
|
206
|
+
-- ------------------------------------------------------------
|
|
207
|
+
-- 7b. ADD CONSTRAINT refuses a name another constraint already uses.
|
|
208
|
+
-- Same rule RENAME CONSTRAINT enforces, applied to the addition side. The refusal
|
|
209
|
+
-- happens before the statement reaches the storage module, so memory and store agree
|
|
210
|
+
-- and nothing is persisted — which is why these live here rather than in a spec.
|
|
211
|
+
-- ------------------------------------------------------------
|
|
212
|
+
|
|
213
|
+
-- CHECK onto CHECK
|
|
214
|
+
create table a_chk (id integer primary key, a integer, b integer, constraint ck check (a > 0));
|
|
215
|
+
-- run
|
|
216
|
+
|
|
217
|
+
alter table a_chk add constraint ck check (b > 0);
|
|
218
|
+
-- error: already exists
|
|
219
|
+
|
|
220
|
+
-- refused ⇒ table untouched: still exactly one CHECK named ck
|
|
221
|
+
select count(*) as c from check_constraint_info('a_chk') where name = 'ck';
|
|
222
|
+
→ [{"c":1}]
|
|
223
|
+
|
|
224
|
+
-- a different name is still accepted
|
|
225
|
+
alter table a_chk add constraint ck2 check (b > 0);
|
|
226
|
+
-- run
|
|
227
|
+
|
|
228
|
+
select count(*) as c from check_constraint_info('a_chk') where name = 'ck2';
|
|
229
|
+
→ [{"c":1}]
|
|
230
|
+
|
|
231
|
+
-- case-insensitive, like every other constraint-name comparison
|
|
232
|
+
alter table a_chk add constraint CK check (b > 1);
|
|
233
|
+
-- error: already exists
|
|
234
|
+
|
|
235
|
+
drop table a_chk;
|
|
236
|
+
-- run
|
|
237
|
+
|
|
238
|
+
-- UNIQUE onto UNIQUE
|
|
239
|
+
create table a_unq (id integer primary key, a integer, b integer, constraint uq unique (a));
|
|
240
|
+
-- run
|
|
241
|
+
|
|
242
|
+
alter table a_unq add constraint uq unique (b);
|
|
243
|
+
-- error: already exists
|
|
244
|
+
|
|
245
|
+
select count(*) as c from unique_constraint_info('a_unq') where name = 'uq';
|
|
246
|
+
→ [{"c":1}]
|
|
247
|
+
|
|
248
|
+
-- negative control: an UNNAMED add has no user-supplied name to collide, so it succeeds
|
|
249
|
+
alter table a_unq add unique (b);
|
|
250
|
+
-- run
|
|
251
|
+
|
|
252
|
+
insert into a_unq values (1, 1, 1);
|
|
253
|
+
insert into a_unq values (2, 2, 1);
|
|
254
|
+
-- error: unique
|
|
255
|
+
|
|
256
|
+
drop table a_unq;
|
|
257
|
+
-- run
|
|
258
|
+
|
|
259
|
+
-- FOREIGN KEY onto FOREIGN KEY
|
|
260
|
+
create table a_fk_parent (pid integer primary key);
|
|
261
|
+
create table a_fk_child (id integer primary key, x integer, y integer, constraint fk foreign key (x) references a_fk_parent(pid));
|
|
262
|
+
-- run
|
|
263
|
+
|
|
264
|
+
alter table a_fk_child add constraint fk foreign key (y) references a_fk_parent(pid);
|
|
265
|
+
-- error: already exists
|
|
266
|
+
|
|
267
|
+
select count(*) as c from foreign_key_info('a_fk_child') where name = 'fk';
|
|
268
|
+
→ [{"c":1}]
|
|
269
|
+
|
|
270
|
+
drop table a_fk_child;
|
|
271
|
+
drop table a_fk_parent;
|
|
272
|
+
-- run
|
|
273
|
+
|
|
274
|
+
-- Cross-class: a CHECK's name blocks a UNIQUE of the same name (and vice versa).
|
|
275
|
+
-- Without this, the table ends up with a name no DROP/RENAME can ever address —
|
|
276
|
+
-- both fail permanently with the ambiguity error from § 7 above.
|
|
277
|
+
create table a_cross (id integer primary key, a integer, b integer, constraint dup check (a > 0));
|
|
278
|
+
-- run
|
|
279
|
+
|
|
280
|
+
alter table a_cross add constraint dup unique (b);
|
|
281
|
+
-- error: already exists
|
|
282
|
+
|
|
283
|
+
select count(*) as c from unique_constraint_info('a_cross') where name = 'dup';
|
|
284
|
+
→ [{"c":0}]
|
|
285
|
+
|
|
286
|
+
-- the name still resolves to exactly one constraint, so DROP works
|
|
287
|
+
alter table a_cross drop constraint dup;
|
|
288
|
+
-- run
|
|
289
|
+
|
|
290
|
+
select count(*) as c from check_constraint_info('a_cross') where name = 'dup';
|
|
291
|
+
→ [{"c":0}]
|
|
292
|
+
|
|
293
|
+
drop table a_cross;
|
|
294
|
+
-- run
|
|
295
|
+
|
|
296
|
+
-- ADD COLUMN carrying an inline NAMED constraint is refused the same way
|
|
297
|
+
create table a_col (id integer primary key, a integer, constraint ck check (a > 0));
|
|
298
|
+
-- run
|
|
299
|
+
|
|
300
|
+
alter table a_col add column b integer null constraint ck check (b > 0);
|
|
301
|
+
-- error: already exists
|
|
302
|
+
|
|
303
|
+
-- refused ⇒ no column added and no constraint installed
|
|
304
|
+
select count(*) as c from table_info('a_col') where name = 'b';
|
|
305
|
+
→ [{"c":0}]
|
|
306
|
+
|
|
307
|
+
select count(*) as c from check_constraint_info('a_col') where name = 'ck';
|
|
308
|
+
→ [{"c":1}]
|
|
309
|
+
|
|
310
|
+
-- two inline constraints colliding with EACH OTHER on one ADD COLUMN (neither exists
|
|
311
|
+
-- on the table yet, so only the within-statement accumulation catches it)
|
|
312
|
+
alter table a_col add column c integer null constraint x check (c > 0) constraint x unique;
|
|
313
|
+
-- error: already exists
|
|
314
|
+
|
|
315
|
+
select count(*) as c from table_info('a_col') where name = 'c';
|
|
316
|
+
→ [{"c":0}]
|
|
317
|
+
|
|
318
|
+
-- a non-colliding inline name still works
|
|
319
|
+
alter table a_col add column d integer null constraint ck_d check (d > 0);
|
|
320
|
+
-- run
|
|
321
|
+
|
|
322
|
+
select count(*) as c from check_constraint_info('a_col') where name = 'ck_d';
|
|
323
|
+
→ [{"c":1}]
|
|
324
|
+
|
|
325
|
+
drop table a_col;
|
|
326
|
+
-- run
|
|
327
|
+
|
|
328
|
+
-- ============================================================
|
|
329
|
+
-- 8. DROP CONSTRAINT (CHECK) invalidates optimizer folding
|
|
330
|
+
-- ============================================================
|
|
331
|
+
-- A declared `check (x = 1)` lifts an FD/constant-binding onto the table that
|
|
332
|
+
-- the filter-contradiction rule uses to fold `where x = 2` to EmptyRelation.
|
|
333
|
+
-- Dropping the CHECK fires `table_modified`, which must invalidate that folding
|
|
334
|
+
-- so a row that violates the dropped predicate is actually returned (regression
|
|
335
|
+
-- guard for the cache-invalidation path on the constraint-drop case).
|
|
336
|
+
create table fold_chk (id integer primary key, x integer, constraint chk check (x = 1));
|
|
337
|
+
insert into fold_chk values (1, 1);
|
|
338
|
+
-- run
|
|
339
|
+
|
|
340
|
+
-- With the CHECK active, `where x = 2` is unsatisfiable (no such row can exist).
|
|
341
|
+
select count(*) as c from fold_chk where x = 2;
|
|
342
|
+
→ [{"c":0}]
|
|
343
|
+
|
|
344
|
+
alter table fold_chk drop constraint chk;
|
|
345
|
+
-- run
|
|
346
|
+
|
|
347
|
+
-- A row that would have violated the dropped CHECK now inserts and must be found
|
|
348
|
+
-- (folding no longer applies).
|
|
349
|
+
insert into fold_chk values (2, 2);
|
|
350
|
+
select count(*) as c from fold_chk where x = 2;
|
|
351
|
+
→ [{"c":1}]
|
|
352
|
+
|
|
353
|
+
drop table fold_chk;
|
|
354
|
+
-- run
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
-- 41.6.1-alter-drop-constraint-index-derived.sqllogic
|
|
2
|
+
--
|
|
3
|
+
-- requires-capability: standalone-index-ddl
|
|
4
|
+
--
|
|
5
|
+
-- Carved out of 41.6-alter-drop-rename-constraint: every other section there drops or
|
|
6
|
+
-- renames a named CHECK, UNIQUE or FOREIGN KEY declared in the table definition, with
|
|
7
|
+
-- no index DDL. This one negative control needs a UNIQUE that came from a standalone
|
|
8
|
+
-- `create unique index`, which is the whole point of the case.
|
|
9
|
+
--
|
|
10
|
+
-- Subject: a UNIQUE derived from CREATE UNIQUE INDEX is owned by the index, so
|
|
11
|
+
-- ALTER TABLE … DROP CONSTRAINT refuses to target it.
|
|
12
|
+
|
|
13
|
+
-- A UNIQUE derived from CREATE UNIQUE INDEX cannot be dropped as a constraint
|
|
14
|
+
create table e_der (id integer primary key, a integer);
|
|
15
|
+
create unique index uq_idx on e_der (a);
|
|
16
|
+
-- run
|
|
17
|
+
|
|
18
|
+
alter table e_der drop constraint uq_idx;
|
|
19
|
+
-- error: backed by index
|
|
20
|
+
|
|
21
|
+
drop table e_der;
|
|
22
|
+
-- run
|