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

1.1       misho       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 the SELECT statement.
                     13: #
                     14: # $Id: select2.test,v 1.28 2009/01/15 15:23:59 drh Exp $
                     15: 
                     16: set testdir [file dirname $argv0]
                     17: source $testdir/tester.tcl
                     18: 
                     19: # Create a table with some data
                     20: #
                     21: execsql {CREATE TABLE tbl1(f1 int, f2 int)}
                     22: execsql {BEGIN}
                     23: for {set i 0} {$i<=30} {incr i} {
                     24:   execsql "INSERT INTO tbl1 VALUES([expr {$i%9}],[expr {$i%10}])"
                     25: }
                     26: execsql {COMMIT}
                     27: 
                     28: # Do a second query inside a first.
                     29: #
                     30: do_test select2-1.1 {
                     31:   set sql {SELECT DISTINCT f1 FROM tbl1 ORDER BY f1}
                     32:   set r {}
                     33:   catch {unset data}
                     34:   db eval $sql data {
                     35:     set f1 $data(f1)
                     36:     lappend r $f1:
                     37:     set sql2 "SELECT f2 FROM tbl1 WHERE f1=$f1 ORDER BY f2"
                     38:     db eval $sql2 d2 {
                     39:       lappend r $d2(f2)
                     40:     }
                     41:   }
                     42:   set r
                     43: } {0: 0 7 8 9 1: 0 1 8 9 2: 0 1 2 9 3: 0 1 2 3 4: 2 3 4 5: 3 4 5 6: 4 5 6 7: 5 6 7 8: 6 7 8}
                     44: 
                     45: do_test select2-1.2 {
                     46:   set sql {SELECT DISTINCT f1 FROM tbl1 WHERE f1>3 AND f1<5}
                     47:   set r {}
                     48:   db eval $sql data {
                     49:     set f1 $data(f1)
                     50:     lappend r $f1:
                     51:     set sql2 "SELECT f2 FROM tbl1 WHERE f1=$f1 ORDER BY f2"
                     52:     db eval $sql2 d2 {
                     53:       lappend r $d2(f2)
                     54:     }
                     55:   }
                     56:   set r
                     57: } {4: 2 3 4}
                     58: unset data
                     59: 
                     60: # Create a largish table. Do this twice, once using the TCL cache and once
                     61: # without.  Compare the performance to make sure things go faster with the
                     62: # cache turned on.
                     63: #
                     64: ifcapable tclvar {
                     65:   do_test select2-2.0.1 {
                     66:     set t1 [time {
                     67:       execsql {CREATE TABLE tbl2(f1 int, f2 int, f3 int); BEGIN;}
                     68:       for {set i 1} {$i<=30000} {incr i} {
                     69:         set i2 [expr {$i*2}]
                     70:         set i3 [expr {$i*3}]
                     71:         db eval {INSERT INTO tbl2 VALUES($i,$i2,$i3)}
                     72:       }
                     73:       execsql {COMMIT}
                     74:     }]
                     75:     list
                     76:   } {}
                     77:   puts "time with cache: $::t1"
                     78: }
                     79: catch {execsql {DROP TABLE tbl2}}
                     80: do_test select2-2.0.2 {
                     81:   set t2 [time {
                     82:     execsql {CREATE TABLE tbl2(f1 int, f2 int, f3 int); BEGIN;}
                     83:     for {set i 1} {$i<=30000} {incr i} {
                     84:       set i2 [expr {$i*2}]
                     85:       set i3 [expr {$i*3}]
                     86:       execsql "INSERT INTO tbl2 VALUES($i,$i2,$i3)"
                     87:     }
                     88:     execsql {COMMIT}
                     89:   }]
                     90:   list
                     91: } {}
                     92: puts "time without cache: $t2"
                     93: #ifcapable tclvar {
                     94: #  do_test select2-2.0.3 {
                     95: #    expr {[lindex $t1 0]<[lindex $t2 0]}
                     96: #  } 1
                     97: #}
                     98: 
                     99: do_test select2-2.1 {
                    100:   execsql {SELECT count(*) FROM tbl2}
                    101: } {30000}
                    102: do_test select2-2.2 {
                    103:   execsql {SELECT count(*) FROM tbl2 WHERE f2>1000}
                    104: } {29500}
                    105: 
                    106: do_test select2-3.1 {
                    107:   execsql {SELECT f1 FROM tbl2 WHERE 1000=f2}
                    108: } {500}
                    109: 
                    110: do_test select2-3.2a {
                    111:   execsql {CREATE INDEX idx1 ON tbl2(f2)}
                    112: } {}
                    113: do_test select2-3.2b {
                    114:   execsql {SELECT f1 FROM tbl2 WHERE 1000=f2}
                    115: } {500}
                    116: do_test select2-3.2c {
                    117:   execsql {SELECT f1 FROM tbl2 WHERE f2=1000}
                    118: } {500}
                    119: do_test select2-3.2d {
                    120:   set sqlite_search_count 0
                    121:   execsql {SELECT * FROM tbl2 WHERE 1000=f2}
                    122:   set sqlite_search_count
                    123: } {3}
                    124: do_test select2-3.2e {
                    125:   set sqlite_search_count 0
                    126:   execsql {SELECT * FROM tbl2 WHERE f2=1000}
                    127:   set sqlite_search_count
                    128: } {3}
                    129: 
                    130: # Make sure queries run faster with an index than without
                    131: #
                    132: do_test select2-3.3 {
                    133:   execsql {DROP INDEX idx1}
                    134:   set sqlite_search_count 0
                    135:   execsql {SELECT f1 FROM tbl2 WHERE f2==2000}
                    136:   set sqlite_search_count
                    137: } {29999}
                    138: 
                    139: # Make sure we can optimize functions in the WHERE clause that
                    140: # use fields from two or more different table.  (Bug #6)
                    141: #
                    142: do_test select2-4.1 {
                    143:   execsql {
                    144:     CREATE TABLE aa(a);
                    145:     CREATE TABLE bb(b);
                    146:     INSERT INTO aa VALUES(1);
                    147:     INSERT INTO aa VALUES(3);
                    148:     INSERT INTO bb VALUES(2);
                    149:     INSERT INTO bb VALUES(4);
                    150:     SELECT * FROM aa, bb WHERE max(a,b)>2;
                    151:   }
                    152: } {1 4 3 2 3 4}
                    153: do_test select2-4.2 {
                    154:   execsql {
                    155:     INSERT INTO bb VALUES(0);
                    156:     SELECT * FROM aa CROSS JOIN bb WHERE b;
                    157:   }
                    158: } {1 2 1 4 3 2 3 4}
                    159: do_test select2-4.3 {
                    160:   execsql {
                    161:     SELECT * FROM aa CROSS JOIN bb WHERE NOT b;
                    162:   }
                    163: } {1 0 3 0}
                    164: do_test select2-4.4 {
                    165:   execsql {
                    166:     SELECT * FROM aa, bb WHERE min(a,b);
                    167:   }
                    168: } {1 2 1 4 3 2 3 4}
                    169: do_test select2-4.5 {
                    170:   execsql {
                    171:     SELECT * FROM aa, bb WHERE NOT min(a,b);
                    172:   }
                    173: } {1 0 3 0}
                    174: do_test select2-4.6 {
                    175:   execsql {
                    176:     SELECT * FROM aa, bb WHERE CASE WHEN a=b-1 THEN 1 END;
                    177:   }
                    178: } {1 2 3 4}
                    179: do_test select2-4.7 {
                    180:   execsql {
                    181:     SELECT * FROM aa, bb WHERE CASE WHEN a=b-1 THEN 0 ELSE 1 END;
                    182:   }
                    183: } {1 4 1 0 3 2 3 0}
                    184: 
                    185: finish_test

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