/ Hex Artifact Content
Login

Artifact d2cfc1635171c434dcff0ece2f1c8e0a658807ce:


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 23 20 52 65 74 75 72 6e 20 61 20 54 63 6c  ..# Return a Tcl
02c0: 20 73 63 72 69 70 74 20 74 68 61 74 20 72 65 67   script that reg
02d0: 69 73 74 65 72 73 20 61 20 75 73 65 72 2d 64 65  isters a user-de
02e0: 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e  fined scalar fun
02f0: 63 74 69 6f 6e 20 0a 23 20 6e 61 6d 65 64 20 72  ction .# named r
0300: 62 6c 6f 62 28 29 20 77 69 74 68 20 64 61 74 61  blob() with data
0310: 62 61 73 65 20 68 61 6e 64 6c 65 20 24 64 62 6e  base handle $dbn
0320: 61 6d 65 2e 20 54 68 65 20 66 75 6e 63 74 69 6f  ame. The functio
0330: 6e 20 72 65 74 75 72 6e 73 20 61 0a 23 20 73 65  n returns a.# se
0340: 71 75 65 6e 63 65 20 6f 66 20 70 73 65 75 64 6f  quence of pseudo
0350: 2d 72 61 6e 64 6f 6d 20 62 6c 6f 62 73 20 62 61  -random blobs ba
0360: 73 65 64 20 6f 6e 20 73 65 65 64 20 76 61 6c 75  sed on seed valu
0370: 65 20 24 73 65 65 64 2e 0a 23 0a 70 72 6f 63 20  e $seed..#.proc 
0380: 72 65 67 69 73 74 65 72 5f 72 62 6c 6f 62 5f 63  register_rblob_c
0390: 6f 64 65 20 7b 64 62 6e 61 6d 65 20 73 65 65 64  ode {dbname seed
03a0: 7d 20 7b 0a 20 20 72 65 74 75 72 6e 20 5b 73 75  } {.  return [su
03b0: 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20  bst -nocommands 
03c0: 7b 0a 20 20 20 20 73 65 74 20 3a 3a 72 63 6e 74  {.    set ::rcnt
03d0: 20 24 73 65 65 64 0a 20 20 20 20 70 72 6f 63 20   $seed.    proc 
03e0: 72 62 6c 6f 62 20 7b 6e 7d 20 7b 0a 20 20 20 20  rblob {n} {.    
03f0: 20 20 73 65 74 20 3a 3a 72 63 6e 74 20 5b 65 78    set ::rcnt [ex
0400: 70 72 20 28 28 5b 73 65 74 20 3a 3a 72 63 6e 74  pr (([set ::rcnt
0410: 5d 20 3c 3c 20 33 29 20 2b 20 5b 73 65 74 20 3a  ] << 3) + [set :
0420: 3a 72 63 6e 74 5d 20 2b 20 34 35 36 29 20 26 20  :rcnt] + 456) & 
0430: 30 78 46 46 46 46 46 46 46 46 5d 0a 20 20 20 20  0xFFFFFFFF].    
0440: 20 20 73 65 74 20 73 74 72 20 5b 66 6f 72 6d 61    set str [forma
0450: 74 20 25 2e 38 78 20 5b 65 78 70 72 20 5b 73 65  t %.8x [expr [se
0460: 74 20 3a 3a 72 63 6e 74 5d 20 5e 20 30 78 62 64  t ::rcnt] ^ 0xbd
0470: 66 32 30 64 61 33 5d 5d 0a 20 20 20 20 20 20 73  f20da3]].      s
0480: 74 72 69 6e 67 20 72 61 6e 67 65 20 5b 73 74 72  tring range [str
0490: 69 6e 67 20 72 65 70 65 61 74 20 5b 73 65 74 20  ing repeat [set 
04a0: 73 74 72 5d 20 5b 65 78 70 72 20 5b 73 65 74 20  str] [expr [set 
04b0: 6e 5d 2f 34 5d 5d 20 31 20 5b 73 65 74 20 6e 5d  n]/4]] 1 [set n]
04c0: 0a 20 20 20 20 7d 0a 20 20 20 20 24 64 62 6e 61  .    }.    $dbna
04d0: 6d 65 20 66 75 6e 63 20 72 62 6c 6f 62 20 72 62  me func rblob rb
04e0: 6c 6f 62 0a 20 20 7d 5d 0a 7d 0a 0a 0a 23 20 46  lob.  }].}...# F
04f0: 6f 72 20 63 61 73 65 73 20 31 2e 31 20 61 6e 64  or cases 1.1 and
0500: 20 31 2e 34 2c 20 74 68 65 20 6e 75 6d 62 65 72   1.4, the number
0510: 20 6f 66 20 70 61 67 65 73 20 72 65 61 64 20 75   of pages read u
0520: 73 69 6e 67 20 78 52 65 61 64 28 29 20 69 73 20  sing xRead() is 
0530: 34 20 6f 6e 0a 23 20 75 6e 69 78 20 61 6e 64 20  4 on.# unix and 
0540: 39 20 6f 6e 20 77 69 6e 64 6f 77 73 2e 20 54 68  9 on windows. Th
0550: 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20  e difference is 
0560: 74 68 61 74 20 77 69 6e 64 6f 77 73 20 6f 6e 6c  that windows onl
0570: 79 20 65 76 65 72 20 6d 61 70 73 0a 23 20 61 6e  y ever maps.# an
0580: 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
0590: 6f 66 20 4f 53 20 70 61 67 65 73 20 28 69 2e 65  of OS pages (i.e
05a0: 2e 20 63 72 65 61 74 65 73 20 6d 61 70 70 69 6e  . creates mappin
05b0: 67 73 20 74 68 61 74 20 61 72 65 20 61 20 6d 75  gs that are a mu
05c0: 6c 74 69 70 6c 65 0a 23 20 6f 66 20 34 4b 42 20  ltiple.# of 4KB 
05d0: 69 6e 20 73 69 7a 65 29 2e 20 57 68 65 72 65 61  in size). Wherea
05e0: 73 20 6f 6e 20 75 6e 69 78 20 61 6e 79 20 73 69  s on unix any si
05f0: 7a 65 64 20 6d 61 70 70 69 6e 67 20 6d 61 79 20  zed mapping may 
0600: 62 65 20 63 72 65 61 74 65 64 2e 0a 23 0a 66 6f  be created..#.fo
0610: 72 65 61 63 68 20 7b 74 20 6d 6d 61 70 5f 73 69  reach {t mmap_si
0620: 7a 65 20 6e 52 65 61 64 20 63 32 69 6e 69 74 7d  ze nRead c2init}
0630: 20 7b 0a 20 20 31 2e 31 20 7b 20 50 52 41 47 4d   {.  1.1 { PRAGM
0640: 41 20 6d 6d 61 70 5f 73 69 7a 65 20 3d 20 36 37  A mmap_size = 67
0650: 31 30 38 38 36 34 20 7d 20 2f 5b 34 39 5d 2f 20  108864 } /[49]/ 
0660: 7b 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a  {PRAGMA mmap_siz
0670: 65 20 3d 20 30 7d 0a 20 20 31 2e 32 20 7b 20 50  e = 0}.  1.2 { P
0680: 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 20  RAGMA mmap_size 
0690: 3d 20 20 20 20 35 33 32 34 38 20 7d 20 31 35 30  =    53248 } 150
06a0: 20 20 20 20 7b 50 52 41 47 4d 41 20 6d 6d 61 70      {PRAGMA mmap
06b0: 5f 73 69 7a 65 20 3d 20 30 7d 0a 20 20 31 2e 33  _size = 0}.  1.3
06c0: 20 7b 20 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73   { PRAGMA mmap_s
06d0: 69 7a 65 20 3d 20 20 20 20 20 20 20 20 30 20 7d  ize =        0 }
06e0: 20 33 34 34 20 20 20 20 7b 50 52 41 47 4d 41 20   344    {PRAGMA 
06f0: 6d 6d 61 70 5f 73 69 7a 65 20 3d 20 30 7d 0a 20  mmap_size = 0}. 
0700: 20 31 2e 34 20 7b 20 50 52 41 47 4d 41 20 6d 6d   1.4 { PRAGMA mm
0710: 61 70 5f 73 69 7a 65 20 3d 20 36 37 31 30 38 38  ap_size = 671088
0720: 36 34 20 7d 20 2f 5b 34 39 5d 2f 20 7b 50 52 41  64 } /[49]/ {PRA
0730: 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 20 3d 20  GMA mmap_size = 
0740: 36 37 31 30 38 38 36 34 20 7d 0a 20 20 31 2e 35  67108864 }.  1.5
0750: 20 7b 20 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73   { PRAGMA mmap_s
0760: 69 7a 65 20 3d 20 20 20 20 35 33 32 34 38 20 7d  ize =    53248 }
0770: 20 31 35 30 20 20 20 20 7b 50 52 41 47 4d 41 20   150    {PRAGMA 
0780: 6d 6d 61 70 5f 73 69 7a 65 20 3d 20 36 37 31 30  mmap_size = 6710
0790: 38 38 36 34 20 7d 0a 20 20 31 2e 36 20 7b 20 50  8864 }.  1.6 { P
07a0: 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 20  RAGMA mmap_size 
07b0: 3d 20 20 20 20 20 20 20 20 30 20 7d 20 33 34 34  =        0 } 344
07c0: 20 20 20 20 7b 50 52 41 47 4d 41 20 6d 6d 61 70      {PRAGMA mmap
07d0: 5f 73 69 7a 65 20 3d 20 36 37 31 30 38 38 36 34  _size = 67108864
07e0: 20 7d 0a 7d 20 7b 0a 0a 20 20 64 6f 5f 6d 75 6c   }.} {..  do_mul
07f0: 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e  ticlient_test tn
0800: 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 50 52 41   {.    sql1 {PRA
0810: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 3d 32  GMA cache_size=2
0820: 30 30 30 7d 0a 20 20 20 20 73 71 6c 32 20 7b 50  000}.    sql2 {P
0830: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
0840: 3d 32 30 30 30 7d 0a 0a 20 20 20 20 73 71 6c 31  =2000}..    sql1
0850: 20 7b 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69   {PRAGMA page_si
0860: 7a 65 3d 31 30 32 34 7d 0a 20 20 20 20 73 71 6c  ze=1024}.    sql
0870: 31 20 24 6d 6d 61 70 5f 73 69 7a 65 0a 20 20 20  1 $mmap_size.   
0880: 20 73 71 6c 32 20 24 63 32 69 6e 69 74 0a 0a 20   sql2 $c2init.. 
0890: 20 20 20 63 6f 64 65 32 20 5b 72 65 67 69 73 74     code2 [regist
08a0: 65 72 5f 72 62 6c 6f 62 5f 63 6f 64 65 20 64 62  er_rblob_code db
08b0: 32 20 30 5d 0a 0a 20 20 20 20 73 71 6c 32 20 7b  2 0]..    sql2 {
08c0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61  .      PRAGMA pa
08d0: 67 65 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20 20  ge_size=1024;.  
08e0: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
08f0: 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20  vacuum = 1;.    
0900: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0910: 31 28 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 61  1(a, b, UNIQUE(a
0920: 2c 20 62 29 29 3b 0a 20 20 20 20 20 20 49 4e 53  , b));.      INS
0930: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0940: 45 53 28 72 62 6c 6f 62 28 35 30 30 29 2c 20 72  ES(rblob(500), r
0950: 62 6c 6f 62 28 35 30 30 29 29 3b 0a 20 20 20 20  blob(500));.    
0960: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0970: 20 53 45 4c 45 43 54 20 72 62 6c 6f 62 28 35 30   SELECT rblob(50
0980: 30 29 2c 20 72 62 6c 6f 62 28 35 30 30 29 20 46  0), rblob(500) F
0990: 52 4f 4d 20 74 31 3b 20 2d 2d 20 20 20 20 32 0a  ROM t1; --    2.
09a0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
09b0: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 62 6c 6f  O t1 SELECT rblo
09c0: 62 28 35 30 30 29 2c 20 72 62 6c 6f 62 28 35 30  b(500), rblob(50
09d0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 2d 2d 20 20  0) FROM t1; --  
09e0: 20 20 34 0a 20 20 20 20 20 20 49 4e 53 45 52 54    4.      INSERT
09f0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
0a00: 72 62 6c 6f 62 28 35 30 30 29 2c 20 72 62 6c 6f  rblob(500), rblo
0a10: 62 28 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(500) FROM t1; 
0a20: 2d 2d 20 20 20 20 38 0a 20 20 20 20 20 20 49 4e  --    8.      IN
0a30: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
0a40: 45 43 54 20 72 62 6c 6f 62 28 35 30 30 29 2c 20  ECT rblob(500), 
0a50: 72 62 6c 6f 62 28 35 30 30 29 20 46 52 4f 4d 20  rblob(500) FROM 
0a60: 74 31 3b 20 2d 2d 20 20 20 31 36 0a 20 20 20 20  t1; --   16.    
0a70: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0a80: 20 53 45 4c 45 43 54 20 72 62 6c 6f 62 28 35 30   SELECT rblob(50
0a90: 30 29 2c 20 72 62 6c 6f 62 28 35 30 30 29 20 46  0), rblob(500) F
0aa0: 52 4f 4d 20 74 31 3b 20 2d 2d 20 20 20 33 32 0a  ROM t1; --   32.
0ab0: 20 20 20 20 7d 0a 20 20 20 20 64 6f 5f 74 65 73      }.    do_tes
0ac0: 74 20 24 74 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  t $t.$tn.1 {.   
0ad0: 20 20 20 73 71 6c 31 20 22 53 45 4c 45 43 54 20     sql1 "SELECT 
0ae0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
0af0: 3b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  ; PRAGMA integri
0b00: 74 79 5f 63 68 65 63 6b 20 3b 20 50 52 41 47 4d  ty_check ; PRAGM
0b10: 41 20 70 61 67 65 5f 63 6f 75 6e 74 22 0a 20 20  A page_count".  
0b20: 20 20 7d 20 7b 33 32 20 6f 6b 20 37 37 7d 0a 0a    } {32 ok 77}..
0b30: 20 20 20 20 23 20 48 61 76 65 20 63 6f 6e 6e 65      # Have conne
0b40: 63 74 69 6f 6e 20 32 20 73 68 72 69 6e 6b 20 74  ction 2 shrink t
0b50: 68 65 20 66 69 6c 65 2e 20 43 68 65 63 6b 20 63  he file. Check c
0b60: 6f 6e 6e 65 63 74 69 6f 6e 20 31 20 63 61 6e 20  onnection 1 can 
0b70: 73 74 69 6c 6c 20 72 65 61 64 20 69 74 2e 0a 20  still read it.. 
0b80: 20 20 20 73 71 6c 32 20 7b 20 44 45 4c 45 54 45     sql2 { DELETE
0b90: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72   FROM t1 WHERE r
0ba0: 6f 77 69 64 25 32 3b 20 7d 0a 20 20 20 20 64 6f  owid%2; }.    do
0bb0: 5f 74 65 73 74 20 24 74 2e 24 74 6e 2e 32 20 7b  _test $t.$tn.2 {
0bc0: 0a 20 20 20 20 20 20 73 71 6c 31 20 22 53 45 4c  .      sql1 "SEL
0bd0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
0be0: 4d 20 74 31 3b 20 50 52 41 47 4d 41 20 69 6e 74  M t1; PRAGMA int
0bf0: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 3b 20 50  egrity_check ; P
0c00: 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e 74  RAGMA page_count
0c10: 22 0a 20 20 20 20 7d 20 22 31 36 20 6f 6b 20 5b  ".    } "16 ok [
0c20: 65 78 70 72 20 7b 34 32 2b 5b 6e 6f 6e 7a 65 72  expr {42+[nonzer
0c30: 6f 5f 72 65 73 65 72 76 65 64 5f 62 79 74 65 73  o_reserved_bytes
0c40: 5d 7d 5d 22 0a 0a 20 20 20 20 23 20 48 61 76 65  ]}]"..    # Have
0c50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 32 20 67 72   connection 2 gr
0c60: 6f 77 20 74 68 65 20 66 69 6c 65 2e 20 43 68 65  ow the file. Che
0c70: 63 6b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 20  ck connection 1 
0c80: 63 61 6e 20 73 74 69 6c 6c 20 72 65 61 64 20 69  can still read i
0c90: 74 2e 0a 20 20 20 20 73 71 6c 32 20 7b 20 49 4e  t..    sql2 { IN
0ca0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
0cb0: 45 43 54 20 72 62 6c 6f 62 28 35 30 30 29 2c 20  ECT rblob(500), 
0cc0: 72 62 6c 6f 62 28 35 30 30 29 20 46 52 4f 4d 20  rblob(500) FROM 
0cd0: 74 31 20 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74  t1 }.    do_test
0ce0: 20 24 74 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20   $t.$tn.3 {.    
0cf0: 20 20 73 71 6c 31 20 22 53 45 4c 45 43 54 20 63    sql1 "SELECT c
0d00: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
0d10: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
0d20: 79 5f 63 68 65 63 6b 20 3b 20 50 52 41 47 4d 41  y_check ; PRAGMA
0d30: 20 70 61 67 65 5f 63 6f 75 6e 74 22 0a 20 20 20   page_count".   
0d40: 20 7d 20 7b 33 32 20 6f 6b 20 37 39 7d 0a 0a 20   } {32 ok 79}.. 
0d50: 20 20 20 23 20 48 61 76 65 20 63 6f 6e 6e 65 63     # Have connec
0d60: 74 69 6f 6e 20 32 20 67 72 6f 77 20 74 68 65 20  tion 2 grow the 
0d70: 66 69 6c 65 20 61 67 61 69 6e 2e 20 43 68 65 63  file again. Chec
0d80: 6b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 20 69  k connection 1 i
0d90: 73 20 73 74 69 6c 6c 20 6f 6b 2e 0a 20 20 20 20  s still ok..    
0da0: 73 71 6c 32 20 7b 20 49 4e 53 45 52 54 20 49 4e  sql2 { INSERT IN
0db0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 62 6c  TO t1 SELECT rbl
0dc0: 6f 62 28 35 30 30 29 2c 20 72 62 6c 6f 62 28 35  ob(500), rblob(5
0dd0: 30 30 29 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  00) FROM t1 }.  
0de0: 20 20 64 6f 5f 74 65 73 74 20 24 74 2e 24 74 6e    do_test $t.$tn
0df0: 2e 34 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20  .4 {.      sql1 
0e00: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
0e10: 20 46 52 4f 4d 20 74 31 3b 20 50 52 41 47 4d 41   FROM t1; PRAGMA
0e20: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
0e30: 20 3b 20 50 52 41 47 4d 41 20 70 61 67 65 5f 63   ; PRAGMA page_c
0e40: 6f 75 6e 74 22 0a 20 20 20 20 7d 20 7b 36 34 20  ount".    } {64 
0e50: 6f 6b 20 31 34 39 7d 0a 0a 20 20 20 20 23 20 43  ok 149}..    # C
0e60: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6e 75  heck that the nu
0e70: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 72 65  mber of pages re
0e80: 61 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ad by connection
0e90: 20 31 20 69 6e 64 69 63 61 74 65 73 20 74 68 61   1 indicates tha
0ea0: 74 20 74 68 65 0a 20 20 20 20 23 20 22 50 52 41  t the.    # "PRA
0eb0: 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 22 20 63  GMA mmap_size" c
0ec0: 6f 6d 6d 61 6e 64 20 77 6f 72 6b 65 64 2e 0a 20  ommand worked.. 
0ed0: 20 20 20 69 66 20 7b 5b 6e 6f 6e 7a 65 72 6f 5f     if {[nonzero_
0ee0: 72 65 73 65 72 76 65 64 5f 62 79 74 65 73 5d 3d  reserved_bytes]=
0ef0: 3d 30 7d 20 7b 0a 20 20 20 20 20 20 64 6f 5f 74  =0} {.      do_t
0f00: 65 73 74 20 24 74 2e 24 74 6e 2e 35 20 7b 20 6e  est $t.$tn.5 { n
0f10: 52 65 61 64 20 64 62 20 7d 20 24 6e 52 65 61 64  Read db } $nRead
0f20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 65  .    }.  }.}..se
0f30: 74 20 3a 3a 72 63 6e 74 20 30 0a 70 72 6f 63 20  t ::rcnt 0.proc 
0f40: 72 62 6c 6f 62 20 7b 6e 7d 20 7b 0a 20 20 73 65  rblob {n} {.  se
0f50: 74 20 3a 3a 72 63 6e 74 20 5b 65 78 70 72 20 28  t ::rcnt [expr (
0f60: 28 24 3a 3a 72 63 6e 74 20 3c 3c 20 33 29 20 2b  ($::rcnt << 3) +
0f70: 20 24 3a 3a 72 63 6e 74 20 2b 20 34 35 36 29 20   $::rcnt + 456) 
0f80: 26 20 30 78 46 46 46 46 46 46 46 46 5d 0a 20 20  & 0xFFFFFFFF].  
0f90: 73 65 74 20 73 74 72 20 5b 66 6f 72 6d 61 74 20  set str [format 
0fa0: 25 2e 38 78 20 5b 65 78 70 72 20 24 3a 3a 72 63  %.8x [expr $::rc
0fb0: 6e 74 20 5e 20 30 78 62 64 66 32 30 64 61 33 5d  nt ^ 0xbdf20da3]
0fc0: 5d 0a 20 20 73 74 72 69 6e 67 20 72 61 6e 67 65  ].  string range
0fd0: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
0fe0: 24 73 74 72 20 5b 65 78 70 72 20 24 6e 2f 34 5d  $str [expr $n/4]
0ff0: 5d 20 31 20 24 6e 0a 7d 0a 0a 72 65 73 65 74 5f  ] 1 $n.}..reset_
1000: 64 62 0a 64 62 20 66 75 6e 63 20 72 62 6c 6f 62  db.db func rblob
1010: 20 72 62 6c 6f 62 0a 0a 69 66 63 61 70 61 62 6c   rblob..ifcapabl
1020: 65 20 77 61 6c 20 7b 0a 20 20 64 6f 5f 65 78 65  e wal {.  do_exe
1030: 63 73 71 6c 5f 74 65 73 74 20 32 2e 31 20 7b 0a  csql_test 2.1 {.
1040: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
1050: 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20  vacuum = 1;.    
1060: 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65  PRAGMA mmap_size
1070: 20 3d 20 36 37 31 30 38 38 36 34 3b 0a 20 20 20   = 67108864;.   
1080: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
1090: 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20  mode = wal;.    
10a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
10b0: 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c 20  a, b, UNIQUE(a, 
10c0: 62 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  b));.    INSERT 
10d0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72  INTO t1 VALUES(r
10e0: 62 6c 6f 62 28 35 30 30 29 2c 20 72 62 6c 6f 62  blob(500), rblob
10f0: 28 35 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (500));.    INSE
1100: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
1110: 54 20 72 62 6c 6f 62 28 35 30 30 29 2c 20 72 62  T rblob(500), rb
1120: 6c 6f 62 28 35 30 30 29 20 46 52 4f 4d 20 74 31  lob(500) FROM t1
1130: 3b 20 2d 2d 20 20 20 20 32 0a 20 20 20 20 49 4e  ; --    2.    IN
1140: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
1150: 45 43 54 20 72 62 6c 6f 62 28 35 30 30 29 2c 20  ECT rblob(500), 
1160: 72 62 6c 6f 62 28 35 30 30 29 20 46 52 4f 4d 20  rblob(500) FROM 
1170: 74 31 3b 20 2d 2d 20 20 20 20 34 0a 20 20 20 20  t1; --    4.    
1180: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
1190: 45 4c 45 43 54 20 72 62 6c 6f 62 28 35 30 30 29  ELECT rblob(500)
11a0: 2c 20 72 62 6c 6f 62 28 35 30 30 29 20 46 52 4f  , rblob(500) FRO
11b0: 4d 20 74 31 3b 20 2d 2d 20 20 20 20 38 0a 20 20  M t1; --    8.  
11c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
11d0: 20 53 45 4c 45 43 54 20 72 62 6c 6f 62 28 35 30   SELECT rblob(50
11e0: 30 29 2c 20 72 62 6c 6f 62 28 35 30 30 29 20 46  0), rblob(500) F
11f0: 52 4f 4d 20 74 31 3b 20 2d 2d 20 20 20 31 36 0a  ROM t1; --   16.
1200: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1210: 74 31 20 53 45 4c 45 43 54 20 72 62 6c 6f 62 28  t1 SELECT rblob(
1220: 35 30 30 29 2c 20 72 62 6c 6f 62 28 35 30 30 29  500), rblob(500)
1230: 20 46 52 4f 4d 20 74 31 3b 20 2d 2d 20 20 20 33   FROM t1; --   3
1240: 32 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c  2.    PRAGMA wal
1250: 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 7d  _checkpoint;.  }
1260: 20 7b 36 37 31 30 38 38 36 34 20 77 61 6c 20 30   {67108864 wal 0
1270: 20 31 30 33 20 31 30 33 7d 0a 0a 20 20 64 6f 5f   103 103}..  do_
1280: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 32  execsql_test 2.2
1290: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75   {.    PRAGMA au
12a0: 74 6f 5f 76 61 63 75 75 6d 3b 0a 20 20 20 20 53  to_vacuum;.    S
12b0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
12c0: 52 4f 4d 20 74 31 3b 0a 20 20 7d 20 7b 31 20 33  ROM t1;.  } {1 3
12d0: 32 7d 0a 0a 20 20 69 66 20 7b 5b 70 65 72 6d 75  2}..  if {[permu
12e0: 74 61 74 69 6f 6e 5d 20 21 3d 20 22 69 6e 6d 65  tation] != "inme
12f0: 6d 6f 72 79 5f 6a 6f 75 72 6e 61 6c 22 7d 20 7b  mory_journal"} {
1300: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 32 2e 33  .    do_test 2.3
1310: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1320: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20   db2 test.db.   
1330: 20 20 20 64 62 32 20 66 75 6e 63 20 72 62 6c 6f     db2 func rblo
1340: 62 20 72 62 6c 6f 62 0a 20 20 20 20 20 20 64 62  b rblob.      db
1350: 32 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 20  2 eval {.       
1360: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20   DELETE FROM t1 
1370: 57 48 45 52 45 20 28 72 6f 77 69 64 25 34 29 3b  WHERE (rowid%4);
1380: 0a 20 20 20 20 20 20 20 20 20 20 50 52 41 47 4d  .          PRAGM
1390: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
13a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13b0: 64 62 32 20 65 76 61 6c 20 7b 0a 20 20 20 20 20  db2 eval {.     
13c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
13d0: 31 20 53 45 4c 45 43 54 20 72 62 6c 6f 62 28 35  1 SELECT rblob(5
13e0: 30 30 29 2c 20 72 62 6c 6f 62 28 35 30 30 29 20  00), rblob(500) 
13f0: 46 52 4f 4d 20 74 31 3b 20 2d 2d 20 20 20 20 31  FROM t1; --    1
1400: 36 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  6.        SELECT
1410: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
1420: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1430: 20 7b 31 36 7d 0a 0a 20 20 20 20 64 6f 5f 65 78   {16}..    do_ex
1440: 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 34 20 7b  ecsql_test 2.4 {
1450: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 77 61  .      PRAGMA wa
1460: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20  l_checkpoint;.  
1470: 20 20 7d 20 7b 30 20 32 34 20 32 34 7d 0a 20 20    } {0 24 24}.  
1480: 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 7d 0a    db2 close.  }.
1490: 7d 0a 0a 72 65 73 65 74 5f 64 62 0a 65 78 65 63  }..reset_db.exec
14a0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6d 6d 61  sql { PRAGMA mma
14b0: 70 5f 73 69 7a 65 20 3d 20 36 37 31 30 38 38 36  p_size = 6710886
14c0: 34 3b 20 7d 0a 64 62 20 66 75 6e 63 20 72 62 6c  4; }.db func rbl
14d0: 6f 62 20 72 62 6c 6f 62 0a 64 6f 5f 65 78 65 63  ob rblob.do_exec
14e0: 73 71 6c 5f 74 65 73 74 20 33 2e 31 20 7b 0a 20  sql_test 3.1 {. 
14f0: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
1500: 75 75 6d 20 3d 20 31 3b 0a 0a 20 20 43 52 45 41  uum = 1;..  CREA
1510: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
1520: 2c 20 55 4e 49 51 55 45 28 61 2c 20 62 29 29 3b  , UNIQUE(a, b));
1530: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
1540: 31 20 56 41 4c 55 45 53 28 72 62 6c 6f 62 28 35  1 VALUES(rblob(5
1550: 30 30 29 2c 20 72 62 6c 6f 62 28 35 30 30 29 29  00), rblob(500))
1560: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
1570: 74 31 20 53 45 4c 45 43 54 20 72 62 6c 6f 62 28  t1 SELECT rblob(
1580: 35 30 30 29 2c 20 72 62 6c 6f 62 28 35 30 30 29  500), rblob(500)
1590: 20 46 52 4f 4d 20 74 31 3b 20 2d 2d 20 20 20 20   FROM t1; --    
15a0: 32 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  2.  INSERT INTO 
15b0: 74 31 20 53 45 4c 45 43 54 20 72 62 6c 6f 62 28  t1 SELECT rblob(
15c0: 35 30 30 29 2c 20 72 62 6c 6f 62 28 35 30 30 29  500), rblob(500)
15d0: 20 46 52 4f 4d 20 74 31 3b 20 2d 2d 20 20 20 20   FROM t1; --    
15e0: 34 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  4.  INSERT INTO 
15f0: 74 31 20 53 45 4c 45 43 54 20 72 62 6c 6f 62 28  t1 SELECT rblob(
1600: 35 30 30 29 2c 20 72 62 6c 6f 62 28 35 30 30 29  500), rblob(500)
1610: 20 46 52 4f 4d 20 74 31 3b 20 2d 2d 20 20 20 20   FROM t1; --    
1620: 38 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  8..  CREATE TABL
1630: 45 20 74 32 28 61 2c 20 62 2c 20 55 4e 49 51 55  E t2(a, b, UNIQU
1640: 45 28 61 2c 20 62 29 29 3b 0a 20 20 49 4e 53 45  E(a, b));.  INSE
1650: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
1660: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b  T * FROM t1;.} {
1670: 7d 0a 0a 64 6f 5f 74 65 73 74 20 33 2e 32 20 7b  }..do_test 3.2 {
1680: 0a 20 20 73 65 74 20 6e 52 6f 77 20 30 0a 20 20  .  set nRow 0.  
1690: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
16a0: 2a 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  * FROM t2 ORDER 
16b0: 42 59 20 61 2c 20 62 7d 20 7b 0a 20 20 20 20 69  BY a, b} {.    i
16c0: 66 20 7b 24 6e 52 6f 77 3d 3d 34 7d 20 7b 20 64  f {$nRow==4} { d
16d0: 62 20 65 76 61 6c 20 7b 20 44 45 4c 45 54 45 20  b eval { DELETE 
16e0: 46 52 4f 4d 20 74 31 20 7d 20 7d 0a 20 20 20 20  FROM t1 } }.    
16f0: 69 6e 63 72 20 6e 52 6f 77 0a 20 20 7d 0a 20 20  incr nRow.  }.  
1700: 73 65 74 20 6e 52 6f 77 0a 7d 20 7b 38 7d 0a 0a  set nRow.} {8}..
1710: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 6e 73  ----------.# Ens
1760: 75 72 65 20 74 68 61 74 20 65 78 69 73 74 69 6e  ure that existin
1770: 67 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20  g cursors using 
1780: 78 46 65 74 63 68 28 29 20 70 61 67 65 73 20 73  xFetch() pages s
1790: 65 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 0a  ee changes made.
17a0: 23 20 74 6f 20 72 6f 77 73 20 75 73 69 6e 67 20  # to rows using 
17b0: 74 68 65 20 69 6e 63 72 62 6c 6f 62 20 41 50 49  the incrblob API
17c0: 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a 65 78 65  ..#.reset_db.exe
17d0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 6d 6d  csql { PRAGMA mm
17e0: 61 70 5f 73 69 7a 65 20 3d 20 36 37 31 30 38 38  ap_size = 671088
17f0: 36 34 3b 20 7d 0a 73 65 74 20 61 61 61 20 5b 73  64; }.set aaa [s
1800: 74 72 69 6e 67 20 72 65 70 65 61 74 20 61 20 34  tring repeat a 4
1810: 30 30 5d 0a 73 65 74 20 62 62 62 20 5b 73 74 72  00].set bbb [str
1820: 69 6e 67 20 72 65 70 65 61 74 20 62 20 34 30 30  ing repeat b 400
1830: 5d 0a 73 65 74 20 63 63 63 20 5b 73 74 72 69 6e  ].set ccc [strin
1840: 67 20 72 65 70 65 61 74 20 63 20 34 30 30 5d 0a  g repeat c 400].
1850: 73 65 74 20 64 64 64 20 5b 73 74 72 69 6e 67 20  set ddd [string 
1860: 72 65 70 65 61 74 20 64 20 34 30 30 5d 0a 73 65  repeat d 400].se
1870: 74 20 65 65 65 20 5b 73 74 72 69 6e 67 20 72 65  t eee [string re
1880: 70 65 61 74 20 65 20 34 30 30 5d 0a 0a 64 6f 5f  peat e 400]..do_
1890: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 31  execsql_test 4.1
18a0: 20 7b 0a 20 20 50 52 41 47 4d 41 20 70 61 67 65   {.  PRAGMA page
18b0: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
18c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
18d0: 78 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  x);.  INSERT INT
18e0: 4f 20 74 31 20 56 41 4c 55 45 53 28 24 61 61 61  O t1 VALUES($aaa
18f0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
1900: 20 74 31 20 56 41 4c 55 45 53 28 24 62 62 62 29   t1 VALUES($bbb)
1910: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
1920: 74 31 20 56 41 4c 55 45 53 28 24 63 63 63 29 3b  t1 VALUES($ccc);
1930: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
1940: 31 20 56 41 4c 55 45 53 28 24 64 64 64 29 3b 0a  1 VALUES($ddd);.
1950: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1960: 74 31 3b 0a 20 20 42 45 47 49 4e 3b 0a 7d 20 5b  t1;.  BEGIN;.} [
1970: 6c 69 73 74 20 24 61 61 61 20 24 62 62 62 20 24  list $aaa $bbb $
1980: 63 63 63 20 24 64 64 64 5d 0a 0a 64 6f 5f 74 65  ccc $ddd]..do_te
1990: 73 74 20 34 2e 32 20 7b 0a 20 20 73 65 74 20 3a  st 4.2 {.  set :
19a0: 3a 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f 70  :STMT [sqlite3_p
19b0: 72 65 70 61 72 65 20 64 62 20 22 53 45 4c 45 43  repare db "SELEC
19c0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  T * FROM t1 ORDE
19d0: 52 20 42 59 20 72 6f 77 69 64 22 20 2d 31 20 64  R BY rowid" -1 d
19e0: 75 6d 6d 79 5d 0a 20 20 73 71 6c 69 74 65 33 5f  ummy].  sqlite3_
19f0: 73 74 65 70 20 24 3a 3a 53 54 4d 54 0a 20 20 73  step $::STMT.  s
1a00: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1a10: 78 74 20 24 3a 3a 53 54 4d 54 20 30 0a 7d 20 24  xt $::STMT 0.} $
1a20: 61 61 61 0a 0a 64 6f 5f 74 65 73 74 20 34 2e 33  aaa..do_test 4.3
1a30: 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 72 20 7b   {.  foreach r {
1a40: 32 20 33 20 34 7d 20 7b 0a 20 20 20 20 73 65 74  2 3 4} {.    set
1a50: 20 66 64 20 5b 64 62 20 69 6e 63 72 62 6c 6f 62   fd [db incrblob
1a60: 20 74 31 20 78 20 24 72 5d 0a 20 20 20 20 70 75   t1 x $r].    pu
1a70: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66  ts -nonewline $f
1a80: 64 20 24 65 65 65 0a 20 20 20 20 63 6c 6f 73 65  d $eee.    close
1a90: 20 24 66 64 0a 20 20 7d 0a 0a 20 20 73 65 74 20   $fd.  }..  set 
1aa0: 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20 77 68 69  res [list].  whi
1ab0: 6c 65 20 7b 22 53 51 4c 49 54 45 5f 52 4f 57 22  le {"SQLITE_ROW"
1ac0: 20 3d 3d 20 5b 73 71 6c 69 74 65 33 5f 73 74 65   == [sqlite3_ste
1ad0: 70 20 24 3a 3a 53 54 4d 54 5d 7d 20 7b 0a 20 20  p $::STMT]} {.  
1ae0: 20 20 6c 61 70 70 65 6e 64 20 72 65 73 20 5b 73    lappend res [s
1af0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1b00: 78 74 20 24 3a 3a 53 54 4d 54 20 30 5d 0a 20 20  xt $::STMT 0].  
1b10: 7d 0a 20 20 73 65 74 20 72 65 73 0a 7d 20 5b 6c  }.  set res.} [l
1b20: 69 73 74 20 24 65 65 65 20 24 65 65 65 20 24 65  ist $eee $eee $e
1b30: 65 65 5d 0a 0a 64 6f 5f 74 65 73 74 20 34 2e 34  ee]..do_test 4.4
1b40: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   {.  sqlite3_fin
1b50: 61 6c 69 7a 65 20 24 3a 3a 53 54 4d 54 0a 7d 20  alize $::STMT.} 
1b60: 53 51 4c 49 54 45 5f 4f 4b 0a 0a 64 6f 5f 65 78  SQLITE_OK..do_ex
1b70: 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 35 20 7b  ecsql_test 4.5 {
1b80: 20 43 4f 4d 4d 49 54 20 7d 0a 0a 23 2d 2d 2d 2d   COMMIT }..#----
1b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bd0: 2d 2d 2d 2d 2d 0a 23 20 45 6e 73 75 72 65 20 74  -----.# Ensure t
1be0: 68 61 74 20 65 78 69 73 74 69 6e 67 20 63 75 72  hat existing cur
1bf0: 73 6f 72 73 20 68 6f 6c 64 69 6e 67 20 78 46 65  sors holding xFe
1c00: 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73  tch() references
1c10: 20 61 72 65 20 6e 6f 74 0a 23 20 63 6f 6e 66 75   are not.# confu
1c20: 73 65 64 20 69 66 20 74 68 6f 73 65 20 70 61 67  sed if those pag
1c30: 65 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  es are moved to 
1c40: 6d 61 6b 65 20 77 61 79 20 66 6f 72 20 74 68 65  make way for the
1c50: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 0a   root page of a.
1c60: 23 20 6e 65 77 20 74 61 62 6c 65 20 6f 72 20 69  # new table or i
1c70: 6e 64 65 78 2e 0a 23 0a 72 65 73 65 74 5f 64 62  ndex..#.reset_db
1c80: 0a 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d  .execsql { PRAGM
1c90: 41 20 6d 6d 61 70 5f 73 69 7a 65 20 3d 20 36 37  A mmap_size = 67
1ca0: 31 30 38 38 36 34 3b 20 7d 0a 64 6f 5f 65 78 65  108864; }.do_exe
1cb0: 63 73 71 6c 5f 74 65 73 74 20 35 2e 31 20 7b 0a  csql_test 5.1 {.
1cc0: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
1cd0: 63 75 75 6d 20 3d 20 32 3b 0a 20 20 50 52 41 47  cuum = 2;.  PRAG
1ce0: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
1cf0: 30 32 34 3b 0a 20 20 43 52 45 41 54 45 20 54 41  024;.  CREATE TA
1d00: 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 49 4e 53  BLE t1(x);.  INS
1d10: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1d20: 45 53 28 24 61 61 61 29 3b 0a 20 20 49 4e 53 45  ES($aaa);.  INSE
1d30: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1d40: 53 28 24 62 62 62 29 3b 0a 20 20 49 4e 53 45 52  S($bbb);.  INSER
1d50: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1d60: 28 24 63 63 63 29 3b 0a 20 20 49 4e 53 45 52 54  ($ccc);.  INSERT
1d70: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1d80: 24 64 64 64 29 3b 0a 0a 20 20 50 52 41 47 4d 41  $ddd);..  PRAGMA
1d90: 20 61 75 74 6f 5f 76 61 63 75 75 6d 3b 0a 20 20   auto_vacuum;.  
1da0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1db0: 3b 0a 7d 20 5b 6c 69 73 74 20 32 20 24 61 61 61  ;.} [list 2 $aaa
1dc0: 20 24 62 62 62 20 24 63 63 63 20 24 64 64 64 5d   $bbb $ccc $ddd]
1dd0: 0a 0a 64 6f 5f 74 65 73 74 20 35 2e 32 20 7b 0a  ..do_test 5.2 {.
1de0: 20 20 73 65 74 20 3a 3a 53 54 4d 54 20 5b 73 71    set ::STMT [sq
1df0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 64 62  lite3_prepare db
1e00: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
1e10: 74 31 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  t1 ORDER BY rowi
1e20: 64 22 20 2d 31 20 64 75 6d 6d 79 5d 0a 20 20 73  d" -1 dummy].  s
1e30: 71 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53  qlite3_step $::S
1e40: 54 4d 54 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  TMT.  sqlite3_co
1e50: 6c 75 6d 6e 5f 74 65 78 74 20 24 3a 3a 53 54 4d  lumn_text $::STM
1e60: 54 20 30 0a 7d 20 24 61 61 61 0a 0a 64 6f 5f 65  T 0.} $aaa..do_e
1e70: 78 65 63 73 71 6c 5f 74 65 73 74 20 35 2e 33 20  xecsql_test 5.3 
1e80: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
1e90: 20 74 32 28 78 29 3b 0a 20 20 49 4e 53 45 52 54   t2(x);.  INSERT
1ea0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1eb0: 27 74 72 69 63 6b 65 64 20 79 6f 75 21 27 29 3b  'tricked you!');
1ec0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
1ed0: 32 20 56 41 4c 55 45 53 28 27 74 72 69 63 6b 65  2 VALUES('tricke
1ee0: 64 20 79 6f 75 21 27 29 3b 0a 7d 0a 0a 64 6f 5f  d you!');.}..do_
1ef0: 74 65 73 74 20 35 2e 34 20 7b 0a 20 20 73 71 6c  test 5.4 {.  sql
1f00: 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54 4d  ite3_step $::STM
1f10: 54 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  T.  sqlite3_colu
1f20: 6d 6e 5f 74 65 78 74 20 24 3a 3a 53 54 4d 54 20  mn_text $::STMT 
1f30: 30 0a 7d 20 24 62 62 62 0a 0a 64 6f 5f 74 65 73  0.} $bbb..do_tes
1f40: 74 20 35 2e 35 20 7b 0a 20 20 73 71 6c 69 74 65  t 5.5 {.  sqlite
1f50: 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54  3_finalize $::ST
1f60: 4d 54 0a 7d 20 53 51 4c 49 54 45 5f 4f 4b 0a 0a  MT.} SQLITE_OK..
1f70: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.