/ Hex Artifact Content
Login

Artifact 93f8b2ef5ea51b9495f8d6493429b1fd0f465264:


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 55 4e 49 51 55  .  }.} {1 {UNIQU
0500: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  E constraint fai
0510: 6c 65 64 3a 20 74 31 2e 61 7d 7d 0a 76 65 72 69  led: t1.a}}.veri
0520: 66 79 5f 65 78 5f 65 72 72 63 6f 64 65 20 75 6e  fy_ex_errcode un
0530: 69 71 75 65 2d 31 2e 33 62 20 53 51 4c 49 54 45  ique-1.3b SQLITE
0540: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
0550: 41 52 59 4b 45 59 0a 64 6f 5f 74 65 73 74 20 75  ARYKEY.do_test u
0560: 6e 69 71 75 65 2d 31 2e 34 20 7b 0a 20 20 65 78  nique-1.4 {.  ex
0570: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
0580: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44  CT * FROM t1 ORD
0590: 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b  ER BY a;.  }.} {
05a0: 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 75  1 2 3}.do_test u
05b0: 6e 69 71 75 65 2d 31 2e 35 20 7b 0a 20 20 63 61  nique-1.5 {.  ca
05c0: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  tchsql {.    INS
05d0: 45 52 54 20 49 4e 54 4f 20 74 31 28 61 2c 62 2c  ERT INTO t1(a,b,
05e0: 63 29 20 56 41 4c 55 45 53 28 33 2c 32 2c 34 29  c) VALUES(3,2,4)
05f0: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 55 4e 49 51 55  .  }.} {1 {UNIQU
0600: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  E constraint fai
0610: 6c 65 64 3a 20 74 31 2e 62 7d 7d 0a 76 65 72 69  led: t1.b}}.veri
0620: 66 79 5f 65 78 5f 65 72 72 63 6f 64 65 20 75 6e  fy_ex_errcode un
0630: 69 71 75 65 2d 31 2e 35 62 20 53 51 4c 49 54 45  ique-1.5b SQLITE
0640: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51  _CONSTRAINT_UNIQ
0650: 55 45 0a 64 6f 5f 74 65 73 74 20 75 6e 69 71 75  UE.do_test uniqu
0660: 65 2d 31 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  e-1.6 {.  execsq
0670: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
0680: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
0690: 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20  Y a;.  }.} {1 2 
06a0: 33 7d 0a 64 6f 5f 74 65 73 74 20 75 6e 69 71 75  3}.do_test uniqu
06b0: 65 2d 31 2e 37 20 7b 0a 20 20 63 61 74 63 68 73  e-1.7 {.  catchs
06c0: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
06d0: 49 4e 54 4f 20 74 31 28 61 2c 62 2c 63 29 20 56  INTO t1(a,b,c) V
06e0: 41 4c 55 45 53 28 33 2c 34 2c 35 29 0a 20 20 7d  ALUES(3,4,5).  }
06f0: 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73  .} {0 {}}.do_tes
0700: 74 20 75 6e 69 71 75 65 2d 31 2e 38 20 7b 0a 20  t unique-1.8 {. 
0710: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
0720: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0730: 4f 52 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a  ORDER BY a;.  }.
0740: 7d 20 7b 31 20 32 20 33 20 33 20 34 20 35 7d 0a  } {1 2 3 3 4 5}.
0750: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
0760: 75 6e 69 71 75 65 2d 31 2e 39 0a 0a 64 6f 5f 74  unique-1.9..do_t
0770: 65 73 74 20 75 6e 69 71 75 65 2d 32 2e 30 20 7b  est unique-2.0 {
0780: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0790: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a   DROP TABLE t1;.
07a0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
07b0: 20 74 32 28 61 20 69 6e 74 2c 20 62 20 69 6e 74   t2(a int, b int
07c0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
07d0: 54 4f 20 74 32 28 61 2c 62 29 20 56 41 4c 55 45  TO t2(a,b) VALUE
07e0: 53 28 31 2c 32 29 3b 0a 20 20 20 20 49 4e 53 45  S(1,2);.    INSE
07f0: 52 54 20 49 4e 54 4f 20 74 32 28 61 2c 62 29 20  RT INTO t2(a,b) 
0800: 56 41 4c 55 45 53 28 33 2c 34 29 3b 0a 20 20 20  VALUES(3,4);.   
0810: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0820: 32 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20 20  2 ORDER BY a;.  
0830: 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f  }.} {1 2 3 4}.do
0840: 5f 74 65 73 74 20 75 6e 69 71 75 65 2d 32 2e 31  _test unique-2.1
0850: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
0860: 20 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55      CREATE UNIQU
0870: 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 32  E INDEX i2 ON t2
0880: 28 61 29 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d  (a).  }.} {0 {}}
0890: 0a 64 6f 5f 74 65 73 74 20 75 6e 69 71 75 65 2d  .do_test unique-
08a0: 32 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  2.2 {.  catchsql
08b0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
08c0: 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
08d0: 20 61 0a 20 20 7d 0a 7d 20 7b 30 20 7b 31 20 32   a.  }.} {0 {1 2
08e0: 20 33 20 34 7d 7d 0a 64 6f 5f 74 65 73 74 20 75   3 4}}.do_test u
08f0: 6e 69 71 75 65 2d 32 2e 33 20 7b 0a 20 20 63 61  nique-2.3 {.  ca
0900: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  tchsql {.    INS
0910: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
0920: 45 53 28 31 2c 35 29 3b 0a 20 20 7d 0a 7d 20 7b  ES(1,5);.  }.} {
0930: 31 20 7b 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  1 {UNIQUE constr
0940: 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 74 32 2e  aint failed: t2.
0950: 61 7d 7d 0a 76 65 72 69 66 79 5f 65 78 5f 65 72  a}}.verify_ex_er
0960: 72 63 6f 64 65 20 75 6e 69 71 75 65 2d 32 2e 33  rcode unique-2.3
0970: 62 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  b SQLITE_CONSTRA
0980: 49 4e 54 5f 55 4e 49 51 55 45 0a 64 6f 5f 74 65  INT_UNIQUE.do_te
0990: 73 74 20 75 6e 69 71 75 65 2d 32 2e 34 20 7b 0a  st unique-2.4 {.
09a0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
09b0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
09c0: 32 20 4f 52 44 45 52 20 42 59 20 61 0a 20 20 7d  2 ORDER BY a.  }
09d0: 0a 7d 20 7b 30 20 7b 31 20 32 20 33 20 34 7d 7d  .} {0 {1 2 3 4}}
09e0: 0a 64 6f 5f 74 65 73 74 20 75 6e 69 71 75 65 2d  .do_test unique-
09f0: 32 2e 35 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  2.5 {.  catchsql
0a00: 20 7b 0a 20 20 20 20 44 52 4f 50 20 49 4e 44 45   {.    DROP INDE
0a10: 58 20 69 32 3b 0a 20 20 20 20 53 45 4c 45 43 54  X i2;.    SELECT
0a20: 20 2a 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52   * FROM t2 ORDER
0a30: 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b 30 20   BY a;.  }.} {0 
0a40: 7b 31 20 32 20 33 20 34 7d 7d 0a 64 6f 5f 74 65  {1 2 3 4}}.do_te
0a50: 73 74 20 75 6e 69 71 75 65 2d 32 2e 36 20 7b 0a  st unique-2.6 {.
0a60: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
0a70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
0a80: 56 41 4c 55 45 53 28 31 2c 35 29 0a 20 20 7d 0a  VALUES(1,5).  }.
0a90: 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74  } {0 {}}.do_test
0aa0: 20 75 6e 69 71 75 65 2d 32 2e 37 20 7b 0a 20 20   unique-2.7 {.  
0ab0: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 53  catchsql {.    S
0ac0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
0ad0: 4f 52 44 45 52 20 42 59 20 61 2c 20 62 3b 0a 20  ORDER BY a, b;. 
0ae0: 20 7d 0a 7d 20 7b 30 20 7b 31 20 32 20 31 20 35   }.} {0 {1 2 1 5
0af0: 20 33 20 34 7d 7d 0a 64 6f 5f 74 65 73 74 20 75   3 4}}.do_test u
0b00: 6e 69 71 75 65 2d 32 2e 38 20 7b 0a 20 20 63 61  nique-2.8 {.  ca
0b10: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  tchsql {.    CRE
0b20: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58  ATE UNIQUE INDEX
0b30: 20 69 32 20 4f 4e 20 74 32 28 61 29 3b 0a 20 20   i2 ON t2(a);.  
0b40: 7d 0a 7d 20 7b 31 20 7b 55 4e 49 51 55 45 20 63  }.} {1 {UNIQUE c
0b50: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
0b60: 3a 20 74 32 2e 61 7d 7d 0a 76 65 72 69 66 79 5f  : t2.a}}.verify_
0b70: 65 78 5f 65 72 72 63 6f 64 65 20 75 6e 69 71 75  ex_errcode uniqu
0b80: 65 2d 32 2e 38 62 20 53 51 4c 49 54 45 5f 43 4f  e-2.8b SQLITE_CO
0b90: 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 0a  NSTRAINT_UNIQUE.
0ba0: 64 6f 5f 74 65 73 74 20 75 6e 69 71 75 65 2d 32  do_test unique-2
0bb0: 2e 39 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .9 {.  catchsql 
0bc0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  {.    CREATE IND
0bd0: 45 58 20 69 32 20 4f 4e 20 74 32 28 61 29 3b 0a  EX i2 ON t2(a);.
0be0: 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 69 6e 74    }.} {0 {}}.int
0bf0: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 75 6e 69  egrity_check uni
0c00: 71 75 65 2d 32 2e 31 30 0a 0a 23 20 54 65 73 74  que-2.10..# Test
0c10: 20 74 68 65 20 55 4e 49 51 55 45 20 6b 65 79 77   the UNIQUE keyw
0c20: 6f 72 64 20 61 73 20 75 73 65 64 20 6f 6e 20 74  ord as used on t
0c30: 77 6f 20 6f 72 20 6d 6f 72 65 20 66 69 65 6c 64  wo or more field
0c40: 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 75 6e 69  s..#.do_test uni
0c50: 71 75 65 2d 33 2e 31 20 7b 0a 20 20 63 61 74 63  que-3.1 {.  catc
0c60: 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  hsql {.    CREAT
0c70: 45 20 54 41 42 4c 45 20 74 33 28 0a 20 20 20 20  E TABLE t3(.    
0c80: 20 20 20 61 20 69 6e 74 2c 0a 20 20 20 20 20 20     a int,.      
0c90: 20 62 20 69 6e 74 2c 0a 20 20 20 20 20 20 20 63   b int,.       c
0ca0: 20 69 6e 74 2c 0a 20 20 20 20 20 20 20 64 20 69   int,.       d i
0cb0: 6e 74 2c 0a 20 20 20 20 20 20 20 75 6e 69 71 75  nt,.       uniqu
0cc0: 65 28 61 2c 63 2c 64 29 0a 20 20 20 20 20 29 3b  e(a,c,d).     );
0cd0: 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f  .  }.} {0 {}}.do
0ce0: 5f 74 65 73 74 20 75 6e 69 71 75 65 2d 33 2e 32  _test unique-3.2
0cf0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
0d00: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0d10: 74 33 28 61 2c 62 2c 63 2c 64 29 20 56 41 4c 55  t3(a,b,c,d) VALU
0d20: 45 53 28 31 2c 32 2c 33 2c 34 29 3b 0a 20 20 20  ES(1,2,3,4);.   
0d30: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0d40: 33 20 4f 52 44 45 52 20 42 59 20 61 2c 62 2c 63  3 ORDER BY a,b,c
0d50: 2c 64 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 31 20  ,d;.  }.} {0 {1 
0d60: 32 20 33 20 34 7d 7d 0a 64 6f 5f 74 65 73 74 20  2 3 4}}.do_test 
0d70: 75 6e 69 71 75 65 2d 33 2e 33 20 7b 0a 20 20 63  unique-3.3 {.  c
0d80: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e  atchsql {.    IN
0d90: 53 45 52 54 20 49 4e 54 4f 20 74 33 28 61 2c 62  SERT INTO t3(a,b
0da0: 2c 63 2c 64 29 20 56 41 4c 55 45 53 28 31 2c 32  ,c,d) VALUES(1,2
0db0: 2c 33 2c 35 29 3b 0a 20 20 20 20 53 45 4c 45 43  ,3,5);.    SELEC
0dc0: 54 20 2a 20 46 52 4f 4d 20 74 33 20 4f 52 44 45  T * FROM t3 ORDE
0dd0: 52 20 42 59 20 61 2c 62 2c 63 2c 64 3b 0a 20 20  R BY a,b,c,d;.  
0de0: 7d 0a 7d 20 7b 30 20 7b 31 20 32 20 33 20 34 20  }.} {0 {1 2 3 4 
0df0: 31 20 32 20 33 20 35 7d 7d 0a 64 6f 5f 74 65 73  1 2 3 5}}.do_tes
0e00: 74 20 75 6e 69 71 75 65 2d 33 2e 34 20 7b 0a 20  t unique-3.4 {. 
0e10: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
0e20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 28 61  INSERT INTO t3(a
0e30: 2c 62 2c 63 2c 64 29 20 56 41 4c 55 45 53 28 31  ,b,c,d) VALUES(1
0e40: 2c 34 2c 33 2c 35 29 3b 0a 20 20 20 20 53 45 4c  ,4,3,5);.    SEL
0e50: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20 4f 52  ECT * FROM t3 OR
0e60: 44 45 52 20 42 59 20 61 2c 62 2c 63 2c 64 3b 0a  DER BY a,b,c,d;.
0e70: 20 20 7d 0a 7d 20 7b 31 20 7b 55 4e 49 51 55 45    }.} {1 {UNIQUE
0e80: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
0e90: 65 64 3a 20 74 33 2e 61 2c 20 74 33 2e 63 2c 20  ed: t3.a, t3.c, 
0ea0: 74 33 2e 64 7d 7d 0a 76 65 72 69 66 79 5f 65 78  t3.d}}.verify_ex
0eb0: 5f 65 72 72 63 6f 64 65 20 75 6e 69 71 75 65 2d  _errcode unique-
0ec0: 33 2e 34 62 20 53 51 4c 49 54 45 5f 43 4f 4e 53  3.4b SQLITE_CONS
0ed0: 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 0a 69 6e  TRAINT_UNIQUE.in
0ee0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 75 6e  tegrity_check un
0ef0: 69 71 75 65 2d 33 2e 35 0a 0a 23 20 4d 61 6b 65  ique-3.5..# Make
0f00: 20 73 75 72 65 20 4e 55 4c 4c 73 20 61 72 65 20   sure NULLs are 
0f10: 64 69 73 74 69 6e 63 74 20 61 73 20 66 61 72 20  distinct as far 
0f20: 61 73 20 74 68 65 20 55 4e 49 51 55 45 20 74 65  as the UNIQUE te
0f30: 73 74 73 20 61 72 65 0a 23 20 63 6f 6e 63 65 72  sts are.# concer
0f40: 6e 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 75  ned..#.do_test u
0f50: 6e 69 71 75 65 2d 34 2e 31 20 7b 0a 20 20 65 78  nique-4.1 {.  ex
0f60: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
0f70: 54 45 20 54 41 42 4c 45 20 74 34 28 61 20 55 4e  TE TABLE t4(a UN
0f80: 49 51 55 45 2c 20 62 2c 20 63 2c 20 55 4e 49 51  IQUE, b, c, UNIQ
0f90: 55 45 28 62 2c 63 29 29 3b 0a 20 20 20 20 49 4e  UE(b,c));.    IN
0fa0: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
0fb0: 55 45 53 28 31 2c 32 2c 33 29 3b 0a 20 20 20 20  UES(1,2,3);.    
0fc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
0fd0: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 32 2c 20 4e  ALUES(NULL, 2, N
0fe0: 55 4c 4c 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  ULL);.    SELECT
0ff0: 20 2a 20 46 52 4f 4d 20 74 34 3b 0a 20 20 7d 0a   * FROM t4;.  }.
1000: 7d 20 7b 31 20 32 20 33 20 7b 7d 20 32 20 7b 7d  } {1 2 3 {} 2 {}
1010: 7d 0a 64 6f 5f 74 65 73 74 20 75 6e 69 71 75 65  }.do_test unique
1020: 2d 34 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71  -4.2 {.  catchsq
1030: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
1040: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 4e 55  NTO t4 VALUES(NU
1050: 4c 4c 2c 20 33 2c 20 34 29 3b 0a 20 20 7d 0a 7d  LL, 3, 4);.  }.}
1060: 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20   {0 {}}.do_test 
1070: 75 6e 69 71 75 65 2d 34 2e 33 20 7b 0a 20 20 65  unique-4.3 {.  e
1080: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
1090: 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 0a 20 20  ECT * FROM t4.  
10a0: 7d 0a 7d 20 7b 31 20 32 20 33 20 7b 7d 20 32 20  }.} {1 2 3 {} 2 
10b0: 7b 7d 20 7b 7d 20 33 20 34 7d 0a 64 6f 5f 74 65  {} {} 3 4}.do_te
10c0: 73 74 20 75 6e 69 71 75 65 2d 34 2e 34 20 7b 0a  st unique-4.4 {.
10d0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
10e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
10f0: 56 41 4c 55 45 53 28 32 2c 20 32 2c 20 4e 55 4c  VALUES(2, 2, NUL
1100: 4c 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d  L);.  }.} {0 {}}
1110: 0a 64 6f 5f 74 65 73 74 20 75 6e 69 71 75 65 2d  .do_test unique-
1120: 34 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.5 {.  execsql 
1130: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
1140: 52 4f 4d 20 74 34 0a 20 20 7d 0a 7d 20 7b 31 20  ROM t4.  }.} {1 
1150: 32 20 33 20 7b 7d 20 32 20 7b 7d 20 7b 7d 20 33  2 3 {} 2 {} {} 3
1160: 20 34 20 32 20 32 20 7b 7d 7d 0a 0a 23 20 54 69   4 2 2 {}}..# Ti
1170: 63 6b 65 74 20 23 31 33 30 31 2e 20 20 41 6e 79  cket #1301.  Any
1180: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 6e 20 61   NULL value in a
1190: 20 73 65 74 20 6f 66 20 75 6e 69 71 75 65 20 63   set of unique c
11a0: 6f 6c 75 6d 6e 73 20 73 68 6f 75 6c 64 0a 23 20  olumns should.# 
11b0: 63 61 75 73 65 20 74 68 65 20 72 6f 77 73 20 74  cause the rows t
11c0: 6f 20 62 65 20 64 69 73 74 69 6e 63 74 2e 0a 23  o be distinct..#
11d0: 0a 64 6f 5f 74 65 73 74 20 75 6e 69 71 75 65 2d  .do_test unique-
11e0: 34 2e 36 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  4.6 {.  catchsql
11f0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
1200: 54 4f 20 74 34 20 56 41 4c 55 45 53 28 4e 55 4c  TO t4 VALUES(NUL
1210: 4c 2c 20 32 2c 20 4e 55 4c 4c 29 3b 0a 20 20 7d  L, 2, NULL);.  }
1220: 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73  .} {0 {}}.do_tes
1230: 74 20 75 6e 69 71 75 65 2d 34 2e 37 20 7b 0a 20  t unique-4.7 {. 
1240: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
1250: 20 2a 20 46 52 4f 4d 20 74 34 7d 0a 7d 20 7b 31   * FROM t4}.} {1
1260: 20 32 20 33 20 7b 7d 20 32 20 7b 7d 20 7b 7d 20   2 3 {} 2 {} {} 
1270: 33 20 34 20 32 20 32 20 7b 7d 20 7b 7d 20 32 20  3 4 2 2 {} {} 2 
1280: 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 75 6e 69 71  {}}.do_test uniq
1290: 75 65 2d 34 2e 38 20 7b 0a 20 20 63 61 74 63 68  ue-4.8 {.  catch
12a0: 73 71 6c 20 7b 43 52 45 41 54 45 20 55 4e 49 51  sql {CREATE UNIQ
12b0: 55 45 20 49 4e 44 45 58 20 69 34 61 20 4f 4e 20  UE INDEX i4a ON 
12c0: 74 34 28 61 2c 62 29 7d 0a 7d 20 7b 30 20 7b 7d  t4(a,b)}.} {0 {}
12d0: 7d 0a 64 6f 5f 74 65 73 74 20 75 6e 69 71 75 65  }.do_test unique
12e0: 2d 34 2e 39 20 7b 0a 20 20 63 61 74 63 68 73 71  -4.9 {.  catchsq
12f0: 6c 20 7b 43 52 45 41 54 45 20 55 4e 49 51 55 45  l {CREATE UNIQUE
1300: 20 49 4e 44 45 58 20 69 34 62 20 4f 4e 20 74 34   INDEX i4b ON t4
1310: 28 61 2c 62 2c 63 29 7d 0a 7d 20 7b 30 20 7b 7d  (a,b,c)}.} {0 {}
1320: 7d 0a 64 6f 5f 74 65 73 74 20 75 6e 69 71 75 65  }.do_test unique
1330: 2d 34 2e 31 30 20 7b 0a 20 20 63 61 74 63 68 73  -4.10 {.  catchs
1340: 71 6c 20 7b 43 52 45 41 54 45 20 55 4e 49 51 55  ql {CREATE UNIQU
1350: 45 20 49 4e 44 45 58 20 69 34 63 20 4f 4e 20 74  E INDEX i4c ON t
1360: 34 28 62 29 7d 0a 7d 20 7b 31 20 7b 55 4e 49 51  4(b)}.} {1 {UNIQ
1370: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  UE constraint fa
1380: 69 6c 65 64 3a 20 74 34 2e 62 7d 7d 0a 76 65 72  iled: t4.b}}.ver
1390: 69 66 79 5f 65 78 5f 65 72 72 63 6f 64 65 20 75  ify_ex_errcode u
13a0: 6e 69 71 75 65 2d 34 2e 31 30 62 20 53 51 4c 49  nique-4.10b SQLI
13b0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e  TE_CONSTRAINT_UN
13c0: 49 51 55 45 0a 69 6e 74 65 67 72 69 74 79 5f 63  IQUE.integrity_c
13d0: 68 65 63 6b 20 75 6e 69 71 75 65 2d 34 2e 39 39  heck unique-4.99
13e0: 0a 0a 23 20 54 65 73 74 20 74 68 65 20 65 72 72  ..# Test the err
13f0: 6f 72 20 6d 65 73 73 61 67 65 20 67 65 6e 65 72  or message gener
1400: 61 74 69 6f 6e 20 6c 6f 67 69 63 2e 20 20 49 6e  ation logic.  In
1410: 20 70 61 72 74 69 63 75 6c 61 72 2c 20 6d 61 6b   particular, mak
1420: 65 20 73 75 72 65 20 77 65 0a 23 20 64 6f 20 6e  e sure we.# do n
1430: 6f 74 20 6f 76 65 72 66 6c 6f 77 20 74 68 65 20  ot overflow the 
1440: 73 74 61 74 69 63 20 62 75 66 66 65 72 20 75 73  static buffer us
1450: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74  ed to generate t
1460: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
1470: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 75 6e 69 71  ..#.do_test uniq
1480: 75 65 2d 35 2e 31 20 7b 0a 20 20 65 78 65 63 73  ue-5.1 {.  execs
1490: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
14a0: 54 41 42 4c 45 20 74 35 28 0a 20 20 20 20 20 20  TABLE t5(.      
14b0: 66 69 72 73 74 5f 63 6f 6c 75 6d 6e 5f 77 69 74  first_column_wit
14c0: 68 5f 6c 6f 6e 67 5f 6e 61 6d 65 2c 0a 20 20 20  h_long_name,.   
14d0: 20 20 20 73 65 63 6f 6e 64 5f 63 6f 6c 75 6d 6e     second_column
14e0: 5f 77 69 74 68 5f 6c 6f 6e 67 5f 6e 61 6d 65 2c  _with_long_name,
14f0: 0a 20 20 20 20 20 20 74 68 69 72 64 5f 63 6f 6c  .      third_col
1500: 75 6d 6e 5f 77 69 74 68 5f 6c 6f 6e 67 5f 6e 61  umn_with_long_na
1510: 6d 65 2c 0a 20 20 20 20 20 20 66 6f 75 72 74 68  me,.      fourth
1520: 5f 63 6f 6c 75 6d 6e 5f 77 69 74 68 5f 6c 6f 6e  _column_with_lon
1530: 67 5f 6e 61 6d 65 2c 0a 20 20 20 20 20 20 66 69  g_name,.      fi
1540: 66 74 68 5f 63 6f 6c 75 6d 6e 5f 77 69 74 68 5f  fth_column_with_
1550: 6c 6f 6e 67 5f 6e 61 6d 65 2c 0a 20 20 20 20 20  long_name,.     
1560: 20 73 69 78 74 68 5f 63 6f 6c 75 6d 6e 5f 77 69   sixth_column_wi
1570: 74 68 5f 6c 6f 6e 67 5f 6e 61 6d 65 2c 0a 20 20  th_long_name,.  
1580: 20 20 20 20 55 4e 49 51 55 45 28 0a 20 20 20 20      UNIQUE(.    
1590: 20 20 20 20 66 69 72 73 74 5f 63 6f 6c 75 6d 6e      first_column
15a0: 5f 77 69 74 68 5f 6c 6f 6e 67 5f 6e 61 6d 65 2c  _with_long_name,
15b0: 0a 20 20 20 20 20 20 20 20 73 65 63 6f 6e 64 5f  .        second_
15c0: 63 6f 6c 75 6d 6e 5f 77 69 74 68 5f 6c 6f 6e 67  column_with_long
15d0: 5f 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 74  _name,.        t
15e0: 68 69 72 64 5f 63 6f 6c 75 6d 6e 5f 77 69 74 68  hird_column_with
15f0: 5f 6c 6f 6e 67 5f 6e 61 6d 65 2c 0a 20 20 20 20  _long_name,.    
1600: 20 20 20 20 66 6f 75 72 74 68 5f 63 6f 6c 75 6d      fourth_colum
1610: 6e 5f 77 69 74 68 5f 6c 6f 6e 67 5f 6e 61 6d 65  n_with_long_name
1620: 2c 0a 20 20 20 20 20 20 20 20 66 69 66 74 68 5f  ,.        fifth_
1630: 63 6f 6c 75 6d 6e 5f 77 69 74 68 5f 6c 6f 6e 67  column_with_long
1640: 5f 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 73  _name,.        s
1650: 69 78 74 68 5f 63 6f 6c 75 6d 6e 5f 77 69 74 68  ixth_column_with
1660: 5f 6c 6f 6e 67 5f 6e 61 6d 65 0a 20 20 20 20 20  _long_name.     
1670: 20 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 49 4e   ).    );.    IN
1680: 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c  SERT INTO t5 VAL
1690: 55 45 53 28 31 2c 32 2c 33 2c 34 2c 35 2c 36 29  UES(1,2,3,4,5,6)
16a0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
16b0: 52 4f 4d 20 74 35 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t5;.  }.} {1
16c0: 20 32 20 33 20 34 20 35 20 36 7d 0a 64 6f 5f 74   2 3 4 5 6}.do_t
16d0: 65 73 74 20 75 6e 69 71 75 65 2d 35 2e 32 20 7b  est unique-5.2 {
16e0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
16f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35    INSERT INTO t5
1700: 20 56 41 4c 55 45 53 28 31 2c 32 2c 33 2c 34 2c   VALUES(1,2,3,4,
1710: 35 2c 36 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  5,6);.  }.} {1 {
1720: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
1730: 74 20 66 61 69 6c 65 64 3a 20 74 35 2e 66 69 72  t failed: t5.fir
1740: 73 74 5f 63 6f 6c 75 6d 6e 5f 77 69 74 68 5f 6c  st_column_with_l
1750: 6f 6e 67 5f 6e 61 6d 65 2c 20 74 35 2e 73 65 63  ong_name, t5.sec
1760: 6f 6e 64 5f 63 6f 6c 75 6d 6e 5f 77 69 74 68 5f  ond_column_with_
1770: 6c 6f 6e 67 5f 6e 61 6d 65 2c 20 74 35 2e 74 68  long_name, t5.th
1780: 69 72 64 5f 63 6f 6c 75 6d 6e 5f 77 69 74 68 5f  ird_column_with_
1790: 6c 6f 6e 67 5f 6e 61 6d 65 2c 20 74 35 2e 66 6f  long_name, t5.fo
17a0: 75 72 74 68 5f 63 6f 6c 75 6d 6e 5f 77 69 74 68  urth_column_with
17b0: 5f 6c 6f 6e 67 5f 6e 61 6d 65 2c 20 74 35 2e 66  _long_name, t5.f
17c0: 69 66 74 68 5f 63 6f 6c 75 6d 6e 5f 77 69 74 68  ifth_column_with
17d0: 5f 6c 6f 6e 67 5f 6e 61 6d 65 2c 20 74 35 2e 73  _long_name, t5.s
17e0: 69 78 74 68 5f 63 6f 6c 75 6d 6e 5f 77 69 74 68  ixth_column_with
17f0: 5f 6c 6f 6e 67 5f 6e 61 6d 65 7d 7d 0a 76 65 72  _long_name}}.ver
1800: 69 66 79 5f 65 78 5f 65 72 72 63 6f 64 65 20 75  ify_ex_errcode u
1810: 6e 69 71 75 65 2d 35 2e 32 62 20 53 51 4c 49 54  nique-5.2b SQLIT
1820: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49  E_CONSTRAINT_UNI
1830: 51 55 45 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73  QUE...finish_tes
1840: 74 0a                                            t.