1*6c39e6a8Sdan# 2015 June 02 2*6c39e6a8Sdan# 3*6c39e6a8Sdan# The author disclaims copyright to this source code. In place of 4*6c39e6a8Sdan# a legal notice, here is a blessing: 5*6c39e6a8Sdan# 6*6c39e6a8Sdan# May you do good and not evil. 7*6c39e6a8Sdan# May you find forgiveness for yourself and forgive others. 8*6c39e6a8Sdan# May you share freely, never taking more than you give. 9*6c39e6a8Sdan# 10*6c39e6a8Sdan#*********************************************************************** 11*6c39e6a8Sdan# 12*6c39e6a8Sdan# This file implements regression tests for the sessions module. 13*6c39e6a8Sdan# Specifically, it tests that tables appear in the correct order 14*6c39e6a8Sdan# within changesets and patchsets. 15*6c39e6a8Sdan# 16*6c39e6a8Sdan 17*6c39e6a8Sdan 18*6c39e6a8Sdan 19*6c39e6a8Sdanif {![info exists testdir]} { 20*6c39e6a8Sdan set testdir [file join [file dirname [info script]] .. .. test] 21*6c39e6a8Sdan} 22*6c39e6a8Sdansource [file join [file dirname [info script]] session_common.tcl] 23*6c39e6a8Sdansource $testdir/tester.tcl 24*6c39e6a8Sdanifcapable !session {finish_test; return} 25*6c39e6a8Sdanset testprefix sessionF 26*6c39e6a8Sdan 27*6c39e6a8Sdan# 28*6c39e6a8Sdan# Test plan: 29*6c39e6a8Sdan# 30*6c39e6a8Sdan# 1.*: Test that sqlite3session_changeset() and sqlite3session_patchset() 31*6c39e6a8Sdan# output tables in the right order. 32*6c39e6a8Sdan# 33*6c39e6a8Sdan# 2.*: Test that sqlite3session_invert() does not modify the order of 34*6c39e6a8Sdan# tables within a changeset. 35*6c39e6a8Sdan# 36*6c39e6a8Sdan# 3.*: Test that sqlite3session_concat outputs tables in the right order. 37*6c39e6a8Sdan# 38*6c39e6a8Sdan 39*6c39e6a8Sdan# Create a db schema to use. 40*6c39e6a8Sdan# 41*6c39e6a8Sdando_execsql_test 1.0 { 42*6c39e6a8Sdan CREATE TABLE t3(e PRIMARY KEY, f); 43*6c39e6a8Sdan CREATE TABLE t1(a PRIMARY KEY, b); 44*6c39e6a8Sdan CREATE TABLE t2(c PRIMARY KEY, d); 45*6c39e6a8Sdan} 46*6c39e6a8Sdan 47*6c39e6a8Sdan#----------------------------------------------------------------------- 48*6c39e6a8Sdan# 1.* - changeset() and patchset(). 49*6c39e6a8Sdan# 50*6c39e6a8Sdan 51*6c39e6a8Sdanforeach {tn setup result} { 52*6c39e6a8Sdan 1 { 53*6c39e6a8Sdan S attach * 54*6c39e6a8Sdan } { 55*6c39e6a8Sdan {INSERT t2 0 X. {} {i 2 t two}} 56*6c39e6a8Sdan {INSERT t1 0 X. {} {i 1 t one}} 57*6c39e6a8Sdan {INSERT t3 0 X. {} {i 3 t three}} 58*6c39e6a8Sdan } 59*6c39e6a8Sdan 60*6c39e6a8Sdan 2 { 61*6c39e6a8Sdan S attach t1 62*6c39e6a8Sdan S attach * 63*6c39e6a8Sdan } { 64*6c39e6a8Sdan {INSERT t1 0 X. {} {i 1 t one}} 65*6c39e6a8Sdan {INSERT t2 0 X. {} {i 2 t two}} 66*6c39e6a8Sdan {INSERT t3 0 X. {} {i 3 t three}} 67*6c39e6a8Sdan } 68*6c39e6a8Sdan 69*6c39e6a8Sdan 3 { 70*6c39e6a8Sdan S attach t3 71*6c39e6a8Sdan S attach t2 72*6c39e6a8Sdan S attach t1 73*6c39e6a8Sdan } { 74*6c39e6a8Sdan {INSERT t3 0 X. {} {i 3 t three}} 75*6c39e6a8Sdan {INSERT t2 0 X. {} {i 2 t two}} 76*6c39e6a8Sdan {INSERT t1 0 X. {} {i 1 t one}} 77*6c39e6a8Sdan } 78*6c39e6a8Sdan} { 79*6c39e6a8Sdan execsql { 80*6c39e6a8Sdan DELETE FROM t1; 81*6c39e6a8Sdan DELETE FROM t2; 82*6c39e6a8Sdan DELETE FROM t3; 83*6c39e6a8Sdan } 84*6c39e6a8Sdan sqlite3session S db main 85*6c39e6a8Sdan eval $setup 86*6c39e6a8Sdan 87*6c39e6a8Sdan do_execsql_test 1.$tn.1 { 88*6c39e6a8Sdan INSERT INTO t2 VALUES(2, 'two'); 89*6c39e6a8Sdan INSERT INTO t1 VALUES(1, 'one'); 90*6c39e6a8Sdan INSERT INTO t3 VALUES(3, 'three'); 91*6c39e6a8Sdan } 92*6c39e6a8Sdan 93*6c39e6a8Sdan do_changeset_test 1.1.$tn.2 S $result 94*6c39e6a8Sdan do_patchset_test 1.1.$tn.3 S $result 95*6c39e6a8Sdan 96*6c39e6a8Sdan S delete 97*6c39e6a8Sdan} 98*6c39e6a8Sdan 99*6c39e6a8Sdanforeach {tn setup result} { 100*6c39e6a8Sdan 1 { 101*6c39e6a8Sdan S attach * 102*6c39e6a8Sdan } { 103*6c39e6a8Sdan {INSERT t2 0 X. {} {i 4 t four}} 104*6c39e6a8Sdan {INSERT t2 0 X. {} {i 5 t five}} 105*6c39e6a8Sdan {INSERT t1 0 X. {} {i 1 t one}} 106*6c39e6a8Sdan {INSERT t3 0 X. {} {i 6 t six}} 107*6c39e6a8Sdan } 108*6c39e6a8Sdan 109*6c39e6a8Sdan 2 { 110*6c39e6a8Sdan S attach t1 111*6c39e6a8Sdan S attach * 112*6c39e6a8Sdan } { 113*6c39e6a8Sdan {INSERT t1 0 X. {} {i 1 t one}} 114*6c39e6a8Sdan {INSERT t2 0 X. {} {i 4 t four}} 115*6c39e6a8Sdan {INSERT t2 0 X. {} {i 5 t five}} 116*6c39e6a8Sdan {INSERT t3 0 X. {} {i 6 t six}} 117*6c39e6a8Sdan } 118*6c39e6a8Sdan 119*6c39e6a8Sdan 3 { 120*6c39e6a8Sdan S attach t3 121*6c39e6a8Sdan S attach t2 122*6c39e6a8Sdan S attach t1 123*6c39e6a8Sdan } { 124*6c39e6a8Sdan {INSERT t3 0 X. {} {i 6 t six}} 125*6c39e6a8Sdan {INSERT t2 0 X. {} {i 4 t four}} 126*6c39e6a8Sdan {INSERT t2 0 X. {} {i 5 t five}} 127*6c39e6a8Sdan {INSERT t1 0 X. {} {i 1 t one}} 128*6c39e6a8Sdan } 129*6c39e6a8Sdan} { 130*6c39e6a8Sdan execsql { 131*6c39e6a8Sdan DELETE FROM t1; 132*6c39e6a8Sdan DELETE FROM t2; 133*6c39e6a8Sdan DELETE FROM t3; 134*6c39e6a8Sdan } 135*6c39e6a8Sdan sqlite3session S db main 136*6c39e6a8Sdan eval $setup 137*6c39e6a8Sdan 138*6c39e6a8Sdan do_execsql_test 1.$tn.1 { 139*6c39e6a8Sdan INSERT INTO t2 VALUES(2, 'two'); 140*6c39e6a8Sdan INSERT INTO t1 VALUES(1, 'one'); 141*6c39e6a8Sdan DELETE FROM t2; 142*6c39e6a8Sdan INSERT INTO t2 VALUES(4, 'four'); 143*6c39e6a8Sdan INSERT INTO t2 VALUES(5, 'five'); 144*6c39e6a8Sdan INSERT INTO t3 VALUES(6, 'six'); 145*6c39e6a8Sdan } 146*6c39e6a8Sdan 147*6c39e6a8Sdan do_changeset_test 1.2.$tn.2 S $result 148*6c39e6a8Sdan do_patchset_test 1.2.$tn.2 S $result 149*6c39e6a8Sdan 150*6c39e6a8Sdan S delete 151*6c39e6a8Sdan} 152*6c39e6a8Sdan 153*6c39e6a8Sdan#------------------------------------------------------------------------- 154*6c39e6a8Sdan# 2.* - invert() 155*6c39e6a8Sdan# 156*6c39e6a8Sdan 157*6c39e6a8Sdanforeach {tn setup result} { 158*6c39e6a8Sdan 1 { 159*6c39e6a8Sdan S attach * 160*6c39e6a8Sdan } { 161*6c39e6a8Sdan {DELETE t2 0 X. {i 4 t four} {}} 162*6c39e6a8Sdan {DELETE t2 0 X. {i 5 t five} {}} 163*6c39e6a8Sdan {DELETE t1 0 X. {i 1 t one} {}} 164*6c39e6a8Sdan {DELETE t3 0 X. {i 6 t six} {}} 165*6c39e6a8Sdan } 166*6c39e6a8Sdan 167*6c39e6a8Sdan 2 { 168*6c39e6a8Sdan S attach t1 169*6c39e6a8Sdan S attach * 170*6c39e6a8Sdan } { 171*6c39e6a8Sdan {DELETE t1 0 X. {i 1 t one} {}} 172*6c39e6a8Sdan {DELETE t2 0 X. {i 4 t four} {}} 173*6c39e6a8Sdan {DELETE t2 0 X. {i 5 t five} {}} 174*6c39e6a8Sdan {DELETE t3 0 X. {i 6 t six} {}} 175*6c39e6a8Sdan } 176*6c39e6a8Sdan 177*6c39e6a8Sdan 3 { 178*6c39e6a8Sdan S attach t3 179*6c39e6a8Sdan S attach t2 180*6c39e6a8Sdan S attach t1 181*6c39e6a8Sdan } { 182*6c39e6a8Sdan {DELETE t3 0 X. {i 6 t six} {}} 183*6c39e6a8Sdan {DELETE t2 0 X. {i 4 t four} {}} 184*6c39e6a8Sdan {DELETE t2 0 X. {i 5 t five} {}} 185*6c39e6a8Sdan {DELETE t1 0 X. {i 1 t one} {}} 186*6c39e6a8Sdan } 187*6c39e6a8Sdan} { 188*6c39e6a8Sdan execsql { 189*6c39e6a8Sdan DELETE FROM t1; 190*6c39e6a8Sdan DELETE FROM t2; 191*6c39e6a8Sdan DELETE FROM t3; 192*6c39e6a8Sdan } 193*6c39e6a8Sdan sqlite3session S db main 194*6c39e6a8Sdan eval $setup 195*6c39e6a8Sdan 196*6c39e6a8Sdan do_execsql_test 1.$tn.1 { 197*6c39e6a8Sdan INSERT INTO t2 VALUES(2, 'two'); 198*6c39e6a8Sdan INSERT INTO t1 VALUES(1, 'one'); 199*6c39e6a8Sdan DELETE FROM t2; 200*6c39e6a8Sdan INSERT INTO t2 VALUES(4, 'four'); 201*6c39e6a8Sdan INSERT INTO t2 VALUES(5, 'five'); 202*6c39e6a8Sdan INSERT INTO t3 VALUES(6, 'six'); 203*6c39e6a8Sdan } 204*6c39e6a8Sdan 205*6c39e6a8Sdan do_changeset_invert_test 2.$tn.2 S $result 206*6c39e6a8Sdan 207*6c39e6a8Sdan S delete 208*6c39e6a8Sdan} 209*6c39e6a8Sdan 210*6c39e6a8Sdan#------------------------------------------------------------------------- 211*6c39e6a8Sdan# 3.* - concat() 212*6c39e6a8Sdan# 213*6c39e6a8Sdanforeach {tn setup1 sql1 setup2 sql2 result} { 214*6c39e6a8Sdan 1 { 215*6c39e6a8Sdan S attach * 216*6c39e6a8Sdan } { 217*6c39e6a8Sdan INSERT INTO t1 VALUES(1, 'one'); 218*6c39e6a8Sdan INSERT INTO t2 VALUES(2, 'two'); 219*6c39e6a8Sdan } { 220*6c39e6a8Sdan S attach t2 221*6c39e6a8Sdan S attach t1 222*6c39e6a8Sdan } { 223*6c39e6a8Sdan INSERT INTO t1 VALUES(3, 'three'); 224*6c39e6a8Sdan INSERT INTO t2 VALUES(4, 'four'); 225*6c39e6a8Sdan } { 226*6c39e6a8Sdan {INSERT t1 0 X. {} {i 1 t one}} 227*6c39e6a8Sdan {INSERT t1 0 X. {} {i 3 t three}} 228*6c39e6a8Sdan {INSERT t2 0 X. {} {i 2 t two}} 229*6c39e6a8Sdan {INSERT t2 0 X. {} {i 4 t four}} 230*6c39e6a8Sdan } 231*6c39e6a8Sdan 232*6c39e6a8Sdan 1 { 233*6c39e6a8Sdan S attach t2 234*6c39e6a8Sdan S attach t1 235*6c39e6a8Sdan } { 236*6c39e6a8Sdan INSERT INTO t1 VALUES(1, 'one'); 237*6c39e6a8Sdan INSERT INTO t2 VALUES(2, 'two'); 238*6c39e6a8Sdan } { 239*6c39e6a8Sdan S attach * 240*6c39e6a8Sdan } { 241*6c39e6a8Sdan INSERT INTO t1 VALUES(3, 'three'); 242*6c39e6a8Sdan INSERT INTO t2 VALUES(4, 'four'); 243*6c39e6a8Sdan } { 244*6c39e6a8Sdan {INSERT t2 0 X. {} {i 2 t two}} 245*6c39e6a8Sdan {INSERT t2 0 X. {} {i 4 t four}} 246*6c39e6a8Sdan {INSERT t1 0 X. {} {i 1 t one}} 247*6c39e6a8Sdan {INSERT t1 0 X. {} {i 3 t three}} 248*6c39e6a8Sdan } 249*6c39e6a8Sdan 250*6c39e6a8Sdan 1 { 251*6c39e6a8Sdan S attach * 252*6c39e6a8Sdan } { 253*6c39e6a8Sdan INSERT INTO t2 VALUES(2, 'two'); 254*6c39e6a8Sdan } { 255*6c39e6a8Sdan S attach * 256*6c39e6a8Sdan } { 257*6c39e6a8Sdan INSERT INTO t1 VALUES(3, 'three'); 258*6c39e6a8Sdan INSERT INTO t2 VALUES(4, 'four'); 259*6c39e6a8Sdan INSERT INTO t3 VALUES(5, 'five'); 260*6c39e6a8Sdan } { 261*6c39e6a8Sdan {INSERT t2 0 X. {} {i 2 t two}} 262*6c39e6a8Sdan {INSERT t2 0 X. {} {i 4 t four}} 263*6c39e6a8Sdan {INSERT t1 0 X. {} {i 3 t three}} 264*6c39e6a8Sdan {INSERT t3 0 X. {} {i 5 t five}} 265*6c39e6a8Sdan } 266*6c39e6a8Sdan 267*6c39e6a8Sdan} { 268*6c39e6a8Sdan execsql { 269*6c39e6a8Sdan DELETE FROM t1; 270*6c39e6a8Sdan DELETE FROM t2; 271*6c39e6a8Sdan DELETE FROM t3; 272*6c39e6a8Sdan } 273*6c39e6a8Sdan sqlite3session S db main 274*6c39e6a8Sdan eval $setup1 275*6c39e6a8Sdan execsql $sql1 276*6c39e6a8Sdan set c1 [S changeset] 277*6c39e6a8Sdan S delete 278*6c39e6a8Sdan 279*6c39e6a8Sdan sqlite3session S db main 280*6c39e6a8Sdan eval $setup2 281*6c39e6a8Sdan execsql $sql2 282*6c39e6a8Sdan set c2 [S changeset] 283*6c39e6a8Sdan S delete 284*6c39e6a8Sdan 285*6c39e6a8Sdan set res [list] 286*6c39e6a8Sdan sqlite3session_foreach x [sqlite3changeset_concat $c1 $c2] { 287*6c39e6a8Sdan lappend res $x 288*6c39e6a8Sdan } 289*6c39e6a8Sdan 290*6c39e6a8Sdan do_test 3.$tn { set res } [list {*}$result] 291*6c39e6a8Sdan} 292*6c39e6a8Sdan 293*6c39e6a8Sdan 294*6c39e6a8Sdanfinish_test 295