xref: /sqlite-3.40.0/ext/session/session1.test (revision 779e9906)
14565faa9Sdan# 2011 March 07
24565faa9Sdan#
34565faa9Sdan# The author disclaims copyright to this source code.  In place of
44565faa9Sdan# a legal notice, here is a blessing:
54565faa9Sdan#
64565faa9Sdan#    May you do good and not evil.
74565faa9Sdan#    May you find forgiveness for yourself and forgive others.
84565faa9Sdan#    May you share freely, never taking more than you give.
94565faa9Sdan#
104565faa9Sdan#***********************************************************************
114565faa9Sdan# This file implements regression tests for SQLite library.
124565faa9Sdan#
134565faa9Sdan
144565faa9Sdanif {![info exists testdir]} {
154565faa9Sdan  set testdir [file join [file dirname [info script]] .. .. test]
164565faa9Sdan}
174565faa9Sdansource [file join [file dirname [info script]] session_common.tcl]
184565faa9Sdansource $testdir/tester.tcl
199b1c62d4Sdrhifcapable !session {finish_test; return}
204565faa9Sdan
214565faa9Sdanset testprefix session1
224565faa9Sdan
23cb9a3643Sdan# Run all tests in this file twice. Once with "WITHOUT ROWID", and once
24cb9a3643Sdan# with regular rowid tables.
25cb9a3643Sdan#
26cb9a3643Sdanforeach {tn trailing} {
27cb9a3643Sdan  1 ""
28cb9a3643Sdan  2 " WITHOUT ROWID "
29cb9a3643Sdan} {
30cb9a3643Sdaneval [string map [list %WR% $trailing] {
31cb9a3643Sdan
32cb9a3643Sdandb close
33cb9a3643Sdanforcedelete test.db test.db2
34cb9a3643Sdanreset_db
35cb9a3643Sdan
36cb9a3643Sdando_execsql_test $tn.1.0 {
37cb9a3643Sdan  CREATE TABLE t1(x PRIMARY KEY, y) %WR%;
384565faa9Sdan  INSERT INTO t1 VALUES('abc', 'def');
394565faa9Sdan}
404565faa9Sdan
414565faa9Sdan#-------------------------------------------------------------------------
424565faa9Sdan# Test creating, attaching tables to and deleting session objects.
434565faa9Sdan#
44cb9a3643Sdando_test $tn.1.1 { sqlite3session S db main } {S}
45cb9a3643Sdando_test $tn.1.2 { S delete } {}
46cb9a3643Sdando_test $tn.1.3 { sqlite3session S db main } {S}
47cb9a3643Sdando_test $tn.1.4 { S attach t1 } {}
48cb9a3643Sdando_test $tn.1.5 { S delete } {}
49cb9a3643Sdando_test $tn.1.6 { sqlite3session S db main } {S}
50cb9a3643Sdando_test $tn.1.7 { S attach t1 ; S attach t2 ; S attach t3 } {}
51cb9a3643Sdando_test $tn.1.8 { S attach t1 ; S attach t2 ; S attach t3 } {}
52cb9a3643Sdando_test $tn.1.9 { S delete } {}
53cb9a3643Sdando_test $tn.1.10 {
544565faa9Sdan  sqlite3session S db main
554565faa9Sdan  S attach t1
564565faa9Sdan  execsql { INSERT INTO t1 VALUES('ghi', 'jkl') }
574565faa9Sdan} {}
58cb9a3643Sdando_test $tn.1.11 { S delete } {}
59cb9a3643Sdanif {$tn==1} {
60cb9a3643Sdan  do_test $tn.1.12 {
614565faa9Sdan    sqlite3session S db main
624565faa9Sdan    S attach t1
634565faa9Sdan    execsql { INSERT INTO t1 VALUES('mno', 'pqr') }
644565faa9Sdan    execsql { UPDATE t1 SET x = 111 WHERE rowid = 1 }
654565faa9Sdan    execsql { DELETE FROM t1 WHERE rowid = 2 }
664565faa9Sdan  } {}
67cb9a3643Sdan  do_test $tn.1.13 {
684565faa9Sdan    S changeset
694565faa9Sdan    S delete
704565faa9Sdan  } {}
71cb9a3643Sdan}
724565faa9Sdan
734565faa9Sdan#-------------------------------------------------------------------------
744565faa9Sdan# Simple changeset tests. Also test the sqlite3changeset_invert()
754565faa9Sdan# function.
764565faa9Sdan#
77cb9a3643Sdando_test $tn.2.1.1 {
784565faa9Sdan  execsql { DELETE FROM t1 }
794565faa9Sdan  sqlite3session S db main
804565faa9Sdan  S attach t1
814565faa9Sdan  execsql { INSERT INTO t1 VALUES(1, 'Sukhothai') }
824565faa9Sdan  execsql { INSERT INTO t1 VALUES(2, 'Ayutthaya') }
834565faa9Sdan  execsql { INSERT INTO t1 VALUES(3, 'Thonburi') }
844565faa9Sdan} {}
85cb9a3643Sdando_changeset_test $tn.2.1.2 S {
86244593c8Sdan  {INSERT t1 0 X. {} {i 1 t Sukhothai}}
87244593c8Sdan  {INSERT t1 0 X. {} {i 2 t Ayutthaya}}
88244593c8Sdan  {INSERT t1 0 X. {} {i 3 t Thonburi}}
894565faa9Sdan}
90cb9a3643Sdando_changeset_invert_test $tn.2.1.3 S {
91244593c8Sdan  {DELETE t1 0 X. {i 1 t Sukhothai} {}}
92244593c8Sdan  {DELETE t1 0 X. {i 2 t Ayutthaya} {}}
93244593c8Sdan  {DELETE t1 0 X. {i 3 t Thonburi} {}}
944565faa9Sdan}
95cb9a3643Sdando_test $tn.2.1.4 { S delete } {}
964565faa9Sdan
97cb9a3643Sdando_test $tn.2.2.1 {
984565faa9Sdan  sqlite3session S db main
994565faa9Sdan  S attach t1
1004565faa9Sdan  execsql { DELETE FROM t1 WHERE 1 }
1014565faa9Sdan} {}
102cb9a3643Sdando_changeset_test $tn.2.2.2 S {
103244593c8Sdan  {DELETE t1 0 X. {i 1 t Sukhothai} {}}
104244593c8Sdan  {DELETE t1 0 X. {i 2 t Ayutthaya} {}}
105244593c8Sdan  {DELETE t1 0 X. {i 3 t Thonburi} {}}
1064565faa9Sdan}
107cb9a3643Sdando_changeset_invert_test $tn.2.2.3 S {
108244593c8Sdan  {INSERT t1 0 X. {} {i 1 t Sukhothai}}
109244593c8Sdan  {INSERT t1 0 X. {} {i 2 t Ayutthaya}}
110244593c8Sdan  {INSERT t1 0 X. {} {i 3 t Thonburi}}
1114565faa9Sdan}
112cb9a3643Sdando_test $tn.2.2.4 { S delete } {}
1134565faa9Sdan
114cb9a3643Sdando_test $tn.2.3.1 {
1154565faa9Sdan  execsql { DELETE FROM t1 }
1164565faa9Sdan  sqlite3session S db main
1174565faa9Sdan  execsql { INSERT INTO t1 VALUES(1, 'Sukhothai') }
1184565faa9Sdan  execsql { INSERT INTO t1 VALUES(2, 'Ayutthaya') }
1194565faa9Sdan  execsql { INSERT INTO t1 VALUES(3, 'Thonburi') }
1204565faa9Sdan  S attach t1
1214565faa9Sdan  execsql {
1224565faa9Sdan    UPDATE t1 SET x = 10 WHERE x = 1;
1234565faa9Sdan    UPDATE t1 SET y = 'Surin' WHERE x = 2;
1244565faa9Sdan    UPDATE t1 SET x = 20, y = 'Thapae' WHERE x = 3;
1254565faa9Sdan  }
1264565faa9Sdan} {}
1274565faa9Sdan
128cb9a3643Sdando_changeset_test $tn.2.3.2 S {
129244593c8Sdan  {INSERT t1 0 X. {} {i 10 t Sukhothai}}
130244593c8Sdan  {DELETE t1 0 X. {i 1 t Sukhothai} {}}
131244593c8Sdan  {UPDATE t1 0 X. {i 2 t Ayutthaya} {{} {} t Surin}}
132244593c8Sdan  {DELETE t1 0 X. {i 3 t Thonburi} {}}
133244593c8Sdan  {INSERT t1 0 X. {} {i 20 t Thapae}}
1344565faa9Sdan}
1354565faa9Sdan
136cb9a3643Sdando_changeset_invert_test $tn.2.3.3 S {
137244593c8Sdan  {DELETE t1 0 X. {i 10 t Sukhothai} {}}
138244593c8Sdan  {INSERT t1 0 X. {} {i 1 t Sukhothai}}
139cfec7eeeSdan  {UPDATE t1 0 X. {i 2 t Surin} {{} {} t Ayutthaya}}
140244593c8Sdan  {INSERT t1 0 X. {} {i 3 t Thonburi}}
141244593c8Sdan  {DELETE t1 0 X. {i 20 t Thapae} {}}
1424565faa9Sdan}
143cb9a3643Sdando_test $tn.2.3.4 { S delete } {}
1444565faa9Sdan
145cb9a3643Sdando_test $tn.2.4.1 {
1464565faa9Sdan  sqlite3session S db main
1474565faa9Sdan  S attach t1
1484565faa9Sdan  execsql { INSERT INTO t1 VALUES(100, 'Bangkok') }
1494565faa9Sdan  execsql { DELETE FROM t1 WHERE x = 100 }
1504565faa9Sdan} {}
151cb9a3643Sdando_changeset_test $tn.2.4.2 S {}
152cb9a3643Sdando_changeset_invert_test $tn.2.4.3 S {}
153cb9a3643Sdando_test $tn.2.4.4 { S delete } {}
1544565faa9Sdan
155*779e9906Sdando_execsql_test $tn.2.5.0 {
156*779e9906Sdan  SELECT * FROM t1 ORDER BY x
157*779e9906Sdan} {
158*779e9906Sdan  2  Surin
159*779e9906Sdan  10 Sukhothai
160*779e9906Sdan  20 Thapae
161*779e9906Sdan}
162*779e9906Sdan
163*779e9906Sdando_test $tn.2.5.1 {
164*779e9906Sdan  sqlite3session S db main
165*779e9906Sdan  S attach t1
166*779e9906Sdan  execsql { DELETE FROM t1 }
167*779e9906Sdan} {}
168*779e9906Sdando_changeset_test $tn.2.5.2 S {
169*779e9906Sdan  {DELETE t1 0 X. {i 10 t Sukhothai} {}}
170*779e9906Sdan  {DELETE t1 0 X. {i 2 t Surin} {}}
171*779e9906Sdan  {DELETE t1 0 X. {i 20 t Thapae} {}}
172*779e9906Sdan}
173*779e9906Sdando_test $tn.2.5.3 { S delete } {}
174*779e9906Sdan
1754565faa9Sdan#-------------------------------------------------------------------------
1764565faa9Sdan# Test the application of simple changesets. These tests also test that
1774565faa9Sdan# the conflict callback is invoked correctly. For these tests, the
1784565faa9Sdan# conflict callback always returns OMIT.
1794565faa9Sdan#
1804565faa9Sdandb close
1814565faa9Sdanforcedelete test.db test.db2
1824565faa9Sdansqlite3 db test.db
1834565faa9Sdansqlite3 db2 test.db2
1844565faa9Sdan
1854565faa9Sdanproc xConflict {args} {
1864565faa9Sdan  lappend ::xConflict $args
1874565faa9Sdan  return ""
1884565faa9Sdan}
1894565faa9Sdan
1904565faa9Sdanproc bgerror {args} { set ::background_error $args }
1914565faa9Sdan
1924565faa9Sdanproc do_conflict_test {tn args} {
1934565faa9Sdan  set O(-tables)    [list]
1944565faa9Sdan  set O(-sql)       [list]
1954565faa9Sdan  set O(-conflicts) [list]
1964565faa9Sdan
1974565faa9Sdan  array set V $args
1984565faa9Sdan  foreach key [array names V] {
1994565faa9Sdan    if {![info exists O($key)]} {error "no such option: $key"}
2004565faa9Sdan  }
2014565faa9Sdan  array set O $args
2024565faa9Sdan
2034565faa9Sdan  sqlite3session S db main
2044565faa9Sdan  foreach t $O(-tables) { S attach $t }
2054565faa9Sdan  execsql $O(-sql)
2064565faa9Sdan  set ::xConflict [list]
2074565faa9Sdan  sqlite3changeset_apply db2 [S changeset] xConflict
2084565faa9Sdan
2094565faa9Sdan  set conflicts [list]
2104565faa9Sdan  foreach c $O(-conflicts) {
2114565faa9Sdan    lappend conflicts $c
2124565faa9Sdan  }
2134565faa9Sdan
2144565faa9Sdan  after 1 {set go 1}
2154565faa9Sdan  vwait go
2164565faa9Sdan
2174565faa9Sdan  uplevel do_test $tn [list { set ::xConflict }] [list $conflicts]
2184565faa9Sdan  S delete
2194565faa9Sdan}
2204565faa9Sdan
2214565faa9Sdanproc do_db2_test {testname sql {result {}}} {
2224565faa9Sdan  uplevel do_test $testname [list "execsql {$sql} db2"] [list [list {*}$result]]
2234565faa9Sdan}
2244565faa9Sdan
2254565faa9Sdan# Test INSERT changesets.
2264565faa9Sdan#
227cb9a3643Sdando_test $tn.3.1.0 {
228cb9a3643Sdan  execsql { CREATE TABLE t1(a PRIMARY KEY, b NOT NULL) %WR% } db2
2294565faa9Sdan  execsql {
230cb9a3643Sdan    CREATE TABLE t1(a PRIMARY KEY, b) %WR%;
2314565faa9Sdan    INSERT INTO t1 VALUES(1, 'one');
2324565faa9Sdan    INSERT INTO t1 VALUES(2, 'two');
2334565faa9Sdan  } db
2344565faa9Sdan} {}
235cb9a3643Sdando_db2_test $tn.3.1.1 "INSERT INTO t1 VALUES(6, 'VI')"
236cb9a3643Sdando_conflict_test $tn.3.1.2 -tables t1 -sql {
2374565faa9Sdan  INSERT INTO t1 VALUES(3, 'three');
2384565faa9Sdan  INSERT INTO t1 VALUES(4, 'four');
2394565faa9Sdan  INSERT INTO t1 VALUES(5, 'five');
2404565faa9Sdan  INSERT INTO t1 VALUES(6, 'six');
2414565faa9Sdan  INSERT INTO t1 VALUES(7, 'seven');
2424565faa9Sdan  INSERT INTO t1 VALUES(8, NULL);
2434565faa9Sdan} -conflicts {
2444565faa9Sdan  {INSERT t1 CONFLICT {i 6 t six} {i 6 t VI}}
245d9151526Sdan  {INSERT t1 CONSTRAINT {i 8 n {}}}
2464565faa9Sdan}
2474565faa9Sdan
248cb9a3643Sdando_db2_test $tn.3.1.3 "SELECT * FROM t1 ORDER BY a" {
249cb9a3643Sdan  3 three 4 four 5 five 6 VI 7 seven
2504565faa9Sdan}
251cb9a3643Sdando_execsql_test $tn.3.1.4 "SELECT * FROM t1" {
2524565faa9Sdan  1 one 2 two 3 three 4 four 5 five 6 six 7 seven 8 {}
2534565faa9Sdan}
2544565faa9Sdan
2554565faa9Sdan# Test DELETE changesets.
2564565faa9Sdan#
257cb9a3643Sdando_execsql_test $tn.3.2.1 {
2584565faa9Sdan  PRAGMA foreign_keys = on;
259cb9a3643Sdan  CREATE TABLE t2(a PRIMARY KEY, b)%WR%;
2604565faa9Sdan  CREATE TABLE t3(c, d REFERENCES t2);
2614565faa9Sdan  INSERT INTO t2 VALUES(1, 'one');
2624565faa9Sdan  INSERT INTO t2 VALUES(2, 'two');
2634565faa9Sdan  INSERT INTO t2 VALUES(3, 'three');
2644565faa9Sdan  INSERT INTO t2 VALUES(4, 'four');
2654565faa9Sdan}
266cb9a3643Sdando_db2_test $tn.3.2.2 {
2674565faa9Sdan  PRAGMA foreign_keys = on;
268cb9a3643Sdan  CREATE TABLE t2(a PRIMARY KEY, b)%WR%;
2694565faa9Sdan  CREATE TABLE t3(c, d REFERENCES t2);
2704565faa9Sdan  INSERT INTO t2 VALUES(1, 'one');
2714565faa9Sdan  INSERT INTO t2 VALUES(2, 'two');
2724565faa9Sdan  INSERT INTO t2 VALUES(4, 'five');
2734565faa9Sdan  INSERT INTO t3 VALUES('i', 1);
2744565faa9Sdan}
275cb9a3643Sdando_conflict_test $tn.3.2.3 -tables t2 -sql {
2764565faa9Sdan  DELETE FROM t2 WHERE a = 1;
2774565faa9Sdan  DELETE FROM t2 WHERE a = 2;
2784565faa9Sdan  DELETE FROM t2 WHERE a = 3;
2794565faa9Sdan  DELETE FROM t2 WHERE a = 4;
2804565faa9Sdan} -conflicts {
2814565faa9Sdan  {DELETE t2 NOTFOUND {i 3 t three}}
2824565faa9Sdan  {DELETE t2 DATA {i 4 t four} {i 4 t five}}
283cb3e4b79Sdan  {FOREIGN_KEY 1}
2844565faa9Sdan}
285cb9a3643Sdando_execsql_test $tn.3.2.4 "SELECT * FROM t2" {}
286cb9a3643Sdando_db2_test $tn.3.2.5 "SELECT * FROM t2" {4 five}
2874565faa9Sdan
2884565faa9Sdan# Test UPDATE changesets.
2894565faa9Sdan#
290cb9a3643Sdando_execsql_test $tn.3.3.1 {
291cb9a3643Sdan  CREATE TABLE t4(a, b, c, PRIMARY KEY(b, c))%WR%;
2924565faa9Sdan  INSERT INTO t4 VALUES(1, 2, 3);
2934565faa9Sdan  INSERT INTO t4 VALUES(4, 5, 6);
2944565faa9Sdan  INSERT INTO t4 VALUES(7, 8, 9);
2954565faa9Sdan  INSERT INTO t4 VALUES(10, 11, 12);
2964565faa9Sdan}
297cb9a3643Sdando_db2_test $tn.3.3.2 {
298cb9a3643Sdan  CREATE TABLE t4(a NOT NULL, b, c, PRIMARY KEY(b, c))%WR%;
2994565faa9Sdan  INSERT INTO t4 VALUES(0, 2, 3);
3004565faa9Sdan  INSERT INTO t4 VALUES(4, 5, 7);
3014565faa9Sdan  INSERT INTO t4 VALUES(7, 8, 9);
3024565faa9Sdan  INSERT INTO t4 VALUES(10, 11, 12);
3034565faa9Sdan}
304cb9a3643Sdando_conflict_test $tn.3.3.3 -tables t4 -sql {
3054565faa9Sdan  UPDATE t4 SET a = -1 WHERE b = 2;
3064565faa9Sdan  UPDATE t4 SET a = -1 WHERE b = 5;
3074565faa9Sdan  UPDATE t4 SET a = NULL WHERE c = 9;
3084565faa9Sdan  UPDATE t4 SET a = 'x' WHERE b = 11;
3094565faa9Sdan} -conflicts {
3104565faa9Sdan  {UPDATE t4 DATA {i 1 i 2 i 3} {i -1 {} {} {} {}} {i 0 i 2 i 3}}
3114565faa9Sdan  {UPDATE t4 NOTFOUND {i 4 i 5 i 6} {i -1 {} {} {} {}}}
312d9151526Sdan  {UPDATE t4 CONSTRAINT {i 7 i 8 i 9} {n {} {} {} {} {}}}
3134565faa9Sdan}
314cb9a3643Sdando_db2_test $tn.3.3.4 { SELECT * FROM t4 } {0 2 3 4 5 7 7 8 9 x 11 12}
315cb9a3643Sdando_execsql_test $tn.3.3.5 { SELECT * FROM t4 } {-1 2 3 -1 5 6 {} 8 9 x 11 12}
3164565faa9Sdan
3174565faa9Sdan#-------------------------------------------------------------------------
3184565faa9Sdan# This next block of tests verifies that values returned by the conflict
3194565faa9Sdan# handler are intepreted correctly.
3204565faa9Sdan#
3214565faa9Sdan
3224565faa9Sdanproc test_reset {} {
3234565faa9Sdan  db close
3244565faa9Sdan  db2 close
3254565faa9Sdan  forcedelete test.db test.db2
3264565faa9Sdan  sqlite3 db test.db
3274565faa9Sdan  sqlite3 db2 test.db2
3284565faa9Sdan}
3294565faa9Sdan
3304565faa9Sdanproc xConflict {args} {
3314565faa9Sdan  lappend ::xConflict $args
3324565faa9Sdan  return $::conflict_return
3334565faa9Sdan}
3344565faa9Sdan
335cb9a3643Sdanforeach {tn2 conflict_return after} {
3364565faa9Sdan  1 OMIT      {1 2 value1   4 5 7       10 x x}
3374565faa9Sdan  2 REPLACE   {1 2 value1   4 5 value2  10 8 9}
3384565faa9Sdan} {
3394565faa9Sdan  test_reset
3404565faa9Sdan
341cb9a3643Sdan  do_test $tn.4.$tn2.1 {
3424565faa9Sdan    foreach db {db db2} {
3434565faa9Sdan      execsql {
344cb9a3643Sdan        CREATE TABLE t1(a, b, c, PRIMARY KEY(a))%WR%;
3454565faa9Sdan        INSERT INTO t1 VALUES(1, 2, 3);
3464565faa9Sdan        INSERT INTO t1 VALUES(4, 5, 6);
3474565faa9Sdan        INSERT INTO t1 VALUES(7, 8, 9);
3484565faa9Sdan      } $db
3494565faa9Sdan    }
3504565faa9Sdan    execsql {
3514565faa9Sdan      REPLACE INTO t1 VALUES(4, 5, 7);
3524565faa9Sdan      REPLACE INTO t1 VALUES(10, 'x', 'x');
3534565faa9Sdan    } db2
3544565faa9Sdan  } {}
3554565faa9Sdan
356cb9a3643Sdan  do_conflict_test $tn.4.$tn2.2 -tables t1 -sql {
3574565faa9Sdan    UPDATE t1 SET c = 'value1' WHERE a = 1;       -- no conflict
3584565faa9Sdan    UPDATE t1 SET c = 'value2' WHERE a = 4;       -- DATA conflict
3594565faa9Sdan    UPDATE t1 SET a = 10 WHERE a = 7;             -- CONFLICT conflict
3604565faa9Sdan  } -conflicts {
3614565faa9Sdan    {INSERT t1 CONFLICT {i 10 i 8 i 9} {i 10 t x t x}}
3624565faa9Sdan    {UPDATE t1 DATA {i 4 {} {} i 6} {{} {} {} {} t value2} {i 4 i 5 i 7}}
3634565faa9Sdan  }
3644565faa9Sdan
365cb9a3643Sdan  do_db2_test $tn.4.$tn2.3 "SELECT * FROM t1 ORDER BY a" $after
3664565faa9Sdan}
3674565faa9Sdan
368cb9a3643Sdanforeach {tn2 conflict_return} {
3694565faa9Sdan  1 OMIT
3704565faa9Sdan  2 REPLACE
3714565faa9Sdan} {
3724565faa9Sdan  test_reset
3734565faa9Sdan
374cb9a3643Sdan  do_test $tn.5.$tn2.1 {
3754565faa9Sdan    # Create an identical schema in both databases.
3764565faa9Sdan    set schema {
377cb9a3643Sdan      CREATE TABLE "'foolish name'"(x, y, z, PRIMARY KEY(x, y))%WR%;
3784565faa9Sdan    }
3794565faa9Sdan    execsql $schema db
3804565faa9Sdan    execsql $schema db2
3814565faa9Sdan
3824565faa9Sdan    # Add some rows to [db2]. These rows will cause conflicts later
3834565faa9Sdan    # on when the changeset from [db] is applied to it.
3844565faa9Sdan    execsql {
3854565faa9Sdan      INSERT INTO "'foolish name'" VALUES('one', 'one', 'ii');
3864565faa9Sdan      INSERT INTO "'foolish name'" VALUES('one', 'two', 'i');
3874565faa9Sdan      INSERT INTO "'foolish name'" VALUES('two', 'two', 'ii');
3884565faa9Sdan    } db2
3894565faa9Sdan
3904565faa9Sdan  } {}
3914565faa9Sdan
392cb9a3643Sdan  do_conflict_test $tn.5.$tn2.2 -tables {{'foolish name'}} -sql {
3934565faa9Sdan    INSERT INTO "'foolish name'" VALUES('one', 'two', 2);
3944565faa9Sdan  } -conflicts {
3954565faa9Sdan    {INSERT {'foolish name'} CONFLICT {t one t two i 2} {t one t two t i}}
3964565faa9Sdan  }
3974565faa9Sdan
3984565faa9Sdan  set res(REPLACE) {one one ii one two 2 two two ii}
3994565faa9Sdan  set res(OMIT)    {one one ii one two i two two ii}
400cb9a3643Sdan  do_db2_test $tn.5.$tn2.3 {
4014565faa9Sdan    SELECT * FROM "'foolish name'" ORDER BY x, y
4024565faa9Sdan  } $res($conflict_return)
4034565faa9Sdan
4044565faa9Sdan
405cb9a3643Sdan  do_test $tn.5.$tn2.1 {
4064565faa9Sdan    set schema {
407cb9a3643Sdan      CREATE TABLE d1("z""z" PRIMARY KEY, y)%WR%;
4084565faa9Sdan      INSERT INTO d1 VALUES(1, 'one');
4094565faa9Sdan      INSERT INTO d1 VALUES(2, 'two');
4104565faa9Sdan    }
4114565faa9Sdan    execsql $schema db
4124565faa9Sdan    execsql $schema db2
4134565faa9Sdan
4144565faa9Sdan    execsql {
4154565faa9Sdan      UPDATE d1 SET y = 'TWO' WHERE "z""z" = 2;
4164565faa9Sdan    } db2
4174565faa9Sdan
4184565faa9Sdan  } {}
4194565faa9Sdan
420cb9a3643Sdan  do_conflict_test $tn.5.$tn2.2 -tables d1 -sql {
4214565faa9Sdan    DELETE FROM d1 WHERE "z""z" = 2;
4224565faa9Sdan  } -conflicts {
4234565faa9Sdan    {DELETE d1 DATA {i 2 t two} {i 2 t TWO}}
4244565faa9Sdan  }
4254565faa9Sdan
4264565faa9Sdan  set res(REPLACE) {1 one}
4274565faa9Sdan  set res(OMIT)    {1 one 2 TWO}
428cb9a3643Sdan  do_db2_test $tn.5.$tn2.3 "SELECT * FROM d1" $res($conflict_return)
4294565faa9Sdan}
4304565faa9Sdan
4314565faa9Sdan#-------------------------------------------------------------------------
4324565faa9Sdan# Test that two tables can be monitored by a single session object.
4334565faa9Sdan#
4344565faa9Sdantest_reset
4354565faa9Sdanset schema {
436cb9a3643Sdan  CREATE TABLE t1(a COLLATE nocase PRIMARY KEY, b)%WR%;
437cb9a3643Sdan  CREATE TABLE t2(a, b PRIMARY KEY)%WR%;
4384565faa9Sdan}
439cb9a3643Sdando_test $tn.6.0 {
4404565faa9Sdan  execsql $schema db
4414565faa9Sdan  execsql $schema db2
4424565faa9Sdan  execsql {
4434565faa9Sdan    INSERT INTO t1 VALUES('a', 'b');
4444565faa9Sdan    INSERT INTO t2 VALUES('a', 'b');
4454565faa9Sdan  } db2
4464565faa9Sdan} {}
4474565faa9Sdan
4484565faa9Sdanset conflict_return ""
449cb9a3643Sdando_conflict_test $tn.6.1 -tables {t1 t2} -sql {
4504565faa9Sdan  INSERT INTO t1 VALUES('1', '2');
4514565faa9Sdan  INSERT INTO t1 VALUES('A', 'B');
4524565faa9Sdan  INSERT INTO t2 VALUES('A', 'B');
4534565faa9Sdan} -conflicts {
4544565faa9Sdan  {INSERT t1 CONFLICT {t A t B} {t a t b}}
4554565faa9Sdan}
4564565faa9Sdan
457cb9a3643Sdando_db2_test $tn.6.2 "SELECT * FROM t1 ORDER BY a" {1 2 a b}
458cb9a3643Sdando_db2_test $tn.6.3 "SELECT * FROM t2 ORDER BY a" {A B a b}
4594565faa9Sdan
4606734007dSdan#-------------------------------------------------------------------------
4616734007dSdan# Test that session objects are not confused by changes to table in
4626734007dSdan# other databases.
4636734007dSdan#
4646734007dSdancatch { db2 close }
4656734007dSdandrop_all_tables
4666734007dSdanforcedelete test.db2
467cb9a3643Sdando_iterator_test $tn.7.1 * {
4686734007dSdan  ATTACH 'test.db2' AS aux;
469cb9a3643Sdan  CREATE TABLE main.t1(x PRIMARY KEY, y)%WR%;
470cb9a3643Sdan  CREATE TABLE aux.t1(x PRIMARY KEY, y)%WR%;
4716734007dSdan
4726734007dSdan  INSERT INTO main.t1 VALUES('one', 1);
4736734007dSdan  INSERT INTO main.t1 VALUES('two', 2);
4746734007dSdan  INSERT INTO aux.t1 VALUES('three', 3);
4756734007dSdan  INSERT INTO aux.t1 VALUES('four', 4);
4766734007dSdan} {
4776734007dSdan  {INSERT t1 0 X. {} {t two i 2}}
4786734007dSdan  {INSERT t1 0 X. {} {t one i 1}}
4796734007dSdan}
4806734007dSdan
481b69ec348Sdan#-------------------------------------------------------------------------
482b69ec348Sdan# Test the sqlite3session_isempty() function.
483b69ec348Sdan#
484cb9a3643Sdando_test $tn.8.1 {
485b69ec348Sdan  execsql {
486cb9a3643Sdan    CREATE TABLE t5(x PRIMARY KEY, y)%WR%;
487cb9a3643Sdan    CREATE TABLE t6(x PRIMARY KEY, y)%WR%;
488b69ec348Sdan    INSERT INTO t5 VALUES('a', 'b');
489b69ec348Sdan    INSERT INTO t6 VALUES('a', 'b');
490b69ec348Sdan  }
491b69ec348Sdan  sqlite3session S db main
492b69ec348Sdan  S attach *
493b69ec348Sdan
494b69ec348Sdan  S isempty
495ff530326Sdan} {1}
496cb9a3643Sdando_test $tn.8.2 {
497b69ec348Sdan  execsql { DELETE FROM t5 }
498b69ec348Sdan  S isempty
499ff530326Sdan} {0}
500cb9a3643Sdando_test $tn.8.3 {
501b69ec348Sdan  S delete
502b69ec348Sdan  sqlite3session S db main
503b69ec348Sdan  S attach t5
504b69ec348Sdan  execsql { DELETE FROM t5 }
505b69ec348Sdan  S isempty
506ff530326Sdan} {1}
507cb9a3643Sdando_test $tn.8.4 { S delete } {}
5086734007dSdan
509cb9a3643Sdando_test $tn.8.5 {
510082c96dfSdan  sqlite3session S db main
511082c96dfSdan  S attach t5
512082c96dfSdan  S attach t6
513082c96dfSdan  execsql { INSERT INTO t5 VALUES(1, 2) }
514082c96dfSdan  S isempty
515082c96dfSdan} {0}
516082c96dfSdan
517cb9a3643Sdando_test $tn.8.6 {
518082c96dfSdan  S delete
519082c96dfSdan  sqlite3session S db main
520082c96dfSdan  S attach t5
521082c96dfSdan  S attach t6
522082c96dfSdan  execsql { INSERT INTO t6 VALUES(1, 2) }
523082c96dfSdan  S isempty
524082c96dfSdan} {0}
525cb9a3643Sdando_test $tn.8.7 { S delete } {}
526082c96dfSdan
527cfec7eeeSdan#-------------------------------------------------------------------------
528cfec7eeeSdan#
529cb9a3643Sdando_execsql_test $tn.9.1 {
530cb9a3643Sdan  CREATE TABLE t7(a, b, c, d, e PRIMARY KEY, f, g)%WR%;
531cfec7eeeSdan  INSERT INTO t7 VALUES(1, 1, 1, 1, 1, 1, 1);
532cfec7eeeSdan}
533cb9a3643Sdando_test $tn.9.2 {
534cfec7eeeSdan  sqlite3session S db main
535cfec7eeeSdan  S attach *
536cfec7eeeSdan  execsql { UPDATE t7 SET b=2, d=2 }
537cfec7eeeSdan} {}
538cb9a3643Sdando_changeset_test $tn.9.2 S {{UPDATE t7 0 ....X.. {{} {} i 1 {} {} i 1 i 1 {} {} {} {}} {{} {} i 2 {} {} i 2 {} {} {} {} {} {}}}}
539cfec7eeeSdanS delete
5404565faa9Sdancatch { db2 close }
541e8fa8c96Sdan
542e8fa8c96Sdan#-------------------------------------------------------------------------
543e8fa8c96Sdan# Test a really long table name.
544e8fa8c96Sdan#
545e8fa8c96Sdanreset_db
546e8fa8c96Sdanset tblname [string repeat tblname123 100]
547cb9a3643Sdando_test $tn.10.1.1 {
548e8fa8c96Sdan  execsql "
549cb9a3643Sdan    CREATE TABLE $tblname (a PRIMARY KEY, b)%WR%;
550e8fa8c96Sdan    INSERT INTO $tblname VALUES('xyz', 'def');
551e8fa8c96Sdan  "
552e8fa8c96Sdan  sqlite3session S db main
553e8fa8c96Sdan  S attach $tblname
554e8fa8c96Sdan  execsql "
555e8fa8c96Sdan    INSERT INTO $tblname VALUES('uvw', 'abc');
556e8fa8c96Sdan    DELETE FROM $tblname WHERE a = 'xyz';
557e8fa8c96Sdan  "
558e8fa8c96Sdan} {}
559cb9a3643Sdando_changeset_test $tn.10.1.2 S "
560e8fa8c96Sdan  {INSERT $tblname 0 X. {} {t uvw t abc}}
561e8fa8c96Sdan  {DELETE $tblname 0 X. {t xyz t def} {}}
562e8fa8c96Sdan"
563cb9a3643Sdando_test $tn.10.1.4 { S delete } {}
564e8fa8c96Sdan
5656dc29e60Sdan#---------------------------------------------------------------
5666dc29e60Sdanreset_db
567cb9a3643Sdando_execsql_test $tn.11.1 {
5686dc29e60Sdan  CREATE TABLE t1(a, b);
5696dc29e60Sdan}
570cb9a3643Sdando_test $tn.11.2 {
5716dc29e60Sdan  sqlite3session S db main
5726dc29e60Sdan  S attach t1
5736dc29e60Sdan  execsql {
5746dc29e60Sdan    INSERT INTO t1 VALUES(1, 2);
5756dc29e60Sdan  }
5766dc29e60Sdan  S changeset
5776dc29e60Sdan} {}
5786dc29e60Sdan
5796dc29e60SdanS delete
5806dc29e60Sdan
5816dc29e60Sdan
5826dc29e60Sdan#-------------------------------------------------------------------------
5836dc29e60Sdan# Test a really long table name.
5846dc29e60Sdan#
5856dc29e60Sdanreset_db
5866dc29e60Sdanset tblname [string repeat tblname123 100]
587cb9a3643Sdando_test $tn.10.1.1 {
5886dc29e60Sdan  execsql "
589cb9a3643Sdan    CREATE TABLE $tblname (a PRIMARY KEY, b)%WR%;
5906dc29e60Sdan    INSERT INTO $tblname VALUES('xyz', 'def');
5916dc29e60Sdan  "
5926dc29e60Sdan  sqlite3session S db main
5936dc29e60Sdan  S attach $tblname
5946dc29e60Sdan  execsql "
5956dc29e60Sdan    INSERT INTO $tblname VALUES('uvw', 'abc');
5966dc29e60Sdan    DELETE FROM $tblname WHERE a = 'xyz';
5976dc29e60Sdan  "
5986dc29e60Sdan} {}
599cb9a3643Sdando_changeset_test $tn.10.1.2 S "
6006dc29e60Sdan  {INSERT $tblname 0 X. {} {t uvw t abc}}
6016dc29e60Sdan  {DELETE $tblname 0 X. {t xyz t def} {}}
6026dc29e60Sdan"
603cb9a3643Sdando_test $tn.10.1.4 { S delete } {}
6046dc29e60Sdan
605e43635aaSdan#-------------------------------------------------------------------------
606e43635aaSdan# Test the effect of updating a column from 0.0 to 0.0.
607e43635aaSdan#
608e43635aaSdanreset_db
609cb9a3643Sdando_execsql_test $tn.11.1 {
610cb9a3643Sdan  CREATE TABLE t1(a INTEGER PRIMARY KEY, b REAL)%WR%;
611e43635aaSdan  INSERT INTO t1 VALUES(1, 0.0);
612e43635aaSdan}
613cb9a3643Sdando_iterator_test $tn.11.2 * {
614e43635aaSdan  UPDATE t1 SET b = 0.0;
615e43635aaSdan} {
616e43635aaSdan}
617e8fa8c96Sdan
618f64ece14Sdanreset_db
619cb9a3643Sdando_execsql_test $tn.12.1 {
620cb9a3643Sdan  CREATE TABLE t1(r INTEGER PRIMARY KEY, a, b)%WR%;
621f64ece14Sdan  CREATE INDEX i1 ON t1(a);
622f64ece14Sdan  INSERT INTO t1 VALUES(1, 1, 1);
623f64ece14Sdan  INSERT INTO t1 VALUES(2, 1, 2);
624f64ece14Sdan  INSERT INTO t1 VALUES(3, 1, 3);
625f64ece14Sdan}
626f64ece14Sdan
627cb9a3643Sdando_iterator_test $tn.12.2 * {
628f64ece14Sdan  UPDATE t1 SET b='one' WHERE a=1;
629f64ece14Sdan} {
630f64ece14Sdan  {UPDATE t1 0 X.. {i 1 {} {} i 1} {{} {} {} {} t one}}
631f64ece14Sdan  {UPDATE t1 0 X.. {i 2 {} {} i 2} {{} {} {} {} t one}}
632f64ece14Sdan  {UPDATE t1 0 X.. {i 3 {} {} i 3} {{} {} {} {} t one}}
633f64ece14Sdan}
634f64ece14Sdan
635fe55da38Sdan#-------------------------------------------------------------------------
636fe55da38Sdan# Test that no savepoint is used if -nosavepoint is specified.
637fe55da38Sdan#
638fe55da38Sdando_execsql_test $tn.13.1 {
639fe55da38Sdan  CREATE TABLE x1(a INTEGER PRIMARY KEY, b)%WR%;
640fe55da38Sdan}
641fe55da38Sdando_test $tn.13.2 {
642fe55da38Sdan  execsql BEGIN
643fe55da38Sdan  set C [changeset_from_sql {
644fe55da38Sdan    INSERT INTO x1 VALUES(1, 'one');
645fe55da38Sdan    INSERT INTO x1 VALUES(2, 'two');
646fe55da38Sdan    INSERT INTO x1 VALUES(3, 'three');
647fe55da38Sdan  }]
648fe55da38Sdan  execsql ROLLBACK
649fe55da38Sdan  execsql {
650fe55da38Sdan    INSERT INTO x1 VALUES(1, 'i');
651fe55da38Sdan    INSERT INTO x1 VALUES(2, 'ii');
652fe55da38Sdan    INSERT INTO x1 VALUES(3, 'iii');
653fe55da38Sdan  }
654fe55da38Sdan} {}
655fe55da38Sdan
656fe55da38Sdanproc xConflict {args} {
657fe55da38Sdan  set ret [lindex $::CONFLICT_HANDLERS 0]
658fe55da38Sdan  set ::CONFLICT_HANDLERS [lrange $::CONFLICT_HANDLERS 1 end]
659fe55da38Sdan  set ret
660fe55da38Sdan}
661fe55da38Sdando_test $tn.13.3 {
662fe55da38Sdan  set CONFLICT_HANDLERS [list REPLACE REPLACE ABORT]
663fe55da38Sdan  execsql BEGIN
664fe55da38Sdan  catch { sqlite3changeset_apply_v2 db $C xConflict } msg
665fe55da38Sdan  execsql {
666fe55da38Sdan    SELECT * FROM x1
667fe55da38Sdan  }
668fe55da38Sdan} {1 i 2 ii 3 iii}
669fe55da38Sdando_test $tn.13.3 {
670fe55da38Sdan  set CONFLICT_HANDLERS [list REPLACE REPLACE ABORT]
671fe55da38Sdan  execsql ROLLBACK
672fe55da38Sdan  execsql BEGIN
673fe55da38Sdan  catch { sqlite3changeset_apply_v2 -nosavepoint db $C xConflict } msg
674fe55da38Sdan  execsql { SELECT * FROM x1 }
675fe55da38Sdan} {1 one 2 two 3 iii}
676fe55da38Sdanexecsql ROLLBACK
677fe55da38Sdan
6781f48e67dSdando_test $tn.14.1 { sqlite3session_config strm_size -1 } 64
6791f48e67dSdando_test $tn.14.2 { sqlite3session_config strm_size 65536 } 65536
6801f48e67dSdando_test $tn.14.3 { sqlite3session_config strm_size 64 } 64
6811f48e67dSdando_test $tn.14.4 {
6821f48e67dSdan  list [catch {sqlite3session_config invalid 123} msg] $msg
6831f48e67dSdan} {1 SQLITE_MISUSE}
6841f48e67dSdan
685cb9a3643Sdan}]
686cb9a3643Sdan}
687f64ece14Sdan
688f64ece14Sdan
6894565faa9Sdanfinish_test
690