modernc.org/cc@v1.0.1/v2/testdata/_sqlite/test/cost.test (about)

     1  # 2014-04-26
     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  
    13  set testdir [file dirname $argv0]
    14  source $testdir/tester.tcl
    15  set testprefix cost
    16  
    17  
    18  do_execsql_test 1.1 {
    19    CREATE TABLE t3(id INTEGER PRIMARY KEY, b NOT NULL);
    20    CREATE TABLE t4(c, d, e);
    21    CREATE UNIQUE INDEX i3 ON t3(b);
    22    CREATE UNIQUE INDEX i4 ON t4(c, d);
    23  }
    24  do_eqp_test 1.2 {
    25    SELECT e FROM t3, t4 WHERE b=c ORDER BY b, d;
    26  } {
    27    0 0 0 {SCAN TABLE t3 USING COVERING INDEX i3} 
    28    0 1 1 {SEARCH TABLE t4 USING INDEX i4 (c=?)}
    29  }
    30  
    31  
    32  do_execsql_test 2.1 {
    33    CREATE TABLE t1(a, b);
    34    CREATE INDEX i1 ON t1(a);
    35  }
    36  
    37  # It is better to use an index for ORDER BY than sort externally, even 
    38  # if the index is a non-covering index.
    39  do_eqp_test 2.2 {
    40    SELECT * FROM t1 ORDER BY a;
    41  } {
    42    0 0 0 {SCAN TABLE t1 USING INDEX i1}
    43  }
    44  
    45  do_execsql_test 3.1 {
    46    CREATE TABLE t5(a INTEGER PRIMARY KEY,b,c,d,e,f,g);
    47    CREATE INDEX t5b ON t5(b);
    48    CREATE INDEX t5c ON t5(c);
    49    CREATE INDEX t5d ON t5(d);
    50    CREATE INDEX t5e ON t5(e);
    51    CREATE INDEX t5f ON t5(f);
    52    CREATE INDEX t5g ON t5(g);
    53  }
    54  
    55  do_eqp_test 3.2 {
    56    SELECT a FROM t5 
    57    WHERE b IS NULL OR c IS NULL OR d IS NULL 
    58    ORDER BY a;
    59  } {
    60    0 0 0 {SEARCH TABLE t5 USING INDEX t5b (b=?)} 
    61    0 0 0 {SEARCH TABLE t5 USING INDEX t5c (c=?)} 
    62    0 0 0 {SEARCH TABLE t5 USING INDEX t5d (d=?)} 
    63    0 0 0 {USE TEMP B-TREE FOR ORDER BY}
    64  }
    65  
    66  #-------------------------------------------------------------------------
    67  # If there is no likelihood() or stat3 data, SQLite assumes that a closed
    68  # range scan (e.g. one constrained by "col BETWEEN ? AND ?" constraint)
    69  # visits 1/64 of the rows in a table.
    70  #
    71  # Note: 1/63 =~ 0.016
    72  # Note: 1/65 =~ 0.015
    73  #
    74  reset_db
    75  do_execsql_test 4.1 {
    76    CREATE TABLE t1(a, b);
    77    CREATE INDEX i1 ON t1(a);
    78    CREATE INDEX i2 ON t1(b);
    79  }
    80  do_eqp_test 4.2 {
    81    SELECT * FROM t1 WHERE likelihood(a=?, 0.014) AND b BETWEEN ? AND ?;
    82  } {
    83    0 0 0 {SEARCH TABLE t1 USING INDEX i1 (a=?)}
    84  }
    85  do_eqp_test 4.3 {
    86    SELECT * FROM t1 WHERE likelihood(a=?, 0.016) AND b BETWEEN ? AND ?;
    87  } {
    88    0 0 0 {SEARCH TABLE t1 USING INDEX i2 (b>? AND b<?)}
    89  }
    90  
    91  
    92  #-------------------------------------------------------------------------
    93  #
    94  reset_db
    95  do_execsql_test 5.1 {
    96    CREATE TABLE t2(x, y);
    97    CREATE INDEX t2i1 ON t2(x);
    98  }
    99  
   100  do_eqp_test 5.2 {
   101    SELECT * FROM t2 ORDER BY x, y;
   102  } {
   103    0 0 0 {SCAN TABLE t2 USING INDEX t2i1} 
   104    0 0 0 {USE TEMP B-TREE FOR RIGHT PART OF ORDER BY}
   105  }
   106  
   107  do_eqp_test 5.3 {
   108    SELECT * FROM t2 WHERE x BETWEEN ? AND ? ORDER BY rowid;
   109  } {
   110    0 0 0 {SEARCH TABLE t2 USING INDEX t2i1 (x>? AND x<?)} 
   111    0 0 0 {USE TEMP B-TREE FOR ORDER BY}
   112  }
   113  
   114  # where7.test, where8.test:
   115  #
   116  do_execsql_test 6.1 {
   117    CREATE TABLE t3(a INTEGER PRIMARY KEY, b, c);
   118    CREATE INDEX t3i1 ON t3(b);
   119    CREATE INDEX t3i2 ON t3(c);
   120  }
   121  
   122  do_eqp_test 6.2 {
   123    SELECT a FROM t3 WHERE (b BETWEEN 2 AND 4) OR c=100 ORDER BY a
   124  } {
   125    0 0 0 {SEARCH TABLE t3 USING INDEX t3i1 (b>? AND b<?)} 
   126    0 0 0 {SEARCH TABLE t3 USING INDEX t3i2 (c=?)}
   127    0 0 0 {USE TEMP B-TREE FOR ORDER BY}
   128  }
   129  
   130  #-------------------------------------------------------------------------
   131  #
   132  reset_db
   133  do_execsql_test 7.1 {
   134    CREATE TABLE t1(a INTEGER PRIMARY KEY,b,c,d,e,f,g);
   135    CREATE INDEX t1b ON t1(b);
   136    CREATE INDEX t1c ON t1(c);
   137    CREATE INDEX t1d ON t1(d);
   138    CREATE INDEX t1e ON t1(e);
   139    CREATE INDEX t1f ON t1(f);
   140    CREATE INDEX t1g ON t1(g);
   141  }
   142  
   143  do_eqp_test 7.2 {
   144    SELECT a FROM t1
   145       WHERE (b>=950 AND b<=1010) OR (b IS NULL AND c NOT NULL)
   146    ORDER BY a
   147  } {
   148    0 0 0 {SEARCH TABLE t1 USING INDEX t1b (b>? AND b<?)} 
   149    0 0 0 {SEARCH TABLE t1 USING INDEX t1b (b=?)} 
   150    0 0 0 {USE TEMP B-TREE FOR ORDER BY}
   151  }
   152  
   153  do_eqp_test 7.3 {
   154    SELECT rowid FROM t1
   155    WHERE (+b IS NULL AND c NOT NULL AND d NOT NULL)
   156          OR (b NOT NULL AND c IS NULL AND d NOT NULL)
   157          OR (b NOT NULL AND c NOT NULL AND d IS NULL)
   158  } {
   159    0 0 0 {SCAN TABLE t1}
   160  }
   161  
   162  do_eqp_test 7.4 {
   163    SELECT rowid FROM t1 WHERE (+b IS NULL AND c NOT NULL) OR c IS NULL
   164  } {
   165    0 0 0 {SCAN TABLE t1}
   166  }
   167  
   168  #-------------------------------------------------------------------------
   169  #
   170  reset_db
   171  do_execsql_test 8.1 {
   172    CREATE TABLE composer(
   173      cid INTEGER PRIMARY KEY,
   174      cname TEXT
   175    );
   176    CREATE TABLE album(
   177      aid INTEGER PRIMARY KEY,
   178      aname TEXT
   179    );
   180    CREATE TABLE track(
   181      tid INTEGER PRIMARY KEY,
   182      cid INTEGER REFERENCES composer,
   183      aid INTEGER REFERENCES album,
   184      title TEXT
   185    );
   186    CREATE INDEX track_i1 ON track(cid);
   187    CREATE INDEX track_i2 ON track(aid);
   188  }
   189  
   190  do_eqp_test 8.2 {
   191    SELECT DISTINCT aname
   192      FROM album, composer, track
   193     WHERE cname LIKE '%bach%'
   194       AND unlikely(composer.cid=track.cid)
   195       AND unlikely(album.aid=track.aid);
   196  } {
   197    0 0 2 {SCAN TABLE track} 
   198    0 1 0 {SEARCH TABLE album USING INTEGER PRIMARY KEY (rowid=?)}
   199    0 2 1 {SEARCH TABLE composer USING INTEGER PRIMARY KEY (rowid=?)}
   200    0 0 0 {USE TEMP B-TREE FOR DISTINCT}
   201  }
   202  
   203  #-------------------------------------------------------------------------
   204  #
   205  do_execsql_test 9.1 {
   206    CREATE TABLE t1(
   207      a,b,c,d,e, f,g,h,i,j,
   208      k,l,m,n,o, p,q,r,s,t
   209    );
   210    CREATE INDEX i1 ON t1(k,l,m,n,o,p,q,r,s,t);
   211  }
   212  do_test 9.2 {
   213    for {set i 0} {$i < 100} {incr i} {
   214      execsql { INSERT INTO t1 DEFAULT VALUES }
   215    }
   216    execsql {
   217      ANALYZE;
   218      CREATE INDEX i2 ON t1(a,b,c,d,e,f,g,h,i,j);
   219    }
   220  } {}
   221  
   222  set L [list a=? b=? c=? d=? e=? f=? g=? h=? i=? j=?]
   223  foreach {tn nTerm nRow} {
   224    1   1 10
   225    2   2  9
   226    3   3  8
   227    4   4  7
   228    5   5  6
   229    6   6  5
   230    7   7  5
   231    8   8  5
   232    9   9  5
   233    10 10  5
   234  } {
   235    set w [join [lrange $L 0 [expr $nTerm-1]] " AND "]
   236    set p1 [expr ($nRow-1) / 100.0]
   237    set p2 [expr ($nRow+1) / 100.0]
   238  
   239    set sql1 "SELECT * FROM t1 WHERE likelihood(k=?, $p1) AND $w"
   240    set sql2 "SELECT * FROM t1 WHERE likelihood(k=?, $p2) AND $w"
   241  
   242    do_eqp_test 9.3.$tn.1 $sql1 {/INDEX i1/}
   243    do_eqp_test 9.3.$tn.2 $sql2 {/INDEX i2/}
   244  }
   245  
   246  
   247  #-------------------------------------------------------------------------
   248  #
   249  
   250  ifcapable stat4 {
   251    do_execsql_test 10.1 {
   252      CREATE TABLE t6(a, b, c);
   253      CREATE INDEX t6i1 ON t6(a, b);
   254      CREATE INDEX t6i2 ON t6(c);
   255    }
   256    
   257    do_test 10.2 {
   258      for {set i 0} {$i < 16} {incr i} {
   259        execsql { INSERT INTO t6 VALUES($i%4, 'xyz', $i%8) }
   260      }
   261      execsql ANALYZE
   262    } {}
   263  
   264    do_eqp_test 10.3 {
   265      SELECT rowid FROM t6 WHERE a=0 AND c=0
   266    } {
   267      0 0 0 {SEARCH TABLE t6 USING INDEX t6i2 (c=?)}
   268    }
   269  
   270    do_eqp_test 10.4 {
   271      SELECT rowid FROM t6 WHERE a=0 AND b='xyz' AND c=0
   272    } {
   273      0 0 0 {SEARCH TABLE t6 USING INDEX t6i2 (c=?)}
   274    }
   275  
   276    do_eqp_test 10.5 {
   277      SELECT rowid FROM t6 WHERE likelihood(a=0, 0.1) AND c=0
   278    } {
   279      0 0 0 {SEARCH TABLE t6 USING INDEX t6i1 (a=?)}
   280    }
   281  
   282    do_eqp_test 10.6 {
   283      SELECT rowid FROM t6 WHERE likelihood(a=0, 0.1) AND b='xyz' AND c=0
   284    } {
   285      0 0 0 {SEARCH TABLE t6 USING INDEX t6i1 (a=? AND b=?)}
   286    }
   287  }
   288  
   289  finish_test