Annotation of embedaddon/sqlite3/test/selectB.test, revision 1.1.1.1

1.1       misho       1: # 2008 June 24
                      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. 
                     12: #
                     13: # $Id: selectB.test,v 1.10 2009/04/02 16:59:47 drh Exp $
                     14: 
                     15: set testdir [file dirname $argv0]
                     16: source $testdir/tester.tcl
                     17: 
                     18: ifcapable !compound {
                     19:   finish_test
                     20:   return
                     21: }
                     22: 
                     23: proc test_transform {testname sql1 sql2 results} {
                     24:   set ::vdbe1 [list]
                     25:   set ::vdbe2 [list]
                     26:   db eval "explain $sql1" { lappend ::vdbe1 $opcode }
                     27:   db eval "explain $sql2" { lappend ::vdbe2 $opcode }
                     28: 
                     29:   do_test $testname.transform {
                     30:     set ::vdbe1
                     31:   } $::vdbe2
                     32: 
                     33:   set ::sql1 $sql1
                     34:   do_test $testname.sql1 {
                     35:     execsql $::sql1
                     36:   } $results
                     37: 
                     38:   set ::sql2 $sql2
                     39:   do_test $testname.sql2 {
                     40:     execsql $::sql2
                     41:   } $results
                     42: }
                     43: 
                     44: do_test selectB-1.1 {
                     45:   execsql {
                     46:     CREATE TABLE t1(a, b, c);
                     47:     CREATE TABLE t2(d, e, f);
                     48: 
                     49:     INSERT INTO t1 VALUES( 2,  4,  6);
                     50:     INSERT INTO t1 VALUES( 8, 10, 12);
                     51:     INSERT INTO t1 VALUES(14, 16, 18);
                     52: 
                     53:     INSERT INTO t2 VALUES(3,   6,  9);
                     54:     INSERT INTO t2 VALUES(12, 15, 18);
                     55:     INSERT INTO t2 VALUES(21, 24, 27);
                     56:   }
                     57: } {}
                     58: 
                     59: for {set ii 1} {$ii <= 2} {incr ii} {
                     60: 
                     61:   if {$ii == 2} {
                     62:     do_test selectB-2.1 {
                     63:       execsql {
                     64:         CREATE INDEX i1 ON t1(a);
                     65:         CREATE INDEX i2 ON t2(d);
                     66:       }
                     67:     } {}
                     68:   }
                     69: 
                     70:   test_transform selectB-$ii.2 {
                     71:     SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
                     72:   } {
                     73:     SELECT a FROM t1 UNION ALL SELECT d FROM t2
                     74:   } {2 8 14 3 12 21}
                     75:   
                     76:   test_transform selectB-$ii.3 {
                     77:     SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1
                     78:   } {
                     79:     SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1
                     80:   } {2 3 8 12 14 21}
                     81:   
                     82:   test_transform selectB-$ii.4 {
                     83:     SELECT * FROM 
                     84:       (SELECT a FROM t1 UNION ALL SELECT d FROM t2) 
                     85:     WHERE a>10 ORDER BY 1
                     86:   } {
                     87:     SELECT a FROM t1 WHERE a>10 UNION ALL SELECT d FROM t2 WHERE d>10 ORDER BY 1
                     88:   } {12 14 21}
                     89:   
                     90:   test_transform selectB-$ii.5 {
                     91:     SELECT * FROM 
                     92:       (SELECT a FROM t1 UNION ALL SELECT d FROM t2) 
                     93:     WHERE a>10 ORDER BY a
                     94:   } {
                     95:     SELECT a FROM t1 WHERE a>10 
                     96:       UNION ALL 
                     97:     SELECT d FROM t2 WHERE d>10 
                     98:     ORDER BY a
                     99:   } {12 14 21}
                    100:   
                    101:   test_transform selectB-$ii.6 {
                    102:     SELECT * FROM 
                    103:       (SELECT a FROM t1 UNION ALL SELECT d FROM t2 WHERE d > 12) 
                    104:     WHERE a>10 ORDER BY a
                    105:   } {
                    106:     SELECT a FROM t1 WHERE a>10
                    107:       UNION ALL 
                    108:     SELECT d FROM t2 WHERE d>12 AND d>10
                    109:     ORDER BY a
                    110:   } {14 21}
                    111:   
                    112:   test_transform selectB-$ii.7 {
                    113:     SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1 
                    114:     LIMIT 2
                    115:   } {
                    116:     SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 LIMIT 2
                    117:   } {2 3}
                    118:   
                    119:   test_transform selectB-$ii.8 {
                    120:     SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2) ORDER BY 1 
                    121:     LIMIT 2 OFFSET 3
                    122:   } {
                    123:     SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 LIMIT 2 OFFSET 3
                    124:   } {12 14}
                    125: 
                    126:   test_transform selectB-$ii.9 {
                    127:     SELECT * FROM (
                    128:       SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
                    129:     ) 
                    130:   } {
                    131:     SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
                    132:   } {2 8 14 3 12 21 6 12 18}
                    133:   
                    134:   test_transform selectB-$ii.10 {
                    135:     SELECT * FROM (
                    136:       SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
                    137:     ) ORDER BY 1
                    138:   } {
                    139:     SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
                    140:     ORDER BY 1
                    141:   } {2 3 6 8 12 12 14 18 21}
                    142:   
                    143:   test_transform selectB-$ii.11 {
                    144:     SELECT * FROM (
                    145:       SELECT a FROM t1 UNION ALL SELECT d FROM t2 UNION ALL SELECT c FROM t1
                    146:     ) WHERE a>=10 ORDER BY 1 LIMIT 3
                    147:   } {
                    148:     SELECT a FROM t1 WHERE a>=10 UNION ALL SELECT d FROM t2 WHERE d>=10
                    149:     UNION ALL SELECT c FROM t1 WHERE c>=10
                    150:     ORDER BY 1 LIMIT 3
                    151:   } {12 12 14}
                    152: 
                    153:   test_transform selectB-$ii.12 {
                    154:     SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 2)
                    155:   } {
                    156:     SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 2
                    157:   } {2 8}
                    158: 
                    159:   # An ORDER BY in a compound subqueries defeats flattening.  Ticket #3773
                    160:   # test_transform selectB-$ii.13 {
                    161:   #   SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY a ASC)
                    162:   # } {
                    163:   #   SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 ASC
                    164:   # } {2 3 8 12 14 21}
                    165:   # 
                    166:   # test_transform selectB-$ii.14 {
                    167:   #  SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY a DESC)
                    168:   # } {
                    169:   #  SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 DESC
                    170:   # } {21 14 12 8 3 2}
                    171:   #
                    172:   # test_transform selectB-$ii.14 {
                    173:   #   SELECT * FROM (
                    174:   #     SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY a DESC
                    175:   #   ) LIMIT 2 OFFSET 2
                    176:   # } {
                    177:   #   SELECT a FROM t1 UNION ALL SELECT d FROM t2 ORDER BY 1 DESC
                    178:   #    LIMIT 2 OFFSET 2
                    179:   # } {12 8}
                    180:   #
                    181:   # test_transform selectB-$ii.15 {
                    182:   #   SELECT * FROM (
                    183:   #     SELECT a, b FROM t1 UNION ALL SELECT d, e FROM t2 ORDER BY a ASC, e DESC
                    184:   #  )
                    185:   # } {
                    186:   #   SELECT a, b FROM t1 UNION ALL SELECT d, e FROM t2 ORDER BY a ASC, e DESC
                    187:   # } {2 4 3 6 8 10 12 15 14 16 21 24}
                    188: }
                    189: 
                    190: do_test selectB-3.0 {
                    191:   execsql {
                    192:     DROP INDEX i1;
                    193:     DROP INDEX i2;
                    194:   }
                    195: } {}
                    196: 
                    197: for {set ii 3} {$ii <= 6} {incr ii} {
                    198: 
                    199:   switch $ii {
                    200:     4 {
                    201:       optimization_control db query-flattener off
                    202:     }
                    203:     5 {
                    204:       optimization_control db query-flattener on
                    205:       do_test selectB-5.0 {
                    206:         execsql {
                    207:           CREATE INDEX i1 ON t1(a);
                    208:           CREATE INDEX i2 ON t1(b);
                    209:           CREATE INDEX i3 ON t1(c);
                    210:           CREATE INDEX i4 ON t2(d);
                    211:           CREATE INDEX i5 ON t2(e);
                    212:           CREATE INDEX i6 ON t2(f);
                    213:         }
                    214:       } {}
                    215:     }
                    216:     6 {
                    217:       optimization_control db query-flattener off
                    218:     }
                    219:   }
                    220: 
                    221:   do_test selectB-$ii.1 {
                    222:     execsql {
                    223:       SELECT DISTINCT * FROM 
                    224:         (SELECT c FROM t1 UNION ALL SELECT e FROM t2) 
                    225:       ORDER BY 1;
                    226:     }
                    227:   } {6 12 15 18 24}
                    228:   
                    229:   do_test selectB-$ii.2 {
                    230:     execsql {
                    231:       SELECT c, count(*) FROM 
                    232:         (SELECT c FROM t1 UNION ALL SELECT e FROM t2) 
                    233:       GROUP BY c ORDER BY 1;
                    234:     }
                    235:   } {6 2 12 1 15 1 18 1 24 1}
                    236:   do_test selectB-$ii.3 {
                    237:     execsql {
                    238:       SELECT c, count(*) FROM 
                    239:         (SELECT c FROM t1 UNION ALL SELECT e FROM t2) 
                    240:       GROUP BY c HAVING count(*)>1;
                    241:     }
                    242:   } {6 2}
                    243:   do_test selectB-$ii.4 {
                    244:     execsql {
                    245:       SELECT t4.c, t3.a FROM 
                    246:         (SELECT c FROM t1 UNION ALL SELECT e FROM t2) AS t4, t1 AS t3
                    247:       WHERE t3.a=14
                    248:       ORDER BY 1
                    249:     }
                    250:   } {6 14 6 14 12 14 15 14 18 14 24 14}
                    251:   
                    252:   do_test selectB-$ii.5 {
                    253:     execsql {
                    254:       SELECT d FROM t2 
                    255:       EXCEPT 
                    256:       SELECT a FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
                    257:     }
                    258:   } {}
                    259:   do_test selectB-$ii.6 {
                    260:     execsql {
                    261:       SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
                    262:       EXCEPT 
                    263:       SELECT * FROM (SELECT a FROM t1 UNION ALL SELECT d FROM t2)
                    264:     }
                    265:   } {}
                    266:   do_test selectB-$ii.7 {
                    267:     execsql {
                    268:       SELECT c FROM t1
                    269:       EXCEPT 
                    270:       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
                    271:     }
                    272:   } {12}
                    273:   do_test selectB-$ii.8 {
                    274:     execsql {
                    275:       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
                    276:       EXCEPT 
                    277:       SELECT c FROM t1
                    278:     }
                    279:   } {9 15 24 27}
                    280:   do_test selectB-$ii.9 {
                    281:     execsql {
                    282:       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
                    283:       EXCEPT 
                    284:       SELECT c FROM t1
                    285:       ORDER BY c DESC
                    286:     }
                    287:   } {27 24 15 9}
                    288:   
                    289:   do_test selectB-$ii.10 {
                    290:     execsql {
                    291:       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
                    292:       UNION 
                    293:       SELECT c FROM t1
                    294:       ORDER BY c DESC
                    295:     }
                    296:   } {27 24 18 15 12 9 6}
                    297:   do_test selectB-$ii.11 {
                    298:     execsql {
                    299:       SELECT c FROM t1
                    300:       UNION 
                    301:       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
                    302:       ORDER BY c
                    303:     }
                    304:   } {6 9 12 15 18 24 27}
                    305:   do_test selectB-$ii.12 {
                    306:     execsql {
                    307:       SELECT c FROM t1 UNION SELECT e FROM t2 UNION ALL SELECT f FROM t2
                    308:       ORDER BY c
                    309:     }
                    310:   } {6 9 12 15 18 18 24 27}
                    311:   do_test selectB-$ii.13 {
                    312:     execsql {
                    313:       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
                    314:       UNION 
                    315:       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
                    316:       ORDER BY 1
                    317:     }
                    318:   } {6 9 15 18 24 27}
                    319:   
                    320:   do_test selectB-$ii.14 {
                    321:     execsql {
                    322:       SELECT c FROM t1
                    323:       INTERSECT 
                    324:       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
                    325:       ORDER BY 1
                    326:     }
                    327:   } {6 18}
                    328:   do_test selectB-$ii.15 {
                    329:     execsql {
                    330:       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
                    331:       INTERSECT 
                    332:       SELECT c FROM t1
                    333:       ORDER BY 1
                    334:     }
                    335:   } {6 18}
                    336:   do_test selectB-$ii.16 {
                    337:     execsql {
                    338:       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
                    339:       INTERSECT 
                    340:       SELECT * FROM (SELECT e FROM t2 UNION ALL SELECT f FROM t2)
                    341:       ORDER BY 1
                    342:     }
                    343:   } {6 9 15 18 24 27}
                    344: 
                    345:   do_test selectB-$ii.17 {
                    346:     execsql {
                    347:       SELECT * FROM (
                    348:         SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 4
                    349:       ) LIMIT 2
                    350:     }
                    351:   } {2 8}
                    352: 
                    353:   do_test selectB-$ii.18 {
                    354:     execsql {
                    355:       SELECT * FROM (
                    356:         SELECT a FROM t1 UNION ALL SELECT d FROM t2 LIMIT 4 OFFSET 2
                    357:       ) LIMIT 2
                    358:     }
                    359:   } {14 3}
                    360: 
                    361:   do_test selectB-$ii.19 {
                    362:     execsql {
                    363:       SELECT * FROM (
                    364:         SELECT DISTINCT (a/10) FROM t1 UNION ALL SELECT DISTINCT(d%2) FROM t2
                    365:       )
                    366:     }
                    367:   } {0 1 1 0}
                    368: 
                    369:   do_test selectB-$ii.20 {
                    370:     execsql {
                    371:       SELECT DISTINCT * FROM (
                    372:         SELECT DISTINCT (a/10) FROM t1 UNION ALL SELECT DISTINCT(d%2) FROM t2
                    373:       )
                    374:     }
                    375:   } {0 1}
                    376: 
                    377:   do_test selectB-$ii.21 {
                    378:     execsql {
                    379:       SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t2) ORDER BY a+b
                    380:     }
                    381:   } {2 4 6 3 6 9 8 10 12 12 15 18 14 16 18 21 24 27}
                    382: 
                    383:   do_test selectB-$ii.22 {
                    384:     execsql {
                    385:       SELECT * FROM (SELECT 345 UNION ALL SELECT d FROM t2) ORDER BY 1;
                    386:     }
                    387:   } {3 12 21 345}
                    388: 
                    389:   do_test selectB-$ii.23 {
                    390:     execsql {
                    391:       SELECT x, y FROM (
                    392:         SELECT a AS x, b AS y FROM t1
                    393:         UNION ALL
                    394:         SELECT a*10 + 0.1, f*10 + 0.1 FROM t1 JOIN t2 ON (c=d)
                    395:         UNION ALL
                    396:         SELECT a*100, b*100 FROM t1
                    397:       ) ORDER BY 1;
                    398:     }
                    399:   } {2 4 8 10 14 16 80.1 180.1 200 400 800 1000 1400 1600}
                    400: 
                    401:   do_test selectB-$ii.24 {
                    402:     execsql {
                    403:       SELECT x, y FROM (
                    404:         SELECT a AS x, b AS y FROM t1
                    405:         UNION ALL
                    406:         SELECT a*10 + 0.1, f*10 + 0.1 FROM t1 LEFT JOIN t2 ON (c=d)
                    407:         UNION ALL
                    408:         SELECT a*100, b*100 FROM t1
                    409:       ) ORDER BY 1;
                    410:     }
                    411:   } {2 4 8 10 14 16 20.1 {} 80.1 180.1 140.1 {} 200 400 800 1000 1400 1600}
                    412: 
                    413:   do_test selectB-$ii.25 {
                    414:     execsql {
                    415:       SELECT x+y FROM (
                    416:         SELECT a AS x, b AS y FROM t1
                    417:         UNION ALL
                    418:         SELECT a*10 + 0.1, f*10 + 0.1 FROM t1 LEFT JOIN t2 ON (c=d)
                    419:         UNION ALL
                    420:         SELECT a*100, b*100 FROM t1
                    421:       ) WHERE y+x NOT NULL ORDER BY 1;
                    422:     }
                    423:   } {6 18 30 260.2 600 1800 3000}
                    424: }
                    425: 
                    426: finish_test

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