@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,440 @@
|
|
|
1
|
+
-- 51.8-maintained-table-declared-constraints.sqllogic — declared CHECK and
|
|
2
|
+
-- child-side FK constraints on a `create table … maintained as` table are
|
|
3
|
+
-- validated against the rows the DERIVATION writes: the create-fill, the
|
|
4
|
+
-- attach/re-attach reconcile, and steady-state row-time maintenance. The
|
|
5
|
+
-- writing statement fails with a diagnostic attributed to the maintained
|
|
6
|
+
-- table (the statement itself targeted a different table). A `delete` delta
|
|
7
|
+
-- writes no row image and is never CHECK-validated.
|
|
8
|
+
|
|
9
|
+
-- ===================================
|
|
10
|
+
-- 1. create-fill validates declared CHECK (bulk scan), rolls back cleanly
|
|
11
|
+
-- ===================================
|
|
12
|
+
|
|
13
|
+
create table src (id integer primary key, v text not null);
|
|
14
|
+
insert into src values (1, 'bad');
|
|
15
|
+
|
|
16
|
+
create table mt (id integer primary key, v text not null check (v <> 'bad')) maintained as select id, v from src;
|
|
17
|
+
-- error: row derived into maintained table 'main.mt'
|
|
18
|
+
|
|
19
|
+
-- the failed create left nothing behind: the name is free for a plain create
|
|
20
|
+
create table mt (id integer primary key);
|
|
21
|
+
drop table mt;
|
|
22
|
+
|
|
23
|
+
-- ===================================
|
|
24
|
+
-- 2. steady-state maintenance validates the delta (insert and update images)
|
|
25
|
+
-- ===================================
|
|
26
|
+
|
|
27
|
+
update src set v = 'ok' where id = 1;
|
|
28
|
+
create table mt (id integer primary key, v text not null check (v <> 'bad')) maintained as select id, v from src;
|
|
29
|
+
|
|
30
|
+
insert into src values (2, 'bad');
|
|
31
|
+
-- error: row derived into maintained table 'main.mt'
|
|
32
|
+
|
|
33
|
+
-- the violating source statement rolled back whole
|
|
34
|
+
select count(*) as n from src;
|
|
35
|
+
→ [{"n":1}]
|
|
36
|
+
select * from mt order by id;
|
|
37
|
+
→ [{"id":1,"v":"ok"}]
|
|
38
|
+
|
|
39
|
+
-- a derived UPDATE image is validated too
|
|
40
|
+
insert into src values (2, 'fine');
|
|
41
|
+
update src set v = 'bad' where id = 2;
|
|
42
|
+
-- error: row derived into maintained table 'main.mt'
|
|
43
|
+
select v from mt where id = 2;
|
|
44
|
+
→ [{"v":"fine"}]
|
|
45
|
+
|
|
46
|
+
-- deletes write no row image: removing a source row never CHECK-validates
|
|
47
|
+
delete from src where id = 2;
|
|
48
|
+
select count(*) as n from mt;
|
|
49
|
+
→ [{"n":1}]
|
|
50
|
+
|
|
51
|
+
-- conforming maintenance still flows
|
|
52
|
+
insert into src values (3, 'good');
|
|
53
|
+
select count(*) as n from mt;
|
|
54
|
+
→ [{"n":2}]
|
|
55
|
+
|
|
56
|
+
-- ===================================
|
|
57
|
+
-- 3. child-side FK existence: create-fill, steady state, MATCH SIMPLE, pragma
|
|
58
|
+
-- ===================================
|
|
59
|
+
|
|
60
|
+
create table parent (pid integer primary key);
|
|
61
|
+
insert into parent values (1);
|
|
62
|
+
create table csrc (id integer primary key, ref integer null);
|
|
63
|
+
insert into csrc values (10, 2);
|
|
64
|
+
|
|
65
|
+
-- create-fill: a derived row referencing a missing parent fails the create
|
|
66
|
+
create table mfk (id integer primary key, ref integer null references parent(pid)) maintained as select id, ref from csrc;
|
|
67
|
+
-- error: row derived into maintained table 'main.mfk' references a missing 'main.parent'
|
|
68
|
+
|
|
69
|
+
update csrc set ref = 1 where id = 10;
|
|
70
|
+
create table mfk (id integer primary key, ref integer null references parent(pid)) maintained as select id, ref from csrc;
|
|
71
|
+
|
|
72
|
+
-- MATCH SIMPLE: a NULL FK column is admitted regardless of parent presence
|
|
73
|
+
insert into csrc values (11, null);
|
|
74
|
+
select count(*) as n from mfk;
|
|
75
|
+
→ [{"n":2}]
|
|
76
|
+
|
|
77
|
+
-- steady state: an orphan-producing source write fails (deferred to the
|
|
78
|
+
-- statement's autocommit, exactly as on an ordinary table)
|
|
79
|
+
insert into csrc values (12, 99);
|
|
80
|
+
-- error: row derived into maintained table 'main.mfk' references a missing 'main.parent'
|
|
81
|
+
select count(*) as n from csrc;
|
|
82
|
+
→ [{"n":2}]
|
|
83
|
+
|
|
84
|
+
-- pragma off: the orphan is admitted (FK evaluation is gated at eval time)
|
|
85
|
+
pragma foreign_keys = false;
|
|
86
|
+
insert into csrc values (13, 77);
|
|
87
|
+
select count(*) as n from mfk;
|
|
88
|
+
→ [{"n":3}]
|
|
89
|
+
|
|
90
|
+
-- pragma back on: the NEW delta validates; the pre-existing orphan (13) is
|
|
91
|
+
-- NOT retro-validated (matches ordinary tables — no retro-check on pragma flip)
|
|
92
|
+
pragma foreign_keys = true;
|
|
93
|
+
insert into csrc values (14, 88);
|
|
94
|
+
-- error: row derived into maintained table 'main.mfk' references a missing 'main.parent'
|
|
95
|
+
delete from csrc where id = 13;
|
|
96
|
+
|
|
97
|
+
-- ===================================
|
|
98
|
+
-- 4. subquery-bearing CHECK defers to commit with maintained-table attribution
|
|
99
|
+
-- ===================================
|
|
100
|
+
|
|
101
|
+
create table quota (k integer primary key, lim integer not null);
|
|
102
|
+
insert into quota values (1, 1);
|
|
103
|
+
create table qsrc (id integer primary key, n integer not null);
|
|
104
|
+
insert into qsrc values (1, 1);
|
|
105
|
+
|
|
106
|
+
create table mq (id integer primary key, n integer not null check (n <= (select lim from quota where k = 1))) maintained as select id, n from qsrc;
|
|
107
|
+
|
|
108
|
+
insert into qsrc values (2, 5);
|
|
109
|
+
-- error: row derived into maintained table 'main.mq'
|
|
110
|
+
select count(*) as n from qsrc;
|
|
111
|
+
→ [{"n":1}]
|
|
112
|
+
|
|
113
|
+
-- ===================================
|
|
114
|
+
-- 5. CHECK op-mask collapse: a derived row image is neither a user INSERT nor
|
|
115
|
+
-- UPDATE, so any CHECK touching insert|update applies to every written image
|
|
116
|
+
-- ===================================
|
|
117
|
+
|
|
118
|
+
create table usrc (id integer primary key, v text not null);
|
|
119
|
+
create table mu (id integer primary key, v text not null check on update (v <> 'nope')) maintained as select id, v from usrc;
|
|
120
|
+
-- an `on update` CHECK fires on a derived INSERT image
|
|
121
|
+
insert into usrc values (1, 'nope');
|
|
122
|
+
-- error: row derived into maintained table 'main.mu'
|
|
123
|
+
|
|
124
|
+
create table isrc (id integer primary key, v text not null);
|
|
125
|
+
insert into isrc values (1, 'fine');
|
|
126
|
+
create table mi (id integer primary key, v text not null check on insert (v <> 'nope')) maintained as select id, v from isrc;
|
|
127
|
+
-- an `on insert` CHECK fires on a derived UPDATE image
|
|
128
|
+
update isrc set v = 'nope' where id = 1;
|
|
129
|
+
-- error: row derived into maintained table 'main.mi'
|
|
130
|
+
|
|
131
|
+
-- a delete-only CHECK never applies to derivation writes
|
|
132
|
+
create table dsrc (id integer primary key, v text not null);
|
|
133
|
+
create table md (id integer primary key, v text not null check on delete (v <> 'x')) maintained as select id, v from dsrc;
|
|
134
|
+
insert into dsrc values (1, 'x');
|
|
135
|
+
select count(*) as n from md;
|
|
136
|
+
→ [{"n":1}]
|
|
137
|
+
|
|
138
|
+
-- ===================================
|
|
139
|
+
-- 6. attach / re-attach reconcile validation
|
|
140
|
+
-- ===================================
|
|
141
|
+
|
|
142
|
+
-- a violating PRE-EXISTING row the derivation does not reproduce is simply
|
|
143
|
+
-- deleted by the derived-wins reconcile and never validated. (It slipped in
|
|
144
|
+
-- via an op-masked `check on update`, which user INSERT does not evaluate.)
|
|
145
|
+
create table b1 (id integer primary key, v text not null);
|
|
146
|
+
insert into b1 values (1, 'ok');
|
|
147
|
+
create table tgt (id integer primary key, v text not null check on update (v <> 'stale-bad'));
|
|
148
|
+
insert into tgt values (1, 'ok'), (9, 'stale-bad');
|
|
149
|
+
alter table tgt set maintained as select id, v from b1;
|
|
150
|
+
select * from tgt order by id;
|
|
151
|
+
→ [{"id":1,"v":"ok"}]
|
|
152
|
+
|
|
153
|
+
-- a derivation that REPRODUCES a violator fails the attach (the op-mask
|
|
154
|
+
-- collapse validates the derived image against the on-update CHECK too)
|
|
155
|
+
alter table tgt drop maintained;
|
|
156
|
+
create table b2 (id integer primary key, v text not null);
|
|
157
|
+
insert into b2 values (9, 'stale-bad');
|
|
158
|
+
alter table tgt set maintained as select id, v from b2;
|
|
159
|
+
-- error: row derived into maintained table 'main.tgt'
|
|
160
|
+
|
|
161
|
+
-- the failed attach left the table plain and intact
|
|
162
|
+
insert into tgt values (2, 'still writable');
|
|
163
|
+
select count(*) as n from tgt;
|
|
164
|
+
→ [{"n":2}]
|
|
165
|
+
|
|
166
|
+
-- re-attach failure restores the PRIOR derivation (and its row-time plan)
|
|
167
|
+
create table a1 (id integer primary key, v text not null);
|
|
168
|
+
insert into a1 values (1, 'good');
|
|
169
|
+
create table a2 (id integer primary key, v text not null);
|
|
170
|
+
insert into a2 values (1, 'evil');
|
|
171
|
+
create table mr (id integer primary key, v text not null check (v <> 'evil')) maintained as select id, v from a1;
|
|
172
|
+
alter table mr set maintained as select id, v from a2;
|
|
173
|
+
-- error: row derived into maintained table 'main.mr'
|
|
174
|
+
select * from mr;
|
|
175
|
+
→ [{"id":1,"v":"good"}]
|
|
176
|
+
-- the prior derivation is still live: an a1 write maintains mr
|
|
177
|
+
insert into a1 values (2, 'more');
|
|
178
|
+
select count(*) as n from mr;
|
|
179
|
+
→ [{"n":2}]
|
|
180
|
+
|
|
181
|
+
-- ===================================
|
|
182
|
+
-- 7. MV-over-MV cascade: each level validates with its OWN evaluator
|
|
183
|
+
-- ===================================
|
|
184
|
+
|
|
185
|
+
create table base (id integer primary key, v text not null);
|
|
186
|
+
insert into base values (1, 'ok');
|
|
187
|
+
create table mt1 (id integer primary key, v text not null) maintained as select id, v from base;
|
|
188
|
+
create table mt2 (id integer primary key, v text not null check (v <> 'poison')) maintained as select id, v from mt1;
|
|
189
|
+
|
|
190
|
+
insert into base values (2, 'poison');
|
|
191
|
+
-- error: row derived into maintained table 'main.mt2'
|
|
192
|
+
select count(*) as n from base;
|
|
193
|
+
→ [{"n":1}]
|
|
194
|
+
select count(*) as n from mt2;
|
|
195
|
+
→ [{"n":1}]
|
|
196
|
+
|
|
197
|
+
-- ===================================
|
|
198
|
+
-- 8. full-rebuild floor: the rebuild diff validates once at the statement flush
|
|
199
|
+
-- ===================================
|
|
200
|
+
|
|
201
|
+
-- (integer PK: a text PK would collate NOCASE under the store backend and fail
|
|
202
|
+
-- the attach shape check before validation is ever reached)
|
|
203
|
+
create table fsrc (id integer primary key, n integer not null);
|
|
204
|
+
insert into fsrc values (1, 10);
|
|
205
|
+
-- DISTINCT falls to the full-rebuild arm
|
|
206
|
+
create table mfr (n integer not null primary key check (n < 100)) maintained as select distinct n from fsrc;
|
|
207
|
+
|
|
208
|
+
insert into fsrc values (2, 500), (3, 20);
|
|
209
|
+
-- error: row derived into maintained table 'main.mfr'
|
|
210
|
+
select count(*) as n from fsrc;
|
|
211
|
+
→ [{"n":1}]
|
|
212
|
+
select * from mfr order by n;
|
|
213
|
+
→ [{"n":10}]
|
|
214
|
+
|
|
215
|
+
-- ===================================
|
|
216
|
+
-- 9. detach: every committed row already satisfies the constraints, which
|
|
217
|
+
-- become user-enforced — no stranded violators
|
|
218
|
+
-- ===================================
|
|
219
|
+
|
|
220
|
+
alter table mt drop maintained;
|
|
221
|
+
update mt set v = 'bad' where id = 1;
|
|
222
|
+
-- error: CHECK constraint failed
|
|
223
|
+
update mt set v = 'still ok' where id = 1;
|
|
224
|
+
select v from mt where id = 1;
|
|
225
|
+
→ [{"v":"still ok"}]
|
|
226
|
+
|
|
227
|
+
-- ===================================
|
|
228
|
+
-- 10. zero-overhead regression: constraint-less maintained tables and the
|
|
229
|
+
-- MV sugar behave exactly as before
|
|
230
|
+
-- ===================================
|
|
231
|
+
|
|
232
|
+
create table z (id integer primary key, v text not null);
|
|
233
|
+
insert into z values (1, 'zz');
|
|
234
|
+
create table mz (id integer primary key, v text not null) maintained as select id, v from z;
|
|
235
|
+
create materialized view vz as select id, v from z;
|
|
236
|
+
insert into z values (2, 'yy');
|
|
237
|
+
select count(*) as n from mz;
|
|
238
|
+
→ [{"n":2}]
|
|
239
|
+
select count(*) as n from vz;
|
|
240
|
+
→ [{"n":2}]
|
|
241
|
+
|
|
242
|
+
-- ===================================
|
|
243
|
+
-- 11. a CHECK referencing OLD/NEW row images is rejected at registration:
|
|
244
|
+
-- a derived row has no OLD image (a transition CHECK would be vacuous) and
|
|
245
|
+
-- NEW is the row itself (expressible unqualified)
|
|
246
|
+
-- ===================================
|
|
247
|
+
|
|
248
|
+
create table osrc (id integer primary key, v integer not null);
|
|
249
|
+
create table mo (id integer primary key, v integer not null, check on update (new.v > old.v)) maintained as select id, v from osrc;
|
|
250
|
+
-- error: references OLD/NEW row images
|
|
251
|
+
|
|
252
|
+
-- the failed create left the name free
|
|
253
|
+
create table mo (id integer primary key);
|
|
254
|
+
drop table mo;
|
|
255
|
+
|
|
256
|
+
-- the attach form rejects too, restoring the plain table (still writable,
|
|
257
|
+
-- and its qualified CHECK still enforces on user DML)
|
|
258
|
+
create table mo2 (id integer primary key, v integer not null, check (new.v > 0));
|
|
259
|
+
alter table mo2 set maintained as select id, v from osrc;
|
|
260
|
+
-- error: references OLD/NEW row images
|
|
261
|
+
insert into mo2 values (1, 5);
|
|
262
|
+
insert into mo2 values (2, -1);
|
|
263
|
+
-- error: CHECK constraint failed
|
|
264
|
+
select count(*) as n from mo2;
|
|
265
|
+
→ [{"n":1}]
|
|
266
|
+
|
|
267
|
+
-- a delete-only CHECK with image qualifiers is exempt (never fires on
|
|
268
|
+
-- derivation writes)
|
|
269
|
+
create table mo3 (id integer primary key, v integer not null, check on delete (old.v < 100)) maintained as select id, v from osrc;
|
|
270
|
+
insert into osrc values (1, 500);
|
|
271
|
+
select count(*) as n from mo3;
|
|
272
|
+
→ [{"n":1}]
|
|
273
|
+
|
|
274
|
+
-- ===================================
|
|
275
|
+
-- 12. constraint-dependency DDL: rename/drop/re-create of a CONSTRAINT-ONLY
|
|
276
|
+
-- dependency (FK parent / subquery-CHECK target — neither a derivation source)
|
|
277
|
+
-- rebuilds the compiled derived-row validator. Before the fix the once-compiled
|
|
278
|
+
-- validator went stale and maintenance writes failed with an internal
|
|
279
|
+
-- "Module 'memory' connect failed … not found" error.
|
|
280
|
+
-- ===================================
|
|
281
|
+
|
|
282
|
+
-- FK parent RENAME: the maintained table's own FK is rewritten in place; the
|
|
283
|
+
-- rebuilt validator resolves existence against the renamed parent
|
|
284
|
+
create table rparent (pid integer primary key);
|
|
285
|
+
create table rsrc (id integer primary key, ref integer null);
|
|
286
|
+
create table rmt (id integer primary key, ref integer null references rparent(pid)) maintained as select id, ref from rsrc;
|
|
287
|
+
insert into rparent values (10);
|
|
288
|
+
alter table rparent rename to rparent2;
|
|
289
|
+
insert into rsrc values (1, 10);
|
|
290
|
+
select * from rmt order by id;
|
|
291
|
+
→ [{"id":1,"ref":10}]
|
|
292
|
+
-- an orphan fails with the FK attribution against the RENAMED parent (not internal)
|
|
293
|
+
insert into rsrc values (2, 99);
|
|
294
|
+
-- error: row derived into maintained table 'main.rmt' references a missing 'main.rparent2'
|
|
295
|
+
select count(*) as n from rmt;
|
|
296
|
+
→ [{"n":1}]
|
|
297
|
+
|
|
298
|
+
-- FK parent DROP: the rebuild emits the absent-parent null-guards fallback — a
|
|
299
|
+
-- non-NULL ref fails the maintained-table FK CONSTRAINT (NOT an internal connect
|
|
300
|
+
-- error), a NULL ref is admitted under MATCH SIMPLE
|
|
301
|
+
create table xparent (pid integer primary key);
|
|
302
|
+
create table xsrc (id integer primary key, ref integer null);
|
|
303
|
+
create table xmt (id integer primary key, ref integer null references xparent(pid)) maintained as select id, ref from xsrc;
|
|
304
|
+
drop table xparent;
|
|
305
|
+
insert into xsrc values (1, 5);
|
|
306
|
+
-- error: row derived into maintained table 'main.xmt' references a missing 'main.xparent'
|
|
307
|
+
insert into xsrc values (2, null);
|
|
308
|
+
select * from xmt order by id;
|
|
309
|
+
→ [{"id":2,"ref":null}]
|
|
310
|
+
|
|
311
|
+
-- subquery-CHECK target DROP: REFUSED. A maintained table's declared CHECK is a
|
|
312
|
+
-- stored expression like any other, so dropping the table its subquery reads is
|
|
313
|
+
-- refused naming the maintained table and the constraint
|
|
314
|
+
-- (41.10.4-drop-object-expression-dependents). This used to be accepted and left
|
|
315
|
+
-- the validator poisoned — the next write failed with a bare
|
|
316
|
+
-- `Table 'fquota' not found`, naming neither the maintained table nor the CHECK.
|
|
317
|
+
-- The poisoned-validator fallback the rebuild carries is now defensive only: no
|
|
318
|
+
-- user-facing DDL statement can reach it.
|
|
319
|
+
create table fquota (k integer primary key, lim integer not null);
|
|
320
|
+
insert into fquota values (1, 100);
|
|
321
|
+
create table fqsrc (id integer primary key, n integer not null);
|
|
322
|
+
create table fmq (id integer primary key, n integer not null check (n <= (select lim from fquota where k = 1))) maintained as select id, n from fqsrc;
|
|
323
|
+
drop table fquota;
|
|
324
|
+
-- error: it is referenced by CHECK constraint '_check_n' on table 'fmq'
|
|
325
|
+
|
|
326
|
+
-- Nothing was applied, so the CHECK still compiles and still enforces.
|
|
327
|
+
insert into fqsrc values (1, 5);
|
|
328
|
+
select * from fmq order by id;
|
|
329
|
+
→ [{"id":1,"n":5}]
|
|
330
|
+
insert into fqsrc values (2, 500);
|
|
331
|
+
-- error: row derived into maintained table 'main.fmq'
|
|
332
|
+
select count(*) as n from fmq;
|
|
333
|
+
→ [{"n":1}]
|
|
334
|
+
|
|
335
|
+
-- Escape hatch: drop the maintained table (which takes its CHECK with it), then
|
|
336
|
+
-- the target goes freely.
|
|
337
|
+
drop table fmq;
|
|
338
|
+
drop table fquota;
|
|
339
|
+
-- run
|
|
340
|
+
|
|
341
|
+
-- subquery-CHECK target RENAME: the CHECK AST is rewritten in place and the
|
|
342
|
+
-- rebuilt validator re-resolves against the renamed target
|
|
343
|
+
create table gquota (k integer primary key, lim integer not null);
|
|
344
|
+
insert into gquota values (1, 100);
|
|
345
|
+
create table gqsrc (id integer primary key, n integer not null);
|
|
346
|
+
create table gmq (id integer primary key, n integer not null check (n <= (select lim from gquota where k = 1))) maintained as select id, n from gqsrc;
|
|
347
|
+
alter table gquota rename to gquota2;
|
|
348
|
+
insert into gqsrc values (1, 5);
|
|
349
|
+
select * from gmq order by id;
|
|
350
|
+
→ [{"id":1,"n":5}]
|
|
351
|
+
insert into gqsrc values (2, 500);
|
|
352
|
+
-- error: row derived into maintained table 'main.gmq'
|
|
353
|
+
select count(*) as n from gmq;
|
|
354
|
+
→ [{"n":1}]
|
|
355
|
+
|
|
356
|
+
-- No self-heal case here any more. It used to read `drop table hquota;` followed by a
|
|
357
|
+
-- re-`create table hquota`, asserting that the `table_added` rebuild restored healthy
|
|
358
|
+
-- validation. Both halves are unreachable from SQL now: the drop is refused
|
|
359
|
+
-- (41.10.4-drop-object-expression-dependents), and the maintained table cannot be
|
|
360
|
+
-- declared against an absent CHECK target either — `create table … check ((select lim
|
|
361
|
+
-- from hquota …)) maintained as …` fails at build time with `Table 'hquota' not found`.
|
|
362
|
+
-- The rebuild-on-`table_added` path stays in the code as a defensive fallback for
|
|
363
|
+
-- internal drop paths (rollback, catalog import), which no sqllogic file can drive.
|
|
364
|
+
|
|
365
|
+
-- ===================================
|
|
366
|
+
-- 13. CHECK truthiness: the derived-row validator must reject a bigint-0n / '0'
|
|
367
|
+
-- CHECK result exactly like write-time DML, not the old narrower
|
|
368
|
+
-- `value === false || value === 0` test that missed 0n. A bare-column `check (v)`
|
|
369
|
+
-- yields bigint 0n for an integer 0 at steady-state maintenance time.
|
|
370
|
+
-- ===================================
|
|
371
|
+
|
|
372
|
+
create table tsrc (id integer primary key, v any not null);
|
|
373
|
+
insert into tsrc values (1, 5);
|
|
374
|
+
create table tmt (id integer primary key, v any not null check (v)) maintained as select id, v from tsrc;
|
|
375
|
+
|
|
376
|
+
-- steady-state insert of v=0 → bigint 0n → must fail the derived-row CHECK.
|
|
377
|
+
insert into tsrc values (2, 0);
|
|
378
|
+
-- error: row derived into maintained table 'main.tmt'
|
|
379
|
+
select count(*) as n from tmt;
|
|
380
|
+
→ [{"n":1}]
|
|
381
|
+
|
|
382
|
+
-- string '0' derives falsy under isTruthy's numeric conversion — also rejected.
|
|
383
|
+
insert into tsrc values (3, '0');
|
|
384
|
+
-- error: row derived into maintained table 'main.tmt'
|
|
385
|
+
select count(*) as n from tmt;
|
|
386
|
+
→ [{"n":1}]
|
|
387
|
+
|
|
388
|
+
-- conforming steady-state maintenance still flows (truthy non-zero passes).
|
|
389
|
+
insert into tsrc values (4, 7);
|
|
390
|
+
select count(*) as n from tmt;
|
|
391
|
+
→ [{"n":2}]
|
|
392
|
+
|
|
393
|
+
-- ===================================
|
|
394
|
+
-- 14. mutation-context variables on a maintained table are rejected at
|
|
395
|
+
-- declaration time: nobody ever writes to a maintained table directly (its
|
|
396
|
+
-- rows arrive from the derivation, not a user statement), so no statement
|
|
397
|
+
-- could ever supply a `with context` value for a declared variable. Left
|
|
398
|
+
-- unrejected this used to fail confusingly at DDL time with "Column not
|
|
399
|
+
-- found" once a CHECK tried to read the variable.
|
|
400
|
+
-- ===================================
|
|
401
|
+
|
|
402
|
+
create table ctxsrc (id integer primary key, v integer) using memory;
|
|
403
|
+
|
|
404
|
+
-- CREATE arm: declared together with a CHECK that reads the variable
|
|
405
|
+
create table ctxmt (
|
|
406
|
+
id integer primary key,
|
|
407
|
+
v integer,
|
|
408
|
+
constraint gate check (v <= cap)
|
|
409
|
+
) using memory
|
|
410
|
+
maintained as select id, v from ctxsrc
|
|
411
|
+
with context (cap integer);
|
|
412
|
+
-- error: cannot create maintained table 'main.ctxmt'
|
|
413
|
+
|
|
414
|
+
-- the failed create left the name free
|
|
415
|
+
create table ctxmt (id integer primary key);
|
|
416
|
+
drop table ctxmt;
|
|
417
|
+
|
|
418
|
+
-- CREATE arm, declared-but-never-read: no constraint reads the variable, but
|
|
419
|
+
-- the declaration alone is rejected — the "unread" case gets no exemption
|
|
420
|
+
create table ctxmt2 (id integer primary key, v integer) using memory
|
|
421
|
+
maintained as select id, v from ctxsrc
|
|
422
|
+
with context (cap integer);
|
|
423
|
+
-- error: cannot create maintained table 'main.ctxmt2'
|
|
424
|
+
|
|
425
|
+
-- ALTER arm: a plain context-declaring table is accepted on its own...
|
|
426
|
+
create table ctxamt (id integer primary key, v integer check (v <= cap))
|
|
427
|
+
using memory with context (cap integer);
|
|
428
|
+
insert into ctxamt values (1, 5) with context cap = 10;
|
|
429
|
+
select * from ctxamt order by id;
|
|
430
|
+
→ [{"id":1,"v":5}]
|
|
431
|
+
|
|
432
|
+
-- ...but making it maintained is rejected
|
|
433
|
+
alter table ctxamt set maintained as select id, v from ctxsrc;
|
|
434
|
+
-- error: cannot make table 'main.ctxamt' maintained
|
|
435
|
+
|
|
436
|
+
-- the failed alter left the table plain and still writable with a
|
|
437
|
+
-- `with context` value
|
|
438
|
+
insert into ctxamt values (2, 20) with context cap = 30;
|
|
439
|
+
select * from ctxamt order by id;
|
|
440
|
+
→ [{"id":1,"v":5},{"id":2,"v":20}]
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
-- 51.85-maintained-table-parent-fk.sqllogic — parent-side FK enforcement for
|
|
2
|
+
-- maintained-table maintenance writes, exercised against the LevelDB store backend.
|
|
3
|
+
-- `enforceParentSideReferentialActions` is arm-agnostic; the inverse-projection arm
|
|
4
|
+
-- is sufficient to cover all four declared FK actions on the store backend.
|
|
5
|
+
|
|
6
|
+
pragma foreign_keys = true;
|
|
7
|
+
|
|
8
|
+
-- ===================================
|
|
9
|
+
-- 1. RESTRICT blocks a maintenance delete and rolls back the source write atomically
|
|
10
|
+
-- ===================================
|
|
11
|
+
|
|
12
|
+
create table src (id integer primary key, v text);
|
|
13
|
+
create table m (id integer primary key, v text) maintained as select id, v from src;
|
|
14
|
+
create table c (cid integer primary key, m_id integer,
|
|
15
|
+
foreign key (m_id) references m(id) on delete restrict);
|
|
16
|
+
insert into src values (1, 'a'), (2, 'b');
|
|
17
|
+
insert into c values (10, 1);
|
|
18
|
+
|
|
19
|
+
-- maintenance delete of m(1) blocked by RESTRICT FK on c
|
|
20
|
+
delete from src where id = 1;
|
|
21
|
+
-- error: violates RESTRICT from 'c'
|
|
22
|
+
|
|
23
|
+
-- atomic rollback: all three tables intact
|
|
24
|
+
select * from src order by id;
|
|
25
|
+
→ [{"id":1,"v":"a"},{"id":2,"v":"b"}]
|
|
26
|
+
select * from m order by id;
|
|
27
|
+
→ [{"id":1,"v":"a"},{"id":2,"v":"b"}]
|
|
28
|
+
select count(*) as n from c;
|
|
29
|
+
→ [{"n":1}]
|
|
30
|
+
|
|
31
|
+
-- unreferenced row maintains cleanly
|
|
32
|
+
delete from src where id = 2;
|
|
33
|
+
select id from m;
|
|
34
|
+
→ [{"id":1}]
|
|
35
|
+
|
|
36
|
+
drop table c;
|
|
37
|
+
drop table m;
|
|
38
|
+
drop table src;
|
|
39
|
+
|
|
40
|
+
-- ===================================
|
|
41
|
+
-- 2. CASCADE removes children on a maintenance delete
|
|
42
|
+
-- ===================================
|
|
43
|
+
|
|
44
|
+
create table src (id integer primary key, v text);
|
|
45
|
+
create table m (id integer primary key, v text) maintained as select id, v from src;
|
|
46
|
+
create table c (cid integer primary key, m_id integer,
|
|
47
|
+
foreign key (m_id) references m(id) on delete cascade);
|
|
48
|
+
insert into src values (1, 'a');
|
|
49
|
+
insert into c values (10, 1), (11, 1);
|
|
50
|
+
|
|
51
|
+
delete from src where id = 1;
|
|
52
|
+
select count(*) as n from m;
|
|
53
|
+
→ [{"n":0}]
|
|
54
|
+
select count(*) as n from c;
|
|
55
|
+
→ [{"n":0}]
|
|
56
|
+
|
|
57
|
+
drop table c;
|
|
58
|
+
drop table m;
|
|
59
|
+
drop table src;
|
|
60
|
+
|
|
61
|
+
-- ===================================
|
|
62
|
+
-- 3. SET NULL clears the child FK column on a maintenance delete
|
|
63
|
+
-- ===================================
|
|
64
|
+
|
|
65
|
+
create table src (id integer primary key, v text);
|
|
66
|
+
create table m (id integer primary key, v text) maintained as select id, v from src;
|
|
67
|
+
create table c (cid integer primary key, m_id integer null,
|
|
68
|
+
foreign key (m_id) references m(id) on delete set null);
|
|
69
|
+
insert into src values (1, 'a');
|
|
70
|
+
insert into c values (10, 1);
|
|
71
|
+
|
|
72
|
+
delete from src where id = 1;
|
|
73
|
+
select count(*) as n from m;
|
|
74
|
+
→ [{"n":0}]
|
|
75
|
+
select * from c;
|
|
76
|
+
→ [{"cid":10,"m_id":null}]
|
|
77
|
+
|
|
78
|
+
drop table c;
|
|
79
|
+
drop table m;
|
|
80
|
+
drop table src;
|
|
81
|
+
|
|
82
|
+
-- ===================================
|
|
83
|
+
-- 4. SET DEFAULT resets the child FK column to its default on a maintenance delete
|
|
84
|
+
-- (simple non-nested case: the default value points at the surviving parent row)
|
|
85
|
+
-- ===================================
|
|
86
|
+
|
|
87
|
+
create table src (id integer primary key);
|
|
88
|
+
create table m (id integer primary key) maintained as select id from src;
|
|
89
|
+
create table c (cid integer primary key, m_id integer default 99,
|
|
90
|
+
foreign key (m_id) references m(id) on delete set default);
|
|
91
|
+
insert into src values (1), (99);
|
|
92
|
+
insert into c values (10, 1);
|
|
93
|
+
|
|
94
|
+
-- delete src(1): m(1) removed, SET DEFAULT resets c.m_id to 99 (which still exists in m)
|
|
95
|
+
delete from src where id = 1;
|
|
96
|
+
select id from m;
|
|
97
|
+
→ [{"id":99}]
|
|
98
|
+
select * from c;
|
|
99
|
+
→ [{"cid":10,"m_id":99}]
|
|
100
|
+
|
|
101
|
+
drop table c;
|
|
102
|
+
drop table m;
|
|
103
|
+
drop table src;
|