/ Hex Artifact Content
Login

Artifact e5125b216d1e8c91e0984b361b0b68529e7c5dfb:


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 64 6f 5f 65 78 65 63  ession1..do_exec
02b0: 73 71 6c 5f 74 65 73 74 20 31 2e 30 20 7b 0a 20  sql_test 1.0 {. 
02c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
02d0: 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
02e0: 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  y);.  INSERT INT
02f0: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61 62 63  O t1 VALUES('abc
0300: 27 2c 20 27 64 65 66 27 29 3b 0a 7d 0a 0a 23 2d  ', 'def');.}..#-
0310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0350: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
0360: 63 72 65 61 74 69 6e 67 2c 20 61 74 74 61 63 68  creating, attach
0370: 69 6e 67 20 74 61 62 6c 65 73 20 74 6f 20 61 6e  ing tables to an
0380: 64 20 64 65 6c 65 74 69 6e 67 20 73 65 73 73 69  d deleting sessi
0390: 6f 6e 20 6f 62 6a 65 63 74 73 2e 0a 23 0a 64 6f  on objects..#.do
03a0: 5f 74 65 73 74 20 31 2e 31 20 7b 20 73 71 6c 69  _test 1.1 { sqli
03b0: 74 65 33 73 65 73 73 69 6f 6e 20 53 20 64 62 20  te3session S db 
03c0: 6d 61 69 6e 20 7d 20 7b 53 7d 0a 64 6f 5f 74 65  main } {S}.do_te
03d0: 73 74 20 31 2e 32 20 7b 20 53 20 64 65 6c 65 74  st 1.2 { S delet
03e0: 65 20 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 31  e } {}.do_test 1
03f0: 2e 33 20 7b 20 73 71 6c 69 74 65 33 73 65 73 73  .3 { sqlite3sess
0400: 69 6f 6e 20 53 20 64 62 20 6d 61 69 6e 20 7d 20  ion S db main } 
0410: 7b 53 7d 0a 64 6f 5f 74 65 73 74 20 31 2e 34 20  {S}.do_test 1.4 
0420: 7b 20 53 20 61 74 74 61 63 68 20 74 31 20 7d 20  { S attach t1 } 
0430: 7b 7d 0a 64 6f 5f 74 65 73 74 20 31 2e 35 20 7b  {}.do_test 1.5 {
0440: 20 53 20 64 65 6c 65 74 65 20 7d 20 7b 7d 0a 64   S delete } {}.d
0450: 6f 5f 74 65 73 74 20 31 2e 36 20 7b 20 73 71 6c  o_test 1.6 { sql
0460: 69 74 65 33 73 65 73 73 69 6f 6e 20 53 20 64 62  ite3session S db
0470: 20 6d 61 69 6e 20 7d 20 7b 53 7d 0a 64 6f 5f 74   main } {S}.do_t
0480: 65 73 74 20 31 2e 37 20 7b 20 53 20 61 74 74 61  est 1.7 { S atta
0490: 63 68 20 74 31 20 3b 20 53 20 61 74 74 61 63 68  ch t1 ; S attach
04a0: 20 74 32 20 3b 20 53 20 61 74 74 61 63 68 20 74   t2 ; S attach t
04b0: 33 20 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 31  3 } {}.do_test 1
04c0: 2e 38 20 7b 20 53 20 61 74 74 61 63 68 20 74 31  .8 { S attach t1
04d0: 20 3b 20 53 20 61 74 74 61 63 68 20 74 32 20 3b   ; S attach t2 ;
04e0: 20 53 20 61 74 74 61 63 68 20 74 33 20 7d 20 7b   S attach t3 } {
04f0: 7d 0a 64 6f 5f 74 65 73 74 20 31 2e 39 20 7b 20  }.do_test 1.9 { 
0500: 53 20 64 65 6c 65 74 65 20 7d 20 7b 7d 0a 64 6f  S delete } {}.do
0510: 5f 74 65 73 74 20 31 2e 31 30 20 7b 0a 20 20 73  _test 1.10 {.  s
0520: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 20 53 20  qlite3session S 
0530: 64 62 20 6d 61 69 6e 0a 20 20 53 20 61 74 74 61  db main.  S atta
0540: 63 68 20 74 31 0a 20 20 65 78 65 63 73 71 6c 20  ch t1.  execsql 
0550: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
0560: 20 56 41 4c 55 45 53 28 27 67 68 69 27 2c 20 27   VALUES('ghi', '
0570: 6a 6b 6c 27 29 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  jkl') }.} {}.do_
0580: 74 65 73 74 20 31 2e 31 31 20 7b 20 53 20 64 65  test 1.11 { S de
0590: 6c 65 74 65 20 7d 20 7b 7d 0a 64 6f 5f 74 65 73  lete } {}.do_tes
05a0: 74 20 31 2e 31 32 20 7b 0a 20 20 73 71 6c 69 74  t 1.12 {.  sqlit
05b0: 65 33 73 65 73 73 69 6f 6e 20 53 20 64 62 20 6d  e3session S db m
05c0: 61 69 6e 0a 20 20 53 20 61 74 74 61 63 68 20 74  ain.  S attach t
05d0: 31 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  1.  execsql { IN
05e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
05f0: 55 45 53 28 27 6d 6e 6f 27 2c 20 27 70 71 72 27  UES('mno', 'pqr'
0600: 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  ) }.  execsql { 
0610: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 78 20  UPDATE t1 SET x 
0620: 3d 20 31 31 31 20 57 48 45 52 45 20 72 6f 77 69  = 111 WHERE rowi
0630: 64 20 3d 20 31 20 7d 0a 20 20 65 78 65 63 73 71  d = 1 }.  execsq
0640: 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
0650: 74 31 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d  t1 WHERE rowid =
0660: 20 32 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73   2 }.} {}.do_tes
0670: 74 20 31 2e 31 33 20 7b 0a 20 20 53 20 63 68 61  t 1.13 {.  S cha
0680: 6e 67 65 73 65 74 0a 20 20 53 20 64 65 6c 65 74  ngeset.  S delet
0690: 65 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  e.} {}..#-------
06a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06e0: 2d 2d 0a 23 20 53 69 6d 70 6c 65 20 63 68 61 6e  --.# Simple chan
06f0: 67 65 73 65 74 20 74 65 73 74 73 2e 20 41 6c 73  geset tests. Als
0700: 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c 69 74  o test the sqlit
0710: 65 33 63 68 61 6e 67 65 73 65 74 5f 69 6e 76 65  e3changeset_inve
0720: 72 74 28 29 20 0a 23 20 66 75 6e 63 74 69 6f 6e  rt() .# function
0730: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 32 2e 31 2e  ..#.do_test 2.1.
0740: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  1 {.  execsql { 
0750: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 7d  DELETE FROM t1 }
0760: 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  .  sqlite3sessio
0770: 6e 20 53 20 64 62 20 6d 61 69 6e 0a 20 20 53 20  n S db main.  S 
0780: 61 74 74 61 63 68 20 74 31 0a 20 20 65 78 65 63  attach t1.  exec
0790: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
07a0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 27  O t1 VALUES(1, '
07b0: 53 75 6b 68 6f 74 68 61 69 27 29 20 7d 0a 20 20  Sukhothai') }.  
07c0: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
07d0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
07e0: 32 2c 20 27 41 79 75 74 74 68 61 79 61 27 29 20  2, 'Ayutthaya') 
07f0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  }.  execsql { IN
0800: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0810: 55 45 53 28 33 2c 20 27 54 68 6f 6e 62 75 72 69  UES(3, 'Thonburi
0820: 27 29 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 63 68 61  ') }.} {}.do_cha
0830: 6e 67 65 73 65 74 5f 74 65 73 74 20 32 2e 31 2e  ngeset_test 2.1.
0840: 32 20 53 20 7b 0a 20 20 7b 49 4e 53 45 52 54 20  2 S {.  {INSERT 
0850: 74 31 20 30 20 58 2e 20 7b 7d 20 7b 69 20 31 20  t1 0 X. {} {i 1 
0860: 74 20 53 75 6b 68 6f 74 68 61 69 7d 7d 0a 20 20  t Sukhothai}}.  
0870: 7b 49 4e 53 45 52 54 20 74 31 20 30 20 58 2e 20  {INSERT t1 0 X. 
0880: 7b 7d 20 7b 69 20 32 20 74 20 41 79 75 74 74 68  {} {i 2 t Ayutth
0890: 61 79 61 7d 7d 0a 20 20 7b 49 4e 53 45 52 54 20  aya}}.  {INSERT 
08a0: 74 31 20 30 20 58 2e 20 7b 7d 20 7b 69 20 33 20  t1 0 X. {} {i 3 
08b0: 74 20 54 68 6f 6e 62 75 72 69 7d 7d 0a 7d 0a 64  t Thonburi}}.}.d
08c0: 6f 5f 63 68 61 6e 67 65 73 65 74 5f 69 6e 76 65  o_changeset_inve
08d0: 72 74 5f 74 65 73 74 20 32 2e 31 2e 33 20 53 20  rt_test 2.1.3 S 
08e0: 7b 0a 20 20 7b 44 45 4c 45 54 45 20 74 31 20 30  {.  {DELETE t1 0
08f0: 20 58 2e 20 7b 69 20 31 20 74 20 53 75 6b 68 6f   X. {i 1 t Sukho
0900: 74 68 61 69 7d 20 7b 7d 7d 0a 20 20 7b 44 45 4c  thai} {}}.  {DEL
0910: 45 54 45 20 74 31 20 30 20 58 2e 20 7b 69 20 32  ETE t1 0 X. {i 2
0920: 20 74 20 41 79 75 74 74 68 61 79 61 7d 20 7b 7d   t Ayutthaya} {}
0930: 7d 0a 20 20 7b 44 45 4c 45 54 45 20 74 31 20 30  }.  {DELETE t1 0
0940: 20 58 2e 20 7b 69 20 33 20 74 20 54 68 6f 6e 62   X. {i 3 t Thonb
0950: 75 72 69 7d 20 7b 7d 7d 0a 7d 0a 64 6f 5f 74 65  uri} {}}.}.do_te
0960: 73 74 20 32 2e 31 2e 34 20 7b 20 53 20 64 65 6c  st 2.1.4 { S del
0970: 65 74 65 20 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73  ete } {}..do_tes
0980: 74 20 32 2e 32 2e 31 20 7b 0a 20 20 73 71 6c 69  t 2.2.1 {.  sqli
0990: 74 65 33 73 65 73 73 69 6f 6e 20 53 20 64 62 20  te3session S db 
09a0: 6d 61 69 6e 0a 20 20 53 20 61 74 74 61 63 68 20  main.  S attach 
09b0: 74 31 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 44  t1.  execsql { D
09c0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
09d0: 45 52 45 20 31 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ERE 1 }.} {}.do_
09e0: 63 68 61 6e 67 65 73 65 74 5f 74 65 73 74 20 32  changeset_test 2
09f0: 2e 32 2e 32 20 53 20 7b 0a 20 20 7b 44 45 4c 45  .2.2 S {.  {DELE
0a00: 54 45 20 74 31 20 30 20 58 2e 20 7b 69 20 31 20  TE t1 0 X. {i 1 
0a10: 74 20 53 75 6b 68 6f 74 68 61 69 7d 20 7b 7d 7d  t Sukhothai} {}}
0a20: 0a 20 20 7b 44 45 4c 45 54 45 20 74 31 20 30 20  .  {DELETE t1 0 
0a30: 58 2e 20 7b 69 20 32 20 74 20 41 79 75 74 74 68  X. {i 2 t Ayutth
0a40: 61 79 61 7d 20 7b 7d 7d 0a 20 20 7b 44 45 4c 45  aya} {}}.  {DELE
0a50: 54 45 20 74 31 20 30 20 58 2e 20 7b 69 20 33 20  TE t1 0 X. {i 3 
0a60: 74 20 54 68 6f 6e 62 75 72 69 7d 20 7b 7d 7d 0a  t Thonburi} {}}.
0a70: 7d 0a 64 6f 5f 63 68 61 6e 67 65 73 65 74 5f 69  }.do_changeset_i
0a80: 6e 76 65 72 74 5f 74 65 73 74 20 32 2e 32 2e 33  nvert_test 2.2.3
0a90: 20 53 20 7b 0a 20 20 7b 49 4e 53 45 52 54 20 74   S {.  {INSERT t
0aa0: 31 20 30 20 58 2e 20 7b 7d 20 7b 69 20 31 20 74  1 0 X. {} {i 1 t
0ab0: 20 53 75 6b 68 6f 74 68 61 69 7d 7d 0a 20 20 7b   Sukhothai}}.  {
0ac0: 49 4e 53 45 52 54 20 74 31 20 30 20 58 2e 20 7b  INSERT t1 0 X. {
0ad0: 7d 20 7b 69 20 32 20 74 20 41 79 75 74 74 68 61  } {i 2 t Ayuttha
0ae0: 79 61 7d 7d 0a 20 20 7b 49 4e 53 45 52 54 20 74  ya}}.  {INSERT t
0af0: 31 20 30 20 58 2e 20 7b 7d 20 7b 69 20 33 20 74  1 0 X. {} {i 3 t
0b00: 20 54 68 6f 6e 62 75 72 69 7d 7d 0a 7d 0a 64 6f   Thonburi}}.}.do
0b10: 5f 74 65 73 74 20 32 2e 32 2e 34 20 7b 20 53 20  _test 2.2.4 { S 
0b20: 64 65 6c 65 74 65 20 7d 20 7b 7d 0a 0a 64 6f 5f  delete } {}..do_
0b30: 74 65 73 74 20 32 2e 33 2e 31 20 7b 0a 20 20 65  test 2.3.1 {.  e
0b40: 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  xecsql { DELETE 
0b50: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 73 71 6c 69  FROM t1 }.  sqli
0b60: 74 65 33 73 65 73 73 69 6f 6e 20 53 20 64 62 20  te3session S db 
0b70: 6d 61 69 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b  main.  execsql {
0b80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0b90: 56 41 4c 55 45 53 28 31 2c 20 27 53 75 6b 68 6f  VALUES(1, 'Sukho
0ba0: 74 68 61 69 27 29 20 7d 0a 20 20 65 78 65 63 73  thai') }.  execs
0bb0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
0bc0: 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27 41   t1 VALUES(2, 'A
0bd0: 79 75 74 74 68 61 79 61 27 29 20 7d 0a 20 20 65  yutthaya') }.  e
0be0: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
0bf0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
0c00: 2c 20 27 54 68 6f 6e 62 75 72 69 27 29 20 7d 0a  , 'Thonburi') }.
0c10: 20 20 53 20 61 74 74 61 63 68 20 74 31 0a 20 20    S attach t1.  
0c20: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 55  execsql { .    U
0c30: 50 44 41 54 45 20 74 31 20 53 45 54 20 78 20 3d  PDATE t1 SET x =
0c40: 20 31 30 20 57 48 45 52 45 20 78 20 3d 20 31 3b   10 WHERE x = 1;
0c50: 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53  .    UPDATE t1 S
0c60: 45 54 20 79 20 3d 20 27 53 75 72 69 6e 27 20 57  ET y = 'Surin' W
0c70: 48 45 52 45 20 78 20 3d 20 32 3b 0a 20 20 20 20  HERE x = 2;.    
0c80: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 78 20  UPDATE t1 SET x 
0c90: 3d 20 32 30 2c 20 79 20 3d 20 27 54 68 61 70 61  = 20, y = 'Thapa
0ca0: 65 27 20 57 48 45 52 45 20 78 20 3d 20 33 3b 0a  e' WHERE x = 3;.
0cb0: 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 63 68 61    }.} {}..do_cha
0cc0: 6e 67 65 73 65 74 5f 74 65 73 74 20 32 2e 33 2e  ngeset_test 2.3.
0cd0: 32 20 53 20 7b 0a 20 20 7b 49 4e 53 45 52 54 20  2 S {.  {INSERT 
0ce0: 74 31 20 30 20 58 2e 20 7b 7d 20 7b 69 20 31 30  t1 0 X. {} {i 10
0cf0: 20 74 20 53 75 6b 68 6f 74 68 61 69 7d 7d 20 0a   t Sukhothai}} .
0d00: 20 20 7b 44 45 4c 45 54 45 20 74 31 20 30 20 58    {DELETE t1 0 X
0d10: 2e 20 7b 69 20 31 20 74 20 53 75 6b 68 6f 74 68  . {i 1 t Sukhoth
0d20: 61 69 7d 20 7b 7d 7d 20 0a 20 20 7b 55 50 44 41  ai} {}} .  {UPDA
0d30: 54 45 20 74 31 20 30 20 58 2e 20 7b 69 20 32 20  TE t1 0 X. {i 2 
0d40: 74 20 41 79 75 74 74 68 61 79 61 7d 20 7b 7b 7d  t Ayutthaya} {{}
0d50: 20 7b 7d 20 74 20 53 75 72 69 6e 7d 7d 20 0a 20   {} t Surin}} . 
0d60: 20 7b 44 45 4c 45 54 45 20 74 31 20 30 20 58 2e   {DELETE t1 0 X.
0d70: 20 7b 69 20 33 20 74 20 54 68 6f 6e 62 75 72 69   {i 3 t Thonburi
0d80: 7d 20 7b 7d 7d 20 0a 20 20 7b 49 4e 53 45 52 54  } {}} .  {INSERT
0d90: 20 74 31 20 30 20 58 2e 20 7b 7d 20 7b 69 20 32   t1 0 X. {} {i 2
0da0: 30 20 74 20 54 68 61 70 61 65 7d 7d 20 0a 7d 0a  0 t Thapae}} .}.
0db0: 0a 64 6f 5f 63 68 61 6e 67 65 73 65 74 5f 69 6e  .do_changeset_in
0dc0: 76 65 72 74 5f 74 65 73 74 20 32 2e 33 2e 33 20  vert_test 2.3.3 
0dd0: 53 20 7b 0a 20 20 7b 44 45 4c 45 54 45 20 74 31  S {.  {DELETE t1
0de0: 20 30 20 58 2e 20 7b 69 20 31 30 20 74 20 53 75   0 X. {i 10 t Su
0df0: 6b 68 6f 74 68 61 69 7d 20 7b 7d 7d 20 0a 20 20  khothai} {}} .  
0e00: 7b 49 4e 53 45 52 54 20 74 31 20 30 20 58 2e 20  {INSERT t1 0 X. 
0e10: 7b 7d 20 7b 69 20 31 20 74 20 53 75 6b 68 6f 74  {} {i 1 t Sukhot
0e20: 68 61 69 7d 7d 20 0a 20 20 7b 55 50 44 41 54 45  hai}} .  {UPDATE
0e30: 20 74 31 20 30 20 58 2e 20 7b 69 20 32 20 74 20   t1 0 X. {i 2 t 
0e40: 53 75 72 69 6e 7d 20 7b 7b 7d 20 7b 7d 20 74 20  Surin} {{} {} t 
0e50: 41 79 75 74 74 68 61 79 61 7d 7d 20 0a 20 20 7b  Ayutthaya}} .  {
0e60: 49 4e 53 45 52 54 20 74 31 20 30 20 58 2e 20 7b  INSERT t1 0 X. {
0e70: 7d 20 7b 69 20 33 20 74 20 54 68 6f 6e 62 75 72  } {i 3 t Thonbur
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 32 30 20 74 20 54  1 0 X. {i 20 t T
0ea0: 68 61 70 61 65 7d 20 7b 7d 7d 0a 7d 0a 64 6f 5f  hapae} {}}.}.do_
0eb0: 74 65 73 74 20 32 2e 33 2e 34 20 7b 20 53 20 64  test 2.3.4 { S d
0ec0: 65 6c 65 74 65 20 7d 20 7b 7d 0a 0a 64 6f 5f 74  elete } {}..do_t
0ed0: 65 73 74 20 32 2e 34 2e 31 20 7b 0a 20 20 73 71  est 2.4.1 {.  sq
0ee0: 6c 69 74 65 33 73 65 73 73 69 6f 6e 20 53 20 64  lite3session S d
0ef0: 62 20 6d 61 69 6e 0a 20 20 53 20 61 74 74 61 63  b main.  S attac
0f00: 68 20 74 31 0a 20 20 65 78 65 63 73 71 6c 20 7b  h t1.  execsql {
0f10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0f20: 56 41 4c 55 45 53 28 31 30 30 2c 20 27 42 61 6e  VALUES(100, 'Ban
0f30: 67 6b 6f 6b 27 29 20 7d 0a 20 20 65 78 65 63 73  gkok') }.  execs
0f40: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
0f50: 20 74 31 20 57 48 45 52 45 20 78 20 3d 20 31 30   t1 WHERE x = 10
0f60: 30 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 63 68 61 6e  0 }.} {}.do_chan
0f70: 67 65 73 65 74 5f 74 65 73 74 20 32 2e 34 2e 32  geset_test 2.4.2
0f80: 20 53 20 7b 7d 0a 64 6f 5f 63 68 61 6e 67 65 73   S {}.do_changes
0f90: 65 74 5f 69 6e 76 65 72 74 5f 74 65 73 74 20 32  et_invert_test 2
0fa0: 2e 34 2e 33 20 53 20 7b 7d 0a 64 6f 5f 74 65 73  .4.3 S {}.do_tes
0fb0: 74 20 32 2e 34 2e 34 20 7b 20 53 20 64 65 6c 65  t 2.4.4 { S dele
0fc0: 74 65 20 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  te } {}..#------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1010: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20 61  ---.# Test the a
1020: 70 70 6c 69 63 61 74 69 6f 6e 20 6f 66 20 73 69  pplication of si
1030: 6d 70 6c 65 20 63 68 61 6e 67 65 73 65 74 73 2e  mple changesets.
1040: 20 54 68 65 73 65 20 74 65 73 74 73 20 61 6c 73   These tests als
1050: 6f 20 74 65 73 74 20 74 68 61 74 0a 23 20 74 68  o test that.# th
1060: 65 20 63 6f 6e 66 6c 69 63 74 20 63 61 6c 6c 62  e conflict callb
1070: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 63  ack is invoked c
1080: 6f 72 72 65 63 74 6c 79 2e 20 46 6f 72 20 74 68  orrectly. For th
1090: 65 73 65 20 74 65 73 74 73 2c 20 74 68 65 20 0a  ese tests, the .
10a0: 23 20 63 6f 6e 66 6c 69 63 74 20 63 61 6c 6c 62  # conflict callb
10b0: 61 63 6b 20 61 6c 77 61 79 73 20 72 65 74 75 72  ack always retur
10c0: 6e 73 20 4f 4d 49 54 2e 0a 23 0a 64 62 20 63 6c  ns OMIT..#.db cl
10d0: 6f 73 65 0a 66 6f 72 63 65 64 65 6c 65 74 65 20  ose.forcedelete 
10e0: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 32  test.db test.db2
10f0: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
1100: 2e 64 62 0a 73 71 6c 69 74 65 33 20 64 62 32 20  .db.sqlite3 db2 
1110: 74 65 73 74 2e 64 62 32 0a 0a 70 72 6f 63 20 78  test.db2..proc x
1120: 43 6f 6e 66 6c 69 63 74 20 7b 61 72 67 73 7d 20  Conflict {args} 
1130: 7b 20 0a 20 20 6c 61 70 70 65 6e 64 20 3a 3a 78  { .  lappend ::x
1140: 43 6f 6e 66 6c 69 63 74 20 24 61 72 67 73 0a 20  Conflict $args. 
1150: 20 72 65 74 75 72 6e 20 22 22 20 0a 7d 0a 0a 70   return "" .}..p
1160: 72 6f 63 20 62 67 65 72 72 6f 72 20 7b 61 72 67  roc bgerror {arg
1170: 73 7d 20 7b 20 73 65 74 20 3a 3a 62 61 63 6b 67  s} { set ::backg
1180: 72 6f 75 6e 64 5f 65 72 72 6f 72 20 24 61 72 67  round_error $arg
1190: 73 20 7d 0a 0a 70 72 6f 63 20 64 6f 5f 63 6f 6e  s }..proc do_con
11a0: 66 6c 69 63 74 5f 74 65 73 74 20 7b 74 6e 20 61  flict_test {tn a
11b0: 72 67 73 7d 20 7b 0a 20 20 73 65 74 20 4f 28 2d  rgs} {.  set O(-
11c0: 74 61 62 6c 65 73 29 20 20 20 20 5b 6c 69 73 74  tables)    [list
11d0: 5d 0a 20 20 73 65 74 20 4f 28 2d 73 71 6c 29 20  ].  set O(-sql) 
11e0: 20 20 20 20 20 20 5b 6c 69 73 74 5d 0a 20 20 73        [list].  s
11f0: 65 74 20 4f 28 2d 63 6f 6e 66 6c 69 63 74 73 29  et O(-conflicts)
1200: 20 5b 6c 69 73 74 5d 0a 0a 20 20 61 72 72 61 79   [list]..  array
1210: 20 73 65 74 20 56 20 24 61 72 67 73 0a 20 20 66   set V $args.  f
1220: 6f 72 65 61 63 68 20 6b 65 79 20 5b 61 72 72 61  oreach key [arra
1230: 79 20 6e 61 6d 65 73 20 56 5d 20 7b 0a 20 20 20  y names V] {.   
1240: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1250: 74 73 20 4f 28 24 6b 65 79 29 5d 7d 20 7b 65 72  ts O($key)]} {er
1260: 72 6f 72 20 22 6e 6f 20 73 75 63 68 20 6f 70 74  ror "no such opt
1270: 69 6f 6e 3a 20 24 6b 65 79 22 7d 0a 20 20 7d 0a  ion: $key"}.  }.
1280: 20 20 61 72 72 61 79 20 73 65 74 20 4f 20 24 61    array set O $a
1290: 72 67 73 0a 0a 20 20 73 71 6c 69 74 65 33 73 65  rgs..  sqlite3se
12a0: 73 73 69 6f 6e 20 53 20 64 62 20 6d 61 69 6e 0a  ssion S db main.
12b0: 20 20 66 6f 72 65 61 63 68 20 74 20 24 4f 28 2d    foreach t $O(-
12c0: 74 61 62 6c 65 73 29 20 7b 20 53 20 61 74 74 61  tables) { S atta
12d0: 63 68 20 24 74 20 7d 0a 20 20 65 78 65 63 73 71  ch $t }.  execsq
12e0: 6c 20 24 4f 28 2d 73 71 6c 29 0a 20 20 73 65 74  l $O(-sql).  set
12f0: 20 3a 3a 78 43 6f 6e 66 6c 69 63 74 20 5b 6c 69   ::xConflict [li
1300: 73 74 5d 0a 20 20 73 71 6c 69 74 65 33 63 68 61  st].  sqlite3cha
1310: 6e 67 65 73 65 74 5f 61 70 70 6c 79 20 64 62 32  ngeset_apply db2
1320: 20 5b 53 20 63 68 61 6e 67 65 73 65 74 5d 20 78   [S changeset] x
1330: 43 6f 6e 66 6c 69 63 74 0a 0a 20 20 73 65 74 20  Conflict..  set 
1340: 63 6f 6e 66 6c 69 63 74 73 20 5b 6c 69 73 74 5d  conflicts [list]
1350: 0a 20 20 66 6f 72 65 61 63 68 20 63 20 24 4f 28  .  foreach c $O(
1360: 2d 63 6f 6e 66 6c 69 63 74 73 29 20 7b 0a 20 20  -conflicts) {.  
1370: 20 20 6c 61 70 70 65 6e 64 20 63 6f 6e 66 6c 69    lappend confli
1380: 63 74 73 20 24 63 0a 20 20 7d 0a 0a 20 20 61 66  cts $c.  }..  af
1390: 74 65 72 20 31 20 7b 73 65 74 20 67 6f 20 31 7d  ter 1 {set go 1}
13a0: 0a 20 20 76 77 61 69 74 20 67 6f 0a 0a 20 20 75  .  vwait go..  u
13b0: 70 6c 65 76 65 6c 20 64 6f 5f 74 65 73 74 20 24  plevel do_test $
13c0: 74 6e 20 5b 6c 69 73 74 20 7b 20 73 65 74 20 3a  tn [list { set :
13d0: 3a 78 43 6f 6e 66 6c 69 63 74 20 7d 5d 20 5b 6c  :xConflict }] [l
13e0: 69 73 74 20 24 63 6f 6e 66 6c 69 63 74 73 5d 0a  ist $conflicts].
13f0: 20 20 53 20 64 65 6c 65 74 65 0a 7d 0a 0a 70 72    S delete.}..pr
1400: 6f 63 20 64 6f 5f 64 62 32 5f 74 65 73 74 20 7b  oc do_db2_test {
1410: 74 65 73 74 6e 61 6d 65 20 73 71 6c 20 7b 72 65  testname sql {re
1420: 73 75 6c 74 20 7b 7d 7d 7d 20 7b 0a 20 20 75 70  sult {}}} {.  up
1430: 6c 65 76 65 6c 20 64 6f 5f 74 65 73 74 20 24 74  level do_test $t
1440: 65 73 74 6e 61 6d 65 20 5b 6c 69 73 74 20 22 65  estname [list "e
1450: 78 65 63 73 71 6c 20 7b 24 73 71 6c 7d 20 64 62  xecsql {$sql} db
1460: 32 22 5d 20 5b 6c 69 73 74 20 5b 6c 69 73 74 20  2"] [list [list 
1470: 7b 2a 7d 24 72 65 73 75 6c 74 5d 5d 0a 7d 0a 0a  {*}$result]].}..
1480: 23 20 54 65 73 74 20 49 4e 53 45 52 54 20 63 68  # Test INSERT ch
1490: 61 6e 67 65 73 65 74 73 2e 0a 23 0a 64 6f 5f 74  angesets..#.do_t
14a0: 65 73 74 20 33 2e 31 2e 30 20 7b 0a 20 20 65 78  est 3.1.0 {.  ex
14b0: 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20 54  ecsql { CREATE T
14c0: 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52  ABLE t1(a PRIMAR
14d0: 59 20 4b 45 59 2c 20 62 20 4e 4f 54 20 4e 55 4c  Y KEY, b NOT NUL
14e0: 4c 29 20 7d 20 64 62 32 0a 20 20 65 78 65 63 73  L) } db2.  execs
14f0: 71 6c 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45  ql { .    CREATE
1500: 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d   TABLE t1(a PRIM
1510: 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20  ARY KEY, b);.   
1520: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1530: 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29  VALUES(1, 'one')
1540: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1550: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27  O t1 VALUES(2, '
1560: 74 77 6f 27 29 3b 0a 20 20 7d 20 64 62 20 0a 7d  two');.  } db .}
1570: 20 7b 7d 0a 64 6f 5f 64 62 32 5f 74 65 73 74 20   {}.do_db2_test 
1580: 33 2e 31 2e 31 20 22 49 4e 53 45 52 54 20 49 4e  3.1.1 "INSERT IN
1590: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 36 2c 20  TO t1 VALUES(6, 
15a0: 27 56 49 27 29 22 0a 64 6f 5f 63 6f 6e 66 6c 69  'VI')".do_confli
15b0: 63 74 5f 74 65 73 74 20 33 2e 31 2e 32 20 2d 74  ct_test 3.1.2 -t
15c0: 61 62 6c 65 73 20 74 31 20 2d 73 71 6c 20 7b 0a  ables t1 -sql {.
15d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
15e0: 20 56 41 4c 55 45 53 28 33 2c 20 27 74 68 72 65   VALUES(3, 'thre
15f0: 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  e');.  INSERT IN
1600: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20  TO t1 VALUES(4, 
1610: 27 66 6f 75 72 27 29 3b 0a 20 20 49 4e 53 45 52  'four');.  INSER
1620: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1630: 28 35 2c 20 27 66 69 76 65 27 29 3b 0a 20 20 49  (5, 'five');.  I
1640: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1650: 4c 55 45 53 28 36 2c 20 27 73 69 78 27 29 3b 0a  LUES(6, 'six');.
1660: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1670: 20 56 41 4c 55 45 53 28 37 2c 20 27 73 65 76 65   VALUES(7, 'seve
1680: 6e 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  n');.  INSERT IN
1690: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 38 2c 20  TO t1 VALUES(8, 
16a0: 4e 55 4c 4c 29 3b 0a 7d 20 2d 63 6f 6e 66 6c 69  NULL);.} -confli
16b0: 63 74 73 20 7b 0a 20 20 7b 49 4e 53 45 52 54 20  cts {.  {INSERT 
16c0: 74 31 20 43 4f 4e 46 4c 49 43 54 20 7b 69 20 36  t1 CONFLICT {i 6
16d0: 20 74 20 73 69 78 7d 20 7b 69 20 36 20 74 20 56   t six} {i 6 t V
16e0: 49 7d 7d 0a 20 20 7b 49 4e 53 45 52 54 20 74 31  I}}.  {INSERT t1
16f0: 20 43 4f 4e 53 54 52 41 49 4e 54 20 7b 69 20 38   CONSTRAINT {i 8
1700: 20 6e 20 7b 7d 7d 7d 0a 7d 0a 0a 64 6f 5f 64 62   n {}}}.}..do_db
1710: 32 5f 74 65 73 74 20 33 2e 31 2e 33 20 22 53 45  2_test 3.1.3 "SE
1720: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22 20  LECT * FROM t1" 
1730: 7b 0a 20 20 36 20 56 49 20 33 20 74 68 72 65 65  {.  6 VI 3 three
1740: 20 34 20 66 6f 75 72 20 35 20 66 69 76 65 20 37   4 four 5 five 7
1750: 20 73 65 76 65 6e 0a 7d 0a 64 6f 5f 65 78 65 63   seven.}.do_exec
1760: 73 71 6c 5f 74 65 73 74 20 33 2e 31 2e 34 20 22  sql_test 3.1.4 "
1770: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1780: 22 20 7b 0a 20 20 31 20 6f 6e 65 20 32 20 74 77  " {.  1 one 2 tw
1790: 6f 20 33 20 74 68 72 65 65 20 34 20 66 6f 75 72  o 3 three 4 four
17a0: 20 35 20 66 69 76 65 20 36 20 73 69 78 20 37 20   5 five 6 six 7 
17b0: 73 65 76 65 6e 20 38 20 7b 7d 0a 7d 0a 0a 23 20  seven 8 {}.}..# 
17c0: 54 65 73 74 20 44 45 4c 45 54 45 20 63 68 61 6e  Test DELETE chan
17d0: 67 65 73 65 74 73 2e 0a 23 0a 64 6f 5f 65 78 65  gesets..#.do_exe
17e0: 63 73 71 6c 5f 74 65 73 74 20 33 2e 32 2e 31 20  csql_test 3.2.1 
17f0: 7b 0a 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69  {.  PRAGMA forei
1800: 67 6e 5f 6b 65 79 73 20 3d 20 6f 6e 3b 0a 20 20  gn_keys = on;.  
1810: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
1820: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
1830: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
1840: 45 20 74 33 28 63 2c 20 64 20 52 45 46 45 52 45  E t3(c, d REFERE
1850: 4e 43 45 53 20 74 32 29 3b 0a 20 20 49 4e 53 45  NCES t2);.  INSE
1860: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
1870: 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 49  S(1, 'one');.  I
1880: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
1890: 4c 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a  LUES(2, 'two');.
18a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
18b0: 20 56 41 4c 55 45 53 28 33 2c 20 27 74 68 72 65   VALUES(3, 'thre
18c0: 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  e');.  INSERT IN
18d0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 34 2c 20  TO t2 VALUES(4, 
18e0: 27 66 6f 75 72 27 29 3b 0a 7d 0a 64 6f 5f 64 62  'four');.}.do_db
18f0: 32 5f 74 65 73 74 20 33 2e 32 2e 32 20 7b 0a 20  2_test 3.2.2 {. 
1900: 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
1910: 6b 65 79 73 20 3d 20 6f 6e 3b 0a 20 20 43 52 45  keys = on;.  CRE
1920: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 50  ATE TABLE t2(a P
1930: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
1940: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1950: 33 28 63 2c 20 64 20 52 45 46 45 52 45 4e 43 45  3(c, d REFERENCE
1960: 53 20 74 32 29 3b 0a 20 20 49 4e 53 45 52 54 20  S t2);.  INSERT 
1970: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31  INTO t2 VALUES(1
1980: 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53 45  , 'one');.  INSE
1990: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
19a0: 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 49  S(2, 'two');.  I
19b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
19c0: 4c 55 45 53 28 34 2c 20 27 66 69 76 65 27 29 3b  LUES(4, 'five');
19d0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
19e0: 33 20 56 41 4c 55 45 53 28 27 69 27 2c 20 31 29  3 VALUES('i', 1)
19f0: 3b 0a 7d 0a 64 6f 5f 63 6f 6e 66 6c 69 63 74 5f  ;.}.do_conflict_
1a00: 74 65 73 74 20 33 2e 32 2e 33 20 2d 74 61 62 6c  test 3.2.3 -tabl
1a10: 65 73 20 74 32 20 2d 73 71 6c 20 7b 0a 20 20 44  es t2 -sql {.  D
1a20: 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48  ELETE FROM t2 WH
1a30: 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 44 45 4c  ERE a = 1;.  DEL
1a40: 45 54 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52  ETE FROM t2 WHER
1a50: 45 20 61 20 3d 20 32 3b 0a 20 20 44 45 4c 45 54  E a = 2;.  DELET
1a60: 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  E FROM t2 WHERE 
1a70: 61 20 3d 20 33 3b 0a 20 20 44 45 4c 45 54 45 20  a = 3;.  DELETE 
1a80: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 61 20  FROM t2 WHERE a 
1a90: 3d 20 34 3b 0a 7d 20 2d 63 6f 6e 66 6c 69 63 74  = 4;.} -conflict
1aa0: 73 20 7b 0a 20 20 7b 44 45 4c 45 54 45 20 74 32  s {.  {DELETE t2
1ab0: 20 4e 4f 54 46 4f 55 4e 44 20 7b 69 20 33 20 74   NOTFOUND {i 3 t
1ac0: 20 74 68 72 65 65 7d 7d 0a 20 20 7b 44 45 4c 45   three}}.  {DELE
1ad0: 54 45 20 74 32 20 44 41 54 41 20 7b 69 20 34 20  TE t2 DATA {i 4 
1ae0: 74 20 66 6f 75 72 7d 20 7b 69 20 34 20 74 20 66  t four} {i 4 t f
1af0: 69 76 65 7d 7d 0a 20 20 7b 46 4f 52 45 49 47 4e  ive}}.  {FOREIGN
1b00: 5f 4b 45 59 20 31 7d 0a 7d 0a 64 6f 5f 65 78 65  _KEY 1}.}.do_exe
1b10: 63 73 71 6c 5f 74 65 73 74 20 33 2e 32 2e 34 20  csql_test 3.2.4 
1b20: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
1b30: 32 22 20 7b 7d 0a 64 6f 5f 64 62 32 5f 74 65 73  2" {}.do_db2_tes
1b40: 74 20 20 20 20 20 33 2e 32 2e 35 20 22 53 45 4c  t     3.2.5 "SEL
1b50: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 22 20 7b  ECT * FROM t2" {
1b60: 34 20 66 69 76 65 7d 0a 0a 23 20 54 65 73 74 20  4 five}..# Test 
1b70: 55 50 44 41 54 45 20 63 68 61 6e 67 65 73 65 74  UPDATE changeset
1b80: 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  s..#.do_execsql_
1b90: 74 65 73 74 20 33 2e 33 2e 31 20 7b 0a 20 20 43  test 3.3.1 {.  C
1ba0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 61  REATE TABLE t4(a
1bb0: 2c 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59 20  , b, c, PRIMARY 
1bc0: 4b 45 59 28 62 2c 20 63 29 29 3b 0a 20 20 49 4e  KEY(b, c));.  IN
1bd0: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
1be0: 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20  UES(1, 2, 3);.  
1bf0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
1c00: 41 4c 55 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a  ALUES(4, 5, 6);.
1c10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34    INSERT INTO t4
1c20: 20 56 41 4c 55 45 53 28 37 2c 20 38 2c 20 39 29   VALUES(7, 8, 9)
1c30: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
1c40: 74 34 20 56 41 4c 55 45 53 28 31 30 2c 20 31 31  t4 VALUES(10, 11
1c50: 2c 20 31 32 29 3b 0a 7d 0a 64 6f 5f 64 62 32 5f  , 12);.}.do_db2_
1c60: 74 65 73 74 20 33 2e 33 2e 32 20 7b 0a 20 20 43  test 3.3.2 {.  C
1c70: 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 61  REATE TABLE t4(a
1c80: 20 4e 4f 54 20 4e 55 4c 4c 2c 20 62 2c 20 63 2c   NOT NULL, b, c,
1c90: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 62 2c 20   PRIMARY KEY(b, 
1ca0: 63 29 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  c));.  INSERT IN
1cb0: 54 4f 20 74 34 20 56 41 4c 55 45 53 28 30 2c 20  TO t4 VALUES(0, 
1cc0: 32 2c 20 33 29 3b 0a 20 20 49 4e 53 45 52 54 20  2, 3);.  INSERT 
1cd0: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 34  INTO t4 VALUES(4
1ce0: 2c 20 35 2c 20 37 29 3b 0a 20 20 49 4e 53 45 52  , 5, 7);.  INSER
1cf0: 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53  T INTO t4 VALUES
1d00: 28 37 2c 20 38 2c 20 39 29 3b 0a 20 20 49 4e 53  (7, 8, 9);.  INS
1d10: 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
1d20: 45 53 28 31 30 2c 20 31 31 2c 20 31 32 29 3b 0a  ES(10, 11, 12);.
1d30: 7d 0a 64 6f 5f 63 6f 6e 66 6c 69 63 74 5f 74 65  }.do_conflict_te
1d40: 73 74 20 33 2e 33 2e 33 20 2d 74 61 62 6c 65 73  st 3.3.3 -tables
1d50: 20 74 34 20 2d 73 71 6c 20 7b 0a 20 20 55 50 44   t4 -sql {.  UPD
1d60: 41 54 45 20 74 34 20 53 45 54 20 61 20 3d 20 2d  ATE t4 SET a = -
1d70: 31 20 57 48 45 52 45 20 62 20 3d 20 32 3b 0a 20  1 WHERE b = 2;. 
1d80: 20 55 50 44 41 54 45 20 74 34 20 53 45 54 20 61   UPDATE t4 SET a
1d90: 20 3d 20 2d 31 20 57 48 45 52 45 20 62 20 3d 20   = -1 WHERE b = 
1da0: 35 3b 0a 20 20 55 50 44 41 54 45 20 74 34 20 53  5;.  UPDATE t4 S
1db0: 45 54 20 61 20 3d 20 4e 55 4c 4c 20 57 48 45 52  ET a = NULL WHER
1dc0: 45 20 63 20 3d 20 39 3b 0a 20 20 55 50 44 41 54  E c = 9;.  UPDAT
1dd0: 45 20 74 34 20 53 45 54 20 61 20 3d 20 27 78 27  E t4 SET a = 'x'
1de0: 20 57 48 45 52 45 20 62 20 3d 20 31 31 3b 0a 7d   WHERE b = 11;.}
1df0: 20 2d 63 6f 6e 66 6c 69 63 74 73 20 7b 0a 20 20   -conflicts {.  
1e00: 7b 55 50 44 41 54 45 20 74 34 20 44 41 54 41 20  {UPDATE t4 DATA 
1e10: 7b 69 20 31 20 69 20 32 20 69 20 33 7d 20 7b 69  {i 1 i 2 i 3} {i
1e20: 20 2d 31 20 7b 7d 20 7b 7d 20 7b 7d 20 7b 7d 7d   -1 {} {} {} {}}
1e30: 20 7b 69 20 30 20 69 20 32 20 69 20 33 7d 7d 0a   {i 0 i 2 i 3}}.
1e40: 20 20 7b 55 50 44 41 54 45 20 74 34 20 4e 4f 54    {UPDATE t4 NOT
1e50: 46 4f 55 4e 44 20 7b 69 20 34 20 69 20 35 20 69  FOUND {i 4 i 5 i
1e60: 20 36 7d 20 7b 69 20 2d 31 20 7b 7d 20 7b 7d 20   6} {i -1 {} {} 
1e70: 7b 7d 20 7b 7d 7d 7d 0a 20 20 7b 55 50 44 41 54  {} {}}}.  {UPDAT
1e80: 45 20 74 34 20 43 4f 4e 53 54 52 41 49 4e 54 20  E t4 CONSTRAINT 
1e90: 7b 69 20 37 20 69 20 38 20 69 20 39 7d 20 7b 6e  {i 7 i 8 i 9} {n
1ea0: 20 7b 7d 20 7b 7d 20 7b 7d 20 7b 7d 20 7b 7d 7d   {} {} {} {} {}}
1eb0: 7d 0a 7d 0a 64 6f 5f 64 62 32 5f 74 65 73 74 20  }.}.do_db2_test 
1ec0: 20 20 20 20 33 2e 33 2e 34 20 7b 20 53 45 4c 45      3.3.4 { SELE
1ed0: 43 54 20 2a 20 46 52 4f 4d 20 74 34 20 7d 20 7b  CT * FROM t4 } {
1ee0: 30 20 32 20 33 20 34 20 35 20 37 20 37 20 38 20  0 2 3 4 5 7 7 8 
1ef0: 39 20 78 20 31 31 20 31 32 7d 0a 64 6f 5f 65 78  9 x 11 12}.do_ex
1f00: 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 33 2e 35  ecsql_test 3.3.5
1f10: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
1f20: 20 74 34 20 7d 20 7b 2d 31 20 32 20 33 20 2d 31   t4 } {-1 2 3 -1
1f30: 20 35 20 36 20 7b 7d 20 38 20 39 20 78 20 31 31   5 6 {} 8 9 x 11
1f40: 20 31 32 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   12}..#---------
1f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f90: 0a 23 20 54 68 69 73 20 6e 65 78 74 20 62 6c 6f  .# This next blo
1fa0: 63 6b 20 6f 66 20 74 65 73 74 73 20 76 65 72 69  ck of tests veri
1fb0: 66 69 65 73 20 74 68 61 74 20 76 61 6c 75 65 73  fies that values
1fc0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
1fd0: 20 63 6f 6e 66 6c 69 63 74 0a 23 20 68 61 6e 64   conflict.# hand
1fe0: 6c 65 72 20 61 72 65 20 69 6e 74 65 70 72 65 74  ler are intepret
1ff0: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 23 0a  ed correctly..#.
2000: 0a 70 72 6f 63 20 74 65 73 74 5f 72 65 73 65 74  .proc test_reset
2010: 20 7b 7d 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65   {} {.  db close
2020: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 66  .  db2 close.  f
2030: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
2040: 64 62 20 74 65 73 74 2e 64 62 32 0a 20 20 73 71  db test.db2.  sq
2050: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
2060: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
2070: 65 73 74 2e 64 62 32 0a 7d 0a 0a 70 72 6f 63 20  est.db2.}..proc 
2080: 78 43 6f 6e 66 6c 69 63 74 20 7b 61 72 67 73 7d  xConflict {args}
2090: 20 7b 0a 20 20 6c 61 70 70 65 6e 64 20 3a 3a 78   {.  lappend ::x
20a0: 43 6f 6e 66 6c 69 63 74 20 24 61 72 67 73 0a 20  Conflict $args. 
20b0: 20 72 65 74 75 72 6e 20 24 3a 3a 63 6f 6e 66 6c   return $::confl
20c0: 69 63 74 5f 72 65 74 75 72 6e 0a 7d 0a 0a 66 6f  ict_return.}..fo
20d0: 72 65 61 63 68 20 7b 74 6e 20 63 6f 6e 66 6c 69  reach {tn confli
20e0: 63 74 5f 72 65 74 75 72 6e 20 61 66 74 65 72 7d  ct_return after}
20f0: 20 7b 0a 20 20 31 20 4f 4d 49 54 20 20 20 20 20   {.  1 OMIT     
2100: 20 7b 31 20 32 20 76 61 6c 75 65 31 20 20 20 34   {1 2 value1   4
2110: 20 35 20 37 20 20 20 20 20 20 20 31 30 20 78 20   5 7       10 x 
2120: 78 7d 0a 20 20 32 20 52 45 50 4c 41 43 45 20 20  x}.  2 REPLACE  
2130: 20 7b 31 20 32 20 76 61 6c 75 65 31 20 20 20 34   {1 2 value1   4
2140: 20 35 20 76 61 6c 75 65 32 20 20 31 30 20 38 20   5 value2  10 8 
2150: 39 7d 0a 7d 20 7b 0a 20 20 74 65 73 74 5f 72 65  9}.} {.  test_re
2160: 73 65 74 0a 0a 20 20 64 6f 5f 74 65 73 74 20 34  set..  do_test 4
2170: 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 66 6f 72  .$tn.1 {.    for
2180: 65 61 63 68 20 64 62 20 7b 64 62 20 64 62 32 7d  each db {db db2}
2190: 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c   {.      execsql
21a0: 20 7b 20 0a 20 20 20 20 20 20 20 20 43 52 45 41   { .        CREA
21b0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
21c0: 2c 20 63 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , c, PRIMARY KEY
21d0: 28 61 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  (a));.        IN
21e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
21f0: 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20  UES(1, 2, 3);.  
2200: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2210: 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20 35  O t1 VALUES(4, 5
2220: 2c 20 36 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  , 6);.        IN
2230: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
2240: 55 45 53 28 37 2c 20 38 2c 20 39 29 3b 0a 20 20  UES(7, 8, 9);.  
2250: 20 20 20 20 7d 20 24 64 62 0a 20 20 20 20 7d 0a      } $db.    }.
2260: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20      execsql { . 
2270: 20 20 20 20 20 52 45 50 4c 41 43 45 20 49 4e 54       REPLACE INT
2280: 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20 35  O t1 VALUES(4, 5
2290: 2c 20 37 29 3b 0a 20 20 20 20 20 20 52 45 50 4c  , 7);.      REPL
22a0: 41 43 45 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ACE INTO t1 VALU
22b0: 45 53 28 31 30 2c 20 27 78 27 2c 20 27 78 27 29  ES(10, 'x', 'x')
22c0: 3b 0a 20 20 20 20 7d 20 64 62 32 0a 20 20 7d 20  ;.    } db2.  } 
22d0: 7b 7d 0a 0a 20 20 64 6f 5f 63 6f 6e 66 6c 69 63  {}..  do_conflic
22e0: 74 5f 74 65 73 74 20 34 2e 24 74 6e 2e 32 20 2d  t_test 4.$tn.2 -
22f0: 74 61 62 6c 65 73 20 74 31 20 2d 73 71 6c 20 7b  tables t1 -sql {
2300: 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53  .    UPDATE t1 S
2310: 45 54 20 63 20 3d 20 27 76 61 6c 75 65 31 27 20  ET c = 'value1' 
2320: 57 48 45 52 45 20 61 20 3d 20 31 3b 20 20 20 20  WHERE a = 1;    
2330: 20 20 20 2d 2d 20 6e 6f 20 63 6f 6e 66 6c 69 63     -- no conflic
2340: 74 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20  t.    UPDATE t1 
2350: 53 45 54 20 63 20 3d 20 27 76 61 6c 75 65 32 27  SET c = 'value2'
2360: 20 57 48 45 52 45 20 61 20 3d 20 34 3b 20 20 20   WHERE a = 4;   
2370: 20 20 20 20 2d 2d 20 44 41 54 41 20 63 6f 6e 66      -- DATA conf
2380: 6c 69 63 74 0a 20 20 20 20 55 50 44 41 54 45 20  lict.    UPDATE 
2390: 74 31 20 53 45 54 20 61 20 3d 20 31 30 20 57 48  t1 SET a = 10 WH
23a0: 45 52 45 20 61 20 3d 20 37 3b 20 20 20 20 20 20  ERE a = 7;      
23b0: 20 20 20 20 20 20 20 2d 2d 20 43 4f 4e 46 4c 49         -- CONFLI
23c0: 43 54 20 63 6f 6e 66 6c 69 63 74 0a 20 20 7d 20  CT conflict.  } 
23d0: 2d 63 6f 6e 66 6c 69 63 74 73 20 7b 0a 20 20 20  -conflicts {.   
23e0: 20 7b 49 4e 53 45 52 54 20 74 31 20 43 4f 4e 46   {INSERT t1 CONF
23f0: 4c 49 43 54 20 7b 69 20 31 30 20 69 20 38 20 69  LICT {i 10 i 8 i
2400: 20 39 7d 20 7b 69 20 31 30 20 74 20 78 20 74 20   9} {i 10 t x t 
2410: 78 7d 7d 0a 20 20 20 20 7b 55 50 44 41 54 45 20  x}}.    {UPDATE 
2420: 74 31 20 44 41 54 41 20 7b 69 20 34 20 7b 7d 20  t1 DATA {i 4 {} 
2430: 7b 7d 20 69 20 36 7d 20 7b 7b 7d 20 7b 7d 20 7b  {} i 6} {{} {} {
2440: 7d 20 7b 7d 20 74 20 76 61 6c 75 65 32 7d 20 7b  } {} t value2} {
2450: 69 20 34 20 69 20 35 20 69 20 37 7d 7d 0a 20 20  i 4 i 5 i 7}}.  
2460: 7d 0a 0a 20 20 64 6f 5f 64 62 32 5f 74 65 73 74  }..  do_db2_test
2470: 20 34 2e 24 74 6e 2e 33 20 22 53 45 4c 45 43 54   4.$tn.3 "SELECT
2480: 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52   * FROM t1 ORDER
2490: 20 42 59 20 61 22 20 24 61 66 74 65 72 0a 7d 0a   BY a" $after.}.
24a0: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 63 6f 6e  .foreach {tn con
24b0: 66 6c 69 63 74 5f 72 65 74 75 72 6e 7d 20 7b 0a  flict_return} {.
24c0: 20 20 31 20 4f 4d 49 54 0a 20 20 32 20 52 45 50    1 OMIT.  2 REP
24d0: 4c 41 43 45 0a 7d 20 7b 0a 20 20 74 65 73 74 5f  LACE.} {.  test_
24e0: 72 65 73 65 74 0a 0a 20 20 64 6f 5f 74 65 73 74  reset..  do_test
24f0: 20 35 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 23   5.$tn.1 {.    #
2500: 20 43 72 65 61 74 65 20 61 6e 20 69 64 65 6e 74   Create an ident
2510: 69 63 61 6c 20 73 63 68 65 6d 61 20 69 6e 20 62  ical schema in b
2520: 6f 74 68 20 64 61 74 61 62 61 73 65 73 2e 0a 20  oth databases.. 
2530: 20 20 20 73 65 74 20 73 63 68 65 6d 61 20 7b 0a     set schema {.
2540: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
2550: 4c 45 20 22 27 66 6f 6f 6c 69 73 68 20 6e 61 6d  LE "'foolish nam
2560: 65 27 22 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49  e'"(x, y, z, PRI
2570: 4d 41 52 59 20 4b 45 59 28 78 2c 20 79 29 29 3b  MARY KEY(x, y));
2580: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73  .    }.    execs
2590: 71 6c 20 24 73 63 68 65 6d 61 20 64 62 0a 20 20  ql $schema db.  
25a0: 20 20 65 78 65 63 73 71 6c 20 24 73 63 68 65 6d    execsql $schem
25b0: 61 20 64 62 32 0a 0a 20 20 20 20 23 20 41 64 64  a db2..    # Add
25c0: 20 73 6f 6d 65 20 72 6f 77 73 20 74 6f 20 5b 64   some rows to [d
25d0: 62 32 5d 2e 20 54 68 65 73 65 20 72 6f 77 73 20  b2]. These rows 
25e0: 77 69 6c 6c 20 63 61 75 73 65 20 63 6f 6e 66 6c  will cause confl
25f0: 69 63 74 73 20 6c 61 74 65 72 0a 20 20 20 20 23  icts later.    #
2600: 20 6f 6e 20 77 68 65 6e 20 74 68 65 20 63 68 61   on when the cha
2610: 6e 67 65 73 65 74 20 66 72 6f 6d 20 5b 64 62 5d  ngeset from [db]
2620: 20 69 73 20 61 70 70 6c 69 65 64 20 74 6f 20 69   is applied to i
2630: 74 2e 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  t..    execsql {
2640: 20 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49   .      INSERT I
2650: 4e 54 4f 20 22 27 66 6f 6f 6c 69 73 68 20 6e 61  NTO "'foolish na
2660: 6d 65 27 22 20 56 41 4c 55 45 53 28 27 6f 6e 65  me'" VALUES('one
2670: 27 2c 20 27 6f 6e 65 27 2c 20 27 69 69 27 29 3b  ', 'one', 'ii');
2680: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
2690: 54 4f 20 22 27 66 6f 6f 6c 69 73 68 20 6e 61 6d  TO "'foolish nam
26a0: 65 27 22 20 56 41 4c 55 45 53 28 27 6f 6e 65 27  e'" VALUES('one'
26b0: 2c 20 27 74 77 6f 27 2c 20 27 69 27 29 3b 0a 20  , 'two', 'i');. 
26c0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
26d0: 20 22 27 66 6f 6f 6c 69 73 68 20 6e 61 6d 65 27   "'foolish name'
26e0: 22 20 56 41 4c 55 45 53 28 27 74 77 6f 27 2c 20  " VALUES('two', 
26f0: 27 74 77 6f 27 2c 20 27 69 69 27 29 3b 0a 20 20  'two', 'ii');.  
2700: 20 20 7d 20 64 62 32 0a 0a 20 20 7d 20 7b 7d 0a    } db2..  } {}.
2710: 0a 20 20 64 6f 5f 63 6f 6e 66 6c 69 63 74 5f 74  .  do_conflict_t
2720: 65 73 74 20 35 2e 24 74 6e 2e 32 20 2d 74 61 62  est 5.$tn.2 -tab
2730: 6c 65 73 20 7b 7b 27 66 6f 6f 6c 69 73 68 20 6e  les {{'foolish n
2740: 61 6d 65 27 7d 7d 20 2d 73 71 6c 20 7b 0a 20 20  ame'}} -sql {.  
2750: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 22 27    INSERT INTO "'
2760: 66 6f 6f 6c 69 73 68 20 6e 61 6d 65 27 22 20 56  foolish name'" V
2770: 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27 74 77  ALUES('one', 'tw
2780: 6f 27 2c 20 32 29 3b 0a 20 20 7d 20 2d 63 6f 6e  o', 2);.  } -con
2790: 66 6c 69 63 74 73 20 7b 0a 20 20 20 20 7b 49 4e  flicts {.    {IN
27a0: 53 45 52 54 20 7b 27 66 6f 6f 6c 69 73 68 20 6e  SERT {'foolish n
27b0: 61 6d 65 27 7d 20 43 4f 4e 46 4c 49 43 54 20 7b  ame'} CONFLICT {
27c0: 74 20 6f 6e 65 20 74 20 74 77 6f 20 69 20 32 7d  t one t two i 2}
27d0: 20 7b 74 20 6f 6e 65 20 74 20 74 77 6f 20 74 20   {t one t two t 
27e0: 69 7d 7d 0a 20 20 7d 0a 0a 20 20 73 65 74 20 72  i}}.  }..  set r
27f0: 65 73 28 52 45 50 4c 41 43 45 29 20 7b 6f 6e 65  es(REPLACE) {one
2800: 20 6f 6e 65 20 69 69 20 6f 6e 65 20 74 77 6f 20   one ii one two 
2810: 32 20 74 77 6f 20 74 77 6f 20 69 69 7d 0a 20 20  2 two two ii}.  
2820: 73 65 74 20 72 65 73 28 4f 4d 49 54 29 20 20 20  set res(OMIT)   
2830: 20 7b 6f 6e 65 20 6f 6e 65 20 69 69 20 6f 6e 65   {one one ii one
2840: 20 74 77 6f 20 69 20 74 77 6f 20 74 77 6f 20 69   two i two two i
2850: 69 7d 0a 20 20 64 6f 5f 64 62 32 5f 74 65 73 74  i}.  do_db2_test
2860: 20 35 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 53   5.$tn.3 {.    S
2870: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 22 27 66  ELECT * FROM "'f
2880: 6f 6f 6c 69 73 68 20 6e 61 6d 65 27 22 20 4f 52  oolish name'" OR
2890: 44 45 52 20 42 59 20 78 2c 20 79 0a 20 20 7d 20  DER BY x, y.  } 
28a0: 24 72 65 73 28 24 63 6f 6e 66 6c 69 63 74 5f 72  $res($conflict_r
28b0: 65 74 75 72 6e 29 0a 0a 0a 20 20 64 6f 5f 74 65  eturn)...  do_te
28c0: 73 74 20 35 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  st 5.$tn.1 {.   
28d0: 20 73 65 74 20 73 63 68 65 6d 61 20 7b 0a 20 20   set schema {.  
28e0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
28f0: 20 64 31 28 22 7a 22 22 7a 22 20 50 52 49 4d 41   d1("z""z" PRIMA
2900: 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20  RY KEY, y);.    
2910: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 31    INSERT INTO d1
2920: 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27   VALUES(1, 'one'
2930: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
2940: 49 4e 54 4f 20 64 31 20 56 41 4c 55 45 53 28 32  INTO d1 VALUES(2
2950: 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20 7d 0a  , 'two');.    }.
2960: 20 20 20 20 65 78 65 63 73 71 6c 20 24 73 63 68      execsql $sch
2970: 65 6d 61 20 64 62 0a 20 20 20 20 65 78 65 63 73  ema db.    execs
2980: 71 6c 20 24 73 63 68 65 6d 61 20 64 62 32 0a 0a  ql $schema db2..
2990: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20      execsql { . 
29a0: 20 20 20 20 20 55 50 44 41 54 45 20 64 31 20 53       UPDATE d1 S
29b0: 45 54 20 79 20 3d 20 27 54 57 4f 27 20 57 48 45  ET y = 'TWO' WHE
29c0: 52 45 20 22 7a 22 22 7a 22 20 3d 20 32 3b 0a 20  RE "z""z" = 2;. 
29d0: 20 20 20 7d 20 64 62 32 0a 0a 20 20 7d 20 7b 7d     } db2..  } {}
29e0: 0a 0a 20 20 64 6f 5f 63 6f 6e 66 6c 69 63 74 5f  ..  do_conflict_
29f0: 74 65 73 74 20 35 2e 24 74 6e 2e 32 20 2d 74 61  test 5.$tn.2 -ta
2a00: 62 6c 65 73 20 64 31 20 2d 73 71 6c 20 7b 0a 20  bles d1 -sql {. 
2a10: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 64     DELETE FROM d
2a20: 31 20 57 48 45 52 45 20 22 7a 22 22 7a 22 20 3d  1 WHERE "z""z" =
2a30: 20 32 3b 0a 20 20 7d 20 2d 63 6f 6e 66 6c 69 63   2;.  } -conflic
2a40: 74 73 20 7b 0a 20 20 20 20 7b 44 45 4c 45 54 45  ts {.    {DELETE
2a50: 20 64 31 20 44 41 54 41 20 7b 69 20 32 20 74 20   d1 DATA {i 2 t 
2a60: 74 77 6f 7d 20 7b 69 20 32 20 74 20 54 57 4f 7d  two} {i 2 t TWO}
2a70: 7d 0a 20 20 7d 0a 0a 20 20 73 65 74 20 72 65 73  }.  }..  set res
2a80: 28 52 45 50 4c 41 43 45 29 20 7b 31 20 6f 6e 65  (REPLACE) {1 one
2a90: 7d 0a 20 20 73 65 74 20 72 65 73 28 4f 4d 49 54  }.  set res(OMIT
2aa0: 29 20 20 20 20 7b 31 20 6f 6e 65 20 32 20 54 57  )    {1 one 2 TW
2ab0: 4f 7d 0a 20 20 64 6f 5f 64 62 32 5f 74 65 73 74  O}.  do_db2_test
2ac0: 20 35 2e 24 74 6e 2e 33 20 22 53 45 4c 45 43 54   5.$tn.3 "SELECT
2ad0: 20 2a 20 46 52 4f 4d 20 64 31 22 20 24 72 65 73   * FROM d1" $res
2ae0: 28 24 63 6f 6e 66 6c 69 63 74 5f 72 65 74 75 72  ($conflict_retur
2af0: 6e 29 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  n).}..#---------
2b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b40: 0a 23 20 54 65 73 74 20 74 68 61 74 20 74 77 6f  .# Test that two
2b50: 20 74 61 62 6c 65 73 20 63 61 6e 20 62 65 20 6d   tables can be m
2b60: 6f 6e 69 74 6f 72 65 64 20 62 79 20 61 20 73 69  onitored by a si
2b70: 6e 67 6c 65 20 73 65 73 73 69 6f 6e 20 6f 62 6a  ngle session obj
2b80: 65 63 74 2e 0a 23 0a 74 65 73 74 5f 72 65 73 65  ect..#.test_rese
2b90: 74 0a 73 65 74 20 73 63 68 65 6d 61 20 7b 0a 20  t.set schema {. 
2ba0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
2bb0: 28 61 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  (a COLLATE nocas
2bc0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  e PRIMARY KEY, b
2bd0: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
2be0: 45 20 74 32 28 61 2c 20 62 20 50 52 49 4d 41 52  E t2(a, b PRIMAR
2bf0: 59 20 4b 45 59 29 3b 0a 7d 0a 64 6f 5f 74 65 73  Y KEY);.}.do_tes
2c00: 74 20 36 2e 30 20 7b 0a 20 20 65 78 65 63 73 71  t 6.0 {.  execsq
2c10: 6c 20 24 73 63 68 65 6d 61 20 64 62 0a 20 20 65  l $schema db.  e
2c20: 78 65 63 73 71 6c 20 24 73 63 68 65 6d 61 20 64  xecsql $schema d
2c30: 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  b2.  execsql {. 
2c40: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2c50: 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  1 VALUES('a', 'b
2c60: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
2c70: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 61  NTO t2 VALUES('a
2c80: 27 2c 20 27 62 27 29 3b 0a 20 20 7d 20 64 62 32  ', 'b');.  } db2
2c90: 0a 7d 20 7b 7d 0a 0a 73 65 74 20 63 6f 6e 66 6c  .} {}..set confl
2ca0: 69 63 74 5f 72 65 74 75 72 6e 20 22 22 0a 64 6f  ict_return "".do
2cb0: 5f 63 6f 6e 66 6c 69 63 74 5f 74 65 73 74 20 36  _conflict_test 6
2cc0: 2e 31 20 2d 74 61 62 6c 65 73 20 7b 74 31 20 74  .1 -tables {t1 t
2cd0: 32 7d 20 2d 73 71 6c 20 7b 0a 20 20 49 4e 53 45  2} -sql {.  INSE
2ce0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
2cf0: 53 28 27 31 27 2c 20 27 32 27 29 3b 0a 20 20 49  S('1', '2');.  I
2d00: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
2d10: 4c 55 45 53 28 27 41 27 2c 20 27 42 27 29 3b 0a  LUES('A', 'B');.
2d20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
2d30: 20 56 41 4c 55 45 53 28 27 41 27 2c 20 27 42 27   VALUES('A', 'B'
2d40: 29 3b 0a 7d 20 2d 63 6f 6e 66 6c 69 63 74 73 20  );.} -conflicts 
2d50: 7b 0a 20 20 7b 49 4e 53 45 52 54 20 74 31 20 43  {.  {INSERT t1 C
2d60: 4f 4e 46 4c 49 43 54 20 7b 74 20 41 20 74 20 42  ONFLICT {t A t B
2d70: 7d 20 7b 74 20 61 20 74 20 62 7d 7d 0a 7d 0a 0a  } {t a t b}}.}..
2d80: 64 6f 5f 64 62 32 5f 74 65 73 74 20 36 2e 32 20  do_db2_test 6.2 
2d90: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
2da0: 31 22 20 7b 61 20 62 20 31 20 32 7d 0a 64 6f 5f  1" {a b 1 2}.do_
2db0: 64 62 32 5f 74 65 73 74 20 36 2e 33 20 22 53 45  db2_test 6.3 "SE
2dc0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 22 20  LECT * FROM t2" 
2dd0: 7b 61 20 62 20 41 20 42 7d 0a 0a 23 2d 2d 2d 2d  {a b A B}..#----
2de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e20: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
2e30: 74 20 73 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  t session object
2e40: 73 20 61 72 65 20 6e 6f 74 20 63 6f 6e 66 75 73  s are not confus
2e50: 65 64 20 62 79 20 63 68 61 6e 67 65 73 20 74 6f  ed by changes to
2e60: 20 74 61 62 6c 65 20 69 6e 0a 23 20 6f 74 68 65   table in.# othe
2e70: 72 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a 63  r databases..#.c
2e80: 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73 65  atch { db2 close
2e90: 20 7d 0a 64 72 6f 70 5f 61 6c 6c 5f 74 61 62 6c   }.drop_all_tabl
2ea0: 65 73 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74  es.forcedelete t
2eb0: 65 73 74 2e 64 62 32 0a 64 6f 5f 69 74 65 72 61  est.db2.do_itera
2ec0: 74 6f 72 5f 74 65 73 74 20 37 2e 31 20 2a 20 7b  tor_test 7.1 * {
2ed0: 0a 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e  .  ATTACH 'test.
2ee0: 64 62 32 27 20 41 53 20 61 75 78 3b 0a 20 20 43  db2' AS aux;.  C
2ef0: 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e  REATE TABLE main
2f00: 2e 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45  .t1(x PRIMARY KE
2f10: 59 2c 20 79 29 3b 0a 20 20 43 52 45 41 54 45 20  Y, y);.  CREATE 
2f20: 54 41 42 4c 45 20 61 75 78 2e 74 31 28 78 20 50  TABLE aux.t1(x P
2f30: 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
2f40: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d  .  INSERT INTO m
2f50: 61 69 6e 2e 74 31 20 56 41 4c 55 45 53 28 27 6f  ain.t1 VALUES('o
2f60: 6e 65 27 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52  ne', 1);.  INSER
2f70: 54 20 49 4e 54 4f 20 6d 61 69 6e 2e 74 31 20 56  T INTO main.t1 V
2f80: 41 4c 55 45 53 28 27 74 77 6f 27 2c 20 32 29 3b  ALUES('two', 2);
2f90: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61  .  INSERT INTO a
2fa0: 75 78 2e 74 31 20 56 41 4c 55 45 53 28 27 74 68  ux.t1 VALUES('th
2fb0: 72 65 65 27 2c 20 33 29 3b 0a 20 20 49 4e 53 45  ree', 3);.  INSE
2fc0: 52 54 20 49 4e 54 4f 20 61 75 78 2e 74 31 20 56  RT INTO aux.t1 V
2fd0: 41 4c 55 45 53 28 27 66 6f 75 72 27 2c 20 34 29  ALUES('four', 4)
2fe0: 3b 0a 7d 20 7b 0a 20 20 7b 49 4e 53 45 52 54 20  ;.} {.  {INSERT 
2ff0: 74 31 20 30 20 58 2e 20 7b 7d 20 7b 74 20 74 77  t1 0 X. {} {t tw
3000: 6f 20 69 20 32 7d 7d 20 0a 20 20 7b 49 4e 53 45  o i 2}} .  {INSE
3010: 52 54 20 74 31 20 30 20 58 2e 20 7b 7d 20 7b 74  RT t1 0 X. {} {t
3020: 20 6f 6e 65 20 69 20 31 7d 7d 0a 7d 0a 0a 23 2d   one i 1}}.}..#-
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 65 73 74 20  --------.# Test 
3080: 74 68 65 20 73 71 6c 69 74 65 33 73 65 73 73 69  the sqlite3sessi
3090: 6f 6e 5f 69 73 65 6d 70 74 79 28 29 20 66 75 6e  on_isempty() fun
30a0: 63 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74  ction..#.do_test
30b0: 20 38 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c   8.1 {.  execsql
30c0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
30d0: 42 4c 45 20 74 35 28 78 20 50 52 49 4d 41 52 59  BLE t5(x PRIMARY
30e0: 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 43 52   KEY, y);.    CR
30f0: 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 78 20  EATE TABLE t6(x 
3100: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b  PRIMARY KEY, y);
3110: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3120: 20 74 35 20 56 41 4c 55 45 53 28 27 61 27 2c 20   t5 VALUES('a', 
3130: 27 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'b');.    INSERT
3140: 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28   INTO t6 VALUES(
3150: 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a 20  'a', 'b');.  }. 
3160: 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 20   sqlite3session 
3170: 53 20 64 62 20 6d 61 69 6e 0a 20 20 53 20 61 74  S db main.  S at
3180: 74 61 63 68 20 2a 0a 0a 20 20 53 20 69 73 65 6d  tach *..  S isem
3190: 70 74 79 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  pty.} {1}.do_tes
31a0: 74 20 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  t 8.2 {.  execsq
31b0: 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
31c0: 74 35 20 7d 0a 20 20 53 20 69 73 65 6d 70 74 79  t5 }.  S isempty
31d0: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 38  .} {0}.do_test 8
31e0: 2e 33 20 7b 0a 20 20 53 20 64 65 6c 65 74 65 0a  .3 {.  S delete.
31f0: 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e    sqlite3session
3200: 20 53 20 64 62 20 6d 61 69 6e 0a 20 20 53 20 61   S db main.  S a
3210: 74 74 61 63 68 20 74 35 0a 20 20 65 78 65 63 73  ttach t5.  execs
3220: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
3230: 20 74 35 20 7d 0a 20 20 53 20 69 73 65 6d 70 74   t5 }.  S isempt
3240: 79 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  y.} {1}.do_test 
3250: 38 2e 34 20 7b 20 53 20 64 65 6c 65 74 65 20 7d  8.4 { S delete }
3260: 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 38 2e 35   {}..do_test 8.5
3270: 20 7b 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73   {.  sqlite3sess
3280: 69 6f 6e 20 53 20 64 62 20 6d 61 69 6e 0a 20 20  ion S db main.  
3290: 53 20 61 74 74 61 63 68 20 74 35 0a 20 20 53 20  S attach t5.  S 
32a0: 61 74 74 61 63 68 20 74 36 0a 20 20 65 78 65 63  attach t6.  exec
32b0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
32c0: 4f 20 74 35 20 56 41 4c 55 45 53 28 31 2c 20 32  O t5 VALUES(1, 2
32d0: 29 20 7d 0a 20 20 53 20 69 73 65 6d 70 74 79 0a  ) }.  S isempty.
32e0: 7d 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 38  } {0}..do_test 8
32f0: 2e 36 20 7b 0a 20 20 53 20 64 65 6c 65 74 65 0a  .6 {.  S delete.
3300: 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e    sqlite3session
3310: 20 53 20 64 62 20 6d 61 69 6e 0a 20 20 53 20 61   S db main.  S a
3320: 74 74 61 63 68 20 74 35 0a 20 20 53 20 61 74 74  ttach t5.  S att
3330: 61 63 68 20 74 36 0a 20 20 65 78 65 63 73 71 6c  ach t6.  execsql
3340: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
3350: 36 20 56 41 4c 55 45 53 28 31 2c 20 32 29 20 7d  6 VALUES(1, 2) }
3360: 0a 20 20 53 20 69 73 65 6d 70 74 79 0a 7d 20 7b  .  S isempty.} {
3370: 30 7d 0a 64 6f 5f 74 65 73 74 20 38 2e 37 20 7b  0}.do_test 8.7 {
3380: 20 53 20 64 65 6c 65 74 65 20 7d 20 7b 7d 0a 0a   S delete } {}..
3390: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
33a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 64 6f 5f  ----------.#.do_
33e0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 39 2e 31  execsql_test 9.1
33f0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
3400: 45 20 74 37 28 61 2c 20 62 2c 20 63 2c 20 64 2c  E t7(a, b, c, d,
3410: 20 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20   e PRIMARY KEY, 
3420: 66 2c 20 67 29 3b 0a 20 20 49 4e 53 45 52 54 20  f, g);.  INSERT 
3430: 49 4e 54 4f 20 74 37 20 56 41 4c 55 45 53 28 31  INTO t7 VALUES(1
3440: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
3450: 20 31 29 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 39   1);.}.do_test 9
3460: 2e 32 20 7b 20 0a 20 20 73 71 6c 69 74 65 33 73  .2 { .  sqlite3s
3470: 65 73 73 69 6f 6e 20 53 20 64 62 20 6d 61 69 6e  ession S db main
3480: 20 0a 20 20 53 20 61 74 74 61 63 68 20 2a 0a 20   .  S attach *. 
3490: 20 65 78 65 63 73 71 6c 20 7b 20 55 50 44 41 54   execsql { UPDAT
34a0: 45 20 74 37 20 53 45 54 20 62 3d 32 2c 20 64 3d  E t7 SET b=2, d=
34b0: 32 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 63 68 61 6e  2 }.} {}.do_chan
34c0: 67 65 73 65 74 5f 74 65 73 74 20 39 2e 32 20 53  geset_test 9.2 S
34d0: 20 7b 7b 55 50 44 41 54 45 20 74 37 20 30 20 2e   {{UPDATE t7 0 .
34e0: 2e 2e 2e 58 2e 2e 20 7b 7b 7d 20 7b 7d 20 69 20  ...X.. {{} {} i 
34f0: 31 20 7b 7d 20 7b 7d 20 69 20 31 20 69 20 31 20  1 {} {} i 1 i 1 
3500: 7b 7d 20 7b 7d 20 7b 7d 20 7b 7d 7d 20 7b 7b 7d  {} {} {} {}} {{}
3510: 20 7b 7d 20 69 20 32 20 7b 7d 20 7b 7d 20 69 20   {} i 2 {} {} i 
3520: 32 20 7b 7d 20 7b 7d 20 7b 7d 20 7b 7d 20 7b 7d  2 {} {} {} {} {}
3530: 20 7b 7d 7d 7d 7d 0a 53 20 64 65 6c 65 74 65 0a   {}}}}.S delete.
3540: 63 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73  catch { db2 clos
3550: 65 20 7d 0a 20 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  e }. .#---------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35a0: 0a 23 20 54 65 73 74 20 61 20 72 65 61 6c 6c 79  .# Test a really
35b0: 20 6c 6f 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65   long table name
35c0: 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a 73 65 74  ..#.reset_db.set
35d0: 20 74 62 6c 6e 61 6d 65 20 5b 73 74 72 69 6e 67   tblname [string
35e0: 20 72 65 70 65 61 74 20 74 62 6c 6e 61 6d 65 31   repeat tblname1
35f0: 32 33 20 31 30 30 5d 0a 64 6f 5f 74 65 73 74 20  23 100].do_test 
3600: 31 30 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  10.1.1 {.  execs
3610: 71 6c 20 22 0a 20 20 20 20 43 52 45 41 54 45 20  ql ".    CREATE 
3620: 54 41 42 4c 45 20 24 74 62 6c 6e 61 6d 65 20 28  TABLE $tblname (
3630: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
3640: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3650: 54 4f 20 24 74 62 6c 6e 61 6d 65 20 56 41 4c 55  TO $tblname VALU
3660: 45 53 28 27 78 79 7a 27 2c 20 27 64 65 66 27 29  ES('xyz', 'def')
3670: 3b 0a 20 20 22 0a 20 20 73 71 6c 69 74 65 33 73  ;.  ".  sqlite3s
3680: 65 73 73 69 6f 6e 20 53 20 64 62 20 6d 61 69 6e  ession S db main
3690: 0a 20 20 53 20 61 74 74 61 63 68 20 24 74 62 6c  .  S attach $tbl
36a0: 6e 61 6d 65 0a 20 20 65 78 65 63 73 71 6c 20 22  name.  execsql "
36b0: 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54   .    INSERT INT
36c0: 4f 20 24 74 62 6c 6e 61 6d 65 20 56 41 4c 55 45  O $tblname VALUE
36d0: 53 28 27 75 76 77 27 2c 20 27 61 62 63 27 29 3b  S('uvw', 'abc');
36e0: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
36f0: 20 24 74 62 6c 6e 61 6d 65 20 57 48 45 52 45 20   $tblname WHERE 
3700: 61 20 3d 20 27 78 79 7a 27 3b 0a 20 20 22 0a 7d  a = 'xyz';.  ".}
3710: 20 7b 7d 0a 62 72 65 61 6b 70 6f 69 6e 74 0a 64   {}.breakpoint.d
3720: 6f 5f 63 68 61 6e 67 65 73 65 74 5f 74 65 73 74  o_changeset_test
3730: 20 31 30 2e 31 2e 32 20 53 20 22 0a 20 20 7b 49   10.1.2 S ".  {I
3740: 4e 53 45 52 54 20 24 74 62 6c 6e 61 6d 65 20 30  NSERT $tblname 0
3750: 20 58 2e 20 7b 7d 20 7b 74 20 75 76 77 20 74 20   X. {} {t uvw t 
3760: 61 62 63 7d 7d 0a 20 20 7b 44 45 4c 45 54 45 20  abc}}.  {DELETE 
3770: 24 74 62 6c 6e 61 6d 65 20 30 20 58 2e 20 7b 74  $tblname 0 X. {t
3780: 20 78 79 7a 20 74 20 64 65 66 7d 20 7b 7d 7d 0a   xyz t def} {}}.
3790: 22 0a 64 6f 5f 74 65 73 74 20 31 30 2e 31 2e 34  ".do_test 10.1.4
37a0: 20 7b 20 53 20 64 65 6c 65 74 65 20 7d 20 7b 7d   { S delete } {}
37b0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37f0: 2d 2d 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f 65  --.reset_db.do_e
3800: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 31 2e 31  xecsql_test 11.1
3810: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
3820: 45 20 74 31 28 61 2c 20 62 29 3b 0a 7d 0a 64 6f  E t1(a, b);.}.do
3830: 5f 74 65 73 74 20 31 31 2e 32 20 7b 0a 20 20 73  _test 11.2 {.  s
3840: 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 20 53 20  qlite3session S 
3850: 64 62 20 6d 61 69 6e 0a 20 20 53 20 61 74 74 61  db main.  S atta
3860: 63 68 20 74 31 0a 20 20 65 78 65 63 73 71 6c 20  ch t1.  execsql 
3870: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
3880: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
3890: 29 3b 0a 20 20 7d 0a 20 20 53 20 63 68 61 6e 67  );.  }.  S chang
38a0: 65 73 65 74 0a 7d 20 7b 7d 0a 0a 53 20 64 65 6c  eset.} {}..S del
38b0: 65 74 65 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ete...#---------
38c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3900: 0a 23 20 54 65 73 74 20 61 20 72 65 61 6c 6c 79  .# Test a really
3910: 20 6c 6f 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65   long table name
3920: 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a 73 65 74  ..#.reset_db.set
3930: 20 74 62 6c 6e 61 6d 65 20 5b 73 74 72 69 6e 67   tblname [string
3940: 20 72 65 70 65 61 74 20 74 62 6c 6e 61 6d 65 31   repeat tblname1
3950: 32 33 20 31 30 30 5d 0a 64 6f 5f 74 65 73 74 20  23 100].do_test 
3960: 31 30 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  10.1.1 {.  execs
3970: 71 6c 20 22 0a 20 20 20 20 43 52 45 41 54 45 20  ql ".    CREATE 
3980: 54 41 42 4c 45 20 24 74 62 6c 6e 61 6d 65 20 28  TABLE $tblname (
3990: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
39a0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
39b0: 54 4f 20 24 74 62 6c 6e 61 6d 65 20 56 41 4c 55  TO $tblname VALU
39c0: 45 53 28 27 78 79 7a 27 2c 20 27 64 65 66 27 29  ES('xyz', 'def')
39d0: 3b 0a 20 20 22 0a 20 20 73 71 6c 69 74 65 33 73  ;.  ".  sqlite3s
39e0: 65 73 73 69 6f 6e 20 53 20 64 62 20 6d 61 69 6e  ession S db main
39f0: 0a 20 20 53 20 61 74 74 61 63 68 20 24 74 62 6c  .  S attach $tbl
3a00: 6e 61 6d 65 0a 20 20 65 78 65 63 73 71 6c 20 22  name.  execsql "
3a10: 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54   .    INSERT INT
3a20: 4f 20 24 74 62 6c 6e 61 6d 65 20 56 41 4c 55 45  O $tblname VALUE
3a30: 53 28 27 75 76 77 27 2c 20 27 61 62 63 27 29 3b  S('uvw', 'abc');
3a40: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
3a50: 20 24 74 62 6c 6e 61 6d 65 20 57 48 45 52 45 20   $tblname WHERE 
3a60: 61 20 3d 20 27 78 79 7a 27 3b 0a 20 20 22 0a 7d  a = 'xyz';.  ".}
3a70: 20 7b 7d 0a 62 72 65 61 6b 70 6f 69 6e 74 0a 64   {}.breakpoint.d
3a80: 6f 5f 63 68 61 6e 67 65 73 65 74 5f 74 65 73 74  o_changeset_test
3a90: 20 31 30 2e 31 2e 32 20 53 20 22 0a 20 20 7b 49   10.1.2 S ".  {I
3aa0: 4e 53 45 52 54 20 24 74 62 6c 6e 61 6d 65 20 30  NSERT $tblname 0
3ab0: 20 58 2e 20 7b 7d 20 7b 74 20 75 76 77 20 74 20   X. {} {t uvw t 
3ac0: 61 62 63 7d 7d 0a 20 20 7b 44 45 4c 45 54 45 20  abc}}.  {DELETE 
3ad0: 24 74 62 6c 6e 61 6d 65 20 30 20 58 2e 20 7b 74  $tblname 0 X. {t
3ae0: 20 78 79 7a 20 74 20 64 65 66 7d 20 7b 7d 7d 0a   xyz t def} {}}.
3af0: 22 0a 64 6f 5f 74 65 73 74 20 31 30 2e 31 2e 34  ".do_test 10.1.4
3b00: 20 7b 20 53 20 64 65 6c 65 74 65 20 7d 20 7b 7d   { S delete } {}
3b10: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
3b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
3b60: 65 73 74 20 74 68 65 20 65 66 66 65 63 74 20 6f  est the effect o
3b70: 66 20 75 70 64 61 74 69 6e 67 20 61 20 63 6f 6c  f updating a col
3b80: 75 6d 6e 20 66 72 6f 6d 20 30 2e 30 20 74 6f 20  umn from 0.0 to 
3b90: 30 2e 30 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a  0.0..#.reset_db.
3ba0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3bb0: 31 31 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  11.1 {.  CREATE 
3bc0: 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47  TABLE t1(a INTEG
3bd0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
3be0: 62 20 52 45 41 4c 29 3b 0a 20 20 49 4e 53 45 52  b REAL);.  INSER
3bf0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3c00: 28 31 2c 20 30 2e 30 29 3b 0a 7d 0a 64 6f 5f 69  (1, 0.0);.}.do_i
3c10: 74 65 72 61 74 6f 72 5f 74 65 73 74 20 31 31 2e  terator_test 11.
3c20: 32 20 2a 20 7b 0a 20 20 55 50 44 41 54 45 20 74  2 * {.  UPDATE t
3c30: 31 20 53 45 54 20 62 20 3d 20 30 2e 30 3b 0a 7d  1 SET b = 0.0;.}
3c40: 20 7b 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73   {.}..finish_tes
3c50: 74 0a                                            t.