Annotation of embedaddon/sqlite3/test/distinct.test, revision 1.1
1.1 ! misho 1: # 2011 July 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. The
! 12: # focus of this script is the DISTINCT modifier.
! 13: #
! 14:
! 15: set testdir [file dirname $argv0]
! 16: source $testdir/tester.tcl
! 17:
! 18: set testprefix distinct
! 19:
! 20:
! 21: proc is_distinct_noop {sql} {
! 22: set sql1 $sql
! 23: set sql2 [string map {DISTINCT ""} $sql]
! 24:
! 25: set program1 [list]
! 26: set program2 [list]
! 27: db eval "EXPLAIN $sql1" {
! 28: if {$opcode != "Noop"} { lappend program1 $opcode }
! 29: }
! 30: db eval "EXPLAIN $sql2" {
! 31: if {$opcode != "Noop"} { lappend program2 $opcode }
! 32: }
! 33:
! 34: return [expr {$program1==$program2}]
! 35: }
! 36:
! 37: proc do_distinct_noop_test {tn sql} {
! 38: uplevel [list do_test $tn [list is_distinct_noop $sql] 1]
! 39: }
! 40: proc do_distinct_not_noop_test {tn sql} {
! 41: uplevel [list do_test $tn [list is_distinct_noop $sql] 0]
! 42: }
! 43:
! 44: proc do_temptables_test {tn sql temptables} {
! 45: uplevel [list do_test $tn [subst -novar {
! 46: set ret ""
! 47: db eval "EXPLAIN [set sql]" {
! 48: if {$opcode == "OpenEphemeral" || $opcode == "SorterOpen"} {
! 49: if {$p5 != "10" && $p5!="00"} { error "p5 = $p5" }
! 50: if {$p5 == "10"} {
! 51: lappend ret hash
! 52: } else {
! 53: lappend ret btree
! 54: }
! 55: }
! 56: }
! 57: set ret
! 58: }] $temptables]
! 59: }
! 60:
! 61:
! 62: #-------------------------------------------------------------------------
! 63: # The following tests - distinct-1.* - check that the planner correctly
! 64: # detects cases where a UNIQUE index means that a DISTINCT clause is
! 65: # redundant. Currently the planner only detects such cases when there
! 66: # is a single table in the FROM clause.
! 67: #
! 68: do_execsql_test 1.0 {
! 69: CREATE TABLE t1(a, b, c, d);
! 70: CREATE UNIQUE INDEX i1 ON t1(b, c);
! 71: CREATE UNIQUE INDEX i2 ON t1(d COLLATE nocase);
! 72:
! 73: CREATE TABLE t2(x INTEGER PRIMARY KEY, y);
! 74:
! 75: CREATE TABLE t3(c1 PRIMARY KEY, c2);
! 76: CREATE INDEX i3 ON t3(c2);
! 77: }
! 78: foreach {tn noop sql} {
! 79:
! 80: 1 1 "SELECT DISTINCT b, c FROM t1"
! 81: 2 1 "SELECT DISTINCT c FROM t1 WHERE b = ?"
! 82: 3 1 "SELECT DISTINCT rowid FROM t1"
! 83: 4 1 "SELECT DISTINCT rowid, a FROM t1"
! 84: 5 1 "SELECT DISTINCT x FROM t2"
! 85: 6 1 "SELECT DISTINCT * FROM t2"
! 86: 7 1 "SELECT DISTINCT * FROM (SELECT * FROM t2)"
! 87:
! 88: 8 1 "SELECT DISTINCT * FROM t1"
! 89:
! 90: 8 0 "SELECT DISTINCT a, b FROM t1"
! 91:
! 92: 9 0 "SELECT DISTINCT c FROM t1 WHERE b IN (1,2)"
! 93: 10 0 "SELECT DISTINCT c FROM t1"
! 94: 11 0 "SELECT DISTINCT b FROM t1"
! 95:
! 96: 12 0 "SELECT DISTINCT a, d FROM t1"
! 97: 13 0 "SELECT DISTINCT a, b, c COLLATE nocase FROM t1"
! 98: 14 1 "SELECT DISTINCT a, d COLLATE nocase FROM t1"
! 99: 15 0 "SELECT DISTINCT a, d COLLATE binary FROM t1"
! 100: 16 1 "SELECT DISTINCT a, b, c COLLATE binary FROM t1"
! 101:
! 102: 16 0 "SELECT DISTINCT t1.rowid FROM t1, t2"
! 103: 17 0 { /* Technically, it would be possible to detect that DISTINCT
! 104: ** is a no-op in cases like the following. But SQLite does not
! 105: ** do so. */
! 106: SELECT DISTINCT t1.rowid FROM t1, t2 WHERE t1.rowid=t2.rowid }
! 107:
! 108: 18 1 "SELECT DISTINCT c1, c2 FROM t3"
! 109: 19 1 "SELECT DISTINCT c1 FROM t3"
! 110: 20 1 "SELECT DISTINCT * FROM t3"
! 111: 21 0 "SELECT DISTINCT c2 FROM t3"
! 112:
! 113: 22 0 "SELECT DISTINCT * FROM (SELECT 1, 2, 3 UNION SELECT 4, 5, 6)"
! 114: 23 1 "SELECT DISTINCT rowid FROM (SELECT 1, 2, 3 UNION SELECT 4, 5, 6)"
! 115:
! 116: 24 0 "SELECT DISTINCT rowid/2 FROM t1"
! 117: 25 1 "SELECT DISTINCT rowid/2, rowid FROM t1"
! 118: 26 1 "SELECT DISTINCT rowid/2, b FROM t1 WHERE c = ?"
! 119: } {
! 120: if {$noop} {
! 121: do_distinct_noop_test 1.$tn $sql
! 122: } else {
! 123: do_distinct_not_noop_test 1.$tn $sql
! 124: }
! 125: }
! 126:
! 127: #-------------------------------------------------------------------------
! 128: # The following tests - distinct-2.* - test cases where an index is
! 129: # used to deliver results in order of the DISTINCT expressions.
! 130: #
! 131: drop_all_tables
! 132: do_execsql_test 2.0 {
! 133: CREATE TABLE t1(a, b, c);
! 134:
! 135: CREATE INDEX i1 ON t1(a, b);
! 136: CREATE INDEX i2 ON t1(b COLLATE nocase, c COLLATE nocase);
! 137:
! 138: INSERT INTO t1 VALUES('a', 'b', 'c');
! 139: INSERT INTO t1 VALUES('A', 'B', 'C');
! 140: INSERT INTO t1 VALUES('a', 'b', 'c');
! 141: INSERT INTO t1 VALUES('A', 'B', 'C');
! 142: }
! 143:
! 144: foreach {tn sql temptables res} {
! 145: 1 "a, b FROM t1" {} {A B a b}
! 146: 2 "b, a FROM t1" {} {B A b a}
! 147: 3 "a, b, c FROM t1" {hash} {a b c A B C}
! 148: 4 "a, b, c FROM t1 ORDER BY a, b, c" {btree} {A B C a b c}
! 149: 5 "b FROM t1 WHERE a = 'a'" {} {b}
! 150: 6 "b FROM t1" {hash} {b B}
! 151: 7 "a FROM t1" {} {A a}
! 152: 8 "b COLLATE nocase FROM t1" {} {b}
! 153: 9 "b COLLATE nocase FROM t1 ORDER BY b COLLATE nocase" {} {B}
! 154: } {
! 155: do_execsql_test 2.$tn.1 "SELECT DISTINCT $sql" $res
! 156: do_temptables_test 2.$tn.2 "SELECT DISTINCT $sql" $temptables
! 157: }
! 158:
! 159: do_execsql_test 2.A {
! 160: SELECT (SELECT DISTINCT o.a FROM t1 AS i) FROM t1 AS o;
! 161: } {a A a A}
! 162:
! 163:
! 164:
! 165:
! 166: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>