Annotation of embedaddon/sqlite3/test/shared2.test, revision 1.1.1.1

1.1       misho       1: # 2005 January 19
                      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: # $Id: shared2.test,v 1.8 2009/06/05 17:09:12 drh Exp $
                     13: 
                     14: set testdir [file dirname $argv0]
                     15: source $testdir/tester.tcl
                     16: source $testdir/lock_common.tcl
                     17: source $testdir/malloc_common.tcl
                     18: db close
                     19: 
                     20: ifcapable !shared_cache {
                     21:   finish_test
                     22:   return
                     23: }
                     24: set ::enable_shared_cache [sqlite3_enable_shared_cache 1]
                     25: 
                     26: # Test that if we delete all rows from a table any read-uncommitted 
                     27: # cursors are correctly invalidated. Test on both table and index btrees.
                     28: do_test shared2-1.1 {
                     29:   sqlite3 db1 test.db
                     30:   sqlite3 db2 test.db
                     31: 
                     32:   # Set up some data. Table "numbers" has 64 rows after this block 
                     33:   # is executed.
                     34:   execsql {
                     35:     BEGIN;
                     36:     CREATE TABLE numbers(a PRIMARY KEY, b);
                     37:     INSERT INTO numbers(oid) VALUES(NULL);
                     38:     INSERT INTO numbers(oid) SELECT NULL FROM numbers;
                     39:     INSERT INTO numbers(oid) SELECT NULL FROM numbers;
                     40:     INSERT INTO numbers(oid) SELECT NULL FROM numbers;
                     41:     INSERT INTO numbers(oid) SELECT NULL FROM numbers;
                     42:     INSERT INTO numbers(oid) SELECT NULL FROM numbers;
                     43:     INSERT INTO numbers(oid) SELECT NULL FROM numbers;
                     44:     UPDATE numbers set a = oid, b = 'abcdefghijklmnopqrstuvwxyz0123456789';
                     45:     COMMIT;
                     46:   } db1
                     47: } {}
                     48: do_test shared2-1.2 {
                     49:   # Put connection 2 in read-uncommitted mode and start a SELECT on table 
                     50:   # 'numbers'. Half way through the SELECT, use connection 1 to delete the
                     51:   # contents of this table.
                     52:   execsql {
                     53:     pragma read_uncommitted = 1;
                     54:   } db2
                     55:   set count [execsql {SELECT count(*) FROM numbers} db2]
                     56:   db2 eval {SELECT a FROM numbers ORDER BY oid} {
                     57:     if {$a==32} {
                     58:       execsql {
                     59:         BEGIN;
                     60:         DELETE FROM numbers;
                     61:       } db1
                     62:     }
                     63:   }
                     64:   list $a $count
                     65: } {32 64}
                     66: do_test shared2-1.3 {
                     67:   # Same test as 1.2, except scan using the index this time.
                     68:   execsql {
                     69:     ROLLBACK;
                     70:   } db1
                     71:   set count [execsql {SELECT count(*) FROM numbers} db2]
                     72:   db2 eval {SELECT a, b FROM numbers ORDER BY a} {
                     73:     if {$a==32} {
                     74:       execsql {
                     75:         DELETE FROM numbers;
                     76:       } db1
                     77:     }
                     78:   }
                     79:   list $a $count
                     80: } {32 64}
                     81: 
                     82: #---------------------------------------------------------------------------
                     83: # These tests, shared2.2.*, test the outcome when data is added to or 
                     84: # removed from a table due to a rollback while a read-uncommitted 
                     85: # cursor is scanning it.
                     86: #
                     87: do_test shared2-2.1 {
                     88:   execsql {
                     89:     INSERT INTO numbers VALUES(1, 'Medium length text field');
                     90:     INSERT INTO numbers VALUES(2, 'Medium length text field');
                     91:     INSERT INTO numbers VALUES(3, 'Medium length text field');
                     92:     INSERT INTO numbers VALUES(4, 'Medium length text field');
                     93:     BEGIN;
                     94:     DELETE FROM numbers WHERE (a%2)=0;
                     95:   } db1
                     96:   set res [list]
                     97:   db2 eval {
                     98:     SELECT a FROM numbers ORDER BY a;
                     99:   } {
                    100:     lappend res $a
                    101:     if {$a==3} {
                    102:       execsql {ROLLBACK} db1
                    103:     }
                    104:   }
                    105:   set res
                    106: } {1 3 4}
                    107: do_test shared2-2.2 {
                    108:   execsql {
                    109:     BEGIN;
                    110:     INSERT INTO numbers VALUES(5, 'Medium length text field');
                    111:     INSERT INTO numbers VALUES(6, 'Medium length text field');
                    112:   } db1
                    113:   set res [list]
                    114:   db2 eval {
                    115:     SELECT a FROM numbers ORDER BY a;
                    116:   } {
                    117:     lappend res $a
                    118:     if {$a==5} {
                    119:       execsql {ROLLBACK} db1
                    120:     }
                    121:   }
                    122:   set res
                    123: } {1 2 3 4 5}
                    124: 
                    125: db1 close
                    126: db2 close
                    127: 
                    128: do_test shared2-3.2 {
                    129:   sqlite3_enable_shared_cache 1
                    130: } {1}
                    131: 
                    132: forcedelete test.db
                    133: 
                    134: sqlite3 db test.db
                    135: do_test shared2-4.1 {
                    136:   execsql {
                    137:     CREATE TABLE t0(a, b);
                    138:     CREATE TABLE t1(a, b DEFAULT 'hello world');
                    139:   }
                    140: } {}
                    141: db close
                    142: 
                    143: sqlite3 db test.db
                    144: sqlite3 db2 test.db
                    145: 
                    146: do_test shared2-4.2 {
                    147:   execsql { SELECT a, b FROM t0 } db
                    148:   execsql { INSERT INTO t1(a) VALUES(1) } db2
                    149: } {}
                    150: 
                    151: do_test shared2-4.3 {
                    152:   db2 close
                    153:   db close
                    154: } {}
                    155: 
                    156: # At one point, this was causing a crash.
                    157: #
                    158: do_test shared2-5.1 {
                    159:   sqlite3 db test.db
                    160:   sqlite3 db2 test.db
                    161:   execsql { CREATE TABLE t2(a, b, c) }
                    162:   
                    163:   # The following statement would crash when attempting to sqlite3_free()
                    164:   # a pointer allocated from a lookaside buffer.
                    165:   execsql { CREATE INDEX i1 ON t2(a) } db2
                    166: } {}
                    167: 
                    168: db close
                    169: db2 close
                    170: 
                    171: # The following test verifies that shared-cache mode does not automatically
                    172: # turn on exclusive-locking mode for some reason.
                    173: do_multiclient_test {tn} {
                    174:   sql1 { CREATE TABLE t1(a, b) }
                    175:   sql2 { CREATE TABLE t2(a, b) }
                    176:   do_test shared2-6.$tn.1 { sql1 { SELECT * FROM t2 } } {}
                    177:   do_test shared2-6.$tn.2 { sql2 { SELECT * FROM t1 } } {}
                    178: }
                    179: 
                    180: sqlite3_enable_shared_cache $::enable_shared_cache
                    181: finish_test

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