# 2013 July 04
#
# 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 tests that the sessions module handles foreign key constraint
# violations when applying changesets as required.
#

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 sessionA


forcedelete test.db2
sqlite3 db2 test.db2
foreach {tn db} {1 db 2 db2} {
  do_test 1.$tn.1 {
    execsql {
      CREATE TABLE t1(a PRIMARY KEY, b);
      CREATE TABLE t2(a PRIMARY KEY, b);
      CREATE TABLE t3(a PRIMARY KEY, b);
    } $db
  } {}
}

proc tbl_filter {zTbl} {
  return $::table_filter($zTbl)
}

do_test 2.1 {
  set ::table_filter(t1) 1
  set ::table_filter(t2) 0
  set ::table_filter(t3) 1

  sqlite3session S db main
  S table_filter tbl_filter 

  execsql {
    INSERT INTO t1 VALUES('a', 'b');
    INSERT INTO t2 VALUES('c', 'd');
    INSERT INTO t3 VALUES('e', 'f');
  }

  set changeset [S changeset]
  S delete
  sqlite3changeset_apply db2 $changeset xConflict

  execsql {
    SELECT * FROM t1;
    SELECT * FROM t2;
    SELECT * FROM t3;
  } db2
} {a b e f}


finish_test


