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

1.1     ! misho       1: # 2011 April 1
        !             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: # This file implements tests for the ANALYZE command when an idnex
        !            13: # name is given as the argument.
        !            14: #
        !            15: 
        !            16: set testdir [file dirname $argv0]
        !            17: source $testdir/tester.tcl
        !            18: 
        !            19: # There is nothing to test if ANALYZE is disable for this build.
        !            20: #
        !            21: ifcapable {!analyze||!vtab} {
        !            22:   finish_test
        !            23:   return
        !            24: }
        !            25: 
        !            26: # Generate some test data
        !            27: #
        !            28: do_test analyze7-1.0 {
        !            29:   register_wholenumber_module db
        !            30:   execsql {
        !            31:     CREATE TABLE t1(a,b,c,d);
        !            32:     CREATE INDEX t1a ON t1(a);
        !            33:     CREATE INDEX t1b ON t1(b);
        !            34:     CREATE INDEX t1cd ON t1(c,d);
        !            35:     CREATE VIRTUAL TABLE nums USING wholenumber;
        !            36:     INSERT INTO t1 SELECT value, value, value/100, value FROM nums
        !            37:                     WHERE value BETWEEN 1 AND 256;
        !            38:     EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=123;
        !            39:   }
        !            40: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1a (a=?) (~10 rows)}}
        !            41: do_test analyze7-1.1 {
        !            42:   execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b=123;}
        !            43: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1b (b=?) (~10 rows)}}
        !            44: do_test analyze7-1.2 {
        !            45:   execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE c=2;}
        !            46: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1cd (c=?) (~10 rows)}}
        !            47: 
        !            48: # Run an analyze on one of the three indices.  Verify that this
        !            49: # effects the row-count estimate on the one query that uses that
        !            50: # one index.
        !            51: #
        !            52: do_test analyze7-2.0 {
        !            53:   execsql {ANALYZE t1a;}
        !            54:   db cache flush
        !            55:   execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=123;}
        !            56: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1a (a=?) (~1 rows)}}
        !            57: do_test analyze7-2.1 {
        !            58:   execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b=123;}
        !            59: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1b (b=?) (~10 rows)}}
        !            60: do_test analyze7-2.2 {
        !            61:   execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE c=2;}
        !            62: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1cd (c=?) (~10 rows)}}
        !            63: 
        !            64: # Verify that since the query planner now things that t1a is more
        !            65: # selective than t1b, it prefers to use t1a.
        !            66: #
        !            67: do_test analyze7-2.3 {
        !            68:   execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=123 AND b=123}
        !            69: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1a (a=?) (~1 rows)}}
        !            70: 
        !            71: # Run an analysis on another of the three indices.  Verify  that this
        !            72: # new analysis works and does not disrupt the previous analysis.
        !            73: #
        !            74: do_test analyze7-3.0 {
        !            75:   execsql {ANALYZE t1cd;}
        !            76:   db cache flush;
        !            77:   execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=123;}
        !            78: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1a (a=?) (~1 rows)}}
        !            79: do_test analyze7-3.1 {
        !            80:   execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE b=123;}
        !            81: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1b (b=?) (~10 rows)}}
        !            82: do_test analyze7-3.2.1 {
        !            83:   execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE c=?;}
        !            84: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1cd (c=?) (~86 rows)}}
        !            85: ifcapable stat3 {
        !            86:   # If ENABLE_STAT3 is defined, SQLite comes up with a different estimated
        !            87:   # row count for (c=2) than it does for (c=?).
        !            88:   do_test analyze7-3.2.2 {
        !            89:     execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE c=2;}
        !            90:   } {0 0 0 {SEARCH TABLE t1 USING INDEX t1cd (c=?) (~57 rows)}}
        !            91: } else {
        !            92:   # If ENABLE_STAT3 is not defined, the expected row count for (c=2) is the
        !            93:   # same as that for (c=?).
        !            94:   do_test analyze7-3.2.3 {
        !            95:     execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE c=2;}
        !            96:   } {0 0 0 {SEARCH TABLE t1 USING INDEX t1cd (c=?) (~86 rows)}}
        !            97: }
        !            98: do_test analyze7-3.3 {
        !            99:   execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=123 AND b=123}
        !           100: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1a (a=?) (~1 rows)}}
        !           101: ifcapable {!stat3} {
        !           102:   do_test analyze7-3.4 {
        !           103:     execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE c=123 AND b=123}
        !           104:   } {0 0 0 {SEARCH TABLE t1 USING INDEX t1b (b=?) (~2 rows)}}
        !           105:   do_test analyze7-3.5 {
        !           106:     execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=123 AND c=123}
        !           107:   } {0 0 0 {SEARCH TABLE t1 USING INDEX t1a (a=?) (~1 rows)}}
        !           108: }
        !           109: do_test analyze7-3.6 {
        !           110:   execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE c=123 AND d=123 AND b=123}
        !           111: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1cd (c=? AND d=?) (~1 rows)}}
        !           112: 
        !           113: finish_test

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