1 # 2001 September 15 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. The 12 # focus of this file is testing the UPDATE statement. 13 # 14 # $Id: update.test,v 1.19 2008/04/10 18:44:36 drh Exp $ 15 16 set testdir [file dirname $argv0] 17 source $testdir/tester.tcl 18 19 # Try to update an non-existent table 20 # 21 do_test update-1.1 { 22 set v [catch {execsql {UPDATE test1 SET f2=5 WHERE f1<1}} msg] 23 lappend v $msg 24 } {1 {no such table: test1}} 25 26 # Try to update a read-only table 27 # 28 do_test update-2.1 { 29 set v [catch \ 30 {execsql {UPDATE sqlite_master SET name='xyz' WHERE name='123'}} msg] 31 lappend v $msg 32 } {1 {table sqlite_master may not be modified}} 33 34 # Create a table to work with 35 # 36 do_test update-3.1 { 37 execsql {CREATE TABLE test1(f1 int,f2 int)} 38 for {set i 1} {$i<=10} {incr i} { 39 set sql "INSERT INTO test1 VALUES($i,[expr {1<<$i}])" 40 execsql $sql 41 } 42 execsql {SELECT * FROM test1 ORDER BY f1} 43 } {1 2 2 4 3 8 4 16 5 32 6 64 7 128 8 256 9 512 10 1024} 44 45 # Unknown column name in an expression 46 # 47 do_test update-3.2 { 48 set v [catch {execsql {UPDATE test1 SET f1=f3*2 WHERE f2==32}} msg] 49 lappend v $msg 50 } {1 {no such column: f3}} 51 do_test update-3.3 { 52 set v [catch {execsql {UPDATE test1 SET f1=test2.f1*2 WHERE f2==32}} msg] 53 lappend v $msg 54 } {1 {no such column: test2.f1}} 55 do_test update-3.4 { 56 set v [catch {execsql {UPDATE test1 SET f3=f1*2 WHERE f2==32}} msg] 57 lappend v $msg 58 } {1 {no such column: f3}} 59 60 # Actually do some updates 61 # 62 do_test update-3.5 { 63 execsql {UPDATE test1 SET f2=f2*3} 64 } {} 65 do_test update-3.5.1 { 66 db changes 67 } {10} 68 69 # verify that SELECT does not reset the change counter 70 do_test update-3.5.2 { 71 db eval {SELECT count(*) FROM test1} 72 } {10} 73 do_test update-3.5.3 { 74 db changes 75 } {10} 76 77 do_test update-3.6 { 78 execsql {SELECT * FROM test1 ORDER BY f1} 79 } {1 6 2 12 3 24 4 48 5 96 6 192 7 384 8 768 9 1536 10 3072} 80 do_test update-3.7 { 81 execsql {PRAGMA count_changes=on} 82 execsql {UPDATE test1 SET f2=f2/3 WHERE f1<=5} 83 } {5} 84 do_test update-3.8 { 85 execsql {SELECT * FROM test1 ORDER BY f1} 86 } {1 2 2 4 3 8 4 16 5 32 6 192 7 384 8 768 9 1536 10 3072} 87 do_test update-3.9 { 88 execsql {UPDATE test1 SET f2=f2/3 WHERE f1>5} 89 } {5} 90 do_test update-3.10 { 91 execsql {SELECT * FROM test1 ORDER BY f1} 92 } {1 2 2 4 3 8 4 16 5 32 6 64 7 128 8 256 9 512 10 1024} 93 94 # Swap the values of f1 and f2 for all elements 95 # 96 do_test update-3.11 { 97 execsql {UPDATE test1 SET F2=f1, F1=f2} 98 } {10} 99 do_test update-3.12 { 100 execsql {SELECT * FROM test1 ORDER BY F1} 101 } {2 1 4 2 8 3 16 4 32 5 64 6 128 7 256 8 512 9 1024 10} 102 do_test update-3.13 { 103 execsql {PRAGMA count_changes=off} 104 execsql {UPDATE test1 SET F2=f1, F1=f2} 105 } {} 106 do_test update-3.14 { 107 execsql {SELECT * FROM test1 ORDER BY F1} 108 } {1 2 2 4 3 8 4 16 5 32 6 64 7 128 8 256 9 512 10 1024} 109 110 # Create duplicate entries and make sure updating still 111 # works. 112 # 113 do_test update-4.0 { 114 execsql { 115 DELETE FROM test1 WHERE f1<=5; 116 INSERT INTO test1(f1,f2) VALUES(8,88); 117 INSERT INTO test1(f1,f2) VALUES(8,888); 118 INSERT INTO test1(f1,f2) VALUES(77,128); 119 INSERT INTO test1(f1,f2) VALUES(777,128); 120 } 121 execsql {SELECT * FROM test1 ORDER BY f1,f2} 122 } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128} 123 do_test update-4.1 { 124 execsql {UPDATE test1 SET f2=f2+1 WHERE f1==8} 125 execsql {SELECT * FROM test1 ORDER BY f1,f2} 126 } {6 64 7 128 8 89 8 257 8 889 9 512 10 1024 77 128 777 128} 127 do_test update-4.2 { 128 execsql {UPDATE test1 SET f2=f2-1 WHERE f1==8 and f2>800} 129 execsql {SELECT * FROM test1 ORDER BY f1,f2} 130 } {6 64 7 128 8 89 8 257 8 888 9 512 10 1024 77 128 777 128} 131 do_test update-4.3 { 132 execsql {UPDATE test1 SET f2=f2-1 WHERE f1==8 and f2<800} 133 execsql {SELECT * FROM test1 ORDER BY f1,f2} 134 } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128} 135 do_test update-4.4 { 136 execsql {UPDATE test1 SET f1=f1+1 WHERE f2==128} 137 execsql {SELECT * FROM test1 ORDER BY f1,f2} 138 } {6 64 8 88 8 128 8 256 8 888 9 512 10 1024 78 128 778 128} 139 do_test update-4.5 { 140 execsql {UPDATE test1 SET f1=f1-1 WHERE f1>100 and f2==128} 141 execsql {SELECT * FROM test1 ORDER BY f1,f2} 142 } {6 64 8 88 8 128 8 256 8 888 9 512 10 1024 78 128 777 128} 143 do_test update-4.6 { 144 execsql { 145 PRAGMA count_changes=on; 146 UPDATE test1 SET f1=f1-1 WHERE f1<=100 and f2==128; 147 } 148 } {2} 149 do_test update-4.7 { 150 execsql { 151 PRAGMA count_changes=off; 152 SELECT * FROM test1 ORDER BY f1,f2 153 } 154 } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128} 155 156 # Repeat the previous sequence of tests with an index. 157 # 158 do_test update-5.0 { 159 execsql {CREATE INDEX idx1 ON test1(f1)} 160 execsql {SELECT * FROM test1 ORDER BY f1,f2} 161 } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128} 162 do_test update-5.1 { 163 execsql {UPDATE test1 SET f2=f2+1 WHERE f1==8} 164 execsql {SELECT * FROM test1 ORDER BY f1,f2} 165 } {6 64 7 128 8 89 8 257 8 889 9 512 10 1024 77 128 777 128} 166 do_test update-5.2 { 167 execsql {UPDATE test1 SET f2=f2-1 WHERE f1==8 and f2>800} 168 execsql {SELECT * FROM test1 ORDER BY f1,f2} 169 } {6 64 7 128 8 89 8 257 8 888 9 512 10 1024 77 128 777 128} 170 do_test update-5.3 { 171 execsql {UPDATE test1 SET f2=f2-1 WHERE f1==8 and f2<800} 172 execsql {SELECT * FROM test1 ORDER BY f1,f2} 173 } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128} 174 do_test update-5.4 { 175 execsql {UPDATE test1 SET f1=f1+1 WHERE f2==128} 176 execsql {SELECT * FROM test1 ORDER BY f1,f2} 177 } {6 64 8 88 8 128 8 256 8 888 9 512 10 1024 78 128 778 128} 178 do_test update-5.4.1 { 179 execsql {SELECT * FROM test1 WHERE f1==78 ORDER BY f1,f2} 180 } {78 128} 181 do_test update-5.4.2 { 182 execsql {SELECT * FROM test1 WHERE f1==778 ORDER BY f1,f2} 183 } {778 128} 184 do_test update-5.4.3 { 185 execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2} 186 } {8 88 8 128 8 256 8 888} 187 do_test update-5.5 { 188 execsql {UPDATE test1 SET f1=f1-1 WHERE f1>100 and f2==128} 189 } {} 190 do_test update-5.5.1 { 191 execsql {SELECT * FROM test1 ORDER BY f1,f2} 192 } {6 64 8 88 8 128 8 256 8 888 9 512 10 1024 78 128 777 128} 193 do_test update-5.5.2 { 194 execsql {SELECT * FROM test1 WHERE f1==78 ORDER BY f1,f2} 195 } {78 128} 196 do_test update-5.5.3 { 197 execsql {SELECT * FROM test1 WHERE f1==778 ORDER BY f1,f2} 198 } {} 199 do_test update-5.5.4 { 200 execsql {SELECT * FROM test1 WHERE f1==777 ORDER BY f1,f2} 201 } {777 128} 202 do_test update-5.5.5 { 203 execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2} 204 } {8 88 8 128 8 256 8 888} 205 do_test update-5.6 { 206 execsql { 207 PRAGMA count_changes=on; 208 UPDATE test1 SET f1=f1-1 WHERE f1<=100 and f2==128; 209 } 210 } {2} 211 do_test update-5.6.1 { 212 execsql { 213 PRAGMA count_changes=off; 214 SELECT * FROM test1 ORDER BY f1,f2 215 } 216 } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128} 217 do_test update-5.6.2 { 218 execsql {SELECT * FROM test1 WHERE f1==77 ORDER BY f1,f2} 219 } {77 128} 220 do_test update-5.6.3 { 221 execsql {SELECT * FROM test1 WHERE f1==778 ORDER BY f1,f2} 222 } {} 223 do_test update-5.6.4 { 224 execsql {SELECT * FROM test1 WHERE f1==777 ORDER BY f1,f2} 225 } {777 128} 226 do_test update-5.6.5 { 227 execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2} 228 } {8 88 8 256 8 888} 229 230 # Repeat the previous sequence of tests with a different index. 231 # 232 execsql {PRAGMA synchronous=FULL} 233 do_test update-6.0 { 234 execsql {DROP INDEX idx1} 235 execsql {CREATE INDEX idx1 ON test1(f2)} 236 execsql {SELECT * FROM test1 ORDER BY f1,f2} 237 } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128} 238 do_test update-6.1 { 239 execsql {UPDATE test1 SET f2=f2+1 WHERE f1==8} 240 execsql {SELECT * FROM test1 ORDER BY f1,f2} 241 } {6 64 7 128 8 89 8 257 8 889 9 512 10 1024 77 128 777 128} 242 do_test update-6.1.1 { 243 execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2} 244 } {8 89 8 257 8 889} 245 do_test update-6.1.2 { 246 execsql {SELECT * FROM test1 WHERE f2==89 ORDER BY f1,f2} 247 } {8 89} 248 do_test update-6.1.3 { 249 execsql {SELECT * FROM test1 WHERE f1==88 ORDER BY f1,f2} 250 } {} 251 do_test update-6.2 { 252 execsql {UPDATE test1 SET f2=f2-1 WHERE f1==8 and f2>800} 253 execsql {SELECT * FROM test1 ORDER BY f1,f2} 254 } {6 64 7 128 8 89 8 257 8 888 9 512 10 1024 77 128 777 128} 255 do_test update-6.3 { 256 execsql {UPDATE test1 SET f2=f2-1 WHERE f1==8 and f2<800} 257 execsql {SELECT * FROM test1 ORDER BY f1,f2} 258 } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128} 259 do_test update-6.3.1 { 260 execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2} 261 } {8 88 8 256 8 888} 262 do_test update-6.3.2 { 263 execsql {SELECT * FROM test1 WHERE f2==89 ORDER BY f1,f2} 264 } {} 265 do_test update-6.3.3 { 266 execsql {SELECT * FROM test1 WHERE f2==88 ORDER BY f1,f2} 267 } {8 88} 268 do_test update-6.4 { 269 execsql {UPDATE test1 SET f1=f1+1 WHERE f2==128} 270 execsql {SELECT * FROM test1 ORDER BY f1,f2} 271 } {6 64 8 88 8 128 8 256 8 888 9 512 10 1024 78 128 778 128} 272 do_test update-6.4.1 { 273 execsql {SELECT * FROM test1 WHERE f1==78 ORDER BY f1,f2} 274 } {78 128} 275 do_test update-6.4.2 { 276 execsql {SELECT * FROM test1 WHERE f1==778 ORDER BY f1,f2} 277 } {778 128} 278 do_test update-6.4.3 { 279 execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2} 280 } {8 88 8 128 8 256 8 888} 281 do_test update-6.5 { 282 execsql {UPDATE test1 SET f1=f1-1 WHERE f1>100 and f2==128} 283 execsql {SELECT * FROM test1 ORDER BY f1,f2} 284 } {6 64 8 88 8 128 8 256 8 888 9 512 10 1024 78 128 777 128} 285 do_test update-6.5.1 { 286 execsql {SELECT * FROM test1 WHERE f1==78 ORDER BY f1,f2} 287 } {78 128} 288 do_test update-6.5.2 { 289 execsql {SELECT * FROM test1 WHERE f1==778 ORDER BY f1,f2} 290 } {} 291 do_test update-6.5.3 { 292 execsql {SELECT * FROM test1 WHERE f1==777 ORDER BY f1,f2} 293 } {777 128} 294 do_test update-6.5.4 { 295 execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2} 296 } {8 88 8 128 8 256 8 888} 297 do_test update-6.6 { 298 execsql {UPDATE test1 SET f1=f1-1 WHERE f1<=100 and f2==128} 299 execsql {SELECT * FROM test1 ORDER BY f1,f2} 300 } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128} 301 do_test update-6.6.1 { 302 execsql {SELECT * FROM test1 WHERE f1==77 ORDER BY f1,f2} 303 } {77 128} 304 do_test update-6.6.2 { 305 execsql {SELECT * FROM test1 WHERE f1==778 ORDER BY f1,f2} 306 } {} 307 do_test update-6.6.3 { 308 execsql {SELECT * FROM test1 WHERE f1==777 ORDER BY f1,f2} 309 } {777 128} 310 do_test update-6.6.4 { 311 execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2} 312 } {8 88 8 256 8 888} 313 314 # Repeat the previous sequence of tests with multiple 315 # indices 316 # 317 do_test update-7.0 { 318 execsql {CREATE INDEX idx2 ON test1(f2)} 319 execsql {CREATE INDEX idx3 ON test1(f1,f2)} 320 execsql {SELECT * FROM test1 ORDER BY f1,f2} 321 } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128} 322 do_test update-7.1 { 323 execsql {UPDATE test1 SET f2=f2+1 WHERE f1==8} 324 execsql {SELECT * FROM test1 ORDER BY f1,f2} 325 } {6 64 7 128 8 89 8 257 8 889 9 512 10 1024 77 128 777 128} 326 do_test update-7.1.1 { 327 execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2} 328 } {8 89 8 257 8 889} 329 do_test update-7.1.2 { 330 execsql {SELECT * FROM test1 WHERE f2==89 ORDER BY f1,f2} 331 } {8 89} 332 do_test update-7.1.3 { 333 execsql {SELECT * FROM test1 WHERE f1==88 ORDER BY f1,f2} 334 } {} 335 do_test update-7.2 { 336 execsql {UPDATE test1 SET f2=f2-1 WHERE f1==8 and f2>800} 337 execsql {SELECT * FROM test1 ORDER BY f1,f2} 338 } {6 64 7 128 8 89 8 257 8 888 9 512 10 1024 77 128 777 128} 339 do_test update-7.3 { 340 # explain {UPDATE test1 SET f2=f2-1 WHERE f1==8 and F2<300} 341 execsql {UPDATE test1 SET f2=f2-1 WHERE f1==8 and f2<800} 342 execsql {SELECT * FROM test1 ORDER BY f1,f2} 343 } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128} 344 do_test update-7.3.1 { 345 execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2} 346 } {8 88 8 256 8 888} 347 do_test update-7.3.2 { 348 execsql {SELECT * FROM test1 WHERE f2==89 ORDER BY f1,f2} 349 } {} 350 do_test update-7.3.3 { 351 execsql {SELECT * FROM test1 WHERE f2==88 ORDER BY f1,f2} 352 } {8 88} 353 do_test update-7.4 { 354 execsql {UPDATE test1 SET f1=f1+1 WHERE f2==128} 355 execsql {SELECT * FROM test1 ORDER BY f1,f2} 356 } {6 64 8 88 8 128 8 256 8 888 9 512 10 1024 78 128 778 128} 357 do_test update-7.4.1 { 358 execsql {SELECT * FROM test1 WHERE f1==78 ORDER BY f1,f2} 359 } {78 128} 360 do_test update-7.4.2 { 361 execsql {SELECT * FROM test1 WHERE f1==778 ORDER BY f1,f2} 362 } {778 128} 363 do_test update-7.4.3 { 364 execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2} 365 } {8 88 8 128 8 256 8 888} 366 do_test update-7.5 { 367 execsql {UPDATE test1 SET f1=f1-1 WHERE f1>100 and f2==128} 368 execsql {SELECT * FROM test1 ORDER BY f1,f2} 369 } {6 64 8 88 8 128 8 256 8 888 9 512 10 1024 78 128 777 128} 370 do_test update-7.5.1 { 371 execsql {SELECT * FROM test1 WHERE f1==78 ORDER BY f1,f2} 372 } {78 128} 373 do_test update-7.5.2 { 374 execsql {SELECT * FROM test1 WHERE f1==778 ORDER BY f1,f2} 375 } {} 376 do_test update-7.5.3 { 377 execsql {SELECT * FROM test1 WHERE f1==777 ORDER BY f1,f2} 378 } {777 128} 379 do_test update-7.5.4 { 380 execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2} 381 } {8 88 8 128 8 256 8 888} 382 do_test update-7.6 { 383 execsql {UPDATE test1 SET f1=f1-1 WHERE f1<=100 and f2==128} 384 execsql {SELECT * FROM test1 ORDER BY f1,f2} 385 } {6 64 7 128 8 88 8 256 8 888 9 512 10 1024 77 128 777 128} 386 do_test update-7.6.1 { 387 execsql {SELECT * FROM test1 WHERE f1==77 ORDER BY f1,f2} 388 } {77 128} 389 do_test update-7.6.2 { 390 execsql {SELECT * FROM test1 WHERE f1==778 ORDER BY f1,f2} 391 } {} 392 do_test update-7.6.3 { 393 execsql {SELECT * FROM test1 WHERE f1==777 ORDER BY f1,f2} 394 } {777 128} 395 do_test update-7.6.4 { 396 execsql {SELECT * FROM test1 WHERE f1==8 ORDER BY f1,f2} 397 } {8 88 8 256 8 888} 398 399 # Error messages 400 # 401 do_test update-9.1 { 402 set v [catch {execsql { 403 UPDATE test1 SET x=11 WHERE f1=1025 404 }} msg] 405 lappend v $msg 406 } {1 {no such column: x}} 407 do_test update-9.2 { 408 set v [catch {execsql { 409 UPDATE test1 SET f1=x(11) WHERE f1=1025 410 }} msg] 411 lappend v $msg 412 } {1 {no such function: x}} 413 do_test update-9.3 { 414 set v [catch {execsql { 415 UPDATE test1 SET f1=11 WHERE x=1025 416 }} msg] 417 lappend v $msg 418 } {1 {no such column: x}} 419 do_test update-9.4 { 420 set v [catch {execsql { 421 UPDATE test1 SET f1=11 WHERE x(f1)=1025 422 }} msg] 423 lappend v $msg 424 } {1 {no such function: x}} 425 426 # Try doing updates on a unique column where the value does not 427 # really change. 428 # 429 do_test update-10.1 { 430 execsql { 431 DROP TABLE test1; 432 CREATE TABLE t1( 433 a integer primary key, 434 b UNIQUE, 435 c, d, 436 e, f, 437 UNIQUE(c,d) 438 ); 439 INSERT INTO t1 VALUES(1,2,3,4,5,6); 440 INSERT INTO t1 VALUES(2,3,4,4,6,7); 441 SELECT * FROM t1 442 } 443 } {1 2 3 4 5 6 2 3 4 4 6 7} 444 do_test update-10.2 { 445 catchsql { 446 UPDATE t1 SET a=1, e=9 WHERE f=6; 447 SELECT * FROM t1; 448 } 449 } {0 {1 2 3 4 9 6 2 3 4 4 6 7}} 450 do_test update-10.3 { 451 catchsql { 452 UPDATE t1 SET a=1, e=10 WHERE f=7; 453 SELECT * FROM t1; 454 } 455 } {1 {PRIMARY KEY must be unique}} 456 do_test update-10.4 { 457 catchsql { 458 SELECT * FROM t1; 459 } 460 } {0 {1 2 3 4 9 6 2 3 4 4 6 7}} 461 do_test update-10.5 { 462 catchsql { 463 UPDATE t1 SET b=2, e=11 WHERE f=6; 464 SELECT * FROM t1; 465 } 466 } {0 {1 2 3 4 11 6 2 3 4 4 6 7}} 467 do_test update-10.6 { 468 catchsql { 469 UPDATE t1 SET b=2, e=12 WHERE f=7; 470 SELECT * FROM t1; 471 } 472 } {1 {column b is not unique}} 473 do_test update-10.7 { 474 catchsql { 475 SELECT * FROM t1; 476 } 477 } {0 {1 2 3 4 11 6 2 3 4 4 6 7}} 478 do_test update-10.8 { 479 catchsql { 480 UPDATE t1 SET c=3, d=4, e=13 WHERE f=6; 481 SELECT * FROM t1; 482 } 483 } {0 {1 2 3 4 13 6 2 3 4 4 6 7}} 484 do_test update-10.9 { 485 catchsql { 486 UPDATE t1 SET c=3, d=4, e=14 WHERE f=7; 487 SELECT * FROM t1; 488 } 489 } {1 {columns c, d are not unique}} 490 do_test update-10.10 { 491 catchsql { 492 SELECT * FROM t1; 493 } 494 } {0 {1 2 3 4 13 6 2 3 4 4 6 7}} 495 496 # Make sure we can handle a subquery in the where clause. 497 # 498 ifcapable subquery { 499 do_test update-11.1 { 500 execsql { 501 UPDATE t1 SET e=e+1 WHERE b IN (SELECT b FROM t1); 502 SELECT b,e FROM t1; 503 } 504 } {2 14 3 7} 505 do_test update-11.2 { 506 execsql { 507 UPDATE t1 SET e=e+1 WHERE a IN (SELECT a FROM t1); 508 SELECT a,e FROM t1; 509 } 510 } {1 15 2 8} 511 } 512 513 integrity_check update-12.1 514 515 # Ticket 602. Updates should occur in the same order as the records 516 # were discovered in the WHERE clause. 517 # 518 do_test update-13.1 { 519 execsql { 520 BEGIN; 521 CREATE TABLE t2(a); 522 INSERT INTO t2 VALUES(1); 523 INSERT INTO t2 VALUES(2); 524 INSERT INTO t2 SELECT a+2 FROM t2; 525 INSERT INTO t2 SELECT a+4 FROM t2; 526 INSERT INTO t2 SELECT a+8 FROM t2; 527 INSERT INTO t2 SELECT a+16 FROM t2; 528 INSERT INTO t2 SELECT a+32 FROM t2; 529 INSERT INTO t2 SELECT a+64 FROM t2; 530 INSERT INTO t2 SELECT a+128 FROM t2; 531 INSERT INTO t2 SELECT a+256 FROM t2; 532 INSERT INTO t2 SELECT a+512 FROM t2; 533 INSERT INTO t2 SELECT a+1024 FROM t2; 534 COMMIT; 535 SELECT count(*) FROM t2; 536 } 537 } {2048} 538 do_test update-13.2 { 539 execsql { 540 SELECT count(*) FROM t2 WHERE a=rowid; 541 } 542 } {2048} 543 do_test update-13.3 { 544 execsql { 545 UPDATE t2 SET rowid=rowid-1; 546 SELECT count(*) FROM t2 WHERE a=rowid+1; 547 } 548 } {2048} 549 do_test update-13.3 { 550 execsql { 551 UPDATE t2 SET rowid=rowid+10000; 552 UPDATE t2 SET rowid=rowid-9999; 553 SELECT count(*) FROM t2 WHERE a=rowid; 554 } 555 } {2048} 556 do_test update-13.4 { 557 execsql { 558 BEGIN; 559 INSERT INTO t2 SELECT a+2048 FROM t2; 560 INSERT INTO t2 SELECT a+4096 FROM t2; 561 INSERT INTO t2 SELECT a+8192 FROM t2; 562 SELECT count(*) FROM t2 WHERE a=rowid; 563 COMMIT; 564 } 565 } 16384 566 do_test update-13.5 { 567 execsql { 568 UPDATE t2 SET rowid=rowid-1; 569 SELECT count(*) FROM t2 WHERE a=rowid+1; 570 } 571 } 16384 572 573 integrity_check update-13.6 574 575 ifcapable {trigger} { 576 # Test for proper detection of malformed WHEN clauses on UPDATE triggers. 577 # 578 do_test update-14.1 { 579 execsql { 580 CREATE TABLE t3(a,b,c); 581 CREATE TRIGGER t3r1 BEFORE UPDATE on t3 WHEN nosuchcol BEGIN 582 SELECT 'illegal WHEN clause'; 583 END; 584 } 585 } {} 586 do_test update-14.2 { 587 catchsql { 588 UPDATE t3 SET a=1; 589 } 590 } {1 {no such column: nosuchcol}} 591 do_test update-14.3 { 592 execsql { 593 CREATE TABLE t4(a,b,c); 594 CREATE TRIGGER t4r1 AFTER UPDATE on t4 WHEN nosuchcol BEGIN 595 SELECT 'illegal WHEN clause'; 596 END; 597 } 598 } {} 599 do_test update-14.4 { 600 catchsql { 601 UPDATE t4 SET a=1; 602 } 603 } {1 {no such column: nosuchcol}} 604 605 } ;# ifcapable {trigger} 606 607 608 finish_test 609