/ Hex Artifact Content
Login

Artifact 5c2b57307e4b6178aae825eb65ddbee01e76b0fd:


0000: 23 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72  # 2001 September
0010: 20 31 35 0a 23 0a 23 20 54 68 65 20 61 75 74 68   15.#.# 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 0a 23 0a 23 20 54 68 69 73 20 66  rary..#.# This f
01b0: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ile implements t
01c0: 65 73 74 73 20 66 6f 72 20 70 72 6f 70 65 72 20  ests for proper 
01d0: 74 72 65 61 74 6d 65 6e 74 20 6f 66 20 74 68 65  treatment of the
01e0: 20 73 70 65 63 69 61 6c 0a 23 20 76 61 6c 75 65   special.# value
01f0: 20 4e 55 4c 4c 2e 0a 23 0a 0a 73 65 74 20 74 65   NULL..#..set te
0200: 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e  stdir [file dirn
0210: 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72  ame $argv0].sour
0220: 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74  ce $testdir/test
0230: 65 72 2e 74 63 6c 0a 0a 23 20 43 72 65 61 74 65  er.tcl..# Create
0240: 20 61 20 74 61 62 6c 65 20 61 6e 64 20 73 6f 6d   a table and som
0250: 65 20 64 61 74 61 20 74 6f 20 77 6f 72 6b 20 77  e data to work w
0260: 69 74 68 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6e  ith..#.do_test n
0270: 75 6c 6c 2d 31 2e 30 20 7b 0a 20 20 65 78 65 63  ull-1.0 {.  exec
0280: 73 71 6c 20 7b 0a 20 20 20 20 62 65 67 69 6e 3b  sql {.    begin;
0290: 0a 20 20 20 20 63 72 65 61 74 65 20 74 61 62 6c  .    create tabl
02a0: 65 20 74 31 28 61 2c 62 2c 63 29 3b 0a 20 20 20  e t1(a,b,c);.   
02b0: 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 31 20   insert into t1 
02c0: 76 61 6c 75 65 73 28 31 2c 30 2c 30 29 3b 0a 20  values(1,0,0);. 
02d0: 20 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74     insert into t
02e0: 31 20 76 61 6c 75 65 73 28 32 2c 30 2c 31 29 3b  1 values(2,0,1);
02f0: 0a 20 20 20 20 69 6e 73 65 72 74 20 69 6e 74 6f  .    insert into
0300: 20 74 31 20 76 61 6c 75 65 73 28 33 2c 31 2c 30   t1 values(3,1,0
0310: 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 20 69 6e  );.    insert in
0320: 74 6f 20 74 31 20 76 61 6c 75 65 73 28 34 2c 31  to t1 values(4,1
0330: 2c 31 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 20  ,1);.    insert 
0340: 69 6e 74 6f 20 74 31 20 76 61 6c 75 65 73 28 35  into t1 values(5
0350: 2c 6e 75 6c 6c 2c 30 29 3b 0a 20 20 20 20 69 6e  ,null,0);.    in
0360: 73 65 72 74 20 69 6e 74 6f 20 74 31 20 76 61 6c  sert into t1 val
0370: 75 65 73 28 36 2c 6e 75 6c 6c 2c 31 29 3b 0a 20  ues(6,null,1);. 
0380: 20 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74     insert into t
0390: 31 20 76 61 6c 75 65 73 28 37 2c 6e 75 6c 6c 2c  1 values(7,null,
03a0: 6e 75 6c 6c 29 3b 0a 20 20 20 20 63 6f 6d 6d 69  null);.    commi
03b0: 74 3b 0a 20 20 20 20 73 65 6c 65 63 74 20 2a 20  t;.    select * 
03c0: 66 72 6f 6d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  from t1;.  }.} {
03d0: 31 20 30 20 30 20 32 20 30 20 31 20 33 20 31 20  1 0 0 2 0 1 3 1 
03e0: 30 20 34 20 31 20 31 20 35 20 7b 7d 20 30 20 36  0 4 1 1 5 {} 0 6
03f0: 20 7b 7d 20 31 20 37 20 7b 7d 20 7b 7d 7d 0a 0a   {} 1 7 {} {}}..
0400: 23 20 43 68 65 63 6b 20 66 6f 72 20 68 6f 77 20  # Check for how 
0410: 61 72 69 74 68 6d 65 74 69 63 20 65 78 70 72 65  arithmetic expre
0420: 73 73 69 6f 6e 73 20 68 61 6e 64 6c 65 20 4e 55  ssions handle NU
0430: 4c 4c 0a 23 0a 64 6f 5f 74 65 73 74 20 6e 75 6c  LL.#.do_test nul
0440: 6c 2d 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  l-1.1 {.  execsq
0450: 6c 20 7b 0a 20 20 20 20 73 65 6c 65 63 74 20 69  l {.    select i
0460: 66 6e 75 6c 6c 28 61 2b 62 2c 39 39 29 20 66 72  fnull(a+b,99) fr
0470: 6f 6d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20  om t1;.  }.} {1 
0480: 32 20 34 20 35 20 39 39 20 39 39 20 39 39 7d 0a  2 4 5 99 99 99}.
0490: 64 6f 5f 74 65 73 74 20 6e 75 6c 6c 2d 31 2e 32  do_test null-1.2
04a0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
04b0: 20 20 20 73 65 6c 65 63 74 20 69 66 6e 75 6c 6c     select ifnull
04c0: 28 62 2a 63 2c 39 39 29 20 66 72 6f 6d 20 74 31  (b*c,99) from t1
04d0: 3b 0a 20 20 7d 0a 7d 20 7b 30 20 30 20 30 20 31  ;.  }.} {0 0 0 1
04e0: 20 39 39 20 39 39 20 39 39 7d 0a 0a 23 20 43 68   99 99 99}..# Ch
04f0: 65 63 6b 20 74 6f 20 73 65 65 20 68 6f 77 20 74  eck to see how t
0500: 68 65 20 43 41 53 45 20 65 78 70 72 65 73 73 69  he CASE expressi
0510: 6f 6e 20 68 61 6e 64 6c 65 73 20 4e 55 4c 4c 20  on handles NULL 
0520: 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 23 20 66  values.  The.# f
0530: 69 72 73 74 20 57 48 45 4e 20 66 6f 72 20 77 68  irst WHEN for wh
0540: 69 63 68 20 74 68 65 20 74 65 73 74 20 65 78 70  ich the test exp
0550: 72 65 73 73 69 6f 6e 20 69 73 20 54 52 55 45 20  ression is TRUE 
0560: 69 73 20 73 65 6c 65 63 74 65 64 2e 0a 23 20 46  is selected..# F
0570: 41 4c 53 45 20 61 6e 64 20 55 4e 4b 4e 4f 57 4e  ALSE and UNKNOWN
0580: 20 74 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e   test expression
0590: 73 20 61 72 65 20 73 6b 69 70 70 65 64 2e 0a 23  s are skipped..#
05a0: 0a 64 6f 5f 74 65 73 74 20 6e 75 6c 6c 2d 32 2e  .do_test null-2.
05b0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
05c0: 20 20 20 20 73 65 6c 65 63 74 20 69 66 6e 75 6c      select ifnul
05d0: 6c 28 63 61 73 65 20 77 68 65 6e 20 62 3c 3e 30  l(case when b<>0
05e0: 20 74 68 65 6e 20 31 20 65 6c 73 65 20 30 20 65   then 1 else 0 e
05f0: 6e 64 2c 20 39 39 29 20 66 72 6f 6d 20 74 31 3b  nd, 99) from t1;
0600: 0a 20 20 7d 0a 7d 20 7b 30 20 30 20 31 20 31 20  .  }.} {0 0 1 1 
0610: 30 20 30 20 30 7d 0a 64 6f 5f 74 65 73 74 20 6e  0 0 0}.do_test n
0620: 75 6c 6c 2d 32 2e 32 20 7b 0a 20 20 65 78 65 63  ull-2.2 {.  exec
0630: 73 71 6c 20 7b 0a 20 20 20 20 73 65 6c 65 63 74  sql {.    select
0640: 20 69 66 6e 75 6c 6c 28 63 61 73 65 20 77 68 65   ifnull(case whe
0650: 6e 20 6e 6f 74 20 62 3c 3e 30 20 74 68 65 6e 20  n not b<>0 then 
0660: 31 20 65 6c 73 65 20 30 20 65 6e 64 2c 20 39 39  1 else 0 end, 99
0670: 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20 7d 0a 7d  ) from t1;.  }.}
0680: 20 7b 31 20 31 20 30 20 30 20 30 20 30 20 30 7d   {1 1 0 0 0 0 0}
0690: 0a 64 6f 5f 74 65 73 74 20 6e 75 6c 6c 2d 32 2e  .do_test null-2.
06a0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
06b0: 20 20 20 20 73 65 6c 65 63 74 20 69 66 6e 75 6c      select ifnul
06c0: 6c 28 63 61 73 65 20 77 68 65 6e 20 62 3c 3e 30  l(case when b<>0
06d0: 20 61 6e 64 20 63 3c 3e 30 20 74 68 65 6e 20 31   and c<>0 then 1
06e0: 20 65 6c 73 65 20 30 20 65 6e 64 2c 20 39 39 29   else 0 end, 99)
06f0: 20 66 72 6f 6d 20 74 31 3b 0a 20 20 7d 0a 7d 20   from t1;.  }.} 
0700: 7b 30 20 30 20 30 20 31 20 30 20 30 20 30 7d 0a  {0 0 0 1 0 0 0}.
0710: 64 6f 5f 74 65 73 74 20 6e 75 6c 6c 2d 32 2e 34  do_test null-2.4
0720: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0730: 20 20 20 73 65 6c 65 63 74 20 69 66 6e 75 6c 6c     select ifnull
0740: 28 63 61 73 65 20 77 68 65 6e 20 6e 6f 74 20 28  (case when not (
0750: 62 3c 3e 30 20 61 6e 64 20 63 3c 3e 30 29 20 74  b<>0 and c<>0) t
0760: 68 65 6e 20 31 20 65 6c 73 65 20 30 20 65 6e 64  hen 1 else 0 end
0770: 2c 20 39 39 29 20 66 72 6f 6d 20 74 31 3b 0a 20  , 99) from t1;. 
0780: 20 7d 0a 7d 20 7b 31 20 31 20 31 20 30 20 31 20   }.} {1 1 1 0 1 
0790: 30 20 30 7d 0a 64 6f 5f 74 65 73 74 20 6e 75 6c  0 0}.do_test nul
07a0: 6c 2d 32 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  l-2.5 {.  execsq
07b0: 6c 20 7b 0a 20 20 20 20 73 65 6c 65 63 74 20 69  l {.    select i
07c0: 66 6e 75 6c 6c 28 63 61 73 65 20 77 68 65 6e 20  fnull(case when 
07d0: 62 3c 3e 30 20 6f 72 20 63 3c 3e 30 20 74 68 65  b<>0 or c<>0 the
07e0: 6e 20 31 20 65 6c 73 65 20 30 20 65 6e 64 2c 20  n 1 else 0 end, 
07f0: 39 39 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20 7d  99) from t1;.  }
0800: 0a 7d 20 7b 30 20 31 20 31 20 31 20 30 20 31 20  .} {0 1 1 1 0 1 
0810: 30 7d 0a 64 6f 5f 74 65 73 74 20 6e 75 6c 6c 2d  0}.do_test null-
0820: 32 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.6 {.  execsql 
0830: 7b 0a 20 20 20 20 73 65 6c 65 63 74 20 69 66 6e  {.    select ifn
0840: 75 6c 6c 28 63 61 73 65 20 77 68 65 6e 20 6e 6f  ull(case when no
0850: 74 20 28 62 3c 3e 30 20 6f 72 20 63 3c 3e 30 29  t (b<>0 or c<>0)
0860: 20 74 68 65 6e 20 31 20 65 6c 73 65 20 30 20 65   then 1 else 0 e
0870: 6e 64 2c 20 39 39 29 20 66 72 6f 6d 20 74 31 3b  nd, 99) from t1;
0880: 0a 20 20 7d 0a 7d 20 7b 31 20 30 20 30 20 30 20  .  }.} {1 0 0 0 
0890: 30 20 30 20 30 7d 0a 64 6f 5f 74 65 73 74 20 6e  0 0 0}.do_test n
08a0: 75 6c 6c 2d 32 2e 37 20 7b 0a 20 20 65 78 65 63  ull-2.7 {.  exec
08b0: 73 71 6c 20 7b 0a 20 20 20 20 73 65 6c 65 63 74  sql {.    select
08c0: 20 69 66 6e 75 6c 6c 28 63 61 73 65 20 62 20 77   ifnull(case b w
08d0: 68 65 6e 20 63 20 74 68 65 6e 20 31 20 65 6c 73  hen c then 1 els
08e0: 65 20 30 20 65 6e 64 2c 20 39 39 29 20 66 72 6f  e 0 end, 99) fro
08f0: 6d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 30  m t1;.  }.} {1 0
0900: 20 30 20 31 20 30 20 30 20 30 7d 0a 64 6f 5f 74   0 1 0 0 0}.do_t
0910: 65 73 74 20 6e 75 6c 6c 2d 32 2e 38 20 7b 0a 20  est null-2.8 {. 
0920: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 73   execsql {.    s
0930: 65 6c 65 63 74 20 69 66 6e 75 6c 6c 28 63 61 73  elect ifnull(cas
0940: 65 20 63 20 77 68 65 6e 20 62 20 74 68 65 6e 20  e c when b then 
0950: 31 20 65 6c 73 65 20 30 20 65 6e 64 2c 20 39 39  1 else 0 end, 99
0960: 29 20 66 72 6f 6d 20 74 31 3b 0a 20 20 7d 0a 7d  ) from t1;.  }.}
0970: 20 7b 31 20 30 20 30 20 31 20 30 20 30 20 30 7d   {1 0 0 1 0 0 0}
0980: 0a 0a 23 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ..# Check to see
0990: 20 74 68 61 74 20 4e 55 4c 4c 20 76 61 6c 75 65   that NULL value
09a0: 73 20 61 72 65 20 69 67 6e 6f 72 65 64 20 69 6e  s are ignored in
09b0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
09c0: 69 6f 6e 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ions..#.do_test 
09d0: 6e 75 6c 6c 2d 33 2e 31 20 7b 0a 20 20 65 78 65  null-3.1 {.  exe
09e0: 63 73 71 6c 20 7b 0a 20 20 20 20 73 65 6c 65 63  csql {.    selec
09f0: 74 20 63 6f 75 6e 74 28 2a 29 2c 20 63 6f 75 6e  t count(*), coun
0a00: 74 28 62 29 2c 20 63 6f 75 6e 74 28 63 29 2c 20  t(b), count(c), 
0a10: 73 75 6d 28 62 29 2c 20 73 75 6d 28 63 29 2c 20  sum(b), sum(c), 
0a20: 0a 20 20 20 20 20 20 20 20 20 20 20 61 76 67 28  .           avg(
0a30: 62 29 2c 20 61 76 67 28 63 29 2c 20 6d 69 6e 28  b), avg(c), min(
0a40: 62 29 2c 20 6d 61 78 28 62 29 20 66 72 6f 6d 20  b), max(b) from 
0a50: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 37 20 34 20 36  t1;.  }.} {7 4 6
0a60: 20 32 20 33 20 30 2e 35 20 30 2e 35 20 30 20 31   2 3 0.5 0.5 0 1
0a70: 7d 0a 0a 23 20 43 68 65 63 6b 20 74 6f 20 73 65  }..# Check to se
0a80: 65 20 68 6f 77 20 57 48 45 52 45 20 63 6c 61 75  e how WHERE clau
0a90: 73 65 73 20 68 61 6e 64 6c 65 20 4e 55 4c 4c 20  ses handle NULL 
0aa0: 76 61 6c 75 65 73 2e 20 20 41 20 4e 55 4c 4c 20  values.  A NULL 
0ab0: 76 61 6c 75 65 0a 23 20 69 73 20 74 68 65 20 73  value.# is the s
0ac0: 61 6d 65 20 61 73 20 55 4e 4b 4e 4f 57 4e 2e 20  ame as UNKNOWN. 
0ad0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
0ae0: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 73 65  e should only se
0af0: 6c 65 63 74 20 74 68 6f 73 65 0a 23 20 72 6f 77  lect those.# row
0b00: 73 20 74 68 61 74 20 61 72 65 20 54 52 55 45 2e  s that are TRUE.
0b10: 20 20 46 41 4c 53 45 20 61 6e 64 20 55 4e 4b 4e    FALSE and UNKN
0b20: 4f 57 4e 20 72 6f 77 73 20 61 72 65 20 72 65 6a  OWN rows are rej
0b30: 65 63 74 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74  ected..#.do_test
0b40: 20 6e 75 6c 6c 2d 34 2e 31 20 7b 0a 20 20 65 78   null-4.1 {.  ex
0b50: 65 63 73 71 6c 20 7b 0a 20 20 20 20 73 65 6c 65  ecsql {.    sele
0b60: 63 74 20 61 20 66 72 6f 6d 20 74 31 20 77 68 65  ct a from t1 whe
0b70: 72 65 20 62 3c 31 30 0a 20 20 7d 0a 7d 20 7b 31  re b<10.  }.} {1
0b80: 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20   2 3 4}.do_test 
0b90: 6e 75 6c 6c 2d 34 2e 32 20 7b 0a 20 20 65 78 65  null-4.2 {.  exe
0ba0: 63 73 71 6c 20 7b 0a 20 20 20 20 73 65 6c 65 63  csql {.    selec
0bb0: 74 20 61 20 66 72 6f 6d 20 74 31 20 77 68 65 72  t a from t1 wher
0bc0: 65 20 6e 6f 74 20 62 3e 31 30 0a 20 20 7d 0a 7d  e not b>10.  }.}
0bd0: 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65   {1 2 3 4}.do_te
0be0: 73 74 20 6e 75 6c 6c 2d 34 2e 33 20 7b 0a 20 20  st null-4.3 {.  
0bf0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 73 65  execsql {.    se
0c00: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 20 77  lect a from t1 w
0c10: 68 65 72 65 20 62 3c 31 30 20 6f 72 20 63 3d 31  here b<10 or c=1
0c20: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34  ;.  }.} {1 2 3 4
0c30: 20 36 7d 0a 64 6f 5f 74 65 73 74 20 6e 75 6c 6c   6}.do_test null
0c40: 2d 34 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  -4.4 {.  execsql
0c50: 20 7b 0a 20 20 20 20 73 65 6c 65 63 74 20 61 20   {.    select a 
0c60: 66 72 6f 6d 20 74 31 20 77 68 65 72 65 20 62 3c  from t1 where b<
0c70: 31 30 20 61 6e 64 20 63 3d 31 3b 0a 20 20 7d 0a  10 and c=1;.  }.
0c80: 7d 20 7b 32 20 34 7d 0a 64 6f 5f 74 65 73 74 20  } {2 4}.do_test 
0c90: 6e 75 6c 6c 2d 34 2e 35 20 7b 0a 20 20 65 78 65  null-4.5 {.  exe
0ca0: 63 73 71 6c 20 7b 0a 20 20 20 20 73 65 6c 65 63  csql {.    selec
0cb0: 74 20 61 20 66 72 6f 6d 20 74 31 20 77 68 65 72  t a from t1 wher
0cc0: 65 20 6e 6f 74 20 28 62 3c 31 30 20 61 6e 64 20  e not (b<10 and 
0cd0: 63 3d 31 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 33  c=1);.  }.} {1 3
0ce0: 20 35 7d 0a 0a 23 20 54 68 65 20 44 49 53 54 49   5}..# The DISTI
0cf0: 4e 43 54 20 6b 65 79 77 6f 72 64 20 6f 6e 20 61  NCT keyword on a
0d00: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
0d10: 74 20 73 68 6f 75 6c 64 20 74 72 65 61 74 20 4e  t should treat N
0d20: 55 4c 4c 20 76 61 6c 75 65 73 0a 23 20 61 73 20  ULL values.# as 
0d30: 64 69 73 74 69 6e 63 74 0a 23 0a 64 6f 5f 74 65  distinct.#.do_te
0d40: 73 74 20 6e 75 6c 6c 2d 35 2e 31 20 7b 0a 20 20  st null-5.1 {.  
0d50: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 73 65  execsql {.    se
0d60: 6c 65 63 74 20 64 69 73 74 69 6e 63 74 20 62 20  lect distinct b 
0d70: 66 72 6f 6d 20 74 31 20 6f 72 64 65 72 20 62 79  from t1 order by
0d80: 20 62 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 30 20   b;.  }.} {{} 0 
0d90: 31 7d 0a 0a 23 20 41 20 55 4e 49 4f 4e 20 74 6f  1}..# A UNION to
0da0: 20 74 77 6f 20 71 75 65 72 69 65 73 20 73 68 6f   two queries sho
0db0: 75 6c 64 20 74 72 65 61 74 20 4e 55 4c 4c 20 76  uld treat NULL v
0dc0: 61 6c 75 65 73 0a 23 20 61 73 20 64 69 73 74 69  alues.# as disti
0dd0: 6e 63 74 0a 23 0a 64 6f 5f 74 65 73 74 20 6e 75  nct.#.do_test nu
0de0: 6c 6c 2d 36 2e 31 20 7b 0a 20 20 65 78 65 63 73  ll-6.1 {.  execs
0df0: 71 6c 20 7b 0a 20 20 20 20 73 65 6c 65 63 74 20  ql {.    select 
0e00: 62 20 66 72 6f 6d 20 74 31 20 75 6e 69 6f 6e 20  b from t1 union 
0e10: 73 65 6c 65 63 74 20 63 20 66 72 6f 6d 20 74 31  select c from t1
0e20: 20 6f 72 64 65 72 20 62 79 20 63 3b 0a 20 20 7d   order by c;.  }
0e30: 0a 7d 20 7b 7b 7d 20 30 20 31 7d 0a 0a 23 20 54  .} {{} 0 1}..# T
0e40: 68 65 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  he UNIQUE constr
0e50: 61 69 6e 74 20 6f 6e 6c 79 20 61 70 70 6c 69 65  aint only applie
0e60: 73 20 74 6f 20 6e 6f 6e 2d 6e 75 6c 6c 20 76 61  s to non-null va
0e70: 6c 75 65 73 0a 23 0a 64 6f 5f 74 65 73 74 20 6e  lues.#.do_test n
0e80: 75 6c 6c 2d 37 2e 31 20 7b 0a 20 20 65 78 65 63  ull-7.1 {.  exec
0e90: 73 71 6c 20 7b 0a 20 20 20 20 63 72 65 61 74 65  sql {.    create
0ea0: 20 74 61 62 6c 65 20 74 32 28 61 2c 20 62 20 75   table t2(a, b u
0eb0: 6e 69 71 75 65 20 6f 6e 20 63 6f 6e 66 6c 69 63  nique on conflic
0ec0: 74 20 69 67 6e 6f 72 65 29 3b 0a 20 20 20 20 69  t ignore);.    i
0ed0: 6e 73 65 72 74 20 69 6e 74 6f 20 74 32 20 76 61  nsert into t2 va
0ee0: 6c 75 65 73 28 31 2c 31 29 3b 0a 20 20 20 20 69  lues(1,1);.    i
0ef0: 6e 73 65 72 74 20 69 6e 74 6f 20 74 32 20 76 61  nsert into t2 va
0f00: 6c 75 65 73 28 32 2c 6e 75 6c 6c 29 3b 0a 20 20  lues(2,null);.  
0f10: 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 32    insert into t2
0f20: 20 76 61 6c 75 65 73 28 33 2c 6e 75 6c 6c 29 3b   values(3,null);
0f30: 0a 20 20 20 20 69 6e 73 65 72 74 20 69 6e 74 6f  .    insert into
0f40: 20 74 32 20 76 61 6c 75 65 73 28 34 2c 31 29 3b   t2 values(4,1);
0f50: 0a 20 20 20 20 73 65 6c 65 63 74 20 61 20 66 72  .    select a fr
0f60: 6f 6d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20  om t2;.  }.} {1 
0f70: 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 6e 75 6c  2 3}.do_test nul
0f80: 6c 2d 37 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  l-7.2 {.  execsq
0f90: 6c 20 7b 0a 20 20 20 20 63 72 65 61 74 65 20 74  l {.    create t
0fa0: 61 62 6c 65 20 74 33 28 61 2c 20 62 2c 20 63 2c  able t3(a, b, c,
0fb0: 20 75 6e 69 71 75 65 28 62 2c 63 29 20 6f 6e 20   unique(b,c) on 
0fc0: 63 6f 6e 66 6c 69 63 74 20 69 67 6e 6f 72 65 29  conflict ignore)
0fd0: 3b 0a 20 20 20 20 69 6e 73 65 72 74 20 69 6e 74  ;.    insert int
0fe0: 6f 20 74 33 20 76 61 6c 75 65 73 28 31 2c 31 2c  o t3 values(1,1,
0ff0: 31 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 20 69  1);.    insert i
1000: 6e 74 6f 20 74 33 20 76 61 6c 75 65 73 28 32 2c  nto t3 values(2,
1010: 6e 75 6c 6c 2c 31 29 3b 0a 20 20 20 20 69 6e 73  null,1);.    ins
1020: 65 72 74 20 69 6e 74 6f 20 74 33 20 76 61 6c 75  ert into t3 valu
1030: 65 73 28 33 2c 6e 75 6c 6c 2c 31 29 3b 0a 20 20  es(3,null,1);.  
1040: 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 33    insert into t3
1050: 20 76 61 6c 75 65 73 28 34 2c 31 2c 31 29 3b 0a   values(4,1,1);.
1060: 20 20 20 20 73 65 6c 65 63 74 20 61 20 66 72 6f      select a fro
1070: 6d 20 74 33 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32  m t3;.  }.} {1 2
1080: 20 33 7d 0a 0a 0a 0a 66 69 6e 69 73 68 5f 74 65   3}....finish_te
1090: 73 74 0a                                         st.