os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/select6.test
changeset 0 bde4ae8d615e
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/select6.test	Fri Jun 15 03:10:57 2012 +0200
     1.3 @@ -0,0 +1,506 @@
     1.4 +# 2001 September 15
     1.5 +#
     1.6 +# The author disclaims copyright to this source code.  In place of
     1.7 +# a legal notice, here is a blessing:
     1.8 +#
     1.9 +#    May you do good and not evil.
    1.10 +#    May you find forgiveness for yourself and forgive others.
    1.11 +#    May you share freely, never taking more than you give.
    1.12 +#
    1.13 +#***********************************************************************
    1.14 +# This file implements regression tests for SQLite library.  The
    1.15 +# focus of this file is testing SELECT statements that contain
    1.16 +# subqueries in their FROM clause.
    1.17 +#
    1.18 +# $Id: select6.test,v 1.28 2008/08/20 16:35:10 drh Exp $
    1.19 +
    1.20 +set testdir [file dirname $argv0]
    1.21 +source $testdir/tester.tcl
    1.22 +
    1.23 +# Omit this whole file if the library is build without subquery support.
    1.24 +ifcapable !subquery {
    1.25 +  finish_test
    1.26 +  return
    1.27 +}
    1.28 +
    1.29 +do_test select6-1.0 {
    1.30 +  execsql {
    1.31 +    BEGIN;
    1.32 +    CREATE TABLE t1(x, y);
    1.33 +    INSERT INTO t1 VALUES(1,1);
    1.34 +    INSERT INTO t1 VALUES(2,2);
    1.35 +    INSERT INTO t1 VALUES(3,2);
    1.36 +    INSERT INTO t1 VALUES(4,3);
    1.37 +    INSERT INTO t1 VALUES(5,3);
    1.38 +    INSERT INTO t1 VALUES(6,3);
    1.39 +    INSERT INTO t1 VALUES(7,3);
    1.40 +    INSERT INTO t1 VALUES(8,4);
    1.41 +    INSERT INTO t1 VALUES(9,4);
    1.42 +    INSERT INTO t1 VALUES(10,4);
    1.43 +    INSERT INTO t1 VALUES(11,4);
    1.44 +    INSERT INTO t1 VALUES(12,4);
    1.45 +    INSERT INTO t1 VALUES(13,4);
    1.46 +    INSERT INTO t1 VALUES(14,4);
    1.47 +    INSERT INTO t1 VALUES(15,4);
    1.48 +    INSERT INTO t1 VALUES(16,5);
    1.49 +    INSERT INTO t1 VALUES(17,5);
    1.50 +    INSERT INTO t1 VALUES(18,5);
    1.51 +    INSERT INTO t1 VALUES(19,5);
    1.52 +    INSERT INTO t1 VALUES(20,5);
    1.53 +    COMMIT;
    1.54 +    SELECT DISTINCT y FROM t1 ORDER BY y;
    1.55 +  }
    1.56 +} {1 2 3 4 5}
    1.57 +
    1.58 +do_test select6-1.1 {
    1.59 +  execsql2 {SELECT * FROM (SELECT x, y FROM t1 WHERE x<2)}
    1.60 +} {x 1 y 1}
    1.61 +do_test select6-1.2 {
    1.62 +  execsql {SELECT count(*) FROM (SELECT y FROM t1)}
    1.63 +} {20}
    1.64 +do_test select6-1.3 {
    1.65 +  execsql {SELECT count(*) FROM (SELECT DISTINCT y FROM t1)}
    1.66 +} {5}
    1.67 +do_test select6-1.4 {
    1.68 +  execsql {SELECT count(*) FROM (SELECT DISTINCT * FROM (SELECT y FROM t1))}
    1.69 +} {5}
    1.70 +do_test select6-1.5 {
    1.71 +  execsql {SELECT count(*) FROM (SELECT * FROM (SELECT DISTINCT y FROM t1))}
    1.72 +} {5}
    1.73 +
    1.74 +do_test select6-1.6 {
    1.75 +  execsql {
    1.76 +    SELECT * 
    1.77 +    FROM (SELECT count(*),y FROM t1 GROUP BY y) AS a,
    1.78 +         (SELECT max(x),y FROM t1 GROUP BY y) as b
    1.79 +    WHERE a.y=b.y ORDER BY a.y
    1.80 +  }
    1.81 +} {1 1 1 1 2 2 3 2 4 3 7 3 8 4 15 4 5 5 20 5}
    1.82 +do_test select6-1.7 {
    1.83 +  execsql {
    1.84 +    SELECT a.y, a.[count(*)], [max(x)], [count(*)]
    1.85 +    FROM (SELECT count(*),y FROM t1 GROUP BY y) AS a,
    1.86 +         (SELECT max(x),y FROM t1 GROUP BY y) as b
    1.87 +    WHERE a.y=b.y ORDER BY a.y
    1.88 +  }
    1.89 +} {1 1 1 1 2 2 3 2 3 4 7 4 4 8 15 8 5 5 20 5}
    1.90 +do_test select6-1.8 {
    1.91 +  execsql {
    1.92 +    SELECT q, p, r
    1.93 +    FROM (SELECT count(*) as p , y as q FROM t1 GROUP BY y) AS a,
    1.94 +         (SELECT max(x) as r, y as s FROM t1 GROUP BY y) as b
    1.95 +    WHERE q=s ORDER BY s
    1.96 +  }
    1.97 +} {1 1 1 2 2 3 3 4 7 4 8 15 5 5 20}
    1.98 +do_test select6-1.9 {
    1.99 +  execsql {
   1.100 +    SELECT q, p, r, b.[min(x)+y]
   1.101 +    FROM (SELECT count(*) as p , y as q FROM t1 GROUP BY y) AS a,
   1.102 +         (SELECT max(x) as r, y as s, min(x)+y FROM t1 GROUP BY y) as b
   1.103 +    WHERE q=s ORDER BY s
   1.104 +  }
   1.105 +} {1 1 1 2 2 2 3 4 3 4 7 7 4 8 15 12 5 5 20 21}
   1.106 +
   1.107 +do_test select6-2.0 {
   1.108 +  execsql {
   1.109 +    CREATE TABLE t2(a INTEGER PRIMARY KEY, b);
   1.110 +    INSERT INTO t2 SELECT * FROM t1;
   1.111 +    SELECT DISTINCT b FROM t2 ORDER BY b;
   1.112 +  }
   1.113 +} {1 2 3 4 5}
   1.114 +do_test select6-2.1 {
   1.115 +  execsql2 {SELECT * FROM (SELECT a, b FROM t2 WHERE a<2)}
   1.116 +} {a 1 b 1}
   1.117 +do_test select6-2.2 {
   1.118 +  execsql {SELECT count(*) FROM (SELECT b FROM t2)}
   1.119 +} {20}
   1.120 +do_test select6-2.3 {
   1.121 +  execsql {SELECT count(*) FROM (SELECT DISTINCT b FROM t2)}
   1.122 +} {5}
   1.123 +do_test select6-2.4 {
   1.124 +  execsql {SELECT count(*) FROM (SELECT DISTINCT * FROM (SELECT b FROM t2))}
   1.125 +} {5}
   1.126 +do_test select6-2.5 {
   1.127 +  execsql {SELECT count(*) FROM (SELECT * FROM (SELECT DISTINCT b FROM t2))}
   1.128 +} {5}
   1.129 +
   1.130 +do_test select6-2.6 {
   1.131 +  execsql {
   1.132 +    SELECT * 
   1.133 +    FROM (SELECT count(*),b FROM t2 GROUP BY b) AS a,
   1.134 +         (SELECT max(a),b FROM t2 GROUP BY b) as b
   1.135 +    WHERE a.b=b.b ORDER BY a.b
   1.136 +  }
   1.137 +} {1 1 1 1 2 2 3 2 4 3 7 3 8 4 15 4 5 5 20 5}
   1.138 +do_test select6-2.7 {
   1.139 +  execsql {
   1.140 +    SELECT a.b, a.[count(*)], [max(a)], [count(*)]
   1.141 +    FROM (SELECT count(*),b FROM t2 GROUP BY b) AS a,
   1.142 +         (SELECT max(a),b FROM t2 GROUP BY b) as b
   1.143 +    WHERE a.b=b.b ORDER BY a.b
   1.144 +  }
   1.145 +} {1 1 1 1 2 2 3 2 3 4 7 4 4 8 15 8 5 5 20 5}
   1.146 +do_test select6-2.8 {
   1.147 +  execsql {
   1.148 +    SELECT q, p, r
   1.149 +    FROM (SELECT count(*) as p , b as q FROM t2 GROUP BY b) AS a,
   1.150 +         (SELECT max(a) as r, b as s FROM t2 GROUP BY b) as b
   1.151 +    WHERE q=s ORDER BY s
   1.152 +  }
   1.153 +} {1 1 1 2 2 3 3 4 7 4 8 15 5 5 20}
   1.154 +do_test select6-2.9 {
   1.155 +  execsql {
   1.156 +    SELECT a.q, a.p, b.r
   1.157 +    FROM (SELECT count(*) as p , b as q FROM t2 GROUP BY q) AS a,
   1.158 +         (SELECT max(a) as r, b as s FROM t2 GROUP BY s) as b
   1.159 +    WHERE a.q=b.s ORDER BY a.q
   1.160 +  }
   1.161 +} {1 1 1 2 2 3 3 4 7 4 8 15 5 5 20}
   1.162 +
   1.163 +do_test select6-3.1 {
   1.164 +  execsql2 {
   1.165 +    SELECT * FROM (SELECT * FROM (SELECT * FROM t1 WHERE x=3));
   1.166 +  }
   1.167 +} {x 3 y 2}
   1.168 +do_test select6-3.2 {
   1.169 +  execsql {
   1.170 +    SELECT * FROM
   1.171 +      (SELECT a.q, a.p, b.r
   1.172 +       FROM (SELECT count(*) as p , b as q FROM t2 GROUP BY q) AS a,
   1.173 +            (SELECT max(a) as r, b as s FROM t2 GROUP BY s) as b
   1.174 +       WHERE a.q=b.s ORDER BY a.q)
   1.175 +    ORDER BY "a.q"
   1.176 +  }
   1.177 +} {1 1 1 2 2 3 3 4 7 4 8 15 5 5 20}
   1.178 +do_test select6-3.3 {
   1.179 +  execsql {
   1.180 +    SELECT a,b,a+b FROM (SELECT avg(x) as 'a', avg(y) as 'b' FROM t1)
   1.181 +  }
   1.182 +} {10.5 3.7 14.2}
   1.183 +do_test select6-3.4 {
   1.184 +  execsql {
   1.185 +    SELECT a,b,a+b FROM (SELECT avg(x) as 'a', avg(y) as 'b' FROM t1 WHERE y=4)
   1.186 +  }
   1.187 +} {11.5 4.0 15.5}
   1.188 +do_test select6-3.5 {
   1.189 +  execsql {
   1.190 +    SELECT x,y,x+y FROM (SELECT avg(a) as 'x', avg(b) as 'y' FROM t2 WHERE a=4)
   1.191 +  }
   1.192 +} {4.0 3.0 7.0}
   1.193 +do_test select6-3.6 {
   1.194 +  execsql {
   1.195 +    SELECT a,b,a+b FROM (SELECT avg(x) as 'a', avg(y) as 'b' FROM t1)
   1.196 +    WHERE a>10
   1.197 +  }
   1.198 +} {10.5 3.7 14.2}
   1.199 +do_test select6-3.7 {
   1.200 +  execsql {
   1.201 +    SELECT a,b,a+b FROM (SELECT avg(x) as 'a', avg(y) as 'b' FROM t1)
   1.202 +    WHERE a<10
   1.203 +  }
   1.204 +} {}
   1.205 +do_test select6-3.8 {
   1.206 +  execsql {
   1.207 +    SELECT a,b,a+b FROM (SELECT avg(x) as 'a', avg(y) as 'b' FROM t1 WHERE y=4)
   1.208 +    WHERE a>10
   1.209 +  }
   1.210 +} {11.5 4.0 15.5}
   1.211 +do_test select6-3.9 {
   1.212 +  execsql {
   1.213 +    SELECT a,b,a+b FROM (SELECT avg(x) as 'a', avg(y) as 'b' FROM t1 WHERE y=4)
   1.214 +    WHERE a<10
   1.215 +  }
   1.216 +} {}
   1.217 +do_test select6-3.10 {
   1.218 +  execsql {
   1.219 +    SELECT a,b,a+b FROM (SELECT avg(x) as 'a', y as 'b' FROM t1 GROUP BY b)
   1.220 +    ORDER BY a
   1.221 +  }
   1.222 +} {1.0 1 2.0 2.5 2 4.5 5.5 3 8.5 11.5 4 15.5 18.0 5 23.0}
   1.223 +do_test select6-3.11 {
   1.224 +  execsql {
   1.225 +    SELECT a,b,a+b FROM 
   1.226 +       (SELECT avg(x) as 'a', y as 'b' FROM t1 GROUP BY b)
   1.227 +    WHERE b<4 ORDER BY a
   1.228 +  }
   1.229 +} {1.0 1 2.0 2.5 2 4.5 5.5 3 8.5}
   1.230 +do_test select6-3.12 {
   1.231 +  execsql {
   1.232 +    SELECT a,b,a+b FROM 
   1.233 +       (SELECT avg(x) as 'a', y as 'b' FROM t1 GROUP BY b HAVING a>1)
   1.234 +    WHERE b<4 ORDER BY a
   1.235 +  }
   1.236 +} {2.5 2 4.5 5.5 3 8.5}
   1.237 +do_test select6-3.13 {
   1.238 +  execsql {
   1.239 +    SELECT a,b,a+b FROM 
   1.240 +       (SELECT avg(x) as 'a', y as 'b' FROM t1 GROUP BY b HAVING a>1)
   1.241 +    ORDER BY a
   1.242 +  }
   1.243 +} {2.5 2 4.5 5.5 3 8.5 11.5 4 15.5 18.0 5 23.0}
   1.244 +do_test select6-3.14 {
   1.245 +  execsql {
   1.246 +    SELECT [count(*)],y FROM (SELECT count(*), y FROM t1 GROUP BY y)
   1.247 +    ORDER BY [count(*)]
   1.248 +  }
   1.249 +} {1 1 2 2 4 3 5 5 8 4}
   1.250 +do_test select6-3.15 {
   1.251 +  execsql {
   1.252 +    SELECT [count(*)],y FROM (SELECT count(*), y FROM t1 GROUP BY y)
   1.253 +    ORDER BY y
   1.254 +  }
   1.255 +} {1 1 2 2 4 3 8 4 5 5}
   1.256 +
   1.257 +do_test select6-4.1 {
   1.258 +  execsql {
   1.259 +    SELECT a,b,c FROM 
   1.260 +      (SELECT x AS 'a', y AS 'b', x+y AS 'c' FROM t1 WHERE y=4)
   1.261 +    WHERE a<10 ORDER BY a;
   1.262 +  }
   1.263 +} {8 4 12 9 4 13}
   1.264 +do_test select6-4.2 {
   1.265 +  execsql {
   1.266 +    SELECT y FROM (SELECT DISTINCT y FROM t1) WHERE y<5 ORDER BY y
   1.267 +  }
   1.268 +} {1 2 3 4}
   1.269 +do_test select6-4.3 {
   1.270 +  execsql {
   1.271 +    SELECT DISTINCT y FROM (SELECT y FROM t1) WHERE y<5 ORDER BY y
   1.272 +  }
   1.273 +} {1 2 3 4}
   1.274 +do_test select6-4.4 {
   1.275 +  execsql {
   1.276 +    SELECT avg(y) FROM (SELECT DISTINCT y FROM t1) WHERE y<5 ORDER BY y
   1.277 +  }
   1.278 +} {2.5}
   1.279 +do_test select6-4.5 {
   1.280 +  execsql {
   1.281 +    SELECT avg(y) FROM (SELECT DISTINCT y FROM t1 WHERE y<5) ORDER BY y
   1.282 +  }
   1.283 +} {2.5}
   1.284 +
   1.285 +do_test select6-5.1 {
   1.286 +  execsql {
   1.287 +    SELECT a,x,b FROM
   1.288 +      (SELECT x+3 AS 'a', x FROM t1 WHERE y=3) AS 'p',
   1.289 +      (SELECT x AS 'b' FROM t1 WHERE y=4) AS 'q'
   1.290 +    WHERE a=b
   1.291 +    ORDER BY a
   1.292 +  }
   1.293 +} {8 5 8 9 6 9 10 7 10}
   1.294 +do_test select6-5.2 {
   1.295 +  execsql {
   1.296 +    SELECT a,x,b FROM
   1.297 +      (SELECT x+3 AS 'a', x FROM t1 WHERE y=3),
   1.298 +      (SELECT x AS 'b' FROM t1 WHERE y=4)
   1.299 +    WHERE a=b
   1.300 +    ORDER BY a
   1.301 +  }
   1.302 +} {8 5 8 9 6 9 10 7 10}
   1.303 +
   1.304 +# Tests of compound sub-selects
   1.305 +#
   1.306 +do_test select6-6.1 {
   1.307 +  execsql {
   1.308 +    DELETE FROM t1 WHERE x>4;
   1.309 +    SELECT * FROM t1
   1.310 +  }
   1.311 +} {1 1 2 2 3 2 4 3}
   1.312 +ifcapable compound {
   1.313 +  do_test select6-6.2 {
   1.314 +    execsql {
   1.315 +      SELECT * FROM (
   1.316 +        SELECT x AS 'a' FROM t1 UNION ALL SELECT x+10 AS 'a' FROM t1
   1.317 +      ) ORDER BY a;
   1.318 +    }
   1.319 +  } {1 2 3 4 11 12 13 14}
   1.320 +  do_test select6-6.3 {
   1.321 +    execsql {
   1.322 +      SELECT * FROM (
   1.323 +        SELECT x AS 'a' FROM t1 UNION ALL SELECT x+1 AS 'a' FROM t1
   1.324 +      ) ORDER BY a;
   1.325 +    }
   1.326 +  } {1 2 2 3 3 4 4 5}
   1.327 +  do_test select6-6.4 {
   1.328 +    execsql {
   1.329 +      SELECT * FROM (
   1.330 +        SELECT x AS 'a' FROM t1 UNION SELECT x+1 AS 'a' FROM t1
   1.331 +      ) ORDER BY a;
   1.332 +    }
   1.333 +  } {1 2 3 4 5}
   1.334 +  do_test select6-6.5 {
   1.335 +    execsql {
   1.336 +      SELECT * FROM (
   1.337 +        SELECT x AS 'a' FROM t1 INTERSECT SELECT x+1 AS 'a' FROM t1
   1.338 +      ) ORDER BY a;
   1.339 +    }
   1.340 +  } {2 3 4}
   1.341 +  do_test select6-6.6 {
   1.342 +    execsql {
   1.343 +      SELECT * FROM (
   1.344 +        SELECT x AS 'a' FROM t1 EXCEPT SELECT x*2 AS 'a' FROM t1
   1.345 +      ) ORDER BY a;
   1.346 +    }
   1.347 +  } {1 3}
   1.348 +} ;# ifcapable compound
   1.349 +
   1.350 +# Subselects with no FROM clause
   1.351 +#
   1.352 +do_test select6-7.1 {
   1.353 +  execsql {
   1.354 +    SELECT * FROM (SELECT 1)
   1.355 +  }
   1.356 +} {1}
   1.357 +do_test select6-7.2 {
   1.358 +  execsql {
   1.359 +    SELECT c,b,a,* FROM (SELECT 1 AS 'a', 2 AS 'b', 'abc' AS 'c')
   1.360 +  }
   1.361 +} {abc 2 1 1 2 abc}
   1.362 +do_test select6-7.3 {
   1.363 +  execsql {
   1.364 +    SELECT c,b,a,* FROM (SELECT 1 AS 'a', 2 AS 'b', 'abc' AS 'c' WHERE 0)
   1.365 +  }
   1.366 +} {}
   1.367 +do_test select6-7.4 {
   1.368 +  execsql2 {
   1.369 +    SELECT c,b,a,* FROM (SELECT 1 AS 'a', 2 AS 'b', 'abc' AS 'c' WHERE 1)
   1.370 +  }
   1.371 +} {c abc b 2 a 1 a 1 b 2 c abc}
   1.372 +
   1.373 +# The remaining tests in this file depend on the EXPLAIN keyword.
   1.374 +# Skip these tests if EXPLAIN is disabled in the current build.
   1.375 +#
   1.376 +ifcapable {!explain} {
   1.377 +  finish_test
   1.378 +  return
   1.379 +}
   1.380 +
   1.381 +# The following procedure compiles the SQL given as an argument and returns
   1.382 +# TRUE if that SQL uses any transient tables and returns FALSE if no
   1.383 +# transient tables are used.  This is used to make sure that the
   1.384 +# sqliteFlattenSubquery() routine in select.c is doing its job.
   1.385 +#
   1.386 +proc is_flat {sql} {
   1.387 +  return [expr 0>[lsearch [execsql "EXPLAIN $sql"] OpenEphemeral]]
   1.388 +}
   1.389 +
   1.390 +# Check that the flattener works correctly for deeply nested subqueries
   1.391 +# involving joins.
   1.392 +#
   1.393 +do_test select6-8.1 {
   1.394 +  execsql {
   1.395 +    BEGIN;
   1.396 +    CREATE TABLE t3(p,q);
   1.397 +    INSERT INTO t3 VALUES(1,11);
   1.398 +    INSERT INTO t3 VALUES(2,22);
   1.399 +    CREATE TABLE t4(q,r);
   1.400 +    INSERT INTO t4 VALUES(11,111);
   1.401 +    INSERT INTO t4 VALUES(22,222);
   1.402 +    COMMIT;
   1.403 +    SELECT * FROM t3 NATURAL JOIN t4;
   1.404 +  }
   1.405 +} {1 11 111 2 22 222}
   1.406 +do_test select6-8.2 {
   1.407 +  execsql {
   1.408 +    SELECT y, p, q, r FROM
   1.409 +       (SELECT t1.y AS y, t2.b AS b FROM t1, t2 WHERE t1.x=t2.a) AS m,
   1.410 +       (SELECT t3.p AS p, t3.q AS q, t4.r AS r FROM t3 NATURAL JOIN t4) as n
   1.411 +    WHERE  y=p
   1.412 +  }
   1.413 +} {1 1 11 111 2 2 22 222 2 2 22 222}
   1.414 +# If view support is omitted from the build, then so is the query 
   1.415 +# "flattener". So omit this test and test select6-8.6 in that case.
   1.416 +ifcapable view {
   1.417 +do_test select6-8.3 {
   1.418 +  is_flat {
   1.419 +    SELECT y, p, q, r FROM
   1.420 +       (SELECT t1.y AS y, t2.b AS b FROM t1, t2 WHERE t1.x=t2.a) AS m,
   1.421 +       (SELECT t3.p AS p, t3.q AS q, t4.r AS r FROM t3 NATURAL JOIN t4) as n
   1.422 +    WHERE  y=p
   1.423 +  }
   1.424 +} {1}
   1.425 +} ;# ifcapable view
   1.426 +do_test select6-8.4 {
   1.427 +  execsql {
   1.428 +    SELECT DISTINCT y, p, q, r FROM
   1.429 +       (SELECT t1.y AS y, t2.b AS b FROM t1, t2 WHERE t1.x=t2.a) AS m,
   1.430 +       (SELECT t3.p AS p, t3.q AS q, t4.r AS r FROM t3 NATURAL JOIN t4) as n
   1.431 +    WHERE  y=p
   1.432 +  }
   1.433 +} {1 1 11 111 2 2 22 222}
   1.434 +do_test select6-8.5 {
   1.435 +  execsql {
   1.436 +    SELECT * FROM 
   1.437 +      (SELECT y, p, q, r FROM
   1.438 +         (SELECT t1.y AS y, t2.b AS b FROM t1, t2 WHERE t1.x=t2.a) AS m,
   1.439 +         (SELECT t3.p AS p, t3.q AS q, t4.r AS r FROM t3 NATURAL JOIN t4) as n
   1.440 +      WHERE  y=p) AS e,
   1.441 +      (SELECT r AS z FROM t4 WHERE q=11) AS f
   1.442 +    WHERE e.r=f.z
   1.443 +  }
   1.444 +} {1 1 11 111 111}
   1.445 +ifcapable view {
   1.446 +do_test select6-8.6 {
   1.447 +  is_flat {
   1.448 +    SELECT * FROM 
   1.449 +      (SELECT y, p, q, r FROM
   1.450 +         (SELECT t1.y AS y, t2.b AS b FROM t1, t2 WHERE t1.x=t2.a) AS m,
   1.451 +         (SELECT t3.p AS p, t3.q AS q, t4.r AS r FROM t3 NATURAL JOIN t4) as n
   1.452 +      WHERE  y=p) AS e,
   1.453 +      (SELECT r AS z FROM t4 WHERE q=11) AS f
   1.454 +    WHERE e.r=f.z
   1.455 +  }
   1.456 +} {1}
   1.457 +} ;# ifcapable view
   1.458 +
   1.459 +# Ticket #1634
   1.460 +#
   1.461 +do_test select6-9.1 {
   1.462 +  execsql {
   1.463 +    SELECT a.x, b.x FROM t1 AS a, (SELECT x FROM t1 LIMIT 2) AS b
   1.464 +  }
   1.465 +} {1 1 1 2 2 1 2 2 3 1 3 2 4 1 4 2}
   1.466 +do_test select6-9.2 {
   1.467 +  execsql {
   1.468 +    SELECT x FROM (SELECT x FROM t1 LIMIT 2);
   1.469 +  }
   1.470 +} {1 2}
   1.471 +do_test select6-9.3 {
   1.472 +  execsql {
   1.473 +    SELECT x FROM (SELECT x FROM t1 LIMIT 2 OFFSET 1);
   1.474 +  }
   1.475 +} {2 3}
   1.476 +do_test select6-9.4 {
   1.477 +  execsql {
   1.478 +    SELECT x FROM (SELECT x FROM t1) LIMIT 2;
   1.479 +  }
   1.480 +} {1 2}
   1.481 +do_test select6-9.5 {
   1.482 +  execsql {
   1.483 +    SELECT x FROM (SELECT x FROM t1) LIMIT 2 OFFSET 1;
   1.484 +  }
   1.485 +} {2 3}
   1.486 +do_test select6-9.6 {
   1.487 +  execsql {
   1.488 +    SELECT x FROM (SELECT x FROM t1 LIMIT 2) LIMIT 3;
   1.489 +  }
   1.490 +} {1 2}
   1.491 +do_test select6-9.7 {
   1.492 +  execsql {
   1.493 +    SELECT x FROM (SELECT x FROM t1 LIMIT -1) LIMIT 3;
   1.494 +  }
   1.495 +} {1 2 3}
   1.496 +do_test select6-9.8 {
   1.497 +  execsql {
   1.498 +    SELECT x FROM (SELECT x FROM t1 LIMIT -1);
   1.499 +  }
   1.500 +} {1 2 3 4}
   1.501 +do_test select6-9.9 {
   1.502 +  execsql {
   1.503 +    SELECT x FROM (SELECT x FROM t1 LIMIT -1 OFFSET 1);
   1.504 +  }
   1.505 +} {2 3 4}
   1.506 +
   1.507 +
   1.508 +
   1.509 +finish_test