Annotation of embedaddon/sqlite3/test/tkt-80ba201079.test, revision 1.1.1.1

1.1       misho       1: # 2010 December 6
                      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. Specifically,
                     12: # it tests that ticket [80ba201079ea608071d22a57856b940ea3ac53ce] is
                     13: # resolved.  That ticket is about an incorrect result that appears when
                     14: # an index is added.  The root cause is that a constant is being used
                     15: # without initialization when the OR optimization applies in the WHERE clause.
                     16: #
                     17: 
                     18: set testdir [file dirname $argv0]
                     19: source $testdir/tester.tcl
                     20: set ::testprefix tkt-80ba2
                     21: 
                     22: do_test tkt-80ba2-100 {
                     23:   db eval {
                     24:     CREATE TABLE t1(a);
                     25:     INSERT INTO t1 VALUES('A');
                     26:     CREATE TABLE t2(b);
                     27:     INSERT INTO t2 VALUES('B');
                     28:     CREATE TABLE t3(c);
                     29:     INSERT INTO t3 VALUES('C');
                     30:     SELECT * FROM t1, t2
                     31:      WHERE (a='A' AND b='X')
                     32:         OR (a='A' AND EXISTS (SELECT * FROM t3 WHERE c='C'));
                     33:   }
                     34: } {A B}
                     35: do_test tkt-80ba2-101 {
                     36:   db eval {
                     37:     CREATE INDEX i1 ON t1(a);
                     38:     SELECT * FROM t1, t2
                     39:      WHERE (a='A' AND b='X')
                     40:         OR (a='A' AND EXISTS (SELECT * FROM t3 WHERE c='C'));
                     41:   }
                     42: } {A B}
                     43: do_test tkt-80ba2-102 {
                     44:   optimization_control db factor-constants 0
                     45:   db cache flush
                     46:   db eval {
                     47:     SELECT * FROM t1, t2
                     48:      WHERE (a='A' AND b='X')
                     49:         OR (a='A' AND EXISTS (SELECT * FROM t3 WHERE c='C'));
                     50:   }
                     51: } {A B}
                     52: optimization_control db all 1
                     53: 
                     54: # Verify that the optimization_control command is actually working
                     55: #
                     56: do_test tkt-80ba2-150 {
                     57:   optimization_control db factor-constants 1
                     58:   db cache flush
                     59:   set x1 [db eval {EXPLAIN 
                     60:     SELECT * FROM t1, t2
                     61:      WHERE (a='A' AND b='X')
                     62:         OR (a='A' AND EXISTS (SELECT * FROM t3 WHERE c='C'));}]
                     63:   optimization_control db factor-constants 0
                     64:   db cache flush
                     65:   set x2 [db eval {EXPLAIN 
                     66:     SELECT * FROM t1, t2
                     67:      WHERE (a='A' AND b='X')
                     68:         OR (a='A' AND EXISTS (SELECT * FROM t3 WHERE c='C'));}]
                     69: 
                     70:   expr {$x1==$x2}
                     71: } {0}
                     72: 
                     73: do_test tkt-80ba2-200 {
                     74:   db eval {
                     75:     CREATE TABLE entry_types (
                     76:                         id     integer primary key,
                     77:                         name   text
                     78:                     );
                     79:     INSERT INTO "entry_types" VALUES(100,'cli_command');
                     80:     INSERT INTO "entry_types" VALUES(300,'object_change');
                     81:     CREATE TABLE object_changes (
                     82:                         change_id    integer primary key,
                     83:                         system_id    int,
                     84:                         obj_id       int,
                     85:                         obj_context  text,
                     86:                         change_type  int,
                     87:                         command_id   int
                     88:                     );
                     89:     INSERT INTO "object_changes" VALUES(1551,1,114608,'exported_pools',1,2114);
                     90:     INSERT INTO "object_changes" VALUES(2048,1,114608,'exported_pools',2,2319);
                     91:     CREATE TABLE timeline (
                     92:                         rowid        integer primary key,
                     93:                         timestamp    text,
                     94:                         system_id    int,
                     95:                         entry_type   int,
                     96:                         entry_id     int
                     97:                     );
                     98:     INSERT INTO "timeline" VALUES(6735,'2010-11-21 17:08:27.000',1,300,2048);
                     99:     INSERT INTO "timeline" VALUES(6825,'2010-11-21 17:09:21.000',1,300,2114);
                    100:     SELECT entry_type,
                    101:            entry_types.name,
                    102:            entry_id
                    103:       FROM timeline JOIN entry_types ON entry_type = entry_types.id
                    104:      WHERE (entry_types.name = 'cli_command' AND entry_id=2114)
                    105:         OR (entry_types.name = 'object_change'
                    106:              AND entry_id IN (SELECT change_id
                    107:                               FROM object_changes
                    108:                                WHERE obj_context = 'exported_pools'));
                    109:   }
                    110: } {300 object_change 2048}
                    111: do_test tkt-80ba2-201 {
                    112:   db eval {
                    113:     CREATE INDEX timeline_entry_id_idx on timeline(entry_id);
                    114:     SELECT entry_type,
                    115:            entry_types.name,
                    116:            entry_id
                    117:       FROM timeline JOIN entry_types ON entry_type = entry_types.id
                    118:      WHERE (entry_types.name = 'cli_command' AND entry_id=2114)
                    119:         OR (entry_types.name = 'object_change'
                    120:              AND entry_id IN (SELECT change_id
                    121:                               FROM object_changes
                    122:                                WHERE obj_context = 'exported_pools'));
                    123:   }
                    124: } {300 object_change 2048}
                    125: do_test tkt-80ba2-202 {
                    126:   optimization_control db factor-constants 0
                    127:   db cache flush
                    128:   db eval {
                    129:     SELECT entry_type,
                    130:            entry_types.name,
                    131:            entry_id
                    132:       FROM timeline JOIN entry_types ON entry_type = entry_types.id
                    133:      WHERE (entry_types.name = 'cli_command' AND entry_id=2114)
                    134:         OR (entry_types.name = 'object_change'
                    135:              AND entry_id IN (SELECT change_id
                    136:                               FROM object_changes
                    137:                                WHERE obj_context = 'exported_pools'));
                    138:   }
                    139: } {300 object_change 2048}
                    140: 
                    141: #-------------------------------------------------------------------------
                    142: #
                    143: 
                    144: drop_all_tables
                    145: do_execsql_test 301 {
                    146:   CREATE TABLE t1(a, b, c);
                    147:   CREATE INDEX i1 ON t1(a);
                    148:   CREATE INDEX i2 ON t1(b);
                    149:   CREATE TABLE t2(d, e);
                    150: 
                    151:   INSERT INTO t1 VALUES('A', 'B', 'C');
                    152:   INSERT INTO t2 VALUES('D', 'E');
                    153: }
                    154: 
                    155: do_execsql_test 302 {
                    156:   SELECT * FROM t1, t2 WHERE
                    157:     (a='A' AND d='E') OR
                    158:     (b='B' AND c IN ('C', 'D', 'E'))
                    159: } {A B C D E}
                    160: 
                    161: do_execsql_test 303 {
                    162:   SELECT * FROM t1, t2 WHERE
                    163:     (a='A' AND d='E') OR
                    164:     (b='B' AND c IN (SELECT c FROM t1))
                    165: } {A B C D E}
                    166: 
                    167: do_execsql_test 304 {
                    168:   SELECT * FROM t1, t2 WHERE
                    169:     (a='A' AND d='E') OR
                    170:     (b='B' AND c IN (SELECT 'B' UNION SELECT 'C' UNION SELECT 'D'))
                    171: } {A B C D E}
                    172: 
                    173: do_execsql_test 305 {
                    174:   SELECT * FROM t1, t2 WHERE
                    175:     (b='B' AND c IN ('C', 'D', 'E')) OR
                    176:     (a='A' AND d='E')
                    177: } {A B C D E}
                    178: 
                    179: do_execsql_test 306 {
                    180:   SELECT * FROM t1, t2 WHERE
                    181:     (b='B' AND c IN (SELECT c FROM t1)) OR
                    182:     (a='A' AND d='E')
                    183: } {A B C D E}
                    184: 
                    185: do_execsql_test 307 {
                    186:   SELECT * FROM t1, t2 WHERE
                    187:     (b='B' AND c IN (SELECT 'B' UNION SELECT 'C' UNION SELECT 'D')) OR
                    188:     (a='A' AND d='E')
                    189: } {A B C D E}
                    190: 
                    191: finish_test

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