17531a5a3Sdan# 2013 July 04 27531a5a3Sdan# 37531a5a3Sdan# The author disclaims copyright to this source code. In place of 47531a5a3Sdan# a legal notice, here is a blessing: 57531a5a3Sdan# 67531a5a3Sdan# May you do good and not evil. 77531a5a3Sdan# May you find forgiveness for yourself and forgive others. 87531a5a3Sdan# May you share freely, never taking more than you give. 97531a5a3Sdan# 107531a5a3Sdan#*********************************************************************** 117531a5a3Sdan# 12*f05ac112Sdan# This file tests that filter callbacks work as required. 137531a5a3Sdan# 147531a5a3Sdan 157531a5a3Sdanif {![info exists testdir]} { 167531a5a3Sdan set testdir [file join [file dirname [info script]] .. .. test] 177531a5a3Sdan} 187531a5a3Sdansource [file join [file dirname [info script]] session_common.tcl] 197531a5a3Sdansource $testdir/tester.tcl 207531a5a3Sdanifcapable !session {finish_test; return} 217531a5a3Sdanset testprefix sessionA 227531a5a3Sdan 237531a5a3Sdan 247531a5a3Sdanforcedelete test.db2 257531a5a3Sdansqlite3 db2 test.db2 267531a5a3Sdanforeach {tn db} {1 db 2 db2} { 277531a5a3Sdan do_test 1.$tn.1 { 287531a5a3Sdan execsql { 297531a5a3Sdan CREATE TABLE t1(a PRIMARY KEY, b); 307531a5a3Sdan CREATE TABLE t2(a PRIMARY KEY, b); 317531a5a3Sdan CREATE TABLE t3(a PRIMARY KEY, b); 327531a5a3Sdan } $db 337531a5a3Sdan } {} 347531a5a3Sdan} 357531a5a3Sdan 367531a5a3Sdanproc tbl_filter {zTbl} { 377531a5a3Sdan return $::table_filter($zTbl) 387531a5a3Sdan} 397531a5a3Sdan 407531a5a3Sdando_test 2.1 { 417531a5a3Sdan set ::table_filter(t1) 1 427531a5a3Sdan set ::table_filter(t2) 0 437531a5a3Sdan set ::table_filter(t3) 1 447531a5a3Sdan 457531a5a3Sdan sqlite3session S db main 467531a5a3Sdan S table_filter tbl_filter 477531a5a3Sdan 487531a5a3Sdan execsql { 497531a5a3Sdan INSERT INTO t1 VALUES('a', 'b'); 507531a5a3Sdan INSERT INTO t2 VALUES('c', 'd'); 517531a5a3Sdan INSERT INTO t3 VALUES('e', 'f'); 527531a5a3Sdan } 537531a5a3Sdan 547531a5a3Sdan set changeset [S changeset] 557531a5a3Sdan S delete 567531a5a3Sdan sqlite3changeset_apply db2 $changeset xConflict 577531a5a3Sdan 587531a5a3Sdan execsql { 597531a5a3Sdan SELECT * FROM t1; 607531a5a3Sdan SELECT * FROM t2; 617531a5a3Sdan SELECT * FROM t3; 627531a5a3Sdan } db2 637531a5a3Sdan} {a b e f} 647531a5a3Sdan 65*f05ac112Sdan#------------------------------------------------------------------------- 66*f05ac112Sdan# Test that filter callbacks passed to sqlite3changeset_apply() are 67*f05ac112Sdan# invoked correctly. 68*f05ac112Sdan# 69*f05ac112Sdanreset_db 70*f05ac112Sdando_execsql_test 3.1 { 71*f05ac112Sdan CREATE TABLE t1(a PRIMARY KEY, b); 72*f05ac112Sdan CREATE TABLE t2(x PRIMARY KEY, y); 73*f05ac112Sdan} 74*f05ac112Sdan 75*f05ac112Sdando_test 3.2 { 76*f05ac112Sdan execsql BEGIN 77*f05ac112Sdan set ::cs [changeset_from_sql { 78*f05ac112Sdan INSERT INTO t1 VALUES(1, 2); 79*f05ac112Sdan INSERT INTO t2 VALUES('x', 'y'); 80*f05ac112Sdan }] 81*f05ac112Sdan execsql ROLLBACK 82*f05ac112Sdan set {} {} 83*f05ac112Sdan} {} 84*f05ac112Sdan 85*f05ac112Sdanproc filter {x y} { 86*f05ac112Sdan return [string equal $x $y] 87*f05ac112Sdan} 88*f05ac112Sdan 89*f05ac112Sdando_test 3.3 { 90*f05ac112Sdan sqlite3changeset_apply db $::cs {} [list filter t1] 91*f05ac112Sdan execsql { 92*f05ac112Sdan SELECT * FROM t1; 93*f05ac112Sdan SELECT * FROM t2; 94*f05ac112Sdan } 95*f05ac112Sdan} {1 2} 96*f05ac112Sdan 97*f05ac112Sdando_test 3.4 { 98*f05ac112Sdan execsql { DELETE FROM t1 } 99*f05ac112Sdan sqlite3changeset_apply db $::cs {} [list filter t2] 100*f05ac112Sdan execsql { 101*f05ac112Sdan SELECT * FROM t1; 102*f05ac112Sdan SELECT * FROM t2; 103*f05ac112Sdan } 104*f05ac112Sdan} {x y} 1057531a5a3Sdan 1067531a5a3Sdanfinish_test 107