OLD | NEW |
(Empty) | |
| 1 # 2007 Sep 12 |
| 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 # |
| 12 # This file is to test that ticket #2640 has been fixed. |
| 13 # |
| 14 # $Id: tkt2640.test,v 1.3 2008/08/04 03:51:24 danielk1977 Exp $ |
| 15 # |
| 16 |
| 17 # The problem in ticket #2640 was that the query optimizer was |
| 18 # not recognizing all uses of tables within subqueries in the |
| 19 # WHERE clause. If the subquery contained a compound SELECT, |
| 20 # then tables that were used by terms of the compound other than |
| 21 # the last term would not be recognized as dependencies. |
| 22 # So if one of the SELECT statements within a compound made |
| 23 # use of a table that occurs later in a join, the query |
| 24 # optimizer would not recognize this and would try to evaluate |
| 25 # the subquery too early, before that tables value had been |
| 26 # established. |
| 27 |
| 28 set testdir [file dirname $argv0] |
| 29 source $testdir/tester.tcl |
| 30 |
| 31 ifcapable !subquery||!compound { |
| 32 finish_test |
| 33 return |
| 34 } |
| 35 |
| 36 do_test tkt2640-1.1 { |
| 37 execsql { |
| 38 CREATE TABLE persons(person_id, name); |
| 39 INSERT INTO persons VALUES(1,'fred'); |
| 40 INSERT INTO persons VALUES(2,'barney'); |
| 41 INSERT INTO persons VALUES(3,'wilma'); |
| 42 INSERT INTO persons VALUES(4,'pebbles'); |
| 43 INSERT INTO persons VALUES(5,'bambam'); |
| 44 CREATE TABLE directors(person_id); |
| 45 INSERT INTO directors VALUES(5); |
| 46 INSERT INTO directors VALUES(3); |
| 47 CREATE TABLE writers(person_id); |
| 48 INSERT INTO writers VALUES(2); |
| 49 INSERT INTO writers VALUES(3); |
| 50 INSERT INTO writers VALUES(4); |
| 51 SELECT DISTINCT p.name |
| 52 FROM persons p, directors d |
| 53 WHERE d.person_id=p.person_id |
| 54 AND NOT EXISTS ( |
| 55 SELECT person_id FROM directors d1 WHERE d1.person_id=p.person_id |
| 56 EXCEPT |
| 57 SELECT person_id FROM writers w |
| 58 ); |
| 59 } |
| 60 } {wilma} |
| 61 do_test tkt2640-1.2 { |
| 62 execsql { |
| 63 SELECT DISTINCT p.name |
| 64 FROM persons p CROSS JOIN directors d |
| 65 WHERE d.person_id=p.person_id |
| 66 AND NOT EXISTS ( |
| 67 SELECT person_id FROM directors d1 WHERE d1.person_id=p.person_id |
| 68 EXCEPT |
| 69 SELECT person_id FROM writers w |
| 70 ); |
| 71 } |
| 72 } {wilma} |
| 73 do_test tkt2640-1.3 { |
| 74 execsql { |
| 75 SELECT DISTINCT p.name |
| 76 FROM directors d CROSS JOIN persons p |
| 77 WHERE d.person_id=p.person_id |
| 78 AND NOT EXISTS ( |
| 79 SELECT person_id FROM directors d1 WHERE d1.person_id=p.person_id |
| 80 EXCEPT |
| 81 SELECT person_id FROM writers w |
| 82 ); |
| 83 } |
| 84 } {wilma} |
| 85 do_test tkt2640-1.4 { |
| 86 execsql { |
| 87 SELECT DISTINCT p.name |
| 88 FROM persons p, directors d |
| 89 WHERE d.person_id=p.person_id |
| 90 AND NOT EXISTS ( |
| 91 SELECT person_id FROM directors d1 WHERE d1.person_id=d.person_id |
| 92 EXCEPT |
| 93 SELECT person_id FROM writers w |
| 94 ); |
| 95 } |
| 96 } {wilma} |
| 97 do_test tkt2640-1.5 { |
| 98 execsql { |
| 99 SELECT DISTINCT p.name |
| 100 FROM persons p CROSS JOIN directors d |
| 101 WHERE d.person_id=p.person_id |
| 102 AND NOT EXISTS ( |
| 103 SELECT person_id FROM directors d1 WHERE d1.person_id=d.person_id |
| 104 EXCEPT |
| 105 SELECT person_id FROM writers w |
| 106 ); |
| 107 } |
| 108 } {wilma} |
| 109 do_test tkt2640-1.6 { |
| 110 execsql { |
| 111 SELECT DISTINCT p.name |
| 112 FROM directors d CROSS JOIN persons p |
| 113 WHERE d.person_id=p.person_id |
| 114 AND NOT EXISTS ( |
| 115 SELECT person_id FROM directors d1 WHERE d1.person_id=d.person_id |
| 116 EXCEPT |
| 117 SELECT person_id FROM writers w |
| 118 ); |
| 119 } |
| 120 } {wilma} |
| 121 |
| 122 |
| 123 |
| 124 finish_test |
OLD | NEW |