@quereus/quereus 4.20.0 → 4.20.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/src/common/types.d.ts +4 -4
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/schema/catalog-rendering.js +13 -1
- package/dist/src/schema/catalog-rendering.js.map +1 -1
- package/dist/src/schema/catalog.d.ts +35 -2
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +42 -33
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/schema-differ.d.ts +1 -1
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +195 -33
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/unique-enforcement.d.ts +23 -1
- package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
- package/dist/src/schema/unique-enforcement.js +43 -1
- package/dist/src/schema/unique-enforcement.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +15 -12
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +87 -100
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/package.json +7 -4
- package/test/README.md +173 -0
- package/test/logic/01-basic.sqllogic +39 -0
- package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
- package/test/logic/01.2-strings.sqllogic +43 -0
- package/test/logic/01.5-insert-select.sqllogic +237 -0
- package/test/logic/01.6-update-extras.sqllogic +118 -0
- package/test/logic/01.7-update-from.sqllogic +67 -0
- package/test/logic/01.8-delete-extras.sqllogic +122 -0
- package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
- package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
- package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
- package/test/logic/01.9-query-expr-values.sqllogic +111 -0
- package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
- package/test/logic/02-filters.sqllogic +54 -0
- package/test/logic/02-smoke.sqllogic +62 -0
- package/test/logic/02.1-bind-parameters.sqllogic +223 -0
- package/test/logic/03-expressions.sqllogic +190 -0
- package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
- package/test/logic/03.4-defaults.sqllogic +554 -0
- package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
- package/test/logic/03.5-tvf.sqllogic +61 -0
- package/test/logic/03.6-type-system.sqllogic +544 -0
- package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
- package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
- package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
- package/test/logic/03.8-not-precedence.sqllogic +255 -0
- package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
- package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
- package/test/logic/04-order-by.sqllogic +38 -0
- package/test/logic/04-transactions.sqllogic +239 -0
- package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
- package/test/logic/05-vtab_memory.sqllogic +50 -0
- package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
- package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
- package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
- package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
- package/test/logic/06-builtin_functions.sqllogic +149 -0
- package/test/logic/06.1-string-functions.sqllogic +92 -0
- package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
- package/test/logic/06.2-math-functions.sqllogic +82 -0
- package/test/logic/06.3-schema.sqllogic +48 -0
- package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
- package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
- package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
- package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
- package/test/logic/06.3.4-view-info.sqllogic +378 -0
- package/test/logic/06.3.5-column-info.sqllogic +347 -0
- package/test/logic/06.3.6-schema-views.sqllogic +29 -0
- package/test/logic/06.4-schema-search-path.sqllogic +354 -0
- package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
- package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
- package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
- package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
- package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
- package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
- package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
- package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
- package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
- package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
- package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
- package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
- package/test/logic/06.7-json-extended.sqllogic +53 -0
- package/test/logic/06.8-json-path-operators.sqllogic +99 -0
- package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
- package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
- package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
- package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
- package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
- package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
- package/test/logic/07-aggregates.sqllogic +193 -0
- package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
- package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
- package/test/logic/07.3-group-by-extras.sqllogic +602 -0
- package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
- package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
- package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
- package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
- package/test/logic/07.5-window.sqllogic +1941 -0
- package/test/logic/07.5.1-window-named.sqllogic +13 -0
- package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
- package/test/logic/07.6-subqueries.sqllogic +78 -0
- package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
- package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
- package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
- package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
- package/test/logic/07.7.1-in-extras.sqllogic +158 -0
- package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
- package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
- package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
- package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
- package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
- package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
- package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
- package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
- package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
- package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
- package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
- package/test/logic/07.9-in-value-list.sqllogic +154 -0
- package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
- package/test/logic/08-views.sqllogic +64 -0
- package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
- package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
- package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
- package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
- package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
- package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
- package/test/logic/09-set_operations.sqllogic +244 -0
- package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
- package/test/logic/10-distinct_datatypes.sqllogic +127 -0
- package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
- package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
- package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
- package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
- package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
- package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
- package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
- package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
- package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
- package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
- package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
- package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
- package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
- package/test/logic/10.2-column-features.sqllogic +365 -0
- package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
- package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
- package/test/logic/10.3-function-features.sqllogic +247 -0
- package/test/logic/10.4-schema-scale.sqllogic +168 -0
- package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
- package/test/logic/10.5-indexes.sqllogic +164 -0
- package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
- package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
- package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
- package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
- package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
- package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
- package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
- package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
- package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
- package/test/logic/100.1-where-extras.sqllogic +163 -0
- package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
- package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
- package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
- package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
- package/test/logic/102-unique-constraints.sqllogic +145 -0
- package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
- package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
- package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
- package/test/logic/102.2-unique-collation.sqllogic +181 -0
- package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
- package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
- package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
- package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
- package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
- package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
- package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
- package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
- package/test/logic/108-cardinality-estimation.sqllogic +146 -0
- package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
- package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
- package/test/logic/11-joins.sqllogic +86 -0
- package/test/logic/11.1-join-using.sqllogic +267 -0
- package/test/logic/11.2-comma-join.sqllogic +35 -0
- package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
- package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
- package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
- package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
- package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
- package/test/logic/12-empty-primary-key.sqllogic +124 -0
- package/test/logic/12-join_padding_order.sqllogic +58 -0
- package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
- package/test/logic/13-cte.sqllogic +137 -0
- package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
- package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
- package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
- package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
- package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
- package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
- package/test/logic/13.4-cte-extras.sqllogic +98 -0
- package/test/logic/13.5-cte-join-order.sqllogic +166 -0
- package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
- package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
- package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
- package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
- package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
- package/test/logic/14-utilities.sqllogic +168 -0
- package/test/logic/15-timespan.sqllogic +279 -0
- package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
- package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
- package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
- package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
- package/test/logic/16-epoch.sqllogic +187 -0
- package/test/logic/17-weekday-modifier.sqllogic +78 -0
- package/test/logic/18-json-string-escapes.sqllogic +86 -0
- package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
- package/test/logic/20-empty-single-row.sqllogic +261 -0
- package/test/logic/21-null-edge-cases.sqllogic +227 -0
- package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
- package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
- package/test/logic/21.2-between-edges.sqllogic +157 -0
- package/test/logic/22-boundary-values.sqllogic +175 -0
- package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
- package/test/logic/24-builtin-branches.sqllogic +611 -0
- package/test/logic/24.1-substr-extras.sqllogic +75 -0
- package/test/logic/24.2-random-extras.sqllogic +39 -0
- package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
- package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
- package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
- package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
- package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
- package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
- package/test/logic/26-join-edge-cases.sqllogic +333 -0
- package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
- package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
- package/test/logic/26.3-join-on-constants.sqllogic +61 -0
- package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
- package/test/logic/27-window-edge-cases.sqllogic +206 -0
- package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
- package/test/logic/27.2-window-exclude.sqllogic +13 -0
- package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
- package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
- package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
- package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
- package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
- package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
- package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
- package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
- package/test/logic/40-constraints.sqllogic +418 -0
- package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
- package/test/logic/40.2-check-extras.sqllogic +683 -0
- package/test/logic/41-alter-table.sqllogic +191 -0
- package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
- package/test/logic/41-fk-cross-schema.sqllogic +155 -0
- package/test/logic/41-fk-extended-targets.sqllogic +173 -0
- package/test/logic/41-foreign-keys.sqllogic +1001 -0
- package/test/logic/41-generated-column-errors.sqllogic +225 -0
- package/test/logic/41-generated-column-extras.sqllogic +598 -0
- package/test/logic/41-generated-column-scope.sqllogic +329 -0
- package/test/logic/41-generated-columns.sqllogic +361 -0
- package/test/logic/41.1-alter-pk.sqllogic +230 -0
- package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
- package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
- package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
- package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
- package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
- package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
- package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
- package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
- package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
- package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
- package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
- package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
- package/test/logic/41.2-alter-column.sqllogic +382 -0
- package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
- package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
- package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
- package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
- package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
- package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
- package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
- package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
- package/test/logic/41.5-alter-misc.sqllogic +48 -0
- package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
- package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
- package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
- package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
- package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
- package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
- package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
- package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
- package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
- package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
- package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
- package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
- package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
- package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
- package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
- package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
- package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
- package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
- package/test/logic/42-committed-snapshot.sqllogic +254 -0
- package/test/logic/42-returning.sqllogic +159 -0
- package/test/logic/42.1-returning-extras.sqllogic +232 -0
- package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
- package/test/logic/43-default-nullability.sqllogic +131 -0
- package/test/logic/43-transition-constraints.sqllogic +341 -0
- package/test/logic/43.1-default-collation.sqllogic +140 -0
- package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
- package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
- package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
- package/test/logic/44-determinism-validation.sqllogic +164 -0
- package/test/logic/44-orthogonality.sqllogic +146 -0
- package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
- package/test/logic/45-udf-determinism.sqllogic +39 -0
- package/test/logic/46-mutation-context.sqllogic +595 -0
- package/test/logic/47-upsert.sqllogic +255 -0
- package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
- package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
- package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
- package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
- package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
- package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
- package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
- package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
- package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
- package/test/logic/49-reference-graph.sqllogic +84 -0
- package/test/logic/50-declarative-schema.sqllogic +2550 -0
- package/test/logic/50-metadata-tags.sqllogic +1033 -0
- package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
- package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
- package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
- package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +173 -0
- package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
- package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
- package/test/logic/51-lens-foundation.sqllogic +147 -0
- package/test/logic/51-materialized-views.sqllogic +376 -0
- package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
- package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
- package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
- package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
- package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
- package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
- package/test/logic/52-lens-overrides.sqllogic +566 -0
- package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
- package/test/logic/53-reserved-tags.sqllogic +252 -0
- package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
- package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
- package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
- package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
- package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
- package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
- package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
- package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
- package/test/logic/55-lens-prover.sqllogic +202 -0
- package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
- package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
- package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
- package/test/logic/81-quickpick.sqllogic +24 -0
- package/test/logic/82-bloom-join.sqllogic +185 -0
- package/test/logic/83-merge-join.sqllogic +280 -0
- package/test/logic/84-asof-scan.sqllogic +238 -0
- package/test/logic/84-key-cardinality.sqllogic +50 -0
- package/test/logic/85-relational-const-folding.sqllogic +51 -0
- package/test/logic/86-scalar-cse.sqllogic +42 -0
- package/test/logic/90-error_paths.sqllogic +114 -0
- package/test/logic/90.1-parse-errors.sqllogic +77 -0
- package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
- package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
- package/test/logic/90.3-expression-errors.sqllogic +43 -0
- package/test/logic/90.4-dml-errors.sqllogic +47 -0
- package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
- package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
- package/test/logic/90.6-select-error-paths.sqllogic +57 -0
- package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
- package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
- package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
- package/test/logic/93.1-view-error-paths.sqllogic +74 -0
- package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
- package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
- package/test/logic/93.4-view-mutation.sqllogic +4881 -0
- package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
- package/test/logic/93.5-authored-inverse.sqllogic +415 -0
- package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
- package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
- package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
- package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
- package/test/logic/95-assertions.sqllogic +1417 -0
- package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
- package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
- package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
- package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
- package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
- package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
- package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
- package/test/logic/drop-unique-index.sqllogic +88 -0
- package/test/logic/pushdown-test.sqllogic +36 -0
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
-- 99-conversion-edge-cases.sqllogic
|
|
2
|
+
-- Targeted coverage for uncovered branches in conversion.ts, json-type.ts,
|
|
3
|
+
-- logical-type.ts, and schema.ts:
|
|
4
|
+
-- Type conversion error paths, json() function, schema introspection functions
|
|
5
|
+
|
|
6
|
+
-- ============================================================
|
|
7
|
+
-- integer() conversion edge cases
|
|
8
|
+
-- ============================================================
|
|
9
|
+
|
|
10
|
+
-- Null returns null
|
|
11
|
+
SELECT integer(null) as result;
|
|
12
|
+
→ [{"result":null}]
|
|
13
|
+
|
|
14
|
+
-- Integer from integer (identity)
|
|
15
|
+
SELECT integer(42) as result;
|
|
16
|
+
→ [{"result":42}]
|
|
17
|
+
|
|
18
|
+
-- Integer from float (truncates/rounds)
|
|
19
|
+
SELECT integer(3.7) as result;
|
|
20
|
+
→ [{"result":3}]
|
|
21
|
+
|
|
22
|
+
-- Integer from negative float
|
|
23
|
+
SELECT integer(-2.9) as result;
|
|
24
|
+
→ [{"result":-2}]
|
|
25
|
+
|
|
26
|
+
-- Integer from string
|
|
27
|
+
SELECT integer('123') as result;
|
|
28
|
+
→ [{"result":123}]
|
|
29
|
+
|
|
30
|
+
-- Integer from negative string
|
|
31
|
+
SELECT integer('-456') as result;
|
|
32
|
+
→ [{"result":-456}]
|
|
33
|
+
|
|
34
|
+
-- Integer from boolean
|
|
35
|
+
SELECT integer(true) as result;
|
|
36
|
+
→ [{"result":1}]
|
|
37
|
+
|
|
38
|
+
SELECT integer(false) as result;
|
|
39
|
+
→ [{"result":0}]
|
|
40
|
+
|
|
41
|
+
-- Integer from zero
|
|
42
|
+
SELECT integer(0) as result;
|
|
43
|
+
→ [{"result":0}]
|
|
44
|
+
|
|
45
|
+
-- Integer from empty string returns null (not error)
|
|
46
|
+
SELECT integer('') as result;
|
|
47
|
+
→ [{"result":null}]
|
|
48
|
+
|
|
49
|
+
-- Integer from non-numeric string errors
|
|
50
|
+
SELECT integer('hello');
|
|
51
|
+
-- error: Cannot convert to INTEGER
|
|
52
|
+
|
|
53
|
+
-- ============================================================
|
|
54
|
+
-- real() conversion edge cases
|
|
55
|
+
-- ============================================================
|
|
56
|
+
|
|
57
|
+
-- Null
|
|
58
|
+
SELECT real(null) as result;
|
|
59
|
+
→ [{"result":null}]
|
|
60
|
+
|
|
61
|
+
-- Real from integer
|
|
62
|
+
SELECT real(42) as result;
|
|
63
|
+
→ [{"result":42}]
|
|
64
|
+
|
|
65
|
+
-- Real from float (identity)
|
|
66
|
+
SELECT real(3.14) as result;
|
|
67
|
+
→ [{"result":3.14}]
|
|
68
|
+
|
|
69
|
+
-- Real from string
|
|
70
|
+
SELECT real('2.718') as result;
|
|
71
|
+
→ [{"result":2.718}]
|
|
72
|
+
|
|
73
|
+
-- Real from boolean
|
|
74
|
+
SELECT real(true) as result;
|
|
75
|
+
→ [{"result":1}]
|
|
76
|
+
|
|
77
|
+
SELECT real(false) as result;
|
|
78
|
+
→ [{"result":0}]
|
|
79
|
+
|
|
80
|
+
-- Real from empty string returns null
|
|
81
|
+
SELECT real('') as result;
|
|
82
|
+
→ [{"result":null}]
|
|
83
|
+
|
|
84
|
+
-- Real from non-numeric string errors
|
|
85
|
+
SELECT real('hello');
|
|
86
|
+
-- error: Cannot convert to REAL
|
|
87
|
+
|
|
88
|
+
-- ============================================================
|
|
89
|
+
-- text() conversion edge cases
|
|
90
|
+
-- ============================================================
|
|
91
|
+
|
|
92
|
+
-- Null
|
|
93
|
+
SELECT text(null) as result;
|
|
94
|
+
→ [{"result":null}]
|
|
95
|
+
|
|
96
|
+
-- Text from integer
|
|
97
|
+
SELECT text(42) as result;
|
|
98
|
+
→ [{"result":"42"}]
|
|
99
|
+
|
|
100
|
+
-- Text from float
|
|
101
|
+
SELECT text(3.14) as result;
|
|
102
|
+
→ [{"result":"3.14"}]
|
|
103
|
+
|
|
104
|
+
-- Text from boolean
|
|
105
|
+
SELECT text(true) as result;
|
|
106
|
+
→ [{"result":"true"}]
|
|
107
|
+
|
|
108
|
+
SELECT text(false) as result;
|
|
109
|
+
→ [{"result":"false"}]
|
|
110
|
+
|
|
111
|
+
-- Text from string (identity)
|
|
112
|
+
SELECT text('hello') as result;
|
|
113
|
+
→ [{"result":"hello"}]
|
|
114
|
+
|
|
115
|
+
-- Text from empty string
|
|
116
|
+
SELECT text('') as result;
|
|
117
|
+
→ [{"result":""}]
|
|
118
|
+
|
|
119
|
+
-- ============================================================
|
|
120
|
+
-- boolean() conversion edge cases
|
|
121
|
+
-- ============================================================
|
|
122
|
+
|
|
123
|
+
-- Null
|
|
124
|
+
SELECT boolean(null) as result;
|
|
125
|
+
→ [{"result":null}]
|
|
126
|
+
|
|
127
|
+
-- Boolean from boolean (identity)
|
|
128
|
+
SELECT boolean(true) as result;
|
|
129
|
+
→ [{"result":true}]
|
|
130
|
+
|
|
131
|
+
SELECT boolean(false) as result;
|
|
132
|
+
→ [{"result":false}]
|
|
133
|
+
|
|
134
|
+
-- Boolean from integer
|
|
135
|
+
SELECT boolean(1) as result;
|
|
136
|
+
→ [{"result":true}]
|
|
137
|
+
|
|
138
|
+
SELECT boolean(0) as result;
|
|
139
|
+
→ [{"result":false}]
|
|
140
|
+
|
|
141
|
+
-- Boolean from string
|
|
142
|
+
SELECT boolean('true') as result;
|
|
143
|
+
→ [{"result":true}]
|
|
144
|
+
|
|
145
|
+
SELECT boolean('false') as result;
|
|
146
|
+
→ [{"result":false}]
|
|
147
|
+
|
|
148
|
+
SELECT boolean('yes') as result;
|
|
149
|
+
→ [{"result":true}]
|
|
150
|
+
|
|
151
|
+
SELECT boolean('no') as result;
|
|
152
|
+
→ [{"result":false}]
|
|
153
|
+
|
|
154
|
+
SELECT boolean('on') as result;
|
|
155
|
+
→ [{"result":true}]
|
|
156
|
+
|
|
157
|
+
SELECT boolean('off') as result;
|
|
158
|
+
→ [{"result":false}]
|
|
159
|
+
|
|
160
|
+
-- Boolean from invalid string errors
|
|
161
|
+
SELECT boolean('maybe');
|
|
162
|
+
-- error: Cannot convert to BOOLEAN
|
|
163
|
+
|
|
164
|
+
SELECT boolean('');
|
|
165
|
+
-- error: Cannot convert to BOOLEAN
|
|
166
|
+
|
|
167
|
+
-- ============================================================
|
|
168
|
+
-- json() conversion edge cases
|
|
169
|
+
-- ============================================================
|
|
170
|
+
|
|
171
|
+
-- Null
|
|
172
|
+
SELECT json(null) as result;
|
|
173
|
+
→ [{"result":null}]
|
|
174
|
+
|
|
175
|
+
-- JSON from valid JSON string
|
|
176
|
+
SELECT json('{"a":1}') as result;
|
|
177
|
+
→ [{"result":{"a":1}}]
|
|
178
|
+
|
|
179
|
+
-- JSON from array string
|
|
180
|
+
SELECT json('[1,2,3]') as result;
|
|
181
|
+
→ [{"result":[1,2,3]}]
|
|
182
|
+
|
|
183
|
+
-- JSON from number
|
|
184
|
+
SELECT json(42) as result;
|
|
185
|
+
→ [{"result":42}]
|
|
186
|
+
|
|
187
|
+
-- JSON from boolean
|
|
188
|
+
SELECT json(true) as result;
|
|
189
|
+
→ [{"result":true}]
|
|
190
|
+
|
|
191
|
+
-- JSON from 'null' string
|
|
192
|
+
SELECT json('null') as result;
|
|
193
|
+
→ [{"result":null}]
|
|
194
|
+
|
|
195
|
+
-- JSON from invalid string errors
|
|
196
|
+
SELECT json('not-valid-json');
|
|
197
|
+
-- error: Cannot convert to JSON
|
|
198
|
+
|
|
199
|
+
-- ============================================================
|
|
200
|
+
-- timespan() conversion error path
|
|
201
|
+
-- ============================================================
|
|
202
|
+
|
|
203
|
+
-- Valid conversion
|
|
204
|
+
SELECT timespan('PT1H') as result;
|
|
205
|
+
→ [{"result":"PT1H"}]
|
|
206
|
+
|
|
207
|
+
-- Null
|
|
208
|
+
SELECT timespan(null) as result;
|
|
209
|
+
→ [{"result":null}]
|
|
210
|
+
|
|
211
|
+
-- Invalid string errors
|
|
212
|
+
SELECT timespan('invalid');
|
|
213
|
+
-- error: Cannot convert to TIMESPAN
|
|
214
|
+
|
|
215
|
+
-- ============================================================
|
|
216
|
+
-- Schema introspection: schema() function
|
|
217
|
+
-- ============================================================
|
|
218
|
+
|
|
219
|
+
CREATE TABLE schema_test (id INTEGER PRIMARY KEY, name TEXT, score REAL);
|
|
220
|
+
-- run
|
|
221
|
+
|
|
222
|
+
-- schema() returns rows with schema info
|
|
223
|
+
SELECT type, name FROM schema() WHERE name = 'schema_test';
|
|
224
|
+
→ [{"type":"table","name":"schema_test"}]
|
|
225
|
+
|
|
226
|
+
-- table_info() returns column information
|
|
227
|
+
SELECT name, type, pk FROM table_info('schema_test') ORDER BY cid;
|
|
228
|
+
→ [{"name":"id","type":"INTEGER","pk":1},{"name":"name","type":"TEXT","pk":0},{"name":"score","type":"REAL","pk":0}]
|
|
229
|
+
|
|
230
|
+
-- table_info with non-existent table
|
|
231
|
+
SELECT name FROM table_info('nonexistent_table');
|
|
232
|
+
-- error: not found
|
|
233
|
+
|
|
234
|
+
DROP TABLE schema_test;
|
|
235
|
+
|
|
236
|
+
-- ============================================================
|
|
237
|
+
-- function_info() introspection
|
|
238
|
+
-- ============================================================
|
|
239
|
+
|
|
240
|
+
-- function_info() returns functions (check a known function)
|
|
241
|
+
SELECT name, type FROM function_info('json_valid');
|
|
242
|
+
→ [{"name":"json_valid","type":"scalar"}]
|
|
243
|
+
|
|
244
|
+
-- function_info with filter
|
|
245
|
+
SELECT name, type FROM function_info('json_extract');
|
|
246
|
+
→ [{"name":"json_extract","type":"scalar"}]
|
|
247
|
+
|
|
248
|
+
-- function_info without filter returns many rows (just check it works)
|
|
249
|
+
SELECT count(*) > 0 as has_functions FROM function_info();
|
|
250
|
+
→ [{"has_functions":true}]
|
|
251
|
+
|
|
252
|
+
-- schema() listing an index row alongside its table lives in
|
|
253
|
+
-- 99.0.1-schema-index-listing (it needs standalone CREATE INDEX).
|
|
254
|
+
|
|
255
|
+
-- ============================================================
|
|
256
|
+
-- Schema: foreign keys
|
|
257
|
+
-- ============================================================
|
|
258
|
+
|
|
259
|
+
CREATE TABLE fk_parent (id INTEGER PRIMARY KEY, name TEXT);
|
|
260
|
+
CREATE TABLE fk_child (id INTEGER PRIMARY KEY, parent_id INTEGER REFERENCES fk_parent(id));
|
|
261
|
+
-- run
|
|
262
|
+
|
|
263
|
+
-- foreign_key_info returns FK relationships
|
|
264
|
+
SELECT "from", referenced_table, "to" FROM foreign_key_info('fk_child');
|
|
265
|
+
→ [{"from":"parent_id","referenced_table":"fk_parent","to":"id"}]
|
|
266
|
+
|
|
267
|
+
-- foreign_key_info on table without FKs returns nothing
|
|
268
|
+
SELECT count(*) as cnt FROM foreign_key_info('fk_parent');
|
|
269
|
+
→ [{"cnt":0}]
|
|
270
|
+
|
|
271
|
+
-- foreign_key_info on non-existent table errors
|
|
272
|
+
SELECT "from" FROM foreign_key_info('nonexistent');
|
|
273
|
+
-- error: not found
|
|
274
|
+
|
|
275
|
+
-- Non-string table name errors
|
|
276
|
+
SELECT "from" FROM foreign_key_info(42);
|
|
277
|
+
-- error: requires a table name string
|
|
278
|
+
|
|
279
|
+
DROP TABLE fk_child;
|
|
280
|
+
DROP TABLE fk_parent;
|
|
281
|
+
|
|
282
|
+
-- ============================================================
|
|
283
|
+
-- typeof: all types
|
|
284
|
+
-- ============================================================
|
|
285
|
+
|
|
286
|
+
SELECT typeof(null) as result;
|
|
287
|
+
→ [{"result":"null"}]
|
|
288
|
+
|
|
289
|
+
SELECT typeof(42) as result;
|
|
290
|
+
→ [{"result":"integer"}]
|
|
291
|
+
|
|
292
|
+
SELECT typeof(3.14) as result;
|
|
293
|
+
→ [{"result":"real"}]
|
|
294
|
+
|
|
295
|
+
SELECT typeof('hello') as result;
|
|
296
|
+
→ [{"result":"text"}]
|
|
297
|
+
|
|
298
|
+
SELECT typeof(true) as result;
|
|
299
|
+
→ [{"result":"integer"}]
|
|
300
|
+
|
|
301
|
+
SELECT typeof(json_array(1,2)) as result;
|
|
302
|
+
→ [{"result":"json"}]
|
|
303
|
+
|
|
304
|
+
-- ============================================================
|
|
305
|
+
-- Cross-type conversion chains
|
|
306
|
+
-- ============================================================
|
|
307
|
+
|
|
308
|
+
-- integer -> text -> integer roundtrip
|
|
309
|
+
SELECT integer(text(42)) as result;
|
|
310
|
+
→ [{"result":42}]
|
|
311
|
+
|
|
312
|
+
-- real -> text -> real roundtrip
|
|
313
|
+
SELECT real(text(3.14)) as result;
|
|
314
|
+
→ [{"result":3.14}]
|
|
315
|
+
|
|
316
|
+
-- boolean -> integer -> boolean roundtrip
|
|
317
|
+
SELECT boolean(integer(true)) as result;
|
|
318
|
+
→ [{"result":true}]
|
|
319
|
+
|
|
320
|
+
SELECT boolean(integer(false)) as result;
|
|
321
|
+
→ [{"result":false}]
|
|
322
|
+
|
|
323
|
+
-- json -> text -> json roundtrip (via json_extract)
|
|
324
|
+
SELECT json('{"a":1}') as result;
|
|
325
|
+
→ [{"result":{"a":1}}]
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
-- 99.0.1-schema-index-listing.sqllogic
|
|
2
|
+
--
|
|
3
|
+
-- requires-capability: standalone-index-ddl
|
|
4
|
+
--
|
|
5
|
+
-- Carved out of 99-conversion-edge-cases: that file is type-conversion edge cases
|
|
6
|
+
-- plus introspection-function checks, and this was its only index DDL — a table
|
|
7
|
+
-- plus one `create index` existing solely so schema() has an index row to list.
|
|
8
|
+
-- On its own here, the conversion coverage stays runnable on backends without
|
|
9
|
+
-- first-class CREATE INDEX.
|
|
10
|
+
--
|
|
11
|
+
-- Subject: schema() lists an index row alongside the table row that owns it.
|
|
12
|
+
|
|
13
|
+
CREATE TABLE idx_test (id INTEGER PRIMARY KEY, name TEXT, score REAL);
|
|
14
|
+
CREATE INDEX idx_name ON idx_test (name);
|
|
15
|
+
-- run
|
|
16
|
+
|
|
17
|
+
-- Should show both table and index in schema
|
|
18
|
+
SELECT type, name FROM schema() WHERE name = 'idx_test' OR name = 'idx_name' ORDER BY type;
|
|
19
|
+
→ [{"type":"index","name":"idx_name"},{"type":"table","name":"idx_test"}]
|
|
20
|
+
|
|
21
|
+
DROP TABLE idx_test;
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
-- adapted from SQLite test/cast.test, numcast.test, types2.test
|
|
2
|
+
-- Edge cases for CAST and conversion functions: BLOB roundtrips, scientific notation,
|
|
3
|
+
-- whitespace handling, IEEE 754 INF/NaN.
|
|
4
|
+
|
|
5
|
+
-- =============================================================================
|
|
6
|
+
-- BLOB roundtrips via CAST
|
|
7
|
+
-- =============================================================================
|
|
8
|
+
|
|
9
|
+
-- CAST text to BLOB preserves bytes
|
|
10
|
+
select cast('hello' as blob) = x'68656c6c6f' as r;
|
|
11
|
+
→ [{"r":true}]
|
|
12
|
+
|
|
13
|
+
-- BLOB equality after CAST
|
|
14
|
+
select cast(x'0102' as blob) = x'0102' as r;
|
|
15
|
+
→ [{"r":true}]
|
|
16
|
+
|
|
17
|
+
-- -----------------------------------------------------------------------------
|
|
18
|
+
-- Text-to-binary is literal UTF-8 -- no hex sniffing
|
|
19
|
+
-- -----------------------------------------------------------------------------
|
|
20
|
+
|
|
21
|
+
-- The round trip this behavior exists for: text(blob) then blob(text) is
|
|
22
|
+
-- lossless for UTF-8-clean bytes.
|
|
23
|
+
select cast(cast(x'6162' as text) as blob) = x'6162' as r;
|
|
24
|
+
→ [{"r":true}]
|
|
25
|
+
|
|
26
|
+
-- Round-trip is NOT total: a blob that is not valid UTF-8 renders as U+FFFD
|
|
27
|
+
-- on the way to text, so it comes back as the UTF-8 bytes of the replacement
|
|
28
|
+
-- character, not the original byte.
|
|
29
|
+
select cast(cast(x'ff' as text) as blob) = x'efbfbd' as r;
|
|
30
|
+
→ [{"r":true}]
|
|
31
|
+
|
|
32
|
+
-- A string that looks like hex digits is no longer sniffed as hex -- it
|
|
33
|
+
-- becomes its own UTF-8 bytes, four of them, not the two bytes 0x61 0x62.
|
|
34
|
+
select cast('6162' as blob) = x'36313632' as r;
|
|
35
|
+
→ [{"r":true}]
|
|
36
|
+
|
|
37
|
+
-- =============================================================================
|
|
38
|
+
-- Scientific notation in conversions
|
|
39
|
+
-- =============================================================================
|
|
40
|
+
|
|
41
|
+
-- CAST string with positive exponent
|
|
42
|
+
select cast('1.23e+2' as real) as r;
|
|
43
|
+
→ [{"r":123}]
|
|
44
|
+
|
|
45
|
+
-- CAST string with negative exponent
|
|
46
|
+
select cast('5e-1' as real) as r;
|
|
47
|
+
→ [{"r":0.5}]
|
|
48
|
+
|
|
49
|
+
-- =============================================================================
|
|
50
|
+
-- Whitespace handling in conversions
|
|
51
|
+
-- =============================================================================
|
|
52
|
+
|
|
53
|
+
-- Leading whitespace
|
|
54
|
+
select cast(' 42' as integer) as r;
|
|
55
|
+
→ [{"r":42}]
|
|
56
|
+
|
|
57
|
+
select cast(' 3.14' as real) as r;
|
|
58
|
+
→ [{"r":3.14}]
|
|
59
|
+
|
|
60
|
+
-- Trailing whitespace
|
|
61
|
+
select cast('42 ' as integer) as r;
|
|
62
|
+
→ [{"r":42}]
|
|
63
|
+
|
|
64
|
+
-- =============================================================================
|
|
65
|
+
-- BOOLEAN <-> numeric edge cases
|
|
66
|
+
-- =============================================================================
|
|
67
|
+
|
|
68
|
+
-- BOOLEAN-typed literal coerced to integer
|
|
69
|
+
select cast(true as integer) + cast(false as integer) as r;
|
|
70
|
+
→ [{"r":1}]
|
|
71
|
+
|
|
72
|
+
-- Negative integer to boolean: nonzero is true
|
|
73
|
+
select cast(-1 as boolean) as r;
|
|
74
|
+
→ [{"r":true}]
|
|
75
|
+
|
|
76
|
+
-- Float to boolean
|
|
77
|
+
select cast(0.5 as boolean) as r;
|
|
78
|
+
→ [{"r":true}]
|
|
79
|
+
|
|
80
|
+
select cast(0.0 as boolean) as r;
|
|
81
|
+
→ [{"r":false}]
|
|
82
|
+
|
|
83
|
+
-- =============================================================================
|
|
84
|
+
-- A failed CAST yields NULL, never the unconverted operand
|
|
85
|
+
-- =============================================================================
|
|
86
|
+
-- The numeric/text/blob targets keep SQLite's lenient fallbacks (0, '', bytes).
|
|
87
|
+
-- Every other target has no such fallback, so a value it cannot convert simply
|
|
88
|
+
-- has no result: the cast is NULL rather than a value outside the target type.
|
|
89
|
+
|
|
90
|
+
select cast('junk' as date) as r;
|
|
91
|
+
→ [{"r":null}]
|
|
92
|
+
|
|
93
|
+
select cast('junk' as time) as r;
|
|
94
|
+
→ [{"r":null}]
|
|
95
|
+
|
|
96
|
+
select cast('junk' as datetime) as r;
|
|
97
|
+
→ [{"r":null}]
|
|
98
|
+
|
|
99
|
+
select cast('junk' as timespan) as r;
|
|
100
|
+
→ [{"r":null}]
|
|
101
|
+
|
|
102
|
+
select cast('junk' as boolean) as r;
|
|
103
|
+
→ [{"r":null}]
|
|
104
|
+
|
|
105
|
+
-- A blob is not a JSON value under any reading, so the cast has no result.
|
|
106
|
+
select cast(x'0102' as json) as r;
|
|
107
|
+
→ [{"r":null}]
|
|
108
|
+
|
|
109
|
+
-- But a bare string IS a valid JSON string scalar even though it is not valid
|
|
110
|
+
-- JSON *source text*, so JSON's own validate keeps it.
|
|
111
|
+
select cast('abc' as json) as r;
|
|
112
|
+
→ [{"r":"abc"}]
|
|
113
|
+
|
|
114
|
+
-- Successful casts are unaffected.
|
|
115
|
+
select cast('2024-03-05' as date) as r;
|
|
116
|
+
→ [{"r":"2024-03-05"}]
|
|
117
|
+
|
|
118
|
+
select cast('true' as boolean) as r;
|
|
119
|
+
→ [{"r":true}]
|
|
120
|
+
|
|
121
|
+
-- A blob is not a date under any reading either.
|
|
122
|
+
select cast(x'0102' as date) as r;
|
|
123
|
+
→ [{"r":null}]
|
|
124
|
+
|
|
125
|
+
-- Numeric/text/blob fallbacks still apply and still produce their own type.
|
|
126
|
+
select cast('junk' as integer) as r;
|
|
127
|
+
→ [{"r":0}]
|
|
128
|
+
|
|
129
|
+
select cast('junk' as real) as r;
|
|
130
|
+
→ [{"r":0}]
|
|
131
|
+
|
|
132
|
+
-- Every fallback arm yields a value that inhabits the type the cast advertises.
|
|
133
|
+
-- typeof() reports the storage class, so REAL's 0.0 reads as 'integer'.
|
|
134
|
+
select typeof(cast('junk' as integer)) as i, typeof(cast('junk' as real)) as r,
|
|
135
|
+
typeof(cast('junk' as numeric)) as n, typeof(cast(x'0102' as text)) as t,
|
|
136
|
+
typeof(cast('junk' as blob)) as b;
|
|
137
|
+
→ [{"i":"integer","r":"integer","n":"integer","t":"text","b":"blob"}]
|
|
138
|
+
|
|
139
|
+
-- -----------------------------------------------------------------------------
|
|
140
|
+
-- Write path: the NULL reaches storage as a NULL, not as garbage
|
|
141
|
+
-- -----------------------------------------------------------------------------
|
|
142
|
+
|
|
143
|
+
create table cast_dt (id integer primary key, dt date null);
|
|
144
|
+
|
|
145
|
+
insert into cast_dt values (1, cast('junk' as date));
|
|
146
|
+
select id, dt, typeof(dt) as ty from cast_dt where id = 1;
|
|
147
|
+
→ [{"id":1,"dt":null,"ty":"null"}]
|
|
148
|
+
|
|
149
|
+
-- A successful cast round-trips through storage unchanged.
|
|
150
|
+
insert into cast_dt values (2, cast('2024-03-05' as date));
|
|
151
|
+
select id, dt, typeof(dt) as ty from cast_dt where id = 2;
|
|
152
|
+
→ [{"id":2,"dt":"2024-03-05","ty":"text"}]
|
|
153
|
+
|
|
154
|
+
-- The stored date still orders as a date, not as the raw operand would have.
|
|
155
|
+
select id from cast_dt where dt > '2000-01-01' order by id;
|
|
156
|
+
→ [{"id":2}]
|
|
157
|
+
|
|
158
|
+
drop table cast_dt;
|
|
159
|
+
|
|
160
|
+
-- Columns are NOT NULL by default, so the same insert is rejected outright
|
|
161
|
+
-- instead of storing a value the column's type does not admit.
|
|
162
|
+
create table cast_dt_nn (id integer primary key, dt date not null);
|
|
163
|
+
|
|
164
|
+
insert into cast_dt_nn values (1, cast('junk' as date));
|
|
165
|
+
-- error: NOT NULL constraint failed
|
|
166
|
+
|
|
167
|
+
drop table cast_dt_nn;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
-- DROP INDEX on a UNIQUE index must also remove the synthesized
|
|
2
|
+
-- UniqueConstraintSchema (tagged with derivedFromIndex). Without that, the
|
|
3
|
+
-- mutation manager keeps enforcing the unique check after the index is gone.
|
|
4
|
+
--
|
|
5
|
+
-- requires-capability: standalone-index-ddl
|
|
6
|
+
|
|
7
|
+
-- =====================================================
|
|
8
|
+
-- 1. Happy path: DROP UNIQUE INDEX clears the uniqueness check
|
|
9
|
+
-- =====================================================
|
|
10
|
+
create table dui_basic (a integer, b integer);
|
|
11
|
+
create unique index ix_dui_basic_a on dui_basic(a);
|
|
12
|
+
|
|
13
|
+
insert into dui_basic values (1, 10);
|
|
14
|
+
|
|
15
|
+
-- Duplicate fails while index exists
|
|
16
|
+
insert into dui_basic values (1, 20);
|
|
17
|
+
-- error: UNIQUE constraint failed
|
|
18
|
+
|
|
19
|
+
select a, b from dui_basic order by a, b;
|
|
20
|
+
→ [{"a":1,"b":10}]
|
|
21
|
+
|
|
22
|
+
drop index ix_dui_basic_a;
|
|
23
|
+
|
|
24
|
+
-- After drop, the duplicate is allowed (no stale uniqueConstraint enforcement)
|
|
25
|
+
insert into dui_basic values (1, 20);
|
|
26
|
+
|
|
27
|
+
select a, b from dui_basic order by a, b;
|
|
28
|
+
→ [{"a":1,"b":10},{"a":1,"b":20}]
|
|
29
|
+
|
|
30
|
+
drop table dui_basic;
|
|
31
|
+
|
|
32
|
+
-- =====================================================
|
|
33
|
+
-- 2. Coincident-name preservation: dropping a UNIQUE index does NOT
|
|
34
|
+
-- remove a CREATE-TABLE-time UNIQUE constraint on a different column,
|
|
35
|
+
-- even when their names sit in adjacent namespaces.
|
|
36
|
+
-- =====================================================
|
|
37
|
+
create table dui_coincident (a integer, b integer, constraint u unique(b));
|
|
38
|
+
create unique index u_idx on dui_coincident(a);
|
|
39
|
+
|
|
40
|
+
insert into dui_coincident values (1, 2);
|
|
41
|
+
|
|
42
|
+
-- Pre-drop: both constraints enforced
|
|
43
|
+
insert into dui_coincident values (1, 3);
|
|
44
|
+
-- error: UNIQUE constraint failed
|
|
45
|
+
|
|
46
|
+
insert into dui_coincident values (4, 2);
|
|
47
|
+
-- error: UNIQUE constraint failed
|
|
48
|
+
|
|
49
|
+
drop index u_idx;
|
|
50
|
+
|
|
51
|
+
-- After dropping the index, UNIQUE(a) is gone but the declared UNIQUE(b) survives
|
|
52
|
+
insert into dui_coincident values (1, 5);
|
|
53
|
+
|
|
54
|
+
select a, b from dui_coincident order by a, b;
|
|
55
|
+
→ [{"a":1,"b":2},{"a":1,"b":5}]
|
|
56
|
+
|
|
57
|
+
-- Declared UNIQUE(b) still rejects duplicates
|
|
58
|
+
insert into dui_coincident values (9, 2);
|
|
59
|
+
-- error: UNIQUE constraint failed
|
|
60
|
+
|
|
61
|
+
drop table dui_coincident;
|
|
62
|
+
|
|
63
|
+
-- =====================================================
|
|
64
|
+
-- 3. Partial UNIQUE index round-trip: drop must clear the synthesized
|
|
65
|
+
-- partial constraint, including its predicate.
|
|
66
|
+
-- =====================================================
|
|
67
|
+
create table dui_partial (id integer primary key, status text, code text);
|
|
68
|
+
create unique index ix_dui_partial on dui_partial(code) where status = 'active';
|
|
69
|
+
|
|
70
|
+
insert into dui_partial values (1, 'active', 'A');
|
|
71
|
+
|
|
72
|
+
-- Inside scope: duplicate code 'A' is rejected
|
|
73
|
+
insert into dui_partial values (2, 'active', 'A');
|
|
74
|
+
-- error: UNIQUE
|
|
75
|
+
|
|
76
|
+
-- Outside scope: same code allowed
|
|
77
|
+
insert into dui_partial values (3, 'inactive', 'A');
|
|
78
|
+
|
|
79
|
+
drop index ix_dui_partial;
|
|
80
|
+
|
|
81
|
+
-- After drop, the partial unique constraint is gone — duplicate 'A' inside
|
|
82
|
+
-- the (formerly) active scope is allowed.
|
|
83
|
+
insert into dui_partial values (4, 'active', 'A');
|
|
84
|
+
|
|
85
|
+
select id, status, code from dui_partial order by id;
|
|
86
|
+
→ [{"id":1,"status":"active","code":"A"},{"id":3,"status":"inactive","code":"A"},{"id":4,"status":"active","code":"A"}]
|
|
87
|
+
|
|
88
|
+
drop table dui_partial;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
-- Predicate Pushdown Tests
|
|
2
|
+
-- Verify that WHERE clause predicates are pushed down to table access
|
|
3
|
+
|
|
4
|
+
CREATE TABLE users (id INTEGER, name TEXT, age INTEGER);
|
|
5
|
+
INSERT INTO users VALUES (1, 'Alice', 30), (2, 'Bob', 25), (3, 'Carol', 35);
|
|
6
|
+
|
|
7
|
+
-- Test simple equality predicate pushdown
|
|
8
|
+
SELECT id, name FROM users WHERE id = 1;
|
|
9
|
+
→ [{"id": 1, "name": "Alice"}]
|
|
10
|
+
|
|
11
|
+
-- Test inequality predicate pushdown
|
|
12
|
+
SELECT age, name FROM users WHERE age > 25;
|
|
13
|
+
→ [{"age": 30, "name": "Alice"}, {"age": 35, "name": "Carol"}]
|
|
14
|
+
|
|
15
|
+
-- Test compound predicate (partial pushdown)
|
|
16
|
+
SELECT age, name FROM users WHERE age > 25 AND name LIKE 'A%';
|
|
17
|
+
→ [{"age": 30, "name": "Alice"}]
|
|
18
|
+
|
|
19
|
+
DROP TABLE users;
|
|
20
|
+
|
|
21
|
+
-- Regression: pushing a filter below a Project must preserve the projection's
|
|
22
|
+
-- attribute IDs. A computed column was re-assigned a fresh attribute ID on the
|
|
23
|
+
-- rebuild, stranding an outer projection that kept ONLY the computed column
|
|
24
|
+
-- while filtering on a different (pruned) column ("No row context found").
|
|
25
|
+
create table t (id integer primary key, code20 text not null);
|
|
26
|
+
insert into t values (3, 'C1');
|
|
27
|
+
create view v_plain as select id, case code20 when 'A1' then 'A' else 'C' end as code from t;
|
|
28
|
+
|
|
29
|
+
select code from v_plain where id = 3;
|
|
30
|
+
→ [{"code":"C"}]
|
|
31
|
+
|
|
32
|
+
select code from (select id, case code20 when 'A1' then 'A' else 'C' end as code from t) where id = 3;
|
|
33
|
+
→ [{"code":"C"}]
|
|
34
|
+
|
|
35
|
+
drop view v_plain;
|
|
36
|
+
drop table t;
|