Index: third_party/sqlite/sqlite-src-3070603/test/tkt2640.test |
diff --git a/third_party/sqlite/sqlite-src-3070603/test/tkt2640.test b/third_party/sqlite/sqlite-src-3070603/test/tkt2640.test |
new file mode 100644 |
index 0000000000000000000000000000000000000000..13a17e095ebbf8b1b7a92417cefeadd2a5385f2d |
--- /dev/null |
+++ b/third_party/sqlite/sqlite-src-3070603/test/tkt2640.test |
@@ -0,0 +1,124 @@ |
+# 2007 Sep 12 |
+# |
+# The author disclaims copyright to this source code. In place of |
+# a legal notice, here is a blessing: |
+# |
+# May you do good and not evil. |
+# May you find forgiveness for yourself and forgive others. |
+# May you share freely, never taking more than you give. |
+# |
+#*********************************************************************** |
+# |
+# This file is to test that ticket #2640 has been fixed. |
+# |
+# $Id: tkt2640.test,v 1.3 2008/08/04 03:51:24 danielk1977 Exp $ |
+# |
+ |
+# The problem in ticket #2640 was that the query optimizer was |
+# not recognizing all uses of tables within subqueries in the |
+# WHERE clause. If the subquery contained a compound SELECT, |
+# then tables that were used by terms of the compound other than |
+# the last term would not be recognized as dependencies. |
+# So if one of the SELECT statements within a compound made |
+# use of a table that occurs later in a join, the query |
+# optimizer would not recognize this and would try to evaluate |
+# the subquery too early, before that tables value had been |
+# established. |
+ |
+set testdir [file dirname $argv0] |
+source $testdir/tester.tcl |
+ |
+ifcapable !subquery||!compound { |
+ finish_test |
+ return |
+} |
+ |
+do_test tkt2640-1.1 { |
+ execsql { |
+ CREATE TABLE persons(person_id, name); |
+ INSERT INTO persons VALUES(1,'fred'); |
+ INSERT INTO persons VALUES(2,'barney'); |
+ INSERT INTO persons VALUES(3,'wilma'); |
+ INSERT INTO persons VALUES(4,'pebbles'); |
+ INSERT INTO persons VALUES(5,'bambam'); |
+ CREATE TABLE directors(person_id); |
+ INSERT INTO directors VALUES(5); |
+ INSERT INTO directors VALUES(3); |
+ CREATE TABLE writers(person_id); |
+ INSERT INTO writers VALUES(2); |
+ INSERT INTO writers VALUES(3); |
+ INSERT INTO writers VALUES(4); |
+ SELECT DISTINCT p.name |
+ FROM persons p, directors d |
+ WHERE d.person_id=p.person_id |
+ AND NOT EXISTS ( |
+ SELECT person_id FROM directors d1 WHERE d1.person_id=p.person_id |
+ EXCEPT |
+ SELECT person_id FROM writers w |
+ ); |
+ } |
+} {wilma} |
+do_test tkt2640-1.2 { |
+ execsql { |
+ SELECT DISTINCT p.name |
+ FROM persons p CROSS JOIN directors d |
+ WHERE d.person_id=p.person_id |
+ AND NOT EXISTS ( |
+ SELECT person_id FROM directors d1 WHERE d1.person_id=p.person_id |
+ EXCEPT |
+ SELECT person_id FROM writers w |
+ ); |
+ } |
+} {wilma} |
+do_test tkt2640-1.3 { |
+ execsql { |
+ SELECT DISTINCT p.name |
+ FROM directors d CROSS JOIN persons p |
+ WHERE d.person_id=p.person_id |
+ AND NOT EXISTS ( |
+ SELECT person_id FROM directors d1 WHERE d1.person_id=p.person_id |
+ EXCEPT |
+ SELECT person_id FROM writers w |
+ ); |
+ } |
+} {wilma} |
+do_test tkt2640-1.4 { |
+ execsql { |
+ SELECT DISTINCT p.name |
+ FROM persons p, directors d |
+ WHERE d.person_id=p.person_id |
+ AND NOT EXISTS ( |
+ SELECT person_id FROM directors d1 WHERE d1.person_id=d.person_id |
+ EXCEPT |
+ SELECT person_id FROM writers w |
+ ); |
+ } |
+} {wilma} |
+do_test tkt2640-1.5 { |
+ execsql { |
+ SELECT DISTINCT p.name |
+ FROM persons p CROSS JOIN directors d |
+ WHERE d.person_id=p.person_id |
+ AND NOT EXISTS ( |
+ SELECT person_id FROM directors d1 WHERE d1.person_id=d.person_id |
+ EXCEPT |
+ SELECT person_id FROM writers w |
+ ); |
+ } |
+} {wilma} |
+do_test tkt2640-1.6 { |
+ execsql { |
+ SELECT DISTINCT p.name |
+ FROM directors d CROSS JOIN persons p |
+ WHERE d.person_id=p.person_id |
+ AND NOT EXISTS ( |
+ SELECT person_id FROM directors d1 WHERE d1.person_id=d.person_id |
+ EXCEPT |
+ SELECT person_id FROM writers w |
+ ); |
+ } |
+} {wilma} |
+ |
+ |
+ |
+finish_test |