persistentstorage/sqlite3api/TEST/TclScript/subselect.test
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     1 # 2001 September 15
       
     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 SELECT statements that are part of
       
    13 # expressions.
       
    14 #
       
    15 # $Id: subselect.test,v 1.16 2008/08/04 03:51:24 danielk1977 Exp $
       
    16 
       
    17 set testdir [file dirname $argv0]
       
    18 source $testdir/tester.tcl
       
    19 
       
    20 # Omit this whole file if the library is build without subquery support.
       
    21 ifcapable !subquery {
       
    22   finish_test
       
    23   return
       
    24 }
       
    25 
       
    26 # Basic sanity checking.  Try a simple subselect.
       
    27 #
       
    28 do_test subselect-1.1 {
       
    29   execsql {
       
    30     CREATE TABLE t1(a int, b int);
       
    31     INSERT INTO t1 VALUES(1,2);
       
    32     INSERT INTO t1 VALUES(3,4);
       
    33     INSERT INTO t1 VALUES(5,6);
       
    34   }
       
    35   execsql {SELECT * FROM t1 WHERE a = (SELECT count(*) FROM t1)}
       
    36 } {3 4}
       
    37 
       
    38 # Try a select with more than one result column.
       
    39 #
       
    40 do_test subselect-1.2 {
       
    41   set v [catch {execsql {SELECT * FROM t1 WHERE a = (SELECT * FROM t1)}} msg]
       
    42   lappend v $msg
       
    43 } {1 {only a single result allowed for a SELECT that is part of an expression}}
       
    44 
       
    45 # A subselect without an aggregate.
       
    46 #
       
    47 do_test subselect-1.3a {
       
    48   execsql {SELECT b from t1 where a = (SELECT a FROM t1 WHERE b=2)}
       
    49 } {2}
       
    50 do_test subselect-1.3b {
       
    51   execsql {SELECT b from t1 where a = (SELECT a FROM t1 WHERE b=4)}
       
    52 } {4}
       
    53 do_test subselect-1.3c {
       
    54   execsql {SELECT b from t1 where a = (SELECT a FROM t1 WHERE b=6)}
       
    55 } {6}
       
    56 do_test subselect-1.3d {
       
    57   execsql {SELECT b from t1 where a = (SELECT a FROM t1 WHERE b=8)}
       
    58 } {}
       
    59 ifcapable compound {
       
    60   do_test subselect-1.3e {
       
    61     execsql {
       
    62       SELECT b FROM t1
       
    63        WHERE a = (SELECT a FROM t1 UNION SELECT b FROM t1 ORDER BY 1);
       
    64     }
       
    65   } {2}
       
    66 }
       
    67 
       
    68 # What if the subselect doesn't return any value.  We should get
       
    69 # NULL as the result.  Check it out.
       
    70 #
       
    71 do_test subselect-1.4 {
       
    72   execsql {SELECT b from t1 where a = coalesce((SELECT a FROM t1 WHERE b=5),1)}
       
    73 } {2}
       
    74 
       
    75 # Try multiple subselects within a single expression.
       
    76 #
       
    77 do_test subselect-1.5 {
       
    78   execsql {
       
    79     CREATE TABLE t2(x int, y int);
       
    80     INSERT INTO t2 VALUES(1,2);
       
    81     INSERT INTO t2 VALUES(2,4);
       
    82     INSERT INTO t2 VALUES(3,8);
       
    83     INSERT INTO t2 VALUES(4,16);
       
    84   }
       
    85   execsql {
       
    86     SELECT y from t2 
       
    87     WHERE x = (SELECT sum(b) FROM t1 where a notnull) - (SELECT sum(a) FROM t1)
       
    88   }
       
    89 } {8}
       
    90 
       
    91 # Try something useful.  Delete every entry from t2 where the
       
    92 # x value is less than half of the maximum.
       
    93 #
       
    94 do_test subselect-1.6 {
       
    95   execsql {DELETE FROM t2 WHERE x < 0.5*(SELECT max(x) FROM t2)}
       
    96   execsql {SELECT x FROM t2 ORDER BY x}
       
    97 } {2 3 4}
       
    98 
       
    99 # Make sure sorting works for SELECTs there used as a scalar expression.
       
   100 #
       
   101 do_test subselect-2.1 {
       
   102   execsql {
       
   103     SELECT (SELECT a FROM t1 ORDER BY a), (SELECT a FROM t1 ORDER BY a DESC)
       
   104   }
       
   105 } {1 5}
       
   106 do_test subselect-2.2 {
       
   107   execsql {
       
   108     SELECT 1 IN (SELECT a FROM t1 ORDER BY a);
       
   109   }
       
   110 } {1}
       
   111 do_test subselect-2.3 {
       
   112   execsql {
       
   113     SELECT 2 IN (SELECT a FROM t1 ORDER BY a DESC);
       
   114   }
       
   115 } {0}
       
   116 
       
   117 # Verify that the ORDER BY clause is honored in a subquery.
       
   118 #
       
   119 ifcapable compound {
       
   120 do_test subselect-3.1 {
       
   121   execsql {
       
   122     CREATE TABLE t3(x int);
       
   123     INSERT INTO t3 SELECT a FROM t1 UNION ALL SELECT b FROM t1;
       
   124     SELECT * FROM t3 ORDER BY x;
       
   125   }
       
   126 } {1 2 3 4 5 6}
       
   127 } ;# ifcapable compound
       
   128 ifcapable !compound {
       
   129 do_test subselect-3.1 {
       
   130   execsql {
       
   131     CREATE TABLE t3(x int);
       
   132     INSERT INTO t3 SELECT a FROM t1; 
       
   133     INSERT INTO t3 SELECT b FROM t1;
       
   134     SELECT * FROM t3 ORDER BY x;
       
   135   }
       
   136 } {1 2 3 4 5 6}
       
   137 } ;# ifcapable !compound
       
   138 
       
   139 do_test subselect-3.2 {
       
   140   execsql {
       
   141     SELECT sum(x) FROM (SELECT x FROM t3 ORDER BY x LIMIT 2);
       
   142   }
       
   143 } {3}
       
   144 do_test subselect-3.3 {
       
   145   execsql {
       
   146     SELECT sum(x) FROM (SELECT x FROM t3 ORDER BY x DESC LIMIT 2);
       
   147   }
       
   148 } {11}
       
   149 do_test subselect-3.4 {
       
   150   execsql {
       
   151     SELECT (SELECT x FROM t3 ORDER BY x);
       
   152   }
       
   153 } {1}
       
   154 do_test subselect-3.5 {
       
   155   execsql {
       
   156     SELECT (SELECT x FROM t3 ORDER BY x DESC);
       
   157   }
       
   158 } {6}
       
   159 do_test subselect-3.6 {
       
   160   execsql {
       
   161     SELECT (SELECT x FROM t3 ORDER BY x LIMIT 1);
       
   162   }
       
   163 } {1}
       
   164 do_test subselect-3.7 {
       
   165   execsql {
       
   166     SELECT (SELECT x FROM t3 ORDER BY x DESC LIMIT 1);
       
   167   }
       
   168 } {6}
       
   169 do_test subselect-3.8 {
       
   170   execsql {
       
   171     SELECT (SELECT x FROM t3 ORDER BY x LIMIT 1 OFFSET 2);
       
   172   }
       
   173 } {3}
       
   174 do_test subselect-3.9 {
       
   175   execsql {
       
   176     SELECT (SELECT x FROM t3 ORDER BY x DESC LIMIT 1 OFFSET 2);
       
   177   }
       
   178 } {4}
       
   179 do_test subselect-3.10 {
       
   180   execsql {
       
   181     SELECT x FROM t3 WHERE x IN
       
   182        (SELECT x FROM t3 ORDER BY x DESC LIMIT 1 OFFSET 2);
       
   183   }
       
   184 } {4}
       
   185 
       
   186 # Ticket #2295.
       
   187 # Make sure type affinities work correctly on subqueries with
       
   188 # an ORDER BY clause.
       
   189 #
       
   190 do_test subselect-4.1 {
       
   191   execsql {
       
   192     CREATE TABLE t4(a TEXT, b TEXT);
       
   193     INSERT INTO t4 VALUES('a','1');
       
   194     INSERT INTO t4 VALUES('b','2');
       
   195     INSERT INTO t4 VALUES('c','3');
       
   196     SELECT a FROM t4 WHERE b IN (SELECT b FROM t4 ORDER BY b);
       
   197   }
       
   198 } {a b c}
       
   199 do_test subselect-4.2 {
       
   200   execsql {
       
   201     SELECT a FROM t4 WHERE b IN (SELECT b FROM t4 ORDER BY b LIMIT 1);
       
   202   }
       
   203 } {a}
       
   204 do_test subselect-4.3 {
       
   205   execsql {
       
   206     SELECT a FROM t4 WHERE b IN (SELECT b FROM t4 ORDER BY b DESC LIMIT 1);
       
   207   }
       
   208 } {c}
       
   209 
       
   210 finish_test