@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,347 @@
|
|
|
1
|
+
-- 06.3.5-column-info.sqllogic — column_info(name) per-column updateability surface.
|
|
2
|
+
-- The column-granular companion to view_info(): docs/view-updateability.md
|
|
3
|
+
-- § Information Schema Surface (information_schema.columns.is_updatable).
|
|
4
|
+
-- Columns: schema, name, cid, column_name, is_updatable ('YES'/'NO'),
|
|
5
|
+
-- base_table, base_column (both null for a read-only column). Resolves a base
|
|
6
|
+
-- table, a plain view, or a maintained table (materialized view — derivation-body
|
|
7
|
+
-- lineage, not plain base columns); throws not-found when neither matches.
|
|
8
|
+
|
|
9
|
+
-- ===================================================================
|
|
10
|
+
-- Base table, all columns updatable: every non-generated base column is a
|
|
11
|
+
-- trivially-updatable base write target tracing to itself.
|
|
12
|
+
-- ===================================================================
|
|
13
|
+
|
|
14
|
+
create table t (id integer primary key, name text);
|
|
15
|
+
|
|
16
|
+
select cid, column_name, is_updatable, base_table, base_column from column_info('t');
|
|
17
|
+
→ [{"cid":0,"column_name":"id","is_updatable":"YES","base_table":"t","base_column":"id"},{"cid":1,"column_name":"name","is_updatable":"YES","base_table":"t","base_column":"name"}]
|
|
18
|
+
|
|
19
|
+
select schema, name from column_info('t');
|
|
20
|
+
→ [{"schema":"main","name":"t"},{"schema":"main","name":"t"}]
|
|
21
|
+
|
|
22
|
+
-- Cardinality: one row per column.
|
|
23
|
+
select count(*) as c from column_info('t');
|
|
24
|
+
→ [{"c":2}]
|
|
25
|
+
|
|
26
|
+
-- ===================================================================
|
|
27
|
+
-- Base table with a generated column: the generated column is read-only
|
|
28
|
+
-- (computed lineage) with null base trace; the rest are updatable.
|
|
29
|
+
-- ===================================================================
|
|
30
|
+
|
|
31
|
+
create table g (id integer primary key, a integer, b integer generated always as (a + 1));
|
|
32
|
+
select cid, column_name, is_updatable, base_table, base_column from column_info('g');
|
|
33
|
+
→ [{"cid":0,"column_name":"id","is_updatable":"YES","base_table":"g","base_column":"id"},{"cid":1,"column_name":"a","is_updatable":"YES","base_table":"g","base_column":"a"},{"cid":2,"column_name":"b","is_updatable":"NO","base_table":null,"base_column":null}]
|
|
34
|
+
|
|
35
|
+
-- ===================================================================
|
|
36
|
+
-- Identity view: both columns updatable, tracing to the base table.
|
|
37
|
+
-- ===================================================================
|
|
38
|
+
|
|
39
|
+
create view v_identity as select id, name from t;
|
|
40
|
+
select cid, column_name, is_updatable, base_table, base_column from column_info('v_identity');
|
|
41
|
+
→ [{"cid":0,"column_name":"id","is_updatable":"YES","base_table":"t","base_column":"id"},{"cid":1,"column_name":"name","is_updatable":"YES","base_table":"t","base_column":"name"}]
|
|
42
|
+
|
|
43
|
+
select schema, name from column_info('v_identity');
|
|
44
|
+
→ [{"schema":"main","name":"v_identity"},{"schema":"main","name":"v_identity"}]
|
|
45
|
+
|
|
46
|
+
-- ===================================================================
|
|
47
|
+
-- Rename view: the alias renames the OUTPUT column (column_name), the trace
|
|
48
|
+
-- keeps the underlying base column (base_column).
|
|
49
|
+
-- ===================================================================
|
|
50
|
+
|
|
51
|
+
create view v_rename as select id as user_id, name as full_name from t;
|
|
52
|
+
select cid, column_name, is_updatable, base_table, base_column from column_info('v_rename');
|
|
53
|
+
→ [{"cid":0,"column_name":"user_id","is_updatable":"YES","base_table":"t","base_column":"id"},{"cid":1,"column_name":"full_name","is_updatable":"YES","base_table":"t","base_column":"name"}]
|
|
54
|
+
|
|
55
|
+
-- ===================================================================
|
|
56
|
+
-- Computed column among passthroughs: the passthrough column is updatable, the
|
|
57
|
+
-- computed expression column is read-only with null trace.
|
|
58
|
+
-- ===================================================================
|
|
59
|
+
|
|
60
|
+
create view cv as select name, name || '!' as banner from t;
|
|
61
|
+
select cid, column_name, is_updatable, base_table, base_column from column_info('cv');
|
|
62
|
+
→ [{"cid":0,"column_name":"name","is_updatable":"YES","base_table":"t","base_column":"name"},{"cid":1,"column_name":"banner","is_updatable":"NO","base_table":null,"base_column":null}]
|
|
63
|
+
|
|
64
|
+
-- ===================================================================
|
|
65
|
+
-- Single-source INVERSE-profile column: `bp = b + 1` is a non-identity invertible
|
|
66
|
+
-- projection of si.b. Its UpdateSite is `base` (si.b) WITH an inverse, which
|
|
67
|
+
-- baseSiteOf resolves like any base site → is_updatable='YES' tracing to the base
|
|
68
|
+
-- column. The opaque sibling `bo = b * 2` (multiplication has no inverse profile)
|
|
69
|
+
-- stays read-only. The single-source UPDATE path now consumes the threaded inverse
|
|
70
|
+
-- (a real write below stores the inverted base value), so static and dynamic agree.
|
|
71
|
+
-- docs § Scalar Invertibility.
|
|
72
|
+
-- ===================================================================
|
|
73
|
+
|
|
74
|
+
create table si (id integer primary key, b integer null);
|
|
75
|
+
create view si_v as select id, b + 1 as bp, b * 2 as bo from si;
|
|
76
|
+
select cid, column_name, is_updatable, base_table, base_column from column_info('si_v');
|
|
77
|
+
→ [{"cid":0,"column_name":"id","is_updatable":"YES","base_table":"si","base_column":"id"},{"cid":1,"column_name":"bp","is_updatable":"YES","base_table":"si","base_column":"b"},{"cid":2,"column_name":"bo","is_updatable":"NO","base_table":null,"base_column":null}]
|
|
78
|
+
|
|
79
|
+
-- Dynamic agreement: writing the inverse column stores the inverted base value
|
|
80
|
+
-- (bp = 9 ⇒ b = 8), and the view reads it back through the forward transform.
|
|
81
|
+
insert into si values (1, 5);
|
|
82
|
+
update si_v set bp = 9 where id = 1;
|
|
83
|
+
select id, b from si;
|
|
84
|
+
→ [{"id":1,"b":8}]
|
|
85
|
+
select id, bp, bo from si_v;
|
|
86
|
+
→ [{"id":1,"bp":9,"bo":16}]
|
|
87
|
+
|
|
88
|
+
-- The opaque sibling stays read-only on the write path too.
|
|
89
|
+
update si_v set bo = 99 where id = 1;
|
|
90
|
+
-- error: read-only
|
|
91
|
+
|
|
92
|
+
-- ===================================================================
|
|
93
|
+
-- Single-source PASSTHROUGH-profile columns: `bc = b collate nocase` and
|
|
94
|
+
-- `nc = cast(n as integer)` (no-op, same logical type) are identity-ON-VALUE
|
|
95
|
+
-- transforms of one base column — their UpdateSite is `base` WITH NO inverse
|
|
96
|
+
-- (passthrough), which baseSiteOf resolves like any base site → is_updatable='YES'
|
|
97
|
+
-- tracing to the base column. The opaque sibling `bo = b || '!'` (concat has no
|
|
98
|
+
-- inverse profile) stays read-only. The single-source UPDATE path now routes the
|
|
99
|
+
-- FULL writable-base set (identity + passthrough + inverse), so a real write below
|
|
100
|
+
-- stores the value VERBATIM (no inverse to apply) and the view reads it back —
|
|
101
|
+
-- static and dynamic agree. docs § Scalar Invertibility.
|
|
102
|
+
-- ===================================================================
|
|
103
|
+
|
|
104
|
+
create table pt (id integer primary key, b text null, n integer null);
|
|
105
|
+
create view pt_v as select id, b collate nocase as bc, cast(n as integer) as nc, b || '!' as bo from pt;
|
|
106
|
+
select cid, column_name, is_updatable, base_table, base_column from column_info('pt_v');
|
|
107
|
+
→ [{"cid":0,"column_name":"id","is_updatable":"YES","base_table":"pt","base_column":"id"},{"cid":1,"column_name":"bc","is_updatable":"YES","base_table":"pt","base_column":"b"},{"cid":2,"column_name":"nc","is_updatable":"YES","base_table":"pt","base_column":"n"},{"cid":3,"column_name":"bo","is_updatable":"NO","base_table":null,"base_column":null}]
|
|
108
|
+
|
|
109
|
+
-- Dynamic agreement: a passthrough write stores the value VERBATIM (no inverse to
|
|
110
|
+
-- apply), and the view reads it back through the value-preserving forward transform.
|
|
111
|
+
insert into pt values (1, 'hi', 5);
|
|
112
|
+
update pt_v set bc = 'yo' where id = 1;
|
|
113
|
+
select id, b from pt;
|
|
114
|
+
→ [{"id":1,"b":"yo"}]
|
|
115
|
+
update pt_v set nc = 99 where id = 1;
|
|
116
|
+
select id, n from pt;
|
|
117
|
+
→ [{"id":1,"n":99}]
|
|
118
|
+
select id, bc, nc from pt_v;
|
|
119
|
+
→ [{"id":1,"bc":"yo","nc":99}]
|
|
120
|
+
|
|
121
|
+
-- The opaque sibling stays read-only on the write path too.
|
|
122
|
+
update pt_v set bo = 'X' where id = 1;
|
|
123
|
+
-- error: read-only
|
|
124
|
+
|
|
125
|
+
-- ===================================================================
|
|
126
|
+
-- Multi-source inner join: each output column traces to its own source base
|
|
127
|
+
-- table; all updatable. (cid/note from ms_child, label from ms_parent.)
|
|
128
|
+
-- ===================================================================
|
|
129
|
+
|
|
130
|
+
create table ms_parent (pid integer primary key, label text);
|
|
131
|
+
create table ms_child (cid integer primary key, pref integer, note text,
|
|
132
|
+
foreign key (pref) references ms_parent(pid));
|
|
133
|
+
create view ms_jv as
|
|
134
|
+
select c.cid as cid, c.note as note, p.label as label
|
|
135
|
+
from ms_child c join ms_parent p on p.pid = c.pref;
|
|
136
|
+
select cid, column_name, is_updatable, base_table, base_column from column_info('ms_jv');
|
|
137
|
+
→ [{"cid":0,"column_name":"cid","is_updatable":"YES","base_table":"ms_child","base_column":"cid"},{"cid":1,"column_name":"note","is_updatable":"YES","base_table":"ms_child","base_column":"note"},{"cid":2,"column_name":"label","is_updatable":"YES","base_table":"ms_parent","base_column":"label"}]
|
|
138
|
+
|
|
139
|
+
-- ===================================================================
|
|
140
|
+
-- Multi-source inner join with an INVERSE-profile column: `nv1 = c.nv + 1` is a
|
|
141
|
+
-- non-identity invertible projection of iv_child.nv. Its UpdateSite is `base`
|
|
142
|
+
-- (iv_child.nv) WITH an inverse, which baseSiteOf resolves like any base site, so
|
|
143
|
+
-- it reports is_updatable='YES' tracing to the base column — consistent with the
|
|
144
|
+
-- multi-source UPDATE path, which now consumes the threaded inverse (a real write
|
|
145
|
+
-- below stores the inverted base value). docs § Scalar Invertibility, § Inner Join.
|
|
146
|
+
-- ===================================================================
|
|
147
|
+
|
|
148
|
+
create table iv_parent (pid integer primary key, label text);
|
|
149
|
+
create table iv_child (cid integer primary key, pref integer, nv integer,
|
|
150
|
+
foreign key (pref) references iv_parent(pid));
|
|
151
|
+
create view iv_jv as
|
|
152
|
+
select c.cid as cid, c.nv + 1 as nv1, p.label as label
|
|
153
|
+
from iv_child c join iv_parent p on p.pid = c.pref;
|
|
154
|
+
select cid, column_name, is_updatable, base_table, base_column from column_info('iv_jv');
|
|
155
|
+
→ [{"cid":0,"column_name":"cid","is_updatable":"YES","base_table":"iv_child","base_column":"cid"},{"cid":1,"column_name":"nv1","is_updatable":"YES","base_table":"iv_child","base_column":"nv"},{"cid":2,"column_name":"label","is_updatable":"YES","base_table":"iv_parent","base_column":"label"}]
|
|
156
|
+
|
|
157
|
+
-- Dynamic agreement: writing the inverse column stores the inverted base value
|
|
158
|
+
-- (nv1 = 9 ⇒ nv = 8), and the view reads it back through the forward transform.
|
|
159
|
+
insert into iv_parent values (1, 'p1');
|
|
160
|
+
insert into iv_child values (10, 1, 5);
|
|
161
|
+
update iv_jv set nv1 = 9 where cid = 10;
|
|
162
|
+
select cid, pref, nv from iv_child;
|
|
163
|
+
→ [{"cid":10,"pref":1,"nv":8}]
|
|
164
|
+
select cid, nv1, label from iv_jv;
|
|
165
|
+
→ [{"cid":10,"nv1":9,"label":"p1"}]
|
|
166
|
+
|
|
167
|
+
-- ===================================================================
|
|
168
|
+
-- Wholly read-only bodies: every output column is_updatable='NO' with null
|
|
169
|
+
-- trace. Unlike view_info's single conservative row, column_info still emits
|
|
170
|
+
-- one row per output column.
|
|
171
|
+
-- ===================================================================
|
|
172
|
+
|
|
173
|
+
create view values_v as values (1, 2), (3, 4);
|
|
174
|
+
select cid, is_updatable, base_table, base_column from column_info('values_v');
|
|
175
|
+
→ [{"cid":0,"is_updatable":"NO","base_table":null,"base_column":null},{"cid":1,"is_updatable":"NO","base_table":null,"base_column":null}]
|
|
176
|
+
|
|
177
|
+
create view agg_v as select count(*) as n from t;
|
|
178
|
+
select cid, column_name, is_updatable, base_table, base_column from column_info('agg_v');
|
|
179
|
+
→ [{"cid":0,"column_name":"n","is_updatable":"NO","base_table":null,"base_column":null}]
|
|
180
|
+
|
|
181
|
+
-- ===================================================================
|
|
182
|
+
-- Outer-join body: PER-SIDE updatability. A LEFT outer join is writable on every base
|
|
183
|
+
-- column — the preserved side's columns (aid, av) report is_updatable='YES' with their
|
|
184
|
+
-- base trace, and the non-preserved (`null-extended`) side's column (bv) ALSO reports
|
|
185
|
+
-- 'YES' tracing to oj_b.bv: its UPDATE materializes per row (a matched row updates the
|
|
186
|
+
-- non-preserved base row, a null-extended row inserts one keyed by the EC join key —
|
|
187
|
+
-- `view-write-optional-member-transitions`), since the body has a preserved anchor.
|
|
188
|
+
-- column_info reads the same per-column `null-extended` lineage `view_info` does, so
|
|
189
|
+
-- the two surfaces agree with the dynamic truth.
|
|
190
|
+
-- ===================================================================
|
|
191
|
+
|
|
192
|
+
create table oj_a (aid integer primary key, av text);
|
|
193
|
+
create table oj_b (bid integer primary key, bv text);
|
|
194
|
+
insert into oj_a values (1, 'a1');
|
|
195
|
+
create view oj_left as
|
|
196
|
+
select a.aid as aid, a.av as av, b.bv as bv
|
|
197
|
+
from oj_a a left join oj_b b on b.bid = a.aid;
|
|
198
|
+
select cid, column_name, is_updatable, base_table, base_column from column_info('oj_left');
|
|
199
|
+
→ [{"cid":0,"column_name":"aid","is_updatable":"YES","base_table":"oj_a","base_column":"aid"},{"cid":1,"column_name":"av","is_updatable":"YES","base_table":"oj_a","base_column":"av"},{"cid":2,"column_name":"bv","is_updatable":"YES","base_table":"oj_b","base_column":"bv"}]
|
|
200
|
+
|
|
201
|
+
-- Surface agrees with propagate(): both a preserved-side and a non-preserved-side
|
|
202
|
+
-- update are accepted — aid=1 has no oj_b match, so the bv update materializes
|
|
203
|
+
-- oj_b(bid=1, bv='z') via the EC join key (bid = aid) and the row reads back joined.
|
|
204
|
+
update oj_left set av = 'z' where aid = 1;
|
|
205
|
+
update oj_left set bv = 'z' where aid = 1;
|
|
206
|
+
select cid, column_name, is_updatable from column_info('oj_left');
|
|
207
|
+
→ [{"cid":0,"column_name":"aid","is_updatable":"YES"},{"cid":1,"column_name":"av","is_updatable":"YES"},{"cid":2,"column_name":"bv","is_updatable":"YES"}]
|
|
208
|
+
|
|
209
|
+
-- RIGHT outer join: the exact mirror of oj_left. oj_b is preserved (the right operand of
|
|
210
|
+
-- a `right` join), oj_a is non-preserved. bid/bv (oj_b) report is_updatable='YES' with
|
|
211
|
+
-- their base trace; the non-preserved av (oj_a) ALSO reports 'YES' tracing oj_a.av — the
|
|
212
|
+
-- preserved oj_b anchor makes the non-preserved column updatable, exactly as oj_left's bv
|
|
213
|
+
-- does. column_info reads the same per-column `null-extended` lineage view_info does.
|
|
214
|
+
create view oj_right as
|
|
215
|
+
select a.av as av, b.bid as bid, b.bv as bv
|
|
216
|
+
from oj_a a right join oj_b b on b.bid = a.aid;
|
|
217
|
+
select cid, column_name, is_updatable, base_table, base_column from column_info('oj_right');
|
|
218
|
+
→ [{"cid":0,"column_name":"av","is_updatable":"YES","base_table":"oj_a","base_column":"av"},{"cid":1,"column_name":"bid","is_updatable":"YES","base_table":"oj_b","base_column":"bid"},{"cid":2,"column_name":"bv","is_updatable":"YES","base_table":"oj_b","base_column":"bv"}]
|
|
219
|
+
|
|
220
|
+
-- Surface agrees with propagate(): both a preserved-side (bv) and a non-preserved-side
|
|
221
|
+
-- (av) update are accepted. bid=2 has no oj_a match, so the av update materializes
|
|
222
|
+
-- oj_a(aid=2, av='z2') via the EC join key (aid = bid).
|
|
223
|
+
insert into oj_b values (2, 'b2');
|
|
224
|
+
update oj_right set bv = 'z2' where bid = 2;
|
|
225
|
+
update oj_right set av = 'z2' where bid = 2;
|
|
226
|
+
select cid, column_name, is_updatable from column_info('oj_right');
|
|
227
|
+
→ [{"cid":0,"column_name":"av","is_updatable":"YES"},{"cid":1,"column_name":"bid","is_updatable":"YES"},{"cid":2,"column_name":"bv","is_updatable":"YES"}]
|
|
228
|
+
|
|
229
|
+
-- ===================================================================
|
|
230
|
+
-- Non-inner join bodies (Divergence 3): a cross join never null-extends (only
|
|
231
|
+
-- LEFT/RIGHT/FULL do — deriveJoinUpdateLineage), so it carries strict-`base`
|
|
232
|
+
-- lineage and slips past the outer-join gate. propagate() rejects a cross join
|
|
233
|
+
-- (collectInnerJoinSources requires an ON/USING predicate), so column_info must
|
|
234
|
+
-- report every output column is_updatable='NO' with null trace, agreeing with
|
|
235
|
+
-- view_info()'s conservative row.
|
|
236
|
+
--
|
|
237
|
+
-- n-way (≥2) inner equi-joins — composite-PK sides and self-joins included — are
|
|
238
|
+
-- now DECOMPOSABLE (isDecomposableJoinBody accepts them), so column_info reports
|
|
239
|
+
-- each base column updatable with its trace, agreeing with propagate() accepting
|
|
240
|
+
-- the write (covered after the cross join).
|
|
241
|
+
--
|
|
242
|
+
-- Comma / implicit joins are NOT tested here: the SELECT builder rejects ANY
|
|
243
|
+
-- multiple-FROM-source body ("SELECT with multiple FROM sources (joins) not
|
|
244
|
+
-- supported"), so a comma-join view can never be created to reach column_info —
|
|
245
|
+
-- there is no buildable case.
|
|
246
|
+
-- ===================================================================
|
|
247
|
+
|
|
248
|
+
create table ra (aid integer primary key, av text);
|
|
249
|
+
create table rb (bid integer primary key, bv text);
|
|
250
|
+
create table rc (cid integer primary key, cv text);
|
|
251
|
+
|
|
252
|
+
-- Cross join (two-table, no ON): every column 'NO' / null.
|
|
253
|
+
create view cross_v as select a.aid as aid, a.av as av, b.bv as bv
|
|
254
|
+
from ra a cross join rb b;
|
|
255
|
+
select cid, column_name, is_updatable, base_table, base_column from column_info('cross_v');
|
|
256
|
+
→ [{"cid":0,"column_name":"aid","is_updatable":"NO","base_table":null,"base_column":null},{"cid":1,"column_name":"av","is_updatable":"NO","base_table":null,"base_column":null},{"cid":2,"column_name":"bv","is_updatable":"NO","base_table":null,"base_column":null}]
|
|
257
|
+
|
|
258
|
+
-- Surface agrees with propagate(): a mutation through the cross-join view is rejected.
|
|
259
|
+
update cross_v set av = 'z' where aid = 1;
|
|
260
|
+
-- error: cannot write through view
|
|
261
|
+
|
|
262
|
+
-- 3-table inner join (> 2 base tables): now decomposable ⇒ each column traces to
|
|
263
|
+
-- its owning base, updatable.
|
|
264
|
+
create view three_v as select a.aid as aid, a.av as av, b.bv as bv, c.cv as cv
|
|
265
|
+
from ra a join rb b on b.bid = a.aid join rc c on c.cid = a.aid;
|
|
266
|
+
select cid, column_name, is_updatable, base_table, base_column from column_info('three_v');
|
|
267
|
+
→ [{"cid":0,"column_name":"aid","is_updatable":"YES","base_table":"ra","base_column":"aid"},{"cid":1,"column_name":"av","is_updatable":"YES","base_table":"ra","base_column":"av"},{"cid":2,"column_name":"bv","is_updatable":"YES","base_table":"rb","base_column":"bv"},{"cid":3,"column_name":"cv","is_updatable":"YES","base_table":"rc","base_column":"cv"}]
|
|
268
|
+
|
|
269
|
+
-- Surface agrees with propagate(): a write through the 3-table-join view is accepted
|
|
270
|
+
-- (empty bases ⇒ clean no-op).
|
|
271
|
+
update three_v set av = 'z' where aid = 1;
|
|
272
|
+
|
|
273
|
+
-- Self-join (one table under two alias-bound sites): now decomposable ⇒ each column
|
|
274
|
+
-- traces to its owning alias's scan; both base_table values collapse to `ra`.
|
|
275
|
+
create view self_v as select a.aid as aid, b.av as bv
|
|
276
|
+
from ra a join ra b on b.aid = a.aid;
|
|
277
|
+
select cid, column_name, is_updatable, base_table, base_column from column_info('self_v');
|
|
278
|
+
→ [{"cid":0,"column_name":"aid","is_updatable":"YES","base_table":"ra","base_column":"aid"},{"cid":1,"column_name":"bv","is_updatable":"YES","base_table":"ra","base_column":"av"}]
|
|
279
|
+
|
|
280
|
+
-- Surface agrees with propagate(): a write through the self-join view is accepted
|
|
281
|
+
-- (empty base ⇒ clean no-op).
|
|
282
|
+
update self_v set bv = 'z' where aid = 1;
|
|
283
|
+
|
|
284
|
+
-- ===================================================================
|
|
285
|
+
-- Maintained table (materialized view): per-column lineage comes from the SAME
|
|
286
|
+
-- derivation-body walk a plain view gets — NOT the trivially-all-updatable base
|
|
287
|
+
-- branch — because write-through inherits the view-updateability rules
|
|
288
|
+
-- (docs/materialized-views.md § Write boundary). A passthrough column (id) and a
|
|
289
|
+
-- renamed column (label = name) report their SOURCE base column with
|
|
290
|
+
-- is_updatable='YES'; an INVERSE-profile expression (vp = v + 1) stays 'YES'
|
|
291
|
+
-- tracing to its base column (same as a plain view — the write stores the
|
|
292
|
+
-- inverted value); a non-invertible expression (dbl = v * 2) is read-only with
|
|
293
|
+
-- null trace ('no-inverse' on write).
|
|
294
|
+
-- ===================================================================
|
|
295
|
+
|
|
296
|
+
create table mt (id integer primary key, v integer, name text);
|
|
297
|
+
insert into mt values (1, 5, 'a');
|
|
298
|
+
create materialized view mt_mv as select id, name as label, v + 1 as vp, v * 2 as dbl from mt;
|
|
299
|
+
|
|
300
|
+
select cid, column_name, is_updatable, base_table, base_column from column_info('mt_mv');
|
|
301
|
+
→ [{"cid":0,"column_name":"id","is_updatable":"YES","base_table":"mt","base_column":"id"},{"cid":1,"column_name":"label","is_updatable":"YES","base_table":"mt","base_column":"name"},{"cid":2,"column_name":"vp","is_updatable":"YES","base_table":"mt","base_column":"v"},{"cid":3,"column_name":"dbl","is_updatable":"NO","base_table":null,"base_column":null}]
|
|
302
|
+
|
|
303
|
+
-- The object identity columns name the maintained table itself, in its schema.
|
|
304
|
+
select distinct schema, name from column_info('mt_mv');
|
|
305
|
+
→ [{"schema":"main","name":"mt_mv"}]
|
|
306
|
+
|
|
307
|
+
-- Dynamic agreement with the write-through rewrite: the renamed column routes to
|
|
308
|
+
-- its base column; the inverse column stores the inverted base value (vp = 9 ⇒
|
|
309
|
+
-- v = 8); the non-invertible expression column rejects the write.
|
|
310
|
+
update mt_mv set label = 'z' where id = 1;
|
|
311
|
+
select id, v, name from mt;
|
|
312
|
+
→ [{"id":1,"v":5,"name":"z"}]
|
|
313
|
+
update mt_mv set vp = 9 where id = 1;
|
|
314
|
+
select id, v, name from mt;
|
|
315
|
+
→ [{"id":1,"v":8,"name":"z"}]
|
|
316
|
+
select id, label, vp, dbl from mt_mv;
|
|
317
|
+
→ [{"id":1,"label":"z","vp":9,"dbl":16}]
|
|
318
|
+
|
|
319
|
+
update mt_mv set dbl = 99 where id = 1;
|
|
320
|
+
-- error: read-only
|
|
321
|
+
|
|
322
|
+
-- view_info keeps excluding maintained tables (its surface stays plain-view-only;
|
|
323
|
+
-- the per-column lineage story for an MV lives in column_info above).
|
|
324
|
+
select count(*) as c from view_info('mt_mv');
|
|
325
|
+
→ [{"c":0}]
|
|
326
|
+
|
|
327
|
+
-- ===================================================================
|
|
328
|
+
-- MV-sugar column-rename form: the registered output names (mv(pk, dv)) DIFFER
|
|
329
|
+
-- from the body's attribute names (id, v). The maintained-table branch reports
|
|
330
|
+
-- the table's REGISTERED columns as the authoritative output names (positional
|
|
331
|
+
-- override) while the lineage trace still resolves to the SOURCE base column —
|
|
332
|
+
-- exercising the columnNames override that the alias-only MV above cannot.
|
|
333
|
+
-- ===================================================================
|
|
334
|
+
|
|
335
|
+
create table mt2 (id integer primary key, v integer);
|
|
336
|
+
insert into mt2 values (1, 5);
|
|
337
|
+
create materialized view mt2_mv (pk, dv) as select id, v from mt2;
|
|
338
|
+
|
|
339
|
+
select cid, column_name, is_updatable, base_table, base_column from column_info('mt2_mv');
|
|
340
|
+
→ [{"cid":0,"column_name":"pk","is_updatable":"YES","base_table":"mt2","base_column":"id"},{"cid":1,"column_name":"dv","is_updatable":"YES","base_table":"mt2","base_column":"v"}]
|
|
341
|
+
|
|
342
|
+
-- ===================================================================
|
|
343
|
+
-- Unknown name throws (mirrors table_info's required-target posture).
|
|
344
|
+
-- ===================================================================
|
|
345
|
+
|
|
346
|
+
select * from column_info('nope');
|
|
347
|
+
-- error: not found
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
-- 06.3.6-schema-views.sqllogic - Testing schema() introspection for views
|
|
2
|
+
--
|
|
3
|
+
-- Carved out of 06.3-schema, which is annotated `requires-capability: standalone-index-ddl`
|
|
4
|
+
-- because its subject is schema() over INDEXES. These three view assertions sit at the end
|
|
5
|
+
-- of that file and need no index at all, so a backend skipping 06.3 would have lost them
|
|
6
|
+
-- for no reason.
|
|
7
|
+
--
|
|
8
|
+
-- Subject: a view appears in schema() with its own name as tbl_name, its `sql` text is
|
|
9
|
+
-- preserved verbatim, and `view` shows up in the distinct object-type list.
|
|
10
|
+
|
|
11
|
+
CREATE TABLE products (
|
|
12
|
+
id INTEGER PRIMARY KEY,
|
|
13
|
+
name TEXT,
|
|
14
|
+
category TEXT
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
CREATE VIEW active_products AS SELECT id, name FROM products WHERE category = 'active';
|
|
18
|
+
|
|
19
|
+
SELECT type, name, tbl_name FROM schema() WHERE type = 'view';
|
|
20
|
+
→ [{"type":"view","name":"active_products","tbl_name":"active_products"}]
|
|
21
|
+
|
|
22
|
+
-- Verify view sql is preserved
|
|
23
|
+
SELECT sql FROM schema() WHERE name = 'active_products';
|
|
24
|
+
→ [{"sql":"create view active_products as select id, name from products where category = 'active'"}]
|
|
25
|
+
|
|
26
|
+
-- Verify 'view' is in the list of schema object types
|
|
27
|
+
-- (the 'index' member of the same list is asserted in 06.3-schema)
|
|
28
|
+
SELECT DISTINCT type FROM schema() ORDER BY type;
|
|
29
|
+
→ [{"type":"function"},{"type":"table"},{"type":"view"}]
|