| 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 |