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 |