File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / test / where6.test
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:04:16 2012 UTC (12 years, 10 months ago) by misho
Branches: sqlite3, MAIN
CVS tags: v3_7_10, HEAD
sqlite3

    1: # 2007 June 8
    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: # This file implements regression tests for SQLite library.  The
   12: # focus of this file is testing that terms in the ON clause of
   13: # a LEFT OUTER JOIN are not used with indices.  See ticket #3015.
   14: #
   15: # $Id: where6.test,v 1.1.1.1 2012/02/21 17:04:16 misho Exp $
   16: 
   17: set testdir [file dirname $argv0]
   18: source $testdir/tester.tcl
   19: 
   20: # Build some test data
   21: #
   22: do_test where6-1.1 {
   23:   execsql {
   24:     CREATE TABLE t1(a INTEGER PRIMARY KEY,b,c);
   25:     INSERT INTO t1 VALUES(1,3,1);
   26:     INSERT INTO t1 VALUES(2,4,2);
   27:     CREATE TABLE t2(x INTEGER PRIMARY KEY);
   28:     INSERT INTO t2 VALUES(3);
   29: 
   30:     SELECT * FROM t1 LEFT JOIN t2 ON b=x AND c=1;
   31:   }
   32: } {1 3 1 3 2 4 2 {}}
   33: do_test where6-1.2 {
   34:   execsql {
   35:     SELECT * FROM t1 LEFT JOIN t2 ON x=b AND c=1;
   36:   }
   37: } {1 3 1 3 2 4 2 {}}
   38: do_test where6-1.3 {
   39:   execsql {
   40:     SELECT * FROM t1 LEFT JOIN t2 ON x=b AND 1=c;
   41:   }
   42: } {1 3 1 3 2 4 2 {}}
   43: do_test where6-1.4 {
   44:   execsql {
   45:     SELECT * FROM t1 LEFT JOIN t2 ON b=x AND 1=c;
   46:   }
   47: } {1 3 1 3 2 4 2 {}}
   48: 
   49: ifcapable explain {
   50:   do_test where6-1.5 {
   51:      explain_no_trace {SELECT * FROM t1 LEFT JOIN t2 ON x=b AND 1=c}
   52:   } [explain_no_trace {SELECT * FROM t1 LEFT JOIN t2 ON b=x AND c=1}]
   53:   do_test where6-1.6 {
   54:      explain_no_trace {SELECT * FROM t1 LEFT JOIN t2 ON x=b WHERE 1=c}
   55:   } [explain_no_trace {SELECT * FROM t1 LEFT JOIN t2 ON b=x WHERE c=1}]
   56: }
   57: 
   58: do_test where6-1.11 {
   59:   execsql {
   60:     SELECT * FROM t1 LEFT JOIN t2 ON b=x WHERE c=1;
   61:   }
   62: } {1 3 1 3}
   63: do_test where6-1.12 {
   64:   execsql {
   65:     SELECT * FROM t1 LEFT JOIN t2 ON x=b WHERE c=1;
   66:   }
   67: } {1 3 1 3}
   68: do_test where6-1.13 {
   69:   execsql {
   70:     SELECT * FROM t1 LEFT JOIN t2 ON b=x WHERE 1=c;
   71:   }
   72: } {1 3 1 3}
   73: 
   74: 
   75: 
   76: do_test where6-2.1 {
   77:   execsql {
   78:     CREATE INDEX i1 ON t1(c);
   79: 
   80:     SELECT * FROM t1 LEFT JOIN t2 ON b=x AND c=1;
   81:   }
   82: } {1 3 1 3 2 4 2 {}}
   83: do_test where6-2.2 {
   84:   execsql {
   85:     SELECT * FROM t1 LEFT JOIN t2 ON x=b AND c=1;
   86:   }
   87: } {1 3 1 3 2 4 2 {}}
   88: do_test where6-2.3 {
   89:   execsql {
   90:     SELECT * FROM t1 LEFT JOIN t2 ON x=b AND 1=c;
   91:   }
   92: } {1 3 1 3 2 4 2 {}}
   93: do_test where6-2.4 {
   94:   execsql {
   95:     SELECT * FROM t1 LEFT JOIN t2 ON b=x AND 1=c;
   96:   }
   97: } {1 3 1 3 2 4 2 {}}
   98: 
   99: ifcapable explain {
  100:   do_test where6-2.5 {
  101:      explain_no_trace {SELECT * FROM t1 LEFT JOIN t2 ON x=b AND 1=c}
  102:   } [explain_no_trace {SELECT * FROM t1 LEFT JOIN t2 ON b=x AND c=1}]
  103:   do_test where6-2.6 {
  104:      explain_no_trace {SELECT * FROM t1 LEFT JOIN t2 ON x=b WHERE 1=c}
  105:   } [explain_no_trace {SELECT * FROM t1 LEFT JOIN t2 ON b=x WHERE c=1}]
  106: }
  107: 
  108: 
  109: do_test where6-2.11 {
  110:   execsql {
  111:     SELECT * FROM t1 LEFT JOIN t2 ON b=x WHERE c=1;
  112:   }
  113: } {1 3 1 3}
  114: do_test where6-2.12 {
  115:   execsql {
  116:     SELECT * FROM t1 LEFT JOIN t2 ON x=b WHERE c=1;
  117:   }
  118: } {1 3 1 3}
  119: do_test where6-2.13 {
  120:   execsql {
  121:     SELECT * FROM t1 LEFT JOIN t2 ON x=b WHERE 1=c;
  122:   }
  123: } {1 3 1 3}
  124: do_test where6-2.14 {
  125:   execsql {
  126:     SELECT * FROM t1 LEFT JOIN t2 ON b=x WHERE 1=c;
  127:   }
  128: } {1 3 1 3}
  129: 
  130: # Ticket [ebdbadade5b]:
  131: # If the ON close on a LEFT JOIN is of the form x=y where both x and y
  132: # are indexed columns on tables to left of the join, then do not use that 
  133: # term with indices to either table.
  134: #
  135: do_test where6-3.1 {
  136:   db eval {
  137:     CREATE TABLE t4(x UNIQUE);
  138:     INSERT INTO t4 VALUES('abc');
  139:     INSERT INTO t4 VALUES('def');
  140:     INSERT INTO t4 VALUES('ghi');
  141:     CREATE TABLE t5(a, b, c, PRIMARY KEY(a,b));
  142:     INSERT INTO t5 VALUES('abc','def',123);
  143:     INSERT INTO t5 VALUES('def','ghi',456);
  144: 
  145:     SELECT t4a.x, t4b.x, t5.c, t6.v
  146:       FROM t4 AS t4a
  147:            INNER JOIN t4 AS t4b
  148:            LEFT JOIN t5 ON t5.a=t4a.x AND t5.b=t4b.x
  149:            LEFT JOIN (SELECT 1 AS v) AS t6 ON t4a.x=t4b.x
  150:      ORDER BY 1, 2, 3;
  151:   }
  152: } {abc abc {} 1 abc def 123 {} abc ghi {} {} def abc {} {} def def {} 1 def ghi 456 {} ghi abc {} {} ghi def {} {} ghi ghi {} 1}
  153: 
  154: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>