# 2011 March 07
#
# 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.
#

if {![info exists testdir]} {
  set testdir [file join [file dirname [info script]] .. .. test]
} 
source [file join [file dirname [info script]] session_common.tcl]
source $testdir/tester.tcl
ifcapable !session {finish_test; return}

set testprefix sessionconflict

db close
sqlite3_shutdown
test_sqlite3_log log
proc log {code msg} { puts "LOG $code $msg" }
sqlite3 db test.db

forcedelete test.db2
sqlite3 db2 test.db2

do_test 1.0 {
  do_common_sql {
    CREATE TABLE t1(a PRIMARY KEY, b, c UNIQUE);
    INSERT INTO t1 VALUES(1, 1, 1);
    INSERT INTO t1 VALUES(2, 2, 2);
    INSERT INTO t1 VALUES(3, 3, 3);
  }
} {}

do_execsql_test -db db2 1.1 {
  INSERT INTO t1 VALUES(6, 6, 6);
}

proc xConflict {args} {
  return "ABORT"
}


do_test 1.2 {
  set chng [changeset_from_sql {
    UPDATE t1 SET b=10, c=10 WHERE a=1;
    UPDATE t1 SET b=444 WHERE a=2;
    INSERT INTO t1 VALUES(4, 4, 4);
    INSERT INTO t1 VALUES(5, 5, 5);
    INSERT INTO t1 VALUES(6, 6, 6);
  }]

  execsql BEGIN db2
  set res [list [catch { sqlite3changeset_apply db2 $chng xConflict } msg] $msg]
  execsql ROLLBACK db2
  set res
} {1 SQLITE_ABORT}

do_execsql_test -db db2 1.3 {
  SELECT * FROM t1;
} {
  1 1 1
  2 2 2
  3 3 3
  6 6 6
}



finish_test
