Annotation of embedaddon/sqlite3/test/analyze4.test, revision 1.1

1.1     ! misho       1: # 2011 January 04
        !             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: #
        !            12: # This file implements regression tests for SQLite library. This file 
        !            13: # implements tests for ANALYZE to verify that multiple rows containing
        !            14: # a NULL value count as distinct rows for the purposes of analyze 
        !            15: # statistics.
        !            16: #
        !            17: # Also include test cases for collating sequences on indices.
        !            18: #
        !            19: 
        !            20: set testdir [file dirname $argv0]
        !            21: source $testdir/tester.tcl
        !            22: 
        !            23: do_test analyze4-1.0 {
        !            24:   db eval {
        !            25:     CREATE TABLE t1(a,b);
        !            26:     CREATE INDEX t1a ON t1(a);
        !            27:     CREATE INDEX t1b ON t1(b);
        !            28:     INSERT INTO t1 VALUES(1,NULL);
        !            29:     INSERT INTO t1 SELECT a+1, b FROM t1;
        !            30:     INSERT INTO t1 SELECT a+2, b FROM t1;
        !            31:     INSERT INTO t1 SELECT a+4, b FROM t1;
        !            32:     INSERT INTO t1 SELECT a+8, b FROM t1;
        !            33:     INSERT INTO t1 SELECT a+16, b FROM t1;
        !            34:     INSERT INTO t1 SELECT a+32, b FROM t1;
        !            35:     INSERT INTO t1 SELECT a+64, b FROM t1;
        !            36:     ANALYZE;
        !            37:   }
        !            38: 
        !            39:   # Should choose the t1a index since it is more specific than t1b.
        !            40:   db eval {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=5 AND b IS NULL}
        !            41: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1a (a=?) (~1 rows)}}
        !            42: 
        !            43: # Verify that the t1b index shows that it does not narrow down the
        !            44: # search any at all.
        !            45: #
        !            46: do_test analyze4-1.1 {
        !            47:   db eval {
        !            48:     SELECT idx, stat FROM sqlite_stat1 WHERE tbl='t1' ORDER BY idx;
        !            49:   }
        !            50: } {t1a {128 1} t1b {128 128}}
        !            51: 
        !            52: # Change half of the b values from NULL to a constant.  Verify
        !            53: # that the number of rows selected in stat1 is half the total 
        !            54: # number of rows.
        !            55: #
        !            56: do_test analyze4-1.2 {
        !            57:   db eval {
        !            58:     UPDATE t1 SET b='x' WHERE a%2;
        !            59:     ANALYZE;
        !            60:     SELECT idx, stat FROM sqlite_stat1 WHERE tbl='t1' ORDER BY idx;
        !            61:   }
        !            62: } {t1a {128 1} t1b {128 64}}
        !            63: 
        !            64: # Change the t1.b values all back to NULL.  Add columns t1.c and t1.d.
        !            65: # Create a multi-column indices using t1.b and verify that ANALYZE 
        !            66: # processes them correctly.
        !            67: #
        !            68: do_test analyze4-1.3 {
        !            69:   db eval {
        !            70:     UPDATE t1 SET b=NULL;
        !            71:     ALTER TABLE t1 ADD COLUMN c;
        !            72:     ALTER TABLE t1 ADD COLUMN d;
        !            73:     UPDATE t1 SET c=a/4, d=a/2;
        !            74:     CREATE INDEX t1bcd ON t1(b,c,d);
        !            75:     CREATE INDEX t1cdb ON t1(c,d,b);
        !            76:     CREATE INDEX t1cbd ON t1(c,b,d);
        !            77:     ANALYZE;
        !            78:     SELECT idx, stat FROM sqlite_stat1 WHERE tbl='t1' ORDER BY idx;
        !            79:   }
        !            80: } {t1a {128 1} t1b {128 128} t1bcd {128 128 4 2} t1cbd {128 4 4 2} t1cdb {128 4 2 2}}
        !            81: 
        !            82: # Verify that collating sequences are taken into account when computing
        !            83: # ANALYZE statistics.
        !            84: #
        !            85: do_test analyze4-2.0 {
        !            86:   db eval {
        !            87:     CREATE TABLE t2(
        !            88:       x INTEGER PRIMARY KEY,
        !            89:       a TEXT COLLATE nocase,
        !            90:       b TEXT COLLATE rtrim,
        !            91:       c TEXT COLLATE binary
        !            92:     );
        !            93:     CREATE INDEX t2a ON t2(a);
        !            94:     CREATE INDEX t2b ON t2(b);
        !            95:     CREATE INDEX t2c ON t2(c);
        !            96:     CREATE INDEX t2c2 ON t2(c COLLATE nocase);
        !            97:     CREATE INDEX t2c3 ON t2(c COLLATE rtrim);
        !            98:     INSERT INTO t2 VALUES(1, 'abc', 'abc', 'abc');
        !            99:     INSERT INTO t2 VALUES(2, 'abC', 'abC', 'abC');
        !           100:     INSERT INTO t2 VALUES(3, 'abc ', 'abc ', 'abc ');
        !           101:     INSERT INTO t2 VALUES(4, 'abC ', 'abC ', 'abC ');
        !           102:     INSERT INTO t2 VALUES(5, 'aBc', 'aBc', 'aBc');
        !           103:     INSERT INTO t2 VALUES(6, 'aBC', 'aBC', 'aBC');
        !           104:     INSERT INTO t2 VALUES(7, 'aBc ', 'aBc ', 'aBc ');
        !           105:     INSERT INTO t2 VALUES(8, 'aBC ', 'aBC ', 'aBC ');
        !           106:     ANALYZE;
        !           107:     SELECT idx, stat FROM sqlite_stat1 WHERE tbl='t2' ORDER BY idx;
        !           108:   }
        !           109: } {t2a {8 4} t2b {8 2} t2c {8 1} t2c2 {8 4} t2c3 {8 2}}
        !           110: 
        !           111: finish_test

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