@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,414 @@
|
|
|
1
|
+
-- 13.11-unreferenced-dml-cte.sqllogic - an UNREFERENCED data-modifying CTE still runs
|
|
2
|
+
--
|
|
3
|
+
-- A top-level statement's `with` clause naming an `insert`/`update`/`delete` member
|
|
4
|
+
-- performs that member's write exactly once per statement execution, whether or not the
|
|
5
|
+
-- rest of the statement names it — matching SQLite and PostgreSQL, for which the write
|
|
6
|
+
-- is a stated effect of the statement, not an optimization the engine may skip.
|
|
7
|
+
--
|
|
8
|
+
-- Mechanics: `buildBlock` detects a member whose runtime identity (the CTE's
|
|
9
|
+
-- tableDescriptor, memoized per source member in PlanningContext.cteDescriptors) is
|
|
10
|
+
-- absent from the built plan, rebuilds the clause, and sequences a Sink over each such
|
|
11
|
+
-- member AHEAD of the statement (SequenceNode). Effects-first is deliberate: a main
|
|
12
|
+
-- statement abandoned early (limit 0) must not skip the write.
|
|
13
|
+
--
|
|
14
|
+
-- Known divergence from PostgreSQL, accepted and documented in
|
|
15
|
+
-- docs/runtime-caching.md § Shared CTE materialization: because the write runs before
|
|
16
|
+
-- the main statement, the outer query CAN observe it (PostgreSQL's sub-statements never
|
|
17
|
+
-- see one another's effects). Consistent with Quereus's existing behaviour for
|
|
18
|
+
-- referenced members, whose writes the outer query can also observe.
|
|
19
|
+
|
|
20
|
+
-- ===== INSERT body, never referenced =====
|
|
21
|
+
|
|
22
|
+
create table t1 (k integer primary key);
|
|
23
|
+
-- run
|
|
24
|
+
|
|
25
|
+
-- Result shape must survive the sequencing wrapper: `x`, not a synthesized name.
|
|
26
|
+
with c as (insert into t1 (k) values (1) returning k) select 42 as x;
|
|
27
|
+
→ [{"x":42}]
|
|
28
|
+
|
|
29
|
+
select k from t1 order by k;
|
|
30
|
+
→ [{"k":1}]
|
|
31
|
+
|
|
32
|
+
-- ===== UPDATE body, never referenced =====
|
|
33
|
+
|
|
34
|
+
create table t2 (k integer primary key, v integer);
|
|
35
|
+
insert into t2 values (1, 0), (2, 0);
|
|
36
|
+
-- run
|
|
37
|
+
|
|
38
|
+
with c as (update t2 set v = v + 1 returning k) select 42 as x;
|
|
39
|
+
→ [{"x":42}]
|
|
40
|
+
|
|
41
|
+
select k, v from t2 order by k;
|
|
42
|
+
→ [{"k":1,"v":1},{"k":2,"v":1}]
|
|
43
|
+
|
|
44
|
+
-- ===== DELETE body, never referenced =====
|
|
45
|
+
|
|
46
|
+
create table t3 (k integer primary key);
|
|
47
|
+
insert into t3 values (1), (2), (3);
|
|
48
|
+
-- run
|
|
49
|
+
|
|
50
|
+
with c as (delete from t3 where k < 3 returning k) select 42 as x;
|
|
51
|
+
→ [{"x":42}]
|
|
52
|
+
|
|
53
|
+
select k from t3 order by k;
|
|
54
|
+
→ [{"k":3}]
|
|
55
|
+
|
|
56
|
+
-- ===== Unreferenced member under an outer INSERT =====
|
|
57
|
+
-- The write and the outer statement's own write must run sequentially — interleaving
|
|
58
|
+
-- them broke statement-savepoint pairing on a prototype that nested a BlockNode.
|
|
59
|
+
|
|
60
|
+
create table t4a (k integer primary key);
|
|
61
|
+
create table t4b (k integer primary key);
|
|
62
|
+
-- run
|
|
63
|
+
|
|
64
|
+
with c as (insert into t4a (k) values (1) returning k) insert into t4b (k) values (2);
|
|
65
|
+
-- run
|
|
66
|
+
|
|
67
|
+
select k from t4a order by k;
|
|
68
|
+
→ [{"k":1}]
|
|
69
|
+
|
|
70
|
+
select k from t4b order by k;
|
|
71
|
+
→ [{"k":2}]
|
|
72
|
+
|
|
73
|
+
-- ===== Unreferenced member under an outer UPDATE =====
|
|
74
|
+
|
|
75
|
+
create table t5a (k integer primary key);
|
|
76
|
+
create table t5b (k integer primary key, v integer);
|
|
77
|
+
insert into t5b values (1, 0);
|
|
78
|
+
-- run
|
|
79
|
+
|
|
80
|
+
with c as (insert into t5a (k) values (7) returning k) update t5b set v = v + 1;
|
|
81
|
+
-- run
|
|
82
|
+
|
|
83
|
+
select k from t5a order by k;
|
|
84
|
+
→ [{"k":7}]
|
|
85
|
+
|
|
86
|
+
select k, v from t5b order by k;
|
|
87
|
+
→ [{"k":1,"v":1}]
|
|
88
|
+
|
|
89
|
+
-- ===== Unreferenced member under an outer DELETE =====
|
|
90
|
+
|
|
91
|
+
create table t6a (k integer primary key);
|
|
92
|
+
create table t6b (k integer primary key);
|
|
93
|
+
insert into t6b values (1), (2);
|
|
94
|
+
-- run
|
|
95
|
+
|
|
96
|
+
with c as (insert into t6a (k) values (7) returning k) delete from t6b where k = 1;
|
|
97
|
+
-- run
|
|
98
|
+
|
|
99
|
+
select k from t6a order by k;
|
|
100
|
+
→ [{"k":7}]
|
|
101
|
+
|
|
102
|
+
select k from t6b order by k;
|
|
103
|
+
→ [{"k":2}]
|
|
104
|
+
|
|
105
|
+
-- ===== Two unreferenced members in one clause =====
|
|
106
|
+
-- Both write, in clause order, exactly once each.
|
|
107
|
+
|
|
108
|
+
create table t7a (k integer primary key);
|
|
109
|
+
create table t7b (k integer primary key);
|
|
110
|
+
-- run
|
|
111
|
+
|
|
112
|
+
with a as (insert into t7a (k) values (1) returning k),
|
|
113
|
+
b as (insert into t7b (k) values (2) returning k)
|
|
114
|
+
select 42 as x;
|
|
115
|
+
→ [{"x":42}]
|
|
116
|
+
|
|
117
|
+
select k from t7a order by k;
|
|
118
|
+
→ [{"k":1}]
|
|
119
|
+
|
|
120
|
+
select k from t7b order by k;
|
|
121
|
+
→ [{"k":2}]
|
|
122
|
+
|
|
123
|
+
-- ===== One referenced + one unreferenced member =====
|
|
124
|
+
-- Exactly one write each: the sink rebuild shares the referenced member's runtime
|
|
125
|
+
-- identity, so it cannot double the referenced write.
|
|
126
|
+
|
|
127
|
+
create table t8a (k integer primary key);
|
|
128
|
+
create table t8b (k integer primary key);
|
|
129
|
+
-- run
|
|
130
|
+
|
|
131
|
+
with a as (insert into t8a (k) values (1) returning k),
|
|
132
|
+
b as (insert into t8b (k) values (2) returning k)
|
|
133
|
+
select k from a;
|
|
134
|
+
→ [{"k":1}]
|
|
135
|
+
|
|
136
|
+
select k from t8a order by k;
|
|
137
|
+
→ [{"k":1}]
|
|
138
|
+
|
|
139
|
+
select k from t8b order by k;
|
|
140
|
+
→ [{"k":2}]
|
|
141
|
+
|
|
142
|
+
-- ===== An unreferenced writing member reading a referenced sibling =====
|
|
143
|
+
-- The rebuild replays the referenced member's one buffer instead of re-driving its
|
|
144
|
+
-- write: `a` writes once even though the sunk `b` reads it.
|
|
145
|
+
|
|
146
|
+
create table t9a (k integer primary key);
|
|
147
|
+
create table t9b (k integer primary key);
|
|
148
|
+
-- run
|
|
149
|
+
|
|
150
|
+
with a as (insert into t9a (k) values (1) returning k),
|
|
151
|
+
b as (insert into t9b (k) select k + 10 from a returning k)
|
|
152
|
+
select k from a;
|
|
153
|
+
→ [{"k":1}]
|
|
154
|
+
|
|
155
|
+
select k from t9a order by k;
|
|
156
|
+
→ [{"k":1}]
|
|
157
|
+
|
|
158
|
+
select k from t9b order by k;
|
|
159
|
+
→ [{"k":11}]
|
|
160
|
+
|
|
161
|
+
-- ===== Transitively unreferenced: reachable only from another unreferenced member =====
|
|
162
|
+
-- `d` reads `c` but nothing reads `d`; `c`'s write still runs exactly once (the select
|
|
163
|
+
-- member `d` is NOT sunk — only data-modifying members are).
|
|
164
|
+
|
|
165
|
+
create table t10 (k integer primary key);
|
|
166
|
+
-- run
|
|
167
|
+
|
|
168
|
+
with c as (insert into t10 (k) values (1) returning k),
|
|
169
|
+
d as (select k from c)
|
|
170
|
+
select 42 as x;
|
|
171
|
+
→ [{"x":42}]
|
|
172
|
+
|
|
173
|
+
select k from t10 order by k;
|
|
174
|
+
→ [{"k":1}]
|
|
175
|
+
|
|
176
|
+
-- ===== Two unreferenced writing members, second reading the first =====
|
|
177
|
+
-- Sunk in clause order: `c` writes and buffers, `d`'s drive replays that buffer.
|
|
178
|
+
-- One write each.
|
|
179
|
+
|
|
180
|
+
create table t11a (k integer primary key);
|
|
181
|
+
create table t11b (k integer primary key);
|
|
182
|
+
-- run
|
|
183
|
+
|
|
184
|
+
with c as (insert into t11a (k) values (1) returning k),
|
|
185
|
+
d as (insert into t11b (k) select k + 10 from c returning k)
|
|
186
|
+
select 42 as x;
|
|
187
|
+
→ [{"x":42}]
|
|
188
|
+
|
|
189
|
+
select k from t11a order by k;
|
|
190
|
+
→ [{"k":1}]
|
|
191
|
+
|
|
192
|
+
select k from t11b order by k;
|
|
193
|
+
→ [{"k":11}]
|
|
194
|
+
|
|
195
|
+
-- ===== LIMIT 0 on the main statement does NOT skip the write =====
|
|
196
|
+
-- The prelude runs before the main statement, so early abandonment cannot starve it.
|
|
197
|
+
|
|
198
|
+
create table t12 (k integer primary key);
|
|
199
|
+
-- run
|
|
200
|
+
|
|
201
|
+
with c as (insert into t12 (k) values (1) returning k) select 42 as x limit 0;
|
|
202
|
+
→ []
|
|
203
|
+
|
|
204
|
+
select k from t12 order by k;
|
|
205
|
+
→ [{"k":1}]
|
|
206
|
+
|
|
207
|
+
-- ===== The outer statement CAN observe the write (documented divergence) =====
|
|
208
|
+
-- PostgreSQL would answer 1 here (sub-statements never see one another's effects);
|
|
209
|
+
-- Quereus sequences the write first, consistent with its existing visibility for
|
|
210
|
+
-- referenced members. See docs/runtime-caching.md § Shared CTE materialization.
|
|
211
|
+
|
|
212
|
+
create table t13 (k integer primary key);
|
|
213
|
+
insert into t13 values (1);
|
|
214
|
+
-- run
|
|
215
|
+
|
|
216
|
+
with c as (insert into t13 (k) values (2) returning k) select count(*) as n from t13;
|
|
217
|
+
→ [{"n":2}]
|
|
218
|
+
|
|
219
|
+
-- ===== Unreferenced member alongside a VIEW-targeted outer write =====
|
|
220
|
+
-- The view write-through path re-plans the statement (building the clause 2+ times);
|
|
221
|
+
-- the shared runtime identity keeps it to ONE write, and the unreferenced-member scan
|
|
222
|
+
-- keys off that same identity so the member is not double-sunk either.
|
|
223
|
+
|
|
224
|
+
create table t14log (id integer primary key, v text);
|
|
225
|
+
create table t14 (id integer primary key, w text);
|
|
226
|
+
create view vt14 as select id, w from t14;
|
|
227
|
+
-- run
|
|
228
|
+
|
|
229
|
+
with d as (insert into t14log values (1, 'x') returning id)
|
|
230
|
+
insert into vt14 values (5, 'z');
|
|
231
|
+
-- run
|
|
232
|
+
|
|
233
|
+
select id, v from t14log order by id;
|
|
234
|
+
→ [{"id":1,"v":"x"}]
|
|
235
|
+
|
|
236
|
+
select id, w from t14 order by id;
|
|
237
|
+
→ [{"id":5,"w":"z"}]
|
|
238
|
+
|
|
239
|
+
-- Multi-source view target: a join-bodied view decomposes into one base insert per
|
|
240
|
+
-- member, each re-entering the INSERT builder — none of those extra plannings may run
|
|
241
|
+
-- (or sink) the unreferenced member's write again.
|
|
242
|
+
|
|
243
|
+
create table t15log (id integer primary key, v text);
|
|
244
|
+
create table t15a (id integer primary key, a text);
|
|
245
|
+
create table t15b (id integer primary key, b text);
|
|
246
|
+
create view vt15 as select t15a.id as id, t15a.a as a, t15b.b as b
|
|
247
|
+
from t15a join t15b on t15a.id = t15b.id;
|
|
248
|
+
-- run
|
|
249
|
+
|
|
250
|
+
with d as (insert into t15log values (1, 'x') returning id)
|
|
251
|
+
insert into vt15 values (5, 'aa', 'bb');
|
|
252
|
+
-- run
|
|
253
|
+
|
|
254
|
+
select id, v from t15log order by id;
|
|
255
|
+
→ [{"id":1,"v":"x"}]
|
|
256
|
+
|
|
257
|
+
select id, a from t15a order by id;
|
|
258
|
+
→ [{"id":5,"a":"aa"}]
|
|
259
|
+
|
|
260
|
+
select id, b from t15b order by id;
|
|
261
|
+
→ [{"id":5,"b":"bb"}]
|
|
262
|
+
|
|
263
|
+
-- ===== ROLLBACK undoes a sunk write =====
|
|
264
|
+
-- The prelude write goes through the ordinary DML path; nothing about the sink
|
|
265
|
+
-- shields it from transaction rollback.
|
|
266
|
+
|
|
267
|
+
create table t16 (k integer primary key);
|
|
268
|
+
-- run
|
|
269
|
+
|
|
270
|
+
begin;
|
|
271
|
+
-- run
|
|
272
|
+
|
|
273
|
+
with c as (insert into t16 (k) values (1) returning k) select 42 as x;
|
|
274
|
+
→ [{"x":42}]
|
|
275
|
+
|
|
276
|
+
rollback;
|
|
277
|
+
-- run
|
|
278
|
+
|
|
279
|
+
select count(*) as cnt from t16;
|
|
280
|
+
→ [{"cnt":0}]
|
|
281
|
+
|
|
282
|
+
-- ===== Control: an unreferenced SELECT-bodied member is still dropped =====
|
|
283
|
+
-- Only data-modifying members carry an obligation to run; a read-only member nobody
|
|
284
|
+
-- names has no observable effect and stays unplanned.
|
|
285
|
+
|
|
286
|
+
create table t17 (k integer primary key);
|
|
287
|
+
insert into t17 values (1);
|
|
288
|
+
-- run
|
|
289
|
+
|
|
290
|
+
with c as (select k from t17) select 42 as x;
|
|
291
|
+
→ [{"x":42}]
|
|
292
|
+
|
|
293
|
+
-- ===== A compound (UNION ALL) main statement still carries the clause =====
|
|
294
|
+
-- The attach site reads the clause off the TOP statement node; a compound main must not
|
|
295
|
+
-- hide it on an arm.
|
|
296
|
+
|
|
297
|
+
create table t22 (k integer primary key);
|
|
298
|
+
-- run
|
|
299
|
+
|
|
300
|
+
with c as (insert into t22 (k) values (1) returning k)
|
|
301
|
+
select 42 as x union all select 43 as x;
|
|
302
|
+
→ [{"x":42},{"x":43}]
|
|
303
|
+
|
|
304
|
+
select k from t22 order by k;
|
|
305
|
+
→ [{"k":1}]
|
|
306
|
+
|
|
307
|
+
-- ===== A bind parameter inside the unreferenced member's body still binds =====
|
|
308
|
+
-- The member is rebuilt for the sink AFTER the statement is planned; the rebuild must
|
|
309
|
+
-- reach the same parameter, not a second unbound one.
|
|
310
|
+
|
|
311
|
+
create table t18 (k integer primary key);
|
|
312
|
+
-- run
|
|
313
|
+
|
|
314
|
+
-- params: [7]
|
|
315
|
+
with c as (insert into t18 (k) values (?) returning k) select 42 as x;
|
|
316
|
+
→ [{"x":42}]
|
|
317
|
+
|
|
318
|
+
select k from t18 order by k;
|
|
319
|
+
→ [{"k":7}]
|
|
320
|
+
|
|
321
|
+
-- ===== A failing sunk write surfaces its error, it is not swallowed =====
|
|
322
|
+
|
|
323
|
+
create table t19 (k integer primary key);
|
|
324
|
+
insert into t19 values (1);
|
|
325
|
+
-- run
|
|
326
|
+
|
|
327
|
+
with c as (insert into t19 (k) values (1) returning k) select 42 as x;
|
|
328
|
+
-- error: UNIQUE constraint failed
|
|
329
|
+
|
|
330
|
+
select count(*) as cnt from t19;
|
|
331
|
+
→ [{"cnt":1}]
|
|
332
|
+
|
|
333
|
+
-- ===== A failing MAIN statement rolls the prelude write back with it =====
|
|
334
|
+
-- The prelude is part of the statement, not a statement of its own: one statement
|
|
335
|
+
-- savepoint covers both, so a main-statement failure undoes the sunk write.
|
|
336
|
+
|
|
337
|
+
create table t20 (k integer primary key);
|
|
338
|
+
create table t20u (k integer primary key);
|
|
339
|
+
insert into t20u values (1);
|
|
340
|
+
-- run
|
|
341
|
+
|
|
342
|
+
with c as (insert into t20 (k) values (1) returning k) insert into t20u (k) values (1);
|
|
343
|
+
-- error: UNIQUE constraint failed
|
|
344
|
+
|
|
345
|
+
select count(*) as cnt from t20;
|
|
346
|
+
→ [{"cnt":0}]
|
|
347
|
+
|
|
348
|
+
-- ===== The statement's WITH SCHEMA steers the sunk member's write =====
|
|
349
|
+
-- The sink rebuild runs on its own context, which must mirror the statement's schema
|
|
350
|
+
-- path — else the write resolves the bare name against the SESSION path instead.
|
|
351
|
+
|
|
352
|
+
create table main.t21 (k integer primary key);
|
|
353
|
+
create table temp.t21 (k integer primary key);
|
|
354
|
+
pragma schema_path = 'temp';
|
|
355
|
+
-- run
|
|
356
|
+
|
|
357
|
+
with c as (insert into t21 (k) values (1) returning k) select 42 as x with schema main;
|
|
358
|
+
→ [{"x":42}]
|
|
359
|
+
|
|
360
|
+
select count(*) as cnt from main.t21;
|
|
361
|
+
→ [{"cnt":1}]
|
|
362
|
+
|
|
363
|
+
select count(*) as cnt from temp.t21;
|
|
364
|
+
→ [{"cnt":0}]
|
|
365
|
+
|
|
366
|
+
-- Control: with no statement schema path, the SESSION path (temp) takes the write.
|
|
367
|
+
|
|
368
|
+
with c as (insert into t21 (k) values (2) returning k) select 42 as x;
|
|
369
|
+
→ [{"x":42}]
|
|
370
|
+
|
|
371
|
+
select count(*) as cnt from temp.t21;
|
|
372
|
+
→ [{"cnt":1}]
|
|
373
|
+
|
|
374
|
+
pragma schema_path = 'main';
|
|
375
|
+
-- run
|
|
376
|
+
|
|
377
|
+
-- Cleanup
|
|
378
|
+
drop table t1;
|
|
379
|
+
drop table t2;
|
|
380
|
+
drop table t3;
|
|
381
|
+
drop table t4a;
|
|
382
|
+
drop table t4b;
|
|
383
|
+
drop table t5a;
|
|
384
|
+
drop table t5b;
|
|
385
|
+
drop table t6a;
|
|
386
|
+
drop table t6b;
|
|
387
|
+
drop table t7a;
|
|
388
|
+
drop table t7b;
|
|
389
|
+
drop table t8a;
|
|
390
|
+
drop table t8b;
|
|
391
|
+
drop table t9a;
|
|
392
|
+
drop table t9b;
|
|
393
|
+
drop table t10;
|
|
394
|
+
drop table t11a;
|
|
395
|
+
drop table t11b;
|
|
396
|
+
drop table t12;
|
|
397
|
+
drop table t13;
|
|
398
|
+
drop view vt14;
|
|
399
|
+
drop table t14;
|
|
400
|
+
drop table t14log;
|
|
401
|
+
drop view vt15;
|
|
402
|
+
drop table t15a;
|
|
403
|
+
drop table t15b;
|
|
404
|
+
drop table t15log;
|
|
405
|
+
drop table t16;
|
|
406
|
+
drop table t17;
|
|
407
|
+
drop table t18;
|
|
408
|
+
drop table t19;
|
|
409
|
+
drop table t20;
|
|
410
|
+
drop table t20u;
|
|
411
|
+
drop table main.t21;
|
|
412
|
+
drop table temp.t21;
|
|
413
|
+
drop table t22;
|
|
414
|
+
-- run
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
-- 13.12-nested-dml-cte-rejected.sqllogic - a data-modifying `with` member is legal
|
|
2
|
+
-- ONLY in a statement's own leading WITH clause
|
|
3
|
+
--
|
|
4
|
+
-- A member whose body is an `insert` / `update` / `delete` carries a write that must
|
|
5
|
+
-- happen exactly once per statement execution. Only a statement's OWN leading clause has
|
|
6
|
+
-- an owner for that guarantee: `attachUnreferencedDmlCtes` (planner/building/block.ts),
|
|
7
|
+
-- which only ever sees top-level statements. In every other position the write is driven
|
|
8
|
+
-- by whoever happens to reference the member — silently dropped when nothing does,
|
|
9
|
+
-- re-driven on every read when the position is a stored view body, and once for the whole
|
|
10
|
+
-- statement rather than once per outer row when the position is a correlated subquery.
|
|
11
|
+
--
|
|
12
|
+
-- `buildWithClause` (planner/building/with.ts) therefore rejects such a member in any
|
|
13
|
+
-- clause `buildBlock` did not mark as a top-level statement's own. Same rationale (and
|
|
14
|
+
-- same permanent-rejection status) as `planViewBody`'s refusal of a DML view *body*.
|
|
15
|
+
-- PostgreSQL rejects every shape below too.
|
|
16
|
+
--
|
|
17
|
+
-- Coverage below: one case per nesting position, REFERENCED and UNREFERENCED (both must
|
|
18
|
+
-- reject — the unreferenced ones are the reported bug, the referenced ones are a
|
|
19
|
+
-- deliberate narrowing of shapes that used to write). Positive controls at the end pin
|
|
20
|
+
-- that the top-level clause still writes and that read-only nested clauses are untouched.
|
|
21
|
+
|
|
22
|
+
create table t (k integer primary key);
|
|
23
|
+
create table src (k integer primary key);
|
|
24
|
+
create table dst (id integer primary key, v integer);
|
|
25
|
+
insert into dst values (1, 10), (2, 20);
|
|
26
|
+
-- run
|
|
27
|
+
|
|
28
|
+
-- ===== FROM sub-query =====
|
|
29
|
+
-- Unreferenced: the reported bug. This used to return the row and write nothing.
|
|
30
|
+
|
|
31
|
+
select * from (with c as (insert into t (k) values (1) returning k) select 42 as x) z;
|
|
32
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
33
|
+
|
|
34
|
+
-- Referenced: used to write once per statement execution. Narrowed to a rejection so
|
|
35
|
+
-- position, not reachability, decides.
|
|
36
|
+
|
|
37
|
+
select * from (with c as (insert into t (k) values (1) returning k) select k as x from c) z;
|
|
38
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
39
|
+
|
|
40
|
+
-- Nothing was written by either.
|
|
41
|
+
|
|
42
|
+
select count(*) as n from t;
|
|
43
|
+
→ [{"n":0}]
|
|
44
|
+
|
|
45
|
+
-- ===== Scalar sub-query =====
|
|
46
|
+
|
|
47
|
+
select (with c as (insert into t (k) values (1) returning k) select k from c) as x;
|
|
48
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
49
|
+
|
|
50
|
+
select (with c as (insert into t (k) values (1) returning k) select 42) as x;
|
|
51
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
52
|
+
|
|
53
|
+
-- ===== EXISTS sub-query =====
|
|
54
|
+
|
|
55
|
+
select 1 as x where exists (with c as (insert into t (k) values (1) returning k) select k from c);
|
|
56
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
57
|
+
|
|
58
|
+
-- ===== IN sub-query =====
|
|
59
|
+
|
|
60
|
+
select id from dst where id in (with c as (insert into t (k) values (1) returning k) select k from c);
|
|
61
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
62
|
+
|
|
63
|
+
-- ===== A clause nested inside a top-level CTE's body =====
|
|
64
|
+
-- The OUTER clause is the statement's own and would be fine; the inner one is not.
|
|
65
|
+
|
|
66
|
+
with o as (with c as (insert into t (k) values (1) returning k) select k from c)
|
|
67
|
+
select k from o;
|
|
68
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
69
|
+
|
|
70
|
+
-- ===== A compound arm's own clause =====
|
|
71
|
+
-- The attach site reads the clause off the TOP statement node, so an arm's own clause has
|
|
72
|
+
-- no owner even though the compound as a whole is top-level.
|
|
73
|
+
|
|
74
|
+
select 1 as x
|
|
75
|
+
union all
|
|
76
|
+
select x from (with c as (insert into t (k) values (1) returning k) select k as x from c) z;
|
|
77
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
78
|
+
|
|
79
|
+
-- ===== A nested clause feeding an outer INSERT =====
|
|
80
|
+
|
|
81
|
+
insert into t (k) select x from (with c as (insert into src (k) values (1) returning k) select k as x from c) z;
|
|
82
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
83
|
+
|
|
84
|
+
select count(*) as n from src;
|
|
85
|
+
→ [{"n":0}]
|
|
86
|
+
|
|
87
|
+
-- ===== A nested clause in an UPDATE ... WHERE =====
|
|
88
|
+
|
|
89
|
+
update dst set v = 99 where id in (select x from (with c as (insert into src (k) values (1) returning k) select k as x from c) z);
|
|
90
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
91
|
+
|
|
92
|
+
select id, v from dst order by id;
|
|
93
|
+
→ [{"id":1,"v":10},{"id":2,"v":20}]
|
|
94
|
+
|
|
95
|
+
-- ===== A nested clause in a DELETE ... WHERE =====
|
|
96
|
+
|
|
97
|
+
delete from dst where id in (select x from (with c as (insert into src (k) values (1) returning k) select k as x from c) z);
|
|
98
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
99
|
+
|
|
100
|
+
select count(*) as n from dst;
|
|
101
|
+
→ [{"n":2}]
|
|
102
|
+
|
|
103
|
+
-- ===== Stored view body =====
|
|
104
|
+
-- Referenced: this used to CREATE, and then re-drive the write on every read of the view.
|
|
105
|
+
|
|
106
|
+
create view v_dml as with c as (insert into t (k) values (1) returning k) select k as x from c;
|
|
107
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
108
|
+
|
|
109
|
+
-- Unreferenced: this used to create a view that silently wrote nothing.
|
|
110
|
+
|
|
111
|
+
create view v_dml_unref as with c as (insert into t (k) values (1) returning k) select 42 as x;
|
|
112
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
113
|
+
|
|
114
|
+
-- ===== Materialized-view body =====
|
|
115
|
+
-- Replaces a late, confusing "body is non-deterministic (SINK (unreferenced-cte c))".
|
|
116
|
+
|
|
117
|
+
create materialized view mv_dml as with c as (insert into t (k) values (1) returning k) select k as x from c;
|
|
118
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
119
|
+
|
|
120
|
+
create materialized view mv_dml_unref as with c as (insert into t (k) values (1) returning k) select 42 as x;
|
|
121
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
122
|
+
|
|
123
|
+
-- Nothing above wrote anything, and no object was defined.
|
|
124
|
+
|
|
125
|
+
select count(*) as n from t;
|
|
126
|
+
→ [{"n":0}]
|
|
127
|
+
|
|
128
|
+
select count(*) as n from src;
|
|
129
|
+
→ [{"n":0}]
|
|
130
|
+
|
|
131
|
+
-- ===== Maintained-table body =====
|
|
132
|
+
|
|
133
|
+
create table mt_dml (k integer primary key) maintained as with c as (insert into t (k) values (1) returning k) select k from c;
|
|
134
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
135
|
+
|
|
136
|
+
-- ===== Assertion body =====
|
|
137
|
+
-- Wrapped in the create-assertion diagnostic, so match on the inner text.
|
|
138
|
+
|
|
139
|
+
create assertion a_dml check (not exists (with c as (insert into t (k) values (1) returning k) select k from c));
|
|
140
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
141
|
+
|
|
142
|
+
-- No object survived any of the four rejected definitions — the reject fires while the
|
|
143
|
+
-- body is planned, which is before the definition is registered.
|
|
144
|
+
|
|
145
|
+
select count(*) as n from view_info() where name in ('v_dml', 'v_dml_unref', 'mv_dml', 'mv_dml_unref');
|
|
146
|
+
→ [{"n":0}]
|
|
147
|
+
|
|
148
|
+
select count(*) as n from assertion_info() where name = 'a_dml';
|
|
149
|
+
→ [{"n":0}]
|
|
150
|
+
|
|
151
|
+
select k from mt_dml;
|
|
152
|
+
-- error: not found
|
|
153
|
+
|
|
154
|
+
-- ===== `with recursive` in a nested position =====
|
|
155
|
+
-- The `recursive` keyword does not buy a data-modifying member a nested position: a
|
|
156
|
+
-- non-compound DML member is not itself recursive, so it reaches the same gate.
|
|
157
|
+
|
|
158
|
+
select * from (with recursive c as (insert into t (k) values (1) returning k) select k as x from c) z;
|
|
159
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
160
|
+
|
|
161
|
+
-- ===== Two nesting levels =====
|
|
162
|
+
-- The gate is on the clause, not on the position, so depth does not matter: a clause
|
|
163
|
+
-- reached through a read-only nested clause rejects exactly the same.
|
|
164
|
+
|
|
165
|
+
select n from (with z as (select x as k from (with c as (insert into t (k) values (1) returning k) select k as x from c) w) select k as n from z) q;
|
|
166
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
167
|
+
|
|
168
|
+
-- ===== Correlated scalar sub-query =====
|
|
169
|
+
-- The shape `docs/runtime-caching.md` used to list as an open gap: it wrote once for the
|
|
170
|
+
-- whole statement rather than once per outer row, and every outer row saw the first row's
|
|
171
|
+
-- RETURNING set. Now unreachable.
|
|
172
|
+
|
|
173
|
+
insert into src values (7), (8);
|
|
174
|
+
-- run
|
|
175
|
+
|
|
176
|
+
select (select x from (with c as (insert into t (k) values (src.k) returning k) select k as x from c) z) as n from src;
|
|
177
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
178
|
+
|
|
179
|
+
select count(*) as n from t;
|
|
180
|
+
→ [{"n":0}]
|
|
181
|
+
|
|
182
|
+
delete from src;
|
|
183
|
+
-- run
|
|
184
|
+
|
|
185
|
+
-- ===== UPDATE and DELETE bodies reject in a nested position too =====
|
|
186
|
+
|
|
187
|
+
create table upd (k integer primary key, v integer);
|
|
188
|
+
insert into upd values (1, 0);
|
|
189
|
+
-- run
|
|
190
|
+
|
|
191
|
+
select * from (with c as (update upd set v = v + 1 returning k) select 42 as x) z;
|
|
192
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
193
|
+
|
|
194
|
+
select * from (with c as (delete from upd where k = 1 returning k) select 42 as x) z;
|
|
195
|
+
-- error: only allowed in a statement's own leading WITH clause
|
|
196
|
+
|
|
197
|
+
select k, v from upd order by k;
|
|
198
|
+
→ [{"k":1,"v":0}]
|
|
199
|
+
|
|
200
|
+
-- ===== Positive control: the statement's own leading clause still writes =====
|
|
201
|
+
-- Referenced and unreferenced, for INSERT / UPDATE / DELETE — the guarantee 13.11 pins,
|
|
202
|
+
-- re-checked here so the rejection cannot swallow it.
|
|
203
|
+
|
|
204
|
+
with c as (insert into t (k) values (1) returning k) select k as x from c;
|
|
205
|
+
→ [{"x":1}]
|
|
206
|
+
|
|
207
|
+
with c as (insert into t (k) values (2) returning k) select 42 as x;
|
|
208
|
+
→ [{"x":42}]
|
|
209
|
+
|
|
210
|
+
select k from t order by k;
|
|
211
|
+
→ [{"k":1},{"k":2}]
|
|
212
|
+
|
|
213
|
+
with c as (update upd set v = v + 1 returning k) select 42 as x;
|
|
214
|
+
→ [{"x":42}]
|
|
215
|
+
|
|
216
|
+
with c as (delete from upd where k = 1 returning k) select 42 as x;
|
|
217
|
+
→ [{"x":42}]
|
|
218
|
+
|
|
219
|
+
select count(*) as n from upd;
|
|
220
|
+
→ [{"n":0}]
|
|
221
|
+
|
|
222
|
+
-- A leading clause on an outer INSERT / UPDATE / DELETE is equally its own.
|
|
223
|
+
|
|
224
|
+
with c as (insert into src (k) values (5) returning k) insert into t (k) select k + 100 from c;
|
|
225
|
+
-- run
|
|
226
|
+
|
|
227
|
+
select k from src order by k;
|
|
228
|
+
→ [{"k":5}]
|
|
229
|
+
|
|
230
|
+
select k from t order by k;
|
|
231
|
+
→ [{"k":1},{"k":2},{"k":105}]
|
|
232
|
+
|
|
233
|
+
-- ===== Positive control: a READ-ONLY nested clause is untouched =====
|
|
234
|
+
-- Only `isDataModifyingCte` members are rejected; 13.7-cte-sibling-visibility covers this
|
|
235
|
+
-- ground in depth, these pin the exact positions the rejection walks past.
|
|
236
|
+
|
|
237
|
+
select n from (with z as (select 1 as k) select k as n from z) q;
|
|
238
|
+
→ [{"n":1}]
|
|
239
|
+
|
|
240
|
+
select (with z as (select 7 as k) select k from z) as x;
|
|
241
|
+
→ [{"x":7}]
|
|
242
|
+
|
|
243
|
+
select id from dst where id in (with z as (select 1 as k) select k from z);
|
|
244
|
+
→ [{"id":1}]
|
|
245
|
+
|
|
246
|
+
create view v_ro as with z as (select 3 as k) select k as x from z;
|
|
247
|
+
-- run
|
|
248
|
+
|
|
249
|
+
select x from v_ro;
|
|
250
|
+
→ [{"x":3}]
|
|
251
|
+
|
|
252
|
+
-- (a materialized view's body must read a source table, hence `mvsrc` rather than a
|
|
253
|
+
-- literal block — orthogonal to what this file pins.)
|
|
254
|
+
create table mvsrc (k integer primary key);
|
|
255
|
+
insert into mvsrc values (4);
|
|
256
|
+
create materialized view mv_ro as with z as (select k from mvsrc) select k as x from z;
|
|
257
|
+
-- run
|
|
258
|
+
|
|
259
|
+
select x from mv_ro;
|
|
260
|
+
→ [{"x":4}]
|
|
261
|
+
|
|
262
|
+
-- A read-only clause nested inside a DML CTE body in a TOP-LEVEL clause still works:
|
|
263
|
+
-- the outer clause is the statement's own, and the inner one is not data-modifying.
|
|
264
|
+
|
|
265
|
+
with c as (with z as (select 300 as k) insert into src (k) select k from z returning k)
|
|
266
|
+
select k as x from c;
|
|
267
|
+
→ [{"x":300}]
|
|
268
|
+
|
|
269
|
+
select k from src order by k;
|
|
270
|
+
→ [{"k":5},{"k":300}]
|
|
271
|
+
|
|
272
|
+
-- Cleanup
|
|
273
|
+
drop materialized view mv_ro;
|
|
274
|
+
drop view v_ro;
|
|
275
|
+
drop table t;
|
|
276
|
+
drop table src;
|
|
277
|
+
drop table dst;
|
|
278
|
+
drop table upd;
|
|
279
|
+
drop table mvsrc;
|
|
280
|
+
-- run
|