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

1.1     ! misho       1: # 2011 August 13
        !             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 tests for SQLite library.  The focus of the tests
        !            13: # in this file is testing the capabilities of sqlite_stat3.
        !            14: #
        !            15: 
        !            16: set testdir [file dirname $argv0]
        !            17: source $testdir/tester.tcl
        !            18: 
        !            19: ifcapable !stat3 {
        !            20:   finish_test
        !            21:   return
        !            22: }
        !            23: 
        !            24: set testprefix analyze8
        !            25: 
        !            26: proc eqp {sql {db db}} {
        !            27:   uplevel execsql [list "EXPLAIN QUERY PLAN $sql"] $db
        !            28: }
        !            29: 
        !            30: # Scenario:
        !            31: #
        !            32: #    Two indices.  One has mostly singleton entries, but for a few
        !            33: #    values there are hundreds of entries.  The other has 10-20
        !            34: #    entries per value.
        !            35: #
        !            36: # Verify that the query planner chooses the first index for the singleton
        !            37: # entries and the second index for the others.
        !            38: #
        !            39: do_test 1.0 {
        !            40:   db eval {
        !            41:     CREATE TABLE t1(a,b,c,d);
        !            42:     CREATE INDEX t1a ON t1(a);
        !            43:     CREATE INDEX t1b ON t1(b);
        !            44:     CREATE INDEX t1c ON t1(c);
        !            45:   }
        !            46:   for {set i 0} {$i<1000} {incr i} {
        !            47:     if {$i%2==0} {set a $i} {set a [expr {($i%8)*100}]}
        !            48:     set b [expr {$i/10}]
        !            49:     set c [expr {$i/8}]
        !            50:     set c [expr {$c*$c*$c}]
        !            51:     db eval {INSERT INTO t1 VALUES($a,$b,$c,$i)}
        !            52:   }
        !            53:   db eval {ANALYZE}
        !            54: } {}
        !            55: 
        !            56: # The a==100 comparison is expensive because there are many rows
        !            57: # with a==100.  And so for those cases, choose the t1b index.
        !            58: #
        !            59: # Buf ro a==99 and a==101, there are far fewer rows so choose
        !            60: # the t1a index.
        !            61: #
        !            62: do_test 1.1 {
        !            63:   eqp {SELECT * FROM t1 WHERE a=100 AND b=55}
        !            64: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1b (b=?) (~2 rows)}}
        !            65: do_test 1.2 {
        !            66:   eqp {SELECT * FROM t1 WHERE a=99 AND b=55}
        !            67: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1a (a=?) (~1 rows)}}
        !            68: do_test 1.3 {
        !            69:   eqp {SELECT * FROM t1 WHERE a=101 AND b=55}
        !            70: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1a (a=?) (~1 rows)}}
        !            71: do_test 1.4 {
        !            72:   eqp {SELECT * FROM t1 WHERE a=100 AND b=56}
        !            73: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1b (b=?) (~2 rows)}}
        !            74: do_test 1.5 {
        !            75:   eqp {SELECT * FROM t1 WHERE a=99 AND b=56}
        !            76: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1a (a=?) (~1 rows)}}
        !            77: do_test 1.6 {
        !            78:   eqp {SELECT * FROM t1 WHERE a=101 AND b=56}
        !            79: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1a (a=?) (~1 rows)}}
        !            80: do_test 2.1 {
        !            81:   eqp {SELECT * FROM t1 WHERE a=100 AND b BETWEEN 50 AND 54}
        !            82: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1b (b>? AND b<?) (~2 rows)}}
        !            83: 
        !            84: # There are many more values of c between 0 and 100000 than there are
        !            85: # between 800000 and 900000.  So t1c is more selective for the latter
        !            86: # range.
        !            87: #
        !            88: do_test 3.1 {
        !            89:   eqp {SELECT * FROM t1 WHERE b BETWEEN 50 AND 54 AND c BETWEEN 0 AND 100000}
        !            90: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1b (b>? AND b<?) (~6 rows)}}
        !            91: do_test 3.2 {
        !            92:   eqp {SELECT * FROM t1
        !            93:        WHERE b BETWEEN 50 AND 54 AND c BETWEEN 800000 AND 900000}
        !            94: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1c (c>? AND c<?) (~4 rows)}}
        !            95: do_test 3.3 {
        !            96:   eqp {SELECT * FROM t1 WHERE a=100 AND c BETWEEN 0 AND 100000}
        !            97: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1a (a=?) (~63 rows)}}
        !            98: do_test 3.4 {
        !            99:   eqp {SELECT * FROM t1
        !           100:        WHERE a=100 AND c BETWEEN 800000 AND 900000}
        !           101: } {0 0 0 {SEARCH TABLE t1 USING INDEX t1c (c>? AND c<?) (~2 rows)}}
        !           102: 
        !           103: finish_test

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