@quereus/quereus 4.20.1 → 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/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,598 @@
|
|
|
1
|
+
-- adapted from SQLite test/gencol1.test
|
|
2
|
+
-- Generated-column scenarios beyond 41-generated-columns.sqllogic.
|
|
3
|
+
|
|
4
|
+
-- ===================================
|
|
5
|
+
-- 1. Chain — generated column referencing another generated column
|
|
6
|
+
-- ===================================
|
|
7
|
+
|
|
8
|
+
create table t_chain (
|
|
9
|
+
id integer primary key,
|
|
10
|
+
a integer not null,
|
|
11
|
+
m integer generated always as (a * 2) stored,
|
|
12
|
+
w integer generated always as (m * 5) stored
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
insert into t_chain (id, a) values (1, 3);
|
|
16
|
+
|
|
17
|
+
select a, m, w from t_chain where id = 1;
|
|
18
|
+
→ [{"a":3,"m":6,"w":30}]
|
|
19
|
+
|
|
20
|
+
update t_chain set a = 4 where id = 1;
|
|
21
|
+
|
|
22
|
+
select a, m, w from t_chain where id = 1;
|
|
23
|
+
→ [{"a":4,"m":8,"w":40}]
|
|
24
|
+
|
|
25
|
+
drop table t_chain;
|
|
26
|
+
|
|
27
|
+
-- ===================================
|
|
28
|
+
-- 1b. Reverse-declaration-order chain — `w` declared before its dependency `m`
|
|
29
|
+
-- ===================================
|
|
30
|
+
|
|
31
|
+
create table t_chain_rev (
|
|
32
|
+
id integer primary key,
|
|
33
|
+
a integer not null,
|
|
34
|
+
w integer generated always as (m * 5) stored,
|
|
35
|
+
m integer generated always as (a * 2) stored
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
insert into t_chain_rev (id, a) values (1, 3);
|
|
39
|
+
|
|
40
|
+
select a, m, w from t_chain_rev where id = 1;
|
|
41
|
+
→ [{"a":3,"m":6,"w":30}]
|
|
42
|
+
|
|
43
|
+
update t_chain_rev set a = 4 where id = 1;
|
|
44
|
+
|
|
45
|
+
select a, m, w from t_chain_rev where id = 1;
|
|
46
|
+
→ [{"a":4,"m":8,"w":40}]
|
|
47
|
+
|
|
48
|
+
drop table t_chain_rev;
|
|
49
|
+
|
|
50
|
+
-- ===================================
|
|
51
|
+
-- 2. Generated column used in WHERE / ORDER BY / GROUP BY
|
|
52
|
+
-- ===================================
|
|
53
|
+
|
|
54
|
+
create table t_q (
|
|
55
|
+
id integer primary key,
|
|
56
|
+
a integer not null,
|
|
57
|
+
b integer not null,
|
|
58
|
+
s integer generated always as (a + b) stored
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
insert into t_q (id, a, b) values (1, 1, 2), (2, 3, 1), (3, 2, 2);
|
|
62
|
+
|
|
63
|
+
-- WHERE on generated column
|
|
64
|
+
select id from t_q where s = 4 order by id;
|
|
65
|
+
→ [{"id":2},{"id":3}]
|
|
66
|
+
|
|
67
|
+
-- GROUP BY on generated column
|
|
68
|
+
select s, count(*) as n from t_q group by s order by s;
|
|
69
|
+
→ [{"s":3,"n":1},{"s":4,"n":2}]
|
|
70
|
+
|
|
71
|
+
-- ORDER BY on generated column
|
|
72
|
+
select id, s from t_q order by s desc, id;
|
|
73
|
+
→ [{"id":2,"s":4},{"id":3,"s":4},{"id":1,"s":3}]
|
|
74
|
+
|
|
75
|
+
drop table t_q;
|
|
76
|
+
|
|
77
|
+
-- ===================================
|
|
78
|
+
-- 3. Type coercion via generated column
|
|
79
|
+
-- ===================================
|
|
80
|
+
|
|
81
|
+
create table t_typed (
|
|
82
|
+
id integer primary key,
|
|
83
|
+
c any null,
|
|
84
|
+
t text generated always as (typeof(c)) stored
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
insert into t_typed (id, c) values (1, 5), (2, 'abc'), (3, 5.5), (4, null);
|
|
88
|
+
|
|
89
|
+
select id, t from t_typed order by id;
|
|
90
|
+
→ [{"id":1,"t":"integer"},{"id":2,"t":"text"},{"id":3,"t":"real"},{"id":4,"t":"null"}]
|
|
91
|
+
|
|
92
|
+
drop table t_typed;
|
|
93
|
+
|
|
94
|
+
-- ===================================
|
|
95
|
+
-- 4. Generated column with UNIQUE constraint
|
|
96
|
+
-- ===================================
|
|
97
|
+
|
|
98
|
+
create table t_u (
|
|
99
|
+
id integer primary key,
|
|
100
|
+
a integer not null,
|
|
101
|
+
b integer generated always as (a * 10) stored unique
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
insert into t_u (id, a) values (1, 1), (2, 2);
|
|
105
|
+
|
|
106
|
+
-- duplicate generated value should violate UNIQUE
|
|
107
|
+
insert into t_u (id, a) values (3, 1);
|
|
108
|
+
-- error: UNIQUE
|
|
109
|
+
|
|
110
|
+
drop table t_u;
|
|
111
|
+
|
|
112
|
+
-- ===================================
|
|
113
|
+
-- 5. Generated column as PRIMARY KEY
|
|
114
|
+
-- ===================================
|
|
115
|
+
|
|
116
|
+
create table t_pk (
|
|
117
|
+
a integer not null,
|
|
118
|
+
k integer generated always as (a + 100) stored primary key
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
insert into t_pk (a) values (1);
|
|
122
|
+
|
|
123
|
+
-- duplicate generated PK value should fail
|
|
124
|
+
insert into t_pk (a) values (1);
|
|
125
|
+
-- error:
|
|
126
|
+
|
|
127
|
+
select k from t_pk;
|
|
128
|
+
→ [{"k":101}]
|
|
129
|
+
|
|
130
|
+
drop table t_pk;
|
|
131
|
+
|
|
132
|
+
-- ===================================
|
|
133
|
+
-- 6. Generated column whose expression is a scalar subquery
|
|
134
|
+
-- (deterministic within a statement, but the evaluator resolves ASYNCHRONOUSLY —
|
|
135
|
+
-- UPDATE's generated-column recompute must await it, not store the Promise)
|
|
136
|
+
-- ===================================
|
|
137
|
+
|
|
138
|
+
create table t_src (k integer primary key);
|
|
139
|
+
|
|
140
|
+
insert into t_src values (1), (2), (3);
|
|
141
|
+
|
|
142
|
+
create table t_sub (
|
|
143
|
+
id integer primary key,
|
|
144
|
+
w integer,
|
|
145
|
+
g integer generated always as ((select count(*) from t_src))
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
insert into t_sub (id, w) values (1, 1), (2, 2);
|
|
149
|
+
|
|
150
|
+
select id, w, g from t_sub order by id;
|
|
151
|
+
→ [{"id":1,"w":1,"g":3},{"id":2,"w":2,"g":3}]
|
|
152
|
+
|
|
153
|
+
-- updating an unrelated column re-runs the generated expression
|
|
154
|
+
update t_sub set w = 5 where id = 1;
|
|
155
|
+
|
|
156
|
+
select id, w, g from t_sub order by id;
|
|
157
|
+
→ [{"id":1,"w":5,"g":3},{"id":2,"w":2,"g":3}]
|
|
158
|
+
|
|
159
|
+
-- the subquery's source changes: a later update must recompute, not carry the old value
|
|
160
|
+
insert into t_src values (4), (5);
|
|
161
|
+
|
|
162
|
+
update t_sub set w = 6 where id = 1;
|
|
163
|
+
|
|
164
|
+
select id, w, g from t_sub order by id;
|
|
165
|
+
→ [{"id":1,"w":6,"g":5},{"id":2,"w":2,"g":3}]
|
|
166
|
+
|
|
167
|
+
-- multi-row update (no WHERE) — exercises phase-2 context teardown across iterations
|
|
168
|
+
update t_sub set w = w + 10;
|
|
169
|
+
|
|
170
|
+
select id, w, g from t_sub order by id;
|
|
171
|
+
→ [{"id":1,"w":16,"g":5},{"id":2,"w":12,"g":5}]
|
|
172
|
+
|
|
173
|
+
drop table t_sub;
|
|
174
|
+
drop table t_src;
|
|
175
|
+
|
|
176
|
+
-- ===================================
|
|
177
|
+
-- 7. Chain across the async path — a generated column feeding another
|
|
178
|
+
-- ===================================
|
|
179
|
+
|
|
180
|
+
create table t_src2 (k integer primary key);
|
|
181
|
+
|
|
182
|
+
insert into t_src2 values (1), (2);
|
|
183
|
+
|
|
184
|
+
create table t_sub_chain (
|
|
185
|
+
id integer primary key,
|
|
186
|
+
w integer,
|
|
187
|
+
g integer generated always as ((select count(*) from t_src2)) stored,
|
|
188
|
+
g2 integer generated always as (g * 2) stored
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
insert into t_sub_chain (id, w) values (1, 1);
|
|
192
|
+
|
|
193
|
+
select w, g, g2 from t_sub_chain;
|
|
194
|
+
→ [{"w":1,"g":2,"g2":4}]
|
|
195
|
+
|
|
196
|
+
insert into t_src2 values (3);
|
|
197
|
+
|
|
198
|
+
update t_sub_chain set w = 9 where id = 1;
|
|
199
|
+
|
|
200
|
+
select w, g, g2 from t_sub_chain;
|
|
201
|
+
→ [{"w":9,"g":3,"g2":6}]
|
|
202
|
+
|
|
203
|
+
drop table t_sub_chain;
|
|
204
|
+
drop table t_src2;
|
|
205
|
+
|
|
206
|
+
-- ===================================
|
|
207
|
+
-- 8. Correlated subquery generated column, multi-row UPDATE
|
|
208
|
+
-- Sections 6 and 7 use an UNCORRELATED subquery, which never reads the row
|
|
209
|
+
-- context UPDATE installs for its phase-2 recompute. This one does — the
|
|
210
|
+
-- subquery's `id` resolves against the row being updated — across several
|
|
211
|
+
-- rows in one statement, so the phase-2 context must be installed and torn
|
|
212
|
+
-- down correctly on every iteration, not just the first.
|
|
213
|
+
-- Note the other table's column is qualified (`t_src3.k`): an unqualified
|
|
214
|
+
-- name inside a generated expression is read as a reference to THIS table
|
|
215
|
+
-- and rejected at create time (see docs/sql-alter.md § ADD COLUMN).
|
|
216
|
+
-- ===================================
|
|
217
|
+
|
|
218
|
+
create table t_src3 (k integer primary key);
|
|
219
|
+
|
|
220
|
+
insert into t_src3 values (1), (2), (3);
|
|
221
|
+
|
|
222
|
+
create table t_corr (
|
|
223
|
+
id integer primary key,
|
|
224
|
+
w integer,
|
|
225
|
+
g integer generated always as ((select count(*) from t_src3 where t_src3.k <= id))
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
insert into t_corr (id, w) values (1, 10), (2, 20), (3, 30);
|
|
229
|
+
|
|
230
|
+
select id, w, g from t_corr order by id;
|
|
231
|
+
→ [{"id":1,"w":10,"g":1},{"id":2,"w":20,"g":2},{"id":3,"w":30,"g":3}]
|
|
232
|
+
|
|
233
|
+
update t_corr set w = w + 1;
|
|
234
|
+
|
|
235
|
+
select id, w, g from t_corr order by id;
|
|
236
|
+
→ [{"id":1,"w":11,"g":1},{"id":2,"w":21,"g":2},{"id":3,"w":31,"g":3}]
|
|
237
|
+
|
|
238
|
+
drop table t_corr;
|
|
239
|
+
drop table t_src3;
|
|
240
|
+
|
|
241
|
+
-- ===================================
|
|
242
|
+
-- 9. `on conflict … do update` recomputes generated columns
|
|
243
|
+
-- The DO UPDATE arm composes its row from the EXISTING row plus the SET
|
|
244
|
+
-- assignments and writes it directly, so it needs its own second-pass
|
|
245
|
+
-- recompute — the INSERT-side and UPDATE-side ones never run for it.
|
|
246
|
+
-- ===================================
|
|
247
|
+
|
|
248
|
+
create table t_up (
|
|
249
|
+
id integer primary key,
|
|
250
|
+
w integer,
|
|
251
|
+
g integer generated always as (w * 2) stored
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
insert into t_up (id, w) values (1, 1);
|
|
255
|
+
|
|
256
|
+
select id, w, g from t_up;
|
|
257
|
+
→ [{"id":1,"w":1,"g":2}]
|
|
258
|
+
|
|
259
|
+
-- literal assignment: g derives from the POST-update w, not the old one
|
|
260
|
+
insert into t_up (id, w) values (1, 7) on conflict (id) do update set w = 7;
|
|
261
|
+
|
|
262
|
+
select id, w, g from t_up;
|
|
263
|
+
→ [{"id":1,"w":7,"g":14}]
|
|
264
|
+
|
|
265
|
+
-- `excluded.` assignment (the proposed insert value)
|
|
266
|
+
insert into t_up (id, w) values (1, 20) on conflict (id) do update set w = excluded.w;
|
|
267
|
+
|
|
268
|
+
select id, w, g from t_up;
|
|
269
|
+
→ [{"id":1,"w":20,"g":40}]
|
|
270
|
+
|
|
271
|
+
-- assignment reading the EXISTING row (unqualified `w` = 20)
|
|
272
|
+
insert into t_up (id, w) values (1, 0) on conflict (id) do update set w = w + 1;
|
|
273
|
+
|
|
274
|
+
select id, w, g from t_up;
|
|
275
|
+
→ [{"id":1,"w":21,"g":42}]
|
|
276
|
+
|
|
277
|
+
-- assigning a generated column is rejected, exactly as `update t_up set g = 99` is
|
|
278
|
+
insert into t_up (id, w) values (1, 5) on conflict (id) do update set g = 99;
|
|
279
|
+
-- error: Cannot UPDATE generated column 'g'
|
|
280
|
+
|
|
281
|
+
-- rejected at plan time, so nothing was written
|
|
282
|
+
select id, w, g from t_up;
|
|
283
|
+
→ [{"id":1,"w":21,"g":42}]
|
|
284
|
+
|
|
285
|
+
-- `on conflict … do nothing` writes nothing at all (control)
|
|
286
|
+
insert into t_up (id, w) values (1, 99) on conflict (id) do nothing;
|
|
287
|
+
|
|
288
|
+
select id, w, g from t_up;
|
|
289
|
+
→ [{"id":1,"w":21,"g":42}]
|
|
290
|
+
|
|
291
|
+
drop table t_up;
|
|
292
|
+
|
|
293
|
+
-- ===================================
|
|
294
|
+
-- 9b. DO UPDATE across a generated-from-generated chain, declared in reverse
|
|
295
|
+
-- dependency order — the second pass must follow topological order, not
|
|
296
|
+
-- declaration order.
|
|
297
|
+
-- ===================================
|
|
298
|
+
|
|
299
|
+
create table t_up_chain (
|
|
300
|
+
id integer primary key,
|
|
301
|
+
a integer,
|
|
302
|
+
w integer generated always as (m * 5) stored,
|
|
303
|
+
m integer generated always as (a * 2) stored
|
|
304
|
+
);
|
|
305
|
+
|
|
306
|
+
insert into t_up_chain (id, a) values (1, 3);
|
|
307
|
+
|
|
308
|
+
select a, m, w from t_up_chain;
|
|
309
|
+
→ [{"a":3,"m":6,"w":30}]
|
|
310
|
+
|
|
311
|
+
insert into t_up_chain (id, a) values (1, 4) on conflict (id) do update set a = excluded.a;
|
|
312
|
+
|
|
313
|
+
select a, m, w from t_up_chain;
|
|
314
|
+
→ [{"a":4,"m":8,"w":40}]
|
|
315
|
+
|
|
316
|
+
drop table t_up_chain;
|
|
317
|
+
|
|
318
|
+
-- ===================================
|
|
319
|
+
-- 9c. DO UPDATE with a subquery-valued generated column
|
|
320
|
+
-- Its evaluator resolves ASYNCHRONOUSLY, so the second pass must await it
|
|
321
|
+
-- rather than store the Promise. The source table changes between the two
|
|
322
|
+
-- statements, so a carried-over value is visible in the result.
|
|
323
|
+
-- ===================================
|
|
324
|
+
|
|
325
|
+
create table t_up_src (k integer primary key);
|
|
326
|
+
|
|
327
|
+
insert into t_up_src values (1), (2), (3);
|
|
328
|
+
|
|
329
|
+
create table t_up_sub (
|
|
330
|
+
id integer primary key,
|
|
331
|
+
w integer,
|
|
332
|
+
g integer generated always as ((select count(*) from t_up_src))
|
|
333
|
+
);
|
|
334
|
+
|
|
335
|
+
insert into t_up_sub (id, w) values (1, 1);
|
|
336
|
+
|
|
337
|
+
select id, w, g from t_up_sub;
|
|
338
|
+
→ [{"id":1,"w":1,"g":3}]
|
|
339
|
+
|
|
340
|
+
insert into t_up_src values (4), (5);
|
|
341
|
+
|
|
342
|
+
insert into t_up_sub (id, w) values (1, 2) on conflict (id) do update set w = excluded.w;
|
|
343
|
+
|
|
344
|
+
select id, w, g from t_up_sub;
|
|
345
|
+
→ [{"id":1,"w":2,"g":5}]
|
|
346
|
+
|
|
347
|
+
drop table t_up_sub;
|
|
348
|
+
drop table t_up_src;
|
|
349
|
+
|
|
350
|
+
-- ===================================
|
|
351
|
+
-- 9d. DO UPDATE with a CORRELATED subquery generated column whose correlation
|
|
352
|
+
-- is on a column the SET clause changes — the second pass must bind the
|
|
353
|
+
-- post-assignment row, not the pre-update existing row.
|
|
354
|
+
-- ===================================
|
|
355
|
+
|
|
356
|
+
create table t_up_corr_src (k integer primary key);
|
|
357
|
+
|
|
358
|
+
insert into t_up_corr_src values (1), (2), (3), (4);
|
|
359
|
+
|
|
360
|
+
create table t_up_corr (
|
|
361
|
+
id integer primary key,
|
|
362
|
+
w integer,
|
|
363
|
+
c integer generated always as ((select count(*) from t_up_corr_src where t_up_corr_src.k <= w))
|
|
364
|
+
);
|
|
365
|
+
|
|
366
|
+
insert into t_up_corr (id, w) values (1, 1);
|
|
367
|
+
|
|
368
|
+
select id, w, c from t_up_corr;
|
|
369
|
+
→ [{"id":1,"w":1,"c":1}]
|
|
370
|
+
|
|
371
|
+
insert into t_up_corr (id, w) values (1, 3) on conflict (id) do update set w = excluded.w;
|
|
372
|
+
|
|
373
|
+
select id, w, c from t_up_corr;
|
|
374
|
+
→ [{"id":1,"w":3,"c":3}]
|
|
375
|
+
|
|
376
|
+
drop table t_up_corr;
|
|
377
|
+
drop table t_up_corr_src;
|
|
378
|
+
|
|
379
|
+
-- ===================================
|
|
380
|
+
-- 9e. Control — `insert or replace` (delete-then-insert) routes through the
|
|
381
|
+
-- INSERT path, which already recomputes. Pinned so a future change to the
|
|
382
|
+
-- upsert path cannot quietly regress it.
|
|
383
|
+
-- ===================================
|
|
384
|
+
|
|
385
|
+
create table t_rep (
|
|
386
|
+
id integer primary key,
|
|
387
|
+
w integer,
|
|
388
|
+
g integer generated always as (w * 2) stored
|
|
389
|
+
);
|
|
390
|
+
|
|
391
|
+
insert into t_rep (id, w) values (1, 1);
|
|
392
|
+
|
|
393
|
+
select id, w, g from t_rep;
|
|
394
|
+
→ [{"id":1,"w":1,"g":2}]
|
|
395
|
+
|
|
396
|
+
insert or replace into t_rep (id, w) values (1, 9);
|
|
397
|
+
|
|
398
|
+
select id, w, g from t_rep;
|
|
399
|
+
→ [{"id":1,"w":9,"g":18}]
|
|
400
|
+
|
|
401
|
+
drop table t_rep;
|
|
402
|
+
|
|
403
|
+
-- ===================================
|
|
404
|
+
-- 9f. Generated column that IS the primary key, relocated by the recompute.
|
|
405
|
+
-- The DO UPDATE arm issues its write with `oldKeyValues` taken from the
|
|
406
|
+
-- existing row, so the row must MOVE to the new key rather than duplicate
|
|
407
|
+
-- or be lost.
|
|
408
|
+
-- ===================================
|
|
409
|
+
|
|
410
|
+
create table t_pk_up (
|
|
411
|
+
a integer not null,
|
|
412
|
+
k integer generated always as (a + 100) stored primary key
|
|
413
|
+
);
|
|
414
|
+
|
|
415
|
+
insert into t_pk_up (a) values (1);
|
|
416
|
+
|
|
417
|
+
select a, k from t_pk_up;
|
|
418
|
+
→ [{"a":1,"k":101}]
|
|
419
|
+
|
|
420
|
+
insert into t_pk_up (a) values (1) on conflict (k) do update set a = 2;
|
|
421
|
+
|
|
422
|
+
select a, k from t_pk_up order by k;
|
|
423
|
+
→ [{"a":2,"k":102}]
|
|
424
|
+
|
|
425
|
+
drop table t_pk_up;
|
|
426
|
+
|
|
427
|
+
-- ===================================
|
|
428
|
+
-- 9g. RETURNING on the DO UPDATE arm reports the RECOMPUTED generated value.
|
|
429
|
+
-- The arm builds its returned row from the stored image, so a recompute the
|
|
430
|
+
-- second pass missed would surface here as the stale value.
|
|
431
|
+
-- ===================================
|
|
432
|
+
|
|
433
|
+
create table t_up_ret (
|
|
434
|
+
id integer primary key,
|
|
435
|
+
w integer,
|
|
436
|
+
g integer generated always as (w * 2) stored
|
|
437
|
+
);
|
|
438
|
+
|
|
439
|
+
insert into t_up_ret (id, w) values (1, 1);
|
|
440
|
+
|
|
441
|
+
insert into t_up_ret (id, w) values (1, 7) on conflict (id) do update set w = excluded.w returning id, w, g;
|
|
442
|
+
→ [{"id":1,"w":7,"g":14}]
|
|
443
|
+
|
|
444
|
+
drop table t_up_ret;
|
|
445
|
+
|
|
446
|
+
-- ===================================
|
|
447
|
+
-- 9h. A DO UPDATE clause whose WHERE excludes the row writes nothing — the
|
|
448
|
+
-- recompute must not leak a value past the skipped write.
|
|
449
|
+
-- ===================================
|
|
450
|
+
|
|
451
|
+
create table t_up_where (
|
|
452
|
+
id integer primary key,
|
|
453
|
+
w integer,
|
|
454
|
+
g integer generated always as (w * 2) stored
|
|
455
|
+
);
|
|
456
|
+
|
|
457
|
+
insert into t_up_where (id, w) values (1, 1);
|
|
458
|
+
|
|
459
|
+
insert into t_up_where (id, w) values (1, 7) on conflict (id) do update set w = excluded.w where w > 100;
|
|
460
|
+
|
|
461
|
+
select id, w, g from t_up_where;
|
|
462
|
+
→ [{"id":1,"w":1,"g":2}]
|
|
463
|
+
|
|
464
|
+
insert into t_up_where (id, w) values (1, 7) on conflict (id) do update set w = excluded.w where w < 100;
|
|
465
|
+
|
|
466
|
+
select id, w, g from t_up_where;
|
|
467
|
+
→ [{"id":1,"w":7,"g":14}]
|
|
468
|
+
|
|
469
|
+
drop table t_up_where;
|
|
470
|
+
|
|
471
|
+
-- ===================================
|
|
472
|
+
-- 9i. TWO `on conflict` clauses on one generated-column table. The emit-side
|
|
473
|
+
-- split between user assignments and recomputes is built per clause, so each
|
|
474
|
+
-- clause needs its own working second pass.
|
|
475
|
+
-- ===================================
|
|
476
|
+
|
|
477
|
+
create table t_up_multi (
|
|
478
|
+
id integer primary key,
|
|
479
|
+
u integer unique,
|
|
480
|
+
w integer,
|
|
481
|
+
g integer generated always as (w * 2) stored
|
|
482
|
+
);
|
|
483
|
+
|
|
484
|
+
insert into t_up_multi (id, u, w) values (1, 10, 1);
|
|
485
|
+
|
|
486
|
+
select id, u, w, g from t_up_multi;
|
|
487
|
+
→ [{"id":1,"u":10,"w":1,"g":2}]
|
|
488
|
+
|
|
489
|
+
-- conflicts on the PK -> first clause
|
|
490
|
+
insert into t_up_multi (id, u, w) values (1, 99, 3) on conflict (id) do update set w = 3 on conflict (u) do update set w = 4;
|
|
491
|
+
|
|
492
|
+
select id, u, w, g from t_up_multi;
|
|
493
|
+
→ [{"id":1,"u":10,"w":3,"g":6}]
|
|
494
|
+
|
|
495
|
+
-- conflicts on the unique column only -> second clause
|
|
496
|
+
insert into t_up_multi (id, u, w) values (2, 10, 5) on conflict (id) do update set w = 3 on conflict (u) do update set w = 4;
|
|
497
|
+
|
|
498
|
+
select id, u, w, g from t_up_multi;
|
|
499
|
+
→ [{"id":1,"u":10,"w":4,"g":8}]
|
|
500
|
+
|
|
501
|
+
drop table t_up_multi;
|
|
502
|
+
|
|
503
|
+
-- ===================================
|
|
504
|
+
-- 9j. MULTI-ROW DO UPDATE. Every other case here conflicts on one row; the
|
|
505
|
+
-- second pass composes its row per conflicting row, so a statement mixing
|
|
506
|
+
-- conflicting and non-conflicting rows must recompute each independently.
|
|
507
|
+
-- ===================================
|
|
508
|
+
|
|
509
|
+
create table t_up_many (id integer primary key, w integer, g integer generated always as (w * 2) stored);
|
|
510
|
+
|
|
511
|
+
insert into t_up_many (id, w) values (1, 1), (2, 2);
|
|
512
|
+
|
|
513
|
+
insert into t_up_many (id, w) values (1, 10), (2, 20), (3, 30) on conflict (id) do update set w = excluded.w;
|
|
514
|
+
|
|
515
|
+
select id, w, g from t_up_many order by id;
|
|
516
|
+
→ [{"id":1,"w":10,"g":20},{"id":2,"w":20,"g":40},{"id":3,"w":30,"g":60}]
|
|
517
|
+
|
|
518
|
+
drop table t_up_many;
|
|
519
|
+
|
|
520
|
+
-- ===================================
|
|
521
|
+
-- 9k. A generated value whose expression type differs from the DECLARED column
|
|
522
|
+
-- type is converted on the DO UPDATE arm too — it lands in the same cell as
|
|
523
|
+
-- a user assignment, so it takes the same static-type coercion.
|
|
524
|
+
-- ===================================
|
|
525
|
+
|
|
526
|
+
create table t_up_coerce (
|
|
527
|
+
id integer primary key,
|
|
528
|
+
w integer,
|
|
529
|
+
g text generated always as (w * 2) stored
|
|
530
|
+
);
|
|
531
|
+
|
|
532
|
+
insert into t_up_coerce (id, w) values (1, 1);
|
|
533
|
+
|
|
534
|
+
select id, w, g, typeof(g) as t from t_up_coerce;
|
|
535
|
+
→ [{"id":1,"w":1,"g":"2","t":"text"}]
|
|
536
|
+
|
|
537
|
+
insert into t_up_coerce (id, w) values (1, 5) on conflict (id) do update set w = excluded.w;
|
|
538
|
+
|
|
539
|
+
select id, w, g, typeof(g) as t from t_up_coerce;
|
|
540
|
+
→ [{"id":1,"w":5,"g":"10","t":"text"}]
|
|
541
|
+
|
|
542
|
+
drop table t_up_coerce;
|
|
543
|
+
|
|
544
|
+
-- ===================================
|
|
545
|
+
-- 9l. A generated column whose dependency the SET clause does NOT touch keeps
|
|
546
|
+
-- its value — the recompute reads the composed row, not the proposed insert.
|
|
547
|
+
-- (`a` is 9 in the proposed row and 1 in the existing one; `g` must stay 10.)
|
|
548
|
+
-- ===================================
|
|
549
|
+
|
|
550
|
+
create table t_up_dep (id integer primary key, a integer, b integer, g integer generated always as (a * 10) stored);
|
|
551
|
+
|
|
552
|
+
insert into t_up_dep (id, a, b) values (1, 1, 1);
|
|
553
|
+
|
|
554
|
+
insert into t_up_dep (id, a, b) values (1, 9, 7) on conflict (id) do update set b = excluded.b;
|
|
555
|
+
|
|
556
|
+
select id, a, b, g from t_up_dep;
|
|
557
|
+
→ [{"id":1,"a":1,"b":7,"g":10}]
|
|
558
|
+
|
|
559
|
+
drop table t_up_dep;
|
|
560
|
+
|
|
561
|
+
-- ===================================
|
|
562
|
+
-- 9m. Writing through a view whose basis table has a generated column. The
|
|
563
|
+
-- view-mutation decomposition re-plans some writes as synthesized
|
|
564
|
+
-- `on conflict … do update` statements, so the rejection above could in
|
|
565
|
+
-- principle fire on a lowered statement. It cannot: the view-write
|
|
566
|
+
-- classifier marks a projected generated column read-only and rejects
|
|
567
|
+
-- first, with its own diagnostic. Pinned so that ordering does not drift.
|
|
568
|
+
-- Writing the ORDINARY basis column through the same view still updates the
|
|
569
|
+
-- generated one (that write lowers to a plain member UPDATE, whose own
|
|
570
|
+
-- recompute covers it).
|
|
571
|
+
-- ===================================
|
|
572
|
+
|
|
573
|
+
create table gojp (pp integer primary key, base integer null, pv integer generated always as (base * 2) stored);
|
|
574
|
+
|
|
575
|
+
create table gojc (cc integer primary key, pr integer null, cv integer null);
|
|
576
|
+
|
|
577
|
+
create view gojv as select c.cc as cc, c.cv as cv, p.pv as pv, p.base as base from gojc c left join gojp p on p.pp = c.pr;
|
|
578
|
+
|
|
579
|
+
insert into gojp (pp, base) values (1, 10);
|
|
580
|
+
insert into gojc values (1, 1, 100);
|
|
581
|
+
|
|
582
|
+
select cc, cv, pv, base from gojv order by cc;
|
|
583
|
+
→ [{"cc":1,"cv":100,"pv":20,"base":10}]
|
|
584
|
+
|
|
585
|
+
update gojv set pv = 777 where cc = 1;
|
|
586
|
+
-- error: is a computed (non-invertible) expression and is read-only
|
|
587
|
+
|
|
588
|
+
select cc, cv, pv, base from gojv order by cc;
|
|
589
|
+
→ [{"cc":1,"cv":100,"pv":20,"base":10}]
|
|
590
|
+
|
|
591
|
+
update gojv set base = 50 where cc = 1;
|
|
592
|
+
|
|
593
|
+
select cc, cv, pv, base from gojv order by cc;
|
|
594
|
+
→ [{"cc":1,"cv":100,"pv":100,"base":50}]
|
|
595
|
+
|
|
596
|
+
drop view gojv;
|
|
597
|
+
drop table gojc;
|
|
598
|
+
drop table gojp;
|