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

1.1       misho       1: # 2009 February 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.  The
                     12: # focus of this file is testing "SELECT count(*)" statements.
                     13: #
                     14: # $Id: count.test,v 1.6 2009/06/05 17:09:12 drh Exp $
                     15: 
                     16: set testdir [file dirname $argv0]
                     17: source $testdir/tester.tcl
                     18: 
                     19: # Test plan:
                     20: #
                     21: #  count-0.*: Make sure count(*) works on an empty database.  (Ticket #3774)
                     22: #
                     23: #  count-1.*: Test that the OP_Count instruction appears to work on both
                     24: #             tables and indexes. Test both when they contain 0 entries,
                     25: #             when all entries are on the root page, and when the b-tree
                     26: #             forms a structure 2 and 3 levels deep.
                     27: #            
                     28: #  count-2.*: Test that 
                     29: #
                     30: #
                     31: 
                     32: do_test count-0.1 {
                     33:   db eval {
                     34:      SELECT count(*) FROM sqlite_master;
                     35:   }
                     36: } {0}
                     37: 
                     38: set iTest 0
                     39: foreach zIndex [list {
                     40:   /* no-op */
                     41: } {
                     42:   CREATE INDEX i1 ON t1(a);
                     43: }] { 
                     44:   incr iTest
                     45:   do_test count-1.$iTest.1 {
                     46:     execsql {
                     47:       DROP TABLE IF EXISTS t1;
                     48:       CREATE TABLE t1(a, b);
                     49:     }
                     50:     execsql $zIndex
                     51:     execsql { SELECT count(*) FROM t1 }
                     52:   } {0}
                     53:   
                     54:   do_test count-1.$iTest.2 {
                     55:     execsql {
                     56:       INSERT INTO t1 VALUES(1, 2);
                     57:       INSERT INTO t1 VALUES(3, 4);
                     58:       SELECT count(*) FROM t1;
                     59:     }
                     60:   } {2}
                     61: 
                     62:   do_test count-1.$iTest.3 {
                     63:     execsql {
                     64:       INSERT INTO t1 SELECT * FROM t1;          --   4
                     65:       INSERT INTO t1 SELECT * FROM t1;          --   8
                     66:       INSERT INTO t1 SELECT * FROM t1;          --  16
                     67:       INSERT INTO t1 SELECT * FROM t1;          --  32
                     68:       INSERT INTO t1 SELECT * FROM t1;          --  64
                     69:       INSERT INTO t1 SELECT * FROM t1;          -- 128
                     70:       INSERT INTO t1 SELECT * FROM t1;          -- 256
                     71:       SELECT count(*) FROM t1;
                     72:     }
                     73:   } {256}
                     74:   
                     75:   do_test count-1.$iTest.4 {
                     76:     execsql {
                     77:       INSERT INTO t1 SELECT * FROM t1;          --  512
                     78:       INSERT INTO t1 SELECT * FROM t1;          -- 1024
                     79:       INSERT INTO t1 SELECT * FROM t1;          -- 2048
                     80:       INSERT INTO t1 SELECT * FROM t1;          -- 4096
                     81:       SELECT count(*) FROM t1;
                     82:     }
                     83:   } {4096}
                     84:   
                     85:   do_test count-1.$iTest.5 {
                     86:     execsql {
                     87:       BEGIN;
                     88:       INSERT INTO t1 SELECT * FROM t1;          --  8192
                     89:       INSERT INTO t1 SELECT * FROM t1;          -- 16384
                     90:       INSERT INTO t1 SELECT * FROM t1;          -- 32768
                     91:       INSERT INTO t1 SELECT * FROM t1;          -- 65536
                     92:       COMMIT;
                     93:       SELECT count(*) FROM t1;
                     94:     }
                     95:   } {65536}
                     96: }
                     97: 
                     98: proc uses_op_count {sql} {
                     99:   if {[lsearch [execsql "EXPLAIN $sql"] Count]>=0} {
                    100:     return 1;
                    101:   }
                    102:   return 0
                    103: }
                    104: 
                    105: do_test count-2.1 {
                    106:   execsql {
                    107:     CREATE TABLE t2(a, b);
                    108:   }
                    109:   uses_op_count {SELECT count(*) FROM t2}
                    110: } {1}
                    111: do_test count-2.2 {
                    112:   catchsql {SELECT count(DISTINCT *) FROM t2}
                    113: } {1 {near "*": syntax error}}
                    114: do_test count-2.3 {
                    115:   uses_op_count {SELECT count(DISTINCT a) FROM t2}
                    116: } {0}
                    117: do_test count-2.4 {
                    118:   uses_op_count {SELECT count(a) FROM t2}
                    119: } {0}
                    120: do_test count-2.5 {
                    121:   uses_op_count {SELECT count() FROM t2}
                    122: } {1}
                    123: do_test count-2.6 {
                    124:   catchsql {SELECT count(DISTINCT) FROM t2}
                    125: } {1 {DISTINCT aggregates must have exactly one argument}}
                    126: do_test count-2.7 {
                    127:   uses_op_count {SELECT count(*)+1 FROM t2}
                    128: } {0}
                    129: do_test count-2.8 {
                    130:   uses_op_count {SELECT count(*) FROM t2 WHERE a IS NOT NULL}
                    131: } {0}
                    132: do_test count-2.9 {
                    133:   catchsql {SELECT count(*) FROM t2 HAVING count(*)>1}
                    134: } {1 {a GROUP BY clause is required before HAVING}}
                    135: do_test count-2.10 {
                    136:   uses_op_count {SELECT count(*) FROM (SELECT 1)}
                    137: } {0}
                    138: do_test count-2.11 {
                    139:   execsql { CREATE VIEW v1 AS SELECT 1 AS a }
                    140:   uses_op_count {SELECT count(*) FROM v1}
                    141: } {0}
                    142: do_test count-2.12 {
                    143:   uses_op_count {SELECT count(*), max(a) FROM t2}
                    144: } {0}
                    145: do_test count-2.13 {
                    146:   uses_op_count {SELECT count(*) FROM t1, t2}
                    147: } {0}
                    148: 
                    149: ifcapable vtab {
                    150:   register_echo_module [sqlite3_connection_pointer db]
                    151:   do_test count-2.14 {
                    152:     execsql { CREATE VIRTUAL TABLE techo USING echo(t1); }
                    153:     uses_op_count {SELECT count(*) FROM techo}
                    154:   } {0}
                    155: }
                    156: 
                    157: do_test count-3.1 {
                    158:   execsql {
                    159:     CREATE TABLE t3(a, b);
                    160:     SELECT a FROM (SELECT count(*) AS a FROM t3) WHERE a==0;
                    161:   }
                    162: } {0}
                    163: do_test count-3.2 {
                    164:   execsql {
                    165:     SELECT a FROM (SELECT count(*) AS a FROM t3) WHERE a==1;
                    166:   }
                    167: } {}
                    168: 
                    169: do_test count-4.1 {
                    170:   execsql {
                    171:     CREATE TABLE t4(a, b);
                    172:     INSERT INTO t4 VALUES('a', 'b');
                    173:     CREATE INDEX t4i1 ON t4(b, a);
                    174:     SELECT count(*) FROM t4;
                    175:   }
                    176: } {1}
                    177: do_test count-4.2 {
                    178:   execsql {
                    179:     CREATE INDEX t4i2 ON t4(b);
                    180:     SELECT count(*) FROM t4;
                    181:   }
                    182: } {1}
                    183: do_test count-4.3 {
                    184:   execsql {
                    185:     DROP INDEX t4i1;
                    186:     CREATE INDEX t4i1 ON t4(b, a);
                    187:     SELECT count(*) FROM t4;
                    188:   }
                    189: } {1}
                    190: 
                    191: 
                    192: finish_test

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