@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,208 @@
|
|
|
1
|
+
-- schema-foreign-keys.sqllogic - Testing foreign_key_info() TVF
|
|
2
|
+
|
|
3
|
+
-- ===================================================================
|
|
4
|
+
-- Setup: Parent tables
|
|
5
|
+
-- ===================================================================
|
|
6
|
+
|
|
7
|
+
CREATE TABLE authors (
|
|
8
|
+
id INTEGER PRIMARY KEY,
|
|
9
|
+
name TEXT NOT NULL
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
CREATE TABLE categories (
|
|
13
|
+
id INTEGER PRIMARY KEY,
|
|
14
|
+
label TEXT NOT NULL
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
-- ===================================================================
|
|
18
|
+
-- Test 1: Basic single-column FK
|
|
19
|
+
-- ===================================================================
|
|
20
|
+
|
|
21
|
+
CREATE TABLE books (
|
|
22
|
+
id INTEGER PRIMARY KEY,
|
|
23
|
+
title TEXT NOT NULL,
|
|
24
|
+
author_id INTEGER,
|
|
25
|
+
FOREIGN KEY (author_id) REFERENCES authors(id)
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
SELECT id, "table", "from", referenced_table, "to", on_update, on_delete, "deferred", seq
|
|
29
|
+
FROM foreign_key_info('books');
|
|
30
|
+
→ [{"id":0,"table":"books","from":"author_id","referenced_table":"authors","to":"id","on_update":"restrict","on_delete":"restrict","deferred":0,"seq":0}]
|
|
31
|
+
|
|
32
|
+
-- ===================================================================
|
|
33
|
+
-- Test 2: Table with no FKs returns empty result
|
|
34
|
+
-- ===================================================================
|
|
35
|
+
|
|
36
|
+
SELECT count(*) as cnt FROM foreign_key_info('authors');
|
|
37
|
+
→ [{"cnt":0}]
|
|
38
|
+
|
|
39
|
+
-- ===================================================================
|
|
40
|
+
-- Test 3: Named constraint
|
|
41
|
+
-- ===================================================================
|
|
42
|
+
|
|
43
|
+
CREATE TABLE articles (
|
|
44
|
+
id INTEGER PRIMARY KEY,
|
|
45
|
+
author_id INTEGER,
|
|
46
|
+
CONSTRAINT fk_article_author FOREIGN KEY (author_id) REFERENCES authors(id)
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
SELECT id, name, "from", "to" FROM foreign_key_info('articles');
|
|
50
|
+
→ [{"id":0,"name":"fk_article_author","from":"author_id","to":"id"}]
|
|
51
|
+
|
|
52
|
+
DROP TABLE articles;
|
|
53
|
+
|
|
54
|
+
-- ===================================================================
|
|
55
|
+
-- Test 4: ON DELETE/UPDATE actions
|
|
56
|
+
-- ===================================================================
|
|
57
|
+
|
|
58
|
+
CREATE TABLE posts (
|
|
59
|
+
id INTEGER PRIMARY KEY,
|
|
60
|
+
author_id INTEGER,
|
|
61
|
+
FOREIGN KEY (author_id) REFERENCES authors(id) ON DELETE CASCADE ON UPDATE RESTRICT
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
SELECT on_update, on_delete FROM foreign_key_info('posts');
|
|
65
|
+
→ [{"on_update":"restrict","on_delete":"cascade"}]
|
|
66
|
+
|
|
67
|
+
DROP TABLE posts;
|
|
68
|
+
|
|
69
|
+
-- ===================================================================
|
|
70
|
+
-- Test 5: Multiple FKs on one table — distinct id values
|
|
71
|
+
-- ===================================================================
|
|
72
|
+
|
|
73
|
+
CREATE TABLE tagged_books (
|
|
74
|
+
id INTEGER PRIMARY KEY,
|
|
75
|
+
author_id INTEGER,
|
|
76
|
+
category_id INTEGER,
|
|
77
|
+
FOREIGN KEY (author_id) REFERENCES authors(id),
|
|
78
|
+
FOREIGN KEY (category_id) REFERENCES categories(id)
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
SELECT id, "from", referenced_table FROM foreign_key_info('tagged_books') ORDER BY id;
|
|
82
|
+
→ [{"id":0,"from":"author_id","referenced_table":"authors"},{"id":1,"from":"category_id","referenced_table":"categories"}]
|
|
83
|
+
|
|
84
|
+
DROP TABLE tagged_books;
|
|
85
|
+
|
|
86
|
+
-- ===================================================================
|
|
87
|
+
-- Test 6: Composite FK — multiple rows with same id, different seq
|
|
88
|
+
-- ===================================================================
|
|
89
|
+
|
|
90
|
+
CREATE TABLE composite_parent (
|
|
91
|
+
a INTEGER,
|
|
92
|
+
b INTEGER,
|
|
93
|
+
PRIMARY KEY (a, b)
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
CREATE TABLE composite_child (
|
|
97
|
+
id INTEGER PRIMARY KEY,
|
|
98
|
+
ref_a INTEGER,
|
|
99
|
+
ref_b INTEGER,
|
|
100
|
+
FOREIGN KEY (ref_a, ref_b) REFERENCES composite_parent(a, b)
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
SELECT id, "from", "to", seq FROM foreign_key_info('composite_child') ORDER BY seq;
|
|
104
|
+
→ [{"id":0,"from":"ref_a","to":"a","seq":0},{"id":0,"from":"ref_b","to":"b","seq":1}]
|
|
105
|
+
|
|
106
|
+
DROP TABLE composite_child;
|
|
107
|
+
DROP TABLE composite_parent;
|
|
108
|
+
|
|
109
|
+
-- ===================================================================
|
|
110
|
+
-- Test 7: Auto-generated constraint name for unnamed constraints
|
|
111
|
+
-- ===================================================================
|
|
112
|
+
|
|
113
|
+
SELECT name FROM foreign_key_info('books');
|
|
114
|
+
→ [{"name":"_fk_books_author_id"}]
|
|
115
|
+
|
|
116
|
+
-- ===================================================================
|
|
117
|
+
-- Test 8: Nonexistent table throws error
|
|
118
|
+
-- ===================================================================
|
|
119
|
+
|
|
120
|
+
SELECT * FROM foreign_key_info('nonexistent_table');
|
|
121
|
+
-- error: Table 'nonexistent_table' not found
|
|
122
|
+
|
|
123
|
+
-- ===================================================================
|
|
124
|
+
-- Test 9: Implicit single-column FK (no parent column list) resolves
|
|
125
|
+
-- to the parent's primary key
|
|
126
|
+
-- ===================================================================
|
|
127
|
+
|
|
128
|
+
CREATE TABLE imp_parent (pid INTEGER PRIMARY KEY, other INTEGER);
|
|
129
|
+
CREATE TABLE imp_child (id INTEGER PRIMARY KEY, x INTEGER REFERENCES imp_parent);
|
|
130
|
+
|
|
131
|
+
SELECT "from", "to" FROM foreign_key_info('imp_child');
|
|
132
|
+
→ [{"from":"x","to":"pid"}]
|
|
133
|
+
|
|
134
|
+
DROP TABLE imp_child;
|
|
135
|
+
DROP TABLE imp_parent;
|
|
136
|
+
|
|
137
|
+
-- ===================================================================
|
|
138
|
+
-- Test 10: Implicit composite FK yields one row per parent primary-key
|
|
139
|
+
-- column, in primary-key order
|
|
140
|
+
-- ===================================================================
|
|
141
|
+
|
|
142
|
+
CREATE TABLE imp_parent2 (a INTEGER, b INTEGER, PRIMARY KEY (a, b));
|
|
143
|
+
CREATE TABLE imp_child2 (
|
|
144
|
+
id INTEGER PRIMARY KEY,
|
|
145
|
+
x INTEGER,
|
|
146
|
+
y INTEGER,
|
|
147
|
+
FOREIGN KEY (x, y) REFERENCES imp_parent2
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
SELECT "from", "to", seq FROM foreign_key_info('imp_child2') ORDER BY seq;
|
|
151
|
+
→ [{"from":"x","to":"a","seq":0},{"from":"y","to":"b","seq":1}]
|
|
152
|
+
|
|
153
|
+
DROP TABLE imp_child2;
|
|
154
|
+
DROP TABLE imp_parent2;
|
|
155
|
+
|
|
156
|
+
-- ===================================================================
|
|
157
|
+
-- Test 11: Implicit FK whose parent table does not exist reports "to"
|
|
158
|
+
-- as NULL rather than raising
|
|
159
|
+
-- ===================================================================
|
|
160
|
+
|
|
161
|
+
CREATE TABLE imp_child3 (id INTEGER PRIMARY KEY, x INTEGER REFERENCES nonexistent_parent);
|
|
162
|
+
|
|
163
|
+
SELECT "from", "to" FROM foreign_key_info('imp_child3');
|
|
164
|
+
→ [{"from":"x","to":null}]
|
|
165
|
+
|
|
166
|
+
DROP TABLE imp_child3;
|
|
167
|
+
|
|
168
|
+
-- ===================================================================
|
|
169
|
+
-- Test 12: Implicit FK wider than the parent's primary key reports the
|
|
170
|
+
-- unmatched positions as NULL rather than raising (enforcement skips
|
|
171
|
+
-- this malformed shape entirely)
|
|
172
|
+
-- ===================================================================
|
|
173
|
+
|
|
174
|
+
CREATE TABLE imp_parent4 (pid INTEGER PRIMARY KEY);
|
|
175
|
+
CREATE TABLE imp_child4 (
|
|
176
|
+
id INTEGER PRIMARY KEY,
|
|
177
|
+
x INTEGER,
|
|
178
|
+
y INTEGER,
|
|
179
|
+
FOREIGN KEY (x, y) REFERENCES imp_parent4
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
SELECT "from", "to", seq FROM foreign_key_info('imp_child4') ORDER BY seq;
|
|
183
|
+
→ [{"from":"x","to":"pid","seq":0},{"from":"y","to":null,"seq":1}]
|
|
184
|
+
|
|
185
|
+
DROP TABLE imp_child4;
|
|
186
|
+
DROP TABLE imp_parent4;
|
|
187
|
+
|
|
188
|
+
-- ===================================================================
|
|
189
|
+
-- Test 13: Implicit FK to a parent that declares no primary key resolves
|
|
190
|
+
-- against the synthesized key Quereus gives every table
|
|
191
|
+
-- ===================================================================
|
|
192
|
+
|
|
193
|
+
CREATE TABLE imp_parent5 (a INTEGER);
|
|
194
|
+
CREATE TABLE imp_child5 (id INTEGER PRIMARY KEY, x INTEGER REFERENCES imp_parent5);
|
|
195
|
+
|
|
196
|
+
SELECT "from", "to" FROM foreign_key_info('imp_child5');
|
|
197
|
+
→ [{"from":"x","to":"a"}]
|
|
198
|
+
|
|
199
|
+
DROP TABLE imp_child5;
|
|
200
|
+
DROP TABLE imp_parent5;
|
|
201
|
+
|
|
202
|
+
-- ===================================================================
|
|
203
|
+
-- Cleanup
|
|
204
|
+
-- ===================================================================
|
|
205
|
+
|
|
206
|
+
DROP TABLE books;
|
|
207
|
+
DROP TABLE categories;
|
|
208
|
+
DROP TABLE authors;
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
-- introspection-tags.sqllogic - Tag and rich-metadata exposure through introspection TVFs
|
|
2
|
+
|
|
3
|
+
-- ===================================================================
|
|
4
|
+
-- Setup
|
|
5
|
+
-- ===================================================================
|
|
6
|
+
|
|
7
|
+
CREATE TABLE Orders (
|
|
8
|
+
id INTEGER PRIMARY KEY,
|
|
9
|
+
name TEXT NOT NULL
|
|
10
|
+
) WITH TAGS (display_name = 'Customer Orders', audit = true);
|
|
11
|
+
|
|
12
|
+
CREATE TABLE PlainTable (
|
|
13
|
+
id INTEGER PRIMARY KEY,
|
|
14
|
+
val TEXT
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
CREATE VIEW ActiveOrders AS SELECT * FROM Orders WHERE id > 0
|
|
18
|
+
WITH TAGS (cacheable = true, purpose = 'active orders filter');
|
|
19
|
+
|
|
20
|
+
CREATE VIEW PlainView AS SELECT * FROM PlainTable;
|
|
21
|
+
|
|
22
|
+
-- ===================================================================
|
|
23
|
+
-- schema() — tags on tables / views; null for untagged & functions
|
|
24
|
+
-- (index tags live in 06.3.3.1-introspection-tags-index — they need index DDL)
|
|
25
|
+
-- ===================================================================
|
|
26
|
+
|
|
27
|
+
SELECT name, json_extract(tags, '$.display_name') AS display_name
|
|
28
|
+
FROM schema() WHERE type = 'table' AND name = 'Orders';
|
|
29
|
+
→ [{"name":"Orders","display_name":"Customer Orders"}]
|
|
30
|
+
|
|
31
|
+
SELECT tags FROM schema() WHERE type = 'table' AND name = 'PlainTable';
|
|
32
|
+
→ [{"tags":null}]
|
|
33
|
+
|
|
34
|
+
SELECT json_extract(tags, '$.cacheable') AS cacheable,
|
|
35
|
+
json_extract(tags, '$.purpose') AS purpose
|
|
36
|
+
FROM schema() WHERE type = 'view' AND name = 'ActiveOrders';
|
|
37
|
+
→ [{"cacheable":true,"purpose":"active orders filter"}]
|
|
38
|
+
|
|
39
|
+
SELECT tags FROM schema() WHERE type = 'view' AND name = 'PlainView';
|
|
40
|
+
→ [{"tags":null}]
|
|
41
|
+
|
|
42
|
+
-- Functions never carry tags
|
|
43
|
+
SELECT count(*) AS bad FROM schema() WHERE type = 'function' AND tags IS NOT NULL;
|
|
44
|
+
→ [{"bad":0}]
|
|
45
|
+
|
|
46
|
+
-- ===================================================================
|
|
47
|
+
-- table_info() — column-level tags, collation, generated flag
|
|
48
|
+
-- ===================================================================
|
|
49
|
+
|
|
50
|
+
CREATE TABLE Products (
|
|
51
|
+
id INTEGER PRIMARY KEY WITH TAGS (display_name = 'Product ID'),
|
|
52
|
+
name TEXT NOT NULL COLLATE NOCASE WITH TAGS (searchable = true),
|
|
53
|
+
price REAL NOT NULL,
|
|
54
|
+
discounted REAL GENERATED ALWAYS AS (price * 0.9),
|
|
55
|
+
snapshot REAL GENERATED ALWAYS AS (price + 1) STORED
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
SELECT name, json_extract(tags, '$.display_name') AS display_name,
|
|
59
|
+
json_extract(tags, '$.searchable') AS searchable
|
|
60
|
+
FROM table_info('Products') ORDER BY cid;
|
|
61
|
+
→ [{"name":"id","display_name":"Product ID","searchable":null},{"name":"name","display_name":null,"searchable":true},{"name":"price","display_name":null,"searchable":null},{"name":"discounted","display_name":null,"searchable":null},{"name":"snapshot","display_name":null,"searchable":null}]
|
|
62
|
+
|
|
63
|
+
SELECT name, collation FROM table_info('Products') ORDER BY cid;
|
|
64
|
+
→ [{"name":"id","collation":"BINARY"},{"name":"name","collation":"NOCASE"},{"name":"price","collation":"BINARY"},{"name":"discounted","collation":"BINARY"},{"name":"snapshot","collation":"BINARY"}]
|
|
65
|
+
|
|
66
|
+
SELECT name, "generated" FROM table_info('Products') ORDER BY cid;
|
|
67
|
+
→ [{"name":"id","generated":0},{"name":"name","generated":0},{"name":"price","generated":0},{"name":"discounted","generated":1},{"name":"snapshot","generated":2}]
|
|
68
|
+
|
|
69
|
+
-- ===================================================================
|
|
70
|
+
-- foreign_key_info() — tags on FKs, repeated per seq row
|
|
71
|
+
-- ===================================================================
|
|
72
|
+
|
|
73
|
+
CREATE TABLE FkChild (
|
|
74
|
+
id INTEGER PRIMARY KEY,
|
|
75
|
+
order_id INTEGER,
|
|
76
|
+
CONSTRAINT fk_child_order FOREIGN KEY (order_id) REFERENCES Orders(id)
|
|
77
|
+
WITH TAGS (audit = true, purpose = 'links to orders')
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
SELECT name, json_extract(tags, '$.audit') AS audit,
|
|
81
|
+
json_extract(tags, '$.purpose') AS purpose
|
|
82
|
+
FROM foreign_key_info('FkChild');
|
|
83
|
+
→ [{"name":"fk_child_order","audit":true,"purpose":"links to orders"}]
|
|
84
|
+
|
|
85
|
+
-- Composite FK: tags repeat across all seq rows
|
|
86
|
+
CREATE TABLE CompositeParent (
|
|
87
|
+
a INTEGER,
|
|
88
|
+
b INTEGER,
|
|
89
|
+
PRIMARY KEY (a, b)
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
CREATE TABLE CompositeChild (
|
|
93
|
+
id INTEGER PRIMARY KEY,
|
|
94
|
+
ref_a INTEGER,
|
|
95
|
+
ref_b INTEGER,
|
|
96
|
+
CONSTRAINT fk_composite FOREIGN KEY (ref_a, ref_b) REFERENCES CompositeParent(a, b)
|
|
97
|
+
WITH TAGS (kind = 'composite')
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
SELECT seq, json_extract(tags, '$.kind') AS kind
|
|
101
|
+
FROM foreign_key_info('CompositeChild') ORDER BY seq;
|
|
102
|
+
→ [{"seq":0,"kind":"composite"},{"seq":1,"kind":"composite"}]
|
|
103
|
+
|
|
104
|
+
-- Untagged FK
|
|
105
|
+
SELECT tags FROM foreign_key_info('CompositeChild')
|
|
106
|
+
WHERE tags IS NOT NULL LIMIT 0;
|
|
107
|
+
→ []
|
|
108
|
+
|
|
109
|
+
-- ===================================================================
|
|
110
|
+
-- index_info() — empty on a table with no indexes
|
|
111
|
+
-- (the populated column-by-column layout lives in
|
|
112
|
+
-- 06.3.3.1-introspection-tags-index — it needs index DDL)
|
|
113
|
+
-- ===================================================================
|
|
114
|
+
|
|
115
|
+
-- Empty result on a table with no indexes
|
|
116
|
+
SELECT count(*) AS cnt FROM index_info('PlainTable') WHERE index_name LIKE 'idx_%';
|
|
117
|
+
→ [{"cnt":0}]
|
|
118
|
+
|
|
119
|
+
-- ===================================================================
|
|
120
|
+
-- check_constraint_info() — named CHECK with tags, unnamed without
|
|
121
|
+
-- ===================================================================
|
|
122
|
+
|
|
123
|
+
CREATE TABLE ChkTable (
|
|
124
|
+
id INTEGER PRIMARY KEY,
|
|
125
|
+
qty INTEGER,
|
|
126
|
+
CONSTRAINT chk_qty_positive CHECK (qty > 0) WITH TAGS (error_message = 'must be positive'),
|
|
127
|
+
CHECK (qty < 1000)
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
SELECT name, "deferrable", initially_deferred,
|
|
131
|
+
json_extract(tags, '$.error_message') AS msg
|
|
132
|
+
FROM check_constraint_info('ChkTable') ORDER BY id;
|
|
133
|
+
→ [{"name":"chk_qty_positive","deferrable":0,"initially_deferred":0,"msg":"must be positive"},{"name":null,"deferrable":0,"initially_deferred":0,"msg":null}]
|
|
134
|
+
|
|
135
|
+
-- expr text round-trips through the AST stringifier
|
|
136
|
+
SELECT expr FROM check_constraint_info('ChkTable') WHERE name = 'chk_qty_positive';
|
|
137
|
+
→ [{"expr":"qty > 0"}]
|
|
138
|
+
|
|
139
|
+
-- ===================================================================
|
|
140
|
+
-- unique_constraint_info() — named UNIQUE with tags, multi-column
|
|
141
|
+
-- ===================================================================
|
|
142
|
+
|
|
143
|
+
CREATE TABLE UqTable (
|
|
144
|
+
id INTEGER PRIMARY KEY,
|
|
145
|
+
email TEXT NOT NULL,
|
|
146
|
+
region TEXT NOT NULL,
|
|
147
|
+
code TEXT NOT NULL,
|
|
148
|
+
CONSTRAINT uq_email UNIQUE (email) WITH TAGS (error_message = 'email must be unique'),
|
|
149
|
+
UNIQUE (region, code)
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
SELECT id, name, seq, column_name, partial,
|
|
153
|
+
json_extract(tags, '$.error_message') AS msg
|
|
154
|
+
FROM unique_constraint_info('UqTable') ORDER BY id, seq;
|
|
155
|
+
→ [{"id":0,"name":"uq_email","seq":0,"column_name":"email","partial":0,"msg":"email must be unique"},{"id":1,"name":null,"seq":0,"column_name":"region","partial":0,"msg":null},{"id":1,"name":null,"seq":1,"column_name":"code","partial":0,"msg":null}]
|
|
156
|
+
|
|
157
|
+
-- A partial unique INDEX synthesizing a partial unique constraint lives in
|
|
158
|
+
-- 06.3.3.1-introspection-tags-index (it needs standalone CREATE UNIQUE INDEX).
|
|
159
|
+
|
|
160
|
+
-- ===================================================================
|
|
161
|
+
-- assertion_info() — CREATE ASSERTION listing
|
|
162
|
+
-- ===================================================================
|
|
163
|
+
|
|
164
|
+
CREATE TABLE AssertData (id INTEGER PRIMARY KEY, val INTEGER);
|
|
165
|
+
-- run
|
|
166
|
+
|
|
167
|
+
CREATE ASSERTION val_positive CHECK (NOT EXISTS (SELECT 1 FROM AssertData WHERE val < 0));
|
|
168
|
+
CREATE ASSERTION val_bounded CHECK (NOT EXISTS (SELECT 1 FROM AssertData WHERE val > 100));
|
|
169
|
+
-- run
|
|
170
|
+
|
|
171
|
+
SELECT name, "deferrable", initially_deferred FROM assertion_info() ORDER BY name;
|
|
172
|
+
→ [{"name":"val_bounded","deferrable":1,"initially_deferred":1},{"name":"val_positive","deferrable":1,"initially_deferred":1}]
|
|
173
|
+
|
|
174
|
+
-- violation_sql is non-empty
|
|
175
|
+
SELECT count(*) AS cnt FROM assertion_info() WHERE length(violation_sql) > 0;
|
|
176
|
+
→ [{"cnt":2}]
|
|
177
|
+
|
|
178
|
+
-- dependent_tables is a JSON array of the base tables the body reads: one entry
|
|
179
|
+
-- per table reference, named `<schema>.<table>` lowercased
|
|
180
|
+
SELECT count(*) AS cnt FROM assertion_info() WHERE json_valid(dependent_tables) = 1;
|
|
181
|
+
→ [{"cnt":2}]
|
|
182
|
+
|
|
183
|
+
SELECT name, json_array_length(dependent_tables) AS n, json_extract(dependent_tables, '$[0].base') AS base
|
|
184
|
+
FROM assertion_info() ORDER BY name;
|
|
185
|
+
→ [{"name":"val_bounded","n":1,"base":"main.assertdata"},{"name":"val_positive","n":1,"base":"main.assertdata"}]
|
|
186
|
+
|
|
187
|
+
-- ===================================================================
|
|
188
|
+
-- Cleanup
|
|
189
|
+
-- ===================================================================
|
|
190
|
+
DROP ASSERTION val_bounded;
|
|
191
|
+
DROP ASSERTION val_positive;
|
|
192
|
+
DROP TABLE AssertData;
|
|
193
|
+
DROP TABLE UqTable;
|
|
194
|
+
DROP TABLE ChkTable;
|
|
195
|
+
DROP TABLE CompositeChild;
|
|
196
|
+
DROP TABLE CompositeParent;
|
|
197
|
+
DROP TABLE FkChild;
|
|
198
|
+
DROP TABLE Products;
|
|
199
|
+
DROP VIEW PlainView;
|
|
200
|
+
DROP VIEW ActiveOrders;
|
|
201
|
+
DROP TABLE PlainTable;
|
|
202
|
+
DROP TABLE Orders;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
-- 06.3.3.1-introspection-tags-index.sqllogic - Index tags and index layout through introspection TVFs
|
|
2
|
+
--
|
|
3
|
+
-- requires-capability: standalone-index-ddl
|
|
4
|
+
--
|
|
5
|
+
-- Carved out of 06.3.3-introspection-tags: that file exposes tags and rich metadata
|
|
6
|
+
-- for tables, views, columns, foreign keys, CHECK constraints, non-index UNIQUE
|
|
7
|
+
-- constraints and assertions, none of which needs index DDL. The index-shaped parts
|
|
8
|
+
-- all do — an index is the only object they can be about — so they move here and the
|
|
9
|
+
-- rest stays runnable on a backend without first-class CREATE INDEX.
|
|
10
|
+
--
|
|
11
|
+
-- Subject: schema() reports an index's tags (and null when untagged), index_info()
|
|
12
|
+
-- reports the column-by-column layout with desc/unique/partial flags and tags, and a
|
|
13
|
+
-- partial unique index synthesizes a partial UNIQUE constraint in
|
|
14
|
+
-- unique_constraint_info().
|
|
15
|
+
|
|
16
|
+
-- ===================================================================
|
|
17
|
+
-- Setup
|
|
18
|
+
-- ===================================================================
|
|
19
|
+
|
|
20
|
+
CREATE TABLE Orders (
|
|
21
|
+
id INTEGER PRIMARY KEY,
|
|
22
|
+
name TEXT NOT NULL
|
|
23
|
+
) WITH TAGS (display_name = 'Customer Orders', audit = true);
|
|
24
|
+
|
|
25
|
+
CREATE INDEX idx_orders_name ON Orders (name)
|
|
26
|
+
WITH TAGS (purpose = 'name lookup');
|
|
27
|
+
|
|
28
|
+
CREATE INDEX idx_orders_plain ON Orders (id);
|
|
29
|
+
|
|
30
|
+
-- ===================================================================
|
|
31
|
+
-- schema() — tags on indexes; null for untagged
|
|
32
|
+
-- ===================================================================
|
|
33
|
+
|
|
34
|
+
SELECT name, json_extract(tags, '$.purpose') AS purpose
|
|
35
|
+
FROM schema() WHERE type = 'index' AND name = 'idx_orders_name';
|
|
36
|
+
→ [{"name":"idx_orders_name","purpose":"name lookup"}]
|
|
37
|
+
|
|
38
|
+
SELECT tags FROM schema() WHERE type = 'index' AND name = 'idx_orders_plain';
|
|
39
|
+
→ [{"tags":null}]
|
|
40
|
+
|
|
41
|
+
-- ===================================================================
|
|
42
|
+
-- index_info() — column-by-column index layout, partial/unique/tags
|
|
43
|
+
-- ===================================================================
|
|
44
|
+
|
|
45
|
+
CREATE TABLE IdxTable (
|
|
46
|
+
id INTEGER PRIMARY KEY,
|
|
47
|
+
a TEXT,
|
|
48
|
+
b INTEGER,
|
|
49
|
+
status TEXT
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
CREATE INDEX idx_a_asc ON IdxTable (a) WITH TAGS (purpose = 'lookup');
|
|
53
|
+
CREATE INDEX idx_b_desc ON IdxTable (b DESC);
|
|
54
|
+
CREATE UNIQUE INDEX idx_a_unique ON IdxTable (a);
|
|
55
|
+
CREATE INDEX idx_a_partial ON IdxTable (a) WHERE status = 'active';
|
|
56
|
+
|
|
57
|
+
SELECT index_name, seq, column_name, "desc", "unique", partial,
|
|
58
|
+
json_extract(tags, '$.purpose') AS purpose
|
|
59
|
+
FROM index_info('IdxTable') ORDER BY index_name, seq;
|
|
60
|
+
→ [{"index_name":"idx_a_asc","seq":0,"column_name":"a","desc":0,"unique":0,"partial":0,"purpose":"lookup"},{"index_name":"idx_a_partial","seq":0,"column_name":"a","desc":0,"unique":0,"partial":1,"purpose":null},{"index_name":"idx_a_unique","seq":0,"column_name":"a","desc":0,"unique":1,"partial":0,"purpose":null},{"index_name":"idx_b_desc","seq":0,"column_name":"b","desc":1,"unique":0,"partial":0,"purpose":null}]
|
|
61
|
+
|
|
62
|
+
-- ===================================================================
|
|
63
|
+
-- unique_constraint_info() — partial unique index synthesizes a partial constraint
|
|
64
|
+
-- ===================================================================
|
|
65
|
+
|
|
66
|
+
CREATE TABLE PuTable (
|
|
67
|
+
id INTEGER PRIMARY KEY,
|
|
68
|
+
code TEXT NOT NULL,
|
|
69
|
+
status TEXT NOT NULL
|
|
70
|
+
);
|
|
71
|
+
CREATE UNIQUE INDEX uq_pu_active ON PuTable (code) WHERE status = 'active';
|
|
72
|
+
|
|
73
|
+
SELECT name, partial FROM unique_constraint_info('PuTable');
|
|
74
|
+
→ [{"name":"uq_pu_active","partial":1}]
|