/ Hex Artifact Content
Login

Artifact 9ceaa8f7b2a505933e250fbe6cbc550e4ce1e59d:


0000: 23 20 32 30 31 36 20 41 75 67 75 73 74 20 32 33  # 2016 August 23
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n you give..#.#*
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69  ******.# This fi
0170: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65  le implements re
0180: 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66  gression tests f
0190: 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  or SQLite librar
01a0: 79 2e 0a 23 0a 0a 69 66 20 7b 21 5b 69 6e 66 6f  y..#..if {![info
01b0: 20 65 78 69 73 74 73 20 74 65 73 74 64 69 72 5d   exists testdir]
01c0: 7d 20 7b 0a 20 20 73 65 74 20 74 65 73 74 64 69  } {.  set testdi
01d0: 72 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69  r [file join [fi
01e0: 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f  le dirname [info
01f0: 20 73 63 72 69 70 74 5d 5d 20 2e 2e 20 2e 2e 20   script]] .. .. 
0200: 74 65 73 74 5d 0a 7d 20 0a 73 6f 75 72 63 65 20  test].} .source 
0210: 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e  $testdir/tester.
0220: 74 63 6c 0a 69 66 63 61 70 61 62 6c 65 20 21 73  tcl.ifcapable !s
0230: 65 73 73 69 6f 6e 20 7b 66 69 6e 69 73 68 5f 74  ession {finish_t
0240: 65 73 74 3b 20 72 65 74 75 72 6e 7d 0a 0a 73 65  est; return}..se
0250: 74 20 74 65 73 74 70 72 65 66 69 78 20 63 68 61  t testprefix cha
0260: 6e 67 65 62 61 74 63 68 31 0a 0a 0a 70 72 6f 63  ngebatch1...proc
0270: 20 73 71 6c 5f 74 6f 5f 63 68 61 6e 67 65 73 65   sql_to_changese
0280: 74 20 7b 6d 65 74 68 6f 64 20 73 71 6c 7d 20 7b  t {method sql} {
0290: 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  .  sqlite3sessio
02a0: 6e 20 53 20 64 62 20 6d 61 69 6e 0a 20 20 53 20  n S db main.  S 
02b0: 61 74 74 61 63 68 20 2a 0a 20 20 65 78 65 63 73  attach *.  execs
02c0: 71 6c 20 24 73 71 6c 0a 20 20 73 65 74 20 72 65  ql $sql.  set re
02d0: 74 20 5b 53 20 24 6d 65 74 68 6f 64 5d 0a 20 20  t [S $method].  
02e0: 53 20 64 65 6c 65 74 65 0a 20 20 72 65 74 75 72  S delete.  retur
02f0: 6e 20 24 72 65 74 0a 7d 0a 0a 70 72 6f 63 20 64  n $ret.}..proc d
0300: 6f 5f 63 68 61 6e 67 65 62 61 74 63 68 5f 74 65  o_changebatch_te
0310: 73 74 20 7b 74 6e 20 6d 65 74 68 6f 64 20 61 72  st {tn method ar
0320: 67 73 7d 20 7b 0a 20 20 73 65 74 20 43 20 5b 6c  gs} {.  set C [l
0330: 69 73 74 5d 0a 20 20 66 6f 72 65 61 63 68 20 61  ist].  foreach a
0340: 20 24 61 72 67 73 20 7b 0a 20 20 20 20 6c 61 70   $args {.    lap
0350: 70 65 6e 64 20 43 20 5b 73 71 6c 5f 74 6f 5f 63  pend C [sql_to_c
0360: 68 61 6e 67 65 73 65 74 20 24 6d 65 74 68 6f 64  hangeset $method
0370: 20 24 61 5d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69   $a].  }..  sqli
0380: 74 65 33 63 68 61 6e 67 65 62 61 74 63 68 20 63  te3changebatch c
0390: 62 20 64 62 0a 20 20 73 65 74 20 69 20 31 0a 20  b db.  set i 1. 
03a0: 20 66 6f 72 65 61 63 68 20 3a 3a 63 73 20 5b 6c   foreach ::cs [l
03b0: 72 61 6e 67 65 20 24 43 20 30 20 65 6e 64 2d 31  range $C 0 end-1
03c0: 5d 20 7b 0a 20 20 20 20 73 65 74 20 72 63 20 5b  ] {.    set rc [
03d0: 63 62 20 61 64 64 20 24 3a 3a 63 73 5d 0a 20 20  cb add $::cs].  
03e0: 20 20 69 66 20 7b 24 72 63 21 3d 22 53 51 4c 49    if {$rc!="SQLI
03f0: 54 45 5f 4f 4b 22 7d 20 7b 20 65 72 72 6f 72 20  TE_OK"} { error 
0400: 22 65 78 70 65 63 74 65 64 20 53 51 4c 49 54 45  "expected SQLITE
0410: 5f 4f 4b 2c 20 67 6f 74 20 24 72 63 20 28 69 3d  _OK, got $rc (i=
0420: 24 69 29 22 20 7d 0a 20 20 20 20 69 6e 63 72 20  $i)" }.    incr 
0430: 69 0a 20 20 7d 0a 0a 20 20 73 65 74 20 3a 3a 63  i.  }..  set ::c
0440: 73 20 5b 6c 69 6e 64 65 78 20 24 43 20 65 6e 64  s [lindex $C end
0450: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 6e 20  ].  do_test $tn 
0460: 7b 20 63 62 20 61 64 64 20 5b 73 65 74 20 3a 3a  { cb add [set ::
0470: 63 73 5d 20 7d 20 53 51 4c 49 54 45 5f 43 4f 4e  cs] } SQLITE_CON
0480: 53 54 52 41 49 4e 54 0a 20 20 63 62 20 64 65 6c  STRAINT.  cb del
0490: 65 74 65 0a 7d 0a 0a 70 72 6f 63 20 64 6f 5f 63  ete.}..proc do_c
04a0: 68 61 6e 67 65 62 61 74 63 68 5f 74 65 73 74 31  hangebatch_test1
04b0: 20 7b 74 6e 20 61 72 67 73 7d 20 7b 0a 20 20 75   {tn args} {.  u
04c0: 70 6c 65 76 65 6c 20 64 6f 5f 63 68 61 6e 67 65  plevel do_change
04d0: 62 61 74 63 68 5f 74 65 73 74 20 24 74 6e 20 63  batch_test $tn c
04e0: 68 61 6e 67 65 73 65 74 20 24 61 72 67 73 0a 7d  hangeset $args.}
04f0: 0a 70 72 6f 63 20 64 6f 5f 63 68 61 6e 67 65 62  .proc do_changeb
0500: 61 74 63 68 5f 74 65 73 74 32 20 7b 74 6e 20 61  atch_test2 {tn a
0510: 72 67 73 7d 20 7b 0a 20 20 75 70 6c 65 76 65 6c  rgs} {.  uplevel
0520: 20 64 6f 5f 63 68 61 6e 67 65 62 61 74 63 68 5f   do_changebatch_
0530: 74 65 73 74 20 24 74 6e 20 66 75 6c 6c 63 68 61  test $tn fullcha
0540: 6e 67 65 73 65 74 20 24 61 72 67 73 0a 7d 0a 0a  ngeset $args.}..
0550: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
0560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65  ----------.# The
05a0: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 66 6f 6c   body of the fol
05b0: 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 63 6f 6e 74  lowing loop cont
05c0: 61 69 6e 73 20 74 65 73 74 73 20 66 6f 72 20 64  ains tests for d
05d0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 73 0a  atabase schemas.
05e0: 23 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 66 65  # that do not fe
05f0: 61 74 75 72 65 20 6d 75 6c 74 69 2d 63 6f 6c 75  ature multi-colu
0600: 6d 6e 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  mn UNIQUE constr
0610: 61 69 6e 74 73 2e 20 49 6e 20 74 68 69 73 20 63  aints. In this c
0620: 61 73 65 0a 23 20 69 74 20 64 6f 65 73 6e 27 74  ase.# it doesn't
0630: 20 6d 61 74 74 65 72 20 69 66 20 74 68 65 20 63   matter if the c
0640: 68 61 6e 67 65 73 65 74 73 20 61 72 65 20 67 65  hangesets are ge
0650: 6e 65 72 61 74 65 64 20 75 73 69 6e 67 0a 23 20  nerated using.# 
0660: 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63  sqlite3session_c
0670: 68 61 6e 67 65 73 65 74 28 29 20 6f 72 20 73 71  hangeset() or sq
0680: 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 66 75 6c  lite3session_ful
0690: 6c 63 68 61 6e 67 65 73 65 74 28 29 2e 0a 23 0a  lchangeset()..#.
06a0: 66 6f 72 65 61 63 68 20 7b 74 6e 20 74 65 73 74  foreach {tn test
06b0: 66 75 6e 63 74 69 6f 6e 7d 20 7b 0a 20 20 31 20  function} {.  1 
06c0: 64 6f 5f 63 68 61 6e 67 65 62 61 74 63 68 5f 74  do_changebatch_t
06d0: 65 73 74 31 0a 20 20 32 20 64 6f 5f 63 68 61 6e  est1.  2 do_chan
06e0: 67 65 62 61 74 63 68 5f 74 65 73 74 32 0a 7d 20  gebatch_test2.} 
06f0: 7b 0a 20 20 72 65 73 65 74 5f 64 62 0a 0a 20 20  {.  reset_db..  
0700: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
0710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 23 0a 20  ----------.  #. 
0750: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
0760: 20 24 74 6e 2e 31 2e 30 20 7b 0a 20 20 20 20 43   $tn.1.0 {.    C
0770: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
0780: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
0790: 3b 0a 20 20 7d 0a 20 20 0a 20 20 24 74 65 73 74  ;.  }.  .  $test
07a0: 66 75 6e 63 74 69 6f 6e 20 24 74 6e 2e 31 2e 31  function $tn.1.1
07b0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
07c0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
07d0: 31 29 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 44 45  1);.  } {.    DE
07e0: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
07f0: 52 45 20 61 3d 31 3b 0a 20 20 7d 0a 20 20 0a 20  RE a=1;.  }.  . 
0800: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
0810: 20 24 74 6e 2e 31 2e 32 2e 30 20 7b 0a 20 20 20   $tn.1.2.0 {.   
0820: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0830: 56 41 4c 55 45 53 28 31 2c 20 31 29 3b 0a 20 20  VALUES(1, 1);.  
0840: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0850: 20 56 41 4c 55 45 53 28 32 2c 20 32 29 3b 0a 20   VALUES(2, 2);. 
0860: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0870: 31 20 56 41 4c 55 45 53 28 33 2c 20 33 29 3b 0a  1 VALUES(3, 3);.
0880: 20 20 7d 0a 20 20 24 74 65 73 74 66 75 6e 63 74    }.  $testfunct
0890: 69 6f 6e 20 24 74 6e 2e 31 2e 32 2e 31 20 7b 0a  ion $tn.1.2.1 {.
08a0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
08b0: 74 31 20 57 48 45 52 45 20 61 3d 32 3b 0a 20 20  t1 WHERE a=2;.  
08c0: 7d 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  } {.    INSERT I
08d0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c  NTO t1 VALUES(2,
08e0: 20 32 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 23 2d   2);.  }.  .  #-
08f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 23 0a 20 20 64  --------.  #.  d
0940: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 24  o_execsql_test $
0950: 74 6e 2e 32 2e 30 20 7b 0a 20 20 20 20 43 52 45  tn.2.0 {.    CRE
0960: 41 54 45 20 54 41 42 4c 45 20 78 31 28 61 2c 20  ATE TABLE x1(a, 
0970: 62 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63  b PRIMARY KEY, c
0980: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52   UNIQUE);.    CR
0990: 45 41 54 45 20 54 41 42 4c 45 20 78 32 28 61 20  EATE TABLE x2(a 
09a0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 55  PRIMARY KEY, b U
09b0: 4e 49 51 55 45 2c 20 63 20 55 4e 49 51 55 45 29  NIQUE, c UNIQUE)
09c0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
09d0: 45 58 20 78 31 61 20 4f 4e 20 78 31 28 61 29 3b  EX x1a ON x1(a);
09e0: 0a 20 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49  .  .    INSERT I
09f0: 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 31 2c  NTO x1 VALUES(1,
0a00: 20 31 2c 20 27 61 27 29 3b 0a 20 20 20 20 49 4e   1, 'a');.    IN
0a10: 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c  SERT INTO x1 VAL
0a20: 55 45 53 28 31 2c 20 32 2c 20 27 62 27 29 3b 0a  UES(1, 2, 'b');.
0a30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0a40: 78 31 20 56 41 4c 55 45 53 28 31 2c 20 33 2c 20  x1 VALUES(1, 3, 
0a50: 27 63 27 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 24  'c');.  }.  .  $
0a60: 74 65 73 74 66 75 6e 63 74 69 6f 6e 20 24 74 6e  testfunction $tn
0a70: 2e 32 2e 31 20 7b 0a 20 20 20 20 44 45 4c 45 54  .2.1 {.    DELET
0a80: 45 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45 20  E FROM x1 WHERE 
0a90: 62 3d 32 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 55  b=2;.  } {.    U
0aa0: 50 44 41 54 45 20 78 31 20 53 45 54 20 63 3d 27  PDATE x1 SET c='
0ab0: 62 27 20 57 48 45 52 45 20 62 3d 33 3b 0a 20 20  b' WHERE b=3;.  
0ac0: 7d 0a 20 20 0a 20 20 24 74 65 73 74 66 75 6e 63  }.  .  $testfunc
0ad0: 74 69 6f 6e 20 24 74 6e 2e 32 2e 32 20 7b 0a 20  tion $tn.2.2 {. 
0ae0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 78     DELETE FROM x
0af0: 31 20 57 48 45 52 45 20 62 3d 31 3b 0a 20 20 7d  1 WHERE b=1;.  }
0b00: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
0b10: 54 4f 20 78 31 20 56 41 4c 55 45 53 28 31 2c 20  TO x1 VALUES(1, 
0b20: 35 2c 20 27 61 27 29 3b 0a 20 20 7d 0a 0a 20 20  5, 'a');.  }..  
0b30: 73 65 74 20 4c 20 5b 6c 69 73 74 5d 0a 20 20 66  set L [list].  f
0b40: 6f 72 20 7b 73 65 74 20 69 20 31 30 30 30 7d 20  or {set i 1000} 
0b50: 7b 24 69 20 3c 20 31 30 30 30 30 7d 20 7b 69 6e  {$i < 10000} {in
0b60: 63 72 20 69 7d 20 7b 0a 20 20 20 20 6c 61 70 70  cr i} {.    lapp
0b70: 65 6e 64 20 4c 20 22 49 4e 53 45 52 54 20 49 4e  end L "INSERT IN
0b80: 54 4f 20 78 32 20 56 41 4c 55 45 53 28 24 69 2c  TO x2 VALUES($i,
0b90: 20 24 69 2c 20 27 78 27 20 7c 7c 20 24 69 29 22   $i, 'x' || $i)"
0ba0: 0a 20 20 7d 0a 20 20 6c 61 70 70 65 6e 64 20 4c  .  }.  lappend L
0bb0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 32   "DELETE FROM x2
0bc0: 20 57 48 45 52 45 20 62 3d 31 30 30 35 22 0a 20   WHERE b=1005". 
0bd0: 20 24 74 65 73 74 66 75 6e 63 74 69 6f 6e 20 24   $testfunction $
0be0: 74 6e 2e 32 2e 33 20 7b 2a 7d 24 4c 0a 0a 20 20  tn.2.3 {*}$L..  
0bf0: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
0c00: 20 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28   INTO x1 VALUES(
0c10: 27 66 27 2c 20 27 66 27 2c 20 27 66 27 29 20 7d  'f', 'f', 'f') }
0c20: 0a 20 20 24 74 65 73 74 66 75 6e 63 74 69 6f 6e  .  $testfunction
0c30: 20 24 74 6e 2e 32 2e 34 20 7b 0a 20 20 20 20 49   $tn.2.4 {.    I
0c40: 4e 53 45 52 54 20 49 4e 54 4f 20 78 32 20 56 41  NSERT INTO x2 VA
0c50: 4c 55 45 53 28 27 66 27 2c 20 27 66 27 2c 20 27  LUES('f', 'f', '
0c60: 66 27 29 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 49  f');.  } {.    I
0c70: 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41  NSERT INTO x1 VA
0c80: 4c 55 45 53 28 27 67 27 2c 20 27 67 27 2c 20 27  LUES('g', 'g', '
0c90: 67 27 29 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 44  g');.  } {.    D
0ca0: 45 4c 45 54 45 20 46 52 4f 4d 20 78 31 20 57 48  ELETE FROM x1 WH
0cb0: 45 52 45 20 62 3d 27 66 27 3b 0a 20 20 7d 20 7b  ERE b='f';.  } {
0cc0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0cd0: 20 78 32 20 56 41 4c 55 45 53 28 27 67 27 2c 20   x2 VALUES('g', 
0ce0: 27 67 27 2c 20 27 67 27 29 3b 0a 20 20 7d 20 7b  'g', 'g');.  } {
0cf0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0d00: 20 78 31 20 56 41 4c 55 45 53 28 27 66 27 2c 20   x1 VALUES('f', 
0d10: 27 66 27 2c 20 27 66 27 29 3b 0a 20 20 7d 0a 0a  'f', 'f');.  }..
0d20: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0d30: 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 31 3b 0a  DELETE FROM x1;.
0d40: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0d50: 78 31 20 56 41 4c 55 45 53 28 31 2e 35 2c 20 31  x1 VALUES(1.5, 1
0d60: 2e 35 2c 20 31 2e 35 29 3b 0a 20 20 7d 0a 20 20  .5, 1.5);.  }.  
0d70: 24 74 65 73 74 66 75 6e 63 74 69 6f 6e 20 24 74  $testfunction $t
0d80: 6e 2e 32 2e 35 20 7b 0a 20 20 20 20 44 45 4c 45  n.2.5 {.    DELE
0d90: 54 45 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45  TE FROM x1 WHERE
0da0: 20 62 20 42 45 54 57 45 45 4e 20 31 20 41 4e 44   b BETWEEN 1 AND
0db0: 20 32 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 49 4e   2;.  } {.    IN
0dc0: 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c  SERT INTO x1 VAL
0dd0: 55 45 53 28 32 2e 35 2c 20 32 2e 35 2c 20 32 2e  UES(2.5, 2.5, 2.
0de0: 35 29 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 49 4e  5);.  } {.    IN
0df0: 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41 4c  SERT INTO x1 VAL
0e00: 55 45 53 28 31 2e 35 2c 20 31 2e 35 2c 20 31 2e  UES(1.5, 1.5, 1.
0e10: 35 29 3b 0a 20 20 7d 0a 0a 20 20 65 78 65 63 73  5);.  }..  execs
0e20: 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
0e30: 46 52 4f 4d 20 78 32 3b 0a 20 20 20 20 49 4e 53  FROM x2;.    INS
0e40: 45 52 54 20 49 4e 54 4f 20 78 32 20 56 41 4c 55  ERT INTO x2 VALU
0e50: 45 53 28 58 27 61 62 63 64 27 2c 20 58 27 31 32  ES(X'abcd', X'12
0e60: 33 34 27 2c 20 58 27 37 38 39 30 27 29 3b 0a 20  34', X'7890');. 
0e70: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
0e80: 32 20 56 41 4c 55 45 53 28 58 27 30 30 30 30 27  2 VALUES(X'0000'
0e90: 2c 20 58 27 30 30 30 30 27 2c 20 58 27 30 30 30  , X'0000', X'000
0ea0: 30 27 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  0');.  }.  break
0eb0: 70 6f 69 6e 74 0a 20 20 24 74 65 73 74 66 75 6e  point.  $testfun
0ec0: 63 74 69 6f 6e 20 24 74 6e 2e 32 2e 36 20 7b 0a  ction $tn.2.6 {.
0ed0: 20 20 20 20 55 50 44 41 54 45 20 78 32 20 53 45      UPDATE x2 SE
0ee0: 54 20 63 20 3d 20 58 27 31 32 33 34 27 20 57 48  T c = X'1234' WH
0ef0: 45 52 45 20 61 3d 58 27 61 62 63 64 27 3b 0a 20  ERE a=X'abcd';. 
0f00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78     INSERT INTO x
0f10: 32 20 56 41 4c 55 45 53 28 58 27 31 32 33 34 27  2 VALUES(X'1234'
0f20: 2c 20 58 27 61 62 63 64 27 2c 20 58 27 37 38 39  , X'abcd', X'789
0f30: 30 27 29 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 44  0');.  } {.    D
0f40: 45 4c 45 54 45 20 46 52 4f 4d 20 78 32 20 57 48  ELETE FROM x2 WH
0f50: 45 52 45 20 62 3d 58 27 30 30 30 30 27 3b 0a 20  ERE b=X'0000';. 
0f60: 20 7d 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20   } {.    INSERT 
0f70: 49 4e 54 4f 20 78 32 20 56 41 4c 55 45 53 28 31  INTO x2 VALUES(1
0f80: 2c 20 58 27 30 30 30 30 27 2c 20 4e 55 4c 4c 29  , X'0000', NULL)
0f90: 3b 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  ;.  }.}..#------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fe0: 2d 2d 2d 0a 23 20 54 65 73 74 20 73 6f 6d 65 20  ---.# Test some 
0ff0: 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 55 4e 49  multi-column UNI
1000: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  QUE constraints.
1010: 20 46 69 72 73 74 20 55 73 69 6e 67 20 5f 63 68   First Using _ch
1020: 61 6e 67 65 73 65 74 28 29 20 74 6f 0a 23 20 64  angeset() to.# d
1030: 65 6d 6f 6e 73 74 72 61 74 65 20 74 68 65 20 70  emonstrate the p
1040: 72 6f 62 6c 65 6d 2c 20 74 68 65 6e 20 75 73 69  roblem, then usi
1050: 6e 67 20 5f 66 75 6c 6c 63 68 61 6e 67 65 73 65  ng _fullchangese
1060: 74 28 29 20 74 6f 20 73 68 6f 77 20 74 68 61 74  t() to show that
1070: 20 69 74 20 68 61 73 0a 23 20 62 65 65 6e 20 66   it has.# been f
1080: 69 78 65 64 2e 0a 23 0a 72 65 73 65 74 5f 64 62  ixed..#.reset_db
1090: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
10a0: 20 33 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20   3.0 {.  CREATE 
10b0: 54 41 42 4c 45 20 79 31 28 61 20 50 52 49 4d 41  TABLE y1(a PRIMA
10c0: 52 59 20 4b 45 59 2c 20 62 2c 20 63 2c 20 55 4e  RY KEY, b, c, UN
10d0: 49 51 55 45 28 62 2c 20 63 29 29 3b 0a 20 20 49  IQUE(b, c));.  I
10e0: 4e 53 45 52 54 20 49 4e 54 4f 20 79 31 20 56 41  NSERT INTO y1 VA
10f0: 4c 55 45 53 28 31 2c 20 31 2c 20 31 29 3b 0a 20  LUES(1, 1, 1);. 
1100: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 79 31 20   INSERT INTO y1 
1110: 56 41 4c 55 45 53 28 32 2c 20 32 2c 20 32 29 3b  VALUES(2, 2, 2);
1120: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 79  .  INSERT INTO y
1130: 31 20 56 41 4c 55 45 53 28 33 2c 20 33 2c 20 33  1 VALUES(3, 3, 3
1140: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
1150: 20 79 31 20 56 41 4c 55 45 53 28 34 2c 20 33 2c   y1 VALUES(4, 3,
1160: 20 34 29 3b 0a 20 20 42 45 47 49 4e 3b 0a 7d 0a   4);.  BEGIN;.}.
1170: 0a 64 6f 5f 74 65 73 74 20 33 2e 31 2e 31 20 7b  .do_test 3.1.1 {
1180: 0a 20 20 73 65 74 20 63 31 20 5b 73 71 6c 5f 74  .  set c1 [sql_t
1190: 6f 5f 63 68 61 6e 67 65 73 65 74 20 63 68 61 6e  o_changeset chan
11a0: 67 65 73 65 74 20 7b 20 44 45 4c 45 54 45 20 46  geset { DELETE F
11b0: 52 4f 4d 20 79 31 20 57 48 45 52 45 20 61 3d 34  ROM y1 WHERE a=4
11c0: 20 20 20 20 7d 5d 0a 20 20 73 65 74 20 63 32 20      }].  set c2 
11d0: 5b 73 71 6c 5f 74 6f 5f 63 68 61 6e 67 65 73 65  [sql_to_changese
11e0: 74 20 63 68 61 6e 67 65 73 65 74 20 7b 20 55 50  t changeset { UP
11f0: 44 41 54 45 20 79 31 20 53 45 54 20 63 3d 34 20  DATE y1 SET c=4 
1200: 57 48 45 52 45 20 61 3d 33 20 7d 5d 0a 20 20 73  WHERE a=3 }].  s
1210: 71 6c 69 74 65 33 63 68 61 6e 67 65 62 61 74 63  qlite3changebatc
1220: 68 20 63 62 20 64 62 0a 20 20 63 62 20 61 64 64  h cb db.  cb add
1230: 20 24 63 31 0a 20 20 63 62 20 61 64 64 20 24 63   $c1.  cb add $c
1240: 32 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  2.} {SQLITE_OK}.
1250: 64 6f 5f 74 65 73 74 20 33 2e 31 2e 32 20 7b 0a  do_test 3.1.2 {.
1260: 20 20 63 62 20 64 65 6c 65 74 65 0a 20 20 65 78    cb delete.  ex
1270: 65 63 73 71 6c 20 52 4f 4c 4c 42 41 43 4b 0a 7d  ecsql ROLLBACK.}
1280: 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 33 2e 31   {}..do_test 3.1
1290: 2e 31 20 7b 0a 20 20 73 65 74 20 63 31 20 5b 73  .1 {.  set c1 [s
12a0: 71 6c 5f 74 6f 5f 63 68 61 6e 67 65 73 65 74 20  ql_to_changeset 
12b0: 66 75 6c 6c 63 68 61 6e 67 65 73 65 74 20 7b 20  fullchangeset { 
12c0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 79 31 20 57  DELETE FROM y1 W
12d0: 48 45 52 45 20 61 3d 34 20 20 20 20 7d 5d 0a 20  HERE a=4    }]. 
12e0: 20 73 65 74 20 63 32 20 5b 73 71 6c 5f 74 6f 5f   set c2 [sql_to_
12f0: 63 68 61 6e 67 65 73 65 74 20 66 75 6c 6c 63 68  changeset fullch
1300: 61 6e 67 65 73 65 74 20 7b 20 55 50 44 41 54 45  angeset { UPDATE
1310: 20 79 31 20 53 45 54 20 63 3d 34 20 57 48 45 52   y1 SET c=4 WHER
1320: 45 20 61 3d 33 20 7d 5d 0a 20 20 73 71 6c 69 74  E a=3 }].  sqlit
1330: 65 33 63 68 61 6e 67 65 62 61 74 63 68 20 63 62  e3changebatch cb
1340: 20 64 62 0a 20 20 63 62 20 61 64 64 20 24 63 31   db.  cb add $c1
1350: 0a 20 20 63 62 20 61 64 64 20 24 63 32 0a 7d 20  .  cb add $c2.} 
1360: 7b 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  {SQLITE_CONSTRAI
1370: 4e 54 7d 0a 64 6f 5f 74 65 73 74 20 33 2e 31 2e  NT}.do_test 3.1.
1380: 32 20 7b 0a 20 20 63 62 20 64 65 6c 65 74 65 0a  2 {.  cb delete.
1390: 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  } {}..#---------
13a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e0: 0a 23 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f 65  .#.reset_db.do_e
13f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 30 20  xecsql_test 4.0 
1400: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
1410: 20 74 31 28 78 2c 20 79 2c 20 7a 2c 20 50 52 49   t1(x, y, z, PRI
1420: 4d 41 52 59 20 4b 45 59 28 78 2c 20 79 29 2c 20  MARY KEY(x, y), 
1430: 55 4e 49 51 55 45 28 7a 29 29 3b 0a 7d 0a 0a 64  UNIQUE(z));.}..d
1440: 6f 5f 74 65 73 74 20 34 2e 31 20 7b 0a 20 20 73  o_test 4.1 {.  s
1450: 65 74 20 63 31 20 5b 73 71 6c 5f 74 6f 5f 63 68  et c1 [sql_to_ch
1460: 61 6e 67 65 73 65 74 20 66 75 6c 6c 63 68 61 6e  angeset fullchan
1470: 67 65 73 65 74 20 7b 20 49 4e 53 45 52 54 20 49  geset { INSERT I
1480: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
1490: 20 32 2c 20 33 29 20 7d 5d 0a 20 20 65 78 65 63   2, 3) }].  exec
14a0: 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54  sql {.    DROP T
14b0: 41 42 4c 45 20 74 31 3b 0a 20 20 20 20 43 52 45  ABLE t1;.    CRE
14c0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 77 2c 20  ATE TABLE t1(w, 
14d0: 78 2c 20 79 2c 20 7a 2c 20 50 52 49 4d 41 52 59  x, y, z, PRIMARY
14e0: 20 4b 45 59 28 78 2c 20 79 29 2c 20 55 4e 49 51   KEY(x, y), UNIQ
14f0: 55 45 28 7a 29 29 3b 0a 20 20 7d 0a 20 20 73 71  UE(z));.  }.  sq
1500: 6c 69 74 65 33 63 68 61 6e 67 65 62 61 74 63 68  lite3changebatch
1510: 20 63 62 20 64 62 0a 20 20 6c 69 73 74 20 5b 63   cb db.  list [c
1520: 61 74 63 68 20 7b 20 63 62 20 61 64 64 20 24 63  atch { cb add $c
1530: 31 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20  1 } msg] $msg.} 
1540: 7b 31 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 7d  {1 SQLITE_RANGE}
1550: 0a 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  ....finish_test.