@quereus/quereus 4.20.1 → 4.20.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +17 -69
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/package.json +7 -4
- package/test/README.md +173 -0
- package/test/logic/01-basic.sqllogic +39 -0
- package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
- package/test/logic/01.2-strings.sqllogic +43 -0
- package/test/logic/01.5-insert-select.sqllogic +237 -0
- package/test/logic/01.6-update-extras.sqllogic +118 -0
- package/test/logic/01.7-update-from.sqllogic +67 -0
- package/test/logic/01.8-delete-extras.sqllogic +122 -0
- package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
- package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
- package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
- package/test/logic/01.9-query-expr-values.sqllogic +111 -0
- package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
- package/test/logic/02-filters.sqllogic +54 -0
- package/test/logic/02-smoke.sqllogic +62 -0
- package/test/logic/02.1-bind-parameters.sqllogic +223 -0
- package/test/logic/03-expressions.sqllogic +190 -0
- package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
- package/test/logic/03.4-defaults.sqllogic +554 -0
- package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
- package/test/logic/03.5-tvf.sqllogic +61 -0
- package/test/logic/03.6-type-system.sqllogic +544 -0
- package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
- package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
- package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
- package/test/logic/03.8-not-precedence.sqllogic +255 -0
- package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
- package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
- package/test/logic/04-order-by.sqllogic +38 -0
- package/test/logic/04-transactions.sqllogic +239 -0
- package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
- package/test/logic/05-vtab_memory.sqllogic +50 -0
- package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
- package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
- package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
- package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
- package/test/logic/06-builtin_functions.sqllogic +149 -0
- package/test/logic/06.1-string-functions.sqllogic +92 -0
- package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
- package/test/logic/06.2-math-functions.sqllogic +82 -0
- package/test/logic/06.3-schema.sqllogic +48 -0
- package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
- package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
- package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
- package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
- package/test/logic/06.3.4-view-info.sqllogic +378 -0
- package/test/logic/06.3.5-column-info.sqllogic +347 -0
- package/test/logic/06.3.6-schema-views.sqllogic +29 -0
- package/test/logic/06.4-schema-search-path.sqllogic +354 -0
- package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
- package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
- package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
- package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
- package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
- package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
- package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
- package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
- package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
- package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
- package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
- package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
- package/test/logic/06.7-json-extended.sqllogic +53 -0
- package/test/logic/06.8-json-path-operators.sqllogic +99 -0
- package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
- package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
- package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
- package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
- package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
- package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
- package/test/logic/07-aggregates.sqllogic +193 -0
- package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
- package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
- package/test/logic/07.3-group-by-extras.sqllogic +602 -0
- package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
- package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
- package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
- package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
- package/test/logic/07.5-window.sqllogic +1941 -0
- package/test/logic/07.5.1-window-named.sqllogic +13 -0
- package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
- package/test/logic/07.6-subqueries.sqllogic +78 -0
- package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
- package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
- package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
- package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
- package/test/logic/07.7.1-in-extras.sqllogic +158 -0
- package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
- package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
- package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
- package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
- package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
- package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
- package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
- package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
- package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
- package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
- package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
- package/test/logic/07.9-in-value-list.sqllogic +154 -0
- package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
- package/test/logic/08-views.sqllogic +64 -0
- package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
- package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
- package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
- package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
- package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
- package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
- package/test/logic/09-set_operations.sqllogic +244 -0
- package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
- package/test/logic/10-distinct_datatypes.sqllogic +127 -0
- package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
- package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
- package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
- package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
- package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
- package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
- package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
- package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
- package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
- package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
- package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
- package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
- package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
- package/test/logic/10.2-column-features.sqllogic +365 -0
- package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
- package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
- package/test/logic/10.3-function-features.sqllogic +247 -0
- package/test/logic/10.4-schema-scale.sqllogic +168 -0
- package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
- package/test/logic/10.5-indexes.sqllogic +164 -0
- package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
- package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
- package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
- package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
- package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
- package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
- package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
- package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
- package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
- package/test/logic/100.1-where-extras.sqllogic +163 -0
- package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
- package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
- package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
- package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
- package/test/logic/102-unique-constraints.sqllogic +145 -0
- package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
- package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
- package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
- package/test/logic/102.2-unique-collation.sqllogic +181 -0
- package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
- package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
- package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
- package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
- package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
- package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
- package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
- package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
- package/test/logic/108-cardinality-estimation.sqllogic +146 -0
- package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
- package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
- package/test/logic/11-joins.sqllogic +86 -0
- package/test/logic/11.1-join-using.sqllogic +267 -0
- package/test/logic/11.2-comma-join.sqllogic +35 -0
- package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
- package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
- package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
- package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
- package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
- package/test/logic/12-empty-primary-key.sqllogic +124 -0
- package/test/logic/12-join_padding_order.sqllogic +58 -0
- package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
- package/test/logic/13-cte.sqllogic +137 -0
- package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
- package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
- package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
- package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
- package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
- package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
- package/test/logic/13.4-cte-extras.sqllogic +98 -0
- package/test/logic/13.5-cte-join-order.sqllogic +166 -0
- package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
- package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
- package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
- package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
- package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
- package/test/logic/14-utilities.sqllogic +168 -0
- package/test/logic/15-timespan.sqllogic +279 -0
- package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
- package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
- package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
- package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
- package/test/logic/16-epoch.sqllogic +187 -0
- package/test/logic/17-weekday-modifier.sqllogic +78 -0
- package/test/logic/18-json-string-escapes.sqllogic +86 -0
- package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
- package/test/logic/20-empty-single-row.sqllogic +261 -0
- package/test/logic/21-null-edge-cases.sqllogic +227 -0
- package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
- package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
- package/test/logic/21.2-between-edges.sqllogic +157 -0
- package/test/logic/22-boundary-values.sqllogic +175 -0
- package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
- package/test/logic/24-builtin-branches.sqllogic +611 -0
- package/test/logic/24.1-substr-extras.sqllogic +75 -0
- package/test/logic/24.2-random-extras.sqllogic +39 -0
- package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
- package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
- package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
- package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
- package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
- package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
- package/test/logic/26-join-edge-cases.sqllogic +333 -0
- package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
- package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
- package/test/logic/26.3-join-on-constants.sqllogic +61 -0
- package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
- package/test/logic/27-window-edge-cases.sqllogic +206 -0
- package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
- package/test/logic/27.2-window-exclude.sqllogic +13 -0
- package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
- package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
- package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
- package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
- package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
- package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
- package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
- package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
- package/test/logic/40-constraints.sqllogic +418 -0
- package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
- package/test/logic/40.2-check-extras.sqllogic +683 -0
- package/test/logic/41-alter-table.sqllogic +191 -0
- package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
- package/test/logic/41-fk-cross-schema.sqllogic +155 -0
- package/test/logic/41-fk-extended-targets.sqllogic +173 -0
- package/test/logic/41-foreign-keys.sqllogic +1001 -0
- package/test/logic/41-generated-column-errors.sqllogic +225 -0
- package/test/logic/41-generated-column-extras.sqllogic +598 -0
- package/test/logic/41-generated-column-scope.sqllogic +329 -0
- package/test/logic/41-generated-columns.sqllogic +361 -0
- package/test/logic/41.1-alter-pk.sqllogic +230 -0
- package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
- package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
- package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
- package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
- package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
- package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
- package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
- package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
- package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
- package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
- package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
- package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
- package/test/logic/41.2-alter-column.sqllogic +382 -0
- package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
- package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
- package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
- package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
- package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
- package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
- package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
- package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
- package/test/logic/41.5-alter-misc.sqllogic +48 -0
- package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
- package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
- package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
- package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
- package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
- package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
- package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
- package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
- package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
- package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
- package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
- package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
- package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
- package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
- package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
- package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
- package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
- package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
- package/test/logic/42-committed-snapshot.sqllogic +254 -0
- package/test/logic/42-returning.sqllogic +159 -0
- package/test/logic/42.1-returning-extras.sqllogic +232 -0
- package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
- package/test/logic/43-default-nullability.sqllogic +131 -0
- package/test/logic/43-transition-constraints.sqllogic +341 -0
- package/test/logic/43.1-default-collation.sqllogic +140 -0
- package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
- package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
- package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
- package/test/logic/44-determinism-validation.sqllogic +164 -0
- package/test/logic/44-orthogonality.sqllogic +146 -0
- package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
- package/test/logic/45-udf-determinism.sqllogic +39 -0
- package/test/logic/46-mutation-context.sqllogic +595 -0
- package/test/logic/47-upsert.sqllogic +255 -0
- package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
- package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
- package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
- package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
- package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
- package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
- package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
- package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
- package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
- package/test/logic/49-reference-graph.sqllogic +84 -0
- package/test/logic/50-declarative-schema.sqllogic +2550 -0
- package/test/logic/50-metadata-tags.sqllogic +1033 -0
- package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
- package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
- package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
- package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +210 -0
- package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
- package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
- package/test/logic/51-lens-foundation.sqllogic +147 -0
- package/test/logic/51-materialized-views.sqllogic +376 -0
- package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
- package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
- package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
- package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
- package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
- package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
- package/test/logic/52-lens-overrides.sqllogic +566 -0
- package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
- package/test/logic/53-reserved-tags.sqllogic +252 -0
- package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
- package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
- package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
- package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
- package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
- package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
- package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
- package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
- package/test/logic/55-lens-prover.sqllogic +202 -0
- package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
- package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
- package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
- package/test/logic/81-quickpick.sqllogic +24 -0
- package/test/logic/82-bloom-join.sqllogic +185 -0
- package/test/logic/83-merge-join.sqllogic +280 -0
- package/test/logic/84-asof-scan.sqllogic +238 -0
- package/test/logic/84-key-cardinality.sqllogic +50 -0
- package/test/logic/85-relational-const-folding.sqllogic +51 -0
- package/test/logic/86-scalar-cse.sqllogic +42 -0
- package/test/logic/90-error_paths.sqllogic +114 -0
- package/test/logic/90.1-parse-errors.sqllogic +77 -0
- package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
- package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
- package/test/logic/90.3-expression-errors.sqllogic +43 -0
- package/test/logic/90.4-dml-errors.sqllogic +47 -0
- package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
- package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
- package/test/logic/90.6-select-error-paths.sqllogic +57 -0
- package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
- package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
- package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
- package/test/logic/93.1-view-error-paths.sqllogic +74 -0
- package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
- package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
- package/test/logic/93.4-view-mutation.sqllogic +4881 -0
- package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
- package/test/logic/93.5-authored-inverse.sqllogic +415 -0
- package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
- package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
- package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
- package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
- package/test/logic/95-assertions.sqllogic +1417 -0
- package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
- package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
- package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
- package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
- package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
- package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
- package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
- package/test/logic/drop-unique-index.sqllogic +88 -0
- package/test/logic/pushdown-test.sqllogic +36 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
-- weekday modifier tests
|
|
2
|
+
-- SQLite "weekday N" advances the date forward to the next occurrence of
|
|
3
|
+
-- weekday N (0=Sunday..6=Saturday). If the date is already on that weekday,
|
|
4
|
+
-- no change is made.
|
|
5
|
+
|
|
6
|
+
-- 2024-07-22 is a Monday (weekday 1)
|
|
7
|
+
|
|
8
|
+
-- Same weekday → no change
|
|
9
|
+
SELECT date('2024-07-22', 'weekday 1');
|
|
10
|
+
→ ["2024-07-22"]
|
|
11
|
+
|
|
12
|
+
-- Monday → next Tuesday (1 day forward)
|
|
13
|
+
SELECT date('2024-07-22', 'weekday 2');
|
|
14
|
+
→ ["2024-07-23"]
|
|
15
|
+
|
|
16
|
+
-- Monday → next Wednesday (2 days forward)
|
|
17
|
+
SELECT date('2024-07-22', 'weekday 3');
|
|
18
|
+
→ ["2024-07-24"]
|
|
19
|
+
|
|
20
|
+
-- Monday → next Thursday (3 days forward)
|
|
21
|
+
SELECT date('2024-07-22', 'weekday 4');
|
|
22
|
+
→ ["2024-07-25"]
|
|
23
|
+
|
|
24
|
+
-- Monday → next Friday (4 days forward)
|
|
25
|
+
SELECT date('2024-07-22', 'weekday 5');
|
|
26
|
+
→ ["2024-07-26"]
|
|
27
|
+
|
|
28
|
+
-- Monday → next Saturday (5 days forward)
|
|
29
|
+
SELECT date('2024-07-22', 'weekday 6');
|
|
30
|
+
→ ["2024-07-27"]
|
|
31
|
+
|
|
32
|
+
-- Monday → next Sunday (6 days forward)
|
|
33
|
+
SELECT date('2024-07-22', 'weekday 0');
|
|
34
|
+
→ ["2024-07-28"]
|
|
35
|
+
|
|
36
|
+
-- 2024-07-26 is a Friday (weekday 5)
|
|
37
|
+
|
|
38
|
+
-- Friday → same Friday (no change)
|
|
39
|
+
SELECT date('2024-07-26', 'weekday 5');
|
|
40
|
+
→ ["2024-07-26"]
|
|
41
|
+
|
|
42
|
+
-- Friday → next Saturday (1 day forward)
|
|
43
|
+
SELECT date('2024-07-26', 'weekday 6');
|
|
44
|
+
→ ["2024-07-27"]
|
|
45
|
+
|
|
46
|
+
-- Friday → next Sunday (2 days forward)
|
|
47
|
+
SELECT date('2024-07-26', 'weekday 0');
|
|
48
|
+
→ ["2024-07-28"]
|
|
49
|
+
|
|
50
|
+
-- Friday → next Monday (3 days forward)
|
|
51
|
+
SELECT date('2024-07-26', 'weekday 1');
|
|
52
|
+
→ ["2024-07-29"]
|
|
53
|
+
|
|
54
|
+
-- Friday → next Wednesday (5 days forward)
|
|
55
|
+
SELECT date('2024-07-26', 'weekday 3');
|
|
56
|
+
→ ["2024-07-31"]
|
|
57
|
+
|
|
58
|
+
-- 2024-07-28 is a Sunday (weekday 0)
|
|
59
|
+
|
|
60
|
+
-- Sunday → same Sunday (no change)
|
|
61
|
+
SELECT date('2024-07-28', 'weekday 0');
|
|
62
|
+
→ ["2024-07-28"]
|
|
63
|
+
|
|
64
|
+
-- Sunday → next Monday (1 day forward)
|
|
65
|
+
SELECT date('2024-07-28', 'weekday 1');
|
|
66
|
+
→ ["2024-07-29"]
|
|
67
|
+
|
|
68
|
+
-- Sunday → next Saturday (6 days forward)
|
|
69
|
+
SELECT date('2024-07-28', 'weekday 6');
|
|
70
|
+
→ ["2024-08-03"]
|
|
71
|
+
|
|
72
|
+
-- Weekday modifier with datetime function
|
|
73
|
+
SELECT datetime('2024-07-22 10:30:00', 'weekday 3');
|
|
74
|
+
→ ["2024-07-24 10:30:00"]
|
|
75
|
+
|
|
76
|
+
-- Weekday modifier combined with start of day
|
|
77
|
+
SELECT datetime('2024-07-22 10:30:00', 'weekday 3', 'start of day');
|
|
78
|
+
→ ["2024-07-24 00:00:00"]
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
-- 18-json-string-escapes.sqllogic
|
|
2
|
+
-- adapted from SQLite test/json101.test (json101-1.2 and surrounding escape coverage)
|
|
3
|
+
-- Standard JSON string-escape sequences round-trip through JSON construction
|
|
4
|
+
-- and quoting. Quereus uses native JSON.parse / JSON.stringify, so the standard
|
|
5
|
+
-- two-character escapes (\" \\ \/ \b \f \n \r \t) and \uXXXX must round-trip.
|
|
6
|
+
|
|
7
|
+
-- ============================================================
|
|
8
|
+
-- json_quote: escape characters in strings
|
|
9
|
+
-- ============================================================
|
|
10
|
+
|
|
11
|
+
SELECT json_quote('String "\ Test');
|
|
12
|
+
→ [{"json_quote('String \"\\ Test')":"\"String \\\"\\\\ Test\""}]
|
|
13
|
+
|
|
14
|
+
-- Double quote (use char(92) to obtain a literal backslash safely)
|
|
15
|
+
SELECT json_quote('he said "hi"');
|
|
16
|
+
→ [{"json_quote('he said \"hi\"')":"\"he said \\\"hi\\\"\""}]
|
|
17
|
+
|
|
18
|
+
-- Newline character inside string literal (real LF)
|
|
19
|
+
SELECT json_quote('a
|
|
20
|
+
b');
|
|
21
|
+
→ [{"json_quote('a\nb')":"\"a\\nb\""}]
|
|
22
|
+
|
|
23
|
+
-- ============================================================
|
|
24
|
+
-- json_array: round-trip strings with embedded escapes
|
|
25
|
+
-- ============================================================
|
|
26
|
+
|
|
27
|
+
-- Embedded double-quote in array element
|
|
28
|
+
SELECT json_array('he said "hi"');
|
|
29
|
+
→ [["he said \"hi\""]]
|
|
30
|
+
|
|
31
|
+
SELECT json_array('a\\b');
|
|
32
|
+
→ [["a\\\\b"]]
|
|
33
|
+
|
|
34
|
+
-- Embedded forward slash (no escape required)
|
|
35
|
+
SELECT json_array('a/b');
|
|
36
|
+
→ [["a/b"]]
|
|
37
|
+
|
|
38
|
+
-- ============================================================
|
|
39
|
+
-- json_extract: parse strings with standard escape sequences
|
|
40
|
+
-- ============================================================
|
|
41
|
+
|
|
42
|
+
SELECT json_extract('{"a":"he said \"hi\""}', '$.a');
|
|
43
|
+
→ ["he said \"hi\""]
|
|
44
|
+
|
|
45
|
+
SELECT json_extract('{"a":"a\\b"}', '$.a');
|
|
46
|
+
→ ["a\\b"]
|
|
47
|
+
|
|
48
|
+
SELECT json_extract('{"a":"line1\nline2"}', '$.a');
|
|
49
|
+
→ ["line1\nline2"]
|
|
50
|
+
|
|
51
|
+
SELECT json_extract('{"a":"col1\tcol2"}', '$.a');
|
|
52
|
+
→ ["col1\tcol2"]
|
|
53
|
+
|
|
54
|
+
-- \uXXXX: ASCII letter (no backslash so not affected)
|
|
55
|
+
SELECT json_extract('{"a":"A"}', '$.a');
|
|
56
|
+
→ ["A"]
|
|
57
|
+
|
|
58
|
+
-- \uXXXX: Latin-1 supplement (literal char in SQL source)
|
|
59
|
+
SELECT json_extract('{"a":"é"}', '$.a');
|
|
60
|
+
→ ["é"]
|
|
61
|
+
|
|
62
|
+
-- Surrogate pair: U+1D11E (musical G clef, literal)
|
|
63
|
+
SELECT json_extract('{"a":"𝄞"}', '$.a');
|
|
64
|
+
→ ["𝄞"]
|
|
65
|
+
|
|
66
|
+
-- ============================================================
|
|
67
|
+
-- json_valid: malformed escape sequences rejected
|
|
68
|
+
-- ============================================================
|
|
69
|
+
|
|
70
|
+
SELECT json_valid('{"a":"\xZZ"}');
|
|
71
|
+
→ [{"json_valid('{\"a\":\"\\xZZ\"}')":false}]
|
|
72
|
+
|
|
73
|
+
SELECT json_valid('{"a":"\u00"}');
|
|
74
|
+
→ [{"json_valid('{\"a\":\"\\u00\"}')":false}]
|
|
75
|
+
|
|
76
|
+
-- ============================================================
|
|
77
|
+
-- json_array_length on a string containing a structural character
|
|
78
|
+
-- ============================================================
|
|
79
|
+
|
|
80
|
+
-- Comma inside a quoted string must not be treated as element separator
|
|
81
|
+
SELECT json_array_length('["a,b","c,d","e"]');
|
|
82
|
+
→ [3]
|
|
83
|
+
|
|
84
|
+
-- Bracket inside a quoted string must not break parsing
|
|
85
|
+
SELECT json_array_length('["[","]","["]');
|
|
86
|
+
→ [3]
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
-- 18-strftime-extended-formats.sqllogic
|
|
2
|
+
-- adapted from SQLite test/date4.test
|
|
3
|
+
-- Extended strftime format specifiers beyond what 16-epoch.sqllogic and
|
|
4
|
+
-- 24-builtin-branches.sqllogic exercise. Per docs/datetime.md %W is documented
|
|
5
|
+
-- as the ISO 8601 week number; we also probe the SQLite-aliased forms %U
|
|
6
|
+
-- (Sunday-first week), %V (ISO week), %G (ISO week-numbering year), and
|
|
7
|
+
-- %g (two-digit ISO year).
|
|
8
|
+
|
|
9
|
+
-- ============================================================
|
|
10
|
+
-- %W — ISO 8601 week number (already documented)
|
|
11
|
+
-- ============================================================
|
|
12
|
+
|
|
13
|
+
-- 2024-01-01 is a Monday → ISO week 01
|
|
14
|
+
SELECT strftime('%W', '2024-01-01');
|
|
15
|
+
→ ["01"]
|
|
16
|
+
|
|
17
|
+
-- 2024-12-30 is a Monday → ISO week 53? No: 2024 W01 = 2024-01-01..07; 2024-12-30 is W53? Actually 2024 has 52 ISO weeks, week 1 starts on 2024-01-01. 2024-12-30 falls in W01 of 2025.
|
|
18
|
+
SELECT strftime('%W', '2024-12-30');
|
|
19
|
+
→ ["01"]
|
|
20
|
+
|
|
21
|
+
-- ============================================================
|
|
22
|
+
-- %V — ISO 8601 week of year (01-53). Often equal to %W.
|
|
23
|
+
-- ============================================================
|
|
24
|
+
|
|
25
|
+
-- 2024-01-01 (Monday) is ISO week 01
|
|
26
|
+
SELECT strftime('%V', '2024-01-01');
|
|
27
|
+
→ ["01"]
|
|
28
|
+
|
|
29
|
+
-- 2023-01-01 (Sunday) is ISO week 52 of year 2022
|
|
30
|
+
SELECT strftime('%V', '2023-01-01');
|
|
31
|
+
→ ["52"]
|
|
32
|
+
|
|
33
|
+
-- ============================================================
|
|
34
|
+
-- %G — ISO 8601 week-numbering year (4-digit)
|
|
35
|
+
-- ============================================================
|
|
36
|
+
|
|
37
|
+
-- 2023-01-01 is in ISO year 2022
|
|
38
|
+
SELECT strftime('%G', '2023-01-01');
|
|
39
|
+
→ ["2022"]
|
|
40
|
+
|
|
41
|
+
-- 2024-12-30 is in ISO year 2025
|
|
42
|
+
SELECT strftime('%G', '2024-12-30');
|
|
43
|
+
→ ["2025"]
|
|
44
|
+
|
|
45
|
+
-- ============================================================
|
|
46
|
+
-- %g — ISO 8601 week-numbering year (2-digit)
|
|
47
|
+
-- ============================================================
|
|
48
|
+
|
|
49
|
+
-- 2023-01-01 → ISO year 22
|
|
50
|
+
SELECT strftime('%g', '2023-01-01');
|
|
51
|
+
→ ["22"]
|
|
52
|
+
|
|
53
|
+
-- 2024-12-30 → ISO year 25
|
|
54
|
+
SELECT strftime('%g', '2024-12-30');
|
|
55
|
+
→ ["25"]
|
|
56
|
+
|
|
57
|
+
-- ============================================================
|
|
58
|
+
-- %U — Sunday-first week of year (00-53)
|
|
59
|
+
-- Quereus does not implement %U; per docs/datetime.md unsupported
|
|
60
|
+
-- specifiers are output literally.
|
|
61
|
+
-- ============================================================
|
|
62
|
+
|
|
63
|
+
SELECT strftime('%U', '2024-01-01');
|
|
64
|
+
→ ["%U"]
|
|
65
|
+
|
|
66
|
+
SELECT strftime('%U', '2024-01-07');
|
|
67
|
+
→ ["%U"]
|
|
68
|
+
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
-- empty-single-row.sqllogic - Edge-case tests for empty tables, single-row tables, and empty set operations
|
|
2
|
+
|
|
3
|
+
-- =============================================================================
|
|
4
|
+
-- Empty table tests (0 rows)
|
|
5
|
+
-- =============================================================================
|
|
6
|
+
|
|
7
|
+
-- Setup empty table
|
|
8
|
+
create table e (id integer primary key, val text, num integer);
|
|
9
|
+
|
|
10
|
+
-- Setup populated table
|
|
11
|
+
create table p (id integer primary key, val text);
|
|
12
|
+
insert into p values (1, 'p1'), (2, 'p2'), (3, 'p3');
|
|
13
|
+
|
|
14
|
+
-- -----------------------------------------------------------------------------
|
|
15
|
+
-- 1. SELECT from empty table
|
|
16
|
+
-- -----------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
select * from e;
|
|
19
|
+
→ []
|
|
20
|
+
|
|
21
|
+
select * from e where id > 0;
|
|
22
|
+
→ []
|
|
23
|
+
|
|
24
|
+
select id, val from e;
|
|
25
|
+
→ []
|
|
26
|
+
|
|
27
|
+
-- -----------------------------------------------------------------------------
|
|
28
|
+
-- 2. Aggregates over empty table
|
|
29
|
+
-- -----------------------------------------------------------------------------
|
|
30
|
+
|
|
31
|
+
select count(*) from e;
|
|
32
|
+
→ [{"count(*)":0}]
|
|
33
|
+
|
|
34
|
+
select count(val) from e;
|
|
35
|
+
→ [{"count(val)":0}]
|
|
36
|
+
|
|
37
|
+
select sum(num) from e;
|
|
38
|
+
→ [{"sum(num)":null}]
|
|
39
|
+
|
|
40
|
+
select avg(num) from e;
|
|
41
|
+
→ [{"avg(num)":null}]
|
|
42
|
+
|
|
43
|
+
select min(num) from e;
|
|
44
|
+
→ [{"min(num)":null}]
|
|
45
|
+
|
|
46
|
+
select max(num) from e;
|
|
47
|
+
→ [{"max(num)":null}]
|
|
48
|
+
|
|
49
|
+
select group_concat(val, ',') from e;
|
|
50
|
+
→ [{"group_concat(val, ',')":null}]
|
|
51
|
+
|
|
52
|
+
-- Multiple aggregates in one query
|
|
53
|
+
select count(*), sum(num), min(val) from e;
|
|
54
|
+
→ [{"count(*)":0,"sum(num)":null,"min(val)":null}]
|
|
55
|
+
|
|
56
|
+
-- -----------------------------------------------------------------------------
|
|
57
|
+
-- 3. JOINs where one or both sides are empty
|
|
58
|
+
-- -----------------------------------------------------------------------------
|
|
59
|
+
|
|
60
|
+
-- INNER JOIN empty × populated
|
|
61
|
+
select e.id, p.id from e inner join p on e.id = p.id;
|
|
62
|
+
→ []
|
|
63
|
+
|
|
64
|
+
-- INNER JOIN populated × empty
|
|
65
|
+
select p.id, e.id from p inner join e on p.id = e.id;
|
|
66
|
+
→ []
|
|
67
|
+
|
|
68
|
+
-- LEFT JOIN populated × empty — rows with null on right side
|
|
69
|
+
select p.id, p.val, e.id from p left join e on p.id = e.id order by p.id;
|
|
70
|
+
→ [{"id":1,"val":"p1","id:1":null},{"id":2,"val":"p2","id:1":null},{"id":3,"val":"p3","id:1":null}]
|
|
71
|
+
|
|
72
|
+
-- LEFT JOIN empty × populated
|
|
73
|
+
select e.id, p.id from e left join p on e.id = p.id;
|
|
74
|
+
→ []
|
|
75
|
+
|
|
76
|
+
-- CROSS JOIN empty × populated
|
|
77
|
+
select e.id, p.id from e cross join p;
|
|
78
|
+
→ []
|
|
79
|
+
|
|
80
|
+
-- CROSS JOIN populated × empty
|
|
81
|
+
select p.id, e.id from p cross join e;
|
|
82
|
+
→ []
|
|
83
|
+
|
|
84
|
+
-- INNER JOIN empty × empty (self-join)
|
|
85
|
+
select e1.id, e2.id from e e1 inner join e e2 on e1.id = e2.id;
|
|
86
|
+
→ []
|
|
87
|
+
|
|
88
|
+
-- -----------------------------------------------------------------------------
|
|
89
|
+
-- 4. Subqueries returning empty
|
|
90
|
+
-- -----------------------------------------------------------------------------
|
|
91
|
+
|
|
92
|
+
select * from p where id in (select id from e);
|
|
93
|
+
→ []
|
|
94
|
+
|
|
95
|
+
select * from p where exists (select 1 from e);
|
|
96
|
+
→ []
|
|
97
|
+
|
|
98
|
+
select * from p where not exists (select 1 from e) order by id;
|
|
99
|
+
→ [{"id":1,"val":"p1"},{"id":2,"val":"p2"},{"id":3,"val":"p3"}]
|
|
100
|
+
|
|
101
|
+
-- Scalar subquery from empty table
|
|
102
|
+
select (select val from e);
|
|
103
|
+
→ [{"(select val from e)":null}]
|
|
104
|
+
|
|
105
|
+
-- -----------------------------------------------------------------------------
|
|
106
|
+
-- 5. CTE producing 0 rows
|
|
107
|
+
-- -----------------------------------------------------------------------------
|
|
108
|
+
|
|
109
|
+
with empty_cte as (select * from e) select count(*) from empty_cte;
|
|
110
|
+
→ [{"count(*)":0}]
|
|
111
|
+
|
|
112
|
+
-- CTE empty joined with populated table
|
|
113
|
+
with empty_cte as (select * from e) select p.id from empty_cte inner join p on empty_cte.id = p.id;
|
|
114
|
+
→ []
|
|
115
|
+
|
|
116
|
+
-- -----------------------------------------------------------------------------
|
|
117
|
+
-- 6. Set operations with empty side
|
|
118
|
+
-- -----------------------------------------------------------------------------
|
|
119
|
+
|
|
120
|
+
select id from e union select id from p order by id;
|
|
121
|
+
→ [{"id":1},{"id":2},{"id":3}]
|
|
122
|
+
|
|
123
|
+
select id from p union select id from e order by id;
|
|
124
|
+
→ [{"id":1},{"id":2},{"id":3}]
|
|
125
|
+
|
|
126
|
+
select id from e intersect select id from p;
|
|
127
|
+
→ []
|
|
128
|
+
|
|
129
|
+
select id from e except select id from p;
|
|
130
|
+
→ []
|
|
131
|
+
|
|
132
|
+
select id from e union all select id from e;
|
|
133
|
+
→ []
|
|
134
|
+
|
|
135
|
+
-- -----------------------------------------------------------------------------
|
|
136
|
+
-- 7. DML on empty table
|
|
137
|
+
-- -----------------------------------------------------------------------------
|
|
138
|
+
|
|
139
|
+
update e set val = 'x' where id = 1;
|
|
140
|
+
|
|
141
|
+
delete from e where id = 1;
|
|
142
|
+
|
|
143
|
+
-- Verify table still empty after DML
|
|
144
|
+
select count(*) from e;
|
|
145
|
+
→ [{"count(*)":0}]
|
|
146
|
+
|
|
147
|
+
-- -----------------------------------------------------------------------------
|
|
148
|
+
-- 8. INSERT ... SELECT from empty source
|
|
149
|
+
-- -----------------------------------------------------------------------------
|
|
150
|
+
|
|
151
|
+
-- Save row count before
|
|
152
|
+
select count(*) from p;
|
|
153
|
+
→ [{"count(*)":3}]
|
|
154
|
+
|
|
155
|
+
insert into p (id, val) select id, val from e;
|
|
156
|
+
|
|
157
|
+
-- Verify p unchanged
|
|
158
|
+
select count(*) from p;
|
|
159
|
+
→ [{"count(*)":3}]
|
|
160
|
+
|
|
161
|
+
-- -----------------------------------------------------------------------------
|
|
162
|
+
-- 9. Window functions over empty result set
|
|
163
|
+
-- -----------------------------------------------------------------------------
|
|
164
|
+
|
|
165
|
+
select id, row_number() over (order by id) from e;
|
|
166
|
+
→ []
|
|
167
|
+
|
|
168
|
+
select id, sum(num) over () from e;
|
|
169
|
+
→ []
|
|
170
|
+
|
|
171
|
+
-- =============================================================================
|
|
172
|
+
-- Single-row table tests
|
|
173
|
+
-- =============================================================================
|
|
174
|
+
|
|
175
|
+
-- Setup single-row table
|
|
176
|
+
create table s (id integer primary key, val text, num integer);
|
|
177
|
+
insert into s values (1, 'only', 42);
|
|
178
|
+
|
|
179
|
+
-- Setup single-row join partner
|
|
180
|
+
create table s2 (id integer primary key, val text);
|
|
181
|
+
insert into s2 values (1, 'solo');
|
|
182
|
+
|
|
183
|
+
-- -----------------------------------------------------------------------------
|
|
184
|
+
-- 1. All join types with single-row on one or both sides
|
|
185
|
+
-- -----------------------------------------------------------------------------
|
|
186
|
+
|
|
187
|
+
-- INNER JOIN s × s2 with matching condition
|
|
188
|
+
select s.id, s.val, s2.id, s2.val from s inner join s2 on s.id = s2.id;
|
|
189
|
+
→ [{"id":1,"val":"only","id:1":1,"val:1":"solo"}]
|
|
190
|
+
|
|
191
|
+
-- INNER JOIN s × s2 with non-matching condition
|
|
192
|
+
select s.id, s2.id from s inner join s2 on s.id = s2.id + 1;
|
|
193
|
+
→ []
|
|
194
|
+
|
|
195
|
+
-- LEFT JOIN s × s2 matching
|
|
196
|
+
select s.id, s.val, s2.id, s2.val from s left join s2 on s.id = s2.id;
|
|
197
|
+
→ [{"id":1,"val":"only","id:1":1,"val:1":"solo"}]
|
|
198
|
+
|
|
199
|
+
-- LEFT JOIN s × s2 non-matching
|
|
200
|
+
select s.id, s.val, s2.id, s2.val from s left join s2 on s.id = s2.id + 1;
|
|
201
|
+
→ [{"id":1,"val":"only","id:1":null,"val:1":null}]
|
|
202
|
+
|
|
203
|
+
-- CROSS JOIN s × s2
|
|
204
|
+
select s.id, s2.id from s cross join s2;
|
|
205
|
+
→ [{"id":1,"id:1":1}]
|
|
206
|
+
|
|
207
|
+
-- CROSS JOIN single-row × multi-row
|
|
208
|
+
select s.id, p.id from s cross join p order by p.id;
|
|
209
|
+
→ [{"id":1,"id:1":1},{"id":1,"id:1":2},{"id":1,"id:1":3}]
|
|
210
|
+
|
|
211
|
+
-- Join with populated table p on matching key
|
|
212
|
+
select s.id, s.val, p.val from s inner join p on s.id = p.id;
|
|
213
|
+
→ [{"id":1,"val":"only","val:1":"p1"}]
|
|
214
|
+
|
|
215
|
+
-- -----------------------------------------------------------------------------
|
|
216
|
+
-- 2. GROUP BY on single row
|
|
217
|
+
-- -----------------------------------------------------------------------------
|
|
218
|
+
|
|
219
|
+
select val, count(*) from s group by val;
|
|
220
|
+
→ [{"val":"only","count(*)":1}]
|
|
221
|
+
|
|
222
|
+
select val, sum(num) from s group by val;
|
|
223
|
+
→ [{"val":"only","sum(num)":42}]
|
|
224
|
+
|
|
225
|
+
-- GROUP BY with HAVING that matches
|
|
226
|
+
select val, count(*) as cnt from s group by val having cnt = 1;
|
|
227
|
+
→ [{"val":"only","cnt":1}]
|
|
228
|
+
|
|
229
|
+
-- GROUP BY with HAVING that doesn't match
|
|
230
|
+
select val, count(*) as cnt from s group by val having cnt > 1;
|
|
231
|
+
→ []
|
|
232
|
+
|
|
233
|
+
-- -----------------------------------------------------------------------------
|
|
234
|
+
-- 3. Window functions with single-row partition
|
|
235
|
+
-- -----------------------------------------------------------------------------
|
|
236
|
+
|
|
237
|
+
select id, row_number() over (order by id) as rn from s;
|
|
238
|
+
→ [{"id":1,"rn":1}]
|
|
239
|
+
|
|
240
|
+
select id, rank() over (order by id) as rnk from s;
|
|
241
|
+
→ [{"id":1,"rnk":1}]
|
|
242
|
+
|
|
243
|
+
select id, sum(num) over () as total from s;
|
|
244
|
+
→ [{"id":1,"total":42}]
|
|
245
|
+
|
|
246
|
+
-- lag: no previous row
|
|
247
|
+
select id, lag(num) over (order by id) as prev from s;
|
|
248
|
+
→ [{"id":1,"prev":null}]
|
|
249
|
+
|
|
250
|
+
-- lead: no next row
|
|
251
|
+
select id, lead(num) over (order by id) as nxt from s;
|
|
252
|
+
→ [{"id":1,"nxt":null}]
|
|
253
|
+
|
|
254
|
+
-- =============================================================================
|
|
255
|
+
-- Cleanup
|
|
256
|
+
-- =============================================================================
|
|
257
|
+
|
|
258
|
+
drop table e;
|
|
259
|
+
drop table p;
|
|
260
|
+
drop table s;
|
|
261
|
+
drop table s2;
|