github-8261-8463-9156.slt 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. # Copyright Materialize, Inc. and contributors. All rights reserved.
  2. #
  3. # Use of this software is governed by the Business Source License
  4. # included in the LICENSE file at the root of this repository.
  5. #
  6. # As of the Change Date specified in that file, in accordance with
  7. # the Business Source License, use of this software will be governed
  8. # by the Apache License, Version 2.0.
  9. # Regression test for database-issues#8261 and database-issues#8463.
  10. # The setup is based on https://github.com/MaterializeInc/RQG/blob/main/conf/mz/simple.sql
  11. statement ok
  12. DROP TABLE IF EXISTS t1 CASCADE;
  13. statement ok
  14. DROP TABLE IF EXISTS t2 CASCADE;
  15. statement ok
  16. DROP TABLE IF EXISTS t3 CASCADE;
  17. statement ok
  18. CREATE TABLE t1 (f1 DOUBLE PRECISION, f2 DOUBLE PRECISION NOT NULL);
  19. statement ok
  20. CREATE INDEX t1i1 ON t1(f1);
  21. statement ok
  22. CREATE INDEX t1i2 ON t1(f2, f1);
  23. # one NULL row in t1
  24. statement ok
  25. INSERT INTO t1 VALUES (NULL, 0);
  26. # values 1 and 2 have 2 rows each in t1
  27. statement ok
  28. INSERT INTO t1 VALUES (1, 1);
  29. statement ok
  30. INSERT INTO t1 VALUES (1, 1);
  31. statement ok
  32. INSERT INTO t1 VALUES (2, 2);
  33. statement ok
  34. INSERT INTO t1 VALUES (2, 2);
  35. statement ok
  36. INSERT INTO t1 VALUES (3, 3);
  37. statement ok
  38. INSERT INTO t1 VALUES (4, 4);
  39. statement ok
  40. INSERT INTO t1 VALUES (5, 5);
  41. statement ok
  42. INSERT INTO t1 VALUES (6, 6);
  43. statement ok
  44. INSERT INTO t1 VALUES (7, 7);
  45. statement ok
  46. INSERT INTO t1 VALUES (8, 8);
  47. # value 9 not present in either table
  48. statement ok
  49. CREATE TABLE t2 (f1 DOUBLE PRECISION, f2 DOUBLE PRECISION NOT NULL);
  50. statement ok
  51. CREATE INDEX t2i1 ON t2(f1);
  52. statement ok
  53. CREATE INDEX i2i2 ON t2(f2, f1);
  54. # two NULL rows in t2
  55. statement ok
  56. INSERT INTO t2 VALUES (NULL, 0);
  57. statement ok
  58. INSERT INTO t2 VALUES (NULL, 0);
  59. statement ok
  60. INSERT INTO t2 VALUES (1, 1);
  61. # value 2 has 2 rows in t2
  62. statement ok
  63. INSERT INTO t2 VALUES (2, 2);
  64. statement ok
  65. INSERT INTO t2 VALUES (2, 2);
  66. # value 3 has no rows in t2
  67. statement ok
  68. INSERT INTO t2 VALUES (4, 4);
  69. statement ok
  70. INSERT INTO t2 VALUES (5, 5);
  71. statement ok
  72. INSERT INTO t2 VALUES (6, 6);
  73. statement ok
  74. INSERT INTO t2 VALUES (7, 7);
  75. statement ok
  76. INSERT INTO t2 VALUES (8, 8);
  77. # value 9 not present in either table
  78. statement ok
  79. CREATE TABLE t3 (f1 DOUBLE PRECISION, f2 DOUBLE PRECISION NOT NULL);
  80. statement ok
  81. CREATE MATERIALIZED VIEW pk1 AS SELECT DISTINCT ON (f1) f1 , f2 FROM t1 WHERE f1 IS NOT NULL AND f2 IS NOT NULL;
  82. statement ok
  83. CREATE MATERIALIZED VIEW pk2 AS SELECT DISTINCT ON (f1) f1 , f2 FROM t2 WHERE f1 IS NOT NULL AND f2 IS NOT NULL;
  84. statement ok
  85. CREATE MATERIALIZED VIEW pk3 AS SELECT DISTINCT ON (f1) f1 , f2 FROM t3 WHERE f1 IS NOT NULL AND f2 IS NOT NULL;
  86. # database-issues#8261
  87. query RRRIR
  88. SELECT (a1.f1) AS c1, (a2.f1) AS c2, (a1.f2) AS c3, (count(a1.f2)) AS agg1, (max(a1.f1 + a1.f1)) AS agg2
  89. FROM
  90. pk2 AS a1
  91. RIGHT JOIN
  92. (
  93. SELECT avg(a2.f1) AS f1, count(a1.f1) AS f2
  94. FROM pk1 AS a1 RIGHT JOIN pk1 AS a2 ON (NULLIF (a2.f2, a1.f1) = a2.f2 + a2.f2 + a2.f1)
  95. WHERE
  96. a2.f2 + a2.f1 IS NOT NULL AND a2.f2 NOT IN ( 4, 9, 9 )
  97. AND
  98. a1.f2
  99. NOT IN (
  100. SELECT agg1 AS x1
  101. FROM
  102. (
  103. SELECT
  104. (a1.f1) AS c1,
  105. (a2.f1) AS c2,
  106. (a1.f2) AS c3,
  107. (avg(NULLIF (a2.f2, a2.f2))) AS agg1,
  108. (max(a2.f2)) AS agg2
  109. FROM
  110. (
  111. SELECT a1.f1 AS f1, a1.f2 AS f2
  112. FROM t2 AS a1 LEFT JOIN t2 AS a2 USING(f1)
  113. WHERE
  114. a2.f2 + a2.f2 IS NULL
  115. OR
  116. NOT (NULLIF (a2.f1, a2.f1) IN ( 6, 9, 4, 5, 1 ))
  117. AND
  118. NOT (a1.f2 + a2.f2 IS NULL)
  119. AND
  120. a1.f2 < a2.f1
  121. ORDER BY 1, 2
  122. )
  123. AS a1
  124. LEFT JOIN t2 AS a2 USING(f2)
  125. WHERE a2.f2 NOT IN ( 6, 0, 0 ) AND a2.f2 IS NOT NULL AND a2.f2 IN ( 4, 5 )
  126. GROUP BY 1, 2, 3
  127. UNION
  128. SELECT DISTINCT
  129. (a2.f2) AS c1,
  130. (a1.f2) AS c2,
  131. (NULLIF (a1.f2, a1.f2)) AS c3,
  132. (avg(a1.f1 + a2.f2)) AS agg1,
  133. (avg(DISTINCT a1.f1)) AS agg2
  134. FROM
  135. (
  136. SELECT
  137. count(a1.f2) AS f1,
  138. min(a2.f1 + NULLIF (a1.f2, a2.f2)) AS f2
  139. FROM
  140. pk1 AS a1
  141. JOIN
  142. t2 AS a2
  143. ON
  144. (
  145. NOT
  146. (
  147. NULLIF (a1.f2, a1.f2)
  148. NOT IN (
  149. 4, 9, 3, 5
  150. )
  151. )
  152. )
  153. WHERE
  154. a1.f2 IS NULL
  155. OR
  156. NULLIF (a1.f2, a2.f2) = a2.f2
  157. AND
  158. a1.f1 + a1.f2 IN ( 7, 0, 4, 6 )
  159. ORDER BY 1, 2
  160. )
  161. AS a1
  162. JOIN t2 AS a2 USING(f1)
  163. WHERE
  164. a1.f2 IS NULL
  165. OR
  166. NULLIF (a2.f2, a1.f1) IS NOT NULL
  167. AND
  168. NOT (NOT (NOT (a1.f2 + NULLIF (a1.f2, a2.f2) IN ( 7, 8 ))))
  169. AND
  170. NULLIF (a2.f2, a2.f2) < a1.f1 + NULLIF (a1.f1, a1.f2)
  171. AND
  172. NOT (a1.f2 > NULLIF (a2.f2, a1.f1))
  173. GROUP BY 1, 2, 3
  174. )
  175. AS dt
  176. ORDER BY 1
  177. )
  178. ORDER BY 1, 2
  179. LIMIT 1
  180. )
  181. AS a2
  182. ON (NULLIF (a2.f2, a1.f2) = a1.f2)
  183. WHERE
  184. a1.f1
  185. NOT IN (
  186. SELECT c1 AS x1
  187. FROM
  188. (
  189. SELECT
  190. (NULLIF (a1.f2, a2.f2)) AS c1,
  191. (NULLIF (a2.f1, a2.f1)) AS c2,
  192. (a2.f1) AS c3,
  193. (min(a2.f2)) AS agg1,
  194. (min(a2.f2 + a1.f1)) AS agg2
  195. FROM t1 AS a1 LEFT JOIN (SELECT * FROM (VALUES (1, 2)) AS pk1 (f1, f2)) AS a2 USING(f1, f2)
  196. WHERE a2.f2 < a1.f2 OR a1.f2 + a2.f2 > a1.f2 + a2.f2
  197. GROUP BY 1, 2, 3
  198. EXCEPT ALL
  199. SELECT
  200. (a1.f2) AS c1,
  201. (a1.f2 + a1.f2) AS c2,
  202. (a2.f2 + a2.f1) AS c3,
  203. (max(a1.f1 + a2.f1)) AS agg1,
  204. (max(a2.f2 + a2.f2)) AS agg2
  205. FROM
  206. pk1 AS a1
  207. JOIN
  208. (
  209. SELECT a1.f2 AS f1, NULLIF (a2.f2, a2.f2) AS f2
  210. FROM pk1 AS a1 RIGHT JOIN t1 AS a2 ON (NULLIF (a2.f1, a2.f2) IS NULL)
  211. WHERE
  212. a1.f1 IS NOT NULL AND NULLIF (a2.f1, a2.f1) NOT IN ( 9, 6, 4 )
  213. AND
  214. NULLIF (a2.f1, a2.f2) NOT IN ( 9, 1 )
  215. ORDER BY 1, 2
  216. LIMIT 1
  217. OFFSET 4
  218. )
  219. AS a2
  220. ON (a2.f2 + a2.f2 + a1.f2 < a2.f2)
  221. WHERE a2.f2 + a1.f1 + a1.f2 > a1.f2 + a1.f2 + a1.f1 OR a2.f1 = a2.f2
  222. GROUP BY 1, 2, 3
  223. )
  224. AS dt
  225. ORDER BY 1
  226. )
  227. AND
  228. a2.f2 NOT IN ( 1, 2, 6, 7 )
  229. OR
  230. NOT (NOT (a2.f2 + a1.f1 = a1.f2))
  231. GROUP BY 1, 2, 3;
  232. ----
  233. NULL
  234. 4.571
  235. NULL
  236. 0
  237. NULL
  238. # database-issues#8463
  239. query RR
  240. SELECT
  241. a1.f1 AS c3,
  242. a1.f2
  243. FROM
  244. (SELECT 1 AS f1, 2 AS f2) AS a1
  245. RIGHT JOIN (
  246. SELECT avg(a2.f2) AS f1, min(a1.f2) AS f2
  247. FROM pk2 AS a1
  248. LEFT JOIN pk2 AS a2 USING(f1)
  249. WHERE a2.f1 IS NULL
  250. ) AS a2
  251. ON (NULLIF (a1.f2, a2.f2) = a1.f1 + a2.f2);
  252. ----
  253. NULL
  254. NULL
  255. # database-issues#9156
  256. simple conn=mz_system,user=mz_system
  257. ALTER SYSTEM SET enable_eager_delta_joins TO true;
  258. ----
  259. COMPLETE 0
  260. query
  261. SELECT
  262. FROM
  263. (
  264. SELECT a2.f2 AS f1, a2.f1 AS f2
  265. FROM t2 AS a1 JOIN pk1 AS a2 USING(f1, f2)
  266. WHERE a2.f1 = (NULLIF (a1.f2, a2.f2)) AND (a1.f1 + a2.f2) = a2.f2
  267. ) AS a1
  268. JOIN (SELECT a2.f2 AS f1, avg(a2.f2) AS f2 FROM t1 AS a2 GROUP BY 1) AS a2 USING(f1, f2);
  269. ----