/ Hex Artifact Content
Login

Artifact 1bfd611b9841eafb44f7d83c0788e146d84a33c9:


0000: 23 20 32 30 31 33 20 4d 61 72 63 68 20 32 30 0a  # 2013 March 20.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   you 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 2a 2a 0a 23 0a 0a 73 65 74 20 74 65 73  *****.#..set tes
0170: 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61  tdir [file dirna
0180: 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63  me $argv0].sourc
0190: 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65  e $testdir/teste
01a0: 72 2e 74 63 6c 0a 69 66 63 61 70 61 62 6c 65 20  r.tcl.ifcapable 
01b0: 21 6d 6d 61 70 20 7b 0a 20 20 66 69 6e 69 73 68  !mmap {.  finish
01c0: 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d  _test.  return.}
01d0: 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72  .source $testdir
01e0: 2f 6c 6f 63 6b 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c  /lock_common.tcl
01f0: 0a 73 65 74 20 74 65 73 74 70 72 65 66 69 78 20  .set testprefix 
0200: 6d 6d 61 70 31 0a 0a 70 72 6f 63 20 6e 52 65 61  mmap1..proc nRea
0210: 64 20 7b 64 62 7d 20 7b 0a 20 20 73 65 74 20 62  d {db} {.  set b
0220: 74 20 5b 62 74 72 65 65 5f 66 72 6f 6d 5f 64 62  t [btree_from_db
0230: 20 24 64 62 5d 0a 20 20 64 62 5f 65 6e 74 65 72   $db].  db_enter
0240: 20 24 64 62 0a 20 20 61 72 72 61 79 20 73 65 74   $db.  array set
0250: 20 73 74 61 74 73 20 5b 62 74 72 65 65 5f 70 61   stats [btree_pa
0260: 67 65 72 5f 73 74 61 74 73 20 24 62 74 5d 0a 20  ger_stats $bt]. 
0270: 20 64 62 5f 6c 65 61 76 65 20 24 64 62 0a 20 20   db_leave $db.  
0280: 23 20 70 75 74 73 20 5b 61 72 72 61 79 20 67 65  # puts [array ge
0290: 74 20 73 74 61 74 73 5d 0a 20 20 72 65 74 75 72  t stats].  retur
02a0: 6e 20 24 73 74 61 74 73 28 72 65 61 64 29 0a 7d  n $stats(read).}
02b0: 0a 0a 70 72 6f 63 20 72 65 67 69 73 74 65 72 5f  ..proc register_
02c0: 72 62 6c 6f 62 5f 63 6f 64 65 20 7b 64 62 6e 61  rblob_code {dbna
02d0: 6d 65 20 73 65 65 64 7d 20 7b 0a 20 20 72 65 74  me seed} {.  ret
02e0: 75 72 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f  urn [subst -noco
02f0: 6d 6d 61 6e 64 73 20 7b 0a 20 20 20 20 73 65 74  mmands {.    set
0300: 20 3a 3a 72 63 6e 74 20 24 73 65 65 64 0a 20 20   ::rcnt $seed.  
0310: 20 20 70 72 6f 63 20 72 62 6c 6f 62 20 7b 6e 7d    proc rblob {n}
0320: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 72   {.      set ::r
0330: 63 6e 74 20 5b 65 78 70 72 20 28 28 5b 73 65 74  cnt [expr (([set
0340: 20 3a 3a 72 63 6e 74 5d 20 3c 3c 20 33 29 20 2b   ::rcnt] << 3) +
0350: 20 5b 73 65 74 20 3a 3a 72 63 6e 74 5d 20 2b 20   [set ::rcnt] + 
0360: 34 35 36 29 20 26 20 30 78 46 46 46 46 46 46 46  456) & 0xFFFFFFF
0370: 46 5d 0a 20 20 20 20 20 20 73 65 74 20 73 74 72  F].      set str
0380: 20 5b 66 6f 72 6d 61 74 20 25 2e 38 78 20 5b 65   [format %.8x [e
0390: 78 70 72 20 5b 73 65 74 20 3a 3a 72 63 6e 74 5d  xpr [set ::rcnt]
03a0: 20 5e 20 30 78 62 64 66 32 30 64 61 33 5d 5d 0a   ^ 0xbdf20da3]].
03b0: 20 20 20 20 20 20 73 74 72 69 6e 67 20 72 61 6e        string ran
03c0: 67 65 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61  ge [string repea
03d0: 74 20 5b 73 65 74 20 73 74 72 5d 20 5b 65 78 70  t [set str] [exp
03e0: 72 20 5b 73 65 74 20 6e 5d 2f 34 5d 5d 20 31 20  r [set n]/4]] 1 
03f0: 5b 73 65 74 20 6e 5d 0a 20 20 20 20 7d 0a 20 20  [set n].    }.  
0400: 20 20 24 64 62 6e 61 6d 65 20 66 75 6e 63 20 72    $dbname func r
0410: 62 6c 6f 62 20 72 62 6c 6f 62 0a 20 20 7d 5d 0a  blob rblob.  }].
0420: 7d 0a 0a 23 20 46 6f 72 20 63 61 73 65 73 20 31  }..# For cases 1
0430: 2e 31 20 61 6e 64 20 31 2e 34 2c 20 74 68 65 20  .1 and 1.4, the 
0440: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
0450: 72 65 61 64 20 75 73 69 6e 67 20 78 52 65 61 64  read using xRead
0460: 28 29 20 69 73 20 34 20 6f 6e 0a 23 20 75 6e 69  () is 4 on.# uni
0470: 78 20 61 6e 64 20 39 20 6f 6e 20 77 69 6e 64 6f  x and 9 on windo
0480: 77 73 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e  ws. The differen
0490: 63 65 20 69 73 20 74 68 61 74 20 77 69 6e 64 6f  ce is that windo
04a0: 77 73 20 6f 6e 6c 79 20 65 76 65 72 20 6d 61 70  ws only ever map
04b0: 73 0a 23 20 61 6e 20 69 6e 74 65 67 65 72 20 6e  s.# an integer n
04c0: 75 6d 62 65 72 20 6f 66 20 4f 53 20 70 61 67 65  umber of OS page
04d0: 73 20 28 69 2e 65 2e 20 63 72 65 61 74 65 73 20  s (i.e. creates 
04e0: 6d 61 70 70 69 6e 67 73 20 74 68 61 74 20 61 72  mappings that ar
04f0: 65 20 61 20 6d 75 6c 74 69 70 6c 65 0a 23 20 6f  e a multiple.# o
0500: 66 20 34 4b 42 20 69 6e 20 73 69 7a 65 29 2e 20  f 4KB in size). 
0510: 57 68 65 72 65 61 73 20 6f 6e 20 75 6e 69 78 20  Whereas on unix 
0520: 61 6e 79 20 73 69 7a 65 64 20 6d 61 70 70 69 6e  any sized mappin
0530: 67 20 6d 61 79 20 62 65 20 63 72 65 61 74 65 64  g may be created
0540: 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 20 6d  ..#.foreach {t m
0550: 6d 61 70 5f 73 69 7a 65 20 6e 52 65 61 64 20 63  map_size nRead c
0560: 32 69 6e 69 74 7d 20 7b 0a 20 20 31 2e 31 20 7b  2init} {.  1.1 {
0570: 20 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a   PRAGMA mmap_siz
0580: 65 20 3d 20 36 37 31 30 38 38 36 34 20 7d 20 2f  e = 67108864 } /
0590: 5b 34 39 5d 2f 20 7b 50 52 41 47 4d 41 20 6d 6d  [49]/ {PRAGMA mm
05a0: 61 70 5f 73 69 7a 65 20 3d 20 30 7d 0a 20 20 31  ap_size = 0}.  1
05b0: 2e 32 20 7b 20 50 52 41 47 4d 41 20 6d 6d 61 70  .2 { PRAGMA mmap
05c0: 5f 73 69 7a 65 20 3d 20 20 20 20 35 33 32 34 38  _size =    53248
05d0: 20 7d 20 31 35 30 20 20 20 20 7b 50 52 41 47 4d   } 150    {PRAGM
05e0: 41 20 6d 6d 61 70 5f 73 69 7a 65 20 3d 20 30 7d  A mmap_size = 0}
05f0: 0a 20 20 31 2e 33 20 7b 20 50 52 41 47 4d 41 20  .  1.3 { PRAGMA 
0600: 6d 6d 61 70 5f 73 69 7a 65 20 3d 20 20 20 20 20  mmap_size =     
0610: 20 20 20 30 20 7d 20 33 34 34 20 20 20 20 7b 50     0 } 344    {P
0620: 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 20  RAGMA mmap_size 
0630: 3d 20 30 7d 0a 20 20 31 2e 34 20 7b 20 50 52 41  = 0}.  1.4 { PRA
0640: 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 20 3d 20  GMA mmap_size = 
0650: 36 37 31 30 38 38 36 34 20 7d 20 2f 5b 34 39 5d  67108864 } /[49]
0660: 2f 20 7b 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73  / {PRAGMA mmap_s
0670: 69 7a 65 20 3d 20 36 37 31 30 38 38 36 34 20 7d  ize = 67108864 }
0680: 0a 20 20 31 2e 35 20 7b 20 50 52 41 47 4d 41 20  .  1.5 { PRAGMA 
0690: 6d 6d 61 70 5f 73 69 7a 65 20 3d 20 20 20 20 35  mmap_size =    5
06a0: 33 32 34 38 20 7d 20 31 35 30 20 20 20 20 7b 50  3248 } 150    {P
06b0: 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 20  RAGMA mmap_size 
06c0: 3d 20 36 37 31 30 38 38 36 34 20 7d 0a 20 20 31  = 67108864 }.  1
06d0: 2e 36 20 7b 20 50 52 41 47 4d 41 20 6d 6d 61 70  .6 { PRAGMA mmap
06e0: 5f 73 69 7a 65 20 3d 20 20 20 20 20 20 20 20 30  _size =        0
06f0: 20 7d 20 33 34 34 20 20 20 20 7b 50 52 41 47 4d   } 344    {PRAGM
0700: 41 20 6d 6d 61 70 5f 73 69 7a 65 20 3d 20 36 37  A mmap_size = 67
0710: 31 30 38 38 36 34 20 7d 0a 7d 20 7b 0a 0a 20 20  108864 }.} {..  
0720: 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74  do_multiclient_t
0730: 65 73 74 20 74 6e 20 7b 0a 20 20 20 20 73 71 6c  est tn {.    sql
0740: 31 20 7b 50 52 41 47 4d 41 20 63 61 63 68 65 5f  1 {PRAGMA cache_
0750: 73 69 7a 65 3d 32 30 30 30 7d 0a 20 20 20 20 73  size=2000}.    s
0760: 71 6c 32 20 7b 50 52 41 47 4d 41 20 63 61 63 68  ql2 {PRAGMA cach
0770: 65 5f 73 69 7a 65 3d 32 30 30 30 7d 0a 0a 20 20  e_size=2000}..  
0780: 20 20 73 71 6c 31 20 7b 50 52 41 47 4d 41 20 70    sql1 {PRAGMA p
0790: 61 67 65 5f 73 69 7a 65 3d 31 30 32 34 7d 0a 20  age_size=1024}. 
07a0: 20 20 20 73 71 6c 31 20 24 6d 6d 61 70 5f 73 69     sql1 $mmap_si
07b0: 7a 65 0a 20 20 20 20 73 71 6c 32 20 24 63 32 69  ze.    sql2 $c2i
07c0: 6e 69 74 0a 0a 20 20 20 20 63 6f 64 65 32 20 5b  nit..    code2 [
07d0: 72 65 67 69 73 74 65 72 5f 72 62 6c 6f 62 5f 63  register_rblob_c
07e0: 6f 64 65 20 64 62 32 20 30 5d 0a 0a 20 20 20 20  ode db2 0]..    
07f0: 73 71 6c 32 20 7b 0a 20 20 20 20 20 20 50 52 41  sql2 {.      PRA
0800: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d 31 30  GMA page_size=10
0810: 32 34 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  24;.      PRAGMA
0820: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31   auto_vacuum = 1
0830: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
0840: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 55 4e  ABLE t1(a, b, UN
0850: 49 51 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 20  IQUE(a, b));.   
0860: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0870: 31 20 56 41 4c 55 45 53 28 72 62 6c 6f 62 28 35  1 VALUES(rblob(5
0880: 30 30 29 2c 20 72 62 6c 6f 62 28 35 30 30 29 29  00), rblob(500))
0890: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
08a0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 62  NTO t1 SELECT rb
08b0: 6c 6f 62 28 35 30 30 29 2c 20 72 62 6c 6f 62 28  lob(500), rblob(
08c0: 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2d 2d  500) FROM t1; --
08d0: 20 20 20 20 32 0a 20 20 20 20 20 20 49 4e 53 45      2.      INSE
08e0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
08f0: 54 20 72 62 6c 6f 62 28 35 30 30 29 2c 20 72 62  T rblob(500), rb
0900: 6c 6f 62 28 35 30 30 29 20 46 52 4f 4d 20 74 31  lob(500) FROM t1
0910: 3b 20 2d 2d 20 20 20 20 34 0a 20 20 20 20 20 20  ; --    4.      
0920: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
0930: 45 4c 45 43 54 20 72 62 6c 6f 62 28 35 30 30 29  ELECT rblob(500)
0940: 2c 20 72 62 6c 6f 62 28 35 30 30 29 20 46 52 4f  , rblob(500) FRO
0950: 4d 20 74 31 3b 20 2d 2d 20 20 20 20 38 0a 20 20  M t1; --    8.  
0960: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0970: 74 31 20 53 45 4c 45 43 54 20 72 62 6c 6f 62 28  t1 SELECT rblob(
0980: 35 30 30 29 2c 20 72 62 6c 6f 62 28 35 30 30 29  500), rblob(500)
0990: 20 46 52 4f 4d 20 74 31 3b 20 2d 2d 20 20 20 31   FROM t1; --   1
09a0: 36 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  6.      INSERT I
09b0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 62  NTO t1 SELECT rb
09c0: 6c 6f 62 28 35 30 30 29 2c 20 72 62 6c 6f 62 28  lob(500), rblob(
09d0: 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2d 2d  500) FROM t1; --
09e0: 20 20 20 33 32 0a 20 20 20 20 7d 0a 20 20 20 20     32.    }.    
09f0: 64 6f 5f 74 65 73 74 20 24 74 2e 24 74 6e 2e 31  do_test $t.$tn.1
0a00: 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20 22 53   {.      sql1 "S
0a10: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
0a20: 52 4f 4d 20 74 31 3b 20 50 52 41 47 4d 41 20 69  ROM t1; PRAGMA i
0a30: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 3b  ntegrity_check ;
0a40: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75   PRAGMA page_cou
0a50: 6e 74 22 0a 20 20 20 20 7d 20 7b 33 32 20 6f 6b  nt".    } {32 ok
0a60: 20 37 37 7d 0a 0a 20 20 20 20 23 20 48 61 76 65   77}..    # Have
0a70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 32 20 73 68   connection 2 sh
0a80: 72 69 6e 6b 20 74 68 65 20 66 69 6c 65 2e 20 43  rink the file. C
0a90: 68 65 63 6b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  heck connection 
0aa0: 31 20 63 61 6e 20 73 74 69 6c 6c 20 72 65 61 64  1 can still read
0ab0: 20 69 74 2e 0a 20 20 20 20 73 71 6c 32 20 7b 20   it..    sql2 { 
0ac0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
0ad0: 48 45 52 45 20 72 6f 77 69 64 25 32 3b 20 7d 0a  HERE rowid%2; }.
0ae0: 20 20 20 20 64 6f 5f 74 65 73 74 20 24 74 2e 24      do_test $t.$
0af0: 74 6e 2e 32 20 7b 0a 20 20 20 20 20 20 73 71 6c  tn.2 {.      sql
0b00: 31 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  1 "SELECT count(
0b10: 2a 29 20 46 52 4f 4d 20 74 31 3b 20 50 52 41 47  *) FROM t1; PRAG
0b20: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
0b30: 63 6b 20 3b 20 50 52 41 47 4d 41 20 70 61 67 65  ck ; PRAGMA page
0b40: 5f 63 6f 75 6e 74 22 0a 20 20 20 20 7d 20 7b 31  _count".    } {1
0b50: 36 20 6f 6b 20 34 32 7d 0a 0a 20 20 20 20 23 20  6 ok 42}..    # 
0b60: 48 61 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  Have connection 
0b70: 32 20 67 72 6f 77 20 74 68 65 20 66 69 6c 65 2e  2 grow the file.
0b80: 20 43 68 65 63 6b 20 63 6f 6e 6e 65 63 74 69 6f   Check connectio
0b90: 6e 20 31 20 63 61 6e 20 73 74 69 6c 6c 20 72 65  n 1 can still re
0ba0: 61 64 20 69 74 2e 0a 20 20 20 20 73 71 6c 32 20  ad it..    sql2 
0bb0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
0bc0: 20 53 45 4c 45 43 54 20 72 62 6c 6f 62 28 35 30   SELECT rblob(50
0bd0: 30 29 2c 20 72 62 6c 6f 62 28 35 30 30 29 20 46  0), rblob(500) F
0be0: 52 4f 4d 20 74 31 20 7d 0a 20 20 20 20 64 6f 5f  ROM t1 }.    do_
0bf0: 74 65 73 74 20 24 74 2e 24 74 6e 2e 33 20 7b 0a  test $t.$tn.3 {.
0c00: 20 20 20 20 20 20 73 71 6c 31 20 22 53 45 4c 45        sql1 "SELE
0c10: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
0c20: 20 74 31 3b 20 50 52 41 47 4d 41 20 69 6e 74 65   t1; PRAGMA inte
0c30: 67 72 69 74 79 5f 63 68 65 63 6b 20 3b 20 50 52  grity_check ; PR
0c40: 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e 74 22  AGMA page_count"
0c50: 0a 20 20 20 20 7d 20 7b 33 32 20 6f 6b 20 37 39  .    } {32 ok 79
0c60: 7d 0a 0a 20 20 20 20 23 20 48 61 76 65 20 63 6f  }..    # Have co
0c70: 6e 6e 65 63 74 69 6f 6e 20 32 20 67 72 6f 77 20  nnection 2 grow 
0c80: 74 68 65 20 66 69 6c 65 20 61 67 61 69 6e 2e 20  the file again. 
0c90: 43 68 65 63 6b 20 63 6f 6e 6e 65 63 74 69 6f 6e  Check connection
0ca0: 20 31 20 69 73 20 73 74 69 6c 6c 20 6f 6b 2e 0a   1 is still ok..
0cb0: 20 20 20 20 73 71 6c 32 20 7b 20 49 4e 53 45 52      sql2 { INSER
0cc0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
0cd0: 20 72 62 6c 6f 62 28 35 30 30 29 2c 20 72 62 6c   rblob(500), rbl
0ce0: 6f 62 28 35 30 30 29 20 46 52 4f 4d 20 74 31 20  ob(500) FROM t1 
0cf0: 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 24 74  }.    do_test $t
0d00: 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 20 20 73  .$tn.4 {.      s
0d10: 71 6c 31 20 22 53 45 4c 45 43 54 20 63 6f 75 6e  ql1 "SELECT coun
0d20: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 20 50 52  t(*) FROM t1; PR
0d30: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
0d40: 68 65 63 6b 20 3b 20 50 52 41 47 4d 41 20 70 61  heck ; PRAGMA pa
0d50: 67 65 5f 63 6f 75 6e 74 22 0a 20 20 20 20 7d 20  ge_count".    } 
0d60: 7b 36 34 20 6f 6b 20 31 34 39 7d 0a 0a 20 20 20  {64 ok 149}..   
0d70: 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 74 68   # Check that th
0d80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
0d90: 73 20 72 65 61 64 20 62 79 20 63 6f 6e 6e 65 63  s read by connec
0da0: 74 69 6f 6e 20 31 20 69 6e 64 69 63 61 74 65 73  tion 1 indicates
0db0: 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 23 20   that the.    # 
0dc0: 22 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a  "PRAGMA mmap_siz
0dd0: 65 22 20 63 6f 6d 6d 61 6e 64 20 77 6f 72 6b 65  e" command worke
0de0: 64 2e 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 24  d..    do_test $
0df0: 74 2e 24 74 6e 2e 35 20 7b 20 6e 52 65 61 64 20  t.$tn.5 { nRead 
0e00: 64 62 20 7d 20 24 6e 52 65 61 64 0a 20 20 7d 0a  db } $nRead.  }.
0e10: 7d 0a 0a 73 65 74 20 3a 3a 72 63 6e 74 20 30 0a  }..set ::rcnt 0.
0e20: 70 72 6f 63 20 72 62 6c 6f 62 20 7b 6e 7d 20 7b  proc rblob {n} {
0e30: 0a 20 20 73 65 74 20 3a 3a 72 63 6e 74 20 5b 65  .  set ::rcnt [e
0e40: 78 70 72 20 28 28 24 3a 3a 72 63 6e 74 20 3c 3c  xpr (($::rcnt <<
0e50: 20 33 29 20 2b 20 24 3a 3a 72 63 6e 74 20 2b 20   3) + $::rcnt + 
0e60: 34 35 36 29 20 26 20 30 78 46 46 46 46 46 46 46  456) & 0xFFFFFFF
0e70: 46 5d 0a 20 20 73 65 74 20 73 74 72 20 5b 66 6f  F].  set str [fo
0e80: 72 6d 61 74 20 25 2e 38 78 20 5b 65 78 70 72 20  rmat %.8x [expr 
0e90: 24 3a 3a 72 63 6e 74 20 5e 20 30 78 62 64 66 32  $::rcnt ^ 0xbdf2
0ea0: 30 64 61 33 5d 5d 0a 20 20 73 74 72 69 6e 67 20  0da3]].  string 
0eb0: 72 61 6e 67 65 20 5b 73 74 72 69 6e 67 20 72 65  range [string re
0ec0: 70 65 61 74 20 24 73 74 72 20 5b 65 78 70 72 20  peat $str [expr 
0ed0: 24 6e 2f 34 5d 5d 20 31 20 24 6e 0a 7d 0a 0a 72  $n/4]] 1 $n.}..r
0ee0: 65 73 65 74 5f 64 62 0a 64 62 20 66 75 6e 63 20  eset_db.db func 
0ef0: 72 62 6c 6f 62 20 72 62 6c 6f 62 0a 0a 69 66 63  rblob rblob..ifc
0f00: 61 70 61 62 6c 65 20 77 61 6c 20 7b 0a 20 20 64  apable wal {.  d
0f10: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
0f20: 2e 31 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  .1 {.    PRAGMA 
0f30: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b  auto_vacuum = 1;
0f40: 0a 20 20 20 20 50 52 41 47 4d 41 20 6d 6d 61 70  .    PRAGMA mmap
0f50: 5f 73 69 7a 65 20 3d 20 36 37 31 30 38 38 36 34  _size = 67108864
0f60: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
0f70: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b  rnal_mode = wal;
0f80: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
0f90: 45 20 74 31 28 61 2c 20 62 2c 20 55 4e 49 51 55  E t1(a, b, UNIQU
0fa0: 45 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 49 4e  E(a, b));.    IN
0fb0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0fc0: 55 45 53 28 72 62 6c 6f 62 28 35 30 30 29 2c 20  UES(rblob(500), 
0fd0: 72 62 6c 6f 62 28 35 30 30 29 29 3b 0a 20 20 20  rblob(500));.   
0fe0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0ff0: 53 45 4c 45 43 54 20 72 62 6c 6f 62 28 35 30 30  SELECT rblob(500
1000: 29 2c 20 72 62 6c 6f 62 28 35 30 30 29 20 46 52  ), rblob(500) FR
1010: 4f 4d 20 74 31 3b 20 2d 2d 20 20 20 20 32 0a 20  OM t1; --    2. 
1020: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1030: 31 20 53 45 4c 45 43 54 20 72 62 6c 6f 62 28 35  1 SELECT rblob(5
1040: 30 30 29 2c 20 72 62 6c 6f 62 28 35 30 30 29 20  00), rblob(500) 
1050: 46 52 4f 4d 20 74 31 3b 20 2d 2d 20 20 20 20 34  FROM t1; --    4
1060: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1070: 20 74 31 20 53 45 4c 45 43 54 20 72 62 6c 6f 62   t1 SELECT rblob
1080: 28 35 30 30 29 2c 20 72 62 6c 6f 62 28 35 30 30  (500), rblob(500
1090: 29 20 46 52 4f 4d 20 74 31 3b 20 2d 2d 20 20 20  ) FROM t1; --   
10a0: 20 38 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   8.    INSERT IN
10b0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 62 6c  TO t1 SELECT rbl
10c0: 6f 62 28 35 30 30 29 2c 20 72 62 6c 6f 62 28 35  ob(500), rblob(5
10d0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2d 2d 20  00) FROM t1; -- 
10e0: 20 20 31 36 0a 20 20 20 20 49 4e 53 45 52 54 20    16.    INSERT 
10f0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
1100: 62 6c 6f 62 28 35 30 30 29 2c 20 72 62 6c 6f 62  blob(500), rblob
1110: 28 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2d  (500) FROM t1; -
1120: 2d 20 20 20 33 32 0a 20 20 20 20 50 52 41 47 4d  -   32.    PRAGM
1130: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
1140: 3b 0a 20 20 7d 20 7b 36 37 31 30 38 38 36 34 20  ;.  } {67108864 
1150: 77 61 6c 20 30 20 31 30 33 20 31 30 33 7d 0a 0a  wal 0 103 103}..
1160: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
1170: 74 20 32 2e 32 20 7b 0a 20 20 20 20 50 52 41 47  t 2.2 {.    PRAG
1180: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 3b 0a  MA auto_vacuum;.
1190: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
11a0: 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  (*) FROM t1;.  }
11b0: 20 7b 31 20 33 32 7d 0a 0a 20 20 69 66 20 7b 5b   {1 32}..  if {[
11c0: 70 65 72 6d 75 74 61 74 69 6f 6e 5d 20 21 3d 20  permutation] != 
11d0: 22 69 6e 6d 65 6d 6f 72 79 5f 6a 6f 75 72 6e 61  "inmemory_journa
11e0: 6c 22 7d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73  l"} {.    do_tes
11f0: 74 20 32 2e 33 20 7b 0a 20 20 20 20 20 20 73 71  t 2.3 {.      sq
1200: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
1210: 62 0a 20 20 20 20 20 20 64 62 32 20 66 75 6e 63  b.      db2 func
1220: 20 72 62 6c 6f 62 20 72 62 6c 6f 62 0a 20 20 20   rblob rblob.   
1230: 20 20 20 64 62 32 20 65 76 61 6c 20 7b 0a 20 20     db2 eval {.  
1240: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
1250: 4d 20 74 31 20 57 48 45 52 45 20 28 72 6f 77 69  M t1 WHERE (rowi
1260: 64 25 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d%4);.          
1270: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
1280: 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 7d 0a 20  point;.      }. 
1290: 20 20 20 20 20 64 62 32 20 65 76 61 6c 20 7b 0a       db2 eval {.
12a0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
12b0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 62  NTO t1 SELECT rb
12c0: 6c 6f 62 28 35 30 30 29 2c 20 72 62 6c 6f 62 28  lob(500), rblob(
12d0: 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2d 2d  500) FROM t1; --
12e0: 20 20 20 20 31 36 0a 20 20 20 20 20 20 20 20 53      16.        S
12f0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1300: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 7d 0a  ROM t1;.      }.
1310: 20 20 20 20 7d 20 7b 31 36 7d 0a 0a 20 20 20 20      } {16}..    
1320: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1330: 32 2e 34 20 7b 0a 20 20 20 20 20 20 50 52 41 47  2.4 {.      PRAG
1340: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
1350: 74 3b 0a 20 20 20 20 7d 20 7b 30 20 32 34 20 32  t;.    } {0 24 2
1360: 34 7d 0a 20 20 20 20 64 62 32 20 63 6c 6f 73 65  4}.    db2 close
1370: 0a 20 20 7d 0a 7d 0a 0a 72 65 73 65 74 5f 64 62  .  }.}..reset_db
1380: 0a 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d  .execsql { PRAGM
1390: 41 20 6d 6d 61 70 5f 73 69 7a 65 20 3d 20 36 37  A mmap_size = 67
13a0: 31 30 38 38 36 34 3b 20 7d 0a 64 62 20 66 75 6e  108864; }.db fun
13b0: 63 20 72 62 6c 6f 62 20 72 62 6c 6f 62 0a 64 6f  c rblob rblob.do
13c0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  _execsql_test 3.
13d0: 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 61 75 74  1 {.  PRAGMA aut
13e0: 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b 0a 0a 20  o_vacuum = 1;.. 
13f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1400: 28 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c  (a, b, UNIQUE(a,
1410: 20 62 29 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   b));.  INSERT I
1420: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 62  NTO t1 VALUES(rb
1430: 6c 6f 62 28 35 30 30 29 2c 20 72 62 6c 6f 62 28  lob(500), rblob(
1440: 35 30 30 29 29 3b 0a 20 20 49 4e 53 45 52 54 20  500));.  INSERT 
1450: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
1460: 62 6c 6f 62 28 35 30 30 29 2c 20 72 62 6c 6f 62  blob(500), rblob
1470: 28 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2d  (500) FROM t1; -
1480: 2d 20 20 20 20 32 0a 20 20 49 4e 53 45 52 54 20  -    2.  INSERT 
1490: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
14a0: 62 6c 6f 62 28 35 30 30 29 2c 20 72 62 6c 6f 62  blob(500), rblob
14b0: 28 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2d  (500) FROM t1; -
14c0: 2d 20 20 20 20 34 0a 20 20 49 4e 53 45 52 54 20  -    4.  INSERT 
14d0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
14e0: 62 6c 6f 62 28 35 30 30 29 2c 20 72 62 6c 6f 62  blob(500), rblob
14f0: 28 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2d  (500) FROM t1; -
1500: 2d 20 20 20 20 38 0a 0a 20 20 43 52 45 41 54 45  -    8..  CREATE
1510: 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 2c 20   TABLE t2(a, b, 
1520: 55 4e 49 51 55 45 28 61 2c 20 62 29 29 3b 0a 20  UNIQUE(a, b));. 
1530: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1540: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1550: 3b 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  ;.} {}..do_test 
1560: 33 2e 32 20 7b 0a 20 20 73 65 74 20 6e 52 6f 77  3.2 {.  set nRow
1570: 20 30 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45   0.  db eval {SE
1580: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 4f  LECT * FROM t2 O
1590: 52 44 45 52 20 42 59 20 61 2c 20 62 7d 20 7b 0a  RDER BY a, b} {.
15a0: 20 20 20 20 69 66 20 7b 24 6e 52 6f 77 3d 3d 34      if {$nRow==4
15b0: 7d 20 7b 20 64 62 20 65 76 61 6c 20 7b 20 44 45  } { db eval { DE
15c0: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 7d 20 7d  LETE FROM t1 } }
15d0: 0a 20 20 20 20 69 6e 63 72 20 6e 52 6f 77 0a 20  .    incr nRow. 
15e0: 20 7d 0a 20 20 73 65 74 20 6e 52 6f 77 0a 7d 20   }.  set nRow.} 
15f0: 7b 38 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {8}..#----------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1640: 23 20 45 6e 73 75 72 65 20 74 68 61 74 20 65 78  # Ensure that ex
1650: 69 73 74 69 6e 67 20 63 75 72 73 6f 72 73 20 75  isting cursors u
1660: 73 69 6e 67 20 78 46 65 74 63 68 28 29 20 70 61  sing xFetch() pa
1670: 67 65 73 20 73 65 65 20 63 68 61 6e 67 65 73 20  ges see changes 
1680: 6d 61 64 65 0a 23 20 74 6f 20 72 6f 77 73 20 75  made.# to rows u
1690: 73 69 6e 67 20 74 68 65 20 69 6e 63 72 62 6c 6f  sing the incrblo
16a0: 62 20 41 50 49 2e 0a 23 0a 72 65 73 65 74 5f 64  b API..#.reset_d
16b0: 62 0a 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47  b.execsql { PRAG
16c0: 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 20 3d 20 36  MA mmap_size = 6
16d0: 37 31 30 38 38 36 34 3b 20 7d 0a 73 65 74 20 61  7108864; }.set a
16e0: 61 61 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61  aa [string repea
16f0: 74 20 61 20 34 30 30 5d 0a 73 65 74 20 62 62 62  t a 400].set bbb
1700: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
1710: 62 20 34 30 30 5d 0a 73 65 74 20 63 63 63 20 5b  b 400].set ccc [
1720: 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 63 20  string repeat c 
1730: 34 30 30 5d 0a 73 65 74 20 64 64 64 20 5b 73 74  400].set ddd [st
1740: 72 69 6e 67 20 72 65 70 65 61 74 20 64 20 34 30  ring repeat d 40
1750: 30 5d 0a 73 65 74 20 65 65 65 20 5b 73 74 72 69  0].set eee [stri
1760: 6e 67 20 72 65 70 65 61 74 20 65 20 34 30 30 5d  ng repeat e 400]
1770: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
1780: 74 20 34 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41  t 4.1 {.  PRAGMA
1790: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
17a0: 34 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  4;.  CREATE TABL
17b0: 45 20 74 31 28 78 29 3b 0a 20 20 49 4e 53 45 52  E t1(x);.  INSER
17c0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
17d0: 28 24 61 61 61 29 3b 0a 20 20 49 4e 53 45 52 54  ($aaa);.  INSERT
17e0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
17f0: 24 62 62 62 29 3b 0a 20 20 49 4e 53 45 52 54 20  $bbb);.  INSERT 
1800: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24  INTO t1 VALUES($
1810: 63 63 63 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ccc);.  INSERT I
1820: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 64  NTO t1 VALUES($d
1830: 64 64 29 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20  dd);.  SELECT * 
1840: 46 52 4f 4d 20 74 31 3b 0a 20 20 42 45 47 49 4e  FROM t1;.  BEGIN
1850: 3b 0a 7d 20 5b 6c 69 73 74 20 24 61 61 61 20 24  ;.} [list $aaa $
1860: 62 62 62 20 24 63 63 63 20 24 64 64 64 5d 0a 0a  bbb $ccc $ddd]..
1870: 64 6f 5f 74 65 73 74 20 34 2e 32 20 7b 0a 20 20  do_test 4.2 {.  
1880: 73 65 74 20 3a 3a 53 54 4d 54 20 5b 73 71 6c 69  set ::STMT [sqli
1890: 74 65 33 5f 70 72 65 70 61 72 65 20 64 62 20 22  te3_prepare db "
18a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
18b0: 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 22   ORDER BY rowid"
18c0: 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20 73 71 6c   -1 dummy].  sql
18d0: 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54 4d  ite3_step $::STM
18e0: 54 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  T.  sqlite3_colu
18f0: 6d 6e 5f 74 65 78 74 20 24 3a 3a 53 54 4d 54 20  mn_text $::STMT 
1900: 30 0a 7d 20 24 61 61 61 0a 0a 64 6f 5f 74 65 73  0.} $aaa..do_tes
1910: 74 20 34 2e 33 20 7b 0a 20 20 66 6f 72 65 61 63  t 4.3 {.  foreac
1920: 68 20 72 20 7b 32 20 33 20 34 7d 20 7b 0a 20 20  h r {2 3 4} {.  
1930: 20 20 73 65 74 20 66 64 20 5b 64 62 20 69 6e 63    set fd [db inc
1940: 72 62 6c 6f 62 20 74 31 20 78 20 24 72 5d 0a 20  rblob t1 x $r]. 
1950: 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69     puts -nonewli
1960: 6e 65 20 24 66 64 20 24 65 65 65 0a 20 20 20 20  ne $fd $eee.    
1970: 63 6c 6f 73 65 20 24 66 64 0a 20 20 7d 0a 0a 20  close $fd.  }.. 
1980: 20 73 65 74 20 72 65 73 20 5b 6c 69 73 74 5d 0a   set res [list].
1990: 20 20 77 68 69 6c 65 20 7b 22 53 51 4c 49 54 45    while {"SQLITE
19a0: 5f 52 4f 57 22 20 3d 3d 20 5b 73 71 6c 69 74 65  _ROW" == [sqlite
19b0: 33 5f 73 74 65 70 20 24 3a 3a 53 54 4d 54 5d 7d  3_step $::STMT]}
19c0: 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72   {.    lappend r
19d0: 65 73 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75  es [sqlite3_colu
19e0: 6d 6e 5f 74 65 78 74 20 24 3a 3a 53 54 4d 54 20  mn_text $::STMT 
19f0: 30 5d 0a 20 20 7d 0a 20 20 73 65 74 20 72 65 73  0].  }.  set res
1a00: 0a 7d 20 5b 6c 69 73 74 20 24 65 65 65 20 24 65  .} [list $eee $e
1a10: 65 65 20 24 65 65 65 5d 0a 0a 64 6f 5f 74 65 73  ee $eee]..do_tes
1a20: 74 20 34 2e 34 20 7b 0a 20 20 73 71 6c 69 74 65  t 4.4 {.  sqlite
1a30: 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54  3_finalize $::ST
1a40: 4d 54 0a 7d 20 53 51 4c 49 54 45 5f 4f 4b 0a 0a  MT.} SQLITE_OK..
1a50: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1a60: 34 2e 35 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 0a  4.5 { COMMIT }..
1a70: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
1a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 6e 73  ----------.# Ens
1ac0: 75 72 65 20 74 68 61 74 20 65 78 69 73 74 69 6e  ure that existin
1ad0: 67 20 63 75 72 73 6f 72 73 20 68 6f 6c 64 69 6e  g cursors holdin
1ae0: 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72  g xFetch() refer
1af0: 65 6e 63 65 73 20 61 72 65 20 6e 6f 74 0a 23 20  ences are not.# 
1b00: 63 6f 6e 66 75 73 65 64 20 69 66 20 74 68 6f 73  confused if thos
1b10: 65 20 70 61 67 65 73 20 61 72 65 20 6d 6f 76 65  e pages are move
1b20: 64 20 74 6f 20 6d 61 6b 65 20 77 61 79 20 66 6f  d to make way fo
1b30: 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  r the root page 
1b40: 6f 66 20 61 0a 23 20 6e 65 77 20 74 61 62 6c 65  of a.# new table
1b50: 20 6f 72 20 69 6e 64 65 78 2e 0a 23 0a 72 65 73   or index..#.res
1b60: 65 74 5f 64 62 0a 65 78 65 63 73 71 6c 20 7b 20  et_db.execsql { 
1b70: 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65  PRAGMA mmap_size
1b80: 20 3d 20 36 37 31 30 38 38 36 34 3b 20 7d 0a 64   = 67108864; }.d
1b90: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 35  o_execsql_test 5
1ba0: 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 61 75  .1 {.  PRAGMA au
1bb0: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32 3b 0a 20  to_vacuum = 2;. 
1bc0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
1bd0: 65 20 3d 20 31 30 32 34 3b 0a 20 20 43 52 45 41  e = 1024;.  CREA
1be0: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a  TE TABLE t1(x);.
1bf0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1c00: 20 56 41 4c 55 45 53 28 24 61 61 61 29 3b 0a 20   VALUES($aaa);. 
1c10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1c20: 56 41 4c 55 45 53 28 24 62 62 62 29 3b 0a 20 20  VALUES($bbb);.  
1c30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1c40: 41 4c 55 45 53 28 24 63 63 63 29 3b 0a 20 20 49  ALUES($ccc);.  I
1c50: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1c60: 4c 55 45 53 28 24 64 64 64 29 3b 0a 0a 20 20 50  LUES($ddd);..  P
1c70: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
1c80: 6d 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  m;.  SELECT * FR
1c90: 4f 4d 20 74 31 3b 0a 7d 20 5b 6c 69 73 74 20 32  OM t1;.} [list 2
1ca0: 20 24 61 61 61 20 24 62 62 62 20 24 63 63 63 20   $aaa $bbb $ccc 
1cb0: 24 64 64 64 5d 0a 0a 64 6f 5f 74 65 73 74 20 35  $ddd]..do_test 5
1cc0: 2e 32 20 7b 0a 20 20 73 65 74 20 3a 3a 53 54 4d  .2 {.  set ::STM
1cd0: 54 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61  T [sqlite3_prepa
1ce0: 72 65 20 64 62 20 22 53 45 4c 45 43 54 20 2a 20  re db "SELECT * 
1cf0: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
1d00: 20 72 6f 77 69 64 22 20 2d 31 20 64 75 6d 6d 79   rowid" -1 dummy
1d10: 5d 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ].  sqlite3_step
1d20: 20 24 3a 3a 53 54 4d 54 0a 20 20 73 71 6c 69 74   $::STMT.  sqlit
1d30: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 24  e3_column_text $
1d40: 3a 3a 53 54 4d 54 20 30 0a 7d 20 24 61 61 61 0a  ::STMT 0.} $aaa.
1d50: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
1d60: 20 35 2e 33 20 7b 0a 20 20 43 52 45 41 54 45 20   5.3 {.  CREATE 
1d70: 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 49  TABLE t2(x);.  I
1d80: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
1d90: 4c 55 45 53 28 27 74 72 69 63 6b 65 64 20 79 6f  LUES('tricked yo
1da0: 75 21 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  u!');.  INSERT I
1db0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 74  NTO t2 VALUES('t
1dc0: 72 69 63 6b 65 64 20 79 6f 75 21 27 29 3b 0a 7d  ricked you!');.}
1dd0: 0a 0a 64 6f 5f 74 65 73 74 20 35 2e 34 20 7b 0a  ..do_test 5.4 {.
1de0: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24    sqlite3_step $
1df0: 3a 3a 53 54 4d 54 0a 20 20 73 71 6c 69 74 65 33  ::STMT.  sqlite3
1e00: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 24 3a 3a  _column_text $::
1e10: 53 54 4d 54 20 30 0a 7d 20 24 62 62 62 0a 0a 64  STMT 0.} $bbb..d
1e20: 6f 5f 74 65 73 74 20 35 2e 35 20 7b 0a 20 20 73  o_test 5.5 {.  s
1e30: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
1e40: 24 3a 3a 53 54 4d 54 0a 7d 20 53 51 4c 49 54 45  $::STMT.} SQLITE
1e50: 5f 4f 4b 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  _OK..#----------
1e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1ea0: 23 20 54 65 73 74 20 76 61 72 69 6f 75 73 20 6d  # Test various m
1eb0: 6d 61 70 5f 73 69 7a 65 20 73 65 74 74 69 6e 67  map_size setting
1ec0: 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e  s..#.foreach {tn
1ed0: 31 20 6d 6d 61 70 31 20 6d 6d 61 70 32 7d 20 7b  1 mmap1 mmap2} {
1ee0: 0a 20 20 20 20 20 31 20 36 31 34 34 20 20 20 20  .     1 6144    
1ef0: 20 20 20 31 36 37 37 37 33 0a 20 20 20 20 20 32     167773.     2
1f00: 20 31 38 34 33 32 20 20 20 20 20 20 31 34 30 33   18432      1403
1f10: 39 39 0a 20 20 20 20 20 33 20 34 33 30 30 38 20  99.     3 43008 
1f20: 20 20 20 20 20 34 30 31 33 30 32 0a 20 20 20 20       401302.    
1f30: 20 34 20 39 32 31 36 30 20 20 20 20 20 20 32 35   4 92160      25
1f40: 33 38 39 39 0a 20 20 20 20 20 35 20 31 39 30 34  3899.     5 1904
1f50: 36 34 20 20 20 20 20 20 20 20 20 20 32 0a 20 20  64          2.  
1f60: 20 20 20 36 20 33 38 37 30 37 32 20 20 20 20 20     6 387072     
1f70: 37 35 32 34 33 31 0a 20 20 20 20 20 37 20 37 38  752431.     7 78
1f80: 30 32 38 38 20 20 20 20 20 32 39 31 31 34 33 0a  0288     291143.
1f90: 20 20 20 20 20 38 20 31 35 36 36 37 32 30 20 20       8 1566720  
1fa0: 20 20 35 39 34 33 30 36 0a 20 20 20 20 20 39 20    594306.     9 
1fb0: 33 31 33 39 35 38 34 20 20 20 20 38 32 39 31 33  3139584    82913
1fc0: 37 0a 20 20 20 20 20 31 30 20 36 32 38 35 33 31  7.     10 628531
1fd0: 32 20 20 20 37 39 33 39 36 33 0a 20 20 20 20 20  2   793963.     
1fe0: 31 31 20 31 32 35 37 36 37 36 38 20 31 30 31 35  11 12576768 1015
1ff0: 35 39 30 0a 7d 20 7b 0a 20 20 64 6f 5f 6d 75 6c  590.} {.  do_mul
2000: 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e  ticlient_test tn
2010: 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20   {.    sql1 {.  
2020: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2030: 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t1(a PRIMARY KE
2040: 59 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  Y);.      CREATE
2050: 20 54 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20   TABLE t2(x);.  
2060: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2070: 74 32 20 56 41 4c 55 45 53 28 27 27 29 3b 0a 20  t2 VALUES('');. 
2080: 20 20 20 7d 0a 0a 20 20 20 20 63 6f 64 65 31 20     }..    code1 
2090: 5b 72 65 67 69 73 74 65 72 5f 72 62 6c 6f 62 5f  [register_rblob_
20a0: 63 6f 64 65 20 64 62 20 20 30 5d 0a 20 20 20 20  code db  0].    
20b0: 63 6f 64 65 32 20 5b 72 65 67 69 73 74 65 72 5f  code2 [register_
20c0: 72 62 6c 6f 62 5f 63 6f 64 65 20 64 62 32 20 34  rblob_code db2 4
20d0: 34 34 5d 0a 0a 20 20 20 20 73 71 6c 31 20 22 50  44]..    sql1 "P
20e0: 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 20  RAGMA mmap_size 
20f0: 3d 20 24 6d 6d 61 70 31 22 0a 20 20 20 20 73 71  = $mmap1".    sq
2100: 6c 32 20 22 50 52 41 47 4d 41 20 6d 6d 61 70 5f  l2 "PRAGMA mmap_
2110: 73 69 7a 65 20 3d 20 24 6d 6d 61 70 32 22 0a 0a  size = $mmap2"..
2120: 20 20 20 20 64 6f 5f 74 65 73 74 20 24 74 6e 31      do_test $tn1
2130: 2e 24 74 6e 20 7b 0a 20 20 20 20 20 20 66 6f 72  .$tn {.      for
2140: 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 20 3c   {set i 1} {$i <
2150: 3d 20 31 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20  = 100} {incr i} 
2160: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 69  {.        if {$i
2170: 20 25 20 32 7d 20 7b 0a 20 20 20 20 20 20 20 20   % 2} {.        
2180: 20 20 73 65 74 20 63 31 20 73 71 6c 31 0a 20 20    set c1 sql1.  
2190: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63 32            set c2
21a0: 20 73 71 6c 32 0a 20 20 20 20 20 20 20 20 7d 20   sql2.        } 
21b0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
21c0: 20 73 65 74 20 63 31 20 73 71 6c 32 0a 20 20 20   set c1 sql2.   
21d0: 20 20 20 20 20 20 20 20 20 73 65 74 20 63 32 20           set c2 
21e0: 73 71 6c 31 0a 20 20 20 20 20 20 20 20 7d 0a 0a  sql1.        }..
21f0: 20 20 20 20 20 20 20 20 24 63 31 20 7b 0a 20 20          $c1 {.  
2200: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2210: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 20 72  NTO t1 VALUES( r
2220: 62 6c 6f 62 28 35 30 30 30 29 20 29 3b 0a 20 20  blob(5000) );.  
2230: 20 20 20 20 20 20 20 20 55 50 44 41 54 45 20 74          UPDATE t
2240: 32 20 53 45 54 20 78 20 3d 20 28 53 45 4c 45 43  2 SET x = (SELEC
2250: 54 20 6d 64 35 73 75 6d 28 61 29 20 46 52 4f 4d  T md5sum(a) FROM
2260: 20 74 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   t1);.        }.
2270: 0a 20 20 20 20 20 20 20 20 73 65 74 20 72 65 73  .        set res
2280: 20 5b 24 63 32 20 7b 0a 20 20 20 20 20 20 20 20   [$c2 {.        
2290: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
22a0: 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  (*) FROM t1;.   
22b0: 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20           SELECT 
22c0: 78 20 3d 3d 20 28 53 45 4c 45 43 54 20 6d 64 35  x == (SELECT md5
22d0: 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 31 29 20  sum(a) FROM t1) 
22e0: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 20 20 20  FROM t2;.       
22f0: 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65       PRAGMA inte
2300: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 20  grity_check;.   
2310: 20 20 20 20 20 7d 5d 0a 20 20 20 20 20 20 20 20       }].        
2320: 69 66 20 7b 24 72 65 73 20 21 3d 20 5b 6c 69 73  if {$res != [lis
2330: 74 20 24 69 20 31 20 6f 6b 5d 7d 20 7b 0a 20 20  t $i 1 ok]} {.  
2340: 20 20 20 20 20 20 20 20 64 6f 5f 74 65 73 74 20          do_test 
2350: 24 74 6e 31 2e 24 74 6e 2e 24 69 20 7b 0a 20 20  $tn1.$tn.$i {.  
2360: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
2370: 72 65 73 0a 20 20 20 20 20 20 20 20 20 20 7d 20  res.          } 
2380: 5b 6c 69 73 74 20 24 69 20 31 20 6f 6b 5d 0a 20  [list $i 1 ok]. 
2390: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23a0: 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 20 31  .      set res 1
23b0: 0a 20 20 20 20 7d 20 7b 31 7d 0a 20 20 7d 0a 7d  .    } {1}.  }.}
23c0: 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a     ...finish_test.