/ Hex Artifact Content
Login

Artifact 81772e5c9b93d1006d66d65e9a1327281bdec4e8:


0000: 23 20 32 30 31 37 20 4a 61 6e 75 61 72 79 20 39  # 2017 January 9
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n you give..#.#*
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74 65  ******.#..set te
0170: 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e  stdir [file dirn
0180: 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72  ame $argv0].sour
0190: 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74  ce $testdir/test
01a0: 65 72 2e 74 63 6c 0a 73 65 74 20 74 65 73 74 70  er.tcl.set testp
01b0: 72 65 66 69 78 20 75 70 64 61 74 65 32 0a 0a 64  refix update2..d
01c0: 62 20 66 75 6e 63 20 72 65 70 65 61 74 20 5b 6c  b func repeat [l
01d0: 69 73 74 20 73 74 72 69 6e 67 20 72 65 70 65 61  ist string repea
01e0: 74 5d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t]..#-----------
01f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
0230: 20 31 2e 31 2e 2a 20 41 20 6f 6e 65 2d 70 61 73   1.1.* A one-pas
0240: 73 20 55 50 44 41 54 45 20 74 68 61 74 20 64 6f  s UPDATE that do
0250: 65 73 20 62 61 6c 61 6e 63 65 28 29 20 6f 70 65  es balance() ope
0260: 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 49  rations on the I
0270: 50 4b 20 69 6e 64 65 78 0a 23 20 20 20 20 20 20  PK index.#      
0280: 20 74 68 61 74 20 69 74 20 69 73 20 73 63 61 6e   that it is scan
0290: 6e 69 6e 67 2e 0a 23 0a 23 20 31 2e 32 2e 2a 20  ning..#.# 1.2.* 
02a0: 53 61 6d 65 20 61 67 61 69 6e 2c 20 62 75 74 20  Same again, but 
02b0: 77 69 74 68 20 61 20 57 49 54 48 4f 55 54 20 52  with a WITHOUT R
02c0: 4f 57 49 44 20 74 61 62 6c 65 2e 0a 23 0a 73 65  OWID table..#.se
02d0: 74 20 6e 72 6f 77 20 5b 65 78 70 72 20 31 30 5d  t nrow [expr 10]
02e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
02f0: 20 31 2e 31 2e 30 20 7b 0a 20 20 43 52 45 41 54   1.1.0 {.  CREAT
0300: 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54  E TABLE t1(a INT
0310: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
0320: 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20 54  , b);.  CREATE T
0330: 41 42 4c 45 20 74 32 28 61 20 49 4e 54 45 47 45  ABLE t2(a INTEGE
0340: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
0350: 29 3b 0a 20 20 57 49 54 48 20 73 28 69 29 20 41  );.  WITH s(i) A
0360: 53 20 28 20 53 45 4c 45 43 54 20 30 20 55 4e 49  S ( SELECT 0 UNI
0370: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 69 2b  ON ALL SELECT i+
0380: 31 20 46 52 4f 4d 20 73 20 57 48 45 52 45 20 69  1 FROM s WHERE i
0390: 3c 24 6e 72 6f 77 20 29 0a 20 20 49 4e 53 45 52  <$nrow ).  INSER
03a0: 54 20 49 4e 54 4f 20 74 31 28 62 29 20 53 45 4c  T INTO t1(b) SEL
03b0: 45 43 54 20 63 68 61 72 28 28 69 20 25 20 32 36  ECT char((i % 26
03c0: 29 20 2b 20 36 35 29 20 46 52 4f 4d 20 73 3b 0a  ) + 65) FROM s;.
03d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
03e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
03f0: 31 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  1;.}..do_execsql
0400: 5f 74 65 73 74 20 31 2e 31 2e 31 20 7b 0a 20 20  _test 1.1.1 {.  
0410: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 20  UPDATE t1 SET b 
0420: 3d 20 72 65 70 65 61 74 28 62 2c 20 31 30 30 29  = repeat(b, 100)
0430: 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .}..do_execsql_t
0440: 65 73 74 20 31 2e 31 2e 32 20 7b 0a 20 20 53 45  est 1.1.2 {.  SE
0450: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
0460: 7d 20 5b 64 62 20 65 76 61 6c 20 7b 20 53 45 4c  } [db eval { SEL
0470: 45 43 54 20 61 2c 20 72 65 70 65 61 74 28 62 2c  ECT a, repeat(b,
0480: 20 31 30 30 29 20 46 52 4f 4d 20 74 32 20 7d 5d   100) FROM t2 }]
0490: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
04a0: 74 20 31 2e 32 2e 30 20 7b 0a 20 20 44 52 4f 50  t 1.2.0 {.  DROP
04b0: 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 43 52 45   TABLE t1;.  CRE
04c0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49  ATE TABLE t1(a I
04d0: 4e 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  NT PRIMARY KEY, 
04e0: 62 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  b) WITHOUT ROWID
04f0: 3b 0a 20 20 57 49 54 48 20 73 28 69 29 20 41 53  ;.  WITH s(i) AS
0500: 20 28 20 53 45 4c 45 43 54 20 30 20 55 4e 49 4f   ( SELECT 0 UNIO
0510: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 69 2b 31  N ALL SELECT i+1
0520: 20 46 52 4f 4d 20 73 20 57 48 45 52 45 20 69 3c   FROM s WHERE i<
0530: 24 6e 72 6f 77 20 29 0a 20 20 49 4e 53 45 52 54  $nrow ).  INSERT
0540: 20 49 4e 54 4f 20 74 31 28 61 2c 20 62 29 20 53   INTO t1(a, b) S
0550: 45 4c 45 43 54 20 69 2b 31 2c 20 63 68 61 72 28  ELECT i+1, char(
0560: 28 69 20 25 20 32 36 29 20 2b 20 36 35 29 20 46  (i % 26) + 65) F
0570: 52 4f 4d 20 73 3b 0a 7d 0a 0a 23 65 78 70 6c 61  ROM s;.}..#expla
0580: 69 6e 5f 69 20 7b 20 55 50 44 41 54 45 20 74 31  in_i { UPDATE t1
0590: 20 53 45 54 20 62 20 3d 20 72 65 70 65 61 74 28   SET b = repeat(
05a0: 62 2c 20 31 30 30 29 20 7d 0a 64 6f 5f 65 78 65  b, 100) }.do_exe
05b0: 63 73 71 6c 5f 74 65 73 74 20 31 2e 32 2e 31 20  csql_test 1.2.1 
05c0: 7b 0a 20 20 55 50 44 41 54 45 20 74 31 20 53 45  {.  UPDATE t1 SE
05d0: 54 20 62 20 3d 20 72 65 70 65 61 74 28 62 2c 20  T b = repeat(b, 
05e0: 31 30 30 29 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73  100).}..do_execs
05f0: 71 6c 5f 74 65 73 74 20 31 2e 32 2e 32 20 7b 0a  ql_test 1.2.2 {.
0600: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0610: 74 31 3b 0a 7d 20 5b 64 62 20 65 76 61 6c 20 7b  t1;.} [db eval {
0620: 20 53 45 4c 45 43 54 20 61 2c 20 72 65 70 65 61   SELECT a, repea
0630: 74 28 62 2c 20 31 30 30 29 20 46 52 4f 4d 20 74  t(b, 100) FROM t
0640: 32 20 7d 5d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  2 }]...#--------
0650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0690: 2d 0a 23 20 41 20 6f 6e 65 2d 70 61 73 73 20 55  -.# A one-pass U
06a0: 50 44 41 54 45 20 74 68 61 74 20 64 6f 65 73 20  PDATE that does 
06b0: 62 61 6c 61 6e 63 65 28 29 20 6f 70 65 72 61 74  balance() operat
06c0: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 49 50 4b 20  ions on the IPK 
06d0: 69 6e 64 65 78 0a 23 20 74 68 61 74 20 69 74 20  index.# that it 
06e0: 69 73 20 73 63 61 6e 6e 69 6e 67 2e 0a 23 0a 64  is scanning..#.d
06f0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
0700: 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .1 {.  CREATE TA
0710: 42 4c 45 20 74 33 28 61 20 50 52 49 4d 41 52 59  BLE t3(a PRIMARY
0720: 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a 20 20 43   KEY, b, c);.  C
0730: 52 45 41 54 45 20 49 4e 44 45 58 20 74 33 69 20  REATE INDEX t3i 
0740: 4f 4e 20 74 33 28 62 29 3b 0a 7d 20 7b 7d 0a 64  ON t3(b);.} {}.d
0750: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
0760: 2e 32 20 7b 20 55 50 44 41 54 45 20 74 33 20 53  .2 { UPDATE t3 S
0770: 45 54 20 63 3d 31 20 57 48 45 52 45 20 62 3d 3f  ET c=1 WHERE b=?
0780: 20 20 20 20 20 20 7d 20 7b 7d 0a 64 6f 5f 65 78        } {}.do_ex
0790: 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 33 20 7b  ecsql_test 2.3 {
07a0: 20 55 50 44 41 54 45 20 74 33 20 53 45 54 20 63   UPDATE t3 SET c
07b0: 3d 31 20 57 48 45 52 45 20 72 6f 77 69 64 3d 3f  =1 WHERE rowid=?
07c0: 20 20 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d    } {}..#-------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0810: 2d 2d 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  --.#.do_execsql_
0820: 74 65 73 74 20 33 2e 30 20 7b 0a 20 20 43 52 45  test 3.0 {.  CRE
0830: 41 54 45 20 54 41 42 4c 45 20 74 34 28 61 20 50  ATE TABLE t4(a P
0840: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63  RIMARY KEY, b, c
0850: 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b  ) WITHOUT ROWID;
0860: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
0870: 74 34 63 20 4f 4e 20 74 34 28 63 29 3b 0a 20 20  t4c ON t4(c);.  
0880: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
0890: 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a  ALUES(1, 2, 3);.
08a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34    INSERT INTO t4
08b0: 20 56 41 4c 55 45 53 28 32 2c 20 33 2c 20 34 29   VALUES(2, 3, 4)
08c0: 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ;.}..do_execsql_
08d0: 74 65 73 74 20 33 2e 31 20 7b 0a 20 20 55 50 44  test 3.1 {.  UPD
08e0: 41 54 45 20 74 34 20 53 45 54 20 63 3d 63 2b 32  ATE t4 SET c=c+2
08f0: 20 57 48 45 52 45 20 63 3e 32 3b 0a 20 20 53 45   WHERE c>2;.  SE
0900: 4c 45 43 54 20 61 2c 20 63 20 46 52 4f 4d 20 74  LECT a, c FROM t
0910: 34 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 7d 20  4 ORDER BY a;.} 
0920: 7b 31 20 35 20 32 20 36 7d 0a 0a 23 2d 2d 2d 2d  {1 5 2 6}..#----
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0970: 2d 2d 2d 2d 2d 0a 23 0a 66 6f 72 65 61 63 68 20  -----.#.foreach 
0980: 7b 74 6e 20 73 71 6c 7d 20 7b 0a 20 20 31 20 7b  {tn sql} {.  1 {
0990: 20 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42   .    CREATE TAB
09a0: 4c 45 20 62 31 28 61 20 49 4e 54 45 47 45 52 20  LE b1(a INTEGER 
09b0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20  PRIMARY KEY, b, 
09c0: 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  c);.    CREATE T
09d0: 41 42 4c 45 20 63 31 28 61 20 49 4e 54 45 47 45  ABLE c1(a INTEGE
09e0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
09f0: 2c 20 63 2c 20 64 29 0a 20 20 7d 0a 20 20 32 20  , c, d).  }.  2 
0a00: 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  { .    CREATE TA
0a10: 42 4c 45 20 62 31 28 61 20 49 4e 54 20 50 52 49  BLE b1(a INT PRI
0a20: 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29 20  MARY KEY, b, c) 
0a30: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 20  WITHOUT ROWID;. 
0a40: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0a50: 63 31 28 61 20 49 4e 54 20 50 52 49 4d 41 52 59  c1(a INT PRIMARY
0a60: 20 4b 45 59 2c 20 62 2c 20 63 2c 20 64 29 20 57   KEY, b, c, d) W
0a70: 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 20 20  ITHOUT ROWID;.  
0a80: 7d 0a 7d 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  }.} {.  execsql 
0a90: 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20  { DROP TABLE IF 
0aa0: 45 58 49 53 54 53 20 62 31 3b 20 44 52 4f 50 20  EXISTS b1; DROP 
0ab0: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
0ac0: 63 31 3b 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  c1; }.  execsql 
0ad0: 24 73 71 6c 0a 0a 20 20 64 6f 5f 65 78 65 63 73  $sql..  do_execs
0ae0: 71 6c 5f 74 65 73 74 20 34 2e 24 74 6e 2e 30 20  ql_test 4.$tn.0 
0af0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e 49  {.    CREATE UNI
0b00: 51 55 45 20 49 4e 44 45 58 20 62 31 63 20 4f 4e  QUE INDEX b1c ON
0b10: 20 62 31 28 63 29 3b 0a 20 20 20 20 49 4e 53 45   b1(c);.    INSE
0b20: 52 54 20 49 4e 54 4f 20 62 31 20 56 41 4c 55 45  RT INTO b1 VALUE
0b30: 53 28 31 2c 20 27 61 27 2c 20 31 29 3b 0a 20 20  S(1, 'a', 1);.  
0b40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 31    INSERT INTO b1
0b50: 20 56 41 4c 55 45 53 28 32 2c 20 27 62 27 2c 20   VALUES(2, 'b', 
0b60: 31 35 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  15);.    INSERT 
0b70: 49 4e 54 4f 20 62 31 20 56 41 4c 55 45 53 28 33  INTO b1 VALUES(3
0b80: 2c 20 27 63 27 2c 20 33 29 3b 0a 20 20 20 20 49  , 'c', 3);.    I
0b90: 4e 53 45 52 54 20 49 4e 54 4f 20 62 31 20 56 41  NSERT INTO b1 VA
0ba0: 4c 55 45 53 28 34 2c 20 27 64 27 2c 20 34 29 3b  LUES(4, 'd', 4);
0bb0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0bc0: 20 62 31 20 56 41 4c 55 45 53 28 35 2c 20 27 65   b1 VALUES(5, 'e
0bd0: 27 2c 20 35 29 3b 0a 20 20 20 20 49 4e 53 45 52  ', 5);.    INSER
0be0: 54 20 49 4e 54 4f 20 62 31 20 56 41 4c 55 45 53  T INTO b1 VALUES
0bf0: 28 36 2c 20 27 66 27 2c 20 36 29 3b 0a 20 20 20  (6, 'f', 6);.   
0c00: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 31 20   INSERT INTO b1 
0c10: 56 41 4c 55 45 53 28 37 2c 20 27 67 27 2c 20 37  VALUES(7, 'g', 7
0c20: 29 3b 0a 20 20 7d 0a 0a 20 20 64 6f 5f 65 78 65  );.  }..  do_exe
0c30: 63 73 71 6c 5f 74 65 73 74 20 34 2e 24 74 6e 2e  csql_test 4.$tn.
0c40: 31 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 4f  1 {.    UPDATE O
0c50: 52 20 52 45 50 4c 41 43 45 20 62 31 20 53 45 54  R REPLACE b1 SET
0c60: 20 63 3d 63 2b 31 30 20 57 48 45 52 45 20 61 20   c=c+10 WHERE a 
0c70: 42 45 54 57 45 45 4e 20 34 20 41 4e 44 20 37 3b  BETWEEN 4 AND 7;
0c80: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
0c90: 4f 4d 20 62 31 20 4f 52 44 45 52 20 42 59 20 61  OM b1 ORDER BY a
0ca0: 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 31 20 61 20  ;.  } {.    1 a 
0cb0: 31 0a 20 20 20 20 33 20 63 20 33 0a 20 20 20 20  1.    3 c 3.    
0cc0: 34 20 64 20 31 34 0a 20 20 20 20 35 20 65 20 31  4 d 14.    5 e 1
0cd0: 35 0a 20 20 20 20 36 20 66 20 31 36 0a 20 20 20  5.    6 f 16.   
0ce0: 20 37 20 67 20 31 37 0a 20 20 7d 0a 0a 20 20 64   7 g 17.  }..  d
0cf0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34  o_execsql_test 4
0d00: 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 43 52 45  .$tn.2 {.    CRE
0d10: 41 54 45 20 49 4e 44 45 58 20 63 31 64 20 4f 4e  ATE INDEX c1d ON
0d20: 20 63 31 28 64 2c 20 62 29 3b 0a 20 20 20 20 43   c1(d, b);.    C
0d30: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
0d40: 45 58 20 63 31 63 20 4f 4e 20 63 31 28 63 2c 20  EX c1c ON c1(c, 
0d50: 62 29 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20  b);..    INSERT 
0d60: 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 31  INTO c1 VALUES(1
0d70: 2c 20 27 61 27 2c 20 31 2c 20 20 31 29 3b 0a 20  , 'a', 1,  1);. 
0d80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
0d90: 31 20 56 41 4c 55 45 53 28 32 2c 20 27 61 27 2c  1 VALUES(2, 'a',
0da0: 20 31 35 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53   15, 2);.    INS
0db0: 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55  ERT INTO c1 VALU
0dc0: 45 53 28 33 2c 20 27 61 27 2c 20 33 2c 20 20 33  ES(3, 'a', 3,  3
0dd0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0de0: 54 4f 20 63 31 20 56 41 4c 55 45 53 28 34 2c 20  TO c1 VALUES(4, 
0df0: 27 61 27 2c 20 34 2c 20 20 34 29 3b 0a 20 20 20  'a', 4,  4);.   
0e00: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20   INSERT INTO c1 
0e10: 56 41 4c 55 45 53 28 35 2c 20 27 61 27 2c 20 35  VALUES(5, 'a', 5
0e20: 2c 20 20 35 29 3b 0a 20 20 20 20 49 4e 53 45 52  ,  5);.    INSER
0e30: 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53  T INTO c1 VALUES
0e40: 28 36 2c 20 27 61 27 2c 20 36 2c 20 20 36 29 3b  (6, 'a', 6,  6);
0e50: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0e60: 20 63 31 20 56 41 4c 55 45 53 28 37 2c 20 27 61   c1 VALUES(7, 'a
0e70: 27 2c 20 37 2c 20 20 37 29 3b 0a 20 20 7d 0a 0a  ', 7,  7);.  }..
0e80: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
0e90: 74 20 34 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20  t 4.$tn.3 {.    
0ea0: 55 50 44 41 54 45 20 4f 52 20 52 45 50 4c 41 43  UPDATE OR REPLAC
0eb0: 45 20 63 31 20 53 45 54 20 63 3d 63 2b 31 30 20  E c1 SET c=c+10 
0ec0: 57 48 45 52 45 20 64 20 42 45 54 57 45 45 4e 20  WHERE d BETWEEN 
0ed0: 34 20 41 4e 44 20 37 3b 0a 20 20 20 20 53 45 4c  4 AND 7;.    SEL
0ee0: 45 43 54 20 2a 20 46 52 4f 4d 20 63 31 20 4f 52  ECT * FROM c1 OR
0ef0: 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 20 7b 0a  DER BY a;.  } {.
0f00: 20 20 20 20 31 20 61 20 31 20 31 0a 20 20 20 20      1 a 1 1.    
0f10: 33 20 61 20 33 20 33 0a 20 20 20 20 34 20 61 20  3 a 3 3.    4 a 
0f20: 31 34 20 34 0a 20 20 20 20 35 20 61 20 31 35 20  14 4.    5 a 15 
0f30: 35 0a 20 20 20 20 36 20 61 20 31 36 20 36 0a 20  5.    6 a 16 6. 
0f40: 20 20 20 37 20 61 20 31 37 20 37 0a 20 20 7d 0a     7 a 17 7.  }.
0f50: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
0f60: 73 74 20 34 2e 24 74 6e 2e 34 20 7b 20 50 52 41  st 4.$tn.4 { PRA
0f70: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
0f80: 65 63 6b 20 7d 20 6f 6b 0a 0a 20 20 64 6f 5f 65  eck } ok..  do_e
0f90: 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 24 74  xecsql_test 4.$t
0fa0: 6e 2e 35 20 7b 0a 20 20 20 20 44 52 4f 50 20 49  n.5 {.    DROP I
0fb0: 4e 44 45 58 20 63 31 64 3b 0a 20 20 20 20 44 52  NDEX c1d;.    DR
0fc0: 4f 50 20 49 4e 44 45 58 20 63 31 63 3b 0a 20 20  OP INDEX c1c;.  
0fd0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 31    DELETE FROM c1
0fe0: 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ;..    INSERT IN
0ff0: 54 4f 20 63 31 20 56 41 4c 55 45 53 28 31 2c 20  TO c1 VALUES(1, 
1000: 27 61 27 2c 20 31 2c 20 20 31 29 3b 0a 20 20 20  'a', 1,  1);.   
1010: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20   INSERT INTO c1 
1020: 56 41 4c 55 45 53 28 32 2c 20 27 61 27 2c 20 31  VALUES(2, 'a', 1
1030: 35 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  5, 2);.    INSER
1040: 54 20 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53  T INTO c1 VALUES
1050: 28 33 2c 20 27 61 27 2c 20 33 2c 20 20 33 29 3b  (3, 'a', 3,  3);
1060: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1070: 20 63 31 20 56 41 4c 55 45 53 28 34 2c 20 27 61   c1 VALUES(4, 'a
1080: 27 2c 20 34 2c 20 20 34 29 3b 0a 20 20 20 20 49  ', 4,  4);.    I
1090: 4e 53 45 52 54 20 49 4e 54 4f 20 63 31 20 56 41  NSERT INTO c1 VA
10a0: 4c 55 45 53 28 35 2c 20 27 61 27 2c 20 35 2c 20  LUES(5, 'a', 5, 
10b0: 20 35 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   5);.    INSERT 
10c0: 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 36  INTO c1 VALUES(6
10d0: 2c 20 27 61 27 2c 20 36 2c 20 20 36 29 3b 0a 20  , 'a', 6,  6);. 
10e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
10f0: 31 20 56 41 4c 55 45 53 28 37 2c 20 27 61 27 2c  1 VALUES(7, 'a',
1100: 20 37 2c 20 20 37 29 3b 0a 0a 20 20 20 20 43 52   7,  7);..    CR
1110: 45 41 54 45 20 49 4e 44 45 58 20 63 31 64 20 4f  EATE INDEX c1d O
1120: 4e 20 63 31 28 64 29 3b 0a 20 20 20 20 43 52 45  N c1(d);.    CRE
1130: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58  ATE UNIQUE INDEX
1140: 20 63 31 63 20 4f 4e 20 63 31 28 63 29 3b 0a 20   c1c ON c1(c);. 
1150: 20 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c   }..  do_execsql
1160: 5f 74 65 73 74 20 34 2e 24 74 6e 2e 36 20 7b 0a  _test 4.$tn.6 {.
1170: 20 20 20 20 55 50 44 41 54 45 20 4f 52 20 52 45      UPDATE OR RE
1180: 50 4c 41 43 45 20 63 31 20 53 45 54 20 63 3d 63  PLACE c1 SET c=c
1190: 2b 31 30 20 57 48 45 52 45 20 64 20 42 45 54 57  +10 WHERE d BETW
11a0: 45 45 4e 20 34 20 41 4e 44 20 37 3b 0a 20 20 20  EEN 4 AND 7;.   
11b0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63   SELECT * FROM c
11c0: 31 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20 20  1 ORDER BY a;.  
11d0: 7d 20 7b 0a 20 20 20 20 31 20 61 20 31 20 31 0a  } {.    1 a 1 1.
11e0: 20 20 20 20 33 20 61 20 33 20 33 0a 20 20 20 20      3 a 3 3.    
11f0: 34 20 61 20 31 34 20 34 0a 20 20 20 20 35 20 61  4 a 14 4.    5 a
1200: 20 31 35 20 35 0a 20 20 20 20 36 20 61 20 31 36   15 5.    6 a 16
1210: 20 36 0a 20 20 20 20 37 20 61 20 31 37 20 37 0a   6.    7 a 17 7.
1220: 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d    }.}..#--------
1230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1270: 2d 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  -.#.do_execsql_t
1280: 65 73 74 20 35 2e 30 20 7b 0a 20 20 43 52 45 41  est 5.0 {.  CREA
1290: 54 45 20 54 41 42 4c 45 20 78 31 28 61 20 49 4e  TE TABLE x1(a IN
12a0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
12b0: 59 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52 45 41  Y, b, c);.  CREA
12c0: 54 45 20 49 4e 44 45 58 20 78 31 63 20 4f 4e 20  TE INDEX x1c ON 
12d0: 78 31 28 62 2c 20 63 29 3b 0a 20 20 49 4e 53 45  x1(b, c);.  INSE
12e0: 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45  RT INTO x1 VALUE
12f0: 53 28 31 2c 20 27 61 27 2c 20 31 29 3b 0a 20 20  S(1, 'a', 1);.  
1300: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56  INSERT INTO x1 V
1310: 41 4c 55 45 53 28 32 2c 20 27 61 27 2c 20 32 29  ALUES(2, 'a', 2)
1320: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
1330: 78 31 20 56 41 4c 55 45 53 28 33 2c 20 27 61 27  x1 VALUES(3, 'a'
1340: 2c 20 33 29 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63  , 3);.}..do_exec
1350: 73 71 6c 5f 74 65 73 74 20 35 2e 31 2e 31 20 7b  sql_test 5.1.1 {
1360: 0a 20 20 55 50 44 41 54 45 20 78 31 20 53 45 54  .  UPDATE x1 SET
1370: 20 63 3d 63 2b 31 20 57 48 45 52 45 20 62 3d 27   c=c+1 WHERE b='
1380: 61 27 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  a';.}..do_execsq
1390: 6c 5f 74 65 73 74 20 35 2e 31 2e 32 20 7b 0a 20  l_test 5.1.2 {. 
13a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78   SELECT * FROM x
13b0: 31 3b 0a 7d 20 7b 31 20 61 20 32 20 32 20 61 20  1;.} {1 a 2 2 a 
13c0: 33 20 33 20 61 20 34 7d 0a 0a 64 6f 5f 74 65 73  3 3 a 4}..do_tes
13d0: 74 20 35 2e 32 20 7b 0a 20 20 63 61 74 63 68 20  t 5.2 {.  catch 
13e0: 7b 20 61 72 72 61 79 20 75 6e 73 65 74 20 41 20  { array unset A 
13f0: 7d 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 45 58  }.  db eval { EX
1400: 50 4c 41 49 4e 20 55 50 44 41 54 45 20 78 31 20  PLAIN UPDATE x1 
1410: 53 45 54 20 63 3d 63 2b 31 20 57 48 45 52 45 20  SET c=c+1 WHERE 
1420: 62 3d 27 61 27 20 7d 20 7b 20 69 6e 63 72 20 41  b='a' } { incr A
1430: 28 24 6f 70 63 6f 64 65 29 20 7d 0a 20 20 73 65  ($opcode) }.  se
1440: 74 20 41 28 4e 6f 74 45 78 69 73 74 73 29 0a 7d  t A(NotExists).}
1450: 20 7b 31 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65   {1}...finish_te
1460: 73 74 0a 0a                                      st..