--- /dev/null
+# 2014 August 16
+#
+# 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.
+#
+#***********************************************************************
+#
+#
+
+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 sessionC
+
+#-------------------------------------------------------------------------
+# Test the outcome of a DELETE operation made as part of applying a
+# changeset failing with SQLITE_CONSTRAINT. This may happen if an
+# ON DELETE RESTRICT foreign key action is triggered, or if a trigger
+# program raises a constraint somehow.
+#
+do_execsql_test 1.0 {
+ PRAGMA foreign_keys = 1;
+
+ CREATE TABLE p(a PRIMARY KEY, b, c);
+ CREATE TABLE c(d PRIMARY KEY, e REFERENCES p ON DELETE RESTRICT);
+
+ INSERT INTO p VALUES('one', 1, 1);
+ INSERT INTO p VALUES('two', 2, 2);
+ INSERT INTO p VALUES('three', 3, 3);
+
+ INSERT INTO c VALUES(1, 'one');
+ INSERT INTO c VALUES(3, 'three');
+}
+
+do_test 1.1 {
+ execsql BEGIN
+ set C [changeset_from_sql {
+ INSERT INTO c VALUES(4, 'one');
+ DELETE FROM p WHERE a='two';
+ }]
+ execsql ROLLBACK
+ execsql {
+ INSERT INTO c VALUES(2, 'two');
+ }
+} {}
+
+do_test 1.2.1 {
+ proc xConflict {args} { return "ABORT" }
+ catch { sqlite3changeset_apply db $C xConflict } msg
+ set msg
+} {SQLITE_ABORT}
+do_execsql_test 1.2.2 { SELECT * FROM c } {1 one 3 three 2 two}
+
+do_test 1.3.1 {
+ proc xConflict {args} { return "OMIT" }
+ catch { sqlite3changeset_apply db $C xConflict } msg
+ set msg
+} {}
+do_execsql_test 1.3.2 { SELECT * FROM c } {1 one 3 three 2 two 4 one}
+do_execsql_test 1.3.3 {
+ SELECT * FROM p;
+} {one 1 1 two 2 2 three 3 3}
+
+
+#-------------------------------------------------------------------------
+# Test that concatenating a changeset with a patchset does not work.
+# Any attempt to do so returns SQLITE_ERROR.
+#
+reset_db
+do_execsql_test 2.0 {
+ CREATE TABLE x1(t, v PRIMARY KEY);
+ INSERT INTO x1 VALUES(12, 55);
+ INSERT INTO x1 VALUES(55, 14);
+}
+
+do_test 2.1 {
+ execsql BEGIN
+
+ sqlite3session S1 db main
+ S1 attach *
+ execsql {
+ UPDATE x1 SET t=13 WHERE v=55;
+ INSERT INTO x1 VALUES(99, 123);
+ }
+ set patchset [S1 patchset]
+ S1 delete
+
+ sqlite3session S1 db main
+ S1 attach *
+ execsql {
+ UPDATE x1 SET t=56 WHERE v=14;
+ INSERT INTO x1 VALUES(22, 998);
+ }
+ set changeset [S1 changeset]
+ S1 delete
+
+ execsql ROLLBACK
+} {}
+
+do_test 2.2 {
+ set rc [catch { sqlite3changeset_concat $patchset $changeset } msg]
+ list $rc $msg
+} {1 SQLITE_ERROR}
+
+do_test 2.3 {
+ set rc [catch { sqlite3changeset_concat $changeset $patchset } msg]
+ list $rc $msg
+} {1 SQLITE_ERROR}
+
+do_test 2.4 {
+ set rc [catch { sqlite3changeset_concat {} $patchset } msg]
+ list $rc $msg
+} [list 0 $patchset]
+
+do_test 2.5 {
+ set rc [catch { sqlite3changeset_concat $patchset {} } msg]
+ list $rc $msg
+} [list 0 $patchset]
+
+do_test 2.6 {
+ set rc [catch { sqlite3changeset_concat {} $changeset } msg]
+ list $rc $msg
+} [list 0 $changeset]
+
+do_test 2.7 {
+ set rc [catch { sqlite3changeset_concat $changeset {} } msg]
+ list $rc $msg
+} [list 0 $changeset]
+
+do_test 2.8 {
+ set rc [catch { sqlite3changeset_concat {} {} } msg]
+ list $rc $msg
+} [list 0 {}]
+
+
+#-------------------------------------------------------------------------
+# Test that the xFilter argument to sqlite3changeset_apply() works.
+#
+reset_db
+do_execsql_test 3.0 {
+ CREATE TABLE t1(a PRIMARY KEY, b);
+ CREATE TABLE t2(a PRIMARY KEY, b);
+ CREATE TABLE t3(a PRIMARY KEY, b);
+}
+do_test 3.1 {
+ execsql BEGIN
+ set changeset [changeset_from_sql {
+ INSERT INTO t1 VALUES(1, 1);
+ INSERT INTO t2 VALUES(2, 2);
+ INSERT INTO t3 VALUES(3, 3);
+ }]
+ execsql ROLLBACK
+} {}
+do_test 3.2 {
+ proc xFilter {zName} {
+ if {$zName == "t1"} { return 1 }
+ return 0
+ }
+ sqlite3changeset_apply db $changeset noop xFilter
+ execsql {
+ SELECT * FROM t1;
+ SELECT * FROM t2;
+ SELECT * FROM t3;
+ }
+} {1 1}
+do_test 3.3 {
+ proc xFilter {zName} {
+ if {$zName == "t3"} { return 1 }
+ return 0
+ }
+ sqlite3changeset_apply db $changeset noop xFilter
+ execsql {
+ SELECT * FROM t1;
+ SELECT * FROM t2;
+ SELECT * FROM t3;
+ }
+} {1 1 3 3}
+
+
+
+finish_test
+
-C Merge\slatest\strunk\schanges\swith\sthis\sbranch.
-D 2014-10-15T19:37:13.299
+C Fix\sa\sproblem\scausing\ssqlite3changeset_concat()\sto\sfail\sto\sdetect\sattempts\sto\sconcatenate\spatchsets\swhich\schangesets.
+D 2014-10-15T20:02:21.265
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in dd5f245aa8c741bc65845747203c8ce2f3fb6c83
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
F ext/session/session9.test 5409d90d8141881d08285ed1c2c0d8d10fb92069
F ext/session/sessionA.test 1feeab0b8e03527f08f2f1defb442da25480138f
F ext/session/sessionB.test 06961b7c3641151f5d23088250ecad132501113c
+F ext/session/sessionC.test 3982f8577b0744c5ce3aaef7cfeb5bd903f17fe4
F ext/session/session_common.tcl 9de0451b6a47218fc16b9ed8876b6238a0a3d88d
F ext/session/sessionfault.test bef044d0952c0d62c31c8d2400be72c8684545cc
-F ext/session/sqlite3session.c 67b8aee718cf34e267f4040d9b945a7a6407b0b2
+F ext/session/sqlite3session.c 838050c4c217d2843e4705b14be25d8f0457f155
F ext/session/sqlite3session.h 16608d29879a0ed3c6be6b7fb18dcdb5c707aaef
F ext/session/test_session.c a28352e99bc6a83b94e4cce99a7bf25c73d6d489
F ext/userauth/sqlite3userauth.h 19cb6f0e31316d0ee4afdfb7a85ef9da3333a220
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 83d4114f2aa404e670ced33511183baacd813a01 3c1e70f4d55bc009ed9ed4cf6d756d7061985851
-R 573bb7e03bcfc05e0f889e571f4f3aa7
+P 1b2824f1d11ac336779372e322aecfb36fb2a31d
+R fa664b8794125d09d3da5d2babd6e792
U dan
-Z d7531a3919881ed86fbddd665aff411c
+Z 8d94920cff847cf3f9fcffe7f6436f08