/ Hex Artifact Content
Login

Artifact 150aa00bb6220672e5f0eb14dc8eaa36750425f0:


0000: 23 20 32 30 30 39 20 41 70 72 69 6c 20 32 34 20  # 2009 April 24 
0010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0050: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0060: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0070: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0080: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0090: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
00a0: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
00b0: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
00c0: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
00d0: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00f0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
0100: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
0110: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
0120: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
0130: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0140: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0150: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n you give..#.#*
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
01a0: 2a 2a 2a 2a 2a 2a 0a 23 0a 23 20 54 69 63 6b 65  ******.#.# Ticke
01b0: 74 20 23 33 38 32 34 0a 23 0a 23 20 57 68 65 6e  t #3824.#.# When
01c0: 20 79 6f 75 20 75 73 65 20 61 6e 20 22 49 53 20   you use an "IS 
01d0: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
01e0: 20 6f 6e 20 61 20 55 4e 49 51 55 45 20 69 6e 64   on a UNIQUE ind
01f0: 65 78 2c 20 74 68 65 20 72 65 73 75 6c 74 0a 23  ex, the result.#
0200: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
0210: 69 6c 79 20 55 4e 49 51 55 45 2e 20 20 4d 61 6b  ily UNIQUE.  Mak
0220: 65 20 73 75 72 65 20 74 68 65 20 6f 70 74 69 6d  e sure the optim
0230: 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 73  izer does not as
0240: 73 75 6d 65 0a 23 20 75 6e 69 71 75 65 6e 65 73  sume.# uniquenes
0250: 73 2e 0a 23 0a 23 20 24 49 64 3a 20 74 6b 74 33  s..#.# $Id: tkt3
0260: 38 32 34 2e 74 65 73 74 2c 76 20 31 2e 32 20 32  824.test,v 1.2 2
0270: 30 30 39 2f 30 34 2f 32 34 20 32 30 3a 33 32 3a  009/04/24 20:32:
0280: 33 31 20 64 72 68 20 45 78 70 20 24 0a 0a 73 65  31 drh Exp $..se
0290: 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20  t testdir [file 
02a0: 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a  dirname $argv0].
02b0: 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f  source $testdir/
02c0: 74 65 73 74 65 72 2e 74 63 6c 0a 0a 70 72 6f 63  tester.tcl..proc
02d0: 20 65 78 65 63 73 71 6c 5f 73 74 61 74 75 73 20   execsql_status 
02e0: 7b 73 71 6c 20 7b 64 62 20 64 62 7d 7d 20 7b 0a  {sql {db db}} {.
02f0: 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 75 70    set result [up
0300: 6c 65 76 65 6c 20 24 64 62 20 65 76 61 6c 20 5b  level $db eval [
0310: 6c 69 73 74 20 24 73 71 6c 5d 5d 0a 20 20 69 66  list $sql]].  if
0320: 20 7b 5b 64 62 20 73 74 61 74 75 73 20 73 6f 72   {[db status sor
0330: 74 5d 7d 20 7b 0a 20 20 20 20 63 6f 6e 63 61 74  t]} {.    concat
0340: 20 24 72 65 73 75 6c 74 20 73 6f 72 74 0a 20 20   $result sort.  
0350: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 63 6f 6e  } else {.    con
0360: 63 61 74 20 24 72 65 73 75 6c 74 20 6e 6f 73 6f  cat $result noso
0370: 72 74 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 74 65 73  rt.  }.}..do_tes
0380: 74 20 74 6b 74 33 38 32 34 2d 31 2e 31 20 7b 0a  t tkt3824-1.1 {.
0390: 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20    db eval {.    
03a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03b0: 61 2c 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  a,b);.    INSERT
03c0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
03d0: 31 2c 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53  1,NULL);.    INS
03e0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
03f0: 45 53 28 39 2c 4e 55 4c 4c 29 3b 0a 20 20 20 20  ES(9,NULL);.    
0400: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0410: 41 4c 55 45 53 28 35 2c 4e 55 4c 4c 29 3b 0a 20  ALUES(5,NULL);. 
0420: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0430: 31 20 56 41 4c 55 45 53 28 31 32 33 2c 4e 55 4c  1 VALUES(123,NUL
0440: 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  L);.    INSERT I
0450: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 2d 31  NTO t1 VALUES(-1
0460: 30 2c 4e 55 4c 4c 29 3b 0a 20 20 20 20 43 52 45  0,NULL);.    CRE
0470: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58  ATE UNIQUE INDEX
0480: 20 74 31 62 20 4f 4e 20 74 31 28 62 29 3b 0a 20   t1b ON t1(b);. 
0490: 20 7d 0a 20 20 65 78 65 63 73 71 6c 5f 73 74 61   }.  execsql_sta
04a0: 74 75 73 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  tus {.    SELECT
04b0: 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
04c0: 20 62 20 49 53 20 4e 55 4c 4c 20 4f 52 44 45 52   b IS NULL ORDER
04d0: 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b 2d 31   BY a;.  }.} {-1
04e0: 30 20 31 20 35 20 39 20 31 32 33 20 73 6f 72 74  0 1 5 9 123 sort
04f0: 7d 0a 64 6f 5f 74 65 73 74 20 74 6b 74 33 38 32  }.do_test tkt382
0500: 34 2d 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  4-1.2 {.  execsq
0510: 6c 5f 73 74 61 74 75 73 20 7b 0a 20 20 20 20 53  l_status {.    S
0520: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
0530: 57 48 45 52 45 20 62 20 49 53 20 4e 55 4c 4c 20  WHERE b IS NULL 
0540: 4f 52 44 45 52 20 42 59 20 62 2c 20 61 3b 0a 20  ORDER BY b, a;. 
0550: 20 7d 0a 7d 20 7b 2d 31 30 20 31 20 35 20 39 20   }.} {-10 1 5 9 
0560: 31 32 33 20 73 6f 72 74 7d 0a 0a 64 6f 5f 74 65  123 sort}..do_te
0570: 73 74 20 74 6b 74 33 38 32 34 2d 32 2e 31 20 7b  st tkt3824-2.1 {
0580: 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20  .  db eval {.   
0590: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
05a0: 28 61 2c 62 2c 63 29 3b 0a 20 20 20 20 49 4e 53  (a,b,c);.    INS
05b0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
05c0: 45 53 28 31 2c 31 2c 4e 55 4c 4c 29 3b 0a 20 20  ES(1,1,NULL);.  
05d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
05e0: 20 56 41 4c 55 45 53 28 39 2c 32 2c 4e 55 4c 4c   VALUES(9,2,NULL
05f0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0600: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 35 2c 32  TO t2 VALUES(5,2
0610: 2c 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45  ,NULL);.    INSE
0620: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
0630: 53 28 31 32 33 2c 33 2c 4e 55 4c 4c 29 3b 0a 20  S(123,3,NULL);. 
0640: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0650: 32 20 56 41 4c 55 45 53 28 2d 31 30 2c 33 2c 4e  2 VALUES(-10,3,N
0660: 55 4c 4c 29 3b 0a 20 20 20 20 43 52 45 41 54 45  ULL);.    CREATE
0670: 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 74 32   UNIQUE INDEX t2
0680: 62 63 20 4f 4e 20 74 32 28 62 2c 63 29 3b 0a 20  bc ON t2(b,c);. 
0690: 20 7d 0a 20 20 65 78 65 63 73 71 6c 5f 73 74 61   }.  execsql_sta
06a0: 74 75 73 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  tus {.    SELECT
06b0: 20 61 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   a FROM t2 WHERE
06c0: 20 62 3d 32 20 41 4e 44 20 63 20 49 53 20 4e 55   b=2 AND c IS NU
06d0: 4c 4c 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20  LL ORDER BY a;. 
06e0: 20 7d 0a 7d 20 7b 35 20 39 20 73 6f 72 74 7d 0a   }.} {5 9 sort}.
06f0: 64 6f 5f 74 65 73 74 20 74 6b 74 33 38 32 34 2d  do_test tkt3824-
0700: 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 5f  2.2 {.  execsql_
0710: 73 74 61 74 75 73 20 7b 0a 20 20 20 20 53 45 4c  status {.    SEL
0720: 45 43 54 20 61 20 46 52 4f 4d 20 74 32 20 57 48  ECT a FROM t2 WH
0730: 45 52 45 20 62 3d 32 20 41 4e 44 20 63 20 49 53  ERE b=2 AND c IS
0740: 20 4e 55 4c 4c 20 4f 52 44 45 52 20 42 59 20 62   NULL ORDER BY b
0750: 2c 20 61 3b 0a 20 20 7d 0a 7d 20 7b 35 20 39 20  , a;.  }.} {5 9 
0760: 73 6f 72 74 7d 0a 64 6f 5f 74 65 73 74 20 74 6b  sort}.do_test tk
0770: 74 33 38 32 34 2d 32 2e 33 20 7b 0a 20 20 6c 73  t3824-2.3 {.  ls
0780: 6f 72 74 20 5b 65 78 65 63 73 71 6c 5f 73 74 61  ort [execsql_sta
0790: 74 75 73 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  tus {.    SELECT
07a0: 20 61 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   a FROM t2 WHERE
07b0: 20 62 3d 32 20 41 4e 44 20 63 20 49 53 20 4e 55   b=2 AND c IS NU
07c0: 4c 4c 20 4f 52 44 45 52 20 42 59 20 62 3b 0a 20  LL ORDER BY b;. 
07d0: 20 7d 5d 0a 7d 20 7b 35 20 39 20 6e 6f 73 6f 72   }].} {5 9 nosor
07e0: 74 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 6b 74 33  t}..do_test tkt3
07f0: 38 32 34 2d 33 2e 31 20 7b 0a 20 20 64 62 20 65  824-3.1 {.  db e
0800: 76 61 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  val {.    CREATE
0810: 20 54 41 42 4c 45 20 74 33 28 78 2c 79 29 3b 0a   TABLE t3(x,y);.
0820: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0830: 74 33 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46  t3 SELECT a, b F
0840: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
0850: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
0860: 53 28 32 33 34 2c 35 36 37 29 3b 0a 20 20 20 20  S(234,567);.    
0870: 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e  CREATE UNIQUE IN
0880: 44 45 58 20 74 33 79 20 4f 4e 20 74 33 28 79 29  DEX t3y ON t3(y)
0890: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
08a0: 4d 20 74 33 20 57 48 45 52 45 20 79 20 49 53 20  M t3 WHERE y IS 
08b0: 4e 55 4c 4c 3b 0a 20 20 20 20 53 45 4c 45 43 54  NULL;.    SELECT
08c0: 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 7d 0a   * FROM t3;.  }.
08d0: 7d 20 7b 32 33 34 20 35 36 37 7d 0a 0a 64 6f 5f  } {234 567}..do_
08e0: 74 65 73 74 20 74 6b 74 33 38 32 34 2d 34 2e 31  test tkt3824-4.1
08f0: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20   {.  db eval {. 
0900: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0910: 74 34 28 78 2c 79 29 3b 0a 20 20 20 20 49 4e 53  t4(x,y);.    INS
0920: 45 52 54 20 49 4e 54 4f 20 74 34 20 53 45 4c 45  ERT INTO t4 SELE
0930: 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74 31 3b  CT a, b FROM t1;
0940: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0950: 20 74 34 20 56 41 4c 55 45 53 28 32 33 34 2c 35   t4 VALUES(234,5
0960: 36 37 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  67);.    CREATE 
0970: 55 4e 49 51 55 45 20 49 4e 44 45 58 20 74 34 79  UNIQUE INDEX t4y
0980: 20 4f 4e 20 74 34 28 79 29 3b 0a 20 20 20 20 55   ON t4(y);.    U
0990: 50 44 41 54 45 20 74 34 20 53 45 54 20 72 6f 77  PDATE t4 SET row
09a0: 69 64 3d 72 6f 77 69 64 2b 31 30 30 20 57 48 45  id=rowid+100 WHE
09b0: 52 45 20 79 20 49 53 20 4e 55 4c 4c 3b 0a 20 20  RE y IS NULL;.  
09c0: 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20    SELECT rowid, 
09d0: 78 20 46 52 4f 4d 20 74 34 20 4f 52 44 45 52 20  x FROM t4 ORDER 
09e0: 42 59 20 72 6f 77 69 64 3b 0a 20 20 7d 0a 7d 20  BY rowid;.  }.} 
09f0: 7b 36 20 32 33 34 20 31 30 31 20 31 20 31 30 32  {6 234 101 1 102
0a00: 20 39 20 31 30 33 20 35 20 31 30 34 20 31 32 33   9 103 5 104 123
0a10: 20 31 30 35 20 2d 31 30 7d 0a 0a 66 69 6e 69 73   105 -10}..finis
0a20: 68 5f 74 65 73 74 0a                             h_test.