File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / test / shared2.test
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:04:16 2012 UTC (12 years, 10 months ago) by misho
Branches: sqlite3, MAIN
CVS tags: v3_7_10, HEAD
sqlite3

    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.1.1.1 2012/02/21 17:04:16 misho 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>