/ Hex Artifact Content
Login

Artifact 25d2a1da92f149331ae0c51ca6e3eee78189577585eab92de149900d62994fa5:


0000: 23 20 32 30 31 38 2d 30 34 2d 31 37 0a 23 0a 23  # 2018-04-17.#.#
0010: 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
0020: 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
0030: 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
0040: 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
0050: 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69  f.# a legal noti
0060: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c  ce, here is a bl
0070: 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20 4d  essing:.#.#    M
0080: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
0090: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20 20  nd not evil..#  
00a0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00b0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00c0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00d0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20 20  ive others..#   
00e0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
00f0: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0100: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0110: 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a  u 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 0a 23 0a 23 20 54 65 73 74 20 63 61 73 65  **.#.# Test case
0170: 73 20 66 6f 72 20 55 50 53 45 52 54 0a 0a 73 65  s for UPSERT..se
0180: 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20  t testdir [file 
0190: 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a  dirname $argv0].
01a0: 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f  source $testdir/
01b0: 74 65 73 74 65 72 2e 74 63 6c 0a 73 65 74 20 74  tester.tcl.set t
01c0: 65 73 74 70 72 65 66 69 78 20 75 70 73 65 72 74  estprefix upsert
01d0: 34 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73  4..foreach {tn s
01e0: 71 6c 7d 20 7b 0a 20 20 31 20 7b 20 43 52 45 41  ql} {.  1 { CREA
01f0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e  TE TABLE t1(a IN
0200: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
0210: 59 2c 20 62 2c 20 63 20 55 4e 49 51 55 45 29 20  Y, b, c UNIQUE) 
0220: 7d 0a 20 20 32 20 7b 20 43 52 45 41 54 45 20 54  }.  2 { CREATE T
0230: 41 42 4c 45 20 74 31 28 61 20 49 4e 54 20 50 52  ABLE t1(a INT PR
0240: 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 20  IMARY KEY, b, c 
0250: 55 4e 49 51 55 45 29 20 7d 0a 20 20 33 20 7b 20  UNIQUE) }.  3 { 
0260: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0270: 61 20 49 4e 54 20 50 52 49 4d 41 52 59 20 4b 45  a INT PRIMARY KE
0280: 59 2c 20 62 2c 20 63 20 55 4e 49 51 55 45 29 20  Y, b, c UNIQUE) 
0290: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 7d 0a 7d  WITHOUT ROWID}.}
02a0: 20 7b 0a 20 20 72 65 73 65 74 5f 64 62 0a 20 20   {.  reset_db.  
02b0: 65 78 65 63 73 71 6c 20 24 73 71 6c 0a 0a 20 20  execsql $sql..  
02c0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
02d0: 31 2e 24 74 6e 2e 30 20 7b 0a 20 20 20 20 49 4e  1.$tn.0 {.    IN
02e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
02f0: 55 45 53 28 31 2c 20 4e 55 4c 4c 2c 20 27 6f 6e  UES(1, NULL, 'on
0300: 65 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  e');.    INSERT 
0310: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
0320: 2c 20 4e 55 4c 4c 2c 20 27 74 77 6f 27 29 3b 0a  , NULL, 'two');.
0330: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0340: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 4e 55 4c  t1 VALUES(3, NUL
0350: 4c 2c 20 27 74 68 72 65 65 27 29 3b 0a 20 20 7d  L, 'three');.  }
0360: 0a 20 20 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  .  .  do_execsql
0370: 5f 74 65 73 74 20 31 2e 24 74 6e 2e 31 20 7b 0a  _test 1.$tn.1 {.
0380: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0390: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c  t1 VALUES(1, NUL
03a0: 4c 2c 20 27 78 79 7a 27 29 20 4f 4e 20 43 4f 4e  L, 'xyz') ON CON
03b0: 46 4c 49 43 54 20 44 4f 20 4e 4f 54 48 49 4e 47  FLICT DO NOTHING
03c0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
03d0: 52 4f 4d 20 74 31 3b 0a 20 20 7d 20 7b 0a 20 20  ROM t1;.  } {.  
03e0: 20 20 31 20 7b 7d 20 6f 6e 65 20 32 20 7b 7d 20    1 {} one 2 {} 
03f0: 74 77 6f 20 33 20 7b 7d 20 74 68 72 65 65 0a 20  two 3 {} three. 
0400: 20 7d 0a 20 20 0a 20 20 64 6f 5f 65 78 65 63 73   }.  .  do_execs
0410: 71 6c 5f 74 65 73 74 20 31 2e 24 74 6e 2e 32 20  ql_test 1.$tn.2 
0420: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
0430: 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 20 4e  O t1 VALUES(4, N
0440: 55 4c 4c 2c 20 27 74 77 6f 27 29 20 4f 4e 20 43  ULL, 'two') ON C
0450: 4f 4e 46 4c 49 43 54 20 44 4f 20 4e 4f 54 48 49  ONFLICT DO NOTHI
0460: 4e 47 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  NG;.    SELECT *
0470: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 20 7b 0a   FROM t1;.  } {.
0480: 20 20 20 20 31 20 7b 7d 20 6f 6e 65 20 32 20 7b      1 {} one 2 {
0490: 7d 20 74 77 6f 20 33 20 7b 7d 20 74 68 72 65 65  } two 3 {} three
04a0: 0a 20 20 7d 0a 20 20 0a 20 20 64 6f 5f 65 78 65  .  }.  .  do_exe
04b0: 63 73 71 6c 5f 74 65 73 74 20 31 2e 24 74 6e 2e  csql_test 1.$tn.
04c0: 33 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  3 {.    INSERT I
04d0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c  NTO t1 VALUES(4,
04e0: 20 4e 55 4c 4c 2c 20 27 74 77 6f 27 29 20 4f 4e   NULL, 'two') ON
04f0: 20 43 4f 4e 46 4c 49 43 54 20 28 63 29 20 44 4f   CONFLICT (c) DO
0500: 20 55 50 44 41 54 45 20 53 45 54 20 62 20 3d 20   UPDATE SET b = 
0510: 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  1;.    SELECT * 
0520: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 20 7b 0a 20  FROM t1;.  } {. 
0530: 20 20 20 31 20 7b 7d 20 6f 6e 65 20 32 20 31 20     1 {} one 2 1 
0540: 74 77 6f 20 33 20 7b 7d 20 74 68 72 65 65 0a 20  two 3 {} three. 
0550: 20 7d 0a 20 20 0a 20 20 64 6f 5f 65 78 65 63 73   }.  .  do_execs
0560: 71 6c 5f 74 65 73 74 20 31 2e 24 74 6e 2e 34 20  ql_test 1.$tn.4 
0570: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
0580: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 4e  O t1 VALUES(2, N
0590: 55 4c 4c 2c 20 27 7a 65 72 6f 27 29 20 4f 4e 20  ULL, 'zero') ON 
05a0: 43 4f 4e 46 4c 49 43 54 20 28 61 29 20 44 4f 20  CONFLICT (a) DO 
05b0: 55 50 44 41 54 45 20 53 45 54 20 62 3d 32 3b 0a  UPDATE SET b=2;.
05c0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
05d0: 4d 20 74 31 3b 0a 20 20 7d 20 7b 31 20 7b 7d 20  M t1;.  } {1 {} 
05e0: 6f 6e 65 20 32 20 32 20 74 77 6f 20 33 20 7b 7d  one 2 2 two 3 {}
05f0: 20 74 68 72 65 65 7d 0a 0a 20 20 64 6f 5f 63 61   three}..  do_ca
0600: 74 63 68 73 71 6c 5f 74 65 73 74 20 31 2e 24 74  tchsql_test 1.$t
0610: 6e 2e 35 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  n.5 {.    INSERT
0620: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0630: 32 2c 20 4e 55 4c 4c 2c 20 27 7a 65 72 6f 27 29  2, NULL, 'zero')
0640: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 28 61 29   ON CONFLICT (a)
0650: 20 0a 20 20 20 20 20 20 44 4f 20 55 50 44 41 54   .      DO UPDAT
0660: 45 20 53 45 54 20 63 20 3d 20 27 6f 6e 65 27 3b  E SET c = 'one';
0670: 0a 20 20 7d 20 7b 31 20 7b 55 4e 49 51 55 45 20  .  } {1 {UNIQUE 
0680: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
0690: 64 3a 20 74 31 2e 63 7d 7d 0a 0a 20 20 64 6f 5f  d: t1.c}}..  do_
06a0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 24  execsql_test 1.$
06b0: 74 6e 2e 36 20 7b 0a 20 20 20 20 53 45 4c 45 43  tn.6 {.    SELEC
06c0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
06d0: 20 7b 31 20 7b 7d 20 6f 6e 65 20 32 20 32 20 74   {1 {} one 2 2 t
06e0: 77 6f 20 33 20 7b 7d 20 74 68 72 65 65 7d 0a 0a  wo 3 {} three}..
06f0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
0700: 74 20 31 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20  t 1.$tn.7 {.    
0710: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0720: 41 4c 55 45 53 28 32 2c 20 4e 55 4c 4c 2c 20 27  ALUES(2, NULL, '
0730: 7a 65 72 6f 27 29 20 4f 4e 20 43 4f 4e 46 4c 49  zero') ON CONFLI
0740: 43 54 20 28 61 29 20 0a 20 20 20 20 20 20 44 4f  CT (a) .      DO
0750: 20 55 50 44 41 54 45 20 53 45 54 20 28 62 2c 20   UPDATE SET (b, 
0760: 63 29 20 3d 20 28 53 45 4c 45 43 54 20 27 78 27  c) = (SELECT 'x'
0770: 2c 20 27 79 27 29 3b 0a 20 20 20 20 53 45 4c 45  , 'y');.    SELE
0780: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
0790: 7d 20 7b 31 20 7b 7d 20 6f 6e 65 20 32 20 78 20  } {1 {} one 2 x 
07a0: 79 20 33 20 7b 7d 20 74 68 72 65 65 7d 0a 0a 20  y 3 {} three}.. 
07b0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
07c0: 20 31 2e 24 74 6e 2e 38 20 7b 0a 20 20 20 20 49   1.$tn.8 {.    I
07d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
07e0: 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 2c 20 4e 55  LUES(1, NULL, NU
07f0: 4c 4c 29 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  LL) ON CONFLICT 
0800: 28 61 29 20 0a 20 20 20 20 20 20 44 4f 20 55 50  (a) .      DO UP
0810: 44 41 54 45 20 53 45 54 20 28 63 2c 20 61 29 20  DATE SET (c, a) 
0820: 3d 20 28 27 66 6f 75 72 27 2c 20 34 29 3b 0a 20  = ('four', 4);. 
0830: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
0840: 20 74 31 20 4f 52 44 45 52 20 42 59 20 31 3b 0a   t1 ORDER BY 1;.
0850: 20 20 7d 20 7b 32 20 78 20 79 20 33 20 7b 7d 20    } {2 x y 3 {} 
0860: 74 68 72 65 65 20 34 20 7b 7d 20 66 6f 75 72 7d  three 4 {} four}
0870: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
0880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
08c0: 20 54 65 73 74 20 74 61 72 67 65 74 20 61 6e 61   Test target ana
08d0: 6c 79 73 69 73 2e 0a 23 0a 73 65 74 20 72 74 62  lysis..#.set rtb
08e0: 6c 28 30 29 20 7b 30 20 7b 7d 7d 0a 73 65 74 20  l(0) {0 {}}.set 
08f0: 72 74 62 6c 28 31 29 20 7b 2f 31 20 2e 2a 66 61  rtbl(1) {/1 .*fa
0900: 69 6c 65 64 2e 2a 2f 7d 0a 73 65 74 20 72 74 62  iled.*/}.set rtb
0910: 6c 28 32 29 20 7b 31 20 7b 4f 4e 20 43 4f 4e 46  l(2) {1 {ON CONF
0920: 4c 49 43 54 20 63 6c 61 75 73 65 20 64 6f 65 73  LICT clause does
0930: 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 50   not match any P
0940: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
0950: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 7d  IQUE constraint}
0960: 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73  }..foreach {tn s
0970: 71 6c 7d 20 7b 0a 20 20 31 20 7b 20 0a 20 20 20  ql} {.  1 { .   
0980: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0990: 78 79 7a 28 61 20 49 4e 54 45 47 45 52 20 50 52  xyz(a INTEGER PR
09a0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 2c  IMARY KEY, b, c,
09b0: 20 64 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54   d);.      CREAT
09c0: 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 78  E UNIQUE INDEX x
09d0: 79 7a 31 20 4f 4e 20 78 79 7a 28 64 2c 20 63 2c  yz1 ON xyz(d, c,
09e0: 20 62 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73   b COLLATE nocas
09f0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 32 20 7b 20 0a  e);.  }..  2 { .
0a00: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
0a10: 4c 45 20 78 79 7a 28 61 20 49 4e 54 20 50 52 49  LE xyz(a INT PRI
0a20: 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 2c 20  MARY KEY, b, c, 
0a30: 64 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  d);.      CREATE
0a40: 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 78 79   UNIQUE INDEX xy
0a50: 7a 31 20 4f 4e 20 78 79 7a 28 64 2c 20 63 2c 20  z1 ON xyz(d, c, 
0a60: 62 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  b COLLATE nocase
0a70: 29 3b 0a 20 20 7d 0a 0a 20 20 33 20 7b 20 0a 20  );.  }..  3 { . 
0a80: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
0a90: 45 20 78 79 7a 28 61 20 49 4e 54 20 50 52 49 4d  E xyz(a INT PRIM
0aa0: 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 2c 20 64  ARY KEY, b, c, d
0ab0: 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b  ) WITHOUT ROWID;
0ac0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 55 4e  .      CREATE UN
0ad0: 49 51 55 45 20 49 4e 44 45 58 20 78 79 7a 31 20  IQUE INDEX xyz1 
0ae0: 4f 4e 20 78 79 7a 28 64 2c 20 63 2c 20 62 20 43  ON xyz(d, c, b C
0af0: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a  OLLATE nocase);.
0b00: 20 20 7d 0a 7d 20 7b 0a 20 20 72 65 73 65 74 5f    }.} {.  reset_
0b10: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 24 73 71  db.  execsql $sq
0b20: 6c 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  l.  do_execsql_t
0b30: 65 73 74 20 32 2e 24 74 6e 2e 31 20 7b 0a 20 20  est 2.$tn.1 {.  
0b40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 79    INSERT INTO xy
0b50: 7a 20 56 41 4c 55 45 53 28 31 30 2c 20 31 2c 20  z VALUES(10, 1, 
0b60: 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 7d 0a 0a  1, 'one');.  }..
0b70: 0a 20 20 66 6f 72 65 61 63 68 20 7b 74 6e 32 20  .  foreach {tn2 
0b80: 6f 63 20 72 65 73 7d 20 7b 0a 20 20 20 20 31 20  oc res} {.    1 
0b90: 22 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 28 62 20  "ON CONFLICT (b 
0ba0: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 2c 20  COLLATE nocase, 
0bb0: 63 2c 20 64 29 20 44 4f 20 4e 4f 54 48 49 4e 47  c, d) DO NOTHING
0bc0: 22 20 20 20 30 0a 20 20 20 20 32 20 22 4f 4e 20  "   0.    2 "ON 
0bd0: 43 4f 4e 46 4c 49 43 54 20 28 62 2c 20 63 2c 20  CONFLICT (b, c, 
0be0: 64 29 20 44 4f 20 4e 4f 54 48 49 4e 47 22 20 20  d) DO NOTHING"  
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 30 0a 20 20 20 20 33 20 22 4f 4e 20 43 4f 4e 46  0.    3 "ON CONF
0c10: 4c 49 43 54 20 28 62 2c 20 63 20 43 4f 4c 4c 41  LICT (b, c COLLA
0c20: 54 45 20 6e 6f 63 61 73 65 2c 20 64 29 20 44 4f  TE nocase, d) DO
0c30: 20 4e 4f 54 48 49 4e 47 22 20 20 20 32 0a 20 20   NOTHING"   2.  
0c40: 20 20 34 20 22 4f 4e 20 43 4f 4e 46 4c 49 43 54    4 "ON CONFLICT
0c50: 20 28 61 29 20 44 4f 20 4e 4f 54 48 49 4e 47 22   (a) DO NOTHING"
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 20 20 31 0a 20 20 20 20 35 20          1.    5 
0c80: 22 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 44 4f 20  "ON CONFLICT DO 
0c90: 4e 4f 54 48 49 4e 47 22 20 20 20 20 20 20 20 20  NOTHING"        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cb0: 20 20 20 20 30 0a 20 20 20 20 36 20 22 4f 4e 20      0.    6 "ON 
0cc0: 43 4f 4e 46 4c 49 43 54 20 28 62 2c 20 63 2c 20  CONFLICT (b, c, 
0cd0: 64 29 20 57 48 45 52 45 20 61 21 3d 30 20 44 4f  d) WHERE a!=0 DO
0ce0: 20 4e 4f 54 48 49 4e 47 22 20 20 20 20 20 20 20   NOTHING"       
0cf0: 30 0a 20 20 20 20 37 20 22 4f 4e 20 43 4f 4e 46  0.    7 "ON CONF
0d00: 4c 49 43 54 20 28 64 2c 20 63 2c 20 63 29 20 57  LICT (d, c, c) W
0d10: 48 45 52 45 20 61 21 3d 30 20 44 4f 20 4e 4f 54  HERE a!=0 DO NOT
0d20: 48 49 4e 47 22 20 20 20 20 20 20 20 32 0a 20 20  HING"       2.  
0d30: 20 20 38 20 22 4f 4e 20 43 4f 4e 46 4c 49 43 54    8 "ON CONFLICT
0d40: 20 28 62 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61   (b COLLATE noca
0d50: 73 65 2c 20 63 20 43 4f 4c 4c 41 54 45 20 6e 6f  se, c COLLATE no
0d60: 63 61 73 65 2c 20 64 29 20 44 4f 20 4e 4f 54 48  case, d) DO NOTH
0d70: 49 4e 47 22 20 20 20 32 0a 20 20 20 20 39 20 22  ING"   2.    9 "
0d80: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 28 62 2c 20  ON CONFLICT (b, 
0d90: 63 2c 20 64 29 20 57 48 45 52 45 20 62 3d 3d 34  c, d) WHERE b==4
0da0: 35 20 44 4f 20 4e 4f 54 48 49 4e 47 22 20 20 20  5 DO NOTHING"   
0db0: 20 20 20 30 0a 20 20 7d 20 7b 0a 0a 20 20 20 20     0.  } {..    
0dc0: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
0dd0: 20 32 2e 24 74 6e 2e 32 2e 24 74 6e 32 20 22 0a   2.$tn.2.$tn2 ".
0de0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0df0: 4f 20 78 79 7a 20 56 41 4c 55 45 53 28 31 31 2c  O xyz VALUES(11,
0e00: 20 31 2c 20 31 2c 20 27 6f 6e 65 27 29 20 24 6f   1, 1, 'one') $o
0e10: 63 0a 20 20 20 20 22 20 24 72 74 62 6c 28 24 72  c.    " $rtbl($r
0e20: 65 73 29 0a 20 20 7d 0a 0a 20 20 64 6f 5f 65 78  es).  }..  do_ex
0e30: 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 24 74 6e  ecsql_test 2.$tn
0e40: 2e 33 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  .3 {.    SELECT 
0e50: 2a 20 46 52 4f 4d 20 78 79 7a 3b 0a 20 20 7d 20  * FROM xyz;.  } 
0e60: 7b 31 30 20 31 20 31 20 6f 6e 65 7d 0a 7d 0a 0a  {10 1 1 one}.}..
0e70: 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d  foreach {tn sql}
0e80: 20 7b 0a 20 20 31 20 7b 0a 20 20 20 20 43 52 45   {.  1 {.    CRE
0e90: 41 54 45 20 54 41 42 4c 45 20 61 62 63 28 61 20  ATE TABLE abc(a 
0ea0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
0eb0: 4b 45 59 2c 20 78 2c 20 79 29 3b 0a 20 20 20 20  KEY, x, y);.    
0ec0: 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e  CREATE UNIQUE IN
0ed0: 44 45 58 20 61 62 63 31 20 4f 4e 20 61 62 63 28  DEX abc1 ON abc(
0ee0: 28 27 78 27 20 7c 7c 20 78 29 20 43 4f 4c 4c 41  ('x' || x) COLLA
0ef0: 54 45 20 6e 6f 63 61 73 65 29 3b 0a 20 20 7d 0a  TE nocase);.  }.
0f00: 20 20 32 20 7b 0a 20 20 20 20 43 52 45 41 54 45    2 {.    CREATE
0f10: 20 54 41 42 4c 45 20 61 62 63 28 61 20 49 4e 54   TABLE abc(a INT
0f20: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 78 2c   PRIMARY KEY, x,
0f30: 20 79 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   y);.    CREATE 
0f40: 55 4e 49 51 55 45 20 49 4e 44 45 58 20 61 62 63  UNIQUE INDEX abc
0f50: 31 20 4f 4e 20 61 62 63 28 28 27 78 27 20 7c 7c  1 ON abc(('x' ||
0f60: 20 78 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61   x) COLLATE noca
0f70: 73 65 29 3b 0a 20 20 7d 0a 20 20 33 20 7b 20 0a  se);.  }.  3 { .
0f80: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
0f90: 20 61 62 63 28 61 20 49 4e 54 20 50 52 49 4d 41   abc(a INT PRIMA
0fa0: 52 59 20 4b 45 59 2c 20 78 2c 20 79 29 20 57 49  RY KEY, x, y) WI
0fb0: 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 20 20 20  THOUT ROWID;.   
0fc0: 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49   CREATE UNIQUE I
0fd0: 4e 44 45 58 20 61 62 63 31 20 4f 4e 20 61 62 63  NDEX abc1 ON abc
0fe0: 28 28 27 78 27 20 7c 7c 20 78 29 20 43 4f 4c 4c  (('x' || x) COLL
0ff0: 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a 20 20 7d  ATE nocase);.  }
1000: 0a 7d 20 7b 0a 20 20 72 65 73 65 74 5f 64 62 0a  .} {.  reset_db.
1010: 20 20 65 78 65 63 73 71 6c 20 24 73 71 6c 0a 20    execsql $sql. 
1020: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
1030: 20 33 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 49   3.$tn.1 {.    I
1040: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56  NSERT INTO abc V
1050: 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 2c 20  ALUES(1, 'one', 
1060: 27 74 77 6f 27 29 3b 0a 20 20 7d 0a 0a 20 20 66  'two');.  }..  f
1070: 6f 72 65 61 63 68 20 7b 74 6e 32 20 6f 63 20 72  oreach {tn2 oc r
1080: 65 73 7d 20 7b 0a 20 20 20 20 31 20 22 4f 4e 20  es} {.    1 "ON 
1090: 43 4f 4e 46 4c 49 43 54 20 44 4f 20 4e 4f 54 48  CONFLICT DO NOTH
10a0: 49 4e 47 22 20 20 20 20 20 20 20 20 20 20 20 20  ING"            
10b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c0: 20 30 0a 20 20 20 20 32 20 22 4f 4e 20 43 4f 4e   0.    2 "ON CON
10d0: 46 4c 49 43 54 20 28 27 78 27 20 7c 7c 20 78 29  FLICT ('x' || x)
10e0: 20 44 4f 20 4e 4f 54 48 49 4e 47 22 20 20 20 20   DO NOTHING"    
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
1100: 20 20 20 20 33 20 22 4f 4e 20 43 4f 4e 46 4c 49      3 "ON CONFLI
1110: 43 54 20 28 28 27 78 27 20 7c 7c 20 78 29 20 43  CT (('x' || x) C
1120: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 20 44  OLLATE nocase) D
1130: 4f 20 4e 4f 54 48 49 4e 47 22 20 30 0a 20 20 20  O NOTHING" 0.   
1140: 20 34 20 22 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   4 "ON CONFLICT 
1150: 28 28 27 78 27 20 7c 7c 20 78 29 20 43 4f 4c 4c  (('x' || x) COLL
1160: 41 54 45 20 62 69 6e 61 72 79 29 20 44 4f 20 4e  ATE binary) DO N
1170: 4f 54 48 49 4e 47 22 20 32 0a 20 20 20 20 35 20  OTHING" 2.    5 
1180: 22 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 28 78 20  "ON CONFLICT (x 
1190: 7c 7c 20 27 78 27 29 20 44 4f 20 4e 4f 54 48 49  || 'x') DO NOTHI
11a0: 4e 47 22 20 20 20 20 20 20 20 20 20 20 20 20 20  NG"             
11b0: 20 20 20 20 20 32 0a 20 20 20 20 36 20 22 4f 4e       2.    6 "ON
11c0: 20 43 4f 4e 46 4c 49 43 54 20 28 28 28 27 78 27   CONFLICT ((('x'
11d0: 20 7c 7c 20 78 29 29 29 20 44 4f 20 4e 4f 54 48   || x))) DO NOTH
11e0: 49 4e 47 22 20 20 20 20 20 20 20 20 20 20 20 20  ING"            
11f0: 20 20 30 0a 20 20 7d 20 7b 0a 20 20 20 20 64 6f    0.  } {.    do
1200: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 33  _catchsql_test 3
1210: 2e 24 74 6e 2e 32 2e 24 74 6e 32 20 22 0a 20 20  .$tn.2.$tn2 ".  
1220: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1230: 61 62 63 20 56 41 4c 55 45 53 28 32 2c 20 27 6f  abc VALUES(2, 'o
1240: 6e 65 27 2c 20 4e 55 4c 4c 29 20 24 6f 63 3b 0a  ne', NULL) $oc;.
1250: 20 20 20 20 22 20 24 72 74 62 6c 28 24 72 65 73      " $rtbl($res
1260: 29 0a 20 20 7d 0a 0a 20 20 64 6f 5f 65 78 65 63  ).  }..  do_exec
1270: 73 71 6c 5f 74 65 73 74 20 33 2e 24 74 6e 2e 33  sql_test 3.$tn.3
1280: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
1290: 46 52 4f 4d 20 61 62 63 0a 20 20 7d 20 7b 31 20  FROM abc.  } {1 
12a0: 6f 6e 65 20 74 77 6f 7d 0a 7d 0a 0a 66 6f 72 65  one two}.}..fore
12b0: 61 63 68 20 7b 74 6e 20 73 71 6c 7d 20 7b 0a 20  ach {tn sql} {. 
12c0: 20 31 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20   1 {.    CREATE 
12d0: 54 41 42 4c 45 20 61 62 63 28 61 20 49 4e 54 45  TABLE abc(a INTE
12e0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
12f0: 20 78 2c 20 79 29 3b 0a 20 20 20 20 43 52 45 41   x, y);.    CREA
1300: 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20  TE UNIQUE INDEX 
1310: 61 62 63 31 20 4f 4e 20 61 62 63 28 78 29 20 57  abc1 ON abc(x) W
1320: 48 45 52 45 20 79 3e 30 3b 0a 20 20 20 20 43 52  HERE y>0;.    CR
1330: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
1340: 58 20 61 62 63 32 20 4f 4e 20 61 62 63 28 79 29  X abc2 ON abc(y)
1350: 20 57 48 45 52 45 20 78 3d 27 78 79 7a 27 20 43   WHERE x='xyz' C
1360: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 3b 0a 20  OLLATE nocase;. 
1370: 20 7d 0a 7d 20 7b 0a 20 20 72 65 73 65 74 5f 64   }.} {.  reset_d
1380: 62 0a 20 20 65 78 65 63 73 71 6c 20 24 73 71 6c  b.  execsql $sql
1390: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
13a0: 73 74 20 34 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  st 4.$tn.1 {.   
13b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63   INSERT INTO abc
13c0: 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27   VALUES(1, 'one'
13d0: 2c 20 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 1);.    INSERT
13e0: 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53   INTO abc VALUES
13f0: 28 32 2c 20 27 74 77 6f 27 2c 20 32 29 3b 0a 20  (2, 'two', 2);. 
1400: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
1410: 62 63 20 56 41 4c 55 45 53 28 33 2c 20 27 78 79  bc VALUES(3, 'xy
1420: 7a 27 2c 20 33 29 3b 0a 20 20 20 20 49 4e 53 45  z', 3);.    INSE
1430: 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55  RT INTO abc VALU
1440: 45 53 28 34 2c 20 27 58 59 5a 27 2c 20 34 29 3b  ES(4, 'XYZ', 4);
1450: 0a 20 20 7d 0a 0a 20 20 66 6f 72 65 61 63 68 20  .  }..  foreach 
1460: 7b 74 6e 32 20 6f 63 20 72 65 73 7d 20 7b 0a 20  {tn2 oc res} {. 
1470: 20 20 20 31 20 22 4f 4e 20 43 4f 4e 46 4c 49 43     1 "ON CONFLIC
1480: 54 20 44 4f 20 4e 4f 54 48 49 4e 47 22 20 20 20  T DO NOTHING"   
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
14b0: 20 20 20 20 32 20 22 4f 4e 20 43 4f 4e 46 4c 49      2 "ON CONFLI
14c0: 43 54 28 78 29 20 57 48 45 52 45 20 79 3e 30 20  CT(x) WHERE y>0 
14d0: 44 4f 20 4e 4f 54 48 49 4e 47 22 20 20 20 20 20  DO NOTHING"     
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
14f0: 0a 20 20 20 20 33 20 22 4f 4e 20 43 4f 4e 46 4c  .    3 "ON CONFL
1500: 49 43 54 28 78 29 20 44 4f 20 4e 4f 54 48 49 4e  ICT(x) DO NOTHIN
1510: 47 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  G"              
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 32 0a 20 20 20 20 34 20 22 4f 4e 20 43 4f 4e 46  2.    4 "ON CONF
1540: 4c 49 43 54 28 78 29 20 57 48 45 52 45 20 79 3e  LICT(x) WHERE y>
1550: 3d 30 20 44 4f 20 4e 4f 54 48 49 4e 47 22 20 20  =0 DO NOTHING"  
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 32 0a 20 20 20 20 35 20 22 4f 4e 20 43 4f 4e   2.    5 "ON CON
1580: 46 4c 49 43 54 28 79 29 20 57 48 45 52 45 20 78  FLICT(y) WHERE x
1590: 3d 27 78 79 7a 27 20 43 4f 4c 4c 41 54 45 20 6e  ='xyz' COLLATE n
15a0: 6f 63 61 73 65 20 44 4f 20 4e 4f 54 48 49 4e 47  ocase DO NOTHING
15b0: 22 20 31 0a 20 20 7d 20 7b 0a 20 20 20 20 64 6f  " 1.  } {.    do
15c0: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 34  _catchsql_test 4
15d0: 2e 24 74 6e 2e 32 2e 24 74 6e 32 20 22 0a 20 20  .$tn.2.$tn2 ".  
15e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
15f0: 61 62 63 20 56 41 4c 55 45 53 28 35 2c 20 27 6f  abc VALUES(5, 'o
1600: 6e 65 27 2c 20 31 30 29 20 24 6f 63 0a 20 20 20  ne', 10) $oc.   
1610: 20 22 20 24 72 74 62 6c 28 24 72 65 73 29 0a 20   " $rtbl($res). 
1620: 20 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c   }..  do_execsql
1630: 5f 74 65 73 74 20 34 2e 24 74 6e 2e 33 20 7b 0a  _test 4.$tn.3 {.
1640: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1650: 4d 20 61 62 63 0a 20 20 7d 20 7b 31 20 6f 6e 65  M abc.  } {1 one
1660: 20 31 20 32 20 74 77 6f 20 32 20 33 20 78 79 7a   1 2 two 2 3 xyz
1670: 20 33 20 34 20 58 59 5a 20 34 7d 0a 0a 20 20 66   3 4 XYZ 4}..  f
1680: 6f 72 65 61 63 68 20 7b 74 6e 32 20 6f 63 20 72  oreach {tn2 oc r
1690: 65 73 7d 20 7b 0a 20 20 20 20 31 20 22 4f 4e 20  es} {.    1 "ON 
16a0: 43 4f 4e 46 4c 49 43 54 20 44 4f 20 4e 4f 54 48  CONFLICT DO NOTH
16b0: 49 4e 47 22 20 20 20 20 20 20 20 20 20 20 20 20  ING"            
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 20 30 0a 20 20 20 20 32 20 22 4f 4e       0.    2 "ON
16e0: 20 43 4f 4e 46 4c 49 43 54 28 79 29 20 57 48 45   CONFLICT(y) WHE
16f0: 52 45 20 78 3d 27 78 79 7a 27 20 43 4f 4c 4c 41  RE x='xyz' COLLA
1700: 54 45 20 6e 6f 63 61 73 65 20 44 4f 20 4e 4f 54  TE nocase DO NOT
1710: 48 49 4e 47 22 20 30 0a 20 20 20 20 33 20 22 4f  HING" 0.    3 "O
1720: 4e 20 43 4f 4e 46 4c 49 43 54 28 79 29 20 57 48  N CONFLICT(y) WH
1730: 45 52 45 20 78 3d 27 78 79 7a 27 20 43 4f 4c 4c  ERE x='xyz' COLL
1740: 41 54 45 20 62 69 6e 61 72 79 20 44 4f 20 4e 4f  ATE binary DO NO
1750: 54 48 49 4e 47 22 20 32 0a 20 20 20 20 34 20 22  THING" 2.    4 "
1760: 4f 4e 20 43 4f 4e 46 4c 49 43 54 28 78 29 20 57  ON CONFLICT(x) W
1770: 48 45 52 45 20 79 3e 30 20 44 4f 20 4e 4f 54 48  HERE y>0 DO NOTH
1780: 49 4e 47 22 20 20 20 20 20 20 20 20 20 20 20 20  ING"            
1790: 20 20 20 20 20 20 20 20 31 0a 20 20 7d 20 7b 0a          1.  } {.
17a0: 20 20 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f      do_catchsql_
17b0: 74 65 73 74 20 34 2e 24 74 6e 2e 32 2e 24 74 6e  test 4.$tn.2.$tn
17c0: 32 20 22 0a 20 20 20 20 20 20 49 4e 53 45 52 54  2 ".      INSERT
17d0: 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53   INTO abc VALUES
17e0: 28 35 2c 20 27 78 59 7a 27 2c 20 33 29 20 24 6f  (5, 'xYz', 3) $o
17f0: 63 0a 20 20 20 20 22 20 24 72 74 62 6c 28 24 72  c.    " $rtbl($r
1800: 65 73 29 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 63 61  es).  }.}..do_ca
1810: 74 63 68 73 71 6c 5f 74 65 73 74 20 35 2e 30 20  tchsql_test 5.0 
1820: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
1830: 20 77 31 28 61 20 49 4e 54 20 50 52 49 4d 41 52   w1(a INT PRIMAR
1840: 59 20 4b 45 59 2c 20 78 2c 20 79 29 3b 0a 20 20  Y KEY, x, y);.  
1850: 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e  CREATE UNIQUE IN
1860: 44 45 58 20 77 31 65 78 70 72 20 4f 4e 20 77 31  DEX w1expr ON w1
1870: 28 28 27 78 27 20 7c 7c 20 78 29 29 3b 0a 20 20  (('x' || x));.  
1880: 49 4e 53 45 52 54 20 49 4e 54 4f 20 77 31 20 56  INSERT INTO w1 V
1890: 41 4c 55 45 53 28 32 2c 20 27 6f 6e 65 27 2c 20  ALUES(2, 'one', 
18a0: 4e 55 4c 4c 29 0a 20 20 20 20 4f 4e 20 43 4f 4e  NULL).    ON CON
18b0: 46 4c 49 43 54 20 28 28 27 78 27 20 7c 7c 20 78  FLICT (('x' || x
18c0: 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ) COLLATE nocase
18d0: 29 20 44 4f 20 4e 4f 54 48 49 4e 47 3b 0a 7d 20  ) DO NOTHING;.} 
18e0: 7b 31 20 7b 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  {1 {ON CONFLICT 
18f0: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20  clause does not 
1900: 6d 61 74 63 68 20 61 6e 79 20 50 52 49 4d 41 52  match any PRIMAR
1910: 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
1920: 63 6f 6e 73 74 72 61 69 6e 74 7d 7d 0a 0a 23 2d  constraint}}..#-
1930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1970: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
1980: 74 68 61 74 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  that ON CONFLICT
1990: 20 63 6f 6e 73 74 72 61 69 6e 74 20 70 72 6f 63   constraint proc
19a0: 65 73 73 69 6e 67 20 6f 63 63 75 72 73 20 62 65  essing occurs be
19b0: 66 6f 72 65 20 61 6e 79 20 52 45 50 4c 41 43 45  fore any REPLACE
19c0: 0a 23 20 63 6f 6e 73 74 72 61 69 6e 74 20 70 72  .# constraint pr
19d0: 6f 63 65 73 73 69 6e 67 2e 0a 23 0a 66 6f 72 65  ocessing..#.fore
19e0: 61 63 68 20 7b 74 6e 20 73 71 6c 7d 20 7b 0a 20  ach {tn sql} {. 
19f0: 20 31 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20   1 {.    CREATE 
1a00: 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47  TABLE t1(a INTEG
1a10: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
1a20: 62 20 55 4e 49 51 55 45 2c 20 63 29 3b 0a 20 20  b UNIQUE, c);.  
1a30: 7d 0a 20 20 32 20 7b 0a 20 20 20 20 43 52 45 41  }.  2 {.    CREA
1a40: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e  TE TABLE t1(a IN
1a50: 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  T PRIMARY KEY, b
1a60: 20 55 4e 49 51 55 45 2c 20 63 29 3b 0a 20 20 7d   UNIQUE, c);.  }
1a70: 0a 20 20 33 20 7b 0a 20 20 20 20 43 52 45 41 54  .  3 {.    CREAT
1a80: 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54  E TABLE t1(a INT
1a90: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 20   PRIMARY KEY, b 
1aa0: 55 4e 49 51 55 45 2c 20 63 29 20 57 49 54 48 4f  UNIQUE, c) WITHO
1ab0: 55 54 20 52 4f 57 49 44 3b 0a 20 20 7d 0a 7d 20  UT ROWID;.  }.} 
1ac0: 7b 0a 20 20 72 65 73 65 74 5f 64 62 0a 20 20 65  {.  reset_db.  e
1ad0: 78 65 63 73 71 6c 20 24 73 71 6c 0a 20 20 64 6f  xecsql $sql.  do
1ae0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 36 2e  _execsql_test 6.
1af0: 31 2e 24 74 6e 20 7b 0a 20 20 20 20 49 4e 53 45  1.$tn {.    INSE
1b00: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1b10: 53 28 31 2c 20 31 2c 20 27 6f 6e 65 27 29 3b 0a  S(1, 1, 'one');.
1b20: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1b30: 74 31 20 56 41 4c 55 45 53 28 32 2c 20 32 2c 20  t1 VALUES(2, 2, 
1b40: 27 74 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45  'two');.    INSE
1b50: 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e  RT OR REPLACE IN
1b60: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
1b70: 32 2c 20 27 74 77 6f 27 29 20 4f 4e 20 43 4f 4e  2, 'two') ON CON
1b80: 46 4c 49 43 54 28 62 29 20 44 4f 20 4e 4f 54 48  FLICT(b) DO NOTH
1b90: 49 4e 47 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  ING;.    PRAGMA 
1ba0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
1bb0: 0a 20 20 7d 20 7b 6f 6b 7d 0a 7d 0a 0a 66 6f 72  .  } {ok}.}..for
1bc0: 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d 20 7b 0a  each {tn sql} {.
1bd0: 20 20 31 20 7b 0a 20 20 20 20 43 52 45 41 54 45    1 {.    CREATE
1be0: 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45   TABLE t1(a INTE
1bf0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
1c00: 20 62 20 55 4e 49 51 55 45 2c 20 63 20 55 4e 49   b UNIQUE, c UNI
1c10: 51 55 45 29 3b 0a 20 20 7d 0a 7d 20 7b 0a 20 20  QUE);.  }.} {.  
1c20: 72 65 73 65 74 5f 64 62 0a 20 20 65 78 65 63 73  reset_db.  execs
1c30: 71 6c 20 24 73 71 6c 0a 0a 20 20 64 6f 5f 65 78  ql $sql..  do_ex
1c40: 65 63 73 71 6c 5f 74 65 73 74 20 36 2e 32 2e 24  ecsql_test 6.2.$
1c50: 74 6e 2e 31 20 7b 0a 20 20 20 20 49 4e 53 45 52  tn.1 {.    INSER
1c60: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1c70: 28 31 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 49  (1, 1, 1);.    I
1c80: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1c90: 4c 55 45 53 28 32 2c 20 32 2c 20 32 29 3b 0a 20  LUES(2, 2, 2);. 
1ca0: 20 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c   }..  do_execsql
1cb0: 5f 74 65 73 74 20 36 2e 32 2e 24 74 6e 2e 32 20  _test 6.2.$tn.2 
1cc0: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20  {.    INSERT OR 
1cd0: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 31 20  REPLACE INTO t1 
1ce0: 56 41 4c 55 45 53 28 33 2c 20 31 2c 20 31 29 20  VALUES(3, 1, 1) 
1cf0: 4f 4e 20 43 4f 4e 46 4c 49 43 54 28 62 29 20 44  ON CONFLICT(b) D
1d00: 4f 20 4e 4f 54 48 49 4e 47 3b 0a 20 20 20 20 53  O NOTHING;.    S
1d10: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
1d20: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
1d30: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d  grity_check;.  }
1d40: 20 7b 31 20 31 20 31 20 32 20 32 20 32 20 6f 6b   {1 1 1 2 2 2 ok
1d50: 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  }..  do_execsql_
1d60: 74 65 73 74 20 36 2e 32 2e 24 74 6e 2e 33 20 7b  test 6.2.$tn.3 {
1d70: 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20 52  .    INSERT OR R
1d80: 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 31 20 56  EPLACE INTO t1 V
1d90: 41 4c 55 45 53 28 33 2c 20 32 2c 20 32 29 20 4f  ALUES(3, 2, 2) O
1da0: 4e 20 43 4f 4e 46 4c 49 43 54 28 63 29 20 44 4f  N CONFLICT(c) DO
1db0: 20 4e 4f 54 48 49 4e 47 3b 0a 20 20 20 20 53 45   NOTHING;.    SE
1dc0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
1dd0: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67      PRAGMA integ
1de0: 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 20  rity_check;.  } 
1df0: 7b 31 20 31 20 31 20 32 20 32 20 32 20 6f 6b 7d  {1 1 1 2 2 2 ok}
1e00: 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..  do_execsql_t
1e10: 65 73 74 20 36 2e 32 2e 24 74 6e 2e 32 20 7b 0a  est 6.2.$tn.2 {.
1e20: 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20 52 45      INSERT OR RE
1e30: 50 4c 41 43 45 20 49 4e 54 4f 20 74 31 20 56 41  PLACE INTO t1 VA
1e40: 4c 55 45 53 28 33 2c 20 31 2c 20 31 29 20 4f 4e  LUES(3, 1, 1) ON
1e50: 20 43 4f 4e 46 4c 49 43 54 28 62 29 20 0a 20 20   CONFLICT(b) .  
1e60: 20 20 20 20 44 4f 20 55 50 44 41 54 45 20 53 45      DO UPDATE SE
1e70: 54 20 62 3d 62 7c 7c 27 78 27 3b 0a 20 20 20 20  T b=b||'x';.    
1e80: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1e90: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74  ;.    PRAGMA int
1ea0: 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20  egrity_check;.  
1eb0: 7d 20 7b 31 20 31 78 20 31 20 32 20 32 20 32 20  } {1 1x 1 2 2 2 
1ec0: 6f 6b 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71  ok}..  do_execsq
1ed0: 6c 5f 74 65 73 74 20 36 2e 32 2e 24 74 6e 2e 32  l_test 6.2.$tn.2
1ee0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52   {.    INSERT OR
1ef0: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 31   REPLACE INTO t1
1f00: 20 56 41 4c 55 45 53 28 33 2c 20 32 2c 20 32 29   VALUES(3, 2, 2)
1f10: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 28 63 29 20   ON CONFLICT(c) 
1f20: 0a 20 20 20 20 20 20 44 4f 20 55 50 44 41 54 45  .      DO UPDATE
1f30: 20 53 45 54 20 63 3d 63 7c 7c 27 78 27 3b 0a 20   SET c=c||'x';. 
1f40: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1f50: 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   t1;.    PRAGMA 
1f60: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
1f70: 0a 20 20 7d 20 7b 31 20 31 78 20 31 20 32 20 32  .  } {1 1x 1 2 2
1f80: 20 32 78 20 6f 6b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d   2x ok}.}..#----
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 72 65 66  -----.# Test ref
1fe0: 65 72 65 6e 63 65 73 20 74 6f 20 22 65 78 63 6c  erences to "excl
1ff0: 75 64 65 64 22 2e 20 41 6e 64 20 75 73 69 6e 67  uded". And using
2000: 20 61 6e 20 61 6c 69 61 73 20 69 6e 20 61 6e 20   an alias in an 
2010: 49 4e 53 45 52 54 20 0a 23 20 73 74 61 74 65 6d  INSERT .# statem
2020: 65 6e 74 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  ent..#.foreach {
2030: 74 6e 20 73 71 6c 7d 20 7b 0a 20 20 31 20 7b 0a  tn sql} {.  1 {.
2040: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2050: 20 74 31 28 77 2c 20 78 2c 20 79 2c 20 7a 2c 20   t1(w, x, y, z, 
2060: 50 52 49 4d 41 52 59 20 4b 45 59 28 78 2c 20 79  PRIMARY KEY(x, y
2070: 29 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 55  ));.    CREATE U
2080: 4e 49 51 55 45 20 49 4e 44 45 58 20 7a 7a 20 4f  NIQUE INDEX zz O
2090: 4e 20 74 31 28 7a 29 3b 0a 20 20 7d 0a 20 20 32  N t1(z);.  }.  2
20a0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
20b0: 42 4c 45 20 74 31 28 77 2c 20 78 2c 20 79 2c 20  BLE t1(w, x, y, 
20c0: 7a 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 78  z, PRIMARY KEY(x
20d0: 2c 20 79 29 29 20 57 49 54 48 4f 55 54 20 52 4f  , y)) WITHOUT RO
20e0: 57 49 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20  WID;.    CREATE 
20f0: 55 4e 49 51 55 45 20 49 4e 44 45 58 20 7a 7a 20  UNIQUE INDEX zz 
2100: 4f 4e 20 74 31 28 7a 29 3b 0a 20 20 7d 0a 7d 20  ON t1(z);.  }.} 
2110: 7b 0a 20 20 72 65 73 65 74 5f 64 62 0a 20 20 65  {.  reset_db.  e
2120: 78 65 63 73 71 6c 20 24 73 71 6c 0a 20 20 64 6f  xecsql $sql.  do
2130: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 37 2e  _execsql_test 7.
2140: 24 74 6e 2e 30 20 7b 0a 20 20 20 20 49 4e 53 45  $tn.0 {.    INSE
2150: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
2160: 53 28 27 61 27 2c 20 31 2c 20 31 2c 20 31 29 3b  S('a', 1, 1, 1);
2170: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2180: 20 74 31 20 56 41 4c 55 45 53 28 27 62 27 2c 20   t1 VALUES('b', 
2190: 32 2c 20 32 2c 20 32 29 3b 0a 20 20 7d 0a 0a 20  2, 2, 2);.  }.. 
21a0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
21b0: 20 37 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 49   7.$tn.1 {.    I
21c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
21d0: 4c 55 45 53 28 27 63 27 2c 20 33 2c 20 33 2c 20  LUES('c', 3, 3, 
21e0: 31 29 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 28 7a  1) ON CONFLICT(z
21f0: 29 20 0a 20 20 20 20 20 20 44 4f 20 55 50 44 41  ) .      DO UPDA
2200: 54 45 20 53 45 54 20 77 20 3d 20 65 78 63 6c 75  TE SET w = exclu
2210: 64 65 64 2e 77 3b 0a 20 20 20 20 53 45 4c 45 43  ded.w;.    SELEC
2220: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
2230: 20 7b 63 20 31 20 31 20 31 20 62 20 32 20 32 20   {c 1 1 1 b 2 2 
2240: 32 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  2}..  do_execsql
2250: 5f 74 65 73 74 20 37 2e 24 74 6e 2e 32 20 7b 0a  _test 7.$tn.2 {.
2260: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2270: 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20 32  t1 VALUES('c', 2
2280: 2c 20 32 2c 20 33 29 20 4f 4e 20 43 4f 4e 46 4c  , 2, 3) ON CONFL
2290: 49 43 54 28 79 2c 20 78 29 20 0a 20 20 20 20 20  ICT(y, x) .     
22a0: 20 44 4f 20 55 50 44 41 54 45 20 53 45 54 20 77   DO UPDATE SET w
22b0: 20 3d 20 77 7c 7c 77 3b 0a 20 20 20 20 53 45 4c   = w||w;.    SEL
22c0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
22d0: 20 7d 20 7b 63 20 31 20 31 20 31 20 62 62 20 32   } {c 1 1 1 bb 2
22e0: 20 32 20 32 7d 0a 0a 20 20 64 6f 5f 65 78 65 63   2 2}..  do_exec
22f0: 73 71 6c 5f 74 65 73 74 20 37 2e 24 74 6e 2e 33  sql_test 7.$tn.3
2300: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
2310: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 63 27  TO t1 VALUES('c'
2320: 2c 20 32 2c 20 32 2c 20 33 29 20 4f 4e 20 43 4f  , 2, 2, 3) ON CO
2330: 4e 46 4c 49 43 54 28 79 2c 20 78 29 20 0a 20 20  NFLICT(y, x) .  
2340: 20 20 20 20 44 4f 20 55 50 44 41 54 45 20 53 45      DO UPDATE SE
2350: 54 20 77 20 3d 20 77 7c 7c 74 31 2e 77 3b 0a 20  T w = w||t1.w;. 
2360: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2370: 20 74 31 3b 0a 20 20 7d 20 7b 63 20 31 20 31 20   t1;.  } {c 1 1 
2380: 31 20 62 62 62 62 20 32 20 32 20 32 7d 0a 0a 20  1 bbbb 2 2 2}.. 
2390: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
23a0: 20 37 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 49   7.$tn.4 {.    I
23b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 41 53  NSERT INTO t1 AS
23c0: 20 74 62 6c 20 56 41 4c 55 45 53 28 27 63 27 2c   tbl VALUES('c',
23d0: 20 32 2c 20 32 2c 20 33 29 20 4f 4e 20 43 4f 4e   2, 2, 3) ON CON
23e0: 46 4c 49 43 54 28 79 2c 20 78 29 20 0a 20 20 20  FLICT(y, x) .   
23f0: 20 20 20 44 4f 20 55 50 44 41 54 45 20 53 45 54     DO UPDATE SET
2400: 20 77 20 3d 20 77 7c 7c 74 62 6c 2e 77 3b 0a 20   w = w||tbl.w;. 
2410: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2420: 20 74 31 3b 0a 20 20 7d 20 7b 63 20 31 20 31 20   t1;.  } {c 1 1 
2430: 31 20 62 62 62 62 62 62 62 62 20 32 20 32 20 32  1 bbbbbbbb 2 2 2
2440: 7d 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e  }.}..foreach {tn
2450: 20 73 71 6c 7d 20 7b 0a 20 20 31 20 7b 0a 20 20   sql} {.  1 {.  
2460: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 65    CREATE TABLE e
2470: 78 63 6c 75 64 65 64 28 77 2c 20 78 20 49 4e 54  xcluded(w, x INT
2480: 45 47 45 52 2c 20 27 61 20 62 27 2c 20 7a 2c 20  EGER, 'a b', z, 
2490: 50 52 49 4d 41 52 59 20 4b 45 59 28 78 2c 20 27  PRIMARY KEY(x, '
24a0: 61 20 62 27 29 29 3b 0a 20 20 20 20 43 52 45 41  a b'));.    CREA
24b0: 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20  TE UNIQUE INDEX 
24c0: 7a 7a 20 4f 4e 20 65 78 63 6c 75 64 65 64 28 7a  zz ON excluded(z
24d0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
24e0: 44 45 58 20 7a 7a 32 20 4f 4e 20 65 78 63 6c 75  DEX zz2 ON exclu
24f0: 64 65 64 28 7a 29 3b 0a 20 20 7d 0a 20 20 32 20  ded(z);.  }.  2 
2500: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
2510: 4c 45 20 65 78 63 6c 75 64 65 64 28 77 2c 20 78  LE excluded(w, x
2520: 2c 20 27 61 20 62 27 2c 20 7a 2c 20 50 52 49 4d  , 'a b', z, PRIM
2530: 41 52 59 20 4b 45 59 28 78 2c 20 27 61 20 62 27  ARY KEY(x, 'a b'
2540: 29 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  )) WITHOUT ROWID
2550: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e 49  ;.    CREATE UNI
2560: 51 55 45 20 49 4e 44 45 58 20 7a 7a 20 4f 4e 20  QUE INDEX zz ON 
2570: 65 78 63 6c 75 64 65 64 28 7a 29 3b 0a 20 20 20  excluded(z);.   
2580: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 7a 7a   CREATE INDEX zz
2590: 32 20 4f 4e 20 65 78 63 6c 75 64 65 64 28 7a 29  2 ON excluded(z)
25a0: 3b 0a 20 20 7d 0a 7d 20 7b 0a 20 20 72 65 73 65  ;.  }.} {.  rese
25b0: 74 5f 64 62 0a 20 20 65 78 65 63 73 71 6c 20 24  t_db.  execsql $
25c0: 73 71 6c 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  sql.  do_execsql
25d0: 5f 74 65 73 74 20 38 2e 24 74 6e 2e 30 20 7b 0a  _test 8.$tn.0 {.
25e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
25f0: 65 78 63 6c 75 64 65 64 20 56 41 4c 55 45 53 28  excluded VALUES(
2600: 27 61 27 2c 20 31 2c 20 31 2c 20 31 29 3b 0a 20  'a', 1, 1, 1);. 
2610: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65     INSERT INTO e
2620: 78 63 6c 75 64 65 64 20 56 41 4c 55 45 53 28 27  xcluded VALUES('
2630: 62 27 2c 20 32 2c 20 32 2c 20 32 29 3b 0a 20 20  b', 2, 2, 2);.  
2640: 7d 0a 0a 20 20 23 20 4e 6f 74 65 3a 20 41 6e 20  }..  # Note: An 
2650: 65 72 72 6f 72 20 69 6e 20 50 6f 73 74 67 72 65  error in Postgre
2660: 73 3a 20 22 74 61 62 6c 65 20 72 65 66 65 72 65  s: "table refere
2670: 6e 63 65 20 22 65 78 63 6c 75 64 65 64 22 20 69  nce "excluded" i
2680: 73 20 61 6d 62 69 67 75 6f 75 73 22 2e 0a 20 20  s ambiguous"..  
2690: 23 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  #.  do_execsql_t
26a0: 65 73 74 20 38 2e 24 74 6e 2e 31 20 7b 0a 20 20  est 8.$tn.1 {.  
26b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 78    INSERT INTO ex
26c0: 63 6c 75 64 65 64 20 56 41 4c 55 45 53 28 27 68  cluded VALUES('h
26d0: 65 6c 6c 6f 27 2c 20 31 2c 20 31 2c 20 4e 55 4c  ello', 1, 1, NUL
26e0: 4c 29 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 28 78  L) ON CONFLICT(x
26f0: 2c 20 22 61 20 62 22 29 0a 20 20 20 20 20 20 44  , "a b").      D
2700: 4f 20 55 50 44 41 54 45 20 53 45 54 20 77 3d 65  O UPDATE SET w=e
2710: 78 63 6c 75 64 65 64 2e 77 3b 0a 20 20 20 20 53  xcluded.w;.    S
2720: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 78 63  ELECT * FROM exc
2730: 6c 75 64 65 64 3b 0a 20 20 7d 20 7b 61 20 31 20  luded;.  } {a 1 
2740: 31 20 31 20 62 20 32 20 32 20 32 7d 0a 0a 20 20  1 1 b 2 2 2}..  
2750: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2760: 38 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 49 4e  8.$tn.2 {.    IN
2770: 53 45 52 54 20 49 4e 54 4f 20 65 78 63 6c 75 64  SERT INTO exclud
2780: 65 64 20 41 53 20 78 31 20 56 41 4c 55 45 53 28  ed AS x1 VALUES(
2790: 27 68 65 6c 6c 6f 27 2c 20 31 2c 20 31 2c 20 4e  'hello', 1, 1, N
27a0: 55 4c 4c 29 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  ULL) ON CONFLICT
27b0: 28 78 2c 20 5b 61 20 62 5d 29 0a 20 20 20 20 20  (x, [a b]).     
27c0: 20 44 4f 20 55 50 44 41 54 45 20 53 45 54 20 77   DO UPDATE SET w
27d0: 3d 65 78 63 6c 75 64 65 64 2e 77 3b 0a 20 20 20  =excluded.w;.   
27e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65   SELECT * FROM e
27f0: 78 63 6c 75 64 65 64 3b 0a 20 20 7d 20 7b 68 65  xcluded;.  } {he
2800: 6c 6c 6f 20 31 20 31 20 31 20 62 20 32 20 32 20  llo 1 1 1 b 2 2 
2810: 32 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  2}..  do_execsql
2820: 5f 74 65 73 74 20 38 2e 24 74 6e 2e 33 20 7b 0a  _test 8.$tn.3 {.
2830: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2840: 65 78 63 6c 75 64 65 64 20 41 53 20 78 31 20 56  excluded AS x1 V
2850: 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27 2c 20 31  ALUES('hello', 1
2860: 2c 20 31 2c 20 4e 55 4c 4c 29 20 4f 4e 20 43 4f  , 1, NULL) ON CO
2870: 4e 46 4c 49 43 54 28 78 2c 20 5b 61 20 62 5d 29  NFLICT(x, [a b])
2880: 0a 20 20 20 20 20 20 44 4f 20 55 50 44 41 54 45  .      DO UPDATE
2890: 20 53 45 54 20 77 3d 77 7c 7c 77 20 57 48 45 52   SET w=w||w WHER
28a0: 45 20 65 78 63 6c 75 64 65 64 2e 77 21 3d 27 68  E excluded.w!='h
28b0: 65 6c 6c 6f 27 3b 0a 20 20 20 20 53 45 4c 45 43  ello';.    SELEC
28c0: 54 20 2a 20 46 52 4f 4d 20 65 78 63 6c 75 64 65  T * FROM exclude
28d0: 64 3b 0a 20 20 7d 20 7b 68 65 6c 6c 6f 20 31 20  d;.  } {hello 1 
28e0: 31 20 31 20 62 20 32 20 32 20 32 7d 0a 0a 20 20  1 1 b 2 2 2}..  
28f0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2900: 38 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 49 4e  8.$tn.4 {.    IN
2910: 53 45 52 54 20 49 4e 54 4f 20 65 78 63 6c 75 64  SERT INTO exclud
2920: 65 64 20 41 53 20 78 31 20 56 41 4c 55 45 53 28  ed AS x1 VALUES(
2930: 27 68 65 6c 6c 6f 27 2c 20 31 2c 20 31 2c 20 4e  'hello', 1, 1, N
2940: 55 4c 4c 29 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  ULL) ON CONFLICT
2950: 28 78 2c 20 5b 61 20 62 5d 29 0a 20 20 20 20 20  (x, [a b]).     
2960: 20 44 4f 20 55 50 44 41 54 45 20 53 45 54 20 77   DO UPDATE SET w
2970: 3d 77 7c 7c 77 20 57 48 45 52 45 20 65 78 63 6c  =w||w WHERE excl
2980: 75 64 65 64 2e 78 3d 31 3b 0a 20 20 20 20 53 45  uded.x=1;.    SE
2990: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 65 78 63 6c  LECT * FROM excl
29a0: 75 64 65 64 3b 0a 20 20 7d 20 7b 68 65 6c 6c 6f  uded;.  } {hello
29b0: 68 65 6c 6c 6f 20 31 20 31 20 31 20 62 20 32 20  hello 1 1 1 b 2 
29c0: 32 20 32 7d 0a 0a 20 20 64 6f 5f 63 61 74 63 68  2 2}..  do_catch
29d0: 73 71 6c 5f 74 65 73 74 20 38 2e 24 74 6e 2e 35  sql_test 8.$tn.5
29e0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
29f0: 54 4f 20 65 78 63 6c 75 64 65 64 20 41 53 20 78  TO excluded AS x
2a00: 31 20 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27  1 VALUES('hello'
2a10: 2c 20 31 2c 20 31 2c 20 4e 55 4c 4c 29 20 0a 20  , 1, 1, NULL) . 
2a20: 20 20 20 20 20 4f 4e 20 43 4f 4e 46 4c 49 43 54       ON CONFLICT
2a30: 28 78 2c 20 5b 61 20 62 5d 29 20 57 48 45 52 45  (x, [a b]) WHERE
2a40: 20 79 3d 31 0a 20 20 20 20 20 20 44 4f 20 55 50   y=1.      DO UP
2a50: 44 41 54 45 20 53 45 54 20 77 3d 77 7c 7c 77 20  DATE SET w=w||w 
2a60: 57 48 45 52 45 20 65 78 63 6c 75 64 65 64 2e 78  WHERE excluded.x
2a70: 3d 31 3b 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20 73  =1;.  } {1 {no s
2a80: 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 79 7d 7d 0a  uch column: y}}.
2a90: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
2aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
2ae0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2af0: 20 39 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20   9.0 {.  CREATE 
2b00: 54 41 42 4c 45 20 76 28 78 20 49 4e 54 45 47 45  TABLE v(x INTEGE
2b10: 52 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  R);.  CREATE TAB
2b20: 4c 45 20 68 69 73 74 28 78 20 49 4e 54 45 47 45  LE hist(x INTEGE
2b30: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63  R PRIMARY KEY, c
2b40: 6e 74 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 43  nt INTEGER);.  C
2b50: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 76 74  REATE TRIGGER vt
2b60: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
2b70: 20 76 20 42 45 47 49 4e 0a 20 20 20 20 49 4e 53   v BEGIN.    INS
2b80: 45 52 54 20 49 4e 54 4f 20 68 69 73 74 20 56 41  ERT INTO hist VA
2b90: 4c 55 45 53 28 6e 65 77 2e 78 2c 20 31 29 20 4f  LUES(new.x, 1) O
2ba0: 4e 20 43 4f 4e 46 4c 49 43 54 28 78 29 20 44 4f  N CONFLICT(x) DO
2bb0: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 53 45  .      UPDATE SE
2bc0: 54 20 63 6e 74 3d 63 6e 74 2b 31 3b 0a 20 20 45  T cnt=cnt+1;.  E
2bd0: 4e 44 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  ND;.}..do_execsq
2be0: 6c 5f 74 65 73 74 20 39 2e 31 20 7b 0a 20 20 49  l_test 9.1 {.  I
2bf0: 4e 53 45 52 54 20 49 4e 54 4f 20 76 20 56 41 4c  NSERT INTO v VAL
2c00: 55 45 53 28 31 29 2c 20 28 34 29 2c 20 28 31 29  UES(1), (4), (1)
2c10: 2c 20 28 35 29 2c 20 28 35 29 2c 20 28 38 29 2c  , (5), (5), (8),
2c20: 20 28 39 29 2c 20 28 31 29 3b 0a 20 20 53 45 4c   (9), (1);.  SEL
2c30: 45 43 54 20 2a 20 46 52 4f 4d 20 68 69 73 74 3b  ECT * FROM hist;
2c40: 0a 7d 20 7b 0a 20 20 31 20 33 0a 20 20 34 20 31  .} {.  1 3.  4 1
2c50: 0a 20 20 35 20 32 0a 20 20 38 20 31 0a 20 20 39  .  5 2.  8 1.  9
2c60: 20 31 0a 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65   1.}...finish_te
2c70: 73 74 0a                                         st.