@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,554 @@
|
|
|
1
|
+
-- Test default value expressions
|
|
2
|
+
CREATE TABLE t_defaults(
|
|
3
|
+
id INTEGER PRIMARY KEY,
|
|
4
|
+
name TEXT DEFAULT 'unnamed',
|
|
5
|
+
created_timestamp INTEGER DEFAULT (1000 + 500),
|
|
6
|
+
computed TEXT DEFAULT ('prefix_' || 'suffix')
|
|
7
|
+
);
|
|
8
|
+
|
|
9
|
+
-- Insert with all columns - should not use defaults
|
|
10
|
+
INSERT INTO t_defaults VALUES (1, 'test1', 9999, 'custom');
|
|
11
|
+
SELECT * FROM t_defaults WHERE id = 1;
|
|
12
|
+
→ [{"id":1,"name":"test1","created_timestamp":9999,"computed":"custom"}]
|
|
13
|
+
|
|
14
|
+
-- Insert with some columns omitted - should use default expressions
|
|
15
|
+
INSERT INTO t_defaults (id, name) VALUES (2, 'test2');
|
|
16
|
+
SELECT * FROM t_defaults WHERE id = 2;
|
|
17
|
+
→ [{"id":2,"name":"test2","created_timestamp":1500,"computed":"prefix_suffix"}]
|
|
18
|
+
|
|
19
|
+
-- Insert with different columns omitted
|
|
20
|
+
INSERT INTO t_defaults (id, created_timestamp) VALUES (3, 2000);
|
|
21
|
+
SELECT * FROM t_defaults WHERE id = 3;
|
|
22
|
+
→ [{"id":3,"name":"unnamed","created_timestamp":2000,"computed":"prefix_suffix"}]
|
|
23
|
+
|
|
24
|
+
-- Insert with only primary key - should use all defaults
|
|
25
|
+
INSERT INTO t_defaults (id) VALUES (4);
|
|
26
|
+
SELECT * FROM t_defaults WHERE id = 4;
|
|
27
|
+
→ [{"id":4,"name":"unnamed","created_timestamp":1500,"computed":"prefix_suffix"}]
|
|
28
|
+
|
|
29
|
+
-- Verify all rows
|
|
30
|
+
SELECT * FROM t_defaults ORDER BY id;
|
|
31
|
+
→ [{"id":1,"name":"test1","created_timestamp":9999,"computed":"custom"},{"id":2,"name":"test2","created_timestamp":1500,"computed":"prefix_suffix"},{"id":3,"name":"unnamed","created_timestamp":2000,"computed":"prefix_suffix"},{"id":4,"name":"unnamed","created_timestamp":1500,"computed":"prefix_suffix"}]
|
|
32
|
+
|
|
33
|
+
DROP TABLE t_defaults;
|
|
34
|
+
|
|
35
|
+
-- ===================================
|
|
36
|
+
-- DEFAULT deriving from a populated sibling via new.<column>
|
|
37
|
+
-- A default may read a value the INSERT actually supplies; only INSERT-supplied
|
|
38
|
+
-- columns are visible, so a default never depends on another column's default
|
|
39
|
+
-- (which would impose an evaluation-order race).
|
|
40
|
+
-- ===================================
|
|
41
|
+
|
|
42
|
+
CREATE TABLE t_newref (
|
|
43
|
+
id INTEGER PRIMARY KEY,
|
|
44
|
+
base INTEGER,
|
|
45
|
+
title TEXT,
|
|
46
|
+
doubled INTEGER DEFAULT (new.base * 2),
|
|
47
|
+
slug TEXT DEFAULT (lower(new.title))
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
-- Siblings populated → the defaults derive from them
|
|
51
|
+
INSERT INTO t_newref (id, base, title) VALUES (1, 10, 'Hello');
|
|
52
|
+
SELECT id, base, title, doubled, slug FROM t_newref WHERE id = 1;
|
|
53
|
+
→ [{"id":1,"base":10,"title":"Hello","doubled":20,"slug":"hello"}]
|
|
54
|
+
|
|
55
|
+
-- An explicitly supplied value overrides the default (new.* unused)
|
|
56
|
+
INSERT INTO t_newref (id, base, title, doubled) VALUES (2, 10, 'X', 999);
|
|
57
|
+
SELECT doubled FROM t_newref WHERE id = 2;
|
|
58
|
+
→ [{"doubled":999}]
|
|
59
|
+
|
|
60
|
+
-- Referencing a column the INSERT did not supply → clear resolution error
|
|
61
|
+
-- (here `title` is omitted, so `new.title` in slug's default has no value).
|
|
62
|
+
INSERT INTO t_newref (id, base) VALUES (3, 7);
|
|
63
|
+
-- error: isn't a column
|
|
64
|
+
|
|
65
|
+
DROP TABLE t_newref;
|
|
66
|
+
|
|
67
|
+
-- ===================================
|
|
68
|
+
-- new.<column> NOT NULL default — error attribution
|
|
69
|
+
-- A NOT NULL violation is always reported against the FIRST NOT-NULL column (in
|
|
70
|
+
-- declaration order) whose effective NEW value is NULL — independent of which
|
|
71
|
+
-- column any DEFAULT references. These cases run through the materialised-row
|
|
72
|
+
-- (buildNotNullDefaults) path via OR REPLACE / explicit values, NOT the
|
|
73
|
+
-- row-expansion `isn't a column` path above. They lock in that attribution
|
|
74
|
+
-- across the nullable / not-null sibling matrix so the historical
|
|
75
|
+
-- "misattribution" concern is not re-filed.
|
|
76
|
+
-- ===================================
|
|
77
|
+
|
|
78
|
+
-- A BARE sibling is itself NOT NULL (default_column_nullability='not_null', the
|
|
79
|
+
-- engine default — see 43-default-nullability.sqllogic). Omitting `a` makes IT
|
|
80
|
+
-- the first NOT-NULL violator, so the message names the sibling `a`, NOT the
|
|
81
|
+
-- defaulted column `b`. This is CORRECT: `a` violates its OWN NOT NULL and is
|
|
82
|
+
-- checked before `b`. (REPLACE form: `a` has no DEFAULT to substitute.)
|
|
83
|
+
create table c1 (id integer primary key, a integer, b integer not null default (new.a));
|
|
84
|
+
insert or replace into c1 (id, b) values (1, null);
|
|
85
|
+
-- error: NOT NULL constraint failed: c1.a
|
|
86
|
+
|
|
87
|
+
-- Plain INSERT/ABORT throws via a different site (throwForAction) but names the
|
|
88
|
+
-- same column.
|
|
89
|
+
insert into c1 (id, b) values (1, null);
|
|
90
|
+
-- error: NOT NULL constraint failed: c1.a
|
|
91
|
+
|
|
92
|
+
DROP TABLE c1;
|
|
93
|
+
|
|
94
|
+
-- When the sibling is EXPLICITLY nullable, NULL-ing it no longer makes it a
|
|
95
|
+
-- violator, so the defaulted NOT NULL column `b` is named instead.
|
|
96
|
+
create table c2 (id integer primary key, a integer null, b integer not null default (new.a));
|
|
97
|
+
|
|
98
|
+
-- OR REPLACE substitutes b's DEFAULT (new.a); the sibling is NULL (omitted), so
|
|
99
|
+
-- the substituted value is still NULL → names the defaulted column b.
|
|
100
|
+
insert or replace into c2 (id, b) values (1, null);
|
|
101
|
+
-- error: NOT NULL constraint failed: c2.b
|
|
102
|
+
|
|
103
|
+
-- Plain INSERT with explicit NULL for b: no substitution, b stays NULL → names b.
|
|
104
|
+
insert into c2 (id, b) values (2, null);
|
|
105
|
+
-- error: NOT NULL constraint failed: c2.b
|
|
106
|
+
|
|
107
|
+
-- Sibling supplied non-NULL → OR REPLACE substitutes new.a successfully, so b
|
|
108
|
+
-- takes the substituted sibling value (assert the STORED value, not just success).
|
|
109
|
+
insert or replace into c2 (id, a, b) values (3, 7, null);
|
|
110
|
+
select a, b from c2 where id = 3;
|
|
111
|
+
→ [{"a":7,"b":7}]
|
|
112
|
+
|
|
113
|
+
-- Both sibling and defaulted column explicitly NULL → the default resolves to
|
|
114
|
+
-- NULL → names the defaulted column b.
|
|
115
|
+
insert or replace into c2 (id, a, b) values (4, null, null);
|
|
116
|
+
-- error: NOT NULL constraint failed: c2.b
|
|
117
|
+
|
|
118
|
+
-- IGNORE: the defaulted column is NULL with no usable default → the row is
|
|
119
|
+
-- silently skipped (IGNORE is handled before DEFAULT substitution), no error and
|
|
120
|
+
-- no row inserted.
|
|
121
|
+
insert or ignore into c2 (id, b) values (5, null);
|
|
122
|
+
select id from c2 where id = 5;
|
|
123
|
+
→ []
|
|
124
|
+
|
|
125
|
+
-- IGNORE asymmetry — substitution is REPLACE-only. Here the DEFAULT *could*
|
|
126
|
+
-- satisfy NOT NULL (a=7 ⇒ new.a=7), yet OR IGNORE still skips the row: it bails
|
|
127
|
+
-- on the NOT NULL violation BEFORE attempting substitution. The id=5 case above
|
|
128
|
+
-- can't distinguish this from "substitute then re-check" (new.a is NULL there
|
|
129
|
+
-- regardless); a non-NULL sibling makes the row's absence the proof.
|
|
130
|
+
insert or ignore into c2 (id, a, b) values (6, 7, null);
|
|
131
|
+
select id from c2 where id = 6;
|
|
132
|
+
→ []
|
|
133
|
+
|
|
134
|
+
DROP TABLE c2;
|
|
135
|
+
|
|
136
|
+
-- Column ordering — first violator wins. The NOT NULL DEFAULTED column `b` is
|
|
137
|
+
-- declared BEFORE its referenced sibling `a` (a is bare ⇒ also NOT NULL). With
|
|
138
|
+
-- both explicitly NULL, BOTH violate, but the message names `b` because it is
|
|
139
|
+
-- first in declaration order (matches SQLite's first-violation reporting).
|
|
140
|
+
-- Contrast c1, where the sibling came first and was named. Explicit NULLs keep
|
|
141
|
+
-- this on the materialised-row path; omitting both would instead raise the
|
|
142
|
+
-- row-expansion `isn't a column` resolution error.
|
|
143
|
+
create table c_ord (id integer primary key, b integer not null default (new.a), a integer);
|
|
144
|
+
insert or replace into c_ord (id, a, b) values (1, null, null);
|
|
145
|
+
-- error: NOT NULL constraint failed: c_ord.b
|
|
146
|
+
|
|
147
|
+
DROP TABLE c_ord;
|
|
148
|
+
|
|
149
|
+
-- ===================================
|
|
150
|
+
-- new.<column> through a single-source VIEW insert
|
|
151
|
+
-- A view INSERT re-plans through the same row-expansion path, so the default
|
|
152
|
+
-- still derives from the supplied sibling.
|
|
153
|
+
-- ===================================
|
|
154
|
+
|
|
155
|
+
CREATE TABLE base_nv (
|
|
156
|
+
id INTEGER PRIMARY KEY,
|
|
157
|
+
base INTEGER,
|
|
158
|
+
doubled INTEGER DEFAULT (new.base * 2)
|
|
159
|
+
);
|
|
160
|
+
CREATE VIEW v_nv AS SELECT id, base, doubled FROM base_nv;
|
|
161
|
+
|
|
162
|
+
INSERT INTO v_nv (id, base) VALUES (1, 10);
|
|
163
|
+
SELECT base, doubled FROM base_nv WHERE id = 1;
|
|
164
|
+
→ [{"base":10,"doubled":20}]
|
|
165
|
+
|
|
166
|
+
DROP VIEW v_nv;
|
|
167
|
+
DROP TABLE base_nv;
|
|
168
|
+
|
|
169
|
+
-- ===================================
|
|
170
|
+
-- new.<column> nested inside a subquery in a DEFAULT resolves as a correlated
|
|
171
|
+
-- read of the row being inserted.
|
|
172
|
+
-- ===================================
|
|
173
|
+
|
|
174
|
+
CREATE TABLE t_sub (
|
|
175
|
+
id INTEGER PRIMARY KEY,
|
|
176
|
+
x INTEGER,
|
|
177
|
+
y INTEGER DEFAULT (coalesce((SELECT new.x), 0))
|
|
178
|
+
);
|
|
179
|
+
INSERT INTO t_sub (id, x) VALUES (1, 7);
|
|
180
|
+
SELECT y FROM t_sub WHERE id = 1;
|
|
181
|
+
→ [{"y":7}]
|
|
182
|
+
|
|
183
|
+
DROP TABLE t_sub;
|
|
184
|
+
|
|
185
|
+
-- ===================================
|
|
186
|
+
-- new.<column> alongside GENERATED columns
|
|
187
|
+
-- A `new.` default coexists with generated columns (the two-pass expansion is
|
|
188
|
+
-- unaffected); but `new.<generated_col>` is NOT a source-supplied value, so it
|
|
189
|
+
-- raises a resolution error.
|
|
190
|
+
-- ===================================
|
|
191
|
+
|
|
192
|
+
CREATE TABLE t_gen (
|
|
193
|
+
id INTEGER PRIMARY KEY,
|
|
194
|
+
base INTEGER,
|
|
195
|
+
dbl INTEGER DEFAULT (new.base * 2),
|
|
196
|
+
g INTEGER GENERATED ALWAYS AS (base + 1) STORED
|
|
197
|
+
);
|
|
198
|
+
INSERT INTO t_gen (id, base) VALUES (1, 10);
|
|
199
|
+
SELECT dbl, g FROM t_gen WHERE id = 1;
|
|
200
|
+
→ [{"dbl":20,"g":11}]
|
|
201
|
+
|
|
202
|
+
DROP TABLE t_gen;
|
|
203
|
+
|
|
204
|
+
CREATE TABLE t_gen_ref (
|
|
205
|
+
id INTEGER PRIMARY KEY,
|
|
206
|
+
x INTEGER,
|
|
207
|
+
g INTEGER GENERATED ALWAYS AS (x * 2) STORED,
|
|
208
|
+
y INTEGER DEFAULT (new.g)
|
|
209
|
+
);
|
|
210
|
+
INSERT INTO t_gen_ref (id, x) VALUES (1, 5);
|
|
211
|
+
-- error: isn't a column
|
|
212
|
+
|
|
213
|
+
DROP TABLE t_gen_ref;
|
|
214
|
+
|
|
215
|
+
-- ===================================
|
|
216
|
+
-- Identity-resolving default: new.<column> inside a correlated subquery over
|
|
217
|
+
-- ANOTHER base table resolves an existing parent row's key from a supplied
|
|
218
|
+
-- value (the PK-is-FK extension-table / lens basis pattern). The default reads
|
|
219
|
+
-- new.value and looks the matching parent rowId up, rather than minting a fresh
|
|
220
|
+
-- surrogate.
|
|
221
|
+
-- ===================================
|
|
222
|
+
|
|
223
|
+
CREATE TABLE h0_users_id (
|
|
224
|
+
rowId INTEGER PRIMARY KEY,
|
|
225
|
+
value INTEGER
|
|
226
|
+
);
|
|
227
|
+
INSERT INTO h0_users_id (rowId, value) VALUES (10, 100), (20, 200);
|
|
228
|
+
|
|
229
|
+
CREATE TABLE h2_uprof (
|
|
230
|
+
rowId INTEGER PRIMARY KEY DEFAULT (SELECT rowId FROM h0_users_id h0 WHERE h0.value = new.value),
|
|
231
|
+
value INTEGER
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
-- value=200 resolves the parent's rowId=20 through the correlated subquery
|
|
235
|
+
INSERT INTO h2_uprof (value) VALUES (200);
|
|
236
|
+
SELECT rowId, value FROM h2_uprof WHERE value = 200;
|
|
237
|
+
→ [{"rowId":20,"value":200}]
|
|
238
|
+
|
|
239
|
+
-- a second resolution against a different supplied value
|
|
240
|
+
INSERT INTO h2_uprof (value) VALUES (100);
|
|
241
|
+
SELECT rowId, value FROM h2_uprof ORDER BY rowId;
|
|
242
|
+
→ [{"rowId":10,"value":100},{"rowId":20,"value":200}]
|
|
243
|
+
|
|
244
|
+
DROP TABLE h2_uprof;
|
|
245
|
+
DROP TABLE h0_users_id;
|
|
246
|
+
|
|
247
|
+
-- ===================================
|
|
248
|
+
-- ALTER COLUMN SET DEFAULT routes through the same DDL validator CREATE TABLE uses,
|
|
249
|
+
-- so the stored default is consistent with what INSERT will accept: `new.<column>`
|
|
250
|
+
-- is accepted (deferred to INSERT time); a bare column / non-deterministic default
|
|
251
|
+
-- is rejected at ALTER time (closing the previously-silent-accept gap).
|
|
252
|
+
-- ===================================
|
|
253
|
+
|
|
254
|
+
create table sd_t (id integer primary key, x integer, y integer);
|
|
255
|
+
|
|
256
|
+
-- a `new.<col>` SET DEFAULT is accepted (build/determinism deferred to INSERT).
|
|
257
|
+
alter table sd_t alter column y set default (new.x * 10);
|
|
258
|
+
|
|
259
|
+
-- and is exercised by a later insert that supplies the sibling.
|
|
260
|
+
insert into sd_t (id, x) values (1, 4);
|
|
261
|
+
select x, y from sd_t where id = 1;
|
|
262
|
+
→ [{"x":4,"y":40}]
|
|
263
|
+
|
|
264
|
+
-- supplying y directly overrides the default.
|
|
265
|
+
insert into sd_t (id, x, y) values (2, 4, 99);
|
|
266
|
+
select x, y from sd_t where id = 2;
|
|
267
|
+
→ [{"x":4,"y":99}]
|
|
268
|
+
|
|
269
|
+
-- omitting the sibling the default reads → the same resolution error as the
|
|
270
|
+
-- single-source path (new.x has no supplied value).
|
|
271
|
+
insert into sd_t (id) values (3);
|
|
272
|
+
-- error: isn't a column
|
|
273
|
+
|
|
274
|
+
DROP TABLE sd_t;
|
|
275
|
+
|
|
276
|
+
-- a bare-column SET DEFAULT is now rejected at ALTER time (no mutation context).
|
|
277
|
+
create table sd_bare (id integer primary key, a integer, b integer);
|
|
278
|
+
alter table sd_bare alter column b set default (a + 1);
|
|
279
|
+
-- error: bare column
|
|
280
|
+
DROP TABLE sd_bare;
|
|
281
|
+
|
|
282
|
+
-- a non-deterministic SET DEFAULT is rejected at ALTER time.
|
|
283
|
+
create table sd_nd (id integer primary key, v integer);
|
|
284
|
+
alter table sd_nd alter column v set default (random());
|
|
285
|
+
-- error: non-deterministic
|
|
286
|
+
DROP TABLE sd_nd;
|
|
287
|
+
|
|
288
|
+
-- DROP DEFAULT needs no validation and still works.
|
|
289
|
+
create table sd_drop (id integer primary key, w integer null default 7);
|
|
290
|
+
insert into sd_drop (id) values (1);
|
|
291
|
+
select w from sd_drop where id = 1;
|
|
292
|
+
→ [{"w":7}]
|
|
293
|
+
alter table sd_drop alter column w drop default;
|
|
294
|
+
insert into sd_drop (id) values (2);
|
|
295
|
+
select w from sd_drop where id = 2;
|
|
296
|
+
→ [{"w":null}]
|
|
297
|
+
DROP TABLE sd_drop;
|
|
298
|
+
|
|
299
|
+
-- ===================================
|
|
300
|
+
-- ALTER TABLE ADD COLUMN with a new.<column> DEFAULT backfills existing rows
|
|
301
|
+
-- per-row from their OWN sibling, and a later insert derives the column from the
|
|
302
|
+
-- INSERT-supplied sibling (parity with the single-source path).
|
|
303
|
+
-- ===================================
|
|
304
|
+
|
|
305
|
+
create table ac_t (id integer primary key, base integer);
|
|
306
|
+
insert into ac_t (id, base) values (1, 10), (2, 5), (3, 0);
|
|
307
|
+
|
|
308
|
+
-- new.<col> default: each existing row backfills from its own base.
|
|
309
|
+
alter table ac_t add column doubled integer default (new.base * 2);
|
|
310
|
+
select id, base, doubled from ac_t order by id;
|
|
311
|
+
→ [{"id":1,"base":10,"doubled":20},{"id":2,"base":5,"doubled":10},{"id":3,"base":0,"doubled":0}]
|
|
312
|
+
|
|
313
|
+
-- a later insert supplying base derives doubled.
|
|
314
|
+
insert into ac_t (id, base) values (4, 7);
|
|
315
|
+
select doubled from ac_t where id = 4;
|
|
316
|
+
→ [{"doubled":14}]
|
|
317
|
+
|
|
318
|
+
-- an explicitly supplied value still overrides the default.
|
|
319
|
+
insert into ac_t (id, base, doubled) values (5, 7, 999);
|
|
320
|
+
select doubled from ac_t where id = 5;
|
|
321
|
+
→ [{"doubled":999}]
|
|
322
|
+
|
|
323
|
+
-- omitting the sibling the default reads → the same resolution error as the
|
|
324
|
+
-- single-source insert path (new.base has no supplied value).
|
|
325
|
+
insert into ac_t (id) values (6);
|
|
326
|
+
-- error: isn't a column
|
|
327
|
+
|
|
328
|
+
DROP TABLE ac_t;
|
|
329
|
+
|
|
330
|
+
-- A literal-folding ADD COLUMN default still bulk-backfills (fast path unchanged).
|
|
331
|
+
create table ac_lit (id integer primary key, a integer);
|
|
332
|
+
insert into ac_lit (id, a) values (1, 1), (2, 2);
|
|
333
|
+
alter table ac_lit add column c integer default (3 + 4);
|
|
334
|
+
select id, c from ac_lit order by id;
|
|
335
|
+
→ [{"id":1,"c":7},{"id":2,"c":7}]
|
|
336
|
+
DROP TABLE ac_lit;
|
|
337
|
+
|
|
338
|
+
-- ADD COLUMN NOT NULL whose per-row backfill is non-null for every row succeeds.
|
|
339
|
+
create table ac_nn2 (id integer primary key, base integer not null);
|
|
340
|
+
insert into ac_nn2 (id, base) values (1, 10), (2, 4);
|
|
341
|
+
alter table ac_nn2 add column doubled integer not null default (new.base * 2);
|
|
342
|
+
select id, base, doubled from ac_nn2 order by id;
|
|
343
|
+
→ [{"id":1,"base":10,"doubled":20},{"id":2,"base":4,"doubled":8}]
|
|
344
|
+
DROP TABLE ac_nn2;
|
|
345
|
+
|
|
346
|
+
-- ADD COLUMN NOT NULL whose per-row backfill yields NULL for some row is rejected,
|
|
347
|
+
-- and the table is left unchanged (the new column was not added).
|
|
348
|
+
create table ac_nn (id integer primary key, base integer null);
|
|
349
|
+
insert into ac_nn (id, base) values (1, 10), (2, null);
|
|
350
|
+
alter table ac_nn add column doubled integer not null default (new.base * 2);
|
|
351
|
+
-- error:
|
|
352
|
+
select * from ac_nn order by id;
|
|
353
|
+
→ [{"id":1,"base":10},{"id":2,"base":null}]
|
|
354
|
+
DROP TABLE ac_nn;
|
|
355
|
+
|
|
356
|
+
-- ADD COLUMN with BOTH a non-foldable (per-row) DEFAULT and a CHECK on the new
|
|
357
|
+
-- column enforces the CHECK against every backfilled row, evaluated per-row inside
|
|
358
|
+
-- the backfill hook (mirrors the NOT NULL per-row path). A passing CHECK adds the
|
|
359
|
+
-- column and backfills; a violating row aborts the ALTER and leaves the table
|
|
360
|
+
-- unchanged on both the memory and store modules. The literal-default + CHECK path
|
|
361
|
+
-- (see 90.2.1 §3) is unaffected and still validates/reverts via the post-backfill scan.
|
|
362
|
+
|
|
363
|
+
-- Passing CHECK: every backfilled row satisfies it → column added with derived values.
|
|
364
|
+
create table ac_chk_ok (id integer primary key, base integer null);
|
|
365
|
+
insert into ac_chk_ok (id, base) values (1, 5), (2, 3);
|
|
366
|
+
alter table ac_chk_ok add column c integer default (new.base * 2) check (c > 0);
|
|
367
|
+
select id, base, c from ac_chk_ok order by id;
|
|
368
|
+
→ [{"id":1,"base":5,"c":10},{"id":2,"base":3,"c":6}]
|
|
369
|
+
DROP TABLE ac_chk_ok;
|
|
370
|
+
|
|
371
|
+
-- A CHECK referencing BOTH the new column and an existing sibling resolves both.
|
|
372
|
+
create table ac_chk_ref (id integer primary key, base integer null);
|
|
373
|
+
insert into ac_chk_ref (id, base) values (1, 5), (2, 3);
|
|
374
|
+
alter table ac_chk_ref add column c integer default (new.base * 2) check (c > base);
|
|
375
|
+
select id, base, c from ac_chk_ref order by id;
|
|
376
|
+
→ [{"id":1,"base":5,"c":10},{"id":2,"base":3,"c":6}]
|
|
377
|
+
DROP TABLE ac_chk_ref;
|
|
378
|
+
|
|
379
|
+
-- One backfilled row violates the CHECK (base=-3 → c=-6, fails c > 0): the ALTER aborts
|
|
380
|
+
-- and the table is left unchanged (no `c` column).
|
|
381
|
+
create table ac_chk_bad (id integer primary key, base integer null);
|
|
382
|
+
insert into ac_chk_bad (id, base) values (1, 5), (2, -3);
|
|
383
|
+
alter table ac_chk_bad add column c integer default (new.base * 2) check (c > 0);
|
|
384
|
+
-- error:
|
|
385
|
+
select * from ac_chk_bad order by id;
|
|
386
|
+
→ [{"id":1,"base":5},{"id":2,"base":-3}]
|
|
387
|
+
DROP TABLE ac_chk_bad;
|
|
388
|
+
|
|
389
|
+
-- ALL rows violate the CHECK (the original silent-admission scenario): still rejected and
|
|
390
|
+
-- the table is left unchanged.
|
|
391
|
+
create table ac_chk_all (id integer primary key, base integer null);
|
|
392
|
+
insert into ac_chk_all (id, base) values (1, 5), (2, 3);
|
|
393
|
+
alter table ac_chk_all add column c integer default (new.base * 2) check (c > 1000000);
|
|
394
|
+
-- error:
|
|
395
|
+
select * from ac_chk_all order by id;
|
|
396
|
+
→ [{"id":1,"base":5},{"id":2,"base":3}]
|
|
397
|
+
DROP TABLE ac_chk_all;
|
|
398
|
+
|
|
399
|
+
-- MULTIPLE CHECKs on one ADD COLUMN, all satisfied → column added (each predicate
|
|
400
|
+
-- compiled and evaluated per backfilled row).
|
|
401
|
+
create table ac_chk_multi_ok (id integer primary key, base integer null);
|
|
402
|
+
insert into ac_chk_multi_ok (id, base) values (1, 5), (2, 3);
|
|
403
|
+
alter table ac_chk_multi_ok add column c integer default (new.base * 2) check (c > 0) check (c < 100);
|
|
404
|
+
select id, base, c from ac_chk_multi_ok order by id;
|
|
405
|
+
→ [{"id":1,"base":5,"c":10},{"id":2,"base":3,"c":6}]
|
|
406
|
+
DROP TABLE ac_chk_multi_ok;
|
|
407
|
+
|
|
408
|
+
-- MULTIPLE CHECKs where the SECOND fails for one row (row 1: c=10 fails c < 8): the ALTER
|
|
409
|
+
-- aborts and the table is left unchanged — confirms every predicate is enforced, not just
|
|
410
|
+
-- the first.
|
|
411
|
+
create table ac_chk_multi_bad (id integer primary key, base integer null);
|
|
412
|
+
insert into ac_chk_multi_bad (id, base) values (1, 5), (2, 3);
|
|
413
|
+
alter table ac_chk_multi_bad add column c integer default (new.base * 2) check (c > 0) check (c < 8);
|
|
414
|
+
-- error:
|
|
415
|
+
select * from ac_chk_multi_bad order by id;
|
|
416
|
+
→ [{"id":1,"base":5},{"id":2,"base":3}]
|
|
417
|
+
DROP TABLE ac_chk_multi_bad;
|
|
418
|
+
|
|
419
|
+
-- After a successful per-row CHECK ADD COLUMN, the CHECK is merged into the table-level
|
|
420
|
+
-- constraint set, so a FUTURE insert violating it is rejected (the backfill enforcement
|
|
421
|
+
-- and write-time enforcement share the same predicate).
|
|
422
|
+
create table ac_chk_future (id integer primary key, base integer null);
|
|
423
|
+
insert into ac_chk_future (id, base) values (1, 5);
|
|
424
|
+
alter table ac_chk_future add column c integer default (new.base * 2) check (c > 0);
|
|
425
|
+
insert into ac_chk_future (id, base, c) values (2, 1, -5);
|
|
426
|
+
-- error:
|
|
427
|
+
select id, base, c from ac_chk_future order by id;
|
|
428
|
+
→ [{"id":1,"base":5,"c":10}]
|
|
429
|
+
DROP TABLE ac_chk_future;
|
|
430
|
+
|
|
431
|
+
-- TRUTHINESS: a bare-column CHECK yields bigint 0n for a backfilled 0 (integer
|
|
432
|
+
-- literals lex to bigint at runtime). The old backfill test `result === false ||
|
|
433
|
+
-- result === 0` missed 0n and silently admitted the row; the shared isTruthy rule
|
|
434
|
+
-- rejects it. base=0 → c=0n → CHECK fails → ALTER aborts, table unchanged.
|
|
435
|
+
create table ac_chk_truthy (id integer primary key, base integer null);
|
|
436
|
+
insert into ac_chk_truthy (id, base) values (1, 5), (2, 0);
|
|
437
|
+
alter table ac_chk_truthy add column c integer default (new.base) check (c);
|
|
438
|
+
-- error:
|
|
439
|
+
select * from ac_chk_truthy order by id;
|
|
440
|
+
→ [{"id":1,"base":5},{"id":2,"base":0}]
|
|
441
|
+
DROP TABLE ac_chk_truthy;
|
|
442
|
+
|
|
443
|
+
-- TRUTHINESS control: all backfilled values truthy → column added.
|
|
444
|
+
create table ac_chk_truthy_ok (id integer primary key, base integer null);
|
|
445
|
+
insert into ac_chk_truthy_ok (id, base) values (1, 5), (2, 3);
|
|
446
|
+
alter table ac_chk_truthy_ok add column c integer default (new.base) check (c);
|
|
447
|
+
select id, base, c from ac_chk_truthy_ok order by id;
|
|
448
|
+
→ [{"id":1,"base":5,"c":5},{"id":2,"base":3,"c":3}]
|
|
449
|
+
DROP TABLE ac_chk_truthy_ok;
|
|
450
|
+
|
|
451
|
+
-- COLLATION parity: a `collate nocase` new column with a CHECK comparing it to a lowercase
|
|
452
|
+
-- literal. The backfilled value 'ABC' equals 'abc' only under NOCASE — so this passes iff the
|
|
453
|
+
-- new column's declared collation drives the backfill-time CHECK (matching write-time).
|
|
454
|
+
create table ac_chk_coll (id integer primary key, name text);
|
|
455
|
+
insert into ac_chk_coll (id, name) values (1, 'ABC');
|
|
456
|
+
alter table ac_chk_coll add column c text collate nocase default (new.name) check (c = 'abc');
|
|
457
|
+
select id, name, c from ac_chk_coll order by id;
|
|
458
|
+
→ [{"id":1,"name":"ABC","c":"ABC"}]
|
|
459
|
+
DROP TABLE ac_chk_coll;
|
|
460
|
+
|
|
461
|
+
-- ADD COLUMN with a new.<col> default on an EMPTY table: no rows to backfill, so
|
|
462
|
+
-- even a NOT NULL per-row default adds cleanly; future inserts derive the value.
|
|
463
|
+
create table ac_empty (id integer primary key, base integer);
|
|
464
|
+
alter table ac_empty add column doubled integer not null default (new.base * 2);
|
|
465
|
+
insert into ac_empty (id, base) values (1, 4);
|
|
466
|
+
select id, base, doubled from ac_empty order by id;
|
|
467
|
+
→ [{"id":1,"base":4,"doubled":8}]
|
|
468
|
+
DROP TABLE ac_empty;
|
|
469
|
+
|
|
470
|
+
-- A default reading MULTIPLE new.<col> siblings backfills each existing row from its own.
|
|
471
|
+
create table ac_multi (id integer primary key, a integer, b integer);
|
|
472
|
+
insert into ac_multi (id, a, b) values (1, 2, 3), (2, 10, 1);
|
|
473
|
+
alter table ac_multi add column s integer default (new.a + new.b);
|
|
474
|
+
select id, s from ac_multi order by id;
|
|
475
|
+
→ [{"id":1,"s":5},{"id":2,"s":11}]
|
|
476
|
+
DROP TABLE ac_multi;
|
|
477
|
+
|
|
478
|
+
-- ===================================
|
|
479
|
+
-- Identity-resolving default through a DECOMPOSITION fan-out. The anchor key
|
|
480
|
+
-- column's surrogate `default` correlates on a SIBLING supplied logical column
|
|
481
|
+
-- (`new.value`) the anchor's own base table does NOT carry — it lives on another
|
|
482
|
+
-- member. The produced row's NEW context now threads into every member insert, so
|
|
483
|
+
-- the engine's own fan-out resolves the parent surrogate per produced row and
|
|
484
|
+
-- EC-threads it across the members (the multi-member dual of the single-source
|
|
485
|
+
-- identity-resolving default above). Before this, the fan-out's buildNotNullDefaults
|
|
486
|
+
-- raised `new.value isn't a column` from buildDecompositionMemberInsert.
|
|
487
|
+
-- ===================================
|
|
488
|
+
|
|
489
|
+
create table hd_parent (pid integer primary key, value integer);
|
|
490
|
+
|
|
491
|
+
-- run
|
|
492
|
+
|
|
493
|
+
insert into hd_parent (pid, value) values (10, 100), (20, 200), (30, 300);
|
|
494
|
+
|
|
495
|
+
-- run
|
|
496
|
+
|
|
497
|
+
-- Per-column decomposition of logical T(value): anchor hd_anchor holds ONLY the
|
|
498
|
+
-- surrogate key rowId, whose default resolves the parent's pid from the inserted
|
|
499
|
+
-- value (`new.value`); member hd_value carries the value column. The resolved rowId
|
|
500
|
+
-- threads from the anchor default into hd_value via the shared key.
|
|
501
|
+
create table hd_anchor (
|
|
502
|
+
rowId integer primary key default (select pid from hd_parent p where p.value = new.value)
|
|
503
|
+
) with tags (
|
|
504
|
+
"quereus.lens.decomp.logical.dT" = 'T',
|
|
505
|
+
"quereus.lens.decomp.role.dT" = 'primary-storage',
|
|
506
|
+
"quereus.lens.decomp.anchor.dT" = 'hd_anchor',
|
|
507
|
+
"quereus.lens.decomp.presence.dT" = 'mandatory',
|
|
508
|
+
"quereus.lens.decomp.keykind.dT" = 'surrogate',
|
|
509
|
+
"quereus.lens.decomp.key.dT" = 'rowId'
|
|
510
|
+
);
|
|
511
|
+
|
|
512
|
+
create table hd_value (rowId integer primary key, value integer) with tags (
|
|
513
|
+
"quereus.lens.decomp.logical.dT" = 'T',
|
|
514
|
+
"quereus.lens.decomp.role.dT" = 'primary-storage',
|
|
515
|
+
"quereus.lens.decomp.anchor.dT" = 'hd_anchor',
|
|
516
|
+
"quereus.lens.decomp.presence.dT" = 'mandatory',
|
|
517
|
+
"quereus.lens.decomp.keykind.dT" = 'surrogate',
|
|
518
|
+
"quereus.lens.decomp.key.dT" = 'rowId',
|
|
519
|
+
"quereus.lens.decomp.col.dT.value" = 'value'
|
|
520
|
+
);
|
|
521
|
+
|
|
522
|
+
-- run
|
|
523
|
+
|
|
524
|
+
declare logical schema xd { table T { value integer } }
|
|
525
|
+
|
|
526
|
+
-- run
|
|
527
|
+
|
|
528
|
+
apply schema xd;
|
|
529
|
+
|
|
530
|
+
-- run
|
|
531
|
+
|
|
532
|
+
-- value=200 resolves the parent pid=20 via the anchor default and threads that
|
|
533
|
+
-- surrogate into the value member (no longer throws `new.value isn't a column`).
|
|
534
|
+
insert into xd.T (value) values (200);
|
|
535
|
+
select rowId, value from hd_value;
|
|
536
|
+
→ [{"rowId":20,"value":200}]
|
|
537
|
+
|
|
538
|
+
-- the identical surrogate landed on the anchor member.
|
|
539
|
+
select rowId from hd_anchor;
|
|
540
|
+
→ [{"rowId":20}]
|
|
541
|
+
|
|
542
|
+
-- Multi-row in ONE statement: each produced row resolves its OWN parent from its
|
|
543
|
+
-- supplied value (the NEW context is per produced row, not once per statement).
|
|
544
|
+
insert into xd.T (value) values (100), (300);
|
|
545
|
+
select rowId, value from hd_value order by rowId;
|
|
546
|
+
→ [{"rowId":10,"value":100},{"rowId":20,"value":200},{"rowId":30,"value":300}]
|
|
547
|
+
|
|
548
|
+
-- the view reads back the full logical image (anchor ⋈ value on the shared key).
|
|
549
|
+
select value from xd.T order by value;
|
|
550
|
+
→ [{"value":100},{"value":200},{"value":300}]
|
|
551
|
+
|
|
552
|
+
DROP TABLE hd_value;
|
|
553
|
+
DROP TABLE hd_anchor;
|
|
554
|
+
DROP TABLE hd_parent;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
-- adapted from SQLite test/default.test
|
|
2
|
+
-- DEFAULT expression edge cases beyond 03.4-defaults.sqllogic.
|
|
3
|
+
-- Quereus rejects non-deterministic defaults (CURRENT_TIMESTAMP, random()),
|
|
4
|
+
-- so those scenarios are excluded by design — see 44-determinism-validation.
|
|
5
|
+
|
|
6
|
+
-- ===================================
|
|
7
|
+
-- 1. Negative integer literal default
|
|
8
|
+
-- ===================================
|
|
9
|
+
|
|
10
|
+
create table t_neg (id integer primary key, n integer default -42);
|
|
11
|
+
insert into t_neg (id) values (1);
|
|
12
|
+
|
|
13
|
+
select n from t_neg where id = 1;
|
|
14
|
+
→ [{"n":-42}]
|
|
15
|
+
|
|
16
|
+
drop table t_neg;
|
|
17
|
+
|
|
18
|
+
-- ===================================
|
|
19
|
+
-- 2. Boundary integer literal defaults
|
|
20
|
+
-- ===================================
|
|
21
|
+
|
|
22
|
+
create table t_bounds (
|
|
23
|
+
id integer primary key,
|
|
24
|
+
a integer default 2147483647,
|
|
25
|
+
b integer default 2147483648,
|
|
26
|
+
c integer default 9223372036854775807,
|
|
27
|
+
d integer default -2147483648,
|
|
28
|
+
e integer default -9223372036854775808
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
insert into t_bounds (id) values (1);
|
|
32
|
+
|
|
33
|
+
select a, b, c, d, e from t_bounds where id = 1;
|
|
34
|
+
→ [{"a":2147483647,"b":2147483648,"c":9223372036854775807,"d":-2147483648,"e":-9223372036854775808}]
|
|
35
|
+
|
|
36
|
+
drop table t_bounds;
|
|
37
|
+
|
|
38
|
+
-- ===================================
|
|
39
|
+
-- 3. REAL literal default
|
|
40
|
+
-- ===================================
|
|
41
|
+
|
|
42
|
+
create table t_real (id integer primary key, r real default 4.36);
|
|
43
|
+
insert into t_real (id) values (1);
|
|
44
|
+
|
|
45
|
+
select typeof(r), r from t_real where id = 1;
|
|
46
|
+
→ [{"typeof(r)":"real","r":4.36}]
|
|
47
|
+
|
|
48
|
+
drop table t_real;
|
|
49
|
+
|
|
50
|
+
-- ===================================
|
|
51
|
+
-- 4. INSERT DEFAULT VALUES — Quereus requires explicit VALUES or SELECT
|
|
52
|
+
-- ===================================
|
|
53
|
+
|
|
54
|
+
create table t_dv (
|
|
55
|
+
id integer primary key default 1,
|
|
56
|
+
a integer default 7,
|
|
57
|
+
b text default 'x'
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
insert into t_dv default values;
|
|
61
|
+
-- error: Expected VALUES, SELECT, or DML
|
|
62
|
+
|
|
63
|
+
drop table t_dv;
|
|
64
|
+
|
|
65
|
+
-- ===================================
|
|
66
|
+
-- 5. DEFAULT combined with NOT NULL + UNIQUE + CHECK
|
|
67
|
+
-- ===================================
|
|
68
|
+
|
|
69
|
+
create table t_combo (
|
|
70
|
+
id integer primary key,
|
|
71
|
+
b integer default 12345 unique not null check (b >= 0 and b < 99999)
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
insert into t_combo (id) values (1);
|
|
75
|
+
|
|
76
|
+
select b from t_combo where id = 1;
|
|
77
|
+
→ [{"b":12345}]
|
|
78
|
+
|
|
79
|
+
-- second insert reuses default → UNIQUE conflict
|
|
80
|
+
insert into t_combo (id) values (2);
|
|
81
|
+
-- error:
|
|
82
|
+
|
|
83
|
+
drop table t_combo;
|
|
84
|
+
|
|
85
|
+
-- ===================================
|
|
86
|
+
-- 6. Bind parameter in DEFAULT rejected at DDL time
|
|
87
|
+
-- ===================================
|
|
88
|
+
|
|
89
|
+
create table t_param (id integer primary key, b text default (:xyz));
|
|
90
|
+
-- error: bind parameters
|
|
91
|
+
drop table if exists t_param;
|
|
92
|
+
|
|
93
|
+
-- ===================================
|
|
94
|
+
-- 7. Column reference inside DEFAULT rejected
|
|
95
|
+
-- ===================================
|
|
96
|
+
|
|
97
|
+
create table t_colref (id integer primary key, x integer not null, y integer default (x + 1));
|
|
98
|
+
-- error: generated column
|
|
99
|
+
drop table if exists t_colref;
|