github-8906.slt 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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. mode cockroach
  10. # Regression test for https://github.com/MaterializeInc/database-issues/issues/8906
  11. # The setup is based on https://github.com/MaterializeInc/RQG/blob/main/conf/mz/simple.sql
  12. statement ok
  13. DROP TABLE IF EXISTS t1 CASCADE;
  14. statement ok
  15. DROP TABLE IF EXISTS t2 CASCADE;
  16. statement ok
  17. DROP TABLE IF EXISTS t3 CASCADE;
  18. statement ok
  19. CREATE TABLE t1 (f1 DOUBLE PRECISION, f2 DOUBLE PRECISION NOT NULL);
  20. statement ok
  21. CREATE INDEX t1i1 ON t1(f1);
  22. statement ok
  23. CREATE INDEX t1i2 ON t1(f2, f1);
  24. # one NULL row in t1
  25. statement ok
  26. INSERT INTO t1 VALUES (NULL, 0);
  27. # values 1 and 2 have 2 rows each in t1
  28. statement ok
  29. INSERT INTO t1 VALUES (1, 1);
  30. statement ok
  31. INSERT INTO t1 VALUES (1, 1);
  32. statement ok
  33. INSERT INTO t1 VALUES (2, 2);
  34. statement ok
  35. INSERT INTO t1 VALUES (2, 2);
  36. statement ok
  37. INSERT INTO t1 VALUES (3, 3);
  38. statement ok
  39. INSERT INTO t1 VALUES (4, 4);
  40. statement ok
  41. INSERT INTO t1 VALUES (5, 5);
  42. statement ok
  43. INSERT INTO t1 VALUES (6, 6);
  44. statement ok
  45. INSERT INTO t1 VALUES (7, 7);
  46. statement ok
  47. INSERT INTO t1 VALUES (8, 8);
  48. # value 9 not present in either table
  49. statement ok
  50. CREATE TABLE t2 (f1 DOUBLE PRECISION, f2 DOUBLE PRECISION NOT NULL);
  51. statement ok
  52. CREATE INDEX t2i1 ON t2(f1);
  53. statement ok
  54. CREATE INDEX i2i2 ON t2(f2, f1);
  55. # two NULL rows in t2
  56. statement ok
  57. INSERT INTO t2 VALUES (NULL, 0);
  58. statement ok
  59. INSERT INTO t2 VALUES (NULL, 0);
  60. statement ok
  61. INSERT INTO t2 VALUES (1, 1);
  62. # value 2 has 2 rows in t2
  63. statement ok
  64. INSERT INTO t2 VALUES (2, 2);
  65. statement ok
  66. INSERT INTO t2 VALUES (2, 2);
  67. # value 3 has no rows in t2
  68. statement ok
  69. INSERT INTO t2 VALUES (4, 4);
  70. statement ok
  71. INSERT INTO t2 VALUES (5, 5);
  72. statement ok
  73. INSERT INTO t2 VALUES (6, 6);
  74. statement ok
  75. INSERT INTO t2 VALUES (7, 7);
  76. statement ok
  77. INSERT INTO t2 VALUES (8, 8);
  78. # value 9 not present in either table
  79. statement ok
  80. CREATE TABLE t3 (f1 DOUBLE PRECISION, f2 DOUBLE PRECISION NOT NULL);
  81. statement ok
  82. CREATE MATERIALIZED VIEW pk1 AS SELECT DISTINCT ON (f1) f1 , f2 FROM t1 WHERE f1 IS NOT NULL AND f2 IS NOT NULL;
  83. statement ok
  84. CREATE MATERIALIZED VIEW pk2 AS SELECT DISTINCT ON (f1) f1 , f2 FROM t2 WHERE f1 IS NOT NULL AND f2 IS NOT NULL;
  85. statement ok
  86. CREATE MATERIALIZED VIEW pk3 AS SELECT DISTINCT ON (f1) f1 , f2 FROM t3 WHERE f1 IS NOT NULL AND f2 IS NOT NULL;
  87. query RRRR
  88. SELECT
  89. (
  90. SELECT inner2.f2
  91. FROM t1 AS inner1 RIGHT JOIN t2 AS inner2 ON (inner2.f2 + 1 = inner2.f2)
  92. WHERE outer2.f2 BETWEEN 0 AND 0 AND outer1.f2 = outer1.f1
  93. ORDER BY 1
  94. LIMIT 1
  95. ),
  96. (
  97. SELECT inner1.f1 + 1
  98. FROM t1 AS inner1 LEFT JOIN t2 AS inner2 ON (inner1.f2 + 1 BETWEEN inner2.f2 AND inner1.f2)
  99. WHERE outer1.f2 + 1 IS NULL AND inner2.f2 IS NULL
  100. ORDER BY 1
  101. LIMIT 1
  102. ),
  103. (
  104. SELECT inner1.f1 + 1
  105. FROM pk1 AS inner1, pk2 AS inner2
  106. WHERE inner2.f1 + 1 IS NOT NULL AND inner2.f2 IS NULL
  107. ORDER BY 1
  108. LIMIT 0
  109. ),
  110. (
  111. SELECT inner1.f1
  112. FROM t1 AS inner1 JOIN t2 AS inner2 ON (inner2.f2 + 1 BETWEEN 1 AND 1)
  113. WHERE inner2.f1 IS NOT NULL OR inner1.f1 IS NOT NULL
  114. ORDER BY 1
  115. LIMIT 1
  116. )
  117. FROM
  118. t1 AS outer1
  119. JOIN
  120. (
  121. SELECT DISTINCT inner1.f2 AS f1, inner1.f2 + 1 AS f2
  122. FROM pk2 AS inner1, pk2 AS inner2
  123. WHERE inner2.f1 IS NOT NULL
  124. )
  125. AS outer2
  126. ON (outer2.f1 BETWEEN 1 AND 8)
  127. WHERE
  128. outer1.f2 BETWEEN outer1.f1 AND outer2.f2 + 1
  129. AND
  130. outer2.f2
  131. = (
  132. SELECT inner2.f2
  133. FROM t1 AS inner1 JOIN t2 AS inner2 ON (inner2.f1 BETWEEN inner1.f1 AND 1)
  134. WHERE inner2.f1 + 1 IS NOT NULL AND outer2.f1 + 1 IS NULL
  135. ORDER BY 1
  136. LIMIT 0
  137. )
  138. AND
  139. outer1.f1 + 1
  140. = (
  141. SELECT inner1.f2 FROM t1 AS inner1, pk1 AS inner2 WHERE outer2.f2 > outer2.f1 + 1
  142. ORDER BY 1
  143. LIMIT 1
  144. )
  145. AND
  146. outer2.f2 + 1
  147. = (
  148. SELECT inner1.f1 + 1
  149. FROM t1 AS inner1 LEFT JOIN t2 AS inner2 ON (inner1.f2 IS NULL)
  150. WHERE inner1.f2 + 1 BETWEEN 1 AND outer2.f2
  151. ORDER BY 1
  152. LIMIT 1
  153. )
  154. AND
  155. NOT
  156. EXISTS (
  157. SELECT DISTINCT inner2.f1
  158. FROM t1 AS inner1 LEFT JOIN t2 AS inner2 ON (inner1.f2 BETWEEN inner1.f2 AND 1)
  159. WHERE inner1.f2 + 1 BETWEEN 8 AND inner1.f1 AND outer1.f2 BETWEEN 9 AND 1
  160. )
  161. OR
  162. outer2.f2 + 1 = outer1.f2 + 1;
  163. ----
  164. NULL NULL NULL 1
  165. NULL NULL NULL 1
  166. NULL NULL NULL 1
  167. NULL NULL NULL 1
  168. NULL NULL NULL 1
  169. NULL NULL NULL 1
  170. NULL NULL NULL 1