/ Hex Artifact Content
Login

Artifact 5586f43fcd9a1be0830793cf9d354082c261b25b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 70  or testing the p
0190: 61 67 65 72 2e 63 20 6d 6f 64 75 6c 65 20 69 6e  ager.c module in
01a0: 20 53 51 4c 69 74 65 2e 20 20 54 68 69 73 20 63   SQLite.  This c
01b0: 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e  ode.** is not in
01c0: 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 53 51  cluded in the SQ
01d0: 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20 20 49  Lite library.  I
01e0: 74 20 69 73 20 75 73 65 64 20 66 6f 72 20 61 75  t is used for au
01f0: 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73 74 69  tomated.** testi
0200: 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69 74 65  ng of the SQLite
0210: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e   library..*/.#in
0220: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
0230: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63  .h".#include "tc
0240: 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73  l.h".#include <s
0250: 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64  tdlib.h>.#includ
0260: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e  e <string.h>.#in
0270: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0280: 0a 65 78 74 65 72 6e 20 63 6f 6e 73 74 20 63 68  .extern const ch
0290: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61  ar *sqlite3ErrNa
02a0: 6d 65 28 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  me(int);../*.** 
02b0: 50 61 67 65 20 73 69 7a 65 20 61 6e 64 20 72 65  Page size and re
02c0: 73 65 72 76 65 64 20 73 69 7a 65 20 75 73 65 64  served size used
02d0: 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f   for testing..*/
02e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
02f0: 5f 70 61 67 65 73 69 7a 65 20 3d 20 31 30 32 34  _pagesize = 1024
0300: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 75 6d 6d 79 20 70  ;../*.** Dummy p
0310: 61 67 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65  age reinitialize
0320: 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  r.*/.static void
0330: 20 70 61 67 65 72 5f 74 65 73 74 5f 72 65 69 6e   pager_test_rein
0340: 69 74 65 72 28 44 62 50 61 67 65 20 2a 70 4e 6f  iter(DbPage *pNo
0350: 74 55 73 65 64 29 7b 0a 20 20 72 65 74 75 72 6e  tUsed){.  return
0360: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
0370: 3a 20 20 20 70 61 67 65 72 5f 6f 70 65 6e 20 46  :   pager_open F
0380: 49 4c 45 4e 41 4d 45 20 4e 2d 50 41 47 45 0a 2a  ILENAME N-PAGE.*
0390: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
03a0: 70 61 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  pager.*/.static 
03b0: 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 28 0a  int pager_open(.
03c0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
03d0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
03e0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
03f0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
0400: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
0410: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
0420: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
0430: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0440: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
0450: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
0460: 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78  argv      /* Tex
0470: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
0480: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 70  nt */.){.  u32 p
0490: 61 67 65 53 69 7a 65 3b 0a 20 20 50 61 67 65 72  ageSize;.  Pager
04a0: 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
04b0: 6e 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b  nPage;.  int rc;
04c0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
04d0: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  ];.  if( argc!=3
04e0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
04f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
0500: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
0510: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
0520: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
0530: 20 46 49 4c 45 4e 41 4d 45 20 4e 2d 50 41 47 45   FILENAME N-PAGE
0540: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
0550: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0560: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
0570: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
0580: 5b 32 5d 2c 20 26 6e 50 61 67 65 29 20 29 20 72  [2], &nPage) ) r
0590: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
05a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
05b0: 61 67 65 72 4f 70 65 6e 28 73 71 6c 69 74 65 33  agerOpen(sqlite3
05c0: 5f 76 66 73 5f 66 69 6e 64 28 30 29 2c 20 26 70  _vfs_find(0), &p
05d0: 50 61 67 65 72 2c 20 61 72 67 76 5b 31 5d 2c 20  Pager, argv[1], 
05e0: 30 2c 20 30 2c 0a 20 20 20 20 20 20 53 51 4c 49  0, 0,.      SQLI
05f0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
0600: 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
0610: 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
0620: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 2c 0a 20 20  OPEN_MAIN_DB,.  
0630: 20 20 20 20 70 61 67 65 72 5f 74 65 73 74 5f 72      pager_test_r
0640: 65 69 6e 69 74 65 72 29 3b 0a 20 20 69 66 28 20  einiter);.  if( 
0650: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
0660: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
0670: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
0680: 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
0690: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
06a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
06b0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
06c0: 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
06d0: 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 70 61 67  r, nPage);.  pag
06e0: 65 53 69 7a 65 20 3d 20 74 65 73 74 5f 70 61 67  eSize = test_pag
06f0: 65 73 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33  esize;.  sqlite3
0700: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
0710: 28 70 50 61 67 65 72 2c 20 26 70 61 67 65 53 69  (pPager, &pageSi
0720: 7a 65 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74  ze, -1);.  sqlit
0730: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
0740: 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25  of(zBuf),zBuf,"%
0750: 70 22 2c 70 50 61 67 65 72 29 3b 0a 20 20 54 63  p",pPager);.  Tc
0760: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0770: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
0780: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
0790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
07a0: 3a 20 20 20 70 61 67 65 72 5f 63 6c 6f 73 65 20  :   pager_close 
07b0: 49 44 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  ID.**.** Close t
07c0: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
07d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
07e0: 67 65 72 5f 63 6c 6f 73 65 28 0a 20 20 76 6f 69  ger_close(.  voi
07f0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
0800: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0810: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
0820: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
0830: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
0840: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
0850: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
0860: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
0870: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f  rguments */.  co
0880: 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20  nst char **argv 
0890: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
08a0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
08b0: 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  .){.  Pager *pPa
08c0: 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ger;.  int rc;. 
08d0: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
08e0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
08f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
0900: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
0910: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
0920: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c  0],.       " ID\
0930: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
0940: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
0950: 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c  }.  pPager = sql
0960: 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74  ite3TestTextToPt
0970: 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 63  r(argv[1]);.  rc
0980: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
0990: 6c 6f 73 65 28 70 50 61 67 65 72 29 3b 0a 20 20  lose(pPager);.  
09a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
09b0: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  K ){.    Tcl_App
09c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
09d0: 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
09e0: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
09f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0a00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
0a10: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
0a20: 61 67 65 3a 20 20 20 70 61 67 65 72 5f 72 6f 6c  age:   pager_rol
0a30: 6c 62 61 63 6b 20 49 44 0a 2a 2a 0a 2a 2a 20 52  lback ID.**.** R
0a40: 6f 6c 6c 62 61 63 6b 20 63 68 61 6e 67 65 73 0a  ollback changes.
0a50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
0a60: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 0a 20 20  ger_rollback(.  
0a70: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
0a80: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0a90: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
0aa0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
0ab0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
0ac0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
0ad0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
0ae0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
0af0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
0b00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
0b10: 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20  gv      /* Text 
0b20: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
0b30: 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a   */.){.  Pager *
0b40: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
0b50: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
0b60: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
0b70: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
0b80: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
0b90: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
0ba0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
0bb0: 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  ID\"", 0);.    r
0bc0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0bd0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20  .  }.  pPager = 
0be0: 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54  sqlite3TestTextT
0bf0: 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20  oPtr(argv[1]);. 
0c00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
0c10: 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
0c20: 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
0c30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
0c40: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
0c50: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
0c60: 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  rrName(rc), 0);.
0c70: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
0c80: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
0c90: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
0ca0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 70 61 67  .** Usage:   pag
0cb0: 65 72 5f 63 6f 6d 6d 69 74 20 49 44 0a 2a 2a 0a  er_commit ID.**.
0cc0: 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
0cd0: 61 6e 67 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  anges.*/.static 
0ce0: 69 6e 74 20 70 61 67 65 72 5f 63 6f 6d 6d 69 74  int pager_commit
0cf0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
0d00: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
0d10: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
0d20: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
0d30: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
0d40: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
0d50: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
0d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
0d70: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
0d80: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0d90: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
0da0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
0db0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 50 61 67  ment */.){.  Pag
0dc0: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e  er *pPager;.  in
0dd0: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
0de0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
0df0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
0e00: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
0e10: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
0e20: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
0e30: 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20    " ID\"", 0);. 
0e40: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
0e50: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ROR;.  }.  pPage
0e60: 72 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74 54  r = sqlite3TestT
0e70: 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d  extToPtr(argv[1]
0e80: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
0e90: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
0ea0: 65 4f 6e 65 28 70 50 61 67 65 72 2c 20 30 2c 20  eOne(pPager, 0, 
0eb0: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
0ec0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
0ed0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
0ee0: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
0ef0: 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  rrName(rc), 0);.
0f00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
0f10: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
0f20: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
0f30: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 50 61 67  mitPhaseTwo(pPag
0f40: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
0f50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
0f60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
0f70: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
0f80: 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  ErrName(rc), 0);
0f90: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
0fa0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
0fb0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
0fc0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 70 61  *.** Usage:   pa
0fd0: 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 20 49  ger_stmt_begin I
0fe0: 44 0a 2a 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  D.**.** Start a 
0ff0: 6e 65 77 20 63 68 65 63 6b 70 6f 69 6e 74 2e 0a  new checkpoint..
1000: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1010: 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 0a  ger_stmt_begin(.
1020: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
1030: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1040: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
1050: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
1060: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
1070: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
1080: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
1090: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10a0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
10b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
10c0: 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78  argv      /* Tex
10d0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
10e0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72  nt */.){.  Pager
10f0: 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
1100: 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  rc;.  if( argc!=
1110: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1120: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1130: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1140: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1150: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
1160: 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20  " ID\"", 0);.   
1170: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1180: 52 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  R;.  }.  pPager 
1190: 3d 20 73 71 6c 69 74 65 33 54 65 73 74 54 65 78  = sqlite3TestTex
11a0: 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b  tToPtr(argv[1]);
11b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
11c0: 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
11d0: 74 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  t(pPager, 1);.  
11e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11f0: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  K ){.    Tcl_App
1200: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1210: 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
1220: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
1230: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1240: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
1250: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1260: 61 67 65 3a 20 20 20 70 61 67 65 72 5f 73 74 6d  age:   pager_stm
1270: 74 5f 72 6f 6c 6c 62 61 63 6b 20 49 44 0a 2a 2a  t_rollback ID.**
1280: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 63 68 61  .** Rollback cha
1290: 6e 67 65 73 20 74 6f 20 61 20 63 68 65 63 6b 70  nges to a checkp
12a0: 6f 69 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oint.*/.static i
12b0: 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f  nt pager_stmt_ro
12c0: 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a  llback(.  void *
12d0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
12e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
12f0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
1300: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
1310: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
1320: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
1330: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1340: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
1350: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
1360: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
1370: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
1380: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
1390: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
13a0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
13b0: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
13c0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
13d0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
13e0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
13f0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1400: 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c  .       " ID\"",
1410: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1420: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1430: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
1440: 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28 61  3TestTextToPtr(a
1450: 72 67 76 5b 31 5d 29 3b 0a 20 20 72 63 20 3d 20  rgv[1]);.  rc = 
1460: 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65  sqlite3PagerSave
1470: 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 53 41  point(pPager, SA
1480: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1490: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  , 0);.  sqlite3P
14a0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 50  agerSavepoint(pP
14b0: 61 67 65 72 2c 20 53 41 56 45 50 4f 49 4e 54 5f  ager, SAVEPOINT_
14c0: 52 45 4c 45 41 53 45 2c 20 30 29 3b 0a 20 20 69  RELEASE, 0);.  i
14d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14e0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
14f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1500: 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1510: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
1520: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1530: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1540: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1550: 67 65 3a 20 20 20 70 61 67 65 72 5f 73 74 6d 74  ge:   pager_stmt
1560: 5f 63 6f 6d 6d 69 74 20 49 44 0a 2a 2a 0a 2a 2a  _commit ID.**.**
1570: 20 43 6f 6d 6d 69 74 20 63 68 61 6e 67 65 73 20   Commit changes 
1580: 74 6f 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a  to a checkpoint.
1590: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
15a0: 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
15b0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
15c0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
15d0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
15e0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
15f0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1600: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1610: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
1620: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1630: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1640: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1650: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
1660: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
1670: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65  ent */.){.  Page
1680: 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  r *pPager;.  int
1690: 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21   rc;.  if( argc!
16a0: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
16b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
16c0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
16d0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
16e0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
16f0: 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20   " ID\"", 0);.  
1700: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1710: 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OR;.  }.  pPager
1720: 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74 54 65   = sqlite3TestTe
1730: 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29  xtToPtr(argv[1])
1740: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1750: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
1760: 50 61 67 65 72 2c 20 53 41 56 45 50 4f 49 4e 54  Pager, SAVEPOINT
1770: 5f 52 45 4c 45 41 53 45 2c 20 30 29 3b 0a 20 20  _RELEASE, 0);.  
1780: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1790: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  K ){.    Tcl_App
17a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
17b0: 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
17c0: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
17d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
17f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1800: 61 67 65 3a 20 20 20 70 61 67 65 72 5f 73 74 61  age:   pager_sta
1810: 74 73 20 49 44 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ts ID.**.** Retu
1820: 72 6e 20 70 61 67 65 72 20 73 74 61 74 69 73 74  rn pager statist
1830: 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ics..*/.static i
1840: 6e 74 20 70 61 67 65 72 5f 73 74 61 74 73 28 0a  nt pager_stats(.
1850: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
1860: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1870: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
1880: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
1890: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
18a0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
18b0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
18c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18d0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
18e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
18f0: 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78  argv      /* Tex
1900: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
1910: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72  nt */.){.  Pager
1920: 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
1930: 69 2c 20 2a 61 3b 0a 20 20 69 66 28 20 61 72 67  i, *a;.  if( arg
1940: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1950: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1960: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1970: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1980: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
1990: 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a     " ID\"", 0);.
19a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19b0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 67  RROR;.  }.  pPag
19c0: 65 72 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74  er = sqlite3Test
19d0: 54 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31  TextToPtr(argv[1
19e0: 5d 29 3b 0a 20 20 61 20 3d 20 73 71 6c 69 74 65  ]);.  a = sqlite
19f0: 33 50 61 67 65 72 53 74 61 74 73 28 70 50 61 67  3PagerStats(pPag
1a00: 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  er);.  for(i=0; 
1a10: 69 3c 39 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  i<9; i++){.    s
1a20: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 4e 61 6d  tatic char *zNam
1a30: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22 72  e[] = {.      "r
1a40: 65 66 22 2c 20 22 70 61 67 65 22 2c 20 22 6d 61  ef", "page", "ma
1a50: 78 22 2c 20 22 73 69 7a 65 22 2c 20 22 73 74 61  x", "size", "sta
1a60: 74 65 22 2c 20 22 65 72 72 22 2c 0a 20 20 20 20  te", "err",.    
1a70: 20 20 22 68 69 74 22 2c 20 22 6d 69 73 73 22 2c    "hit", "miss",
1a80: 20 22 6f 76 66 6c 22 2c 0a 20 20 20 20 7d 3b 0a   "ovfl",.    };.
1a90: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30      char zBuf[10
1aa0: 30 5d 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  0];.    Tcl_Appe
1ab0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1ac0: 2c 20 7a 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  , zName[i]);.   
1ad0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1ae0: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a  f(sizeof(zBuf),z
1af0: 42 75 66 2c 22 25 64 22 2c 61 5b 69 5d 29 3b 0a  Buf,"%d",a[i]);.
1b00: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c      Tcl_AppendEl
1b10: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42  ement(interp, zB
1b20: 75 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  uf);.  }.  retur
1b30: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1b40: 2a 2a 20 55 73 61 67 65 3a 20 20 20 70 61 67 65  ** Usage:   page
1b50: 72 5f 70 61 67 65 63 6f 75 6e 74 20 49 44 0a 2a  r_pagecount ID.*
1b60: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1b70: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1b80: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
1b90: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
1ba0: 61 67 65 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64  agecount(.  void
1bb0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
1bc0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1bd0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1be0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1bf0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1c00: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
1c10: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
1c20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1c30: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  guments */.  con
1c40: 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  st char **argv  
1c50: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
1c60: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
1c70: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1c80: 65 72 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  er;.  char zBuf[
1c90: 31 30 30 5d 3b 0a 20 20 69 6e 74 20 6e 50 61 67  100];.  int nPag
1ca0: 65 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  e;.  if( argc!=2
1cb0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1cc0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1cd0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1ce0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1cf0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
1d00: 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20   ID\"", 0);.    
1d10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d20: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d  ;.  }.  pPager =
1d30: 20 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74   sqlite3TestText
1d40: 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a  ToPtr(argv[1]);.
1d50: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
1d60: 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
1d70: 26 6e 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  &nPage);.  sqlit
1d80: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
1d90: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
1da0: 22 25 64 22 2c 20 6e 50 61 67 65 29 3b 0a 20 20  "%d", nPage);.  
1db0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1dc0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
1dd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1de0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1df0: 67 65 3a 20 20 20 70 61 67 65 5f 67 65 74 20 49  ge:   page_get I
1e00: 44 20 50 47 4e 4f 0a 2a 2a 0a 2a 2a 20 52 65 74  D PGNO.**.** Ret
1e10: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1e20: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
1e30: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1e40: 61 74 69 63 20 69 6e 74 20 70 61 67 65 5f 67 65  atic int page_ge
1e50: 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  t(.  void *NotUs
1e60: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
1e70: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
1e80: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
1e90: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
1ea0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
1eb0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
1ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1ed0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
1ee0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1ef0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20   **argv      /* 
1f00: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
1f10: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 50 61  ument */.){.  Pa
1f20: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 63  ger *pPager;.  c
1f30: 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20  har zBuf[100];. 
1f40: 20 44 62 50 61 67 65 20 2a 70 50 61 67 65 20 3d   DbPage *pPage =
1f50: 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 0a   0;.  int pgno;.
1f60: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
1f70: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
1f80: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1f90: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1fa0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1fb0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
1fc0: 20 20 20 20 20 20 22 20 49 44 20 50 47 4e 4f 5c        " ID PGNO\
1fd0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
1fe0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ff0: 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c  }.  pPager = sql
2000: 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74  ite3TestTextToPt
2010: 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66  r(argv[1]);.  if
2020: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
2030: 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 70  erp, argv[2], &p
2040: 67 6e 6f 29 20 29 20 72 65 74 75 72 6e 20 54 43  gno) ) return TC
2050: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
2060: 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
2070: 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  edLock(pPager);.
2080: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2090: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
20a0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
20b0: 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
20c0: 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Page, 0);.  }.  
20d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20e0: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  K ){.    Tcl_App
20f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2100: 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
2110: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
2120: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2130: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
2140: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
2150: 75 66 29 2c 7a 42 75 66 2c 22 25 70 22 2c 70 50  uf),zBuf,"%p",pP
2160: 61 67 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  age);.  Tcl_Appe
2170: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2180: 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74   zBuf, 0);.  ret
2190: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
21a0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 70 61  *.** Usage:   pa
21b0: 67 65 5f 6c 6f 6f 6b 75 70 20 49 44 20 50 47 4e  ge_lookup ID PGN
21c0: 4f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  O.**.** Return a
21d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 61   pointer to a pa
21e0: 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ge if the page i
21f0: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  s already in cac
2200: 68 65 2e 0a 2a 2a 20 49 66 20 6e 6f 74 20 69 6e  he..** If not in
2210: 20 63 61 63 68 65 2c 20 72 65 74 75 72 6e 20 61   cache, return a
2220: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a  n empty string..
2230: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2240: 67 65 5f 6c 6f 6f 6b 75 70 28 0a 20 20 76 6f 69  ge_lookup(.  voi
2250: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
2260: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2270: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2280: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2290: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
22a0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
22b0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
22c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
22d0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f  rguments */.  co
22e0: 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20  nst char **argv 
22f0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
2300: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
2310: 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  .){.  Pager *pPa
2320: 67 65 72 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  ger;.  char zBuf
2330: 5b 31 30 30 5d 3b 0a 20 20 44 62 50 61 67 65 20  [100];.  DbPage 
2340: 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 70 67  *pPage;.  int pg
2350: 6e 6f 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  no;.  if( argc!=
2360: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
2370: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2380: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
2390: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
23a0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
23b0: 22 20 49 44 20 50 47 4e 4f 5c 22 22 2c 20 30 29  " ID PGNO\"", 0)
23c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
23d0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50  _ERROR;.  }.  pP
23e0: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 65  ager = sqlite3Te
23f0: 73 74 54 65 78 74 54 6f 50 74 72 28 61 72 67 76  stTextToPtr(argv
2400: 5b 31 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  [1]);.  if( Tcl_
2410: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
2420: 72 67 76 5b 32 5d 2c 20 26 70 67 6e 6f 29 20 29  rgv[2], &pgno) )
2430: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2440: 52 3b 0a 20 20 70 50 61 67 65 20 3d 20 73 71 6c  R;.  pPage = sql
2450: 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
2460: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
2470: 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
2480: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2490: 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
24a0: 7a 42 75 66 2c 22 25 70 22 2c 70 50 61 67 65 29  zBuf,"%p",pPage)
24b0: 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
24c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
24d0: 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
24e0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
24f0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
2500: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20 49  pager_truncate I
2510: 44 20 50 47 4e 4f 0a 2a 2f 0a 73 74 61 74 69 63  D PGNO.*/.static
2520: 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
2530: 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ate(.  void *Not
2540: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
2550: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2560: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2570: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2580: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2590: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25b0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
25c0: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
25d0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f  ar **argv      /
25e0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
25f0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
2600: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
2610: 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 69 66 28   int pgno;.  if(
2620: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
2630: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2640: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2650: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2660: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
2670: 20 20 20 20 20 20 20 22 20 49 44 20 50 47 4e 4f         " ID PGNO
2680: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
2690: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
26a0: 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71   }.  pPager = sq
26b0: 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50  lite3TestTextToP
26c0: 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69  tr(argv[1]);.  i
26d0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
26e0: 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26  terp, argv[2], &
26f0: 70 67 6e 6f 29 20 29 20 72 65 74 75 72 6e 20 54  pgno) ) return T
2700: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
2710: 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
2720: 49 6d 61 67 65 28 70 50 61 67 65 72 2c 20 70 67  Image(pPager, pg
2730: 6e 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  no);.  return TC
2740: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
2750: 55 73 61 67 65 3a 20 20 20 70 61 67 65 5f 75 6e  Usage:   page_un
2760: 72 65 66 20 50 41 47 45 0a 2a 2a 0a 2a 2a 20 44  ref PAGE.**.** D
2770: 72 6f 70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rop a pointer to
2780: 20 61 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74   a page..*/.stat
2790: 69 63 20 69 6e 74 20 70 61 67 65 5f 75 6e 72 65  ic int page_unre
27a0: 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  f(.  void *NotUs
27b0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
27c0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
27d0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
27e0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
27f0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2800: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
2810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2820: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2830: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2840: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20   **argv      /* 
2850: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
2860: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 44 62  ument */.){.  Db
2870: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69  Page *pPage;.  i
2880: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
2890: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
28a0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
28b0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
28c0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
28d0: 2c 0a 20 20 20 20 20 20 20 22 20 50 41 47 45 5c  ,.       " PAGE\
28e0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
28f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2900: 7d 0a 20 20 70 50 61 67 65 20 3d 20 28 44 62 50  }.  pPage = (DbP
2910: 61 67 65 20 2a 29 73 71 6c 69 74 65 33 54 65 73  age *)sqlite3Tes
2920: 74 54 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b  tTextToPtr(argv[
2930: 31 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  1]);.  sqlite3Pa
2940: 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
2950: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2960: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
2970: 3a 20 20 20 70 61 67 65 5f 72 65 61 64 20 50 41  :   page_read PA
2980: 47 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  GE.**.** Return 
2990: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
29a0: 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20   page.*/.static 
29b0: 69 6e 74 20 70 61 67 65 5f 72 65 61 64 28 0a 20  int page_read(. 
29c0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
29d0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
29e0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
29f0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2a00: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2a10: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2a20: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
2a30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a40: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2a50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
2a60: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74  rgv      /* Text
2a70: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
2a80: 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a  t */.){.  char z
2a90: 42 75 66 5b 31 30 30 5d 3b 0a 20 20 44 62 50 61  Buf[100];.  DbPa
2aa0: 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 66 28  ge *pPage;.  if(
2ab0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
2ac0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2ad0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2ae0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2af0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
2b00: 20 20 20 20 20 20 20 22 20 50 41 47 45 5c 22 22         " PAGE\""
2b10: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
2b20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2b30: 20 20 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65    pPage = sqlite
2b40: 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28 61  3TestTextToPtr(a
2b50: 72 67 76 5b 31 5d 29 3b 0a 20 20 6d 65 6d 63 70  rgv[1]);.  memcp
2b60: 79 28 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 50  y(zBuf, sqlite3P
2b70: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
2b80: 65 29 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29  e), sizeof(zBuf)
2b90: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
2ba0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
2bb0: 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
2bc0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2bd0: 2a 20 55 73 61 67 65 3a 20 20 20 70 61 67 65 5f  * Usage:   page_
2be0: 6e 75 6d 62 65 72 20 50 41 47 45 0a 2a 2a 0a 2a  number PAGE.**.*
2bf0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
2c00: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 70  e number for a p
2c10: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
2c20: 6e 74 20 70 61 67 65 5f 6e 75 6d 62 65 72 28 0a  nt page_number(.
2c30: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
2c40: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2c50: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2c60: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2c70: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2c80: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2c90: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
2ca0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2cb0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2cc0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
2cd0: 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78  argv      /* Tex
2ce0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
2cf0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
2d00: 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 44 62 50  zBuf[100];.  DbP
2d10: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 66  age *pPage;.  if
2d20: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
2d30: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2d40: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
2d50: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
2d60: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
2d70: 0a 20 20 20 20 20 20 20 22 20 50 41 47 45 5c 22  .       " PAGE\"
2d80: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2d90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2da0: 0a 20 20 70 50 61 67 65 20 3d 20 28 44 62 50 61  .  pPage = (DbPa
2db0: 67 65 20 2a 29 73 71 6c 69 74 65 33 54 65 73 74  ge *)sqlite3Test
2dc0: 54 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31  TextToPtr(argv[1
2dd0: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ]);.  sqlite3_sn
2de0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
2df0: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c  uf), zBuf, "%d",
2e00: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
2e10: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 29 29 3b  enumber(pPage));
2e20: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
2e30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
2e40: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
2e50: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2e60: 55 73 61 67 65 3a 20 20 20 70 61 67 65 5f 77 72  Usage:   page_wr
2e70: 69 74 65 20 50 41 47 45 20 44 41 54 41 0a 2a 2a  ite PAGE DATA.**
2e80: 0a 2a 2a 20 57 72 69 74 65 20 73 6f 6d 65 74 68  .** Write someth
2e90: 69 6e 67 20 69 6e 74 6f 20 61 20 70 61 67 65 2e  ing into a page.
2ea0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2eb0: 61 67 65 5f 77 72 69 74 65 28 0a 20 20 76 6f 69  age_write(.  voi
2ec0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
2ed0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2ee0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2ef0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2f00: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2f10: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
2f20: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
2f30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2f40: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f  rguments */.  co
2f50: 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20  nst char **argv 
2f60: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
2f70: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
2f80: 0a 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 50  .){.  DbPage *pP
2f90: 61 67 65 3b 0a 20 20 63 68 61 72 20 2a 70 44 61  age;.  char *pDa
2fa0: 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ta;.  int rc;.  
2fb0: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
2fc0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2fd0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
2fe0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
2ff0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
3000: 5d 2c 0a 20 20 20 20 20 20 20 22 20 50 41 47 45  ],.       " PAGE
3010: 20 44 41 54 41 5c 22 22 2c 20 30 29 3b 0a 20 20   DATA\"", 0);.  
3020: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
3030: 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 20  OR;.  }.  pPage 
3040: 3d 20 28 44 62 50 61 67 65 20 2a 29 73 71 6c 69  = (DbPage *)sqli
3050: 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72  te3TestTextToPtr
3060: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 63 20  (argv[1]);.  rc 
3070: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
3080: 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  ite(pPage);.  if
3090: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30a0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
30b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
30c0: 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
30d0: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
30e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
30f0: 7d 0a 20 20 70 44 61 74 61 20 3d 20 73 71 6c 69  }.  pData = sqli
3100: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
3110: 70 50 61 67 65 29 3b 0a 20 20 73 74 72 6e 63 70  pPage);.  strncp
3120: 79 28 70 44 61 74 61 2c 20 61 72 67 76 5b 32 5d  y(pData, argv[2]
3130: 2c 20 74 65 73 74 5f 70 61 67 65 73 69 7a 65 2d  , test_pagesize-
3140: 31 29 3b 0a 20 20 70 44 61 74 61 5b 74 65 73 74  1);.  pData[test
3150: 5f 70 61 67 65 73 69 7a 65 2d 31 5d 20 3d 20 30  _pagesize-1] = 0
3160: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
3170: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
3180: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
3190: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
31a0: 66 61 6b 65 5f 62 69 67 5f 66 69 6c 65 20 20 4e  fake_big_file  N
31b0: 20 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a    FILENAME.**.**
31c0: 20 57 72 69 74 65 20 61 20 66 65 77 20 62 79 74   Write a few byt
31d0: 65 73 20 61 74 20 74 68 65 20 4e 20 6d 65 67 61  es at the N mega
31e0: 62 79 74 65 20 70 6f 69 6e 74 20 6f 66 20 46 49  byte point of FI
31f0: 4c 45 4e 41 4d 45 2e 20 20 54 68 69 73 20 77 69  LENAME.  This wi
3200: 6c 6c 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 6c  ll.** create a l
3210: 61 72 67 65 20 66 69 6c 65 2e 20 20 49 66 20 74  arge file.  If t
3220: 68 65 20 66 69 6c 65 20 77 61 73 20 61 20 76 61  he file was a va
3230: 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62  lid SQLite datab
3240: 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ase, then.** the
3250: 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 64   next time the d
3260: 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
3270: 64 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 62  d, SQLite will b
3280: 65 67 69 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 0a  egin allocating.
3290: 2a 2a 20 6e 65 77 20 70 61 67 65 73 20 61 66 74  ** new pages aft
32a0: 65 72 20 4e 2e 20 20 49 66 20 4e 20 69 73 20 32  er N.  If N is 2
32b0: 30 39 36 20 6f 72 20 62 69 67 67 65 72 2c 20 74  096 or bigger, t
32c0: 68 69 73 20 77 69 6c 6c 20 74 65 73 74 20 74 68  his will test th
32d0: 65 0a 2a 2a 20 61 62 69 6c 69 74 79 20 6f 66 20  e.** ability of 
32e0: 53 51 4c 69 74 65 20 74 6f 20 77 72 69 74 65 20  SQLite to write 
32f0: 74 6f 20 6c 61 72 67 65 20 66 69 6c 65 73 2e 0a  to large files..
3300: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 61  */.static int fa
3310: 6b 65 5f 62 69 67 5f 66 69 6c 65 28 0a 20 20 76  ke_big_file(.  v
3320: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
3330: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3340: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
3350: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
3360: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
3370: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
3380: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
3390: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
33a0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
33b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
33c0: 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  v      /* Text o
33d0: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
33e0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
33f0: 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 73 71 6c  vfs *pVfs;.  sql
3400: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20  ite3_file *fd = 
3410: 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  0;.  int rc;.  i
3420: 6e 74 20 6e 3b 0a 20 20 69 36 34 20 6f 66 66 73  nt n;.  i64 offs
3430: 65 74 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  et;.  char *zFil
3440: 65 3b 0a 20 20 69 6e 74 20 6e 46 69 6c 65 3b 0a  e;.  int nFile;.
3450: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
3460: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
3470: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
3480: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
3490: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
34a0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 4e 2d  [0],.       " N-
34b0: 4d 45 47 41 42 59 54 45 53 20 46 49 4c 45 5c 22  MEGABYTES FILE\"
34c0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
34d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
34e0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
34f0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  t(interp, argv[1
3500: 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20  ], &n) ) return 
3510: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70 56  TCL_ERROR;..  pV
3520: 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
3530: 5f 66 69 6e 64 28 30 29 3b 0a 20 20 6e 46 69 6c  _find(0);.  nFil
3540: 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
3550: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 7a 46 69 6c  argv[2]);.  zFil
3560: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
3570: 6f 63 28 20 6e 46 69 6c 65 2b 32 20 29 3b 0a 20  oc( nFile+2 );. 
3580: 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 20   if( zFile==0 ) 
3590: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
35a0: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65  ;.  memcpy(zFile
35b0: 2c 20 61 72 67 76 5b 32 5d 2c 20 6e 46 69 6c 65  , argv[2], nFile
35c0: 2b 31 29 3b 0a 20 20 7a 46 69 6c 65 5b 6e 46 69  +1);.  zFile[nFi
35d0: 6c 65 2b 31 5d 20 3d 20 30 3b 0a 20 20 72 63 20  le+1] = 0;.  rc 
35e0: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d  = sqlite3OsOpenM
35f0: 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 46 69 6c  alloc(pVfs, zFil
3600: 65 2c 20 26 66 64 2c 20 0a 20 20 20 20 20 20 28  e, &fd, .      (
3610: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
3620: 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  TE|SQLITE_OPEN_R
3630: 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
3640: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 2c 20 30  OPEN_MAIN_DB), 0
3650: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29  .  );.  if( rc )
3660: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
3670: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
3680: 6f 70 65 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20  open failed: ", 
3690: 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
36a0: 63 29 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  c), 0);.    sqli
36b0: 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b  te3_free(zFile);
36c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
36d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6f 66 66  ERROR;.  }.  off
36e0: 73 65 74 20 3d 20 6e 3b 0a 20 20 6f 66 66 73 65  set = n;.  offse
36f0: 74 20 2a 3d 20 31 30 32 34 2a 31 30 32 34 3b 0a  t *= 1024*1024;.
3700: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
3710: 57 72 69 74 65 28 66 64 2c 20 22 48 65 6c 6c 6f  Write(fd, "Hello
3720: 2c 20 57 6f 72 6c 64 21 22 2c 20 31 34 2c 20 6f  , World!", 14, o
3730: 66 66 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65  ffset);.  sqlite
3740: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 66 64 29  3OsCloseFree(fd)
3750: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
3760: 28 7a 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  (zFile);.  if( r
3770: 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  c ){.    Tcl_App
3780: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
3790: 2c 20 22 77 72 69 74 65 20 66 61 69 6c 65 64 3a  , "write failed:
37a0: 20 22 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61   ", sqlite3ErrNa
37b0: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
37c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
37d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
37e0: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
37f0: 0a 0a 2f 2a 0a 2a 2a 20 74 65 73 74 5f 63 6f 6e  ../*.** test_con
3800: 74 72 6f 6c 5f 70 65 6e 64 69 6e 67 5f 62 79 74  trol_pending_byt
3810: 65 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a  e  PENDING_BYTE.
3820: 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 45  **.** Set the PE
3830: 4e 44 49 4e 47 5f 42 59 54 45 20 75 73 69 6e 67  NDING_BYTE using
3840: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 65 73   the sqlite3_tes
3850: 74 5f 63 6f 6e 74 72 6f 6c 28 29 20 69 6e 74 65  t_control() inte
3860: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
3870: 20 69 6e 74 20 74 65 73 74 50 65 6e 64 69 6e 67   int testPending
3880: 42 79 74 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  Byte(.  void *No
3890: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
38a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
38b0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
38c0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
38d0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
38e0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3900: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
3910: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
3920: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
3930: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
3940: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
3950: 20 69 6e 74 20 70 62 79 74 65 3b 0a 20 20 69 6e   int pbyte;.  in
3960: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
3970: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
3980: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3990: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
39a0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
39b0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39d0: 22 20 50 45 4e 44 49 4e 47 2d 42 59 54 45 5c 22  " PENDING-BYTE\"
39e0: 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20  ", (void*)0);.  
39f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
3a00: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
3a10: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
3a20: 20 61 72 67 76 5b 31 5d 2c 20 26 70 62 79 74 65   argv[1], &pbyte
3a30: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
3a40: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
3a50: 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
3a60: 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
3a70: 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  L_PENDING_BYTE, 
3a80: 70 62 79 74 65 29 3b 0a 20 20 54 63 6c 5f 53 65  pbyte);.  Tcl_Se
3a90: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
3aa0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
3ab0: 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  (rc));.  return 
3ac0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
3ad0: 20 54 68 65 20 73 71 6c 69 74 65 33 46 61 75 6c   The sqlite3Faul
3ae0: 74 53 69 6d 28 29 20 63 61 6c 6c 62 61 63 6b 3a  tSim() callback:
3af0: 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f 49  .*/.static Tcl_I
3b00: 6e 74 65 72 70 20 2a 66 61 75 6c 74 53 69 6d 49  nterp *faultSimI
3b10: 6e 74 65 72 70 20 3d 20 30 3b 0a 73 74 61 74 69  nterp = 0;.stati
3b20: 63 20 69 6e 74 20 66 61 75 6c 74 53 69 6d 53 63  c int faultSimSc
3b30: 72 69 70 74 53 69 7a 65 20 3d 20 30 3b 0a 73 74  riptSize = 0;.st
3b40: 61 74 69 63 20 63 68 61 72 20 2a 66 61 75 6c 74  atic char *fault
3b50: 53 69 6d 53 63 72 69 70 74 3b 0a 73 74 61 74 69  SimScript;.stati
3b60: 63 20 69 6e 74 20 66 61 75 6c 74 53 69 6d 43 61  c int faultSimCa
3b70: 6c 6c 62 61 63 6b 28 69 6e 74 20 78 29 7b 0a 20  llback(int x){. 
3b80: 20 63 68 61 72 20 7a 49 6e 74 5b 33 30 5d 3b 0a   char zInt[30];.
3b90: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
3ba0: 73 4e 65 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  sNeg;.  int rc;.
3bb0: 20 20 69 66 28 20 78 3d 3d 30 20 29 7b 0a 20 20    if( x==0 ){.  
3bc0: 20 20 6d 65 6d 63 70 79 28 66 61 75 6c 74 53 69    memcpy(faultSi
3bd0: 6d 53 63 72 69 70 74 2b 66 61 75 6c 74 53 69 6d  mScript+faultSim
3be0: 53 63 72 69 70 74 53 69 7a 65 2c 20 22 30 22 2c  ScriptSize, "0",
3bf0: 20 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   2);.  }else{.  
3c00: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 78 20 74    /* Convert x t
3c10: 6f 20 74 65 78 74 20 77 69 74 68 6f 75 74 20 75  o text without u
3c20: 73 69 6e 67 20 61 6e 79 20 73 71 6c 69 74 65 33  sing any sqlite3
3c30: 20 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 20   routines */.   
3c40: 20 69 66 28 20 78 3c 30 20 29 7b 0a 20 20 20 20   if( x<0 ){.    
3c50: 20 20 69 73 4e 65 67 20 3d 20 31 3b 0a 20 20 20    isNeg = 1;.   
3c60: 20 20 20 78 20 3d 20 2d 78 3b 0a 20 20 20 20 7d     x = -x;.    }
3c70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 73 4e 65  else{.      isNe
3c80: 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
3c90: 20 7a 49 6e 74 5b 73 69 7a 65 6f 66 28 7a 49 6e   zInt[sizeof(zIn
3ca0: 74 29 2d 31 5d 20 3d 20 30 3b 0a 20 20 20 20 66  t)-1] = 0;.    f
3cb0: 6f 72 28 69 3d 73 69 7a 65 6f 66 28 7a 49 6e 74  or(i=sizeof(zInt
3cc0: 29 2d 32 3b 20 69 3e 30 20 26 26 20 78 3e 30 3b  )-2; i>0 && x>0;
3cd0: 20 69 2d 2d 2c 20 78 20 2f 3d 20 31 30 29 7b 0a   i--, x /= 10){.
3ce0: 20 20 20 20 20 20 7a 49 6e 74 5b 69 5d 20 3d 20        zInt[i] = 
3cf0: 28 78 25 31 30 29 20 2b 20 27 30 27 3b 0a 20 20  (x%10) + '0';.  
3d00: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 4e 65    }.    if( isNe
3d10: 67 20 29 20 7a 49 6e 74 5b 69 2d 2d 5d 20 3d 20  g ) zInt[i--] = 
3d20: 27 2d 27 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  '-';.    memcpy(
3d30: 66 61 75 6c 74 53 69 6d 53 63 72 69 70 74 2b 66  faultSimScript+f
3d40: 61 75 6c 74 53 69 6d 53 63 72 69 70 74 53 69 7a  aultSimScriptSiz
3d50: 65 2c 20 7a 49 6e 74 2b 69 2b 31 2c 20 73 69 7a  e, zInt+i+1, siz
3d60: 65 6f 66 28 7a 49 6e 74 29 2d 69 29 3b 0a 20 20  eof(zInt)-i);.  
3d70: 7d 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61  }.  rc = Tcl_Eva
3d80: 6c 28 66 61 75 6c 74 53 69 6d 49 6e 74 65 72 70  l(faultSimInterp
3d90: 2c 20 66 61 75 6c 74 53 69 6d 53 63 72 69 70 74  , faultSimScript
3da0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
3db0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
3dc0: 72 2c 20 22 66 61 75 6c 74 20 73 69 6d 75 6c 61  r, "fault simula
3dd0: 74 6f 72 20 73 63 72 69 70 74 20 66 61 69 6c 65  tor script faile
3de0: 64 3a 20 5b 25 73 5d 22 2c 20 66 61 75 6c 74 53  d: [%s]", faultS
3df0: 69 6d 53 63 72 69 70 74 29 3b 0a 20 20 20 20 72  imScript);.    r
3e00: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
3e10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
3e20: 63 20 3d 20 61 74 6f 69 28 54 63 6c 5f 47 65 74  c = atoi(Tcl_Get
3e30: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 66 61 75  StringResult(fau
3e40: 6c 74 53 69 6d 49 6e 74 65 72 70 29 29 3b 0a 20  ltSimInterp));. 
3e50: 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65   }.  Tcl_ResetRe
3e60: 73 75 6c 74 28 66 61 75 6c 74 53 69 6d 49 6e 74  sult(faultSimInt
3e70: 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  erp);.  return r
3e80: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  c;.}../*.** sqli
3e90: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
3ea0: 5f 66 61 75 6c 74 5f 69 6e 73 74 61 6c 6c 20 53  _fault_install S
3eb0: 43 52 49 50 54 0a 2a 2a 0a 2a 2a 20 41 72 72 61  CRIPT.**.** Arra
3ec0: 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20 53 43  nge to invoke SC
3ed0: 52 49 50 54 20 77 69 74 68 20 74 68 65 20 69 6e  RIPT with the in
3ee0: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 20 74  teger argument t
3ef0: 6f 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69  o sqlite3FaultSi
3f00: 6d 28 29 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c  m().** appended,
3f10: 20 77 68 65 6e 65 76 65 72 20 73 71 6c 69 74 65   whenever sqlite
3f20: 33 46 61 75 6c 74 53 69 6d 28 29 20 69 73 20 63  3FaultSim() is c
3f30: 61 6c 6c 65 64 2e 20 20 4f 72 2c 20 69 66 20 53  alled.  Or, if S
3f40: 43 52 49 50 54 20 69 73 20 74 68 65 0a 2a 2a 20  CRIPT is the.** 
3f50: 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 63 61  empty string, ca
3f60: 6e 63 65 6c 20 74 68 65 20 73 71 6c 69 74 65 33  ncel the sqlite3
3f70: 46 61 75 6c 74 53 69 6d 28 29 20 63 61 6c 6c 62  FaultSim() callb
3f80: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ack..*/.static i
3f90: 6e 74 20 66 61 75 6c 74 49 6e 73 74 61 6c 6c 43  nt faultInstallC
3fa0: 6d 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  md(.  void *NotU
3fb0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
3fc0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
3fd0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
3fe0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
3ff0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
4000: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
4010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4020: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
4030: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
4040: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a  r **argv      /*
4050: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
4060: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
4070: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 72 69  onst char *zScri
4080: 70 74 3b 0a 20 20 69 6e 74 20 6e 53 63 72 69 70  pt;.  int nScrip
4090: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  t;.  int rc;.  i
40a0: 66 28 20 61 72 67 63 21 3d 31 20 26 26 20 61 72  f( argc!=1 && ar
40b0: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
40c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
40d0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
40e0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
40f0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4110: 20 20 22 20 53 43 52 49 50 54 5c 22 22 2c 20 28    " SCRIPT\"", (
4120: 76 6f 69 64 2a 29 30 29 3b 0a 20 20 7d 0a 20 20  void*)0);.  }.  
4130: 7a 53 63 72 69 70 74 20 3d 20 61 72 67 63 3d 3d  zScript = argc==
4140: 32 20 3f 20 61 72 67 76 5b 31 5d 20 3a 20 22 22  2 ? argv[1] : ""
4150: 3b 0a 20 20 6e 53 63 72 69 70 74 20 3d 20 28 69  ;.  nScript = (i
4160: 6e 74 29 73 74 72 6c 65 6e 28 7a 53 63 72 69 70  nt)strlen(zScrip
4170: 74 29 3b 0a 20 20 69 66 28 20 66 61 75 6c 74 53  t);.  if( faultS
4180: 69 6d 53 63 72 69 70 74 20 29 7b 0a 20 20 20 20  imScript ){.    
4190: 66 72 65 65 28 66 61 75 6c 74 53 69 6d 53 63 72  free(faultSimScr
41a0: 69 70 74 29 3b 0a 20 20 20 20 66 61 75 6c 74 53  ipt);.    faultS
41b0: 69 6d 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20  imScript = 0;.  
41c0: 7d 0a 20 20 69 66 28 20 6e 53 63 72 69 70 74 3d  }.  if( nScript=
41d0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
41e0: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
41f0: 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
4200: 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c  TRL_FAULT_INSTAL
4210: 4c 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  L, 0);.  }else{.
4220: 20 20 20 20 66 61 75 6c 74 53 69 6d 53 63 72 69      faultSimScri
4230: 70 74 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 53 63  pt = malloc( nSc
4240: 72 69 70 74 2b 31 30 30 20 29 3b 0a 20 20 20 20  ript+100 );.    
4250: 69 66 28 20 66 61 75 6c 74 53 69 6d 53 63 72 69  if( faultSimScri
4260: 70 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  pt==0 ){.      T
4270: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4280: 69 6e 74 65 72 70 2c 20 22 6f 75 74 20 6f 66 20  interp, "out of 
4290: 6d 65 6d 6f 72 79 22 2c 20 28 76 6f 69 64 2a 29  memory", (void*)
42a0: 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
42b0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
42c0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
42d0: 66 61 75 6c 74 53 69 6d 53 63 72 69 70 74 2c 20  faultSimScript, 
42e0: 7a 53 63 72 69 70 74 2c 20 6e 53 63 72 69 70 74  zScript, nScript
42f0: 29 3b 0a 20 20 20 20 66 61 75 6c 74 53 69 6d 53  );.    faultSimS
4300: 63 72 69 70 74 5b 6e 53 63 72 69 70 74 5d 20 3d  cript[nScript] =
4310: 20 27 20 27 3b 0a 20 20 20 20 66 61 75 6c 74 53   ' ';.    faultS
4320: 69 6d 53 63 72 69 70 74 53 69 7a 65 20 3d 20 6e  imScriptSize = n
4330: 53 63 72 69 70 74 2b 31 3b 0a 20 20 20 20 66 61  Script+1;.    fa
4340: 75 6c 74 53 69 6d 49 6e 74 65 72 70 20 3d 20 69  ultSimInterp = i
4350: 6e 74 65 72 70 3b 0a 20 20 20 20 72 63 20 3d 20  nterp;.    rc = 
4360: 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
4370: 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
4380: 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41  CTRL_FAULT_INSTA
4390: 4c 4c 2c 20 66 61 75 6c 74 53 69 6d 43 61 6c 6c  LL, faultSimCall
43a0: 62 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  back);.  }.  Tcl
43b0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
43c0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
43d0: 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75  Obj(rc));.  retu
43e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
43f0: 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 42 69  ./*.** sqlite3Bi
4400: 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 20  tvecBuiltinTest 
4410: 53 49 5a 45 20 50 52 4f 47 52 41 4d 0a 2a 2a 0a  SIZE PROGRAM.**.
4420: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 53 51  ** Invoke the SQ
4430: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49  LITE_TESTCTRL_BI
4440: 54 56 45 43 5f 54 45 53 54 20 6f 70 65 72 61 74  TVEC_TEST operat
4450: 6f 72 20 6f 6e 20 74 65 73 74 5f 63 6f 6e 74 72  or on test_contr
4460: 6f 6c 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65  ol..** See comme
4470: 6e 74 73 20 6f 6e 20 73 71 6c 69 74 65 33 42 69  nts on sqlite3Bi
4480: 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28  tvecBuiltinTest(
4490: 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
44a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
44b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
44c0: 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73  BitvecBuiltinTes
44d0: 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  t(.  void *NotUs
44e0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
44f0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
4500: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
4510: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
4520: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
4530: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
4540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4550: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
4560: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4570: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20   **argv      /* 
4580: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
4590: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
45a0: 74 20 73 7a 2c 20 72 63 3b 0a 20 20 69 6e 74 20  t sz, rc;.  int 
45b0: 6e 50 72 6f 67 20 3d 20 30 3b 0a 20 20 69 6e 74  nProg = 0;.  int
45c0: 20 61 50 72 6f 67 5b 31 30 30 5d 3b 0a 20 20 63   aProg[100];.  c
45d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
45e0: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
45f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
4600: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
4610: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
4620: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
4630: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
4640: 20 20 20 20 20 20 20 20 22 20 53 49 5a 45 20 50          " SIZE P
4650: 52 4f 47 52 41 4d 5c 22 22 2c 20 28 76 6f 69 64  ROGRAM\"", (void
4660: 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  *)0);.  }.  if( 
4670: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
4680: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 73 7a 29  p, argv[1], &sz)
4690: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
46a0: 52 4f 52 3b 0a 20 20 7a 20 3d 20 61 72 67 76 5b  ROR;.  z = argv[
46b0: 32 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 50 72  2];.  while( nPr
46c0: 6f 67 3c 39 39 20 26 26 20 2a 7a 20 29 7b 0a 20  og<99 && *z ){. 
46d0: 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20     while( *z && 
46e0: 21 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28  !sqlite3Isdigit(
46f0: 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20  *z) ){ z++; }.  
4700: 20 20 69 66 28 20 2a 7a 3d 3d 30 20 29 20 62 72    if( *z==0 ) br
4710: 65 61 6b 3b 0a 20 20 20 20 61 50 72 6f 67 5b 6e  eak;.    aProg[n
4720: 50 72 6f 67 2b 2b 5d 20 3d 20 61 74 6f 69 28 7a  Prog++] = atoi(z
4730: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71  );.    while( sq
4740: 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a 7a 29  lite3Isdigit(*z)
4750: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 7d 0a 20   ){ z++; }.  }. 
4760: 20 61 50 72 6f 67 5b 6e 50 72 6f 67 5d 20 3d 20   aProg[nProg] = 
4770: 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
4780: 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
4790: 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
47a0: 49 54 56 45 43 5f 54 45 53 54 2c 20 73 7a 2c 20  ITVEC_TEST, sz, 
47b0: 61 50 72 6f 67 29 3b 0a 20 20 54 63 6c 5f 53 65  aProg);.  Tcl_Se
47c0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
47d0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
47e0: 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  (rc));.  return 
47f0: 54 43 4c 5f 4f 4b 3b 0a 7d 20 20 0a 0a 2f 2a 0a  TCL_OK;.}  ../*.
4800: 2a 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d  ** Register comm
4810: 61 6e 64 73 20 77 69 74 68 20 74 68 65 20 54 43  ands with the TC
4820: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a  L interpreter..*
4830: 2f 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  /.int Sqlitetest
4840: 32 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  2_Init(Tcl_Inter
4850: 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 65 78  p *interp){.  ex
4860: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
4870: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 72 73 69 73  _io_error_persis
4880: 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
4890: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
48a0: 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 65 78 74 65  _pending;.  exte
48b0: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
48c0: 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 20 20 65  o_error_hit;.  e
48d0: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
48e0: 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 61 72 64 68  3_io_error_hardh
48f0: 69 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  it;.  extern int
4900: 20 73 71 6c 69 74 65 33 5f 64 69 73 6b 66 75 6c   sqlite3_diskful
4910: 6c 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 65 78 74  l_pending;.  ext
4920: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
4930: 64 69 73 6b 66 75 6c 6c 3b 0a 20 20 73 74 61 74  diskfull;.  stat
4940: 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  ic struct {.    
4950: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
4960: 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50   Tcl_CmdProc *xP
4970: 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20  roc;.  } aCmd[] 
4980: 3d 20 7b 0a 20 20 20 20 7b 20 22 70 61 67 65 72  = {.    { "pager
4990: 5f 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20  _open",         
49a0: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
49b0: 63 2a 29 70 61 67 65 72 5f 6f 70 65 6e 20 20 20  c*)pager_open   
49c0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
49d0: 22 70 61 67 65 72 5f 63 6c 6f 73 65 22 2c 20 20  "pager_close",  
49e0: 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
49f0: 43 6d 64 50 72 6f 63 2a 29 70 61 67 65 72 5f 63  CmdProc*)pager_c
4a00: 6c 6f 73 65 20 20 20 20 20 20 20 20 20 7d 2c 0a  lose         },.
4a10: 20 20 20 20 7b 20 22 70 61 67 65 72 5f 63 6f 6d      { "pager_com
4a20: 6d 69 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  mit",           
4a30: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 70   (Tcl_CmdProc*)p
4a40: 61 67 65 72 5f 63 6f 6d 6d 69 74 20 20 20 20 20  ager_commit     
4a50: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 61 67     },.    { "pag
4a60: 65 72 5f 72 6f 6c 6c 62 61 63 6b 22 2c 20 20 20  er_rollback",   
4a70: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
4a80: 72 6f 63 2a 29 70 61 67 65 72 5f 72 6f 6c 6c 62  roc*)pager_rollb
4a90: 61 63 6b 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  ack      },.    
4aa0: 7b 20 22 70 61 67 65 72 5f 73 74 6d 74 5f 62 65  { "pager_stmt_be
4ab0: 67 69 6e 22 2c 20 20 20 20 20 20 20 20 28 54 63  gin",        (Tc
4ac0: 6c 5f 43 6d 64 50 72 6f 63 2a 29 70 61 67 65 72  l_CmdProc*)pager
4ad0: 5f 73 74 6d 74 5f 62 65 67 69 6e 20 20 20 20 7d  _stmt_begin    }
4ae0: 2c 0a 20 20 20 20 7b 20 22 70 61 67 65 72 5f 73  ,.    { "pager_s
4af0: 74 6d 74 5f 63 6f 6d 6d 69 74 22 2c 20 20 20 20  tmt_commit",    
4b00: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
4b10: 29 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  )pager_stmt_comm
4b20: 69 74 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70  it   },.    { "p
4b30: 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61  ager_stmt_rollba
4b40: 63 6b 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d  ck",     (Tcl_Cm
4b50: 64 50 72 6f 63 2a 29 70 61 67 65 72 5f 73 74 6d  dProc*)pager_stm
4b60: 74 5f 72 6f 6c 6c 62 61 63 6b 20 7d 2c 0a 20 20  t_rollback },.  
4b70: 20 20 7b 20 22 70 61 67 65 72 5f 73 74 61 74 73    { "pager_stats
4b80: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4b90: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 70 61 67  Tcl_CmdProc*)pag
4ba0: 65 72 5f 73 74 61 74 73 20 20 20 20 20 20 20 20  er_stats        
4bb0: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 61 67 65 72   },.    { "pager
4bc0: 5f 70 61 67 65 63 6f 75 6e 74 22 2c 20 20 20 20  _pagecount",    
4bd0: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
4be0: 63 2a 29 70 61 67 65 72 5f 70 61 67 65 63 6f 75  c*)pager_pagecou
4bf0: 6e 74 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  nt     },.    { 
4c00: 22 70 61 67 65 5f 67 65 74 22 2c 20 20 20 20 20  "page_get",     
4c10: 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
4c20: 43 6d 64 50 72 6f 63 2a 29 70 61 67 65 5f 67 65  CmdProc*)page_ge
4c30: 74 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  t            },.
4c40: 20 20 20 20 7b 20 22 70 61 67 65 5f 6c 6f 6f 6b      { "page_look
4c50: 75 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  up",            
4c60: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 70   (Tcl_CmdProc*)p
4c70: 61 67 65 5f 6c 6f 6f 6b 75 70 20 20 20 20 20 20  age_lookup      
4c80: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 61 67     },.    { "pag
4c90: 65 5f 75 6e 72 65 66 22 2c 20 20 20 20 20 20 20  e_unref",       
4ca0: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
4cb0: 72 6f 63 2a 29 70 61 67 65 5f 75 6e 72 65 66 20  roc*)page_unref 
4cc0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
4cd0: 7b 20 22 70 61 67 65 5f 72 65 61 64 22 2c 20 20  { "page_read",  
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
4cf0: 6c 5f 43 6d 64 50 72 6f 63 2a 29 70 61 67 65 5f  l_CmdProc*)page_
4d00: 72 65 61 64 20 20 20 20 20 20 20 20 20 20 20 7d  read           }
4d10: 2c 0a 20 20 20 20 7b 20 22 70 61 67 65 5f 77 72  ,.    { "page_wr
4d20: 69 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ite",           
4d30: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
4d40: 29 70 61 67 65 5f 77 72 69 74 65 20 20 20 20 20  )page_write     
4d50: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
4d60: 61 67 65 5f 6e 75 6d 62 65 72 22 2c 20 20 20 20  age_number",    
4d70: 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
4d80: 64 50 72 6f 63 2a 29 70 61 67 65 5f 6e 75 6d 62  dProc*)page_numb
4d90: 65 72 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  er         },.  
4da0: 20 20 7b 20 22 70 61 67 65 72 5f 74 72 75 6e 63    { "pager_trunc
4db0: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 28  ate",          (
4dc0: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 70 61 67  Tcl_CmdProc*)pag
4dd0: 65 72 5f 74 72 75 6e 63 61 74 65 20 20 20 20 20  er_truncate     
4de0: 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   },.#ifndef SQLI
4df0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
4e00: 20 20 20 7b 20 22 66 61 6b 65 5f 62 69 67 5f 66     { "fake_big_f
4e10: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
4e20: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 66 61  (Tcl_CmdProc*)fa
4e30: 6b 65 5f 62 69 67 5f 66 69 6c 65 20 20 20 20 20  ke_big_file     
4e40: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20    },.#endif.    
4e50: 7b 20 22 73 71 6c 69 74 65 33 42 69 74 76 65 63  { "sqlite3Bitvec
4e60: 42 75 69 6c 74 69 6e 54 65 73 74 22 2c 28 54 63  BuiltinTest",(Tc
4e70: 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 42  l_CmdProc*)testB
4e80: 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74  itvecBuiltinTest
4e90: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
4ea0: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
4eb0: 72 6f 6c 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65  rol_pending_byte
4ec0: 22 2c 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  ",  (Tcl_CmdProc
4ed0: 2a 29 74 65 73 74 50 65 6e 64 69 6e 67 42 79 74  *)testPendingByt
4ee0: 65 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71 6c 69  e },.    { "sqli
4ef0: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
4f00: 5f 66 61 75 6c 74 5f 69 6e 73 74 61 6c 6c 22 2c  _fault_install",
4f10: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 66   (Tcl_CmdProc*)f
4f20: 61 75 6c 74 49 6e 73 74 61 6c 6c 43 6d 64 20 7d  aultInstallCmd }
4f30: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
4f40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4f50: 65 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66  eof(aCmd)/sizeof
4f60: 28 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b  (aCmd[0]); i++){
4f70: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43  .    Tcl_CreateC
4f80: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61  ommand(interp, a
4f90: 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43  Cmd[i].zName, aC
4fa0: 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20  md[i].xProc, 0, 
4fb0: 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c 69  0);.  }.  Tcl_Li
4fc0: 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
4fd0: 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 70  qlite_io_error_p
4fe0: 65 6e 64 69 6e 67 22 2c 0a 20 20 20 20 20 28 63  ending",.     (c
4ff0: 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 69 6f  har*)&sqlite3_io
5000: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 2c 20  _error_pending, 
5010: 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
5020: 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
5030: 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 69 6f 5f  erp, "sqlite_io_
5040: 65 72 72 6f 72 5f 70 65 72 73 69 73 74 22 2c 0a  error_persist",.
5050: 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
5060: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
5070: 72 73 69 73 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  rsist, TCL_LINK_
5080: 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
5090: 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
50a0: 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  ite_io_error_hit
50b0: 22 2c 0a 20 20 20 20 20 28 63 68 61 72 2a 29 26  ",.     (char*)&
50c0: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
50d0: 5f 68 69 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  _hit, TCL_LINK_I
50e0: 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
50f0: 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
5100: 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 68 61 72 64  te_io_error_hard
5110: 68 69 74 22 2c 0a 20 20 20 20 20 28 63 68 61 72  hit",.     (char
5120: 2a 29 26 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  *)&sqlite3_io_er
5130: 72 6f 72 5f 68 61 72 64 68 69 74 2c 20 54 43 4c  ror_hardhit, TCL
5140: 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
5150: 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
5160: 2c 20 22 73 71 6c 69 74 65 5f 64 69 73 6b 66 75  , "sqlite_diskfu
5170: 6c 6c 5f 70 65 6e 64 69 6e 67 22 2c 0a 20 20 20  ll_pending",.   
5180: 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
5190: 33 5f 64 69 73 6b 66 75 6c 6c 5f 70 65 6e 64 69  3_diskfull_pendi
51a0: 6e 67 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  ng, TCL_LINK_INT
51b0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
51c0: 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
51d0: 5f 64 69 73 6b 66 75 6c 6c 22 2c 0a 20 20 20 20  _diskfull",.    
51e0: 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
51f0: 5f 64 69 73 6b 66 75 6c 6c 2c 20 54 43 4c 5f 4c  _diskfull, TCL_L
5200: 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65  INK_INT);.#ifnde
5210: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53  f SQLITE_OMIT_WS
5220: 44 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  D.  Tcl_LinkVar(
5230: 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
5240: 70 65 6e 64 69 6e 67 5f 62 79 74 65 22 2c 0a 20  pending_byte",. 
5250: 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
5260: 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65 2c 20  te3PendingByte, 
5270: 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 20 7c 20 54  TCL_LINK_INT | T
5280: 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c  CL_LINK_READ_ONL
5290: 59 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  Y);.#endif.  ret
52a0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a        urn TCL_OK;.}.