/ Hex Artifact Content
Login

Artifact 711555927f1f7e8db9aab86b512bc6934a774abe:


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 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  ./*.** Interpret
0290: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
02a0: 20 6e 75 6d 62 65 72 0a 2a 2f 0a 73 74 61 74 69   number.*/.stati
02b0: 63 20 63 68 61 72 20 2a 65 72 72 6f 72 4e 61 6d  c char *errorNam
02c0: 65 28 69 6e 74 20 72 63 29 7b 0a 20 20 63 68 61  e(int rc){.  cha
02d0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 77 69 74  r *zName;.  swit
02e0: 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61  ch( rc ){.    ca
02f0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20  se SQLITE_OK:   
0300: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
0310: 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20  QLITE_OK";      
0320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0330: 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ase SQLITE_ERROR
0340: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
0350: 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20 20  SQLITE_ERROR";  
0360: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0370: 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d  case SQLITE_PERM
0380: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
0390: 22 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20  "SQLITE_PERM";  
03a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
03b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f   case SQLITE_ABO
03c0: 52 54 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  RT:      zName =
03d0: 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b   "SQLITE_ABORT";
03e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
03f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
0400: 53 59 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  SY:       zName 
0410: 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b  = "SQLITE_BUSY";
0420: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
0430: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
0440: 4f 4d 45 4d 3a 20 20 20 20 20 20 7a 4e 61 6d 65  OMEM:      zName
0450: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   = "SQLITE_NOMEM
0460: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
0470: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0480: 52 45 41 44 4f 4e 4c 59 3a 20 20 20 7a 4e 61 6d  READONLY:   zNam
0490: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
04a0: 4f 4e 4c 59 22 3b 20 20 20 20 62 72 65 61 6b 3b  ONLY";    break;
04b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
04c0: 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 7a 4e 61  _INTERRUPT:  zNa
04d0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54  me = "SQLITE_INT
04e0: 45 52 52 55 50 54 22 3b 20 20 20 62 72 65 61 6b  ERRUPT";   break
04f0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0500: 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 7a 4e  E_IOERR:      zN
0510: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
0520: 45 52 52 22 3b 20 20 20 20 20 20 20 62 72 65 61  ERR";       brea
0530: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0540: 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 7a  TE_CORRUPT:    z
0550: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
0560: 4f 52 52 55 50 54 22 3b 20 20 20 20 20 62 72 65  ORRUPT";     bre
0570: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0580: 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20  ITE_FULL:       
0590: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
05a0: 46 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 62 72  FULL";        br
05b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
05c0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20  LITE_CANTOPEN:  
05d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
05e0: 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 62  _CANTOPEN";    b
05f0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
0600: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20  QLITE_PROTOCOL: 
0610: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0620: 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20  E_PROTOCOL";    
0630: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0640: 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20  SQLITE_EMPTY:   
0650: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0660: 54 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20  TE_EMPTY";      
0670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0680: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20   SQLITE_SCHEMA: 
0690: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
06a0: 49 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20  ITE_SCHEMA";    
06b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
06c0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
06d0: 49 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  INT: zName = "SQ
06e0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22  LITE_CONSTRAINT"
06f0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
0700: 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  se SQLITE_MISMAT
0710: 43 48 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  CH:   zName = "S
0720: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b  QLITE_MISMATCH";
0730: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0740: 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  ase SQLITE_MISUS
0750: 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  E:     zName = "
0760: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20  SQLITE_MISUSE"; 
0770: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0780: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  case SQLITE_NOLF
0790: 53 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  S:      zName = 
07a0: 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20  "SQLITE_NOLFS"; 
07b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
07c0: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
07d0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
07e0: 20 22 53 51 4c 49 54 45 5f 55 6e 6b 6e 6f 77 6e   "SQLITE_Unknown
07f0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
0800: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
0810: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  ;.}../*.** Page 
0820: 73 69 7a 65 20 61 6e 64 20 72 65 73 65 72 76 65  size and reserve
0830: 64 20 73 69 7a 65 20 75 73 65 64 20 66 6f 72 20  d size used for 
0840: 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  testing..*/.stat
0850: 69 63 20 69 6e 74 20 74 65 73 74 5f 70 61 67 65  ic int test_page
0860: 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 0a 2f 2a  size = 1024;../*
0870: 0a 2a 2a 20 44 75 6d 6d 79 20 70 61 67 65 20 72  .** Dummy page r
0880: 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2f 0a  einitializer.*/.
0890: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
08a0: 72 5f 74 65 73 74 5f 72 65 69 6e 69 74 65 72 28  r_test_reiniter(
08b0: 44 62 50 61 67 65 20 2a 70 4e 6f 74 55 73 65 64  DbPage *pNotUsed
08c0: 29 7b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  ){.  return;.}..
08d0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 70  /*.** Usage:   p
08e0: 61 67 65 72 5f 6f 70 65 6e 20 46 49 4c 45 4e 41  ager_open FILENA
08f0: 4d 45 20 4e 2d 50 41 47 45 0a 2a 2a 0a 2a 2a 20  ME N-PAGE.**.** 
0900: 4f 70 65 6e 20 61 20 6e 65 77 20 70 61 67 65 72  Open a new pager
0910: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
0920: 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 76 6f 69  ager_open(.  voi
0930: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
0940: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0950: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
0960: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
0970: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
0980: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
0990: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
09a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
09b0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f  rguments */.  co
09c0: 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20  nst char **argv 
09d0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
09e0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
09f0: 0a 29 7b 0a 20 20 75 33 32 20 70 61 67 65 53 69  .){.  u32 pageSi
0a00: 7a 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ze;.  Pager *pPa
0a10: 67 65 72 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65  ger;.  int nPage
0a20: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
0a30: 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20  ar zBuf[100];.  
0a40: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
0a50: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
0a60: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
0a70: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
0a80: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
0a90: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45  ],.       " FILE
0aa0: 4e 41 4d 45 20 4e 2d 50 41 47 45 5c 22 22 2c 20  NAME N-PAGE\"", 
0ab0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
0ac0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
0ad0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
0ae0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20  nterp, argv[2], 
0af0: 26 6e 50 61 67 65 29 20 29 20 72 65 74 75 72 6e  &nPage) ) return
0b00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
0b10: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
0b20: 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 5f  pen(sqlite3_vfs_
0b30: 66 69 6e 64 28 30 29 2c 20 26 70 50 61 67 65 72  find(0), &pPager
0b40: 2c 20 61 72 67 76 5b 31 5d 2c 20 30 2c 20 30 2c  , argv[1], 0, 0,
0b50: 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  .      SQLITE_OP
0b60: 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
0b70: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
0b80: 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
0b90: 4d 41 49 4e 5f 44 42 2c 0a 20 20 20 20 20 20 70  MAIN_DB,.      p
0ba0: 61 67 65 72 5f 74 65 73 74 5f 72 65 69 6e 69 74  ager_test_reinit
0bb0: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
0bc0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
0bd0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
0be0: 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61  (interp, errorNa
0bf0: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
0c00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
0c10: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50  ;.  }.  sqlite3P
0c20: 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
0c30: 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b  (pPager, nPage);
0c40: 0a 20 20 70 61 67 65 53 69 7a 65 20 3d 20 74 65  .  pageSize = te
0c50: 73 74 5f 70 61 67 65 73 69 7a 65 3b 0a 20 20 73  st_pagesize;.  s
0c60: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
0c70: 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
0c80: 70 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20  pageSize, -1);. 
0c90: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
0ca0: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a  f(sizeof(zBuf),z
0cb0: 42 75 66 2c 22 25 70 22 2c 70 50 61 67 65 72 29  Buf,"%p",pPager)
0cc0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
0cd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
0ce0: 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
0cf0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
0d00: 20 55 73 61 67 65 3a 20 20 20 70 61 67 65 72 5f   Usage:   pager_
0d10: 63 6c 6f 73 65 20 49 44 0a 2a 2a 0a 2a 2a 20 43  close ID.**.** C
0d20: 6c 6f 73 65 20 74 68 65 20 67 69 76 65 6e 20 70  lose the given p
0d30: 61 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ager..*/.static 
0d40: 69 6e 74 20 70 61 67 65 72 5f 63 6c 6f 73 65 28  int pager_close(
0d50: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
0d60: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
0d70: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
0d80: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
0d90: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
0da0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
0db0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
0dc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0dd0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
0de0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
0df0: 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65  *argv      /* Te
0e00: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
0e10: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65  ent */.){.  Page
0e20: 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  r *pPager;.  int
0e30: 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21   rc;.  if( argc!
0e40: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
0e50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
0e60: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
0e70: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
0e80: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
0e90: 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20   " ID\"", 0);.  
0ea0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
0eb0: 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OR;.  }.  pPager
0ec0: 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74 54 65   = sqlite3TestTe
0ed0: 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29  xtToPtr(argv[1])
0ee0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
0ef0: 50 61 67 65 72 43 6c 6f 73 65 28 70 50 61 67 65  PagerClose(pPage
0f00: 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
0f10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
0f20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
0f30: 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d  interp, errorNam
0f40: 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  e(rc), 0);.    r
0f50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0f60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
0f70: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
0f80: 73 61 67 65 3a 20 20 20 70 61 67 65 72 5f 72 6f  sage:   pager_ro
0f90: 6c 6c 62 61 63 6b 20 49 44 0a 2a 2a 0a 2a 2a 20  llback ID.**.** 
0fa0: 52 6f 6c 6c 62 61 63 6b 20 63 68 61 6e 67 65 73  Rollback changes
0fb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
0fc0: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 0a 20  ager_rollback(. 
0fd0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
0fe0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0ff0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1000: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1010: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1020: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1030: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
1040: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1050: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1060: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
1070: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74  rgv      /* Text
1080: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
1090: 74 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20  t */.){.  Pager 
10a0: 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  *pPager;.  int r
10b0: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  c;.  if( argc!=2
10c0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
10d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10e0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
10f0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1100: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
1110: 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20   ID\"", 0);.    
1120: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1130: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d  ;.  }.  pPager =
1140: 20 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74   sqlite3TestText
1150: 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a  ToPtr(argv[1]);.
1160: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1170: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
1180: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
1190: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11b0: 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61  (interp, errorNa
11c0: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
11d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
11f0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1200: 55 73 61 67 65 3a 20 20 20 70 61 67 65 72 5f 63  Usage:   pager_c
1210: 6f 6d 6d 69 74 20 49 44 0a 2a 2a 0a 2a 2a 20 43  ommit ID.**.** C
1220: 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65  ommit all change
1230: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
1240: 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 0a 20 20  pager_commit(.  
1250: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
1260: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1270: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
1280: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
1290: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
12a0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
12b0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
12c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12d0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
12e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72   const char **ar
12f0: 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20  gv      /* Text 
1300: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
1310: 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a   */.){.  Pager *
1320: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1330: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
1340: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1350: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1360: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1370: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1380: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
1390: 49 44 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  ID\"", 0);.    r
13a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13b0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20  .  }.  pPager = 
13c0: 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54  sqlite3TestTextT
13d0: 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20  oPtr(argv[1]);. 
13e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
13f0: 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
1400: 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a  (pPager, 0, 0);.
1410: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1420: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
1430: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1440: 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63  rp, errorName(rc
1450: 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
1460: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1470: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1480: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1490: 77 6f 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  wo(pPager);.  if
14a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14b0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
14c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14d0: 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  errorName(rc), 0
14e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
14f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
1500: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1510: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
1520: 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e  pager_stmt_begin
1530: 20 49 44 0a 2a 2a 0a 2a 2a 20 53 74 61 72 74 20   ID.**.** Start 
1540: 61 20 6e 65 77 20 63 68 65 63 6b 70 6f 69 6e 74  a new checkpoint
1550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1560: 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e  pager_stmt_begin
1570: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
1580: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
1590: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
15a0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
15b0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
15c0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
15d0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
15e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15f0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1600: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1610: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
1620: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
1630: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 50 61 67  ment */.){.  Pag
1640: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e  er *pPager;.  in
1650: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
1660: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1670: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1680: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1690: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
16a0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
16b0: 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20    " ID\"", 0);. 
16c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16d0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ROR;.  }.  pPage
16e0: 72 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74 54  r = sqlite3TestT
16f0: 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d  extToPtr(argv[1]
1700: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1710: 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
1720: 69 6e 74 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  int(pPager, 1);.
1730: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1740: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
1750: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1760: 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65 28 72 63  rp, errorName(rc
1770: 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
1780: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1790: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
17a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
17b0: 3a 20 20 20 70 61 67 65 72 5f 73 74 6d 74 5f 72  :   pager_stmt_r
17c0: 6f 6c 6c 62 61 63 6b 20 49 44 0a 2a 2a 0a 2a 2a  ollback ID.**.**
17d0: 20 52 6f 6c 6c 62 61 63 6b 20 63 68 61 6e 67 65   Rollback change
17e0: 73 20 74 6f 20 61 20 63 68 65 63 6b 70 6f 69 6e  s to a checkpoin
17f0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t.*/.static int 
1800: 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62  pager_stmt_rollb
1810: 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ack(.  void *Not
1820: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
1830: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
1840: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
1850: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
1860: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
1870: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
1880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1890: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
18a0: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
18b0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f  ar **argv      /
18c0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
18d0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
18e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
18f0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61   int rc;.  if( a
1900: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
1910: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1920: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1930: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1940: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
1950: 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30 29       " ID\"", 0)
1960: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1970: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50  _ERROR;.  }.  pP
1980: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 65  ager = sqlite3Te
1990: 73 74 54 65 78 74 54 6f 50 74 72 28 61 72 67 76  stTextToPtr(argv
19a0: 5b 31 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  [1]);.  rc = sql
19b0: 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
19c0: 6e 74 28 70 50 61 67 65 72 2c 20 53 41 56 45 50  nt(pPager, SAVEP
19d0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 30  OINT_ROLLBACK, 0
19e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
19f0: 72 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65  rSavepoint(pPage
1a00: 72 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  r, SAVEPOINT_REL
1a10: 45 41 53 45 2c 20 30 29 3b 0a 20 20 69 66 28 20  EASE, 0);.  if( 
1a20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a30: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1a40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72  esult(interp, er
1a50: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
1a60: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1a70: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
1a80: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1a90: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 70 61  *.** Usage:   pa
1aa0: 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 20  ger_stmt_commit 
1ab0: 49 44 0a 2a 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  ID.**.** Commit 
1ac0: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 63 68 65  changes to a che
1ad0: 63 6b 70 6f 69 6e 74 0a 2a 2f 0a 73 74 61 74 69  ckpoint.*/.stati
1ae0: 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74  c int pager_stmt
1af0: 5f 63 6f 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20  _commit(.  void 
1b00: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
1b10: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1b20: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1b30: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1b40: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1b50: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
1b60: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1b70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
1b80: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  uments */.  cons
1b90: 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20  t char **argv   
1ba0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
1bb0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
1bc0: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1bd0: 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  r;.  int rc;.  i
1be0: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
1bf0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1c00: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1c10: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1c20: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1c30: 2c 0a 20 20 20 20 20 20 20 22 20 49 44 5c 22 22  ,.       " ID\""
1c40: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1c50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c60: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
1c70: 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28  e3TestTextToPtr(
1c80: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 63 20 3d  argv[1]);.  rc =
1c90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
1ca0: 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 53  epoint(pPager, S
1cb0: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
1cc0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
1cd0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ce0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1cf0: 74 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e  t(interp, errorN
1d00: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
1d10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d20: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
1d30: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1d40: 20 55 73 61 67 65 3a 20 20 20 70 61 67 65 72 5f   Usage:   pager_
1d50: 73 74 61 74 73 20 49 44 0a 2a 2a 0a 2a 2a 20 52  stats ID.**.** R
1d60: 65 74 75 72 6e 20 70 61 67 65 72 20 73 74 61 74  eturn pager stat
1d70: 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69  istics..*/.stati
1d80: 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 61 74  c int pager_stat
1d90: 73 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  s(.  void *NotUs
1da0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
1db0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
1dc0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
1dd0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
1de0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
1df0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
1e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1e10: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
1e20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1e30: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20   **argv      /* 
1e40: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
1e50: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 50 61  ument */.){.  Pa
1e60: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69  ger *pPager;.  i
1e70: 6e 74 20 69 2c 20 2a 61 3b 0a 20 20 69 66 28 20  nt i, *a;.  if( 
1e80: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
1e90: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1ea0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1eb0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1ec0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
1ed0: 20 20 20 20 20 20 22 20 49 44 5c 22 22 2c 20 30        " ID\"", 0
1ee0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1ef0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  L_ERROR;.  }.  p
1f00: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54  Pager = sqlite3T
1f10: 65 73 74 54 65 78 74 54 6f 50 74 72 28 61 72 67  estTextToPtr(arg
1f20: 76 5b 31 5d 29 3b 0a 20 20 61 20 3d 20 73 71 6c  v[1]);.  a = sql
1f30: 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28 70  ite3PagerStats(p
1f40: 50 61 67 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d  Pager);.  for(i=
1f50: 30 3b 20 69 3c 39 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<9; i++){.  
1f60: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a    static char *z
1f70: 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Name[] = {.     
1f80: 20 22 72 65 66 22 2c 20 22 70 61 67 65 22 2c 20   "ref", "page", 
1f90: 22 6d 61 78 22 2c 20 22 73 69 7a 65 22 2c 20 22  "max", "size", "
1fa0: 73 74 61 74 65 22 2c 20 22 65 72 72 22 2c 0a 20  state", "err",. 
1fb0: 20 20 20 20 20 22 68 69 74 22 2c 20 22 6d 69 73       "hit", "mis
1fc0: 73 22 2c 20 22 6f 76 66 6c 22 2c 0a 20 20 20 20  s", "ovfl",.    
1fd0: 7d 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  };.    char zBuf
1fe0: 5b 31 30 30 5d 3b 0a 20 20 20 20 54 63 6c 5f 41  [100];.    Tcl_A
1ff0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2000: 65 72 70 2c 20 7a 4e 61 6d 65 5b 69 5d 29 3b 0a  erp, zName[i]);.
2010: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2020: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
2030: 29 2c 7a 42 75 66 2c 22 25 64 22 2c 61 5b 69 5d  ),zBuf,"%d",a[i]
2040: 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
2050: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2060: 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20 72 65   zBuf);.  }.  re
2070: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2080: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 70  /*.** Usage:   p
2090: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 20 49  ager_pagecount I
20a0: 44 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  D.**.** Return t
20b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
20c0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
20d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
20e0: 72 5f 70 61 67 65 63 6f 75 6e 74 28 0a 20 20 76  r_pagecount(.  v
20f0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
2100: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2110: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2120: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2130: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2140: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2150: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
2160: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2170: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2180: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67  const char **arg
2190: 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  v      /* Text o
21a0: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
21b0: 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  */.){.  Pager *p
21c0: 50 61 67 65 72 3b 0a 20 20 63 68 61 72 20 7a 42  Pager;.  char zB
21d0: 75 66 5b 31 30 30 5d 3b 0a 20 20 69 6e 74 20 6e  uf[100];.  int n
21e0: 50 61 67 65 3b 0a 20 20 69 66 28 20 61 72 67 63  Page;.  if( argc
21f0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
2200: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2210: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
2220: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
2230: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
2240: 20 20 22 20 49 44 5c 22 22 2c 20 30 29 3b 0a 20    " ID\"", 0);. 
2250: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2260: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ROR;.  }.  pPage
2270: 72 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74 54  r = sqlite3TestT
2280: 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d  extToPtr(argv[1]
2290: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
22a0: 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
22b0: 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 73 71  r, &nPage);.  sq
22c0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
22d0: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
22e0: 66 2c 20 22 25 64 22 2c 20 6e 50 61 67 65 29 3b  f, "%d", nPage);
22f0: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
2300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
2310: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
2320: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2330: 55 73 61 67 65 3a 20 20 20 70 61 67 65 5f 67 65  Usage:   page_ge
2340: 74 20 49 44 20 50 47 4e 4f 0a 2a 2a 0a 2a 2a 20  t ID PGNO.**.** 
2350: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
2360: 20 74 6f 20 61 20 70 61 67 65 20 66 72 6f 6d 20   to a page from 
2370: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
2380: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2390: 5f 67 65 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  _get(.  void *No
23a0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
23b0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
23c0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
23d0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
23e0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
23f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2410: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
2420: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
2430: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2440: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
2450: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
2460: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
2470: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
2480: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 50 61 67  ;.  DbPage *pPag
2490: 65 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20  e;.  int pgno;. 
24a0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61   int rc;.  if( a
24b0: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
24c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
24d0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
24e0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
24f0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
2500: 20 20 20 20 20 22 20 49 44 20 50 47 4e 4f 5c 22       " ID PGNO\"
2510: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2520: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2530: 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69  .  pPager = sqli
2540: 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72  te3TestTextToPtr
2550: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28  (argv[1]);.  if(
2560: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
2570: 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 70 67  rp, argv[2], &pg
2580: 6e 6f 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  no) ) return TCL
2590: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
25a0: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
25b0: 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  dLock(pPager);. 
25c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25d0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
25e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
25f0: 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
2600: 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  age);.  }.  if( 
2610: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2620: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2630: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72  esult(interp, er
2640: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
2650: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2660: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c  ERROR;.  }.  sql
2670: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2680: 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c  zeof(zBuf),zBuf,
2690: 22 25 70 22 2c 70 50 61 67 65 29 3b 0a 20 20 54  "%p",pPage);.  T
26a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
26b0: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
26c0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
26d0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
26e0: 65 3a 20 20 20 70 61 67 65 5f 6c 6f 6f 6b 75 70  e:   page_lookup
26f0: 20 49 44 20 50 47 4e 4f 0a 2a 2a 0a 2a 2a 20 52   ID PGNO.**.** R
2700: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
2710: 74 6f 20 61 20 70 61 67 65 20 69 66 20 74 68 65  to a page if the
2720: 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
2730: 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66   in cache..** If
2740: 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2c 20 72   not in cache, r
2750: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
2760: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
2770: 20 69 6e 74 20 70 61 67 65 5f 6c 6f 6f 6b 75 70   int page_lookup
2780: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
2790: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
27a0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
27b0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
27c0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
27d0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
27e0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
27f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2800: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2810: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2820: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
2830: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
2840: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 50 61 67  ment */.){.  Pag
2850: 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 63 68  er *pPager;.  ch
2860: 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20  ar zBuf[100];.  
2870: 44 62 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  DbPage *pPage;. 
2880: 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 69 66 28   int pgno;.  if(
2890: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
28a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
28b0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
28c0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
28d0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
28e0: 20 20 20 20 20 20 20 22 20 49 44 20 50 47 4e 4f         " ID PGNO
28f0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
2900: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2910: 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71   }.  pPager = sq
2920: 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50  lite3TestTextToP
2930: 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69  tr(argv[1]);.  i
2940: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
2950: 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26  terp, argv[2], &
2960: 70 67 6e 6f 29 20 29 20 72 65 74 75 72 6e 20 54  pgno) ) return T
2970: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 50 61 67  CL_ERROR;.  pPag
2980: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
2990: 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  Lookup(pPager, p
29a0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67  gno);.  if( pPag
29b0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
29c0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
29d0: 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25 70 22  (zBuf),zBuf,"%p"
29e0: 2c 70 50 61 67 65 29 3b 0a 20 20 20 20 54 63 6c  ,pPage);.    Tcl
29f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2a00: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
2a10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
2a20: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
2a30: 61 67 65 3a 20 20 20 70 61 67 65 72 5f 74 72 75  age:   pager_tru
2a40: 6e 63 61 74 65 20 49 44 20 50 47 4e 4f 0a 2a 2f  ncate ID PGNO.*/
2a50: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2a60: 72 5f 74 72 75 6e 63 61 74 65 28 0a 20 20 76 6f  r_truncate(.  vo
2a70: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2a80: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2a90: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2aa0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2ab0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2ac0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2ad0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2ae0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2af0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2b00: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76  onst char **argv
2b10: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2b20: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2b30: 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  /.){.  Pager *pP
2b40: 61 67 65 72 3b 0a 20 20 69 6e 74 20 70 67 6e 6f  ager;.  int pgno
2b50: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
2b60: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2b70: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2b80: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
2b90: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
2ba0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
2bb0: 49 44 20 50 47 4e 4f 5c 22 22 2c 20 30 29 3b 0a  ID PGNO\"", 0);.
2bc0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2bd0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 67  RROR;.  }.  pPag
2be0: 65 72 20 3d 20 73 71 6c 69 74 65 33 54 65 73 74  er = sqlite3Test
2bf0: 54 65 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31  TextToPtr(argv[1
2c00: 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
2c10: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
2c20: 76 5b 32 5d 2c 20 26 70 67 6e 6f 29 20 29 20 72  v[2], &pgno) ) r
2c30: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2c40: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  .  sqlite3PagerT
2c50: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 50 61  runcateImage(pPa
2c60: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 72 65  ger, pgno);.  re
2c70: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2c80: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
2c90: 70 61 67 65 5f 75 6e 72 65 66 20 50 41 47 45 0a  page_unref PAGE.
2ca0: 2a 2a 0a 2a 2a 20 44 72 6f 70 20 61 20 70 6f 69  **.** Drop a poi
2cb0: 6e 74 65 72 20 74 6f 20 61 20 70 61 67 65 2e 0a  nter to a page..
2cc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2cd0: 67 65 5f 75 6e 72 65 66 28 0a 20 20 76 6f 69 64  ge_unref(.  void
2ce0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
2cf0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2d00: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2d10: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2d20: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2d30: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
2d40: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
2d50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2d60: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  guments */.  con
2d70: 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  st char **argv  
2d80: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
2d90: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
2da0: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 50 61  ){.  DbPage *pPa
2db0: 67 65 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ge;.  if( argc!=
2dc0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
2dd0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2de0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
2df0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
2e00: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
2e10: 22 20 50 41 47 45 5c 22 22 2c 20 30 29 3b 0a 20  " PAGE\"", 0);. 
2e20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2e30: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ROR;.  }.  pPage
2e40: 20 3d 20 28 44 62 50 61 67 65 20 2a 29 73 71 6c   = (DbPage *)sql
2e50: 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74  ite3TestTextToPt
2e60: 72 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 73 71  r(argv[1]);.  sq
2e70: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2e80: 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  pPage);.  return
2e90: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2ea0: 2a 20 55 73 61 67 65 3a 20 20 20 70 61 67 65 5f  * Usage:   page_
2eb0: 72 65 61 64 20 50 41 47 45 0a 2a 2a 0a 2a 2a 20  read PAGE.**.** 
2ec0: 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6e 74 65  Return the conte
2ed0: 6e 74 20 6f 66 20 61 20 70 61 67 65 0a 2a 2f 0a  nt of a page.*/.
2ee0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 5f  static int page_
2ef0: 72 65 61 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  read(.  void *No
2f00: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
2f10: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
2f20: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
2f30: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
2f40: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
2f50: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f70: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
2f80: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
2f90: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2fa0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
2fb0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
2fc0: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
2fd0: 0a 20 20 44 62 50 61 67 65 20 2a 70 50 61 67 65  .  DbPage *pPage
2fe0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
2ff0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
3000: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3010: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
3020: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
3030: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
3040: 50 41 47 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  PAGE\"", 0);.   
3050: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3060: 52 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 20 3d  R;.  }.  pPage =
3070: 20 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74   sqlite3TestText
3080: 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29 3b 0a  ToPtr(argv[1]);.
3090: 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 73    memcpy(zBuf, s
30a0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
30b0: 74 61 28 70 50 61 67 65 29 2c 20 73 69 7a 65 6f  ta(pPage), sizeo
30c0: 66 28 7a 42 75 66 29 29 3b 0a 20 20 54 63 6c 5f  f(zBuf));.  Tcl_
30d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
30e0: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
30f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
3100: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
3110: 20 20 70 61 67 65 5f 6e 75 6d 62 65 72 20 50 41    page_number PA
3120: 47 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  GE.**.** Return 
3130: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
3140: 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2f 0a 73  for a page..*/.s
3150: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 5f 6e  tatic int page_n
3160: 75 6d 62 65 72 28 0a 20 20 76 6f 69 64 20 2a 4e  umber(.  void *N
3170: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
3180: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
3190: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
31a0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
31b0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
31c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31e0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
31f0: 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ents */.  const 
3200: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
3210: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
3220: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
3230: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
3240: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 50 61 67  ;.  DbPage *pPag
3250: 65 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  e;.  if( argc!=2
3260: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
3270: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
3280: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
3290: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
32a0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
32b0: 20 50 41 47 45 5c 22 22 2c 20 30 29 3b 0a 20 20   PAGE\"", 0);.  
32c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
32d0: 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 20  OR;.  }.  pPage 
32e0: 3d 20 28 44 62 50 61 67 65 20 2a 29 73 71 6c 69  = (DbPage *)sqli
32f0: 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72  te3TestTextToPtr
3300: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 73 71 6c  (argv[1]);.  sql
3310: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
3320: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
3330: 2c 20 22 25 64 22 2c 20 73 71 6c 69 74 65 33 50  , "%d", sqlite3P
3340: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
3350: 50 61 67 65 29 29 3b 0a 20 20 54 63 6c 5f 41 70  Page));.  Tcl_Ap
3360: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
3370: 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72  p, zBuf, 0);.  r
3380: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3390: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
33a0: 70 61 67 65 5f 77 72 69 74 65 20 50 41 47 45 20  page_write PAGE 
33b0: 44 41 54 41 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  DATA.**.** Write
33c0: 20 73 6f 6d 65 74 68 69 6e 67 20 69 6e 74 6f 20   something into 
33d0: 61 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  a page..*/.stati
33e0: 63 20 69 6e 74 20 70 61 67 65 5f 77 72 69 74 65  c int page_write
33f0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3400: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
3410: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
3420: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
3430: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
3440: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
3450: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
3460: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3470: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
3480: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
3490: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
34a0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
34b0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 44 62 50  ment */.){.  DbP
34c0: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 63 68  age *pPage;.  ch
34d0: 61 72 20 2a 70 44 61 74 61 3b 0a 20 20 69 6e 74  ar *pData;.  int
34e0: 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21   rc;.  if( argc!
34f0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
3500: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
3510: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
3520: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
3530: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
3540: 20 22 20 50 41 47 45 20 44 41 54 41 5c 22 22 2c   " PAGE DATA\"",
3550: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
3560: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
3570: 20 70 50 61 67 65 20 3d 20 28 44 62 50 61 67 65   pPage = (DbPage
3580: 20 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54 65   *)sqlite3TestTe
3590: 78 74 54 6f 50 74 72 28 61 72 67 76 5b 31 5d 29  xtToPtr(argv[1])
35a0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
35b0: 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
35c0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
35d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
35e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
35f0: 6e 74 65 72 70 2c 20 65 72 72 6f 72 4e 61 6d 65  nterp, errorName
3600: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
3610: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3620: 20 20 7d 0a 20 20 70 44 61 74 61 20 3d 20 73 71    }.  pData = sq
3630: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
3640: 61 28 70 50 61 67 65 29 3b 0a 20 20 73 74 72 6e  a(pPage);.  strn
3650: 63 70 79 28 70 44 61 74 61 2c 20 61 72 67 76 5b  cpy(pData, argv[
3660: 32 5d 2c 20 74 65 73 74 5f 70 61 67 65 73 69 7a  2], test_pagesiz
3670: 65 2d 31 29 3b 0a 20 20 70 44 61 74 61 5b 74 65  e-1);.  pData[te
3680: 73 74 5f 70 61 67 65 73 69 7a 65 2d 31 5d 20 3d  st_pagesize-1] =
3690: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   0;.  return TCL
36a0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
36b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
36c0: 49 4f 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  IO./*.** Usage: 
36d0: 20 20 66 61 6b 65 5f 62 69 67 5f 66 69 6c 65 20    fake_big_file 
36e0: 20 4e 20 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a   N  FILENAME.**.
36f0: 2a 2a 20 57 72 69 74 65 20 61 20 66 65 77 20 62  ** Write a few b
3700: 79 74 65 73 20 61 74 20 74 68 65 20 4e 20 6d 65  ytes at the N me
3710: 67 61 62 79 74 65 20 70 6f 69 6e 74 20 6f 66 20  gabyte point of 
3720: 46 49 4c 45 4e 41 4d 45 2e 20 20 54 68 69 73 20  FILENAME.  This 
3730: 77 69 6c 6c 0a 2a 2a 20 63 72 65 61 74 65 20 61  will.** create a
3740: 20 6c 61 72 67 65 20 66 69 6c 65 2e 20 20 49 66   large file.  If
3750: 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 61 20   the file was a 
3760: 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74  valid SQLite dat
3770: 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
3780: 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
3790: 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
37a0: 6e 65 64 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c  ned, SQLite will
37b0: 20 62 65 67 69 6e 20 61 6c 6c 6f 63 61 74 69 6e   begin allocatin
37c0: 67 0a 2a 2a 20 6e 65 77 20 70 61 67 65 73 20 61  g.** new pages a
37d0: 66 74 65 72 20 4e 2e 20 20 49 66 20 4e 20 69 73  fter N.  If N is
37e0: 20 32 30 39 36 20 6f 72 20 62 69 67 67 65 72 2c   2096 or bigger,
37f0: 20 74 68 69 73 20 77 69 6c 6c 20 74 65 73 74 20   this will test 
3800: 74 68 65 0a 2a 2a 20 61 62 69 6c 69 74 79 20 6f  the.** ability o
3810: 66 20 53 51 4c 69 74 65 20 74 6f 20 77 72 69 74  f SQLite to writ
3820: 65 20 74 6f 20 6c 61 72 67 65 20 66 69 6c 65 73  e to large files
3830: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3840: 66 61 6b 65 5f 62 69 67 5f 66 69 6c 65 28 0a 20  fake_big_file(. 
3850: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
3860: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
3870: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
3880: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
3890: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
38a0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
38b0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
38c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
38d0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
38e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
38f0: 72 67 76 20 20 20 20 20 20 2f 2a 20 54 65 78 74  rgv      /* Text
3900: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
3910: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
3920: 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 73  3_vfs *pVfs;.  s
3930: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
3940: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
3950: 20 69 6e 74 20 6e 3b 0a 20 20 69 36 34 20 6f 66   int n;.  i64 of
3960: 66 73 65 74 3b 0a 20 20 63 68 61 72 20 2a 7a 46  fset;.  char *zF
3970: 69 6c 65 3b 0a 20 20 69 6e 74 20 6e 46 69 6c 65  ile;.  int nFile
3980: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
3990: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
39a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
39b0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
39c0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
39d0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
39e0: 4e 2d 4d 45 47 41 42 59 54 45 53 20 46 49 4c 45  N-MEGABYTES FILE
39f0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
3a00: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3a10: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
3a20: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
3a30: 5b 31 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72  [1], &n) ) retur
3a40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
3a50: 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
3a60: 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 6e 46  fs_find(0);.  nF
3a70: 69 6c 65 20 3d 20 73 74 72 6c 65 6e 28 61 72 67  ile = strlen(arg
3a80: 76 5b 32 5d 29 3b 0a 20 20 7a 46 69 6c 65 20 3d  v[2]);.  zFile =
3a90: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
3aa0: 20 6e 46 69 6c 65 2b 32 20 29 3b 0a 20 20 69 66   nFile+2 );.  if
3ab0: 28 20 7a 46 69 6c 65 3d 3d 30 20 29 20 72 65 74  ( zFile==0 ) ret
3ac0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3ad0: 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20 61   memcpy(zFile, a
3ae0: 72 67 76 5b 32 5d 2c 20 6e 46 69 6c 65 2b 31 29  rgv[2], nFile+1)
3af0: 3b 0a 20 20 7a 46 69 6c 65 5b 6e 46 69 6c 65 2b  ;.  zFile[nFile+
3b00: 31 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  1] = 0;.  rc = s
3b10: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c  qlite3OsOpenMall
3b20: 6f 63 28 70 56 66 73 2c 20 7a 46 69 6c 65 2c 20  oc(pVfs, zFile, 
3b30: 26 66 64 2c 20 0a 20 20 20 20 20 20 28 53 51 4c  &fd, .      (SQL
3b40: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
3b50: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
3b60: 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
3b70: 4e 5f 4d 41 49 4e 5f 44 42 29 2c 20 30 0a 20 20  N_MAIN_DB), 0.  
3b80: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
3b90: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
3ba0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6f 70 65  ult(interp, "ope
3bb0: 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72  n failed: ", err
3bc0: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
3bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3be0: 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 74  (zFile);.    ret
3bf0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3c00: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 6e 3b   }.  offset = n;
3c10: 0a 20 20 6f 66 66 73 65 74 20 2a 3d 20 31 30 32  .  offset *= 102
3c20: 34 2a 31 30 32 34 3b 0a 20 20 72 63 20 3d 20 73  4*1024;.  rc = s
3c30: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
3c40: 2c 20 22 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21  , "Hello, World!
3c50: 22 2c 20 31 34 2c 20 6f 66 66 73 65 74 29 3b 0a  ", 14, offset);.
3c60: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
3c70: 46 72 65 65 28 66 64 29 3b 0a 20 20 73 71 6c 69  Free(fd);.  sqli
3c80: 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b  te3_free(zFile);
3c90: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
3ca0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
3cb0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 69 74 65  t(interp, "write
3cc0: 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 6f   failed: ", erro
3cd0: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
3ce0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
3cf0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
3d00: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
3d10: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 74 65 73 74 5f  if.../*.** test_
3d20: 63 6f 6e 74 72 6f 6c 5f 70 65 6e 64 69 6e 67 5f  control_pending_
3d30: 62 79 74 65 20 20 50 45 4e 44 49 4e 47 5f 42 59  byte  PENDING_BY
3d40: 54 45 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65  TE.**.** Set the
3d50: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 75 73   PENDING_BYTE us
3d60: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
3d70: 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 20 69  test_control() i
3d80: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61  nterface..*/.sta
3d90: 74 69 63 20 69 6e 74 20 74 65 73 74 50 65 6e 64  tic int testPend
3da0: 69 6e 67 42 79 74 65 28 0a 20 20 76 6f 69 64 20  ingByte(.  void 
3db0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
3dc0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
3dd0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
3de0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
3df0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
3e00: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
3e10: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
3e20: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
3e30: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  uments */.  cons
3e40: 74 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20  t char **argv   
3e50: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
3e60: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
3e70: 7b 0a 20 20 69 6e 74 20 70 62 79 74 65 3b 0a 20  {.  int pbyte;. 
3e80: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61   int rc;.  if( a
3e90: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
3ea0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3eb0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
3ec0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
3ed0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 20 20 20 22 20 50 45 4e 44 49 4e 47 2d 42 59 54     " PENDING-BYT
3f00: 45 5c 22 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b  E\"", (void*)0);
3f10: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
3f20: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
3f30: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
3f40: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70 62  rp, argv[1], &pb
3f50: 79 74 65 29 20 29 20 72 65 74 75 72 6e 20 54 43  yte) ) return TC
3f60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
3f70: 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
3f80: 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
3f90: 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
3fa0: 45 2c 20 70 62 79 74 65 29 3b 0a 20 20 54 63 6c  E, pbyte);.  Tcl
3fb0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
3fc0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
3fd0: 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75  Obj(rc));.  retu
3fe0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 20 20 0a 0a  rn TCL_OK;.}  ..
3ff0: 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 42 69 74  /*.** sqlite3Bit
4000: 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 20 53  vecBuiltinTest S
4010: 49 5a 45 20 50 52 4f 47 52 41 4d 0a 2a 2a 0a 2a  IZE PROGRAM.**.*
4020: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 53 51 4c  * Invoke the SQL
4030: 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54  ITE_TESTCTRL_BIT
4040: 56 45 43 5f 54 45 53 54 20 6f 70 65 72 61 74 6f  VEC_TEST operato
4050: 72 20 6f 6e 20 74 65 73 74 5f 63 6f 6e 74 72 6f  r on test_contro
4060: 6c 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  l..** See commen
4070: 74 73 20 6f 6e 20 73 71 6c 69 74 65 33 42 69 74  ts on sqlite3Bit
4080: 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29  vecBuiltinTest()
4090: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
40a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
40b0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 42  static int testB
40c0: 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74  itvecBuiltinTest
40d0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
40e0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
40f0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
4100: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
4110: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
4120: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
4130: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
4140: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4150: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4160: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
4170: 2a 2a 61 72 67 76 20 20 20 20 20 20 2f 2a 20 54  **argv      /* T
4180: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
4190: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
41a0: 20 73 7a 2c 20 72 63 3b 0a 20 20 69 6e 74 20 6e   sz, rc;.  int n
41b0: 50 72 6f 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Prog = 0;.  int 
41c0: 61 50 72 6f 67 5b 31 30 30 5d 3b 0a 20 20 63 6f  aProg[100];.  co
41d0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
41e0: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
41f0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
4200: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
4210: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
4220: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
4230: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4240: 20 20 20 20 20 20 20 22 20 53 49 5a 45 20 50 52         " SIZE PR
4250: 4f 47 52 41 4d 5c 22 22 2c 20 28 76 6f 69 64 2a  OGRAM\"", (void*
4260: 29 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  )0);.  }.  if( T
4270: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
4280: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 73 7a 29 20  , argv[1], &sz) 
4290: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
42a0: 4f 52 3b 0a 20 20 7a 20 3d 20 61 72 67 76 5b 32  OR;.  z = argv[2
42b0: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 50 72 6f  ];.  while( nPro
42c0: 67 3c 39 39 20 26 26 20 2a 7a 20 29 7b 0a 20 20  g<99 && *z ){.  
42d0: 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 21    while( *z && !
42e0: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
42f0: 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20  z) ){ z++; }.   
4300: 20 69 66 28 20 2a 7a 3d 3d 30 20 29 20 62 72 65   if( *z==0 ) bre
4310: 61 6b 3b 0a 20 20 20 20 61 50 72 6f 67 5b 6e 50  ak;.    aProg[nP
4320: 72 6f 67 2b 2b 5d 20 3d 20 61 74 6f 69 28 7a 29  rog++] = atoi(z)
4330: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c  ;.    while( sql
4340: 69 74 65 33 49 73 64 69 67 69 74 28 2a 7a 29 20  ite3Isdigit(*z) 
4350: 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  ){ z++; }.  }.  
4360: 61 50 72 6f 67 5b 6e 50 72 6f 67 5d 20 3d 20 30  aProg[nProg] = 0
4370: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
4380: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
4390: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49  LITE_TESTCTRL_BI
43a0: 54 56 45 43 5f 54 45 53 54 2c 20 73 7a 2c 20 61  TVEC_TEST, sz, a
43b0: 50 72 6f 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74  Prog);.  Tcl_Set
43c0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
43d0: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
43e0: 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  rc));.  return T
43f0: 43 4c 5f 4f 4b 3b 0a 7d 20 20 0a 0a 2f 2a 0a 2a  CL_OK;.}  ../*.*
4400: 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61  * Register comma
4410: 6e 64 73 20 77 69 74 68 20 74 68 65 20 54 43 4c  nds with the TCL
4420: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f   interpreter..*/
4430: 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 32  .int Sqlitetest2
4440: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
4450: 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 65 78 74   *interp){.  ext
4460: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
4470: 69 6f 5f 65 72 72 6f 72 5f 70 65 72 73 69 73 74  io_error_persist
4480: 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
4490: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
44a0: 70 65 6e 64 69 6e 67 3b 0a 20 20 65 78 74 65 72  pending;.  exter
44b0: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
44c0: 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 20 20 65 78  _error_hit;.  ex
44d0: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
44e0: 5f 69 6f 5f 65 72 72 6f 72 5f 68 61 72 64 68 69  _io_error_hardhi
44f0: 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
4500: 73 71 6c 69 74 65 33 5f 64 69 73 6b 66 75 6c 6c  sqlite3_diskfull
4510: 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 65 78 74 65  _pending;.  exte
4520: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  rn int sqlite3_d
4530: 69 73 6b 66 75 6c 6c 3b 0a 20 20 73 74 61 74 69  iskfull;.  stati
4540: 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63  c struct {.    c
4550: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
4560: 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72  Tcl_CmdProc *xPr
4570: 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d  oc;.  } aCmd[] =
4580: 20 7b 0a 20 20 20 20 7b 20 22 70 61 67 65 72 5f   {.    { "pager_
4590: 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 20  open",          
45a0: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
45b0: 2a 29 70 61 67 65 72 5f 6f 70 65 6e 20 20 20 20  *)pager_open    
45c0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
45d0: 70 61 67 65 72 5f 63 6c 6f 73 65 22 2c 20 20 20  pager_close",   
45e0: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
45f0: 6d 64 50 72 6f 63 2a 29 70 61 67 65 72 5f 63 6c  mdProc*)pager_cl
4600: 6f 73 65 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ose         },. 
4610: 20 20 20 7b 20 22 70 61 67 65 72 5f 63 6f 6d 6d     { "pager_comm
4620: 69 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  it",            
4630: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 70 61  (Tcl_CmdProc*)pa
4640: 67 65 72 5f 63 6f 6d 6d 69 74 20 20 20 20 20 20  ger_commit      
4650: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 61 67 65    },.    { "page
4660: 72 5f 72 6f 6c 6c 62 61 63 6b 22 2c 20 20 20 20  r_rollback",    
4670: 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
4680: 6f 63 2a 29 70 61 67 65 72 5f 72 6f 6c 6c 62 61  oc*)pager_rollba
4690: 63 6b 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  ck      },.    {
46a0: 20 22 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67   "pager_stmt_beg
46b0: 69 6e 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  in",        (Tcl
46c0: 5f 43 6d 64 50 72 6f 63 2a 29 70 61 67 65 72 5f  _CmdProc*)pager_
46d0: 73 74 6d 74 5f 62 65 67 69 6e 20 20 20 20 7d 2c  stmt_begin    },
46e0: 0a 20 20 20 20 7b 20 22 70 61 67 65 72 5f 73 74  .    { "pager_st
46f0: 6d 74 5f 63 6f 6d 6d 69 74 22 2c 20 20 20 20 20  mt_commit",     
4700: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
4710: 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69  pager_stmt_commi
4720: 74 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 61  t   },.    { "pa
4730: 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63  ger_stmt_rollbac
4740: 6b 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  k",     (Tcl_Cmd
4750: 50 72 6f 63 2a 29 70 61 67 65 72 5f 73 74 6d 74  Proc*)pager_stmt
4760: 5f 72 6f 6c 6c 62 61 63 6b 20 7d 2c 0a 20 20 20  _rollback },.   
4770: 20 7b 20 22 70 61 67 65 72 5f 73 74 61 74 73 22   { "pager_stats"
4780: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54  ,             (T
4790: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 70 61 67 65  cl_CmdProc*)page
47a0: 72 5f 73 74 61 74 73 20 20 20 20 20 20 20 20 20  r_stats         
47b0: 7d 2c 0a 20 20 20 20 7b 20 22 70 61 67 65 72 5f  },.    { "pager_
47c0: 70 61 67 65 63 6f 75 6e 74 22 2c 20 20 20 20 20  pagecount",     
47d0: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
47e0: 2a 29 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  *)pager_pagecoun
47f0: 74 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  t     },.    { "
4800: 70 61 67 65 5f 67 65 74 22 2c 20 20 20 20 20 20  page_get",      
4810: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
4820: 6d 64 50 72 6f 63 2a 29 70 61 67 65 5f 67 65 74  mdProc*)page_get
4830: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
4840: 20 20 20 7b 20 22 70 61 67 65 5f 6c 6f 6f 6b 75     { "page_looku
4850: 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
4860: 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 70 61  (Tcl_CmdProc*)pa
4870: 67 65 5f 6c 6f 6f 6b 75 70 20 20 20 20 20 20 20  ge_lookup       
4880: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 61 67 65    },.    { "page
4890: 5f 75 6e 72 65 66 22 2c 20 20 20 20 20 20 20 20  _unref",        
48a0: 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
48b0: 6f 63 2a 29 70 61 67 65 5f 75 6e 72 65 66 20 20  oc*)page_unref  
48c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
48d0: 20 22 70 61 67 65 5f 72 65 61 64 22 2c 20 20 20   "page_read",   
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
48f0: 5f 43 6d 64 50 72 6f 63 2a 29 70 61 67 65 5f 72  _CmdProc*)page_r
4900: 65 61 64 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ead           },
4910: 0a 20 20 20 20 7b 20 22 70 61 67 65 5f 77 72 69  .    { "page_wri
4920: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
4930: 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
4940: 70 61 67 65 5f 77 72 69 74 65 20 20 20 20 20 20  page_write      
4950: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 61      },.    { "pa
4960: 67 65 5f 6e 75 6d 62 65 72 22 2c 20 20 20 20 20  ge_number",     
4970: 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
4980: 50 72 6f 63 2a 29 70 61 67 65 5f 6e 75 6d 62 65  Proc*)page_numbe
4990: 72 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  r         },.   
49a0: 20 7b 20 22 70 61 67 65 72 5f 74 72 75 6e 63 61   { "pager_trunca
49b0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 28 54  te",          (T
49c0: 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 70 61 67 65  cl_CmdProc*)page
49d0: 72 5f 74 72 75 6e 63 61 74 65 20 20 20 20 20 20  r_truncate      
49e0: 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  },.#ifndef SQLIT
49f0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
4a00: 20 20 7b 20 22 66 61 6b 65 5f 62 69 67 5f 66 69    { "fake_big_fi
4a10: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  le",           (
4a20: 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 66 61 6b  Tcl_CmdProc*)fak
4a30: 65 5f 62 69 67 5f 66 69 6c 65 20 20 20 20 20 20  e_big_file      
4a40: 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b   },.#endif.    {
4a50: 20 22 73 71 6c 69 74 65 33 42 69 74 76 65 63 42   "sqlite3BitvecB
4a60: 75 69 6c 74 69 6e 54 65 73 74 22 2c 28 54 63 6c  uiltinTest",(Tcl
4a70: 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 42 69  _CmdProc*)testBi
4a80: 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 20  tvecBuiltinTest 
4a90: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 71      },.    { "sq
4aa0: 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
4ab0: 6f 6c 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 22  ol_pending_byte"
4ac0: 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29  , (Tcl_CmdProc*)
4ad0: 74 65 73 74 50 65 6e 64 69 6e 67 42 79 74 65 20  testPendingByte 
4ae0: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  },.  };.  int i;
4af0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
4b00: 7a 65 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f  zeof(aCmd)/sizeo
4b10: 66 28 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29  f(aCmd[0]); i++)
4b20: 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  {.    Tcl_Create
4b30: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
4b40: 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61  aCmd[i].zName, a
4b50: 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c  Cmd[i].xProc, 0,
4b60: 20 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c   0);.  }.  Tcl_L
4b70: 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
4b80: 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f  sqlite_io_error_
4b90: 70 65 6e 64 69 6e 67 22 2c 0a 20 20 20 20 20 28  pending",.     (
4ba0: 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 69  char*)&sqlite3_i
4bb0: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 2c  o_error_pending,
4bc0: 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
4bd0: 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
4be0: 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 69 6f  terp, "sqlite_io
4bf0: 5f 65 72 72 6f 72 5f 70 65 72 73 69 73 74 22 2c  _error_persist",
4c00: 0a 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71  .     (char*)&sq
4c10: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
4c20: 65 72 73 69 73 74 2c 20 54 43 4c 5f 4c 49 4e 4b  ersist, TCL_LINK
4c30: 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
4c40: 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
4c50: 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  lite_io_error_hi
4c60: 74 22 2c 0a 20 20 20 20 20 28 63 68 61 72 2a 29  t",.     (char*)
4c70: 26 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f  &sqlite3_io_erro
4c80: 72 5f 68 69 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  r_hit, TCL_LINK_
4c90: 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
4ca0: 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
4cb0: 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 68 61 72  ite_io_error_har
4cc0: 64 68 69 74 22 2c 0a 20 20 20 20 20 28 63 68 61  dhit",.     (cha
4cd0: 72 2a 29 26 73 71 6c 69 74 65 33 5f 69 6f 5f 65  r*)&sqlite3_io_e
4ce0: 72 72 6f 72 5f 68 61 72 64 68 69 74 2c 20 54 43  rror_hardhit, TC
4cf0: 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
4d00: 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
4d10: 70 2c 20 22 73 71 6c 69 74 65 5f 64 69 73 6b 66  p, "sqlite_diskf
4d20: 75 6c 6c 5f 70 65 6e 64 69 6e 67 22 2c 0a 20 20  ull_pending",.  
4d30: 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
4d40: 65 33 5f 64 69 73 6b 66 75 6c 6c 5f 70 65 6e 64  e3_diskfull_pend
4d50: 69 6e 67 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ing, TCL_LINK_IN
4d60: 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
4d70: 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
4d80: 65 5f 64 69 73 6b 66 75 6c 6c 22 2c 0a 20 20 20  e_diskfull",.   
4d90: 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
4da0: 33 5f 64 69 73 6b 66 75 6c 6c 2c 20 54 43 4c 5f  3_diskfull, TCL_
4db0: 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64  LINK_INT);.#ifnd
4dc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
4dd0: 53 44 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  SD.  Tcl_LinkVar
4de0: 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
4df0: 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 22 2c 0a  _pending_byte",.
4e00: 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
4e10: 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65 2c  ite3PendingByte,
4e20: 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 20 7c 20   TCL_LINK_INT | 
4e30: 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e  TCL_LINK_READ_ON
4e40: 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  LY);.#endif.  re
4e50: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a     turn TCL_OK;.}.