File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / test / savepoint3.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: # 2008 December 15
    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: savepoint3.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: 
   17: source $testdir/malloc_common.tcl
   18: 
   19: do_malloc_test savepoint3-1 -sqlprep {
   20:   CREATE TABLE t1(a, b, c);
   21:   INSERT INTO t1 VALUES(1, 2, 3);
   22: } -sqlbody {
   23:   SAVEPOINT one;
   24:     INSERT INTO t1 VALUES(4, 5, 6);
   25:     SAVEPOINT two;
   26:       DELETE FROM t1;
   27:     ROLLBACK TO two;
   28:   RELEASE one;
   29: }
   30: 
   31: do_malloc_test savepoint3-2 -sqlprep {
   32:   PRAGMA cache_size = 10;
   33:   CREATE TABLE t1(a, b, c);
   34:   INSERT INTO t1 VALUES(randstr(400,400), randstr(400,400), randstr(400,400));
   35:   INSERT INTO t1 SELECT 
   36:     randstr(400,400), randstr(400,400), randstr(400,400) FROM t1;
   37:   INSERT INTO t1 
   38:     SELECT randstr(400,400), randstr(400,400), randstr(400,400) FROM t1;
   39:   INSERT INTO t1 
   40:     SELECT randstr(400,400), randstr(400,400), randstr(400,400) FROM t1;
   41:   INSERT INTO t1 
   42:     SELECT randstr(400,400), randstr(400,400), randstr(400,400) FROM t1;
   43:   INSERT INTO t1 
   44:     SELECT randstr(400,400), randstr(400,400), randstr(400,400) FROM t1;
   45:   INSERT INTO t1 
   46:     SELECT randstr(400,400), randstr(400,400), randstr(400,400) FROM t1;
   47:   INSERT INTO t1 
   48:     SELECT randstr(400,400), randstr(400,400), randstr(400,400) FROM t1;
   49:   INSERT INTO t1 
   50:     SELECT randstr(400,400), randstr(400,400), randstr(400,400) FROM t1;
   51: } -sqlbody {
   52:   PRAGMA cache_size = 10;
   53:   SAVEPOINT one;
   54:     DELETE FROM t1 WHERE rowid < 5;
   55:     SAVEPOINT two;
   56:       DELETE FROM t1 WHERE rowid > 10;
   57:     ROLLBACK TO two;
   58:   ROLLBACK TO one;
   59:   RELEASE one;
   60: }
   61: 
   62: do_ioerr_test savepoint3.3 -sqlprep {
   63:   CREATE TABLE t1(a, b, c);
   64:   INSERT INTO t1 VALUES(1, randstr(1000,1000), randstr(1000,1000));
   65:   INSERT INTO t1 VALUES(2, randstr(1000,1000), randstr(1000,1000));
   66: } -sqlbody {
   67:   BEGIN;
   68:     UPDATE t1 SET a = 3 WHERE a = 1;
   69:     SAVEPOINT one;
   70:       UPDATE t1 SET a = 4 WHERE a = 2;
   71:   COMMIT;
   72: } -cleanup {
   73:   db eval {
   74:     SAVEPOINT one;
   75:     RELEASE one;
   76:   }
   77: }
   78: 
   79: # The following test does a really big savepoint rollback. One involving
   80: # more than 4000 pages. The idea is to get a specific sqlite3BitvecSet()
   81: # operation in pagerPlaybackSavepoint() to fail.
   82: #do_malloc_test savepoint3-4 -sqlprep {
   83: #  BEGIN;
   84: #    CREATE TABLE t1(a, b);
   85: #    CREATE INDEX i1 ON t1(a);
   86: #    CREATE INDEX i2 ON t1(b);
   87: #    INSERT INTO t1 VALUES(randstr(500,500), randstr(500,500));        --     1
   88: #    INSERT INTO t1 VALUES(randstr(500,500), randstr(500,500));        --     2
   89: #    INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; --     4
   90: #    INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; --     8
   91: #    INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; --    16
   92: #    INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; --    32
   93: #    INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; --    64
   94: #    INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; --   128
   95: #    INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; --   256
   96: #    INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; --   512
   97: #    INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; --  1024
   98: #    INSERT INTO t1 SELECT randstr(500,500), randstr(500,500) FROM t1; --  2048
   99: #  COMMIT;
  100: #  BEGIN;
  101: #    SAVEPOINT abc;
  102: #      UPDATE t1 SET a = randstr(500,500);
  103: #} -sqlbody {
  104: #    ROLLBACK TO abc;
  105: #}
  106: 
  107: 
  108: # Cause a specific malloc in savepoint rollback code to fail.
  109: #
  110: do_malloc_test savepoint3-4 -start 7 -sqlprep {
  111:   PRAGMA auto_vacuum = incremental;
  112:   PRAGMA cache_size = 1000;
  113: 
  114:   CREATE TABLE t1(a, b);
  115:   CREATE TABLE t2(a, b);
  116:   CREATE TABLE t3(a, b);
  117:   INSERT INTO t1 VALUES(1, randstr(500,500));
  118:   INSERT INTO t1 VALUES(2, randstr(500,500));
  119:   INSERT INTO t1 VALUES(3, randstr(500,500));
  120:   DELETE FROM t1;
  121: 
  122:   BEGIN;
  123:     INSERT INTO t1 VALUES(1, randstr(500,500));
  124:     INSERT INTO t1 VALUES(2, randstr(500,500));
  125:     INSERT INTO t1 VALUES(3, randstr(500,500));
  126:     DROP TABLE t3;                  -- Page 5 of the database file is now free.
  127:     DROP TABLE t2;                  -- Page 4 of the database file is now free.
  128: 
  129:     SAVEPOINT abc;
  130:       PRAGMA incremental_vacuum;
  131: } -sqlbody {
  132:   ROLLBACK TO abc;
  133: }
  134: 
  135: 
  136: finish_test

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