/ Hex Artifact Content
Login

Artifact 3f492e5b7be1d3f756728d2ff6edf4f6091e84cb:


0000: 23 20 32 30 30 31 20 53 65 70 74 65 6d 62 65 72  # 2001 September
0010: 20 31 35 2e 0a 23 0a 23 20 54 68 65 20 61 75 74   15..#.# The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65   place of.# a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 23 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64  #.#    May you d
0090: 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65  o good and not e
00a0: 76 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f  vil..#    May yo
00b0: 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65  u find forgivene
00c0: 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20  ss for yourself 
00d0: 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65  and forgive othe
00e0: 72 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  rs..#    May you
00f0: 20 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e   share freely, n
0100: 65 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65  ever taking more
0110: 20 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a   than you give..
0120: 23 0a 23 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 2a 0a 23 0a 23 20 54  **********.#.# T
0170: 68 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65  his file impleme
0180: 6e 74 73 20 72 65 67 72 65 73 73 69 6f 6e 20 74  nts regression t
0190: 65 73 74 73 20 66 6f 72 20 53 51 4c 69 74 65 20  ests for SQLite 
01a0: 6c 69 62 72 61 72 79 2e 20 20 54 68 65 0a 23 20  library.  The.# 
01b0: 66 6f 63 75 73 20 6f 66 20 74 68 69 73 20 66 69  focus of this fi
01c0: 6c 65 20 69 73 20 74 65 73 74 69 6e 67 20 74 68  le is testing th
01d0: 65 20 73 6f 72 74 65 72 20 28 63 6f 64 65 20 69  e sorter (code i
01e0: 6e 20 76 64 62 65 73 6f 72 74 2e 63 29 2e 0a 23  n vdbesort.c)..#
01f0: 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66  ..set testdir [f
0200: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67  ile dirname $arg
0210: 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74  v0].source $test
0220: 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73  dir/tester.tcl.s
0230: 65 74 20 74 65 73 74 70 72 65 66 69 78 20 73 6f  et testprefix so
0240: 72 74 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69  rt.db close.sqli
0250: 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 73 71 6c  te3_shutdown.sql
0260: 69 74 65 33 5f 63 6f 6e 66 69 67 5f 70 6d 61 73  ite3_config_pmas
0270: 7a 20 31 30 0a 73 71 6c 69 74 65 33 5f 69 6e 69  z 10.sqlite3_ini
0280: 74 69 61 6c 69 7a 65 0a 73 71 6c 69 74 65 33 20  tialize.sqlite3 
0290: 64 62 20 74 65 73 74 2e 64 62 0a 0a 23 20 43 72  db test.db..# Cr
02a0: 65 61 74 65 20 61 20 62 75 6e 63 68 20 6f 66 20  eate a bunch of 
02b0: 64 61 74 61 20 74 6f 20 73 6f 72 74 20 61 67 61  data to sort aga
02c0: 69 6e 73 74 0a 23 0a 64 6f 5f 74 65 73 74 20 73  inst.#.do_test s
02d0: 6f 72 74 2d 31 2e 30 20 7b 0a 20 20 65 78 65 63  ort-1.0 {.  exec
02e0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
02f0: 20 54 41 42 4c 45 20 74 31 28 0a 20 20 20 20 20   TABLE t1(.     
0300: 20 20 6e 20 69 6e 74 2c 0a 20 20 20 20 20 20 20    n int,.       
0310: 76 20 76 61 72 63 68 61 72 28 31 30 29 2c 0a 20  v varchar(10),. 
0320: 20 20 20 20 20 20 6c 6f 67 20 69 6e 74 2c 0a 20        log int,. 
0330: 20 20 20 20 20 20 72 6f 6d 61 6e 20 76 61 72 63        roman varc
0340: 68 61 72 28 31 30 29 2c 0a 20 20 20 20 20 20 20  har(10),.       
0350: 66 6c 74 20 72 65 61 6c 0a 20 20 20 20 29 3b 0a  flt real.    );.
0360: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0370: 74 31 20 56 41 4c 55 45 53 28 31 2c 27 6f 6e 65  t1 VALUES(1,'one
0380: 27 2c 30 2c 27 49 27 2c 33 2e 31 34 31 35 39 32  ',0,'I',3.141592
0390: 36 35 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  653);.    INSERT
03a0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
03b0: 32 2c 27 74 77 6f 27 2c 31 2c 27 49 49 27 2c 32  2,'two',1,'II',2
03c0: 2e 31 35 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  .15);.    INSERT
03d0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
03e0: 33 2c 27 74 68 72 65 65 27 2c 31 2c 27 49 49 49  3,'three',1,'III
03f0: 27 2c 34 32 32 31 2e 30 29 3b 0a 20 20 20 20 49  ',4221.0);.    I
0400: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0410: 4c 55 45 53 28 34 2c 27 66 6f 75 72 27 2c 32 2c  LUES(4,'four',2,
0420: 27 49 56 27 2c 2d 30 2e 30 30 31 33 34 34 32 29  'IV',-0.0013442)
0430: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0440: 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 27 66  O t1 VALUES(5,'f
0450: 69 76 65 27 2c 32 2c 27 56 27 2c 2d 31 31 29 3b  ive',2,'V',-11);
0460: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0470: 20 74 31 20 56 41 4c 55 45 53 28 36 2c 27 73 69   t1 VALUES(6,'si
0480: 78 27 2c 32 2c 27 56 49 27 2c 30 2e 31 32 33 29  x',2,'VI',0.123)
0490: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
04a0: 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c 27 73  O t1 VALUES(7,'s
04b0: 65 76 65 6e 27 2c 32 2c 27 56 49 49 27 2c 31 32  even',2,'VII',12
04c0: 33 2e 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  3.0);.    INSERT
04d0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
04e0: 38 2c 27 65 69 67 68 74 27 2c 33 2c 27 56 49 49  8,'eight',3,'VII
04f0: 49 27 2c 2d 31 2e 36 29 3b 0a 20 20 7d 0a 20 20  I',-1.6);.  }.  
0500: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
0510: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
0520: 7d 0a 7d 20 7b 38 7d 0a 0a 64 6f 5f 74 65 73 74  }.} {8}..do_test
0530: 20 73 6f 72 74 2d 31 2e 31 20 7b 0a 20 20 65 78   sort-1.1 {.  ex
0540: 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 6e 20  ecsql {SELECT n 
0550: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
0560: 20 6e 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35   n}.} {1 2 3 4 5
0570: 20 36 20 37 20 38 7d 0a 64 6f 5f 74 65 73 74 20   6 7 8}.do_test 
0580: 73 6f 72 74 2d 31 2e 31 2e 31 20 7b 0a 20 20 65  sort-1.1.1 {.  e
0590: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 6e  xecsql {SELECT n
05a0: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
05b0: 59 20 6e 20 41 53 43 7d 0a 7d 20 7b 31 20 32 20  Y n ASC}.} {1 2 
05c0: 33 20 34 20 35 20 36 20 37 20 38 7d 0a 64 6f 5f  3 4 5 6 7 8}.do_
05d0: 74 65 73 74 20 73 6f 72 74 2d 31 2e 31 2e 31 20  test sort-1.1.1 
05e0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c  {.  execsql {SEL
05f0: 45 43 54 20 41 4c 4c 20 6e 20 46 52 4f 4d 20 74  ECT ALL n FROM t
0600: 31 20 4f 52 44 45 52 20 42 59 20 6e 20 41 53 43  1 ORDER BY n ASC
0610: 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36  }.} {1 2 3 4 5 6
0620: 20 37 20 38 7d 0a 64 6f 5f 74 65 73 74 20 73 6f   7 8}.do_test so
0630: 72 74 2d 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  rt-1.2 {.  execs
0640: 71 6c 20 7b 53 45 4c 45 43 54 20 6e 20 46 52 4f  ql {SELECT n FRO
0650: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 6e 20  M t1 ORDER BY n 
0660: 44 45 53 43 7d 0a 7d 20 7b 38 20 37 20 36 20 35  DESC}.} {8 7 6 5
0670: 20 34 20 33 20 32 20 31 7d 0a 64 6f 5f 74 65 73   4 3 2 1}.do_tes
0680: 74 20 73 6f 72 74 2d 31 2e 33 61 20 7b 0a 20 20  t sort-1.3a {.  
0690: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
06a0: 76 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  v FROM t1 ORDER 
06b0: 42 59 20 76 7d 0a 7d 20 7b 65 69 67 68 74 20 66  BY v}.} {eight f
06c0: 69 76 65 20 66 6f 75 72 20 6f 6e 65 20 73 65 76  ive four one sev
06d0: 65 6e 20 73 69 78 20 74 68 72 65 65 20 74 77 6f  en six three two
06e0: 7d 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74 2d 31  }.do_test sort-1
06f0: 2e 33 62 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .3b {.  execsql 
0700: 7b 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74  {SELECT n FROM t
0710: 31 20 4f 52 44 45 52 20 42 59 20 76 7d 0a 7d 20  1 ORDER BY v}.} 
0720: 7b 38 20 35 20 34 20 31 20 37 20 36 20 33 20 32  {8 5 4 1 7 6 3 2
0730: 7d 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74 2d 31  }.do_test sort-1
0740: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
0750: 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31  SELECT n FROM t1
0760: 20 4f 52 44 45 52 20 42 59 20 76 20 44 45 53 43   ORDER BY v DESC
0770: 7d 0a 7d 20 7b 32 20 33 20 36 20 37 20 31 20 34  }.} {2 3 6 7 1 4
0780: 20 35 20 38 7d 0a 64 6f 5f 74 65 73 74 20 73 6f   5 8}.do_test so
0790: 72 74 2d 31 2e 35 20 7b 0a 20 20 65 78 65 63 73  rt-1.5 {.  execs
07a0: 71 6c 20 7b 53 45 4c 45 43 54 20 66 6c 74 20 46  ql {SELECT flt F
07b0: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
07c0: 66 6c 74 7d 0a 7d 20 7b 2d 31 31 2e 30 20 2d 31  flt}.} {-11.0 -1
07d0: 2e 36 20 2d 30 2e 30 30 31 33 34 34 32 20 30 2e  .6 -0.0013442 0.
07e0: 31 32 33 20 32 2e 31 35 20 33 2e 31 34 31 35 39  123 2.15 3.14159
07f0: 32 36 35 33 20 31 32 33 2e 30 20 34 32 32 31 2e  2653 123.0 4221.
0800: 30 7d 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74 2d  0}.do_test sort-
0810: 31 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.6 {.  execsql 
0820: 7b 53 45 4c 45 43 54 20 66 6c 74 20 46 52 4f 4d  {SELECT flt FROM
0830: 20 74 31 20 4f 52 44 45 52 20 42 59 20 66 6c 74   t1 ORDER BY flt
0840: 20 44 45 53 43 7d 0a 7d 20 7b 34 32 32 31 2e 30   DESC}.} {4221.0
0850: 20 31 32 33 2e 30 20 33 2e 31 34 31 35 39 32 36   123.0 3.1415926
0860: 35 33 20 32 2e 31 35 20 30 2e 31 32 33 20 2d 30  53 2.15 0.123 -0
0870: 2e 30 30 31 33 34 34 32 20 2d 31 2e 36 20 2d 31  .0013442 -1.6 -1
0880: 31 2e 30 7d 0a 64 6f 5f 74 65 73 74 20 73 6f 72  1.0}.do_test sor
0890: 74 2d 31 2e 37 20 7b 0a 20 20 65 78 65 63 73 71  t-1.7 {.  execsq
08a0: 6c 20 7b 53 45 4c 45 43 54 20 72 6f 6d 61 6e 20  l {SELECT roman 
08b0: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
08c0: 20 72 6f 6d 61 6e 7d 0a 7d 20 7b 49 20 49 49 20   roman}.} {I II 
08d0: 49 49 49 20 49 56 20 56 20 56 49 20 56 49 49 20  III IV V VI VII 
08e0: 56 49 49 49 7d 0a 64 6f 5f 74 65 73 74 20 73 6f  VIII}.do_test so
08f0: 72 74 2d 31 2e 38 20 7b 0a 20 20 65 78 65 63 73  rt-1.8 {.  execs
0900: 71 6c 20 7b 53 45 4c 45 43 54 20 6e 20 46 52 4f  ql {SELECT n FRO
0910: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 6c 6f  M t1 ORDER BY lo
0920: 67 2c 20 66 6c 74 7d 0a 7d 20 7b 31 20 32 20 33  g, flt}.} {1 2 3
0930: 20 35 20 34 20 36 20 37 20 38 7d 0a 64 6f 5f 74   5 4 6 7 8}.do_t
0940: 65 73 74 20 73 6f 72 74 2d 31 2e 38 2e 31 20 7b  est sort-1.8.1 {
0950: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
0960: 43 54 20 6e 20 46 52 4f 4d 20 74 31 20 4f 52 44  CT n FROM t1 ORD
0970: 45 52 20 42 59 20 6c 6f 67 20 61 73 63 2c 20 66  ER BY log asc, f
0980: 6c 74 7d 0a 7d 20 7b 31 20 32 20 33 20 35 20 34  lt}.} {1 2 3 5 4
0990: 20 36 20 37 20 38 7d 0a 64 6f 5f 74 65 73 74 20   6 7 8}.do_test 
09a0: 73 6f 72 74 2d 31 2e 38 2e 32 20 7b 0a 20 20 65  sort-1.8.2 {.  e
09b0: 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 6e  xecsql {SELECT n
09c0: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
09d0: 59 20 6c 6f 67 2c 20 66 6c 74 20 41 53 43 7d 0a  Y log, flt ASC}.
09e0: 7d 20 7b 31 20 32 20 33 20 35 20 34 20 36 20 37  } {1 2 3 5 4 6 7
09f0: 20 38 7d 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74   8}.do_test sort
0a00: 2d 31 2e 38 2e 33 20 7b 0a 20 20 65 78 65 63 73  -1.8.3 {.  execs
0a10: 71 6c 20 7b 53 45 4c 45 43 54 20 6e 20 46 52 4f  ql {SELECT n FRO
0a20: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 6c 6f  M t1 ORDER BY lo
0a30: 67 20 41 53 43 2c 20 66 6c 74 20 61 73 63 7d 0a  g ASC, flt asc}.
0a40: 7d 20 7b 31 20 32 20 33 20 35 20 34 20 36 20 37  } {1 2 3 5 4 6 7
0a50: 20 38 7d 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74   8}.do_test sort
0a60: 2d 31 2e 39 20 7b 0a 20 20 65 78 65 63 73 71 6c  -1.9 {.  execsql
0a70: 20 7b 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20   {SELECT n FROM 
0a80: 74 31 20 4f 52 44 45 52 20 42 59 20 6c 6f 67 2c  t1 ORDER BY log,
0a90: 20 66 6c 74 20 44 45 53 43 7d 0a 7d 20 7b 31 20   flt DESC}.} {1 
0aa0: 33 20 32 20 37 20 36 20 34 20 35 20 38 7d 0a 64  3 2 7 6 4 5 8}.d
0ab0: 6f 5f 74 65 73 74 20 73 6f 72 74 2d 31 2e 39 2e  o_test sort-1.9.
0ac0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  1 {.  execsql {S
0ad0: 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20  ELECT n FROM t1 
0ae0: 4f 52 44 45 52 20 42 59 20 6c 6f 67 20 41 53 43  ORDER BY log ASC
0af0: 2c 20 66 6c 74 20 44 45 53 43 7d 0a 7d 20 7b 31  , flt DESC}.} {1
0b00: 20 33 20 32 20 37 20 36 20 34 20 35 20 38 7d 0a   3 2 7 6 4 5 8}.
0b10: 64 6f 5f 74 65 73 74 20 73 6f 72 74 2d 31 2e 31  do_test sort-1.1
0b20: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53  0 {.  execsql {S
0b30: 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31 20  ELECT n FROM t1 
0b40: 4f 52 44 45 52 20 42 59 20 6c 6f 67 20 44 45 53  ORDER BY log DES
0b50: 43 2c 20 66 6c 74 7d 0a 7d 20 7b 38 20 35 20 34  C, flt}.} {8 5 4
0b60: 20 36 20 37 20 32 20 33 20 31 7d 0a 64 6f 5f 74   6 7 2 3 1}.do_t
0b70: 65 73 74 20 73 6f 72 74 2d 31 2e 31 31 20 7b 0a  est sort-1.11 {.
0b80: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
0b90: 54 20 6e 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  T n FROM t1 ORDE
0ba0: 52 20 42 59 20 6c 6f 67 20 44 45 53 43 2c 20 66  R BY log DESC, f
0bb0: 6c 74 20 44 45 53 43 7d 0a 7d 20 7b 38 20 37 20  lt DESC}.} {8 7 
0bc0: 36 20 34 20 35 20 33 20 32 20 31 7d 0a 0a 23 20  6 4 5 3 2 1}..# 
0bd0: 54 68 65 73 65 20 74 65 73 74 73 20 61 72 65 20  These tests are 
0be0: 64 65 73 69 67 6e 65 64 20 74 6f 20 72 65 61 63  designed to reac
0bf0: 68 20 73 6f 6d 65 20 68 61 72 64 2d 74 6f 2d 72  h some hard-to-r
0c00: 65 61 63 68 20 70 6c 61 63 65 73 0a 23 20 69 6e  each places.# in
0c10: 73 69 64 65 20 74 68 65 20 73 74 72 69 6e 67 20  side the string 
0c20: 63 6f 6d 70 61 72 69 73 6f 6e 20 72 6f 75 74 69  comparison routi
0c30: 6e 65 73 2e 0a 23 0a 23 20 28 4c 61 74 65 72 29  nes..#.# (Later)
0c40: 20 54 68 65 20 73 6f 72 74 69 6e 67 20 62 65 68   The sorting beh
0c50: 61 76 69 6f 72 20 63 68 61 6e 67 65 64 20 69 6e  avior changed in
0c60: 20 32 2e 37 2e 30 2e 20 20 42 75 74 20 77 65 20   2.7.0.  But we 
0c70: 77 69 6c 6c 0a 23 20 6b 65 65 70 20 74 68 65 73  will.# keep thes
0c80: 65 20 74 65 73 74 73 2e 20 20 59 6f 75 20 63 61  e tests.  You ca
0c90: 6e 20 6e 65 76 65 72 20 68 61 76 65 20 74 6f 6f  n never have too
0ca0: 20 6d 61 6e 79 20 74 65 73 74 20 63 61 73 65 73   many test cases
0cb0: 21 0a 23 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74  !.#.do_test sort
0cc0: 2d 32 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  -2.1.1 {.  execs
0cd0: 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
0ce0: 74 31 20 53 45 54 20 76 3d 27 78 27 20 7c 7c 20  t1 SET v='x' || 
0cf0: 2d 66 6c 74 3b 0a 20 20 20 20 55 50 44 41 54 45  -flt;.    UPDATE
0d00: 20 74 31 20 53 45 54 20 76 3d 27 78 2d 32 62 27   t1 SET v='x-2b'
0d10: 20 77 68 65 72 65 20 76 3d 3d 27 78 2d 30 2e 31   where v=='x-0.1
0d20: 32 33 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  23';.    SELECT 
0d30: 76 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  v FROM t1 ORDER 
0d40: 42 59 20 76 3b 0a 20 20 7d 0a 7d 20 7b 78 2d 31  BY v;.  }.} {x-1
0d50: 32 33 2e 30 20 78 2d 32 2e 31 35 20 78 2d 32 62  23.0 x-2.15 x-2b
0d60: 20 78 2d 33 2e 31 34 31 35 39 32 36 35 33 20 78   x-3.141592653 x
0d70: 2d 34 32 32 31 2e 30 20 78 30 2e 30 30 31 33 34  -4221.0 x0.00134
0d80: 34 32 20 78 31 2e 36 20 78 31 31 2e 30 7d 0a 64  42 x1.6 x11.0}.d
0d90: 6f 5f 74 65 73 74 20 73 6f 72 74 2d 32 2e 31 2e  o_test sort-2.1.
0da0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
0db0: 20 20 20 20 53 45 4c 45 43 54 20 76 20 46 52 4f      SELECT v FRO
0dc0: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 73 75  M t1 ORDER BY su
0dd0: 62 73 74 72 28 76 2c 32 2c 39 39 39 29 3b 0a 20  bstr(v,2,999);. 
0de0: 20 7d 0a 7d 20 7b 78 2d 31 32 33 2e 30 20 78 2d   }.} {x-123.0 x-
0df0: 32 2e 31 35 20 78 2d 32 62 20 78 2d 33 2e 31 34  2.15 x-2b x-3.14
0e00: 31 35 39 32 36 35 33 20 78 2d 34 32 32 31 2e 30  1592653 x-4221.0
0e10: 20 78 30 2e 30 30 31 33 34 34 32 20 78 31 2e 36   x0.0013442 x1.6
0e20: 20 78 31 31 2e 30 7d 0a 64 6f 5f 74 65 73 74 20   x11.0}.do_test 
0e30: 73 6f 72 74 2d 32 2e 31 2e 33 20 7b 0a 20 20 65  sort-2.1.3 {.  e
0e40: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
0e50: 45 43 54 20 76 20 46 52 4f 4d 20 74 31 20 4f 52  ECT v FROM t1 OR
0e60: 44 45 52 20 42 59 20 73 75 62 73 74 72 28 76 2c  DER BY substr(v,
0e70: 32 2c 39 39 39 29 2b 30 2e 30 3b 0a 20 20 7d 0a  2,999)+0.0;.  }.
0e80: 7d 20 7b 78 2d 34 32 32 31 2e 30 20 78 2d 31 32  } {x-4221.0 x-12
0e90: 33 2e 30 20 78 2d 33 2e 31 34 31 35 39 32 36 35  3.0 x-3.14159265
0ea0: 33 20 78 2d 32 2e 31 35 20 78 2d 32 62 20 78 30  3 x-2.15 x-2b x0
0eb0: 2e 30 30 31 33 34 34 32 20 78 31 2e 36 20 78 31  .0013442 x1.6 x1
0ec0: 31 2e 30 7d 0a 64 6f 5f 74 65 73 74 20 73 6f 72  1.0}.do_test sor
0ed0: 74 2d 32 2e 31 2e 34 20 7b 0a 20 20 65 78 65 63  t-2.1.4 {.  exec
0ee0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
0ef0: 20 76 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52   v FROM t1 ORDER
0f00: 20 42 59 20 73 75 62 73 74 72 28 76 2c 32 2c 39   BY substr(v,2,9
0f10: 39 39 29 20 44 45 53 43 3b 0a 20 20 7d 0a 7d 20  99) DESC;.  }.} 
0f20: 7b 78 31 31 2e 30 20 78 31 2e 36 20 78 30 2e 30  {x11.0 x1.6 x0.0
0f30: 30 31 33 34 34 32 20 78 2d 34 32 32 31 2e 30 20  013442 x-4221.0 
0f40: 78 2d 33 2e 31 34 31 35 39 32 36 35 33 20 78 2d  x-3.141592653 x-
0f50: 32 62 20 78 2d 32 2e 31 35 20 78 2d 31 32 33 2e  2b x-2.15 x-123.
0f60: 30 7d 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74 2d  0}.do_test sort-
0f70: 32 2e 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  2.1.5 {.  execsq
0f80: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 76  l {.    SELECT v
0f90: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
0fa0: 59 20 73 75 62 73 74 72 28 76 2c 32 2c 39 39 39  Y substr(v,2,999
0fb0: 29 2b 30 2e 30 20 44 45 53 43 3b 0a 20 20 7d 0a  )+0.0 DESC;.  }.
0fc0: 7d 20 7b 78 31 31 2e 30 20 78 31 2e 36 20 78 30  } {x11.0 x1.6 x0
0fd0: 2e 30 30 31 33 34 34 32 20 78 2d 32 62 20 78 2d  .0013442 x-2b x-
0fe0: 32 2e 31 35 20 78 2d 33 2e 31 34 31 35 39 32 36  2.15 x-3.1415926
0ff0: 35 33 20 78 2d 31 32 33 2e 30 20 78 2d 34 32 32  53 x-123.0 x-422
1000: 31 2e 30 7d 0a 0a 23 20 54 68 69 73 20 69 73 20  1.0}..# This is 
1010: 61 20 62 75 67 20 66 69 78 20 66 6f 72 20 32 2e  a bug fix for 2.
1020: 32 2e 34 2e 0a 23 20 53 74 72 69 6e 67 73 20 61  2.4..# Strings a
1030: 72 65 20 6e 6f 72 6d 61 6c 6c 79 20 6d 61 70 70  re normally mapp
1040: 65 64 20 74 6f 20 75 70 70 65 72 2d 63 61 73 65  ed to upper-case
1050: 20 66 6f 72 20 61 20 63 61 73 65 6c 65 73 73 20   for a caseless 
1060: 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 23 20 42 75  comparison..# Bu
1070: 74 20 74 68 69 73 20 63 61 6e 20 63 61 75 73 65  t this can cause
1080: 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 63 68   problems for ch
1090: 61 72 61 63 74 65 72 73 20 69 6e 20 62 65 74 77  aracters in betw
10a0: 65 65 6e 20 27 5a 27 20 61 6e 64 20 27 61 27 2e  een 'Z' and 'a'.
10b0: 0a 23 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74 2d  .#.do_test sort-
10c0: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
10d0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
10e0: 4c 45 20 74 32 28 61 2c 62 29 3b 0a 20 20 20 20  LE t2(a,b);.    
10f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
1100: 41 4c 55 45 53 28 27 41 47 4c 49 45 4e 54 55 27  ALUES('AGLIENTU'
1110: 2c 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ,1);.    INSERT 
1120: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
1130: 41 47 4c 49 45 60 27 2c 32 29 3b 0a 20 20 20 20  AGLIE`',2);.    
1140: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
1150: 41 4c 55 45 53 28 27 41 47 4e 41 27 2c 33 29 3b  ALUES('AGNA',3);
1160: 0a 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62  .    SELECT a, b
1170: 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
1180: 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b 41 47 4c 49  Y a;.  }.} {AGLI
1190: 45 4e 54 55 20 31 20 41 47 4c 49 45 60 20 32 20  ENTU 1 AGLIE` 2 
11a0: 41 47 4e 41 20 33 7d 0a 64 6f 5f 74 65 73 74 20  AGNA 3}.do_test 
11b0: 73 6f 72 74 2d 33 2e 32 20 7b 0a 20 20 65 78 65  sort-3.2 {.  exe
11c0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
11d0: 54 20 61 2c 20 62 20 46 52 4f 4d 20 74 32 20 4f  T a, b FROM t2 O
11e0: 52 44 45 52 20 42 59 20 61 20 44 45 53 43 3b 0a  RDER BY a DESC;.
11f0: 20 20 7d 0a 7d 20 7b 41 47 4e 41 20 33 20 41 47    }.} {AGNA 3 AG
1200: 4c 49 45 60 20 32 20 41 47 4c 49 45 4e 54 55 20  LIE` 2 AGLIENTU 
1210: 31 7d 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74 2d  1}.do_test sort-
1220: 33 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.3 {.  execsql 
1230: 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
1240: 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t2;.    INSERT
1250: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1260: 27 61 67 6c 69 65 6e 74 75 27 2c 31 29 3b 0a 20  'aglientu',1);. 
1270: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1280: 32 20 56 41 4c 55 45 53 28 27 61 67 6c 69 65 60  2 VALUES('aglie`
1290: 27 2c 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ',2);.    INSERT
12a0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
12b0: 27 61 67 6e 61 27 2c 33 29 3b 0a 20 20 20 20 53  'agna',3);.    S
12c0: 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20  ELECT a, b FROM 
12d0: 74 32 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20  t2 ORDER BY a;. 
12e0: 20 7d 0a 7d 20 7b 61 67 6c 69 65 60 20 32 20 61   }.} {aglie` 2 a
12f0: 67 6c 69 65 6e 74 75 20 31 20 61 67 6e 61 20 33  glientu 1 agna 3
1300: 7d 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74 2d 33  }.do_test sort-3
1310: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
1320: 0a 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62  .    SELECT a, b
1330: 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
1340: 59 20 61 20 44 45 53 43 3b 0a 20 20 7d 0a 7d 20  Y a DESC;.  }.} 
1350: 7b 61 67 6e 61 20 33 20 61 67 6c 69 65 6e 74 75  {agna 3 aglientu
1360: 20 31 20 61 67 6c 69 65 60 20 32 7d 0a 0a 23 20   1 aglie` 2}..# 
1370: 56 65 72 73 69 6f 6e 20 32 2e 37 2e 30 20 74 65  Version 2.7.0 te
1380: 73 74 69 6e 67 2e 0a 23 0a 64 6f 5f 74 65 73 74  sting..#.do_test
1390: 20 73 6f 72 74 2d 34 2e 31 20 7b 0a 20 20 65 78   sort-4.1 {.  ex
13a0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
13b0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
13c0: 53 28 39 2c 27 78 32 2e 37 27 2c 33 2c 27 49 58  S(9,'x2.7',3,'IX
13d0: 27 2c 34 2e 30 65 35 29 3b 0a 20 20 20 20 49 4e  ',4.0e5);.    IN
13e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
13f0: 55 45 53 28 31 30 2c 27 78 35 2e 30 65 31 30 27  UES(10,'x5.0e10'
1400: 2c 33 2c 27 58 27 2c 2d 34 2e 30 65 35 29 3b 0a  ,3,'X',-4.0e5);.
1410: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1420: 74 31 20 56 41 4c 55 45 53 28 31 31 2c 27 78 2d  t1 VALUES(11,'x-
1430: 34 2e 30 65 39 27 2c 33 2c 27 58 49 27 2c 34 2e  4.0e9',3,'XI',4.
1440: 31 65 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  1e4);.    INSERT
1450: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1460: 31 32 2c 27 78 30 31 32 33 34 35 36 37 38 39 30  12,'x01234567890
1470: 31 32 33 34 35 36 37 38 39 27 2c 33 2c 27 58 49  123456789',3,'XI
1480: 49 27 2c 2d 34 2e 32 65 33 29 3b 0a 20 20 20 20  I',-4.2e3);.    
1490: 53 45 4c 45 43 54 20 6e 20 46 52 4f 4d 20 74 31  SELECT n FROM t1
14a0: 20 4f 52 44 45 52 20 42 59 20 6e 3b 0a 20 20 7d   ORDER BY n;.  }
14b0: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20  .} {1 2 3 4 5 6 
14c0: 37 20 38 20 39 20 31 30 20 31 31 20 31 32 7d 0a  7 8 9 10 11 12}.
14d0: 64 6f 5f 74 65 73 74 20 73 6f 72 74 2d 34 2e 32  do_test sort-4.2
14e0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
14f0: 20 20 20 53 45 4c 45 43 54 20 6e 7c 7c 27 27 20     SELECT n||'' 
1500: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
1510: 20 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 31 30 20   1;.  }.} {1 10 
1520: 31 31 20 31 32 20 32 20 33 20 34 20 35 20 36 20  11 12 2 3 4 5 6 
1530: 37 20 38 20 39 7d 0a 64 6f 5f 74 65 73 74 20 73  7 8 9}.do_test s
1540: 6f 72 74 2d 34 2e 33 20 7b 0a 20 20 65 78 65 63  ort-4.3 {.  exec
1550: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
1560: 20 6e 2b 30 20 46 52 4f 4d 20 74 31 20 4f 52 44   n+0 FROM t1 ORD
1570: 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b  ER BY 1;.  }.} {
1580: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20  1 2 3 4 5 6 7 8 
1590: 39 20 31 30 20 31 31 20 31 32 7d 0a 64 6f 5f 74  9 10 11 12}.do_t
15a0: 65 73 74 20 73 6f 72 74 2d 34 2e 34 20 7b 0a 20  est sort-4.4 {. 
15b0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
15c0: 45 4c 45 43 54 20 6e 7c 7c 27 27 20 46 52 4f 4d  ELECT n||'' FROM
15d0: 20 74 31 20 4f 52 44 45 52 20 42 59 20 31 20 44   t1 ORDER BY 1 D
15e0: 45 53 43 3b 0a 20 20 7d 0a 7d 20 7b 39 20 38 20  ESC;.  }.} {9 8 
15f0: 37 20 36 20 35 20 34 20 33 20 32 20 31 32 20 31  7 6 5 4 3 2 12 1
1600: 31 20 31 30 20 31 7d 0a 64 6f 5f 74 65 73 74 20  1 10 1}.do_test 
1610: 73 6f 72 74 2d 34 2e 35 20 7b 0a 20 20 65 78 65  sort-4.5 {.  exe
1620: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
1630: 54 20 6e 2b 30 20 46 52 4f 4d 20 74 31 20 4f 52  T n+0 FROM t1 OR
1640: 44 45 52 20 42 59 20 31 20 44 45 53 43 3b 0a 20  DER BY 1 DESC;. 
1650: 20 7d 0a 7d 20 7b 31 32 20 31 31 20 31 30 20 39   }.} {12 11 10 9
1660: 20 38 20 37 20 36 20 35 20 34 20 33 20 32 20 31   8 7 6 5 4 3 2 1
1670: 7d 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74 2d 34  }.do_test sort-4
1680: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .6 {.  execsql {
1690: 0a 20 20 20 20 53 45 4c 45 43 54 20 76 20 46 52  .    SELECT v FR
16a0: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 31  OM t1 ORDER BY 1
16b0: 3b 0a 20 20 7d 0a 7d 20 7b 78 2d 31 32 33 2e 30  ;.  }.} {x-123.0
16c0: 20 78 2d 32 2e 31 35 20 78 2d 32 62 20 78 2d 33   x-2.15 x-2b x-3
16d0: 2e 31 34 31 35 39 32 36 35 33 20 78 2d 34 2e 30  .141592653 x-4.0
16e0: 65 39 20 78 2d 34 32 32 31 2e 30 20 78 30 2e 30  e9 x-4221.0 x0.0
16f0: 30 31 33 34 34 32 20 78 30 31 32 33 34 35 36 37  013442 x01234567
1700: 38 39 30 31 32 33 34 35 36 37 38 39 20 78 31 2e  890123456789 x1.
1710: 36 20 78 31 31 2e 30 20 78 32 2e 37 20 78 35 2e  6 x11.0 x2.7 x5.
1720: 30 65 31 30 7d 0a 64 6f 5f 74 65 73 74 20 73 6f  0e10}.do_test so
1730: 72 74 2d 34 2e 37 20 7b 0a 20 20 65 78 65 63 73  rt-4.7 {.  execs
1740: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
1750: 76 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  v FROM t1 ORDER 
1760: 42 59 20 31 20 44 45 53 43 3b 0a 20 20 7d 0a 7d  BY 1 DESC;.  }.}
1770: 20 7b 78 35 2e 30 65 31 30 20 78 32 2e 37 20 78   {x5.0e10 x2.7 x
1780: 31 31 2e 30 20 78 31 2e 36 20 78 30 31 32 33 34  11.0 x1.6 x01234
1790: 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 20  567890123456789 
17a0: 78 30 2e 30 30 31 33 34 34 32 20 78 2d 34 32 32  x0.0013442 x-422
17b0: 31 2e 30 20 78 2d 34 2e 30 65 39 20 78 2d 33 2e  1.0 x-4.0e9 x-3.
17c0: 31 34 31 35 39 32 36 35 33 20 78 2d 32 62 20 78  141592653 x-2b x
17d0: 2d 32 2e 31 35 20 78 2d 31 32 33 2e 30 7d 0a 64  -2.15 x-123.0}.d
17e0: 6f 5f 74 65 73 74 20 73 6f 72 74 2d 34 2e 38 20  o_test sort-4.8 
17f0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1800: 20 20 53 45 4c 45 43 54 20 73 75 62 73 74 72 28    SELECT substr(
1810: 76 2c 32 2c 39 39 29 20 46 52 4f 4d 20 74 31 20  v,2,99) FROM t1 
1820: 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a  ORDER BY 1;.  }.
1830: 7d 20 7b 2d 31 32 33 2e 30 20 2d 32 2e 31 35 20  } {-123.0 -2.15 
1840: 2d 32 62 20 2d 33 2e 31 34 31 35 39 32 36 35 33  -2b -3.141592653
1850: 20 2d 34 2e 30 65 39 20 2d 34 32 32 31 2e 30 20   -4.0e9 -4221.0 
1860: 30 2e 30 30 31 33 34 34 32 20 30 31 32 33 34 35  0.0013442 012345
1870: 36 37 38 39 30 31 32 33 34 35 36 37 38 39 20 31  67890123456789 1
1880: 2e 36 20 31 31 2e 30 20 32 2e 37 20 35 2e 30 65  .6 11.0 2.7 5.0e
1890: 31 30 7d 0a 23 64 6f 5f 74 65 73 74 20 73 6f 72  10}.#do_test sor
18a0: 74 2d 34 2e 39 20 7b 0a 23 20 20 65 78 65 63 73  t-4.9 {.#  execs
18b0: 71 6c 20 7b 0a 23 20 20 20 20 53 45 4c 45 43 54  ql {.#    SELECT
18c0: 20 73 75 62 73 74 72 28 76 2c 32 2c 39 39 29 2b   substr(v,2,99)+
18d0: 30 2e 30 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  0.0 FROM t1 ORDE
18e0: 52 20 42 59 20 31 3b 0a 23 20 20 7d 0a 23 7d 20  R BY 1;.#  }.#} 
18f0: 7b 2d 34 30 30 30 30 30 30 30 30 30 20 2d 34 32  {-4000000000 -42
1900: 32 31 20 2d 31 32 33 20 2d 33 2e 31 34 31 35 39  21 -123 -3.14159
1910: 32 36 35 33 20 2d 32 2e 31 35 20 2d 32 20 30 2e  2653 -2.15 -2 0.
1920: 30 30 31 33 34 34 32 20 31 2e 36 20 32 2e 37 20  0013442 1.6 2.7 
1930: 31 31 20 35 30 30 30 30 30 30 30 30 30 30 20 31  11 50000000000 1
1940: 2e 32 33 34 35 36 37 38 39 30 31 32 33 34 36 65  .23456789012346e
1950: 2b 31 38 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 6f  +18}..do_test so
1960: 72 74 2d 35 2e 31 20 7b 0a 20 20 65 78 65 63 73  rt-5.1 {.  execs
1970: 71 6c 20 7b 0a 20 20 20 20 63 72 65 61 74 65 20  ql {.    create 
1980: 74 61 62 6c 65 20 74 33 28 61 2c 62 29 3b 0a 20  table t3(a,b);. 
1990: 20 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74     insert into t
19a0: 33 20 76 61 6c 75 65 73 28 35 2c 4e 55 4c 4c 29  3 values(5,NULL)
19b0: 3b 0a 20 20 20 20 69 6e 73 65 72 74 20 69 6e 74  ;.    insert int
19c0: 6f 20 74 33 20 76 61 6c 75 65 73 28 36 2c 4e 55  o t3 values(6,NU
19d0: 4c 4c 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 20  LL);.    insert 
19e0: 69 6e 74 6f 20 74 33 20 76 61 6c 75 65 73 28 33  into t3 values(3
19f0: 2c 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 6e 73 65  ,NULL);.    inse
1a00: 72 74 20 69 6e 74 6f 20 74 33 20 76 61 6c 75 65  rt into t3 value
1a10: 73 28 34 2c 27 63 64 27 29 3b 0a 20 20 20 20 69  s(4,'cd');.    i
1a20: 6e 73 65 72 74 20 69 6e 74 6f 20 74 33 20 76 61  nsert into t3 va
1a30: 6c 75 65 73 28 31 2c 27 61 62 27 29 3b 0a 20 20  lues(1,'ab');.  
1a40: 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 33    insert into t3
1a50: 20 76 61 6c 75 65 73 28 32 2c 4e 55 4c 4c 29 3b   values(2,NULL);
1a60: 0a 20 20 20 20 73 65 6c 65 63 74 20 61 20 66 72  .    select a fr
1a70: 6f 6d 20 74 33 20 6f 72 64 65 72 20 62 79 20 62  om t3 order by b
1a80: 2c 20 61 3b 0a 20 20 7d 0a 7d 20 7b 32 20 33 20  , a;.  }.} {2 3 
1a90: 35 20 36 20 31 20 34 7d 0a 64 6f 5f 74 65 73 74  5 6 1 4}.do_test
1aa0: 20 73 6f 72 74 2d 35 2e 32 20 7b 0a 20 20 65 78   sort-5.2 {.  ex
1ab0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 73 65 6c 65  ecsql {.    sele
1ac0: 63 74 20 61 20 66 72 6f 6d 20 74 33 20 6f 72 64  ct a from t3 ord
1ad0: 65 72 20 62 79 20 62 2c 20 61 20 64 65 73 63 3b  er by b, a desc;
1ae0: 0a 20 20 7d 0a 7d 20 7b 36 20 35 20 33 20 32 20  .  }.} {6 5 3 2 
1af0: 31 20 34 7d 0a 64 6f 5f 74 65 73 74 20 73 6f 72  1 4}.do_test sor
1b00: 74 2d 35 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  t-5.3 {.  execsq
1b10: 6c 20 7b 0a 20 20 20 20 73 65 6c 65 63 74 20 61  l {.    select a
1b20: 20 66 72 6f 6d 20 74 33 20 6f 72 64 65 72 20 62   from t3 order b
1b30: 79 20 62 20 64 65 73 63 2c 20 61 3b 0a 20 20 7d  y b desc, a;.  }
1b40: 0a 7d 20 7b 34 20 31 20 32 20 33 20 35 20 36 7d  .} {4 1 2 3 5 6}
1b50: 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74 2d 35 2e  .do_test sort-5.
1b60: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
1b70: 20 20 20 20 73 65 6c 65 63 74 20 61 20 66 72 6f      select a fro
1b80: 6d 20 74 33 20 6f 72 64 65 72 20 62 79 20 62 20  m t3 order by b 
1b90: 64 65 73 63 2c 20 61 20 64 65 73 63 3b 0a 20 20  desc, a desc;.  
1ba0: 7d 0a 7d 20 7b 34 20 31 20 36 20 35 20 33 20 32  }.} {4 1 6 5 3 2
1bb0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74 2d  }..do_test sort-
1bc0: 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.1 {.  execsql 
1bd0: 7b 0a 20 20 20 20 63 72 65 61 74 65 20 69 6e 64  {.    create ind
1be0: 65 78 20 69 33 20 6f 6e 20 74 33 28 62 2c 61 29  ex i3 on t3(b,a)
1bf0: 3b 0a 20 20 20 20 73 65 6c 65 63 74 20 61 20 66  ;.    select a f
1c00: 72 6f 6d 20 74 33 20 6f 72 64 65 72 20 62 79 20  rom t3 order by 
1c10: 62 2c 20 61 3b 0a 20 20 7d 0a 7d 20 7b 32 20 33  b, a;.  }.} {2 3
1c20: 20 35 20 36 20 31 20 34 7d 0a 64 6f 5f 74 65 73   5 6 1 4}.do_tes
1c30: 74 20 73 6f 72 74 2d 36 2e 32 20 7b 0a 20 20 65  t sort-6.2 {.  e
1c40: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 73 65 6c  xecsql {.    sel
1c50: 65 63 74 20 61 20 66 72 6f 6d 20 74 33 20 6f 72  ect a from t3 or
1c60: 64 65 72 20 62 79 20 62 2c 20 61 20 64 65 73 63  der by b, a desc
1c70: 3b 0a 20 20 7d 0a 7d 20 7b 36 20 35 20 33 20 32  ;.  }.} {6 5 3 2
1c80: 20 31 20 34 7d 0a 64 6f 5f 74 65 73 74 20 73 6f   1 4}.do_test so
1c90: 72 74 2d 36 2e 33 20 7b 0a 20 20 65 78 65 63 73  rt-6.3 {.  execs
1ca0: 71 6c 20 7b 0a 20 20 20 20 73 65 6c 65 63 74 20  ql {.    select 
1cb0: 61 20 66 72 6f 6d 20 74 33 20 6f 72 64 65 72 20  a from t3 order 
1cc0: 62 79 20 62 20 64 65 73 63 2c 20 61 3b 0a 20 20  by b desc, a;.  
1cd0: 7d 0a 7d 20 7b 34 20 31 20 32 20 33 20 35 20 36  }.} {4 1 2 3 5 6
1ce0: 7d 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74 2d 36  }.do_test sort-6
1cf0: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
1d00: 0a 20 20 20 20 73 65 6c 65 63 74 20 61 20 66 72  .    select a fr
1d10: 6f 6d 20 74 33 20 6f 72 64 65 72 20 62 79 20 62  om t3 order by b
1d20: 20 64 65 73 63 2c 20 61 20 64 65 73 63 3b 0a 20   desc, a desc;. 
1d30: 20 7d 0a 7d 20 7b 34 20 31 20 36 20 35 20 33 20   }.} {4 1 6 5 3 
1d40: 32 7d 0a 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74  2}..do_test sort
1d50: 2d 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  -7.1 {.  execsql
1d60: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
1d70: 42 4c 45 20 74 34 28 0a 20 20 20 20 20 20 61 20  BLE t4(.      a 
1d80: 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 62  INTEGER,.      b
1d90: 20 56 41 52 43 48 41 52 28 33 30 29 0a 20 20 20   VARCHAR(30).   
1da0: 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49   );.    INSERT I
1db0: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 31 2c  NTO t4 VALUES(1,
1dc0: 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  1);.    INSERT I
1dd0: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 32 2c  NTO t4 VALUES(2,
1de0: 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
1df0: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 31 31  NTO t4 VALUES(11
1e00: 2c 31 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ,11);.    INSERT
1e10: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
1e20: 31 32 2c 31 32 29 3b 0a 20 20 20 20 53 45 4c 45  12,12);.    SELE
1e30: 43 54 20 61 20 46 52 4f 4d 20 74 34 20 4f 52 44  CT a FROM t4 ORD
1e40: 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b  ER BY 1;.  }.} {
1e50: 31 20 32 20 31 31 20 31 32 7d 0a 64 6f 5f 74 65  1 2 11 12}.do_te
1e60: 73 74 20 73 6f 72 74 2d 37 2e 32 20 7b 0a 20 20  st sort-7.2 {.  
1e70: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
1e80: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 34 20 4f  LECT b FROM t4 O
1e90: 52 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20  RDER BY 1.  }.} 
1ea0: 7b 31 20 31 31 20 31 32 20 32 7d 0a 0a 23 20 4f  {1 11 12 2}..# O
1eb0: 6d 69 74 20 74 65 73 74 73 20 73 6f 72 74 2d 37  mit tests sort-7
1ec0: 2e 33 20 74 6f 20 73 6f 72 74 2d 37 2e 38 20 69  .3 to sort-7.8 i
1ed0: 66 20 76 69 65 77 20 73 75 70 70 6f 72 74 20 77  f view support w
1ee0: 61 73 20 64 69 73 61 62 6c 65 64 20 61 74 0a 23  as disabled at.#
1ef0: 20 63 6f 6d 70 69 6c 61 74 61 74 69 6f 6e 20 74   compilatation t
1f00: 69 6d 65 2e 0a 69 66 63 61 70 61 62 6c 65 20 76  ime..ifcapable v
1f10: 69 65 77 20 7b 0a 64 6f 5f 74 65 73 74 20 73 6f  iew {.do_test so
1f20: 72 74 2d 37 2e 33 20 7b 0a 20 20 65 78 65 63 73  rt-7.3 {.  execs
1f30: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1f40: 56 49 45 57 20 76 34 20 41 53 20 53 45 4c 45 43  VIEW v4 AS SELEC
1f50: 54 20 2a 20 46 52 4f 4d 20 74 34 3b 0a 20 20 20  T * FROM t4;.   
1f60: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 76   SELECT a FROM v
1f70: 34 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20  4 ORDER BY 1;.  
1f80: 7d 0a 7d 20 7b 31 20 32 20 31 31 20 31 32 7d 0a  }.} {1 2 11 12}.
1f90: 64 6f 5f 74 65 73 74 20 73 6f 72 74 2d 37 2e 34  do_test sort-7.4
1fa0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1fb0: 20 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d     SELECT b FROM
1fc0: 20 76 34 20 4f 52 44 45 52 20 42 59 20 31 3b 0a   v4 ORDER BY 1;.
1fd0: 20 20 7d 0a 7d 20 7b 31 20 31 31 20 31 32 20 32    }.} {1 11 12 2
1fe0: 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 63 6f 6d  }..ifcapable com
1ff0: 70 6f 75 6e 64 20 7b 0a 64 6f 5f 74 65 73 74 20  pound {.do_test 
2000: 73 6f 72 74 2d 37 2e 35 20 7b 0a 20 20 65 78 65  sort-7.5 {.  exe
2010: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
2020: 54 20 61 20 46 52 4f 4d 20 74 34 20 55 4e 49 4f  T a FROM t4 UNIO
2030: 4e 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20  N SELECT a FROM 
2040: 76 34 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20  v4 ORDER BY 1;. 
2050: 20 7d 0a 7d 20 7b 31 20 32 20 31 31 20 31 32 7d   }.} {1 2 11 12}
2060: 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74 2d 37 2e  .do_test sort-7.
2070: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  6 {.  execsql {.
2080: 20 20 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f      SELECT b FRO
2090: 4d 20 74 34 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t4 UNION SELEC
20a0: 54 20 61 20 46 52 4f 4d 20 76 34 20 4f 52 44 45  T a FROM v4 ORDE
20b0: 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 31  R BY 1;.  }.} {1
20c0: 20 32 20 31 31 20 31 32 20 31 20 31 31 20 31 32   2 11 12 1 11 12
20d0: 20 32 7d 20 20 3b 23 20 74 65 78 74 20 66 72 6f   2}  ;# text fro
20e0: 6d 20 74 34 2e 62 20 61 6e 64 20 6e 75 6d 65 72  m t4.b and numer
20f0: 69 63 20 66 72 6f 6d 20 76 34 2e 61 0a 64 6f 5f  ic from v4.a.do_
2100: 74 65 73 74 20 73 6f 72 74 2d 37 2e 37 20 7b 0a  test sort-7.7 {.
2110: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2120: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 34  SELECT a FROM t4
2130: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
2140: 46 52 4f 4d 20 76 34 20 4f 52 44 45 52 20 42 59  FROM v4 ORDER BY
2150: 20 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 31   1;.  }.} {1 2 1
2160: 31 20 31 32 20 31 20 31 31 20 31 32 20 32 7d 20  1 12 1 11 12 2} 
2170: 3b 23 20 6e 75 6d 65 72 69 63 20 66 72 6f 6d 20  ;# numeric from 
2180: 74 34 2e 61 20 61 6e 64 20 74 65 78 74 20 66 72  t4.a and text fr
2190: 6f 6d 20 76 34 2e 62 0a 64 6f 5f 74 65 73 74 20  om v4.b.do_test 
21a0: 73 6f 72 74 2d 37 2e 38 20 7b 0a 20 20 65 78 65  sort-7.8 {.  exe
21b0: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
21c0: 54 20 62 20 46 52 4f 4d 20 74 34 20 55 4e 49 4f  T b FROM t4 UNIO
21d0: 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  N SELECT b FROM 
21e0: 76 34 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20  v4 ORDER BY 1;. 
21f0: 20 7d 0a 7d 20 7b 31 20 31 31 20 31 32 20 32 7d   }.} {1 11 12 2}
2200: 0a 7d 20 3b 23 20 69 66 63 61 70 61 62 6c 65 20  .} ;# ifcapable 
2210: 63 6f 6d 70 6f 75 6e 64 0a 7d 20 3b 23 20 69 66  compound.} ;# if
2220: 63 61 70 61 62 6c 65 20 76 69 65 77 0a 0a 23 23  capable view..##
2230: 23 23 20 56 65 72 73 69 6f 6e 20 33 20 77 6f 72  ## Version 3 wor
2240: 6b 73 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ks differently h
2250: 65 72 65 3a 0a 23 64 6f 5f 74 65 73 74 20 73 6f  ere:.#do_test so
2260: 72 74 2d 37 2e 39 20 7b 0a 23 20 20 65 78 65 63  rt-7.9 {.#  exec
2270: 73 71 6c 20 7b 0a 23 20 20 20 20 53 45 4c 45 43  sql {.#    SELEC
2280: 54 20 62 20 46 52 4f 4d 20 74 34 20 55 4e 49 4f  T b FROM t4 UNIO
2290: 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  N SELECT b FROM 
22a0: 76 34 20 4f 52 44 45 52 20 42 59 20 31 20 43 4f  v4 ORDER BY 1 CO
22b0: 4c 4c 41 54 45 20 6e 75 6d 65 72 69 63 3b 0a 23  LLATE numeric;.#
22c0: 20 20 7d 0a 23 7d 20 7b 31 20 32 20 31 31 20 31    }.#} {1 2 11 1
22d0: 32 7d 0a 23 64 6f 5f 74 65 73 74 20 73 6f 72 74  2}.#do_test sort
22e0: 2d 37 2e 31 30 20 7b 0a 23 20 20 65 78 65 63 73  -7.10 {.#  execs
22f0: 71 6c 20 7b 0a 23 20 20 20 20 53 45 4c 45 43 54  ql {.#    SELECT
2300: 20 62 20 46 52 4f 4d 20 74 34 20 55 4e 49 4f 4e   b FROM t4 UNION
2310: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 76   SELECT b FROM v
2320: 34 20 4f 52 44 45 52 20 42 59 20 31 20 43 4f 4c  4 ORDER BY 1 COL
2330: 4c 41 54 45 20 69 6e 74 65 67 65 72 3b 0a 23 20  LATE integer;.# 
2340: 20 7d 0a 23 7d 20 7b 31 20 32 20 31 31 20 31 32   }.#} {1 2 11 12
2350: 7d 0a 23 64 6f 5f 74 65 73 74 20 73 6f 72 74 2d  }.#do_test sort-
2360: 37 2e 31 31 20 7b 0a 23 20 20 65 78 65 63 73 71  7.11 {.#  execsq
2370: 6c 20 7b 0a 23 20 20 20 20 53 45 4c 45 43 54 20  l {.#    SELECT 
2380: 62 20 46 52 4f 4d 20 74 34 20 55 4e 49 4f 4e 20  b FROM t4 UNION 
2390: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 76 34  SELECT b FROM v4
23a0: 20 4f 52 44 45 52 20 42 59 20 31 20 43 4f 4c 4c   ORDER BY 1 COLL
23b0: 41 54 45 20 74 65 78 74 3b 0a 23 20 20 7d 0a 23  ATE text;.#  }.#
23c0: 7d 20 7b 31 20 31 31 20 31 32 20 32 7d 0a 23 64  } {1 11 12 2}.#d
23d0: 6f 5f 74 65 73 74 20 73 6f 72 74 2d 37 2e 31 32  o_test sort-7.12
23e0: 20 7b 0a 23 20 20 65 78 65 63 73 71 6c 20 7b 0a   {.#  execsql {.
23f0: 23 20 20 20 20 53 45 4c 45 43 54 20 62 20 46 52  #    SELECT b FR
2400: 4f 4d 20 74 34 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t4 UNION SELE
2410: 43 54 20 62 20 46 52 4f 4d 20 76 34 20 4f 52 44  CT b FROM v4 ORD
2420: 45 52 20 42 59 20 31 20 43 4f 4c 4c 41 54 45 20  ER BY 1 COLLATE 
2430: 62 6c 6f 62 3b 0a 23 20 20 7d 0a 23 7d 20 7b 31  blob;.#  }.#} {1
2440: 20 31 31 20 31 32 20 32 7d 0a 23 64 6f 5f 74 65   11 12 2}.#do_te
2450: 73 74 20 73 6f 72 74 2d 37 2e 31 33 20 7b 0a 23  st sort-7.13 {.#
2460: 20 20 65 78 65 63 73 71 6c 20 7b 0a 23 20 20 20    execsql {.#   
2470: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
2480: 34 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  4 UNION SELECT b
2490: 20 46 52 4f 4d 20 76 34 20 4f 52 44 45 52 20 42   FROM v4 ORDER B
24a0: 59 20 31 20 43 4f 4c 4c 41 54 45 20 63 6c 6f 62  Y 1 COLLATE clob
24b0: 3b 0a 23 20 20 7d 0a 23 7d 20 7b 31 20 31 31 20  ;.#  }.#} {1 11 
24c0: 31 32 20 32 7d 0a 23 64 6f 5f 74 65 73 74 20 73  12 2}.#do_test s
24d0: 6f 72 74 2d 37 2e 31 34 20 7b 0a 23 20 20 65 78  ort-7.14 {.#  ex
24e0: 65 63 73 71 6c 20 7b 0a 23 20 20 20 20 53 45 4c  ecsql {.#    SEL
24f0: 45 43 54 20 62 20 46 52 4f 4d 20 74 34 20 55 4e  ECT b FROM t4 UN
2500: 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
2510: 4d 20 76 34 20 4f 52 44 45 52 20 42 59 20 31 20  M v4 ORDER BY 1 
2520: 43 4f 4c 4c 41 54 45 20 76 61 72 63 68 61 72 3b  COLLATE varchar;
2530: 0a 23 20 20 7d 0a 23 7d 20 7b 31 20 31 31 20 31  .#  }.#} {1 11 1
2540: 32 20 32 7d 0a 0a 23 20 54 69 63 6b 65 74 20 23  2 2}..# Ticket #
2550: 32 39 37 0a 23 0a 64 6f 5f 74 65 73 74 20 73 6f  297.#.do_test so
2560: 72 74 2d 38 2e 31 20 7b 0a 20 20 65 78 65 63 73  rt-8.1 {.  execs
2570: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
2580: 54 41 42 4c 45 20 74 35 28 61 20 72 65 61 6c 2c  TABLE t5(a real,
2590: 20 62 20 74 65 78 74 29 3b 0a 20 20 20 20 49 4e   b text);.    IN
25a0: 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c  SERT INTO t5 VAL
25b0: 55 45 53 28 31 30 30 2c 27 41 31 27 29 3b 0a 20  UES(100,'A1');. 
25c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
25d0: 35 20 56 41 4c 55 45 53 28 31 30 30 2e 30 2c 27  5 VALUES(100.0,'
25e0: 41 32 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  A2');.    SELECT
25f0: 20 2a 20 46 52 4f 4d 20 74 35 20 4f 52 44 45 52   * FROM t5 ORDER
2600: 20 42 59 20 61 2c 20 62 3b 0a 20 20 7d 0a 7d 20   BY a, b;.  }.} 
2610: 7b 31 30 30 2e 30 20 41 31 20 31 30 30 2e 30 20  {100.0 A1 100.0 
2620: 41 32 7d 0a 0a 0a 69 66 63 61 70 61 62 6c 65 20  A2}...ifcapable 
2630: 7b 62 6c 6f 62 6c 69 74 7d 20 7b 0a 23 20 42 4c  {bloblit} {.# BL
2640: 4f 42 73 20 73 68 6f 75 6c 64 20 73 6f 72 74 20  OBs should sort 
2650: 61 66 74 65 72 20 54 45 58 54 0a 23 0a 64 6f 5f  after TEXT.#.do_
2660: 74 65 73 74 20 73 6f 72 74 2d 39 2e 31 20 7b 0a  test sort-9.1 {.
2670: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2680: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28  CREATE TABLE t6(
2690: 78 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52  x, y);.    INSER
26a0: 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53  T INTO t6 VALUES
26b0: 28 31 2c 31 29 3b 0a 20 20 20 20 49 4e 53 45 52  (1,1);.    INSER
26c0: 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53  T INTO t6 VALUES
26d0: 28 32 2c 27 31 27 29 3b 0a 20 20 20 20 49 4e 53  (2,'1');.    INS
26e0: 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55  ERT INTO t6 VALU
26f0: 45 53 28 33 2c 78 27 33 31 27 29 3b 0a 20 20 20  ES(3,x'31');.   
2700: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 20   INSERT INTO t6 
2710: 56 41 4c 55 45 53 28 34 2c 4e 55 4c 4c 29 3b 0a  VALUES(4,NULL);.
2720: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
2730: 4d 20 74 36 20 4f 52 44 45 52 20 42 59 20 79 3b  M t6 ORDER BY y;
2740: 0a 20 20 7d 0a 7d 20 7b 34 20 31 20 32 20 33 7d  .  }.} {4 1 2 3}
2750: 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74 2d 39 2e  .do_test sort-9.
2760: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
2770: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
2780: 4d 20 74 36 20 4f 52 44 45 52 20 42 59 20 79 20  M t6 ORDER BY y 
2790: 44 45 53 43 3b 0a 20 20 7d 0a 7d 20 7b 33 20 32  DESC;.  }.} {3 2
27a0: 20 31 20 34 7d 0a 64 6f 5f 74 65 73 74 20 73 6f   1 4}.do_test so
27b0: 72 74 2d 39 2e 33 20 7b 0a 20 20 65 78 65 63 73  rt-9.3 {.  execs
27c0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
27d0: 78 20 46 52 4f 4d 20 74 36 20 57 48 45 52 45 20  x FROM t6 WHERE 
27e0: 79 3c 31 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  y<1.  }.} {}.do_
27f0: 74 65 73 74 20 73 6f 72 74 2d 39 2e 34 20 7b 0a  test sort-9.4 {.
2800: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2810: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 36  SELECT x FROM t6
2820: 20 57 48 45 52 45 20 79 3c 27 31 27 0a 20 20 7d   WHERE y<'1'.  }
2830: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 73  .} {1}.do_test s
2840: 6f 72 74 2d 39 2e 35 20 7b 0a 20 20 65 78 65 63  ort-9.5 {.  exec
2850: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
2860: 20 78 20 46 52 4f 4d 20 74 36 20 57 48 45 52 45   x FROM t6 WHERE
2870: 20 79 3c 78 27 33 31 27 0a 20 20 7d 0a 7d 20 7b   y<x'31'.  }.} {
2880: 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 73 6f 72  1 2}.do_test sor
2890: 74 2d 39 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  t-9.6 {.  execsq
28a0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78  l {.    SELECT x
28b0: 20 46 52 4f 4d 20 74 36 20 57 48 45 52 45 20 79   FROM t6 WHERE y
28c0: 3e 31 0a 20 20 7d 0a 7d 20 7b 32 20 33 7d 0a 64  >1.  }.} {2 3}.d
28d0: 6f 5f 74 65 73 74 20 73 6f 72 74 2d 39 2e 37 20  o_test sort-9.7 
28e0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
28f0: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
2900: 74 36 20 57 48 45 52 45 20 79 3e 27 31 27 0a 20  t6 WHERE y>'1'. 
2910: 20 7d 0a 7d 20 7b 33 7d 0a 7d 20 3b 23 20 65 6e   }.} {3}.} ;# en
2920: 64 69 66 20 62 6c 6f 62 6c 69 74 0a 0a 23 20 54  dif bloblit..# T
2930: 69 63 6b 65 74 20 23 31 30 39 32 20 2d 20 4f 52  icket #1092 - OR
2940: 44 45 52 20 42 59 20 6f 6e 20 72 6f 77 69 64 20  DER BY on rowid 
2950: 66 69 65 6c 64 73 2e 0a 64 6f 5f 74 65 73 74 20  fields..do_test 
2960: 73 6f 72 74 2d 31 30 2e 31 20 7b 0a 20 20 65 78  sort-10.1 {.  ex
2970: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
2980: 54 45 20 54 41 42 4c 45 20 74 37 28 63 20 49 4e  TE TABLE t7(c IN
2990: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
29a0: 59 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  Y);.    INSERT I
29b0: 4e 54 4f 20 74 37 20 56 41 4c 55 45 53 28 31 29  NTO t7 VALUES(1)
29c0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
29d0: 4f 20 74 37 20 56 41 4c 55 45 53 28 32 29 3b 0a  O t7 VALUES(2);.
29e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
29f0: 74 37 20 56 41 4c 55 45 53 28 33 29 3b 0a 20 20  t7 VALUES(3);.  
2a00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37    INSERT INTO t7
2a10: 20 56 41 4c 55 45 53 28 34 29 3b 0a 20 20 7d 0a   VALUES(4);.  }.
2a20: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 73 6f 72  } {}.do_test sor
2a30: 74 2d 31 30 2e 32 20 7b 0a 20 20 65 78 65 63 73  t-10.2 {.  execs
2a40: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
2a50: 63 20 46 52 4f 4d 20 74 37 20 57 48 45 52 45 20  c FROM t7 WHERE 
2a60: 63 3c 3d 33 20 4f 52 44 45 52 20 42 59 20 63 20  c<=3 ORDER BY c 
2a70: 44 45 53 43 3b 0a 20 20 7d 0a 7d 20 7b 33 20 32  DESC;.  }.} {3 2
2a80: 20 31 7d 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74   1}.do_test sort
2a90: 2d 31 30 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  -10.3 {.  execsq
2aa0: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  l {.    SELECT c
2ab0: 20 46 52 4f 4d 20 74 37 20 57 48 45 52 45 20 63   FROM t7 WHERE c
2ac0: 3c 33 20 4f 52 44 45 52 20 42 59 20 63 20 44 45  <3 ORDER BY c DE
2ad0: 53 43 3b 0a 20 20 7d 0a 7d 20 7b 32 20 31 7d 0a  SC;.  }.} {2 1}.
2ae0: 0a 23 20 74 69 63 6b 65 74 20 23 31 33 35 38 2e  .# ticket #1358.
2af0: 20 20 4a 75 73 74 20 62 65 63 61 75 73 65 20 6f    Just because o
2b00: 6e 65 20 74 61 62 6c 65 20 69 6e 20 61 20 6a 6f  ne table in a jo
2b10: 69 6e 20 67 69 76 65 73 20 61 20 75 6e 69 71 75  in gives a uniqu
2b20: 65 0a 23 20 72 65 73 75 6c 74 20 64 6f 65 73 20  e.# result does 
2b30: 6e 6f 74 20 6d 65 61 6e 20 74 68 65 79 20 61 6c  not mean they al
2b40: 6c 20 64 6f 2e 20 20 57 65 20 63 61 6e 6e 6f 74  l do.  We cannot
2b50: 20 64 69 73 61 62 6c 65 20 73 6f 72 74 69 6e 67   disable sorting
2b60: 20 75 6e 6c 65 73 73 0a 23 20 61 6c 6c 20 74 61   unless.# all ta
2b70: 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
2b80: 20 67 69 76 65 20 75 6e 69 71 75 65 20 72 65 73   give unique res
2b90: 75 6c 74 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ults..#.do_test 
2ba0: 73 6f 72 74 2d 31 31 2e 31 20 7b 0a 20 20 65 78  sort-11.1 {.  ex
2bb0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 63 72 65 61  ecsql {.    crea
2bc0: 74 65 20 74 61 62 6c 65 20 74 38 28 61 20 75 6e  te table t8(a un
2bd0: 69 71 75 65 2c 20 62 2c 20 63 29 3b 0a 20 20 20  ique, b, c);.   
2be0: 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 38 20   insert into t8 
2bf0: 76 61 6c 75 65 73 28 31 2c 32 2c 33 29 3b 0a 20  values(1,2,3);. 
2c00: 20 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74     insert into t
2c10: 38 20 76 61 6c 75 65 73 28 32 2c 33 2c 34 29 3b  8 values(2,3,4);
2c20: 0a 20 20 20 20 63 72 65 61 74 65 20 74 61 62 6c  .    create tabl
2c30: 65 20 74 39 28 78 2c 79 29 3b 0a 20 20 20 20 69  e t9(x,y);.    i
2c40: 6e 73 65 72 74 20 69 6e 74 6f 20 74 39 20 76 61  nsert into t9 va
2c50: 6c 75 65 73 28 32 2c 34 29 3b 0a 20 20 20 20 69  lues(2,4);.    i
2c60: 6e 73 65 72 74 20 69 6e 74 6f 20 74 39 20 76 61  nsert into t9 va
2c70: 6c 75 65 73 28 32 2c 33 29 3b 0a 20 20 20 20 73  lues(2,3);.    s
2c80: 65 6c 65 63 74 20 79 20 66 72 6f 6d 20 74 38 2c  elect y from t8,
2c90: 20 74 39 20 77 68 65 72 65 20 61 3d 31 20 6f 72   t9 where a=1 or
2ca0: 64 65 72 20 62 79 20 61 2c 20 79 3b 0a 20 20 7d  der by a, y;.  }
2cb0: 0a 7d 20 7b 33 20 34 7d 0a 0a 23 20 54 72 6f 75  .} {3 4}..# Trou
2cc0: 62 6c 65 20 72 65 70 6f 72 74 65 64 20 6f 6e 20  ble reported on 
2cd0: 74 68 65 20 6d 61 69 6c 69 6e 67 20 6c 69 73 74  the mailing list
2ce0: 2e 20 20 43 68 65 63 6b 20 66 6f 72 20 6f 76 65  .  Check for ove
2cf0: 72 6c 79 20 61 67 67 72 65 73 73 69 76 65 0a 23  rly aggressive.#
2d00: 20 28 77 68 69 63 68 20 69 73 20 74 6f 20 73 61   (which is to sa
2d10: 79 2c 20 69 6e 63 6f 72 72 65 63 74 29 20 6f 70  y, incorrect) op
2d20: 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 66 20 6f 72  timization of or
2d30: 64 65 72 2d 62 79 20 77 69 74 68 20 61 20 72 6f  der-by with a ro
2d40: 77 69 64 0a 23 20 69 6e 20 61 20 6a 6f 69 6e 2e  wid.# in a join.
2d50: 0a 23 0a 64 6f 5f 74 65 73 74 20 73 6f 72 74 2d  .#.do_test sort-
2d60: 31 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  12.1 {.  execsql
2d70: 20 7b 0a 20 20 20 20 63 72 65 61 74 65 20 74 61   {.    create ta
2d80: 62 6c 65 20 61 20 28 69 64 20 69 6e 74 65 67 65  ble a (id intege
2d90: 72 20 70 72 69 6d 61 72 79 20 6b 65 79 29 3b 0a  r primary key);.
2da0: 20 20 20 20 63 72 65 61 74 65 20 74 61 62 6c 65      create table
2db0: 20 62 20 28 69 64 20 69 6e 74 65 67 65 72 20 70   b (id integer p
2dc0: 72 69 6d 61 72 79 20 6b 65 79 2c 20 61 49 64 20  rimary key, aId 
2dd0: 69 6e 74 65 67 65 72 2c 20 74 65 78 74 29 3b 0a  integer, text);.
2de0: 20 20 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20      insert into 
2df0: 61 20 76 61 6c 75 65 73 20 28 31 29 3b 0a 20 20  a values (1);.  
2e00: 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 62 20    insert into b 
2e10: 76 61 6c 75 65 73 20 28 32 2c 20 31 2c 20 27 78  values (2, 1, 'x
2e20: 78 78 27 29 3b 0a 20 20 20 20 69 6e 73 65 72 74  xx');.    insert
2e30: 20 69 6e 74 6f 20 62 20 76 61 6c 75 65 73 20 28   into b values (
2e40: 31 2c 20 31 2c 20 27 7a 7a 7a 27 29 3b 0a 20 20  1, 1, 'zzz');.  
2e50: 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 62 20    insert into b 
2e60: 76 61 6c 75 65 73 20 28 33 2c 20 31 2c 20 27 79  values (3, 1, 'y
2e70: 79 79 27 29 3b 0a 20 20 20 20 73 65 6c 65 63 74  yy');.    select
2e80: 20 61 2e 69 64 2c 20 62 2e 69 64 2c 20 62 2e 74   a.id, b.id, b.t
2e90: 65 78 74 20 66 72 6f 6d 20 61 20 6a 6f 69 6e 20  ext from a join 
2ea0: 62 20 6f 6e 20 28 61 2e 69 64 20 3d 20 62 2e 61  b on (a.id = b.a
2eb0: 49 64 29 0a 20 20 20 20 20 20 6f 72 64 65 72 20  Id).      order 
2ec0: 62 79 20 61 2e 69 64 2c 20 62 2e 74 65 78 74 3b  by a.id, b.text;
2ed0: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 78 78 78 20  .  }.} {1 2 xxx 
2ee0: 31 20 33 20 79 79 79 20 31 20 31 20 7a 7a 7a 7d  1 3 yyy 1 1 zzz}
2ef0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43  ------------.# C
2f40: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 73 6f  heck that the so
2f50: 72 74 65 72 20 69 6e 20 76 64 62 65 73 6f 72 74  rter in vdbesort
2f60: 2e 63 20 73 6f 72 74 73 20 69 6e 20 61 20 73 74  .c sorts in a st
2f70: 61 62 6c 65 20 66 61 73 68 69 6f 6e 2e 0a 23 0a  able fashion..#.
2f80: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2f90: 73 6f 72 74 2d 31 33 2e 30 20 7b 0a 20 20 43 52  sort-13.0 {.  CR
2fa0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 30 28 61  EATE TABLE t10(a
2fb0: 2c 20 62 29 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20  , b);.}.do_test 
2fc0: 73 6f 72 74 2d 31 33 2e 31 20 7b 0a 20 20 64 62  sort-13.1 {.  db
2fd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20   transaction {. 
2fe0: 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d     for {set i 0}
2ff0: 20 7b 24 69 20 3c 20 31 30 30 30 30 30 7d 20 7b   {$i < 100000} {
3000: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20  incr i} {.      
3010: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
3020: 20 49 4e 54 4f 20 74 31 30 20 56 41 4c 55 45 53   INTO t10 VALUES
3030: 28 20 24 69 2f 31 30 2c 20 24 69 25 31 30 20 29  ( $i/10, $i%10 )
3040: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20 7b   }.    }.  }.} {
3050: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
3060: 74 20 73 6f 72 74 2d 31 33 2e 32 20 7b 0a 20 20  t sort-13.2 {.  
3070: 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f 4d  SELECT a, b FROM
3080: 20 74 31 30 20 4f 52 44 45 52 20 42 59 20 61 3b   t10 ORDER BY a;
3090: 0a 7d 20 5b 64 62 20 65 76 61 6c 20 7b 53 45 4c  .} [db eval {SEL
30a0: 45 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74 31  ECT a, b FROM t1
30b0: 30 20 4f 52 44 45 52 20 42 59 20 61 2c 20 62 7d  0 ORDER BY a, b}
30c0: 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ].do_execsql_tes
30d0: 74 20 73 6f 72 74 2d 31 33 2e 33 20 7b 0a 20 20  t sort-13.3 {.  
30e0: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
30f0: 65 20 3d 20 35 3b 0a 20 20 53 45 4c 45 43 54 20  e = 5;.  SELECT 
3100: 61 2c 20 62 20 46 52 4f 4d 20 74 31 30 20 4f 52  a, b FROM t10 OR
3110: 44 45 52 20 42 59 20 61 3b 0a 7d 20 5b 64 62 20  DER BY a;.} [db 
3120: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 61 2c 20  eval {SELECT a, 
3130: 62 20 46 52 4f 4d 20 74 31 30 20 4f 52 44 45 52  b FROM t10 ORDER
3140: 20 42 59 20 61 2c 20 62 7d 5d 0a 0a 23 2d 2d 2d   BY a, b}]..#---
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3190: 2d 2d 2d 2d 2d 2d 0a 23 20 53 6f 72 74 20 73 6f  ------.# Sort so
31a0: 6d 65 20 6c 61 72 67 65 20 28 20 3e 20 34 4b 69  me large ( > 4Ki
31b0: 42 29 20 72 65 63 6f 72 64 73 2e 0a 23 0a 70 72  B) records..#.pr
31c0: 6f 63 20 63 6b 73 75 6d 20 7b 78 7d 20 7b 0a 20  oc cksum {x} {. 
31d0: 20 73 65 74 20 69 31 20 31 0a 20 20 73 65 74 20   set i1 1.  set 
31e0: 69 32 20 32 0a 20 20 62 69 6e 61 72 79 20 73 63  i2 2.  binary sc
31f0: 61 6e 20 24 78 20 63 2a 20 4c 0a 20 20 66 6f 72  an $x c* L.  for
3200: 65 61 63 68 20 7b 61 20 62 7d 20 24 4c 20 7b 0a  each {a b} $L {.
3210: 20 20 20 20 73 65 74 20 69 31 20 5b 65 78 70 72      set i1 [expr
3220: 20 28 28 24 69 32 3c 3c 33 29 20 2b 20 24 61 29   (($i2<<3) + $a)
3230: 20 26 20 30 78 37 46 46 46 46 46 46 46 5d 0a 20   & 0x7FFFFFFF]. 
3240: 20 20 20 73 65 74 20 69 32 20 5b 65 78 70 72 20     set i2 [expr 
3250: 28 28 24 69 31 3c 3c 33 29 20 2b 20 24 62 29 20  (($i1<<3) + $b) 
3260: 26 20 30 78 37 46 46 46 46 46 46 46 5d 0a 20 20  & 0x7FFFFFFF].  
3270: 7d 0a 20 20 6c 69 73 74 20 24 69 31 20 24 69 32  }.  list $i1 $i2
3280: 0a 7d 0a 64 62 20 66 75 6e 63 20 63 6b 73 75 6d  .}.db func cksum
3290: 20 63 6b 73 75 6d 0a 0a 64 6f 5f 65 78 65 63 73   cksum..do_execs
32a0: 71 6c 5f 74 65 73 74 20 73 6f 72 74 2d 31 34 2e  ql_test sort-14.
32b0: 30 20 7b 0a 20 20 50 52 41 47 4d 41 20 63 61 63  0 {.  PRAGMA cac
32c0: 68 65 5f 73 69 7a 65 20 3d 20 35 3b 0a 20 20 43  he_size = 5;.  C
32d0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 31 28  REATE TABLE t11(
32e0: 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20  a, b);.  INSERT 
32f0: 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28  INTO t11 VALUES(
3300: 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 30 29  randomblob(5000)
3310: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52  , NULL);.  INSER
3320: 54 20 49 4e 54 4f 20 74 31 31 20 53 45 4c 45 43  T INTO t11 SELEC
3330: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 30  T randomblob(500
3340: 30 29 2c 20 4e 55 4c 4c 20 46 52 4f 4d 20 74 31  0), NULL FROM t1
3350: 31 3b 20 2d 2d 32 0a 20 20 49 4e 53 45 52 54 20  1; --2.  INSERT 
3360: 49 4e 54 4f 20 74 31 31 20 53 45 4c 45 43 54 20  INTO t11 SELECT 
3370: 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 30 29  randomblob(5000)
3380: 2c 20 4e 55 4c 4c 20 46 52 4f 4d 20 74 31 31 3b  , NULL FROM t11;
3390: 20 2d 2d 33 0a 20 20 49 4e 53 45 52 54 20 49 4e   --3.  INSERT IN
33a0: 54 4f 20 74 31 31 20 53 45 4c 45 43 54 20 72 61  TO t11 SELECT ra
33b0: 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 30 29 2c 20  ndomblob(5000), 
33c0: 4e 55 4c 4c 20 46 52 4f 4d 20 74 31 31 3b 20 2d  NULL FROM t11; -
33d0: 2d 34 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  -4.  INSERT INTO
33e0: 20 74 31 31 20 53 45 4c 45 43 54 20 72 61 6e 64   t11 SELECT rand
33f0: 6f 6d 62 6c 6f 62 28 35 30 30 30 29 2c 20 4e 55  omblob(5000), NU
3400: 4c 4c 20 46 52 4f 4d 20 74 31 31 3b 20 2d 2d 35  LL FROM t11; --5
3410: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
3420: 31 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  11 SELECT random
3430: 62 6c 6f 62 28 35 30 30 30 29 2c 20 4e 55 4c 4c  blob(5000), NULL
3440: 20 46 52 4f 4d 20 74 31 31 3b 20 2d 2d 36 0a 20   FROM t11; --6. 
3450: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31   INSERT INTO t11
3460: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
3470: 6f 62 28 35 30 30 30 29 2c 20 4e 55 4c 4c 20 46  ob(5000), NULL F
3480: 52 4f 4d 20 74 31 31 3b 20 2d 2d 37 0a 20 20 49  ROM t11; --7.  I
3490: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20 53  NSERT INTO t11 S
34a0: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
34b0: 28 35 30 30 30 29 2c 20 4e 55 4c 4c 20 46 52 4f  (5000), NULL FRO
34c0: 4d 20 74 31 31 3b 20 2d 2d 38 0a 20 20 49 4e 53  M t11; --8.  INS
34d0: 45 52 54 20 49 4e 54 4f 20 74 31 31 20 53 45 4c  ERT INTO t11 SEL
34e0: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 35  ECT randomblob(5
34f0: 30 30 30 29 2c 20 4e 55 4c 4c 20 46 52 4f 4d 20  000), NULL FROM 
3500: 74 31 31 3b 20 2d 2d 39 0a 20 20 55 50 44 41 54  t11; --9.  UPDAT
3510: 45 20 74 31 31 20 53 45 54 20 62 20 3d 20 63 6b  E t11 SET b = ck
3520: 73 75 6d 28 61 29 3b 0a 7d 0a 0a 66 6f 72 65 61  sum(a);.}..forea
3530: 63 68 20 7b 74 6e 20 6d 6d 61 70 5f 6c 69 6d 69  ch {tn mmap_limi
3540: 74 7d 20 7b 0a 20 20 31 20 30 0a 20 20 32 20 31  t} {.  1 0.  2 1
3550: 30 30 30 30 30 30 0a 7d 20 7b 0a 20 20 64 6f 5f  000000.} {.  do_
3560: 74 65 73 74 20 73 6f 72 74 2d 31 34 2e 24 74 6e  test sort-14.$tn
3570: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74   {.    sqlite3_t
3580: 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 53 51 4c 49  est_control SQLI
3590: 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54  TE_TESTCTRL_SORT
35a0: 45 52 5f 4d 4d 41 50 20 64 62 20 24 6d 6d 61 70  ER_MMAP db $mmap
35b0: 5f 6c 69 6d 69 74 0a 20 20 20 20 73 65 74 20 70  _limit.    set p
35c0: 72 65 76 20 22 22 0a 20 20 20 20 64 62 20 65 76  rev "".    db ev
35d0: 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  al { SELECT * FR
35e0: 4f 4d 20 74 31 31 20 4f 52 44 45 52 20 42 59 20  OM t11 ORDER BY 
35f0: 62 20 7d 20 7b 0a 20 20 20 20 20 20 69 66 20 7b  b } {.      if {
3600: 24 62 20 21 3d 20 5b 63 6b 73 75 6d 20 24 61 5d  $b != [cksum $a]
3610: 7d 20 7b 65 72 72 6f 72 20 22 63 68 65 63 6b 73  } {error "checks
3620: 75 6d 20 66 61 69 6c 65 64 22 7d 0a 20 20 20 20  um failed"}.    
3630: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 63 6f    if {[string co
3640: 6d 70 61 72 65 20 24 62 20 24 70 72 65 76 5d 20  mpare $b $prev] 
3650: 3c 20 30 7d 20 7b 65 72 72 6f 72 20 22 73 6f 72  < 0} {error "sor
3660: 74 20 66 61 69 6c 65 64 22 7d 0a 20 20 20 20 20  t failed"}.     
3670: 20 73 65 74 20 70 72 65 76 20 24 62 0a 20 20 20   set prev $b.   
3680: 20 7d 0a 20 20 20 20 73 65 74 20 7b 7d 20 7b 7d   }.    set {} {}
3690: 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  .  } {}.}..#----
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36e0: 2d 2d 2d 2d 2d 0a 23 0a 66 6f 72 65 61 63 68 20  -----.#.foreach 
36f0: 7b 74 6e 20 6d 6d 61 70 5f 6c 69 6d 69 74 20 6e  {tn mmap_limit n
3700: 57 6f 72 6b 65 72 20 74 6d 70 73 74 6f 72 65 20  Worker tmpstore 
3710: 63 6f 72 65 6d 75 74 65 78 20 66 61 6b 65 68 65  coremutex fakehe
3720: 61 70 20 73 6f 66 74 68 65 61 70 6c 69 6d 69 74  ap softheaplimit
3730: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 31 20  } {.          1 
3740: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
3750: 20 33 20 20 20 20 20 66 69 6c 65 20 20 20 20 20   3     file     
3760: 20 74 72 75 65 20 20 20 20 66 61 6c 73 65 20 20   true    false  
3770: 20 20 20 20 20 20 20 20 20 20 20 30 0a 20 20 20             0.   
3780: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
3790: 20 20 30 20 20 20 20 20 20 20 33 20 20 20 20 20    0       3     
37a0: 66 69 6c 65 20 20 20 20 20 20 74 72 75 65 20 20  file      true  
37b0: 20 20 20 74 72 75 65 20 20 20 20 20 20 20 20 20     true         
37c0: 20 20 20 20 30 0a 20 20 20 20 20 20 20 20 20 20      0.          
37d0: 33 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20  3          0    
37e0: 20 20 20 30 20 20 20 20 20 66 69 6c 65 20 20 20     0     file   
37f0: 20 20 20 74 72 75 65 20 20 20 20 66 61 6c 73 65     true    false
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 20               0. 
3810: 20 20 20 20 20 20 20 20 20 34 20 20 20 20 31 30           4    10
3820: 30 30 30 30 30 20 20 20 20 20 20 20 33 20 20 20  00000       3   
3830: 20 20 66 69 6c 65 20 20 20 20 20 20 74 72 75 65    file      true
3840: 20 20 20 20 66 61 6c 73 65 20 20 20 20 20 20 20      false       
3850: 20 20 20 20 20 20 30 0a 20 20 20 20 20 20 20 20        0.        
3860: 20 20 35 20 20 20 20 20 20 20 20 20 20 30 20 20    5          0  
3870: 20 20 20 20 20 30 20 20 20 6d 65 6d 6f 72 79 20       0   memory 
3880: 20 20 20 20 66 61 6c 73 65 20 20 20 20 20 74 72      false     tr
3890: 75 65 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ue             0
38a0: 0a 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20  .          6    
38b0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 30 20        0       0 
38c0: 20 20 20 20 66 69 6c 65 20 20 20 20 20 66 61 6c      file     fal
38d0: 73 65 20 20 20 20 20 74 72 75 65 20 20 20 20 20  se     true     
38e0: 20 20 31 30 30 30 30 30 30 20 20 20 20 20 0a 20    1000000     . 
38f0: 20 20 20 20 20 20 20 20 20 37 20 20 20 20 20 20           7      
3900: 20 20 20 20 30 20 20 20 20 20 20 20 30 20 20 20      0       0   
3910: 20 20 66 69 6c 65 20 20 20 20 20 66 61 6c 73 65    file     false
3920: 20 20 20 20 20 74 72 75 65 20 20 20 20 20 20 20       true       
3930: 20 20 31 30 30 30 30 0a 7d 20 7b 0a 20 20 64 62    10000.} {.  db
3940: 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33   close.  sqlite3
3950: 5f 73 68 75 74 64 6f 77 6e 0a 20 20 69 66 20 7b  _shutdown.  if {
3960: 24 63 6f 72 65 6d 75 74 65 78 7d 20 7b 0a 20 20  $coremutex} {.  
3970: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
3980: 20 6d 75 6c 74 69 74 68 72 65 61 64 0a 20 20 7d   multithread.  }
3990: 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 71 6c 69   else {.    sqli
39a0: 74 65 33 5f 63 6f 6e 66 69 67 20 73 69 6e 67 6c  te3_config singl
39b0: 65 74 68 72 65 61 64 0a 20 20 7d 0a 20 20 73 71  ethread.  }.  sq
39c0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
39d0: 0a 20 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 66  .  sorter_test_f
39e0: 61 6b 65 68 65 61 70 20 24 66 61 6b 65 68 65 61  akeheap $fakehea
39f0: 70 0a 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74  p.  sqlite3_soft
3a00: 5f 68 65 61 70 5f 6c 69 6d 69 74 20 24 73 6f 66  _heap_limit $sof
3a10: 74 68 65 61 70 6c 69 6d 69 74 0a 0a 20 20 72 65  theaplimit..  re
3a20: 73 65 74 5f 64 62 0a 20 20 73 71 6c 69 74 65 33  set_db.  sqlite3
3a30: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 53 51  _test_control SQ
3a40: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
3a50: 52 54 45 52 5f 4d 4d 41 50 20 64 62 20 24 6d 6d  RTER_MMAP db $mm
3a60: 61 70 5f 6c 69 6d 69 74 0a 20 20 65 78 65 63 73  ap_limit.  execs
3a70: 71 6c 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f  ql "PRAGMA temp_
3a80: 73 74 6f 72 65 20 3d 20 24 74 6d 70 73 74 6f 72  store = $tmpstor
3a90: 65 3b 20 50 52 41 47 4d 41 20 74 68 72 65 61 64  e; PRAGMA thread
3aa0: 73 20 3d 20 24 6e 57 6f 72 6b 65 72 22 0a 20 20  s = $nWorker".  
3ab0: 0a 20 20 0a 20 20 73 65 74 20 74 65 6e 20 5b 73  .  .  set ten [s
3ac0: 74 72 69 6e 67 20 72 65 70 65 61 74 20 58 20 31  tring repeat X 1
3ad0: 30 33 30 30 5d 0a 20 20 73 65 74 20 6f 6e 65 20  0300].  set one 
3ae0: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 79  [string repeat y
3af0: 20 20 20 32 30 30 5d 0a 0a 20 20 69 66 20 7b 24     200]..  if {$
3b00: 73 6f 66 74 68 65 61 70 6c 69 6d 69 74 7d 20 7b  softheaplimit} {
3b10: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
3b20: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
3b30: 20 3d 20 32 30 20 7d 3b 0a 20 20 7d 20 65 6c 73   = 20 };.  } els
3b40: 65 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  e {.    execsql 
3b50: 7b 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73  { PRAGMA cache_s
3b60: 69 7a 65 20 3d 20 35 20 7d 3b 0a 20 20 7d 0a 0a  ize = 5 };.  }..
3b70: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
3b80: 74 20 31 35 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  t 15.$tn.1 {.   
3b90: 20 57 49 54 48 20 72 72 20 41 53 20 28 0a 20 20   WITH rr AS (.  
3ba0: 20 20 20 20 53 45 4c 45 43 54 20 34 2c 20 24 74      SELECT 4, $t
3bb0: 65 6e 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20  en UNION ALL.   
3bc0: 20 20 20 53 45 4c 45 43 54 20 32 2c 20 24 6f 6e     SELECT 2, $on
3bd0: 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20  e UNION ALL.    
3be0: 20 20 53 45 4c 45 43 54 20 31 2c 20 24 74 65 6e    SELECT 1, $ten
3bf0: 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 20 20 20   UNION ALL.     
3c00: 20 53 45 4c 45 43 54 20 33 2c 20 24 6f 6e 65 0a   SELECT 3, $one.
3c10: 20 20 20 20 29 0a 20 20 20 20 53 45 4c 45 43 54      ).    SELECT
3c20: 20 2a 20 46 52 4f 4d 20 72 72 20 4f 52 44 45 52   * FROM rr ORDER
3c30: 20 42 59 20 31 3b 0a 20 20 7d 20 5b 6c 69 73 74   BY 1;.  } [list
3c40: 20 31 20 24 74 65 6e 20 32 20 24 6f 6e 65 20 33   1 $ten 2 $one 3
3c50: 20 24 6f 6e 65 20 34 20 24 74 65 6e 5d 0a 0a 20   $one 4 $ten].. 
3c60: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
3c70: 20 31 35 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20   15.$tn.2 {.    
3c80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
3c90: 61 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  a);.    INSERT I
3ca0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 29  NTO t1 VALUES(4)
3cb0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
3cc0: 4f 20 74 31 20 56 41 4c 55 45 53 28 35 29 3b 0a  O t1 VALUES(5);.
3cd0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3ce0: 74 31 20 56 41 4c 55 45 53 28 33 29 3b 0a 20 20  t1 VALUES(3);.  
3cf0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3d00: 20 56 41 4c 55 45 53 28 32 29 3b 0a 20 20 20 20   VALUES(2);.    
3d10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3d20: 41 4c 55 45 53 28 36 29 3b 0a 20 20 20 20 49 4e  ALUES(6);.    IN
3d30: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3d40: 55 45 53 28 31 29 3b 0a 20 20 20 20 43 52 45 41  UES(1);.    CREA
3d50: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
3d60: 31 28 61 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  1(a);.    SELECT
3d70: 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52   * FROM t1 ORDER
3d80: 20 42 59 20 61 3b 0a 20 20 7d 20 7b 31 20 32 20   BY a;.  } {1 2 
3d90: 33 20 34 20 35 20 36 7d 0a 0a 20 20 64 6f 5f 65  3 4 5 6}..  do_e
3da0: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 35 2e 24  xecsql_test 15.$
3db0: 74 6e 2e 33 20 7b 0a 20 20 20 20 57 49 54 48 20  tn.3 {.    WITH 
3dc0: 72 72 20 41 53 20 28 0a 20 20 20 20 20 20 53 45  rr AS (.      SE
3dd0: 4c 45 43 54 20 34 2c 20 24 74 65 6e 20 55 4e 49  LECT 4, $ten UNI
3de0: 4f 4e 20 41 4c 4c 0a 20 20 20 20 20 20 53 45 4c  ON ALL.      SEL
3df0: 45 43 54 20 32 2c 20 24 6f 6e 65 0a 20 20 20 20  ECT 2, $one.    
3e00: 29 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ).    SELECT * F
3e10: 52 4f 4d 20 72 72 20 4f 52 44 45 52 20 42 59 20  ROM rr ORDER BY 
3e20: 31 3b 0a 20 20 7d 20 5b 6c 69 73 74 20 32 20 24  1;.  } [list 2 $
3e30: 6f 6e 65 20 34 20 24 74 65 6e 5d 0a 0a 20 20 73  one 4 $ten]..  s
3e40: 6f 72 74 65 72 5f 74 65 73 74 5f 66 61 6b 65 68  orter_test_fakeh
3e50: 65 61 70 20 30 0a 7d 0a 0a 64 62 20 63 6c 6f 73  eap 0.}..db clos
3e60: 65 0a 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  e.sqlite3_shutdo
3e70: 77 6e 0a 73 65 74 20 74 28 30 29 20 73 69 6e 67  wn.set t(0) sing
3e80: 6c 65 74 68 72 65 61 64 0a 73 65 74 20 74 28 31  lethread.set t(1
3e90: 29 20 6d 75 6c 74 69 74 68 72 65 61 64 0a 73 65  ) multithread.se
3ea0: 74 20 74 28 32 29 20 73 65 72 69 61 6c 69 7a 65  t t(2) serialize
3eb0: 64 0a 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  d.sqlite3_config
3ec0: 20 24 74 28 24 73 71 6c 69 74 65 5f 6f 70 74 69   $t($sqlite_opti
3ed0: 6f 6e 73 28 74 68 72 65 61 64 73 61 66 65 29 29  ons(threadsafe))
3ee0: 0a 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c  .sqlite3_initial
3ef0: 69 7a 65 0a 73 71 6c 69 74 65 33 5f 73 6f 66 74  ize.sqlite3_soft
3f00: 5f 68 65 61 70 5f 6c 69 6d 69 74 20 30 0a 0a 72  _heap_limit 0..r
3f10: 65 73 65 74 5f 64 62 0a 64 6f 5f 63 61 74 63 68  eset_db.do_catch
3f20: 73 71 6c 5f 74 65 73 74 20 31 36 2e 31 20 7b 0a  sql_test 16.1 {.
3f30: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
3f40: 31 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 49 4e  1(a, b, c);.  IN
3f50: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3f60: 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20  UES(1, 2, 3);.  
3f70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3f80: 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 2c 20 33  ALUES(1, NULL, 3
3f90: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
3fa0: 20 74 31 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c   t1 VALUES(NULL,
3fb0: 20 32 2c 20 33 29 3b 0a 20 20 49 4e 53 45 52 54   2, 3);.  INSERT
3fc0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
3fd0: 31 2c 20 32 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49  1, 2, NULL);.  I
3fe0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
3ff0: 4c 55 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a 20  LUES(4, 5, 6);. 
4000: 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49   CREATE UNIQUE I
4010: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 2c  NDEX i1 ON t1(b,
4020: 20 61 2c 20 63 29 3b 0a 7d 20 7b 30 20 7b 7d 7d   a, c);.} {0 {}}
4030: 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f 63 61 74  .reset_db.do_cat
4040: 63 68 73 71 6c 5f 74 65 73 74 20 31 36 2e 32 20  chsql_test 16.2 
4050: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
4060: 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20   t1(a, b, c);.  
4070: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4080: 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a  ALUES(1, 2, 3);.
4090: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
40a0: 20 56 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 2c   VALUES(1, NULL,
40b0: 20 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   3);.  INSERT IN
40c0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
40d0: 32 2c 20 33 29 3b 0a 20 20 49 4e 53 45 52 54 20  2, 3);.  INSERT 
40e0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
40f0: 2c 20 32 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e  , 2, NULL);.  IN
4100: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4110: 55 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a 20 20  UES(4, 5, 6);.  
4120: 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e  CREATE UNIQUE IN
4130: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 62 2c 20  DEX i1 ON t1(b, 
4140: 61 2c 20 63 29 3b 0a 7d 20 7b 31 20 7b 55 4e 49  a, c);.} {1 {UNI
4150: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  QUE constraint f
4160: 61 69 6c 65 64 3a 20 74 31 2e 62 2c 20 74 31 2e  ailed: t1.b, t1.
4170: 61 2c 20 74 31 2e 63 7d 7d 0a 0a 72 65 73 65 74  a, t1.c}}..reset
4180: 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  _db.do_execsql_t
4190: 65 73 74 20 31 37 2e 31 20 7b 0a 20 20 53 45 4c  est 17.1 {.  SEL
41a0: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
41b0: 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42  e_master ORDER B
41c0: 59 20 73 71 6c 3b 0a 7d 20 7b 7d 0a 0a 66 69 6e  Y sql;.} {}..fin
41d0: 69 73 68 5f 74 65 73 74 0a                       ish_test.