/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 6b43ae0e2169b5ceed441844492e55ba7f1ae0790528395ddf7888ab3094525d:


0000: 23 20 32 30 31 34 20 53 65 70 74 65 6d 62 65 72  # 2014 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 20 54 68 69  **********.# Thi
0170: 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  s file implement
0180: 73 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73  s regression tes
0190: 74 73 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69  ts for SQLite li
01a0: 62 72 61 72 79 2e 20 0a 23 0a 0a 73 65 74 20 74  brary. .#..set t
01b0: 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72  estdir [file dir
01c0: 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75  name $argv0].sou
01d0: 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73  rce $testdir/tes
01e0: 74 65 72 2e 74 63 6c 0a 73 65 74 20 74 65 73 74  ter.tcl.set test
01f0: 70 72 65 66 69 78 20 73 6f 72 74 35 0a 0a 0a 23  prefix sort5...#
0200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 56 65 72 69  ---------.# Veri
0250: 66 79 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  fy that sorting 
0260: 77 6f 72 6b 73 20 77 69 74 68 20 61 20 76 65 72  works with a ver
0270: 73 69 6f 6e 20 31 20 73 71 6c 69 74 65 33 5f 69  sion 1 sqlite3_i
0280: 6f 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74  o_methods struct
0290: 75 72 65 2e 0a 23 0a 74 65 73 74 76 66 73 20 74  ure..#.testvfs t
02a0: 76 66 73 20 2d 69 76 65 72 73 69 6f 6e 20 31 20  vfs -iversion 1 
02b0: 2d 64 65 66 61 75 6c 74 20 74 72 75 65 0a 72 65  -default true.re
02c0: 73 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71  set_db.do_execsq
02d0: 6c 5f 74 65 73 74 20 31 2e 30 20 7b 0a 20 20 50  l_test 1.0 {.  P
02e0: 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 20  RAGMA mmap_size 
02f0: 3d 20 31 30 30 30 30 30 30 30 3b 0a 20 20 50 52  = 10000000;.  PR
0300: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
0310: 3d 20 31 30 3b 0a 20 20 43 52 45 41 54 45 20 54  = 10;.  CREATE T
0320: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 7d  ABLE t1(a, b);.}
0330: 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 31 2e   {0}..do_test 1.
0340: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 42 45  1 {.  execsql BE
0350: 47 49 4e 0a 20 20 66 6f 72 20 7b 73 65 74 20 69  GIN.  for {set i
0360: 20 30 7d 20 7b 24 69 20 3c 20 32 30 30 30 7d 20   0} {$i < 2000} 
0370: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65  {incr i} {.    e
0380: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
0390: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24  INTO t1 VALUES($
03a0: 69 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30  i, randomblob(20
03b0: 30 30 29 29 20 7d 0a 20 20 7d 0a 20 20 65 78 65  00)) }.  }.  exe
03c0: 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 7d 20 7b 7d  csql COMMIT.} {}
03d0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
03e0: 74 20 31 2e 32 20 7b 0a 20 20 43 52 45 41 54 45  t 1.2 {.  CREATE
03f0: 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28   INDEX i1 ON t1(
0400: 62 29 3b 0a 7d 0a 0a 64 62 20 63 6c 6f 73 65 0a  b);.}..db close.
0410: 74 76 66 73 20 64 65 6c 65 74 65 0a 0a 23 2d 2d  tvfs delete..#--
0420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0460: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
0470: 68 61 74 20 74 68 65 20 50 4d 41 20 73 69 7a 65  hat the PMA size
0480: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 63   is determined c
0490: 6f 72 72 65 63 74 6c 79 2e 20 54 68 65 20 50 4d  orrectly. The PM
04a0: 41 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65  A size should be
04b0: 0a 23 20 72 6f 75 67 68 6c 79 20 74 68 65 20 73  .# roughly the s
04c0: 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65  ame amount of me
04d0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 74  mory allocated t
04e0: 6f 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 72  o the main pager
04f0: 20 63 61 63 68 65 2c 20 6f 72 0a 23 20 32 35 30   cache, or.# 250
0500: 20 70 61 67 65 73 20 69 66 20 74 68 69 73 20 69   pages if this i
0510: 73 20 6c 61 72 67 65 72 2e 0a 23 0a 74 65 73 74  s larger..#.test
0520: 76 66 73 20 74 76 66 73 0a 74 76 66 73 20 73 63  vfs tvfs.tvfs sc
0530: 72 69 70 74 20 74 76 5f 63 61 6c 6c 62 61 63 6b  ript tv_callback
0540: 0a 74 76 66 73 20 66 69 6c 74 65 72 20 7b 78 4f  .tvfs filter {xO
0550: 70 65 6e 20 78 57 72 69 74 65 7d 0a 0a 70 72 6f  pen xWrite}..pro
0560: 63 20 74 76 5f 63 61 6c 6c 62 61 63 6b 20 7b 6d  c tv_callback {m
0570: 65 74 68 6f 64 20 61 72 67 73 7d 20 7b 0a 20 20  ethod args} {.  
0580: 67 6c 6f 62 61 6c 20 69 54 65 6d 70 0a 20 20 67  global iTemp.  g
0590: 6c 6f 62 61 6c 20 46 0a 20 20 73 77 69 74 63 68  lobal F.  switch
05a0: 20 24 6d 65 74 68 6f 64 20 7b 0a 20 20 20 20 78   $method {.    x
05b0: 4f 70 65 6e 20 7b 0a 20 20 20 20 20 20 69 66 20  Open {.      if 
05c0: 7b 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30  {[lindex $args 0
05d0: 5d 3d 3d 22 22 7d 20 7b 20 72 65 74 75 72 6e 20  ]==""} { return 
05e0: 22 74 65 6d 70 5b 69 6e 63 72 20 69 54 65 6d 70  "temp[incr iTemp
05f0: 5d 22 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72  ]" }.      retur
0600: 6e 20 22 53 51 4c 49 54 45 5f 4f 4b 22 0a 20 20  n "SQLITE_OK".  
0610: 20 20 7d 0a 0a 20 20 20 20 78 57 72 69 74 65 20    }..    xWrite 
0620: 7b 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  {.      foreach 
0630: 7b 66 69 6c 65 6e 61 6d 65 20 69 64 20 6f 66 66  {filename id off
0640: 20 61 6d 74 7d 20 24 61 72 67 73 20 7b 7d 0a 20   amt} $args {}. 
0650: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
0660: 78 69 73 74 73 20 46 28 24 69 64 29 5d 3d 3d 30  xists F($id)]==0
0670: 20 7c 7c 20 24 46 28 24 69 64 29 3c 28 24 6f 66   || $F($id)<($of
0680: 66 20 2b 20 24 61 6d 74 29 7d 20 7b 0a 20 20 20  f + $amt)} {.   
0690: 20 20 20 20 20 73 65 74 20 46 28 24 69 64 29 20       set F($id) 
06a0: 5b 65 78 70 72 20 24 6f 66 66 2b 24 61 6d 74 5d  [expr $off+$amt]
06b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
06c0: 20 7d 0a 7d 0a 0a 63 61 74 63 68 20 7b 20 64 62   }.}..catch { db
06d0: 20 63 6c 6f 73 65 20 7d 0a 66 6f 72 63 65 64 65   close }.forcede
06e0: 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 73 71 6c  lete test.db.sql
06f0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20  ite3 db test.db 
0700: 2d 76 66 73 20 74 76 66 73 0a 65 78 65 63 73 71  -vfs tvfs.execsq
0710: 6c 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45  l { CREATE TABLE
0720: 20 74 31 28 78 29 20 7d 0a 65 78 65 63 73 71 6c   t1(x) }.execsql
0730: 20 7b 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73   { PRAGMA temp_s
0740: 74 6f 72 65 20 3d 20 31 20 7d 0a 0a 23 20 45 61  tore = 1 }..# Ea
0750: 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  ch iteration of 
0760: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f  the following lo
0770: 6f 70 20 61 74 74 65 6d 70 74 73 20 74 6f 20 73  op attempts to s
0780: 6f 72 74 20 31 30 30 30 31 20 72 65 63 6f 72 64  ort 10001 record
0790: 73 0a 23 20 65 61 63 68 20 61 20 62 69 74 20 6f  s.# each a bit o
07a0: 76 65 72 20 31 30 30 20 62 79 74 65 73 20 69 6e  ver 100 bytes in
07b0: 20 73 69 7a 65 2e 20 49 6e 20 74 6f 74 61 6c 20   size. In total 
07c0: 61 20 6c 69 74 74 6c 65 20 6d 6f 72 65 20 74 68  a little more th
07d0: 61 6e 20 31 4d 69 42 20 0a 23 20 6f 66 20 64 61  an 1MiB .# of da
07e0: 74 61 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74  ta..#.foreach {t
07f0: 6e 20 70 67 73 7a 20 63 61 63 68 65 73 7a 20 62  n pgsz cachesz b
0800: 54 65 6d 70 7d 20 7b 0a 20 20 31 20 34 30 39 36  Temp} {.  1 4096
0810: 20 20 20 31 30 30 30 20 20 30 0a 20 20 32 20 31     1000  0.  2 1
0820: 30 32 34 20 20 20 31 30 30 30 20 20 31 0a 0a 20  024   1000  1.. 
0830: 20 33 20 34 30 39 36 20 20 2d 31 30 30 30 20 20   3 4096  -1000  
0840: 31 0a 20 20 34 20 31 30 32 34 20 20 2d 31 30 30  1.  4 1024  -100
0850: 30 20 20 31 0a 0a 20 20 35 20 34 30 39 36 20 20  0  1..  5 4096  
0860: 2d 39 30 30 30 20 20 30 0a 20 20 36 20 31 30 32  -9000  0.  6 102
0870: 34 20 20 2d 39 30 30 30 20 20 30 0a 7d 20 7b 0a  4  -9000  0.} {.
0880: 20 20 69 66 20 7b 24 3a 3a 54 45 4d 50 5f 53 54    if {$::TEMP_ST
0890: 4f 52 45 3e 32 7d 20 7b 0a 20 20 20 20 73 65 74  ORE>2} {.    set
08a0: 20 62 54 65 6d 70 20 30 0a 20 20 7d 0a 20 20 64   bTemp 0.  }.  d
08b0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
08c0: 2e 24 74 6e 2e 30 20 22 0a 20 20 20 20 50 52 41  .$tn.0 ".    PRA
08d0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
08e0: 24 70 67 73 7a 3b 0a 20 20 20 20 56 41 43 55 55  $pgsz;.    VACUU
08f0: 4d 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61  M;.    PRAGMA ca
0900: 63 68 65 5f 73 69 7a 65 20 3d 20 24 63 61 63 68  che_size = $cach
0910: 65 73 7a 3b 0a 20 20 22 0a 0a 20 20 69 66 20 7b  esz;.  "..  if {
0920: 5b 64 62 20 6f 6e 65 20 7b 50 52 41 47 4d 41 20  [db one {PRAGMA 
0930: 70 61 67 65 5f 73 69 7a 65 7d 5d 21 3d 24 70 67  page_size}]!=$pg
0940: 73 7a 7d 20 7b 0a 20 20 20 20 23 20 53 45 45 20  sz} {.    # SEE 
0950: 69 73 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 63  is not able to c
0960: 68 61 6e 67 65 20 70 61 67 65 20 73 69 7a 65 73  hange page sizes
0970: 20 61 6e 64 20 74 68 61 74 20 6d 65 73 73 65 73   and that messes
0980: 20 75 70 20 74 68 65 0a 20 20 20 20 23 20 72 65   up the.    # re
0990: 73 75 6c 74 73 20 74 68 61 74 20 66 6f 6c 6c 6f  sults that follo
09a0: 77 2e 0a 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a  w..    continue.
09b0: 20 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 32    }..  do_test 2
09c0: 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 73 65 74  .$tn.1 {.    set
09d0: 20 3a 3a 69 54 65 6d 70 20 30 0a 20 20 20 20 63   ::iTemp 0.    c
09e0: 61 74 63 68 20 7b 20 61 72 72 61 79 20 75 6e 73  atch { array uns
09f0: 65 74 20 46 20 7d 0a 20 20 20 20 65 78 65 63 73  et F }.    execs
0a00: 71 6c 20 7b 0a 20 20 20 20 20 20 57 49 54 48 20  ql {.      WITH 
0a10: 78 28 69 2c 20 6a 29 20 41 53 20 28 0a 20 20 20  x(i, j) AS (.   
0a20: 20 20 20 20 20 53 45 4c 45 43 54 20 31 2c 20 72       SELECT 1, r
0a30: 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 0a 20  andomblob(100). 
0a40: 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
0a50: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
0a60: 69 2b 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  i+1, randomblob(
0a70: 31 30 30 29 20 46 52 4f 4d 20 78 20 57 48 45 52  100) FROM x WHER
0a80: 45 20 69 3c 31 30 30 30 30 0a 20 20 20 20 20 20  E i<10000.      
0a90: 29 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ).      SELECT *
0aa0: 20 46 52 4f 4d 20 78 20 4f 52 44 45 52 20 42 59   FROM x ORDER BY
0ab0: 20 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78   j;.    }.    ex
0ac0: 70 72 20 7b 5b 61 72 72 61 79 20 6e 61 6d 65 73  pr {[array names
0ad0: 20 46 5d 21 3d 22 22 7d 0a 20 20 7d 20 24 62 54   F]!=""}.  } $bT
0ae0: 65 6d 70 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65  emp.}..finish_te
0af0: 73 74 0a                                         st.