@quereus/quereus 4.20.1 → 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/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,98 @@
|
|
|
1
|
+
-- Testing recursive CTEs with bind parameters in termination conditions
|
|
2
|
+
-- Uses -- params: directive to supply bind parameter values
|
|
3
|
+
|
|
4
|
+
-- Setup: hierarchy table for tree-walking tests
|
|
5
|
+
CREATE TABLE Node (id INTEGER PRIMARY KEY, parent_id INTEGER NULL, name TEXT);
|
|
6
|
+
INSERT INTO Node VALUES
|
|
7
|
+
(1, null, 'Root'),
|
|
8
|
+
(2, 1, 'A'),
|
|
9
|
+
(3, 1, 'B'),
|
|
10
|
+
(4, 2, 'A1'),
|
|
11
|
+
(5, 2, 'A2'),
|
|
12
|
+
(6, 3, 'B1');
|
|
13
|
+
|
|
14
|
+
-- Test 1: Bind parameter in base case seed (WHERE id = ?)
|
|
15
|
+
-- params: [1]
|
|
16
|
+
WITH RECURSIVE tree(id) AS (
|
|
17
|
+
SELECT id FROM Node WHERE id = ?
|
|
18
|
+
UNION ALL
|
|
19
|
+
SELECT N.id FROM Node N JOIN tree T ON N.parent_id = T.id
|
|
20
|
+
)
|
|
21
|
+
SELECT id FROM tree ORDER BY id;
|
|
22
|
+
→ [{"id":1},{"id":2},{"id":3},{"id":4},{"id":5},{"id":6}]
|
|
23
|
+
|
|
24
|
+
-- Test 2: Different seed value via bind parameter
|
|
25
|
+
-- params: [2]
|
|
26
|
+
WITH RECURSIVE tree(id) AS (
|
|
27
|
+
SELECT id FROM Node WHERE id = ?
|
|
28
|
+
UNION ALL
|
|
29
|
+
SELECT N.id FROM Node N JOIN tree T ON N.parent_id = T.id
|
|
30
|
+
)
|
|
31
|
+
SELECT id FROM tree ORDER BY id;
|
|
32
|
+
→ [{"id":2},{"id":4},{"id":5}]
|
|
33
|
+
|
|
34
|
+
-- Test 3: Bind parameter in recursive termination (depth < ?)
|
|
35
|
+
-- params: [2]
|
|
36
|
+
WITH RECURSIVE tree(id, depth) AS (
|
|
37
|
+
SELECT id, 0 FROM Node WHERE parent_id IS NULL
|
|
38
|
+
UNION ALL
|
|
39
|
+
SELECT N.id, T.depth + 1 FROM Node N JOIN tree T ON N.parent_id = T.id
|
|
40
|
+
WHERE T.depth + 1 < ?
|
|
41
|
+
)
|
|
42
|
+
SELECT id, depth FROM tree ORDER BY depth, id;
|
|
43
|
+
→ [{"id":1,"depth":0},{"id":2,"depth":1},{"id":3,"depth":1}]
|
|
44
|
+
|
|
45
|
+
-- Test 4: Bind parameter as exclusion (id != ?)
|
|
46
|
+
-- params: [4]
|
|
47
|
+
WITH RECURSIVE tree(id) AS (
|
|
48
|
+
SELECT id FROM Node WHERE parent_id IS NULL
|
|
49
|
+
UNION ALL
|
|
50
|
+
SELECT N.id FROM Node N JOIN tree T ON N.parent_id = T.id
|
|
51
|
+
WHERE N.id != ?
|
|
52
|
+
)
|
|
53
|
+
SELECT id FROM tree ORDER BY id;
|
|
54
|
+
→ [{"id":1},{"id":2},{"id":3},{"id":5},{"id":6}]
|
|
55
|
+
|
|
56
|
+
-- Test 5: Multiple bind parameters — seed + termination
|
|
57
|
+
-- params: [2, 1]
|
|
58
|
+
WITH RECURSIVE tree(id, depth) AS (
|
|
59
|
+
SELECT id, 0 FROM Node WHERE id = ?
|
|
60
|
+
UNION ALL
|
|
61
|
+
SELECT N.id, T.depth + 1 FROM Node N JOIN tree T ON N.parent_id = T.id
|
|
62
|
+
WHERE T.depth < ?
|
|
63
|
+
)
|
|
64
|
+
SELECT id, depth FROM tree ORDER BY depth, id;
|
|
65
|
+
→ [{"id":2,"depth":0},{"id":4,"depth":1},{"id":5,"depth":1}]
|
|
66
|
+
|
|
67
|
+
-- Test 6: Bind parameter in both seed and exclusion
|
|
68
|
+
-- params: [1, 3]
|
|
69
|
+
WITH RECURSIVE tree(id) AS (
|
|
70
|
+
SELECT id FROM Node WHERE id = ?
|
|
71
|
+
UNION ALL
|
|
72
|
+
SELECT N.id FROM Node N JOIN tree T ON N.parent_id = T.id
|
|
73
|
+
WHERE N.id != ?
|
|
74
|
+
)
|
|
75
|
+
SELECT id FROM tree ORDER BY id;
|
|
76
|
+
→ [{"id":1},{"id":2},{"id":4},{"id":5}]
|
|
77
|
+
|
|
78
|
+
-- Test 7: Simple counting CTE with parameterized limit
|
|
79
|
+
-- params: [4]
|
|
80
|
+
WITH RECURSIVE counter(n) AS (
|
|
81
|
+
SELECT 1
|
|
82
|
+
UNION ALL
|
|
83
|
+
SELECT n + 1 FROM counter WHERE n < ?
|
|
84
|
+
)
|
|
85
|
+
SELECT n FROM counter ORDER BY n;
|
|
86
|
+
→ [{"n":1},{"n":2},{"n":3},{"n":4}]
|
|
87
|
+
|
|
88
|
+
-- Test 8: Parameterized start and limit in counting CTE
|
|
89
|
+
-- params: [10, 13]
|
|
90
|
+
WITH RECURSIVE counter(n) AS (
|
|
91
|
+
SELECT ?
|
|
92
|
+
UNION ALL
|
|
93
|
+
SELECT n + 1 FROM counter WHERE n < ?
|
|
94
|
+
)
|
|
95
|
+
SELECT n FROM counter ORDER BY n;
|
|
96
|
+
→ [{"n":10},{"n":11},{"n":12},{"n":13}]
|
|
97
|
+
|
|
98
|
+
DROP TABLE Node;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
-- cte-edge-cases.sqllogic - CTE edge cases
|
|
2
|
+
|
|
3
|
+
-- Setup
|
|
4
|
+
create table ct (id integer primary key, val text, parent_id integer null);
|
|
5
|
+
insert into ct values (1, 'root', null), (2, 'child1', 1), (3, 'child2', 1), (4, 'leaf', 2);
|
|
6
|
+
|
|
7
|
+
-- ===== CTE referenced multiple times in same query =====
|
|
8
|
+
|
|
9
|
+
with shared as (select id, val from ct where parent_id is not null)
|
|
10
|
+
select a.id, b.id as b_id
|
|
11
|
+
from shared a cross join shared b
|
|
12
|
+
where a.id < b.id
|
|
13
|
+
order by a.id, b.id;
|
|
14
|
+
→ [{"id":2,"b_id":3},{"id":2,"b_id":4},{"id":3,"b_id":4}]
|
|
15
|
+
|
|
16
|
+
-- ===== CTE referencing another CTE =====
|
|
17
|
+
|
|
18
|
+
with
|
|
19
|
+
cte1 as (select id, val from ct where id <= 2),
|
|
20
|
+
cte2 as (select id, val from cte1 where id = 1)
|
|
21
|
+
select * from cte2;
|
|
22
|
+
→ [{"id":1,"val":"root"}]
|
|
23
|
+
|
|
24
|
+
-- ===== CTE chain of 3 =====
|
|
25
|
+
|
|
26
|
+
with
|
|
27
|
+
a as (select id from ct),
|
|
28
|
+
b as (select id from a where id > 1),
|
|
29
|
+
c as (select id from b where id > 2)
|
|
30
|
+
select * from c order by id;
|
|
31
|
+
→ [{"id":3},{"id":4}]
|
|
32
|
+
|
|
33
|
+
-- ===== Recursive CTE: 0 iterations =====
|
|
34
|
+
|
|
35
|
+
-- Base case produces 0 rows, recursion never starts
|
|
36
|
+
with recursive r(n) as (
|
|
37
|
+
select 1 where false
|
|
38
|
+
union all
|
|
39
|
+
select n + 1 from r where n < 5
|
|
40
|
+
)
|
|
41
|
+
select * from r;
|
|
42
|
+
→ []
|
|
43
|
+
|
|
44
|
+
-- ===== Recursive CTE: 1 iteration =====
|
|
45
|
+
|
|
46
|
+
-- Base case produces 1 row, recursive step produces 0
|
|
47
|
+
with recursive r(n) as (
|
|
48
|
+
select 1
|
|
49
|
+
union all
|
|
50
|
+
select n + 1 from r where n < 1
|
|
51
|
+
)
|
|
52
|
+
select * from r;
|
|
53
|
+
→ [{"n":1}]
|
|
54
|
+
|
|
55
|
+
-- ===== CTE with EXISTS check =====
|
|
56
|
+
|
|
57
|
+
-- Existing value
|
|
58
|
+
with data as (select id from ct where val = 'root')
|
|
59
|
+
select exists (select 1 from data) as has_root;
|
|
60
|
+
→ [{"has_root":true}]
|
|
61
|
+
|
|
62
|
+
-- Non-existent value
|
|
63
|
+
with data as (select id from ct where val = 'nonexistent')
|
|
64
|
+
select exists (select 1 from data) as has_it;
|
|
65
|
+
→ [{"has_it":false}]
|
|
66
|
+
|
|
67
|
+
-- ===== CTE used in UPDATE — the leading WITH is now in scope for SET/WHERE =====
|
|
68
|
+
-- UPDATE/DELETE previously ignored the statement's WITH clause, so a CTE read in a
|
|
69
|
+
-- SET value / WHERE subquery failed to resolve ("not found"). The CTE-name DML write
|
|
70
|
+
-- target work threads the statement's CTEs into scope, closing that read gap.
|
|
71
|
+
|
|
72
|
+
create table ct_target (id integer primary key, val text);
|
|
73
|
+
insert into ct_target values (1, 'old');
|
|
74
|
+
-- run
|
|
75
|
+
|
|
76
|
+
with src as (select val from ct where id = 1)
|
|
77
|
+
update ct_target set val = (select val from src) where id = 1;
|
|
78
|
+
-- run
|
|
79
|
+
|
|
80
|
+
-- The CTE read resolved: ct.val where id=1 is 'root'.
|
|
81
|
+
select * from ct_target;
|
|
82
|
+
→ [{"id":1,"val":"root"}]
|
|
83
|
+
|
|
84
|
+
-- ===== CTE used in DELETE — the leading WITH is likewise in scope for the WHERE =====
|
|
85
|
+
|
|
86
|
+
with to_del as (select id from ct_target)
|
|
87
|
+
delete from ct_target where id in (select id from to_del);
|
|
88
|
+
-- run
|
|
89
|
+
|
|
90
|
+
-- The CTE read resolved: every ct_target row whose id is in to_del was deleted.
|
|
91
|
+
select count(*) as cnt from ct_target;
|
|
92
|
+
→ [{"cnt":0}]
|
|
93
|
+
|
|
94
|
+
drop table ct_target;
|
|
95
|
+
-- run
|
|
96
|
+
|
|
97
|
+
-- ===== CTE with set operations =====
|
|
98
|
+
|
|
99
|
+
-- UNION
|
|
100
|
+
with
|
|
101
|
+
a as (select id from ct where id <= 2),
|
|
102
|
+
b as (select id from ct where id >= 2)
|
|
103
|
+
select id from a
|
|
104
|
+
union
|
|
105
|
+
select id from b
|
|
106
|
+
order by id;
|
|
107
|
+
→ [{"id":1},{"id":2},{"id":3},{"id":4}]
|
|
108
|
+
|
|
109
|
+
-- INTERSECT
|
|
110
|
+
with
|
|
111
|
+
a as (select id from ct where id <= 2),
|
|
112
|
+
b as (select id from ct where id >= 2)
|
|
113
|
+
select id from a
|
|
114
|
+
intersect
|
|
115
|
+
select id from b
|
|
116
|
+
order by id;
|
|
117
|
+
→ [{"id":2}]
|
|
118
|
+
|
|
119
|
+
-- Cleanup
|
|
120
|
+
drop table ct;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
-- adapted from SQLite test/with1.test, test/with2.test, test/with3.test, test/with4.test
|
|
2
|
+
-- CTE surface gaps: CTE name shadowing a base table, VALUES as CTE source,
|
|
3
|
+
-- LIMIT applied inside a recursive CTE definition, nested WITH inside a recursive
|
|
4
|
+
-- CTE base case, and CTE used inside a VIEW definition.
|
|
5
|
+
|
|
6
|
+
-- =============================================================================
|
|
7
|
+
-- CTE shadowing a base table of the same name
|
|
8
|
+
-- =============================================================================
|
|
9
|
+
|
|
10
|
+
create table cte_t (id integer primary key, val text);
|
|
11
|
+
insert into cte_t values (1, 'base'), (2, 'base2');
|
|
12
|
+
|
|
13
|
+
-- Inside the WITH scope, the CTE name takes precedence over the base table
|
|
14
|
+
with cte_t as (select 99 as id, 'cte' as val)
|
|
15
|
+
select id, val from cte_t;
|
|
16
|
+
→ [{"id":99,"val":"cte"}]
|
|
17
|
+
|
|
18
|
+
-- Outside the WITH scope, the base table is back
|
|
19
|
+
select id, val from cte_t order by id;
|
|
20
|
+
→ [{"id":1,"val":"base"},{"id":2,"val":"base2"}]
|
|
21
|
+
|
|
22
|
+
drop table cte_t;
|
|
23
|
+
|
|
24
|
+
-- =============================================================================
|
|
25
|
+
-- VALUES clause as direct CTE source — now supported via the orthogonal
|
|
26
|
+
-- QueryExpr surface (ticket: query-expr-ast-parser-unification). Pin the
|
|
27
|
+
-- positive behaviour so a future regression here would surface here, not
|
|
28
|
+
-- only in the new 01.9-query-expr-values suite.
|
|
29
|
+
-- =============================================================================
|
|
30
|
+
|
|
31
|
+
with v(a, b) as (
|
|
32
|
+
values (1, 'x'), (2, 'y'), (3, 'z')
|
|
33
|
+
)
|
|
34
|
+
select a, b from v order by a;
|
|
35
|
+
→ [{"a":1,"b":"x"},{"a":2,"b":"y"},{"a":3,"b":"z"}]
|
|
36
|
+
|
|
37
|
+
-- =============================================================================
|
|
38
|
+
-- LIMIT applied inside a recursive CTE definition
|
|
39
|
+
-- =============================================================================
|
|
40
|
+
|
|
41
|
+
with recursive lim_cnt(n) as (
|
|
42
|
+
select 1
|
|
43
|
+
union all
|
|
44
|
+
select n + 1 from lim_cnt where n < 1000
|
|
45
|
+
limit 5
|
|
46
|
+
)
|
|
47
|
+
select n from lim_cnt order by n;
|
|
48
|
+
→ [{"n":1},{"n":2},{"n":3},{"n":4},{"n":5}]
|
|
49
|
+
|
|
50
|
+
-- LIMIT 0 yields zero rows (no early base-case row leakage)
|
|
51
|
+
with recursive lim_zero(n) as (
|
|
52
|
+
select 1
|
|
53
|
+
union all
|
|
54
|
+
select n + 1 from lim_zero where n < 1000
|
|
55
|
+
limit 0
|
|
56
|
+
)
|
|
57
|
+
select n from lim_zero;
|
|
58
|
+
→ []
|
|
59
|
+
|
|
60
|
+
-- =============================================================================
|
|
61
|
+
-- Nested WITH inside the base case of a recursive CTE — accepted by
|
|
62
|
+
-- parseQueryExpr (the inner WITH attaches to the inner SELECT, then the
|
|
63
|
+
-- recursive UNION ALL leg references the outer CTE name).
|
|
64
|
+
-- =============================================================================
|
|
65
|
+
|
|
66
|
+
with recursive r(n) as (
|
|
67
|
+
with base as (select 1 as start)
|
|
68
|
+
select start from base
|
|
69
|
+
union all
|
|
70
|
+
select n + 1 from r where n < 3
|
|
71
|
+
)
|
|
72
|
+
select n from r order by n;
|
|
73
|
+
→ [{"n":1},{"n":2},{"n":3}]
|
|
74
|
+
|
|
75
|
+
-- =============================================================================
|
|
76
|
+
-- CTE inside a VIEW definition — CREATE VIEW body may begin with a WITH clause.
|
|
77
|
+
-- =============================================================================
|
|
78
|
+
|
|
79
|
+
create table cte_src (id integer primary key, val integer);
|
|
80
|
+
insert into cte_src values (1, 10), (2, 20), (3, 30);
|
|
81
|
+
|
|
82
|
+
create view cte_view as
|
|
83
|
+
with positives as (select id, val from cte_src where val > 15)
|
|
84
|
+
select id, val from positives;
|
|
85
|
+
|
|
86
|
+
select id, val from cte_view order by id;
|
|
87
|
+
→ [{"id":2,"val":20},{"id":3,"val":30}]
|
|
88
|
+
|
|
89
|
+
drop view cte_view;
|
|
90
|
+
drop table cte_src;
|
|
91
|
+
|
|
92
|
+
-- =============================================================================
|
|
93
|
+
-- CTE column count mismatch (declared columns vs SELECT columns)
|
|
94
|
+
-- =============================================================================
|
|
95
|
+
|
|
96
|
+
with bad(a, b) as (select 1)
|
|
97
|
+
select * from bad;
|
|
98
|
+
-- error: declared columns
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
-- 13.5-cte-join-order.sqllogic - a WITH-clause reference must resolve the same
|
|
2
|
+
-- whichever side of a join it appears on
|
|
3
|
+
--
|
|
4
|
+
-- Regression guard for `bug-cte-reference-as-second-join-source-fails-at-runtime`.
|
|
5
|
+
--
|
|
6
|
+
-- Every FROM source gets a scope mapping its column names to plan attribute ids, and
|
|
7
|
+
-- a join combines the two peer scopes with MultiScope (first match wins). Each source
|
|
8
|
+
-- scope used to be built with the *enclosing* query's scope as its fallback parent, so
|
|
9
|
+
-- when MultiScope asked the LEFT peer about a name it did not own, the left peer did
|
|
10
|
+
-- not answer "no" — it forwarded the question to the enclosing scope and answered from
|
|
11
|
+
-- there. The right peer was never consulted.
|
|
12
|
+
--
|
|
13
|
+
-- `createCTEScope` registers a qualified `c.col` symbol for every WITH-clause column in
|
|
14
|
+
-- the enclosing scope, bound to the CTE *body's* attribute ids (not the ids a
|
|
15
|
+
-- CTEReferenceNode republishes). So `… from r join c on c.rid = r.id` resolved `c.rid`
|
|
16
|
+
-- through `r`'s scope → miss → enclosing scope → the body's attribute id, which nothing
|
|
17
|
+
-- below that point publishes, and the query died at runtime with
|
|
18
|
+
-- "No row context found for column rid". The mirrored `from c join r on …` worked only
|
|
19
|
+
-- because there the CTE reference is the left peer and answers first.
|
|
20
|
+
--
|
|
21
|
+
-- Fix: a FROM source's scope holds only its own columns (parented on EmptyScope); the
|
|
22
|
+
-- enclosing-query fallback is composed once by the consumer (ShadowScope).
|
|
23
|
+
--
|
|
24
|
+
-- Invariant pinned here: for each shape, both join orders return the same rows, and the
|
|
25
|
+
-- rows are the correct ones (row data, not just "did not crash").
|
|
26
|
+
|
|
27
|
+
create table r (id integer primary key, qty integer, label text);
|
|
28
|
+
insert into r values (1, 10, 'a'), (2, 20, 'b'), (3, 30, 'c');
|
|
29
|
+
|
|
30
|
+
create table o (oid integer primary key, rid integer, cat text, qty integer);
|
|
31
|
+
insert into o values (100, 1, 'x', 10), (101, 2, 'y', 20), (102, 2, 'z', 99), (103, 9, 'w', 5);
|
|
32
|
+
|
|
33
|
+
create table s (k text primary key, note text);
|
|
34
|
+
insert into s values ('x', 'X'), ('y', 'Y');
|
|
35
|
+
|
|
36
|
+
-- =============================================================================
|
|
37
|
+
-- The reported shape: WITH clause as the SECOND (right) join source. Before the
|
|
38
|
+
-- fix this threw "No row context found for column rid"; the mirrored order below
|
|
39
|
+
-- always worked, so the two must agree.
|
|
40
|
+
-- =============================================================================
|
|
41
|
+
|
|
42
|
+
with c as (select cat, qty, rid from o)
|
|
43
|
+
select count(*) as n from r join c on c.rid = r.id;
|
|
44
|
+
→ [{"n":3}]
|
|
45
|
+
|
|
46
|
+
with c as (select cat, qty, rid from o)
|
|
47
|
+
select count(*) as n from c join r on c.rid = r.id;
|
|
48
|
+
→ [{"n":3}]
|
|
49
|
+
|
|
50
|
+
-- Same shapes projecting real columns, so a wrong-rows regression is caught too.
|
|
51
|
+
|
|
52
|
+
with c as (select cat, qty, rid from o)
|
|
53
|
+
select r.id, c.cat from r join c on c.rid = r.id order by r.id, c.cat;
|
|
54
|
+
→ [{"id":1,"cat":"x"},{"id":2,"cat":"y"},{"id":2,"cat":"z"}]
|
|
55
|
+
|
|
56
|
+
with c as (select cat, qty, rid from o)
|
|
57
|
+
select r.id, c.cat from c join r on c.rid = r.id order by r.id, c.cat;
|
|
58
|
+
→ [{"id":1,"cat":"x"},{"id":2,"cat":"y"},{"id":2,"cat":"z"}]
|
|
59
|
+
|
|
60
|
+
-- =============================================================================
|
|
61
|
+
-- Operand-swapped ON condition — `c.rid` is looked up second rather than first.
|
|
62
|
+
-- =============================================================================
|
|
63
|
+
|
|
64
|
+
with c as (select cat, qty, rid from o)
|
|
65
|
+
select r.id, c.cat from r join c on r.id = c.rid order by r.id, c.cat;
|
|
66
|
+
→ [{"id":1,"cat":"x"},{"id":2,"cat":"y"},{"id":2,"cat":"z"}]
|
|
67
|
+
|
|
68
|
+
-- =============================================================================
|
|
69
|
+
-- Non-key join column: the join cannot be answered by a primary-key seek, so a
|
|
70
|
+
-- different access path carries the same column reference.
|
|
71
|
+
-- =============================================================================
|
|
72
|
+
|
|
73
|
+
with c as (select cat, qty, rid from o)
|
|
74
|
+
select r.id, c.cat from r join c on c.qty = r.qty order by r.id, c.cat;
|
|
75
|
+
→ [{"id":1,"cat":"x"},{"id":2,"cat":"y"}]
|
|
76
|
+
|
|
77
|
+
with c as (select cat, qty, rid from o)
|
|
78
|
+
select r.id, c.cat from c join r on c.qty = r.qty order by r.id, c.cat;
|
|
79
|
+
→ [{"id":1,"cat":"x"},{"id":2,"cat":"y"}]
|
|
80
|
+
|
|
81
|
+
-- =============================================================================
|
|
82
|
+
-- LEFT JOIN with the WITH clause second — the null-extended side is the CTE.
|
|
83
|
+
-- =============================================================================
|
|
84
|
+
|
|
85
|
+
with c as (select cat, qty, rid from o)
|
|
86
|
+
select r.id, c.cat from r left join c on c.rid = r.id order by r.id, c.cat;
|
|
87
|
+
→ [{"id":1,"cat":"x"},{"id":2,"cat":"y"},{"id":2,"cat":"z"},{"id":3,"cat":null}]
|
|
88
|
+
|
|
89
|
+
-- =============================================================================
|
|
90
|
+
-- Three-way join with the WITH clause in the MIDDLE: `(r join c) join s`. The
|
|
91
|
+
-- left peer of the outer join is itself a join, so its scope is a nested
|
|
92
|
+
-- MultiScope — the fall-through has to work through two levels.
|
|
93
|
+
-- =============================================================================
|
|
94
|
+
|
|
95
|
+
with c as (select cat, qty, rid from o)
|
|
96
|
+
select count(*) as n from r join c on c.rid = r.id join s on s.k = c.cat;
|
|
97
|
+
→ [{"n":2}]
|
|
98
|
+
|
|
99
|
+
with c as (select cat, qty, rid from o)
|
|
100
|
+
select r.id, c.cat, s.note from r join c on c.rid = r.id join s on s.k = c.cat
|
|
101
|
+
order by r.id, c.cat;
|
|
102
|
+
→ [{"id":1,"cat":"x","note":"X"},{"id":2,"cat":"y","note":"Y"}]
|
|
103
|
+
|
|
104
|
+
-- =============================================================================
|
|
105
|
+
-- The aliased spelling passed before the fix (the enclosing scope registers
|
|
106
|
+
-- `c.rid`, not `x.rid`, so the leak had nothing to hand back). Pinned so the fix
|
|
107
|
+
-- does not regress the shape that already worked.
|
|
108
|
+
-- =============================================================================
|
|
109
|
+
|
|
110
|
+
with c as (select cat, qty, rid from o)
|
|
111
|
+
select r.id, x.cat from r join c as x on x.rid = r.id order by r.id, x.cat;
|
|
112
|
+
→ [{"id":1,"cat":"x"},{"id":2,"cat":"y"},{"id":2,"cat":"z"}]
|
|
113
|
+
|
|
114
|
+
-- =============================================================================
|
|
115
|
+
-- Naming a WITH-clause column without the CTE in FROM is a plain unresolved-column
|
|
116
|
+
-- error, not a confusing runtime row-context failure. (Before the fix, the stale
|
|
117
|
+
-- `c.cat → CTE body attribute id` registration in the enclosing scope made this
|
|
118
|
+
-- resolve to an id nothing publishes.)
|
|
119
|
+
-- =============================================================================
|
|
120
|
+
|
|
121
|
+
with c as (select cat, qty, rid from o)
|
|
122
|
+
select c.cat from r;
|
|
123
|
+
-- error: c.cat
|
|
124
|
+
|
|
125
|
+
-- =============================================================================
|
|
126
|
+
-- The shapes that ONLY the deleted registration could plausibly have served: a
|
|
127
|
+
-- `cteName.column` reference from somewhere other than the CTE's own SELECT list.
|
|
128
|
+
-- Each one names the CTE in a FROM, so it resolves through the reference's own
|
|
129
|
+
-- republished attribute ids — the ids that actually reach the runtime.
|
|
130
|
+
-- =============================================================================
|
|
131
|
+
|
|
132
|
+
-- CTE column read from a nested subquery, with the CTE in the OUTER from.
|
|
133
|
+
|
|
134
|
+
with c as (select rid, cat from o)
|
|
135
|
+
select c.rid, (select count(*) from r where r.id = c.rid) as n from c order by c.rid, c.cat;
|
|
136
|
+
→ [{"rid":1,"n":1},{"rid":2,"n":1},{"rid":2,"n":1},{"rid":9,"n":0}]
|
|
137
|
+
|
|
138
|
+
-- CTE in an UPDATE's WHERE subquery.
|
|
139
|
+
|
|
140
|
+
with c as (select rid from o where cat = 'x')
|
|
141
|
+
update r set label = 'hit' where id in (select c.rid from c);
|
|
142
|
+
select id, label from r order by id;
|
|
143
|
+
→ [{"id":1,"label":"hit"},{"id":2,"label":"b"},{"id":3,"label":"c"}]
|
|
144
|
+
|
|
145
|
+
-- CTE in an UPDATE's SET subquery, correlated to the update target.
|
|
146
|
+
|
|
147
|
+
with c as (select rid, cat from o where cat <> 'z')
|
|
148
|
+
update r set label = coalesce((select c.cat from c where c.rid = r.id), label);
|
|
149
|
+
select id, label from r order by id;
|
|
150
|
+
→ [{"id":1,"label":"x"},{"id":2,"label":"y"},{"id":3,"label":"c"}]
|
|
151
|
+
|
|
152
|
+
-- CTE in a DELETE's WHERE subquery, with RETURNING.
|
|
153
|
+
|
|
154
|
+
with c as (select rid from o where cat = 'y')
|
|
155
|
+
delete from r where id in (select c.rid from c) returning id, label;
|
|
156
|
+
→ [{"id":2,"label":"y"}]
|
|
157
|
+
|
|
158
|
+
-- CTE read from an UPDATE's RETURNING clause.
|
|
159
|
+
|
|
160
|
+
with c as (select rid from o)
|
|
161
|
+
update r set qty = qty + 1 returning id, (select count(*) from c) as total;
|
|
162
|
+
→ [{"id":1,"total":4},{"id":3,"total":4}]
|
|
163
|
+
|
|
164
|
+
drop table s;
|
|
165
|
+
drop table o;
|
|
166
|
+
drop table r;
|