@quereus/quereus 4.20.0 → 4.20.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/src/common/types.d.ts +4 -4
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/schema/catalog-rendering.js +13 -1
- package/dist/src/schema/catalog-rendering.js.map +1 -1
- package/dist/src/schema/catalog.d.ts +35 -2
- package/dist/src/schema/catalog.d.ts.map +1 -1
- package/dist/src/schema/catalog.js +42 -33
- package/dist/src/schema/catalog.js.map +1 -1
- package/dist/src/schema/schema-differ.d.ts +1 -1
- package/dist/src/schema/schema-differ.d.ts.map +1 -1
- package/dist/src/schema/schema-differ.js +195 -33
- package/dist/src/schema/schema-differ.js.map +1 -1
- package/dist/src/schema/unique-enforcement.d.ts +23 -1
- package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
- package/dist/src/schema/unique-enforcement.js +43 -1
- package/dist/src/schema/unique-enforcement.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +15 -12
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +87 -100
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/package.json +7 -4
- package/test/README.md +173 -0
- package/test/logic/01-basic.sqllogic +39 -0
- package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
- package/test/logic/01.2-strings.sqllogic +43 -0
- package/test/logic/01.5-insert-select.sqllogic +237 -0
- package/test/logic/01.6-update-extras.sqllogic +118 -0
- package/test/logic/01.7-update-from.sqllogic +67 -0
- package/test/logic/01.8-delete-extras.sqllogic +122 -0
- package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
- package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
- package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
- package/test/logic/01.9-query-expr-values.sqllogic +111 -0
- package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
- package/test/logic/02-filters.sqllogic +54 -0
- package/test/logic/02-smoke.sqllogic +62 -0
- package/test/logic/02.1-bind-parameters.sqllogic +223 -0
- package/test/logic/03-expressions.sqllogic +190 -0
- package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
- package/test/logic/03.4-defaults.sqllogic +554 -0
- package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
- package/test/logic/03.5-tvf.sqllogic +61 -0
- package/test/logic/03.6-type-system.sqllogic +544 -0
- package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
- package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
- package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
- package/test/logic/03.8-not-precedence.sqllogic +255 -0
- package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
- package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
- package/test/logic/04-order-by.sqllogic +38 -0
- package/test/logic/04-transactions.sqllogic +239 -0
- package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
- package/test/logic/05-vtab_memory.sqllogic +50 -0
- package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
- package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
- package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
- package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
- package/test/logic/06-builtin_functions.sqllogic +149 -0
- package/test/logic/06.1-string-functions.sqllogic +92 -0
- package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
- package/test/logic/06.2-math-functions.sqllogic +82 -0
- package/test/logic/06.3-schema.sqllogic +48 -0
- package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
- package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
- package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
- package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
- package/test/logic/06.3.4-view-info.sqllogic +378 -0
- package/test/logic/06.3.5-column-info.sqllogic +347 -0
- package/test/logic/06.3.6-schema-views.sqllogic +29 -0
- package/test/logic/06.4-schema-search-path.sqllogic +354 -0
- package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
- package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
- package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
- package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
- package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
- package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
- package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
- package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
- package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
- package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
- package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
- package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
- package/test/logic/06.7-json-extended.sqllogic +53 -0
- package/test/logic/06.8-json-path-operators.sqllogic +99 -0
- package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
- package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
- package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
- package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
- package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
- package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
- package/test/logic/07-aggregates.sqllogic +193 -0
- package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
- package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
- package/test/logic/07.3-group-by-extras.sqllogic +602 -0
- package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
- package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
- package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
- package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
- package/test/logic/07.5-window.sqllogic +1941 -0
- package/test/logic/07.5.1-window-named.sqllogic +13 -0
- package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
- package/test/logic/07.6-subqueries.sqllogic +78 -0
- package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
- package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
- package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
- package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
- package/test/logic/07.7.1-in-extras.sqllogic +158 -0
- package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
- package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
- package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
- package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
- package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
- package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
- package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
- package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
- package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
- package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
- package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
- package/test/logic/07.9-in-value-list.sqllogic +154 -0
- package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
- package/test/logic/08-views.sqllogic +64 -0
- package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
- package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
- package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
- package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
- package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
- package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
- package/test/logic/09-set_operations.sqllogic +244 -0
- package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
- package/test/logic/10-distinct_datatypes.sqllogic +127 -0
- package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
- package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
- package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
- package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
- package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
- package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
- package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
- package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
- package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
- package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
- package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
- package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
- package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
- package/test/logic/10.2-column-features.sqllogic +365 -0
- package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
- package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
- package/test/logic/10.3-function-features.sqllogic +247 -0
- package/test/logic/10.4-schema-scale.sqllogic +168 -0
- package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
- package/test/logic/10.5-indexes.sqllogic +164 -0
- package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
- package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
- package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
- package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
- package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
- package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
- package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
- package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
- package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
- package/test/logic/100.1-where-extras.sqllogic +163 -0
- package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
- package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
- package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
- package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
- package/test/logic/102-unique-constraints.sqllogic +145 -0
- package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
- package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
- package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
- package/test/logic/102.2-unique-collation.sqllogic +181 -0
- package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
- package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
- package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
- package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
- package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
- package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
- package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
- package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
- package/test/logic/108-cardinality-estimation.sqllogic +146 -0
- package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
- package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
- package/test/logic/11-joins.sqllogic +86 -0
- package/test/logic/11.1-join-using.sqllogic +267 -0
- package/test/logic/11.2-comma-join.sqllogic +35 -0
- package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
- package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
- package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
- package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
- package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
- package/test/logic/12-empty-primary-key.sqllogic +124 -0
- package/test/logic/12-join_padding_order.sqllogic +58 -0
- package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
- package/test/logic/13-cte.sqllogic +137 -0
- package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
- package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
- package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
- package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
- package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
- package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
- package/test/logic/13.4-cte-extras.sqllogic +98 -0
- package/test/logic/13.5-cte-join-order.sqllogic +166 -0
- package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
- package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
- package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
- package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
- package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
- package/test/logic/14-utilities.sqllogic +168 -0
- package/test/logic/15-timespan.sqllogic +279 -0
- package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
- package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
- package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
- package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
- package/test/logic/16-epoch.sqllogic +187 -0
- package/test/logic/17-weekday-modifier.sqllogic +78 -0
- package/test/logic/18-json-string-escapes.sqllogic +86 -0
- package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
- package/test/logic/20-empty-single-row.sqllogic +261 -0
- package/test/logic/21-null-edge-cases.sqllogic +227 -0
- package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
- package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
- package/test/logic/21.2-between-edges.sqllogic +157 -0
- package/test/logic/22-boundary-values.sqllogic +175 -0
- package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
- package/test/logic/24-builtin-branches.sqllogic +611 -0
- package/test/logic/24.1-substr-extras.sqllogic +75 -0
- package/test/logic/24.2-random-extras.sqllogic +39 -0
- package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
- package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
- package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
- package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
- package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
- package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
- package/test/logic/26-join-edge-cases.sqllogic +333 -0
- package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
- package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
- package/test/logic/26.3-join-on-constants.sqllogic +61 -0
- package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
- package/test/logic/27-window-edge-cases.sqllogic +206 -0
- package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
- package/test/logic/27.2-window-exclude.sqllogic +13 -0
- package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
- package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
- package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
- package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
- package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
- package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
- package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
- package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
- package/test/logic/40-constraints.sqllogic +418 -0
- package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
- package/test/logic/40.2-check-extras.sqllogic +683 -0
- package/test/logic/41-alter-table.sqllogic +191 -0
- package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
- package/test/logic/41-fk-cross-schema.sqllogic +155 -0
- package/test/logic/41-fk-extended-targets.sqllogic +173 -0
- package/test/logic/41-foreign-keys.sqllogic +1001 -0
- package/test/logic/41-generated-column-errors.sqllogic +225 -0
- package/test/logic/41-generated-column-extras.sqllogic +598 -0
- package/test/logic/41-generated-column-scope.sqllogic +329 -0
- package/test/logic/41-generated-columns.sqllogic +361 -0
- package/test/logic/41.1-alter-pk.sqllogic +230 -0
- package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
- package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
- package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
- package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
- package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
- package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
- package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
- package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
- package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
- package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
- package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
- package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
- package/test/logic/41.2-alter-column.sqllogic +382 -0
- package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
- package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
- package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
- package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
- package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
- package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
- package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
- package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
- package/test/logic/41.5-alter-misc.sqllogic +48 -0
- package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
- package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
- package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
- package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
- package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
- package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
- package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
- package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
- package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
- package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
- package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
- package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
- package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
- package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
- package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
- package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
- package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
- package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
- package/test/logic/42-committed-snapshot.sqllogic +254 -0
- package/test/logic/42-returning.sqllogic +159 -0
- package/test/logic/42.1-returning-extras.sqllogic +232 -0
- package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
- package/test/logic/43-default-nullability.sqllogic +131 -0
- package/test/logic/43-transition-constraints.sqllogic +341 -0
- package/test/logic/43.1-default-collation.sqllogic +140 -0
- package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
- package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
- package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
- package/test/logic/44-determinism-validation.sqllogic +164 -0
- package/test/logic/44-orthogonality.sqllogic +146 -0
- package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
- package/test/logic/45-udf-determinism.sqllogic +39 -0
- package/test/logic/46-mutation-context.sqllogic +595 -0
- package/test/logic/47-upsert.sqllogic +255 -0
- package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
- package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
- package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
- package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
- package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
- package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
- package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
- package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
- package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
- package/test/logic/49-reference-graph.sqllogic +84 -0
- package/test/logic/50-declarative-schema.sqllogic +2550 -0
- package/test/logic/50-metadata-tags.sqllogic +1033 -0
- package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
- package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
- package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
- package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +173 -0
- package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
- package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
- package/test/logic/51-lens-foundation.sqllogic +147 -0
- package/test/logic/51-materialized-views.sqllogic +376 -0
- package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
- package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
- package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
- package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
- package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
- package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
- package/test/logic/52-lens-overrides.sqllogic +566 -0
- package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
- package/test/logic/53-reserved-tags.sqllogic +252 -0
- package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
- package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
- package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
- package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
- package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
- package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
- package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
- package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
- package/test/logic/55-lens-prover.sqllogic +202 -0
- package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
- package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
- package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
- package/test/logic/81-quickpick.sqllogic +24 -0
- package/test/logic/82-bloom-join.sqllogic +185 -0
- package/test/logic/83-merge-join.sqllogic +280 -0
- package/test/logic/84-asof-scan.sqllogic +238 -0
- package/test/logic/84-key-cardinality.sqllogic +50 -0
- package/test/logic/85-relational-const-folding.sqllogic +51 -0
- package/test/logic/86-scalar-cse.sqllogic +42 -0
- package/test/logic/90-error_paths.sqllogic +114 -0
- package/test/logic/90.1-parse-errors.sqllogic +77 -0
- package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
- package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
- package/test/logic/90.3-expression-errors.sqllogic +43 -0
- package/test/logic/90.4-dml-errors.sqllogic +47 -0
- package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
- package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
- package/test/logic/90.6-select-error-paths.sqllogic +57 -0
- package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
- package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
- package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
- package/test/logic/93.1-view-error-paths.sqllogic +74 -0
- package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
- package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
- package/test/logic/93.4-view-mutation.sqllogic +4881 -0
- package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
- package/test/logic/93.5-authored-inverse.sqllogic +415 -0
- package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
- package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
- package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
- package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
- package/test/logic/95-assertions.sqllogic +1417 -0
- package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
- package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
- package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
- package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
- package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
- package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
- package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
- package/test/logic/drop-unique-index.sqllogic +88 -0
- package/test/logic/pushdown-test.sqllogic +36 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
-- cte.sqllogic - Testing Common Table Expressions (WITH clause)
|
|
2
|
+
|
|
3
|
+
-- Simple non-recursive CTE
|
|
4
|
+
CREATE TABLE base_t (id INTEGER PRIMARY KEY, name TEXT);
|
|
5
|
+
INSERT INTO base_t VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie');
|
|
6
|
+
|
|
7
|
+
WITH name_cte AS (
|
|
8
|
+
SELECT name FROM base_t WHERE id > 1
|
|
9
|
+
)
|
|
10
|
+
SELECT * FROM name_cte ORDER BY name;
|
|
11
|
+
→ [{"name":"Bob"},{"name":"Charlie"}]
|
|
12
|
+
|
|
13
|
+
-- Multiple CTEs
|
|
14
|
+
WITH
|
|
15
|
+
cte1 AS (SELECT id, name FROM base_t WHERE id = 1),
|
|
16
|
+
cte2 AS (SELECT id, name FROM base_t WHERE id = 2)
|
|
17
|
+
SELECT * FROM cte1 UNION ALL SELECT * FROM cte2 ORDER BY id;
|
|
18
|
+
→ [{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]
|
|
19
|
+
|
|
20
|
+
-- CTE used in INSERT
|
|
21
|
+
CREATE TABLE target_t (id INTEGER, name_upper TEXT);
|
|
22
|
+
WITH source_cte AS (
|
|
23
|
+
SELECT id, upper(name) as upper_name FROM base_t WHERE id = 3
|
|
24
|
+
)
|
|
25
|
+
INSERT INTO target_t (id, name_upper) SELECT id, upper_name FROM source_cte;
|
|
26
|
+
SELECT * FROM target_t;
|
|
27
|
+
→ [{"id":3,"name_upper":"CHARLIE"}]
|
|
28
|
+
DROP TABLE target_t;
|
|
29
|
+
|
|
30
|
+
-- Basic Recursive CTE (Counting)
|
|
31
|
+
WITH RECURSIVE counter(n) AS (
|
|
32
|
+
SELECT 1
|
|
33
|
+
UNION ALL
|
|
34
|
+
SELECT n + 1 FROM counter WHERE n < 5
|
|
35
|
+
)
|
|
36
|
+
SELECT n FROM counter ORDER BY n;
|
|
37
|
+
→ [{"n":1},{"n":2},{"n":3},{"n":4},{"n":5}]
|
|
38
|
+
|
|
39
|
+
-- Recursive CTE with base table (e.g., simple hierarchy/path)
|
|
40
|
+
CREATE TABLE hierarchy (id INTEGER PRIMARY KEY, parent_id INTEGER NULL, name TEXT);
|
|
41
|
+
INSERT INTO hierarchy VALUES (1, null, 'Root'), (2, 1, 'Child A'), (3, 1, 'Child B'), (4, 2, 'Grandchild A1');
|
|
42
|
+
|
|
43
|
+
WITH RECURSIVE path_cte(id, name, level) AS (
|
|
44
|
+
SELECT id, name, 0 FROM hierarchy WHERE parent_id IS NULL
|
|
45
|
+
UNION ALL
|
|
46
|
+
SELECT h.id, p.name || ' -> ' || h.name, p.level + 1
|
|
47
|
+
FROM hierarchy h JOIN path_cte p ON h.parent_id = p.id
|
|
48
|
+
)
|
|
49
|
+
SELECT name, level FROM path_cte ORDER BY level, name;
|
|
50
|
+
→ [{"name":"Root","level":0},{"name":"Root -> Child A","level":1},{"name":"Root -> Child B","level":1},{"name":"Root -> Child A -> Grandchild A1","level":2}]
|
|
51
|
+
|
|
52
|
+
-- Recursive CTE with aliased table in JOIN and qualified SELECT
|
|
53
|
+
-- Bug reproduction: "Table 'E' not found in FROM clause for qualified SELECT *"
|
|
54
|
+
CREATE TABLE Entity (id INTEGER PRIMARY KEY, component_id INTEGER NULL, type TEXT);
|
|
55
|
+
INSERT INTO Entity VALUES (1, null, 'c'), (2, 1, 'c'), (3, 1, 'c'), (4, 2, 'c'), (5, 3, 'x');
|
|
56
|
+
|
|
57
|
+
-- Test 1: Qualified column reference E.id in recursive part
|
|
58
|
+
WITH RECURSIVE descendants(id) AS (
|
|
59
|
+
SELECT 1
|
|
60
|
+
UNION ALL
|
|
61
|
+
SELECT E.id FROM Entity E
|
|
62
|
+
JOIN descendants D ON E.component_id = D.id
|
|
63
|
+
WHERE E.type = 'c'
|
|
64
|
+
)
|
|
65
|
+
SELECT id FROM descendants ORDER BY id;
|
|
66
|
+
→ [{"id":1},{"id":2},{"id":3},{"id":4}]
|
|
67
|
+
|
|
68
|
+
-- Test 2: SELECT * from recursive CTE with qualified column in recursive part
|
|
69
|
+
WITH RECURSIVE descendants(id) AS (
|
|
70
|
+
SELECT 1
|
|
71
|
+
UNION ALL
|
|
72
|
+
SELECT E.id FROM Entity E
|
|
73
|
+
JOIN descendants D ON E.component_id = D.id
|
|
74
|
+
WHERE E.type = 'c'
|
|
75
|
+
)
|
|
76
|
+
SELECT * FROM descendants ORDER BY id;
|
|
77
|
+
→ [{"id":1},{"id":2},{"id":3},{"id":4}]
|
|
78
|
+
|
|
79
|
+
-- Test 3: E.* in recursive part (qualified SELECT *)
|
|
80
|
+
WITH RECURSIVE descendants(id, component_id, type) AS (
|
|
81
|
+
SELECT id, component_id, type FROM Entity WHERE id = 1
|
|
82
|
+
UNION ALL
|
|
83
|
+
SELECT E.* FROM Entity E
|
|
84
|
+
JOIN descendants D ON E.component_id = D.id
|
|
85
|
+
WHERE E.type = 'c'
|
|
86
|
+
)
|
|
87
|
+
SELECT id FROM descendants ORDER BY id;
|
|
88
|
+
→ [{"id":1},{"id":2},{"id":3},{"id":4}]
|
|
89
|
+
|
|
90
|
+
-- Test 4: D.* (CTE alias) in recursive part
|
|
91
|
+
WITH RECURSIVE descendants(id) AS (
|
|
92
|
+
SELECT 1
|
|
93
|
+
UNION ALL
|
|
94
|
+
SELECT E.id FROM Entity E
|
|
95
|
+
JOIN descendants D ON E.component_id = D.id
|
|
96
|
+
WHERE E.type = 'c'
|
|
97
|
+
)
|
|
98
|
+
SELECT D.* FROM descendants D ORDER BY id;
|
|
99
|
+
→ [{"id":1},{"id":2},{"id":3},{"id":4}]
|
|
100
|
+
|
|
101
|
+
-- Test 5: Internal recursive CTE reference with alias and qualified SELECT *
|
|
102
|
+
-- The recursive reference "descendants D" inside the recursive part
|
|
103
|
+
WITH RECURSIVE descendants(id, component_id, type) AS (
|
|
104
|
+
SELECT id, component_id, type FROM Entity WHERE id = 1
|
|
105
|
+
UNION ALL
|
|
106
|
+
SELECT E.id, E.component_id, E.type FROM Entity E
|
|
107
|
+
JOIN descendants D ON E.component_id = D.id
|
|
108
|
+
WHERE E.type = 'c'
|
|
109
|
+
)
|
|
110
|
+
SELECT D.* FROM descendants D ORDER BY id;
|
|
111
|
+
→ [{"id":1,"component_id":null,"type":"c"},{"id":2,"component_id":1,"type":"c"},{"id":3,"component_id":1,"type":"c"},{"id":4,"component_id":2,"type":"c"}]
|
|
112
|
+
|
|
113
|
+
DROP TABLE Entity;
|
|
114
|
+
|
|
115
|
+
-- Non-recursive CTE referencing an earlier CTE in the same WITH clause
|
|
116
|
+
WITH
|
|
117
|
+
cte1 AS (SELECT id, name FROM base_t),
|
|
118
|
+
cte2 AS (SELECT id, name FROM cte1 WHERE id > 1)
|
|
119
|
+
SELECT * FROM cte2 ORDER BY id;
|
|
120
|
+
→ [{"id":2,"name":"Bob"},{"id":3,"name":"Charlie"}]
|
|
121
|
+
|
|
122
|
+
-- Non-recursive CTE chain: cte3 references cte2, which references cte1
|
|
123
|
+
WITH
|
|
124
|
+
cte1 AS (SELECT id, name FROM base_t),
|
|
125
|
+
cte2 AS (SELECT id, name FROM cte1 WHERE id <= 2),
|
|
126
|
+
cte3 AS (SELECT name FROM cte2 WHERE id = 1)
|
|
127
|
+
SELECT * FROM cte3;
|
|
128
|
+
→ [{"name":"Alice"}]
|
|
129
|
+
|
|
130
|
+
-- Non-recursive CTE with explicit column names that differ from the source query
|
|
131
|
+
-- Verifies that column types are mapped by position, not by name
|
|
132
|
+
WITH cte(x, y) AS (SELECT 1 AS a, 'hello' AS b)
|
|
133
|
+
SELECT typeof(x), typeof(y) FROM cte;
|
|
134
|
+
→ [{"typeof(x)":"integer","typeof(y)":"text"}]
|
|
135
|
+
|
|
136
|
+
DROP TABLE base_t;
|
|
137
|
+
DROP TABLE hierarchy;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
-- Testing multiple CTEs in a WITH RECURSIVE clause where later CTEs reference earlier ones
|
|
2
|
+
|
|
3
|
+
CREATE TABLE Entity (
|
|
4
|
+
id INTEGER PRIMARY KEY,
|
|
5
|
+
component_id INTEGER NULL,
|
|
6
|
+
p_x REAL, p_y REAL, p_z REAL,
|
|
7
|
+
r_x REAL, r_y REAL, r_z REAL,
|
|
8
|
+
s_x REAL, s_y REAL, s_z REAL
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
INSERT INTO Entity VALUES
|
|
12
|
+
(1, null, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0),
|
|
13
|
+
(2, 1, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0),
|
|
14
|
+
(3, 1, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0),
|
|
15
|
+
(4, 2, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5);
|
|
16
|
+
|
|
17
|
+
-- Test case 1: Simple multiple CTEs in WITH RECURSIVE, second references first
|
|
18
|
+
-- This tests that entity_tree is in scope when building ancestor_walk
|
|
19
|
+
WITH RECURSIVE
|
|
20
|
+
entity_tree(id) AS (
|
|
21
|
+
SELECT id FROM Entity WHERE id = 1
|
|
22
|
+
UNION ALL
|
|
23
|
+
SELECT E.id FROM Entity E JOIN entity_tree T ON E.component_id = T.id
|
|
24
|
+
),
|
|
25
|
+
ancestor_walk(entity_id, ancestor_id, depth) AS (
|
|
26
|
+
SELECT E.id, E.component_id, 0
|
|
27
|
+
FROM Entity E
|
|
28
|
+
WHERE E.id IN (SELECT id FROM entity_tree) AND E.component_id IS NOT NULL
|
|
29
|
+
UNION ALL
|
|
30
|
+
SELECT W.entity_id, P.component_id, W.depth + 1
|
|
31
|
+
FROM ancestor_walk W
|
|
32
|
+
JOIN Entity P ON W.ancestor_id = P.id
|
|
33
|
+
WHERE P.component_id IS NOT NULL
|
|
34
|
+
)
|
|
35
|
+
SELECT entity_id, ancestor_id, depth
|
|
36
|
+
FROM ancestor_walk
|
|
37
|
+
ORDER BY entity_id, depth DESC;
|
|
38
|
+
→ [{"entity_id":2,"ancestor_id":1,"depth":0},{"entity_id":3,"ancestor_id":1,"depth":0},{"entity_id":4,"ancestor_id":1,"depth":1},{"entity_id":4,"ancestor_id":2,"depth":0}]
|
|
39
|
+
|
|
40
|
+
-- Test case 2: Full query from the bug report (with joins to get entity attributes)
|
|
41
|
+
WITH RECURSIVE
|
|
42
|
+
entity_tree(id) AS (
|
|
43
|
+
SELECT id FROM Entity WHERE id = 1
|
|
44
|
+
UNION ALL
|
|
45
|
+
SELECT E.id FROM Entity E JOIN entity_tree T ON E.component_id = T.id
|
|
46
|
+
),
|
|
47
|
+
ancestor_walk(entity_id, ancestor_id, depth) AS (
|
|
48
|
+
SELECT E.id, E.component_id, 0
|
|
49
|
+
FROM Entity E
|
|
50
|
+
WHERE E.id IN (SELECT id FROM entity_tree) AND E.component_id IS NOT NULL
|
|
51
|
+
UNION ALL
|
|
52
|
+
SELECT W.entity_id, P.component_id, W.depth + 1
|
|
53
|
+
FROM ancestor_walk W
|
|
54
|
+
JOIN Entity P ON W.ancestor_id = P.id
|
|
55
|
+
WHERE P.component_id IS NOT NULL
|
|
56
|
+
)
|
|
57
|
+
SELECT
|
|
58
|
+
W.entity_id,
|
|
59
|
+
W.ancestor_id,
|
|
60
|
+
W.depth as ancestor_depth,
|
|
61
|
+
A.p_x, A.p_y, A.p_z,
|
|
62
|
+
A.r_x, A.r_y, A.r_z,
|
|
63
|
+
A.s_x, A.s_y, A.s_z
|
|
64
|
+
FROM ancestor_walk W
|
|
65
|
+
JOIN Entity A ON W.ancestor_id = A.id
|
|
66
|
+
ORDER BY W.entity_id, W.depth DESC;
|
|
67
|
+
→ [{"entity_id":2,"ancestor_id":1,"ancestor_depth":0,"p_x":0.0,"p_y":0.0,"p_z":0.0,"r_x":0.0,"r_y":0.0,"r_z":0.0,"s_x":1.0,"s_y":1.0,"s_z":1.0},{"entity_id":3,"ancestor_id":1,"ancestor_depth":0,"p_x":0.0,"p_y":0.0,"p_z":0.0,"r_x":0.0,"r_y":0.0,"r_z":0.0,"s_x":1.0,"s_y":1.0,"s_z":1.0},{"entity_id":4,"ancestor_id":1,"ancestor_depth":1,"p_x":0.0,"p_y":0.0,"p_z":0.0,"r_x":0.0,"r_y":0.0,"r_z":0.0,"s_x":1.0,"s_y":1.0,"s_z":1.0},{"entity_id":4,"ancestor_id":2,"ancestor_depth":0,"p_x":1.0,"p_y":0.0,"p_z":0.0,"r_x":0.0,"r_y":0.0,"r_z":0.0,"s_x":1.0,"s_y":1.0,"s_z":1.0}]
|
|
68
|
+
|
|
69
|
+
-- Test case 3: Non-recursive CTE followed by recursive CTE referencing it
|
|
70
|
+
WITH RECURSIVE
|
|
71
|
+
filtered_entities(id) AS (
|
|
72
|
+
SELECT id FROM Entity WHERE p_x >= 0.0
|
|
73
|
+
),
|
|
74
|
+
entity_tree(id) AS (
|
|
75
|
+
SELECT id FROM filtered_entities WHERE id = 1
|
|
76
|
+
UNION ALL
|
|
77
|
+
SELECT E.id FROM Entity E JOIN entity_tree T ON E.component_id = T.id
|
|
78
|
+
)
|
|
79
|
+
SELECT id FROM entity_tree ORDER BY id;
|
|
80
|
+
→ [{"id":1},{"id":2},{"id":3},{"id":4}]
|
|
81
|
+
|
|
82
|
+
-- Test case 4: Three CTEs where third references first two
|
|
83
|
+
-- Note: cte3 uses UNION (not UNION ALL) to avoid being treated as recursive
|
|
84
|
+
WITH RECURSIVE
|
|
85
|
+
cte1(id) AS (
|
|
86
|
+
SELECT 1
|
|
87
|
+
UNION ALL
|
|
88
|
+
SELECT id + 1 FROM cte1 WHERE id < 3
|
|
89
|
+
),
|
|
90
|
+
cte2(id) AS (
|
|
91
|
+
SELECT 10
|
|
92
|
+
UNION ALL
|
|
93
|
+
SELECT id + 1 FROM cte2 WHERE id < 12
|
|
94
|
+
),
|
|
95
|
+
cte3(id) AS (
|
|
96
|
+
SELECT id FROM cte1
|
|
97
|
+
UNION
|
|
98
|
+
SELECT id FROM cte2
|
|
99
|
+
)
|
|
100
|
+
SELECT id FROM cte3 ORDER BY id;
|
|
101
|
+
→ [{"id":1},{"id":2},{"id":3},{"id":10},{"id":11},{"id":12}]
|
|
102
|
+
|
|
103
|
+
DROP TABLE Entity;
|
|
104
|
+
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
-- 13.10-cte-qualified-name.sqllogic - a schema-qualified FROM name never binds a CTE
|
|
2
|
+
--
|
|
3
|
+
-- A common table expression lives in no schema, so writing the schema in front of a name
|
|
4
|
+
-- (`main.c`) can only mean the real schema object. `buildFrom` (planner/building/select.ts)
|
|
5
|
+
-- used to look its `cteNodes` map up on the BARE name and ignore `table.schema`, so
|
|
6
|
+
-- `with c as (…) select … from main.c` silently read the CTE — wrong rows, no error.
|
|
7
|
+
--
|
|
8
|
+
-- The write path was already correct (`resolveCteTarget` returns undefined when
|
|
9
|
+
-- `table.schema` is set), as are the lens compiler and the rename rewriter. This file pins
|
|
10
|
+
-- both halves: a qualifier always reaches the schema object, and a BARE name still shadows
|
|
11
|
+
-- to the CTE exactly as before.
|
|
12
|
+
--
|
|
13
|
+
-- See docs/vu-operators.md § Common Table Expressions and the CTE-name DML target.
|
|
14
|
+
|
|
15
|
+
-- `c` is a real table with 3 rows; `p` has 1 row, so a CTE `c` over `p` has 1 row —
|
|
16
|
+
-- the two disagree, so the wrong binding is always observable.
|
|
17
|
+
create table c (k integer primary key);
|
|
18
|
+
insert into c values (1), (2), (3);
|
|
19
|
+
create table p (id integer primary key);
|
|
20
|
+
insert into p values (10);
|
|
21
|
+
-- run
|
|
22
|
+
|
|
23
|
+
-- ===== Qualified name reads the real table =====
|
|
24
|
+
|
|
25
|
+
with c as (select id as k from p) select count(*) as n from main.c;
|
|
26
|
+
→ [{"n":3}]
|
|
27
|
+
|
|
28
|
+
-- The values come from the real table too, not just the count.
|
|
29
|
+
with c as (select id as k from p) select k from main.c order by k;
|
|
30
|
+
→ [{"k":1},{"k":2},{"k":3}]
|
|
31
|
+
|
|
32
|
+
-- ===== Bare name still reads the CTE (unchanged) =====
|
|
33
|
+
|
|
34
|
+
with c as (select id as k from p) select count(*) as n from c;
|
|
35
|
+
→ [{"n":1}]
|
|
36
|
+
|
|
37
|
+
with c as (select id as k from p) select k from c order by k;
|
|
38
|
+
→ [{"k":10}]
|
|
39
|
+
|
|
40
|
+
-- ===== Alias on the qualified name still works =====
|
|
41
|
+
|
|
42
|
+
with c as (select id as k from p) select count(*) as n from main.c as x;
|
|
43
|
+
→ [{"n":3}]
|
|
44
|
+
|
|
45
|
+
with c as (select id as k from p) select x.k as k from main.c as x order by x.k;
|
|
46
|
+
→ [{"k":1},{"k":2},{"k":3}]
|
|
47
|
+
|
|
48
|
+
-- ===== Both bindings in ONE statement =====
|
|
49
|
+
-- The join proves the two names resolve independently: 3 real rows × 1 CTE row.
|
|
50
|
+
|
|
51
|
+
with c as (select id as k from p)
|
|
52
|
+
select count(*) as n from main.c as real_c cross join c as cte_c;
|
|
53
|
+
→ [{"n":3}]
|
|
54
|
+
|
|
55
|
+
with c as (select id as k from p)
|
|
56
|
+
select real_c.k as rk, cte_c.k as ck from main.c as real_c cross join c as cte_c order by rk;
|
|
57
|
+
→ [{"rk":1,"ck":10},{"rk":2,"ck":10},{"rk":3,"ck":10}]
|
|
58
|
+
|
|
59
|
+
-- ===== Qualified name inside a subquery =====
|
|
60
|
+
|
|
61
|
+
with c as (select id as k from p)
|
|
62
|
+
select (select count(*) from main.c) as qualified, (select count(*) from c) as bare;
|
|
63
|
+
→ [{"qualified":3,"bare":1}]
|
|
64
|
+
|
|
65
|
+
-- ===== Recursion is unaffected — the self-reference is BARE =====
|
|
66
|
+
|
|
67
|
+
with recursive r(n) as (
|
|
68
|
+
select 1
|
|
69
|
+
union all
|
|
70
|
+
select n + 1 from r where n < 3
|
|
71
|
+
)
|
|
72
|
+
select count(*) as n from r;
|
|
73
|
+
→ [{"n":3}]
|
|
74
|
+
|
|
75
|
+
-- ...and a qualified reference to a recursive CTE's name is still a schema lookup, which
|
|
76
|
+
-- finds nothing.
|
|
77
|
+
with recursive r(n) as (
|
|
78
|
+
select 1
|
|
79
|
+
union all
|
|
80
|
+
select n + 1 from r where n < 3
|
|
81
|
+
)
|
|
82
|
+
select count(*) as n from main.r;
|
|
83
|
+
-- error: Table not found: main.r
|
|
84
|
+
|
|
85
|
+
-- ...and the same inside the recursive body: the working-table binding is reached by the
|
|
86
|
+
-- BARE self-reference only, so a qualified self-reference is an ordinary schema lookup.
|
|
87
|
+
with recursive r(n) as (
|
|
88
|
+
select 1
|
|
89
|
+
union all
|
|
90
|
+
select n + 1 from main.r where n < 3
|
|
91
|
+
)
|
|
92
|
+
select count(*) as n from r;
|
|
93
|
+
-- error: Table not found: main.r
|
|
94
|
+
|
|
95
|
+
-- ===== A qualified name reaches a VIEW too, not only a base table =====
|
|
96
|
+
-- The fall-through arm resolves view / maintained table / base table alike; the CTE used to
|
|
97
|
+
-- win over all three.
|
|
98
|
+
|
|
99
|
+
create view cv as select k from c;
|
|
100
|
+
-- run
|
|
101
|
+
|
|
102
|
+
with cv as (select id as k from p) select count(*) as n from main.cv;
|
|
103
|
+
→ [{"n":3}]
|
|
104
|
+
|
|
105
|
+
with cv as (select id as k from p) select count(*) as n from cv;
|
|
106
|
+
→ [{"n":1}]
|
|
107
|
+
|
|
108
|
+
drop view cv;
|
|
109
|
+
-- run
|
|
110
|
+
|
|
111
|
+
-- ===== No same-named schema object: ordinary table-not-found, not a silent CTE bind =====
|
|
112
|
+
-- The qualified miss reports `Table not found: <schema>.<name>` (resolveTableSchema's
|
|
113
|
+
-- explicit-schema arm in planner/building/schema-resolution.ts); the search-path wording
|
|
114
|
+
-- `not found in schema path: …` is the UNqualified miss.
|
|
115
|
+
|
|
116
|
+
with nope as (select id as k from p) select k from main.nope;
|
|
117
|
+
-- error: Table not found: main.nope
|
|
118
|
+
|
|
119
|
+
-- ===== Writes are unchanged — already correct before this fix =====
|
|
120
|
+
|
|
121
|
+
with c as (select id as k from p) insert into main.c values (99);
|
|
122
|
+
|
|
123
|
+
select k from c order by k;
|
|
124
|
+
→ [{"k":1},{"k":2},{"k":3},{"k":99}]
|
|
125
|
+
|
|
126
|
+
-- No `with` clause here, so `c` is the plain real table — restore the 3-row state.
|
|
127
|
+
delete from c where k = 99;
|
|
128
|
+
-- run
|
|
129
|
+
|
|
130
|
+
select count(*) as n from c;
|
|
131
|
+
→ [{"n":3}]
|
|
132
|
+
|
|
133
|
+
-- Cleanup
|
|
134
|
+
drop table p;
|
|
135
|
+
drop table c;
|
|
136
|
+
-- run
|