/ Hex Artifact Content
Login

Artifact 0b2f88995832ea040ae8e83a1ad4afa99c00b85c779d213da73a95ea4113233e:


0000: 23 20 32 30 31 31 20 4d 61 72 63 68 20 30 37 0a  # 2011 March 07.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   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 0a 23 20 54 68 69 73 20 66 69 6c  *****.# This fil
0170: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67  e implements reg
0180: 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f  ression tests fo
0190: 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  r SQLite library
01a0: 2e 0a 23 0a 0a 69 66 20 7b 21 5b 69 6e 66 6f 20  ..#..if {![info 
01b0: 65 78 69 73 74 73 20 74 65 73 74 64 69 72 5d 7d  exists testdir]}
01c0: 20 7b 0a 20 20 73 65 74 20 74 65 73 74 64 69 72   {.  set testdir
01d0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c   [file join [fil
01e0: 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20  e dirname [info 
01f0: 73 63 72 69 70 74 5d 5d 20 2e 2e 20 2e 2e 20 74  script]] .. .. t
0200: 65 73 74 5d 0a 7d 20 0a 73 6f 75 72 63 65 20 5b  est].} .source [
0210: 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20  file join [file 
0220: 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63  dirname [info sc
0230: 72 69 70 74 5d 5d 20 73 65 73 73 69 6f 6e 5f 63  ript]] session_c
0240: 6f 6d 6d 6f 6e 2e 74 63 6c 5d 0a 73 6f 75 72 63  ommon.tcl].sourc
0250: 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65  e $testdir/teste
0260: 72 2e 74 63 6c 0a 69 66 63 61 70 61 62 6c 65 20  r.tcl.ifcapable 
0270: 21 73 65 73 73 69 6f 6e 20 7b 66 69 6e 69 73 68  !session {finish
0280: 5f 74 65 73 74 3b 20 72 65 74 75 72 6e 7d 0a 0a  _test; return}..
0290: 73 65 74 20 74 65 73 74 70 72 65 66 69 78 20 73  set testprefix s
02a0: 65 73 73 69 6f 6e 31 0a 0a 23 20 52 75 6e 20 61  ession1..# Run a
02b0: 6c 6c 20 74 65 73 74 73 20 69 6e 20 74 68 69 73  ll tests in this
02c0: 20 66 69 6c 65 20 74 77 69 63 65 2e 20 4f 6e 63   file twice. Onc
02d0: 65 20 77 69 74 68 20 22 57 49 54 48 4f 55 54 20  e with "WITHOUT 
02e0: 52 4f 57 49 44 22 2c 20 61 6e 64 20 6f 6e 63 65  ROWID", and once
02f0: 0a 23 20 77 69 74 68 20 72 65 67 75 6c 61 72 20  .# with regular 
0300: 72 6f 77 69 64 20 74 61 62 6c 65 73 2e 0a 23 0a  rowid tables..#.
0310: 66 6f 72 65 61 63 68 20 7b 74 6e 20 74 72 61 69  foreach {tn trai
0320: 6c 69 6e 67 7d 20 7b 0a 20 20 31 20 22 22 0a 20  ling} {.  1 "". 
0330: 20 32 20 22 20 57 49 54 48 4f 55 54 20 52 4f 57   2 " WITHOUT ROW
0340: 49 44 20 22 0a 7d 20 7b 0a 65 76 61 6c 20 5b 73  ID ".} {.eval [s
0350: 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20  tring map [list 
0360: 25 57 52 25 20 24 74 72 61 69 6c 69 6e 67 5d 20  %WR% $trailing] 
0370: 7b 0a 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72 63  {..db close.forc
0380: 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20  edelete test.db 
0390: 74 65 73 74 2e 64 62 32 0a 72 65 73 65 74 5f 64  test.db2.reset_d
03a0: 62 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  b..do_execsql_te
03b0: 73 74 20 24 74 6e 2e 31 2e 30 20 7b 0a 20 20 43  st $tn.1.0 {.  C
03c0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
03d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
03e0: 20 25 57 52 25 3b 0a 20 20 49 4e 53 45 52 54 20   %WR%;.  INSERT 
03f0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
0400: 61 62 63 27 2c 20 27 64 65 66 27 29 3b 0a 7d 0a  abc', 'def');.}.
0410: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
0420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
0460: 73 74 20 63 72 65 61 74 69 6e 67 2c 20 61 74 74  st creating, att
0470: 61 63 68 69 6e 67 20 74 61 62 6c 65 73 20 74 6f  aching tables to
0480: 20 61 6e 64 20 64 65 6c 65 74 69 6e 67 20 73 65   and deleting se
0490: 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73 2e 0a 23  ssion objects..#
04a0: 0a 64 6f 5f 74 65 73 74 20 24 74 6e 2e 31 2e 31  .do_test $tn.1.1
04b0: 20 7b 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   { sqlite3sessio
04c0: 6e 20 53 20 64 62 20 6d 61 69 6e 20 7d 20 7b 53  n S db main } {S
04d0: 7d 0a 64 6f 5f 74 65 73 74 20 24 74 6e 2e 31 2e  }.do_test $tn.1.
04e0: 32 20 7b 20 53 20 64 65 6c 65 74 65 20 7d 20 7b  2 { S delete } {
04f0: 7d 0a 64 6f 5f 74 65 73 74 20 24 74 6e 2e 31 2e  }.do_test $tn.1.
0500: 33 20 7b 20 73 71 6c 69 74 65 33 73 65 73 73 69  3 { sqlite3sessi
0510: 6f 6e 20 53 20 64 62 20 6d 61 69 6e 20 7d 20 7b  on S db main } {
0520: 53 7d 0a 64 6f 5f 74 65 73 74 20 24 74 6e 2e 31  S}.do_test $tn.1
0530: 2e 34 20 7b 20 53 20 61 74 74 61 63 68 20 74 31  .4 { S attach t1
0540: 20 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 24 74   } {}.do_test $t
0550: 6e 2e 31 2e 35 20 7b 20 53 20 64 65 6c 65 74 65  n.1.5 { S delete
0560: 20 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 24 74   } {}.do_test $t
0570: 6e 2e 31 2e 36 20 7b 20 73 71 6c 69 74 65 33 73  n.1.6 { sqlite3s
0580: 65 73 73 69 6f 6e 20 53 20 64 62 20 6d 61 69 6e  ession S db main
0590: 20 7d 20 7b 53 7d 0a 64 6f 5f 74 65 73 74 20 24   } {S}.do_test $
05a0: 74 6e 2e 31 2e 37 20 7b 20 53 20 61 74 74 61 63  tn.1.7 { S attac
05b0: 68 20 74 31 20 3b 20 53 20 61 74 74 61 63 68 20  h t1 ; S attach 
05c0: 74 32 20 3b 20 53 20 61 74 74 61 63 68 20 74 33  t2 ; S attach t3
05d0: 20 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 24 74   } {}.do_test $t
05e0: 6e 2e 31 2e 38 20 7b 20 53 20 61 74 74 61 63 68  n.1.8 { S attach
05f0: 20 74 31 20 3b 20 53 20 61 74 74 61 63 68 20 74   t1 ; S attach t
0600: 32 20 3b 20 53 20 61 74 74 61 63 68 20 74 33 20  2 ; S attach t3 
0610: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 24 74 6e  } {}.do_test $tn
0620: 2e 31 2e 39 20 7b 20 53 20 64 65 6c 65 74 65 20  .1.9 { S delete 
0630: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 24 74 6e  } {}.do_test $tn
0640: 2e 31 2e 31 30 20 7b 0a 20 20 73 71 6c 69 74 65  .1.10 {.  sqlite
0650: 33 73 65 73 73 69 6f 6e 20 53 20 64 62 20 6d 61  3session S db ma
0660: 69 6e 0a 20 20 53 20 61 74 74 61 63 68 20 74 31  in.  S attach t1
0670: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
0680: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0690: 45 53 28 27 67 68 69 27 2c 20 27 6a 6b 6c 27 29  ES('ghi', 'jkl')
06a0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
06b0: 24 74 6e 2e 31 2e 31 31 20 7b 20 53 20 64 65 6c  $tn.1.11 { S del
06c0: 65 74 65 20 7d 20 7b 7d 0a 69 66 20 7b 24 74 6e  ete } {}.if {$tn
06d0: 3d 3d 31 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74  ==1} {.  do_test
06e0: 20 24 74 6e 2e 31 2e 31 32 20 7b 0a 20 20 20 20   $tn.1.12 {.    
06f0: 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 20 53  sqlite3session S
0700: 20 64 62 20 6d 61 69 6e 0a 20 20 20 20 53 20 61   db main.    S a
0710: 74 74 61 63 68 20 74 31 0a 20 20 20 20 65 78 65  ttach t1.    exe
0720: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
0730: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 6d 6e  TO t1 VALUES('mn
0740: 6f 27 2c 20 27 70 71 72 27 29 20 7d 0a 20 20 20  o', 'pqr') }.   
0750: 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54   execsql { UPDAT
0760: 45 20 74 31 20 53 45 54 20 78 20 3d 20 31 31 31  E t1 SET x = 111
0770: 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 31   WHERE rowid = 1
0780: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
0790: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
07a0: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 32 20  WHERE rowid = 2 
07b0: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
07c0: 73 74 20 24 74 6e 2e 31 2e 31 33 20 7b 0a 20 20  st $tn.1.13 {.  
07d0: 20 20 53 20 63 68 61 6e 67 65 73 65 74 0a 20 20    S changeset.  
07e0: 20 20 53 20 64 65 6c 65 74 65 0a 20 20 7d 20 7b    S delete.  } {
07f0: 7d 0a 7d 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0840: 23 20 53 69 6d 70 6c 65 20 63 68 61 6e 67 65 73  # Simple changes
0850: 65 74 20 74 65 73 74 73 2e 20 41 6c 73 6f 20 74  et tests. Also t
0860: 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 63  est the sqlite3c
0870: 68 61 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 28  hangeset_invert(
0880: 29 20 0a 23 20 66 75 6e 63 74 69 6f 6e 2e 0a 23  ) .# function..#
0890: 0a 64 6f 5f 74 65 73 74 20 24 74 6e 2e 32 2e 31  .do_test $tn.2.1
08a0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
08b0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
08c0: 7d 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73 69  }.  sqlite3sessi
08d0: 6f 6e 20 53 20 64 62 20 6d 61 69 6e 0a 20 20 53  on S db main.  S
08e0: 20 61 74 74 61 63 68 20 74 31 0a 20 20 65 78 65   attach t1.  exe
08f0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
0900: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
0910: 27 53 75 6b 68 6f 74 68 61 69 27 29 20 7d 0a 20  'Sukhothai') }. 
0920: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
0930: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0940: 28 32 2c 20 27 41 79 75 74 74 68 61 79 61 27 29  (2, 'Ayutthaya')
0950: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49   }.  execsql { I
0960: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0970: 4c 55 45 53 28 33 2c 20 27 54 68 6f 6e 62 75 72  LUES(3, 'Thonbur
0980: 69 27 29 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 63 68  i') }.} {}.do_ch
0990: 61 6e 67 65 73 65 74 5f 74 65 73 74 20 24 74 6e  angeset_test $tn
09a0: 2e 32 2e 31 2e 32 20 53 20 7b 0a 20 20 7b 49 4e  .2.1.2 S {.  {IN
09b0: 53 45 52 54 20 74 31 20 30 20 58 2e 20 7b 7d 20  SERT t1 0 X. {} 
09c0: 7b 69 20 31 20 74 20 53 75 6b 68 6f 74 68 61 69  {i 1 t Sukhothai
09d0: 7d 7d 0a 20 20 7b 49 4e 53 45 52 54 20 74 31 20  }}.  {INSERT t1 
09e0: 30 20 58 2e 20 7b 7d 20 7b 69 20 32 20 74 20 41  0 X. {} {i 2 t A
09f0: 79 75 74 74 68 61 79 61 7d 7d 0a 20 20 7b 49 4e  yutthaya}}.  {IN
0a00: 53 45 52 54 20 74 31 20 30 20 58 2e 20 7b 7d 20  SERT t1 0 X. {} 
0a10: 7b 69 20 33 20 74 20 54 68 6f 6e 62 75 72 69 7d  {i 3 t Thonburi}
0a20: 7d 0a 7d 0a 64 6f 5f 63 68 61 6e 67 65 73 65 74  }.}.do_changeset
0a30: 5f 69 6e 76 65 72 74 5f 74 65 73 74 20 24 74 6e  _invert_test $tn
0a40: 2e 32 2e 31 2e 33 20 53 20 7b 0a 20 20 7b 44 45  .2.1.3 S {.  {DE
0a50: 4c 45 54 45 20 74 31 20 30 20 58 2e 20 7b 69 20  LETE t1 0 X. {i 
0a60: 31 20 74 20 53 75 6b 68 6f 74 68 61 69 7d 20 7b  1 t Sukhothai} {
0a70: 7d 7d 0a 20 20 7b 44 45 4c 45 54 45 20 74 31 20  }}.  {DELETE t1 
0a80: 30 20 58 2e 20 7b 69 20 32 20 74 20 41 79 75 74  0 X. {i 2 t Ayut
0a90: 74 68 61 79 61 7d 20 7b 7d 7d 0a 20 20 7b 44 45  thaya} {}}.  {DE
0aa0: 4c 45 54 45 20 74 31 20 30 20 58 2e 20 7b 69 20  LETE t1 0 X. {i 
0ab0: 33 20 74 20 54 68 6f 6e 62 75 72 69 7d 20 7b 7d  3 t Thonburi} {}
0ac0: 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 24 74 6e 2e  }.}.do_test $tn.
0ad0: 32 2e 31 2e 34 20 7b 20 53 20 64 65 6c 65 74 65  2.1.4 { S delete
0ae0: 20 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 24   } {}..do_test $
0af0: 74 6e 2e 32 2e 32 2e 31 20 7b 0a 20 20 73 71 6c  tn.2.2.1 {.  sql
0b00: 69 74 65 33 73 65 73 73 69 6f 6e 20 53 20 64 62  ite3session S db
0b10: 20 6d 61 69 6e 0a 20 20 53 20 61 74 74 61 63 68   main.  S attach
0b20: 20 74 31 0a 20 20 65 78 65 63 73 71 6c 20 7b 20   t1.  execsql { 
0b30: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
0b40: 48 45 52 45 20 31 20 7d 0a 7d 20 7b 7d 0a 64 6f  HERE 1 }.} {}.do
0b50: 5f 63 68 61 6e 67 65 73 65 74 5f 74 65 73 74 20  _changeset_test 
0b60: 24 74 6e 2e 32 2e 32 2e 32 20 53 20 7b 0a 20 20  $tn.2.2.2 S {.  
0b70: 7b 44 45 4c 45 54 45 20 74 31 20 30 20 58 2e 20  {DELETE t1 0 X. 
0b80: 7b 69 20 31 20 74 20 53 75 6b 68 6f 74 68 61 69  {i 1 t Sukhothai
0b90: 7d 20 7b 7d 7d 0a 20 20 7b 44 45 4c 45 54 45 20  } {}}.  {DELETE 
0ba0: 74 31 20 30 20 58 2e 20 7b 69 20 32 20 74 20 41  t1 0 X. {i 2 t A
0bb0: 79 75 74 74 68 61 79 61 7d 20 7b 7d 7d 0a 20 20  yutthaya} {}}.  
0bc0: 7b 44 45 4c 45 54 45 20 74 31 20 30 20 58 2e 20  {DELETE t1 0 X. 
0bd0: 7b 69 20 33 20 74 20 54 68 6f 6e 62 75 72 69 7d  {i 3 t Thonburi}
0be0: 20 7b 7d 7d 0a 7d 0a 64 6f 5f 63 68 61 6e 67 65   {}}.}.do_change
0bf0: 73 65 74 5f 69 6e 76 65 72 74 5f 74 65 73 74 20  set_invert_test 
0c00: 24 74 6e 2e 32 2e 32 2e 33 20 53 20 7b 0a 20 20  $tn.2.2.3 S {.  
0c10: 7b 49 4e 53 45 52 54 20 74 31 20 30 20 58 2e 20  {INSERT t1 0 X. 
0c20: 7b 7d 20 7b 69 20 31 20 74 20 53 75 6b 68 6f 74  {} {i 1 t Sukhot
0c30: 68 61 69 7d 7d 0a 20 20 7b 49 4e 53 45 52 54 20  hai}}.  {INSERT 
0c40: 74 31 20 30 20 58 2e 20 7b 7d 20 7b 69 20 32 20  t1 0 X. {} {i 2 
0c50: 74 20 41 79 75 74 74 68 61 79 61 7d 7d 0a 20 20  t Ayutthaya}}.  
0c60: 7b 49 4e 53 45 52 54 20 74 31 20 30 20 58 2e 20  {INSERT t1 0 X. 
0c70: 7b 7d 20 7b 69 20 33 20 74 20 54 68 6f 6e 62 75  {} {i 3 t Thonbu
0c80: 72 69 7d 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 24  ri}}.}.do_test $
0c90: 74 6e 2e 32 2e 32 2e 34 20 7b 20 53 20 64 65 6c  tn.2.2.4 { S del
0ca0: 65 74 65 20 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73  ete } {}..do_tes
0cb0: 74 20 24 74 6e 2e 32 2e 33 2e 31 20 7b 0a 20 20  t $tn.2.3.1 {.  
0cc0: 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45  execsql { DELETE
0cd0: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 73 71 6c   FROM t1 }.  sql
0ce0: 69 74 65 33 73 65 73 73 69 6f 6e 20 53 20 64 62  ite3session S db
0cf0: 20 6d 61 69 6e 0a 20 20 65 78 65 63 73 71 6c 20   main.  execsql 
0d00: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
0d10: 20 56 41 4c 55 45 53 28 31 2c 20 27 53 75 6b 68   VALUES(1, 'Sukh
0d20: 6f 74 68 61 69 27 29 20 7d 0a 20 20 65 78 65 63  othai') }.  exec
0d30: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
0d40: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27  O t1 VALUES(2, '
0d50: 41 79 75 74 74 68 61 79 61 27 29 20 7d 0a 20 20  Ayutthaya') }.  
0d60: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
0d70: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0d80: 33 2c 20 27 54 68 6f 6e 62 75 72 69 27 29 20 7d  3, 'Thonburi') }
0d90: 0a 20 20 53 20 61 74 74 61 63 68 20 74 31 0a 20  .  S attach t1. 
0da0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
0db0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 78 20  UPDATE t1 SET x 
0dc0: 3d 20 31 30 20 57 48 45 52 45 20 78 20 3d 20 31  = 10 WHERE x = 1
0dd0: 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20  ;.    UPDATE t1 
0de0: 53 45 54 20 79 20 3d 20 27 53 75 72 69 6e 27 20  SET y = 'Surin' 
0df0: 57 48 45 52 45 20 78 20 3d 20 32 3b 0a 20 20 20  WHERE x = 2;.   
0e00: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 78   UPDATE t1 SET x
0e10: 20 3d 20 32 30 2c 20 79 20 3d 20 27 54 68 61 70   = 20, y = 'Thap
0e20: 61 65 27 20 57 48 45 52 45 20 78 20 3d 20 33 3b  ae' WHERE x = 3;
0e30: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 63 68  .  }.} {}..do_ch
0e40: 61 6e 67 65 73 65 74 5f 74 65 73 74 20 24 74 6e  angeset_test $tn
0e50: 2e 32 2e 33 2e 32 20 53 20 7b 0a 20 20 7b 49 4e  .2.3.2 S {.  {IN
0e60: 53 45 52 54 20 74 31 20 30 20 58 2e 20 7b 7d 20  SERT t1 0 X. {} 
0e70: 7b 69 20 31 30 20 74 20 53 75 6b 68 6f 74 68 61  {i 10 t Sukhotha
0e80: 69 7d 7d 20 0a 20 20 7b 44 45 4c 45 54 45 20 74  i}} .  {DELETE t
0e90: 31 20 30 20 58 2e 20 7b 69 20 31 20 74 20 53 75  1 0 X. {i 1 t Su
0ea0: 6b 68 6f 74 68 61 69 7d 20 7b 7d 7d 20 0a 20 20  khothai} {}} .  
0eb0: 7b 55 50 44 41 54 45 20 74 31 20 30 20 58 2e 20  {UPDATE t1 0 X. 
0ec0: 7b 69 20 32 20 74 20 41 79 75 74 74 68 61 79 61  {i 2 t Ayutthaya
0ed0: 7d 20 7b 7b 7d 20 7b 7d 20 74 20 53 75 72 69 6e  } {{} {} t Surin
0ee0: 7d 7d 20 0a 20 20 7b 44 45 4c 45 54 45 20 74 31  }} .  {DELETE t1
0ef0: 20 30 20 58 2e 20 7b 69 20 33 20 74 20 54 68 6f   0 X. {i 3 t Tho
0f00: 6e 62 75 72 69 7d 20 7b 7d 7d 20 0a 20 20 7b 49  nburi} {}} .  {I
0f10: 4e 53 45 52 54 20 74 31 20 30 20 58 2e 20 7b 7d  NSERT t1 0 X. {}
0f20: 20 7b 69 20 32 30 20 74 20 54 68 61 70 61 65 7d   {i 20 t Thapae}
0f30: 7d 20 0a 7d 0a 0a 64 6f 5f 63 68 61 6e 67 65 73  } .}..do_changes
0f40: 65 74 5f 69 6e 76 65 72 74 5f 74 65 73 74 20 24  et_invert_test $
0f50: 74 6e 2e 32 2e 33 2e 33 20 53 20 7b 0a 20 20 7b  tn.2.3.3 S {.  {
0f60: 44 45 4c 45 54 45 20 74 31 20 30 20 58 2e 20 7b  DELETE t1 0 X. {
0f70: 69 20 31 30 20 74 20 53 75 6b 68 6f 74 68 61 69  i 10 t Sukhothai
0f80: 7d 20 7b 7d 7d 20 0a 20 20 7b 49 4e 53 45 52 54  } {}} .  {INSERT
0f90: 20 74 31 20 30 20 58 2e 20 7b 7d 20 7b 69 20 31   t1 0 X. {} {i 1
0fa0: 20 74 20 53 75 6b 68 6f 74 68 61 69 7d 7d 20 0a   t Sukhothai}} .
0fb0: 20 20 7b 55 50 44 41 54 45 20 74 31 20 30 20 58    {UPDATE t1 0 X
0fc0: 2e 20 7b 69 20 32 20 74 20 53 75 72 69 6e 7d 20  . {i 2 t Surin} 
0fd0: 7b 7b 7d 20 7b 7d 20 74 20 41 79 75 74 74 68 61  {{} {} t Ayuttha
0fe0: 79 61 7d 7d 20 0a 20 20 7b 49 4e 53 45 52 54 20  ya}} .  {INSERT 
0ff0: 74 31 20 30 20 58 2e 20 7b 7d 20 7b 69 20 33 20  t1 0 X. {} {i 3 
1000: 74 20 54 68 6f 6e 62 75 72 69 7d 7d 20 0a 20 20  t Thonburi}} .  
1010: 7b 44 45 4c 45 54 45 20 74 31 20 30 20 58 2e 20  {DELETE t1 0 X. 
1020: 7b 69 20 32 30 20 74 20 54 68 61 70 61 65 7d 20  {i 20 t Thapae} 
1030: 7b 7d 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 24 74  {}}.}.do_test $t
1040: 6e 2e 32 2e 33 2e 34 20 7b 20 53 20 64 65 6c 65  n.2.3.4 { S dele
1050: 74 65 20 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74  te } {}..do_test
1060: 20 24 74 6e 2e 32 2e 34 2e 31 20 7b 0a 20 20 73   $tn.2.4.1 {.  s
1070: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 20 53 20  qlite3session S 
1080: 64 62 20 6d 61 69 6e 0a 20 20 53 20 61 74 74 61  db main.  S atta
1090: 63 68 20 74 31 0a 20 20 65 78 65 63 73 71 6c 20  ch t1.  execsql 
10a0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
10b0: 20 56 41 4c 55 45 53 28 31 30 30 2c 20 27 42 61   VALUES(100, 'Ba
10c0: 6e 67 6b 6f 6b 27 29 20 7d 0a 20 20 65 78 65 63  ngkok') }.  exec
10d0: 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  sql { DELETE FRO
10e0: 4d 20 74 31 20 57 48 45 52 45 20 78 20 3d 20 31  M t1 WHERE x = 1
10f0: 30 30 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 63 68 61  00 }.} {}.do_cha
1100: 6e 67 65 73 65 74 5f 74 65 73 74 20 24 74 6e 2e  ngeset_test $tn.
1110: 32 2e 34 2e 32 20 53 20 7b 7d 0a 64 6f 5f 63 68  2.4.2 S {}.do_ch
1120: 61 6e 67 65 73 65 74 5f 69 6e 76 65 72 74 5f 74  angeset_invert_t
1130: 65 73 74 20 24 74 6e 2e 32 2e 34 2e 33 20 53 20  est $tn.2.4.3 S 
1140: 7b 7d 0a 64 6f 5f 74 65 73 74 20 24 74 6e 2e 32  {}.do_test $tn.2
1150: 2e 34 2e 34 20 7b 20 53 20 64 65 6c 65 74 65 20  .4.4 { S delete 
1160: 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  } {}..#---------
1170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b0: 0a 23 20 54 65 73 74 20 74 68 65 20 61 70 70 6c  .# Test the appl
11c0: 69 63 61 74 69 6f 6e 20 6f 66 20 73 69 6d 70 6c  ication of simpl
11d0: 65 20 63 68 61 6e 67 65 73 65 74 73 2e 20 54 68  e changesets. Th
11e0: 65 73 65 20 74 65 73 74 73 20 61 6c 73 6f 20 74  ese tests also t
11f0: 65 73 74 20 74 68 61 74 0a 23 20 74 68 65 20 63  est that.# the c
1200: 6f 6e 66 6c 69 63 74 20 63 61 6c 6c 62 61 63 6b  onflict callback
1210: 20 69 73 20 69 6e 76 6f 6b 65 64 20 63 6f 72 72   is invoked corr
1220: 65 63 74 6c 79 2e 20 46 6f 72 20 74 68 65 73 65  ectly. For these
1230: 20 74 65 73 74 73 2c 20 74 68 65 20 0a 23 20 63   tests, the .# c
1240: 6f 6e 66 6c 69 63 74 20 63 61 6c 6c 62 61 63 6b  onflict callback
1250: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
1260: 4f 4d 49 54 2e 0a 23 0a 64 62 20 63 6c 6f 73 65  OMIT..#.db close
1270: 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73  .forcedelete tes
1280: 74 2e 64 62 20 74 65 73 74 2e 64 62 32 0a 73 71  t.db test.db2.sq
1290: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
12a0: 0a 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73  .sqlite3 db2 tes
12b0: 74 2e 64 62 32 0a 0a 70 72 6f 63 20 78 43 6f 6e  t.db2..proc xCon
12c0: 66 6c 69 63 74 20 7b 61 72 67 73 7d 20 7b 20 0a  flict {args} { .
12d0: 20 20 6c 61 70 70 65 6e 64 20 3a 3a 78 43 6f 6e    lappend ::xCon
12e0: 66 6c 69 63 74 20 24 61 72 67 73 0a 20 20 72 65  flict $args.  re
12f0: 74 75 72 6e 20 22 22 20 0a 7d 0a 0a 70 72 6f 63  turn "" .}..proc
1300: 20 62 67 65 72 72 6f 72 20 7b 61 72 67 73 7d 20   bgerror {args} 
1310: 7b 20 73 65 74 20 3a 3a 62 61 63 6b 67 72 6f 75  { set ::backgrou
1320: 6e 64 5f 65 72 72 6f 72 20 24 61 72 67 73 20 7d  nd_error $args }
1330: 0a 0a 70 72 6f 63 20 64 6f 5f 63 6f 6e 66 6c 69  ..proc do_confli
1340: 63 74 5f 74 65 73 74 20 7b 74 6e 20 61 72 67 73  ct_test {tn args
1350: 7d 20 7b 0a 20 20 73 65 74 20 4f 28 2d 74 61 62  } {.  set O(-tab
1360: 6c 65 73 29 20 20 20 20 5b 6c 69 73 74 5d 0a 20  les)    [list]. 
1370: 20 73 65 74 20 4f 28 2d 73 71 6c 29 20 20 20 20   set O(-sql)    
1380: 20 20 20 5b 6c 69 73 74 5d 0a 20 20 73 65 74 20     [list].  set 
1390: 4f 28 2d 63 6f 6e 66 6c 69 63 74 73 29 20 5b 6c  O(-conflicts) [l
13a0: 69 73 74 5d 0a 0a 20 20 61 72 72 61 79 20 73 65  ist]..  array se
13b0: 74 20 56 20 24 61 72 67 73 0a 20 20 66 6f 72 65  t V $args.  fore
13c0: 61 63 68 20 6b 65 79 20 5b 61 72 72 61 79 20 6e  ach key [array n
13d0: 61 6d 65 73 20 56 5d 20 7b 0a 20 20 20 20 69 66  ames V] {.    if
13e0: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
13f0: 4f 28 24 6b 65 79 29 5d 7d 20 7b 65 72 72 6f 72  O($key)]} {error
1400: 20 22 6e 6f 20 73 75 63 68 20 6f 70 74 69 6f 6e   "no such option
1410: 3a 20 24 6b 65 79 22 7d 0a 20 20 7d 0a 20 20 61  : $key"}.  }.  a
1420: 72 72 61 79 20 73 65 74 20 4f 20 24 61 72 67 73  rray set O $args
1430: 0a 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73 69  ..  sqlite3sessi
1440: 6f 6e 20 53 20 64 62 20 6d 61 69 6e 0a 20 20 66  on S db main.  f
1450: 6f 72 65 61 63 68 20 74 20 24 4f 28 2d 74 61 62  oreach t $O(-tab
1460: 6c 65 73 29 20 7b 20 53 20 61 74 74 61 63 68 20  les) { S attach 
1470: 24 74 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 24  $t }.  execsql $
1480: 4f 28 2d 73 71 6c 29 0a 20 20 73 65 74 20 3a 3a  O(-sql).  set ::
1490: 78 43 6f 6e 66 6c 69 63 74 20 5b 6c 69 73 74 5d  xConflict [list]
14a0: 0a 20 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65  .  sqlite3change
14b0: 73 65 74 5f 61 70 70 6c 79 20 64 62 32 20 5b 53  set_apply db2 [S
14c0: 20 63 68 61 6e 67 65 73 65 74 5d 20 78 43 6f 6e   changeset] xCon
14d0: 66 6c 69 63 74 0a 0a 20 20 73 65 74 20 63 6f 6e  flict..  set con
14e0: 66 6c 69 63 74 73 20 5b 6c 69 73 74 5d 0a 20 20  flicts [list].  
14f0: 66 6f 72 65 61 63 68 20 63 20 24 4f 28 2d 63 6f  foreach c $O(-co
1500: 6e 66 6c 69 63 74 73 29 20 7b 0a 20 20 20 20 6c  nflicts) {.    l
1510: 61 70 70 65 6e 64 20 63 6f 6e 66 6c 69 63 74 73  append conflicts
1520: 20 24 63 0a 20 20 7d 0a 0a 20 20 61 66 74 65 72   $c.  }..  after
1530: 20 31 20 7b 73 65 74 20 67 6f 20 31 7d 0a 20 20   1 {set go 1}.  
1540: 76 77 61 69 74 20 67 6f 0a 0a 20 20 75 70 6c 65  vwait go..  uple
1550: 76 65 6c 20 64 6f 5f 74 65 73 74 20 24 74 6e 20  vel do_test $tn 
1560: 5b 6c 69 73 74 20 7b 20 73 65 74 20 3a 3a 78 43  [list { set ::xC
1570: 6f 6e 66 6c 69 63 74 20 7d 5d 20 5b 6c 69 73 74  onflict }] [list
1580: 20 24 63 6f 6e 66 6c 69 63 74 73 5d 0a 20 20 53   $conflicts].  S
1590: 20 64 65 6c 65 74 65 0a 7d 0a 0a 70 72 6f 63 20   delete.}..proc 
15a0: 64 6f 5f 64 62 32 5f 74 65 73 74 20 7b 74 65 73  do_db2_test {tes
15b0: 74 6e 61 6d 65 20 73 71 6c 20 7b 72 65 73 75 6c  tname sql {resul
15c0: 74 20 7b 7d 7d 7d 20 7b 0a 20 20 75 70 6c 65 76  t {}}} {.  uplev
15d0: 65 6c 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74  el do_test $test
15e0: 6e 61 6d 65 20 5b 6c 69 73 74 20 22 65 78 65 63  name [list "exec
15f0: 73 71 6c 20 7b 24 73 71 6c 7d 20 64 62 32 22 5d  sql {$sql} db2"]
1600: 20 5b 6c 69 73 74 20 5b 6c 69 73 74 20 7b 2a 7d   [list [list {*}
1610: 24 72 65 73 75 6c 74 5d 5d 0a 7d 0a 0a 23 20 54  $result]].}..# T
1620: 65 73 74 20 49 4e 53 45 52 54 20 63 68 61 6e 67  est INSERT chang
1630: 65 73 65 74 73 2e 0a 23 0a 64 6f 5f 74 65 73 74  esets..#.do_test
1640: 20 24 74 6e 2e 33 2e 31 2e 30 20 7b 0a 20 20 65   $tn.3.1.0 {.  e
1650: 78 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20  xecsql { CREATE 
1660: 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41  TABLE t1(a PRIMA
1670: 52 59 20 4b 45 59 2c 20 62 20 4e 4f 54 20 4e 55  RY KEY, b NOT NU
1680: 4c 4c 29 20 25 57 52 25 20 7d 20 64 62 32 0a 20  LL) %WR% } db2. 
1690: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
16a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
16b0: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
16c0: 29 20 25 57 52 25 3b 0a 20 20 20 20 49 4e 53 45  ) %WR%;.    INSE
16d0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
16e0: 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 20  S(1, 'one');.   
16f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1700: 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27 29  VALUES(2, 'two')
1710: 3b 0a 20 20 7d 20 64 62 20 0a 7d 20 7b 7d 0a 64  ;.  } db .} {}.d
1720: 6f 5f 64 62 32 5f 74 65 73 74 20 24 74 6e 2e 33  o_db2_test $tn.3
1730: 2e 31 2e 31 20 22 49 4e 53 45 52 54 20 49 4e 54  .1.1 "INSERT INT
1740: 4f 20 74 31 20 56 41 4c 55 45 53 28 36 2c 20 27  O t1 VALUES(6, '
1750: 56 49 27 29 22 0a 64 6f 5f 63 6f 6e 66 6c 69 63  VI')".do_conflic
1760: 74 5f 74 65 73 74 20 24 74 6e 2e 33 2e 31 2e 32  t_test $tn.3.1.2
1770: 20 2d 74 61 62 6c 65 73 20 74 31 20 2d 73 71 6c   -tables t1 -sql
1780: 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f   {.  INSERT INTO
1790: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 27 74   t1 VALUES(3, 't
17a0: 68 72 65 65 27 29 3b 0a 20 20 49 4e 53 45 52 54  hree');.  INSERT
17b0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
17c0: 34 2c 20 27 66 6f 75 72 27 29 3b 0a 20 20 49 4e  4, 'four');.  IN
17d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
17e0: 55 45 53 28 35 2c 20 27 66 69 76 65 27 29 3b 0a  UES(5, 'five');.
17f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1800: 20 56 41 4c 55 45 53 28 36 2c 20 27 73 69 78 27   VALUES(6, 'six'
1810: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
1820: 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 27 73   t1 VALUES(7, 's
1830: 65 76 65 6e 27 29 3b 0a 20 20 49 4e 53 45 52 54  even');.  INSERT
1840: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1850: 38 2c 20 4e 55 4c 4c 29 3b 0a 7d 20 2d 63 6f 6e  8, NULL);.} -con
1860: 66 6c 69 63 74 73 20 7b 0a 20 20 7b 49 4e 53 45  flicts {.  {INSE
1870: 52 54 20 74 31 20 43 4f 4e 46 4c 49 43 54 20 7b  RT t1 CONFLICT {
1880: 69 20 36 20 74 20 73 69 78 7d 20 7b 69 20 36 20  i 6 t six} {i 6 
1890: 74 20 56 49 7d 7d 0a 20 20 7b 49 4e 53 45 52 54  t VI}}.  {INSERT
18a0: 20 74 31 20 43 4f 4e 53 54 52 41 49 4e 54 20 7b   t1 CONSTRAINT {
18b0: 69 20 38 20 6e 20 7b 7d 7d 7d 0a 7d 0a 0a 64 6f  i 8 n {}}}.}..do
18c0: 5f 64 62 32 5f 74 65 73 74 20 24 74 6e 2e 33 2e  _db2_test $tn.3.
18d0: 31 2e 33 20 22 53 45 4c 45 43 54 20 2a 20 46 52  1.3 "SELECT * FR
18e0: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61  OM t1 ORDER BY a
18f0: 22 20 7b 0a 20 20 33 20 74 68 72 65 65 20 34 20  " {.  3 three 4 
1900: 66 6f 75 72 20 35 20 66 69 76 65 20 36 20 56 49  four 5 five 6 VI
1910: 20 37 20 73 65 76 65 6e 0a 7d 0a 64 6f 5f 65 78   7 seven.}.do_ex
1920: 65 63 73 71 6c 5f 74 65 73 74 20 24 74 6e 2e 33  ecsql_test $tn.3
1930: 2e 31 2e 34 20 22 53 45 4c 45 43 54 20 2a 20 46  .1.4 "SELECT * F
1940: 52 4f 4d 20 74 31 22 20 7b 0a 20 20 31 20 6f 6e  ROM t1" {.  1 on
1950: 65 20 32 20 74 77 6f 20 33 20 74 68 72 65 65 20  e 2 two 3 three 
1960: 34 20 66 6f 75 72 20 35 20 66 69 76 65 20 36 20  4 four 5 five 6 
1970: 73 69 78 20 37 20 73 65 76 65 6e 20 38 20 7b 7d  six 7 seven 8 {}
1980: 0a 7d 0a 0a 23 20 54 65 73 74 20 44 45 4c 45 54  .}..# Test DELET
1990: 45 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 23 0a  E changesets..#.
19a0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
19b0: 24 74 6e 2e 33 2e 32 2e 31 20 7b 0a 20 20 50 52  $tn.3.2.1 {.  PR
19c0: 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79  AGMA foreign_key
19d0: 73 20 3d 20 6f 6e 3b 0a 20 20 43 52 45 41 54 45  s = on;.  CREATE
19e0: 20 54 41 42 4c 45 20 74 32 28 61 20 50 52 49 4d   TABLE t2(a PRIM
19f0: 41 52 59 20 4b 45 59 2c 20 62 29 25 57 52 25 3b  ARY KEY, b)%WR%;
1a00: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
1a10: 74 33 28 63 2c 20 64 20 52 45 46 45 52 45 4e 43  t3(c, d REFERENC
1a20: 45 53 20 74 32 29 3b 0a 20 20 49 4e 53 45 52 54  ES t2);.  INSERT
1a30: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1a40: 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53  1, 'one');.  INS
1a50: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
1a60: 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20  ES(2, 'two');.  
1a70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
1a80: 41 4c 55 45 53 28 33 2c 20 27 74 68 72 65 65 27  ALUES(3, 'three'
1a90: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
1aa0: 20 74 32 20 56 41 4c 55 45 53 28 34 2c 20 27 66   t2 VALUES(4, 'f
1ab0: 6f 75 72 27 29 3b 0a 7d 0a 64 6f 5f 64 62 32 5f  our');.}.do_db2_
1ac0: 74 65 73 74 20 24 74 6e 2e 33 2e 32 2e 32 20 7b  test $tn.3.2.2 {
1ad0: 0a 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67  .  PRAGMA foreig
1ae0: 6e 5f 6b 65 79 73 20 3d 20 6f 6e 3b 0a 20 20 43  n_keys = on;.  C
1af0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61  REATE TABLE t2(a
1b00: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
1b10: 25 57 52 25 3b 0a 20 20 43 52 45 41 54 45 20 54  %WR%;.  CREATE T
1b20: 41 42 4c 45 20 74 33 28 63 2c 20 64 20 52 45 46  ABLE t3(c, d REF
1b30: 45 52 45 4e 43 45 53 20 74 32 29 3b 0a 20 20 49  ERENCES t2);.  I
1b40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
1b50: 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a  LUES(1, 'one');.
1b60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1b70: 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27   VALUES(2, 'two'
1b80: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
1b90: 20 74 32 20 56 41 4c 55 45 53 28 34 2c 20 27 66   t2 VALUES(4, 'f
1ba0: 69 76 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  ive');.  INSERT 
1bb0: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27  INTO t3 VALUES('
1bc0: 69 27 2c 20 31 29 3b 0a 7d 0a 64 6f 5f 63 6f 6e  i', 1);.}.do_con
1bd0: 66 6c 69 63 74 5f 74 65 73 74 20 24 74 6e 2e 33  flict_test $tn.3
1be0: 2e 32 2e 33 20 2d 74 61 62 6c 65 73 20 74 32 20  .2.3 -tables t2 
1bf0: 2d 73 71 6c 20 7b 0a 20 20 44 45 4c 45 54 45 20  -sql {.  DELETE 
1c00: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 61 20  FROM t2 WHERE a 
1c10: 3d 20 31 3b 0a 20 20 44 45 4c 45 54 45 20 46 52  = 1;.  DELETE FR
1c20: 4f 4d 20 74 32 20 57 48 45 52 45 20 61 20 3d 20  OM t2 WHERE a = 
1c30: 32 3b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  2;.  DELETE FROM
1c40: 20 74 32 20 57 48 45 52 45 20 61 20 3d 20 33 3b   t2 WHERE a = 3;
1c50: 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  .  DELETE FROM t
1c60: 32 20 57 48 45 52 45 20 61 20 3d 20 34 3b 0a 7d  2 WHERE a = 4;.}
1c70: 20 2d 63 6f 6e 66 6c 69 63 74 73 20 7b 0a 20 20   -conflicts {.  
1c80: 7b 44 45 4c 45 54 45 20 74 32 20 4e 4f 54 46 4f  {DELETE t2 NOTFO
1c90: 55 4e 44 20 7b 69 20 33 20 74 20 74 68 72 65 65  UND {i 3 t three
1ca0: 7d 7d 0a 20 20 7b 44 45 4c 45 54 45 20 74 32 20  }}.  {DELETE t2 
1cb0: 44 41 54 41 20 7b 69 20 34 20 74 20 66 6f 75 72  DATA {i 4 t four
1cc0: 7d 20 7b 69 20 34 20 74 20 66 69 76 65 7d 7d 0a  } {i 4 t five}}.
1cd0: 20 20 7b 46 4f 52 45 49 47 4e 5f 4b 45 59 20 31    {FOREIGN_KEY 1
1ce0: 7d 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  }.}.do_execsql_t
1cf0: 65 73 74 20 24 74 6e 2e 33 2e 32 2e 34 20 22 53  est $tn.3.2.4 "S
1d00: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 22  ELECT * FROM t2"
1d10: 20 7b 7d 0a 64 6f 5f 64 62 32 5f 74 65 73 74 20   {}.do_db2_test 
1d20: 24 74 6e 2e 33 2e 32 2e 35 20 22 53 45 4c 45 43  $tn.3.2.5 "SELEC
1d30: 54 20 2a 20 46 52 4f 4d 20 74 32 22 20 7b 34 20  T * FROM t2" {4 
1d40: 66 69 76 65 7d 0a 0a 23 20 54 65 73 74 20 55 50  five}..# Test UP
1d50: 44 41 54 45 20 63 68 61 6e 67 65 73 65 74 73 2e  DATE changesets.
1d60: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1d70: 73 74 20 24 74 6e 2e 33 2e 33 2e 31 20 7b 0a 20  st $tn.3.3.1 {. 
1d80: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34   CREATE TABLE t4
1d90: 28 61 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52  (a, b, c, PRIMAR
1da0: 59 20 4b 45 59 28 62 2c 20 63 29 29 25 57 52 25  Y KEY(b, c))%WR%
1db0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
1dc0: 74 34 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  t4 VALUES(1, 2, 
1dd0: 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  3);.  INSERT INT
1de0: 4f 20 74 34 20 56 41 4c 55 45 53 28 34 2c 20 35  O t4 VALUES(4, 5
1df0: 2c 20 36 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 6);.  INSERT I
1e00: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 37 2c  NTO t4 VALUES(7,
1e10: 20 38 2c 20 39 29 3b 0a 20 20 49 4e 53 45 52 54   8, 9);.  INSERT
1e20: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
1e30: 31 30 2c 20 31 31 2c 20 31 32 29 3b 0a 7d 0a 64  10, 11, 12);.}.d
1e40: 6f 5f 64 62 32 5f 74 65 73 74 20 24 74 6e 2e 33  o_db2_test $tn.3
1e50: 2e 33 2e 32 20 7b 0a 20 20 43 52 45 41 54 45 20  .3.2 {.  CREATE 
1e60: 54 41 42 4c 45 20 74 34 28 61 20 4e 4f 54 20 4e  TABLE t4(a NOT N
1e70: 55 4c 4c 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41  ULL, b, c, PRIMA
1e80: 52 59 20 4b 45 59 28 62 2c 20 63 29 29 25 57 52  RY KEY(b, c))%WR
1e90: 25 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  %;.  INSERT INTO
1ea0: 20 74 34 20 56 41 4c 55 45 53 28 30 2c 20 32 2c   t4 VALUES(0, 2,
1eb0: 20 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   3);.  INSERT IN
1ec0: 54 4f 20 74 34 20 56 41 4c 55 45 53 28 34 2c 20  TO t4 VALUES(4, 
1ed0: 35 2c 20 37 29 3b 0a 20 20 49 4e 53 45 52 54 20  5, 7);.  INSERT 
1ee0: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 37  INTO t4 VALUES(7
1ef0: 2c 20 38 2c 20 39 29 3b 0a 20 20 49 4e 53 45 52  , 8, 9);.  INSER
1f00: 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53  T INTO t4 VALUES
1f10: 28 31 30 2c 20 31 31 2c 20 31 32 29 3b 0a 7d 0a  (10, 11, 12);.}.
1f20: 64 6f 5f 63 6f 6e 66 6c 69 63 74 5f 74 65 73 74  do_conflict_test
1f30: 20 24 74 6e 2e 33 2e 33 2e 33 20 2d 74 61 62 6c   $tn.3.3.3 -tabl
1f40: 65 73 20 74 34 20 2d 73 71 6c 20 7b 0a 20 20 55  es t4 -sql {.  U
1f50: 50 44 41 54 45 20 74 34 20 53 45 54 20 61 20 3d  PDATE t4 SET a =
1f60: 20 2d 31 20 57 48 45 52 45 20 62 20 3d 20 32 3b   -1 WHERE b = 2;
1f70: 0a 20 20 55 50 44 41 54 45 20 74 34 20 53 45 54  .  UPDATE t4 SET
1f80: 20 61 20 3d 20 2d 31 20 57 48 45 52 45 20 62 20   a = -1 WHERE b 
1f90: 3d 20 35 3b 0a 20 20 55 50 44 41 54 45 20 74 34  = 5;.  UPDATE t4
1fa0: 20 53 45 54 20 61 20 3d 20 4e 55 4c 4c 20 57 48   SET a = NULL WH
1fb0: 45 52 45 20 63 20 3d 20 39 3b 0a 20 20 55 50 44  ERE c = 9;.  UPD
1fc0: 41 54 45 20 74 34 20 53 45 54 20 61 20 3d 20 27  ATE t4 SET a = '
1fd0: 78 27 20 57 48 45 52 45 20 62 20 3d 20 31 31 3b  x' WHERE b = 11;
1fe0: 0a 7d 20 2d 63 6f 6e 66 6c 69 63 74 73 20 7b 0a  .} -conflicts {.
1ff0: 20 20 7b 55 50 44 41 54 45 20 74 34 20 44 41 54    {UPDATE t4 DAT
2000: 41 20 7b 69 20 31 20 69 20 32 20 69 20 33 7d 20  A {i 1 i 2 i 3} 
2010: 7b 69 20 2d 31 20 7b 7d 20 7b 7d 20 7b 7d 20 7b  {i -1 {} {} {} {
2020: 7d 7d 20 7b 69 20 30 20 69 20 32 20 69 20 33 7d  }} {i 0 i 2 i 3}
2030: 7d 0a 20 20 7b 55 50 44 41 54 45 20 74 34 20 4e  }.  {UPDATE t4 N
2040: 4f 54 46 4f 55 4e 44 20 7b 69 20 34 20 69 20 35  OTFOUND {i 4 i 5
2050: 20 69 20 36 7d 20 7b 69 20 2d 31 20 7b 7d 20 7b   i 6} {i -1 {} {
2060: 7d 20 7b 7d 20 7b 7d 7d 7d 0a 20 20 7b 55 50 44  } {} {}}}.  {UPD
2070: 41 54 45 20 74 34 20 43 4f 4e 53 54 52 41 49 4e  ATE t4 CONSTRAIN
2080: 54 20 7b 69 20 37 20 69 20 38 20 69 20 39 7d 20  T {i 7 i 8 i 9} 
2090: 7b 6e 20 7b 7d 20 7b 7d 20 7b 7d 20 7b 7d 20 7b  {n {} {} {} {} {
20a0: 7d 7d 7d 0a 7d 0a 64 6f 5f 64 62 32 5f 74 65 73  }}}.}.do_db2_tes
20b0: 74 20 24 74 6e 2e 33 2e 33 2e 34 20 7b 20 53 45  t $tn.3.3.4 { SE
20c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 20 7d  LECT * FROM t4 }
20d0: 20 7b 30 20 32 20 33 20 34 20 35 20 37 20 37 20   {0 2 3 4 5 7 7 
20e0: 38 20 39 20 78 20 31 31 20 31 32 7d 0a 64 6f 5f  8 9 x 11 12}.do_
20f0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 24 74 6e  execsql_test $tn
2100: 2e 33 2e 33 2e 35 20 7b 20 53 45 4c 45 43 54 20  .3.3.5 { SELECT 
2110: 2a 20 46 52 4f 4d 20 74 34 20 7d 20 7b 2d 31 20  * FROM t4 } {-1 
2120: 32 20 33 20 2d 31 20 35 20 36 20 7b 7d 20 38 20  2 3 -1 5 6 {} 8 
2130: 39 20 78 20 31 31 20 31 32 7d 0a 0a 23 2d 2d 2d  9 x 11 12}..#---
2140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2180: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 6e 65  ------.# This ne
2190: 78 74 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74  xt block of test
21a0: 73 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  s verifies that 
21b0: 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20  values returned 
21c0: 62 79 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 0a  by the conflict.
21d0: 23 20 68 61 6e 64 6c 65 72 20 61 72 65 20 69 6e  # handler are in
21e0: 74 65 70 72 65 74 65 64 20 63 6f 72 72 65 63 74  tepreted correct
21f0: 6c 79 2e 0a 23 0a 0a 70 72 6f 63 20 74 65 73 74  ly..#..proc test
2200: 5f 72 65 73 65 74 20 7b 7d 20 7b 0a 20 20 64 62  _reset {} {.  db
2210: 20 63 6c 6f 73 65 0a 20 20 64 62 32 20 63 6c 6f   close.  db2 clo
2220: 73 65 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65  se.  forcedelete
2230: 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62   test.db test.db
2240: 32 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  2.  sqlite3 db t
2250: 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33  est.db.  sqlite3
2260: 20 64 62 32 20 74 65 73 74 2e 64 62 32 0a 7d 0a   db2 test.db2.}.
2270: 0a 70 72 6f 63 20 78 43 6f 6e 66 6c 69 63 74 20  .proc xConflict 
2280: 7b 61 72 67 73 7d 20 7b 0a 20 20 6c 61 70 70 65  {args} {.  lappe
2290: 6e 64 20 3a 3a 78 43 6f 6e 66 6c 69 63 74 20 24  nd ::xConflict $
22a0: 61 72 67 73 0a 20 20 72 65 74 75 72 6e 20 24 3a  args.  return $:
22b0: 3a 63 6f 6e 66 6c 69 63 74 5f 72 65 74 75 72 6e  :conflict_return
22c0: 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 32  .}..foreach {tn2
22d0: 20 63 6f 6e 66 6c 69 63 74 5f 72 65 74 75 72 6e   conflict_return
22e0: 20 61 66 74 65 72 7d 20 7b 0a 20 20 31 20 4f 4d   after} {.  1 OM
22f0: 49 54 20 20 20 20 20 20 7b 31 20 32 20 76 61 6c  IT      {1 2 val
2300: 75 65 31 20 20 20 34 20 35 20 37 20 20 20 20 20  ue1   4 5 7     
2310: 20 20 31 30 20 78 20 78 7d 0a 20 20 32 20 52 45    10 x x}.  2 RE
2320: 50 4c 41 43 45 20 20 20 7b 31 20 32 20 76 61 6c  PLACE   {1 2 val
2330: 75 65 31 20 20 20 34 20 35 20 76 61 6c 75 65 32  ue1   4 5 value2
2340: 20 20 31 30 20 38 20 39 7d 0a 7d 20 7b 0a 20 20    10 8 9}.} {.  
2350: 74 65 73 74 5f 72 65 73 65 74 0a 0a 20 20 64 6f  test_reset..  do
2360: 5f 74 65 73 74 20 24 74 6e 2e 34 2e 24 74 6e 32  _test $tn.4.$tn2
2370: 2e 31 20 7b 0a 20 20 20 20 66 6f 72 65 61 63 68  .1 {.    foreach
2380: 20 64 62 20 7b 64 62 20 64 62 32 7d 20 7b 0a 20   db {db db2} {. 
2390: 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a       execsql { .
23a0: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
23b0: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 2c  ABLE t1(a, b, c,
23c0: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 29 29   PRIMARY KEY(a))
23d0: 25 57 52 25 3b 0a 20 20 20 20 20 20 20 20 49 4e  %WR%;.        IN
23e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
23f0: 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20  UES(1, 2, 3);.  
2400: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2410: 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20 35  O t1 VALUES(4, 5
2420: 2c 20 36 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  , 6);.        IN
2430: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
2440: 55 45 53 28 37 2c 20 38 2c 20 39 29 3b 0a 20 20  UES(7, 8, 9);.  
2450: 20 20 20 20 7d 20 24 64 62 0a 20 20 20 20 7d 0a      } $db.    }.
2460: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20      execsql { . 
2470: 20 20 20 20 20 52 45 50 4c 41 43 45 20 49 4e 54       REPLACE INT
2480: 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20 35  O t1 VALUES(4, 5
2490: 2c 20 37 29 3b 0a 20 20 20 20 20 20 52 45 50 4c  , 7);.      REPL
24a0: 41 43 45 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ACE INTO t1 VALU
24b0: 45 53 28 31 30 2c 20 27 78 27 2c 20 27 78 27 29  ES(10, 'x', 'x')
24c0: 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20 20 7d 20  ;.    } db2.  } 
24d0: 7b 7d 0a 0a 20 20 64 6f 5f 63 6f 6e 66 6c 69 63  {}..  do_conflic
24e0: 74 5f 74 65 73 74 20 24 74 6e 2e 34 2e 24 74 6e  t_test $tn.4.$tn
24f0: 32 2e 32 20 2d 74 61 62 6c 65 73 20 74 31 20 2d  2.2 -tables t1 -
2500: 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
2510: 20 74 31 20 53 45 54 20 63 20 3d 20 27 76 61 6c   t1 SET c = 'val
2520: 75 65 31 27 20 57 48 45 52 45 20 61 20 3d 20 31  ue1' WHERE a = 1
2530: 3b 20 20 20 20 20 20 20 2d 2d 20 6e 6f 20 63 6f  ;       -- no co
2540: 6e 66 6c 69 63 74 0a 20 20 20 20 55 50 44 41 54  nflict.    UPDAT
2550: 45 20 74 31 20 53 45 54 20 63 20 3d 20 27 76 61  E t1 SET c = 'va
2560: 6c 75 65 32 27 20 57 48 45 52 45 20 61 20 3d 20  lue2' WHERE a = 
2570: 34 3b 20 20 20 20 20 20 20 2d 2d 20 44 41 54 41  4;       -- DATA
2580: 20 63 6f 6e 66 6c 69 63 74 0a 20 20 20 20 55 50   conflict.    UP
2590: 44 41 54 45 20 74 31 20 53 45 54 20 61 20 3d 20  DATE t1 SET a = 
25a0: 31 30 20 57 48 45 52 45 20 61 20 3d 20 37 3b 20  10 WHERE a = 7; 
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 43              -- C
25c0: 4f 4e 46 4c 49 43 54 20 63 6f 6e 66 6c 69 63 74  ONFLICT conflict
25d0: 0a 20 20 7d 20 2d 63 6f 6e 66 6c 69 63 74 73 20  .  } -conflicts 
25e0: 7b 0a 20 20 20 20 7b 49 4e 53 45 52 54 20 74 31  {.    {INSERT t1
25f0: 20 43 4f 4e 46 4c 49 43 54 20 7b 69 20 31 30 20   CONFLICT {i 10 
2600: 69 20 38 20 69 20 39 7d 20 7b 69 20 31 30 20 74  i 8 i 9} {i 10 t
2610: 20 78 20 74 20 78 7d 7d 0a 20 20 20 20 7b 55 50   x t x}}.    {UP
2620: 44 41 54 45 20 74 31 20 44 41 54 41 20 7b 69 20  DATE t1 DATA {i 
2630: 34 20 7b 7d 20 7b 7d 20 69 20 36 7d 20 7b 7b 7d  4 {} {} i 6} {{}
2640: 20 7b 7d 20 7b 7d 20 7b 7d 20 74 20 76 61 6c 75   {} {} {} t valu
2650: 65 32 7d 20 7b 69 20 34 20 69 20 35 20 69 20 37  e2} {i 4 i 5 i 7
2660: 7d 7d 0a 20 20 7d 0a 0a 20 20 64 6f 5f 64 62 32  }}.  }..  do_db2
2670: 5f 74 65 73 74 20 24 74 6e 2e 34 2e 24 74 6e 32  _test $tn.4.$tn2
2680: 2e 33 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  .3 "SELECT * FRO
2690: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 22  M t1 ORDER BY a"
26a0: 20 24 61 66 74 65 72 0a 7d 0a 0a 66 6f 72 65 61   $after.}..forea
26b0: 63 68 20 7b 74 6e 32 20 63 6f 6e 66 6c 69 63 74  ch {tn2 conflict
26c0: 5f 72 65 74 75 72 6e 7d 20 7b 0a 20 20 31 20 4f  _return} {.  1 O
26d0: 4d 49 54 0a 20 20 32 20 52 45 50 4c 41 43 45 0a  MIT.  2 REPLACE.
26e0: 7d 20 7b 0a 20 20 74 65 73 74 5f 72 65 73 65 74  } {.  test_reset
26f0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 6e 2e  ..  do_test $tn.
2700: 35 2e 24 74 6e 32 2e 31 20 7b 0a 20 20 20 20 23  5.$tn2.1 {.    #
2710: 20 43 72 65 61 74 65 20 61 6e 20 69 64 65 6e 74   Create an ident
2720: 69 63 61 6c 20 73 63 68 65 6d 61 20 69 6e 20 62  ical schema in b
2730: 6f 74 68 20 64 61 74 61 62 61 73 65 73 2e 0a 20  oth databases.. 
2740: 20 20 20 73 65 74 20 73 63 68 65 6d 61 20 7b 0a     set schema {.
2750: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
2760: 4c 45 20 22 27 66 6f 6f 6c 69 73 68 20 6e 61 6d  LE "'foolish nam
2770: 65 27 22 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49  e'"(x, y, z, PRI
2780: 4d 41 52 59 20 4b 45 59 28 78 2c 20 79 29 29 25  MARY KEY(x, y))%
2790: 57 52 25 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  WR%;.    }.    e
27a0: 78 65 63 73 71 6c 20 24 73 63 68 65 6d 61 20 64  xecsql $schema d
27b0: 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 24 73  b.    execsql $s
27c0: 63 68 65 6d 61 20 64 62 32 0a 0a 20 20 20 20 23  chema db2..    #
27d0: 20 41 64 64 20 73 6f 6d 65 20 72 6f 77 73 20 74   Add some rows t
27e0: 6f 20 5b 64 62 32 5d 2e 20 54 68 65 73 65 20 72  o [db2]. These r
27f0: 6f 77 73 20 77 69 6c 6c 20 63 61 75 73 65 20 63  ows will cause c
2800: 6f 6e 66 6c 69 63 74 73 20 6c 61 74 65 72 0a 20  onflicts later. 
2810: 20 20 20 23 20 6f 6e 20 77 68 65 6e 20 74 68 65     # on when the
2820: 20 63 68 61 6e 67 65 73 65 74 20 66 72 6f 6d 20   changeset from 
2830: 5b 64 62 5d 20 69 73 20 61 70 70 6c 69 65 64 20  [db] is applied 
2840: 74 6f 20 69 74 2e 0a 20 20 20 20 65 78 65 63 73  to it..    execs
2850: 71 6c 20 7b 20 0a 20 20 20 20 20 20 49 4e 53 45  ql { .      INSE
2860: 52 54 20 49 4e 54 4f 20 22 27 66 6f 6f 6c 69 73  RT INTO "'foolis
2870: 68 20 6e 61 6d 65 27 22 20 56 41 4c 55 45 53 28  h name'" VALUES(
2880: 27 6f 6e 65 27 2c 20 27 6f 6e 65 27 2c 20 27 69  'one', 'one', 'i
2890: 69 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  i');.      INSER
28a0: 54 20 49 4e 54 4f 20 22 27 66 6f 6f 6c 69 73 68  T INTO "'foolish
28b0: 20 6e 61 6d 65 27 22 20 56 41 4c 55 45 53 28 27   name'" VALUES('
28c0: 6f 6e 65 27 2c 20 27 74 77 6f 27 2c 20 27 69 27  one', 'two', 'i'
28d0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
28e0: 49 4e 54 4f 20 22 27 66 6f 6f 6c 69 73 68 20 6e  INTO "'foolish n
28f0: 61 6d 65 27 22 20 56 41 4c 55 45 53 28 27 74 77  ame'" VALUES('tw
2900: 6f 27 2c 20 27 74 77 6f 27 2c 20 27 69 69 27 29  o', 'two', 'ii')
2910: 3b 0a 20 20 20 20 7d 20 64 62 32 0a 0a 20 20 7d  ;.    } db2..  }
2920: 20 7b 7d 0a 0a 20 20 64 6f 5f 63 6f 6e 66 6c 69   {}..  do_confli
2930: 63 74 5f 74 65 73 74 20 24 74 6e 2e 35 2e 24 74  ct_test $tn.5.$t
2940: 6e 32 2e 32 20 2d 74 61 62 6c 65 73 20 7b 7b 27  n2.2 -tables {{'
2950: 66 6f 6f 6c 69 73 68 20 6e 61 6d 65 27 7d 7d 20  foolish name'}} 
2960: 2d 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  -sql {.    INSER
2970: 54 20 49 4e 54 4f 20 22 27 66 6f 6f 6c 69 73 68  T INTO "'foolish
2980: 20 6e 61 6d 65 27 22 20 56 41 4c 55 45 53 28 27   name'" VALUES('
2990: 6f 6e 65 27 2c 20 27 74 77 6f 27 2c 20 32 29 3b  one', 'two', 2);
29a0: 0a 20 20 7d 20 2d 63 6f 6e 66 6c 69 63 74 73 20  .  } -conflicts 
29b0: 7b 0a 20 20 20 20 7b 49 4e 53 45 52 54 20 7b 27  {.    {INSERT {'
29c0: 66 6f 6f 6c 69 73 68 20 6e 61 6d 65 27 7d 20 43  foolish name'} C
29d0: 4f 4e 46 4c 49 43 54 20 7b 74 20 6f 6e 65 20 74  ONFLICT {t one t
29e0: 20 74 77 6f 20 69 20 32 7d 20 7b 74 20 6f 6e 65   two i 2} {t one
29f0: 20 74 20 74 77 6f 20 74 20 69 7d 7d 0a 20 20 7d   t two t i}}.  }
2a00: 0a 0a 20 20 73 65 74 20 72 65 73 28 52 45 50 4c  ..  set res(REPL
2a10: 41 43 45 29 20 7b 6f 6e 65 20 6f 6e 65 20 69 69  ACE) {one one ii
2a20: 20 6f 6e 65 20 74 77 6f 20 32 20 74 77 6f 20 74   one two 2 two t
2a30: 77 6f 20 69 69 7d 0a 20 20 73 65 74 20 72 65 73  wo ii}.  set res
2a40: 28 4f 4d 49 54 29 20 20 20 20 7b 6f 6e 65 20 6f  (OMIT)    {one o
2a50: 6e 65 20 69 69 20 6f 6e 65 20 74 77 6f 20 69 20  ne ii one two i 
2a60: 74 77 6f 20 74 77 6f 20 69 69 7d 0a 20 20 64 6f  two two ii}.  do
2a70: 5f 64 62 32 5f 74 65 73 74 20 24 74 6e 2e 35 2e  _db2_test $tn.5.
2a80: 24 74 6e 32 2e 33 20 7b 0a 20 20 20 20 53 45 4c  $tn2.3 {.    SEL
2a90: 45 43 54 20 2a 20 46 52 4f 4d 20 22 27 66 6f 6f  ECT * FROM "'foo
2aa0: 6c 69 73 68 20 6e 61 6d 65 27 22 20 4f 52 44 45  lish name'" ORDE
2ab0: 52 20 42 59 20 78 2c 20 79 0a 20 20 7d 20 24 72  R BY x, y.  } $r
2ac0: 65 73 28 24 63 6f 6e 66 6c 69 63 74 5f 72 65 74  es($conflict_ret
2ad0: 75 72 6e 29 0a 0a 0a 20 20 64 6f 5f 74 65 73 74  urn)...  do_test
2ae0: 20 24 74 6e 2e 35 2e 24 74 6e 32 2e 31 20 7b 0a   $tn.5.$tn2.1 {.
2af0: 20 20 20 20 73 65 74 20 73 63 68 65 6d 61 20 7b      set schema {
2b00: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
2b10: 42 4c 45 20 64 31 28 22 7a 22 22 7a 22 20 50 52  BLE d1("z""z" PR
2b20: 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 25 57 52  IMARY KEY, y)%WR
2b30: 25 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  %;.      INSERT 
2b40: 49 4e 54 4f 20 64 31 20 56 41 4c 55 45 53 28 31  INTO d1 VALUES(1
2b50: 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 20 20 20 20  , 'one');.      
2b60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 31 20 56  INSERT INTO d1 V
2b70: 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b  ALUES(2, 'two');
2b80: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73  .    }.    execs
2b90: 71 6c 20 24 73 63 68 65 6d 61 20 64 62 0a 20 20  ql $schema db.  
2ba0: 20 20 65 78 65 63 73 71 6c 20 24 73 63 68 65 6d    execsql $schem
2bb0: 61 20 64 62 32 0a 0a 20 20 20 20 65 78 65 63 73  a db2..    execs
2bc0: 71 6c 20 7b 20 0a 20 20 20 20 20 20 55 50 44 41  ql { .      UPDA
2bd0: 54 45 20 64 31 20 53 45 54 20 79 20 3d 20 27 54  TE d1 SET y = 'T
2be0: 57 4f 27 20 57 48 45 52 45 20 22 7a 22 22 7a 22  WO' WHERE "z""z"
2bf0: 20 3d 20 32 3b 0a 20 20 20 20 7d 20 64 62 32 0a   = 2;.    } db2.
2c00: 0a 20 20 7d 20 7b 7d 0a 0a 20 20 64 6f 5f 63 6f  .  } {}..  do_co
2c10: 6e 66 6c 69 63 74 5f 74 65 73 74 20 24 74 6e 2e  nflict_test $tn.
2c20: 35 2e 24 74 6e 32 2e 32 20 2d 74 61 62 6c 65 73  5.$tn2.2 -tables
2c30: 20 64 31 20 2d 73 71 6c 20 7b 0a 20 20 20 20 44   d1 -sql {.    D
2c40: 45 4c 45 54 45 20 46 52 4f 4d 20 64 31 20 57 48  ELETE FROM d1 WH
2c50: 45 52 45 20 22 7a 22 22 7a 22 20 3d 20 32 3b 0a  ERE "z""z" = 2;.
2c60: 20 20 7d 20 2d 63 6f 6e 66 6c 69 63 74 73 20 7b    } -conflicts {
2c70: 0a 20 20 20 20 7b 44 45 4c 45 54 45 20 64 31 20  .    {DELETE d1 
2c80: 44 41 54 41 20 7b 69 20 32 20 74 20 74 77 6f 7d  DATA {i 2 t two}
2c90: 20 7b 69 20 32 20 74 20 54 57 4f 7d 7d 0a 20 20   {i 2 t TWO}}.  
2ca0: 7d 0a 0a 20 20 73 65 74 20 72 65 73 28 52 45 50  }..  set res(REP
2cb0: 4c 41 43 45 29 20 7b 31 20 6f 6e 65 7d 0a 20 20  LACE) {1 one}.  
2cc0: 73 65 74 20 72 65 73 28 4f 4d 49 54 29 20 20 20  set res(OMIT)   
2cd0: 20 7b 31 20 6f 6e 65 20 32 20 54 57 4f 7d 0a 20   {1 one 2 TWO}. 
2ce0: 20 64 6f 5f 64 62 32 5f 74 65 73 74 20 24 74 6e   do_db2_test $tn
2cf0: 2e 35 2e 24 74 6e 32 2e 33 20 22 53 45 4c 45 43  .5.$tn2.3 "SELEC
2d00: 54 20 2a 20 46 52 4f 4d 20 64 31 22 20 24 72 65  T * FROM d1" $re
2d10: 73 28 24 63 6f 6e 66 6c 69 63 74 5f 72 65 74 75  s($conflict_retu
2d20: 72 6e 29 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  rn).}..#--------
2d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d70: 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 74 77  -.# Test that tw
2d80: 6f 20 74 61 62 6c 65 73 20 63 61 6e 20 62 65 20  o tables can be 
2d90: 6d 6f 6e 69 74 6f 72 65 64 20 62 79 20 61 20 73  monitored by a s
2da0: 69 6e 67 6c 65 20 73 65 73 73 69 6f 6e 20 6f 62  ingle session ob
2db0: 6a 65 63 74 2e 0a 23 0a 74 65 73 74 5f 72 65 73  ject..#.test_res
2dc0: 65 74 0a 73 65 74 20 73 63 68 65 6d 61 20 7b 0a  et.set schema {.
2dd0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2de0: 31 28 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  1(a COLLATE noca
2df0: 73 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  se PRIMARY KEY, 
2e00: 62 29 25 57 52 25 3b 0a 20 20 43 52 45 41 54 45  b)%WR%;.  CREATE
2e10: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 20 50   TABLE t2(a, b P
2e20: 52 49 4d 41 52 59 20 4b 45 59 29 25 57 52 25 3b  RIMARY KEY)%WR%;
2e30: 0a 7d 0a 64 6f 5f 74 65 73 74 20 24 74 6e 2e 36  .}.do_test $tn.6
2e40: 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 24  .0 {.  execsql $
2e50: 73 63 68 65 6d 61 20 64 62 0a 20 20 65 78 65 63  schema db.  exec
2e60: 73 71 6c 20 24 73 63 68 65 6d 61 20 64 62 32 0a  sql $schema db2.
2e70: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2e80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
2e90: 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
2ea0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2eb0: 20 74 32 20 56 41 4c 55 45 53 28 27 61 27 2c 20   t2 VALUES('a', 
2ec0: 27 62 27 29 3b 0a 20 20 7d 20 64 62 32 0a 7d 20  'b');.  } db2.} 
2ed0: 7b 7d 0a 0a 73 65 74 20 63 6f 6e 66 6c 69 63 74  {}..set conflict
2ee0: 5f 72 65 74 75 72 6e 20 22 22 0a 64 6f 5f 63 6f  _return "".do_co
2ef0: 6e 66 6c 69 63 74 5f 74 65 73 74 20 24 74 6e 2e  nflict_test $tn.
2f00: 36 2e 31 20 2d 74 61 62 6c 65 73 20 7b 74 31 20  6.1 -tables {t1 
2f10: 74 32 7d 20 2d 73 71 6c 20 7b 0a 20 20 49 4e 53  t2} -sql {.  INS
2f20: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2f30: 45 53 28 27 31 27 2c 20 27 32 27 29 3b 0a 20 20  ES('1', '2');.  
2f40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
2f50: 41 4c 55 45 53 28 27 41 27 2c 20 27 42 27 29 3b  ALUES('A', 'B');
2f60: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
2f70: 32 20 56 41 4c 55 45 53 28 27 41 27 2c 20 27 42  2 VALUES('A', 'B
2f80: 27 29 3b 0a 7d 20 2d 63 6f 6e 66 6c 69 63 74 73  ');.} -conflicts
2f90: 20 7b 0a 20 20 7b 49 4e 53 45 52 54 20 74 31 20   {.  {INSERT t1 
2fa0: 43 4f 4e 46 4c 49 43 54 20 7b 74 20 41 20 74 20  CONFLICT {t A t 
2fb0: 42 7d 20 7b 74 20 61 20 74 20 62 7d 7d 0a 7d 0a  B} {t a t b}}.}.
2fc0: 0a 64 6f 5f 64 62 32 5f 74 65 73 74 20 24 74 6e  .do_db2_test $tn
2fd0: 2e 36 2e 32 20 22 53 45 4c 45 43 54 20 2a 20 46  .6.2 "SELECT * F
2fe0: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
2ff0: 61 22 20 7b 31 20 32 20 61 20 62 7d 0a 64 6f 5f  a" {1 2 a b}.do_
3000: 64 62 32 5f 74 65 73 74 20 24 74 6e 2e 36 2e 33  db2_test $tn.6.3
3010: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
3020: 74 32 20 4f 52 44 45 52 20 42 59 20 61 22 20 7b  t2 ORDER BY a" {
3030: 41 20 42 20 61 20 62 7d 0a 0a 23 2d 2d 2d 2d 2d  A B a b}..#-----
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3080: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
3090: 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73   session objects
30a0: 20 61 72 65 20 6e 6f 74 20 63 6f 6e 66 75 73 65   are not confuse
30b0: 64 20 62 79 20 63 68 61 6e 67 65 73 20 74 6f 20  d by changes to 
30c0: 74 61 62 6c 65 20 69 6e 0a 23 20 6f 74 68 65 72  table in.# other
30d0: 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a 63 61   databases..#.ca
30e0: 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73 65 20  tch { db2 close 
30f0: 7d 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c 65  }.drop_all_table
3100: 73 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65  s.forcedelete te
3110: 73 74 2e 64 62 32 0a 64 6f 5f 69 74 65 72 61 74  st.db2.do_iterat
3120: 6f 72 5f 74 65 73 74 20 24 74 6e 2e 37 2e 31 20  or_test $tn.7.1 
3130: 2a 20 7b 0a 20 20 41 54 54 41 43 48 20 27 74 65  * {.  ATTACH 'te
3140: 73 74 2e 64 62 32 27 20 41 53 20 61 75 78 3b 0a  st.db2' AS aux;.
3150: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d    CREATE TABLE m
3160: 61 69 6e 2e 74 31 28 78 20 50 52 49 4d 41 52 59  ain.t1(x PRIMARY
3170: 20 4b 45 59 2c 20 79 29 25 57 52 25 3b 0a 20 20   KEY, y)%WR%;.  
3180: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78  CREATE TABLE aux
3190: 2e 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45  .t1(x PRIMARY KE
31a0: 59 2c 20 79 29 25 57 52 25 3b 0a 0a 20 20 49 4e  Y, y)%WR%;..  IN
31b0: 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6e 2e 74  SERT INTO main.t
31c0: 31 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20  1 VALUES('one', 
31d0: 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  1);.  INSERT INT
31e0: 4f 20 6d 61 69 6e 2e 74 31 20 56 41 4c 55 45 53  O main.t1 VALUES
31f0: 28 27 74 77 6f 27 2c 20 32 29 3b 0a 20 20 49 4e  ('two', 2);.  IN
3200: 53 45 52 54 20 49 4e 54 4f 20 61 75 78 2e 74 31  SERT INTO aux.t1
3210: 20 56 41 4c 55 45 53 28 27 74 68 72 65 65 27 2c   VALUES('three',
3220: 20 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   3);.  INSERT IN
3230: 54 4f 20 61 75 78 2e 74 31 20 56 41 4c 55 45 53  TO aux.t1 VALUES
3240: 28 27 66 6f 75 72 27 2c 20 34 29 3b 0a 7d 20 7b  ('four', 4);.} {
3250: 0a 20 20 7b 49 4e 53 45 52 54 20 74 31 20 30 20  .  {INSERT t1 0 
3260: 58 2e 20 7b 7d 20 7b 74 20 74 77 6f 20 69 20 32  X. {} {t two i 2
3270: 7d 7d 20 0a 20 20 7b 49 4e 53 45 52 54 20 74 31  }} .  {INSERT t1
3280: 20 30 20 58 2e 20 7b 7d 20 7b 74 20 6f 6e 65 20   0 X. {} {t one 
3290: 69 20 31 7d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  i 1}}.}..#------
32a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32e0: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20 73  ---.# Test the s
32f0: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 73  qlite3session_is
3300: 65 6d 70 74 79 28 29 20 66 75 6e 63 74 69 6f 6e  empty() function
3310: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 24 74 6e 2e  ..#.do_test $tn.
3320: 38 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.1 {.  execsql 
3330: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
3340: 4c 45 20 74 35 28 78 20 50 52 49 4d 41 52 59 20  LE t5(x PRIMARY 
3350: 4b 45 59 2c 20 79 29 25 57 52 25 3b 0a 20 20 20  KEY, y)%WR%;.   
3360: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 36   CREATE TABLE t6
3370: 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
3380: 79 29 25 57 52 25 3b 0a 20 20 20 20 49 4e 53 45  y)%WR%;.    INSE
3390: 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45  RT INTO t5 VALUE
33a0: 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20  S('a', 'b');.   
33b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20   INSERT INTO t6 
33c0: 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29  VALUES('a', 'b')
33d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 73  ;.  }.  sqlite3s
33e0: 65 73 73 69 6f 6e 20 53 20 64 62 20 6d 61 69 6e  ession S db main
33f0: 0a 20 20 53 20 61 74 74 61 63 68 20 2a 0a 0a 20  .  S attach *.. 
3400: 20 53 20 69 73 65 6d 70 74 79 0a 7d 20 7b 31 7d   S isempty.} {1}
3410: 0a 64 6f 5f 74 65 73 74 20 24 74 6e 2e 38 2e 32  .do_test $tn.8.2
3420: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 44   {.  execsql { D
3430: 45 4c 45 54 45 20 46 52 4f 4d 20 74 35 20 7d 0a  ELETE FROM t5 }.
3440: 20 20 53 20 69 73 65 6d 70 74 79 0a 7d 20 7b 30    S isempty.} {0
3450: 7d 0a 64 6f 5f 74 65 73 74 20 24 74 6e 2e 38 2e  }.do_test $tn.8.
3460: 33 20 7b 0a 20 20 53 20 64 65 6c 65 74 65 0a 20  3 {.  S delete. 
3470: 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 20   sqlite3session 
3480: 53 20 64 62 20 6d 61 69 6e 0a 20 20 53 20 61 74  S db main.  S at
3490: 74 61 63 68 20 74 35 0a 20 20 65 78 65 63 73 71  tach t5.  execsq
34a0: 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
34b0: 74 35 20 7d 0a 20 20 53 20 69 73 65 6d 70 74 79  t5 }.  S isempty
34c0: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 24  .} {1}.do_test $
34d0: 74 6e 2e 38 2e 34 20 7b 20 53 20 64 65 6c 65 74  tn.8.4 { S delet
34e0: 65 20 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  e } {}..do_test 
34f0: 24 74 6e 2e 38 2e 35 20 7b 0a 20 20 73 71 6c 69  $tn.8.5 {.  sqli
3500: 74 65 33 73 65 73 73 69 6f 6e 20 53 20 64 62 20  te3session S db 
3510: 6d 61 69 6e 0a 20 20 53 20 61 74 74 61 63 68 20  main.  S attach 
3520: 74 35 0a 20 20 53 20 61 74 74 61 63 68 20 74 36  t5.  S attach t6
3530: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
3540: 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55  ERT INTO t5 VALU
3550: 45 53 28 31 2c 20 32 29 20 7d 0a 20 20 53 20 69  ES(1, 2) }.  S i
3560: 73 65 6d 70 74 79 0a 7d 20 7b 30 7d 0a 0a 64 6f  sempty.} {0}..do
3570: 5f 74 65 73 74 20 24 74 6e 2e 38 2e 36 20 7b 0a  _test $tn.8.6 {.
3580: 20 20 53 20 64 65 6c 65 74 65 0a 20 20 73 71 6c    S delete.  sql
3590: 69 74 65 33 73 65 73 73 69 6f 6e 20 53 20 64 62  ite3session S db
35a0: 20 6d 61 69 6e 0a 20 20 53 20 61 74 74 61 63 68   main.  S attach
35b0: 20 74 35 0a 20 20 53 20 61 74 74 61 63 68 20 74   t5.  S attach t
35c0: 36 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  6.  execsql { IN
35d0: 53 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c  SERT INTO t6 VAL
35e0: 55 45 53 28 31 2c 20 32 29 20 7d 0a 20 20 53 20  UES(1, 2) }.  S 
35f0: 69 73 65 6d 70 74 79 0a 7d 20 7b 30 7d 0a 64 6f  isempty.} {0}.do
3600: 5f 74 65 73 74 20 24 74 6e 2e 38 2e 37 20 7b 20  _test $tn.8.7 { 
3610: 53 20 64 65 6c 65 74 65 20 7d 20 7b 7d 0a 0a 23  S delete } {}..#
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f 65  ---------.#.do_e
3670: 78 65 63 73 71 6c 5f 74 65 73 74 20 24 74 6e 2e  xecsql_test $tn.
3680: 39 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54  9.1 {.  CREATE T
3690: 41 42 4c 45 20 74 37 28 61 2c 20 62 2c 20 63 2c  ABLE t7(a, b, c,
36a0: 20 64 2c 20 65 20 50 52 49 4d 41 52 59 20 4b 45   d, e PRIMARY KE
36b0: 59 2c 20 66 2c 20 67 29 25 57 52 25 3b 0a 20 20  Y, f, g)%WR%;.  
36c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 20 56  INSERT INTO t7 V
36d0: 41 4c 55 45 53 28 31 2c 20 31 2c 20 31 2c 20 31  ALUES(1, 1, 1, 1
36e0: 2c 20 31 2c 20 31 2c 20 31 29 3b 0a 7d 0a 64 6f  , 1, 1, 1);.}.do
36f0: 5f 74 65 73 74 20 24 74 6e 2e 39 2e 32 20 7b 20  _test $tn.9.2 { 
3700: 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  .  sqlite3sessio
3710: 6e 20 53 20 64 62 20 6d 61 69 6e 20 0a 20 20 53  n S db main .  S
3720: 20 61 74 74 61 63 68 20 2a 0a 20 20 65 78 65 63   attach *.  exec
3730: 73 71 6c 20 7b 20 55 50 44 41 54 45 20 74 37 20  sql { UPDATE t7 
3740: 53 45 54 20 62 3d 32 2c 20 64 3d 32 20 7d 0a 7d  SET b=2, d=2 }.}
3750: 20 7b 7d 0a 64 6f 5f 63 68 61 6e 67 65 73 65 74   {}.do_changeset
3760: 5f 74 65 73 74 20 24 74 6e 2e 39 2e 32 20 53 20  _test $tn.9.2 S 
3770: 7b 7b 55 50 44 41 54 45 20 74 37 20 30 20 2e 2e  {{UPDATE t7 0 ..
3780: 2e 2e 58 2e 2e 20 7b 7b 7d 20 7b 7d 20 69 20 31  ..X.. {{} {} i 1
3790: 20 7b 7d 20 7b 7d 20 69 20 31 20 69 20 31 20 7b   {} {} i 1 i 1 {
37a0: 7d 20 7b 7d 20 7b 7d 20 7b 7d 7d 20 7b 7b 7d 20  } {} {} {}} {{} 
37b0: 7b 7d 20 69 20 32 20 7b 7d 20 7b 7d 20 69 20 32  {} i 2 {} {} i 2
37c0: 20 7b 7d 20 7b 7d 20 7b 7d 20 7b 7d 20 7b 7d 20   {} {} {} {} {} 
37d0: 7b 7d 7d 7d 7d 0a 53 20 64 65 6c 65 74 65 0a 63  {}}}}.S delete.c
37e0: 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73 65  atch { db2 close
37f0: 20 7d 0a 20 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   }. .#----------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3840: 23 20 54 65 73 74 20 61 20 72 65 61 6c 6c 79 20  # Test a really 
3850: 6c 6f 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e  long table name.
3860: 0a 23 0a 72 65 73 65 74 5f 64 62 0a 73 65 74 20  .#.reset_db.set 
3870: 74 62 6c 6e 61 6d 65 20 5b 73 74 72 69 6e 67 20  tblname [string 
3880: 72 65 70 65 61 74 20 74 62 6c 6e 61 6d 65 31 32  repeat tblname12
3890: 33 20 31 30 30 5d 0a 64 6f 5f 74 65 73 74 20 24  3 100].do_test $
38a0: 74 6e 2e 31 30 2e 31 2e 31 20 7b 0a 20 20 65 78  tn.10.1.1 {.  ex
38b0: 65 63 73 71 6c 20 22 0a 20 20 20 20 43 52 45 41  ecsql ".    CREA
38c0: 54 45 20 54 41 42 4c 45 20 24 74 62 6c 6e 61 6d  TE TABLE $tblnam
38d0: 65 20 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  e (a PRIMARY KEY
38e0: 2c 20 62 29 25 57 52 25 3b 0a 20 20 20 20 49 4e  , b)%WR%;.    IN
38f0: 53 45 52 54 20 49 4e 54 4f 20 24 74 62 6c 6e 61  SERT INTO $tblna
3900: 6d 65 20 56 41 4c 55 45 53 28 27 78 79 7a 27 2c  me VALUES('xyz',
3910: 20 27 64 65 66 27 29 3b 0a 20 20 22 0a 20 20 73   'def');.  ".  s
3920: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 20 53 20  qlite3session S 
3930: 64 62 20 6d 61 69 6e 0a 20 20 53 20 61 74 74 61  db main.  S atta
3940: 63 68 20 24 74 62 6c 6e 61 6d 65 0a 20 20 65 78  ch $tblname.  ex
3950: 65 63 73 71 6c 20 22 20 0a 20 20 20 20 49 4e 53  ecsql " .    INS
3960: 45 52 54 20 49 4e 54 4f 20 24 74 62 6c 6e 61 6d  ERT INTO $tblnam
3970: 65 20 56 41 4c 55 45 53 28 27 75 76 77 27 2c 20  e VALUES('uvw', 
3980: 27 61 62 63 27 29 3b 0a 20 20 20 20 44 45 4c 45  'abc');.    DELE
3990: 54 45 20 46 52 4f 4d 20 24 74 62 6c 6e 61 6d 65  TE FROM $tblname
39a0: 20 57 48 45 52 45 20 61 20 3d 20 27 78 79 7a 27   WHERE a = 'xyz'
39b0: 3b 0a 20 20 22 0a 7d 20 7b 7d 0a 64 6f 5f 63 68  ;.  ".} {}.do_ch
39c0: 61 6e 67 65 73 65 74 5f 74 65 73 74 20 24 74 6e  angeset_test $tn
39d0: 2e 31 30 2e 31 2e 32 20 53 20 22 0a 20 20 7b 49  .10.1.2 S ".  {I
39e0: 4e 53 45 52 54 20 24 74 62 6c 6e 61 6d 65 20 30  NSERT $tblname 0
39f0: 20 58 2e 20 7b 7d 20 7b 74 20 75 76 77 20 74 20   X. {} {t uvw t 
3a00: 61 62 63 7d 7d 0a 20 20 7b 44 45 4c 45 54 45 20  abc}}.  {DELETE 
3a10: 24 74 62 6c 6e 61 6d 65 20 30 20 58 2e 20 7b 74  $tblname 0 X. {t
3a20: 20 78 79 7a 20 74 20 64 65 66 7d 20 7b 7d 7d 0a   xyz t def} {}}.
3a30: 22 0a 64 6f 5f 74 65 73 74 20 24 74 6e 2e 31 30  ".do_test $tn.10
3a40: 2e 31 2e 34 20 7b 20 53 20 64 65 6c 65 74 65 20  .1.4 { S delete 
3a50: 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  } {}..#---------
3a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a90: 2d 2d 2d 2d 2d 2d 0a 72 65 73 65 74 5f 64 62 0a  ------.reset_db.
3aa0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3ab0: 24 74 6e 2e 31 31 2e 31 20 7b 0a 20 20 43 52 45  $tn.11.1 {.  CRE
3ac0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
3ad0: 62 29 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 24 74  b);.}.do_test $t
3ae0: 6e 2e 31 31 2e 32 20 7b 0a 20 20 73 71 6c 69 74  n.11.2 {.  sqlit
3af0: 65 33 73 65 73 73 69 6f 6e 20 53 20 64 62 20 6d  e3session S db m
3b00: 61 69 6e 0a 20 20 53 20 61 74 74 61 63 68 20 74  ain.  S attach t
3b10: 31 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  1.  execsql {.  
3b20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3b30: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
3b40: 20 7d 0a 20 20 53 20 63 68 61 6e 67 65 73 65 74   }.  S changeset
3b50: 0a 7d 20 7b 7d 0a 0a 53 20 64 65 6c 65 74 65 0a  .} {}..S delete.
3b60: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
3b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
3bb0: 65 73 74 20 61 20 72 65 61 6c 6c 79 20 6c 6f 6e  est a really lon
3bc0: 67 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 23 0a  g table name..#.
3bd0: 72 65 73 65 74 5f 64 62 0a 73 65 74 20 74 62 6c  reset_db.set tbl
3be0: 6e 61 6d 65 20 5b 73 74 72 69 6e 67 20 72 65 70  name [string rep
3bf0: 65 61 74 20 74 62 6c 6e 61 6d 65 31 32 33 20 31  eat tblname123 1
3c00: 30 30 5d 0a 64 6f 5f 74 65 73 74 20 24 74 6e 2e  00].do_test $tn.
3c10: 31 30 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  10.1.1 {.  execs
3c20: 71 6c 20 22 0a 20 20 20 20 43 52 45 41 54 45 20  ql ".    CREATE 
3c30: 54 41 42 4c 45 20 24 74 62 6c 6e 61 6d 65 20 28  TABLE $tblname (
3c40: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
3c50: 29 25 57 52 25 3b 0a 20 20 20 20 49 4e 53 45 52  )%WR%;.    INSER
3c60: 54 20 49 4e 54 4f 20 24 74 62 6c 6e 61 6d 65 20  T INTO $tblname 
3c70: 56 41 4c 55 45 53 28 27 78 79 7a 27 2c 20 27 64  VALUES('xyz', 'd
3c80: 65 66 27 29 3b 0a 20 20 22 0a 20 20 73 71 6c 69  ef');.  ".  sqli
3c90: 74 65 33 73 65 73 73 69 6f 6e 20 53 20 64 62 20  te3session S db 
3ca0: 6d 61 69 6e 0a 20 20 53 20 61 74 74 61 63 68 20  main.  S attach 
3cb0: 24 74 62 6c 6e 61 6d 65 0a 20 20 65 78 65 63 73  $tblname.  execs
3cc0: 71 6c 20 22 20 0a 20 20 20 20 49 4e 53 45 52 54  ql " .    INSERT
3cd0: 20 49 4e 54 4f 20 24 74 62 6c 6e 61 6d 65 20 56   INTO $tblname V
3ce0: 41 4c 55 45 53 28 27 75 76 77 27 2c 20 27 61 62  ALUES('uvw', 'ab
3cf0: 63 27 29 3b 0a 20 20 20 20 44 45 4c 45 54 45 20  c');.    DELETE 
3d00: 46 52 4f 4d 20 24 74 62 6c 6e 61 6d 65 20 57 48  FROM $tblname WH
3d10: 45 52 45 20 61 20 3d 20 27 78 79 7a 27 3b 0a 20  ERE a = 'xyz';. 
3d20: 20 22 0a 7d 20 7b 7d 0a 64 6f 5f 63 68 61 6e 67   ".} {}.do_chang
3d30: 65 73 65 74 5f 74 65 73 74 20 24 74 6e 2e 31 30  eset_test $tn.10
3d40: 2e 31 2e 32 20 53 20 22 0a 20 20 7b 49 4e 53 45  .1.2 S ".  {INSE
3d50: 52 54 20 24 74 62 6c 6e 61 6d 65 20 30 20 58 2e  RT $tblname 0 X.
3d60: 20 7b 7d 20 7b 74 20 75 76 77 20 74 20 61 62 63   {} {t uvw t abc
3d70: 7d 7d 0a 20 20 7b 44 45 4c 45 54 45 20 24 74 62  }}.  {DELETE $tb
3d80: 6c 6e 61 6d 65 20 30 20 58 2e 20 7b 74 20 78 79  lname 0 X. {t xy
3d90: 7a 20 74 20 64 65 66 7d 20 7b 7d 7d 0a 22 0a 64  z t def} {}}.".d
3da0: 6f 5f 74 65 73 74 20 24 74 6e 2e 31 30 2e 31 2e  o_test $tn.10.1.
3db0: 34 20 7b 20 53 20 64 65 6c 65 74 65 20 7d 20 7b  4 { S delete } {
3dc0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
3dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
3e10: 54 65 73 74 20 74 68 65 20 65 66 66 65 63 74 20  Test the effect 
3e20: 6f 66 20 75 70 64 61 74 69 6e 67 20 61 20 63 6f  of updating a co
3e30: 6c 75 6d 6e 20 66 72 6f 6d 20 30 2e 30 20 74 6f  lumn from 0.0 to
3e40: 20 30 2e 30 2e 0a 23 0a 72 65 73 65 74 5f 64 62   0.0..#.reset_db
3e50: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3e60: 20 24 74 6e 2e 31 31 2e 31 20 7b 0a 20 20 43 52   $tn.11.1 {.  CR
3e70: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
3e80: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
3e90: 4b 45 59 2c 20 62 20 52 45 41 4c 29 25 57 52 25  KEY, b REAL)%WR%
3ea0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
3eb0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 30 2e 30  t1 VALUES(1, 0.0
3ec0: 29 3b 0a 7d 0a 64 6f 5f 69 74 65 72 61 74 6f 72  );.}.do_iterator
3ed0: 5f 74 65 73 74 20 24 74 6e 2e 31 31 2e 32 20 2a  _test $tn.11.2 *
3ee0: 20 7b 0a 20 20 55 50 44 41 54 45 20 74 31 20 53   {.  UPDATE t1 S
3ef0: 45 54 20 62 20 3d 20 30 2e 30 3b 0a 7d 20 7b 0a  ET b = 0.0;.} {.
3f00: 7d 0a 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f 65  }..reset_db.do_e
3f10: 78 65 63 73 71 6c 5f 74 65 73 74 20 24 74 6e 2e  xecsql_test $tn.
3f20: 31 32 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  12.1 {.  CREATE 
3f30: 54 41 42 4c 45 20 74 31 28 72 20 49 4e 54 45 47  TABLE t1(r INTEG
3f40: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
3f50: 61 2c 20 62 29 25 57 52 25 3b 0a 20 20 43 52 45  a, b)%WR%;.  CRE
3f60: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
3f70: 74 31 28 61 29 3b 0a 20 20 49 4e 53 45 52 54 20  t1(a);.  INSERT 
3f80: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
3f90: 2c 20 31 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52  , 1, 1);.  INSER
3fa0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3fb0: 28 32 2c 20 31 2c 20 32 29 3b 0a 20 20 49 4e 53  (2, 1, 2);.  INS
3fc0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
3fd0: 45 53 28 33 2c 20 31 2c 20 33 29 3b 0a 7d 0a 0a  ES(3, 1, 3);.}..
3fe0: 64 6f 5f 69 74 65 72 61 74 6f 72 5f 74 65 73 74  do_iterator_test
3ff0: 20 24 74 6e 2e 31 32 2e 32 20 2a 20 7b 0a 20 20   $tn.12.2 * {.  
4000: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 62 3d  UPDATE t1 SET b=
4010: 27 6f 6e 65 27 20 57 48 45 52 45 20 61 3d 31 3b  'one' WHERE a=1;
4020: 0a 7d 20 7b 0a 20 20 7b 55 50 44 41 54 45 20 74  .} {.  {UPDATE t
4030: 31 20 30 20 58 2e 2e 20 7b 69 20 31 20 7b 7d 20  1 0 X.. {i 1 {} 
4040: 7b 7d 20 69 20 31 7d 20 7b 7b 7d 20 7b 7d 20 7b  {} i 1} {{} {} {
4050: 7d 20 7b 7d 20 74 20 6f 6e 65 7d 7d 0a 20 20 7b  } {} t one}}.  {
4060: 55 50 44 41 54 45 20 74 31 20 30 20 58 2e 2e 20  UPDATE t1 0 X.. 
4070: 7b 69 20 32 20 7b 7d 20 7b 7d 20 69 20 32 7d 20  {i 2 {} {} i 2} 
4080: 7b 7b 7d 20 7b 7d 20 7b 7d 20 7b 7d 20 74 20 6f  {{} {} {} {} t o
4090: 6e 65 7d 7d 0a 20 20 7b 55 50 44 41 54 45 20 74  ne}}.  {UPDATE t
40a0: 31 20 30 20 58 2e 2e 20 7b 69 20 33 20 7b 7d 20  1 0 X.. {i 3 {} 
40b0: 7b 7d 20 69 20 33 7d 20 7b 7b 7d 20 7b 7d 20 7b  {} i 3} {{} {} {
40c0: 7d 20 7b 7d 20 74 20 6f 6e 65 7d 7d 0a 7d 0a 0a  } {} t one}}.}..
40d0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
4120: 74 20 74 68 61 74 20 6e 6f 20 73 61 76 65 70 6f  t that no savepo
4130: 69 6e 74 20 69 73 20 75 73 65 64 20 69 66 20 2d  int is used if -
4140: 6e 6f 73 61 76 65 70 6f 69 6e 74 20 69 73 20 73  nosavepoint is s
4150: 70 65 63 69 66 69 65 64 2e 0a 23 0a 64 6f 5f 65  pecified..#.do_e
4160: 78 65 63 73 71 6c 5f 74 65 73 74 20 24 74 6e 2e  xecsql_test $tn.
4170: 31 33 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  13.1 {.  CREATE 
4180: 54 41 42 4c 45 20 78 31 28 61 20 49 4e 54 45 47  TABLE x1(a INTEG
4190: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
41a0: 62 29 25 57 52 25 3b 0a 7d 0a 64 6f 5f 74 65 73  b)%WR%;.}.do_tes
41b0: 74 20 24 74 6e 2e 31 33 2e 32 20 7b 0a 20 20 65  t $tn.13.2 {.  e
41c0: 78 65 63 73 71 6c 20 42 45 47 49 4e 0a 20 20 73  xecsql BEGIN.  s
41d0: 65 74 20 43 20 5b 63 68 61 6e 67 65 73 65 74 5f  et C [changeset_
41e0: 66 72 6f 6d 5f 73 71 6c 20 7b 0a 20 20 20 20 49  from_sql {.    I
41f0: 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41  NSERT INTO x1 VA
4200: 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a  LUES(1, 'one');.
4210: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4220: 78 31 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77  x1 VALUES(2, 'tw
4230: 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  o');.    INSERT 
4240: 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 33  INTO x1 VALUES(3
4250: 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20 7d 5d  , 'three');.  }]
4260: 0a 20 20 65 78 65 63 73 71 6c 20 52 4f 4c 4c 42  .  execsql ROLLB
4270: 41 43 4b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ACK.  execsql {.
4280: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4290: 78 31 20 56 41 4c 55 45 53 28 31 2c 20 27 69 27  x1 VALUES(1, 'i'
42a0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
42b0: 54 4f 20 78 31 20 56 41 4c 55 45 53 28 32 2c 20  TO x1 VALUES(2, 
42c0: 27 69 69 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  'ii');.    INSER
42d0: 54 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53  T INTO x1 VALUES
42e0: 28 33 2c 20 27 69 69 69 27 29 3b 0a 20 20 7d 0a  (3, 'iii');.  }.
42f0: 7d 20 7b 7d 0a 0a 70 72 6f 63 20 78 43 6f 6e 66  } {}..proc xConf
4300: 6c 69 63 74 20 7b 61 72 67 73 7d 20 7b 0a 20 20  lict {args} {.  
4310: 73 65 74 20 72 65 74 20 5b 6c 69 6e 64 65 78 20  set ret [lindex 
4320: 24 3a 3a 43 4f 4e 46 4c 49 43 54 5f 48 41 4e 44  $::CONFLICT_HAND
4330: 4c 45 52 53 20 30 5d 0a 20 20 73 65 74 20 3a 3a  LERS 0].  set ::
4340: 43 4f 4e 46 4c 49 43 54 5f 48 41 4e 44 4c 45 52  CONFLICT_HANDLER
4350: 53 20 5b 6c 72 61 6e 67 65 20 24 3a 3a 43 4f 4e  S [lrange $::CON
4360: 46 4c 49 43 54 5f 48 41 4e 44 4c 45 52 53 20 31  FLICT_HANDLERS 1
4370: 20 65 6e 64 5d 0a 20 20 73 65 74 20 72 65 74 0a   end].  set ret.
4380: 7d 0a 64 6f 5f 74 65 73 74 20 24 74 6e 2e 31 33  }.do_test $tn.13
4390: 2e 33 20 7b 0a 20 20 73 65 74 20 43 4f 4e 46 4c  .3 {.  set CONFL
43a0: 49 43 54 5f 48 41 4e 44 4c 45 52 53 20 5b 6c 69  ICT_HANDLERS [li
43b0: 73 74 20 52 45 50 4c 41 43 45 20 52 45 50 4c 41  st REPLACE REPLA
43c0: 43 45 20 41 42 4f 52 54 5d 0a 20 20 65 78 65 63  CE ABORT].  exec
43d0: 73 71 6c 20 42 45 47 49 4e 0a 20 20 63 61 74 63  sql BEGIN.  catc
43e0: 68 20 7b 20 73 71 6c 69 74 65 33 63 68 61 6e 67  h { sqlite3chang
43f0: 65 73 65 74 5f 61 70 70 6c 79 5f 76 32 20 64 62  eset_apply_v2 db
4400: 20 24 43 20 78 43 6f 6e 66 6c 69 63 74 20 7d 20   $C xConflict } 
4410: 6d 73 67 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  msg.  execsql {.
4420: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
4430: 4d 20 78 31 0a 20 20 7d 0a 7d 20 7b 31 20 69 20  M x1.  }.} {1 i 
4440: 32 20 69 69 20 33 20 69 69 69 7d 0a 64 6f 5f 74  2 ii 3 iii}.do_t
4450: 65 73 74 20 24 74 6e 2e 31 33 2e 33 20 7b 0a 20  est $tn.13.3 {. 
4460: 20 73 65 74 20 43 4f 4e 46 4c 49 43 54 5f 48 41   set CONFLICT_HA
4470: 4e 44 4c 45 52 53 20 5b 6c 69 73 74 20 52 45 50  NDLERS [list REP
4480: 4c 41 43 45 20 52 45 50 4c 41 43 45 20 41 42 4f  LACE REPLACE ABO
4490: 52 54 5d 0a 20 20 65 78 65 63 73 71 6c 20 52 4f  RT].  execsql RO
44a0: 4c 4c 42 41 43 4b 0a 20 20 65 78 65 63 73 71 6c  LLBACK.  execsql
44b0: 20 42 45 47 49 4e 0a 20 20 63 61 74 63 68 20 7b   BEGIN.  catch {
44c0: 20 73 71 6c 69 74 65 33 63 68 61 6e 67 65 73 65   sqlite3changese
44d0: 74 5f 61 70 70 6c 79 5f 76 32 20 2d 6e 6f 73 61  t_apply_v2 -nosa
44e0: 76 65 70 6f 69 6e 74 20 64 62 20 24 43 20 78 43  vepoint db $C xC
44f0: 6f 6e 66 6c 69 63 74 20 7d 20 6d 73 67 0a 20 20  onflict } msg.  
4500: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
4510: 20 2a 20 46 52 4f 4d 20 78 31 20 7d 0a 7d 20 7b   * FROM x1 }.} {
4520: 31 20 6f 6e 65 20 32 20 74 77 6f 20 33 20 69 69  1 one 2 two 3 ii
4530: 69 7d 0a 65 78 65 63 73 71 6c 20 52 4f 4c 4c 42  i}.execsql ROLLB
4540: 41 43 4b 0a 0a 64 6f 5f 74 65 73 74 20 24 74 6e  ACK..do_test $tn
4550: 2e 31 34 2e 31 20 7b 20 73 71 6c 69 74 65 33 73  .14.1 { sqlite3s
4560: 65 73 73 69 6f 6e 5f 63 6f 6e 66 69 67 20 73 74  ession_config st
4570: 72 6d 5f 73 69 7a 65 20 2d 31 20 7d 20 36 34 0a  rm_size -1 } 64.
4580: 64 6f 5f 74 65 73 74 20 24 74 6e 2e 31 34 2e 32  do_test $tn.14.2
4590: 20 7b 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   { sqlite3sessio
45a0: 6e 5f 63 6f 6e 66 69 67 20 73 74 72 6d 5f 73 69  n_config strm_si
45b0: 7a 65 20 36 35 35 33 36 20 7d 20 36 35 35 33 36  ze 65536 } 65536
45c0: 0a 64 6f 5f 74 65 73 74 20 24 74 6e 2e 31 34 2e  .do_test $tn.14.
45d0: 33 20 7b 20 73 71 6c 69 74 65 33 73 65 73 73 69  3 { sqlite3sessi
45e0: 6f 6e 5f 63 6f 6e 66 69 67 20 73 74 72 6d 5f 73  on_config strm_s
45f0: 69 7a 65 20 36 34 20 7d 20 36 34 0a 64 6f 5f 74  ize 64 } 64.do_t
4600: 65 73 74 20 24 74 6e 2e 31 34 2e 34 20 7b 20 0a  est $tn.14.4 { .
4610: 20 20 6c 69 73 74 20 5b 63 61 74 63 68 20 7b 73    list [catch {s
4620: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 6f  qlite3session_co
4630: 6e 66 69 67 20 69 6e 76 61 6c 69 64 20 31 32 33  nfig invalid 123
4640: 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20 7b 31  } msg] $msg.} {1
4650: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 7d 0a   SQLITE_MISUSE}.
4660: 0a 7d 5d 0a 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74  .}].}...finish_t
4670: 65 73 74 0a                                      est.