@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,566 @@
|
|
|
1
|
+
-- ALTER TABLE ADD COLUMN ... GENERATED ALWAYS AS backfills the existing rows.
|
|
2
|
+
--
|
|
3
|
+
-- A generated column's value is a pure function of its row, so adding one to a
|
|
4
|
+
-- populated table must compute it for the rows that are already there — the same
|
|
5
|
+
-- value the identical declaration in CREATE TABLE would produce, and the same value
|
|
6
|
+
-- a fresh INSERT produces afterwards. Anything the recomputation cannot honour
|
|
7
|
+
-- (NOT NULL left NULL, an inline CHECK violated) rejects the whole ALTER and leaves
|
|
8
|
+
-- the table exactly as it was.
|
|
9
|
+
--
|
|
10
|
+
-- Runs under both the memory module (`yarn test`) and the store module
|
|
11
|
+
-- (`yarn test:store`).
|
|
12
|
+
|
|
13
|
+
-- ============================================================
|
|
14
|
+
-- 1. Every spelling backfills: bare, VIRTUAL, STORED
|
|
15
|
+
--
|
|
16
|
+
-- VIRTUAL and STORED are not distinguished by this engine — a generated column's
|
|
17
|
+
-- value is materialized at write time either way — so all three must agree.
|
|
18
|
+
-- ============================================================
|
|
19
|
+
|
|
20
|
+
create table t_bare (id integer primary key, v integer);
|
|
21
|
+
insert into t_bare values (1, 5);
|
|
22
|
+
-- run
|
|
23
|
+
|
|
24
|
+
alter table t_bare add column g integer generated always as (v * 2);
|
|
25
|
+
-- run
|
|
26
|
+
|
|
27
|
+
-- Row 2 arrives AFTER the ALTER, through the ordinary write path. The backfilled
|
|
28
|
+
-- row and the inserted row must agree.
|
|
29
|
+
insert into t_bare (id, v) values (2, 7);
|
|
30
|
+
-- run
|
|
31
|
+
|
|
32
|
+
select id, v, g from t_bare order by id;
|
|
33
|
+
→ [{"id":1,"v":5,"g":10},{"id":2,"v":7,"g":14}]
|
|
34
|
+
|
|
35
|
+
drop table t_bare;
|
|
36
|
+
-- run
|
|
37
|
+
|
|
38
|
+
create table t_virtual (id integer primary key, v integer);
|
|
39
|
+
insert into t_virtual values (1, 5);
|
|
40
|
+
-- run
|
|
41
|
+
|
|
42
|
+
alter table t_virtual add column g integer null generated always as (v * 2) virtual;
|
|
43
|
+
-- run
|
|
44
|
+
|
|
45
|
+
insert into t_virtual (id, v) values (2, 7);
|
|
46
|
+
-- run
|
|
47
|
+
|
|
48
|
+
select id, v, g from t_virtual order by id;
|
|
49
|
+
→ [{"id":1,"v":5,"g":10},{"id":2,"v":7,"g":14}]
|
|
50
|
+
|
|
51
|
+
drop table t_virtual;
|
|
52
|
+
-- run
|
|
53
|
+
|
|
54
|
+
create table t_stored (id integer primary key, v integer);
|
|
55
|
+
insert into t_stored values (1, 5);
|
|
56
|
+
-- run
|
|
57
|
+
|
|
58
|
+
alter table t_stored add column g integer null generated always as (v * 2) stored;
|
|
59
|
+
-- run
|
|
60
|
+
|
|
61
|
+
insert into t_stored (id, v) values (2, 7);
|
|
62
|
+
-- run
|
|
63
|
+
|
|
64
|
+
select id, v, g from t_stored order by id;
|
|
65
|
+
→ [{"id":1,"v":5,"g":10},{"id":2,"v":7,"g":14}]
|
|
66
|
+
|
|
67
|
+
-- The column reports as generated in the catalog (1 = VIRTUAL, 2 = STORED). The
|
|
68
|
+
-- distinction is informational only — both spellings materialize at write time.
|
|
69
|
+
select name, "generated" from table_info('t_stored') where name = 'g';
|
|
70
|
+
→ [{"name":"g","generated":2}]
|
|
71
|
+
|
|
72
|
+
drop table t_stored;
|
|
73
|
+
-- run
|
|
74
|
+
|
|
75
|
+
-- ============================================================
|
|
76
|
+
-- 2. A constant generated expression still backfills
|
|
77
|
+
--
|
|
78
|
+
-- A generated column has no DEFAULT to bulk-write, so the literal-folding
|
|
79
|
+
-- shortcut the DEFAULT path takes must NOT apply here — folding it would leave
|
|
80
|
+
-- every existing row NULL.
|
|
81
|
+
-- ============================================================
|
|
82
|
+
|
|
83
|
+
create table t_const (id integer primary key, v integer);
|
|
84
|
+
insert into t_const values (1, 5);
|
|
85
|
+
-- run
|
|
86
|
+
|
|
87
|
+
alter table t_const add column g integer null generated always as (2);
|
|
88
|
+
-- run
|
|
89
|
+
|
|
90
|
+
insert into t_const (id, v) values (2, 7);
|
|
91
|
+
-- run
|
|
92
|
+
|
|
93
|
+
select id, g from t_const order by id;
|
|
94
|
+
→ [{"id":1,"g":2},{"id":2,"g":2}]
|
|
95
|
+
|
|
96
|
+
drop table t_const;
|
|
97
|
+
-- run
|
|
98
|
+
|
|
99
|
+
-- ============================================================
|
|
100
|
+
-- 3. A generated expression over an existing generated column
|
|
101
|
+
--
|
|
102
|
+
-- `h` is already materialized in every stored row, so `g` reads it during the
|
|
103
|
+
-- backfill exactly as it would during an INSERT.
|
|
104
|
+
-- ============================================================
|
|
105
|
+
|
|
106
|
+
create table t_chain (id integer primary key, v integer, h integer generated always as (v + 1));
|
|
107
|
+
insert into t_chain (id, v) values (1, 5);
|
|
108
|
+
-- run
|
|
109
|
+
|
|
110
|
+
alter table t_chain add column g integer null generated always as (h * 10);
|
|
111
|
+
-- run
|
|
112
|
+
|
|
113
|
+
insert into t_chain (id, v) values (2, 7);
|
|
114
|
+
-- run
|
|
115
|
+
|
|
116
|
+
select id, v, h, g from t_chain order by id;
|
|
117
|
+
→ [{"id":1,"v":5,"h":6,"g":60},{"id":2,"v":7,"h":8,"g":80}]
|
|
118
|
+
|
|
119
|
+
drop table t_chain;
|
|
120
|
+
-- run
|
|
121
|
+
|
|
122
|
+
-- ============================================================
|
|
123
|
+
-- 4. Type conversion: the backfilled cell matches what an INSERT stores
|
|
124
|
+
-- ============================================================
|
|
125
|
+
|
|
126
|
+
create table t_coerce (id integer primary key, v text);
|
|
127
|
+
insert into t_coerce values (1, '7');
|
|
128
|
+
-- run
|
|
129
|
+
|
|
130
|
+
alter table t_coerce add column g integer null generated always as (v || '0');
|
|
131
|
+
-- run
|
|
132
|
+
|
|
133
|
+
insert into t_coerce (id, v) values (2, '2');
|
|
134
|
+
-- run
|
|
135
|
+
|
|
136
|
+
select id, g, typeof(g) as t from t_coerce order by id;
|
|
137
|
+
→ [{"id":1,"g":70,"t":"integer"},{"id":2,"g":20,"t":"integer"}]
|
|
138
|
+
|
|
139
|
+
drop table t_coerce;
|
|
140
|
+
-- run
|
|
141
|
+
|
|
142
|
+
-- ============================================================
|
|
143
|
+
-- 5. NOT NULL generated: accepted when the expression is total ...
|
|
144
|
+
-- ============================================================
|
|
145
|
+
|
|
146
|
+
create table t_nn (id integer primary key, v integer);
|
|
147
|
+
insert into t_nn values (1, 5), (2, 7);
|
|
148
|
+
-- run
|
|
149
|
+
|
|
150
|
+
alter table t_nn add column g integer not null generated always as (v * 2);
|
|
151
|
+
-- run
|
|
152
|
+
|
|
153
|
+
insert into t_nn (id, v) values (3, 9);
|
|
154
|
+
-- run
|
|
155
|
+
|
|
156
|
+
select id, g from t_nn order by id;
|
|
157
|
+
→ [{"id":1,"g":10},{"id":2,"g":14},{"id":3,"g":18}]
|
|
158
|
+
|
|
159
|
+
drop table t_nn;
|
|
160
|
+
-- run
|
|
161
|
+
|
|
162
|
+
-- ... and rejected, table untouched, when it yields NULL for an existing row.
|
|
163
|
+
create table t_nn_bad (id integer primary key, v integer null);
|
|
164
|
+
insert into t_nn_bad values (1, 5), (2, null);
|
|
165
|
+
-- run
|
|
166
|
+
|
|
167
|
+
alter table t_nn_bad add column g integer not null generated always as (v * 2);
|
|
168
|
+
-- error: NOT NULL constraint failed
|
|
169
|
+
|
|
170
|
+
-- The ALTER was reverted whole: the column is gone and the rows are unchanged.
|
|
171
|
+
select * from t_nn_bad order by id;
|
|
172
|
+
→ [{"id":1,"v":5},{"id":2,"v":null}]
|
|
173
|
+
|
|
174
|
+
drop table t_nn_bad;
|
|
175
|
+
-- run
|
|
176
|
+
|
|
177
|
+
-- ============================================================
|
|
178
|
+
-- 6. An inline CHECK over the new column is enforced per backfilled row
|
|
179
|
+
--
|
|
180
|
+
-- Before the backfill existed the CHECK saw NULL and `not (null > 100)` is NULL,
|
|
181
|
+
-- so the violation went unnoticed. With a real value the ALTER must reject.
|
|
182
|
+
-- ============================================================
|
|
183
|
+
|
|
184
|
+
create table t_check (id integer primary key, v integer);
|
|
185
|
+
insert into t_check values (1, 5);
|
|
186
|
+
-- run
|
|
187
|
+
|
|
188
|
+
alter table t_check add column g integer null generated always as (v * 2) check (g > 100);
|
|
189
|
+
-- error: CHECK constraint failed
|
|
190
|
+
|
|
191
|
+
select * from t_check order by id;
|
|
192
|
+
→ [{"id":1,"v":5}]
|
|
193
|
+
|
|
194
|
+
-- The same declaration whose values satisfy the CHECK is accepted.
|
|
195
|
+
alter table t_check add column g integer null generated always as (v * 2) check (g > 0);
|
|
196
|
+
-- run
|
|
197
|
+
|
|
198
|
+
select id, g from t_check order by id;
|
|
199
|
+
→ [{"id":1,"g":10}]
|
|
200
|
+
|
|
201
|
+
drop table t_check;
|
|
202
|
+
-- run
|
|
203
|
+
|
|
204
|
+
-- ============================================================
|
|
205
|
+
-- 7. A non-deterministic generated expression is rejected at ALTER time
|
|
206
|
+
--
|
|
207
|
+
-- Matches the DEFAULT arm, which validates at plan-build regardless of row count,
|
|
208
|
+
-- rather than deferring the failure to the next INSERT.
|
|
209
|
+
-- ============================================================
|
|
210
|
+
|
|
211
|
+
create table t_nondet (id integer primary key, v integer);
|
|
212
|
+
insert into t_nondet values (1, 5);
|
|
213
|
+
-- run
|
|
214
|
+
|
|
215
|
+
alter table t_nondet add column g integer null generated always as (random());
|
|
216
|
+
-- error: Non-deterministic expression not allowed in GENERATED ALWAYS AS
|
|
217
|
+
|
|
218
|
+
select * from t_nondet order by id;
|
|
219
|
+
→ [{"id":1,"v":5}]
|
|
220
|
+
|
|
221
|
+
drop table t_nondet;
|
|
222
|
+
-- run
|
|
223
|
+
|
|
224
|
+
-- Empty table: same rejection, so DDL acceptance does not depend on the data.
|
|
225
|
+
create table t_nondet_empty (id integer primary key, v integer);
|
|
226
|
+
-- run
|
|
227
|
+
|
|
228
|
+
alter table t_nondet_empty add column g integer null generated always as (random());
|
|
229
|
+
-- error: Non-deterministic expression not allowed in GENERATED ALWAYS AS
|
|
230
|
+
|
|
231
|
+
drop table t_nondet_empty;
|
|
232
|
+
-- run
|
|
233
|
+
|
|
234
|
+
-- ============================================================
|
|
235
|
+
-- 8. A bad generated expression is reported the way CREATE TABLE reports it
|
|
236
|
+
--
|
|
237
|
+
-- The expression is compiled against a scope holding only the EXISTING columns, so
|
|
238
|
+
-- without a pre-flight an unknown name — or the new column's own name — would surface
|
|
239
|
+
-- as a bare "Column not found". Both must keep naming the generated column.
|
|
240
|
+
-- ============================================================
|
|
241
|
+
|
|
242
|
+
create table t_badref (id integer primary key, v integer);
|
|
243
|
+
insert into t_badref values (1, 5);
|
|
244
|
+
-- run
|
|
245
|
+
|
|
246
|
+
alter table t_badref add column g integer null generated always as (nope * 2);
|
|
247
|
+
-- error: Column 'nope' referenced by generated column 'g' not found in table 't_badref'
|
|
248
|
+
|
|
249
|
+
alter table t_badref add column g integer null generated always as (g + 1);
|
|
250
|
+
-- error: Cyclic dependency in generated columns: 'g'
|
|
251
|
+
|
|
252
|
+
select * from t_badref order by id;
|
|
253
|
+
→ [{"id":1,"v":5}]
|
|
254
|
+
|
|
255
|
+
drop table t_badref;
|
|
256
|
+
-- run
|
|
257
|
+
|
|
258
|
+
-- ============================================================
|
|
259
|
+
-- 9. The declarative route (declare schema + apply schema)
|
|
260
|
+
--
|
|
261
|
+
-- The differ emits the same ADD COLUMN through the same emitter, so a generated
|
|
262
|
+
-- column declared onto a populated table backfills identically.
|
|
263
|
+
-- ============================================================
|
|
264
|
+
|
|
265
|
+
declare schema main {
|
|
266
|
+
table t_decl {
|
|
267
|
+
id INTEGER PRIMARY KEY,
|
|
268
|
+
v INTEGER
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
-- run
|
|
272
|
+
|
|
273
|
+
apply schema main;
|
|
274
|
+
-- run
|
|
275
|
+
|
|
276
|
+
insert into t_decl values (1, 5);
|
|
277
|
+
-- run
|
|
278
|
+
|
|
279
|
+
declare schema main {
|
|
280
|
+
table t_decl {
|
|
281
|
+
id INTEGER PRIMARY KEY,
|
|
282
|
+
v INTEGER,
|
|
283
|
+
g INTEGER NULL GENERATED ALWAYS AS (v * 2)
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
-- run
|
|
287
|
+
|
|
288
|
+
apply schema main;
|
|
289
|
+
-- run
|
|
290
|
+
|
|
291
|
+
insert into t_decl (id, v) values (2, 7);
|
|
292
|
+
-- run
|
|
293
|
+
|
|
294
|
+
select id, v, g from t_decl order by id;
|
|
295
|
+
→ [{"id":1,"v":5,"g":10},{"id":2,"v":7,"g":14}]
|
|
296
|
+
|
|
297
|
+
drop table t_decl;
|
|
298
|
+
-- run
|
|
299
|
+
|
|
300
|
+
-- ============================================================
|
|
301
|
+
-- 10. Rows staged in the open transaction backfill too
|
|
302
|
+
--
|
|
303
|
+
-- The ALTER runs while the transaction holds an uncommitted row. Both the committed
|
|
304
|
+
-- row and the staged one must carry the computed value, and the staged row must
|
|
305
|
+
-- still commit. (Memory stages in its transaction layers, the store in the isolation
|
|
306
|
+
-- overlay; both run the same evaluator over the staged rows.)
|
|
307
|
+
-- ============================================================
|
|
308
|
+
|
|
309
|
+
create table t_staged (id integer primary key, v integer);
|
|
310
|
+
insert into t_staged values (1, 5);
|
|
311
|
+
-- run
|
|
312
|
+
|
|
313
|
+
begin;
|
|
314
|
+
-- run
|
|
315
|
+
|
|
316
|
+
insert into t_staged values (2, 7);
|
|
317
|
+
-- run
|
|
318
|
+
|
|
319
|
+
alter table t_staged add column g integer null generated always as (v * 2);
|
|
320
|
+
-- run
|
|
321
|
+
|
|
322
|
+
select id, v, g from t_staged order by id;
|
|
323
|
+
→ [{"id":1,"v":5,"g":10},{"id":2,"v":7,"g":14}]
|
|
324
|
+
|
|
325
|
+
insert into t_staged (id, v) values (3, 9);
|
|
326
|
+
-- run
|
|
327
|
+
|
|
328
|
+
commit;
|
|
329
|
+
-- run
|
|
330
|
+
|
|
331
|
+
select id, v, g from t_staged order by id;
|
|
332
|
+
→ [{"id":1,"v":5,"g":10},{"id":2,"v":7,"g":14},{"id":3,"v":9,"g":18}]
|
|
333
|
+
|
|
334
|
+
drop table t_staged;
|
|
335
|
+
-- run
|
|
336
|
+
|
|
337
|
+
-- ============================================================
|
|
338
|
+
-- 11. An inline UNIQUE over the new column sees the backfilled values
|
|
339
|
+
--
|
|
340
|
+
-- The constraint-install loop runs after the backfill, so the covering structure is
|
|
341
|
+
-- built over real computed values — distinct ones are accepted, colliding ones reject
|
|
342
|
+
-- the whole ALTER.
|
|
343
|
+
-- ============================================================
|
|
344
|
+
|
|
345
|
+
create table t_uniq (id integer primary key, v integer);
|
|
346
|
+
insert into t_uniq values (1, 5), (2, 6);
|
|
347
|
+
-- run
|
|
348
|
+
|
|
349
|
+
alter table t_uniq add column g integer null generated always as (v * 2) unique;
|
|
350
|
+
-- run
|
|
351
|
+
|
|
352
|
+
select id, g from t_uniq order by id;
|
|
353
|
+
→ [{"id":1,"g":10},{"id":2,"g":12}]
|
|
354
|
+
|
|
355
|
+
drop table t_uniq;
|
|
356
|
+
-- run
|
|
357
|
+
|
|
358
|
+
create table t_uniq_bad (id integer primary key, v integer);
|
|
359
|
+
insert into t_uniq_bad values (1, 5), (2, 5);
|
|
360
|
+
-- run
|
|
361
|
+
|
|
362
|
+
alter table t_uniq_bad add column g integer null generated always as (v * 2) unique;
|
|
363
|
+
-- error: UNIQUE constraint failed
|
|
364
|
+
|
|
365
|
+
-- Reverted whole: the column is gone and the rows are unchanged.
|
|
366
|
+
select * from t_uniq_bad order by id;
|
|
367
|
+
→ [{"id":1,"v":5},{"id":2,"v":5}]
|
|
368
|
+
|
|
369
|
+
drop table t_uniq_bad;
|
|
370
|
+
-- run
|
|
371
|
+
|
|
372
|
+
-- ============================================================
|
|
373
|
+
-- 12. A generated column whose name is already taken is a DUPLICATE, not a cycle
|
|
374
|
+
--
|
|
375
|
+
-- The self-reference rejection in section 8 must not swallow this: `v` here resolves
|
|
376
|
+
-- to the existing sibling, and the real problem is that the table already has a `v`.
|
|
377
|
+
-- ============================================================
|
|
378
|
+
|
|
379
|
+
create table t_dup (id integer primary key, v integer);
|
|
380
|
+
insert into t_dup values (1, 5);
|
|
381
|
+
-- run
|
|
382
|
+
|
|
383
|
+
alter table t_dup add column v integer null generated always as (v * 2);
|
|
384
|
+
-- error: Column 'v' already exists in table 't_dup'
|
|
385
|
+
|
|
386
|
+
alter table t_dup add column v integer null generated always as (id + 1);
|
|
387
|
+
-- error: Column 'v' already exists in table 't_dup'
|
|
388
|
+
|
|
389
|
+
select * from t_dup order by id;
|
|
390
|
+
→ [{"id":1,"v":5}]
|
|
391
|
+
|
|
392
|
+
drop table t_dup;
|
|
393
|
+
-- run
|
|
394
|
+
|
|
395
|
+
-- ============================================================
|
|
396
|
+
-- 13. The added column is a first-class generated column afterwards
|
|
397
|
+
--
|
|
398
|
+
-- Backfilling is only half the job: the ALTER must also register the column in the
|
|
399
|
+
-- table's generated-column graph, so UPDATEing a source column recomputes it and
|
|
400
|
+
-- writing to it directly is refused — exactly as for a CREATE TABLE-declared one.
|
|
401
|
+
-- ============================================================
|
|
402
|
+
|
|
403
|
+
create table t_after (id integer primary key, v integer);
|
|
404
|
+
insert into t_after values (1, 5);
|
|
405
|
+
-- run
|
|
406
|
+
|
|
407
|
+
alter table t_after add column g integer null generated always as (v * 2);
|
|
408
|
+
-- run
|
|
409
|
+
|
|
410
|
+
update t_after set v = 20 where id = 1;
|
|
411
|
+
-- run
|
|
412
|
+
|
|
413
|
+
select id, v, g from t_after order by id;
|
|
414
|
+
→ [{"id":1,"v":20,"g":40}]
|
|
415
|
+
|
|
416
|
+
update t_after set g = 1 where id = 1;
|
|
417
|
+
-- error: Cannot UPDATE generated column 'g'
|
|
418
|
+
|
|
419
|
+
insert into t_after (id, v, g) values (2, 3, 99);
|
|
420
|
+
-- error: Cannot INSERT into generated column 'g'
|
|
421
|
+
|
|
422
|
+
select id, v, g from t_after order by id;
|
|
423
|
+
→ [{"id":1,"v":20,"g":40}]
|
|
424
|
+
|
|
425
|
+
drop table t_after;
|
|
426
|
+
-- run
|
|
427
|
+
|
|
428
|
+
-- ============================================================
|
|
429
|
+
-- 14. Every accepted spelling backfills AND stays writable afterwards
|
|
430
|
+
--
|
|
431
|
+
-- The declaration this ALTER accepts must be one every subsequent INSERT accepts:
|
|
432
|
+
-- the backfill and the write path compile the same stored body, through the same
|
|
433
|
+
-- builder (`planner/building/generated-column-scope.ts`). `new.<col>` is the arm
|
|
434
|
+
-- that used to break — the ALTER accepted it and backfilled correctly, and then
|
|
435
|
+
-- every INSERT afterwards failed with `new.<col> isn't a column`, leaving a table
|
|
436
|
+
-- that could never gain another row.
|
|
437
|
+
--
|
|
438
|
+
-- Each arm: backfill an existing row, insert a new one, update the source column.
|
|
439
|
+
-- All three must agree. The CREATE TABLE side of the same matrix lives in
|
|
440
|
+
-- 41-generated-columns.sqllogic.
|
|
441
|
+
-- ============================================================
|
|
442
|
+
|
|
443
|
+
create table t_sp_bare (id integer primary key, a integer);
|
|
444
|
+
insert into t_sp_bare values (1, 3);
|
|
445
|
+
-- run
|
|
446
|
+
|
|
447
|
+
alter table t_sp_bare add column g integer generated always as (a + 1);
|
|
448
|
+
-- run
|
|
449
|
+
|
|
450
|
+
insert into t_sp_bare (id, a) values (2, 5);
|
|
451
|
+
update t_sp_bare set a = 10 where id = 1;
|
|
452
|
+
-- run
|
|
453
|
+
|
|
454
|
+
select id, a, g from t_sp_bare order by id;
|
|
455
|
+
→ [{"id":1,"a":10,"g":11},{"id":2,"a":5,"g":6}]
|
|
456
|
+
|
|
457
|
+
drop table t_sp_bare;
|
|
458
|
+
-- run
|
|
459
|
+
|
|
460
|
+
create table t_sp_tbl (id integer primary key, a integer);
|
|
461
|
+
insert into t_sp_tbl values (1, 3);
|
|
462
|
+
-- run
|
|
463
|
+
|
|
464
|
+
alter table t_sp_tbl add column g integer generated always as (t_sp_tbl.a + 1);
|
|
465
|
+
-- run
|
|
466
|
+
|
|
467
|
+
insert into t_sp_tbl (id, a) values (2, 5);
|
|
468
|
+
update t_sp_tbl set a = 10 where id = 1;
|
|
469
|
+
-- run
|
|
470
|
+
|
|
471
|
+
select id, a, g from t_sp_tbl order by id;
|
|
472
|
+
→ [{"id":1,"a":10,"g":11},{"id":2,"a":5,"g":6}]
|
|
473
|
+
|
|
474
|
+
drop table t_sp_tbl;
|
|
475
|
+
-- run
|
|
476
|
+
|
|
477
|
+
create table t_sp_sch (id integer primary key, a integer);
|
|
478
|
+
insert into t_sp_sch values (1, 3);
|
|
479
|
+
-- run
|
|
480
|
+
|
|
481
|
+
alter table t_sp_sch add column g integer generated always as (main.t_sp_sch.a + 1);
|
|
482
|
+
-- run
|
|
483
|
+
|
|
484
|
+
insert into t_sp_sch (id, a) values (2, 5);
|
|
485
|
+
update t_sp_sch set a = 10 where id = 1;
|
|
486
|
+
-- run
|
|
487
|
+
|
|
488
|
+
select id, a, g from t_sp_sch order by id;
|
|
489
|
+
→ [{"id":1,"a":10,"g":11},{"id":2,"a":5,"g":6}]
|
|
490
|
+
|
|
491
|
+
drop table t_sp_sch;
|
|
492
|
+
-- run
|
|
493
|
+
|
|
494
|
+
create table t_sp_new (id integer primary key, a integer);
|
|
495
|
+
insert into t_sp_new values (1, 3);
|
|
496
|
+
-- run
|
|
497
|
+
|
|
498
|
+
alter table t_sp_new add column g integer generated always as (new.a + 1);
|
|
499
|
+
-- run
|
|
500
|
+
|
|
501
|
+
insert into t_sp_new (id, a) values (2, 5);
|
|
502
|
+
update t_sp_new set a = 10 where id = 1;
|
|
503
|
+
-- run
|
|
504
|
+
|
|
505
|
+
select id, a, g from t_sp_new order by id;
|
|
506
|
+
→ [{"id":1,"a":10,"g":11},{"id":2,"a":5,"g":6}]
|
|
507
|
+
|
|
508
|
+
drop table t_sp_new;
|
|
509
|
+
-- run
|
|
510
|
+
|
|
511
|
+
-- ============================================================
|
|
512
|
+
-- 15. A second ADD COLUMN reading the first added generated column
|
|
513
|
+
--
|
|
514
|
+
-- `new.g1` names the freshly computed g1, exactly as a bare `g1` does — at
|
|
515
|
+
-- backfill time and on every write afterwards.
|
|
516
|
+
-- ============================================================
|
|
517
|
+
|
|
518
|
+
create table t_sp_chain (id integer primary key, a integer);
|
|
519
|
+
insert into t_sp_chain values (1, 5);
|
|
520
|
+
-- run
|
|
521
|
+
|
|
522
|
+
alter table t_sp_chain add column g1 integer generated always as (a * 2);
|
|
523
|
+
alter table t_sp_chain add column g2 integer generated always as (new.g1 + 1);
|
|
524
|
+
-- run
|
|
525
|
+
|
|
526
|
+
select id, a, g1, g2 from t_sp_chain order by id;
|
|
527
|
+
→ [{"id":1,"a":5,"g1":10,"g2":11}]
|
|
528
|
+
|
|
529
|
+
insert into t_sp_chain (id, a) values (2, 7);
|
|
530
|
+
update t_sp_chain set a = 10 where id = 1;
|
|
531
|
+
-- run
|
|
532
|
+
|
|
533
|
+
select id, a, g1, g2 from t_sp_chain order by id;
|
|
534
|
+
→ [{"id":1,"a":10,"g1":20,"g2":21},{"id":2,"a":7,"g1":14,"g2":15}]
|
|
535
|
+
|
|
536
|
+
drop table t_sp_chain;
|
|
537
|
+
-- run
|
|
538
|
+
|
|
539
|
+
-- ============================================================
|
|
540
|
+
-- 16. A declared COLLATE applies inside a backfilled generated body
|
|
541
|
+
--
|
|
542
|
+
-- The backfill compiles the body through the same builder the write paths use,
|
|
543
|
+
-- which resolves each column reference at its DECLARED type — collation
|
|
544
|
+
-- included. So an existing row backfills by the same comparison a later INSERT
|
|
545
|
+
-- computes with.
|
|
546
|
+
-- ============================================================
|
|
547
|
+
|
|
548
|
+
create table t_sp_coll (id integer primary key, a text collate nocase);
|
|
549
|
+
insert into t_sp_coll values (1, 'abc');
|
|
550
|
+
-- run
|
|
551
|
+
|
|
552
|
+
alter table t_sp_coll add column g integer generated always as (case when a = 'ABC' then 1 else 0 end);
|
|
553
|
+
-- run
|
|
554
|
+
|
|
555
|
+
select id, a, g from t_sp_coll order by id;
|
|
556
|
+
→ [{"id":1,"a":"abc","g":1}]
|
|
557
|
+
|
|
558
|
+
insert into t_sp_coll (id, a) values (2, 'AbC');
|
|
559
|
+
insert into t_sp_coll (id, a) values (3, 'abd');
|
|
560
|
+
-- run
|
|
561
|
+
|
|
562
|
+
select id, g from t_sp_coll order by id;
|
|
563
|
+
→ [{"id":1,"g":1},{"id":2,"g":1},{"id":3,"g":0}]
|
|
564
|
+
|
|
565
|
+
drop table t_sp_coll;
|
|
566
|
+
-- run
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
-- ALTER TABLE ADD COLUMN's DEFAULT / GENERATED ALWAYS AS / inline CHECK may read another
|
|
2
|
+
-- table (a correlated or uncorrelated subquery), and the backfill still runs per row.
|
|
3
|
+
--
|
|
4
|
+
-- Regression for bug-alter-add-column-relation-default-fails-to-emit: `AlterTableNode`
|
|
5
|
+
-- held the backfill and CHECK expressions off the child-node graph the optimizer walks
|
|
6
|
+
-- (`getChildren()`/`withChildren()`), so a subquery inside either reached the runtime
|
|
7
|
+
-- unphysicalized and the whole ALTER errored — a simple expression default (nothing to
|
|
8
|
+
-- rewrite) worked, so this was invisible until the default read another table.
|
|
9
|
+
--
|
|
10
|
+
-- Runs under both the memory module (`yarn test`) and the store module (`yarn
|
|
11
|
+
-- test:store`).
|
|
12
|
+
|
|
13
|
+
create table d (k integer);
|
|
14
|
+
insert into d values (1);
|
|
15
|
+
-- run
|
|
16
|
+
|
|
17
|
+
create table a1 (id integer primary key);
|
|
18
|
+
insert into a1 values (1);
|
|
19
|
+
-- run
|
|
20
|
+
|
|
21
|
+
-- 1. Uncorrelated aggregate subquery DEFAULT.
|
|
22
|
+
alter table a1 add column w integer default (select count(*) from d);
|
|
23
|
+
-- run
|
|
24
|
+
|
|
25
|
+
select id, w from a1 order by id;
|
|
26
|
+
→ [{"id":1,"w":1}]
|
|
27
|
+
|
|
28
|
+
-- 2. Uncorrelated scalar subquery DEFAULT (LIMIT 1).
|
|
29
|
+
alter table a1 add column x integer default ((select k from d limit 1));
|
|
30
|
+
-- run
|
|
31
|
+
|
|
32
|
+
select id, x from a1 order by id;
|
|
33
|
+
→ [{"id":1,"x":1}]
|
|
34
|
+
|
|
35
|
+
-- 3. GENERATED ALWAYS AS over a subquery — always a per-row backfill (a generated
|
|
36
|
+
-- column has no `defaultValue` for the module to bulk-write).
|
|
37
|
+
alter table a1 add column g integer generated always as ((select count(*) from d));
|
|
38
|
+
-- run
|
|
39
|
+
|
|
40
|
+
select id, g from a1 order by id;
|
|
41
|
+
→ [{"id":1,"g":1}]
|
|
42
|
+
|
|
43
|
+
-- 4. A per-row DEFAULT (`new.id`) with an inline CHECK that itself reads another
|
|
44
|
+
-- table — accepted when the CHECK passes.
|
|
45
|
+
alter table a1 add column z integer default (new.id) check ((select count(*) from d) = 1);
|
|
46
|
+
-- run
|
|
47
|
+
|
|
48
|
+
select id, z from a1 order by id;
|
|
49
|
+
→ [{"id":1,"z":1}]
|
|
50
|
+
|
|
51
|
+
-- 5. Same shape, CHECK fails against the backfilled row — the whole ALTER is
|
|
52
|
+
-- rejected and the table is left exactly as it was (no `zz` column).
|
|
53
|
+
alter table a1 add column zz integer default (new.id) check ((select count(*) from d) = 99);
|
|
54
|
+
-- error: CHECK constraint failed
|
|
55
|
+
|
|
56
|
+
select * from a1 order by id;
|
|
57
|
+
→ [{"id":1,"w":1,"x":1,"g":1,"z":1}]
|
|
58
|
+
|
|
59
|
+
drop table a1;
|
|
60
|
+
-- run
|
|
61
|
+
|
|
62
|
+
-- ===== Multi-row, correlated =====
|
|
63
|
+
-- Every arm above has a single existing row, so it cannot tell a genuine per-row
|
|
64
|
+
-- evaluation from one evaluation replayed for every row. These use three rows and a
|
|
65
|
+
-- subquery correlated to the row being backfilled, so a once-only (or cached) evaluation
|
|
66
|
+
-- shows up as three identical values.
|
|
67
|
+
|
|
68
|
+
create table dd (k integer, v integer);
|
|
69
|
+
insert into dd values (1, 10), (2, 20), (3, 30);
|
|
70
|
+
-- run
|
|
71
|
+
|
|
72
|
+
create table a2 (id integer primary key);
|
|
73
|
+
insert into a2 values (1), (2), (3);
|
|
74
|
+
-- run
|
|
75
|
+
|
|
76
|
+
-- 6. Correlated subquery DEFAULT — a distinct value per existing row.
|
|
77
|
+
alter table a2 add column w integer default ((select v from dd where dd.k = new.id limit 1));
|
|
78
|
+
-- run
|
|
79
|
+
|
|
80
|
+
select id, w from a2 order by id;
|
|
81
|
+
→ [{"id":1,"w":10},{"id":2,"w":20},{"id":3,"w":30}]
|
|
82
|
+
|
|
83
|
+
-- 7. Correlated subquery inside the CHECK, evaluated against each backfilled row.
|
|
84
|
+
alter table a2 add column x integer default (new.id) check ((select v from dd where dd.k = new.id limit 1) = new.id * 10);
|
|
85
|
+
-- run
|
|
86
|
+
|
|
87
|
+
select id, x from a2 order by id;
|
|
88
|
+
→ [{"id":1,"x":1},{"id":2,"x":2},{"id":3,"x":3}]
|
|
89
|
+
|
|
90
|
+
-- 8. TWO inline CHECKs alongside the backfill — three optimizer children, so the
|
|
91
|
+
-- emitter's slot cursor (backfill, then each predicate in order) has to walk past more
|
|
92
|
+
-- than one predicate. The SECOND one fails, which a slot-order bug would misreport.
|
|
93
|
+
alter table a2 add column yy integer default (new.id) check ((select count(*) from dd) = 3) check ((select v from dd where dd.k = new.id limit 1) = 999);
|
|
94
|
+
-- error: CHECK constraint failed
|
|
95
|
+
|
|
96
|
+
-- 9. Same two CHECKs, both true — accepted.
|
|
97
|
+
alter table a2 add column y integer default (new.id) check ((select count(*) from dd) = 3) check ((select v from dd where dd.k = new.id limit 1) = new.id * 10);
|
|
98
|
+
-- run
|
|
99
|
+
|
|
100
|
+
select id, y from a2 order by id;
|
|
101
|
+
→ [{"id":1,"y":1},{"id":2,"y":2},{"id":3,"y":3}]
|
|
102
|
+
|
|
103
|
+
-- 10. GENERATED ALWAYS AS over a correlated subquery, inner reference QUALIFIED (`dd.v`).
|
|
104
|
+
alter table a2 add column g integer generated always as ((select dd.v from dd where dd.k = id limit 1));
|
|
105
|
+
-- run
|
|
106
|
+
|
|
107
|
+
select id, g from a2 order by id;
|
|
108
|
+
→ [{"id":1,"g":10},{"id":2,"g":20},{"id":3,"g":30}]
|
|
109
|
+
|
|
110
|
+
-- 11. Same shape, inner reference UNQUALIFIED (`v`): the subquery's own FROM binds it,
|
|
111
|
+
-- so the generated-column reference analysis leaves it to that source instead of
|
|
112
|
+
-- reading it as a (missing) column of this table.
|
|
113
|
+
alter table a2 add column h integer generated always as ((select v from dd where dd.k = id limit 1));
|
|
114
|
+
-- run
|
|
115
|
+
|
|
116
|
+
select id, h from a2 order by id;
|
|
117
|
+
→ [{"id":1,"h":10},{"id":2,"h":20},{"id":3,"h":30}]
|
|
118
|
+
|
|
119
|
+
select * from a2 order by id;
|
|
120
|
+
→ [{"id":1,"w":10,"x":1,"y":1,"g":10,"h":10},{"id":2,"w":20,"x":2,"y":2,"g":20,"h":20},{"id":3,"w":30,"x":3,"y":3,"g":30,"h":30}]
|
|
121
|
+
|
|
122
|
+
drop table a2;
|
|
123
|
+
-- run
|
|
124
|
+
|
|
125
|
+
drop table dd;
|
|
126
|
+
-- run
|
|
127
|
+
|
|
128
|
+
drop table d;
|
|
129
|
+
-- run
|