OLD | NEW |
(Empty) | |
| 1 # 2011 March 07 |
| 2 # |
| 3 # The author disclaims copyright to this source code. In place of |
| 4 # a legal notice, here is a blessing: |
| 5 # |
| 6 # May you do good and not evil. |
| 7 # May you find forgiveness for yourself and forgive others. |
| 8 # May you share freely, never taking more than you give. |
| 9 # |
| 10 #*********************************************************************** |
| 11 # This file implements regression tests for SQLite library. |
| 12 # |
| 13 |
| 14 if {![info exists testdir]} { |
| 15 set testdir [file join [file dirname [info script]] .. .. test] |
| 16 } |
| 17 source [file join [file dirname [info script]] session_common.tcl] |
| 18 source $testdir/tester.tcl |
| 19 ifcapable !session {finish_test; return} |
| 20 |
| 21 set testprefix session1 |
| 22 |
| 23 # Run all tests in this file twice. Once with "WITHOUT ROWID", and once |
| 24 # with regular rowid tables. |
| 25 # |
| 26 foreach {tn trailing} { |
| 27 1 "" |
| 28 2 " WITHOUT ROWID " |
| 29 } { |
| 30 eval [string map [list %WR% $trailing] { |
| 31 |
| 32 db close |
| 33 forcedelete test.db test.db2 |
| 34 reset_db |
| 35 |
| 36 do_execsql_test $tn.1.0 { |
| 37 CREATE TABLE t1(x PRIMARY KEY, y) %WR%; |
| 38 INSERT INTO t1 VALUES('abc', 'def'); |
| 39 } |
| 40 |
| 41 #------------------------------------------------------------------------- |
| 42 # Test creating, attaching tables to and deleting session objects. |
| 43 # |
| 44 do_test $tn.1.1 { sqlite3session S db main } {S} |
| 45 do_test $tn.1.2 { S delete } {} |
| 46 do_test $tn.1.3 { sqlite3session S db main } {S} |
| 47 do_test $tn.1.4 { S attach t1 } {} |
| 48 do_test $tn.1.5 { S delete } {} |
| 49 do_test $tn.1.6 { sqlite3session S db main } {S} |
| 50 do_test $tn.1.7 { S attach t1 ; S attach t2 ; S attach t3 } {} |
| 51 do_test $tn.1.8 { S attach t1 ; S attach t2 ; S attach t3 } {} |
| 52 do_test $tn.1.9 { S delete } {} |
| 53 do_test $tn.1.10 { |
| 54 sqlite3session S db main |
| 55 S attach t1 |
| 56 execsql { INSERT INTO t1 VALUES('ghi', 'jkl') } |
| 57 } {} |
| 58 do_test $tn.1.11 { S delete } {} |
| 59 if {$tn==1} { |
| 60 do_test $tn.1.12 { |
| 61 sqlite3session S db main |
| 62 S attach t1 |
| 63 execsql { INSERT INTO t1 VALUES('mno', 'pqr') } |
| 64 execsql { UPDATE t1 SET x = 111 WHERE rowid = 1 } |
| 65 execsql { DELETE FROM t1 WHERE rowid = 2 } |
| 66 } {} |
| 67 do_test $tn.1.13 { |
| 68 S changeset |
| 69 S delete |
| 70 } {} |
| 71 } |
| 72 |
| 73 #------------------------------------------------------------------------- |
| 74 # Simple changeset tests. Also test the sqlite3changeset_invert() |
| 75 # function. |
| 76 # |
| 77 do_test $tn.2.1.1 { |
| 78 execsql { DELETE FROM t1 } |
| 79 sqlite3session S db main |
| 80 S attach t1 |
| 81 execsql { INSERT INTO t1 VALUES(1, 'Sukhothai') } |
| 82 execsql { INSERT INTO t1 VALUES(2, 'Ayutthaya') } |
| 83 execsql { INSERT INTO t1 VALUES(3, 'Thonburi') } |
| 84 } {} |
| 85 do_changeset_test $tn.2.1.2 S { |
| 86 {INSERT t1 0 X. {} {i 1 t Sukhothai}} |
| 87 {INSERT t1 0 X. {} {i 2 t Ayutthaya}} |
| 88 {INSERT t1 0 X. {} {i 3 t Thonburi}} |
| 89 } |
| 90 do_changeset_invert_test $tn.2.1.3 S { |
| 91 {DELETE t1 0 X. {i 1 t Sukhothai} {}} |
| 92 {DELETE t1 0 X. {i 2 t Ayutthaya} {}} |
| 93 {DELETE t1 0 X. {i 3 t Thonburi} {}} |
| 94 } |
| 95 do_test $tn.2.1.4 { S delete } {} |
| 96 |
| 97 do_test $tn.2.2.1 { |
| 98 sqlite3session S db main |
| 99 S attach t1 |
| 100 execsql { DELETE FROM t1 WHERE 1 } |
| 101 } {} |
| 102 do_changeset_test $tn.2.2.2 S { |
| 103 {DELETE t1 0 X. {i 1 t Sukhothai} {}} |
| 104 {DELETE t1 0 X. {i 2 t Ayutthaya} {}} |
| 105 {DELETE t1 0 X. {i 3 t Thonburi} {}} |
| 106 } |
| 107 do_changeset_invert_test $tn.2.2.3 S { |
| 108 {INSERT t1 0 X. {} {i 1 t Sukhothai}} |
| 109 {INSERT t1 0 X. {} {i 2 t Ayutthaya}} |
| 110 {INSERT t1 0 X. {} {i 3 t Thonburi}} |
| 111 } |
| 112 do_test $tn.2.2.4 { S delete } {} |
| 113 |
| 114 do_test $tn.2.3.1 { |
| 115 execsql { DELETE FROM t1 } |
| 116 sqlite3session S db main |
| 117 execsql { INSERT INTO t1 VALUES(1, 'Sukhothai') } |
| 118 execsql { INSERT INTO t1 VALUES(2, 'Ayutthaya') } |
| 119 execsql { INSERT INTO t1 VALUES(3, 'Thonburi') } |
| 120 S attach t1 |
| 121 execsql { |
| 122 UPDATE t1 SET x = 10 WHERE x = 1; |
| 123 UPDATE t1 SET y = 'Surin' WHERE x = 2; |
| 124 UPDATE t1 SET x = 20, y = 'Thapae' WHERE x = 3; |
| 125 } |
| 126 } {} |
| 127 |
| 128 do_changeset_test $tn.2.3.2 S { |
| 129 {INSERT t1 0 X. {} {i 10 t Sukhothai}} |
| 130 {DELETE t1 0 X. {i 1 t Sukhothai} {}} |
| 131 {UPDATE t1 0 X. {i 2 t Ayutthaya} {{} {} t Surin}} |
| 132 {DELETE t1 0 X. {i 3 t Thonburi} {}} |
| 133 {INSERT t1 0 X. {} {i 20 t Thapae}} |
| 134 } |
| 135 |
| 136 do_changeset_invert_test $tn.2.3.3 S { |
| 137 {DELETE t1 0 X. {i 10 t Sukhothai} {}} |
| 138 {INSERT t1 0 X. {} {i 1 t Sukhothai}} |
| 139 {UPDATE t1 0 X. {i 2 t Surin} {{} {} t Ayutthaya}} |
| 140 {INSERT t1 0 X. {} {i 3 t Thonburi}} |
| 141 {DELETE t1 0 X. {i 20 t Thapae} {}} |
| 142 } |
| 143 do_test $tn.2.3.4 { S delete } {} |
| 144 |
| 145 do_test $tn.2.4.1 { |
| 146 sqlite3session S db main |
| 147 S attach t1 |
| 148 execsql { INSERT INTO t1 VALUES(100, 'Bangkok') } |
| 149 execsql { DELETE FROM t1 WHERE x = 100 } |
| 150 } {} |
| 151 do_changeset_test $tn.2.4.2 S {} |
| 152 do_changeset_invert_test $tn.2.4.3 S {} |
| 153 do_test $tn.2.4.4 { S delete } {} |
| 154 |
| 155 #------------------------------------------------------------------------- |
| 156 # Test the application of simple changesets. These tests also test that |
| 157 # the conflict callback is invoked correctly. For these tests, the |
| 158 # conflict callback always returns OMIT. |
| 159 # |
| 160 db close |
| 161 forcedelete test.db test.db2 |
| 162 sqlite3 db test.db |
| 163 sqlite3 db2 test.db2 |
| 164 |
| 165 proc xConflict {args} { |
| 166 lappend ::xConflict $args |
| 167 return "" |
| 168 } |
| 169 |
| 170 proc bgerror {args} { set ::background_error $args } |
| 171 |
| 172 proc do_conflict_test {tn args} { |
| 173 set O(-tables) [list] |
| 174 set O(-sql) [list] |
| 175 set O(-conflicts) [list] |
| 176 |
| 177 array set V $args |
| 178 foreach key [array names V] { |
| 179 if {![info exists O($key)]} {error "no such option: $key"} |
| 180 } |
| 181 array set O $args |
| 182 |
| 183 sqlite3session S db main |
| 184 foreach t $O(-tables) { S attach $t } |
| 185 execsql $O(-sql) |
| 186 set ::xConflict [list] |
| 187 sqlite3changeset_apply db2 [S changeset] xConflict |
| 188 |
| 189 set conflicts [list] |
| 190 foreach c $O(-conflicts) { |
| 191 lappend conflicts $c |
| 192 } |
| 193 |
| 194 after 1 {set go 1} |
| 195 vwait go |
| 196 |
| 197 uplevel do_test $tn [list { set ::xConflict }] [list $conflicts] |
| 198 S delete |
| 199 } |
| 200 |
| 201 proc do_db2_test {testname sql {result {}}} { |
| 202 uplevel do_test $testname [list "execsql {$sql} db2"] [list [list {*}$result]] |
| 203 } |
| 204 |
| 205 # Test INSERT changesets. |
| 206 # |
| 207 do_test $tn.3.1.0 { |
| 208 execsql { CREATE TABLE t1(a PRIMARY KEY, b NOT NULL) %WR% } db2 |
| 209 execsql { |
| 210 CREATE TABLE t1(a PRIMARY KEY, b) %WR%; |
| 211 INSERT INTO t1 VALUES(1, 'one'); |
| 212 INSERT INTO t1 VALUES(2, 'two'); |
| 213 } db |
| 214 } {} |
| 215 do_db2_test $tn.3.1.1 "INSERT INTO t1 VALUES(6, 'VI')" |
| 216 do_conflict_test $tn.3.1.2 -tables t1 -sql { |
| 217 INSERT INTO t1 VALUES(3, 'three'); |
| 218 INSERT INTO t1 VALUES(4, 'four'); |
| 219 INSERT INTO t1 VALUES(5, 'five'); |
| 220 INSERT INTO t1 VALUES(6, 'six'); |
| 221 INSERT INTO t1 VALUES(7, 'seven'); |
| 222 INSERT INTO t1 VALUES(8, NULL); |
| 223 } -conflicts { |
| 224 {INSERT t1 CONFLICT {i 6 t six} {i 6 t VI}} |
| 225 {INSERT t1 CONSTRAINT {i 8 n {}}} |
| 226 } |
| 227 |
| 228 do_db2_test $tn.3.1.3 "SELECT * FROM t1 ORDER BY a" { |
| 229 3 three 4 four 5 five 6 VI 7 seven |
| 230 } |
| 231 do_execsql_test $tn.3.1.4 "SELECT * FROM t1" { |
| 232 1 one 2 two 3 three 4 four 5 five 6 six 7 seven 8 {} |
| 233 } |
| 234 |
| 235 # Test DELETE changesets. |
| 236 # |
| 237 do_execsql_test $tn.3.2.1 { |
| 238 PRAGMA foreign_keys = on; |
| 239 CREATE TABLE t2(a PRIMARY KEY, b)%WR%; |
| 240 CREATE TABLE t3(c, d REFERENCES t2); |
| 241 INSERT INTO t2 VALUES(1, 'one'); |
| 242 INSERT INTO t2 VALUES(2, 'two'); |
| 243 INSERT INTO t2 VALUES(3, 'three'); |
| 244 INSERT INTO t2 VALUES(4, 'four'); |
| 245 } |
| 246 do_db2_test $tn.3.2.2 { |
| 247 PRAGMA foreign_keys = on; |
| 248 CREATE TABLE t2(a PRIMARY KEY, b)%WR%; |
| 249 CREATE TABLE t3(c, d REFERENCES t2); |
| 250 INSERT INTO t2 VALUES(1, 'one'); |
| 251 INSERT INTO t2 VALUES(2, 'two'); |
| 252 INSERT INTO t2 VALUES(4, 'five'); |
| 253 INSERT INTO t3 VALUES('i', 1); |
| 254 } |
| 255 do_conflict_test $tn.3.2.3 -tables t2 -sql { |
| 256 DELETE FROM t2 WHERE a = 1; |
| 257 DELETE FROM t2 WHERE a = 2; |
| 258 DELETE FROM t2 WHERE a = 3; |
| 259 DELETE FROM t2 WHERE a = 4; |
| 260 } -conflicts { |
| 261 {DELETE t2 NOTFOUND {i 3 t three}} |
| 262 {DELETE t2 DATA {i 4 t four} {i 4 t five}} |
| 263 {FOREIGN_KEY 1} |
| 264 } |
| 265 do_execsql_test $tn.3.2.4 "SELECT * FROM t2" {} |
| 266 do_db2_test $tn.3.2.5 "SELECT * FROM t2" {4 five} |
| 267 |
| 268 # Test UPDATE changesets. |
| 269 # |
| 270 do_execsql_test $tn.3.3.1 { |
| 271 CREATE TABLE t4(a, b, c, PRIMARY KEY(b, c))%WR%; |
| 272 INSERT INTO t4 VALUES(1, 2, 3); |
| 273 INSERT INTO t4 VALUES(4, 5, 6); |
| 274 INSERT INTO t4 VALUES(7, 8, 9); |
| 275 INSERT INTO t4 VALUES(10, 11, 12); |
| 276 } |
| 277 do_db2_test $tn.3.3.2 { |
| 278 CREATE TABLE t4(a NOT NULL, b, c, PRIMARY KEY(b, c))%WR%; |
| 279 INSERT INTO t4 VALUES(0, 2, 3); |
| 280 INSERT INTO t4 VALUES(4, 5, 7); |
| 281 INSERT INTO t4 VALUES(7, 8, 9); |
| 282 INSERT INTO t4 VALUES(10, 11, 12); |
| 283 } |
| 284 do_conflict_test $tn.3.3.3 -tables t4 -sql { |
| 285 UPDATE t4 SET a = -1 WHERE b = 2; |
| 286 UPDATE t4 SET a = -1 WHERE b = 5; |
| 287 UPDATE t4 SET a = NULL WHERE c = 9; |
| 288 UPDATE t4 SET a = 'x' WHERE b = 11; |
| 289 } -conflicts { |
| 290 {UPDATE t4 DATA {i 1 i 2 i 3} {i -1 {} {} {} {}} {i 0 i 2 i 3}} |
| 291 {UPDATE t4 NOTFOUND {i 4 i 5 i 6} {i -1 {} {} {} {}}} |
| 292 {UPDATE t4 CONSTRAINT {i 7 i 8 i 9} {n {} {} {} {} {}}} |
| 293 } |
| 294 do_db2_test $tn.3.3.4 { SELECT * FROM t4 } {0 2 3 4 5 7 7 8 9 x 11 12} |
| 295 do_execsql_test $tn.3.3.5 { SELECT * FROM t4 } {-1 2 3 -1 5 6 {} 8 9 x 11 12} |
| 296 |
| 297 #------------------------------------------------------------------------- |
| 298 # This next block of tests verifies that values returned by the conflict |
| 299 # handler are intepreted correctly. |
| 300 # |
| 301 |
| 302 proc test_reset {} { |
| 303 db close |
| 304 db2 close |
| 305 forcedelete test.db test.db2 |
| 306 sqlite3 db test.db |
| 307 sqlite3 db2 test.db2 |
| 308 } |
| 309 |
| 310 proc xConflict {args} { |
| 311 lappend ::xConflict $args |
| 312 return $::conflict_return |
| 313 } |
| 314 |
| 315 foreach {tn2 conflict_return after} { |
| 316 1 OMIT {1 2 value1 4 5 7 10 x x} |
| 317 2 REPLACE {1 2 value1 4 5 value2 10 8 9} |
| 318 } { |
| 319 test_reset |
| 320 |
| 321 do_test $tn.4.$tn2.1 { |
| 322 foreach db {db db2} { |
| 323 execsql { |
| 324 CREATE TABLE t1(a, b, c, PRIMARY KEY(a))%WR%; |
| 325 INSERT INTO t1 VALUES(1, 2, 3); |
| 326 INSERT INTO t1 VALUES(4, 5, 6); |
| 327 INSERT INTO t1 VALUES(7, 8, 9); |
| 328 } $db |
| 329 } |
| 330 execsql { |
| 331 REPLACE INTO t1 VALUES(4, 5, 7); |
| 332 REPLACE INTO t1 VALUES(10, 'x', 'x'); |
| 333 } db2 |
| 334 } {} |
| 335 |
| 336 do_conflict_test $tn.4.$tn2.2 -tables t1 -sql { |
| 337 UPDATE t1 SET c = 'value1' WHERE a = 1; -- no conflict |
| 338 UPDATE t1 SET c = 'value2' WHERE a = 4; -- DATA conflict |
| 339 UPDATE t1 SET a = 10 WHERE a = 7; -- CONFLICT conflict |
| 340 } -conflicts { |
| 341 {INSERT t1 CONFLICT {i 10 i 8 i 9} {i 10 t x t x}} |
| 342 {UPDATE t1 DATA {i 4 {} {} i 6} {{} {} {} {} t value2} {i 4 i 5 i 7}} |
| 343 } |
| 344 |
| 345 do_db2_test $tn.4.$tn2.3 "SELECT * FROM t1 ORDER BY a" $after |
| 346 } |
| 347 |
| 348 foreach {tn2 conflict_return} { |
| 349 1 OMIT |
| 350 2 REPLACE |
| 351 } { |
| 352 test_reset |
| 353 |
| 354 do_test $tn.5.$tn2.1 { |
| 355 # Create an identical schema in both databases. |
| 356 set schema { |
| 357 CREATE TABLE "'foolish name'"(x, y, z, PRIMARY KEY(x, y))%WR%; |
| 358 } |
| 359 execsql $schema db |
| 360 execsql $schema db2 |
| 361 |
| 362 # Add some rows to [db2]. These rows will cause conflicts later |
| 363 # on when the changeset from [db] is applied to it. |
| 364 execsql { |
| 365 INSERT INTO "'foolish name'" VALUES('one', 'one', 'ii'); |
| 366 INSERT INTO "'foolish name'" VALUES('one', 'two', 'i'); |
| 367 INSERT INTO "'foolish name'" VALUES('two', 'two', 'ii'); |
| 368 } db2 |
| 369 |
| 370 } {} |
| 371 |
| 372 do_conflict_test $tn.5.$tn2.2 -tables {{'foolish name'}} -sql { |
| 373 INSERT INTO "'foolish name'" VALUES('one', 'two', 2); |
| 374 } -conflicts { |
| 375 {INSERT {'foolish name'} CONFLICT {t one t two i 2} {t one t two t i}} |
| 376 } |
| 377 |
| 378 set res(REPLACE) {one one ii one two 2 two two ii} |
| 379 set res(OMIT) {one one ii one two i two two ii} |
| 380 do_db2_test $tn.5.$tn2.3 { |
| 381 SELECT * FROM "'foolish name'" ORDER BY x, y |
| 382 } $res($conflict_return) |
| 383 |
| 384 |
| 385 do_test $tn.5.$tn2.1 { |
| 386 set schema { |
| 387 CREATE TABLE d1("z""z" PRIMARY KEY, y)%WR%; |
| 388 INSERT INTO d1 VALUES(1, 'one'); |
| 389 INSERT INTO d1 VALUES(2, 'two'); |
| 390 } |
| 391 execsql $schema db |
| 392 execsql $schema db2 |
| 393 |
| 394 execsql { |
| 395 UPDATE d1 SET y = 'TWO' WHERE "z""z" = 2; |
| 396 } db2 |
| 397 |
| 398 } {} |
| 399 |
| 400 do_conflict_test $tn.5.$tn2.2 -tables d1 -sql { |
| 401 DELETE FROM d1 WHERE "z""z" = 2; |
| 402 } -conflicts { |
| 403 {DELETE d1 DATA {i 2 t two} {i 2 t TWO}} |
| 404 } |
| 405 |
| 406 set res(REPLACE) {1 one} |
| 407 set res(OMIT) {1 one 2 TWO} |
| 408 do_db2_test $tn.5.$tn2.3 "SELECT * FROM d1" $res($conflict_return) |
| 409 } |
| 410 |
| 411 #------------------------------------------------------------------------- |
| 412 # Test that two tables can be monitored by a single session object. |
| 413 # |
| 414 test_reset |
| 415 set schema { |
| 416 CREATE TABLE t1(a COLLATE nocase PRIMARY KEY, b)%WR%; |
| 417 CREATE TABLE t2(a, b PRIMARY KEY)%WR%; |
| 418 } |
| 419 do_test $tn.6.0 { |
| 420 execsql $schema db |
| 421 execsql $schema db2 |
| 422 execsql { |
| 423 INSERT INTO t1 VALUES('a', 'b'); |
| 424 INSERT INTO t2 VALUES('a', 'b'); |
| 425 } db2 |
| 426 } {} |
| 427 |
| 428 set conflict_return "" |
| 429 do_conflict_test $tn.6.1 -tables {t1 t2} -sql { |
| 430 INSERT INTO t1 VALUES('1', '2'); |
| 431 INSERT INTO t1 VALUES('A', 'B'); |
| 432 INSERT INTO t2 VALUES('A', 'B'); |
| 433 } -conflicts { |
| 434 {INSERT t1 CONFLICT {t A t B} {t a t b}} |
| 435 } |
| 436 |
| 437 do_db2_test $tn.6.2 "SELECT * FROM t1 ORDER BY a" {1 2 a b} |
| 438 do_db2_test $tn.6.3 "SELECT * FROM t2 ORDER BY a" {A B a b} |
| 439 |
| 440 #------------------------------------------------------------------------- |
| 441 # Test that session objects are not confused by changes to table in |
| 442 # other databases. |
| 443 # |
| 444 catch { db2 close } |
| 445 drop_all_tables |
| 446 forcedelete test.db2 |
| 447 do_iterator_test $tn.7.1 * { |
| 448 ATTACH 'test.db2' AS aux; |
| 449 CREATE TABLE main.t1(x PRIMARY KEY, y)%WR%; |
| 450 CREATE TABLE aux.t1(x PRIMARY KEY, y)%WR%; |
| 451 |
| 452 INSERT INTO main.t1 VALUES('one', 1); |
| 453 INSERT INTO main.t1 VALUES('two', 2); |
| 454 INSERT INTO aux.t1 VALUES('three', 3); |
| 455 INSERT INTO aux.t1 VALUES('four', 4); |
| 456 } { |
| 457 {INSERT t1 0 X. {} {t two i 2}} |
| 458 {INSERT t1 0 X. {} {t one i 1}} |
| 459 } |
| 460 |
| 461 #------------------------------------------------------------------------- |
| 462 # Test the sqlite3session_isempty() function. |
| 463 # |
| 464 do_test $tn.8.1 { |
| 465 execsql { |
| 466 CREATE TABLE t5(x PRIMARY KEY, y)%WR%; |
| 467 CREATE TABLE t6(x PRIMARY KEY, y)%WR%; |
| 468 INSERT INTO t5 VALUES('a', 'b'); |
| 469 INSERT INTO t6 VALUES('a', 'b'); |
| 470 } |
| 471 sqlite3session S db main |
| 472 S attach * |
| 473 |
| 474 S isempty |
| 475 } {1} |
| 476 do_test $tn.8.2 { |
| 477 execsql { DELETE FROM t5 } |
| 478 S isempty |
| 479 } {0} |
| 480 do_test $tn.8.3 { |
| 481 S delete |
| 482 sqlite3session S db main |
| 483 S attach t5 |
| 484 execsql { DELETE FROM t5 } |
| 485 S isempty |
| 486 } {1} |
| 487 do_test $tn.8.4 { S delete } {} |
| 488 |
| 489 do_test $tn.8.5 { |
| 490 sqlite3session S db main |
| 491 S attach t5 |
| 492 S attach t6 |
| 493 execsql { INSERT INTO t5 VALUES(1, 2) } |
| 494 S isempty |
| 495 } {0} |
| 496 |
| 497 do_test $tn.8.6 { |
| 498 S delete |
| 499 sqlite3session S db main |
| 500 S attach t5 |
| 501 S attach t6 |
| 502 execsql { INSERT INTO t6 VALUES(1, 2) } |
| 503 S isempty |
| 504 } {0} |
| 505 do_test $tn.8.7 { S delete } {} |
| 506 |
| 507 #------------------------------------------------------------------------- |
| 508 # |
| 509 do_execsql_test $tn.9.1 { |
| 510 CREATE TABLE t7(a, b, c, d, e PRIMARY KEY, f, g)%WR%; |
| 511 INSERT INTO t7 VALUES(1, 1, 1, 1, 1, 1, 1); |
| 512 } |
| 513 do_test $tn.9.2 { |
| 514 sqlite3session S db main |
| 515 S attach * |
| 516 execsql { UPDATE t7 SET b=2, d=2 } |
| 517 } {} |
| 518 do_changeset_test $tn.9.2 S {{UPDATE t7 0 ....X.. {{} {} i 1 {} {} i 1 i 1 {} {}
{} {}} {{} {} i 2 {} {} i 2 {} {} {} {} {} {}}}} |
| 519 S delete |
| 520 catch { db2 close } |
| 521 |
| 522 #------------------------------------------------------------------------- |
| 523 # Test a really long table name. |
| 524 # |
| 525 reset_db |
| 526 set tblname [string repeat tblname123 100] |
| 527 do_test $tn.10.1.1 { |
| 528 execsql " |
| 529 CREATE TABLE $tblname (a PRIMARY KEY, b)%WR%; |
| 530 INSERT INTO $tblname VALUES('xyz', 'def'); |
| 531 " |
| 532 sqlite3session S db main |
| 533 S attach $tblname |
| 534 execsql " |
| 535 INSERT INTO $tblname VALUES('uvw', 'abc'); |
| 536 DELETE FROM $tblname WHERE a = 'xyz'; |
| 537 " |
| 538 } {} |
| 539 breakpoint |
| 540 do_changeset_test $tn.10.1.2 S " |
| 541 {INSERT $tblname 0 X. {} {t uvw t abc}} |
| 542 {DELETE $tblname 0 X. {t xyz t def} {}} |
| 543 " |
| 544 do_test $tn.10.1.4 { S delete } {} |
| 545 |
| 546 #--------------------------------------------------------------- |
| 547 reset_db |
| 548 do_execsql_test $tn.11.1 { |
| 549 CREATE TABLE t1(a, b); |
| 550 } |
| 551 do_test $tn.11.2 { |
| 552 sqlite3session S db main |
| 553 S attach t1 |
| 554 execsql { |
| 555 INSERT INTO t1 VALUES(1, 2); |
| 556 } |
| 557 S changeset |
| 558 } {} |
| 559 |
| 560 S delete |
| 561 |
| 562 |
| 563 #------------------------------------------------------------------------- |
| 564 # Test a really long table name. |
| 565 # |
| 566 reset_db |
| 567 set tblname [string repeat tblname123 100] |
| 568 do_test $tn.10.1.1 { |
| 569 execsql " |
| 570 CREATE TABLE $tblname (a PRIMARY KEY, b)%WR%; |
| 571 INSERT INTO $tblname VALUES('xyz', 'def'); |
| 572 " |
| 573 sqlite3session S db main |
| 574 S attach $tblname |
| 575 execsql " |
| 576 INSERT INTO $tblname VALUES('uvw', 'abc'); |
| 577 DELETE FROM $tblname WHERE a = 'xyz'; |
| 578 " |
| 579 } {} |
| 580 breakpoint |
| 581 do_changeset_test $tn.10.1.2 S " |
| 582 {INSERT $tblname 0 X. {} {t uvw t abc}} |
| 583 {DELETE $tblname 0 X. {t xyz t def} {}} |
| 584 " |
| 585 do_test $tn.10.1.4 { S delete } {} |
| 586 |
| 587 #------------------------------------------------------------------------- |
| 588 # Test the effect of updating a column from 0.0 to 0.0. |
| 589 # |
| 590 reset_db |
| 591 do_execsql_test $tn.11.1 { |
| 592 CREATE TABLE t1(a INTEGER PRIMARY KEY, b REAL)%WR%; |
| 593 INSERT INTO t1 VALUES(1, 0.0); |
| 594 } |
| 595 do_iterator_test $tn.11.2 * { |
| 596 UPDATE t1 SET b = 0.0; |
| 597 } { |
| 598 } |
| 599 |
| 600 reset_db |
| 601 do_execsql_test $tn.12.1 { |
| 602 CREATE TABLE t1(r INTEGER PRIMARY KEY, a, b)%WR%; |
| 603 CREATE INDEX i1 ON t1(a); |
| 604 INSERT INTO t1 VALUES(1, 1, 1); |
| 605 INSERT INTO t1 VALUES(2, 1, 2); |
| 606 INSERT INTO t1 VALUES(3, 1, 3); |
| 607 } |
| 608 |
| 609 do_iterator_test $tn.12.2 * { |
| 610 UPDATE t1 SET b='one' WHERE a=1; |
| 611 } { |
| 612 {UPDATE t1 0 X.. {i 1 {} {} i 1} {{} {} {} {} t one}} |
| 613 {UPDATE t1 0 X.. {i 2 {} {} i 2} {{} {} {} {} t one}} |
| 614 {UPDATE t1 0 X.. {i 3 {} {} i 3} {{} {} {} {} t one}} |
| 615 } |
| 616 |
| 617 }] |
| 618 } |
| 619 |
| 620 |
| 621 finish_test |
OLD | NEW |