@quereus/quereus 4.20.0 → 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/dist/src/common/types.d.ts +4 -4
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/schema/catalog-rendering.js +13 -1
- package/dist/src/schema/catalog-rendering.js.map +1 -1
- package/dist/src/schema/catalog.d.ts +35 -2
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +42 -33
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/schema-differ.d.ts +1 -1
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +195 -33
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/unique-enforcement.d.ts +23 -1
- package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
- package/dist/src/schema/unique-enforcement.js +43 -1
- package/dist/src/schema/unique-enforcement.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +15 -12
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +87 -100
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/package.json +7 -4
- package/test/README.md +173 -0
- package/test/logic/01-basic.sqllogic +39 -0
- package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
- package/test/logic/01.2-strings.sqllogic +43 -0
- package/test/logic/01.5-insert-select.sqllogic +237 -0
- package/test/logic/01.6-update-extras.sqllogic +118 -0
- package/test/logic/01.7-update-from.sqllogic +67 -0
- package/test/logic/01.8-delete-extras.sqllogic +122 -0
- package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
- package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
- package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
- package/test/logic/01.9-query-expr-values.sqllogic +111 -0
- package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
- package/test/logic/02-filters.sqllogic +54 -0
- package/test/logic/02-smoke.sqllogic +62 -0
- package/test/logic/02.1-bind-parameters.sqllogic +223 -0
- package/test/logic/03-expressions.sqllogic +190 -0
- package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
- package/test/logic/03.4-defaults.sqllogic +554 -0
- package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
- package/test/logic/03.5-tvf.sqllogic +61 -0
- package/test/logic/03.6-type-system.sqllogic +544 -0
- package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
- package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
- package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
- package/test/logic/03.8-not-precedence.sqllogic +255 -0
- package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
- package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
- package/test/logic/04-order-by.sqllogic +38 -0
- package/test/logic/04-transactions.sqllogic +239 -0
- package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
- package/test/logic/05-vtab_memory.sqllogic +50 -0
- package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
- package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
- package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
- package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
- package/test/logic/06-builtin_functions.sqllogic +149 -0
- package/test/logic/06.1-string-functions.sqllogic +92 -0
- package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
- package/test/logic/06.2-math-functions.sqllogic +82 -0
- package/test/logic/06.3-schema.sqllogic +48 -0
- package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
- package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
- package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
- package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
- package/test/logic/06.3.4-view-info.sqllogic +378 -0
- package/test/logic/06.3.5-column-info.sqllogic +347 -0
- package/test/logic/06.3.6-schema-views.sqllogic +29 -0
- package/test/logic/06.4-schema-search-path.sqllogic +354 -0
- package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
- package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
- package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
- package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
- package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
- package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
- package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
- package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
- package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
- package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
- package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
- package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
- package/test/logic/06.7-json-extended.sqllogic +53 -0
- package/test/logic/06.8-json-path-operators.sqllogic +99 -0
- package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
- package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
- package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
- package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
- package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
- package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
- package/test/logic/07-aggregates.sqllogic +193 -0
- package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
- package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
- package/test/logic/07.3-group-by-extras.sqllogic +602 -0
- package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
- package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
- package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
- package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
- package/test/logic/07.5-window.sqllogic +1941 -0
- package/test/logic/07.5.1-window-named.sqllogic +13 -0
- package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
- package/test/logic/07.6-subqueries.sqllogic +78 -0
- package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
- package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
- package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
- package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
- package/test/logic/07.7.1-in-extras.sqllogic +158 -0
- package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
- package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
- package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
- package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
- package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
- package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
- package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
- package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
- package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
- package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
- package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
- package/test/logic/07.9-in-value-list.sqllogic +154 -0
- package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
- package/test/logic/08-views.sqllogic +64 -0
- package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
- package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
- package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
- package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
- package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
- package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
- package/test/logic/09-set_operations.sqllogic +244 -0
- package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
- package/test/logic/10-distinct_datatypes.sqllogic +127 -0
- package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
- package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
- package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
- package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
- package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
- package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
- package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
- package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
- package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
- package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
- package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
- package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
- package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
- package/test/logic/10.2-column-features.sqllogic +365 -0
- package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
- package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
- package/test/logic/10.3-function-features.sqllogic +247 -0
- package/test/logic/10.4-schema-scale.sqllogic +168 -0
- package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
- package/test/logic/10.5-indexes.sqllogic +164 -0
- package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
- package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
- package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
- package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
- package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
- package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
- package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
- package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
- package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
- package/test/logic/100.1-where-extras.sqllogic +163 -0
- package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
- package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
- package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
- package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
- package/test/logic/102-unique-constraints.sqllogic +145 -0
- package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
- package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
- package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
- package/test/logic/102.2-unique-collation.sqllogic +181 -0
- package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
- package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
- package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
- package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
- package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
- package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
- package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
- package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
- package/test/logic/108-cardinality-estimation.sqllogic +146 -0
- package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
- package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
- package/test/logic/11-joins.sqllogic +86 -0
- package/test/logic/11.1-join-using.sqllogic +267 -0
- package/test/logic/11.2-comma-join.sqllogic +35 -0
- package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
- package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
- package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
- package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
- package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
- package/test/logic/12-empty-primary-key.sqllogic +124 -0
- package/test/logic/12-join_padding_order.sqllogic +58 -0
- package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
- package/test/logic/13-cte.sqllogic +137 -0
- package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
- package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
- package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
- package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
- package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
- package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
- package/test/logic/13.4-cte-extras.sqllogic +98 -0
- package/test/logic/13.5-cte-join-order.sqllogic +166 -0
- package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
- package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
- package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
- package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
- package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
- package/test/logic/14-utilities.sqllogic +168 -0
- package/test/logic/15-timespan.sqllogic +279 -0
- package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
- package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
- package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
- package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
- package/test/logic/16-epoch.sqllogic +187 -0
- package/test/logic/17-weekday-modifier.sqllogic +78 -0
- package/test/logic/18-json-string-escapes.sqllogic +86 -0
- package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
- package/test/logic/20-empty-single-row.sqllogic +261 -0
- package/test/logic/21-null-edge-cases.sqllogic +227 -0
- package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
- package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
- package/test/logic/21.2-between-edges.sqllogic +157 -0
- package/test/logic/22-boundary-values.sqllogic +175 -0
- package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
- package/test/logic/24-builtin-branches.sqllogic +611 -0
- package/test/logic/24.1-substr-extras.sqllogic +75 -0
- package/test/logic/24.2-random-extras.sqllogic +39 -0
- package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
- package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
- package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
- package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
- package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
- package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
- package/test/logic/26-join-edge-cases.sqllogic +333 -0
- package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
- package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
- package/test/logic/26.3-join-on-constants.sqllogic +61 -0
- package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
- package/test/logic/27-window-edge-cases.sqllogic +206 -0
- package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
- package/test/logic/27.2-window-exclude.sqllogic +13 -0
- package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
- package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
- package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
- package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
- package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
- package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
- package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
- package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
- package/test/logic/40-constraints.sqllogic +418 -0
- package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
- package/test/logic/40.2-check-extras.sqllogic +683 -0
- package/test/logic/41-alter-table.sqllogic +191 -0
- package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
- package/test/logic/41-fk-cross-schema.sqllogic +155 -0
- package/test/logic/41-fk-extended-targets.sqllogic +173 -0
- package/test/logic/41-foreign-keys.sqllogic +1001 -0
- package/test/logic/41-generated-column-errors.sqllogic +225 -0
- package/test/logic/41-generated-column-extras.sqllogic +598 -0
- package/test/logic/41-generated-column-scope.sqllogic +329 -0
- package/test/logic/41-generated-columns.sqllogic +361 -0
- package/test/logic/41.1-alter-pk.sqllogic +230 -0
- package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
- package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
- package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
- package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
- package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
- package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
- package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
- package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
- package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
- package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
- package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
- package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
- package/test/logic/41.2-alter-column.sqllogic +382 -0
- package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
- package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
- package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
- package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
- package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
- package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
- package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
- package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
- package/test/logic/41.5-alter-misc.sqllogic +48 -0
- package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
- package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
- package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
- package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
- package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
- package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
- package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
- package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
- package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
- package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
- package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
- package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
- package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
- package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
- package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
- package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
- package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
- package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
- package/test/logic/42-committed-snapshot.sqllogic +254 -0
- package/test/logic/42-returning.sqllogic +159 -0
- package/test/logic/42.1-returning-extras.sqllogic +232 -0
- package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
- package/test/logic/43-default-nullability.sqllogic +131 -0
- package/test/logic/43-transition-constraints.sqllogic +341 -0
- package/test/logic/43.1-default-collation.sqllogic +140 -0
- package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
- package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
- package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
- package/test/logic/44-determinism-validation.sqllogic +164 -0
- package/test/logic/44-orthogonality.sqllogic +146 -0
- package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
- package/test/logic/45-udf-determinism.sqllogic +39 -0
- package/test/logic/46-mutation-context.sqllogic +595 -0
- package/test/logic/47-upsert.sqllogic +255 -0
- package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
- package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
- package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
- package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
- package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
- package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
- package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
- package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
- package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
- package/test/logic/49-reference-graph.sqllogic +84 -0
- package/test/logic/50-declarative-schema.sqllogic +2550 -0
- package/test/logic/50-metadata-tags.sqllogic +1033 -0
- package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
- package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
- package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
- package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +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,602 @@
|
|
|
1
|
+
-- 41.10.4-drop-object-expression-dependents.sqllogic
|
|
2
|
+
--
|
|
3
|
+
-- Subject: `DROP TABLE` / `DROP VIEW` / `DROP MATERIALIZED VIEW` vs. a stored expression
|
|
4
|
+
-- on ANOTHER table that can still REACH the dropped object — a CHECK constraint, a column
|
|
5
|
+
-- DEFAULT, or a `GENERATED ALWAYS AS` body, each reaching it through a subquery, either
|
|
6
|
+
-- directly (§1-§9) or through any chain of view / materialized-view bodies (§10-§15).
|
|
7
|
+
--
|
|
8
|
+
-- This is the table-verb half of 41.10.2. Both verbs resolve at the same question the
|
|
9
|
+
-- catalog could not previously answer — "which stored table expressions reference this
|
|
10
|
+
-- object?" — and both now answer it the same way, so `drop table t` and
|
|
11
|
+
-- `alter table t drop column v` cannot disagree about the same constraint.
|
|
12
|
+
--
|
|
13
|
+
-- Left unguarded, the drop was accepted and the REFERENCING table became unwritable at
|
|
14
|
+
-- the next INSERT, with `Table 't' not found in schema path: main` — an error naming
|
|
15
|
+
-- neither the object the user dropped nor the constraint that broke.
|
|
16
|
+
--
|
|
17
|
+
-- Policy is REFUSE, matching the whole expression-dependent family (`assertion-drop-guard.ts`,
|
|
18
|
+
-- `drop-column-guards.ts`) and SQLite's position. What refuse does NOT extend to is the
|
|
19
|
+
-- referencing side of a plain VIEW: dropping a table out from under a view stays legal and
|
|
20
|
+
-- leaves the view broken (§5) — a broken view breaks queries OF that view, while a broken
|
|
21
|
+
-- CHECK makes a whole table unwritable.
|
|
22
|
+
--
|
|
23
|
+
-- No `-- requires-capability:` directive: the file uses no standalone index DDL, so it
|
|
24
|
+
-- runs under both the memory module (`yarn test`) and the store module (`yarn test:store`).
|
|
25
|
+
|
|
26
|
+
-- ===================================================================
|
|
27
|
+
-- 1. A CHECK on another table refuses the drop; drop the constraint to proceed
|
|
28
|
+
-- ===================================================================
|
|
29
|
+
|
|
30
|
+
create table DtSrc (id integer primary key, v integer);
|
|
31
|
+
insert into DtSrc values (1, 10);
|
|
32
|
+
create table DtRef (id integer primary key, n integer,
|
|
33
|
+
constraint ck_dt check (n < (select max(v) from DtSrc)));
|
|
34
|
+
-- run
|
|
35
|
+
|
|
36
|
+
drop table DtSrc;
|
|
37
|
+
-- error: it is referenced by CHECK constraint 'ck_dt' on table 'DtRef'
|
|
38
|
+
|
|
39
|
+
-- Nothing was applied: DtSrc is still there, and DtRef is still writable AND still
|
|
40
|
+
-- enforcing — the damage the refusal prevents.
|
|
41
|
+
insert into DtRef values (1, 1);
|
|
42
|
+
select n from DtRef;
|
|
43
|
+
→ [{"n":1}]
|
|
44
|
+
|
|
45
|
+
insert into DtRef values (2, 99);
|
|
46
|
+
-- error: ck_dt
|
|
47
|
+
|
|
48
|
+
-- Escape hatch: remove the reference, then the drop goes through.
|
|
49
|
+
alter table DtRef drop constraint ck_dt;
|
|
50
|
+
drop table DtSrc;
|
|
51
|
+
-- run
|
|
52
|
+
|
|
53
|
+
insert into DtRef values (3, 99);
|
|
54
|
+
select count(*) as c from DtRef;
|
|
55
|
+
→ [{"c":2}]
|
|
56
|
+
|
|
57
|
+
drop table DtRef;
|
|
58
|
+
-- run
|
|
59
|
+
|
|
60
|
+
-- ===================================================================
|
|
61
|
+
-- 2. An UNNAMED CHECK has no name to quote, so the message quotes its expression
|
|
62
|
+
-- ===================================================================
|
|
63
|
+
--
|
|
64
|
+
-- Accepted cost, exactly as in §2 of 41.10.2: `DROP CONSTRAINT` resolves by name only, so
|
|
65
|
+
-- the referenced table can only be dropped by rebuilding the REFERENCING one. The quoted
|
|
66
|
+
-- expression is the only handle the user has on it.
|
|
67
|
+
|
|
68
|
+
create table DtASrc (id integer primary key, v integer);
|
|
69
|
+
create table DtARef (id integer primary key, n integer, check (n < (select max(v) from DtASrc)));
|
|
70
|
+
-- run
|
|
71
|
+
|
|
72
|
+
drop table DtASrc;
|
|
73
|
+
-- error: it is referenced by the CHECK constraint (n < (select max(v) from DtASrc))
|
|
74
|
+
|
|
75
|
+
drop table DtARef;
|
|
76
|
+
drop table DtASrc;
|
|
77
|
+
-- run
|
|
78
|
+
|
|
79
|
+
-- ===================================================================
|
|
80
|
+
-- 3. A DEFAULT and a GENERATED body on another table refuse it too
|
|
81
|
+
-- ===================================================================
|
|
82
|
+
|
|
83
|
+
create table DtDSrc (id integer primary key, v integer);
|
|
84
|
+
insert into DtDSrc values (1, 11);
|
|
85
|
+
create table DtDRef (id integer primary key, w integer default ((select min(v) from DtDSrc)));
|
|
86
|
+
-- run
|
|
87
|
+
|
|
88
|
+
drop table DtDSrc;
|
|
89
|
+
-- error: it is referenced by the DEFAULT of column 'w' on table 'DtDRef'
|
|
90
|
+
|
|
91
|
+
insert into DtDRef (id) values (1);
|
|
92
|
+
select id, w from DtDRef;
|
|
93
|
+
→ [{"id":1,"w":11}]
|
|
94
|
+
|
|
95
|
+
drop table DtDRef;
|
|
96
|
+
drop table DtDSrc;
|
|
97
|
+
-- run
|
|
98
|
+
|
|
99
|
+
create table DtGSrc (id integer primary key, v integer);
|
|
100
|
+
insert into DtGSrc values (1, 12);
|
|
101
|
+
create table DtGRef (id integer primary key,
|
|
102
|
+
g integer generated always as ((select max(DtGSrc.v) from DtGSrc)));
|
|
103
|
+
-- run
|
|
104
|
+
|
|
105
|
+
drop table DtGSrc;
|
|
106
|
+
-- error: it is referenced by the GENERATED expression of column 'g' on table 'DtGRef'
|
|
107
|
+
|
|
108
|
+
drop table DtGRef;
|
|
109
|
+
drop table DtGSrc;
|
|
110
|
+
-- run
|
|
111
|
+
|
|
112
|
+
-- ===================================================================
|
|
113
|
+
-- 4. A table's own SELF-referencing CHECK never blocks its own drop
|
|
114
|
+
-- ===================================================================
|
|
115
|
+
--
|
|
116
|
+
-- The constraint goes away with the table, so there is nothing left pointing at a missing
|
|
117
|
+
-- name. Refusing here would make every self-referencing table undroppable. (The COLUMN
|
|
118
|
+
-- verb is the opposite case and keeps the altered table in scope: dropping one column
|
|
119
|
+
-- leaves the rest of the table, and its CHECKs, behind.)
|
|
120
|
+
|
|
121
|
+
create table DtSelf (id integer primary key, v integer,
|
|
122
|
+
check (v <= (select max(v) from DtSelf)));
|
|
123
|
+
insert into DtSelf values (1, 1);
|
|
124
|
+
-- run
|
|
125
|
+
|
|
126
|
+
drop table DtSelf;
|
|
127
|
+
-- run
|
|
128
|
+
|
|
129
|
+
-- ===================================================================
|
|
130
|
+
-- 5. A plain VIEW over the table does NOT block the drop
|
|
131
|
+
-- ===================================================================
|
|
132
|
+
--
|
|
133
|
+
-- The engine's stated asymmetry, unchanged by this guard. A broken view breaks queries of
|
|
134
|
+
-- that view and nothing else, so the drop stays legal.
|
|
135
|
+
|
|
136
|
+
create table DtViewed (id integer primary key, v integer);
|
|
137
|
+
create view DtV as select id, v from DtViewed;
|
|
138
|
+
-- run
|
|
139
|
+
|
|
140
|
+
drop table DtViewed;
|
|
141
|
+
-- run
|
|
142
|
+
|
|
143
|
+
select id from DtV;
|
|
144
|
+
-- error: DtViewed
|
|
145
|
+
|
|
146
|
+
drop view DtV;
|
|
147
|
+
-- run
|
|
148
|
+
|
|
149
|
+
-- ===================================================================
|
|
150
|
+
-- 6. …but DROP VIEW is refused when a CHECK reads the VIEW
|
|
151
|
+
-- ===================================================================
|
|
152
|
+
--
|
|
153
|
+
-- The other side of §5, and the reason the guard is wired into all three DROP emitters: a
|
|
154
|
+
-- CHECK subquery can read a view exactly as it reads a base table, and losing the view
|
|
155
|
+
-- breaks the referencing table just as thoroughly.
|
|
156
|
+
|
|
157
|
+
create table DtVBase (id integer primary key, v integer);
|
|
158
|
+
insert into DtVBase values (1, 4);
|
|
159
|
+
create view DtVSrc as select id, v from DtVBase;
|
|
160
|
+
create table DtVRef (id integer primary key, n integer,
|
|
161
|
+
constraint ck_dtv check (n < (select max(v) from DtVSrc)));
|
|
162
|
+
-- run
|
|
163
|
+
|
|
164
|
+
drop view DtVSrc;
|
|
165
|
+
-- error: cannot drop view 'main.DtVSrc': it is referenced by CHECK constraint 'ck_dtv' on table 'DtVRef'
|
|
166
|
+
|
|
167
|
+
insert into DtVRef values (1, 1);
|
|
168
|
+
select n from DtVRef;
|
|
169
|
+
→ [{"n":1}]
|
|
170
|
+
|
|
171
|
+
alter table DtVRef drop constraint ck_dtv;
|
|
172
|
+
drop view DtVSrc;
|
|
173
|
+
drop table DtVRef;
|
|
174
|
+
drop table DtVBase;
|
|
175
|
+
-- run
|
|
176
|
+
|
|
177
|
+
-- A materialized view is a table to a CHECK subquery, and gets the same refusal.
|
|
178
|
+
create table DtMBase (id integer primary key, v integer);
|
|
179
|
+
insert into DtMBase values (1, 6);
|
|
180
|
+
create materialized view DtMSrc as select id, v from DtMBase;
|
|
181
|
+
create table DtMRef (id integer primary key, n integer,
|
|
182
|
+
constraint ck_dtm check (n < (select max(v) from DtMSrc)));
|
|
183
|
+
-- run
|
|
184
|
+
|
|
185
|
+
drop materialized view DtMSrc;
|
|
186
|
+
-- error: cannot drop materialized view 'main.DtMSrc': it is referenced by CHECK constraint 'ck_dtm' on table 'DtMRef'
|
|
187
|
+
|
|
188
|
+
alter table DtMRef drop constraint ck_dtm;
|
|
189
|
+
drop materialized view DtMSrc;
|
|
190
|
+
drop table DtMRef;
|
|
191
|
+
drop table DtMBase;
|
|
192
|
+
-- run
|
|
193
|
+
|
|
194
|
+
-- ===================================================================
|
|
195
|
+
-- 7. `IF EXISTS` governs ABSENCE, not dependency, so it does not weaken the refusal
|
|
196
|
+
-- ===================================================================
|
|
197
|
+
--
|
|
198
|
+
-- Same position `assertNoAssertionDependsOn` takes. `IF EXISTS` says "it is fine if this
|
|
199
|
+
-- object is already gone"; it says nothing about dropping one that other objects need.
|
|
200
|
+
|
|
201
|
+
create table DtIfSrc (id integer primary key, v integer);
|
|
202
|
+
create table DtIfRef (id integer primary key, n integer,
|
|
203
|
+
constraint ck_dtif check (n < (select max(v) from DtIfSrc)));
|
|
204
|
+
-- run
|
|
205
|
+
|
|
206
|
+
drop table if exists DtIfSrc;
|
|
207
|
+
-- error: it is referenced by CHECK constraint 'ck_dtif' on table 'DtIfRef'
|
|
208
|
+
|
|
209
|
+
-- An absent object is still a clean no-op.
|
|
210
|
+
drop table if exists DtNeverExisted;
|
|
211
|
+
-- run
|
|
212
|
+
|
|
213
|
+
drop table DtIfRef;
|
|
214
|
+
drop table DtIfSrc;
|
|
215
|
+
-- run
|
|
216
|
+
|
|
217
|
+
-- ===================================================================
|
|
218
|
+
-- 8. Scope-aware, not a bare name match: a CTE or an alias that merely
|
|
219
|
+
-- SHADOWS the name is not a reference
|
|
220
|
+
-- ===================================================================
|
|
221
|
+
--
|
|
222
|
+
-- The walk is the read-only run of the one `ALTER TABLE … RENAME TO` uses, so the drop
|
|
223
|
+
-- refuses exactly the references a rename would have rewritten — a `with DtCte as (…)`
|
|
224
|
+
-- body names the CTE, not the real table of that name.
|
|
225
|
+
|
|
226
|
+
create table DtCte (id integer primary key, v integer);
|
|
227
|
+
insert into DtCte values (1, 3);
|
|
228
|
+
create table DtCteRef (id integer primary key, n integer,
|
|
229
|
+
check ((with DtCte as (select 1 as v) select max(v) from DtCte) >= 0));
|
|
230
|
+
-- run
|
|
231
|
+
|
|
232
|
+
drop table DtCte;
|
|
233
|
+
-- run
|
|
234
|
+
|
|
235
|
+
insert into DtCteRef values (1, 1);
|
|
236
|
+
select n from DtCteRef;
|
|
237
|
+
→ [{"n":1}]
|
|
238
|
+
|
|
239
|
+
drop table DtCteRef;
|
|
240
|
+
-- run
|
|
241
|
+
|
|
242
|
+
-- A FROM alias binds the name just as a CTE does: `from DtAliased as DtAlias` makes
|
|
243
|
+
-- `DtAlias.v` a column of DtAliased, so the real DtAlias table is droppable.
|
|
244
|
+
create table DtAlias (id integer primary key, v integer);
|
|
245
|
+
create table DtAliased (k integer primary key, v integer);
|
|
246
|
+
insert into DtAliased values (1, 2);
|
|
247
|
+
create table DtAliasRef (id integer primary key, n integer,
|
|
248
|
+
check ((select max(DtAlias.v) from DtAliased as DtAlias) >= 0));
|
|
249
|
+
-- run
|
|
250
|
+
|
|
251
|
+
drop table DtAlias;
|
|
252
|
+
-- run
|
|
253
|
+
|
|
254
|
+
insert into DtAliasRef values (1, 1);
|
|
255
|
+
select n from DtAliasRef;
|
|
256
|
+
→ [{"n":1}]
|
|
257
|
+
|
|
258
|
+
drop table DtAliasRef;
|
|
259
|
+
drop table DtAliased;
|
|
260
|
+
-- run
|
|
261
|
+
|
|
262
|
+
-- ===================================================================
|
|
263
|
+
-- 9. Cross-schema: a qualified reference from another schema is caught,
|
|
264
|
+
-- a bare name that resolves locally is not
|
|
265
|
+
-- ===================================================================
|
|
266
|
+
--
|
|
267
|
+
-- Mirror of §22 in 41.10.2 for the table verb, and of §48–§49 in
|
|
268
|
+
-- 41.3-alter-rename-propagation for the rename it is defined against.
|
|
269
|
+
|
|
270
|
+
create table main.DtCs (id integer primary key, v integer);
|
|
271
|
+
create table temp.DtCsRef (id integer primary key, n integer,
|
|
272
|
+
constraint ck_dtcs check (n < (select max(v) from main.DtCs)));
|
|
273
|
+
-- run
|
|
274
|
+
|
|
275
|
+
drop table main.DtCs;
|
|
276
|
+
-- error: it is referenced by CHECK constraint 'ck_dtcs' on table 'temp.DtCsRef'
|
|
277
|
+
|
|
278
|
+
drop table temp.DtCsRef;
|
|
279
|
+
drop table main.DtCs;
|
|
280
|
+
-- run
|
|
281
|
+
|
|
282
|
+
create table main.DtDup (id integer primary key, v integer);
|
|
283
|
+
create table temp.DtDup (id integer primary key, v integer);
|
|
284
|
+
-- The CHECK's home is temp, so its bare `DtDup` binds temp.DtDup and says nothing about
|
|
285
|
+
-- the main-schema table of the same name.
|
|
286
|
+
create table temp.DtDupRef (id integer primary key, n integer,
|
|
287
|
+
check (n < (select max(v) from DtDup)));
|
|
288
|
+
-- run
|
|
289
|
+
|
|
290
|
+
drop table main.DtDup;
|
|
291
|
+
-- run
|
|
292
|
+
|
|
293
|
+
drop table temp.DtDupRef;
|
|
294
|
+
drop table temp.DtDup;
|
|
295
|
+
-- run
|
|
296
|
+
|
|
297
|
+
-- ===================================================================
|
|
298
|
+
-- 10. A CHECK that reaches the table only THROUGH a view refuses the drop
|
|
299
|
+
-- ===================================================================
|
|
300
|
+
--
|
|
301
|
+
-- The referencing CHECK never spells `DtRvBase` at all — it reads a view whose body does.
|
|
302
|
+
-- Accepted, the drop left DtRvRef unwritable at the next INSERT, with an error naming
|
|
303
|
+
-- neither the dropped table, nor the view, nor the constraint that broke.
|
|
304
|
+
--
|
|
305
|
+
-- The message therefore names the CHAIN. A user told a constraint blocks the drop will
|
|
306
|
+
-- read its body, find no mention of the dropped table, and be stuck without it. Same
|
|
307
|
+
-- spelling the assertion guard uses (`95-assertions.sqllogic`), because both guards now
|
|
308
|
+
-- consume the same reachability closure.
|
|
309
|
+
|
|
310
|
+
create table DtRvBase (id integer primary key, v integer);
|
|
311
|
+
insert into DtRvBase values (1, 10);
|
|
312
|
+
create view DtRvV as select id, v from DtRvBase;
|
|
313
|
+
create table DtRvRef (id integer primary key, n integer,
|
|
314
|
+
constraint ck_dtrv check (n < (select max(DtRvV.v) from DtRvV)));
|
|
315
|
+
-- run
|
|
316
|
+
|
|
317
|
+
drop table DtRvBase;
|
|
318
|
+
-- error: cannot drop table 'main.DtRvBase': CHECK constraint 'ck_dtrv' on table 'DtRvRef' reaches it through view 'DtRvV' — drop or redefine it first
|
|
319
|
+
|
|
320
|
+
-- Nothing was applied: DtRvRef is still writable AND still enforcing through the view.
|
|
321
|
+
insert into DtRvRef values (1, 1);
|
|
322
|
+
select n from DtRvRef;
|
|
323
|
+
→ [{"n":1}]
|
|
324
|
+
|
|
325
|
+
insert into DtRvRef values (2, 99);
|
|
326
|
+
-- error: ck_dtrv
|
|
327
|
+
|
|
328
|
+
-- Escape hatch, same as §1: remove the reference and the drop goes through.
|
|
329
|
+
alter table DtRvRef drop constraint ck_dtrv;
|
|
330
|
+
drop table DtRvBase;
|
|
331
|
+
drop view DtRvV;
|
|
332
|
+
drop table DtRvRef;
|
|
333
|
+
-- run
|
|
334
|
+
|
|
335
|
+
-- The CHECK need not qualify its column for the refusal to fire: the match is on the
|
|
336
|
+
-- VIEW's body, not the CHECK's, so how the CHECK spells the view's output is irrelevant.
|
|
337
|
+
create table DtRuBase (id integer primary key, v integer);
|
|
338
|
+
create view DtRuV as select id, v from DtRuBase;
|
|
339
|
+
create table DtRuRef (id integer primary key, n integer,
|
|
340
|
+
check (n < (select max(v) from DtRuV)));
|
|
341
|
+
-- run
|
|
342
|
+
|
|
343
|
+
drop table DtRuBase;
|
|
344
|
+
-- error: reaches it through view 'DtRuV'
|
|
345
|
+
|
|
346
|
+
drop table DtRuRef;
|
|
347
|
+
drop view DtRuV;
|
|
348
|
+
drop table DtRuBase;
|
|
349
|
+
-- run
|
|
350
|
+
|
|
351
|
+
-- ===================================================================
|
|
352
|
+
-- 11. Chains of any depth, and the MIDDLE link of one
|
|
353
|
+
-- ===================================================================
|
|
354
|
+
--
|
|
355
|
+
-- One-hop expansion is the natural under-fix, so the chain is pinned two views deep and
|
|
356
|
+
-- the refusal renders the whole path with `->`.
|
|
357
|
+
|
|
358
|
+
create table DtChBase (id integer primary key, v integer);
|
|
359
|
+
create view DtCh1 as select id, v from DtChBase;
|
|
360
|
+
create view DtCh2 as select id, v from DtCh1;
|
|
361
|
+
create table DtChRef (id integer primary key, n integer,
|
|
362
|
+
constraint ck_dtch check (n < (select max(DtCh2.v) from DtCh2)));
|
|
363
|
+
-- run
|
|
364
|
+
|
|
365
|
+
drop table DtChBase;
|
|
366
|
+
-- error: CHECK constraint 'ck_dtch' on table 'DtChRef' reaches it through view 'DtCh2' -> view 'DtCh1'
|
|
367
|
+
|
|
368
|
+
-- The MIDDLE view is protected too, and its path is the shorter prefix. Losing DtCh1
|
|
369
|
+
-- breaks DtChRef exactly as thoroughly as losing the base table would.
|
|
370
|
+
drop view DtCh1;
|
|
371
|
+
-- error: cannot drop view 'main.DtCh1': CHECK constraint 'ck_dtch' on table 'DtChRef' reaches it through view 'DtCh2'
|
|
372
|
+
|
|
373
|
+
-- ...and the view the CHECK names DIRECTLY keeps the direct wording (§6's shape, in a
|
|
374
|
+
-- chain): a direct match carries no path, so no `through` clause is added.
|
|
375
|
+
drop view DtCh2;
|
|
376
|
+
-- error: cannot drop view 'main.DtCh2': it is referenced by CHECK constraint 'ck_dtch' on table 'DtChRef'
|
|
377
|
+
|
|
378
|
+
alter table DtChRef drop constraint ck_dtch;
|
|
379
|
+
drop view DtCh2;
|
|
380
|
+
drop view DtCh1;
|
|
381
|
+
drop table DtChBase;
|
|
382
|
+
drop table DtChRef;
|
|
383
|
+
-- run
|
|
384
|
+
|
|
385
|
+
-- ===================================================================
|
|
386
|
+
-- 12. A materialized view in the chain reads as one
|
|
387
|
+
-- ===================================================================
|
|
388
|
+
--
|
|
389
|
+
-- A materialized view is a table in the catalog, so its body has to be followed like a
|
|
390
|
+
-- view's — and named as what the user declared, or `drop materialized view` is not
|
|
391
|
+
-- obviously the fix.
|
|
392
|
+
|
|
393
|
+
create table DtMvBase (id integer primary key, v integer);
|
|
394
|
+
insert into DtMvBase values (1, 6);
|
|
395
|
+
create materialized view DtMvM as select id, v from DtMvBase;
|
|
396
|
+
create table DtMvRef (id integer primary key, n integer,
|
|
397
|
+
constraint ck_dtmv check (n < (select max(DtMvM.v) from DtMvM)));
|
|
398
|
+
-- run
|
|
399
|
+
|
|
400
|
+
drop table DtMvBase;
|
|
401
|
+
-- error: CHECK constraint 'ck_dtmv' on table 'DtMvRef' reaches it through materialized view 'DtMvM'
|
|
402
|
+
|
|
403
|
+
alter table DtMvRef drop constraint ck_dtmv;
|
|
404
|
+
drop materialized view DtMvM;
|
|
405
|
+
drop table DtMvBase;
|
|
406
|
+
drop table DtMvRef;
|
|
407
|
+
-- run
|
|
408
|
+
|
|
409
|
+
-- The `materialized view` VERB refuses indirectly too, not only the table verb through a
|
|
410
|
+
-- materialized view. §6 pins its DIRECT refusal, §11 pins the middle-link refusal for a
|
|
411
|
+
-- plain view; this is the remaining cell of that verb × directness matrix, and the one
|
|
412
|
+
-- where the object being protected is itself a maintained table rather than a view.
|
|
413
|
+
create table DtMwBase (id integer primary key, v integer);
|
|
414
|
+
create materialized view DtMwM as select id, v from DtMwBase;
|
|
415
|
+
create view DtMwV as select id, v from DtMwM;
|
|
416
|
+
create table DtMwRef (id integer primary key, n integer,
|
|
417
|
+
constraint ck_dtmw check (n < (select max(DtMwV.v) from DtMwV)));
|
|
418
|
+
-- run
|
|
419
|
+
|
|
420
|
+
drop materialized view DtMwM;
|
|
421
|
+
-- error: cannot drop materialized view 'main.DtMwM': CHECK constraint 'ck_dtmw' on table 'DtMwRef' reaches it through view 'DtMwV' — drop or redefine it first
|
|
422
|
+
|
|
423
|
+
alter table DtMwRef drop constraint ck_dtmw;
|
|
424
|
+
drop view DtMwV;
|
|
425
|
+
drop materialized view DtMwM;
|
|
426
|
+
drop table DtMwBase;
|
|
427
|
+
drop table DtMwRef;
|
|
428
|
+
-- run
|
|
429
|
+
|
|
430
|
+
-- ===================================================================
|
|
431
|
+
-- 13. DEFAULT and GENERATED bodies follow chains too
|
|
432
|
+
-- ===================================================================
|
|
433
|
+
--
|
|
434
|
+
-- All three arms run the same probe, so widening one without the others would let
|
|
435
|
+
-- `drop table` disagree with itself depending on which expression kind holds the reference.
|
|
436
|
+
|
|
437
|
+
create table DtDvBase (id integer primary key, v integer);
|
|
438
|
+
insert into DtDvBase values (1, 11);
|
|
439
|
+
create view DtDvV as select id, v from DtDvBase;
|
|
440
|
+
create table DtDvRef (id integer primary key, w integer default ((select min(DtDvV.v) from DtDvV)));
|
|
441
|
+
-- run
|
|
442
|
+
|
|
443
|
+
drop table DtDvBase;
|
|
444
|
+
-- error: the DEFAULT of column 'w' on table 'DtDvRef' reaches it through view 'DtDvV'
|
|
445
|
+
|
|
446
|
+
insert into DtDvRef (id) values (1);
|
|
447
|
+
select id, w from DtDvRef;
|
|
448
|
+
→ [{"id":1,"w":11}]
|
|
449
|
+
|
|
450
|
+
drop table DtDvRef;
|
|
451
|
+
drop view DtDvV;
|
|
452
|
+
drop table DtDvBase;
|
|
453
|
+
-- run
|
|
454
|
+
|
|
455
|
+
create table DtGvBase (id integer primary key, v integer);
|
|
456
|
+
insert into DtGvBase values (1, 12);
|
|
457
|
+
create view DtGvV as select id, v from DtGvBase;
|
|
458
|
+
create table DtGvRef (id integer primary key,
|
|
459
|
+
g integer generated always as ((select max(DtGvV.v) from DtGvV)));
|
|
460
|
+
-- run
|
|
461
|
+
|
|
462
|
+
drop table DtGvBase;
|
|
463
|
+
-- error: the GENERATED expression of column 'g' on table 'DtGvRef' reaches it through view 'DtGvV'
|
|
464
|
+
|
|
465
|
+
drop table DtGvRef;
|
|
466
|
+
drop view DtGvV;
|
|
467
|
+
drop table DtGvBase;
|
|
468
|
+
-- run
|
|
469
|
+
|
|
470
|
+
-- ===================================================================
|
|
471
|
+
-- 14. Cross-schema chains: each body resolves under ITS OWN home schema
|
|
472
|
+
-- ===================================================================
|
|
473
|
+
--
|
|
474
|
+
-- The composition of §9 with §10, and the only shape that proves each reached body is
|
|
475
|
+
-- walked under its own resolver rather than the root expression's.
|
|
476
|
+
|
|
477
|
+
create table main.DtXv (id integer primary key, v integer);
|
|
478
|
+
create view temp.DtXvV as select id, v from main.DtXv;
|
|
479
|
+
create table temp.DtXvRef (id integer primary key, n integer,
|
|
480
|
+
constraint ck_dtxv check (n < (select max(DtXvV.v) from DtXvV)));
|
|
481
|
+
-- run
|
|
482
|
+
|
|
483
|
+
drop table main.DtXv;
|
|
484
|
+
-- error: CHECK constraint 'ck_dtxv' on table 'temp.DtXvRef' reaches it through view 'DtXvV'
|
|
485
|
+
|
|
486
|
+
drop table temp.DtXvRef;
|
|
487
|
+
drop view temp.DtXvV;
|
|
488
|
+
drop table main.DtXv;
|
|
489
|
+
-- run
|
|
490
|
+
|
|
491
|
+
-- The other direction: a bare name inside a `temp` view body that `temp` itself holds
|
|
492
|
+
-- binds temp's table, and says nothing about main's like-named one.
|
|
493
|
+
create table main.DtXd (id integer primary key, v integer);
|
|
494
|
+
create table temp.DtXd (id integer primary key, v integer);
|
|
495
|
+
create view temp.DtXdV as select id, v from DtXd;
|
|
496
|
+
create table temp.DtXdRef (id integer primary key, n integer,
|
|
497
|
+
check (n < (select max(DtXdV.v) from DtXdV)));
|
|
498
|
+
insert into main.DtXd values (1, 7);
|
|
499
|
+
-- run
|
|
500
|
+
|
|
501
|
+
drop table main.DtXd;
|
|
502
|
+
select count(*) as c from temp.DtXdRef;
|
|
503
|
+
→ [{"c":0}]
|
|
504
|
+
|
|
505
|
+
drop table temp.DtXdRef;
|
|
506
|
+
drop view temp.DtXdV;
|
|
507
|
+
drop table temp.DtXd;
|
|
508
|
+
-- run
|
|
509
|
+
|
|
510
|
+
-- ===================================================================
|
|
511
|
+
-- 15. The widening must not start false-refusing
|
|
512
|
+
-- ===================================================================
|
|
513
|
+
--
|
|
514
|
+
-- These are the shapes a name-collecting second walk would have broken. The closure is
|
|
515
|
+
-- scope-aware by construction — it is the read-only run of the walker
|
|
516
|
+
-- `ALTER TABLE … RENAME TO` uses — so each stays allowed.
|
|
517
|
+
--
|
|
518
|
+
-- §5 already pins the first control: a plain view over the table, with nothing reading
|
|
519
|
+
-- the view, does NOT block the drop. Chains change nothing about that.
|
|
520
|
+
|
|
521
|
+
-- A CTE inside the VIEW's body that merely SHADOWS the name is not a reference: the view
|
|
522
|
+
-- really reads DtScSrc, so DtSc is droppable and DtScSrc is not.
|
|
523
|
+
create table DtSc (id integer primary key, v integer);
|
|
524
|
+
create table DtScSrc (id integer primary key, v integer);
|
|
525
|
+
create view DtScV as with DtSc as (select id, v from DtScSrc) select id, v from DtSc;
|
|
526
|
+
create table DtScRef (id integer primary key, n integer,
|
|
527
|
+
check (n < (select max(DtScV.v) from DtScV)));
|
|
528
|
+
-- run
|
|
529
|
+
|
|
530
|
+
drop table DtSc;
|
|
531
|
+
-- run
|
|
532
|
+
|
|
533
|
+
drop table DtScSrc;
|
|
534
|
+
-- error: reaches it through view 'DtScV'
|
|
535
|
+
|
|
536
|
+
drop table DtScRef;
|
|
537
|
+
drop view DtScV;
|
|
538
|
+
drop table DtScSrc;
|
|
539
|
+
-- run
|
|
540
|
+
|
|
541
|
+
-- The row image is not a table: a CHECK's bare `new.` names the row being written, so a
|
|
542
|
+
-- real table called "new" is droppable even though the CHECK's text mentions `new`. The
|
|
543
|
+
-- flag is applied to the ROOT expression only — without it, rooting the closure at a
|
|
544
|
+
-- CHECK would put `new` in the reach and false-refuse its own drop.
|
|
545
|
+
create table "new" (a integer primary key);
|
|
546
|
+
create table DtNwRef (id integer primary key, n integer, check (new.n > 0));
|
|
547
|
+
-- run
|
|
548
|
+
|
|
549
|
+
drop table "new";
|
|
550
|
+
-- run
|
|
551
|
+
|
|
552
|
+
-- ...and a real "new" reached through a view IS still protected, so the suppression is
|
|
553
|
+
-- the row-image qualifier and not the name.
|
|
554
|
+
create table "new" (a integer primary key);
|
|
555
|
+
create view DtNwV as select a from "new";
|
|
556
|
+
create table DtNwRef2 (id integer primary key, n integer,
|
|
557
|
+
check (new.n > (select max(DtNwV.a) from DtNwV)));
|
|
558
|
+
-- run
|
|
559
|
+
|
|
560
|
+
drop table "new";
|
|
561
|
+
-- error: reaches it through view 'DtNwV'
|
|
562
|
+
|
|
563
|
+
drop table DtNwRef2;
|
|
564
|
+
drop view DtNwV;
|
|
565
|
+
drop table "new";
|
|
566
|
+
drop table DtNwRef;
|
|
567
|
+
-- run
|
|
568
|
+
|
|
569
|
+
-- ===================================================================
|
|
570
|
+
-- 16. A `with inverse` expression in a REACHED view body is not a reference
|
|
571
|
+
-- to a table called "new"
|
|
572
|
+
-- ===================================================================
|
|
573
|
+
--
|
|
574
|
+
-- §15 pins the root-body suppression. This is the reached-body pin the closure's
|
|
575
|
+
-- root-only flag used to argue could not exist: `CREATE VIEW` ACCEPTS a body whose
|
|
576
|
+
-- `with inverse (…)` expression holds a bare `new.<x>` (it names an output column of
|
|
577
|
+
-- the enclosing select — docs/sql-select.md § Result-column inverses), so a CHECK
|
|
578
|
+
-- whose reach includes such a view walks a reached body containing an unbound `new.`
|
|
579
|
+
-- qualifier. The walker suppresses the `with inverse` subtree itself, wherever the
|
|
580
|
+
-- walk entered, so the table "new" does not land in the reach and stays droppable.
|
|
581
|
+
|
|
582
|
+
create table "new" (id integer primary key, v integer);
|
|
583
|
+
create table DtIvSrc (id integer primary key, code5 text);
|
|
584
|
+
create view DtIvV as
|
|
585
|
+
select id, case code5 when 'A1' then 'A' end as v
|
|
586
|
+
with inverse (code5 = case new.v when 'A' then 'A1' end)
|
|
587
|
+
from DtIvSrc;
|
|
588
|
+
create table DtIvRef (id integer primary key, n integer,
|
|
589
|
+
constraint ck_dtiv check (n < (select count(*) from DtIvV) + 10));
|
|
590
|
+
-- run
|
|
591
|
+
|
|
592
|
+
drop table "new";
|
|
593
|
+
-- run
|
|
594
|
+
|
|
595
|
+
-- ...and the table the view really reads IS still protected through the chain.
|
|
596
|
+
drop table DtIvSrc;
|
|
597
|
+
-- error: reaches it through view 'DtIvV'
|
|
598
|
+
|
|
599
|
+
drop table DtIvRef;
|
|
600
|
+
drop view DtIvV;
|
|
601
|
+
drop table DtIvSrc;
|
|
602
|
+
-- run
|