@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,191 @@
|
|
|
1
|
+
-- ALTER TABLE operations: RENAME TABLE, RENAME COLUMN, ADD COLUMN, DROP COLUMN
|
|
2
|
+
|
|
3
|
+
-- ===================================
|
|
4
|
+
-- 1. ADD COLUMN (test first as simplest)
|
|
5
|
+
-- ===================================
|
|
6
|
+
|
|
7
|
+
create table t_addcol (id integer primary key, name text);
|
|
8
|
+
insert into t_addcol values (1, 'Alice'), (2, 'Bob');
|
|
9
|
+
|
|
10
|
+
-- Add column with NULL default (implicit)
|
|
11
|
+
alter table t_addcol add column age integer null;
|
|
12
|
+
|
|
13
|
+
-- Existing rows should get NULL for the new column
|
|
14
|
+
select * from t_addcol order by id;
|
|
15
|
+
→ [{"id": 1, "name": "Alice", "age": null}, {"id": 2, "name": "Bob", "age": null}]
|
|
16
|
+
|
|
17
|
+
-- Can insert with new column
|
|
18
|
+
insert into t_addcol values (3, 'Charlie', 30);
|
|
19
|
+
|
|
20
|
+
select * from t_addcol where id = 3;
|
|
21
|
+
→ [{"id": 3, "name": "Charlie", "age": 30}]
|
|
22
|
+
|
|
23
|
+
-- Add column with DEFAULT value
|
|
24
|
+
alter table t_addcol add column status text default 'active';
|
|
25
|
+
|
|
26
|
+
select status from t_addcol where id = 1;
|
|
27
|
+
→ [{"status": "active"}]
|
|
28
|
+
|
|
29
|
+
-- Cannot add duplicate column
|
|
30
|
+
alter table t_addcol add column name text;
|
|
31
|
+
-- error: already exists
|
|
32
|
+
|
|
33
|
+
-- Cannot add PRIMARY KEY column
|
|
34
|
+
alter table t_addcol add column pk integer primary key;
|
|
35
|
+
-- error: PRIMARY KEY
|
|
36
|
+
|
|
37
|
+
drop table t_addcol;
|
|
38
|
+
|
|
39
|
+
-- ===================================
|
|
40
|
+
-- 2. DROP COLUMN
|
|
41
|
+
-- ===================================
|
|
42
|
+
|
|
43
|
+
create table t_dropcol (id integer primary key, name text, extra text);
|
|
44
|
+
insert into t_dropcol values (1, 'Alice', 'x'), (2, 'Bob', 'y');
|
|
45
|
+
|
|
46
|
+
alter table t_dropcol drop column extra;
|
|
47
|
+
|
|
48
|
+
-- Remaining columns should work
|
|
49
|
+
select * from t_dropcol order by id;
|
|
50
|
+
→ [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
|
|
51
|
+
|
|
52
|
+
-- Cannot drop PK column
|
|
53
|
+
alter table t_dropcol drop column id;
|
|
54
|
+
-- error: PRIMARY KEY
|
|
55
|
+
|
|
56
|
+
-- Cannot drop non-existent column
|
|
57
|
+
alter table t_dropcol drop column nonexistent;
|
|
58
|
+
-- error: not found
|
|
59
|
+
|
|
60
|
+
drop table t_dropcol;
|
|
61
|
+
|
|
62
|
+
-- ===================================
|
|
63
|
+
-- 3. RENAME COLUMN
|
|
64
|
+
-- ===================================
|
|
65
|
+
|
|
66
|
+
create table t_colrename (id integer primary key, old_name text);
|
|
67
|
+
insert into t_colrename values (1, 'hello'), (2, 'world');
|
|
68
|
+
|
|
69
|
+
alter table t_colrename rename column old_name to new_name;
|
|
70
|
+
|
|
71
|
+
-- New column name should work
|
|
72
|
+
select new_name from t_colrename where id = 1;
|
|
73
|
+
→ [{"new_name": "hello"}]
|
|
74
|
+
|
|
75
|
+
-- Data preserved
|
|
76
|
+
select * from t_colrename order by id;
|
|
77
|
+
→ [{"id": 1, "new_name": "hello"}, {"id": 2, "new_name": "world"}]
|
|
78
|
+
|
|
79
|
+
-- Cannot rename to existing column name
|
|
80
|
+
alter table t_colrename rename column new_name to id;
|
|
81
|
+
-- error: already exists
|
|
82
|
+
|
|
83
|
+
-- Cannot rename non-existent column
|
|
84
|
+
alter table t_colrename rename column nonexistent to something;
|
|
85
|
+
-- error: not found
|
|
86
|
+
|
|
87
|
+
drop table t_colrename;
|
|
88
|
+
|
|
89
|
+
-- ===================================
|
|
90
|
+
-- 4. RENAME TABLE
|
|
91
|
+
-- ===================================
|
|
92
|
+
|
|
93
|
+
create table t_rename (id integer primary key, val text);
|
|
94
|
+
insert into t_rename values (1, 'a'), (2, 'b');
|
|
95
|
+
alter table t_rename rename to t_renamed;
|
|
96
|
+
-- run
|
|
97
|
+
|
|
98
|
+
-- Old name should no longer work
|
|
99
|
+
select * from t_rename;
|
|
100
|
+
-- error: not found
|
|
101
|
+
|
|
102
|
+
-- New name should work and data preserved
|
|
103
|
+
select * from t_renamed order by id;
|
|
104
|
+
→ [{"id": 1, "val": "a"}, {"id": 2, "val": "b"}]
|
|
105
|
+
|
|
106
|
+
-- Can insert into renamed table
|
|
107
|
+
insert into t_renamed values (3, 'c');
|
|
108
|
+
|
|
109
|
+
select count(*) as cnt from t_renamed;
|
|
110
|
+
→ [{"cnt": 3}]
|
|
111
|
+
|
|
112
|
+
-- Cannot rename to existing table
|
|
113
|
+
create table t_conflict (x integer);
|
|
114
|
+
-- run
|
|
115
|
+
|
|
116
|
+
alter table t_renamed rename to t_conflict;
|
|
117
|
+
-- error: already exists
|
|
118
|
+
|
|
119
|
+
drop table t_renamed;
|
|
120
|
+
drop table t_conflict;
|
|
121
|
+
|
|
122
|
+
-- ===================================
|
|
123
|
+
-- 5. ADD COLUMN with NOT NULL + DEFAULT
|
|
124
|
+
-- ===================================
|
|
125
|
+
|
|
126
|
+
create table t_notnull (id integer primary key);
|
|
127
|
+
insert into t_notnull values (1), (2);
|
|
128
|
+
-- run
|
|
129
|
+
|
|
130
|
+
-- NOT NULL without DEFAULT should fail (table has rows)
|
|
131
|
+
alter table t_notnull add column required text not null;
|
|
132
|
+
-- error: NOT NULL
|
|
133
|
+
|
|
134
|
+
-- Error message should name the column and qualified table
|
|
135
|
+
alter table t_notnull add column rank integer not null;
|
|
136
|
+
-- error: 'rank'
|
|
137
|
+
|
|
138
|
+
alter table t_notnull add column rank integer not null;
|
|
139
|
+
-- error: main.t_notnull
|
|
140
|
+
|
|
141
|
+
-- NOT NULL with DEFAULT should succeed
|
|
142
|
+
alter table t_notnull add column required text not null default 'default_val';
|
|
143
|
+
|
|
144
|
+
select required from t_notnull where id = 1;
|
|
145
|
+
→ [{"required": "default_val"}]
|
|
146
|
+
|
|
147
|
+
-- NULL (no DEFAULT) on non-empty table is allowed
|
|
148
|
+
alter table t_notnull add column nickname text null;
|
|
149
|
+
select nickname from t_notnull where id = 1;
|
|
150
|
+
→ [{"nickname": null}]
|
|
151
|
+
|
|
152
|
+
drop table t_notnull;
|
|
153
|
+
|
|
154
|
+
-- NOT NULL without DEFAULT is allowed on an empty table
|
|
155
|
+
create table t_notnull_empty (id integer primary key, name text);
|
|
156
|
+
alter table t_notnull_empty add column rank integer not null;
|
|
157
|
+
insert into t_notnull_empty values (1, 'Alice', 10);
|
|
158
|
+
select * from t_notnull_empty;
|
|
159
|
+
→ [{"id": 1, "name": "Alice", "rank": 10}]
|
|
160
|
+
drop table t_notnull_empty;
|
|
161
|
+
|
|
162
|
+
-- ===================================
|
|
163
|
+
-- 6. Combined operations
|
|
164
|
+
-- ===================================
|
|
165
|
+
|
|
166
|
+
create table t_combined (id integer primary key, a text, b text);
|
|
167
|
+
insert into t_combined values (1, 'x', 'y');
|
|
168
|
+
|
|
169
|
+
-- Add column, rename it, then use it
|
|
170
|
+
alter table t_combined add column c integer null;
|
|
171
|
+
|
|
172
|
+
alter table t_combined rename column c to score;
|
|
173
|
+
|
|
174
|
+
insert into t_combined values (2, 'p', 'q', 100);
|
|
175
|
+
|
|
176
|
+
select id, score from t_combined order by id;
|
|
177
|
+
→ [{"id": 1, "score": null}, {"id": 2, "score": 100}]
|
|
178
|
+
|
|
179
|
+
-- Drop original column
|
|
180
|
+
alter table t_combined drop column b;
|
|
181
|
+
|
|
182
|
+
select * from t_combined order by id;
|
|
183
|
+
→ [{"id": 1, "a": "x", "score": null}, {"id": 2, "a": "p", "score": 100}]
|
|
184
|
+
|
|
185
|
+
-- Rename table
|
|
186
|
+
alter table t_combined rename to t_final;
|
|
187
|
+
|
|
188
|
+
select * from t_final where id = 2;
|
|
189
|
+
→ [{"id": 2, "a": "p", "score": 100}]
|
|
190
|
+
|
|
191
|
+
drop table t_final;
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
-- adapted from SQLite test/fkey1.test, test/fkey2.test, test/fkey3.test, test/fkey4.test
|
|
2
|
+
-- FK + ON CONFLICT, multi-row UPDATE cascade, self-referential composite,
|
|
3
|
+
-- DROP-table-with-children, and DEFERRABLE INITIALLY DEFERRED column FK.
|
|
4
|
+
|
|
5
|
+
pragma foreign_keys = true;
|
|
6
|
+
|
|
7
|
+
-- ===================================
|
|
8
|
+
-- 1. INSERT OR IGNORE on child silently skips FK violation
|
|
9
|
+
-- ===================================
|
|
10
|
+
|
|
11
|
+
create table p_oc (id integer primary key);
|
|
12
|
+
create table c_oc (id integer primary key, p_id integer null,
|
|
13
|
+
foreign key (p_id) references p_oc(id));
|
|
14
|
+
|
|
15
|
+
insert into p_oc values (1);
|
|
16
|
+
|
|
17
|
+
-- IGNORE: orphan row silently skipped, no error
|
|
18
|
+
insert or ignore into c_oc values (1, 99);
|
|
19
|
+
|
|
20
|
+
select count(*) as cnt from c_oc;
|
|
21
|
+
→ [{"cnt":0}]
|
|
22
|
+
|
|
23
|
+
-- explicit ABORT raises
|
|
24
|
+
insert or abort into c_oc values (2, 99);
|
|
25
|
+
-- error:
|
|
26
|
+
|
|
27
|
+
-- valid insert
|
|
28
|
+
insert into c_oc values (10, 1);
|
|
29
|
+
|
|
30
|
+
-- IGNORE in multi-row VALUES: only orphans skipped
|
|
31
|
+
insert or ignore into c_oc values (11, 1), (12, 88), (13, 1);
|
|
32
|
+
|
|
33
|
+
select id from c_oc order by id;
|
|
34
|
+
→ [{"id":10},{"id":11},{"id":13}]
|
|
35
|
+
|
|
36
|
+
drop table c_oc;
|
|
37
|
+
drop table p_oc;
|
|
38
|
+
|
|
39
|
+
-- ===================================
|
|
40
|
+
-- 2. UPDATE OR IGNORE / OR ABORT — intentionally not supported.
|
|
41
|
+
-- ===================================
|
|
42
|
+
-- Per-statement conflict overrides on UPDATE are SQLite-only syntax; pinned closed.
|
|
43
|
+
-- Schema-level ON CONFLICT on the constraint covers the IGNORE/ABORT defaults.
|
|
44
|
+
-- See docs/sql.md §11.
|
|
45
|
+
|
|
46
|
+
-- ===================================
|
|
47
|
+
-- 3. ON UPDATE CASCADE where the cascade collides with another FK
|
|
48
|
+
-- ===================================
|
|
49
|
+
|
|
50
|
+
create table fa (id integer primary key);
|
|
51
|
+
create table fb (id integer primary key,
|
|
52
|
+
foreign key (id) references fa(id) on update cascade);
|
|
53
|
+
create table fc (b_id integer primary key,
|
|
54
|
+
foreign key (b_id) references fb(id));
|
|
55
|
+
|
|
56
|
+
insert into fa values (1);
|
|
57
|
+
insert into fb values (1);
|
|
58
|
+
insert into fc values (1);
|
|
59
|
+
|
|
60
|
+
-- updating fa.id cascades to fb.id; fb is referenced by fc with default
|
|
61
|
+
-- (RESTRICT) action → end-to-end fails atomically
|
|
62
|
+
update fa set id = 2 where id = 1;
|
|
63
|
+
-- error:
|
|
64
|
+
|
|
65
|
+
-- nothing changed
|
|
66
|
+
select id from fa;
|
|
67
|
+
→ [{"id":1}]
|
|
68
|
+
select id from fb;
|
|
69
|
+
→ [{"id":1}]
|
|
70
|
+
select b_id from fc;
|
|
71
|
+
→ [{"b_id":1}]
|
|
72
|
+
|
|
73
|
+
drop table fc;
|
|
74
|
+
drop table fb;
|
|
75
|
+
drop table fa;
|
|
76
|
+
|
|
77
|
+
-- ===================================
|
|
78
|
+
-- 4. Multi-row parent UPDATE cascades per-row
|
|
79
|
+
-- ===================================
|
|
80
|
+
|
|
81
|
+
create table mp (id integer primary key);
|
|
82
|
+
create table mc (id integer primary key, p_id integer null,
|
|
83
|
+
foreign key (p_id) references mp(id) on update cascade);
|
|
84
|
+
|
|
85
|
+
insert into mp values (1), (2), (3);
|
|
86
|
+
insert into mc values (10, 1), (11, 1), (20, 2), (21, 2), (30, 3);
|
|
87
|
+
|
|
88
|
+
-- single UPDATE rewriting many parent rows; all matching children cascade
|
|
89
|
+
update mp set id = id + 100;
|
|
90
|
+
|
|
91
|
+
select id, p_id from mc order by id;
|
|
92
|
+
→ [{"id":10,"p_id":101},{"id":11,"p_id":101},{"id":20,"p_id":102},{"id":21,"p_id":102},{"id":30,"p_id":103}]
|
|
93
|
+
|
|
94
|
+
drop table mc;
|
|
95
|
+
drop table mp;
|
|
96
|
+
|
|
97
|
+
-- ===================================
|
|
98
|
+
-- 5. Self-referential FK with composite UNIQUE target
|
|
99
|
+
-- ===================================
|
|
100
|
+
|
|
101
|
+
create table tree (
|
|
102
|
+
id integer primary key,
|
|
103
|
+
pid integer not null,
|
|
104
|
+
tag text not null,
|
|
105
|
+
unique (id, tag),
|
|
106
|
+
foreign key (pid, tag) references tree(id, tag)
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
-- root self-match
|
|
110
|
+
insert into tree values (1, 1, 'a');
|
|
111
|
+
|
|
112
|
+
select * from tree;
|
|
113
|
+
→ [{"id":1,"pid":1,"tag":"a"}]
|
|
114
|
+
|
|
115
|
+
-- valid child referencing existing (id, tag)
|
|
116
|
+
insert into tree values (2, 1, 'a');
|
|
117
|
+
|
|
118
|
+
-- invalid: (pid, tag) = (1, 'b') has no matching row
|
|
119
|
+
insert into tree values (3, 1, 'b');
|
|
120
|
+
-- error:
|
|
121
|
+
|
|
122
|
+
drop table tree;
|
|
123
|
+
|
|
124
|
+
-- ===================================
|
|
125
|
+
-- 6. DROP TABLE of a parent while a child still references it
|
|
126
|
+
-- ===================================
|
|
127
|
+
|
|
128
|
+
create table fk_drop_parent (x integer primary key, y integer null);
|
|
129
|
+
create table fk_drop_child (a integer primary key, b integer null references fk_drop_parent(x));
|
|
130
|
+
|
|
131
|
+
insert into fk_drop_parent values (100, 1);
|
|
132
|
+
insert into fk_drop_child values (1, 100);
|
|
133
|
+
|
|
134
|
+
-- dropping the referenced parent must fail
|
|
135
|
+
drop table fk_drop_parent;
|
|
136
|
+
-- error:
|
|
137
|
+
|
|
138
|
+
-- correct order (child first) succeeds
|
|
139
|
+
drop table fk_drop_child;
|
|
140
|
+
drop table fk_drop_parent;
|
|
141
|
+
|
|
142
|
+
-- ===================================
|
|
143
|
+
-- 7. DEFERRABLE INITIALLY DEFERRED column FK — auto-commit failure repeats cleanly
|
|
144
|
+
-- ===================================
|
|
145
|
+
|
|
146
|
+
create table t1 (a integer primary key, b integer null);
|
|
147
|
+
create table t2 (c integer null references t1 deferrable initially deferred, d integer null);
|
|
148
|
+
|
|
149
|
+
insert into t1 values (1, 2);
|
|
150
|
+
insert into t2 values (1, 3);
|
|
151
|
+
|
|
152
|
+
select * from t2;
|
|
153
|
+
→ [{"c":1,"d":3}]
|
|
154
|
+
|
|
155
|
+
-- deferred FK still rejects on auto-commit (no enclosing tx)
|
|
156
|
+
insert into t2 values (2, 4);
|
|
157
|
+
-- error:
|
|
158
|
+
|
|
159
|
+
-- repeating it must fail the same way; no implicit tx left dangling
|
|
160
|
+
insert into t2 values (2, 4);
|
|
161
|
+
-- error:
|
|
162
|
+
|
|
163
|
+
select * from t2;
|
|
164
|
+
→ [{"c":1,"d":3}]
|
|
165
|
+
|
|
166
|
+
drop table t2;
|
|
167
|
+
drop table t1;
|
|
168
|
+
|
|
169
|
+
-- ===================================
|
|
170
|
+
-- 8. Self-referential ON DELETE CASCADE — multi-level subtree
|
|
171
|
+
-- ===================================
|
|
172
|
+
|
|
173
|
+
create table sr_tree (
|
|
174
|
+
id integer primary key,
|
|
175
|
+
pid integer null,
|
|
176
|
+
foreign key (pid) references sr_tree(id) on delete cascade
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
-- Build:
|
|
180
|
+
-- 1 (root, pid=NULL)
|
|
181
|
+
-- ├─ 2 (pid=1)
|
|
182
|
+
-- │ ├─ 4 (pid=2)
|
|
183
|
+
-- │ └─ 5 (pid=2)
|
|
184
|
+
-- └─ 3 (pid=1)
|
|
185
|
+
-- └─ 6 (pid=3)
|
|
186
|
+
insert into sr_tree values (1, null);
|
|
187
|
+
insert into sr_tree values (2, 1), (3, 1);
|
|
188
|
+
insert into sr_tree values (4, 2), (5, 2), (6, 3);
|
|
189
|
+
|
|
190
|
+
select id from sr_tree order by id;
|
|
191
|
+
→ [{"id":1},{"id":2},{"id":3},{"id":4},{"id":5},{"id":6}]
|
|
192
|
+
|
|
193
|
+
-- delete subtree rooted at 2 → cascades to 4 and 5
|
|
194
|
+
delete from sr_tree where id = 2;
|
|
195
|
+
|
|
196
|
+
select id from sr_tree order by id;
|
|
197
|
+
→ [{"id":1},{"id":3},{"id":6}]
|
|
198
|
+
|
|
199
|
+
-- delete root → cascades the entire remaining tree
|
|
200
|
+
delete from sr_tree where id = 1;
|
|
201
|
+
|
|
202
|
+
select count(*) as cnt from sr_tree;
|
|
203
|
+
→ [{"cnt":0}]
|
|
204
|
+
|
|
205
|
+
drop table sr_tree;
|
|
206
|
+
|
|
207
|
+
-- ===================================
|
|
208
|
+
-- 9. Self-referential ON UPDATE CASCADE — child's pid follows parent's id rename
|
|
209
|
+
-- ===================================
|
|
210
|
+
|
|
211
|
+
create table sru_tree (
|
|
212
|
+
id integer primary key,
|
|
213
|
+
pid integer null,
|
|
214
|
+
foreign key (pid) references sru_tree(id) on update cascade
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
insert into sru_tree values (1, null);
|
|
218
|
+
insert into sru_tree values (2, 1), (3, 1);
|
|
219
|
+
insert into sru_tree values (4, 2);
|
|
220
|
+
|
|
221
|
+
-- rename leaf parent: child 4 follows
|
|
222
|
+
update sru_tree set id = 200 where id = 2;
|
|
223
|
+
|
|
224
|
+
select id, pid from sru_tree order by id;
|
|
225
|
+
→ [{"id":1,"pid":null},{"id":3,"pid":1},{"id":4,"pid":200},{"id":200,"pid":1}]
|
|
226
|
+
|
|
227
|
+
-- rename root: rows 3 and 200 follow (4's pid stays at 200 since 200 didn't move)
|
|
228
|
+
update sru_tree set id = 100 where id = 1;
|
|
229
|
+
|
|
230
|
+
select id, pid from sru_tree order by id;
|
|
231
|
+
→ [{"id":3,"pid":100},{"id":4,"pid":200},{"id":100,"pid":null},{"id":200,"pid":100}]
|
|
232
|
+
|
|
233
|
+
drop table sru_tree;
|
|
234
|
+
|
|
235
|
+
-- ===================================
|
|
236
|
+
-- 10. Deferred self-referential FK — forward reference within a transaction
|
|
237
|
+
-- ===================================
|
|
238
|
+
|
|
239
|
+
create table sd_tree (
|
|
240
|
+
id integer primary key,
|
|
241
|
+
pid integer null references sd_tree(id) deferrable initially deferred
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
-- forward reference: insert child before parent in the same tx; commit must succeed
|
|
245
|
+
begin;
|
|
246
|
+
insert into sd_tree values (2, 1);
|
|
247
|
+
insert into sd_tree values (1, null);
|
|
248
|
+
commit;
|
|
249
|
+
|
|
250
|
+
select id, pid from sd_tree order by id;
|
|
251
|
+
→ [{"id":1,"pid":null},{"id":2,"pid":1}]
|
|
252
|
+
|
|
253
|
+
-- if the parent never appears, commit must fail
|
|
254
|
+
begin;
|
|
255
|
+
insert into sd_tree values (3, 99);
|
|
256
|
+
commit;
|
|
257
|
+
-- error:
|
|
258
|
+
|
|
259
|
+
-- failed commit must leave no trace of row 3
|
|
260
|
+
select id from sd_tree order by id;
|
|
261
|
+
→ [{"id":1},{"id":2}]
|
|
262
|
+
|
|
263
|
+
drop table sd_tree;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
-- fk-cross-schema.sqllogic - FK parent-side check must respect schema boundaries
|
|
2
|
+
-- Regression: buildParentSideFKChecks matches by table name only, ignoring schema
|
|
3
|
+
|
|
4
|
+
PRAGMA foreign_keys = true;
|
|
5
|
+
|
|
6
|
+
-- ===================================================================
|
|
7
|
+
-- Setup: Two schemas, each with an identically-named "items" table.
|
|
8
|
+
-- Only s1 has a child table with FK referencing s1.items.
|
|
9
|
+
-- ===================================================================
|
|
10
|
+
|
|
11
|
+
declare schema s1 {
|
|
12
|
+
table items {
|
|
13
|
+
id INTEGER PRIMARY KEY,
|
|
14
|
+
name TEXT NOT NULL
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
table orders {
|
|
18
|
+
id INTEGER PRIMARY KEY,
|
|
19
|
+
item_id INTEGER,
|
|
20
|
+
FOREIGN KEY (item_id) REFERENCES items(id) ON DELETE RESTRICT
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
declare schema s2 {
|
|
25
|
+
table items {
|
|
26
|
+
id INTEGER PRIMARY KEY,
|
|
27
|
+
label TEXT
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
apply schema s1;
|
|
32
|
+
apply schema s2;
|
|
33
|
+
|
|
34
|
+
-- run
|
|
35
|
+
|
|
36
|
+
-- Seed both schemas
|
|
37
|
+
INSERT INTO s1.items VALUES (1, 'Widget'), (2, 'Gadget');
|
|
38
|
+
INSERT INTO s1.orders VALUES (100, 1), (200, 2);
|
|
39
|
+
|
|
40
|
+
INSERT INTO s2.items VALUES (1, 'Alpha'), (2, 'Beta'), (3, 'Gamma');
|
|
41
|
+
|
|
42
|
+
-- Verify setup
|
|
43
|
+
SELECT count(*) as cnt FROM s1.orders;
|
|
44
|
+
→ [{"cnt":2}]
|
|
45
|
+
|
|
46
|
+
SELECT count(*) as cnt FROM s2.items;
|
|
47
|
+
→ [{"cnt":3}]
|
|
48
|
+
|
|
49
|
+
-- ===================================================================
|
|
50
|
+
-- Test: DELETE from s2.items should succeed — no FK references s2.items
|
|
51
|
+
-- With the bug, it incorrectly matches s1.orders FK (which targets s1.items)
|
|
52
|
+
-- ===================================================================
|
|
53
|
+
|
|
54
|
+
DELETE FROM s2.items WHERE id = 3;
|
|
55
|
+
|
|
56
|
+
SELECT count(*) as cnt FROM s2.items;
|
|
57
|
+
→ [{"cnt":2}]
|
|
58
|
+
|
|
59
|
+
-- DELETE from s1.items that IS referenced should fail (RESTRICT)
|
|
60
|
+
DELETE FROM s1.items WHERE id = 1;
|
|
61
|
+
-- error: constraint failed
|
|
62
|
+
|
|
63
|
+
-- Verify s1.items unchanged
|
|
64
|
+
SELECT count(*) as cnt FROM s1.items;
|
|
65
|
+
→ [{"cnt":2}]
|
|
66
|
+
|
|
67
|
+
-- ===================================================================
|
|
68
|
+
-- Test: UPDATE on s2.items should also succeed
|
|
69
|
+
-- ===================================================================
|
|
70
|
+
|
|
71
|
+
UPDATE s2.items SET id = 99 WHERE id = 2;
|
|
72
|
+
|
|
73
|
+
SELECT id FROM s2.items ORDER BY id;
|
|
74
|
+
→ [{"id":1},{"id":99}]
|
|
75
|
+
|
|
76
|
+
-- Cleanup
|
|
77
|
+
DROP TABLE s1.orders;
|
|
78
|
+
DROP TABLE s1.items;
|
|
79
|
+
DROP TABLE s2.items;
|
|
80
|
+
|
|
81
|
+
-- ===================================================================
|
|
82
|
+
-- Test: CASCADE/SET NULL/SET DEFAULT actions across schemas must
|
|
83
|
+
-- target the schema-qualified child table, not whichever 'children'
|
|
84
|
+
-- happens to live in the default schema.
|
|
85
|
+
-- Regression: executeSingleFKAction generated unqualified DELETE/UPDATE
|
|
86
|
+
-- which would target the wrong table when child is in a non-default schema.
|
|
87
|
+
-- ===================================================================
|
|
88
|
+
|
|
89
|
+
declare schema sa {
|
|
90
|
+
table parents {
|
|
91
|
+
id INTEGER PRIMARY KEY,
|
|
92
|
+
val TEXT NULL
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
table cascade_children {
|
|
96
|
+
id INTEGER PRIMARY KEY,
|
|
97
|
+
parent_id INTEGER NULL,
|
|
98
|
+
FOREIGN KEY (parent_id) REFERENCES parents(id) ON DELETE CASCADE ON UPDATE CASCADE
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
table setnull_children {
|
|
102
|
+
id INTEGER PRIMARY KEY,
|
|
103
|
+
parent_id INTEGER NULL,
|
|
104
|
+
FOREIGN KEY (parent_id) REFERENCES parents(id) ON DELETE SET NULL
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
table setdefault_children {
|
|
108
|
+
id INTEGER PRIMARY KEY,
|
|
109
|
+
parent_id INTEGER NULL DEFAULT 99,
|
|
110
|
+
FOREIGN KEY (parent_id) REFERENCES parents(id) ON DELETE SET DEFAULT
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
apply schema sa;
|
|
115
|
+
|
|
116
|
+
-- run
|
|
117
|
+
|
|
118
|
+
-- Seed: parent 99 acts as the default-target row for SET DEFAULT.
|
|
119
|
+
-- Each child references a distinct parent so that one action does not
|
|
120
|
+
-- cascade into another.
|
|
121
|
+
INSERT INTO sa.parents VALUES (1, 'one'), (2, 'two'), (3, 'three'), (4, 'four'), (99, 'default');
|
|
122
|
+
INSERT INTO sa.cascade_children VALUES (10, 1), (11, 1);
|
|
123
|
+
INSERT INTO sa.cascade_children VALUES (12, 2);
|
|
124
|
+
INSERT INTO sa.setnull_children VALUES (20, 3);
|
|
125
|
+
INSERT INTO sa.setdefault_children VALUES (30, 4);
|
|
126
|
+
|
|
127
|
+
-- CASCADE DELETE across schema
|
|
128
|
+
DELETE FROM sa.parents WHERE id = 1;
|
|
129
|
+
|
|
130
|
+
SELECT count(*) as cnt FROM sa.cascade_children WHERE parent_id = 1;
|
|
131
|
+
→ [{"cnt":0}]
|
|
132
|
+
|
|
133
|
+
-- CASCADE UPDATE across schema
|
|
134
|
+
UPDATE sa.parents SET id = 222 WHERE id = 2;
|
|
135
|
+
|
|
136
|
+
SELECT parent_id FROM sa.cascade_children WHERE id = 12;
|
|
137
|
+
→ [{"parent_id":222}]
|
|
138
|
+
|
|
139
|
+
-- SET NULL across schema
|
|
140
|
+
DELETE FROM sa.parents WHERE id = 3;
|
|
141
|
+
|
|
142
|
+
SELECT parent_id FROM sa.setnull_children WHERE id = 20;
|
|
143
|
+
→ [{"parent_id":null}]
|
|
144
|
+
|
|
145
|
+
-- SET DEFAULT across schema
|
|
146
|
+
DELETE FROM sa.parents WHERE id = 4;
|
|
147
|
+
|
|
148
|
+
SELECT parent_id FROM sa.setdefault_children WHERE id = 30;
|
|
149
|
+
→ [{"parent_id":99}]
|
|
150
|
+
|
|
151
|
+
DROP TABLE sa.cascade_children;
|
|
152
|
+
DROP TABLE sa.setnull_children;
|
|
153
|
+
DROP TABLE sa.setdefault_children;
|
|
154
|
+
DROP TABLE sa.parents;
|
|
155
|
+
|