xref: /sqlite-3.40.0/ext/session/sessionA.test (revision f1a08ad8)
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