Home | History | Annotate | Download | only in test
      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