Home | History | Annotate | Download | only in test
      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
    125