/ Hex Artifact Content
Login

Artifact df0bb52b754661ea84ec9ff488d48913c97bd31d83ca17ce0bf1334645e660cf:


0000: 23 20 32 30 31 36 2d 30 34 2d 31 35 0a 23 0a 23  # 2016-04-15.#.#
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 20 54 68 69 73 20 66 69 6c 65 20 69  **.# This file i
0170: 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72 65 73  mplements regres
0180: 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72 20 53  sion tests for S
0190: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20 20  QLite library.  
01a0: 54 68 65 0a 23 20 66 6f 63 75 73 20 6f 66 20 74  The.# focus of t
01b0: 68 69 73 20 73 63 72 69 70 74 20 69 73 20 44 49  his script is DI
01c0: 53 54 49 4e 43 54 20 71 75 65 72 69 65 73 20 75  STINCT queries u
01d0: 73 69 6e 67 20 74 68 65 20 73 6b 69 70 2d 61 68  sing the skip-ah
01e0: 65 61 64 20 0a 23 20 6f 70 74 69 6d 69 7a 61 74  ead .# optimizat
01f0: 69 6f 6e 2e 0a 23 0a 0a 73 65 74 20 74 65 73 74  ion..#..set test
0200: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0210: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0220: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
0230: 2e 74 63 6c 0a 0a 73 65 74 20 74 65 73 74 70 72  .tcl..set testpr
0240: 65 66 69 78 20 64 69 73 74 69 6e 63 74 32 0a 0a  efix distinct2..
0250: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0260: 31 30 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  100 {.  CREATE T
0270: 41 42 4c 45 20 74 31 28 78 20 49 4e 54 45 47 45  ABLE t1(x INTEGE
0280: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  R PRIMARY KEY);.
0290: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
02a0: 20 56 41 4c 55 45 53 28 30 29 2c 28 31 29 2c 28   VALUES(0),(1),(
02b0: 32 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  2);.  CREATE TAB
02c0: 4c 45 20 74 32 20 41 53 0a 20 20 20 20 20 53 45  LE t2 AS.     SE
02d0: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 61 2e  LECT DISTINCT a.
02e0: 78 20 41 53 20 61 61 2c 20 62 2e 78 20 41 53 20  x AS aa, b.x AS 
02f0: 62 62 0a 20 20 20 20 20 20 46 52 4f 4d 20 74 31  bb.      FROM t1
0300: 20 61 2c 20 74 31 20 62 3b 0a 20 20 53 45 4c 45   a, t1 b;.  SELE
0310: 43 54 20 2a 2c 20 27 7c 27 20 46 52 4f 4d 20 74  CT *, '|' FROM t
0320: 32 20 4f 52 44 45 52 20 42 59 20 61 61 2c 20 62  2 ORDER BY aa, b
0330: 62 3b 0a 7d 20 7b 30 20 30 20 7c 20 30 20 31 20  b;.} {0 0 | 0 1 
0340: 7c 20 30 20 32 20 7c 20 31 20 30 20 7c 20 31 20  | 0 2 | 1 0 | 1 
0350: 31 20 7c 20 31 20 32 20 7c 20 32 20 30 20 7c 20  1 | 1 2 | 2 0 | 
0360: 32 20 31 20 7c 20 32 20 32 20 7c 7d 0a 64 6f 5f  2 1 | 2 2 |}.do_
0370: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 31 30  execsql_test 110
0380: 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20   {.  DROP TABLE 
0390: 74 32 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  t2;.  CREATE TAB
03a0: 4c 45 20 74 32 20 41 53 0a 20 20 20 20 20 53 45  LE t2 AS.     SE
03b0: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 61 2e  LECT DISTINCT a.
03c0: 78 20 41 53 20 61 61 2c 20 62 2e 78 20 41 53 20  x AS aa, b.x AS 
03d0: 62 62 0a 20 20 20 20 20 20 20 46 52 4f 4d 20 74  bb.       FROM t
03e0: 31 20 61 2c 20 74 31 20 62 0a 20 20 20 20 20 20  1 a, t1 b.      
03f0: 57 48 45 52 45 20 61 2e 78 20 49 4e 20 74 31 20  WHERE a.x IN t1 
0400: 41 4e 44 20 62 2e 78 20 49 4e 20 74 31 3b 0a 20  AND b.x IN t1;. 
0410: 20 53 45 4c 45 43 54 20 2a 2c 20 27 7c 27 20 46   SELECT *, '|' F
0420: 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
0430: 61 61 2c 20 62 62 3b 0a 7d 20 7b 30 20 30 20 7c  aa, bb;.} {0 0 |
0440: 20 30 20 31 20 7c 20 30 20 32 20 7c 20 31 20 30   0 1 | 0 2 | 1 0
0450: 20 7c 20 31 20 31 20 7c 20 31 20 32 20 7c 20 32   | 1 1 | 1 2 | 2
0460: 20 30 20 7c 20 32 20 31 20 7c 20 32 20 32 20 7c   0 | 2 1 | 2 2 |
0470: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
0480: 74 20 31 32 30 20 7b 0a 20 20 43 52 45 41 54 45  t 120 {.  CREATE
0490: 20 54 41 42 4c 45 20 74 31 30 32 20 28 69 30 20   TABLE t102 (i0 
04a0: 54 45 58 54 20 55 4e 49 51 55 45 20 4e 4f 54 20  TEXT UNIQUE NOT 
04b0: 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52 54 20  NULL);.  INSERT 
04c0: 49 4e 54 4f 20 74 31 30 32 20 56 41 4c 55 45 53  INTO t102 VALUES
04d0: 20 28 27 30 27 29 2c 28 27 31 27 29 2c 28 27 32   ('0'),('1'),('2
04e0: 27 29 3b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45  ');.  DROP TABLE
04f0: 20 74 32 3b 0a 20 20 43 52 45 41 54 45 20 54 41   t2;.  CREATE TA
0500: 42 4c 45 20 74 32 20 41 53 0a 20 20 20 20 53 45  BLE t2 AS.    SE
0510: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 2a 20  LECT DISTINCT * 
0520: 0a 20 20 20 20 46 52 4f 4d 20 74 31 30 32 20 41  .    FROM t102 A
0530: 53 20 74 30 20 0a 20 20 20 20 4a 4f 49 4e 20 74  S t0 .    JOIN t
0540: 31 30 32 20 41 53 20 74 34 20 4f 4e 20 28 74 32  102 AS t4 ON (t2
0550: 2e 69 30 20 49 4e 20 74 31 30 32 29 0a 20 20 20  .i0 IN t102).   
0560: 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 74 31   NATURAL JOIN t1
0570: 30 32 20 41 53 20 74 33 0a 20 20 20 20 4a 4f 49  02 AS t3.    JOI
0580: 4e 20 74 31 30 32 20 41 53 20 74 31 20 4f 4e 20  N t102 AS t1 ON 
0590: 28 74 30 2e 69 30 20 49 4e 20 74 31 30 32 29 0a  (t0.i0 IN t102).
05a0: 20 20 20 20 4a 4f 49 4e 20 74 31 30 32 20 41 53      JOIN t102 AS
05b0: 20 74 32 20 4f 4e 20 28 74 32 2e 69 30 3d 2b 74   t2 ON (t2.i0=+t
05c0: 30 2e 69 30 20 4f 52 20 28 74 30 2e 69 30 3c 3e  0.i0 OR (t0.i0<>
05d0: 35 30 30 20 41 4e 44 20 74 32 2e 69 30 3d 74 31  500 AND t2.i0=t1
05e0: 2e 69 30 29 29 3b 0a 20 20 53 45 4c 45 43 54 20  .i0));.  SELECT 
05f0: 2a 2c 20 27 7c 27 20 46 52 4f 4d 20 74 32 20 4f  *, '|' FROM t2 O
0600: 52 44 45 52 20 42 59 20 31 2c 20 32 2c 20 33 2c  RDER BY 1, 2, 3,
0610: 20 34 2c 20 35 3b 0a 7d 20 7b 30 20 30 20 30 20   4, 5;.} {0 0 0 
0620: 30 20 7c 20 30 20 30 20 31 20 30 20 7c 20 30 20  0 | 0 0 1 0 | 0 
0630: 30 20 31 20 31 20 7c 20 30 20 30 20 32 20 30 20  0 1 1 | 0 0 2 0 
0640: 7c 20 30 20 30 20 32 20 32 20 7c 20 30 20 31 20  | 0 0 2 2 | 0 1 
0650: 30 20 30 20 7c 20 30 20 31 20 31 20 30 20 7c 20  0 0 | 0 1 1 0 | 
0660: 30 20 31 20 31 20 31 20 7c 20 30 20 31 20 32 20  0 1 1 1 | 0 1 2 
0670: 30 20 7c 20 30 20 31 20 32 20 32 20 7c 20 30 20  0 | 0 1 2 2 | 0 
0680: 32 20 30 20 30 20 7c 20 30 20 32 20 31 20 30 20  2 0 0 | 0 2 1 0 
0690: 7c 20 30 20 32 20 31 20 31 20 7c 20 30 20 32 20  | 0 2 1 1 | 0 2 
06a0: 32 20 30 20 7c 20 30 20 32 20 32 20 32 20 7c 20  2 0 | 0 2 2 2 | 
06b0: 31 20 30 20 30 20 30 20 7c 20 31 20 30 20 30 20  1 0 0 0 | 1 0 0 
06c0: 31 20 7c 20 31 20 30 20 31 20 31 20 7c 20 31 20  1 | 1 0 1 1 | 1 
06d0: 30 20 32 20 31 20 7c 20 31 20 30 20 32 20 32 20  0 2 1 | 1 0 2 2 
06e0: 7c 20 31 20 31 20 30 20 30 20 7c 20 31 20 31 20  | 1 1 0 0 | 1 1 
06f0: 30 20 31 20 7c 20 31 20 31 20 31 20 31 20 7c 20  0 1 | 1 1 1 1 | 
0700: 31 20 31 20 32 20 31 20 7c 20 31 20 31 20 32 20  1 1 2 1 | 1 1 2 
0710: 32 20 7c 20 31 20 32 20 30 20 30 20 7c 20 31 20  2 | 1 2 0 0 | 1 
0720: 32 20 30 20 31 20 7c 20 31 20 32 20 31 20 31 20  2 0 1 | 1 2 1 1 
0730: 7c 20 31 20 32 20 32 20 31 20 7c 20 31 20 32 20  | 1 2 2 1 | 1 2 
0740: 32 20 32 20 7c 20 32 20 30 20 30 20 30 20 7c 20  2 2 | 2 0 0 0 | 
0750: 32 20 30 20 30 20 32 20 7c 20 32 20 30 20 31 20  2 0 0 2 | 2 0 1 
0760: 31 20 7c 20 32 20 30 20 31 20 32 20 7c 20 32 20  1 | 2 0 1 2 | 2 
0770: 30 20 32 20 32 20 7c 20 32 20 31 20 30 20 30 20  0 2 2 | 2 1 0 0 
0780: 7c 20 32 20 31 20 30 20 32 20 7c 20 32 20 31 20  | 2 1 0 2 | 2 1 
0790: 31 20 31 20 7c 20 32 20 31 20 31 20 32 20 7c 20  1 1 | 2 1 1 2 | 
07a0: 32 20 31 20 32 20 32 20 7c 20 32 20 32 20 30 20  2 1 2 2 | 2 2 0 
07b0: 30 20 7c 20 32 20 32 20 30 20 32 20 7c 20 32 20  0 | 2 2 0 2 | 2 
07c0: 32 20 31 20 31 20 7c 20 32 20 32 20 31 20 32 20  2 1 1 | 2 2 1 2 
07d0: 7c 20 32 20 32 20 32 20 32 20 7c 7d 0a 0a 64 6f  | 2 2 2 2 |}..do
07e0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34 30  _execsql_test 40
07f0: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
0800: 4c 45 20 74 34 28 61 2c 62 2c 63 2c 64 2c 65 2c  LE t4(a,b,c,d,e,
0810: 66 2c 67 2c 68 2c 69 2c 6a 29 3b 0a 20 20 49 4e  f,g,h,i,j);.  IN
0820: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
0830: 55 45 53 28 30 2c 31 2c 32 2c 33 2c 34 2c 35 2c  UES(0,1,2,3,4,5,
0840: 36 2c 37 2c 38 2c 39 29 3b 0a 20 20 49 4e 53 45  6,7,8,9);.  INSE
0850: 52 54 20 49 4e 54 4f 20 74 34 20 53 45 4c 45 43  RT INTO t4 SELEC
0860: 54 20 2a 20 46 52 4f 4d 20 74 34 3b 0a 20 20 49  T * FROM t4;.  I
0870: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 53 45  NSERT INTO t4 SE
0880: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 3b 0a  LECT * FROM t4;.
0890: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74    CREATE INDEX t
08a0: 34 78 20 4f 4e 20 74 34 28 63 2c 64 2c 65 29 3b  4x ON t4(c,d,e);
08b0: 0a 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e  .  SELECT DISTIN
08c0: 43 54 20 61 2c 62 2c 63 20 46 52 4f 4d 20 74 34  CT a,b,c FROM t4
08d0: 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62   WHERE a=0 AND b
08e0: 3d 31 3b 0a 7d 20 7b 30 20 31 20 32 7d 0a 64 6f  =1;.} {0 1 2}.do
08f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34 31  _execsql_test 41
0900: 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 44 49 53  0 {.  SELECT DIS
0910: 54 49 4e 43 54 20 61 2c 62 2c 63 2c 64 20 46 52  TINCT a,b,c,d FR
0920: 4f 4d 20 74 34 20 57 48 45 52 45 20 61 3d 30 20  OM t4 WHERE a=0 
0930: 41 4e 44 20 62 3d 31 3b 0a 7d 20 7b 30 20 31 20  AND b=1;.} {0 1 
0940: 32 20 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  2 3}.do_execsql_
0950: 74 65 73 74 20 34 31 31 20 7b 0a 20 20 53 45 4c  test 411 {.  SEL
0960: 45 43 54 20 44 49 53 54 49 4e 43 54 20 64 2c 61  ECT DISTINCT d,a
0970: 2c 62 2c 63 20 46 52 4f 4d 20 74 34 20 57 48 45  ,b,c FROM t4 WHE
0980: 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 31 3b 0a  RE a=0 AND b=1;.
0990: 7d 20 7b 33 20 30 20 31 20 32 7d 0a 64 6f 5f 65  } {3 0 1 2}.do_e
09a0: 78 65 63 73 71 6c 5f 74 65 73 74 20 34 32 30 20  xecsql_test 420 
09b0: 7b 0a 20 20 53 45 4c 45 43 54 20 44 49 53 54 49  {.  SELECT DISTI
09c0: 4e 43 54 20 61 2c 62 2c 63 2c 64 2c 65 20 46 52  NCT a,b,c,d,e FR
09d0: 4f 4d 20 74 34 20 57 48 45 52 45 20 61 3d 30 20  OM t4 WHERE a=0 
09e0: 41 4e 44 20 62 3d 31 3b 0a 7d 20 7b 30 20 31 20  AND b=1;.} {0 1 
09f0: 32 20 33 20 34 7d 0a 64 6f 5f 65 78 65 63 73 71  2 3 4}.do_execsq
0a00: 6c 5f 74 65 73 74 20 34 33 30 20 7b 0a 20 20 53  l_test 430 {.  S
0a10: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 61  ELECT DISTINCT a
0a20: 2c 62 2c 63 2c 64 2c 65 2c 66 20 46 52 4f 4d 20  ,b,c,d,e,f FROM 
0a30: 74 34 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44  t4 WHERE a=0 AND
0a40: 20 62 3d 31 3b 0a 7d 20 7b 30 20 31 20 32 20 33   b=1;.} {0 1 2 3
0a50: 20 34 20 35 7d 0a 0a 64 6f 5f 65 78 65 63 73 71   4 5}..do_execsq
0a60: 6c 5f 74 65 73 74 20 35 30 30 20 7b 0a 20 20 43  l_test 500 {.  C
0a70: 52 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 61  REATE TABLE t5(a
0a80: 20 49 4e 54 2c 20 62 20 49 4e 54 29 3b 0a 20 20   INT, b INT);.  
0a90: 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e  CREATE UNIQUE IN
0aa0: 44 45 58 20 74 35 78 20 4f 4e 20 74 35 28 61 2b  DEX t5x ON t5(a+
0ab0: 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  b);.  INSERT INT
0ac0: 4f 20 74 35 28 61 2c 62 29 20 56 41 4c 55 45 53  O t5(a,b) VALUES
0ad0: 28 30 2c 30 29 2c 28 31 2c 30 29 2c 28 31 2c 31  (0,0),(1,0),(1,1
0ae0: 29 2c 28 30 2c 33 29 3b 0a 20 20 43 52 45 41 54  ),(0,3);.  CREAT
0af0: 45 20 54 45 4d 50 20 54 41 42 4c 45 20 6f 75 74  E TEMP TABLE out
0b00: 20 41 53 20 53 45 4c 45 43 54 20 44 49 53 54 49   AS SELECT DISTI
0b10: 4e 43 54 20 61 2b 62 20 46 52 4f 4d 20 74 35 3b  NCT a+b FROM t5;
0b20: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
0b30: 20 6f 75 74 20 4f 52 44 45 52 20 42 59 20 31 3b   out ORDER BY 1;
0b40: 0a 7d 20 7b 30 20 31 20 32 20 33 7d 0a 0a 64 6f  .} {0 1 2 3}..do
0b50: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 36 30  _execsql_test 60
0b60: 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  0 {.  CREATE TAB
0b70: 4c 45 20 74 36 61 28 78 20 49 4e 54 45 47 45 52  LE t6a(x INTEGER
0b80: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20   PRIMARY KEY);. 
0b90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 61   INSERT INTO t6a
0ba0: 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 43 52   VALUES(1);.  CR
0bb0: 45 41 54 45 20 54 41 42 4c 45 20 74 36 62 28 79  EATE TABLE t6b(y
0bc0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
0bd0: 20 4b 45 59 29 3b 0a 20 20 49 4e 53 45 52 54 20   KEY);.  INSERT 
0be0: 49 4e 54 4f 20 74 36 62 20 56 41 4c 55 45 53 28  INTO t6b VALUES(
0bf0: 32 29 2c 28 33 29 3b 0a 20 20 53 45 4c 45 43 54  2),(3);.  SELECT
0c00: 20 44 49 53 54 49 4e 43 54 20 78 2c 20 78 20 46   DISTINCT x, x F
0c10: 52 4f 4d 20 74 36 61 2c 20 74 36 62 3b 0a 7d 20  ROM t6a, t6b;.} 
0c20: 7b 31 20 31 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  {1 1}..do_execsq
0c30: 6c 5f 74 65 73 74 20 37 30 30 20 7b 0a 20 20 43  l_test 700 {.  C
0c40: 52 45 41 54 45 20 54 41 42 4c 45 20 74 37 28 61  REATE TABLE t7(a
0c50: 2c 20 62 2c 20 63 29 3b 0a 20 20 57 49 54 48 20  , b, c);.  WITH 
0c60: 73 28 69 29 20 41 53 20 28 0a 20 20 20 20 53 45  s(i) AS (.    SE
0c70: 4c 45 43 54 20 31 20 55 4e 49 4f 4e 20 41 4c 4c  LECT 1 UNION ALL
0c80: 20 53 45 4c 45 43 54 20 69 2b 31 20 46 52 4f 4d   SELECT i+1 FROM
0c90: 20 73 20 57 48 45 52 45 20 28 69 2b 31 29 3c 32   s WHERE (i+1)<2
0ca0: 30 30 0a 20 20 29 0a 20 20 49 4e 53 45 52 54 20  00.  ).  INSERT 
0cb0: 49 4e 54 4f 20 74 37 20 53 45 4c 45 43 54 20 69  INTO t7 SELECT i
0cc0: 2f 31 30 30 2c 20 69 2f 35 30 2c 20 69 20 46 52  /100, i/50, i FR
0cd0: 4f 4d 20 73 3b 0a 7d 0a 64 6f 5f 65 78 65 63 73  OM s;.}.do_execs
0ce0: 71 6c 5f 74 65 73 74 20 37 31 30 20 7b 0a 20 20  ql_test 710 {.  
0cf0: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
0d00: 61 2c 20 62 20 46 52 4f 4d 20 74 37 3b 0a 7d 20  a, b FROM t7;.} 
0d10: 7b 0a 20 20 30 20 30 20 20 20 20 30 20 31 0a 20  {.  0 0    0 1. 
0d20: 20 31 20 32 20 20 20 20 31 20 33 0a 7d 0a 64 6f   1 2    1 3.}.do
0d30: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 37 32  _execsql_test 72
0d40: 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 44 49 53  0 {.  SELECT DIS
0d50: 54 49 4e 43 54 20 61 2c 20 62 2b 31 20 46 52 4f  TINCT a, b+1 FRO
0d60: 4d 20 74 37 3b 0a 7d 20 7b 0a 20 20 30 20 31 20  M t7;.} {.  0 1 
0d70: 20 20 20 30 20 32 0a 20 20 31 20 33 20 20 20 20     0 2.  1 3    
0d80: 31 20 34 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  1 4.}.do_execsql
0d90: 5f 74 65 73 74 20 37 33 30 20 7b 0a 20 20 43 52  _test 730 {.  CR
0da0: 45 41 54 45 20 49 4e 44 45 58 20 69 37 20 4f 4e  EATE INDEX i7 ON
0db0: 20 74 37 28 61 2c 20 62 2b 31 29 3b 0a 20 20 41   t7(a, b+1);.  A
0dc0: 4e 41 4c 59 5a 45 3b 0a 20 20 53 45 4c 45 43 54  NALYZE;.  SELECT
0dd0: 20 44 49 53 54 49 4e 43 54 20 61 2c 20 62 2b 31   DISTINCT a, b+1
0de0: 20 46 52 4f 4d 20 74 37 3b 0a 7d 20 7b 0a 20 20   FROM t7;.} {.  
0df0: 30 20 31 20 20 20 20 30 20 32 0a 20 20 31 20 33  0 1    0 2.  1 3
0e00: 20 20 20 20 31 20 34 0a 7d 0a 0a 64 6f 5f 65 78      1 4.}..do_ex
0e10: 65 63 73 71 6c 5f 74 65 73 74 20 38 30 30 20 7b  ecsql_test 800 {
0e20: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
0e30: 74 38 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 57  t8(a, b, c);.  W
0e40: 49 54 48 20 73 28 69 29 20 41 53 20 28 0a 20 20  ITH s(i) AS (.  
0e50: 20 20 53 45 4c 45 43 54 20 31 20 55 4e 49 4f 4e    SELECT 1 UNION
0e60: 20 41 4c 4c 20 53 45 4c 45 43 54 20 69 2b 31 20   ALL SELECT i+1 
0e70: 46 52 4f 4d 20 73 20 57 48 45 52 45 20 28 69 2b  FROM s WHERE (i+
0e80: 31 29 3c 31 30 30 0a 20 20 29 0a 20 20 49 4e 53  1)<100.  ).  INS
0e90: 45 52 54 20 49 4e 54 4f 20 74 38 20 53 45 4c 45  ERT INTO t8 SELE
0ea0: 43 54 20 69 2f 34 30 2c 20 69 2f 32 30 2c 20 69  CT i/40, i/20, i
0eb0: 2f 34 30 20 46 52 4f 4d 20 73 3b 0a 7d 0a 0a 64  /40 FROM s;.}..d
0ec0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 38  o_execsql_test 8
0ed0: 32 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 44 49  20 {.  SELECT DI
0ee0: 53 54 49 4e 43 54 20 61 2c 20 62 2c 20 63 20 46  STINCT a, b, c F
0ef0: 52 4f 4d 20 74 38 3b 0a 7d 20 7b 0a 20 20 30 20  ROM t8;.} {.  0 
0f00: 30 20 30 20 20 20 20 30 20 31 20 30 0a 20 20 31  0 0    0 1 0.  1
0f10: 20 32 20 31 20 20 20 20 31 20 33 20 31 0a 20 20   2 1    1 3 1.  
0f20: 32 20 34 20 32 0a 7d 0a 0a 64 6f 5f 65 78 65 63  2 4 2.}..do_exec
0f30: 73 71 6c 5f 74 65 73 74 20 38 32 30 20 7b 0a 20  sql_test 820 {. 
0f40: 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
0f50: 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 38   a, b, c FROM t8
0f60: 20 57 48 45 52 45 20 62 3d 33 3b 0a 7d 20 7b 31   WHERE b=3;.} {1
0f70: 20 33 20 31 7d 0a 0a 64 6f 5f 65 78 65 63 73 71   3 1}..do_execsq
0f80: 6c 5f 74 65 73 74 20 38 33 30 20 7b 0a 20 20 43  l_test 830 {.  C
0f90: 52 45 41 54 45 20 49 4e 44 45 58 20 69 38 20 4f  REATE INDEX i8 O
0fa0: 4e 20 74 38 28 61 2c 20 63 29 3b 0a 20 20 41 4e  N t8(a, c);.  AN
0fb0: 41 4c 59 5a 45 3b 0a 20 20 53 45 4c 45 43 54 20  ALYZE;.  SELECT 
0fc0: 44 49 53 54 49 4e 43 54 20 61 2c 20 62 2c 20 63  DISTINCT a, b, c
0fd0: 20 46 52 4f 4d 20 74 38 20 57 48 45 52 45 20 62   FROM t8 WHERE b
0fe0: 3d 33 3b 0a 7d 20 7b 31 20 33 20 31 7d 0a 0a 64  =3;.} {1 3 1}..d
0ff0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 39  o_execsql_test 9
1000: 30 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  00 {.  CREATE TA
1010: 42 4c 45 20 74 39 28 76 29 3b 0a 20 20 49 4e 53  BLE t9(v);.  INS
1020: 45 52 54 20 49 4e 54 4f 20 74 39 20 56 41 4c 55  ERT INTO t9 VALU
1030: 45 53 20 0a 20 20 20 20 28 27 61 62 63 64 27 29  ES .    ('abcd')
1040: 2c 20 28 27 41 62 63 64 27 29 2c 20 28 27 61 42  , ('Abcd'), ('aB
1050: 63 64 27 29 2c 20 28 27 41 42 63 64 27 29 2c 20  cd'), ('ABcd'), 
1060: 28 27 61 62 43 64 27 29 2c 20 28 27 41 62 43 64  ('abCd'), ('AbCd
1070: 27 29 2c 20 28 27 61 42 43 64 27 29 2c 20 0a 20  '), ('aBCd'), . 
1080: 20 20 20 28 27 41 42 43 64 27 29 2c 20 28 27 61     ('ABCd'), ('a
1090: 62 63 44 27 29 2c 20 28 27 41 62 63 44 27 29 2c  bcD'), ('AbcD'),
10a0: 20 28 27 61 42 63 44 27 29 2c 20 28 27 41 42 63   ('aBcD'), ('ABc
10b0: 44 27 29 2c 20 28 27 61 62 43 44 27 29 2c 20 28  D'), ('abCD'), (
10c0: 27 41 62 43 44 27 29 2c 20 0a 20 20 20 20 28 27  'AbCD'), .    ('
10d0: 61 42 43 44 27 29 2c 20 28 27 41 42 43 44 27 29  aBCD'), ('ABCD')
10e0: 2c 0a 20 20 20 20 28 27 77 78 79 7a 27 29 2c 20  ,.    ('wxyz'), 
10f0: 28 27 57 78 79 7a 27 29 2c 20 28 27 77 58 79 7a  ('Wxyz'), ('wXyz
1100: 27 29 2c 20 28 27 57 58 79 7a 27 29 2c 20 28 27  '), ('WXyz'), ('
1110: 77 78 59 7a 27 29 2c 20 28 27 57 78 59 7a 27 29  wxYz'), ('WxYz')
1120: 2c 20 28 27 77 58 59 7a 27 29 2c 20 0a 20 20 20  , ('wXYz'), .   
1130: 20 28 27 57 58 59 7a 27 29 2c 20 28 27 77 78 79   ('WXYz'), ('wxy
1140: 5a 27 29 2c 20 28 27 57 78 79 5a 27 29 2c 20 28  Z'), ('WxyZ'), (
1150: 27 77 58 79 5a 27 29 2c 20 28 27 57 58 79 5a 27  'wXyZ'), ('WXyZ'
1160: 29 2c 20 28 27 77 78 59 5a 27 29 2c 20 28 27 57  ), ('wxYZ'), ('W
1170: 78 59 5a 27 29 2c 20 0a 20 20 20 20 28 27 77 58  xYZ'), .    ('wX
1180: 59 5a 27 29 2c 20 28 27 57 58 59 5a 27 29 3b 0a  YZ'), ('WXYZ');.
1190: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
11a0: 73 74 20 39 31 30 20 7b 0a 20 20 53 45 4c 45 43  st 910 {.  SELEC
11b0: 54 20 44 49 53 54 49 4e 43 54 20 76 20 43 4f 4c  T DISTINCT v COL
11c0: 4c 41 54 45 20 4e 4f 43 41 53 45 2c 20 76 20 46  LATE NOCASE, v F
11d0: 52 4f 4d 20 74 39 20 4f 52 44 45 52 20 42 59 20  ROM t9 ORDER BY 
11e0: 2b 76 3b 0a 7d 20 7b 0a 20 20 41 42 43 44 20 41  +v;.} {.  ABCD A
11f0: 42 43 44 20 41 42 43 64 20 41 42 43 64 20 41 42  BCD ABCd ABCd AB
1200: 63 44 20 41 42 63 44 20 41 42 63 64 20 41 42 63  cD ABcD ABcd ABc
1210: 64 20 41 62 43 44 0a 20 20 41 62 43 44 20 41 62  d AbCD.  AbCD Ab
1220: 43 64 20 41 62 43 64 20 41 62 63 44 20 41 62 63  Cd AbCd AbcD Abc
1230: 44 20 41 62 63 64 20 41 62 63 64 0a 20 20 57 58  D Abcd Abcd.  WX
1240: 59 5a 20 57 58 59 5a 20 57 58 59 7a 20 57 58 59  YZ WXYZ WXYz WXY
1250: 7a 20 57 58 79 5a 20 57 58 79 5a 20 57 58 79 7a  z WXyZ WXyZ WXyz
1260: 20 57 58 79 7a 20 57 78 59 5a 0a 20 20 57 78 59   WXyz WxYZ.  WxY
1270: 5a 20 57 78 59 7a 20 57 78 59 7a 20 57 78 79 5a  Z WxYz WxYz WxyZ
1280: 20 57 78 79 5a 20 57 78 79 7a 20 57 78 79 7a 0a   WxyZ Wxyz Wxyz.
1290: 20 20 61 42 43 44 20 61 42 43 44 20 61 42 43 64    aBCD aBCD aBCd
12a0: 20 61 42 43 64 20 61 42 63 44 20 61 42 63 44 20   aBCd aBcD aBcD 
12b0: 61 42 63 64 20 61 42 63 64 20 61 62 43 44 0a 20  aBcd aBcd abCD. 
12c0: 20 61 62 43 44 20 61 62 43 64 20 61 62 43 64 20   abCD abCd abCd 
12d0: 61 62 63 44 20 61 62 63 44 20 61 62 63 64 20 61  abcD abcD abcd a
12e0: 62 63 64 0a 20 20 77 58 59 5a 20 77 58 59 5a 20  bcd.  wXYZ wXYZ 
12f0: 77 58 59 7a 20 77 58 59 7a 20 77 58 79 5a 20 77  wXYz wXYz wXyZ w
1300: 58 79 5a 20 77 58 79 7a 20 77 58 79 7a 20 77 78  XyZ wXyz wXyz wx
1310: 59 5a 0a 20 20 77 78 59 5a 20 77 78 59 7a 20 77  YZ.  wxYZ wxYz w
1320: 78 59 7a 20 77 78 79 5a 20 77 78 79 5a 20 77 78  xYz wxyZ wxyZ wx
1330: 79 7a 20 77 78 79 7a 0a 7d 0a 0a 64 6f 5f 65 78  yz wxyz.}..do_ex
1340: 65 63 73 71 6c 5f 74 65 73 74 20 39 32 30 20 7b  ecsql_test 920 {
1350: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
1360: 69 39 20 4f 4e 20 74 39 28 76 20 43 4f 4c 4c 41  i9 ON t9(v COLLA
1370: 54 45 20 4e 4f 43 41 53 45 2c 20 76 29 3b 0a 20  TE NOCASE, v);. 
1380: 20 41 4e 41 4c 59 5a 45 3b 0a 0a 20 20 53 45 4c   ANALYZE;..  SEL
1390: 45 43 54 20 44 49 53 54 49 4e 43 54 20 76 20 43  ECT DISTINCT v C
13a0: 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 2c 20 76  OLLATE NOCASE, v
13b0: 20 46 52 4f 4d 20 74 39 20 4f 52 44 45 52 20 42   FROM t9 ORDER B
13c0: 59 20 2b 76 3b 0a 7d 20 7b 0a 20 20 41 42 43 44  Y +v;.} {.  ABCD
13d0: 20 41 42 43 44 20 41 42 43 64 20 41 42 43 64 20   ABCD ABCd ABCd 
13e0: 41 42 63 44 20 41 42 63 44 20 41 42 63 64 20 41  ABcD ABcD ABcd A
13f0: 42 63 64 20 41 62 43 44 0a 20 20 41 62 43 44 20  Bcd AbCD.  AbCD 
1400: 41 62 43 64 20 41 62 43 64 20 41 62 63 44 20 41  AbCd AbCd AbcD A
1410: 62 63 44 20 41 62 63 64 20 41 62 63 64 0a 20 20  bcD Abcd Abcd.  
1420: 57 58 59 5a 20 57 58 59 5a 20 57 58 59 7a 20 57  WXYZ WXYZ WXYz W
1430: 58 59 7a 20 57 58 79 5a 20 57 58 79 5a 20 57 58  XYz WXyZ WXyZ WX
1440: 79 7a 20 57 58 79 7a 20 57 78 59 5a 0a 20 20 57  yz WXyz WxYZ.  W
1450: 78 59 5a 20 57 78 59 7a 20 57 78 59 7a 20 57 78  xYZ WxYz WxYz Wx
1460: 79 5a 20 57 78 79 5a 20 57 78 79 7a 20 57 78 79  yZ WxyZ Wxyz Wxy
1470: 7a 0a 20 20 61 42 43 44 20 61 42 43 44 20 61 42  z.  aBCD aBCD aB
1480: 43 64 20 61 42 43 64 20 61 42 63 44 20 61 42 63  Cd aBCd aBcD aBc
1490: 44 20 61 42 63 64 20 61 42 63 64 20 61 62 43 44  D aBcd aBcd abCD
14a0: 0a 20 20 61 62 43 44 20 61 62 43 64 20 61 62 43  .  abCD abCd abC
14b0: 64 20 61 62 63 44 20 61 62 63 44 20 61 62 63 64  d abcD abcD abcd
14c0: 20 61 62 63 64 0a 20 20 77 58 59 5a 20 77 58 59   abcd.  wXYZ wXY
14d0: 5a 20 77 58 59 7a 20 77 58 59 7a 20 77 58 79 5a  Z wXYz wXYz wXyZ
14e0: 20 77 58 79 5a 20 77 58 79 7a 20 77 58 79 7a 20   wXyZ wXyz wXyz 
14f0: 77 78 59 5a 0a 20 20 77 78 59 5a 20 77 78 59 7a  wxYZ.  wxYZ wxYz
1500: 20 77 78 59 7a 20 77 78 79 5a 20 77 78 79 5a 20   wxYz wxyZ wxyZ 
1510: 77 78 79 7a 20 77 78 79 7a 0a 7d 0a 0a 23 20 54  wxyz wxyz.}..# T
1520: 69 63 6b 65 74 20 68 74 74 70 73 3a 2f 2f 73 71  icket https://sq
1530: 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66  lite.org/src/inf
1540: 6f 2f 65 66 39 33 31 38 37 35 37 62 31 35 32 65  o/ef9318757b152e
1550: 33 61 20 6f 6e 20 32 30 31 37 2d 31 31 2d 32 31  3a on 2017-11-21
1560: 0a 23 20 49 6e 63 6f 72 72 65 63 74 20 72 65 73  .# Incorrect res
1570: 75 6c 74 20 64 75 65 20 74 6f 20 61 20 73 6b 69  ult due to a ski
1580: 70 2d 61 68 65 61 64 2d 64 69 73 74 69 6e 63 74  p-ahead-distinct
1590: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e   optimization on
15a0: 20 61 0a 23 20 6a 6f 69 6e 20 77 68 65 72 65 20   a.# join where 
15b0: 6e 6f 20 72 6f 77 73 20 6f 66 20 74 68 65 20 69  no rows of the i
15c0: 6e 6e 65 72 20 6c 6f 6f 70 20 61 70 70 65 61 72  nner loop appear
15d0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
15e0: 65 74 2e 0a 23 0a 64 62 20 63 6c 6f 73 65 0a 73  et..#.db close.s
15f0: 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72  qlite3 db :memor
1600: 79 3a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  y:.do_execsql_te
1610: 73 74 20 31 30 30 30 20 7b 0a 20 20 43 52 45 41  st 1000 {.  CREA
1620: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e  TE TABLE t1(a IN
1630: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1640: 59 2c 20 62 20 49 4e 54 45 47 45 52 29 3b 0a 20  Y, b INTEGER);. 
1650: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31   CREATE INDEX t1
1660: 62 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 43 52  b ON t1(b);.  CR
1670: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 20  EATE TABLE t2(x 
1680: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1690: 4b 45 59 2c 20 79 20 49 4e 54 45 47 45 52 29 3b  KEY, y INTEGER);
16a0: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
16b0: 74 32 79 20 4f 4e 20 74 32 28 79 29 3b 0a 20 20  t2y ON t2(y);.  
16c0: 57 49 54 48 20 52 45 43 55 52 53 49 56 45 20 63  WITH RECURSIVE c
16d0: 28 78 29 20 41 53 20 28 56 41 4c 55 45 53 28 30  (x) AS (VALUES(0
16e0: 29 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  ) UNION ALL SELE
16f0: 43 54 20 78 2b 31 20 46 52 4f 4d 20 63 20 57 48  CT x+1 FROM c WH
1700: 45 52 45 20 78 3c 34 39 29 0a 20 20 20 20 49 4e  ERE x<49).    IN
1710: 53 45 52 54 20 49 4e 54 4f 20 74 31 28 62 29 20  SERT INTO t1(b) 
1720: 53 45 4c 45 43 54 20 78 2f 31 30 20 2d 20 31 20  SELECT x/10 - 1 
1730: 46 52 4f 4d 20 63 3b 0a 20 20 57 49 54 48 20 52  FROM c;.  WITH R
1740: 45 43 55 52 53 49 56 45 20 63 28 78 29 20 41 53  ECURSIVE c(x) AS
1750: 20 28 56 41 4c 55 45 53 28 2d 31 29 20 55 4e 49   (VALUES(-1) UNI
1760: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 78 2b  ON ALL SELECT x+
1770: 31 20 46 52 4f 4d 20 63 20 57 48 45 52 45 20 78  1 FROM c WHERE x
1780: 3c 31 39 29 0a 20 20 20 20 49 4e 53 45 52 54 20  <19).    INSERT 
1790: 49 4e 54 4f 20 74 32 28 78 2c 79 29 20 53 45 4c  INTO t2(x,y) SEL
17a0: 45 43 54 20 78 2c 20 31 20 46 52 4f 4d 20 63 3b  ECT x, 1 FROM c;
17b0: 0a 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e  .  SELECT DISTIN
17c0: 43 54 20 79 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT y FROM t1, t2
17d0: 20 57 48 45 52 45 20 62 3d 78 20 41 4e 44 20 62   WHERE b=x AND b
17e0: 3c 3e 2d 31 3b 0a 20 20 41 4e 41 4c 59 5a 45 3b  <>-1;.  ANALYZE;
17f0: 0a 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e  .  SELECT DISTIN
1800: 43 54 20 79 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT y FROM t1, t2
1810: 20 57 48 45 52 45 20 62 3d 78 20 41 4e 44 20 62   WHERE b=x AND b
1820: 3c 3e 2d 31 3b 0a 7d 20 7b 31 20 31 7d 0a 64 62  <>-1;.} {1 1}.db
1830: 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 64   close.sqlite3 d
1840: 62 20 3a 6d 65 6d 6f 72 79 3a 0a 64 6f 5f 65 78  b :memory:.do_ex
1850: 65 63 73 71 6c 5f 74 65 73 74 20 31 30 31 30 20  ecsql_test 1010 
1860: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
1870: 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50 52   t1(a INTEGER PR
1880: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 49 4e 54  IMARY KEY, b INT
1890: 45 47 45 52 29 3b 0a 20 20 43 52 45 41 54 45 20  EGER);.  CREATE 
18a0: 49 4e 44 45 58 20 74 31 62 20 4f 4e 20 74 31 28  INDEX t1b ON t1(
18b0: 62 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  b);.  CREATE TAB
18c0: 4c 45 20 74 32 28 78 20 49 4e 54 45 47 45 52 20  LE t2(x INTEGER 
18d0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 20 49  PRIMARY KEY, y I
18e0: 4e 54 45 47 45 52 29 3b 0a 20 20 43 52 45 41 54  NTEGER);.  CREAT
18f0: 45 20 49 4e 44 45 58 20 74 32 79 20 4f 4e 20 74  E INDEX t2y ON t
1900: 32 28 79 29 3b 0a 20 20 57 49 54 48 20 52 45 43  2(y);.  WITH REC
1910: 55 52 53 49 56 45 20 63 28 78 29 20 41 53 20 28  URSIVE c(x) AS (
1920: 56 41 4c 55 45 53 28 30 29 20 55 4e 49 4f 4e 20  VALUES(0) UNION 
1930: 41 4c 4c 20 53 45 4c 45 43 54 20 78 2b 31 20 46  ALL SELECT x+1 F
1940: 52 4f 4d 20 63 20 57 48 45 52 45 20 78 3c 34 39  ROM c WHERE x<49
1950: 29 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ).    INSERT INT
1960: 4f 20 74 31 28 62 29 20 53 45 4c 45 43 54 20 2d  O t1(b) SELECT -
1970: 28 78 2f 31 30 20 2d 20 31 29 20 46 52 4f 4d 20  (x/10 - 1) FROM 
1980: 63 3b 0a 20 20 57 49 54 48 20 52 45 43 55 52 53  c;.  WITH RECURS
1990: 49 56 45 20 63 28 78 29 20 41 53 20 28 56 41 4c  IVE c(x) AS (VAL
19a0: 55 45 53 28 2d 31 29 20 55 4e 49 4f 4e 20 41 4c  UES(-1) UNION AL
19b0: 4c 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f  L SELECT x+1 FRO
19c0: 4d 20 63 20 57 48 45 52 45 20 78 3c 31 39 29 0a  M c WHERE x<19).
19d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
19e0: 74 32 28 78 2c 79 29 20 53 45 4c 45 43 54 20 2d  t2(x,y) SELECT -
19f0: 78 2c 20 31 20 46 52 4f 4d 20 63 3b 0a 20 20 53  x, 1 FROM c;.  S
1a00: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 79  ELECT DISTINCT y
1a10: 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45   FROM t1, t2 WHE
1a20: 52 45 20 62 3d 78 20 41 4e 44 20 62 3c 3e 31 20  RE b=x AND b<>1 
1a30: 4f 52 44 45 52 20 42 59 20 79 20 44 45 53 43 3b  ORDER BY y DESC;
1a40: 0a 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 53 45  .  ANALYZE;.  SE
1a50: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 79 20  LECT DISTINCT y 
1a60: 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52  FROM t1, t2 WHER
1a70: 45 20 62 3d 78 20 41 4e 44 20 62 3c 3e 31 20 4f  E b=x AND b<>1 O
1a80: 52 44 45 52 20 42 59 20 79 20 44 45 53 43 3b 0a  RDER BY y DESC;.
1a90: 7d 20 7b 31 20 31 7d 0a 64 62 20 63 6c 6f 73 65  } {1 1}.db close
1aa0: 0a 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d  .sqlite3 db :mem
1ab0: 6f 72 79 3a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ory:.do_execsql_
1ac0: 74 65 73 74 20 31 30 32 30 20 7b 0a 20 20 43 52  test 1020 {.  CR
1ad0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
1ae0: 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e   b);.  CREATE IN
1af0: 44 45 58 20 74 31 61 20 4f 4e 20 74 31 28 61 2c  DEX t1a ON t1(a,
1b00: 20 62 29 3b 0a 20 20 2d 2d 20 4c 6f 74 73 20 6f   b);.  -- Lots o
1b10: 66 20 72 6f 77 73 20 6f 66 20 28 31 2c 20 27 6e  f rows of (1, 'n
1b20: 6f 27 29 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  o'), followed by
1b30: 20 61 20 73 69 6e 67 6c 65 20 28 31 2c 20 27 79   a single (1, 'y
1b40: 65 73 27 29 2e 0a 20 20 57 49 54 48 20 52 45 43  es')..  WITH REC
1b50: 55 52 53 49 56 45 20 63 28 78 29 20 41 53 20 28  URSIVE c(x) AS (
1b60: 56 41 4c 55 45 53 28 31 29 20 55 4e 49 4f 4e 20  VALUES(1) UNION 
1b70: 41 4c 4c 20 53 45 4c 45 43 54 20 78 2b 31 20 46  ALL SELECT x+1 F
1b80: 52 4f 4d 20 63 20 57 48 45 52 45 20 78 3c 31 30  ROM c WHERE x<10
1b90: 30 29 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  0).    INSERT IN
1ba0: 54 4f 20 74 31 28 61 2c 20 62 29 20 53 45 4c 45  TO t1(a, b) SELE
1bb0: 43 54 20 31 2c 20 27 6e 6f 27 20 46 52 4f 4d 20  CT 1, 'no' FROM 
1bc0: 63 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  c;.  INSERT INTO
1bd0: 20 74 31 28 61 2c 20 62 29 20 56 41 4c 55 45 53   t1(a, b) VALUES
1be0: 28 31 2c 20 27 79 65 73 27 29 3b 0a 20 20 43 52  (1, 'yes');.  CR
1bf0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 20  EATE TABLE t2(x 
1c00: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20  PRIMARY KEY);.  
1c10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
1c20: 41 4c 55 45 53 28 27 79 65 73 27 29 3b 0a 20 20  ALUES('yes');.  
1c30: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
1c40: 61 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48  a FROM t1, t2 WH
1c50: 45 52 45 20 78 3d 62 3b 0a 20 20 41 4e 41 4c 59  ERE x=b;.  ANALY
1c60: 5a 45 3b 0a 20 20 53 45 4c 45 43 54 20 44 49 53  ZE;.  SELECT DIS
1c70: 54 49 4e 43 54 20 61 20 46 52 4f 4d 20 74 31 2c  TINCT a FROM t1,
1c80: 20 74 32 20 57 48 45 52 45 20 78 3d 62 3b 0a 7d   t2 WHERE x=b;.}
1c90: 20 7b 31 20 31 7d 0a 0a 0a 66 69 6e 69 73 68 5f   {1 1}...finish_
1ca0: 74 65 73 74 0a                                   test.