@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,232 @@
|
|
|
1
|
+
-- adapted from SQLite test/returning1.test
|
|
2
|
+
-- RETURNING extras beyond 42-returning.sqllogic basics:
|
|
3
|
+
-- subqueries in RETURNING expressions, INSERT...SELECT with RETURNING,
|
|
4
|
+
-- generated columns, quoted identifiers, RETURNING on no-op upsert.
|
|
5
|
+
|
|
6
|
+
-- ===================================
|
|
7
|
+
-- 1. RETURNING with scalar subquery in expression list
|
|
8
|
+
-- ===================================
|
|
9
|
+
|
|
10
|
+
create table tally (id integer primary key, val integer);
|
|
11
|
+
insert into tally values (1, 100), (2, 200);
|
|
12
|
+
|
|
13
|
+
insert into tally (id, val) values (3, 150)
|
|
14
|
+
returning id, (select count(*) from tally where val > 150) as higher_count;
|
|
15
|
+
→ [{"id":3,"higher_count":1}]
|
|
16
|
+
|
|
17
|
+
select count(*) as cnt from tally;
|
|
18
|
+
→ [{"cnt":3}]
|
|
19
|
+
|
|
20
|
+
drop table tally;
|
|
21
|
+
|
|
22
|
+
-- ===================================
|
|
23
|
+
-- 2. INSERT ... SELECT with RETURNING (multi-row)
|
|
24
|
+
-- ===================================
|
|
25
|
+
|
|
26
|
+
create table src_xfer (id integer primary key, val integer);
|
|
27
|
+
create table dst_xfer (id integer primary key, val integer);
|
|
28
|
+
insert into src_xfer values (1, 100), (2, 200), (3, 300);
|
|
29
|
+
|
|
30
|
+
insert into dst_xfer select id, val from src_xfer returning id, val;
|
|
31
|
+
→ [{"id":1,"val":100},{"id":2,"val":200},{"id":3,"val":300}]
|
|
32
|
+
|
|
33
|
+
select id, val from dst_xfer order by id;
|
|
34
|
+
→ [{"id":1,"val":100},{"id":2,"val":200},{"id":3,"val":300}]
|
|
35
|
+
|
|
36
|
+
drop table dst_xfer;
|
|
37
|
+
drop table src_xfer;
|
|
38
|
+
|
|
39
|
+
-- ===================================
|
|
40
|
+
-- 3. RETURNING with quoted identifier and bracket-quoted column
|
|
41
|
+
-- ===================================
|
|
42
|
+
|
|
43
|
+
create table quoted_cols (id integer primary key, "Name" text);
|
|
44
|
+
insert into quoted_cols values (1, 'first') returning id, "Name" as name_out;
|
|
45
|
+
→ [{"id":1,"name_out":"first"}]
|
|
46
|
+
|
|
47
|
+
-- bracket-quoted identifier [Name] in RETURNING projection preserves case
|
|
48
|
+
insert into quoted_cols values (2, 'second') returning id, [Name];
|
|
49
|
+
→ [{"id":2,"Name":"second"}]
|
|
50
|
+
|
|
51
|
+
drop table quoted_cols;
|
|
52
|
+
|
|
53
|
+
-- ===================================
|
|
54
|
+
-- 4. RETURNING on no-op UPSERT (DO NOTHING) returns no row
|
|
55
|
+
-- ===================================
|
|
56
|
+
|
|
57
|
+
create table noop (id integer primary key, val text);
|
|
58
|
+
insert into noop values (1, 'a');
|
|
59
|
+
|
|
60
|
+
insert into noop values (1, 'b') on conflict do nothing returning id, val;
|
|
61
|
+
→ []
|
|
62
|
+
|
|
63
|
+
-- existing row unchanged
|
|
64
|
+
select id, val from noop;
|
|
65
|
+
→ [{"id":1,"val":"a"}]
|
|
66
|
+
|
|
67
|
+
drop table noop;
|
|
68
|
+
|
|
69
|
+
-- ===================================
|
|
70
|
+
-- 5. RETURNING on INSERT with computed expression and aggregate-style call
|
|
71
|
+
-- ===================================
|
|
72
|
+
|
|
73
|
+
create table greet (id integer primary key, name text);
|
|
74
|
+
|
|
75
|
+
insert into greet values (1, 'world')
|
|
76
|
+
returning id, 'hello, ' || name as msg, length(name) as n;
|
|
77
|
+
→ [{"id":1,"msg":"hello, world","n":5}]
|
|
78
|
+
|
|
79
|
+
drop table greet;
|
|
80
|
+
|
|
81
|
+
-- ===================================
|
|
82
|
+
-- 6. RETURNING from generated-column table omits / includes generated col
|
|
83
|
+
-- ===================================
|
|
84
|
+
|
|
85
|
+
create table gen_t (id integer primary key, name text, display text generated always as (upper(name)));
|
|
86
|
+
|
|
87
|
+
-- baseline: stored columns return
|
|
88
|
+
insert into gen_t (id, name) values (1, 'alice') returning id, name;
|
|
89
|
+
→ [{"id":1,"name":"alice"}]
|
|
90
|
+
|
|
91
|
+
-- generated column referenced in RETURNING projection
|
|
92
|
+
insert into gen_t (id, name) values (2, 'bob') returning id, name, display;
|
|
93
|
+
→ [{"id":2,"name":"bob","display":"BOB"}]
|
|
94
|
+
|
|
95
|
+
drop table gen_t;
|
|
96
|
+
|
|
97
|
+
-- ===================================
|
|
98
|
+
-- 7. UPDATE OR <action> is intentionally not supported
|
|
99
|
+
-- ===================================
|
|
100
|
+
-- Per-statement conflict overrides on UPDATE are SQLite-only syntax; pinned closed.
|
|
101
|
+
-- See docs/sql.md §11.
|
|
102
|
+
|
|
103
|
+
create table or_ig (id integer primary key, code text unique);
|
|
104
|
+
insert into or_ig values (1, 'x'), (2, 'y');
|
|
105
|
+
|
|
106
|
+
update or ignore or_ig set code = 'x' where id = 2 returning id, code;
|
|
107
|
+
-- error: Expected table name
|
|
108
|
+
|
|
109
|
+
drop table or_ig;
|
|
110
|
+
|
|
111
|
+
-- ===================================
|
|
112
|
+
-- 8. RETURNING with two scalar subqueries that share a plan subtree.
|
|
113
|
+
-- (Regression: shared-subtree row-context collision under store mode —
|
|
114
|
+
-- see ticket serialize-emit-callbacks-returning-window. The cache rule
|
|
115
|
+
-- deduplicates the two textually-identical derived tables, so both
|
|
116
|
+
-- subqueries iterate the same inner scan; without serialized
|
|
117
|
+
-- evaluation they raced on the shared RowSlot under LevelDB.)
|
|
118
|
+
-- ===================================
|
|
119
|
+
|
|
120
|
+
create table tr (id integer primary key, v integer);
|
|
121
|
+
insert into tr values (1, 10), (2, 20), (3, 30);
|
|
122
|
+
|
|
123
|
+
insert into tr values (4, 40)
|
|
124
|
+
returning
|
|
125
|
+
(select count(*) from (select * from tr where v >= 20) sub1) as count,
|
|
126
|
+
(select sum(v) from (select * from tr where v >= 20) sub2) as sum;
|
|
127
|
+
→ [{"count":3,"sum":90}]
|
|
128
|
+
|
|
129
|
+
drop table tr;
|
|
130
|
+
|
|
131
|
+
-- ===================================
|
|
132
|
+
-- 9. RETURNING * / table.* on a base-table INSERT / UPDATE / DELETE
|
|
133
|
+
-- ===================================
|
|
134
|
+
-- `*` expands to every target column in declaration order; the unqualified
|
|
135
|
+
-- symbols bind the statement's default image (NEW for INSERT/UPDATE, OLD for
|
|
136
|
+
-- DELETE). Output names are the bare column names regardless of qualifier.
|
|
137
|
+
|
|
138
|
+
create table star_t (id integer primary key, name text, value integer default 100);
|
|
139
|
+
|
|
140
|
+
-- INSERT ... RETURNING * → full row, declaration order; DEFAULT 100 surfaced.
|
|
141
|
+
insert into star_t (id, name) values (1, 'a') returning *;
|
|
142
|
+
→ [{"id":1,"name":"a","value":100}]
|
|
143
|
+
|
|
144
|
+
-- INSERT ... RETURNING table.* (qualified by the target table name) → same as *.
|
|
145
|
+
insert into star_t (id, name, value) values (2, 'b', 200) returning star_t.*;
|
|
146
|
+
→ [{"id":2,"name":"b","value":200}]
|
|
147
|
+
|
|
148
|
+
-- a wrong qualifier errors (not a generic crash, not a silent expand).
|
|
149
|
+
insert into star_t (id, name) values (3, 'c') returning bogus.*;
|
|
150
|
+
-- error: not found
|
|
151
|
+
|
|
152
|
+
-- the rejected insert made no row (id=3 absent).
|
|
153
|
+
select id from star_t order by id;
|
|
154
|
+
→ [{"id":1},{"id":2}]
|
|
155
|
+
|
|
156
|
+
-- UPDATE ... RETURNING * → the NEW (post-update) image, full row.
|
|
157
|
+
update star_t set value = 101 where id = 1 returning *;
|
|
158
|
+
→ [{"id":1,"name":"a","value":101}]
|
|
159
|
+
|
|
160
|
+
-- mixed projection, trailing: * expands in place, the extra `name` keeps its
|
|
161
|
+
-- position and is de-duplicated to `name:1`.
|
|
162
|
+
update star_t set value = 102 where id = 1 returning *, name;
|
|
163
|
+
→ [{"id":1,"name":"a","value":102,"name:1":"a"}]
|
|
164
|
+
|
|
165
|
+
-- mixed projection, leading: a column before * keeps position (the star copy of
|
|
166
|
+
-- `id` de-duplicates to `id:1`).
|
|
167
|
+
update star_t set value = 103 where id = 1 returning id, *;
|
|
168
|
+
→ [{"id":1,"id:1":1,"name":"a","value":103}]
|
|
169
|
+
|
|
170
|
+
-- OLD-qualified expression composes with * (which is the NEW image).
|
|
171
|
+
update star_t set value = 200 where id = 1 returning old.value, *;
|
|
172
|
+
→ [{"old.value":103,"id":1,"name":"a","value":200}]
|
|
173
|
+
|
|
174
|
+
-- DELETE ... RETURNING * → the OLD (deleted) image, full row.
|
|
175
|
+
delete from star_t where id = 2 returning *;
|
|
176
|
+
→ [{"id":2,"name":"b","value":200}]
|
|
177
|
+
|
|
178
|
+
-- zero-row mutations with * yield an empty result set, not an error.
|
|
179
|
+
update star_t set value = 0 where 1 = 0 returning *;
|
|
180
|
+
→ []
|
|
181
|
+
|
|
182
|
+
delete from star_t where 1 = 0 returning *;
|
|
183
|
+
→ []
|
|
184
|
+
|
|
185
|
+
-- relational orthogonality: RETURNING * makes the DML a relation usable in CTE
|
|
186
|
+
-- position (a wider projection). Insert form:
|
|
187
|
+
with ins as (insert into star_t (id, name, value) values (5, 'e', 50) returning *)
|
|
188
|
+
select count(*) as c from ins;
|
|
189
|
+
→ [{"c":1}]
|
|
190
|
+
|
|
191
|
+
-- ...and delete form.
|
|
192
|
+
with d as (delete from star_t where id = 5 returning *)
|
|
193
|
+
select id, name, value from d;
|
|
194
|
+
→ [{"id":5,"name":"e","value":50}]
|
|
195
|
+
|
|
196
|
+
-- interaction: a multi-row INSERT ... RETURNING * emits one expanded row per
|
|
197
|
+
-- inserted row (the star is the projection list; the executor supplies the rows).
|
|
198
|
+
insert into star_t (id, name, value) values (10, 'j', 1), (11, 'k', 2) returning *;
|
|
199
|
+
→ [{"id":10,"name":"j","value":1},{"id":11,"name":"k","value":2}]
|
|
200
|
+
|
|
201
|
+
-- ...and a multi-row UPDATE ... RETURNING * emits one NEW image per updated row.
|
|
202
|
+
update star_t set value = value + 100 where id in (10, 11) returning *;
|
|
203
|
+
→ [{"id":10,"name":"j","value":101},{"id":11,"name":"k","value":102}]
|
|
204
|
+
|
|
205
|
+
drop table star_t;
|
|
206
|
+
|
|
207
|
+
-- ===================================
|
|
208
|
+
-- 10. RETURNING * surfaces resolved DEFAULT and generated-column values
|
|
209
|
+
-- ===================================
|
|
210
|
+
|
|
211
|
+
create table gstar (id integer primary key, name text, qty integer default 7,
|
|
212
|
+
display text generated always as (upper(name)));
|
|
213
|
+
|
|
214
|
+
insert into gstar (id, name) values (1, 'alice') returning *;
|
|
215
|
+
→ [{"id":1,"name":"alice","qty":7,"display":"ALICE"}]
|
|
216
|
+
|
|
217
|
+
drop table gstar;
|
|
218
|
+
|
|
219
|
+
-- ===================================
|
|
220
|
+
-- 11. RETURNING * over a collated column round-trips the stored value, and the
|
|
221
|
+
-- column's declared collation still drives the WHERE match (the * column
|
|
222
|
+
-- resolves through the same symbol a named column would).
|
|
223
|
+
-- ===================================
|
|
224
|
+
|
|
225
|
+
create table cstar (id integer primary key, name text collate nocase);
|
|
226
|
+
insert into cstar values (1, 'Hello'), (2, 'WORLD');
|
|
227
|
+
|
|
228
|
+
-- nocase WHERE matches 'hello' → 'Hello'; * returns the verbatim stored value.
|
|
229
|
+
update cstar set name = name where name = 'hello' returning *;
|
|
230
|
+
→ [{"id":1,"name":"Hello"}]
|
|
231
|
+
|
|
232
|
+
drop table cstar;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
-- 42.2-returning-stored-row.sqllogic — RETURNING must report the row the
|
|
2
|
+
-- storage layer actually STORED, not the raw values the statement proposed.
|
|
3
|
+
--
|
|
4
|
+
-- Coercion happens inside vtab.update(), below the DML executor: a `json`
|
|
5
|
+
-- column given the text '{"a":2}' stores a native JSON value, and an
|
|
6
|
+
-- `integer`-affinity column given the text '7' stores the number 7. The
|
|
7
|
+
-- executor used to build RETURNING (and change tracking, and materialized-view
|
|
8
|
+
-- maintenance) from the PRE-coercion row, so the same column had two
|
|
9
|
+
-- observable values depending on which door you looked through.
|
|
10
|
+
--
|
|
11
|
+
-- Every case below is a PARITY assertion: what `returning` reports must equal
|
|
12
|
+
-- what a following `select` reports — value AND typeof. typeof() is what makes
|
|
13
|
+
-- the assertion sharp; a raw '{"a":2}' would report 'text', the stored value
|
|
14
|
+
-- reports 'json'.
|
|
15
|
+
|
|
16
|
+
-- ===================================
|
|
17
|
+
-- 1. INSERT ... RETURNING reports the coerced row
|
|
18
|
+
-- ===================================
|
|
19
|
+
|
|
20
|
+
create table sr_ins (id integer primary key, j json, n integer);
|
|
21
|
+
|
|
22
|
+
insert into sr_ins values (1, '{"a":2}', '7')
|
|
23
|
+
returning j, typeof(j) as jt, n, typeof(n) as nt;
|
|
24
|
+
→ [{"j":{"a":2},"jt":"json","n":7,"nt":"integer"}]
|
|
25
|
+
|
|
26
|
+
select j, typeof(j) as jt, n, typeof(n) as nt from sr_ins where id = 1;
|
|
27
|
+
→ [{"j":{"a":2},"jt":"json","n":7,"nt":"integer"}]
|
|
28
|
+
|
|
29
|
+
-- RETURNING * takes the same path
|
|
30
|
+
insert into sr_ins values (2, '[1,2]', '8') returning *;
|
|
31
|
+
→ [{"id":2,"j":[1,2],"n":8}]
|
|
32
|
+
|
|
33
|
+
select * from sr_ins where id = 2;
|
|
34
|
+
→ [{"id":2,"j":[1,2],"n":8}]
|
|
35
|
+
|
|
36
|
+
-- multi-row INSERT: every emitted row is its own stored row
|
|
37
|
+
insert into sr_ins values (3, '{"b":1}', '9'), (4, '{"c":2}', '10')
|
|
38
|
+
returning id, j, typeof(j) as jt, n, typeof(n) as nt;
|
|
39
|
+
→ [{"id":3,"j":{"b":1},"jt":"json","n":9,"nt":"integer"},{"id":4,"j":{"c":2},"jt":"json","n":10,"nt":"integer"}]
|
|
40
|
+
|
|
41
|
+
select id, j, typeof(j) as jt, n, typeof(n) as nt from sr_ins where id in (3, 4) order by id;
|
|
42
|
+
→ [{"id":3,"j":{"b":1},"jt":"json","n":9,"nt":"integer"},{"id":4,"j":{"c":2},"jt":"json","n":10,"nt":"integer"}]
|
|
43
|
+
|
|
44
|
+
drop table sr_ins;
|
|
45
|
+
|
|
46
|
+
-- ===================================
|
|
47
|
+
-- 2. UPDATE ... RETURNING reports the coerced NEW row; OLD stays the stored
|
|
48
|
+
-- pre-update row.
|
|
49
|
+
-- ===================================
|
|
50
|
+
|
|
51
|
+
create table sr_upd (id integer primary key, j json, n integer);
|
|
52
|
+
insert into sr_upd values (1, '{"a":1}', 1);
|
|
53
|
+
|
|
54
|
+
update sr_upd set j = '{"a":2}', n = '7' where id = 1
|
|
55
|
+
returning j, typeof(j) as jt, n, typeof(n) as nt;
|
|
56
|
+
→ [{"j":{"a":2},"jt":"json","n":7,"nt":"integer"}]
|
|
57
|
+
|
|
58
|
+
select j, typeof(j) as jt, n, typeof(n) as nt from sr_upd where id = 1;
|
|
59
|
+
→ [{"j":{"a":2},"jt":"json","n":7,"nt":"integer"}]
|
|
60
|
+
|
|
61
|
+
-- OLD image is the stored row read from the source scan; NEW is the stored row
|
|
62
|
+
-- handed back by the substrate. Both sides coerced, in one projection.
|
|
63
|
+
update sr_upd set j = '{"a":3}', n = '11' where id = 1
|
|
64
|
+
returning old.j as oj, typeof(old.j) as ojt, j as nj, typeof(j) as njt,
|
|
65
|
+
old.n as on_, typeof(old.n) as ont, n as nn, typeof(n) as nnt;
|
|
66
|
+
→ [{"oj":{"a":2},"ojt":"json","nj":{"a":3},"njt":"json","on_":7,"ont":"integer","nn":11,"nnt":"integer"}]
|
|
67
|
+
|
|
68
|
+
select j, n from sr_upd where id = 1;
|
|
69
|
+
→ [{"j":{"a":3},"n":11}]
|
|
70
|
+
|
|
71
|
+
-- a no-op-valued UPDATE still reports the stored row (not the raw text)
|
|
72
|
+
update sr_upd set j = '{ "a" : 3 }' where id = 1 returning j, typeof(j) as jt;
|
|
73
|
+
→ [{"j":{"a":3},"jt":"json"}]
|
|
74
|
+
|
|
75
|
+
select j, typeof(j) as jt from sr_upd where id = 1;
|
|
76
|
+
→ [{"j":{"a":3},"jt":"json"}]
|
|
77
|
+
|
|
78
|
+
drop table sr_upd;
|
|
79
|
+
|
|
80
|
+
-- ===================================
|
|
81
|
+
-- 3. UPDATE that MOVES the primary key
|
|
82
|
+
-- ===================================
|
|
83
|
+
-- The key move takes the delete+insert arm of the executor; RETURNING must
|
|
84
|
+
-- still project the stored NEW row and the stored OLD key.
|
|
85
|
+
|
|
86
|
+
create table sr_move (id integer primary key, j json, n integer);
|
|
87
|
+
insert into sr_move values (1, '{"a":1}', 1);
|
|
88
|
+
|
|
89
|
+
update sr_move set id = 5, j = '{"a":9}', n = '42' where id = 1
|
|
90
|
+
returning old.id as old_id, id, j, typeof(j) as jt, n, typeof(n) as nt;
|
|
91
|
+
→ [{"old_id":1,"id":5,"j":{"a":9},"jt":"json","n":42,"nt":"integer"}]
|
|
92
|
+
|
|
93
|
+
select id, j, typeof(j) as jt, n, typeof(n) as nt from sr_move;
|
|
94
|
+
→ [{"id":5,"j":{"a":9},"jt":"json","n":42,"nt":"integer"}]
|
|
95
|
+
|
|
96
|
+
drop table sr_move;
|
|
97
|
+
|
|
98
|
+
-- ===================================
|
|
99
|
+
-- 4. INSERT ... ON CONFLICT DO UPDATE ... RETURNING
|
|
100
|
+
-- ===================================
|
|
101
|
+
|
|
102
|
+
create table sr_ups (id integer primary key, j json, n integer);
|
|
103
|
+
insert into sr_ups values (1, '{"a":1}', 1);
|
|
104
|
+
|
|
105
|
+
-- conflicting insert takes the DO UPDATE arm
|
|
106
|
+
insert into sr_ups values (1, '{"a":2}', '7')
|
|
107
|
+
on conflict (id) do update set j = excluded.j, n = excluded.n
|
|
108
|
+
returning id, j, typeof(j) as jt, n, typeof(n) as nt;
|
|
109
|
+
→ [{"id":1,"j":{"a":2},"jt":"json","n":7,"nt":"integer"}]
|
|
110
|
+
|
|
111
|
+
select id, j, typeof(j) as jt, n, typeof(n) as nt from sr_ups;
|
|
112
|
+
→ [{"id":1,"j":{"a":2},"jt":"json","n":7,"nt":"integer"}]
|
|
113
|
+
|
|
114
|
+
-- non-conflicting insert through the same statement shape takes the plain
|
|
115
|
+
-- insert arm, and is equally coerced
|
|
116
|
+
insert into sr_ups values (2, '{"b":3}', '8')
|
|
117
|
+
on conflict (id) do update set j = excluded.j
|
|
118
|
+
returning id, j, typeof(j) as jt, n, typeof(n) as nt;
|
|
119
|
+
→ [{"id":2,"j":{"b":3},"jt":"json","n":8,"nt":"integer"}]
|
|
120
|
+
|
|
121
|
+
select id, j, typeof(j) as jt, n, typeof(n) as nt from sr_ups where id = 2;
|
|
122
|
+
→ [{"id":2,"j":{"b":3},"jt":"json","n":8,"nt":"integer"}]
|
|
123
|
+
|
|
124
|
+
drop table sr_ups;
|
|
125
|
+
|
|
126
|
+
-- ===================================
|
|
127
|
+
-- 5. INSERT OR REPLACE ... RETURNING
|
|
128
|
+
-- ===================================
|
|
129
|
+
|
|
130
|
+
create table sr_repl (id integer primary key, j json, n integer);
|
|
131
|
+
insert into sr_repl values (1, '{"a":1}', 1);
|
|
132
|
+
|
|
133
|
+
insert or replace into sr_repl values (1, '{"a":2}', '7')
|
|
134
|
+
returning id, j, typeof(j) as jt, n, typeof(n) as nt;
|
|
135
|
+
→ [{"id":1,"j":{"a":2},"jt":"json","n":7,"nt":"integer"}]
|
|
136
|
+
|
|
137
|
+
select id, j, typeof(j) as jt, n, typeof(n) as nt from sr_repl;
|
|
138
|
+
→ [{"id":1,"j":{"a":2},"jt":"json","n":7,"nt":"integer"}]
|
|
139
|
+
|
|
140
|
+
drop table sr_repl;
|
|
141
|
+
|
|
142
|
+
-- ===================================
|
|
143
|
+
-- 6. INSERT OR IGNORE on a conflicting row yields NO row
|
|
144
|
+
-- ===================================
|
|
145
|
+
-- Negative pin: the "row was not written" short-circuit runs BEFORE any of the
|
|
146
|
+
-- stored-row plumbing, so an ignored conflict must still emit nothing at all.
|
|
147
|
+
|
|
148
|
+
create table sr_ign (id integer primary key, j json);
|
|
149
|
+
insert into sr_ign values (1, '{"a":1}');
|
|
150
|
+
|
|
151
|
+
insert or ignore into sr_ign values (1, '{"a":2}') returning id, j;
|
|
152
|
+
→ []
|
|
153
|
+
|
|
154
|
+
-- the existing row is untouched
|
|
155
|
+
select id, j from sr_ign;
|
|
156
|
+
→ [{"id":1,"j":{"a":1}}]
|
|
157
|
+
|
|
158
|
+
-- a non-conflicting OR IGNORE insert does emit its stored row
|
|
159
|
+
insert or ignore into sr_ign values (2, '{"a":2}') returning id, j, typeof(j) as jt;
|
|
160
|
+
→ [{"id":2,"j":{"a":2},"jt":"json"}]
|
|
161
|
+
|
|
162
|
+
select id, j from sr_ign order by id;
|
|
163
|
+
→ [{"id":1,"j":{"a":1}},{"id":2,"j":{"a":2}}]
|
|
164
|
+
|
|
165
|
+
drop table sr_ign;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
-- 43-default-nullability.sqllogic - Testing default NOT NULL column behavior (Third Manifesto alignment)
|
|
2
|
+
|
|
3
|
+
-- Test default NOT NULL behavior
|
|
4
|
+
CREATE TABLE test_default_notnull (
|
|
5
|
+
id INTEGER PRIMARY KEY,
|
|
6
|
+
name TEXT,
|
|
7
|
+
age INTEGER
|
|
8
|
+
);
|
|
9
|
+
|
|
10
|
+
-- Valid insert - should succeed
|
|
11
|
+
INSERT INTO test_default_notnull VALUES (1, 'Alice', 30);
|
|
12
|
+
SELECT * FROM test_default_notnull WHERE id = 1;
|
|
13
|
+
→ [{"id":1,"name":"Alice","age":30}]
|
|
14
|
+
|
|
15
|
+
-- Insert with NULL name - should fail (NOT NULL by default)
|
|
16
|
+
INSERT INTO test_default_notnull VALUES (2, NULL, 25);
|
|
17
|
+
-- error: NOT NULL constraint failed: test_default_notnull.name
|
|
18
|
+
|
|
19
|
+
-- Insert with NULL age - should fail (NOT NULL by default)
|
|
20
|
+
INSERT INTO test_default_notnull VALUES (3, 'Bob', NULL);
|
|
21
|
+
-- error: NOT NULL constraint failed: test_default_notnull.age
|
|
22
|
+
|
|
23
|
+
-- Verify only valid row was inserted
|
|
24
|
+
SELECT COUNT(*) FROM test_default_notnull;
|
|
25
|
+
→ [{"count(*)":1}]
|
|
26
|
+
|
|
27
|
+
DROP TABLE test_default_notnull;
|
|
28
|
+
|
|
29
|
+
-- Test explicit NULL override
|
|
30
|
+
CREATE TABLE test_explicit_null (
|
|
31
|
+
id INTEGER PRIMARY KEY,
|
|
32
|
+
required_field TEXT,
|
|
33
|
+
optional_field TEXT NULL
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
-- Insert with NULL in required field - should fail
|
|
37
|
+
INSERT INTO test_explicit_null VALUES (1, NULL, 'optional');
|
|
38
|
+
-- error: NOT NULL constraint failed: test_explicit_null.required_field
|
|
39
|
+
|
|
40
|
+
-- Insert with NULL in optional field - should succeed
|
|
41
|
+
INSERT INTO test_explicit_null VALUES (2, 'required', NULL);
|
|
42
|
+
SELECT * FROM test_explicit_null WHERE id = 2;
|
|
43
|
+
→ [{"id":2,"required_field":"required","optional_field":null}]
|
|
44
|
+
|
|
45
|
+
-- Insert with both fields populated - should succeed
|
|
46
|
+
INSERT INTO test_explicit_null VALUES (3, 'test', 'value');
|
|
47
|
+
SELECT * FROM test_explicit_null WHERE id = 3;
|
|
48
|
+
→ [{"id":3,"required_field":"test","optional_field":"value"}]
|
|
49
|
+
|
|
50
|
+
DROP TABLE test_explicit_null;
|
|
51
|
+
|
|
52
|
+
-- Test pragma to revert to SQL standard nullable behavior
|
|
53
|
+
PRAGMA default_column_nullability='nullable';
|
|
54
|
+
|
|
55
|
+
PRAGMA default_column_nullability;
|
|
56
|
+
→ [{"name": "default_column_nullability", "value": "nullable"}]
|
|
57
|
+
|
|
58
|
+
CREATE TABLE test_nullable_default (
|
|
59
|
+
id INTEGER PRIMARY KEY,
|
|
60
|
+
name TEXT,
|
|
61
|
+
value INTEGER
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
-- Insert with NULL values - should succeed with nullable pragma
|
|
65
|
+
INSERT INTO test_nullable_default VALUES (1, NULL, NULL);
|
|
66
|
+
SELECT * FROM test_nullable_default WHERE id = 1;
|
|
67
|
+
→ [{"id":1,"name":null,"value":null}]
|
|
68
|
+
|
|
69
|
+
-- Insert with values - should also succeed
|
|
70
|
+
INSERT INTO test_nullable_default VALUES (2, 'test', 42);
|
|
71
|
+
SELECT * FROM test_nullable_default WHERE id = 2;
|
|
72
|
+
→ [{"id":2,"name":"test","value":42}]
|
|
73
|
+
|
|
74
|
+
DROP TABLE test_nullable_default;
|
|
75
|
+
|
|
76
|
+
-- Restore default NOT NULL behavior
|
|
77
|
+
PRAGMA default_column_nullability='not_null';
|
|
78
|
+
|
|
79
|
+
PRAGMA default_column_nullability;
|
|
80
|
+
→ [{"name": "default_column_nullability", "value": "not_null"}]
|
|
81
|
+
|
|
82
|
+
-- Test that explicit NOT NULL still works
|
|
83
|
+
CREATE TABLE test_explicit_notnull (
|
|
84
|
+
id INTEGER PRIMARY KEY,
|
|
85
|
+
name TEXT NOT NULL,
|
|
86
|
+
age INTEGER
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
-- Insert with NULL name - should fail
|
|
90
|
+
INSERT INTO test_explicit_notnull VALUES (1, NULL, 30);
|
|
91
|
+
-- error: NOT NULL constraint failed: test_explicit_notnull.name
|
|
92
|
+
|
|
93
|
+
-- Insert with NULL age - should fail (default NOT NULL)
|
|
94
|
+
INSERT INTO test_explicit_notnull VALUES (2, 'Alice', NULL);
|
|
95
|
+
-- error: NOT NULL constraint failed: test_explicit_notnull.age
|
|
96
|
+
|
|
97
|
+
-- Valid insert - should succeed
|
|
98
|
+
INSERT INTO test_explicit_notnull VALUES (3, 'Bob', 25);
|
|
99
|
+
SELECT * FROM test_explicit_notnull WHERE id = 3;
|
|
100
|
+
→ [{"id":3,"name":"Bob","age":25}]
|
|
101
|
+
|
|
102
|
+
DROP TABLE test_explicit_notnull;
|
|
103
|
+
|
|
104
|
+
-- Test mixed NULL and NOT NULL columns
|
|
105
|
+
CREATE TABLE test_mixed (
|
|
106
|
+
id INTEGER PRIMARY KEY,
|
|
107
|
+
required_name TEXT NOT NULL,
|
|
108
|
+
optional_desc TEXT NULL,
|
|
109
|
+
required_count INTEGER,
|
|
110
|
+
optional_notes TEXT NULL
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
-- Insert with all required fields, NULL optionals - should succeed
|
|
114
|
+
INSERT INTO test_mixed VALUES (1, 'Item1', NULL, 5, NULL);
|
|
115
|
+
SELECT * FROM test_mixed WHERE id = 1;
|
|
116
|
+
→ [{"id":1,"required_name":"Item1","optional_desc":null,"required_count":5,"optional_notes":null}]
|
|
117
|
+
|
|
118
|
+
-- Insert with NULL required field - should fail
|
|
119
|
+
INSERT INTO test_mixed VALUES (2, NULL, 'desc', 10, 'notes');
|
|
120
|
+
-- error: NOT NULL constraint failed: test_mixed.required_name
|
|
121
|
+
|
|
122
|
+
-- Insert with NULL required count - should fail
|
|
123
|
+
INSERT INTO test_mixed VALUES (3, 'Item3', 'desc', NULL, 'notes');
|
|
124
|
+
-- error: NOT NULL constraint failed: test_mixed.required_count
|
|
125
|
+
|
|
126
|
+
-- Valid insert with all fields - should succeed
|
|
127
|
+
INSERT INTO test_mixed VALUES (4, 'Item4', 'description', 20, 'some notes');
|
|
128
|
+
SELECT * FROM test_mixed WHERE id = 4;
|
|
129
|
+
→ [{"id":4,"required_name":"Item4","optional_desc":"description","required_count":20,"optional_notes":"some notes"}]
|
|
130
|
+
|
|
131
|
+
DROP TABLE test_mixed;
|