delete-using.td 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  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. # Additional test cases for DELETE ... USING, beyond those in update.td
  10. > CREATE TABLE t1 (f1 INTEGER);
  11. > CREATE TABLE t2 (f1 INTEGER);
  12. > CREATE TABLE t3 (f1 INTEGER);
  13. ! DELETE FROM t1 USING t1;
  14. contains:table name "t1" specified more than once
  15. # Ambiguous column name
  16. ! DELETE FROM t1 USING t2 WHERE f1 = 1;
  17. contains:column reference "f1" is ambiguous
  18. #
  19. # Self-join
  20. #
  21. > INSERT INTO t1 VALUES (1), (10), (100);
  22. > DELETE FROM t1 AS a1 USING t1 AS a2;
  23. > SELECT COUNT(*) from t1;
  24. 0
  25. # Impossible join condition
  26. > INSERT INTO t1 VALUES (1), (10), (100);
  27. > INSERT INTO t2 VALUES (1), (10), (100);
  28. > DELETE FROM t1 USING t2 WHERE FALSE;
  29. > SELECT COUNT(*) FROM t1;
  30. 3
  31. > DELETE FROM t1;
  32. > DELETE FROM t2;
  33. # Null handling
  34. > INSERT INTO t1 VALUES (1), (NULL);
  35. > INSERT INTO t2 VALUES (1), (NULL);
  36. > DELETE FROM t1 USING t2 WHERE t1.f1 = t2.f1;
  37. > SELECT * FROM t1;
  38. <null>
  39. > DELETE FROM t1;
  40. > DELETE FROM t2;
  41. # Non-equality join condition
  42. > INSERT INTO t1 VALUES (1), (2), (3);
  43. > INSERT INTO t2 VALUES (1);
  44. > DELETE FROM t1 USING t2 WHERE t1.f1 > t2.f1;
  45. > SELECT * FROM t1;
  46. 1
  47. > DELETE FROM t1;
  48. > DELETE FROM t2;
  49. > INSERT INTO t1 VALUES (1), (2), (3);
  50. > INSERT INTO t2 VALUES (1);
  51. > DELETE FROM t1 USING t2 WHERE t1.f1 IN (t2.f1, t2.f1 + 1);
  52. > SELECT * FROM t1;
  53. 3
  54. > DELETE FROM t1;
  55. > DELETE FROM t2;
  56. # Join condition OR-ed to a predicate
  57. > INSERT INTO t1 VALUES (1), (10), (100);
  58. > INSERT INTO t2 VALUES (1);
  59. > DELETE FROM t1 USING t2 WHERE t1.f1 = t2.f1 OR t1.f1 = 100;
  60. > SELECT * FROM t1;
  61. 10
  62. > DELETE FROM t1;
  63. > DELETE FROM t2;
  64. # Join condition AND-ed to a predicate
  65. > INSERT INTO t1 VALUES (1),(10),(100);
  66. > INSERT INTO t2 VALUES (1),(10);
  67. > DELETE FROM t1 USING t2 WHERE t1.f1 = t2.f1 AND t1.f1 = 10;
  68. > SELECT * FROM t1;
  69. 1
  70. 100
  71. > DELETE FROM t1;
  72. > DELETE FROM t2;
  73. # Join with an empty table does not delete anything
  74. > INSERT INTO t1 VALUES (1),(10),(100);
  75. > DELETE FROM t1 USING t2 WHERE t1.f1 = t2.f1 OR t1.f1 = 10;
  76. > SELECT COUNT(*) FROM t1;
  77. 3
  78. > DELETE FROM t1;
  79. # Multi-table join
  80. > INSERT INTO t1 VALUES (1),(10),(100);
  81. > INSERT INTO t2 VALUES (1), (10);
  82. > INSERT INTO t3 VALUES (1);
  83. > DELETE FROM t1 USING t2, t3 WHERE t1.f1 = t2.f1 AND t1.f1 = t3.f1;
  84. > SELECT * FROM t1;
  85. 10
  86. 100
  87. > DELETE FROM t1;
  88. > DELETE FROM t2;
  89. > DELETE FROM t3;
  90. # Empty join condition
  91. > INSERT INTO t1 VALUES (1),(10),(100);
  92. > INSERT INTO t2 VALUES (1000);
  93. > DELETE FROM t1 USING t2;
  94. > SELECT COUNT(*) FROM t1;
  95. 0
  96. > DELETE FROM t1;
  97. > DELETE FROM t2;
  98. # JOIN ... USING ()
  99. > INSERT INTO t1 VALUES (1),(10),(100);
  100. > INSERT INTO t2 VALUES (100);
  101. > INSERT INTO t3 VALUES (100);
  102. > DELETE FROM t1 USING t2 JOIN t3 USING (f1) WHERE t1.f1 = t2.f1;
  103. > SELECT * FROM t1;
  104. 1
  105. 10
  106. > DELETE FROM t1;
  107. > DELETE FROM t2;
  108. > DELETE FROM t3;
  109. # Outer joins
  110. > INSERT INTO t1 VALUES (1), (2), (3), (NULL);
  111. > INSERT INTO t2 VALUES (1), (2);
  112. > INSERT INTO t3 VALUES (1), (3);
  113. > DELETE FROM t1 USING t2 LEFT JOIN t3 ON (t2.f1 = t3.f1) WHERE t1.f1 = t2.f1;
  114. > SELECT * FROM t1;
  115. 3
  116. <null>
  117. > DELETE FROM t1;
  118. > DELETE FROM t2;
  119. > DELETE FROM t3;
  120. > INSERT INTO t1 VALUES (1), (2), (3), (NULL);
  121. > INSERT INTO t2 VALUES (1), (2);
  122. > INSERT INTO t3 VALUES (1), (3);
  123. > DELETE FROM t1 USING t2 LEFT JOIN t3 ON (FALSE) WHERE t1.f1 = t2.f1;
  124. > SELECT * FROM t1;
  125. 3
  126. <null>
  127. > DELETE FROM t1;
  128. > DELETE FROM t2;
  129. > DELETE FROM t3;
  130. # Derived table
  131. > INSERT INTO t1 VALUES (1), (2), (3), (4), (5);
  132. > INSERT INTO t2 VALUES (2), (2), (3), (3), (3);
  133. > DELETE FROM t1 USING (SELECT f1 FROM t2 GROUP BY f1) AS a2 WHERE t1.f1 = a2.f1;
  134. > SELECT * FROM t1;
  135. 1
  136. 4
  137. 5
  138. > DELETE FROM t1;
  139. > DELETE FROM t2;
  140. # Union
  141. > INSERT INTO t1 VALUES (1), (2), (3), (4), (5);
  142. > INSERT INTO t2 VALUES (2), (2);
  143. > INSERT INTO t3 VALUES (3), (3), (3);
  144. > DELETE FROM t1 USING (SELECT f1 FROM t2 UNION ALL SELECT f1 FROM t3) AS a2 WHERE t1.f1 = a2.f1;
  145. > SELECT * FROM t1;
  146. 1
  147. 4
  148. 5
  149. > DELETE FROM t1;
  150. > DELETE FROM t2;
  151. > DELETE FROM t3;