@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,143 @@
|
|
|
1
|
+
-- 10.1.6-ddl-transaction-policy-index.sqllogic — the `ddl_transaction_policy` gate over index DDL.
|
|
2
|
+
--
|
|
3
|
+
-- requires-capability: standalone-index-ddl
|
|
4
|
+
--
|
|
5
|
+
-- Carved out of 10.1.4-ddl-transaction-policy: the gate treats every
|
|
6
|
+
-- module-dispatching DDL statement alike (CREATE/DROP TABLE/INDEX, ALTER TABLE,
|
|
7
|
+
-- CREATE/DROP/REFRESH MATERIALIZED VIEW), and 10.1.4 still proves each behavior with
|
|
8
|
+
-- table, ALTER TABLE, materialized-view and `apply schema` statements. This file is
|
|
9
|
+
-- the CREATE/DROP INDEX instance of the same cases, so a backend without standalone
|
|
10
|
+
-- index DDL keeps the rest of the policy coverage.
|
|
11
|
+
--
|
|
12
|
+
-- Runs against every backend (memory, store). Neither declares
|
|
13
|
+
-- ddlTransactionality='transactional', so strict refuses on both; the permissive
|
|
14
|
+
-- section must behave identically on both. Each statement is its own block so an
|
|
15
|
+
-- expected failure is attributed to exactly one statement.
|
|
16
|
+
|
|
17
|
+
-- ===================================
|
|
18
|
+
-- 1. Permissive default: create index inside a transaction is allowed
|
|
19
|
+
-- ===================================
|
|
20
|
+
|
|
21
|
+
create table perm_t (id integer primary key, v text);
|
|
22
|
+
-- run
|
|
23
|
+
begin;
|
|
24
|
+
-- run
|
|
25
|
+
insert into perm_t values (1, 'a');
|
|
26
|
+
-- run
|
|
27
|
+
create index perm_ix on perm_t (v);
|
|
28
|
+
-- run
|
|
29
|
+
insert into perm_t values (2, 'b');
|
|
30
|
+
-- run
|
|
31
|
+
commit;
|
|
32
|
+
-- run
|
|
33
|
+
|
|
34
|
+
select count(*) as cnt from perm_t;
|
|
35
|
+
→ [{ "cnt": 2 }]
|
|
36
|
+
|
|
37
|
+
drop index perm_ix;
|
|
38
|
+
-- run
|
|
39
|
+
|
|
40
|
+
drop table perm_t;
|
|
41
|
+
-- run
|
|
42
|
+
|
|
43
|
+
-- ===================================
|
|
44
|
+
-- 2. strict: create index inside begin is refused; the transaction survives
|
|
45
|
+
-- ===================================
|
|
46
|
+
|
|
47
|
+
pragma ddl_transaction_policy = 'strict';
|
|
48
|
+
-- run
|
|
49
|
+
|
|
50
|
+
create table strict_t (id integer primary key, v text);
|
|
51
|
+
-- run
|
|
52
|
+
insert into strict_t values (1, 'a');
|
|
53
|
+
-- run
|
|
54
|
+
begin;
|
|
55
|
+
-- run
|
|
56
|
+
insert into strict_t values (2, 'b');
|
|
57
|
+
-- run
|
|
58
|
+
create index strict_ix on strict_t (v);
|
|
59
|
+
-- error: ddl_transaction_policy = strict
|
|
60
|
+
|
|
61
|
+
-- The refusal left the transaction open and usable: insert again and commit.
|
|
62
|
+
insert into strict_t values (3, 'c');
|
|
63
|
+
-- run
|
|
64
|
+
commit;
|
|
65
|
+
-- run
|
|
66
|
+
|
|
67
|
+
-- Both buffered rows landed and the index was never created.
|
|
68
|
+
select count(*) as cnt from strict_t;
|
|
69
|
+
→ [{ "cnt": 3 }]
|
|
70
|
+
|
|
71
|
+
-- ===================================
|
|
72
|
+
-- 3. strict: the same statement is allowed OUTSIDE a transaction (autocommit)
|
|
73
|
+
-- ===================================
|
|
74
|
+
|
|
75
|
+
create index strict_ix on strict_t (v);
|
|
76
|
+
-- run
|
|
77
|
+
drop index strict_ix;
|
|
78
|
+
-- run
|
|
79
|
+
|
|
80
|
+
-- ===================================
|
|
81
|
+
-- 4. strict: drop index is refused inside begin (index still present after)
|
|
82
|
+
-- ===================================
|
|
83
|
+
|
|
84
|
+
create index strict_ix2 on strict_t (v);
|
|
85
|
+
-- run
|
|
86
|
+
begin;
|
|
87
|
+
-- run
|
|
88
|
+
drop index strict_ix2;
|
|
89
|
+
-- error: ddl_transaction_policy = strict
|
|
90
|
+
rollback;
|
|
91
|
+
-- run
|
|
92
|
+
drop index strict_ix2;
|
|
93
|
+
-- run
|
|
94
|
+
|
|
95
|
+
-- ===================================
|
|
96
|
+
-- 5. strict: a create-index refusal inside a savepoint leaves the savepoint usable
|
|
97
|
+
-- ===================================
|
|
98
|
+
|
|
99
|
+
create table sp_t (id integer primary key, v text);
|
|
100
|
+
-- run
|
|
101
|
+
insert into sp_t values (1, 'a');
|
|
102
|
+
-- run
|
|
103
|
+
begin;
|
|
104
|
+
-- run
|
|
105
|
+
savepoint sp1;
|
|
106
|
+
-- run
|
|
107
|
+
insert into sp_t values (2, 'b');
|
|
108
|
+
-- run
|
|
109
|
+
create index sp_ix on sp_t (v);
|
|
110
|
+
-- error: ddl_transaction_policy = strict
|
|
111
|
+
|
|
112
|
+
-- The savepoint is still usable: roll back to it (undoing row 2), continue, commit.
|
|
113
|
+
rollback to savepoint sp1;
|
|
114
|
+
-- run
|
|
115
|
+
insert into sp_t values (3, 'c');
|
|
116
|
+
-- run
|
|
117
|
+
commit;
|
|
118
|
+
-- run
|
|
119
|
+
|
|
120
|
+
select id from sp_t order by id;
|
|
121
|
+
→ [{ "id": 1 }, { "id": 3 }]
|
|
122
|
+
|
|
123
|
+
drop table sp_t;
|
|
124
|
+
-- run
|
|
125
|
+
|
|
126
|
+
-- ===================================
|
|
127
|
+
-- 6. Reset to permissive; index DDL inside a transaction works again
|
|
128
|
+
-- ===================================
|
|
129
|
+
|
|
130
|
+
pragma ddl_transaction_policy = 'permissive';
|
|
131
|
+
-- run
|
|
132
|
+
|
|
133
|
+
begin;
|
|
134
|
+
-- run
|
|
135
|
+
create index perm_again_ix on strict_t (v);
|
|
136
|
+
-- run
|
|
137
|
+
commit;
|
|
138
|
+
-- run
|
|
139
|
+
|
|
140
|
+
drop index perm_again_ix;
|
|
141
|
+
-- run
|
|
142
|
+
drop table strict_t;
|
|
143
|
+
-- run
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
-- A literal DEFAULT must be convertible to its own column's declared type.
|
|
2
|
+
--
|
|
3
|
+
-- Before this, `create table t (n integer default 'abc')` was accepted silently,
|
|
4
|
+
-- and the first INSERT relying on the default failed with a type-conversion error
|
|
5
|
+
-- blaming the insert rather than the declaration. `foldDefaultToType` (the same
|
|
6
|
+
-- helper ADD COLUMN / SET NOT NULL backfill already route through) now runs for
|
|
7
|
+
-- every column at CREATE TABLE time, before the module creates any storage.
|
|
8
|
+
|
|
9
|
+
-- ============================================================
|
|
10
|
+
-- 1. An unconvertible literal default rejects CREATE TABLE, across type families
|
|
11
|
+
-- ============================================================
|
|
12
|
+
|
|
13
|
+
create table t_int (id integer primary key, n integer default 'abc');
|
|
14
|
+
-- error: Type conversion failed
|
|
15
|
+
|
|
16
|
+
select name from schema() where type = 'table' and name = 't_int';
|
|
17
|
+
→ []
|
|
18
|
+
|
|
19
|
+
create table t_real (id integer primary key, n real default 'x');
|
|
20
|
+
-- error: Type conversion failed
|
|
21
|
+
|
|
22
|
+
select name from schema() where type = 'table' and name = 't_real';
|
|
23
|
+
→ []
|
|
24
|
+
|
|
25
|
+
create table t_date (id integer primary key, d date default 'not-a-date');
|
|
26
|
+
-- error:
|
|
27
|
+
|
|
28
|
+
select name from schema() where type = 'table' and name = 't_date';
|
|
29
|
+
→ []
|
|
30
|
+
|
|
31
|
+
create table t_json (id integer primary key, j json default '{');
|
|
32
|
+
-- error:
|
|
33
|
+
|
|
34
|
+
select name from schema() where type = 'table' and name = 't_json';
|
|
35
|
+
→ []
|
|
36
|
+
|
|
37
|
+
-- ============================================================
|
|
38
|
+
-- 2. Convertible literals are still accepted, and stored already converted
|
|
39
|
+
-- ============================================================
|
|
40
|
+
|
|
41
|
+
create table t_conv (id integer primary key, n integer default '7', r real default -123.0);
|
|
42
|
+
insert into t_conv (id) values (1);
|
|
43
|
+
select n, typeof(n) as tn, r, typeof(r) as tr from t_conv where id = 1;
|
|
44
|
+
→ [{"n":7,"tn":"integer","r":-123,"tr":"integer"}]
|
|
45
|
+
drop table t_conv;
|
|
46
|
+
-- run
|
|
47
|
+
|
|
48
|
+
-- ============================================================
|
|
49
|
+
-- 3. Non-foldable defaults are untouched — deferred to write time exactly as before
|
|
50
|
+
-- ============================================================
|
|
51
|
+
|
|
52
|
+
-- A function call.
|
|
53
|
+
create table t_fn (id integer primary key, n integer default (abs(-3)));
|
|
54
|
+
insert into t_fn (id) values (1);
|
|
55
|
+
select n from t_fn where id = 1;
|
|
56
|
+
→ [{"n":3}]
|
|
57
|
+
drop table t_fn;
|
|
58
|
+
-- run
|
|
59
|
+
|
|
60
|
+
-- A `new.<col>` reference to a sibling.
|
|
61
|
+
create table t_newref (id integer primary key, base integer, doubled integer default (new.base * 2));
|
|
62
|
+
insert into t_newref (id, base) values (1, 10);
|
|
63
|
+
select doubled from t_newref where id = 1;
|
|
64
|
+
→ [{"doubled":20}]
|
|
65
|
+
drop table t_newref;
|
|
66
|
+
-- run
|
|
67
|
+
|
|
68
|
+
-- A mutation-context variable default — not a literal, folds to `undefined`, and
|
|
69
|
+
-- stays deferred; must not be confused with a NULL default.
|
|
70
|
+
create table t_ctx (id integer primary key, n integer default markup) using memory with context (markup integer);
|
|
71
|
+
insert into t_ctx (id) with context markup = 42 values (1);
|
|
72
|
+
select n from t_ctx where id = 1;
|
|
73
|
+
→ [{"n":42}]
|
|
74
|
+
drop table t_ctx;
|
|
75
|
+
-- run
|
|
76
|
+
|
|
77
|
+
-- ============================================================
|
|
78
|
+
-- 4. NULL default is always acceptable, on any type, and is not confused with a
|
|
79
|
+
-- non-foldable (deferred) default.
|
|
80
|
+
-- ============================================================
|
|
81
|
+
|
|
82
|
+
create table t_null (id integer primary key, n integer null default null, d date null default null);
|
|
83
|
+
insert into t_null (id) values (1);
|
|
84
|
+
select n, d from t_null where id = 1;
|
|
85
|
+
→ [{"n":null,"d":null}]
|
|
86
|
+
drop table t_null;
|
|
87
|
+
-- run
|
|
88
|
+
|
|
89
|
+
-- ============================================================
|
|
90
|
+
-- 5. `any`-typed columns accept every literal — the fold must not start rejecting them.
|
|
91
|
+
-- ============================================================
|
|
92
|
+
|
|
93
|
+
create table t_any (id integer primary key, v any default 'abc');
|
|
94
|
+
insert into t_any (id) values (1);
|
|
95
|
+
select v from t_any where id = 1;
|
|
96
|
+
→ [{"v":"abc"}]
|
|
97
|
+
drop table t_any;
|
|
98
|
+
-- run
|
|
99
|
+
|
|
100
|
+
-- ============================================================
|
|
101
|
+
-- 6. `apply schema` (declarative-schema DDL) routes through the same createTable
|
|
102
|
+
-- guard — a migration carrying a bad default fails the migration rather than
|
|
103
|
+
-- deploying it.
|
|
104
|
+
-- ============================================================
|
|
105
|
+
|
|
106
|
+
declare schema xd_bad {
|
|
107
|
+
table t_migrated {
|
|
108
|
+
id INTEGER PRIMARY KEY,
|
|
109
|
+
n INTEGER DEFAULT 'abc'
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
-- run
|
|
114
|
+
|
|
115
|
+
apply schema xd_bad;
|
|
116
|
+
-- error: Type conversion failed
|
|
117
|
+
|
|
118
|
+
select name from schema() where type = 'table' and name = 't_migrated';
|
|
119
|
+
→ []
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
-- ALTER TABLE … ADD CONSTRAINT … CHECK validates the rows already in the table.
|
|
2
|
+
--
|
|
3
|
+
-- The store leg matters as much as the memory leg: the validation is the ENGINE's,
|
|
4
|
+
-- run before the module is dispatched to (runtime/emit/add-constraint.ts), so both
|
|
5
|
+
-- backends must answer identically and a rejected ADD must persist nothing (the
|
|
6
|
+
-- store's addConstraint arm saves the table's DDL). Companion to the per-package
|
|
7
|
+
-- conformance legs' tightening suites and to test/alter-add-constraint.spec.ts
|
|
8
|
+
-- (memory; the full `new.` / `old.` / opt-out matrix).
|
|
9
|
+
--
|
|
10
|
+
-- Why this is a wrong-result guard and not tidiness: the optimizer treats a declared
|
|
11
|
+
-- CHECK as a proven fact about every stored row and folds contradicting predicates
|
|
12
|
+
-- away, so a grandfathered violator would vanish from `where n <= 0` while still
|
|
13
|
+
-- being stored. Section 2 states the property that fold depends on.
|
|
14
|
+
|
|
15
|
+
-- ===================================================================
|
|
16
|
+
-- 1. A violating row rejects; the table is untouched; nothing enforces forward.
|
|
17
|
+
-- ===================================================================
|
|
18
|
+
|
|
19
|
+
create table AcV (id integer primary key, n integer null);
|
|
20
|
+
insert into AcV values (1, -5), (2, 7);
|
|
21
|
+
|
|
22
|
+
alter table AcV add constraint c_pos check (n > 0);
|
|
23
|
+
-- error: CHECK constraint failed: c_pos
|
|
24
|
+
|
|
25
|
+
select count(*) as k from check_constraint_info('AcV');
|
|
26
|
+
→ [{"k":0}]
|
|
27
|
+
|
|
28
|
+
insert into AcV values (3, -1);
|
|
29
|
+
select id from AcV where n <= 0 order by id;
|
|
30
|
+
→ [{"id":1},{"id":3}]
|
|
31
|
+
|
|
32
|
+
-- ===================================================================
|
|
33
|
+
-- 2. Once the table conforms the same ADD succeeds and enforces forward — and a
|
|
34
|
+
-- query contradicting the CHECK agrees with the stored rows.
|
|
35
|
+
-- ===================================================================
|
|
36
|
+
|
|
37
|
+
delete from AcV where n <= 0;
|
|
38
|
+
alter table AcV add constraint c_pos check (n > 0);
|
|
39
|
+
select name from check_constraint_info('AcV');
|
|
40
|
+
→ [{"name":"c_pos"}]
|
|
41
|
+
|
|
42
|
+
insert into AcV values (4, 0);
|
|
43
|
+
-- error: CHECK constraint failed: c_pos
|
|
44
|
+
|
|
45
|
+
select count(*) as k from AcV where n <= 0;
|
|
46
|
+
→ [{"k":0}]
|
|
47
|
+
|
|
48
|
+
-- ===================================================================
|
|
49
|
+
-- 3. NULL passes a CHECK, so a NULL row is not a violation.
|
|
50
|
+
-- ===================================================================
|
|
51
|
+
|
|
52
|
+
create table AcN (id integer primary key, n integer null);
|
|
53
|
+
insert into AcN values (1, null);
|
|
54
|
+
alter table AcN add constraint c check (n > 0);
|
|
55
|
+
select name from check_constraint_info('AcN');
|
|
56
|
+
→ [{"name":"c"}]
|
|
57
|
+
|
|
58
|
+
-- ===================================================================
|
|
59
|
+
-- 4. `new.<col>` names the stored row and is validated like the bare spelling; a
|
|
60
|
+
-- conjunct referencing `old.<col>` is a transition rule about the previous row
|
|
61
|
+
-- image — it cannot be judged from a row sitting still, so it is skipped without
|
|
62
|
+
-- blocking the statement, while its `old.`-free siblings are still validated.
|
|
63
|
+
-- ===================================================================
|
|
64
|
+
|
|
65
|
+
create table AcQ (id integer primary key, n integer null, status text null);
|
|
66
|
+
insert into AcQ values (1, -5, 'z');
|
|
67
|
+
|
|
68
|
+
alter table AcQ add constraint c_new check (new.n > 0);
|
|
69
|
+
-- error: CHECK constraint failed: c_new
|
|
70
|
+
|
|
71
|
+
alter table AcQ add constraint c_old check (old.n is null or n >= old.n);
|
|
72
|
+
select name from check_constraint_info('AcQ');
|
|
73
|
+
→ [{"name":"c_old"}]
|
|
74
|
+
|
|
75
|
+
alter table AcQ add constraint c_mix check ((old.id is null or id = old.id) and status in ('a', 'i'));
|
|
76
|
+
-- error: CHECK constraint failed: c_mix
|
|
77
|
+
|
|
78
|
+
update AcQ set status = 'a' where id = 1;
|
|
79
|
+
alter table AcQ add constraint c_mix check ((old.id is null or id = old.id) and status in ('a', 'i'));
|
|
80
|
+
select name from check_constraint_info('AcQ') order by name;
|
|
81
|
+
→ [{"name":"c_mix"},{"name":"c_old"}]
|
|
82
|
+
|
|
83
|
+
-- ===================================================================
|
|
84
|
+
-- 5. A partial-mask CHECK is not a row invariant — a row can legally be stored in
|
|
85
|
+
-- violation of it (inserted under an update-only one, updated under an
|
|
86
|
+
-- insert-only one, anything under a delete-only one) — so existing rows owe it
|
|
87
|
+
-- nothing, it is not validated, and the optimizer lifts nothing from it: the
|
|
88
|
+
-- violator stays visible to the contradicting query.
|
|
89
|
+
-- ===================================================================
|
|
90
|
+
|
|
91
|
+
create table AcD (id integer primary key, n integer null);
|
|
92
|
+
insert into AcD values (1, -5);
|
|
93
|
+
alter table AcD add constraint c_del check on delete (n > 0);
|
|
94
|
+
alter table AcD add constraint c_ins check on insert (n > 0);
|
|
95
|
+
alter table AcD add constraint c_upd check on update (n > 0);
|
|
96
|
+
select name from check_constraint_info('AcD') order by name;
|
|
97
|
+
→ [{"name":"c_del"},{"name":"c_ins"},{"name":"c_upd"}]
|
|
98
|
+
select id from AcD where n <= 0;
|
|
99
|
+
→ [{"id":1}]
|
|
100
|
+
|
|
101
|
+
-- ===================================================================
|
|
102
|
+
-- 6. The ADD COLUMN sibling shares the scan: an inline `check (new.<col> …)` is a
|
|
103
|
+
-- constraint rejection, not an unknown-column error, and the column is not added.
|
|
104
|
+
-- ===================================================================
|
|
105
|
+
|
|
106
|
+
create table AcC (id integer primary key);
|
|
107
|
+
insert into AcC values (1);
|
|
108
|
+
|
|
109
|
+
alter table AcC add column v integer default -1 check (new.v > 0);
|
|
110
|
+
-- error: CHECK constraint '_check_v' violated by backfilled rows
|
|
111
|
+
|
|
112
|
+
select name from table_info('AcC');
|
|
113
|
+
→ [{"name":"id"}]
|
|
114
|
+
|
|
115
|
+
alter table AcC add column v integer default 1 check (new.v > 0);
|
|
116
|
+
insert into AcC values (2, 0);
|
|
117
|
+
-- error: CHECK constraint failed: _check_v
|