@quereus/quereus 4.20.1 → 4.20.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +17 -69
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/package.json +7 -4
- package/test/README.md +173 -0
- package/test/logic/01-basic.sqllogic +39 -0
- package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
- package/test/logic/01.2-strings.sqllogic +43 -0
- package/test/logic/01.5-insert-select.sqllogic +237 -0
- package/test/logic/01.6-update-extras.sqllogic +118 -0
- package/test/logic/01.7-update-from.sqllogic +67 -0
- package/test/logic/01.8-delete-extras.sqllogic +122 -0
- package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
- package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
- package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
- package/test/logic/01.9-query-expr-values.sqllogic +111 -0
- package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
- package/test/logic/02-filters.sqllogic +54 -0
- package/test/logic/02-smoke.sqllogic +62 -0
- package/test/logic/02.1-bind-parameters.sqllogic +223 -0
- package/test/logic/03-expressions.sqllogic +190 -0
- package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
- package/test/logic/03.4-defaults.sqllogic +554 -0
- package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
- package/test/logic/03.5-tvf.sqllogic +61 -0
- package/test/logic/03.6-type-system.sqllogic +544 -0
- package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
- package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
- package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
- package/test/logic/03.8-not-precedence.sqllogic +255 -0
- package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
- package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
- package/test/logic/04-order-by.sqllogic +38 -0
- package/test/logic/04-transactions.sqllogic +239 -0
- package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
- package/test/logic/05-vtab_memory.sqllogic +50 -0
- package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
- package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
- package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
- package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
- package/test/logic/06-builtin_functions.sqllogic +149 -0
- package/test/logic/06.1-string-functions.sqllogic +92 -0
- package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
- package/test/logic/06.2-math-functions.sqllogic +82 -0
- package/test/logic/06.3-schema.sqllogic +48 -0
- package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
- package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
- package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
- package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
- package/test/logic/06.3.4-view-info.sqllogic +378 -0
- package/test/logic/06.3.5-column-info.sqllogic +347 -0
- package/test/logic/06.3.6-schema-views.sqllogic +29 -0
- package/test/logic/06.4-schema-search-path.sqllogic +354 -0
- package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
- package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
- package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
- package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
- package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
- package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
- package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
- package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
- package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
- package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
- package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
- package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
- package/test/logic/06.7-json-extended.sqllogic +53 -0
- package/test/logic/06.8-json-path-operators.sqllogic +99 -0
- package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
- package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
- package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
- package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
- package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
- package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
- package/test/logic/07-aggregates.sqllogic +193 -0
- package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
- package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
- package/test/logic/07.3-group-by-extras.sqllogic +602 -0
- package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
- package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
- package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
- package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
- package/test/logic/07.5-window.sqllogic +1941 -0
- package/test/logic/07.5.1-window-named.sqllogic +13 -0
- package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
- package/test/logic/07.6-subqueries.sqllogic +78 -0
- package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
- package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
- package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
- package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
- package/test/logic/07.7.1-in-extras.sqllogic +158 -0
- package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
- package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
- package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
- package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
- package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
- package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
- package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
- package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
- package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
- package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
- package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
- package/test/logic/07.9-in-value-list.sqllogic +154 -0
- package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
- package/test/logic/08-views.sqllogic +64 -0
- package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
- package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
- package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
- package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
- package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
- package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
- package/test/logic/09-set_operations.sqllogic +244 -0
- package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
- package/test/logic/10-distinct_datatypes.sqllogic +127 -0
- package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
- package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
- package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
- package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
- package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
- package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
- package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
- package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
- package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
- package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
- package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
- package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
- package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
- package/test/logic/10.2-column-features.sqllogic +365 -0
- package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
- package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
- package/test/logic/10.3-function-features.sqllogic +247 -0
- package/test/logic/10.4-schema-scale.sqllogic +168 -0
- package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
- package/test/logic/10.5-indexes.sqllogic +164 -0
- package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
- package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
- package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
- package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
- package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
- package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
- package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
- package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
- package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
- package/test/logic/100.1-where-extras.sqllogic +163 -0
- package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
- package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
- package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
- package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
- package/test/logic/102-unique-constraints.sqllogic +145 -0
- package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
- package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
- package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
- package/test/logic/102.2-unique-collation.sqllogic +181 -0
- package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
- package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
- package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
- package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
- package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
- package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
- package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
- package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
- package/test/logic/108-cardinality-estimation.sqllogic +146 -0
- package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
- package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
- package/test/logic/11-joins.sqllogic +86 -0
- package/test/logic/11.1-join-using.sqllogic +267 -0
- package/test/logic/11.2-comma-join.sqllogic +35 -0
- package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
- package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
- package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
- package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
- package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
- package/test/logic/12-empty-primary-key.sqllogic +124 -0
- package/test/logic/12-join_padding_order.sqllogic +58 -0
- package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
- package/test/logic/13-cte.sqllogic +137 -0
- package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
- package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
- package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
- package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
- package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
- package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
- package/test/logic/13.4-cte-extras.sqllogic +98 -0
- package/test/logic/13.5-cte-join-order.sqllogic +166 -0
- package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
- package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
- package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
- package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
- package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
- package/test/logic/14-utilities.sqllogic +168 -0
- package/test/logic/15-timespan.sqllogic +279 -0
- package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
- package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
- package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
- package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
- package/test/logic/16-epoch.sqllogic +187 -0
- package/test/logic/17-weekday-modifier.sqllogic +78 -0
- package/test/logic/18-json-string-escapes.sqllogic +86 -0
- package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
- package/test/logic/20-empty-single-row.sqllogic +261 -0
- package/test/logic/21-null-edge-cases.sqllogic +227 -0
- package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
- package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
- package/test/logic/21.2-between-edges.sqllogic +157 -0
- package/test/logic/22-boundary-values.sqllogic +175 -0
- package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
- package/test/logic/24-builtin-branches.sqllogic +611 -0
- package/test/logic/24.1-substr-extras.sqllogic +75 -0
- package/test/logic/24.2-random-extras.sqllogic +39 -0
- package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
- package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
- package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
- package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
- package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
- package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
- package/test/logic/26-join-edge-cases.sqllogic +333 -0
- package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
- package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
- package/test/logic/26.3-join-on-constants.sqllogic +61 -0
- package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
- package/test/logic/27-window-edge-cases.sqllogic +206 -0
- package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
- package/test/logic/27.2-window-exclude.sqllogic +13 -0
- package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
- package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
- package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
- package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
- package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
- package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
- package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
- package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
- package/test/logic/40-constraints.sqllogic +418 -0
- package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
- package/test/logic/40.2-check-extras.sqllogic +683 -0
- package/test/logic/41-alter-table.sqllogic +191 -0
- package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
- package/test/logic/41-fk-cross-schema.sqllogic +155 -0
- package/test/logic/41-fk-extended-targets.sqllogic +173 -0
- package/test/logic/41-foreign-keys.sqllogic +1001 -0
- package/test/logic/41-generated-column-errors.sqllogic +225 -0
- package/test/logic/41-generated-column-extras.sqllogic +598 -0
- package/test/logic/41-generated-column-scope.sqllogic +329 -0
- package/test/logic/41-generated-columns.sqllogic +361 -0
- package/test/logic/41.1-alter-pk.sqllogic +230 -0
- package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
- package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
- package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
- package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
- package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
- package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
- package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
- package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
- package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
- package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
- package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
- package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
- package/test/logic/41.2-alter-column.sqllogic +382 -0
- package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
- package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
- package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
- package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
- package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
- package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
- package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
- package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
- package/test/logic/41.5-alter-misc.sqllogic +48 -0
- package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
- package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
- package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
- package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
- package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
- package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
- package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
- package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
- package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
- package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
- package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
- package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
- package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
- package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
- package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
- package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
- package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
- package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
- package/test/logic/42-committed-snapshot.sqllogic +254 -0
- package/test/logic/42-returning.sqllogic +159 -0
- package/test/logic/42.1-returning-extras.sqllogic +232 -0
- package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
- package/test/logic/43-default-nullability.sqllogic +131 -0
- package/test/logic/43-transition-constraints.sqllogic +341 -0
- package/test/logic/43.1-default-collation.sqllogic +140 -0
- package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
- package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
- package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
- package/test/logic/44-determinism-validation.sqllogic +164 -0
- package/test/logic/44-orthogonality.sqllogic +146 -0
- package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
- package/test/logic/45-udf-determinism.sqllogic +39 -0
- package/test/logic/46-mutation-context.sqllogic +595 -0
- package/test/logic/47-upsert.sqllogic +255 -0
- package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
- package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
- package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
- package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
- package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
- package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
- package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
- package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
- package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
- package/test/logic/49-reference-graph.sqllogic +84 -0
- package/test/logic/50-declarative-schema.sqllogic +2550 -0
- package/test/logic/50-metadata-tags.sqllogic +1033 -0
- package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
- package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
- package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
- package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +210 -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,31 @@
|
|
|
1
|
+
-- 93.4.1-view-mutation-partial-unique-cardinality.sqllogic
|
|
2
|
+
--
|
|
3
|
+
-- requires-capability: standalone-index-ddl
|
|
4
|
+
--
|
|
5
|
+
-- Carved out of 93.4-view-mutation: that ~4400-line file is multi-source view
|
|
6
|
+
-- write-through, and this was its only index DDL. A PARTIAL unique key has no
|
|
7
|
+
-- declarative spelling in this engine — `create unique index … where …` is the only
|
|
8
|
+
-- way to express one — so this adversarial case is the file's single dependency on
|
|
9
|
+
-- standalone index DDL.
|
|
10
|
+
--
|
|
11
|
+
-- Subject: a cross-source `set` whose partner's only unique key on the join column is a
|
|
12
|
+
-- PARTIAL unique index is REJECTED at plan time. A partial unique key bounds uniqueness
|
|
13
|
+
-- only within its predicate scope, so it cannot prove the owner joins at most one
|
|
14
|
+
-- partner. Here xs1pp_p has TWO rows with pcode=500 (one, pv=-5, outside the partial
|
|
15
|
+
-- scope pv>0), so the child cid=1 genuinely joins both parents — the proof correctly
|
|
16
|
+
-- fails and the write is rejected at plan time rather than failing at runtime with
|
|
17
|
+
-- "more than one row". The non-partial (plain UNIQUE column) counterpart it contrasts
|
|
18
|
+
-- with stays in 93.4.
|
|
19
|
+
|
|
20
|
+
create table xs1pp_p (pid integer primary key, pcode integer, pv integer);
|
|
21
|
+
create table xs1pp_c (cid integer primary key, cref integer, cv integer);
|
|
22
|
+
create unique index xs1pp_ux on xs1pp_p(pcode) where pv > 0;
|
|
23
|
+
insert into xs1pp_p values (10, 500, 100), (20, 500, -5);
|
|
24
|
+
insert into xs1pp_c values (1, 500, 1);
|
|
25
|
+
create view xs1pp_v as
|
|
26
|
+
select c.cid as cid, c.cv as cv, p.pv as pv
|
|
27
|
+
from xs1pp_c c join xs1pp_p p on p.pcode = c.cref;
|
|
28
|
+
update xs1pp_v set cv = pv where cid = 1;
|
|
29
|
+
-- error: assigned side joins more than one
|
|
30
|
+
select cid, cv from xs1pp_c order by cid;
|
|
31
|
+
→ [{"cid":1,"cv":1}]
|
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
-- Authored inverses (`with inverse (col = expr, …)`) — write-through consumption
|
|
2
|
+
-- (docs/vu-inverses.md § Authored inverses). The clause supplies authored
|
|
3
|
+
-- put expressions computing base columns from the written view row (`new.<col>`
|
|
4
|
+
-- refs), upgrading a computed (registry-opaque) column to writable + insertable.
|
|
5
|
+
-- Parser/AST round-trip is pinned by the parser ticket; this file pins the
|
|
6
|
+
-- build-time validation, lineage upgrade, and UPDATE/INSERT lowering.
|
|
7
|
+
|
|
8
|
+
-- ===================================
|
|
9
|
+
-- Worked example: a non-injective code collapse. Writes through the view store
|
|
10
|
+
-- the authored representative; reads (incl. RETURNING) normalize through the
|
|
11
|
+
-- forward expression — the PutGet observable (GetPut is intentionally lossy).
|
|
12
|
+
-- ===================================
|
|
13
|
+
|
|
14
|
+
create table ai_t (id integer primary key, code20 text not null);
|
|
15
|
+
insert into ai_t values (1, 'A2'), (2, 'B2');
|
|
16
|
+
|
|
17
|
+
create view ai_v as select id, case code20
|
|
18
|
+
when 'A1' then 'A' when 'A2' then 'A'
|
|
19
|
+
when 'B1' then 'B' when 'B2' then 'B'
|
|
20
|
+
else 'C' end as code
|
|
21
|
+
with inverse (code20 = case new.code when 'A' then 'A1' when 'B' then 'B1' else 'C1' end)
|
|
22
|
+
from ai_t;
|
|
23
|
+
|
|
24
|
+
select * from ai_v order by id;
|
|
25
|
+
→ [{"id":1,"code":"A"},{"id":2,"code":"B"}]
|
|
26
|
+
|
|
27
|
+
-- UPDATE through the view stores the representative ('B' → 'B1', not the row's
|
|
28
|
+
-- original fine-grained value).
|
|
29
|
+
update ai_v set code = 'B' where id = 1;
|
|
30
|
+
select * from ai_t order by id;
|
|
31
|
+
→ [{"id":1,"code20":"B1"},{"id":2,"code20":"B2"}]
|
|
32
|
+
|
|
33
|
+
-- INSERT through the view: the insertability gate is lifted for the authored
|
|
34
|
+
-- column (a registry-`inverse` / opaque computed column stays non-insertable).
|
|
35
|
+
insert into ai_v (id, code) values (3, 'A');
|
|
36
|
+
select * from ai_t where id = 3;
|
|
37
|
+
→ [{"id":3,"code20":"A1"}]
|
|
38
|
+
|
|
39
|
+
-- RETURNING reads back through the FORWARD expression over the post-mutation
|
|
40
|
+
-- base value: writing 'C' stores 'C1', and the returned `code` is the normalized
|
|
41
|
+
-- representative 'C' (PutGet holds; the stored value is the representative).
|
|
42
|
+
update ai_v set code = 'C' where id = 3 returning id, code;
|
|
43
|
+
→ [{"id":3,"code":"C"}]
|
|
44
|
+
select code20 from ai_t where id = 3;
|
|
45
|
+
→ [{"code20":"C1"}]
|
|
46
|
+
|
|
47
|
+
-- Re-select normalizes identically. (`id` is projected alongside `code` to
|
|
48
|
+
-- sidestep a pre-existing planner bug — "No row context" when the WHERE
|
|
49
|
+
-- references a column the outer projection prunes; see tickets/.pre-existing-error.md.)
|
|
50
|
+
select id, code from ai_v where id = 3;
|
|
51
|
+
→ [{"id":3,"code":"C"}]
|
|
52
|
+
|
|
53
|
+
-- view_info / column_info agree with the dynamic truth: the authored column is
|
|
54
|
+
-- updatable, with its (single-put) base trace, and the view is insertable.
|
|
55
|
+
select column_name, is_updatable, base_table, base_column from column_info('ai_v') order by cid;
|
|
56
|
+
→ [{"column_name":"id","is_updatable":"YES","base_table":"ai_t","base_column":"id"},{"column_name":"code","is_updatable":"YES","base_table":"ai_t","base_column":"code20"}]
|
|
57
|
+
select is_updatable, is_insertable_into from view_info('ai_v');
|
|
58
|
+
→ [{"is_updatable":"YES","is_insertable_into":"YES"}]
|
|
59
|
+
|
|
60
|
+
-- Conflict resolution: the lowered base values participate normally in
|
|
61
|
+
-- `insert or replace` (the id=3 row's code20 is replaced via the inverse).
|
|
62
|
+
insert or replace into ai_v (id, code) values (3, 'B');
|
|
63
|
+
select code20 from ai_t where id = 3;
|
|
64
|
+
→ [{"code20":"B1"}]
|
|
65
|
+
|
|
66
|
+
-- ===================================
|
|
67
|
+
-- Build-time validation — position-independent (fails on a bare SELECT that is
|
|
68
|
+
-- never a write target, naming the result column and the offending target/ref).
|
|
69
|
+
-- ===================================
|
|
70
|
+
|
|
71
|
+
-- unknown assignment target (not a FROM-source column)
|
|
72
|
+
select id, code20 as c with inverse (nope = new.c) from ai_t;
|
|
73
|
+
-- error: WITH INVERSE target 'nope' does not resolve
|
|
74
|
+
|
|
75
|
+
-- a bare (non-new-qualified) base column ref in the inverse expression
|
|
76
|
+
select id, case code20 when 'A1' then 'A' else 'C' end as c
|
|
77
|
+
with inverse (code20 = code20 || new.c) from ai_t;
|
|
78
|
+
-- error: without the NEW qualifier
|
|
79
|
+
|
|
80
|
+
-- a new.<ref> to a non-output column
|
|
81
|
+
select id, code20 as c with inverse (code20 = new.zzz) from ai_t;
|
|
82
|
+
-- error: 'new.zzz' does not resolve to an output column
|
|
83
|
+
|
|
84
|
+
-- the same target across two result columns of one select
|
|
85
|
+
select code20 as a with inverse (code20 = new.a),
|
|
86
|
+
code20 as b with inverse (code20 = new.b) from ai_t;
|
|
87
|
+
-- error: both author a WITH INVERSE put to base column 'code20'
|
|
88
|
+
|
|
89
|
+
-- a duplicate target WITHIN one clause is a parse error (parser ticket)
|
|
90
|
+
select code20 as a with inverse (code20 = new.a, code20 = new.a) from ai_t;
|
|
91
|
+
-- error: Duplicate column 'code20' in WITH INVERSE
|
|
92
|
+
|
|
93
|
+
-- ===================================
|
|
94
|
+
-- Unused clause stays inert: a top-level select carrying the clause executes
|
|
95
|
+
-- identically to the same select without it, and the plan shape is unchanged
|
|
96
|
+
-- (the metadata must not block optimization).
|
|
97
|
+
-- ===================================
|
|
98
|
+
|
|
99
|
+
select id, code20 || '!' as bang with inverse (code20 = new.bang) from ai_t order by id;
|
|
100
|
+
→ [{"id":1,"bang":"B1!"},{"id":2,"bang":"B2!"},{"id":3,"bang":"B1!"}]
|
|
101
|
+
|
|
102
|
+
select (select group_concat(node_type) from query_plan('select id, code20 || ''!'' as bang from ai_t'))
|
|
103
|
+
= (select group_concat(node_type) from query_plan('select id, code20 || ''!'' as bang with inverse (code20 = new.bang) from ai_t'))
|
|
104
|
+
as same_plan;
|
|
105
|
+
→ [{"same_plan":true}]
|
|
106
|
+
|
|
107
|
+
-- ===================================
|
|
108
|
+
-- Authored wins over inferred: an authored inverse on an identity column
|
|
109
|
+
-- overrides the inferred verbatim put (writes normalize through the authored
|
|
110
|
+
-- expression), and on a registry-invertible column overrides the inferred
|
|
111
|
+
-- inverse entirely (the clause is total per column).
|
|
112
|
+
-- ===================================
|
|
113
|
+
|
|
114
|
+
create table aw_t (k integer primary key, name text null, n integer null);
|
|
115
|
+
insert into aw_t values (1, 'bob', 10);
|
|
116
|
+
|
|
117
|
+
-- identity column with an authored normalize-on-write
|
|
118
|
+
create view aw_v1 as select k, name with inverse (name = upper(new.name)) from aw_t;
|
|
119
|
+
update aw_v1 set name = 'carl' where k = 1;
|
|
120
|
+
select name from aw_t where k = 1;
|
|
121
|
+
→ [{"name":"CARL"}]
|
|
122
|
+
|
|
123
|
+
-- insert through it normalizes too
|
|
124
|
+
insert into aw_v1 (k, name) values (2, 'dana');
|
|
125
|
+
select name from aw_t where k = 2;
|
|
126
|
+
→ [{"name":"DANA"}]
|
|
127
|
+
|
|
128
|
+
-- registry-invertible (`n + 1`) overridden by an authored put: the registry
|
|
129
|
+
-- inverse would store w - 1; the authored put stores w * 10 instead.
|
|
130
|
+
create view aw_v2 as select k, n + 1 as np with inverse (n = new.np * 10) from aw_t;
|
|
131
|
+
update aw_v2 set np = 5 where k = 1;
|
|
132
|
+
select n from aw_t where k = 1;
|
|
133
|
+
→ [{"n":50}]
|
|
134
|
+
|
|
135
|
+
-- ...and the authored column is insertable where the registry-inverse one is not.
|
|
136
|
+
insert into aw_v2 (k, np) values (3, 2);
|
|
137
|
+
select n from aw_t where k = 3;
|
|
138
|
+
→ [{"n":20}]
|
|
139
|
+
|
|
140
|
+
-- ===================================
|
|
141
|
+
-- Self-referential inverse: target shares the output name; the target namespace
|
|
142
|
+
-- (base) and the new.-namespace (view output) stay distinct.
|
|
143
|
+
-- ===================================
|
|
144
|
+
|
|
145
|
+
create table sr_t (id integer primary key, x integer);
|
|
146
|
+
insert into sr_t values (1, 10);
|
|
147
|
+
create view sr_v as select id, x + 0 as x with inverse (x = new.x + 1) from sr_t;
|
|
148
|
+
update sr_v set x = 5 where id = 1;
|
|
149
|
+
select x from sr_t where id = 1;
|
|
150
|
+
→ [{"x":6}]
|
|
151
|
+
|
|
152
|
+
-- ===================================
|
|
153
|
+
-- Multi-target puts: one view column fans out to two base columns (full-name
|
|
154
|
+
-- split), for UPDATE and INSERT alike.
|
|
155
|
+
-- ===================================
|
|
156
|
+
|
|
157
|
+
create table mt_t (id integer primary key, b text, c text);
|
|
158
|
+
insert into mt_t values (1, 'Ada', 'Lovelace');
|
|
159
|
+
create view mt_v as select id, b || ' ' || c as full_name
|
|
160
|
+
with inverse (b = substr(new.full_name, 1, instr(new.full_name, ' ') - 1),
|
|
161
|
+
c = substr(new.full_name, instr(new.full_name, ' ') + 1))
|
|
162
|
+
from mt_t;
|
|
163
|
+
|
|
164
|
+
update mt_v set full_name = 'Grace Hopper' where id = 1;
|
|
165
|
+
select * from mt_t where id = 1;
|
|
166
|
+
→ [{"id":1,"b":"Grace","c":"Hopper"}]
|
|
167
|
+
|
|
168
|
+
insert into mt_v (id, full_name) values (2, 'Alan Turing');
|
|
169
|
+
select * from mt_t where id = 2;
|
|
170
|
+
→ [{"id":2,"b":"Alan","c":"Turing"}]
|
|
171
|
+
|
|
172
|
+
-- a multi-target column reports updatable with NO single base trace
|
|
173
|
+
select column_name, is_updatable, base_table, base_column from column_info('mt_v') where column_name = 'full_name';
|
|
174
|
+
→ [{"column_name":"full_name","is_updatable":"YES","base_table":null,"base_column":null}]
|
|
175
|
+
|
|
176
|
+
-- ===================================
|
|
177
|
+
-- Multi-target across two sides of a join: two child ops, atomic, ordered by
|
|
178
|
+
-- the existing FK-parent-first rule.
|
|
179
|
+
-- ===================================
|
|
180
|
+
|
|
181
|
+
create table j_pa (pid integer primary key, aval text);
|
|
182
|
+
create table j_pb (bid integer primary key, pid integer not null references j_pa(pid), bval text);
|
|
183
|
+
insert into j_pa values (1, 'x');
|
|
184
|
+
insert into j_pb values (10, 1, 'y');
|
|
185
|
+
create view j_v as select j_pa.pid as pid, j_pb.bid as bid, aval || '/' || bval as combo
|
|
186
|
+
with inverse (aval = substr(new.combo, 1, instr(new.combo, '/') - 1),
|
|
187
|
+
bval = substr(new.combo, instr(new.combo, '/') + 1))
|
|
188
|
+
from j_pa join j_pb on j_pa.pid = j_pb.pid;
|
|
189
|
+
|
|
190
|
+
select * from j_v;
|
|
191
|
+
→ [{"pid":1,"bid":10,"combo":"x/y"}]
|
|
192
|
+
|
|
193
|
+
update j_v set combo = 'AA/BB' where pid = 1;
|
|
194
|
+
select * from j_pa;
|
|
195
|
+
→ [{"pid":1,"aval":"AA"}]
|
|
196
|
+
select * from j_pb;
|
|
197
|
+
→ [{"bid":10,"pid":1,"bval":"BB"}]
|
|
198
|
+
|
|
199
|
+
-- insert through the join envelope with an authored column is deferred (precise
|
|
200
|
+
-- diagnostic, not a silent mis-route)
|
|
201
|
+
insert into j_v (pid, bid, combo) values (2, 20, 'c/d');
|
|
202
|
+
-- error: authored inverse (WITH INVERSE); evaluating authored puts through a join view's insert envelope is deferred
|
|
203
|
+
|
|
204
|
+
-- ===================================
|
|
205
|
+
-- NULL flow: an authored expression producing NULL into a NOT NULL base column
|
|
206
|
+
-- is an ordinary constraint error sited at the base op.
|
|
207
|
+
-- ===================================
|
|
208
|
+
|
|
209
|
+
create table nn_t (id integer primary key, val text not null);
|
|
210
|
+
insert into nn_t values (1, 'a');
|
|
211
|
+
create view nn_v as select id, val || '' as v2 with inverse (val = new.v2) from nn_t;
|
|
212
|
+
update nn_v set v2 = null where id = 1;
|
|
213
|
+
-- error: NOT NULL constraint failed: nn_t.val
|
|
214
|
+
select val from nn_t where id = 1;
|
|
215
|
+
→ [{"val":"a"}]
|
|
216
|
+
|
|
217
|
+
-- ===================================
|
|
218
|
+
-- Interaction with `with defaults`: an authored-inverse target column takes
|
|
219
|
+
-- the inverse-computed value ahead of the clause entry for that base column
|
|
220
|
+
-- (it is a supplied value, not an omission); an unrelated entry still fills.
|
|
221
|
+
-- ===================================
|
|
222
|
+
|
|
223
|
+
create table di_t (id integer primary key, code20 text not null, tag text);
|
|
224
|
+
create view di_v as select id, case code20 when 'A1' then 'A' else 'C' end as code
|
|
225
|
+
with inverse (code20 = case new.code when 'A' then 'A1' else 'C1' end)
|
|
226
|
+
from di_t
|
|
227
|
+
with defaults (code20 = 'X9', tag = 'defaulted');
|
|
228
|
+
|
|
229
|
+
insert into di_v (id, code) values (1, 'A');
|
|
230
|
+
select * from di_t where id = 1;
|
|
231
|
+
→ [{"id":1,"code20":"A1","tag":"defaulted"}]
|
|
232
|
+
|
|
233
|
+
-- ===================================
|
|
234
|
+
-- ALTER … RENAME propagation. A rename of a FROM-table base column rewrites the
|
|
235
|
+
-- clause's target; a rename that shifts an UNALIASED projection's output name
|
|
236
|
+
-- retargets `new.<old>` refs; a renamed table inside an assignment's subquery
|
|
237
|
+
-- rewrites scope-aware.
|
|
238
|
+
-- ===================================
|
|
239
|
+
|
|
240
|
+
-- target rename: code20 → code_raw rewrites the inverse target alongside the body
|
|
241
|
+
alter table ai_t rename column code20 to code_raw;
|
|
242
|
+
update ai_v set code = 'A' where id = 1;
|
|
243
|
+
select code_raw from ai_t where id = 1;
|
|
244
|
+
→ [{"code_raw":"A1"}]
|
|
245
|
+
|
|
246
|
+
-- output-name shift: `b` is projected bare (output name = b); renaming b → b2
|
|
247
|
+
-- shifts the output name, so `new.b` in the sibling clause must follow.
|
|
248
|
+
create table rn_t (id integer primary key, b text, c text);
|
|
249
|
+
insert into rn_t values (1, 'base', 'old');
|
|
250
|
+
create view rn_v as select id, b, b || '?' as e with inverse (c = new.b || '-' || new.e) from rn_t;
|
|
251
|
+
alter table rn_t rename column b to b2;
|
|
252
|
+
update rn_v set e = 'E!' where id = 1;
|
|
253
|
+
select c from rn_t where id = 1;
|
|
254
|
+
→ [{"c":"base-E!"}]
|
|
255
|
+
|
|
256
|
+
-- table rename inside an assignment's subquery
|
|
257
|
+
create table lk_t (k text primary key, v text);
|
|
258
|
+
insert into lk_t values ('A', 'mapped-A');
|
|
259
|
+
create table tr_t (id integer primary key, raw text);
|
|
260
|
+
insert into tr_t values (1, 'orig');
|
|
261
|
+
create view tr_v as select id, raw || '' as r2
|
|
262
|
+
with inverse (raw = (select v from lk_t where k = new.r2)) from tr_t;
|
|
263
|
+
alter table lk_t rename to lk_t2;
|
|
264
|
+
update tr_v set r2 = 'A' where id = 1;
|
|
265
|
+
select raw from tr_t where id = 1;
|
|
266
|
+
→ [{"raw":"mapped-A"}]
|
|
267
|
+
|
|
268
|
+
-- ===================================
|
|
269
|
+
-- Lens body: the clause inside a `declare lens` override flows through the
|
|
270
|
+
-- sparse-override merger per covered column (gap-filled columns never carry
|
|
271
|
+
-- one); writes through the logical table consume it. Full prover integration
|
|
272
|
+
-- is the authored-inverse-lens-prover ticket.
|
|
273
|
+
-- ===================================
|
|
274
|
+
|
|
275
|
+
declare schema aib {
|
|
276
|
+
table Core {
|
|
277
|
+
id integer primary key,
|
|
278
|
+
speed integer,
|
|
279
|
+
color text
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
-- run
|
|
284
|
+
|
|
285
|
+
apply schema aib;
|
|
286
|
+
|
|
287
|
+
-- run
|
|
288
|
+
|
|
289
|
+
insert into aib.Core values (1, 60, 'red');
|
|
290
|
+
|
|
291
|
+
-- run
|
|
292
|
+
|
|
293
|
+
declare logical schema aiapp {
|
|
294
|
+
table Car {
|
|
295
|
+
id integer primary key,
|
|
296
|
+
mph integer,
|
|
297
|
+
color text
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
-- run
|
|
302
|
+
|
|
303
|
+
declare lens for aiapp over aib {
|
|
304
|
+
view Car as select id, speed * 2 as mph with inverse (speed = new.mph / 2) from aib.Core
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
-- run
|
|
308
|
+
|
|
309
|
+
apply schema aiapp;
|
|
310
|
+
|
|
311
|
+
-- run
|
|
312
|
+
|
|
313
|
+
select * from aiapp.Car order by id;
|
|
314
|
+
→ [{"id":1,"mph":120,"color":"red"}]
|
|
315
|
+
|
|
316
|
+
update aiapp.Car set mph = 200 where id = 1;
|
|
317
|
+
select speed from aib.Core where id = 1;
|
|
318
|
+
→ [{"speed":100}]
|
|
319
|
+
|
|
320
|
+
-- run
|
|
321
|
+
|
|
322
|
+
-- ===================================
|
|
323
|
+
-- Written-row binding: `new.<x>` where `x` is ALSO assigned in the same UPDATE
|
|
324
|
+
-- binds that assignment's value (the written view row is the post-statement
|
|
325
|
+
-- image), order-independently; an unassigned `x` keeps its forward read image.
|
|
326
|
+
-- ===================================
|
|
327
|
+
|
|
328
|
+
create table ma_t (id integer primary key, a integer, b integer);
|
|
329
|
+
insert into ma_t values (1, 1, 2);
|
|
330
|
+
create view ma_v as select id, a, b + 0 as b2 with inverse (b = new.b2 + new.a) from ma_t;
|
|
331
|
+
|
|
332
|
+
-- co-assigned: new.a sees the NEW a (10), not the pre-update 1
|
|
333
|
+
update ma_v set b2 = 5, a = 10 where id = 1;
|
|
334
|
+
select a, b from ma_t where id = 1;
|
|
335
|
+
→ [{"a":10,"b":15}]
|
|
336
|
+
|
|
337
|
+
-- assignment order does not matter (every embedded value reads the pre-update row)
|
|
338
|
+
update ma_v set a = 20, b2 = 7 where id = 1;
|
|
339
|
+
select a, b from ma_t where id = 1;
|
|
340
|
+
→ [{"a":20,"b":27}]
|
|
341
|
+
|
|
342
|
+
-- unassigned sibling: new.a is the forward read image (current a = 20)
|
|
343
|
+
update ma_v set b2 = 1 where id = 1;
|
|
344
|
+
select b from ma_t where id = 1;
|
|
345
|
+
→ [{"b":21}]
|
|
346
|
+
|
|
347
|
+
-- ...and the same written-row binding through a join view: new.av co-assigned
|
|
348
|
+
-- on the partner side substitutes the assigned value; unassigned it rides the
|
|
349
|
+
-- captured partner read.
|
|
350
|
+
create table mj_a (pid integer primary key, av text);
|
|
351
|
+
create table mj_b (bid integer primary key, pid integer not null references mj_a(pid), bv text);
|
|
352
|
+
insert into mj_a values (1, 'a');
|
|
353
|
+
insert into mj_b values (10, 1, 'b');
|
|
354
|
+
create view mj_v as select mj_a.pid as pid, mj_b.bid as bid, mj_a.av as av,
|
|
355
|
+
bv || '' as bv2 with inverse (bv = new.bv2 || '+' || new.av)
|
|
356
|
+
from mj_a join mj_b on mj_a.pid = mj_b.pid;
|
|
357
|
+
|
|
358
|
+
update mj_v set bv2 = 'x', av = 'NEWA' where pid = 1;
|
|
359
|
+
select av from mj_a;
|
|
360
|
+
→ [{"av":"NEWA"}]
|
|
361
|
+
select bv from mj_b;
|
|
362
|
+
→ [{"bv":"x+NEWA"}]
|
|
363
|
+
|
|
364
|
+
update mj_v set bv2 = 'y' where pid = 1;
|
|
365
|
+
select bv from mj_b;
|
|
366
|
+
→ [{"bv":"y+NEWA"}]
|
|
367
|
+
|
|
368
|
+
-- ===================================
|
|
369
|
+
-- Explicit `create view v(a, b)` column list: output names rename positionally;
|
|
370
|
+
-- `new.<x>` refs (by SELECT-output name) stay bound through the index bridge on
|
|
371
|
+
-- UPDATE and INSERT alike.
|
|
372
|
+
-- ===================================
|
|
373
|
+
|
|
374
|
+
create table cl_t (id integer primary key, raw text);
|
|
375
|
+
create view cl_v (vid, vcode) as select id, raw || '~' as code with inverse (raw = new.code || '!') from cl_t;
|
|
376
|
+
|
|
377
|
+
insert into cl_v (vid, vcode) values (1, 'a');
|
|
378
|
+
select raw from cl_t where id = 1;
|
|
379
|
+
→ [{"raw":"a!"}]
|
|
380
|
+
|
|
381
|
+
update cl_v set vcode = 'b' where vid = 1;
|
|
382
|
+
select raw from cl_t where id = 1;
|
|
383
|
+
→ [{"raw":"b!"}]
|
|
384
|
+
|
|
385
|
+
select * from cl_v;
|
|
386
|
+
→ [{"vid":1,"vcode":"b!~"}]
|
|
387
|
+
|
|
388
|
+
-- ===================================
|
|
389
|
+
-- An aggregate result column cannot carry the clause: the aggregate phase never
|
|
390
|
+
-- reaches the projection lineage the clause rides, so it is rejected loud
|
|
391
|
+
-- rather than silently dropped.
|
|
392
|
+
-- ===================================
|
|
393
|
+
|
|
394
|
+
select sum(x) as s with inverse (x = new.s) from sr_t;
|
|
395
|
+
-- error: WITH INVERSE cannot apply to an aggregate result column
|
|
396
|
+
|
|
397
|
+
-- a bare (non-new-qualified) ref inside a window operand of an inverse
|
|
398
|
+
-- expression is validated like any other in-scope reference
|
|
399
|
+
select id, x + 0 as x2 with inverse (x = sum(new.x2) over (partition by x)) from sr_t;
|
|
400
|
+
-- error: without the NEW qualifier
|
|
401
|
+
|
|
402
|
+
-- ===================================
|
|
403
|
+
-- RENAME propagation, star projection: `select *` exposes the renamed column's
|
|
404
|
+
-- output name, so a sibling clause's `new.<old>` refs retarget with it.
|
|
405
|
+
-- ===================================
|
|
406
|
+
|
|
407
|
+
create table st_t (id integer primary key, tag text, payload text);
|
|
408
|
+
insert into st_t values (1, 'T', 'p');
|
|
409
|
+
create view st_v as select *, payload || '' as p2
|
|
410
|
+
with inverse (payload = new.p2 || ':' || new.tag) from st_t;
|
|
411
|
+
|
|
412
|
+
alter table st_t rename column tag to tag2;
|
|
413
|
+
update st_v set p2 = 'q' where id = 1;
|
|
414
|
+
select payload from st_t where id = 1;
|
|
415
|
+
→ [{"payload":"q:T"}]
|