@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.
Files changed (400) hide show
  1. package/README.md +2 -0
  2. package/dist/src/common/types.d.ts +4 -4
  3. package/dist/src/index.d.ts +1 -1
  4. package/dist/src/index.d.ts.map +1 -1
  5. package/dist/src/index.js +3 -2
  6. package/dist/src/index.js.map +1 -1
  7. package/dist/src/schema/catalog-rendering.js +13 -1
  8. package/dist/src/schema/catalog-rendering.js.map +1 -1
  9. package/dist/src/schema/catalog.d.ts +35 -2
  10. package/dist/src/schema/catalog.d.ts.map +1 -1
  11. package/dist/src/schema/catalog.js +42 -33
  12. package/dist/src/schema/catalog.js.map +1 -1
  13. package/dist/src/schema/schema-differ.d.ts +1 -1
  14. package/dist/src/schema/schema-differ.d.ts.map +1 -1
  15. package/dist/src/schema/schema-differ.js +195 -33
  16. package/dist/src/schema/schema-differ.js.map +1 -1
  17. package/dist/src/schema/unique-enforcement.d.ts +23 -1
  18. package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
  19. package/dist/src/schema/unique-enforcement.js +43 -1
  20. package/dist/src/schema/unique-enforcement.js.map +1 -1
  21. package/dist/src/vtab/memory/layer/manager.d.ts +15 -12
  22. package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
  23. package/dist/src/vtab/memory/layer/manager.js +87 -100
  24. package/dist/src/vtab/memory/layer/manager.js.map +1 -1
  25. package/package.json +7 -4
  26. package/test/README.md +173 -0
  27. package/test/logic/01-basic.sqllogic +39 -0
  28. package/test/logic/01.1-select-projection-extras.sqllogic +130 -0
  29. package/test/logic/01.2-strings.sqllogic +43 -0
  30. package/test/logic/01.5-insert-select.sqllogic +237 -0
  31. package/test/logic/01.6-update-extras.sqllogic +118 -0
  32. package/test/logic/01.7-update-from.sqllogic +67 -0
  33. package/test/logic/01.8-delete-extras.sqllogic +122 -0
  34. package/test/logic/01.8.1-delete-range-cow.sqllogic +115 -0
  35. package/test/logic/01.9-query-expr-dml-gates.sqllogic +32 -0
  36. package/test/logic/01.9-query-expr-dml.sqllogic +171 -0
  37. package/test/logic/01.9-query-expr-values.sqllogic +111 -0
  38. package/test/logic/01.9.1-limit-over-dml-subquery.sqllogic +119 -0
  39. package/test/logic/02-filters.sqllogic +54 -0
  40. package/test/logic/02-smoke.sqllogic +62 -0
  41. package/test/logic/02.1-bind-parameters.sqllogic +223 -0
  42. package/test/logic/03-expressions.sqllogic +190 -0
  43. package/test/logic/03.1-quoted-identifiers.sqllogic +55 -0
  44. package/test/logic/03.4-defaults.sqllogic +554 -0
  45. package/test/logic/03.4.1-default-edge-cases.sqllogic +99 -0
  46. package/test/logic/03.5-tvf.sqllogic +61 -0
  47. package/test/logic/03.6-type-system.sqllogic +544 -0
  48. package/test/logic/03.6.1-numeric-text-comparison-coercion.sqllogic +244 -0
  49. package/test/logic/03.6.2-value-to-text.sqllogic +224 -0
  50. package/test/logic/03.7-bigint-mixed-arithmetic.sqllogic +65 -0
  51. package/test/logic/03.8-not-precedence.sqllogic +255 -0
  52. package/test/logic/03.9-is-bool-predicate.sqllogic +150 -0
  53. package/test/logic/03.9.1-is-bool-predicate-partial-index.sqllogic +34 -0
  54. package/test/logic/04-order-by.sqllogic +38 -0
  55. package/test/logic/04-transactions.sqllogic +239 -0
  56. package/test/logic/04a-savepoint-lazy-attach.sqllogic +122 -0
  57. package/test/logic/05-vtab_memory.sqllogic +50 -0
  58. package/test/logic/05.0.1-vtab-memory-unique-index-collation.sqllogic +34 -0
  59. package/test/logic/05.1-composite-pk-range-scan.sqllogic +147 -0
  60. package/test/logic/05.1.1-secondary-index-range-scan.sqllogic +56 -0
  61. package/test/logic/05.2-cast-seek-correctness.sqllogic +124 -0
  62. package/test/logic/06-builtin_functions.sqllogic +149 -0
  63. package/test/logic/06.1-string-functions.sqllogic +92 -0
  64. package/test/logic/06.1.3-like-glob-edges.sqllogic +53 -0
  65. package/test/logic/06.2-math-functions.sqllogic +82 -0
  66. package/test/logic/06.3-schema.sqllogic +48 -0
  67. package/test/logic/06.3.1-schema-all-schemas.sqllogic +39 -0
  68. package/test/logic/06.3.2-schema-foreign-keys.sqllogic +208 -0
  69. package/test/logic/06.3.3-introspection-tags.sqllogic +202 -0
  70. package/test/logic/06.3.3.1-introspection-tags-index.sqllogic +74 -0
  71. package/test/logic/06.3.4-view-info.sqllogic +378 -0
  72. package/test/logic/06.3.5-column-info.sqllogic +347 -0
  73. package/test/logic/06.3.6-schema-views.sqllogic +29 -0
  74. package/test/logic/06.4-schema-search-path.sqllogic +354 -0
  75. package/test/logic/06.4.1-schema-case-insensitive.sqllogic +83 -0
  76. package/test/logic/06.4.2-collation-extras.sqllogic +472 -0
  77. package/test/logic/06.4.2.1-collation-index-access-paths.sqllogic +140 -0
  78. package/test/logic/06.4.3-write-path-collation.sqllogic +99 -0
  79. package/test/logic/06.4.4-comparison-collation-precedence.sqllogic +342 -0
  80. package/test/logic/06.4.5-any-collate-declared-keys.sqllogic +92 -0
  81. package/test/logic/06.5-polymorphic-types.sqllogic +169 -0
  82. package/test/logic/06.5.1-conversion-functions.sqllogic +173 -0
  83. package/test/logic/06.5.2-scalar-minmax.sqllogic +16 -0
  84. package/test/logic/06.5.3-undeclared-return-type-comparison.sqllogic +244 -0
  85. package/test/logic/06.5.4-declared-return-type-builtins.sqllogic +288 -0
  86. package/test/logic/06.6-aggregate-extended.sqllogic +78 -0
  87. package/test/logic/06.7-json-extended.sqllogic +53 -0
  88. package/test/logic/06.8-json-path-operators.sqllogic +99 -0
  89. package/test/logic/06.9-json-canonical-key.sqllogic +65 -0
  90. package/test/logic/06.9.1-json-coerce-once.sqllogic +417 -0
  91. package/test/logic/06.9.1.1-json-coerce-once-index.sqllogic +39 -0
  92. package/test/logic/06.9.2-json-structural-equality.sqllogic +382 -0
  93. package/test/logic/06.9.2.1-json-structural-equality-index.sqllogic +76 -0
  94. package/test/logic/06.9.3-json-index-range-seek.sqllogic +205 -0
  95. package/test/logic/07-aggregates.sqllogic +193 -0
  96. package/test/logic/07.1-aggregate-filter-clause.sqllogic +12 -0
  97. package/test/logic/07.2-aggregate-order-by.sqllogic +11 -0
  98. package/test/logic/07.3-group-by-extras.sqllogic +602 -0
  99. package/test/logic/07.3.1-group-by-order-by-key.sqllogic +164 -0
  100. package/test/logic/07.3.2-grouped-select-list-shape.sqllogic +231 -0
  101. package/test/logic/07.4-group-by-filter-composite-pk.sqllogic +120 -0
  102. package/test/logic/07.5-sum-mixed-exact-and-float.sqllogic +151 -0
  103. package/test/logic/07.5-window.sqllogic +1941 -0
  104. package/test/logic/07.5.1-window-named.sqllogic +13 -0
  105. package/test/logic/07.5.2-window-nth-value.sqllogic +13 -0
  106. package/test/logic/07.6-subqueries.sqllogic +78 -0
  107. package/test/logic/07.6.1-subquery-extras.sqllogic +93 -0
  108. package/test/logic/07.7-and-or-short-circuit.sqllogic +58 -0
  109. package/test/logic/07.7-in-subquery-caching.sqllogic +174 -0
  110. package/test/logic/07.7-scalar-agg-decorrelation.sqllogic +197 -0
  111. package/test/logic/07.7.1-in-extras.sqllogic +158 -0
  112. package/test/logic/07.7.1-scalar-agg-decorrelation-filter.sqllogic +105 -0
  113. package/test/logic/07.7.2-scalar-agg-decorrelation-nested.sqllogic +115 -0
  114. package/test/logic/07.7.3-exists-in-select-decorrelation.sqllogic +107 -0
  115. package/test/logic/07.7.4-where-conjunct-ordering.sqllogic +121 -0
  116. package/test/logic/07.7.5-filter-lost-under-index-order.sqllogic +134 -0
  117. package/test/logic/07.7.6-correlated-predicate-scope.sqllogic +178 -0
  118. package/test/logic/07.7.7-join-source-scope-shadowing.sqllogic +137 -0
  119. package/test/logic/07.7.8-correlated-ref-to-computed-column.sqllogic +165 -0
  120. package/test/logic/07.7.9-conjunct-monotonicity.sqllogic +200 -0
  121. package/test/logic/07.8-correlated-subquery-edges.sqllogic +71 -0
  122. package/test/logic/07.8.1-correlated-in-decorrelation-gates.sqllogic +156 -0
  123. package/test/logic/07.9-in-value-list.sqllogic +154 -0
  124. package/test/logic/07.9.1-in-value-list-composite-index.sqllogic +38 -0
  125. package/test/logic/08-views.sqllogic +64 -0
  126. package/test/logic/08.1-semi-anti-join.sqllogic +191 -0
  127. package/test/logic/08.1-view-edge-cases.sqllogic +118 -0
  128. package/test/logic/08.1.1-uncorrelated-in-semijoin.sqllogic +251 -0
  129. package/test/logic/08.2-existence-flag-semijoin-recovery.sqllogic +197 -0
  130. package/test/logic/08.3-existence-flag-inner-recovery.sqllogic +102 -0
  131. package/test/logic/08.4-key-set-semi-join.sqllogic +447 -0
  132. package/test/logic/09-set_operations.sqllogic +244 -0
  133. package/test/logic/09.1-set-op-cross-collation.sqllogic +230 -0
  134. package/test/logic/10-distinct_datatypes.sqllogic +127 -0
  135. package/test/logic/10.1-ddl-lifecycle.sqllogic +203 -0
  136. package/test/logic/10.1.1-create-table-syntax-edges.sqllogic +47 -0
  137. package/test/logic/10.1.2-ddl-in-transaction.sqllogic +143 -0
  138. package/test/logic/10.1.2.1-add-constraint-in-transaction.sqllogic +59 -0
  139. package/test/logic/10.1.3-ddl-drop-in-transaction.sqllogic +187 -0
  140. package/test/logic/10.1.3.1-drop-constraint-in-transaction.sqllogic +45 -0
  141. package/test/logic/10.1.4-create-table-duplicate-constraint-names.sqllogic +149 -0
  142. package/test/logic/10.1.4-ddl-transaction-policy.sqllogic +314 -0
  143. package/test/logic/10.1.5-alter-add-constraint-minted-name-disambiguation.sqllogic +219 -0
  144. package/test/logic/10.1.5-create-index-lifecycle.sqllogic +72 -0
  145. package/test/logic/10.1.6-ddl-transaction-policy-index.sqllogic +143 -0
  146. package/test/logic/10.1.7-create-table-default-type-check.sqllogic +119 -0
  147. package/test/logic/10.1.8-alter-add-check-existing-rows.sqllogic +117 -0
  148. package/test/logic/10.2-column-features.sqllogic +365 -0
  149. package/test/logic/10.2.1-table-options-rejection.sqllogic +63 -0
  150. package/test/logic/10.2.2-default-collation-memory.sqllogic +30 -0
  151. package/test/logic/10.3-function-features.sqllogic +247 -0
  152. package/test/logic/10.4-schema-scale.sqllogic +168 -0
  153. package/test/logic/10.4.1-schema-scale-indexes.sqllogic +121 -0
  154. package/test/logic/10.5-indexes.sqllogic +164 -0
  155. package/test/logic/10.5.1-partial-indexes.sqllogic +526 -0
  156. package/test/logic/10.5.2-expression-indexes.sqllogic +34 -0
  157. package/test/logic/10.5.3-desc-index-ordering.sqllogic +130 -0
  158. package/test/logic/10.5.4-composite-pk-index-update-phantom.sqllogic +55 -0
  159. package/test/logic/10.5.5-index-name-uniqueness.sqllogic +76 -0
  160. package/test/logic/10.5.6-minmax-index-boundary.sqllogic +204 -0
  161. package/test/logic/10.5.7-implicit-unique-index-lifecycle.sqllogic +1216 -0
  162. package/test/logic/10.6-distinct-edge-cases.sqllogic +119 -0
  163. package/test/logic/100-predicate-normalization-edge-cases.sqllogic +238 -0
  164. package/test/logic/100.1-where-extras.sqllogic +163 -0
  165. package/test/logic/100.1.1-where-join-on-order-indexed.sqllogic +35 -0
  166. package/test/logic/101-builtin-mutation-kills.sqllogic +974 -0
  167. package/test/logic/101-transaction-edge-cases.sqllogic +395 -0
  168. package/test/logic/102-schema-catalog-edge-cases.sqllogic +252 -0
  169. package/test/logic/102-unique-constraints.sqllogic +145 -0
  170. package/test/logic/102.0.1-schema-catalog-indexed-table.sqllogic +32 -0
  171. package/test/logic/102.1-unique-edge-cases.sqllogic +111 -0
  172. package/test/logic/102.1.1-unique-index-creation-edge-cases.sqllogic +75 -0
  173. package/test/logic/102.2-unique-collation.sqllogic +181 -0
  174. package/test/logic/102.2.1-unique-collation-index-derived.sqllogic +305 -0
  175. package/test/logic/103-database-options-edge-cases.sqllogic +108 -0
  176. package/test/logic/103.1-pragma-boolean-values.sqllogic +126 -0
  177. package/test/logic/104-emit-mutation-kills.sqllogic +236 -0
  178. package/test/logic/105-vtab-memory-mutation-kills.sqllogic +754 -0
  179. package/test/logic/105.1-vtab-memory-index-mutation-kills.sqllogic +540 -0
  180. package/test/logic/106-constraint-extractor-mutation-kills.sqllogic +350 -0
  181. package/test/logic/107-temporal-arithmetic-mutation-kills.sqllogic +833 -0
  182. package/test/logic/108-cardinality-estimation.sqllogic +146 -0
  183. package/test/logic/108.1-analyze-name-resolution.sqllogic +102 -0
  184. package/test/logic/109-aggregate-physical-selection.sqllogic +103 -0
  185. package/test/logic/11-joins.sqllogic +86 -0
  186. package/test/logic/11.1-join-using.sqllogic +267 -0
  187. package/test/logic/11.2-comma-join.sqllogic +35 -0
  188. package/test/logic/11.3-index-nested-loop-join.sqllogic +305 -0
  189. package/test/logic/11.3-mismatched-collation-join.sqllogic +74 -0
  190. package/test/logic/11.4-hash-join-side-swap.sqllogic +118 -0
  191. package/test/logic/110-scan-emitter-mutation-kills.sqllogic +121 -0
  192. package/test/logic/110.1-scan-emitter-index-scan-kills.sqllogic +47 -0
  193. package/test/logic/12-empty-primary-key.sqllogic +124 -0
  194. package/test/logic/12-join_padding_order.sqllogic +58 -0
  195. package/test/logic/12.1-orderby-index-consumption.sqllogic +40 -0
  196. package/test/logic/13-cte.sqllogic +137 -0
  197. package/test/logic/13.1-cte-multiple-recursive.sqllogic +104 -0
  198. package/test/logic/13.10-cte-qualified-name.sqllogic +136 -0
  199. package/test/logic/13.11-unreferenced-dml-cte.sqllogic +414 -0
  200. package/test/logic/13.12-nested-dml-cte-rejected.sqllogic +280 -0
  201. package/test/logic/13.2-cte-bind-params.sqllogic +98 -0
  202. package/test/logic/13.3-cte-edge-cases.sqllogic +120 -0
  203. package/test/logic/13.4-cte-extras.sqllogic +98 -0
  204. package/test/logic/13.5-cte-join-order.sqllogic +166 -0
  205. package/test/logic/13.6-cte-dml-runs-once.sqllogic +318 -0
  206. package/test/logic/13.7-cte-sibling-visibility.sqllogic +227 -0
  207. package/test/logic/13.8-insert-with-clause-visibility.sqllogic +254 -0
  208. package/test/logic/13.9-schema-authored-cte-isolation.sqllogic +328 -0
  209. package/test/logic/13.9.1-schema-authored-schema-path-isolation.sqllogic +408 -0
  210. package/test/logic/14-utilities.sqllogic +168 -0
  211. package/test/logic/15-timespan.sqllogic +279 -0
  212. package/test/logic/15.1-semantic-ordering.sqllogic +960 -0
  213. package/test/logic/15.1.1-json-check-coercion.sqllogic +178 -0
  214. package/test/logic/15.1.2-semantic-ordering-index.sqllogic +41 -0
  215. package/test/logic/15.1.3-declared-form-write-contract.sqllogic +519 -0
  216. package/test/logic/16-epoch.sqllogic +187 -0
  217. package/test/logic/17-weekday-modifier.sqllogic +78 -0
  218. package/test/logic/18-json-string-escapes.sqllogic +86 -0
  219. package/test/logic/18-strftime-extended-formats.sqllogic +68 -0
  220. package/test/logic/20-empty-single-row.sqllogic +261 -0
  221. package/test/logic/21-null-edge-cases.sqllogic +227 -0
  222. package/test/logic/21.1-where-null-comparisons.sqllogic +151 -0
  223. package/test/logic/21.1.1-where-null-comparisons-secondary-index.sqllogic +35 -0
  224. package/test/logic/21.2-between-edges.sqllogic +157 -0
  225. package/test/logic/22-boundary-values.sqllogic +175 -0
  226. package/test/logic/23-self-joins-duplicates.sqllogic +74 -0
  227. package/test/logic/24-builtin-branches.sqllogic +611 -0
  228. package/test/logic/24.1-substr-extras.sqllogic +75 -0
  229. package/test/logic/24.2-random-extras.sqllogic +39 -0
  230. package/test/logic/25-aggregate-edge-cases.sqllogic +289 -0
  231. package/test/logic/25.1-nested-aggregates.sqllogic +74 -0
  232. package/test/logic/25.2-having-edge-cases.sqllogic +318 -0
  233. package/test/logic/25.3-aggregate-isnull-empty.sqllogic +16 -0
  234. package/test/logic/25.4-groupby-fd-constant-empty.sqllogic +55 -0
  235. package/test/logic/25.5-ungrouped-aggregate-column-free-select-item.sqllogic +196 -0
  236. package/test/logic/26-join-edge-cases.sqllogic +333 -0
  237. package/test/logic/26.1-left-join-isnull-on-notnull.sqllogic +26 -0
  238. package/test/logic/26.2-left-join-on-vs-where.sqllogic +67 -0
  239. package/test/logic/26.3-join-on-constants.sqllogic +61 -0
  240. package/test/logic/26.4-join-on-is-null-nullable.sqllogic +44 -0
  241. package/test/logic/27-window-edge-cases.sqllogic +206 -0
  242. package/test/logic/27.1-window-groups-frame.sqllogic +13 -0
  243. package/test/logic/27.2-window-exclude.sqllogic +13 -0
  244. package/test/logic/27.3-window-json-aggregation.sqllogic +66 -0
  245. package/test/logic/28-set-ops-sort-edge-cases.sqllogic +444 -0
  246. package/test/logic/28.1-compound-limit-offset.sqllogic +143 -0
  247. package/test/logic/28.2-orderby-expression-extras.sqllogic +698 -0
  248. package/test/logic/28.2-set-op-branch-types.sqllogic +217 -0
  249. package/test/logic/29-constraint-edge-cases.sqllogic +442 -0
  250. package/test/logic/29.1-column-level-conflict-clause.sqllogic +171 -0
  251. package/test/logic/29.2-table-level-pk-conflict-clause.sqllogic +113 -0
  252. package/test/logic/40-constraints.sqllogic +418 -0
  253. package/test/logic/40.1-pk-desc-direction.sqllogic +76 -0
  254. package/test/logic/40.2-check-extras.sqllogic +683 -0
  255. package/test/logic/41-alter-table.sqllogic +191 -0
  256. package/test/logic/41-fk-cascade-conflict-and-self-ref.sqllogic +263 -0
  257. package/test/logic/41-fk-cross-schema.sqllogic +155 -0
  258. package/test/logic/41-fk-extended-targets.sqllogic +173 -0
  259. package/test/logic/41-foreign-keys.sqllogic +1001 -0
  260. package/test/logic/41-generated-column-errors.sqllogic +225 -0
  261. package/test/logic/41-generated-column-extras.sqllogic +598 -0
  262. package/test/logic/41-generated-column-scope.sqllogic +329 -0
  263. package/test/logic/41-generated-columns.sqllogic +361 -0
  264. package/test/logic/41.1-alter-pk.sqllogic +230 -0
  265. package/test/logic/41.1-fk-collation-conflict.sqllogic +277 -0
  266. package/test/logic/41.10-alter-drop-column-foreign-key.sqllogic +274 -0
  267. package/test/logic/41.10.1-alter-drop-column-unique-index.sqllogic +169 -0
  268. package/test/logic/41.10.2-alter-drop-column-check-and-assertion.sqllogic +1616 -0
  269. package/test/logic/41.10.3-alter-drop-column-referencing-fk.sqllogic +292 -0
  270. package/test/logic/41.10.4-drop-object-expression-dependents.sqllogic +602 -0
  271. package/test/logic/41.11-deferred-fk-with-rename.sqllogic +232 -0
  272. package/test/logic/41.12-alter-default-coercion.sqllogic +200 -0
  273. package/test/logic/41.13-alter-add-column-generated-backfill.sqllogic +566 -0
  274. package/test/logic/41.14-alter-add-column-subquery-backfill.sqllogic +129 -0
  275. package/test/logic/41.15-alter-column-default-type-check.sqllogic +178 -0
  276. package/test/logic/41.16-fk-unenforceable.sqllogic +364 -0
  277. package/test/logic/41.2-alter-column.sqllogic +382 -0
  278. package/test/logic/41.2.1-alter-column-retype-deleted-row-memory.sqllogic +32 -0
  279. package/test/logic/41.2.2-alter-column-retype-index-rebuild.sqllogic +77 -0
  280. package/test/logic/41.2.3-alter-column-set-not-null-pk-backfill.sqllogic +310 -0
  281. package/test/logic/41.2.3.1-alter-column-set-not-null-pk-backfill-secondary-index.sqllogic +37 -0
  282. package/test/logic/41.3-alter-add-column-unique.sqllogic +184 -0
  283. package/test/logic/41.3-alter-rename-propagation.sqllogic +2352 -0
  284. package/test/logic/41.3.1-alter-rename-index-propagation.sqllogic +94 -0
  285. package/test/logic/41.4-alter-add-column-constraints.sqllogic +855 -0
  286. package/test/logic/41.5-alter-misc.sqllogic +48 -0
  287. package/test/logic/41.5-cross-schema-foreign-keys.sqllogic +253 -0
  288. package/test/logic/41.6-alter-drop-rename-constraint.sqllogic +354 -0
  289. package/test/logic/41.6.1-alter-drop-constraint-index-derived.sqllogic +22 -0
  290. package/test/logic/41.7-alter-column-collate.sqllogic +105 -0
  291. package/test/logic/41.7.1-alter-column-collate-unique.sqllogic +45 -0
  292. package/test/logic/41.7.2-alter-column-collate-unique-store.sqllogic +208 -0
  293. package/test/logic/41.7.2.1-alter-column-collate-unique-index-store.sqllogic +114 -0
  294. package/test/logic/41.7.3-alter-column-retype-unique.sqllogic +293 -0
  295. package/test/logic/41.7.3.1-alter-column-retype-staged-rows-memory.sqllogic +41 -0
  296. package/test/logic/41.7.3.2-alter-column-retype-unique-index.sqllogic +72 -0
  297. package/test/logic/41.7.4-alter-column-retype-semantic-memory.sqllogic +445 -0
  298. package/test/logic/41.7.4.1-alter-column-retype-semantic-index-memory.sqllogic +91 -0
  299. package/test/logic/41.7.5-alter-column-collate-pk-staged-delete-memory.sqllogic +106 -0
  300. package/test/logic/41.8-alter-add-constraint-unique-fk.sqllogic +275 -0
  301. package/test/logic/41.8-alter-savepoint-staged-rows.sqllogic +443 -0
  302. package/test/logic/41.8.1-alter-rename-savepoint-staged-rows.sqllogic +408 -0
  303. package/test/logic/41.9-alter-constraint-body-change.sqllogic +180 -0
  304. package/test/logic/41.9-fk-restrict-batched.sqllogic +290 -0
  305. package/test/logic/42-committed-snapshot.sqllogic +254 -0
  306. package/test/logic/42-returning.sqllogic +159 -0
  307. package/test/logic/42.1-returning-extras.sqllogic +232 -0
  308. package/test/logic/42.2-returning-stored-row.sqllogic +165 -0
  309. package/test/logic/43-default-nullability.sqllogic +131 -0
  310. package/test/logic/43-transition-constraints.sqllogic +341 -0
  311. package/test/logic/43.1-default-collation.sqllogic +140 -0
  312. package/test/logic/43.1-notnull-or-conflict.sqllogic +79 -0
  313. package/test/logic/43.2-deferred-check-new-on-delete.sqllogic +95 -0
  314. package/test/logic/43.3-nullable-primary-key.sqllogic +587 -0
  315. package/test/logic/44-determinism-validation.sqllogic +164 -0
  316. package/test/logic/44-orthogonality.sqllogic +146 -0
  317. package/test/logic/44.1-nondeterministic-schema.sqllogic +316 -0
  318. package/test/logic/45-udf-determinism.sqllogic +39 -0
  319. package/test/logic/46-mutation-context.sqllogic +595 -0
  320. package/test/logic/47-upsert.sqllogic +255 -0
  321. package/test/logic/47.1-upsert-conflict-targets.sqllogic +169 -0
  322. package/test/logic/47.2-replace-and-or-clauses.sqllogic +164 -0
  323. package/test/logic/47.2.1-pk-replace-secondary-unique.sqllogic +374 -0
  324. package/test/logic/47.3-engine-or-fail.sqllogic +122 -0
  325. package/test/logic/47.3-upsert-conflict-target-collation.sqllogic +139 -0
  326. package/test/logic/47.3.1-upsert-conflict-index-derived-collation.sqllogic +25 -0
  327. package/test/logic/47.4-upsert-conflict-target-affinity.sqllogic +59 -0
  328. package/test/logic/47.5-upsert-do-update-constraints.sqllogic +440 -0
  329. package/test/logic/47.6-upsert-do-update-decomposed.sqllogic +100 -0
  330. package/test/logic/49-reference-graph.sqllogic +84 -0
  331. package/test/logic/50-declarative-schema.sqllogic +2550 -0
  332. package/test/logic/50-metadata-tags.sqllogic +1033 -0
  333. package/test/logic/50.0.1-metadata-tags-index.sqllogic +141 -0
  334. package/test/logic/50.1-declare-schema-pk.sqllogic +150 -0
  335. package/test/logic/50.2-declare-schema-renames.sqllogic +949 -0
  336. package/test/logic/50.2.1-declare-schema-index-renames.sqllogic +173 -0
  337. package/test/logic/50.3-declare-schema-duplicate-names.sqllogic +280 -0
  338. package/test/logic/50.4-declare-schema-apply-restore.sqllogic +192 -0
  339. package/test/logic/51-lens-foundation.sqllogic +147 -0
  340. package/test/logic/51-materialized-views.sqllogic +376 -0
  341. package/test/logic/51.5-materialized-views-coarsened-key.sqllogic +198 -0
  342. package/test/logic/51.7-maintained-table-attach-detach.sqllogic +468 -0
  343. package/test/logic/51.8-maintained-table-declared-constraints.sqllogic +440 -0
  344. package/test/logic/51.85-maintained-table-parent-fk.sqllogic +103 -0
  345. package/test/logic/51.9-maintained-table-secondary-unique.sqllogic +237 -0
  346. package/test/logic/51.9.1-maintained-table-partial-unique.sqllogic +36 -0
  347. package/test/logic/52-lens-overrides.sqllogic +566 -0
  348. package/test/logic/53-materialized-views-rowtime.sqllogic +1601 -0
  349. package/test/logic/53-reserved-tags.sqllogic +252 -0
  350. package/test/logic/53.1-materialized-view-write-through.sqllogic +329 -0
  351. package/test/logic/53.2-materialized-view-rename-propagation.sqllogic +483 -0
  352. package/test/logic/53.3-materialized-view-constraint-only-ddl.sqllogic +409 -0
  353. package/test/logic/53.3.1-materialized-view-index-ddl-irrelevance.sqllogic +29 -0
  354. package/test/logic/53.4-materialized-view-structural-alter-restore.sqllogic +436 -0
  355. package/test/logic/54-covering-mv-enforcement.sqllogic +314 -0
  356. package/test/logic/54.1-covering-mv-partial-enforcement.sqllogic +34 -0
  357. package/test/logic/55-internal-eviction-reporting.sqllogic +89 -0
  358. package/test/logic/55-lens-prover.sqllogic +202 -0
  359. package/test/logic/55.1-eviction-restrict-fk.sqllogic +148 -0
  360. package/test/logic/55.5-lens-authored-inverse.sqllogic +1468 -0
  361. package/test/logic/80-grow-retrieve-pass.sqllogic +79 -0
  362. package/test/logic/81-quickpick.sqllogic +24 -0
  363. package/test/logic/82-bloom-join.sqllogic +185 -0
  364. package/test/logic/83-merge-join.sqllogic +280 -0
  365. package/test/logic/84-asof-scan.sqllogic +238 -0
  366. package/test/logic/84-key-cardinality.sqllogic +50 -0
  367. package/test/logic/85-relational-const-folding.sqllogic +51 -0
  368. package/test/logic/86-scalar-cse.sqllogic +42 -0
  369. package/test/logic/90-error_paths.sqllogic +114 -0
  370. package/test/logic/90.1-parse-errors.sqllogic +77 -0
  371. package/test/logic/90.2-alter-table-errors.sqllogic +53 -0
  372. package/test/logic/90.2.1-alter-extra-errors.sqllogic +51 -0
  373. package/test/logic/90.3-expression-errors.sqllogic +43 -0
  374. package/test/logic/90.4-dml-errors.sqllogic +47 -0
  375. package/test/logic/90.5-unsupported-join-types.sqllogic +37 -0
  376. package/test/logic/90.5.1-right-full-join-read.sqllogic +157 -0
  377. package/test/logic/90.6-select-error-paths.sqllogic +57 -0
  378. package/test/logic/91-merge-join-edge-cases.sqllogic +159 -0
  379. package/test/logic/92-hash-aggregate-edge-cases.sqllogic +139 -0
  380. package/test/logic/93-ddl-view-edge-cases.sqllogic +104 -0
  381. package/test/logic/93.1-view-error-paths.sqllogic +74 -0
  382. package/test/logic/93.2-view-mutation-pending.sqllogic +108 -0
  383. package/test/logic/93.3-view-mutation-or-clause.sqllogic +60 -0
  384. package/test/logic/93.4-view-mutation.sqllogic +4881 -0
  385. package/test/logic/93.4.1-view-mutation-partial-unique-cardinality.sqllogic +31 -0
  386. package/test/logic/93.5-authored-inverse.sqllogic +415 -0
  387. package/test/logic/93.6-set-op-flagless-write.sqllogic +862 -0
  388. package/test/logic/94-tvf-edge-cases.sqllogic +58 -0
  389. package/test/logic/94.1-limit-offset-edge-cases.sqllogic +109 -0
  390. package/test/logic/94.2-limit-offset-extras.sqllogic +98 -0
  391. package/test/logic/95-assertions.sqllogic +1417 -0
  392. package/test/logic/96-subquery-edge-cases.sqllogic +276 -0
  393. package/test/logic/97-json-function-edge-cases.sqllogic +633 -0
  394. package/test/logic/97.1-json-blob-and-special-values.sqllogic +92 -0
  395. package/test/logic/98-temporal-edge-cases.sqllogic +515 -0
  396. package/test/logic/99-conversion-edge-cases.sqllogic +325 -0
  397. package/test/logic/99.0.1-schema-index-listing.sqllogic +21 -0
  398. package/test/logic/99.1-cast-syntax-extras.sqllogic +167 -0
  399. package/test/logic/drop-unique-index.sqllogic +88 -0
  400. package/test/logic/pushdown-test.sqllogic +36 -0
@@ -0,0 +1,98 @@
1
+ -- Testing recursive CTEs with bind parameters in termination conditions
2
+ -- Uses -- params: directive to supply bind parameter values
3
+
4
+ -- Setup: hierarchy table for tree-walking tests
5
+ CREATE TABLE Node (id INTEGER PRIMARY KEY, parent_id INTEGER NULL, name TEXT);
6
+ INSERT INTO Node VALUES
7
+ (1, null, 'Root'),
8
+ (2, 1, 'A'),
9
+ (3, 1, 'B'),
10
+ (4, 2, 'A1'),
11
+ (5, 2, 'A2'),
12
+ (6, 3, 'B1');
13
+
14
+ -- Test 1: Bind parameter in base case seed (WHERE id = ?)
15
+ -- params: [1]
16
+ WITH RECURSIVE tree(id) AS (
17
+ SELECT id FROM Node WHERE id = ?
18
+ UNION ALL
19
+ SELECT N.id FROM Node N JOIN tree T ON N.parent_id = T.id
20
+ )
21
+ SELECT id FROM tree ORDER BY id;
22
+ → [{"id":1},{"id":2},{"id":3},{"id":4},{"id":5},{"id":6}]
23
+
24
+ -- Test 2: Different seed value via bind parameter
25
+ -- params: [2]
26
+ WITH RECURSIVE tree(id) AS (
27
+ SELECT id FROM Node WHERE id = ?
28
+ UNION ALL
29
+ SELECT N.id FROM Node N JOIN tree T ON N.parent_id = T.id
30
+ )
31
+ SELECT id FROM tree ORDER BY id;
32
+ → [{"id":2},{"id":4},{"id":5}]
33
+
34
+ -- Test 3: Bind parameter in recursive termination (depth < ?)
35
+ -- params: [2]
36
+ WITH RECURSIVE tree(id, depth) AS (
37
+ SELECT id, 0 FROM Node WHERE parent_id IS NULL
38
+ UNION ALL
39
+ SELECT N.id, T.depth + 1 FROM Node N JOIN tree T ON N.parent_id = T.id
40
+ WHERE T.depth + 1 < ?
41
+ )
42
+ SELECT id, depth FROM tree ORDER BY depth, id;
43
+ → [{"id":1,"depth":0},{"id":2,"depth":1},{"id":3,"depth":1}]
44
+
45
+ -- Test 4: Bind parameter as exclusion (id != ?)
46
+ -- params: [4]
47
+ WITH RECURSIVE tree(id) AS (
48
+ SELECT id FROM Node WHERE parent_id IS NULL
49
+ UNION ALL
50
+ SELECT N.id FROM Node N JOIN tree T ON N.parent_id = T.id
51
+ WHERE N.id != ?
52
+ )
53
+ SELECT id FROM tree ORDER BY id;
54
+ → [{"id":1},{"id":2},{"id":3},{"id":5},{"id":6}]
55
+
56
+ -- Test 5: Multiple bind parameters — seed + termination
57
+ -- params: [2, 1]
58
+ WITH RECURSIVE tree(id, depth) AS (
59
+ SELECT id, 0 FROM Node WHERE id = ?
60
+ UNION ALL
61
+ SELECT N.id, T.depth + 1 FROM Node N JOIN tree T ON N.parent_id = T.id
62
+ WHERE T.depth < ?
63
+ )
64
+ SELECT id, depth FROM tree ORDER BY depth, id;
65
+ → [{"id":2,"depth":0},{"id":4,"depth":1},{"id":5,"depth":1}]
66
+
67
+ -- Test 6: Bind parameter in both seed and exclusion
68
+ -- params: [1, 3]
69
+ WITH RECURSIVE tree(id) AS (
70
+ SELECT id FROM Node WHERE id = ?
71
+ UNION ALL
72
+ SELECT N.id FROM Node N JOIN tree T ON N.parent_id = T.id
73
+ WHERE N.id != ?
74
+ )
75
+ SELECT id FROM tree ORDER BY id;
76
+ → [{"id":1},{"id":2},{"id":4},{"id":5}]
77
+
78
+ -- Test 7: Simple counting CTE with parameterized limit
79
+ -- params: [4]
80
+ WITH RECURSIVE counter(n) AS (
81
+ SELECT 1
82
+ UNION ALL
83
+ SELECT n + 1 FROM counter WHERE n < ?
84
+ )
85
+ SELECT n FROM counter ORDER BY n;
86
+ → [{"n":1},{"n":2},{"n":3},{"n":4}]
87
+
88
+ -- Test 8: Parameterized start and limit in counting CTE
89
+ -- params: [10, 13]
90
+ WITH RECURSIVE counter(n) AS (
91
+ SELECT ?
92
+ UNION ALL
93
+ SELECT n + 1 FROM counter WHERE n < ?
94
+ )
95
+ SELECT n FROM counter ORDER BY n;
96
+ → [{"n":10},{"n":11},{"n":12},{"n":13}]
97
+
98
+ DROP TABLE Node;
@@ -0,0 +1,120 @@
1
+ -- cte-edge-cases.sqllogic - CTE edge cases
2
+
3
+ -- Setup
4
+ create table ct (id integer primary key, val text, parent_id integer null);
5
+ insert into ct values (1, 'root', null), (2, 'child1', 1), (3, 'child2', 1), (4, 'leaf', 2);
6
+
7
+ -- ===== CTE referenced multiple times in same query =====
8
+
9
+ with shared as (select id, val from ct where parent_id is not null)
10
+ select a.id, b.id as b_id
11
+ from shared a cross join shared b
12
+ where a.id < b.id
13
+ order by a.id, b.id;
14
+ → [{"id":2,"b_id":3},{"id":2,"b_id":4},{"id":3,"b_id":4}]
15
+
16
+ -- ===== CTE referencing another CTE =====
17
+
18
+ with
19
+ cte1 as (select id, val from ct where id <= 2),
20
+ cte2 as (select id, val from cte1 where id = 1)
21
+ select * from cte2;
22
+ → [{"id":1,"val":"root"}]
23
+
24
+ -- ===== CTE chain of 3 =====
25
+
26
+ with
27
+ a as (select id from ct),
28
+ b as (select id from a where id > 1),
29
+ c as (select id from b where id > 2)
30
+ select * from c order by id;
31
+ → [{"id":3},{"id":4}]
32
+
33
+ -- ===== Recursive CTE: 0 iterations =====
34
+
35
+ -- Base case produces 0 rows, recursion never starts
36
+ with recursive r(n) as (
37
+ select 1 where false
38
+ union all
39
+ select n + 1 from r where n < 5
40
+ )
41
+ select * from r;
42
+ → []
43
+
44
+ -- ===== Recursive CTE: 1 iteration =====
45
+
46
+ -- Base case produces 1 row, recursive step produces 0
47
+ with recursive r(n) as (
48
+ select 1
49
+ union all
50
+ select n + 1 from r where n < 1
51
+ )
52
+ select * from r;
53
+ → [{"n":1}]
54
+
55
+ -- ===== CTE with EXISTS check =====
56
+
57
+ -- Existing value
58
+ with data as (select id from ct where val = 'root')
59
+ select exists (select 1 from data) as has_root;
60
+ → [{"has_root":true}]
61
+
62
+ -- Non-existent value
63
+ with data as (select id from ct where val = 'nonexistent')
64
+ select exists (select 1 from data) as has_it;
65
+ → [{"has_it":false}]
66
+
67
+ -- ===== CTE used in UPDATE — the leading WITH is now in scope for SET/WHERE =====
68
+ -- UPDATE/DELETE previously ignored the statement's WITH clause, so a CTE read in a
69
+ -- SET value / WHERE subquery failed to resolve ("not found"). The CTE-name DML write
70
+ -- target work threads the statement's CTEs into scope, closing that read gap.
71
+
72
+ create table ct_target (id integer primary key, val text);
73
+ insert into ct_target values (1, 'old');
74
+ -- run
75
+
76
+ with src as (select val from ct where id = 1)
77
+ update ct_target set val = (select val from src) where id = 1;
78
+ -- run
79
+
80
+ -- The CTE read resolved: ct.val where id=1 is 'root'.
81
+ select * from ct_target;
82
+ → [{"id":1,"val":"root"}]
83
+
84
+ -- ===== CTE used in DELETE — the leading WITH is likewise in scope for the WHERE =====
85
+
86
+ with to_del as (select id from ct_target)
87
+ delete from ct_target where id in (select id from to_del);
88
+ -- run
89
+
90
+ -- The CTE read resolved: every ct_target row whose id is in to_del was deleted.
91
+ select count(*) as cnt from ct_target;
92
+ → [{"cnt":0}]
93
+
94
+ drop table ct_target;
95
+ -- run
96
+
97
+ -- ===== CTE with set operations =====
98
+
99
+ -- UNION
100
+ with
101
+ a as (select id from ct where id <= 2),
102
+ b as (select id from ct where id >= 2)
103
+ select id from a
104
+ union
105
+ select id from b
106
+ order by id;
107
+ → [{"id":1},{"id":2},{"id":3},{"id":4}]
108
+
109
+ -- INTERSECT
110
+ with
111
+ a as (select id from ct where id <= 2),
112
+ b as (select id from ct where id >= 2)
113
+ select id from a
114
+ intersect
115
+ select id from b
116
+ order by id;
117
+ → [{"id":2}]
118
+
119
+ -- Cleanup
120
+ drop table ct;
@@ -0,0 +1,98 @@
1
+ -- adapted from SQLite test/with1.test, test/with2.test, test/with3.test, test/with4.test
2
+ -- CTE surface gaps: CTE name shadowing a base table, VALUES as CTE source,
3
+ -- LIMIT applied inside a recursive CTE definition, nested WITH inside a recursive
4
+ -- CTE base case, and CTE used inside a VIEW definition.
5
+
6
+ -- =============================================================================
7
+ -- CTE shadowing a base table of the same name
8
+ -- =============================================================================
9
+
10
+ create table cte_t (id integer primary key, val text);
11
+ insert into cte_t values (1, 'base'), (2, 'base2');
12
+
13
+ -- Inside the WITH scope, the CTE name takes precedence over the base table
14
+ with cte_t as (select 99 as id, 'cte' as val)
15
+ select id, val from cte_t;
16
+ → [{"id":99,"val":"cte"}]
17
+
18
+ -- Outside the WITH scope, the base table is back
19
+ select id, val from cte_t order by id;
20
+ → [{"id":1,"val":"base"},{"id":2,"val":"base2"}]
21
+
22
+ drop table cte_t;
23
+
24
+ -- =============================================================================
25
+ -- VALUES clause as direct CTE source — now supported via the orthogonal
26
+ -- QueryExpr surface (ticket: query-expr-ast-parser-unification). Pin the
27
+ -- positive behaviour so a future regression here would surface here, not
28
+ -- only in the new 01.9-query-expr-values suite.
29
+ -- =============================================================================
30
+
31
+ with v(a, b) as (
32
+ values (1, 'x'), (2, 'y'), (3, 'z')
33
+ )
34
+ select a, b from v order by a;
35
+ → [{"a":1,"b":"x"},{"a":2,"b":"y"},{"a":3,"b":"z"}]
36
+
37
+ -- =============================================================================
38
+ -- LIMIT applied inside a recursive CTE definition
39
+ -- =============================================================================
40
+
41
+ with recursive lim_cnt(n) as (
42
+ select 1
43
+ union all
44
+ select n + 1 from lim_cnt where n < 1000
45
+ limit 5
46
+ )
47
+ select n from lim_cnt order by n;
48
+ → [{"n":1},{"n":2},{"n":3},{"n":4},{"n":5}]
49
+
50
+ -- LIMIT 0 yields zero rows (no early base-case row leakage)
51
+ with recursive lim_zero(n) as (
52
+ select 1
53
+ union all
54
+ select n + 1 from lim_zero where n < 1000
55
+ limit 0
56
+ )
57
+ select n from lim_zero;
58
+ → []
59
+
60
+ -- =============================================================================
61
+ -- Nested WITH inside the base case of a recursive CTE — accepted by
62
+ -- parseQueryExpr (the inner WITH attaches to the inner SELECT, then the
63
+ -- recursive UNION ALL leg references the outer CTE name).
64
+ -- =============================================================================
65
+
66
+ with recursive r(n) as (
67
+ with base as (select 1 as start)
68
+ select start from base
69
+ union all
70
+ select n + 1 from r where n < 3
71
+ )
72
+ select n from r order by n;
73
+ → [{"n":1},{"n":2},{"n":3}]
74
+
75
+ -- =============================================================================
76
+ -- CTE inside a VIEW definition — CREATE VIEW body may begin with a WITH clause.
77
+ -- =============================================================================
78
+
79
+ create table cte_src (id integer primary key, val integer);
80
+ insert into cte_src values (1, 10), (2, 20), (3, 30);
81
+
82
+ create view cte_view as
83
+ with positives as (select id, val from cte_src where val > 15)
84
+ select id, val from positives;
85
+
86
+ select id, val from cte_view order by id;
87
+ → [{"id":2,"val":20},{"id":3,"val":30}]
88
+
89
+ drop view cte_view;
90
+ drop table cte_src;
91
+
92
+ -- =============================================================================
93
+ -- CTE column count mismatch (declared columns vs SELECT columns)
94
+ -- =============================================================================
95
+
96
+ with bad(a, b) as (select 1)
97
+ select * from bad;
98
+ -- error: declared columns
@@ -0,0 +1,166 @@
1
+ -- 13.5-cte-join-order.sqllogic - a WITH-clause reference must resolve the same
2
+ -- whichever side of a join it appears on
3
+ --
4
+ -- Regression guard for `bug-cte-reference-as-second-join-source-fails-at-runtime`.
5
+ --
6
+ -- Every FROM source gets a scope mapping its column names to plan attribute ids, and
7
+ -- a join combines the two peer scopes with MultiScope (first match wins). Each source
8
+ -- scope used to be built with the *enclosing* query's scope as its fallback parent, so
9
+ -- when MultiScope asked the LEFT peer about a name it did not own, the left peer did
10
+ -- not answer "no" — it forwarded the question to the enclosing scope and answered from
11
+ -- there. The right peer was never consulted.
12
+ --
13
+ -- `createCTEScope` registers a qualified `c.col` symbol for every WITH-clause column in
14
+ -- the enclosing scope, bound to the CTE *body's* attribute ids (not the ids a
15
+ -- CTEReferenceNode republishes). So `… from r join c on c.rid = r.id` resolved `c.rid`
16
+ -- through `r`'s scope → miss → enclosing scope → the body's attribute id, which nothing
17
+ -- below that point publishes, and the query died at runtime with
18
+ -- "No row context found for column rid". The mirrored `from c join r on …` worked only
19
+ -- because there the CTE reference is the left peer and answers first.
20
+ --
21
+ -- Fix: a FROM source's scope holds only its own columns (parented on EmptyScope); the
22
+ -- enclosing-query fallback is composed once by the consumer (ShadowScope).
23
+ --
24
+ -- Invariant pinned here: for each shape, both join orders return the same rows, and the
25
+ -- rows are the correct ones (row data, not just "did not crash").
26
+
27
+ create table r (id integer primary key, qty integer, label text);
28
+ insert into r values (1, 10, 'a'), (2, 20, 'b'), (3, 30, 'c');
29
+
30
+ create table o (oid integer primary key, rid integer, cat text, qty integer);
31
+ insert into o values (100, 1, 'x', 10), (101, 2, 'y', 20), (102, 2, 'z', 99), (103, 9, 'w', 5);
32
+
33
+ create table s (k text primary key, note text);
34
+ insert into s values ('x', 'X'), ('y', 'Y');
35
+
36
+ -- =============================================================================
37
+ -- The reported shape: WITH clause as the SECOND (right) join source. Before the
38
+ -- fix this threw "No row context found for column rid"; the mirrored order below
39
+ -- always worked, so the two must agree.
40
+ -- =============================================================================
41
+
42
+ with c as (select cat, qty, rid from o)
43
+ select count(*) as n from r join c on c.rid = r.id;
44
+ → [{"n":3}]
45
+
46
+ with c as (select cat, qty, rid from o)
47
+ select count(*) as n from c join r on c.rid = r.id;
48
+ → [{"n":3}]
49
+
50
+ -- Same shapes projecting real columns, so a wrong-rows regression is caught too.
51
+
52
+ with c as (select cat, qty, rid from o)
53
+ select r.id, c.cat from r join c on c.rid = r.id order by r.id, c.cat;
54
+ → [{"id":1,"cat":"x"},{"id":2,"cat":"y"},{"id":2,"cat":"z"}]
55
+
56
+ with c as (select cat, qty, rid from o)
57
+ select r.id, c.cat from c join r on c.rid = r.id order by r.id, c.cat;
58
+ → [{"id":1,"cat":"x"},{"id":2,"cat":"y"},{"id":2,"cat":"z"}]
59
+
60
+ -- =============================================================================
61
+ -- Operand-swapped ON condition — `c.rid` is looked up second rather than first.
62
+ -- =============================================================================
63
+
64
+ with c as (select cat, qty, rid from o)
65
+ select r.id, c.cat from r join c on r.id = c.rid order by r.id, c.cat;
66
+ → [{"id":1,"cat":"x"},{"id":2,"cat":"y"},{"id":2,"cat":"z"}]
67
+
68
+ -- =============================================================================
69
+ -- Non-key join column: the join cannot be answered by a primary-key seek, so a
70
+ -- different access path carries the same column reference.
71
+ -- =============================================================================
72
+
73
+ with c as (select cat, qty, rid from o)
74
+ select r.id, c.cat from r join c on c.qty = r.qty order by r.id, c.cat;
75
+ → [{"id":1,"cat":"x"},{"id":2,"cat":"y"}]
76
+
77
+ with c as (select cat, qty, rid from o)
78
+ select r.id, c.cat from c join r on c.qty = r.qty order by r.id, c.cat;
79
+ → [{"id":1,"cat":"x"},{"id":2,"cat":"y"}]
80
+
81
+ -- =============================================================================
82
+ -- LEFT JOIN with the WITH clause second — the null-extended side is the CTE.
83
+ -- =============================================================================
84
+
85
+ with c as (select cat, qty, rid from o)
86
+ select r.id, c.cat from r left join c on c.rid = r.id order by r.id, c.cat;
87
+ → [{"id":1,"cat":"x"},{"id":2,"cat":"y"},{"id":2,"cat":"z"},{"id":3,"cat":null}]
88
+
89
+ -- =============================================================================
90
+ -- Three-way join with the WITH clause in the MIDDLE: `(r join c) join s`. The
91
+ -- left peer of the outer join is itself a join, so its scope is a nested
92
+ -- MultiScope — the fall-through has to work through two levels.
93
+ -- =============================================================================
94
+
95
+ with c as (select cat, qty, rid from o)
96
+ select count(*) as n from r join c on c.rid = r.id join s on s.k = c.cat;
97
+ → [{"n":2}]
98
+
99
+ with c as (select cat, qty, rid from o)
100
+ select r.id, c.cat, s.note from r join c on c.rid = r.id join s on s.k = c.cat
101
+ order by r.id, c.cat;
102
+ → [{"id":1,"cat":"x","note":"X"},{"id":2,"cat":"y","note":"Y"}]
103
+
104
+ -- =============================================================================
105
+ -- The aliased spelling passed before the fix (the enclosing scope registers
106
+ -- `c.rid`, not `x.rid`, so the leak had nothing to hand back). Pinned so the fix
107
+ -- does not regress the shape that already worked.
108
+ -- =============================================================================
109
+
110
+ with c as (select cat, qty, rid from o)
111
+ select r.id, x.cat from r join c as x on x.rid = r.id order by r.id, x.cat;
112
+ → [{"id":1,"cat":"x"},{"id":2,"cat":"y"},{"id":2,"cat":"z"}]
113
+
114
+ -- =============================================================================
115
+ -- Naming a WITH-clause column without the CTE in FROM is a plain unresolved-column
116
+ -- error, not a confusing runtime row-context failure. (Before the fix, the stale
117
+ -- `c.cat → CTE body attribute id` registration in the enclosing scope made this
118
+ -- resolve to an id nothing publishes.)
119
+ -- =============================================================================
120
+
121
+ with c as (select cat, qty, rid from o)
122
+ select c.cat from r;
123
+ -- error: c.cat
124
+
125
+ -- =============================================================================
126
+ -- The shapes that ONLY the deleted registration could plausibly have served: a
127
+ -- `cteName.column` reference from somewhere other than the CTE's own SELECT list.
128
+ -- Each one names the CTE in a FROM, so it resolves through the reference's own
129
+ -- republished attribute ids — the ids that actually reach the runtime.
130
+ -- =============================================================================
131
+
132
+ -- CTE column read from a nested subquery, with the CTE in the OUTER from.
133
+
134
+ with c as (select rid, cat from o)
135
+ select c.rid, (select count(*) from r where r.id = c.rid) as n from c order by c.rid, c.cat;
136
+ → [{"rid":1,"n":1},{"rid":2,"n":1},{"rid":2,"n":1},{"rid":9,"n":0}]
137
+
138
+ -- CTE in an UPDATE's WHERE subquery.
139
+
140
+ with c as (select rid from o where cat = 'x')
141
+ update r set label = 'hit' where id in (select c.rid from c);
142
+ select id, label from r order by id;
143
+ → [{"id":1,"label":"hit"},{"id":2,"label":"b"},{"id":3,"label":"c"}]
144
+
145
+ -- CTE in an UPDATE's SET subquery, correlated to the update target.
146
+
147
+ with c as (select rid, cat from o where cat <> 'z')
148
+ update r set label = coalesce((select c.cat from c where c.rid = r.id), label);
149
+ select id, label from r order by id;
150
+ → [{"id":1,"label":"x"},{"id":2,"label":"y"},{"id":3,"label":"c"}]
151
+
152
+ -- CTE in a DELETE's WHERE subquery, with RETURNING.
153
+
154
+ with c as (select rid from o where cat = 'y')
155
+ delete from r where id in (select c.rid from c) returning id, label;
156
+ → [{"id":2,"label":"y"}]
157
+
158
+ -- CTE read from an UPDATE's RETURNING clause.
159
+
160
+ with c as (select rid from o)
161
+ update r set qty = qty + 1 returning id, (select count(*) from c) as total;
162
+ → [{"id":1,"total":4},{"id":3,"total":4}]
163
+
164
+ drop table s;
165
+ drop table o;
166
+ drop table r;