# 2010 August 2
#
# The author disclaims copyright to this source code.  In place of
# a legal notice, here is a blessing:
#
#    May you do good and not evil.
#    May you find forgiveness for yourself and forgive others.
#    May you share freely, never taking more than you give.
#
#***********************************************************************
# This file implements regression tests for SQLite library.  The
# focus of this file is testing the operation of the library in
# "PRAGMA journal_mode=WAL" mode with shared-cache turned on.
#

set testdir [file dirname $argv0]
source $testdir/tester.tcl

ifcapable !wal {finish_test ; return }

db close
set ::enable_shared_cache [sqlite3_enable_shared_cache 1]

sqlite3 db  test.db
sqlite3 db2 test.db

do_test walshared-1.0 {
  execsql {
    PRAGMA cache_size = 10;
    PRAGMA journal_mode = WAL;
    CREATE TABLE t1(a PRIMARY KEY, b UNIQUE);
    INSERT INTO t1 VALUES(randomblob(100), randomblob(200));
  }
} {wal}

do_test walshared-1.1 {
  execsql {
    BEGIN;
      INSERT INTO t1 VALUES(randomblob(100), randomblob(200));
      INSERT INTO t1 SELECT randomblob(100), randomblob(200) FROM t1;
      INSERT INTO t1 SELECT randomblob(100), randomblob(200) FROM t1;
      INSERT INTO t1 SELECT randomblob(100), randomblob(200) FROM t1;
  }
} {}

do_test walshared-1.2 {
  catchsql { PRAGMA wal_checkpoint }
} {1 {database table is locked}}

do_test walshared-1.3 {
  catchsql { PRAGMA wal_checkpoint } db2
} {1 {database table is locked}}

do_test walshared-1.4 {
  execsql { COMMIT }
  execsql { PRAGMA integrity_check } db2
} {ok}



sqlite3_enable_shared_cache $::enable_shared_cache
finish_test
