/ Hex Artifact Content
Login

Artifact cadb172bbd5a2e83cd644d186ccd602085e54edc:


0000: 23 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72  # 2001 September
0010: 20 32 37 0a 23 0a 23 20 54 68 65 20 61 75 74 68   27.#.# The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67  place of.# a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23  is a blessing:.#
0080: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  .#    May you do
0090: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
00a0: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  il..#    May you
00b0: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73   find forgivenes
00c0: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61  s for yourself a
00d0: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72  nd forgive other
00e0: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  s..#    May you 
00f0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
0100: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
0110: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23  than you give..#
0120: 0a 23 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 2a 2a 2a 0a 23 20 54 68 69 73  *********.# This
0170: 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73   file implements
0180: 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74   regression test
0190: 73 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62  s for SQLite lib
01a0: 72 61 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63  rary.  The.# foc
01b0: 75 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20  us of this file 
01c0: 69 73 20 74 65 73 74 69 6e 67 20 74 68 65 20 43  is testing the C
01d0: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
01e0: 45 58 20 73 74 61 74 65 6d 65 6e 74 2c 0a 23 20  EX statement,.# 
01f0: 61 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 73  and primary keys
0200: 2c 20 61 6e 64 20 74 68 65 20 55 4e 49 51 55 45  , and the UNIQUE
0210: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74   constraint on t
0220: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 23 0a 23  able columns.#.#
0230: 20 24 49 64 3a 20 75 6e 69 71 75 65 2e 74 65 73   $Id: unique.tes
0240: 74 2c 76 20 31 2e 39 20 32 30 30 39 2f 30 35 2f  t,v 1.9 2009/05/
0250: 30 32 20 31 35 3a 34 36 3a 34 37 20 64 72 68 20  02 15:46:47 drh 
0260: 45 78 70 20 24 0a 0a 73 65 74 20 74 65 73 74 64  Exp $..set testd
0270: 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ir [file dirname
0280: 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20   $argv0].source 
0290: 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e  $testdir/tester.
02a0: 74 63 6c 0a 0a 23 20 54 72 79 20 74 6f 20 63 72  tcl..# Try to cr
02b0: 65 61 74 65 20 61 20 74 61 62 6c 65 20 77 69 74  eate a table wit
02c0: 68 20 74 77 6f 20 70 72 69 6d 61 72 79 20 6b 65  h two primary ke
02d0: 79 73 2e 0a 23 20 28 54 68 69 73 20 69 73 20 61  ys..# (This is a
02e0: 6c 6c 6f 77 65 64 20 69 6e 20 53 51 4c 69 74 65  llowed in SQLite
02f0: 20 65 76 65 6e 20 74 68 61 74 20 69 74 20 69 73   even that it is
0300: 20 6e 6f 74 20 76 61 6c 69 64 20 53 51 4c 29 0a   not valid SQL).
0310: 23 0a 64 6f 5f 74 65 73 74 20 75 6e 69 71 75 65  #.do_test unique
0320: 2d 31 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71  -1.1 {.  catchsq
0330: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
0340: 41 42 4c 45 20 74 31 28 0a 20 20 20 20 20 20 20  ABLE t1(.       
0350: 61 20 69 6e 74 20 50 52 49 4d 41 52 59 20 4b 45  a int PRIMARY KE
0360: 59 2c 0a 20 20 20 20 20 20 20 62 20 69 6e 74 20  Y,.       b int 
0370: 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20  PRIMARY KEY,.   
0380: 20 20 20 20 63 20 74 65 78 74 0a 20 20 20 20 29      c text.    )
0390: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 74 61 62 6c  ;.  }.} {1 {tabl
03a0: 65 20 22 74 31 22 20 68 61 73 20 6d 6f 72 65 20  e "t1" has more 
03b0: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
03c0: 20 6b 65 79 7d 7d 0a 64 6f 5f 74 65 73 74 20 75   key}}.do_test u
03d0: 6e 69 71 75 65 2d 31 2e 31 62 20 7b 0a 20 20 63  nique-1.1b {.  c
03e0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52  atchsql {.    CR
03f0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 0a 20  EATE TABLE t1(. 
0400: 20 20 20 20 20 20 61 20 69 6e 74 20 50 52 49 4d        a int PRIM
0410: 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 20  ARY KEY,.       
0420: 62 20 69 6e 74 20 55 4e 49 51 55 45 2c 0a 20 20  b int UNIQUE,.  
0430: 20 20 20 20 20 63 20 74 65 78 74 0a 20 20 20 20       c text.    
0440: 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a  );.  }.} {0 {}}.
0450: 64 6f 5f 74 65 73 74 20 75 6e 69 71 75 65 2d 31  do_test unique-1
0460: 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .2 {.  catchsql 
0470: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
0480: 4f 20 74 31 28 61 2c 62 2c 63 29 20 56 41 4c 55  O t1(a,b,c) VALU
0490: 45 53 28 31 2c 32 2c 33 29 0a 20 20 7d 0a 7d 20  ES(1,2,3).  }.} 
04a0: 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 75  {0 {}}.do_test u
04b0: 6e 69 71 75 65 2d 31 2e 33 20 7b 0a 20 20 63 61  nique-1.3 {.  ca
04c0: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  tchsql {.    INS
04d0: 45 52 54 20 49 4e 54 4f 20 74 31 28 61 2c 62 2c  ERT INTO t1(a,b,
04e0: 63 29 20 56 41 4c 55 45 53 28 31 2c 33 2c 34 29  c) VALUES(1,3,4)
04f0: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63 6f 6c 75 6d  .  }.} {1 {colum
0500: 6e 20 61 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  n a is not uniqu
0510: 65 7d 7d 0a 76 65 72 69 66 79 5f 65 78 5f 65 72  e}}.verify_ex_er
0520: 72 63 6f 64 65 20 75 6e 69 71 75 65 2d 31 2e 33  rcode unique-1.3
0530: 62 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  b SQLITE_CONSTRA
0540: 49 4e 54 5f 55 4e 49 51 55 45 0a 64 6f 5f 74 65  INT_UNIQUE.do_te
0550: 73 74 20 75 6e 69 71 75 65 2d 31 2e 34 20 7b 0a  st unique-1.4 {.
0560: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0570: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0580: 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20 20 7d   ORDER BY a;.  }
0590: 0a 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 74 65  .} {1 2 3}.do_te
05a0: 73 74 20 75 6e 69 71 75 65 2d 31 2e 35 20 7b 0a  st unique-1.5 {.
05b0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
05c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28   INSERT INTO t1(
05d0: 61 2c 62 2c 63 29 20 56 41 4c 55 45 53 28 33 2c  a,b,c) VALUES(3,
05e0: 32 2c 34 29 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63  2,4).  }.} {1 {c
05f0: 6f 6c 75 6d 6e 20 62 20 69 73 20 6e 6f 74 20 75  olumn b is not u
0600: 6e 69 71 75 65 7d 7d 0a 76 65 72 69 66 79 5f 65  nique}}.verify_e
0610: 78 5f 65 72 72 63 6f 64 65 20 75 6e 69 71 75 65  x_errcode unique
0620: 2d 31 2e 35 62 20 53 51 4c 49 54 45 5f 43 4f 4e  -1.5b SQLITE_CON
0630: 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 0a 64  STRAINT_UNIQUE.d
0640: 6f 5f 74 65 73 74 20 75 6e 69 71 75 65 2d 31 2e  o_test unique-1.
0650: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  6 {.  execsql {.
0660: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
0670: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 3b  M t1 ORDER BY a;
0680: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 7d 0a 64  .  }.} {1 2 3}.d
0690: 6f 5f 74 65 73 74 20 75 6e 69 71 75 65 2d 31 2e  o_test unique-1.
06a0: 37 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  7 {.  catchsql {
06b0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
06c0: 20 74 31 28 61 2c 62 2c 63 29 20 56 41 4c 55 45   t1(a,b,c) VALUE
06d0: 53 28 33 2c 34 2c 35 29 0a 20 20 7d 0a 7d 20 7b  S(3,4,5).  }.} {
06e0: 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 75 6e  0 {}}.do_test un
06f0: 69 71 75 65 2d 31 2e 38 20 7b 0a 20 20 65 78 65  ique-1.8 {.  exe
0700: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
0710: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  T * FROM t1 ORDE
0720: 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b 31  R BY a;.  }.} {1
0730: 20 32 20 33 20 33 20 34 20 35 7d 0a 69 6e 74 65   2 3 3 4 5}.inte
0740: 67 72 69 74 79 5f 63 68 65 63 6b 20 75 6e 69 71  grity_check uniq
0750: 75 65 2d 31 2e 39 0a 0a 64 6f 5f 74 65 73 74 20  ue-1.9..do_test 
0760: 75 6e 69 71 75 65 2d 32 2e 30 20 7b 0a 20 20 65  unique-2.0 {.  e
0770: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
0780: 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 20 20  P TABLE t1;.    
0790: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
07a0: 61 20 69 6e 74 2c 20 62 20 69 6e 74 29 3b 0a 20  a int, b int);. 
07b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
07c0: 32 28 61 2c 62 29 20 56 41 4c 55 45 53 28 31 2c  2(a,b) VALUES(1,
07d0: 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
07e0: 4e 54 4f 20 74 32 28 61 2c 62 29 20 56 41 4c 55  NTO t2(a,b) VALU
07f0: 45 53 28 33 2c 34 29 3b 0a 20 20 20 20 53 45 4c  ES(3,4);.    SEL
0800: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 4f 52  ECT * FROM t2 OR
0810: 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20  DER BY a;.  }.} 
0820: 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73  {1 2 3 4}.do_tes
0830: 74 20 75 6e 69 71 75 65 2d 32 2e 31 20 7b 0a 20  t unique-2.1 {. 
0840: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
0850: 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e  CREATE UNIQUE IN
0860: 44 45 58 20 69 32 20 4f 4e 20 74 32 28 61 29 0a  DEX i2 ON t2(a).
0870: 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f    }.} {0 {}}.do_
0880: 74 65 73 74 20 75 6e 69 71 75 65 2d 32 2e 32 20  test unique-2.2 
0890: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
08a0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
08b0: 20 74 32 20 4f 52 44 45 52 20 42 59 20 61 0a 20   t2 ORDER BY a. 
08c0: 20 7d 0a 7d 20 7b 30 20 7b 31 20 32 20 33 20 34   }.} {0 {1 2 3 4
08d0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 75 6e 69 71 75  }}.do_test uniqu
08e0: 65 2d 32 2e 33 20 7b 0a 20 20 63 61 74 63 68 73  e-2.3 {.  catchs
08f0: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
0900: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31  INTO t2 VALUES(1
0910: 2c 35 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63  ,5);.  }.} {1 {c
0920: 6f 6c 75 6d 6e 20 61 20 69 73 20 6e 6f 74 20 75  olumn a is not u
0930: 6e 69 71 75 65 7d 7d 0a 76 65 72 69 66 79 5f 65  nique}}.verify_e
0940: 78 5f 65 72 72 63 6f 64 65 20 75 6e 69 71 75 65  x_errcode unique
0950: 2d 32 2e 33 62 20 53 51 4c 49 54 45 5f 43 4f 4e  -2.3b SQLITE_CON
0960: 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 0a 64  STRAINT_UNIQUE.d
0970: 6f 5f 74 65 73 74 20 75 6e 69 71 75 65 2d 32 2e  o_test unique-2.
0980: 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  4 {.  catchsql {
0990: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
09a0: 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 61  OM t2 ORDER BY a
09b0: 0a 20 20 7d 0a 7d 20 7b 30 20 7b 31 20 32 20 33  .  }.} {0 {1 2 3
09c0: 20 34 7d 7d 0a 64 6f 5f 74 65 73 74 20 75 6e 69   4}}.do_test uni
09d0: 71 75 65 2d 32 2e 35 20 7b 0a 20 20 63 61 74 63  que-2.5 {.  catc
09e0: 68 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20  hsql {.    DROP 
09f0: 49 4e 44 45 58 20 69 32 3b 0a 20 20 20 20 53 45  INDEX i2;.    SE
0a00: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 4f  LECT * FROM t2 O
0a10: 52 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d  RDER BY a;.  }.}
0a20: 20 7b 30 20 7b 31 20 32 20 33 20 34 7d 7d 0a 64   {0 {1 2 3 4}}.d
0a30: 6f 5f 74 65 73 74 20 75 6e 69 71 75 65 2d 32 2e  o_test unique-2.
0a40: 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  6 {.  catchsql {
0a50: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0a60: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 35 29 0a   t2 VALUES(1,5).
0a70: 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f    }.} {0 {}}.do_
0a80: 74 65 73 74 20 75 6e 69 71 75 65 2d 32 2e 37 20  test unique-2.7 
0a90: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
0aa0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
0ab0: 20 74 32 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t2 ORDER BY a, 
0ac0: 62 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 31 20 32  b;.  }.} {0 {1 2
0ad0: 20 31 20 35 20 33 20 34 7d 7d 0a 64 6f 5f 74 65   1 5 3 4}}.do_te
0ae0: 73 74 20 75 6e 69 71 75 65 2d 32 2e 38 20 7b 0a  st unique-2.8 {.
0af0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
0b00: 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49   CREATE UNIQUE I
0b10: 4e 44 45 58 20 69 32 20 4f 4e 20 74 32 28 61 29  NDEX i2 ON t2(a)
0b20: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 69 6e 64 65  ;.  }.} {1 {inde
0b30: 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  xed columns are 
0b40: 6e 6f 74 20 75 6e 69 71 75 65 7d 7d 0a 76 65 72  not unique}}.ver
0b50: 69 66 79 5f 65 78 5f 65 72 72 63 6f 64 65 20 75  ify_ex_errcode u
0b60: 6e 69 71 75 65 2d 32 2e 38 62 20 53 51 4c 49 54  nique-2.8b SQLIT
0b70: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49  E_CONSTRAINT_UNI
0b80: 51 55 45 0a 64 6f 5f 74 65 73 74 20 75 6e 69 71  QUE.do_test uniq
0b90: 75 65 2d 32 2e 39 20 7b 0a 20 20 63 61 74 63 68  ue-2.9 {.  catch
0ba0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
0bb0: 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 32 28   INDEX i2 ON t2(
0bc0: 61 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d  a);.  }.} {0 {}}
0bd0: 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  .integrity_check
0be0: 20 75 6e 69 71 75 65 2d 32 2e 31 30 0a 0a 23 20   unique-2.10..# 
0bf0: 54 65 73 74 20 74 68 65 20 55 4e 49 51 55 45 20  Test the UNIQUE 
0c00: 6b 65 79 77 6f 72 64 20 61 73 20 75 73 65 64 20  keyword as used 
0c10: 6f 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 66  on two or more f
0c20: 69 65 6c 64 73 2e 0a 23 0a 64 6f 5f 74 65 73 74  ields..#.do_test
0c30: 20 75 6e 69 71 75 65 2d 33 2e 31 20 7b 0a 20 20   unique-3.1 {.  
0c40: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43  catchsql {.    C
0c50: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 0a  REATE TABLE t3(.
0c60: 20 20 20 20 20 20 20 61 20 69 6e 74 2c 0a 20 20         a int,.  
0c70: 20 20 20 20 20 62 20 69 6e 74 2c 0a 20 20 20 20       b int,.    
0c80: 20 20 20 63 20 69 6e 74 2c 0a 20 20 20 20 20 20     c int,.      
0c90: 20 64 20 69 6e 74 2c 0a 20 20 20 20 20 20 20 75   d int,.       u
0ca0: 6e 69 71 75 65 28 61 2c 63 2c 64 29 0a 20 20 20  nique(a,c,d).   
0cb0: 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d    );.  }.} {0 {}
0cc0: 7d 0a 64 6f 5f 74 65 73 74 20 75 6e 69 71 75 65  }.do_test unique
0cd0: 2d 33 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71  -3.2 {.  catchsq
0ce0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
0cf0: 4e 54 4f 20 74 33 28 61 2c 62 2c 63 2c 64 29 20  NTO t3(a,b,c,d) 
0d00: 56 41 4c 55 45 53 28 31 2c 32 2c 33 2c 34 29 3b  VALUES(1,2,3,4);
0d10: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
0d20: 4f 4d 20 74 33 20 4f 52 44 45 52 20 42 59 20 61  OM t3 ORDER BY a
0d30: 2c 62 2c 63 2c 64 3b 0a 20 20 7d 0a 7d 20 7b 30  ,b,c,d;.  }.} {0
0d40: 20 7b 31 20 32 20 33 20 34 7d 7d 0a 64 6f 5f 74   {1 2 3 4}}.do_t
0d50: 65 73 74 20 75 6e 69 71 75 65 2d 33 2e 33 20 7b  est unique-3.3 {
0d60: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
0d70: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
0d80: 28 61 2c 62 2c 63 2c 64 29 20 56 41 4c 55 45 53  (a,b,c,d) VALUES
0d90: 28 31 2c 32 2c 33 2c 35 29 3b 0a 20 20 20 20 53  (1,2,3,5);.    S
0da0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20  ELECT * FROM t3 
0db0: 4f 52 44 45 52 20 42 59 20 61 2c 62 2c 63 2c 64  ORDER BY a,b,c,d
0dc0: 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 31 20 32 20  ;.  }.} {0 {1 2 
0dd0: 33 20 34 20 31 20 32 20 33 20 35 7d 7d 0a 64 6f  3 4 1 2 3 5}}.do
0de0: 5f 74 65 73 74 20 75 6e 69 71 75 65 2d 33 2e 34  _test unique-3.4
0df0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
0e00: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0e10: 74 33 28 61 2c 62 2c 63 2c 64 29 20 56 41 4c 55  t3(a,b,c,d) VALU
0e20: 45 53 28 31 2c 34 2c 33 2c 35 29 3b 0a 20 20 20  ES(1,4,3,5);.   
0e30: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0e40: 33 20 4f 52 44 45 52 20 42 59 20 61 2c 62 2c 63  3 ORDER BY a,b,c
0e50: 2c 64 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63 6f  ,d;.  }.} {1 {co
0e60: 6c 75 6d 6e 73 20 61 2c 20 63 2c 20 64 20 61 72  lumns a, c, d ar
0e70: 65 20 6e 6f 74 20 75 6e 69 71 75 65 7d 7d 0a 76  e not unique}}.v
0e80: 65 72 69 66 79 5f 65 78 5f 65 72 72 63 6f 64 65  erify_ex_errcode
0e90: 20 75 6e 69 71 75 65 2d 33 2e 34 62 20 53 51 4c   unique-3.4b SQL
0ea0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55  ITE_CONSTRAINT_U
0eb0: 4e 49 51 55 45 0a 69 6e 74 65 67 72 69 74 79 5f  NIQUE.integrity_
0ec0: 63 68 65 63 6b 20 75 6e 69 71 75 65 2d 33 2e 35  check unique-3.5
0ed0: 0a 0a 23 20 4d 61 6b 65 20 73 75 72 65 20 4e 55  ..# Make sure NU
0ee0: 4c 4c 73 20 61 72 65 20 64 69 73 74 69 6e 63 74  LLs are distinct
0ef0: 20 61 73 20 66 61 72 20 61 73 20 74 68 65 20 55   as far as the U
0f00: 4e 49 51 55 45 20 74 65 73 74 73 20 61 72 65 0a  NIQUE tests are.
0f10: 23 20 63 6f 6e 63 65 72 6e 65 64 2e 0a 23 0a 64  # concerned..#.d
0f20: 6f 5f 74 65 73 74 20 75 6e 69 71 75 65 2d 34 2e  o_test unique-4.
0f30: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
0f40: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
0f50: 20 74 34 28 61 20 55 4e 49 51 55 45 2c 20 62 2c   t4(a UNIQUE, b,
0f60: 20 63 2c 20 55 4e 49 51 55 45 28 62 2c 63 29 29   c, UNIQUE(b,c))
0f70: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0f80: 4f 20 74 34 20 56 41 4c 55 45 53 28 31 2c 32 2c  O t4 VALUES(1,2,
0f90: 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  3);.    INSERT I
0fa0: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 4e 55  NTO t4 VALUES(NU
0fb0: 4c 4c 2c 20 32 2c 20 4e 55 4c 4c 29 3b 0a 20 20  LL, 2, NULL);.  
0fc0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0fd0: 74 34 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33  t4;.  }.} {1 2 3
0fe0: 20 7b 7d 20 32 20 7b 7d 7d 0a 64 6f 5f 74 65 73   {} 2 {}}.do_tes
0ff0: 74 20 75 6e 69 71 75 65 2d 34 2e 32 20 7b 0a 20  t unique-4.2 {. 
1000: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
1010: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
1020: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 33 2c 20 34  ALUES(NULL, 3, 4
1030: 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a  );.  }.} {0 {}}.
1040: 64 6f 5f 74 65 73 74 20 75 6e 69 71 75 65 2d 34  do_test unique-4
1050: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
1060: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
1070: 4f 4d 20 74 34 0a 20 20 7d 0a 7d 20 7b 31 20 32  OM t4.  }.} {1 2
1080: 20 33 20 7b 7d 20 32 20 7b 7d 20 7b 7d 20 33 20   3 {} 2 {} {} 3 
1090: 34 7d 0a 64 6f 5f 74 65 73 74 20 75 6e 69 71 75  4}.do_test uniqu
10a0: 65 2d 34 2e 34 20 7b 0a 20 20 63 61 74 63 68 73  e-4.4 {.  catchs
10b0: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
10c0: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 32  INTO t4 VALUES(2
10d0: 2c 20 32 2c 20 4e 55 4c 4c 29 3b 0a 20 20 7d 0a  , 2, NULL);.  }.
10e0: 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74  } {0 {}}.do_test
10f0: 20 75 6e 69 71 75 65 2d 34 2e 35 20 7b 0a 20 20   unique-4.5 {.  
1100: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
1110: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 0a 20  LECT * FROM t4. 
1120: 20 7d 0a 7d 20 7b 31 20 32 20 33 20 7b 7d 20 32   }.} {1 2 3 {} 2
1130: 20 7b 7d 20 7b 7d 20 33 20 34 20 32 20 32 20 7b   {} {} 3 4 2 2 {
1140: 7d 7d 0a 0a 23 20 54 69 63 6b 65 74 20 23 31 33  }}..# Ticket #13
1150: 30 31 2e 20 20 41 6e 79 20 4e 55 4c 4c 20 76 61  01.  Any NULL va
1160: 6c 75 65 20 69 6e 20 61 20 73 65 74 20 6f 66 20  lue in a set of 
1170: 75 6e 69 71 75 65 20 63 6f 6c 75 6d 6e 73 20 73  unique columns s
1180: 68 6f 75 6c 64 0a 23 20 63 61 75 73 65 20 74 68  hould.# cause th
1190: 65 20 72 6f 77 73 20 74 6f 20 62 65 20 64 69 73  e rows to be dis
11a0: 74 69 6e 63 74 2e 0a 23 0a 64 6f 5f 74 65 73 74  tinct..#.do_test
11b0: 20 75 6e 69 71 75 65 2d 34 2e 36 20 7b 0a 20 20   unique-4.6 {.  
11c0: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49  catchsql {.    I
11d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41  NSERT INTO t4 VA
11e0: 4c 55 45 53 28 4e 55 4c 4c 2c 20 32 2c 20 4e 55  LUES(NULL, 2, NU
11f0: 4c 4c 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d  LL);.  }.} {0 {}
1200: 7d 0a 64 6f 5f 74 65 73 74 20 75 6e 69 71 75 65  }.do_test unique
1210: 2d 34 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  -4.7 {.  execsql
1220: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
1230: 74 34 7d 0a 7d 20 7b 31 20 32 20 33 20 7b 7d 20  t4}.} {1 2 3 {} 
1240: 32 20 7b 7d 20 7b 7d 20 33 20 34 20 32 20 32 20  2 {} {} 3 4 2 2 
1250: 7b 7d 20 7b 7d 20 32 20 7b 7d 7d 0a 64 6f 5f 74  {} {} 2 {}}.do_t
1260: 65 73 74 20 75 6e 69 71 75 65 2d 34 2e 38 20 7b  est unique-4.8 {
1270: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 43 52 45  .  catchsql {CRE
1280: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58  ATE UNIQUE INDEX
1290: 20 69 34 61 20 4f 4e 20 74 34 28 61 2c 62 29 7d   i4a ON t4(a,b)}
12a0: 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73  .} {0 {}}.do_tes
12b0: 74 20 75 6e 69 71 75 65 2d 34 2e 39 20 7b 0a 20  t unique-4.9 {. 
12c0: 20 63 61 74 63 68 73 71 6c 20 7b 43 52 45 41 54   catchsql {CREAT
12d0: 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 69  E UNIQUE INDEX i
12e0: 34 62 20 4f 4e 20 74 34 28 61 2c 62 2c 63 29 7d  4b ON t4(a,b,c)}
12f0: 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73  .} {0 {}}.do_tes
1300: 74 20 75 6e 69 71 75 65 2d 34 2e 31 30 20 7b 0a  t unique-4.10 {.
1310: 20 20 63 61 74 63 68 73 71 6c 20 7b 43 52 45 41    catchsql {CREA
1320: 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20  TE UNIQUE INDEX 
1330: 69 34 63 20 4f 4e 20 74 34 28 62 29 7d 0a 7d 20  i4c ON t4(b)}.} 
1340: 7b 31 20 7b 69 6e 64 65 78 65 64 20 63 6f 6c 75  {1 {indexed colu
1350: 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71  mns are not uniq
1360: 75 65 7d 7d 0a 76 65 72 69 66 79 5f 65 78 5f 65  ue}}.verify_ex_e
1370: 72 72 63 6f 64 65 20 75 6e 69 71 75 65 2d 34 2e  rrcode unique-4.
1380: 31 30 62 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  10b SQLITE_CONST
1390: 52 41 49 4e 54 5f 55 4e 49 51 55 45 0a 69 6e 74  RAINT_UNIQUE.int
13a0: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 75 6e 69  egrity_check uni
13b0: 71 75 65 2d 34 2e 39 39 0a 0a 23 20 54 65 73 74  que-4.99..# Test
13c0: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
13d0: 67 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6c 6f  ge generation lo
13e0: 67 69 63 2e 20 20 49 6e 20 70 61 72 74 69 63 75  gic.  In particu
13f0: 6c 61 72 2c 20 6d 61 6b 65 20 73 75 72 65 20 77  lar, make sure w
1400: 65 0a 23 20 64 6f 20 6e 6f 74 20 6f 76 65 72 66  e.# do not overf
1410: 6c 6f 77 20 74 68 65 20 73 74 61 74 69 63 20 62  low the static b
1420: 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 67 65  uffer used to ge
1430: 6e 65 72 61 74 65 20 74 68 65 20 65 72 72 6f 72  nerate the error
1440: 20 6d 65 73 73 61 67 65 2e 0a 23 0a 64 6f 5f 74   message..#.do_t
1450: 65 73 74 20 75 6e 69 71 75 65 2d 35 2e 31 20 7b  est unique-5.1 {
1460: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1470: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 35   CREATE TABLE t5
1480: 28 0a 20 20 20 20 20 20 66 69 72 73 74 5f 63 6f  (.      first_co
1490: 6c 75 6d 6e 5f 77 69 74 68 5f 6c 6f 6e 67 5f 6e  lumn_with_long_n
14a0: 61 6d 65 2c 0a 20 20 20 20 20 20 73 65 63 6f 6e  ame,.      secon
14b0: 64 5f 63 6f 6c 75 6d 6e 5f 77 69 74 68 5f 6c 6f  d_column_with_lo
14c0: 6e 67 5f 6e 61 6d 65 2c 0a 20 20 20 20 20 20 74  ng_name,.      t
14d0: 68 69 72 64 5f 63 6f 6c 75 6d 6e 5f 77 69 74 68  hird_column_with
14e0: 5f 6c 6f 6e 67 5f 6e 61 6d 65 2c 0a 20 20 20 20  _long_name,.    
14f0: 20 20 66 6f 75 72 74 68 5f 63 6f 6c 75 6d 6e 5f    fourth_column_
1500: 77 69 74 68 5f 6c 6f 6e 67 5f 6e 61 6d 65 2c 0a  with_long_name,.
1510: 20 20 20 20 20 20 66 69 66 74 68 5f 63 6f 6c 75        fifth_colu
1520: 6d 6e 5f 77 69 74 68 5f 6c 6f 6e 67 5f 6e 61 6d  mn_with_long_nam
1530: 65 2c 0a 20 20 20 20 20 20 73 69 78 74 68 5f 63  e,.      sixth_c
1540: 6f 6c 75 6d 6e 5f 77 69 74 68 5f 6c 6f 6e 67 5f  olumn_with_long_
1550: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 55 4e 49 51  name,.      UNIQ
1560: 55 45 28 0a 20 20 20 20 20 20 20 20 66 69 72 73  UE(.        firs
1570: 74 5f 63 6f 6c 75 6d 6e 5f 77 69 74 68 5f 6c 6f  t_column_with_lo
1580: 6e 67 5f 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ng_name,.       
1590: 20 73 65 63 6f 6e 64 5f 63 6f 6c 75 6d 6e 5f 77   second_column_w
15a0: 69 74 68 5f 6c 6f 6e 67 5f 6e 61 6d 65 2c 0a 20  ith_long_name,. 
15b0: 20 20 20 20 20 20 20 74 68 69 72 64 5f 63 6f 6c         third_col
15c0: 75 6d 6e 5f 77 69 74 68 5f 6c 6f 6e 67 5f 6e 61  umn_with_long_na
15d0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 66 6f 75 72  me,.        four
15e0: 74 68 5f 63 6f 6c 75 6d 6e 5f 77 69 74 68 5f 6c  th_column_with_l
15f0: 6f 6e 67 5f 6e 61 6d 65 2c 0a 20 20 20 20 20 20  ong_name,.      
1600: 20 20 66 69 66 74 68 5f 63 6f 6c 75 6d 6e 5f 77    fifth_column_w
1610: 69 74 68 5f 6c 6f 6e 67 5f 6e 61 6d 65 2c 0a 20  ith_long_name,. 
1620: 20 20 20 20 20 20 20 73 69 78 74 68 5f 63 6f 6c         sixth_col
1630: 75 6d 6e 5f 77 69 74 68 5f 6c 6f 6e 67 5f 6e 61  umn_with_long_na
1640: 6d 65 0a 20 20 20 20 20 20 29 0a 20 20 20 20 29  me.      ).    )
1650: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1660: 4f 20 74 35 20 56 41 4c 55 45 53 28 31 2c 32 2c  O t5 VALUES(1,2,
1670: 33 2c 34 2c 35 2c 36 29 3b 0a 20 20 20 20 53 45  3,4,5,6);.    SE
1680: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 35 3b 0a  LECT * FROM t5;.
1690: 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35    }.} {1 2 3 4 5
16a0: 20 36 7d 0a 64 6f 5f 74 65 73 74 20 75 6e 69 71   6}.do_test uniq
16b0: 75 65 2d 35 2e 32 20 7b 0a 20 20 63 61 74 63 68  ue-5.2 {.  catch
16c0: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
16d0: 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28   INTO t5 VALUES(
16e0: 31 2c 32 2c 33 2c 34 2c 35 2c 36 29 3b 0a 20 20  1,2,3,4,5,6);.  
16f0: 7d 0a 7d 20 7b 31 20 7b 63 6f 6c 75 6d 6e 73 20  }.} {1 {columns 
1700: 66 69 72 73 74 5f 63 6f 6c 75 6d 6e 5f 77 69 74  first_column_wit
1710: 68 5f 6c 6f 6e 67 5f 6e 61 6d 65 2c 20 73 65 63  h_long_name, sec
1720: 6f 6e 64 5f 63 6f 6c 75 6d 6e 5f 77 69 74 68 5f  ond_column_with_
1730: 6c 6f 6e 67 5f 6e 61 6d 65 2c 20 74 68 69 72 64  long_name, third
1740: 5f 63 6f 6c 75 6d 6e 5f 77 69 74 68 5f 6c 6f 6e  _column_with_lon
1750: 67 5f 6e 61 6d 65 2c 20 66 6f 75 72 74 68 5f 63  g_name, fourth_c
1760: 6f 6c 75 6d 6e 5f 77 69 74 68 5f 6c 6f 6e 67 5f  olumn_with_long_
1770: 6e 61 6d 65 2c 20 66 69 66 74 68 5f 63 6f 6c 75  name, fifth_colu
1780: 6d 6e 5f 77 69 74 68 5f 6c 6f 6e 67 5f 6e 61 6d  mn_with_long_nam
1790: 65 2c 20 73 69 78 74 68 5f 63 6f 6c 75 6d 6e 5f  e, sixth_column_
17a0: 77 69 74 68 5f 6c 6f 6e 67 5f 6e 61 6d 65 20 61  with_long_name a
17b0: 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 7d 7d 0a  re not unique}}.
17c0: 76 65 72 69 66 79 5f 65 78 5f 65 72 72 63 6f 64  verify_ex_errcod
17d0: 65 20 75 6e 69 71 75 65 2d 35 2e 32 62 20 53 51  e unique-5.2b SQ
17e0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
17f0: 55 4e 49 51 55 45 0a 0a 0a 66 69 6e 69 73 68 5f  UNIQUE...finish_
1800: 74 65 73 74 0a                                   test.