# 2018 August 6
#
# 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.
#
#***********************************************************************
#
# Tests for calling sqlite3_snapshot_open() when there is already
# a read transaction open on the database.
#

set testdir [file dirname $argv0]
source $testdir/tester.tcl
ifcapable !snapshot {finish_test; return}
set testprefix snapshot_up

# This test does not work with the inmemory_journal permutation. The reason
# is that each connection opened as part of this permutation executes
# "PRAGMA journal_mode=memory", which fails if the database is in wal mode
# and there are one or more existing connections.
if {[permutation]=="inmemory_journal"} {
  finish_test
  return
}

db timeout 1000

do_execsql_test 1.0 {
  CREATE TABLE t1(a, b, c);
  PRAGMA journal_mode = wal;
  INSERT INTO t1 VALUES(1, 2, 3);
  INSERT INTO t1 VALUES(4, 5, 6);
  INSERT INTO t1 VALUES(7, 8, 9);
} {wal}

do_test 1.1 {
  execsql BEGIN
  set ::snap1 [sqlite3_snapshot_get db main]
  execsql COMMIT
  execsql { INSERT INTO t1 VALUES(10, 11, 12); }
  execsql BEGIN
  set ::snap2 [sqlite3_snapshot_get db main]
  execsql COMMIT
  execsql { INSERT INTO t1 VALUES(13, 14, 15); }
  execsql BEGIN
  set ::snap3 [sqlite3_snapshot_get db main]
  execsql COMMIT
} {}

do_execsql_test 1.2 {
  BEGIN;
    SELECT * FROM t1
} {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15}

do_test 1.3 {
  sqlite3_snapshot_open db main $::snap1
  execsql { SELECT * FROM t1 }
} {1 2 3 4 5 6 7 8 9}

do_test 1.4 {
  sqlite3_snapshot_open db main $::snap2
  execsql { SELECT * FROM t1 }
} {1 2 3 4 5 6 7 8 9 10 11 12}

do_test 1.5 {
  sqlite3 db2 test.db
  execsql { PRAGMA wal_checkpoint } db2
} {0 5 4}

do_execsql_test 1.6 {
  SELECT * FROM t1
} {1 2 3 4 5 6 7 8 9 10 11 12}

do_test 1.7 {
  list [catch { sqlite3_snapshot_open db main $::snap1 } msg] $msg
} {1 SQLITE_ERROR_SNAPSHOT}

do_execsql_test 1.8 {
  SELECT * FROM t1
} {1 2 3 4 5 6 7 8 9 10 11 12}

do_test 1.9 {
  execsql { COMMIT ; BEGIN }
  list [catch { sqlite3_snapshot_open db main $::snap1 } msg] $msg
} {1 SQLITE_ERROR_SNAPSHOT}

do_test 1.10 {
  execsql { COMMIT }
  execsql {
    PRAGMA wal_checkpoint;
    DELETE FROM t1 WHERE a = 1;
  } db2
  execsql BEGIN
  set ::snap4 [sqlite3_snapshot_get db main]
  execsql COMMIT
  execsql {
    DELETE FROM t1 WHERE a = 4;
  } db2
} {}

do_test 1.11 {
  execsql { 
    BEGIN;
      SELECT * FROM t1
  }
} {7 8 9 10 11 12 13 14 15}
do_test 1.12 {
  sqlite3_snapshot_open db main $::snap4
  execsql { SELECT * FROM t1 }
} {4 5 6 7 8 9 10 11 12 13 14 15}

do_test 1.13 {
  list [catch { sqlite3_snapshot_open db main $::snap3 } msg] $msg
} {1 SQLITE_ERROR_SNAPSHOT}
do_test 1.14 {
  execsql { SELECT * FROM t1 }
} {4 5 6 7 8 9 10 11 12 13 14 15}

db close
db2 close
sqlite3 db test.db
do_execsql_test 1.15 {
  BEGIN;
    SELECT * FROM t1
} {7 8 9 10 11 12 13 14 15}
do_test 1.16 {
  list [catch { sqlite3_snapshot_open db main $::snap4 } msg] $msg
} {1 SQLITE_ERROR_SNAPSHOT}
do_execsql_test 1.17 { COMMIT }

sqlite3_snapshot_free $::snap1
sqlite3_snapshot_free $::snap2
sqlite3_snapshot_free $::snap3
sqlite3_snapshot_free $::snap4

#-------------------------------------------------------------------------
catch { db close }
sqlite3 db test.db
sqlite3 db2 test.db
sqlite3 db3 test.db

proc xBusy {args} { return 1 }
db3 busy xBusy

do_test 2.1 {
  execsql { INSERT INTO t1 VALUES(16, 17, 18) } db2
  execsql BEGIN
  set ::snap1 [sqlite3_snapshot_get db main]
  execsql COMMIT
  execsql { INSERT INTO t1 VALUES(19, 20, 21) } db2
  execsql BEGIN
  set ::snap2 [sqlite3_snapshot_get db main]
  execsql COMMIT
  set {} {}
} {}

do_execsql_test -db db2 2.2 {
  BEGIN;
    INSERT INTO t1 VALUES(19, 20, 21);
}

do_test 2.3 {
  execsql BEGIN
  sqlite3_snapshot_open db main $::snap1
  execsql { SELECT * FROM t1 }
} {7 8 9 10 11 12 13 14 15 16 17 18}

proc xBusy {args} { 
  set ::res [list [catch { sqlite3_snapshot_open db main $::snap2 } msg] $msg]
  return 1
}
db3 busy xBusy
do_test 2.4 {
  execsql {PRAGMA wal_checkpoint = restart} db3
  set ::res
} {1 SQLITE_BUSY}

sqlite3_snapshot_free $::snap1
sqlite3_snapshot_free $::snap2

finish_test
