tkt-31338dca7e.test 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. # 2009 December 16
  2. #
  3. # The author disclaims copyright to this source code. In place of
  4. # a legal notice, here is a blessing:
  5. #
  6. # May you do good and not evil.
  7. # May you find forgiveness for yourself and forgive others.
  8. # May you share freely, never taking more than you give.
  9. #
  10. #***********************************************************************
  11. # This file implements regression tests for SQLite library.
  12. #
  13. # This file implements tests to verify that ticket [31338dca7e] has been
  14. # fixed. Ticket [31338dca7e] demonstrates problems with the OR-clause
  15. # optimization in joins where the WHERE clause is of the form
  16. #
  17. # (x AND y) OR z
  18. #
  19. # And the x and y subterms from from different tables of the join.
  20. #
  21. set testdir [file dirname $argv0]
  22. source $testdir/tester.tcl
  23. do_test tkt-31338-1.1 {
  24. db eval {
  25. CREATE TABLE t1(x);
  26. CREATE TABLE t2(y);
  27. INSERT INTO t1 VALUES(111);
  28. INSERT INTO t1 VALUES(222);
  29. INSERT INTO t2 VALUES(333);
  30. INSERT INTO t2 VALUES(444);
  31. SELECT * FROM t1, t2
  32. WHERE (x=111 AND y!=444) OR x=222
  33. ORDER BY x, y;
  34. }
  35. } {111 333 222 333 222 444}
  36. do_test tkt-31338-1.2 {
  37. db eval {
  38. CREATE INDEX t1x ON t1(x);
  39. SELECT * FROM t1, t2
  40. WHERE (x=111 AND y!=444) OR x=222
  41. ORDER BY x, y;
  42. }
  43. } {111 333 222 333 222 444}
  44. do_test tkt-31338-2.1 {
  45. db eval {
  46. CREATE TABLE t3(v,w);
  47. CREATE TABLE t4(x,y);
  48. CREATE TABLE t5(z);
  49. INSERT INTO t3 VALUES(111,222);
  50. INSERT INTO t3 VALUES(333,444);
  51. INSERT INTO t4 VALUES(222,333);
  52. INSERT INTO t4 VALUES(444,555);
  53. INSERT INTO t5 VALUES(888);
  54. INSERT INTO t5 VALUES(999);
  55. SELECT * FROM t3, t4, t5
  56. WHERE (v=111 AND x=w AND z!=999) OR (v=333 AND x=444)
  57. ORDER BY v, w, x, y, z;
  58. }
  59. } {111 222 222 333 888 333 444 444 555 888 333 444 444 555 999}
  60. do_test tkt-31338-2.2 {
  61. db eval {
  62. CREATE INDEX t3v ON t3(v);
  63. CREATE INDEX t4x ON t4(x);
  64. SELECT * FROM t3, t4, t5
  65. WHERE (v=111 AND x=w AND z!=999) OR (v=333 AND x=444)
  66. ORDER BY v, w, x, y, z;
  67. }
  68. } {111 222 222 333 888 333 444 444 555 888 333 444 444 555 999}
  69. # Ticket [2c2de252666662f5459904fc33a9f2956cbff23c]
  70. #
  71. do_test tkt-31338-3.1 {
  72. foreach x [db eval {SELECT name FROM sqlite_master WHERE type='table'}] {
  73. db eval "DROP TABLE $x"
  74. }
  75. db eval {
  76. CREATE TABLE t1(a,b,c,d);
  77. CREATE TABLE t2(e,f);
  78. INSERT INTO t1 VALUES(1,2,3,4);
  79. INSERT INTO t2 VALUES(10,-8);
  80. CREATE INDEX t1a ON t1(a);
  81. CREATE INDEX t1b ON t1(b);
  82. CREATE TABLE t3(g);
  83. INSERT INTO t3 VALUES(4);
  84. CREATE TABLE t4(h);
  85. INSERT INTO t4 VALUES(5);
  86. SELECT * FROM t3 LEFT JOIN t1 ON d=g LEFT JOIN t4 ON c=h
  87. WHERE (a=1 AND h=4)
  88. OR (b IN (
  89. SELECT x FROM (SELECT e+f AS x, e FROM t2 ORDER BY 1 LIMIT 2)
  90. GROUP BY e
  91. ));
  92. }
  93. } {4 1 2 3 4 {}}
  94. do_test tkt-31338-3.2 {
  95. db eval {
  96. SELECT * FROM t3 LEFT JOIN t1 ON d=g LEFT JOIN t4 ON c=h
  97. WHERE (a=1 AND h=4)
  98. OR (b=2 AND b NOT IN (
  99. SELECT x+1 FROM (SELECT e+f AS x, e FROM t2 ORDER BY 1 LIMIT 2)
  100. GROUP BY e
  101. ));
  102. }
  103. } {4 1 2 3 4 {}}
  104. do_test tkt-31338-3.3 {
  105. db eval {
  106. SELECT * FROM t3 LEFT JOIN t1 ON d=g LEFT JOIN t4 ON c=h
  107. WHERE (+a=1 AND h=4)
  108. OR (b IN (
  109. SELECT x FROM (SELECT e+f AS x, e FROM t2 ORDER BY 1 LIMIT 2)
  110. GROUP BY e
  111. ));
  112. }
  113. } {4 1 2 3 4 {}}
  114. do_test tkt-31338-3.4 {
  115. db eval {
  116. SELECT * FROM t3 LEFT JOIN t1 ON d=g LEFT JOIN t4 ON c=h
  117. WHERE (a=1 AND h=4)
  118. OR (+b IN (
  119. SELECT x FROM (SELECT e+f AS x, e FROM t2 ORDER BY 1 LIMIT 2)
  120. GROUP BY e
  121. ));
  122. }
  123. } {4 1 2 3 4 {}}
  124. do_test tkt-31338-3.5 {
  125. db eval {
  126. CREATE TABLE t5(a,b,c,d,e,f);
  127. CREATE TABLE t6(g,h);
  128. CREATE TRIGGER t6r AFTER INSERT ON t6 BEGIN
  129. INSERT INTO t5
  130. SELECT * FROM t3 LEFT JOIN t1 ON d=g LEFT JOIN t4 ON c=h
  131. WHERE (a=1 AND h=4)
  132. OR (b IN (
  133. SELECT x FROM (SELECT e+f AS x, e FROM t2 ORDER BY 1 LIMIT 2)
  134. GROUP BY e
  135. ));
  136. END;
  137. INSERT INTO t6 VALUES(88,99);
  138. SELECT * FROM t5;
  139. }
  140. } {4 1 2 3 4 {}}
  141. do_test tkt-31338-3.6 {
  142. db eval {
  143. INSERT INTO t1 VALUES(2,4,3,4);
  144. INSERT INTO t1 VALUES(99,101,3,4);
  145. INSERT INTO t1 VALUES(98,97,3,4);
  146. SELECT * FROM t3 LEFT JOIN t1 ON d=g LEFT JOIN t4 ON c=h
  147. WHERE (a=1 AND h=4)
  148. OR (b IN (
  149. SELECT x+a FROM (SELECT e+f AS x, e FROM t2 ORDER BY 1 LIMIT 2)
  150. GROUP BY e
  151. ));
  152. }
  153. } {4 2 4 3 4 {} 4 99 101 3 4 {}}
  154. do_test tkt-31338-3.7 {
  155. db eval {
  156. SELECT * FROM t3 LEFT JOIN t1 ON d=g LEFT JOIN t4 ON c=h
  157. WHERE (a=1 AND h=4)
  158. OR (b IN (
  159. SELECT x FROM (SELECT e+f+a AS x, e FROM t2 ORDER BY 1 LIMIT 2)
  160. GROUP BY e
  161. ));
  162. }
  163. } {4 2 4 3 4 {} 4 99 101 3 4 {}}
  164. finish_test