/ Hex Artifact Content
Login

Artifact 6c37d85f7cd28d50cce222fcab84ccd771e105cb:


0000: 23 20 32 30 31 34 20 4d 61 79 20 36 2e 0a 23 0a  # 2014 May 6..#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou 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 2a 0a 23 20 54 68 69 73 20 66 69 6c 65 20  ***.# This file 
0170: 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72 65  implements regre
0180: 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72 20  ssion tests for 
0190: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01a0: 0a 23 0a 23 20 54 68 65 20 74 65 73 74 73 20 69  .#.# The tests i
01b0: 6e 20 74 68 69 73 20 66 69 6c 65 20 61 72 65 20  n this file are 
01c0: 62 72 75 74 65 20 66 6f 72 63 65 20 74 65 73 74  brute force test
01d0: 73 20 6f 66 20 74 68 65 20 6d 75 6c 74 69 2d 74  s of the multi-t
01e0: 68 72 65 61 64 65 64 0a 23 20 73 6f 72 74 65 72  hreaded.# sorter
01f0: 2e 0a 23 0a 0a 73 65 74 20 74 65 73 74 64 69 72  ..#..set testdir
0200: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
0210: 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74  argv0].source $t
0220: 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63  estdir/tester.tc
0230: 6c 0a 73 65 74 20 74 65 73 74 70 72 65 66 69 78  l.set testprefix
0240: 20 73 6f 72 74 34 0a 0a 23 20 43 6f 6e 66 69 67   sort4..# Config
0250: 75 72 65 20 74 68 65 20 73 6f 72 74 65 72 20 74  ure the sorter t
0260: 6f 20 75 73 65 20 33 20 62 61 63 6b 67 72 6f 75  o use 3 backgrou
0270: 6e 64 20 74 68 72 65 61 64 73 2e 0a 64 62 20 65  nd threads..db e
0280: 76 61 6c 20 7b 50 52 41 47 4d 41 20 74 68 72 65  val {PRAGMA thre
0290: 61 64 73 3d 33 7d 0a 0a 23 20 4d 69 6e 69 6d 75  ads=3}..# Minimu
02a0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  m number of seco
02b0: 6e 64 73 20 74 6f 20 72 75 6e 20 66 6f 72 2e 20  nds to run for. 
02c0: 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  If the value is 
02d0: 30 2c 20 65 61 63 68 20 74 65 73 74 0a 23 20 69  0, each test.# i
02e0: 73 20 72 75 6e 20 65 78 61 63 74 6c 79 20 6f 6e  s run exactly on
02f0: 63 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ce. Otherwise, t
0300: 65 73 74 73 20 61 72 65 20 72 65 70 65 61 74 65  ests are repeate
0310: 64 20 75 6e 74 69 6c 20 74 68 65 20 74 69 6d 65  d until the time
0320: 6f 75 74 0a 23 20 65 78 70 69 72 65 73 2e 0a 73  out.# expires..s
0330: 65 74 20 53 4f 52 54 34 54 49 4d 45 4f 55 54 20  et SORT4TIMEOUT 
0340: 30 0a 69 66 20 7b 5b 70 65 72 6d 75 74 61 74 69  0.if {[permutati
0350: 6f 6e 5d 20 3d 3d 20 22 6d 75 6c 74 69 74 68 72  on] == "multithr
0360: 65 61 64 22 7d 20 7b 20 73 65 74 20 53 4f 52 54  ead"} { set SORT
0370: 34 54 49 4d 45 4f 55 54 20 33 30 30 20 7d 0a 0a  4TIMEOUT 300 }..
0380: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03c0: 2d 2d 2d 2d 2d 0a 23 20 53 65 74 20 75 70 20 61  -----.# Set up a
03d0: 20 74 61 62 6c 65 20 22 74 31 22 20 63 6f 6e 74   table "t1" cont
03e0: 61 69 6e 69 6e 67 20 24 6e 52 6f 77 20 72 6f 77  aining $nRow row
03f0: 73 2e 20 45 61 63 68 20 72 6f 77 20 63 6f 6e 74  s. Each row cont
0400: 61 69 6e 73 20 61 6c 73 6f 0a 23 20 63 6f 6e 74  ains also.# cont
0410: 61 69 6e 73 20 62 6c 6f 62 20 66 69 65 6c 64 73  ains blob fields
0420: 20 74 68 61 74 20 63 6f 6c 6c 65 63 74 69 76 65   that collective
0430: 6c 79 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65  ly contain at le
0440: 61 73 74 20 24 6e 50 61 79 6c 6f 61 64 20 0a 23  ast $nPayload .#
0450: 20 62 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   bytes of conten
0460: 74 2e 20 54 68 65 20 74 61 62 6c 65 20 73 63 68  t. The table sch
0470: 65 6d 61 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  ema is as follow
0480: 73 3a 0a 23 0a 23 20 20 20 43 52 45 41 54 45 20  s:.#.#   CREATE 
0490: 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47  TABLE t1(a INTEG
04a0: 45 52 2c 20 3c 65 78 74 72 61 2d 63 6f 6c 75 6d  ER, <extra-colum
04b0: 6e 73 3e 2c 20 62 20 49 4e 54 45 47 45 52 29 3b  ns>, b INTEGER);
04c0: 0a 23 0a 23 20 46 6f 72 20 65 61 63 68 20 72 6f  .#.# For each ro
04d0: 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  w, the values of
04e0: 20 63 6f 6c 75 6d 6e 73 20 22 61 22 20 61 6e 64   columns "a" and
04f0: 20 22 62 22 20 61 72 65 20 73 65 74 20 74 6f 20   "b" are set to 
0500: 74 68 65 20 73 61 6d 65 0a 23 20 70 73 65 75 64  the same.# pseud
0510: 6f 2d 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63  o-randomly selec
0520: 74 65 64 20 69 6e 74 65 67 65 72 2e 20 54 68 65  ted integer. The
0530: 20 22 65 78 74 72 61 2d 63 6f 6c 75 6d 6e 73 22   "extra-columns"
0540: 2c 20 6f 66 20 77 68 69 63 68 20 74 68 65 72 65  , of which there
0550: 0a 23 20 61 72 65 20 61 74 20 6d 6f 73 74 20 65  .# are at most e
0560: 69 67 68 74 2c 20 61 72 65 20 6e 61 6d 65 64 20  ight, are named 
0570: 63 30 2c 20 63 31 2c 20 63 32 20 65 74 63 2e 20  c0, c1, c2 etc. 
0580: 43 6f 6c 75 6d 6e 20 63 30 20 63 6f 6e 74 61 69  Column c0 contai
0590: 6e 73 20 61 20 34 0a 23 20 62 79 74 65 20 73 74  ns a 4.# byte st
05a0: 72 69 6e 67 2e 20 43 6f 6c 75 6d 6e 20 63 31 20  ring. Column c1 
05b0: 61 6e 20 38 20 62 79 74 65 20 73 74 72 69 6e 67  an 8 byte string
05c0: 2e 20 46 69 65 6c 64 20 63 32 20 31 36 20 62 79  . Field c2 16 by
05d0: 74 65 73 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a  tes, and so on..
05e0: 23 0a 23 20 54 68 69 73 20 74 61 62 6c 65 20 69  #.# This table i
05f0: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
0600: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
0610: 67 20 71 75 65 72 69 65 73 20 6f 66 20 74 68 65  g queries of the
0620: 20 66 6f 72 6d 3a 20 0a 23 0a 23 20 20 20 53 45   form: .#.#   SE
0630: 4c 45 43 54 20 61 2c 20 3c 63 6f 6c 73 3e 2c 20  LECT a, <cols>, 
0640: 62 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  b FROM t1 ORDER 
0650: 42 59 20 61 3b 0a 23 0a 23 20 54 68 65 20 74 65  BY a;.#.# The te
0660: 73 74 20 63 6f 64 65 20 63 68 65 63 6b 73 20 74  st code checks t
0670: 68 61 74 20 72 6f 77 73 20 61 72 65 20 72 65 74  hat rows are ret
0680: 75 72 6e 65 64 20 69 6e 20 6f 72 64 65 72 2c 20  urned in order, 
0690: 61 6e 64 20 74 68 61 74 20 74 68 65 20 0a 23 20  and that the .# 
06a0: 76 61 6c 75 65 73 20 6f 66 20 22 61 22 20 61 6e  values of "a" an
06b0: 64 20 22 62 22 20 61 72 65 20 74 68 65 20 73 61  d "b" are the sa
06c0: 6d 65 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  me for each row 
06d0: 28 74 68 65 20 69 64 65 61 20 62 65 69 6e 67 20  (the idea being 
06e0: 74 68 61 74 0a 23 20 69 66 20 66 69 65 6c 64 20  that.# if field 
06f0: 22 62 22 20 61 74 20 74 68 65 20 65 6e 64 20 6f  "b" at the end o
0700: 66 20 74 68 65 20 73 6f 72 74 65 72 20 72 65 63  f the sorter rec
0710: 6f 72 64 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ord has not been
0720: 20 63 6f 72 72 75 70 74 65 64 2c 20 0a 23 20 74   corrupted, .# t
0730: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 72  he rest of the r
0740: 65 63 6f 72 64 20 69 73 20 70 72 6f 62 61 62 6c  ecord is probabl
0750: 79 20 4f 6b 20 61 73 20 77 65 6c 6c 29 2e 0a 23  y Ok as well)..#
0760: 0a 70 72 6f 63 20 70 6f 70 75 6c 61 74 65 5f 74  .proc populate_t
0770: 61 62 6c 65 20 7b 6e 52 6f 77 20 6e 50 61 79 6c  able {nRow nPayl
0780: 6f 61 64 7d 20 7b 0a 20 20 73 65 74 20 6e 43 6f  oad} {.  set nCo
0790: 6c 20 30 0a 0a 20 20 73 65 74 20 6e 20 30 0a 20  l 0..  set n 0. 
07a0: 20 66 6f 72 20 7b 73 65 74 20 6e 43 6f 6c 20 30   for {set nCol 0
07b0: 7d 20 7b 24 6e 20 3c 20 24 6e 50 61 79 6c 6f 61  } {$n < $nPayloa
07c0: 64 7d 20 7b 69 6e 63 72 20 6e 43 6f 6c 7d 20 7b  d} {incr nCol} {
07d0: 0a 20 20 20 20 69 6e 63 72 20 6e 20 5b 65 78 70  .    incr n [exp
07e0: 72 20 28 34 20 3c 3c 20 24 6e 43 6f 6c 29 5d 0a  r (4 << $nCol)].
07f0: 20 20 7d 0a 0a 20 20 73 65 74 20 63 6f 6c 73 20    }..  set cols 
0800: 5b 6c 72 61 6e 67 65 20 5b 6c 69 73 74 20 78 78  [lrange [list xx
0810: 78 20 63 30 20 63 31 20 63 32 20 63 33 20 63 34  x c0 c1 c2 c3 c4
0820: 20 63 35 20 63 36 20 63 37 5d 20 31 20 24 6e 43   c5 c6 c7] 1 $nC
0830: 6f 6c 5d 0a 20 20 73 65 74 20 64 61 74 61 20 5b  ol].  set data [
0840: 6c 72 61 6e 67 65 20 5b 6c 69 73 74 20 78 78 78  lrange [list xxx
0850: 20 5c 0a 20 20 20 20 20 20 72 61 6e 64 6f 6d 62   \.      randomb
0860: 6c 6f 62 28 34 29 20 72 61 6e 64 6f 6d 62 6c 6f  lob(4) randomblo
0870: 62 28 38 29 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  b(8) randomblob(
0880: 31 36 29 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 33  16) randomblob(3
0890: 32 29 20 5c 0a 20 20 20 20 20 20 72 61 6e 64 6f  2) \.      rando
08a0: 6d 62 6c 6f 62 28 36 34 29 20 72 61 6e 64 6f 6d  mblob(64) random
08b0: 62 6c 6f 62 28 31 32 38 29 20 72 61 6e 64 6f 6d  blob(128) random
08c0: 62 6c 6f 62 28 32 35 36 29 20 72 61 6e 64 6f 6d  blob(256) random
08d0: 62 6c 6f 62 28 35 31 32 29 20 5c 0a 20 20 5d 20  blob(512) \.  ] 
08e0: 31 20 24 6e 43 6f 6c 5d 0a 0a 20 20 65 78 65 63  1 $nCol]..  exec
08f0: 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45  sql { DROP TABLE
0900: 20 49 46 20 45 58 49 53 54 53 20 74 31 20 7d 0a   IF EXISTS t1 }.
0910: 0a 20 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f  .  db transactio
0920: 6e 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  n {.    execsql 
0930: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  "CREATE TABLE t1
0940: 28 61 2c 20 5b 6a 6f 69 6e 20 24 63 6f 6c 73 20  (a, [join $cols 
0950: 2c 5d 2c 20 62 29 3b 22 0a 20 20 20 20 73 65 74  ,], b);".    set
0960: 20 69 6e 73 65 72 74 20 22 49 4e 53 45 52 54 20   insert "INSERT 
0970: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 3a  INTO t1 VALUES(:
0980: 6b 2c 20 5b 6a 6f 69 6e 20 24 64 61 74 61 20 2c  k, [join $data ,
0990: 5d 2c 20 3a 6b 29 22 0a 20 20 20 20 66 6f 72 20  ], :k)".    for 
09a0: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20  {set i 0} {$i < 
09b0: 24 6e 52 6f 77 7d 20 7b 69 6e 63 72 20 69 7d 20  $nRow} {incr i} 
09c0: 7b 0a 20 20 20 20 20 20 73 65 74 20 6b 20 5b 65  {.      set k [e
09d0: 78 70 72 20 69 6e 74 28 72 61 6e 64 28 29 2a 31  xpr int(rand()*1
09e0: 30 30 30 30 30 30 30 30 30 29 5d 0a 20 20 20 20  000000000)].    
09f0: 20 20 65 78 65 63 73 71 6c 20 24 69 6e 73 65 72    execsql $inser
0a00: 74 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  t.    }.  }.}..#
0a10: 20 48 65 6c 70 65 72 20 66 6f 72 20 5b 64 6f 5f   Helper for [do_
0a20: 73 6f 72 74 65 72 5f 74 65 73 74 5d 0a 23 0a 70  sorter_test].#.p
0a30: 72 6f 63 20 73 6f 72 74 65 72 5f 74 65 73 74 20  roc sorter_test 
0a40: 7b 6e 52 6f 77 20 6e 52 65 61 64 20 6e 50 61 79  {nRow nRead nPay
0a50: 6c 6f 61 64 7d 20 7b 0a 20 20 73 65 74 20 72 65  load} {.  set re
0a60: 73 20 5b 6c 69 73 74 5d 0a 0a 20 20 73 65 74 20  s [list]..  set 
0a70: 6e 4c 6f 61 64 20 5b 65 78 70 72 20 28 24 6e 52  nLoad [expr ($nR
0a80: 6f 77 20 3e 20 24 6e 52 65 61 64 29 20 3f 20 24  ow > $nRead) ? $
0a90: 6e 52 65 61 64 20 3a 20 24 6e 52 6f 77 5d 0a 0a  nRead : $nRow]..
0aa0: 20 20 73 65 74 20 6e 50 61 79 6c 6f 61 64 20 5b    set nPayload [
0ab0: 65 78 70 72 20 28 28 24 6e 50 61 79 6c 6f 61 64  expr (($nPayload
0ac0: 2b 33 29 2f 34 29 20 2a 20 34 5d 0a 20 20 73 65  +3)/4) * 4].  se
0ad0: 74 20 63 6f 6c 73 20 5b 6c 69 73 74 5d 0a 20 20  t cols [list].  
0ae0: 66 6f 72 65 61 63 68 20 7b 6d 61 73 6b 20 63 6f  foreach {mask co
0af0: 6c 7d 20 7b 20 0a 20 20 20 20 30 78 30 34 20 20  l} { .    0x04  
0b00: 63 30 20 30 78 30 38 20 20 63 31 20 30 78 31 30  c0 0x08  c1 0x10
0b10: 20 20 63 32 20 30 78 32 30 20 20 63 33 20 0a 20    c2 0x20  c3 . 
0b20: 20 20 20 30 78 34 30 20 20 63 34 20 30 78 38 30     0x40  c4 0x80
0b30: 20 20 63 35 20 30 78 31 30 30 20 63 36 20 30 78    c5 0x100 c6 0x
0b40: 32 30 30 20 63 37 20 0a 20 20 7d 20 7b 0a 20 20  200 c7 .  } {.  
0b50: 20 20 69 66 20 7b 24 6e 50 61 79 6c 6f 61 64 20    if {$nPayload 
0b60: 26 20 24 6d 61 73 6b 7d 20 7b 20 6c 61 70 70 65  & $mask} { lappe
0b70: 6e 64 20 63 6f 6c 73 20 24 63 6f 6c 20 7d 0a 20  nd cols $col }. 
0b80: 20 7d 0a 0a 20 20 23 20 43 72 65 61 74 65 20 74   }..  # Create t
0b90: 77 6f 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  wo SELECT statem
0ba0: 65 6e 74 73 2e 20 53 74 61 74 65 6d 65 6e 74 20  ents. Statement 
0bb0: 24 73 71 6c 31 20 75 73 65 73 20 74 68 65 20 73  $sql1 uses the s
0bc0: 6f 72 74 65 72 20 74 6f 20 73 6f 72 74 0a 20 20  orter to sort.  
0bd0: 23 20 24 6e 52 6f 77 20 72 65 63 6f 72 64 73 20  # $nRow records 
0be0: 6f 66 20 61 20 62 69 74 20 6f 76 65 72 20 24 6e  of a bit over $n
0bf0: 50 61 79 6c 6f 61 64 20 62 79 74 65 73 20 65 61  Payload bytes ea
0c00: 63 68 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ch read from the
0c10: 20 22 74 31 22 0a 20 20 23 20 74 61 62 6c 65 20   "t1".  # table 
0c20: 63 72 65 61 74 65 64 20 62 79 20 5b 70 6f 70 75  created by [popu
0c30: 6c 61 74 65 5f 74 61 62 6c 65 5d 20 70 72 6f 63  late_table] proc
0c40: 20 61 62 6f 76 65 2e 20 52 6f 77 73 20 61 72 65   above. Rows are
0c50: 20 73 6f 72 74 65 64 20 69 6e 20 6f 72 64 65 72   sorted in order
0c60: 0a 20 20 23 20 6f 66 20 74 68 65 20 69 6e 74 65  .  # of the inte
0c70: 67 65 72 20 66 69 65 6c 64 20 69 6e 20 65 61 63  ger field in eac
0c80: 68 20 22 74 31 22 20 72 65 63 6f 72 64 2e 0a 20  h "t1" record.. 
0c90: 20 23 0a 20 20 23 20 54 68 65 20 73 65 63 6f 6e   #.  # The secon
0ca0: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  d SQL statement 
0cb0: 73 6f 72 74 73 20 74 68 65 20 73 61 6d 65 20 73  sorts the same s
0cc0: 65 74 20 6f 66 20 72 6f 77 73 20 61 73 20 74 68  et of rows as th
0cd0: 65 20 66 69 72 73 74 2c 20 62 75 74 0a 20 20 23  e first, but.  #
0ce0: 20 75 73 65 73 20 61 20 4c 49 4d 49 54 20 63 6c   uses a LIMIT cl
0cf0: 61 75 73 65 2c 20 63 61 75 73 69 6e 67 20 53 51  ause, causing SQ
0d00: 4c 69 74 65 20 74 6f 20 75 73 65 20 61 20 74 65  Lite to use a te
0d10: 6d 70 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  mp table instead
0d20: 20 6f 66 20 74 68 65 0a 20 20 23 20 73 6f 72 74   of the.  # sort
0d30: 65 72 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 0a  er for sorting..
0d40: 20 20 23 0a 20 20 73 65 74 20 73 71 6c 31 20 22    #.  set sql1 "
0d50: 53 45 4c 45 43 54 20 61 2c 20 5b 6a 6f 69 6e 20  SELECT a, [join 
0d60: 24 63 6f 6c 73 20 2c 5d 2c 20 62 20 46 52 4f 4d  $cols ,], b FROM
0d70: 20 74 31 20 57 48 45 52 45 20 72 6f 77 69 64 3c   t1 WHERE rowid<
0d80: 3d 24 6e 52 6f 77 20 4f 52 44 45 52 20 42 59 20  =$nRow ORDER BY 
0d90: 61 22 0a 20 20 73 65 74 20 73 71 6c 32 20 22 53  a".  set sql2 "S
0da0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
0db0: 57 48 45 52 45 20 72 6f 77 69 64 3c 3d 24 6e 52  WHERE rowid<=$nR
0dc0: 6f 77 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49  ow ORDER BY a LI
0dd0: 4d 49 54 20 24 6e 52 65 61 64 22 0a 0a 20 20 23  MIT $nRead"..  #
0de0: 20 50 61 73 73 20 74 68 65 20 74 77 6f 20 53 51   Pass the two SQ
0df0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  L statements to 
0e00: 61 20 68 65 6c 70 65 72 20 63 6f 6d 6d 61 6e 64  a helper command
0e10: 20 77 72 69 74 74 65 6e 20 69 6e 20 43 2e 20 54   written in C. T
0e20: 68 69 73 0a 20 20 23 20 63 6f 6d 6d 61 6e 64 20  his.  # command 
0e30: 73 74 65 70 73 20 73 74 61 74 65 6d 65 6e 74 20  steps statement 
0e40: 24 73 71 6c 31 20 24 6e 52 65 61 64 20 74 69 6d  $sql1 $nRead tim
0e50: 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20  es and compares 
0e60: 74 68 65 20 69 6e 74 65 67 65 72 0a 20 20 23 20  the integer.  # 
0e70: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 72 6f  values in the ro
0e80: 77 73 20 72 65 74 75 72 6e 65 64 20 77 69 74 68  ws returned with
0e90: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
0ea0: 65 78 65 63 75 74 69 6e 67 20 24 73 71 6c 32 2e  executing $sql2.
0eb0: 20 49 66 0a 20 20 23 20 74 68 65 20 63 6f 6d 70   If.  # the comp
0ec0: 61 72 69 73 6f 6e 20 66 61 69 6c 73 20 28 69 6e  arison fails (in
0ed0: 64 69 63 61 74 69 6e 67 20 73 6f 6d 65 20 62 75  dicating some bu
0ee0: 67 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 29  g in the sorter)
0ef0: 2c 20 61 20 54 63 6c 0a 20 20 23 20 65 78 63 65  , a Tcl.  # exce
0f00: 70 74 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e  ption is thrown.
0f10: 0a 20 20 23 0a 20 20 73 6f 72 74 65 72 5f 74 65  .  #.  sorter_te
0f20: 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 20  st_sort4_helper 
0f30: 64 62 20 24 73 71 6c 31 20 24 6e 52 65 61 64 20  db $sql1 $nRead 
0f40: 24 73 71 6c 32 0a 20 20 73 65 74 20 7b 7d 20 7b  $sql2.  set {} {
0f50: 7d 20 0a 7d 0a 0a 23 20 55 73 61 67 65 3a 0a 23  } .}..# Usage:.#
0f60: 0a 23 20 20 20 64 6f 5f 73 6f 72 74 65 72 5f 74  .#   do_sorter_t
0f70: 65 73 74 20 3c 74 65 73 74 6e 61 6d 65 3e 20 3c  est <testname> <
0f80: 61 72 67 73 3e 2e 2e 2e 0a 23 0a 23 20 77 68 65  args>....#.# whe
0f90: 72 65 20 3c 61 72 67 73 3e 20 61 72 65 20 61 6e  re <args> are an
0fa0: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
0fb0: 6e 67 20 73 77 69 74 63 68 65 73 3a 0a 23 0a 23  ng switches:.#.#
0fc0: 20 20 20 2d 72 6f 77 73 20 4e 20 20 20 20 20 20     -rows N      
0fd0: 20 20 20 20 28 6e 75 6d 62 65 72 20 6f 66 20 72      (number of r
0fe0: 6f 77 73 20 74 6f 20 68 61 76 65 20 73 6f 72 74  ows to have sort
0ff0: 65 72 20 73 6f 72 74 29 0a 23 20 20 20 2d 72 65  er sort).#   -re
1000: 61 64 20 4e 20 20 20 20 20 20 20 20 20 20 28 6e  ad N          (n
1010: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f  umber of rows to
1020: 20 72 65 61 64 20 6f 75 74 20 6f 66 20 73 6f 72   read out of sor
1030: 74 65 72 29 0a 23 20 20 20 2d 70 61 79 6c 6f 61  ter).#   -payloa
1040: 64 20 4e 20 20 20 20 20 20 20 28 62 79 74 65 73  d N       (bytes
1050: 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 72   of payload to r
1060: 65 61 64 20 77 69 74 68 20 65 61 63 68 20 72 6f  ead with each ro
1070: 77 29 0a 23 20 20 20 2d 63 61 63 68 65 73 69 7a  w).#   -cachesiz
1080: 65 20 4e 20 20 20 20 20 28 56 61 6c 75 65 20 66  e N     (Value f
1090: 6f 72 20 22 50 52 41 47 4d 41 20 63 61 63 68 65  or "PRAGMA cache
10a0: 5f 73 69 7a 65 20 3d 20 3f 22 29 0a 23 20 20 20  _size = ?").#   
10b0: 2d 72 65 70 65 61 74 73 20 4e 20 20 20 20 20 20  -repeats N      
10c0: 20 28 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65   (number of time
10d0: 73 20 74 6f 20 72 65 70 65 61 74 20 74 65 73 74  s to repeat test
10e0: 29 0a 23 20 20 20 2d 66 61 6b 65 68 65 61 70 20  ).#   -fakeheap 
10f0: 42 4f 4f 4c 20 20 20 28 74 72 75 65 20 74 6f 20  BOOL   (true to 
1100: 75 73 65 20 73 65 70 61 72 61 74 65 20 61 6c 6c  use separate all
1110: 6f 63 61 74 69 6f 6e 73 20 66 6f 72 20 69 6e 2d  ocations for in-
1120: 6d 65 6d 6f 72 79 20 72 65 63 6f 72 64 73 29 0a  memory records).
1130: 23 0a 70 72 6f 63 20 64 6f 5f 73 6f 72 74 65 72  #.proc do_sorter
1140: 5f 74 65 73 74 20 7b 74 6e 20 61 72 67 73 7d 20  _test {tn args} 
1150: 7b 0a 20 20 73 65 74 20 61 28 2d 72 6f 77 73 29  {.  set a(-rows)
1160: 20 20 20 20 20 20 31 30 30 30 0a 20 20 73 65 74        1000.  set
1170: 20 61 28 2d 72 65 70 65 61 74 73 29 20 20 20 31   a(-repeats)   1
1180: 0a 20 20 73 65 74 20 61 28 2d 72 65 61 64 29 20  .  set a(-read) 
1190: 20 20 20 20 20 31 30 30 0a 20 20 73 65 74 20 61       100.  set a
11a0: 28 2d 70 61 79 6c 6f 61 64 29 20 20 20 31 30 30  (-payload)   100
11b0: 0a 20 20 73 65 74 20 61 28 2d 63 61 63 68 65 73  .  set a(-caches
11c0: 69 7a 65 29 20 31 30 30 0a 20 20 73 65 74 20 61  ize) 100.  set a
11d0: 28 2d 66 61 6b 65 68 65 61 70 29 20 20 30 0a 0a  (-fakeheap)  0..
11e0: 20 20 66 6f 72 65 61 63 68 20 7b 73 20 76 61 6c    foreach {s val
11f0: 7d 20 24 61 72 67 73 20 7b 0a 20 20 20 20 69 66  } $args {.    if
1200: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 61   {[info exists a
1210: 28 24 73 29 5d 3d 3d 30 7d 20 7b 20 0a 20 20 20  ($s)]==0} { .   
1220: 20 20 20 75 6e 73 65 74 20 61 28 2d 63 61 63 68     unset a(-cach
1230: 65 73 69 7a 65 29 0a 20 20 20 20 20 20 73 65 74  esize).      set
1240: 20 6f 70 74 6c 69 73 74 20 22 5b 6a 6f 69 6e 20   optlist "[join 
1250: 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 61 5d 20  [array names a] 
1260: 2c 5d 20 6f 72 20 2d 63 61 63 68 65 73 69 7a 65  ,] or -cachesize
1270: 22 0a 20 20 20 20 20 20 65 72 72 6f 72 20 22 55  ".      error "U
1280: 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 24 73  nknown option $s
1290: 2c 20 65 78 70 65 63 74 65 64 20 24 6f 70 74 6c  , expected $optl
12a0: 69 73 74 22 0a 20 20 20 20 7d 0a 20 20 20 20 73  ist".    }.    s
12b0: 65 74 20 61 28 24 73 29 20 24 76 61 6c 0a 20 20  et a($s) $val.  
12c0: 7d 0a 20 20 69 66 20 7b 5b 70 65 72 6d 75 74 61  }.  if {[permuta
12d0: 74 69 6f 6e 5d 20 3d 3d 20 22 6d 65 6d 73 79 73  tion] == "memsys
12e0: 33 22 20 7c 7c 20 5b 70 65 72 6d 75 74 61 74 69  3" || [permutati
12f0: 6f 6e 5d 20 3d 3d 20 22 6d 65 6d 73 79 73 35 22  on] == "memsys5"
1300: 7d 20 7b 0a 20 20 20 20 73 65 74 20 61 28 2d 66  } {.    set a(-f
1310: 61 6b 65 68 65 61 70 29 20 30 0a 20 20 7d 0a 20  akeheap) 0.  }. 
1320: 20 69 66 20 7b 24 61 28 2d 66 61 6b 65 68 65 61   if {$a(-fakehea
1330: 70 29 7d 20 7b 20 73 6f 72 74 65 72 5f 74 65 73  p)} { sorter_tes
1340: 74 5f 66 61 6b 65 68 65 61 70 20 31 20 7d 0a 0a  t_fakeheap 1 }..
1350: 0a 20 20 64 62 20 65 76 61 6c 20 22 50 52 41 47  .  db eval "PRAG
1360: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
1370: 24 61 28 2d 63 61 63 68 65 73 69 7a 65 29 22 0a  $a(-cachesize)".
1380: 20 20 64 6f 5f 74 65 73 74 20 24 74 6e 20 5b 73    do_test $tn [s
1390: 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73  ubst -nocommands
13a0: 20 7b 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20   {.    for {set 
13b0: 69 20 30 7d 20 7b 5b 73 65 74 20 69 5d 20 3c 20  i 0} {[set i] < 
13c0: 24 61 28 2d 72 65 70 65 61 74 73 29 7d 20 7b 69  $a(-repeats)} {i
13d0: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 73  ncr i} {.      s
13e0: 6f 72 74 65 72 5f 74 65 73 74 20 24 61 28 2d 72  orter_test $a(-r
13f0: 6f 77 73 29 20 24 61 28 2d 72 65 61 64 29 20 24  ows) $a(-read) $
1400: 61 28 2d 70 61 79 6c 6f 61 64 29 0a 20 20 20 20  a(-payload).    
1410: 7d 0a 20 20 7d 5d 20 7b 7d 0a 0a 20 20 69 66 20  }.  }] {}..  if 
1420: 7b 24 61 28 2d 66 61 6b 65 68 65 61 70 29 7d 20  {$a(-fakeheap)} 
1430: 7b 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 66 61  { sorter_test_fa
1440: 6b 65 68 65 61 70 20 30 20 7d 0a 7d 0a 0a 70 72  keheap 0 }.}..pr
1450: 6f 63 20 63 6c 6f 63 6b 5f 73 65 63 6f 6e 64 73  oc clock_seconds
1460: 20 7b 7d 20 7b 0a 20 20 64 62 20 6f 6e 65 20 7b   {} {.  db one {
1470: 53 45 4c 45 43 54 20 73 74 72 66 74 69 6d 65 28  SELECT strftime(
1480: 27 25 73 27 29 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  '%s')}.}..#-----
1490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d0: 2d 2d 2d 2d 0a 23 20 42 65 67 69 6e 20 74 65 73  ----.# Begin tes
14e0: 74 73 20 68 65 72 65 2e 0a 0a 23 20 43 72 65 61  ts here...# Crea
14f0: 74 65 20 61 20 74 65 73 74 20 64 61 74 61 62 61  te a test databa
1500: 73 65 2e 0a 64 6f 5f 74 65 73 74 20 31 20 7b 0a  se..do_test 1 {.
1510: 20 20 65 78 65 63 73 71 6c 20 22 50 52 41 47 4d    execsql "PRAGM
1520: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 34 30  A page_size = 40
1530: 39 36 22 0a 20 20 70 6f 70 75 6c 61 74 65 5f 74  96".  populate_t
1540: 61 62 6c 65 20 31 30 30 30 30 30 20 35 30 30 0a  able 100000 500.
1550: 7d 20 7b 7d 0a 0a 73 65 74 20 69 54 69 6d 65 4c  } {}..set iTimeL
1560: 69 6d 69 74 20 5b 65 78 70 72 20 5b 63 6c 6f 63  imit [expr [cloc
1570: 6b 5f 73 65 63 6f 6e 64 73 5d 20 2b 20 24 53 4f  k_seconds] + $SO
1580: 52 54 34 54 49 4d 45 4f 55 54 5d 0a 0a 66 6f 72  RT4TIMEOUT]..for
1590: 20 7b 73 65 74 20 74 20 32 7d 20 7b 31 7d 20 7b   {set t 2} {1} {
15a0: 69 6e 63 72 20 74 6e 7d 20 7b 0a 20 20 64 6f 5f  incr tn} {.  do_
15b0: 73 6f 72 74 65 72 5f 74 65 73 74 20 24 74 2e 32  sorter_test $t.2
15c0: 20 2d 72 65 70 65 61 74 73 20 31 30 20 2d 72 6f   -repeats 10 -ro
15d0: 77 73 20 31 30 30 30 20 20 20 2d 72 65 61 64 20  ws 1000   -read 
15e0: 31 30 30 0a 20 20 64 6f 5f 73 6f 72 74 65 72 5f  100.  do_sorter_
15f0: 74 65 73 74 20 24 74 2e 33 20 2d 72 65 70 65 61  test $t.3 -repea
1600: 74 73 20 31 30 20 2d 72 6f 77 73 20 31 30 30 30  ts 10 -rows 1000
1610: 30 30 20 2d 72 65 61 64 20 31 30 30 30 0a 20 20  00 -read 1000.  
1620: 64 6f 5f 73 6f 72 74 65 72 5f 74 65 73 74 20 24  do_sorter_test $
1630: 74 2e 34 20 2d 72 65 70 65 61 74 73 20 31 30 20  t.4 -repeats 10 
1640: 2d 72 6f 77 73 20 31 30 30 30 30 30 20 2d 72 65  -rows 100000 -re
1650: 61 64 20 31 30 30 30 20 2d 70 61 79 6c 6f 61 64  ad 1000 -payload
1660: 20 35 30 30 0a 20 20 64 6f 5f 73 6f 72 74 65 72   500.  do_sorter
1670: 5f 74 65 73 74 20 24 74 2e 35 20 2d 72 65 70 65  _test $t.5 -repe
1680: 61 74 73 20 31 30 20 2d 72 6f 77 73 20 31 30 30  ats 10 -rows 100
1690: 30 30 30 20 2d 72 65 61 64 20 31 30 30 30 30 30  000 -read 100000
16a0: 20 2d 70 61 79 6c 6f 61 64 20 38 0a 20 20 64 6f   -payload 8.  do
16b0: 5f 73 6f 72 74 65 72 5f 74 65 73 74 20 24 74 2e  _sorter_test $t.
16c0: 36 20 2d 72 65 70 65 61 74 73 20 31 30 20 2d 72  6 -repeats 10 -r
16d0: 6f 77 73 20 31 30 30 30 30 30 20 2d 72 65 61 64  ows 100000 -read
16e0: 20 31 30 20 2d 70 61 79 6c 6f 61 64 20 38 0a 20   10 -payload 8. 
16f0: 20 64 6f 5f 73 6f 72 74 65 72 5f 74 65 73 74 20   do_sorter_test 
1700: 24 74 2e 37 20 2d 72 65 70 65 61 74 73 20 31 30  $t.7 -repeats 10
1710: 20 2d 72 6f 77 73 20 31 30 30 30 30 20 2d 72 65   -rows 10000 -re
1720: 61 64 20 31 30 30 30 30 20 2d 70 61 79 6c 6f 61  ad 10000 -payloa
1730: 64 20 38 20 2d 66 61 6b 65 68 65 61 70 20 31 0a  d 8 -fakeheap 1.
1740: 20 20 64 6f 5f 73 6f 72 74 65 72 5f 74 65 73 74    do_sorter_test
1750: 20 24 74 2e 38 20 2d 72 65 70 65 61 74 73 20 31   $t.8 -repeats 1
1760: 30 20 2d 72 6f 77 73 20 31 30 30 30 30 30 20 2d  0 -rows 100000 -
1770: 72 65 61 64 20 31 30 30 30 30 20 2d 63 61 63 68  read 10000 -cach
1780: 65 73 69 7a 65 20 32 35 30 0a 0a 20 20 73 65 74  esize 250..  set
1790: 20 69 4e 6f 77 20 5b 63 6c 6f 63 6b 5f 73 65 63   iNow [clock_sec
17a0: 6f 6e 64 73 5d 0a 20 20 69 66 20 7b 24 69 4e 6f  onds].  if {$iNo
17b0: 77 3e 3d 24 69 54 69 6d 65 4c 69 6d 69 74 7d 20  w>=$iTimeLimit} 
17c0: 62 72 65 61 6b 0a 20 20 64 6f 5f 74 65 73 74 20  break.  do_test 
17d0: 22 24 74 65 73 74 70 72 65 66 69 78 2d 28 5b 65  "$testprefix-([e
17e0: 78 70 72 20 24 69 54 69 6d 65 4c 69 6d 69 74 2d  xpr $iTimeLimit-
17f0: 24 69 4e 6f 77 5d 20 73 65 63 6f 6e 64 73 20 72  $iNow] seconds r
1800: 65 6d 61 69 6e 29 22 20 7b 7d 20 7b 7d 0a 7d 0a  emain)" {} {}.}.
1810: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.