/ Hex Artifact Content
Login

Artifact e93008f9326701087239c0300547e66d18ddb63c:


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 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 35 33  : pager.c,v 1.53
0350: 31 20 32 30 30 39 2f 30 31 2f 30 36 20 31 34 3a  1 2009/01/06 14:
0360: 33 34 3a 33 35 20 64 61 6e 69 65 6c 6b 31 39 37  34:35 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
03b0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03c0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03d0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
03e0: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
03f0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
0400: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
0410: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
0420: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
0430: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0440: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
0450: 41 47 45 52 54 52 41 43 45 31 28 58 29 20 20 20  AGERTRACE1(X)   
0460: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
0470: 61 67 65 72 54 72 61 63 65 20 29 20 73 71 6c 69  agerTrace ) sqli
0480: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0490: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
04a0: 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20 69  RACE2(X,Y)     i
04b0: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
04c0: 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 65  race ) sqlite3De
04d0: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a 23  bugPrintf(X,Y).#
04e0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04f0: 45 33 28 58 2c 59 2c 5a 29 20 20 20 69 66 28 20  E3(X,Y,Z)   if( 
0500: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
0510: 65 20 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  e ) sqlite3Debug
0520: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23 64  Printf(X,Y,Z).#d
0530: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
0540: 34 28 58 2c 59 2c 5a 2c 57 29 20 69 66 28 20 73  4(X,Y,Z,W) if( s
0550: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
0560: 20 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50   ) sqlite3DebugP
0570: 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a 23  rintf(X,Y,Z,W).#
0580: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
0590: 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 69 66  E5(X,Y,Z,W,V) if
05a0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
05b0: 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 65 62  ace ) sqlite3Deb
05c0: 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57  ugPrintf(X,Y,Z,W
05d0: 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ,V).#else.#defin
05e0: 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58 29  e PAGERTRACE1(X)
05f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
0600: 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e  ACE2(X,Y).#defin
0610: 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58 2c  e PAGERTRACE3(X,
0620: 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41 47  Y,Z).#define PAG
0630: 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57  ERTRACE4(X,Y,Z,W
0640: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0650: 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29  RACE5(X,Y,Z,W,V)
0660: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0670: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
0680: 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65 64   macros are used
0690: 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47 45   within the PAGE
06a0: 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f 73  RTRACEX() macros
06b0: 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72 69   above.** to pri
06c0: 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73 63  nt out file-desc
06d0: 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20  riptors. .**.** 
06e0: 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73 20  PAGERID() takes 
06f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50  a pointer to a P
0700: 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20 69  ager struct as i
0710: 74 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  ts argument. The
0720: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 66  .** associated f
0730: 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 69  ile-descriptor i
0740: 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c 45  s returned. FILE
0750: 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65 73  HANDLEID() takes
0760: 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   an sqlite3_file
0770: 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69 74  .** struct as it
0780: 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  s argument..*/.#
0790: 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70  define PAGERID(p
07a0: 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29 29  ) ((int)(p->fd))
07b0: 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e  .#define FILEHAN
07c0: 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74 29  DLEID(fd) ((int)
07d0: 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  fd)../*.** The p
07e0: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
07f0: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0800: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
0810: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
0820: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  :.**.**   PAGER_
0830: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68  UNLOCK        Th
0840: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0850: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
0860: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0880: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
0890: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
08a0: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
08d0: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
08e0: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
0910: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52  .**   PAGER_SHAR
0920: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0930: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
0940: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0950: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
0960: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
0970: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
0980: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
0990: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
09b0: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
09c0: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
09d0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09f0: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0a00: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
0a10: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
0a20: 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 73       This proces
0a30: 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20 74  s has reserved t
0a40: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
0a50: 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  writing.**      
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a70: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
0a80: 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65   made any change
0a90: 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f  s.  Only one pro
0aa0: 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  cess.**         
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
0ac0: 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65   a time can rese
0ad0: 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rve the database
0ae0: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a  .  The original.
0af0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b00: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0b10: 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
0b20: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
0b30: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0b50: 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74 69  rocesses may sti
0b60: 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  ll be reading th
0b70: 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20  e on-disk.**    
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0ba0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0bb0: 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54 68  EXCLUSIVE     Th
0bc0: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0bd0: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
0be0: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
0c00: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
0c10: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
0c20: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c40: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
0c50: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
0c60: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
0c70: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0c80: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0c90: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
0ca0: 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45  **   PAGER_SYNCE
0cb0: 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  D        The pag
0cc0: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
0cd0: 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45   state from PAGE
0ce0: 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  R_EXCLUSIVE.**  
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64       after all d
0d10: 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20  irty pages have 
0d20: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
0d30: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0d50: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
0d60: 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  he file has been
0d70: 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20   synced to.**   
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68      disk. All th
0da0: 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f  at remains to do
0db0: 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f 72   is to remove or
0dc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0dd0: 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61            trunca
0de0: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
0df0: 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ile and the tran
0e00: 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  saction .**     
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e20: 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74    will be commit
0e30: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
0e40: 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20  age cache comes 
0e50: 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f  up in PAGER_UNLO
0e60: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0e70: 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 33  ime a.** sqlite3
0e80: 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75 72  PagerGet() occur
0e90: 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61  s, the state tra
0ea0: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0eb0: 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74  R_SHARED..** Aft
0ec0: 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  er all pages hav
0ed0: 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  e been released 
0ee0: 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61 67  using sqlite_pag
0ef0: 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68  e_unref(),.** th
0f00: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0f10: 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  ons back to PAGE
0f20: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0f30: 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61  irst time.** tha
0f40: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0f50: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  ite() is called,
0f60: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0f70: 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47  itions to.** PAG
0f80: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28 4e  ER_RESERVED.  (N
0f90: 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ote that sqlite3
0fa0: 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61 6e  PagerWrite() can
0fb0: 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c   only be.** call
0fc0: 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e  ed on an outstan
0fd0: 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68 20  ding page which 
0fe0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
0ff0: 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20  ager must.** be 
1000: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
1010: 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69  before it transi
1020: 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 52  tions to PAGER_R
1030: 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41 47  ESERVED.).** PAG
1040: 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61 6e  ER_RESERVED mean
1050: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
1060: 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63 6b  an open rollback
1070: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65   journal..** The
1080: 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50   transition to P
1090: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f  AGER_EXCLUSIVE o
10a0: 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e 79  ccurs before any
10b0: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
10c0: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
10d0: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75 67  base file, thoug
10e0: 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  h writes to the 
10f0: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72  rollback.** jour
1100: 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68 20  nal occurs with 
1110: 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45 52  just PAGER_RESER
1120: 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20 73  VED.  After an s
1130: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1140: 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69  ack().** or sqli
1150: 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1160: 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73 74  aseTwo(), the st
1170: 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b 20  ate can go back 
1180: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2c  to PAGER_SHARED,
1190: 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73 74  .** or it can st
11a0: 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43 4c  ay at PAGER_EXCL
11b0: 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65 20  USIVE if we are 
11c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  in exclusive acc
11d0: 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65  ess mode..*/.#de
11e0: 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43  fine PAGER_UNLOC
11f0: 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65  K      0.#define
1200: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
1210: 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61     1   /* same a
1220: 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  s SHARED_LOCK */
1230: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
1240: 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20 2f  ESERVED    2   /
1250: 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52 56  * same as RESERV
1260: 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  ED_LOCK */.#defi
1270: 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  ne PAGER_EXCLUSI
1280: 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65  VE   4   /* same
1290: 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   as EXCLUSIVE_LO
12a0: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
12b0: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
12c0: 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  5../*.** If the 
12d0: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
12e0: 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20  RVED_LOCK macro 
12f0: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61  is set to true a
1300: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a  t compile-time,.
1310: 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61  ** then failed a
1320: 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61  ttempts to get a
1330: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77   reserved lock w
1340: 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ill invoke the b
1350: 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a  usy callback..**
1360: 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79 20   This is off by 
1370: 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65  default.  To see
1380: 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74   why, consider t
1390: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
13a0: 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75  nario:.** .** Su
13b0: 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20 61  ppose thread A a
13c0: 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68 61  lready has a sha
13d0: 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e  red lock and wan
13e0: 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ts a reserved lo
13f0: 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20  ck..** Thread B 
1400: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
1410: 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20  served lock and 
1420: 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69  wants an exclusi
1430: 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20  ve lock.  If.** 
1440: 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72 65  both threads are
1450: 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75 73   using their bus
1460: 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20  y callbacks, it 
1470: 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20  might be a long 
1480: 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f  time.** be for o
1490: 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61 64  ne of the thread
14a0: 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c  s give up and al
14b0: 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20 74  lows the other t
14c0: 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75  o proceed..** Bu
14d0: 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20  t if the thread 
14e0: 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68  trying to get th
14f0: 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  e reserved lock 
1500: 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79  gives up quickly
1510: 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72  .** (if it never
1520: 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73   invokes its bus
1530: 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e  y callback) then
1540: 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20   the contention 
1550: 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c  will be.** resol
1560: 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a  ved quickly..*/.
1570: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42  #ifndef SQLITE_B
1580: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1590: 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  K.# define SQLIT
15a0: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
15b0: 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  LOCK 0.#endif../
15c0: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
15d0: 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70  rounds values up
15e0: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
15f0: 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72  value is an addr
1600: 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61  ess it.** is gua
1610: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e  ranteed to be an
1620: 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73   address that is
1630: 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38   aligned to an 8
1640: 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a  -byte boundary..
1650: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45  */.#define FORCE
1660: 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20  _ALIGNMENT(X)   
1670: 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a  (((X)+7)&~7)../*
1680: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
1690: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
16a0: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
16b0: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
16c0: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
16d0: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
16e0: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20  C1(P,D,N,X) if( 
16f0: 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b 20  P->xCodec!=0 ){ 
1700: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
1710: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d  decArg,D,N,X); }
1720: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
1730: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
1740: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30 3f  *)(P->xCodec!=0?
1750: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
1760: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44 29  decArg,D,N,X):D)
1770: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
1780: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29   CODEC1(P,D,N,X)
1790: 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64   /* NO-OP */.# d
17a0: 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44  efine CODEC2(P,D
17b0: 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44 29  ,N,X) ((char*)D)
17c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
17d0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
17e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
17f0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
1800: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
1810: 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  ve.** savepoint 
1820: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72  and statement tr
1830: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
1840: 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63   system. All suc
1850: 68 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  h structures.** 
1860: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
1870: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
1880: 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63  nt[] array, whic
1890: 68 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  h is allocated a
18a0: 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73  nd.** resized us
18b0: 69 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  ing sqlite3Reall
18c0: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oc()..**.** When
18d0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
18e0: 63 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67  created, the Pag
18f0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
1900: 4f 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a  Offset field is.
1910: 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20  ** set to 0. If 
1920: 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
1930: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
1940: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
1950: 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73  l while.** the s
1960: 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
1970: 76 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66  ve, then iHdrOff
1980: 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
1990: 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a  e byte offset .*
19a0: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
19b0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
19c0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
19d0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
19e0: 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
19f0: 20 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72   before the jour
1a00: 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73  nal-header. This
1a10: 20 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72   is required dur
1a20: 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ing savepoint.**
1a30: 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70   rollback (see p
1a40: 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
1a50: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70  point())..*/.typ
1a60: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
1a70: 72 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72  rSavepoint Pager
1a80: 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63  Savepoint;.struc
1a90: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
1aa0: 20 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74   {.  i64 iOffset
1ab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ac0: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66    /* Starting of
1ad0: 66 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75  fset in main jou
1ae0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
1af0: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
1b00: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
1b10: 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ove */.  Bitvec 
1b20: 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  *pInSavepoint;  
1b30: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
1b40: 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61  pages in this sa
1b50: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e  vepoint */.  Pgn
1b60: 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
1b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
1b80: 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ginal number of 
1b90: 70 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f  pages in file */
1ba0: 0a 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b  .  Pgno iSubRec;
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
1bd0: 74 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d  t record in sub-
1be0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  journal */.};../
1bf0: 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65  *.** A open page
1c00: 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73   cache is an ins
1c10: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1c20: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1c30: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72  ..**.** Pager.er
1c40: 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74  rCode may be set
1c50: 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   to SQLITE_IOERR
1c60: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
1c70: 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  , or.** or SQLIT
1c80: 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65  E_FULL. Once one
1c90: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68   of the first th
1ca0: 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ree errors occur
1cb0: 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a  s, it persists.*
1cc0: 2a 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65  * and is returne
1cd0: 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  d as the result 
1ce0: 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70  of every major p
1cf0: 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20  ager API call.  
1d00: 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55  The.** SQLITE_FU
1d10: 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69  LL return code i
1d20: 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65  s slightly diffe
1d30: 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74  rent. It persist
1d40: 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65  s only until the
1d50: 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73  .** next success
1d60: 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  ful rollback is 
1d70: 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65  performed on the
1d80: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c   pager cache. Al
1d90: 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55  so,.** SQLITE_FU
1da0: 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65  LL does not affe
1db0: 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ct the sqlite3Pa
1dc0: 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c  gerGet() and sql
1dd0: 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1de0: 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20  ).** APIs, they 
1df0: 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65  may still be use
1e00: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a  d successfully..
1e10: 2a 2a 0a 2a 2a 20 4d 61 6e 61 67 69 6e 67 20 74  **.** Managing t
1e20: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1e30: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
1e40: 70 61 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c  pages is a littl
1e50: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a  e complicated..*
1e60: 2a 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50  * The variable P
1e70: 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74  ager.dbSize cont
1e80: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ains the number 
1e90: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
1ea0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6d  e database.** im
1eb0: 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  age currently co
1ec0: 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20 64  ntains. As the d
1ed0: 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67 72  atabase image gr
1ee0: 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20 74  ows or shrinks t
1ef0: 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  his.** variable 
1f00: 69 73 20 75 70 64 61 74 65 64 2e 20 54 68 65 20  is updated. The 
1f10: 76 61 72 69 61 62 6c 65 20 50 61 67 65 72 2e 64  variable Pager.d
1f20: 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69  bFileSize contai
1f30: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  ns the number.**
1f40: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1f50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1f60: 54 68 69 73 20 6d 61 79 20 62 65 20 64 69 66 66  This may be diff
1f70: 65 72 65 6e 74 20 66 72 6f 6d 20 50 61 67 65 72  erent from Pager
1f80: 2e 64 62 53 69 7a 65 0a 2a 2a 20 69 66 20 73 6f  .dbSize.** if so
1f90: 6d 65 20 70 61 67 65 73 20 68 61 76 65 20 62 65  me pages have be
1fa0: 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  en appended to t
1fb0: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
1fc0: 65 20 62 75 74 20 6e 6f 74 20 79 65 74 20 77 72  e but not yet wr
1fd0: 69 74 74 65 6e 0a 2a 2a 20 6f 75 74 20 66 72 6f  itten.** out fro
1fe0: 6d 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 74  m the cache to t
1ff0: 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6f  he actual file o
2000: 6e 20 64 69 73 6b 2e 20 4f 72 20 69 66 20 74 68  n disk. Or if th
2010: 65 20 69 6d 61 67 65 20 68 61 73 20 62 65 65 6e  e image has been
2020: 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 62 79  .** truncated by
2030: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
2040: 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e  vacuum operation
2050: 2e 20 54 68 65 20 50 61 67 65 72 2e 64 62 4f 72  . The Pager.dbOr
2060: 69 67 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a  igSize variable.
2070: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
2080: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2090: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
20a0: 69 6d 61 67 65 20 77 68 65 6e 20 74 68 65 20 63  image when the c
20b0: 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  urrent.** transa
20c0: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
20d0: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
20e0: 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74  f all three of t
20f0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69  hese variables i
2100: 73 0a 2a 2a 20 6f 6e 6c 79 20 67 75 61 72 61 6e  s.** only guaran
2110: 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72 65  teed to be corre
2120: 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65 61  ct if the boolea
2130: 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56 61  n Pager.dbSizeVa
2140: 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  lid is true..*/.
2150: 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20  struct Pager {. 
2160: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
2170: 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fs;          /* 
2180: 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  OS functions to 
2190: 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20  use for IO */.  
21a0: 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20  u8 journalOpen; 
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21c0: 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
21d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
21e0: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38  is valid */.  u8
21f0: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b   journalStarted;
2200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2210: 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a  e if header of j
2220: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2230: 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72   */.  u8 useJour
2240: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
2250: 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62    /* Use a rollb
2260: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  ack journal on t
2270: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  his file */.  u8
2280: 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20   noReadlock;    
2290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
22a0: 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62  not bother to ob
22b0: 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a  tain readlocks *
22c0: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
22f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
2300: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
2310: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2320: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
2330: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
2340: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
2350: 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63  ess */.  u8 sync
2360: 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  _flags;         
2370: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
2380: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
2390: 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20  NC_FULL */.  u8 
23a0: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
23b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
23c0: 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45  R_UNLOCK, _SHARE
23d0: 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74  D, _RESERVED, et
23e0: 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  c. */.  u8 tempF
23f0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2400: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2410: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2420: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
2430: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
2440: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2450: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
2460: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
2470: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
2480: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2490: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
24a0: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
24b0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
24c0: 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20  irtyCache;      
24d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
24e0: 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20  if cached pages 
24f0: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
2500: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
2510: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
2520: 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c   Disable DontRol
2530: 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20  lback() for all 
2540: 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65  pages */.  u8 me
2550: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
2560: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2570: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
2580: 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73  le I/O */.  u8 s
2590: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
25a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
25b0: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
25c0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
25d0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
25e0: 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20  oNotSync;       
25f0: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
2600: 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20  an. While true, 
2610: 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65  do not spill the
2620: 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65   cache */.  u8 e
2630: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
2640: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
2650: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
2670: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
2680: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
2690: 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68       /* On of th
26a0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
26b0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
26c0: 20 20 75 38 20 64 62 4d 6f 64 69 66 69 65 64 3b    u8 dbModified;
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26e0: 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 61   True if there a
26f0: 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74  re any changes t
2700: 6f 20 74 68 65 20 44 62 20 2a 2f 0a 20 20 75 38  o the Db */.  u8
2710: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
2720: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
2730: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
2740: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
2750: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 64  ounter */.  u8 d
2760: 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20  bSizeValid;     
2770: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77          /* Set w
2780: 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f  hen dbSize is co
2790: 72 72 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  rrect */.  Pgno 
27a0: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
27b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
27c0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
27d0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
27e0: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
27f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
2800: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
2810: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
2820: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
2830: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
2840: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2850: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
2860: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2870: 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20    u32 vfsFlags; 
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2890: 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   Flags for sqlit
28a0: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
28b0: 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b  /.  int errCode;
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
28e0: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
28f0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b  s */.  int nRec;
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2920: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
2930: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
2940: 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b    u32 cksumInit;
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2960: 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61   Quasi-random va
2970: 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65  lue added to eve
2980: 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ry checksum */. 
2990: 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20   int stmtNRec;  
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
29c0: 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75  s in stmt subjou
29d0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  rnal */.  int nE
29e0: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
29f0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
2a00: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
2a10: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
2a20: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  age */.  int pag
2a30: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
2a40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2a50: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
2a60: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
2a70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a80: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
2a90: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
2aa0: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  pages */.  int m
2ab0: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
2ac0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
2ad0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  m number of page
2ae0: 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63  s to hold in cac
2af0: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  he */.  Pgno mxP
2b00: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
2b10: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
2b20: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
2b30: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
2b40: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
2b50: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
2b60: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
2b70: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2b80: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2b90: 42 69 74 76 65 63 20 2a 70 41 6c 77 61 79 73 52  Bitvec *pAlwaysR
2ba0: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 2f 2a 20 4f  ollback;    /* O
2bb0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
2bc0: 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61  page marked alwa
2bd0: 79 73 2d 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ys-rollback */. 
2be0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2bf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2c00: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
2c10: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
2c20: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
2c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
2c40: 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
2c50: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  l file */.  char
2c60: 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20   *zDirectory;   
2c70: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63          /* Direc
2c80: 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61  tory hold databa
2c90: 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66  se and journal f
2ca0: 69 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  iles */.  sqlite
2cb0: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64  3_file *fd, *jfd
2cc0: 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65  ;     /* File de
2cd0: 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61  scriptors for da
2ce0: 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e  tabase and journ
2cf0: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
2d00: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
2d10: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
2d20: 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73  riptor for the s
2d30: 75 62 2d 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 69  ub-journal*/.  i
2d40: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
2d50: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
2d60: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
2d70: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
2d80: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
2d90: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
2da0: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
2db0: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
2dc0: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
2dd0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
2de0: 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65 20  /* Current byte 
2df0: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f  offset in the jo
2e00: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
2e10: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20  i64 journalHdr; 
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2e30: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72  yte offset to pr
2e40: 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  evious journal h
2e50: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  eader */.  u32 s
2e60: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
2e70: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
2e80: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
2e90: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
2ea0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2eb0: 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20  EST.  int nHit, 
2ec0: 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20  nMiss;          
2ed0: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20    /* Cache hits 
2ee0: 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20  and missing */. 
2ef0: 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69   int nRead, nWri
2f00: 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  te;          /* 
2f10: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
2f20: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23  ead/written */.#
2f30: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78  endif.  void (*x
2f40: 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65  Reiniter)(DbPage
2f50: 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  *); /* Call this
2f60: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
2f70: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
2f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
2f90: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
2fa0: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
2fb0: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
2fc0: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
2fd0: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
2fe0: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  a */.  void *pCo
2ff0: 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20  decArg;         
3000: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
3010: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29  ment to xCodec()
3020: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61   */.#endif.  cha
3030: 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r *pTmpSpace;   
3040: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
3050: 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  r.pageSize bytes
3060: 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d   of space for tm
3070: 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  p use */.  char 
3080: 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20  dbFileVers[16]; 
3090: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
30a0: 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62  s whenever datab
30b0: 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73  ase file changes
30c0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
30d0: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20  lSizeLimit;     
30e0: 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20    /* Size limit 
30f0: 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a  for persistent j
3100: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
3110: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
3120: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3130: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
3140: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
3150: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
3160: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
3170: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
3180: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
3190: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
31a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
31b0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
31c0: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
31d0: 74 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  t[] */.};../*.**
31e0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
31f0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
3200: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
3210: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
3220: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
3230: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
3240: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
3250: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
3260: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
3270: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
3280: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
3290: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
32a0: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
32b0: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
32c0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
32d0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
32e0: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
32f0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
3300: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
3310: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
3320: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
3330: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
3340: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
3350: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
3360: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
3370: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
3380: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
3390: 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41  l */.# define PA
33a0: 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b  GER_INCR(v)  v++
33b0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
33c0: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65  PAGER_INCR(v).#e
33d0: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ndif..../*.** Jo
33e0: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
33f0: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
3400: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
3410: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
3420: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
3430: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
3440: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
3450: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
3460: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
3470: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
3480: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
3490: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
34a0: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
34b0: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
34c0: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
34d0: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
34e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
34f0: 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  gin.** written, 
3500: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
3510: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
3520: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
3530: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
3540: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
3550: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
3560: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
3570: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
3580: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
3590: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
35a0: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
35b0: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
35c0: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
35d0: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
35e0: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
35f0: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
3600: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
3610: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
3620: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
3630: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
3640: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
3650: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
3660: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
3670: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
3680: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
3690: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
36a0: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
36b0: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
36c0: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
36d0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
36e0: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
36f0: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
3700: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
3710: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
3720: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
3730: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
3740: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
3750: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
3760: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
3770: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
3780: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
3790: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
37a0: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
37b0: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
37c0: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
37d0: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
37e0: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
37f0: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
3800: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
3810: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
3820: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
3830: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
3840: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
3850: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
3860: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
3870: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
3880: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
3890: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
38a0: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
38b0: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
38c0: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
38d0: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
38e0: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
38f0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
3900: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
3910: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
3920: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
3930: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
3940: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
3950: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
3960: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61   of the header a
3970: 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  nd of each page 
3980: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
3990: 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20  s determined.** 
39a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  by the following
39b0: 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66   macros..*/.#def
39c0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
39d0: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
39e0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
39f0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
3a00: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
3a10: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
3a20: 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65  r. In the future
3a30: 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  , this could be.
3a40: 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76  ** set to some v
3a50: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
3a60: 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c  he disk controll
3a70: 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e  er. The importan
3a80: 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73  t.** characteris
3a90: 74 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69  tic is that it i
3aa0: 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20  s the same size 
3ab0: 61 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72  as a disk sector
3ac0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
3ad0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
3ae0: 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63  er) (pPager->sec
3af0: 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20  torSize)../*.** 
3b00: 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20  The macro MEMDB 
3b10: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
3b20: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
3b30: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
3b40: 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74  base..** We do t
3b50: 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73  his as a macro s
3b60: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51  o that if the SQ
3b70: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
3b80: 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c  DB macro is set,
3b90: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
3ba0: 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61   MEMDB will be a
3bb0: 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68   constant and th
3bc0: 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20  e compiler will 
3bd0: 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20  optimize.** out 
3be0: 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20  code that would 
3bf0: 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a  never execute..*
3c00: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3c10: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20  OMIT_MEMORYDB.# 
3c20: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23  define MEMDB 0.#
3c30: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45  else.# define ME
3c40: 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  MDB pPager->memD
3c50: 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  b.#endif../*.** 
3c60: 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45  Page number PAGE
3c70: 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76  R_MJ_PGNO is nev
3c80: 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51  er used in an SQ
3c90: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69  Lite database (i
3ca0: 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64  t is.** reserved
3cb0: 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f   for working aro
3cc0: 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f  und a windows/po
3cd0: 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c  six incompatibil
3ce0: 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75  ity). It is.** u
3cf0: 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  sed in the journ
3d00: 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  al to signify th
3d10: 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  at the remainder
3d20: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
3d30: 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f  file .** is devo
3d40: 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61  ted to storing a
3d50: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
3d60: 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65  name - there are
3d70: 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74   no more pages t
3d80: 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20  o.** roll back. 
3d90: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72  See comments for
3da0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d   function writeM
3db0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66  asterJournal() f
3dc0: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f  or details..*/./
3dd0: 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  * #define PAGER_
3de0: 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44  MJ_PGNO(x) (PEND
3df0: 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70  ING_BYTE/((x)->p
3e00: 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65  ageSize)) */.#de
3e10: 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47  fine PAGER_MJ_PG
3e20: 4e 4f 28 78 29 20 28 28 50 67 6e 6f 29 28 28 50  NO(x) ((Pgno)((P
3e30: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29  ENDING_BYTE/((x)
3e40: 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 29  ->pageSize))+1))
3e50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ../*.** The maxi
3e60: 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  mum legal page n
3e70: 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d  umber is (2^31 -
3e80: 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   1)..*/.#define 
3e90: 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32  PAGER_MAX_PGNO 2
3ea0: 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a  147483647../*.**
3eb0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
3ec0: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
3ed0: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
3ee0: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
3ef0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
3f00: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
3f10: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
3f20: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
3f30: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
3f40: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
3f50: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
3f60: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
3f70: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
3f80: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
3f90: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
3fa0: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
3fb0: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
3fc0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
3fd0: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
3fe0: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
3ff0: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
4000: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
4010: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
4020: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
4030: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
4040: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
4050: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  Pg->pgno;.  Page
4060: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
4070: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69  >pPager;.  int i
4080: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
4090: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
40a0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  t; i++){.    Pag
40b0: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
40c0: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
40d0: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
40e0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
40f0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
4100: 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61  vecTest(p->pInSa
4110: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29  vepoint, pgno) )
4120: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
4130: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4140: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4150: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4160: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
4170: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
4180: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
4190: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
41a0: 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
41b0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
41c0: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67  e3BitvecTest(pPg
41d0: 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ->pPager->pInJou
41e0: 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
41f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
4200: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4210: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
4220: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4230: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
4240: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
4250: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
4260: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4270: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
4280: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
4290: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
42a0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
42b0: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
42c0: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
42d0: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
42e0: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
42f0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
4300: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
4310: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
4320: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
4330: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
4340: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
4350: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
4360: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
4370: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
4380: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4390: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
43a0: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
43b0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
43c0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
43d0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
43e0: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
43f0: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
4400: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
4410: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
4420: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
4430: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
4440: 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  B)../*.** Write 
4450: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4460: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
4470: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4480: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4490: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
44a0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
44b0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
44c0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
44d0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
44e0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
44f0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
4500: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
4510: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
4520: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
4530: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4540: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
4550: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
4560: 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70 46  /*.** If file pF
4570: 64 20 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20  d is open, call 
4580: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
4590: 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  ) on it..*/.stat
45a0: 69 63 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28  ic int osUnlock(
45b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
45c0: 64 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  d, int eLock){. 
45d0: 20 69 66 28 20 21 70 46 64 2d 3e 70 4d 65 74 68   if( !pFd->pMeth
45e0: 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ods ){.    retur
45f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
4600: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4610: 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64 2c 20 65  3OsUnlock(pFd, e
4620: 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Lock);.}../*.** 
4630: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
4640: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
4650: 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
4660: 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
4670: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
4680: 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70  used with this p
4690: 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69  ager. The optimi
46a0: 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
46b0: 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61  ed if:.**.**  (a
46c0: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
46d0: 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65  rned by OsDevice
46e0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
46f0: 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  ) indicates that
4700: 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62  .**      a datab
4710: 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20  ase page may be 
4720: 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
4730: 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20  ly, and.**  (b) 
4740: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
4750: 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69  ed by OsSectorSi
4760: 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61  ze() is less tha
4770: 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20  n or equal.**   
4780: 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73     to the page s
4790: 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
47a0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
47b0: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
47c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
47d0: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
47e0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
47f0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
4800: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
4810: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
4820: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
4830: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
4840: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
4850: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
4860: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
4870: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
4880: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
4890: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
48a0: 29 7b 0a 20 20 69 6e 74 20 64 63 3b 20 20 20 20  ){.  int dc;    
48b0: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
48c0: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
48d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 63 74 6f   */.  int nSecto
48e0: 72 3b 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f  r;      /* Secto
48f0: 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20  r size */.  int 
4900: 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 2f  szPage;        /
4910: 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  * Page size */. 
4920: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
4930: 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a  d = pPager->fd;.
4940: 0a 20 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68  .  if( fd->pMeth
4950: 6f 64 73 20 29 7b 0a 20 20 20 20 64 63 20 3d 20  ods ){.    dc = 
4960: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
4970: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 66  haracteristics(f
4980: 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20  d);.    nSector 
4990: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
49a0: 72 53 69 7a 65 28 66 64 29 3b 0a 20 20 20 20 73  rSize(fd);.    s
49b0: 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
49c0: 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  pageSize;.  }.. 
49d0: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
49e0: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
49f0: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 61 73 73  (512>>8));.  ass
4a00: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
4a10: 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
4a20: 33 36 3e 3e 38 29 29 3b 0a 0a 20 20 69 66 28 20  36>>8));..  if( 
4a30: 21 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 7c 7c  !fd->pMethods ||
4a40: 20 0a 20 20 20 20 20 20 20 28 64 63 20 26 20 28   .       (dc & (
4a50: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
4a60: 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29  MIC|(szPage>>8))
4a70: 20 26 26 20 6e 53 65 63 74 6f 72 3c 3d 73 7a 50   && nSector<=szP
4a80: 61 67 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  age) ){.    retu
4a90: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
4aa0: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
4ab0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
4ac0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4ad0: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
4ae0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
4af0: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
4b00: 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20  d when an error 
4b10: 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
4b20: 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e  e pager.** code.
4b30: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
4b40: 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
4b50: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74   to the pager st
4b60: 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20  ructure, the.** 
4b70: 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72  second the error
4b80: 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62  -code about to b
4b90: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  e returned by a 
4ba0: 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
4bb0: 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75  on. .** The valu
4bc0: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20  e returned is a 
4bd0: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
4be0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
4bf0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  his function. .*
4c00: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
4c10: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
4c20: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
4c30: 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20  ITE_CORRUPT, or 
4c40: 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74  SQLITE_FULL.** t
4c50: 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73  he error becomes
4c60: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74   persistent. Unt
4c70: 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  il the persisten
4c80: 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65   error is cleare
4c90: 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74  d,.** subsequent
4ca0: 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
4cb0: 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  is Pager will im
4cc0: 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
4cd0: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72   the same .** er
4ce0: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
4cf0: 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  A persistent err
4d00: 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  or indicates tha
4d10: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
4d20: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
4d30: 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
4d40: 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
4d50: 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
4d60: 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
4d70: 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
4d80: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
4d90: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
4da0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
4db0: 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
4dc0: 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
4dd0: 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 65  ent error occure
4de0: 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
4df0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
4e00: 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
4e10: 65 70 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74 61 74  eplayed..*/.stat
4e20: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
4e30: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
4e40: 65 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  er);.static int 
4e50: 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
4e60: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
4e70: 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
4e80: 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
4e90: 65 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67  ert(.       pPag
4ea0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
4eb0: 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20  ITE_FULL ||.    
4ec0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
4ed0: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  de==SQLITE_OK ||
4ee0: 0a 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d  .       (pPager-
4ef0: 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29  >errCode & 0xff)
4f00: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
4f10: 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63   );.  if(.    rc
4f20: 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  2==SQLITE_FULL |
4f30: 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  |.    rc2==SQLIT
4f40: 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72  E_IOERR ||.    r
4f50: 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  c2==SQLITE_CORRU
4f60: 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67  PT.  ){.    pPag
4f70: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
4f80: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
4f90: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
4fa0: 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 26 26 20 73  NLOCK .     && s
4fb0: 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
4fc0: 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
4fd0: 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b  ache)==0 .    ){
4fe0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
4ff0: 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61 64   pager is alread
5000: 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c 6c  y unlocked, call
5010: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
5020: 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  now to.      ** 
5030: 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
5040: 73 74 61 74 65 20 61 6e 64 20 65 6e 73 75 72 65  state and ensure
5050: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 2d   that the pager-
5060: 63 61 63 68 65 20 69 73 20 0a 20 20 20 20 20 20  cache is .      
5070: 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  ** completely em
5080: 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  pty..      */.  
5090: 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
50a0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
50b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
50c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  .}../*.** If SQL
50d0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
50e0: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
50f0: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
5100: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
5110: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
5120: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
5130: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
5140: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
5150: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
5160: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
5170: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
5180: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
5190: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
51a0: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
51b0: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
51c0: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
51d0: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
51e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
51f0: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
5200: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
5210: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
5220: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
5230: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
5240: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
5250: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
5260: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
5270: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
5280: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
5290: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
52a0: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
52b0: 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69  >pageSize, (unsi
52c0: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67  gned char *)pPag
52d0: 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61  e->pData);.}.sta
52e0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73  tic void pager_s
52f0: 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  et_pagehash(PgHd
5300: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61  r *pPage){.  pPa
5310: 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  ge->pageHash = p
5320: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
5330: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  age);.}../*.** T
5340: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
5350: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
5360: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
5370: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
5380: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
5390: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
53a0: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
53b0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
53c0: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
53d0: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
53e0: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
53f0: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
5400: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
5410: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
5420: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
5430: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
5440: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
5450: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
5460: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
5470: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
5480: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  er;.  assert( !p
5490: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20  Pg->pageHash || 
54a0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 0a  pPager->errCode.
54b0: 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66        || (pPg->f
54c0: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
54d0: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
54e0: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
54f0: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
5500: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
5510: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
5520: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
5530: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
5540: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
5550: 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a  GE(x).#endif  /*
5560: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
5570: 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68  GES */../*.** Wh
5580: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
5590: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
55a0: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
55b0: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
55c0: 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  ..** The master 
55d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
55e0: 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  e is read from t
55f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
5600: 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74  le and .** writt
5610: 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73  en into memory s
5620: 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 63  upplied by the c
5630: 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d  aller. .**.** zM
5640: 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74  aster must point
5650: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
5660: 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72  at least nMaster
5670: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
5680: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65   by.** the calle
5690: 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  r. This should b
56a0: 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  e sqlite3_vfs.mx
56b0: 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65  Pathname+1 (to e
56c0: 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a  nsure there is.*
56d0: 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  * enough space t
56e0: 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74  o write the mast
56f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29  er journal name)
5700: 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20  . If the master 
5710: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20  journal.** name 
5720: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
5730: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d  s longer than nM
5740: 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63  aster bytes (inc
5750: 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d  luding a.** nul-
5760: 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65  terminator), the
5770: 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65  n this is handle
5780: 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65  d as if no maste
5790: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a  r journal name.*
57a0: 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69  * were present i
57b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
57c0: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65  *.** If no maste
57d0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
57e0: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 7a  ame is present z
57f0: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
5800: 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c   to 0 and.** SQL
5810: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
5820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5830: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
5840: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
5850: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
5860: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
5870: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
5880: 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a  32 len;.  i64 sz
5890: 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  J;.  u32 cksum;.
58a0: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
58b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
58c0: 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
58d0: 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ter */.  unsigne
58e0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
58f0: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
5900: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
5910: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61  header */..  zMa
5920: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
5930: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5940: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
5950: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
5960: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
5970: 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72  zJ<16 ) return r
5980: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
5990: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
59a0: 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66  -16, &len);.  if
59b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
59c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
59d0: 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72  if( len>=nMaster
59e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
59f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
5a00: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
5a10: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
5a20: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
5a30: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5a40: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
5a50: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
5a60: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
5a70: 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20  , szJ-8);.  if( 
5a80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
5a90: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
5aa0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
5ab0: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
5ac0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5ad0: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
5ae0: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
5af0: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
5b00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5b10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
5b20: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
5b30: 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65  = '\0';..  /* Se
5b40: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
5b50: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
5b60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
5b70: 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20  e */.  for(u=0; 
5b80: 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20  u<len; u++){.   
5b90: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
5ba0: 72 5b 75 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28  r[u];.   }.  if(
5bb0: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
5bc0: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
5bd0: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
5be0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
5bf0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
5c00: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
5c10: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
5c20: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
5c30: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
5c40: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
5c50: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
5c60: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
5c70: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
5c80: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
5c90: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
5ca0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
5cb0: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
5cc0: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
5cd0: 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65  0';.  }.   .  re
5ce0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68  }../*.** Seek th
5d00: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
5d10: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
5d20: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
5d30: 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a  ndary where a.**
5d40: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5d50: 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77  may be read or w
5d60: 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f  ritten. Pager.jo
5d70: 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61  urnalOff is upda
5d80: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
5d90: 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e  new seek offset.
5da0: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
5db0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
5dc0: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  512:.**.** Input
5dd0: 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   Offset         
5de0: 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73       Output Offs
5df0: 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  et.** ----------
5e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
5e20: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
5e30: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
5e40: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
5e50: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
5e60: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
5e70: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
5e80: 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20  * 2000          
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
5ea0: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  .** .*/.static v
5eb0: 6f 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  oid seekJournalH
5ec0: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
5ed0: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
5ee0: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
5ef0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5f00: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
5f10: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
5f20: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
5f30: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
5f40: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5f50: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
5f60: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
5f70: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
5f80: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
5f90: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
5fa0: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
5fb0: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
5fc0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
5fd0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
5fe0: 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d  lOff = offset;.}
5ff0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 7a 65  ../*.** Write ze
6000: 72 6f 73 20 6f 76 65 72 20 74 68 65 20 68 65 61  ros over the hea
6010: 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
6020: 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 68  al file.  This h
6030: 61 73 20 74 68 65 0a 2a 2a 20 65 66 66 65 63 74  as the.** effect
6040: 20 6f 66 20 69 6e 76 61 6c 69 64 61 74 69 6e 67   of invalidating
6050: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6060: 65 20 61 6e 64 20 63 6f 6d 6d 69 74 74 69 6e 67  e and committing
6070: 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
6080: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
6090: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
60a0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
60b0: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
60c0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
60d0: 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  ITE_OK;.  static
60e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f   const char zero
60f0: 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 0a  Hdr[28] = {0};..
6100: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
6110: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
6120: 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  i64 iLimit = pPa
6130: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
6140: 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 49 4f 54 52  Limit;..    IOTR
6150: 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25  ACE(("JZEROHDR %
6160: 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
6170: 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74     if( doTruncat
6180: 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29  e || iLimit==0 )
6190: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
61a0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
61b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
61c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
61d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
61e0: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
61f0: 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f  , zeroHdr, sizeo
6200: 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a  f(zeroHdr), 0);.
6210: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
6220: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
6230: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
6240: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
6250: 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
6260: 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53  r->jfd, SQLITE_S
6270: 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61  YNC_DATAONLY|pPa
6280: 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
6290: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
62a0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
62b0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
62c0: 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74   committed but t
62d0: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20  he write lock . 
62e0: 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68     ** is still h
62f0: 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  eld on the file.
6300: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73   If there is a s
6310: 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67  ize limit config
6320: 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ured for .    **
6330: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
6340: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
6350: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72  journal file cur
6360: 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20  rently consumes 
6370: 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63  more.    ** spac
6380: 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69  e than that limi
6390: 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72  t allows for, tr
63a0: 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  uncate it now. T
63b0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
63c0: 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74      ** to sync t
63d0: 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e  he file followin
63e0: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
63f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
6400: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
6410: 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20  & iLimit>0 ){.  
6420: 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20      i64 sz;.    
6430: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6440: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
6450: 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20  >jfd, &sz);.    
6460: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6470: 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74  _OK && sz>iLimit
6480: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
6490: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
64a0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
64b0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d  iLimit);.      }
64c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
64d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
64e0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
64f0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
6500: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
6510: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
6520: 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20  urnal.** header 
6530: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
6540: 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65  bytes) is writte
6550: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
6560: 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a  al file at the.*
6570: 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  * current locati
6580: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
6590: 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75  rmat for the jou
65a0: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61  rnal header is a
65b0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20  s follows:.** - 
65c0: 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69  8 bytes: Magic i
65d0: 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e  dentifying journ
65e0: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20  al format..** - 
65f0: 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20  4 bytes: Number 
6600: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f  of records in jo
6610: 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d  urnal, or -1 no-
6620: 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e  sync mode is on.
6630: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52  .** - 4 bytes: R
6640: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65  andom number use
6650: 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e  d for page hash.
6660: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49  .** - 4 bytes: I
6670: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
6680: 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d  page count..** -
6690: 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72   4 bytes: Sector
66a0: 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
66b0: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77  e process that w
66c0: 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61  rote this journa
66d0: 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  l..** - 4 bytes:
66e0: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20 73   Database page s
66f0: 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  ize..** .** Foll
6700: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
6710: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
6720: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
6730: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
6740: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
6750: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
6760: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
6770: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20  LITE_OK;.  char 
6780: 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65  *zHeader = pPage
6790: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
67a0: 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 70 50  u32 nHeader = pP
67b0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
67c0: 20 20 75 33 32 20 6e 57 72 69 74 65 3b 0a 20 20    u32 nWrite;.  
67d0: 69 6e 74 20 69 69 3b 0a 0a 20 20 69 66 28 20 6e  int ii;..  if( n
67e0: 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48  Header>JOURNAL_H
67f0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b  DR_SZ(pPager) ){
6800: 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a  .    nHeader = J
6810: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6820: 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
6830: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
6840: 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
6850: 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20  and any of them 
6860: 77 65 72 65 20 63 72 65 61 74 65 64 20 73 69 6e  were created sin
6870: 63 65 20 74 68 65 0a 20 20 2a 2a 20 6d 6f 73 74  ce the.  ** most
6880: 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20   recent journal 
6890: 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74  header was writt
68a0: 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 50  en, update the P
68b0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
68c0: 64 72 4f 66 66 0a 20 20 2a 2a 20 66 69 65 6c 64  drOff.  ** field
68d0: 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f  s now..  */.  fo
68e0: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
68f0: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
6900: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  i++){.    if( pP
6910: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
6920: 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d  [ii].iHdrOffset=
6930: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
6940: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
6950: 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20  i].iHdrOffset = 
6960: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6970: 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ff;.    }.  }.. 
6980: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
6990: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
69a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
69b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
69c0: 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 7a 48  ff;..  memcpy(zH
69d0: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
69e0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
69f0: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20  urnalMagic));.. 
6a00: 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20   /* .  ** Write 
6a10: 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d  the nRec Field -
6a20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6a30: 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  age records that
6a40: 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a   follow this.  *
6a50: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
6a60: 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f  . Normally, zero
6a70: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
6a80: 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69  his value at thi
6a90: 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74  s time..  ** Aft
6aa0: 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61  er the records a
6ab0: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
6ac0: 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65  journal (and the
6ad0: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c   journal synced,
6ae0: 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c   .  ** if in ful
6af0: 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68  l-sync mode), th
6b00: 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72  e zero is overwr
6b10: 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74  itten with the t
6b20: 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  rue number.  ** 
6b30: 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20  of records (see 
6b40: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a  syncJournal())..
6b50: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74    **.  ** A fast
6b60: 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69  er alternative i
6b70: 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46  s to write 0xFFF
6b80: 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65  FFFFF to the nRe
6b90: 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20  c field. When.  
6ba0: 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a  ** reading the j
6bb0: 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75  ournal this valu
6bc0: 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74  e tells SQLite t
6bd0: 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  o assume that th
6be0: 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74  e.  ** rest of t
6bf0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6c00: 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70  contains valid p
6c10: 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69  age records. Thi
6c20: 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a  s assumption.  *
6c30: 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20  * is dangerous, 
6c40: 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  as if a failure 
6c50: 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77  occured whilst w
6c60: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
6c70: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
6c80: 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73  it may contain s
6c90: 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61  ome garbage data
6ca0: 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  . There are two 
6cb0: 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77  scenarios.  ** w
6cc0: 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63  here this risk c
6cd0: 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20  an be ignored:. 
6ce0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
6cf0: 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  n the pager is i
6d00: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
6d10: 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66  Corruption can f
6d20: 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20  ollow a.  **    
6d30: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69   power failure i
6d40: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77  n this case anyw
6d50: 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ay..  **.  **   
6d60: 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54  * When the SQLIT
6d70: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
6d80: 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e  END flag is set.
6d90: 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
6da0: 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67  .  **     that g
6db0: 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e  arbage data is n
6dc0: 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f  ever appended to
6dd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6de0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
6df0: 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
6e00: 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 6e  thods||pPager->n
6e10: 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28 20 28 70  oSync);.  if( (p
6e20: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c  Pager->noSync) |
6e30: 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
6e40: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
6e50: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
6e60: 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  ).   || (sqlite3
6e70: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
6e80: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
6e90: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
6ea0: 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20  _SAFE_APPEND) . 
6eb0: 20 29 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74   ){.    put32bit
6ec0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
6ed0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
6ee0: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
6ef0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75 74    }else{.    put
6f00: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
6f10: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6f20: 61 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a  agic)], 0);.  }.
6f30: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
6f40: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
6f50: 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71  ialiser */ .  sq
6f60: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
6f70: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
6f80: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
6f90: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
6fa0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
6fb0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
6fc0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
6fd0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
6fe0: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
6ff0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
7000: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
7010: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
7020: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7030: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
7040: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
7050: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
7060: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
7070: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
7080: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
7090: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
70a0: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
70b0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
70c0: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69  .  /* Initializi
70d0: 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  ng the tail of t
70e0: 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  he buffer is not
70f0: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76 65   necessary.  Eve
7100: 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72  rything.  ** wor
7110: 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20 66  ks find if the f
7120: 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28  ollowing memset(
7130: 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42  ) is omitted.  B
7140: 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a  ut initializing.
7150: 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20    ** the memory 
7160: 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e  prevents valgrin
7170: 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69  d from complaini
7180: 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69  ng, so we are wi
7190: 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61  lling to.  ** ta
71a0: 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e  ke the performan
71b0: 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d  ce hit..  */.  m
71c0: 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73  emset(&zHeader[s
71d0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
71e0: 67 69 63 29 2b 31 36 5d 2c 20 30 2c 0a 20 20 20  gic)+16], 0,.   
71f0: 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73        nHeader-(s
7200: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7210: 67 69 63 29 2b 31 36 29 29 3b 0a 0a 20 20 69 66  gic)+16));..  if
7220: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
7230: 6c 48 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  lHdr==0 ){.    /
7240: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
7250: 2a 2f 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  */.    put32bits
7260: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
7270: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7280: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
7290: 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 66  eSize);.  }..  f
72a0: 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d  or(nWrite=0; rc=
72b0: 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69  =SQLITE_OK&&nWri
72c0: 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  te<JOURNAL_HDR_S
72d0: 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74  Z(pPager); nWrit
72e0: 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20  e+=nHeader){.   
72f0: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
7300: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
7310: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
7320: 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64  ournalHdr, nHead
7330: 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71  er)).    rc = sq
7340: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
7350: 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
7360: 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67  r, nHeader, pPag
7370: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
7380: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
7390: 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64  rnalOff += nHead
73a0: 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  er;.  }..  retur
73b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
73c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
73d0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
73e0: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
73f0: 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  . A journal head
7400: 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52  er file.** (JOUR
7410: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
7420: 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ) is read from t
7430: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
7440: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
7450: 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20  al.** file. See 
7460: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66  comments above f
7470: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75  unction writeJou
7480: 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20  rnalHdr() for a 
7490: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a  description of.*
74a0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * the journal he
74b0: 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  ader format..**.
74c0: 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72  ** If the header
74d0: 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73   is read success
74e0: 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20  fully, *nRec is 
74f0: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
7500: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
7510: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
7520: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
7530: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
7540: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
7550: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66  .** database bef
7560: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
7570: 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61  ion began, in pa
7580: 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65  ges. Also, pPage
7590: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20  r->cksumInit.** 
75a0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
75b0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
75c0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
75d0: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
75e0: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68  eturned.** in th
75f0: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
7600: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
7610: 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72  ader file appear
7620: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65  s to be corrupte
7630: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
7640: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
7650: 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53  d *nRec and *dbS
7660: 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e  ize are not set.
7670: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
7680: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
7690: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
76a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
76b0: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
76c0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
76d0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
76e0: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
76f0: 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69  er *pPager, .  i
7700: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a  64 journalSize,.
7710: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20    u32 *pNRec, . 
7720: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b   u32 *pDbSize.){
7730: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
7740: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
7750: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
7760: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
7770: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
7780: 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69  i64 jrnlOff;.  i
7790: 6e 74 20 69 50 61 67 65 53 69 7a 65 3b 0a 0a 20  nt iPageSize;.. 
77a0: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
77b0: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
77c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
77d0: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
77e0: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
77f0: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
7800: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
7810: 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20  ;.  }.  jrnlOff 
7820: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
7830: 6c 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73 71  lOff;..  rc = sq
7840: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
7850: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
7860: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
7870: 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28   jrnlOff);.  if(
7880: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
7890: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73 69  .  jrnlOff += si
78a0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a 20  zeof(aMagic);.. 
78b0: 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67   if( memcmp(aMag
78c0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
78d0: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
78e0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))!=0 ){.    ret
78f0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
7900: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61  .  }..  rc = rea
7910: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
7920: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e  jfd, jrnlOff, pN
7930: 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Rec);.  if( rc )
7940: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
7950: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
7960: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
7970: 4f 66 66 2b 34 2c 20 26 70 50 61 67 65 72 2d 3e  Off+4, &pPager->
7980: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66  cksumInit);.  if
7990: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
79a0: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
79b0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
79c0: 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44 62  , jrnlOff+8, pDb
79d0: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
79e0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
79f0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
7a00: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
7a10: 6c 4f 66 66 2b 31 36 2c 20 28 75 33 32 20 2a 29  lOff+16, (u32 *)
7a20: 26 69 50 61 67 65 53 69 7a 65 29 3b 0a 20 20 69  &iPageSize);.  i
7a30: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7a40: 20 0a 20 20 20 26 26 20 69 50 61 67 65 53 69 7a   .   && iPageSiz
7a50: 65 3e 3d 35 31 32 20 0a 20 20 20 26 26 20 69 50  e>=512 .   && iP
7a60: 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
7a70: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
7a80: 20 20 26 26 20 28 28 69 50 61 67 65 53 69 7a 65    && ((iPageSize
7a90: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 3d 3d  -1)&iPageSize)==
7aa0: 30 20 0a 20 20 29 7b 0a 20 20 20 20 75 31 36 20  0 .  ){.    u16 
7ab0: 70 61 67 65 73 69 7a 65 20 3d 20 28 75 31 36 29  pagesize = (u16)
7ac0: 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  iPageSize;.    r
7ad0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
7ae0: 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
7af0: 65 72 2c 20 26 70 61 67 65 73 69 7a 65 29 3b 0a  er, &pagesize);.
7b00: 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 72    }.  if( rc ) r
7b10: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
7b20: 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
7b30: 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
7b40: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
7b50: 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  e used by .  ** 
7b60: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
7b70: 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f   created this jo
7b80: 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a  urnal. If this j
7b90: 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20  ournal was.  ** 
7ba0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
7bb0: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
7bc0: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
7bd0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  his routine.  **
7be0: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
7bf0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
7c00: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
7c10: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
7c20: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
7c30: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
7c40: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
7c50: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
7c60: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64    */.  rc = read
7c70: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
7c80: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c 20  fd, jrnlOff+12, 
7c90: 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  &pPager->sectorS
7ca0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
7cb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
7cc0: 28 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ( (pPager->secto
7cd0: 72 53 69 7a 65 20 26 20 28 70 50 61 67 65 72 2d  rSize & (pPager-
7ce0: 3e 73 65 63 74 6f 72 53 69 7a 65 2d 31 29 29 21  >sectorSize-1))!
7cf0: 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
7d00: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
7d10: 65 3e 30 78 31 30 30 30 30 30 30 20 29 7b 0a 20  e>0x1000000 ){. 
7d20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7d30: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 70 50  _DONE;.  }..  pP
7d40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
7d50: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
7d60: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  SZ(pPager);.  re
7d70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7d80: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
7d90: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
7da0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
7db0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
7dc0: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
7dd0: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
7de0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
7df0: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
7e00: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
7e10: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
7e20: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
7e30: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
7e40: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
7e50: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
7e60: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
7e70: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
7e80: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
7e90: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
7ea0: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
7eb0: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
7ec0: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
7ed0: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b  rmat is:.**.** +
7ee0: 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
7ef0: 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20  MJ_PGNO..** + N 
7f00: 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66  bytes: length of
7f10: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7f20: 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74  name..** + 4 byt
7f30: 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74  es: N.** + 4 byt
7f40: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
7f50: 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
7f60: 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20  ..** + 8 bytes: 
7f70: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
7f80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
7f90: 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
7fa0: 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
7fb0: 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
7fc0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
7fd0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
7fe0: 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
7ff0: 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
8000: 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
8010: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
8020: 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
8030: 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
8040: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
8050: 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
8060: 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
8070: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
8080: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
8090: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65  int rc;.  int le
80a0: 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20  n; .  int i; .  
80b0: 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69  i64 jrnlOff;.  i
80c0: 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 0a 20 20 75  64 jrnlSize;.  u
80d0: 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20  32 cksum = 0;.  
80e0: 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66  char zBuf[sizeof
80f0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
8100: 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  2*4];..  if( !zM
8110: 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d  aster || pPager-
8120: 3e 73 65 74 4d 61 73 74 65 72 20 29 20 72 65 74  >setMaster ) ret
8130: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
8140: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
8150: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
8160: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
8170: 52 59 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  RY ) return SQLI
8180: 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d  TE_OK;.  pPager-
8190: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
81a0: 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33  .  len = sqlite3
81b0: 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72  Strlen30(zMaster
81c0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
81d0: 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  len; i++){.    c
81e0: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
81f0: 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  i];.  }..  /* If
8200: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
8210: 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
8220: 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
8230: 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
8240: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
8250: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
8260: 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
8270: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
8280: 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
8290: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
82a0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
82b0: 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
82c0: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
82d0: 79 6e 63 20 29 7b 0a 20 20 20 20 73 65 65 6b 4a  ync ){.    seekJ
82e0: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
82f0: 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66  );.  }.  jrnlOff
8300: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
8310: 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d  alOff;.  pPager-
8320: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
8330: 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d  len+20);..  rc =
8340: 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
8350: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
8360: 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
8370: 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
8380: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8390: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72   return rc;.  jr
83a0: 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20 72  nlOff += 4;..  r
83b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
83c0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
83d0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a 72  zMaster, len, jr
83e0: 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63  nlOff);.  if( rc
83f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
8400: 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f  turn rc;.  jrnlO
8410: 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70 75  ff += len;..  pu
8420: 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65  t32bits(zBuf, le
8430: 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  n);.  put32bits(
8440: 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29  &zBuf[4], cksum)
8450: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66  ;.  memcpy(&zBuf
8460: 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  [8], aJournalMag
8470: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
8480: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63  nalMagic));.  rc
8490: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
84a0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
84b0: 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a  Buf, 8+sizeof(aJ
84c0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a 72  ournalMagic), jr
84d0: 6e 6c 4f 66 66 29 3b 0a 20 20 6a 72 6e 6c 4f 66  nlOff);.  jrnlOf
84e0: 66 20 2b 3d 20 38 2b 73 69 7a 65 6f 66 28 61 4a  f += 8+sizeof(aJ
84f0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20  ournalMagic);.  
8500: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
8510: 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
8520: 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  nc;..  /* If the
8530: 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
8540: 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
8550: 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
8560: 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
8570: 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
8580: 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
8590: 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
85a0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
85b0: 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
85c0: 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
85d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
85e0: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
85f0: 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
8600: 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
8610: 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
8620: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
8630: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
8640: 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
8650: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
8660: 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
8670: 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
8680: 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
8690: 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
86a0: 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
86b0: 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
86c0: 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
86d0: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
86e0: 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
86f0: 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
8700: 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
8710: 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
8720: 29 0a 20 20 20 26 26 20 28 72 63 20 3d 20 73 71  ).   && (rc = sq
8730: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
8740: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72  pPager->jfd, &jr
8750: 6e 6c 53 69 7a 65 29 29 3d 3d 53 51 4c 49 54 45  nlSize))==SQLITE
8760: 5f 4f 4b 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69  _OK.   && jrnlSi
8770: 7a 65 3e 6a 72 6e 6c 4f 66 66 0a 20 20 29 7b 0a  ze>jrnlOff.  ){.
8780: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8790: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
87a0: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 29  r->jfd, jrnlOff)
87b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
87c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
87d0: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
87e0: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
87f0: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
8800: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
8810: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
8820: 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  e or NULL if not
8830: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
8840: 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c  c PgHdr *pager_l
8850: 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
8860: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
8870: 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 73  .  PgHdr *p;.  s
8880: 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
8890: 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
88a0: 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b  e, pgno, 0, &p);
88b0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
88c0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
88d0: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
88e0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
88f0: 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  * sets the state
8900: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61   of the pager ba
8910: 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61  ck to what it wa
8920: 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69  s when it was fi
8930: 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20  rst.** opened.  
8940: 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  Any outstanding 
8950: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
8960: 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71  dated and subseq
8970: 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a  uent attempts.**
8980: 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65   to access those
8990: 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65   pages will like
89a0: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ly result in a c
89b0: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74  oredump..*/.stat
89c0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
89d0: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
89e0: 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
89f0: 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
8a00: 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  rn;.  sqlite3Pca
8a10: 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d  cheClear(pPager-
8a20: 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a  >pPCache);.}../*
8a30: 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72  .** Free all str
8a40: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 50  uctures in the P
8a50: 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b  ager.aSavepoint[
8a60: 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74 20  ] array and set 
8a70: 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53  both.** Pager.aS
8a80: 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67  avepoint and Pag
8a90: 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f  er.nSavepoint to
8aa0: 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65   zero. Close the
8ab0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
8ac0: 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e  if it is open an
8ad0: 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  d the pager is n
8ae0: 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ot in exclusive 
8af0: 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mode..*/.static 
8b00: 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53  void releaseAllS
8b10: 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
8b20: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69  pPager){.  int i
8b30: 69 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  i;.  for(ii=0; i
8b40: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
8b50: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
8b60: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
8b70: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53  stroy(pPager->aS
8b80: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e  avepoint[ii].pIn
8b90: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
8ba0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
8bb0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
8bc0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
8bd0: 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
8be0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
8bf0: 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
8c00: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
8c10: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
8c20: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
8c30: 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
8c40: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
8c50: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
8c60: 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65  et the bit numbe
8c70: 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61  r pgno in the Pa
8c80: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
8c90: 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
8ca0: 73 20 6f 66 0a 2a 2a 20 61 6c 6c 20 6f 70 65 6e  s of.** all open
8cb0: 20 73 61 76 65 70 6f 69 6e 74 73 2e 0a 2a 2f 0a   savepoints..*/.
8cc0: 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f  static int addTo
8cd0: 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
8ce0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
8cf0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
8d00: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
8d10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
8d20: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
8d30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8d40: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
8d50: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28   code */..  for(
8d60: 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
8d70: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
8d80: 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
8d90: 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
8da0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
8db0: 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
8dc0: 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
8dd0: 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74       rc |= sqlit
8de0: 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70  e3BitvecSet(p->p
8df0: 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
8e00: 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  o);.      assert
8e10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8e20: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
8e30: 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
8e40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8e50: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
8e60: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
8e70: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
8e80: 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
8e90: 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  y in error state
8ea0: 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 63 6f  , discard the co
8eb0: 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68  ntents of .** th
8ec0: 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 73 65  e cache and rese
8ed0: 74 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  t the Pager stru
8ee0: 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73  cture internal s
8ef0: 74 61 74 65 2e 20 49 66 20 74 68 65 72 65 20 69  tate. If there i
8f00: 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75  s.** an open jou
8f10: 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20  rnal-file, then 
8f20: 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20  the next time a 
8f30: 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f  shared-lock is o
8f40: 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68  btained.** on th
8f50: 65 20 70 61 67 65 72 20 66 69 6c 65 20 28 62 79  e pager file (by
8f60: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
8f70: 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20  er process), it 
8f80: 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74  will be.** treat
8f90: 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ed as a hot-jour
8fa0: 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
8fb0: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
8fc0: 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
8fd0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
8fe0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
8ff0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
9000: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73  .    int rc = os
9010: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
9020: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
9030: 20 69 66 28 20 72 63 20 29 20 70 50 61 67 65 72   if( rc ) pPager
9040: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
9050: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
9060: 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20  zeValid = 0;.   
9070: 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   IOTRACE(("UNLOC
9080: 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  K %p\n", pPager)
9090: 29 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  )..    /* Always
90a0: 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
90b0: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f  al file when dro
90c0: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pping the databa
90d0: 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20  se lock..    ** 
90e0: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68  Otherwise, anoth
90f0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  er connection wi
9100: 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  th journal_mode=
9110: 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20  delete might.   
9120: 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66   ** delete the f
9130: 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ile out from und
9140: 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  er us..    */.  
9150: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
9160: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
9170: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
9180: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
9190: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
91a0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
91b0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
91c0: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
91d0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
91e0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e       pPager->pIn
91f0: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
9200: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
9210: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
9220: 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29  pAlwaysRollback)
9230: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
9240: 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  pAlwaysRollback 
9250: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
9260: 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43  /* If Pager.errC
9270: 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20  ode is set, the 
9280: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
9290: 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e  pager cache cann
92a0: 6f 74 20 62 65 0a 20 20 20 20 2a 2a 20 74 72 75  ot be.    ** tru
92b0: 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74  sted. Now that t
92c0: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73  he pager file is
92d0: 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63   unlocked, the c
92e0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20  ontents of the. 
92f0: 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20     ** cache can 
9300: 62 65 20 64 69 73 63 61 72 64 65 64 20 61 6e 64  be discarded and
9310: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
9320: 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a  safely cleared..
9330: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
9340: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
9350: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
9360: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 67  SQLITE_OK ) pPag
9370: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51  er->errCode = SQ
9380: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 70  LITE_OK;.      p
9390: 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
93a0: 72 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  r);.      releas
93b0: 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 28 70 50  eAllSavepoint(pP
93c0: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61  ager);.      pPa
93d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
93e0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
93f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
9400: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  d = 0;.      pPa
9410: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
9420: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
9430: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
9440: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
9450: 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
9460: 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
9470: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63   }.}../*.** Exec
9480: 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
9490: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
94a0: 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
94b0: 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
94c0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
94d0: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
94e0: 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
94f0: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 0a 2a   error state, .*
9500: 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * do not attempt
9510: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
9520: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
9530: 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
9540: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a  back(Pager *p){.
9550: 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f 64 65    if( p->errCode
9560: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
9570: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
9580: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73  ESERVED ){.    s
9590: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
95a0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73  nMalloc();.    s
95b0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
95c0: 61 63 6b 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  ack(p);.    sqli
95d0: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
95e0: 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  oc();.  }.  page
95f0: 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 7d 0a 0a  r_unlock(p);.}..
9600: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
9610: 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61  ne ends a transa
9620: 63 74 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61  ction.  A transa
9630: 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 62  ction is ended b
9640: 79 20 65 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f  y either.** a CO
9650: 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41  MMIT or a ROLLBA
9660: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  CK..**.** When t
9670: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
9680: 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
9690: 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c   has the journal
96a0: 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a   file open and.*
96b0: 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  * a RESERVED or 
96c0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
96d0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
96e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
96f0: 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  ll release.** th
9700: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  e database lock 
9710: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53  and acquires a S
9720: 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74  HARED lock in it
9730: 73 20 70 6c 61 63 65 20 69 66 20 74 68 61 74 20  s place if that 
9740: 69 73 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70  is.** the approp
9750: 72 69 61 74 65 20 74 68 69 6e 67 20 74 6f 20 64  riate thing to d
9760: 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b  o.  Release lock
9770: 73 20 75 73 75 61 6c 6c 79 20 69 73 20 61 70 70  s usually is app
9780: 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c  ropriate,.** unl
9790: 65 73 73 20 77 65 20 61 72 65 20 69 6e 20 65 78  ess we are in ex
97a0: 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d  clusive access m
97b0: 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73 20 74 68  ode or unless th
97c0: 69 73 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d  is is a .** COMM
97d0: 49 54 20 41 4e 44 20 42 45 47 49 4e 20 6f 72 20  IT AND BEGIN or 
97e0: 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45 47  ROLLBACK AND BEG
97f0: 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  IN operation..**
9800: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
9810: 66 69 6c 65 20 69 73 20 65 69 74 68 65 72 20 64  file is either d
9820: 65 6c 65 74 65 64 20 6f 72 20 74 72 75 6e 63 61  eleted or trunca
9830: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  ted..**.** TODO:
9840: 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e   Consider keepin
9850: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
9860: 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70  le open for temp
9870: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e  orary databases.
9880: 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67  .** This might g
9890: 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
98a0: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e  e improvement on
98b0: 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f   windows where o
98c0: 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65  pening.** a file
98d0: 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65   is an expensive
98e0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
98f0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
9900: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
9910: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
9920: 6e 74 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20  nt hasMaster){. 
9930: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
9940: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d  _OK;.  int rc2 =
9950: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
9960: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
9970: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
9980: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9990: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
99a0: 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
99b0: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
99c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
99d0: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  Open ){.    if( 
99e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
99f0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9a00: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
9a10: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4d 65 6d  .      int isMem
9a20: 6f 72 79 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  oryJournal = sql
9a30: 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
9a40: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
9a50: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
9a60: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
9a70: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
9a80: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
9a90: 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4d 65  .      if( !isMe
9aa0: 6d 6f 72 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  moryJournal ){. 
9ab0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
9ac0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
9ad0: 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
9ae0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
9af0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
9b00: 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
9b10: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9b20: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
9b30: 4e 43 41 54 45 0a 20 20 20 20 20 20 20 20 20 26  NCATE.         &
9b40: 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  & (rc = sqlite3O
9b50: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
9b60: 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49  ->jfd, 0))==SQLI
9b70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
9b80: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9b90: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
9ba0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
9bb0: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ted = 0;.    }el
9bc0: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  se if( pPager->e
9bd0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
9be0: 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
9bf0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9c00: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
9c10: 53 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20  SIST.    ){.    
9c20: 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
9c30: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
9c40: 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  sMaster);.      
9c50: 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
9c60: 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70  er, rc);.      p
9c70: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9c80: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
9c90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
9ca0: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ted = 0;.    }el
9cb0: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
9cc0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
9cd0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9ce0: 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
9cf0: 7c 7c 20 72 63 20 29 3b 0a 20 20 20 20 20 20 73  || rc );.      s
9d00: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
9d10: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
9d20: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9d30: 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  lOpen = 0;.     
9d40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9d50: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  OK && !pPager->t
9d60: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
9d70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9d80: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
9d90: 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
9da0: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
9db0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
9dc0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
9dd0: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
9de0: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
9df0: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
9e00: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   0;.    sqlite3B
9e10: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
9e20: 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c  ger->pAlwaysRoll
9e30: 62 61 63 6b 29 3b 0a 20 20 20 20 70 50 61 67 65  back);.    pPage
9e40: 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61  r->pAlwaysRollba
9e50: 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ck = 0;.#ifdef S
9e60: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
9e70: 53 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  S.    sqlite3Pca
9e80: 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
9e90: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
9ea0: 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
9eb0: 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ash);.#endif.   
9ec0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
9ed0: 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
9ee0: 50 43 61 63 68 65 29 3b 0a 20 20 20 20 70 50 61  PCache);.    pPa
9ef0: 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
9f00: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
9f10: 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  >nRec = 0;.  }el
9f20: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
9f30: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
9f40: 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  al==0 );.  }..  
9f50: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
9f60: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
9f70: 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b    rc2 = osUnlock
9f80: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
9f90: 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
9fa0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
9fb0: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d  AGER_SHARED;.  }
9fc0: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
9fd0: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
9fe0: 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67  NCED ){.    pPag
9ff0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
a000: 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d  R_EXCLUSIVE;.  }
a010: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  .  pPager->dbOri
a020: 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  gSize = 0;.  pPa
a030: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
a040: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
a050: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 2f 2a  edSync = 0;.  /*
a060: 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73 74   lruListSetFirst
a070: 53 79 6e 63 65 64 28 70 50 61 67 65 72 29 3b 20  Synced(pPager); 
a080: 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  */.  if( !MEMDB 
a090: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
a0a0: 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a  bSizeValid = 0;.
a0b0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
a0c0: 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20  Modified = 0;.. 
a0d0: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
a0e0: 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a  ITE_OK?rc2:rc);.
a0f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
a100: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
a110: 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70  ecksum for the p
a120: 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a  age of data..**.
a130: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
a140: 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
a150: 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
a160: 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
a170: 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
a180: 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74  tial value and t
a190: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  he page number. 
a1a0: 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64   We experimented
a1b0: 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b   with.** a check
a1c0: 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72  sum of the entir
a1d0: 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74  e data, but that
a1e0: 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65   was found to be
a1f0: 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a   too slow..**.**
a200: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
a210: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74  age number is st
a220: 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69  ored at the begi
a230: 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e  nning of data an
a240: 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75  d.** the checksu
a250: 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  m is stored at t
a260: 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73  he end.  This is
a270: 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20   important.  If 
a280: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75  journal.** corru
a290: 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
a2a0: 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
a2b0: 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
a2c0: 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a  kely scenario.**
a2d0: 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
a2e0: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
a2f0: 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
a300: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74   be changed.  It
a310: 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73   is.** much less
a320: 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
a330: 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
a340: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
a350: 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
a360: 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
a370: 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
a380: 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
a390: 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
a3a0: 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
a3b0: 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
a3c0: 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
a3d0: 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
a3e0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20  tion..**.** FIX 
a3f0: 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64  ME:  Consider ad
a400: 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68  ding every 200th
a410: 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66   (or so) byte of
a420: 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65   the data to the
a430: 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54  .** checksum.  T
a440: 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e  hat way if a sin
a450: 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33  gle page spans 3
a460: 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65   or more disk se
a470: 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c  ctors and.** onl
a480: 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63  y the middle sec
a490: 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20  tor is corrupt, 
a4a0: 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61  we will still ha
a4b0: 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a  ve a reasonable.
a4c0: 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69  ** chance of fai
a4d0: 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  ling the checksu
a4e0: 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63  m and thus detec
a4f0: 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ting the problem
a500: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
a510: 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
a520: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
a530: 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
a540: 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
a550: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
a560: 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
a570: 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20  pageSize-200;.  
a580: 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
a590: 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
a5a0: 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
a5b0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
a5c0: 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  cksum;.}../*.** 
a5d0: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
a5e0: 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ge from the jour
a5f0: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  nal file opened 
a600: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
a610: 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79  or.** jfd.  Play
a620: 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61  back this one pa
a630: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  ge..**.** The is
a640: 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73  MainJrnl flag is
a650: 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73   true if this is
a660: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
a670: 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a  ck journal and.*
a680: 2a 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20  * false for the 
a690: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
a6a0: 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c  l.  The main rol
a6b0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73  lback journal us
a6c0: 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20  es.** checksums 
a6d0: 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  - the statement 
a6e0: 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
a6f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a700: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
a710: 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
a720: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
a730: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a740: 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79  pager being play
a750: 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ed back */.  int
a760: 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20   isMainJrnl,    
a770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
a780: 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e  -> main journal.
a790: 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61   0 -> sub-journa
a7a0: 6c 2e 20 2a 2f 0a 20 20 69 36 34 20 6f 66 66 73  l. */.  i64 offs
a7b0: 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
a7c0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
a7d0: 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61  of record to pla
a7e0: 79 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69  yback */.  int i
a7f0: 73 53 61 76 65 70 6e 74 2c 20 20 20 20 20 20 20  sSavepnt,       
a800: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
a810: 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74   for a savepoint
a820: 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 42   rollback */.  B
a830: 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 20 20 20  itvec *pDone    
a840: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a850: 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20  Bitvec of pages 
a860: 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20 62  already played b
a870: 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ack */.){.  int 
a880: 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
a890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a8a0: 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
a8b0: 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
a8c0: 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
a8d0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
a8e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
a8f0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
a900: 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
a910: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
a920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a930: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
a940: 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
a950: 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20  hecking */.  u8 
a960: 2a 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70  *aData = (u8 *)p
a970: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
a980: 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72  ;   /* Temp stor
a990: 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a  age for a page *
a9a0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
a9b0: 20 2a 6a 66 64 20 3d 20 28 69 73 4d 61 69 6e 4a   *jfd = (isMainJ
a9c0: 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  rnl ? pPager->jf
a9d0: 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  d : pPager->sjfd
a9e0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d  );..  /* The tem
a9f0: 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 62  p storage must b
aa00: 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74  e allocated at t
aa10: 68 69 73 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 61  his point */.  a
aa20: 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 0a  ssert( aData );.
aa30: 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e    assert( isMain
aa40: 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b  Jrnl || pDone );
aa50: 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76  .  assert( isSav
aa60: 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30  epnt || pDone==0
aa70: 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64   );..  rc = read
aa80: 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73  32bits(jfd, offs
aa90: 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
aaa0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
aab0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
aac0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
aad0: 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50  d(jfd, aData, pP
aae0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
aaf0: 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 69 66 28  offset+4);.  if(
ab00: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ab10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50   return rc;.  pP
ab20: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ab30: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
ab40: 53 69 7a 65 20 2b 20 34 20 2b 20 28 69 73 4d 61  Size + 4 + (isMa
ab50: 69 6e 4a 72 6e 6c 3f 34 3a 30 29 3b 0a 0a 20 20  inJrnl?4:0);..  
ab60: 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
ab70: 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
ab80: 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
ab90: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
aba0: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
abb0: 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
abc0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
abd0: 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
abe0: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
abf0: 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
ac00: 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
ac10: 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
ac20: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
ac30: 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
ac40: 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
ac50: 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
ac60: 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
ac70: 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
ac80: 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
ac90: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
aca0: 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
acb0: 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
acc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
acd0: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
ace0: 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65  pgno>(Pgno)pPage
acf0: 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c  r->dbSize || sql
ad00: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
ad10: 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  Done, pgno) ){. 
ad20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ad30: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  _OK;.  }.  if( i
ad40: 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
ad50: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
ad60: 28 6a 66 64 2c 20 6f 66 66 73 65 74 2b 70 50 61  (jfd, offset+pPa
ad70: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
ad80: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
ad90: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
ada0: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76  ;.    if( !isSav
adb0: 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b  epnt && pager_ck
adc0: 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74  sum(pPager, aDat
add0: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
ade0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
adf0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
ae00: 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20  .  if( pDone && 
ae10: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74  (rc = sqlite3Bit
ae20: 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67  vecSet(pDone, pg
ae30: 6e 6f 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75  no)) ){.    retu
ae40: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73  rn rc;.  }..  as
ae50: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
ae60: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
ae70: 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  VED || pPager->s
ae80: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
ae90: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  USIVE );..  /* I
aea0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
aeb0: 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
aec0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
aed0: 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
aee0: 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
aef0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
af00: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
af10: 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
af20: 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
af30: 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
af40: 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
af50: 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
af60: 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
af70: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
af80: 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
af90: 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
afa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
afb0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
afc0: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
afd0: 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
afe0: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
aff0: 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
b000: 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
b010: 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
b020: 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
b030: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
b040: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
b050: 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
b060: 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
b070: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
b080: 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
b090: 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
b0a0: 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
b0b0: 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
b0c0: 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
b0d0: 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
b0e0: 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
b0f0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
b100: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
b110: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
b120: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
b130: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
b140: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
b150: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
b160: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
b170: 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
b180: 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
b190: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
b1a0: 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
b1b0: 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
b1c0: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
b1d0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
b1e0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
b1f0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
b200: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
b210: 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
b220: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
b230: 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
b240: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
b250: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
b260: 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
b270: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
b280: 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
b290: 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
b2a0: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
b2b0: 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
b2c0: 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
b2d0: 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
b2e0: 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
b2f0: 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
b300: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
b310: 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65  ntents are synce
b320: 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
b330: 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
b340: 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
b350: 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  e, a power loss 
b360: 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69  might leave modi
b370: 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65  fied data in the
b380: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
b390: 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65  ile without an e
b3a0: 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ntry in the roll
b3b0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61  back journal tha
b3c0: 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f  t can.  ** resto
b3d0: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
b3e0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
b3f0: 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69  form.  Two condi
b400: 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20  tions must be.  
b410: 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  ** met before wr
b420: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
b430: 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29  abase files. (1)
b440: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
b450: 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65  st be.  ** locke
b460: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
b470: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
b480: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  l page content i
b490: 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20  s fully synced. 
b4a0: 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   ** in the main 
b4b0: 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
b4c0: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
b4d0: 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
b4e0: 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65  or else.  ** the
b4f0: 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
b500: 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a  as needSync==0..
b510: 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30    **.  ** 2008-0
b520: 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65  4-14:  When atte
b530: 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d  mpting to vacuum
b540: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
b550: 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a  ase file, it.  *
b560: 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
b570: 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e   fail a statemen
b580: 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  t on a database 
b590: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65  that does not ye
b5a0: 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f  t exist..  ** Do
b5b0: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
b5c0: 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73  write if databas
b5d0: 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72  e file has never
b5e0: 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20   been opened..  
b5f0: 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  */.  pPg = pager
b600: 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
b610: 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52  pgno);.  PAGERTR
b620: 41 43 45 35 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE5("PLAYBACK %
b630: 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
b640: 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20  08x) %s\n",.    
b650: 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
b660: 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
b670: 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  , pager_datahash
b680: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
b690: 65 2c 20 61 44 61 74 61 29 2c 0a 20 20 20 20 20  e, aData),.     
b6a0: 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69            (isMai
b6b0: 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72  nJrnl?"main-jour
b6c0: 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61  nal":"sub-journa
b6d0: 6c 22 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 28  l").  );.  if( (
b6e0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
b6f0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a  AGER_EXCLUSIVE).
b700: 20 20 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c     && (pPg==0 ||
b710: 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 26   0==(pPg->flags&
b720: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
b730: 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
b740: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20  >fd->pMethods). 
b750: 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74   ){.    i64 ofst
b760: 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
b770: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
b780: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
b790: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
b7a0: 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50  r->fd, aData, pP
b7b0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
b7c0: 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ofst);.    if( p
b7d0: 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
b7e0: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
b7f0: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
b800: 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d  ze = pgno;.    }
b810: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73  .  }else if( !is
b820: 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d  MainJrnl && pPg=
b830: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
b840: 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61  this is a rollba
b850: 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e  ck of a savepoin
b860: 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e  t and data was n
b870: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ot written to.  
b880: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
b890: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  e and the page i
b8a0: 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c  s not in-memory,
b8b0: 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65   there is a pote
b8c0: 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f  ntial.    ** pro
b8d0: 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70  blem. When the p
b8e0: 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63  age is next fetc
b8f0: 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65  hed by the b-tre
b900: 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20  e layer, it .   
b910: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64   ** will be read
b920: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
b930: 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
b940: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
b950: 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
b960: 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
b970: 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75   There are a cou
b980: 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  ple of different
b990: 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68   ways this can h
b9a0: 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71  appen. All are q
b9b0: 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63  uite.    ** obsc
b9c0: 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ure. When runnin
b9d0: 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  g in synchronous
b9e0: 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20   mode, this can 
b9f0: 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20  only happen .   
ba00: 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20   ** if the page 
ba10: 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  is on the free-l
ba20: 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ist at the start
ba30: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
ba40: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
ba50: 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e   populated, then
ba60: 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c   moved using sql
ba70: 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
ba80: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
ba90: 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
baa0: 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d  is to add an in-
bab0: 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74  memory page to t
bac0: 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
bad0: 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  ing.    ** the d
bae0: 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72  ata just read fr
baf0: 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
bb00: 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67  al. Mark the pag
bb10: 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20  e as dirty .    
bb20: 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61  ** and if the pa
bb30: 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a  ger requires a j
bb40: 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65  ournal-sync, the
bb50: 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  n mark the page 
bb60: 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  as .    ** requi
bb70: 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ring a journal-s
bb80: 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73  ync before it is
bb90: 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
bba0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53  .    assert( isS
bbb0: 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66  avepnt );.    if
bbc0: 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ( (rc = sqlite3P
bbd0: 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
bbe0: 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
bbf0: 31 29 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  1)) ){.      ret
bc00: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
bc10: 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
bc20: 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
bc30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
bc40: 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
bc50: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
bc60: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
bc70: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
bc80: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
bc90: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
bca0: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
bcb0: 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
bcc0: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
bcd0: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
bce0: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
bcf0: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
bd00: 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
bd10: 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
bd20: 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
bd30: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
bd40: 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
bd50: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
bd60: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
bd70: 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
bd80: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
bd90: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
bda0: 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
bdb0: 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
bdc0: 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
bdd0: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
bde0: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
bdf0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
be00: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
be10: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70  niter ){.      p
be20: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
be30: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
be40: 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
be50: 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
be60: 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
be70: 6c 4f 66 66 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  lOff<=pPager->jo
be80: 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20  urnalHdr) ){.   
be90: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e     /* If the con
bea0: 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
beb0: 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73  ge were just res
bec0: 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d  tored from the m
bed0: 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  ain .      ** jo
bee0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
bef0: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73   its content mus
bf00: 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72  t be as they wer
bf10: 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20  e when the .    
bf20: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
bf30: 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65   was first opene
bf40: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
bf50: 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20  we can mark the 
bf60: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  page.      ** as
bf70: 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68   clean, since th
bf80: 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e  ere will be no n
bf90: 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20  eed to write it 
bfa0: 6f 75 74 20 74 6f 20 74 68 65 2e 0a 20 20 20 20  out to the..    
bfb0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
bfc0: 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70  ere is one excep
bfd0: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c  tion to this rul
bfe0: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  e. If the page i
bff0: 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20  s being rolled. 
c000: 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20       ** back as 
c010: 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f  part of a savepo
c020: 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e  int (or statemen
c030: 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  t) rollback from
c040: 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e   an .      ** un
c050: 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
c060: 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
c070: 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
c080: 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20   is not safe.   
c090: 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68     ** to mark th
c0a0: 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
c0b0: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
c0c0: 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67   marking the pag
c0d0: 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c  e as.      ** cl
c0e0: 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74  ean will clear t
c0f0: 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
c100: 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74  NC flag. Since t
c110: 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20  he page is.     
c120: 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74   ** already in t
c130: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c140: 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67  (recorded in Pag
c150: 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61  er.pInJournal) a
c160: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nd.      ** the 
c170: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
c180: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c  flag is cleared,
c190: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
c1a0: 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20  written to.     
c1b0: 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e   ** again within
c1c0: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
c1d0: 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61  n, it will be ma
c1e0: 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75  rked as dirty bu
c1f0: 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  t.      ** the P
c200: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
c210: 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  lag will not be 
c220: 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68  set. It could th
c230: 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20  en potentially. 
c240: 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74       ** be writt
c250: 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20  en out into the 
c260: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
c270: 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  fore its journal
c280: 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73   file.      ** s
c290: 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64  egment is synced
c2a0: 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63  . If a crash occ
c2b0: 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f  urs during or fo
c2c0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20  llowing this,.  
c2d0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
c2e0: 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65  corruption may e
c2f0: 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  nsue..      */. 
c300: 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
c310: 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
c320: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
c330: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
c340: 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
c350: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
c360: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
c370: 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  f.    /* If this
c380: 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
c390: 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
c3a0: 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
c3b0: 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
c3c0: 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
c3d0: 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
c3e0: 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
c3f0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
c400: 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
c410: 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
c420: 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
c430: 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
c440: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
c450: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
c460: 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
c470: 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44   disk */.    COD
c480: 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
c490: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  a, pPg->pgno, 3)
c4a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
c4b0: 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
c4c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c4d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
c4e0: 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
c4f0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
c500: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c510: 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
c520: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
c530: 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
c540: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c550: 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
c560: 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
c570: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c580: 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
c590: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
c5a0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
c5b0: 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
c5c0: 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
c5d0: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d   is..**.** Argum
c5e0: 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  ent zMaster may 
c5f0: 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70  point to Pager.p
c600: 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61  TmpSpace. So tha
c610: 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  t buffer is not 
c620: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  .** available fo
c630: 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69  r use within thi
c640: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
c650: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
c660: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
c670: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20  tains the names 
c680: 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75  of all child jou
c690: 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c  rnals..** To tel
c6a0: 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  l if a master jo
c6b0: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
c6c0: 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65  eted, check to e
c6d0: 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68  ach of the.** ch
c6e0: 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20  ildren.  If all 
c6f0: 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74  children are eit
c700: 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64  her missing or d
c710: 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a  o not refer to.*
c720: 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61  * a different ma
c730: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  ster journal, th
c740: 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a  en this master j
c750: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
c760: 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
c770: 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
c780: 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ster(Pager *pPag
c790: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
c7a0: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69  zMaster){.  sqli
c7b0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
c7c0: 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
c7d0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61  int rc;.  int ma
c7e0: 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20  ster_open = 0;. 
c7f0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
c800: 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c 69 74 65  Master;.  sqlite
c810: 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
c820: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  ;.  char *zMaste
c830: 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
c840: 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
c850: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c860: 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
c870: 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
c880: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
c890: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
c8a0: 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  /..  /* Open the
c8b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c8c0: 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79  file exclusively
c8d0: 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74   in case some ot
c8e0: 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  her process.  **
c8f0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73   is running this
c900: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e   routine also. N
c910: 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73  ot that it makes
c920: 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72   too much differ
c930: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61  ence..  */.  pMa
c940: 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  ster = (sqlite3_
c950: 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61  file *)sqlite3Ma
c960: 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a 4f 73 46  lloc(pVfs->szOsF
c970: 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75  ile * 2);.  pJou
c980: 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f  rnal = (sqlite3_
c990: 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70  file *)(((u8 *)p
c9a0: 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e  Master) + pVfs->
c9b0: 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28  szOsFile);.  if(
c9c0: 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !pMaster ){.   
c9d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
c9e0: 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
c9f0: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
ca00: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
ca10: 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
ca20: 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
ca30: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ca40: 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
ca50: 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
ca60: 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
ca70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ca80: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
ca90: 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72  er_out;.  master
caa0: 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20 72 63  _open = 1;..  rc
cab0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
cac0: 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e  Size(pMaster, &n
cad0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
cae0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
caf0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
cb00: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28  ster_out;..  if(
cb10: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e   nMasterJournal>
cb20: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
cb30: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61  Journal;.    cha
cb40: 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  r *zMasterPtr = 
cb50: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74  0;.    int nMast
cb60: 65 72 50 74 72 20 3d 20 70 50 61 67 65 72 2d 3e  erPtr = pPager->
cb70: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
cb80: 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64  +1;..    /* Load
cb90: 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
cba0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
cbb0: 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
cbc0: 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ned from.    ** 
cbd0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
cbe0: 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
cbf0: 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
cc00: 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  l. .    */.    z
cc10: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
cc20: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 4d  (char *)sqlite3M
cc30: 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74  alloc((int)nMast
cc40: 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
cc50: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 69 66 28  terPtr);.    if(
cc60: 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
cc70: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
cc80: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
cc90: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
cca0: 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
ccb0: 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a   zMasterPtr = &z
ccc0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
ccd0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20  asterJournal];. 
cce0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ccf0: 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a  sRead(pMaster, z
cd00: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28  MasterJournal, (
cd10: 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  int)nMasterJourn
cd20: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  al, 0);.    if( 
cd30: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
cd40: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
cd50: 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61  ut;..    zJourna
cd60: 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
cd70: 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  al;.    while( (
cd80: 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72  zJournal-zMaster
cd90: 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72  Journal)<nMaster
cda0: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
cdb0: 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
cdc0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
cdd0: 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a  sAccess(pVfs, zJ
cde0: 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
cdf0: 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
ce00: 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 69 66  xists);.      if
ce10: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ce20: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
ce30: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
ce40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ce50: 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20   exists ){.     
ce60: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
ce70: 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
ce80: 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
ce90: 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
cea0: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  s..        ** Op
ceb0: 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
cec0: 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
ced0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
cee0: 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  al. If.        *
cef0: 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
cf00: 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
cf10: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
cf20: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
cf30: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  /.        int c;
cf40: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61  .        int fla
cf50: 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
cf60: 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
cf70: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
cf80: 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63  NAL);.        rc
cf90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
cfa0: 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
cfb0: 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
cfc0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
cfd0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cfe0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
cff0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
d000: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
d010: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
d020: 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
d030: 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
d040: 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
d050: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
d060: 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a  lose(pJournal);.
d070: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
d080: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d090: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
d0a0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
d0b0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20     }..        c 
d0c0: 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21  = zMasterPtr[0]!
d0d0: 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
d0e0: 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
d0f0: 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66  )==0;.        if
d100: 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ( c ){.         
d110: 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
d120: 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
d130: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
d140: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
d150: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
d160: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
d170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
d180: 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d       zJournal +=
d190: 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33   (sqlite3Strlen3
d1a0: 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  0(zJournal)+1);.
d1b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72      }.  }.  .  r
d1c0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
d1d0: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
d1e0: 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  r, 0);..delmaste
d1f0: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
d200: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
d210: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d220: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
d230: 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73  .  }  .  if( mas
d240: 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20  ter_open ){.    
d250: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
d260: 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 73  Master);.  }.  s
d270: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
d280: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
d290: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  c;.}.../*.** Tru
d2a0: 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66  ncate the main f
d2b0: 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ile of the given
d2c0: 20 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75   pager to the nu
d2d0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
d2e0: 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c 73 6f   indicated. Also
d2f0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61   truncate the ca
d300: 63 68 65 64 20 72 65 70 72 65 73 65 6e 74 61 74  ched representat
d310: 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ion of the file.
d320: 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74 20 6d 69 67  .**.** Might mig
d330: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
d340: 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
d350: 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
d360: 74 68 61 6e 20 6e 50 61 67 65 2e 0a 2a 2a 20 54  than nPage..** T
d370: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2c 20  his can happen, 
d380: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  for example, if 
d390: 77 65 20 61 72 65 20 69 6e 20 74 68 65 20 6d 69  we are in the mi
d3a0: 64 64 6c 65 20 6f 66 20 61 20 74 72 61 6e 73 61  ddle of a transa
d3b0: 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68 20 68  ction.** which h
d3c0: 61 73 20 65 78 74 65 6e 64 65 64 20 74 68 65 20  as extended the 
d3d0: 66 69 6c 65 20 73 69 7a 65 20 61 6e 64 20 74 68  file size and th
d3e0: 65 20 6e 65 77 20 70 61 67 65 73 20 61 72 65 20  e new pages are 
d3f0: 73 74 69 6c 6c 20 61 6c 6c 20 68 65 6c 64 0a 2a  still all held.*
d400: 2a 20 69 6e 20 63 61 63 68 65 2c 20 74 68 65 6e  * in cache, then
d410: 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 55 50   an INSERT or UP
d420: 44 41 54 45 20 64 6f 65 73 20 61 20 73 74 61 74  DATE does a stat
d430: 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 20  ement rollback. 
d440: 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65 72 61 74 69   Some.** operati
d450: 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
d460: 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
d470: 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 79 6f  t confused if yo
d480: 75 20 74 72 79 20 74 6f 0a 2a 2a 20 74 72 75 6e  u try to.** trun
d490: 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73  cate a file to s
d4a0: 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73  ome size that is
d4b0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20   larger than it 
d4c0: 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 0a 2a 2a  currently is,.**
d4d0: 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   so detect this 
d4e0: 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61  case and write a
d4f0: 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74   single zero byt
d500: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
d510: 74 68 65 20 6e 65 77 0a 2a 2a 20 66 69 6c 65 20  the new.** file 
d520: 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 73 74 61 74  instead..*/.stat
d530: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
d540: 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
d550: 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
d560: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
d570: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
d580: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
d590: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20  ER_EXCLUSIVE && 
d5a0: 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
d5b0: 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36 34 20  hods ){.    i64 
d5c0: 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77  currentSize, new
d5d0: 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
d5e0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
d5f0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
d600: 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
d610: 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72  newSize = pPager
d620: 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29  ->pageSize*(i64)
d630: 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72  nPage;.    if( r
d640: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
d650: 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77  currentSize!=new
d660: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66  Size ){.      if
d670: 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65  ( currentSize>ne
d680: 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  wSize ){.       
d690: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
d6a0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
d6b0: 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20  fd, newSize);.  
d6c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d6d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d6e0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
d6f0: 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a  d, "", 1, newSiz
d700: 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e-1);.      }.  
d710: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d720: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
d730: 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
d740: 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
d750: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
d760: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d770: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
d780: 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
d790: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
d7a0: 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67  cheTruncate(pPag
d7b0: 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6e 50 61  er->pPCache, nPa
d7c0: 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
d7d0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
d7e0: 65 74 20 74 68 65 20 73 65 63 74 6f 72 53 69 7a  et the sectorSiz
d7f0: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
d800: 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  pager..**.** The
d810: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
d820: 61 74 20 6c 65 61 73 74 20 61 73 20 62 69 67 20  at least as big 
d830: 61 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  as the sector si
d840: 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 62  ze reported.** b
d850: 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
d860: 72 53 69 7a 65 28 29 2e 20 20 54 68 65 20 6d 69  rSize().  The mi
d870: 6e 69 6d 75 6d 20 73 65 63 74 6f 72 20 73 69 7a  nimum sector siz
d880: 65 20 69 73 20 35 31 32 2e 0a 2a 2f 0a 73 74 61  e is 512..*/.sta
d890: 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74  tic void setSect
d8a0: 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  orSize(Pager *pP
d8b0: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
d8c0: 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
d8d0: 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
d8e0: 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  mpFile);.  if( !
d8f0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
d900: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
d910: 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
d920: 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
d930: 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
d940: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
d950: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
d960: 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
d970: 6e 20 77 68 63 69 68 20 63 61 73 65 20 74 68 65  n whcih case the
d980: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
d990: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
d9a0: 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
d9b0: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
d9c0: 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
d9d0: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
d9e0: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
d9f0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
da00: 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29 7b 0a  ctorSize<512 ){.
da10: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
da20: 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  orSize = 512;.  
da30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
da40: 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
da50: 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
da60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
da70: 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
da80: 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
da90: 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
daa0: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
dab0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
dac0: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
dad0: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
dae0: 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
daf0: 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
db00: 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
db10: 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
db20: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
db30: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
db40: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
db50: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
db60: 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
db70: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
db80: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
db90: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
dba0: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
dbb0: 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
dbc0: 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
dbd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
dbe0: 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
dbf0: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
dc00: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
dc10: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
dc20: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
dc30: 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
dc40: 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
dc50: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
dc60: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
dc70: 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
dc80: 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
dc90: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
dca0: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
dcb0: 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
dcc0: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
dcd0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
dce0: 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
dcf0: 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
dd00: 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
dd10: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
dd20: 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
dd30: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
dd40: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
dd50: 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28 37 29  ge case..**  (7)
dd60: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
dd70: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
dd80: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
dd90: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
dda0: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  nal.**       nam
ddb0: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61  e.  The value ma
ddc0: 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63  y be zero (indic
ddd0: 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ate that there i
dde0: 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20  s no master.**  
ddf0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a       journal.).*
de00: 2a 20 20 28 38 29 20 20 4e 20 62 79 74 65 73 20  *  (8)  N bytes 
de10: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
de20: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65  urnal name.  The
de30: 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75   name will be nu
de40: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
de50: 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20        and might 
de60: 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20  be shorter than 
de70: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
de80: 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65  rom (5).  If the
de90: 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20   first byte.**  
dea0: 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65       of the name
deb0: 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68   is \000 then th
dec0: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
ded0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
dee0: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
def0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73  ournal name is s
df00: 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  tored in UTF-8..
df10: 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f 20 6f 72  **  (9)  Zero or
df20: 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
df30: 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
df40: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
df50: 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
df60: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
df70: 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
df80: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
df90: 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
dfa0: 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
dfb0: 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
dfc0: 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
dfd0: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
dfe0: 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
dff0: 38 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  8 items above..*
e000: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
e010: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
e020: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
e030: 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 9th item..**.*
e040: 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
e050: 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
e060: 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
e070: 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
e080: 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
e090: 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
e0a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
e0b0: 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
e0c0: 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
e0d0: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
e0e0: 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
e0f0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e100: 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
e110: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
e120: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
e130: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
e140: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
e150: 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
e160: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
e170: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
e180: 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
e190: 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
e1a0: 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
e1b0: 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
e1c0: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
e1d0: 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
e1e0: 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
e1f0: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
e200: 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
e210: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
e220: 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
e230: 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
e240: 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
e250: 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
e260: 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
e270: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
e280: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
e290: 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
e2a0: 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
e2b0: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
e2c0: 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
e2d0: 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
e2e0: 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
e2f0: 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
e300: 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
e310: 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
e320: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
e330: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
e340: 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
e350: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
e360: 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
e370: 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
e380: 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
e390: 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
e3a0: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
e3b0: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
e3c0: 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
e3d0: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
e3e0: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
e3f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
e400: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
e410: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
e420: 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
e430: 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
e440: 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
e450: 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
e460: 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
e470: 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
e480: 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
e490: 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
e4a0: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
e4b0: 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
e4c0: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
e4d0: 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
e4e0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
e4f0: 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
e500: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
e510: 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
e520: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
e530: 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
e540: 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
e550: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
e560: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
e570: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
e580: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
e590: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
e5a0: 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
e5b0: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
e5c0: 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
e5d0: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
e5e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
e5f0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e600: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
e610: 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
e620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
e630: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
e640: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
e650: 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e670: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
e680: 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
e690: 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
e6a0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
e6b0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
e6c0: 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
e6d0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
e6e0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
e6f0: 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
e700: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
e710: 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
e720: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
e730: 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
e740: 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
e750: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
e760: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
e770: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
e780: 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
e790: 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
e7a0: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
e7b0: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
e7c0: 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
e7d0: 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
e7e0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
e7f0: 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
e800: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
e810: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d  alOpen );.  rc =
e820: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
e830: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
e840: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
e850: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
e860: 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  J==0 ){.    goto
e870: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
e880: 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
e890: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
e8a0: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
e8b0: 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
e8c0: 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
e8d0: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
e8e0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
e8f0: 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
e900: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
e910: 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
e920: 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
e930: 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
e940: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
e950: 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
e960: 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
e970: 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
e980: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
e990: 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
e9a0: 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
e9b0: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
e9c0: 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
e9d0: 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
e9e0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e9f0: 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
ea00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ea10: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
ea20: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
ea30: 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
ea40: 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
ea50: 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
ea60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
ea70: 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
ea80: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
ea90: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
eaa0: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f  nalOff = 0;..  /
eab0: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
eac0: 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
ead0: 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e  en the readJourn
eae0: 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74  alHdr() call ret
eaf0: 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45  urns.  ** SQLITE
eb00: 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
eb10: 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
eb20: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20    while( 1 ){.. 
eb30: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e     /* Read the n
eb40: 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
eb50: 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  er from the jour
eb60: 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68  nal file.  If th
eb70: 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e  ere are.    ** n
eb80: 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
eb90: 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  left in the jour
eba0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63  nal file for a c
ebb0: 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20  omplete header, 
ebc0: 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  or.    ** it is 
ebd0: 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
ebe0: 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f  a process must o
ebf0: 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  f failed while w
ec00: 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
ec10: 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
ec20: 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
ec30: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
ec40: 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
ec50: 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
ec60: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
ec70: 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
ec80: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
ec90: 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
eca0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ecb0: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
ecc0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ecd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
ece0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
ecf0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
ed00: 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
ed10: 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
ed20: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
ed30: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
ed40: 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
ed50: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
ed60: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
ed70: 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
ed80: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
ed90: 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
eda0: 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
edb0: 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
edc0: 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
edd0: 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
ede0: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
edf0: 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
ee00: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
ee10: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
ee20: 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
ee30: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ee40: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
ee50: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
ee60: 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
ee70: 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
ee80: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
ee90: 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f  Pager))/JOURNAL_
eea0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
eeb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
eec0: 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
eed0: 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
eee0: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
eef0: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
ef00: 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
ef10: 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74  and if this is t
ef20: 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20  he final header 
ef30: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  in the journal, 
ef40: 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20  then it means.  
ef50: 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70    ** that this p
ef60: 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
ef70: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c  al was being fil
ef80: 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20  led but has not 
ef90: 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20  yet been.    ** 
efa0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
efb0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d   Compute the num
efc0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73  ber of pages bas
efd0: 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e  ed on the remain
efe0: 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20  ing.    ** size 
eff0: 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  of the file..   
f000: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74   **.    ** The t
f010: 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65  hird term of the
f020: 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20   test was added 
f030: 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32  to fix ticket #2
f040: 35 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  565..    */.    
f050: 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
f060: 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
f070: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f080: 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
f090: 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
f0a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
f0b0: 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
f0c0: 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  int)((szJ - pPag
f0d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
f0e0: 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
f0f0: 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
f100: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
f110: 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61  is the first hea
f120: 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68  der read from th
f130: 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63  e journal, trunc
f140: 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
f150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
f160: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
f170: 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
f180: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
f190: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
f1a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
f1b0: 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
f1c0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
f1d0: 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
f1e0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f1f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f200: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
f210: 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
f220: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  }..    /* Copy o
f230: 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
f240: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
f250: 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
f260: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
f270: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
f280: 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b  (u=0; u<nRec; u+
f290: 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
f2a0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
f2b0: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 31  e_page(pPager, 1
f2c0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
f2d0: 6c 4f 66 66 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lOff, 0, 0);.   
f2e0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
f2f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f300: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
f310: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
f320: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f330: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
f340: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
f350: 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
f360: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
f370: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
f380: 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
f390: 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
f3a0: 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
f3b0: 65 20 69 73 20 70 72 6f 62 61 62 6c 79 0a 20 20  e is probably.  
f3c0: 20 20 20 20 20 20 20 20 2a 2a 20 67 6f 69 6e 67          ** going
f3d0: 20 74 6f 20 65 6e 64 20 75 70 20 62 65 69 6e 67   to end up being
f3e0: 20 63 6f 72 72 75 70 74 2e 20 20 49 74 20 69 73   corrupt.  It is
f3f0: 20 63 6f 72 72 75 70 74 20 74 6f 20 75 73 2c 20   corrupt to us, 
f400: 61 6e 79 68 6f 77 2e 0a 20 20 20 20 20 20 20 20  anyhow..        
f410: 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65    ** Perhaps the
f420: 20 6e 65 78 74 20 70 72 6f 63 65 73 73 20 74 6f   next process to
f430: 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 63 61 6e 20   come along can 
f440: 66 69 78 20 69 74 2e 2e 2e 2e 0a 20 20 20 20 20  fix it.....     
f450: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
f460: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
f470: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
f480: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
f490: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
f4a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
f4b0: 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43  .  }.  /*NOTREAC
f4c0: 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  HED*/.  assert( 
f4d0: 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61  0 );..end_playba
f4e0: 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ck:.  if( rc==SQ
f4f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
f500: 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
f510: 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
f520: 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
f530: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
f540: 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
f550: 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
f560: 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 7d 0a 20 20  hname+1);.  }.  
f570: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f580: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
f590: 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
f5a0: 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ion(pPager, zMas
f5b0: 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20  ter[0]!='\0');. 
f5c0: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
f5d0: 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
f5e0: 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
f5f0: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
f600: 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
f610: 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
f620: 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
f630: 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
f640: 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
f650: 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
f660: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f670: 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
f680: 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
f690: 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
f6a0: 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ster);.  }..  /*
f6b0: 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
f6c0: 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
f6d0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
f6e0: 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
f6f0: 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
f700: 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
f710: 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
f720: 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
f730: 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
f740: 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
f750: 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
f760: 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
f770: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
f780: 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
f790: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
f7a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
f7b0: 6b 20 61 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  k a savepoint..*
f7c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
f7d0: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
f7e0: 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
f7f0: 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  r, PagerSavepoin
f800: 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a  t *pSavepoint){.
f810: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
f820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
f830: 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a  ze of the full j
f840: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
f850: 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
f860: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66       /* End of f
f870: 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
f880: 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63  main-journal rec
f890: 6f 72 64 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ords */.  Pgno i
f8a0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
f8b0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
f8c0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
f8d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
f8e0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
f8f0: 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
f900: 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
f910: 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72   Bitvec to ensur
f920: 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62  e pages played b
f930: 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  ack only once */
f940: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
f950: 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20  a bitvec to use 
f960: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74  to store the set
f970: 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64   of pages rolled
f980: 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   back */.  if( p
f990: 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
f9a0: 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33   pDone = sqlite3
f9b0: 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61  BitvecCreate(pSa
f9c0: 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b  vepoint->nOrig);
f9d0: 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20  .    if( !pDone 
f9e0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
f9f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
fa00: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 72    }.  }..  /* Tr
fa10: 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
fa20: 61 73 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ase back to the 
fa30: 73 69 7a 65 20 69 74 20 77 61 73 20 62 65 66 6f  size it was befo
fa40: 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 61 76  re the .  ** sav
fa50: 65 70 6f 69 6e 74 20 62 65 69 6e 67 20 72 65 76  epoint being rev
fa60: 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
fa70: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
fa80: 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
fa90: 6f 69 6e 74 3f 70 53 61 76 65 70 6f 69 6e 74 2d  oint?pSavepoint-
faa0: 3e 6e 4f 72 69 67 3a 70 50 61 67 65 72 2d 3e 64  >nOrig:pPager->d
fab0: 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 61 73 73  bOrigSize;.  ass
fac0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
fad0: 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
fae0: 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f   );..  /* Now ro
faf0: 6c 6c 20 62 61 63 6b 20 61 6c 6c 20 6d 61 69 6e  ll back all main
fb00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 65   journal file re
fb10: 63 6f 72 64 73 20 74 68 61 74 20 6f 63 63 75 72  cords that occur
fb20: 20 61 66 74 65 72 20 62 79 74 65 0a 20 20 2a 2a   after byte.  **
fb30: 20 62 79 74 65 20 6f 66 66 73 65 74 20 50 61 67   byte offset Pag
fb40: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
fb50: 73 65 74 20 74 68 61 74 20 68 61 76 65 20 61 20  set that have a 
fb60: 70 61 67 65 20 6e 75 6d 62 65 72 20 6c 65 73 73  page number less
fb70: 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71   than.  ** or eq
fb80: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
fb90: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2e 20 41 73 20  point.nOrig. As 
fba0: 65 61 63 68 20 72 65 63 6f 72 64 20 69 73 20 70  each record is p
fbb0: 6c 61 79 65 64 20 62 61 63 6b 2c 0a 20 20 2a 2a  layed back,.  **
fbc0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
fbd0: 6e 67 20 62 69 74 20 69 6e 20 62 69 74 76 65 63  ng bit in bitvec
fbe0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
fbf0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 69 73 20  pInSavepoint is 
fc00: 0a 20 20 2a 2a 20 63 6c 65 61 72 65 64 2e 0a 20  .  ** cleared.. 
fc10: 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67   */.  szJ = pPag
fc20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
fc30: 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
fc40: 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20   ){.    iHdrOff 
fc50: 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  = pSavepoint->iH
fc60: 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65  drOffset ? pSave
fc70: 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
fc80: 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61  t : szJ;.    pPa
fc90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
fca0: 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f  = pSavepoint->iO
fcb0: 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65  ffset;.    while
fcc0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
fcd0: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
fce0: 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b  alOff<iHdrOff ){
fcf0: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
fd00: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
fd10: 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20 70  age(pPager, 1, p
fd20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
fd30: 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20  f, 1, pDone);.  
fd40: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
fd50: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
fd60: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
fd70: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
fd80: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lOff = 0;.  }.  
fd90: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
fda0: 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
fdb0: 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
fdc0: 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20  {.    u32 nJRec 
fdd0: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
fde0: 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
fdf0: 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
fe00: 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
fe10: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
fe20: 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a  pPager, szJ, &nJ
fe30: 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
fe40: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
fe50: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
fe60: 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b   if( nJRec==0 ){
fe70: 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
fe80: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
fe90: 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61  urnalOff) / (pPa
fea0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29  ger->pageSize+8)
feb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
fec0: 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
fed0: 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
fee0: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
fef0: 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
ff00: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
ff10: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
ff20: 70 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20  page(pPager, 1, 
ff30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ff40: 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20  ff, 1, pDone);. 
ff50: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
ff60: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
ff70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
ff80: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
ff90: 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K || pPager->jou
ffa0: 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a  rnalOff==szJ );.
ffb0: 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 62  .  /* Now roll b
ffc0: 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ack pages from t
ffd0: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
ffe0: 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
fff0: 69 6e 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  int ){.    for(i
10000 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  i=pSavepoint->iS
10010 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54  ubRec; rc==SQLIT
10020 45 5f 4f 4b 26 26 69 69 3c 28 75 33 32 29 70 50  E_OK&&ii<(u32)pP
10030 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 20  ager->stmtNRec; 
10040 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 36 34  ii++){.      i64
10050 20 6f 66 66 73 65 74 20 3d 20 69 69 2a 28 34 2b   offset = ii*(4+
10060 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10070 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
10080 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
10090 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 30 2c  _page(pPager, 0,
100a0 20 6f 66 66 73 65 74 2c 20 31 2c 20 70 44 6f 6e   offset, 1, pDon
100b0 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
100c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
100d0 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  E );.    }.  }..
100e0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
100f0 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
10100 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10110 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
10120 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
10130 7a 4a 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  zJ;.  }.  return
10140 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
10150 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
10160 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
10170 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
10180 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
10190 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
101a0 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
101b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
101c0 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69   mxPage){.  sqli
101d0 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68  te3PcacheSetCach
101e0 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  esize(pPager->pP
101f0 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a  Cache, mxPage);.
10200 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
10210 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
10220 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
10230 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
10240 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
10250 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
10260 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
10270 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
10280 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
10290 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
102a0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
102b0 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
102c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
102d0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
102e0 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
102f0 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
10300 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
10310 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
10320 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
10330 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
10340 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
10350 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
10360 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
10370 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
10380 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
10390 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
103a0 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
103b0 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
103c0 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
103d0 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
103e0 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
103f0 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
10400 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
10410 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10420 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
10430 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
10440 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
10450 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
10460 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
10470 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
10480 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
10490 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
104b0 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
104c0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
104d0 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
104e0 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
104f0 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
10500 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
10510 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
10520 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
10530 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
10540 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
10550 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
10560 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
10570 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10580 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
10590 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
105a0 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
105b0 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
105c0 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
105d0 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
105e0 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
105f0 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
10600 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
10610 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
10620 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
10630 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
10640 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
10650 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
10660 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
10670 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
10680 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
10690 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
106a0 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
106b0 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
106c0 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
106d0 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
106e0 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
106f0 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
10700 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
10710 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
10720 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
10730 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
10740 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65  SafetyLevel(Page
10750 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
10760 65 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46  evel, int bFullF
10770 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d  sync){.  pPager-
10780 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65  >noSync =  (leve
10790 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
107a0 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
107b0 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
107c0 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26  nc = (level==3 &
107d0 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
107e0 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61  ile) ?1:0;.  pPa
107f0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
10800 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51  = (bFullFsync?SQ
10810 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53  LITE_SYNC_FULL:S
10820 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
10830 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  L);.  if( pPager
10840 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65  ->noSync ) pPage
10850 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
10860 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
10870 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
10880 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
10890 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
108a0 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
108b0 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
108c0 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
108d0 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
108e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
108f0 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
10900 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
10910 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
10920 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
10930 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
10940 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
10950 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
10960 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
10970 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  . .**.** Write t
10980 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
10990 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65  or into *fd.  Re
109a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
109b0 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d  n success or som
109c0 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72  e.** other error
109d0 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
109e0 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  . The OS will au
109f0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
10a00 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
10a10 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 69 74  .** file when it
10a20 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73   is closed..*/.s
10a30 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
10a40 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a  3PagerOpentemp(.
10a50 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
10a60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
10a70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
10a80 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
10a90 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
10aa0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
10ab0 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
10ac0 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
10ad0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
10ae0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
10af0 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
10b00 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53  nt rc;..#ifdef S
10b10 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
10b20 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
10b30 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
10b40 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
10b50 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
10b60 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
10b70 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
10b80 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
10b90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
10ba0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
10bb0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
10bc0 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
10bd0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
10be0 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
10bf0 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
10c00 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
10c10 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
10c20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
10c30 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d  ITE_OK || pFile-
10c40 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 72  >pMethods );.  r
10c50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
10c60 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72  tic int pagerStr
10c70 65 73 73 28 76 6f 69 64 20 2a 2c 50 67 48 64 72  ess(void *,PgHdr
10c80 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   *);../*.** Crea
10c90 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
10ca0 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
10cb0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
10cc0 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
10cd0 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
10ce0 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
10cf0 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
10d00 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
10d10 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
10d20 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
10d30 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
10d40 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68  () and is only h
10d50 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74  eld open until t
10d60 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20  he.** last page 
10d70 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  is released usin
10d80 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  g sqlite3PagerUn
10d90 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ref()..**.** If 
10da0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
10db0 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
10dc0 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
10dd0 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
10de0 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
10df0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
10e00 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c  cached.  The fil
10e10 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
10e20 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
10e30 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ly when it is cl
10e40 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  osed..**.** If z
10e50 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
10e60 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20  mory:" then all 
10e70 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
10e80 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  eld in cache..**
10e90 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
10ea0 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54  tten to disk.  T
10eb0 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
10ec0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a  to implement an.
10ed0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
10ee0 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
10ef0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a  lite3PagerOpen(.
10f00 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
10f10 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  Vfs,       /* Th
10f20 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73  e virtual file s
10f30 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a  ystem to use */.
10f40 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
10f50 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r,         /* Re
10f60 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
10f70 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
10f80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10f90 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
10fa0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
10fb0 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
10fc0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
10fd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
10fe0 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
10ff0 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
11000 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
11010 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
11020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
11030 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
11040 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
11050 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
11060 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
11070 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
11080 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
11090 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38  pen() */.){.  u8
110a0 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20   *pPtr;.  Pager 
110b0 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69  *pPager = 0;.  i
110c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
110d0 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  K;.  int i;.  in
110e0 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a  t tempFile = 0;.
110f0 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
11100 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
11110 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f  = 0;.  int useJo
11120 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
11130 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
11140 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e  NAL)==0;.  int n
11150 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61  oReadlock = (fla
11160 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45  gs & PAGER_NO_RE
11170 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e  ADLOCK)!=0;.  in
11180 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  t journalFileSiz
11190 65 3b 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53  e;.  int pcacheS
111a0 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ize = sqlite3Pca
111b0 63 68 65 53 69 7a 65 28 29 3b 0a 20 20 69 6e 74  cheSize();.  int
111c0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
111d0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
111e0 45 5f 53 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a  E_SIZE;.  char *
111f0 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20  zPathname = 0;. 
11200 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d   int nPathname =
11210 20 30 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   0;..  if( sqlit
11220 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
11230 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f  fs)>sqlite3MemJo
11240 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20  urnalSize() ){. 
11250 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
11260 7a 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  ze = sqlite3Jour
11270 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3b 0a 20  nalSize(pVfs);. 
11280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72   }else{.    jour
11290 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71  nalFileSize = sq
112a0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
112b0 69 7a 65 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ize();.  }..  /*
112c0 20 54 68 65 20 64 65 66 61 75 6c 74 20 72 65 74   The default ret
112d0 75 72 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  urn is a NULL po
112e0 69 6e 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61  inter */.  *ppPa
112f0 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43  ger = 0;..  /* C
11300 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65  ompute and store
11310 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
11320 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74  me in an allocat
11330 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  ed buffer pointe
11340 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61  d.  ** to by zPa
11350 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e  thname, length n
11360 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66  Pathname. Or, if
11370 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
11380 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20  rary file,.  ** 
11390 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68  leave both nPath
113a0 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61  name and zPathna
113b0 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a  me set to 0..  *
113c0 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
113d0 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
113e0 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61  ] ){.    nPathna
113f0 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
11400 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61  hname+1;.    zPa
11410 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
11420 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65  Malloc(nPathname
11430 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
11440 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
11450 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11460 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69  _NOMEM;.    }.#i
11470 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11480 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69  T_MEMORYDB.    i
11490 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  f( strcmp(zFilen
114a0 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  ame,":memory:")=
114b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44  =0 ){.      memD
114c0 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61  b = 1;.      zPa
114d0 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20  thname[0] = 0;. 
114e0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
114f0 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d      {.      rc =
11500 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
11510 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
11520 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
11530 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, zPathname);. 
11540 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
11550 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11560 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11570 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
11580 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11590 20 20 7d 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d    }.    nPathnam
115a0 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
115b0 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
115c0 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
115d0 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
115e0 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
115f0 65 20 2a 2f 0a 20 20 70 50 61 67 65 72 20 3d 20  e */.  pPager = 
11600 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
11610 6f 28 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a 70  o(.    sizeof(*p
11620 50 61 67 65 72 29 20 2b 20 20 20 20 20 20 20 20  Pager) +        
11630 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75     /* Pager stru
11640 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 70 63 61  cture */.    pca
11650 63 68 65 53 69 7a 65 20 20 20 20 20 20 2b 20 20  cheSize      +  
11660 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63           /* PCac
11670 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  he object */.   
11680 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
11690 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
116a0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
116b0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 20 0a 20   structure */ . 
116c0 20 20 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c     pVfs->szOsFil
116d0 65 20 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  e  +           /
116e0 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69  * The main db fi
116f0 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61  le */.    journa
11700 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20  lFileSize * 2 + 
11710 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f        /* The two
11720 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
11730 2f 20 0a 20 20 20 20 33 2a 6e 50 61 74 68 6e 61  / .    3*nPathna
11740 6d 65 20 2b 20 34 30 20 20 20 20 20 20 20 20 20  me + 40         
11750 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c     /* zFilename,
11760 20 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 4a 6f   zDirectory, zJo
11770 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20  urnal */.  );.  
11780 69 66 28 20 21 70 50 61 67 65 72 20 29 7b 0a 20  if( !pPager ){. 
11790 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
117a0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
117b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
117c0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MEM;.  }.  pPage
117d0 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 28 50 43  r->pPCache = (PC
117e0 61 63 68 65 20 2a 29 26 70 50 61 67 65 72 5b 31  ache *)&pPager[1
117f0 5d 3b 0a 20 20 70 50 74 72 20 3d 20 28 28 75 38  ];.  pPtr = ((u8
11800 20 2a 29 26 70 50 61 67 65 72 5b 31 5d 29 20 2b   *)&pPager[1]) +
11810 20 70 63 61 63 68 65 53 69 7a 65 3b 0a 20 20 70   pcacheSize;.  p
11820 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20  Pager->vfsFlags 
11830 3d 20 76 66 73 46 6c 61 67 73 3b 0a 20 20 70 50  = vfsFlags;.  pP
11840 61 67 65 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69  ager->fd = (sqli
11850 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b  te3_file*)&pPtr[
11860 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30  pVfs->szOsFile*0
11870 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66  ];.  pPager->sjf
11880 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
11890 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73  e*)&pPtr[pVfs->s
118a0 7a 4f 73 46 69 6c 65 5d 3b 0a 20 20 70 50 61 67  zOsFile];.  pPag
118b0 65 72 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74  er->jfd = (sqlit
118c0 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70  e3_file*)&pPtr[p
118d0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2b 6a 6f  Vfs->szOsFile+jo
118e0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a  urnalFileSize];.
118f0 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
11900 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50  ame = (char*)&pP
11910 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  tr[pVfs->szOsFil
11920 65 2b 32 2a 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  e+2*journalFileS
11930 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize];.  pPager->
11940 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50  zDirectory = &pP
11950 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
11960 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20  nPathname+1];.  
11970 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
11980 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72   = &pPager->zDir
11990 65 63 74 6f 72 79 5b 6e 50 61 74 68 6e 61 6d 65  ectory[nPathname
119a0 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  +1];.  pPager->p
119b0 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 69 66  Vfs = pVfs;.  if
119c0 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ( zPathname ){. 
119d0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
119e0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
119f0 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
11a00 65 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e+1);.    sqlite
11a10 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
11a20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  );.  }..  /* Ope
11a30 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
11a40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
11a50 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
11a60 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62  ame[0] && !memDb
11a70 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 50 61 74   ){.    if( nPat
11a80 68 6e 61 6d 65 3e 28 70 56 66 73 2d 3e 6d 78 50  hname>(pVfs->mxP
11a90 61 74 68 6e 61 6d 65 20 2d 20 28 69 6e 74 29 73  athname - (int)s
11aa0 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22  izeof("-journal"
11ab0 29 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  )) ){.      rc =
11ac0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
11ad0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11ae0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
11af0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
11b00 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
11b10 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
11b20 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20  e, pPager->fd,. 
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b40 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
11b50 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
11b60 3b 0a 20 20 20 20 20 20 72 65 61 64 4f 6e 6c 79  ;.      readOnly
11b70 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
11b80 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
11b90 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
11ba0 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
11bb0 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
11bc0 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
11bd0 65 73 73 2c 0a 20 20 20 20 20 20 2a 2a 20 63 68  ess,.      ** ch
11be0 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70  oose a default p
11bf0 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65  age size in case
11c00 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61   we have to crea
11c10 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
11c20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
11c30 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
11c40 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
11c50 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a  mum of:.      **
11c60 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  .      **    + S
11c70 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
11c80 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 2a  GE_SIZE,.      *
11c90 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
11ca0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
11cb0 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
11cc0 28 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b  ().      **    +
11cd0 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67   The largest pag
11ce0 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20  e size that can 
11cf0 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
11d00 63 61 6c 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  cally..      */.
11d10 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
11d20 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64  LITE_OK && !read
11d30 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
11d40 69 6e 74 20 69 53 65 63 74 6f 72 53 69 7a 65 20  int iSectorSize 
11d50 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
11d60 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
11d70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
11d80 7a 50 61 67 65 44 66 6c 74 3c 69 53 65 63 74 6f  zPageDflt<iSecto
11d90 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
11da0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
11db0 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  iSectorSize;.   
11dc0 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
11dd0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
11de0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
11df0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
11e00 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
11e10 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
11e20 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
11e30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
11e40 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61   ii;.          a
11e50 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
11e60 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
11e70 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
11e80 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
11e90 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
11ea0 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
11eb0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
11ec0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
11ed0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
11ee0 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  536);.          
11ef0 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
11f00 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
11f10 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
11f20 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
11f30 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
11f40 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
11f50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
11f60 20 29 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20   ) szPageDflt = 
11f70 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ii;.          }.
11f80 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
11f90 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 50  .        if( szP
11fa0 61 67 65 44 66 6c 74 3e 53 51 4c 49 54 45 5f 4d  ageDflt>SQLITE_M
11fb0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
11fc0 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
11fd0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
11fe0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
11ff0 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
12000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12010 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
12020 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
12030 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
12040 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
12050 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
12060 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
12070 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
12080 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
12090 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
120a0 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
120b0 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
120c0 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
120d0 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
120e0 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
120f0 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
12100 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
12110 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
12120 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
12130 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
12140 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
12150 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
12160 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
12170 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
12180 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
12190 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
121a0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
121b0 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d  .    */ .    tem
121c0 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70  pFile = 1;.    p
121d0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
121e0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
121f0 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
12200 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r && rc==SQLITE_
12210 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
12220 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
12230 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
12240 73 7a 50 61 67 65 44 66 6c 74 29 3b 0a 20 20 7d  szPageDflt);.  }
12250 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
12260 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69  or occured in ei
12270 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63  ther of the bloc
12280 6b 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46  ks above..  ** F
12290 72 65 65 20 74 68 65 20 50 61 67 65 72 20 73 74  ree the Pager st
122a0 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73  ructure and clos
122b0 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a  e the file..  **
122c0 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 72   Since the pager
122d0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65   is not allocate
122e0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  d there is no ne
122f0 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20  ed to set .  ** 
12300 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73  any Pager.errMas
12310 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a  k variables..  *
12320 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 20  /.  if( !pPager 
12330 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70  || !pPager->pTmp
12340 53 70 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c  Space ){.    sql
12350 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
12360 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
12370 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
12380 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28  );.    return ((
12390 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53  rc==SQLITE_OK)?S
123a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b  QLITE_NOMEM:rc);
123b0 0a 20 20 7d 0a 20 20 6e 45 78 74 72 61 20 3d 20  .  }.  nExtra = 
123c0 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
123d0 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74  nExtra);.  sqlit
123e0 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50  e3PcacheOpen(szP
123f0 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c  ageDflt, nExtra,
12400 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20   !memDb,.       
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65               !me
12420 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a  mDb?pagerStress:
12430 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  0, (void *)pPage
12440 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  r, pPager->pPCac
12450 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  he);..  PAGERTRA
12460 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE3("OPEN %d %s\
12470 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
12480 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
12490 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
124a0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50  ;.  IOTRACE(("OP
124b0 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61  EN %p %s\n", pPa
124c0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ger, pPager->zFi
124d0 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46  lename))..  /* F
124e0 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44 69  ill in Pager.zDi
124f0 72 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d  rectory[] */.  m
12500 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44  emcpy(pPager->zD
12510 69 72 65 63 74 6f 72 79 2c 20 70 50 61 67 65 72  irectory, pPager
12520 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  ->zFilename, nPa
12530 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72  thname+1);.  for
12540 28 69 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  (i=sqlite3Strlen
12550 33 30 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  30(pPager->zDire
12560 63 74 6f 72 79 29 3b 20 0a 20 20 20 20 20 20 69  ctory); .      i
12570 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44  >0 && pPager->zD
12580 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27  irectory[i-1]!='
12590 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28  /'; i--){}.  if(
125a0 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a   i>0 ) pPager->z
125b0 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d  Directory[i-1] =
125c0 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   0;..  /* Fill i
125d0 6e 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  n Pager.zJournal
125e0 5b 5d 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74  [] */.  if( zPat
125f0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d 65 6d  hname ){.    mem
12600 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
12610 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46  rnal, pPager->zF
12620 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
12630 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
12640 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
12650 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
12660 6a 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 20 20  journal", 9);.  
12670 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
12680 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  r->zJournal = 0;
12690 0a 20 20 7d 0a 0a 20 20 2f 2a 20 70 50 61 67 65  .  }..  /* pPage
126a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
126b0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
126c0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75  >useJournal = (u
126d0 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20  8)useJournal;.  
126e0 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
126f0 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b  ck = (noReadlock
12700 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31   && readOnly) ?1
12710 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  :0;.  /* pPager-
12720 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
12730 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
12740 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
12750 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
12760 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ef = 0; */.  pPa
12770 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
12780 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
12790 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
127a0 20 3d 20 73 7a 50 61 67 65 44 66 6c 74 3b 0a 20   = szPageDflt;. 
127b0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
127c0 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
127d0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
127e0 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
127f0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
12800 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
12810 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20  >mxPage = 100;. 
12820 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
12830 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
12840 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50  E_COUNT;.  /* pP
12850 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
12860 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20  GER_UNLOCK; */. 
12870 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12880 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46  >state == (tempF
12890 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c  ile ? PAGER_EXCL
128a0 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e  USIVE : PAGER_UN
128b0 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50  LOCK) );.  /* pP
128c0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20  ager->errMask = 
128d0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
128e0 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74  tempFile = (u8)t
128f0 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72  empFile;.  asser
12900 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  t( tempFile==PAG
12910 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
12920 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20  ORMAL .         
12930 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41   || tempFile==PA
12940 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
12950 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
12960 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
12970 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
12980 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65  VE==1 );.  pPage
12990 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
129a0 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
129b0 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44   .  pPager->memD
129c0 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  b = (u8)memDb;. 
129d0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
129e0 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79  y = (u8)readOnly
129f0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  ;.  /* pPager->n
12a00 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a  eedSync = 0; */.
12a10 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
12a20 20 3d 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70   = (pPager->temp
12a30 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72  File || !useJour
12a40 6e 61 6c 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61  nal) ?1:0;.  pPa
12a50 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
12a60 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
12a70 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  0:1;.  pPager->s
12a80 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49  ync_flags = SQLI
12a90 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
12aa0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
12ab0 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
12ac0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
12ad0 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
12ae0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
12af0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
12b00 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74  r->nExtra = nExt
12b10 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ra;.  pPager->jo
12b20 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
12b30 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
12b40 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d  JOURNAL_SIZE_LIM
12b50 49 54 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61  IT;.  assert(pPa
12b60 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
12b70 73 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  s||tempFile);.  
12b80 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
12b90 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6d 65 6d  ager);.  if( mem
12ba0 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
12bb0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
12bc0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
12bd0 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
12be0 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  /* pPager->xBusy
12bf0 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
12c00 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
12c10 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30  syHandlerArg = 0
12c20 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  ; */.  /* memset
12c30 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
12c40 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
12c50 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
12c60 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
12c70 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
12c80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12c90 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
12ca0 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
12cb0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
12cc0 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
12cd0 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
12ce0 65 72 2c 20 0a 20 20 69 6e 74 20 28 2a 78 42 75  er, .  int (*xBu
12cf0 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
12d00 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 73  *),.  void *pBus
12d10 79 48 61 6e 64 6c 65 72 41 72 67 0a 29 7b 20 20  yHandlerArg.){  
12d20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  .  pPager->xBusy
12d30 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48  Handler = xBusyH
12d40 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72  andler;.  pPager
12d50 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
12d60 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  g = pBusyHandler
12d70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Arg;.}../*.** Se
12d80 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  t the reinitiali
12d90 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  zer for this pag
12da0 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
12db0 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  , the reinitiali
12dc0 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  zer.** is called
12dd0 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   when the conten
12de0 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63  t of a page in c
12df0 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
12e00 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
12e10 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72  .** value as a r
12e20 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62  esult of a rollb
12e30 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61  ack.  The callba
12e40 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d  ck gives higher-
12e50 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e  level code.** an
12e60 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
12e70 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52  restore the EXTR
12e80 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72  A section to agr
12e90 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
12ea0 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74  ored.** page dat
12eb0 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  a..*/.void sqlit
12ec0 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74  e3PagerSetReinit
12ed0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
12ee0 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74  , void (*xReinit
12ef0 29 28 44 62 50 61 67 65 2a 29 29 7b 0a 20 20 70  )(DbPage*)){.  p
12f00 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
12f10 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f   = xReinit;.}../
12f20 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67  *.** Set the pag
12f30 65 20 73 69 7a 65 20 74 6f 20 2a 70 50 61 67 65  e size to *pPage
12f40 53 69 7a 65 2e 20 49 66 20 74 68 65 20 73 75 67  Size. If the sug
12f50 67 65 73 74 20 6e 65 77 20 70 61 67 65 20 73 69  gest new page si
12f60 7a 65 20 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f  ze is.** inappro
12f70 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20  priate, then an 
12f80 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65  alternative page
12f90 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
12fa0 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65  that.** value be
12fb0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
12fc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
12fd0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50  gerSetPagesize(P
12fe0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31  ager *pPager, u1
12ff0 36 20 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a 20  6 *pPageSize){. 
13000 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72   int rc = pPager
13010 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28  ->errCode;.  if(
13020 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13030 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65 53 69  {.    u16 pageSi
13040 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b  ze = *pPageSize;
13050 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
13060 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67  eSize==0 || (pag
13070 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
13080 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
13090 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b  AX_PAGE_SIZE) );
130a0 0a 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a  .    if( pageSiz
130b0 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70  e && pageSize!=p
130c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
130d0 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72  .     && (pPager
130e0 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50  ->memDb==0 || pP
130f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29  ager->dbSize==0)
13100 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
13110 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
13120 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
13130 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
13140 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63   char *pNew = (c
13150 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
13160 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65  eMalloc(pageSize
13170 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  );.      if( !pN
13180 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ew ){.        rc
13190 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
131a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
131b0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
131c0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
131d0 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
131e0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
131f0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
13200 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20 73 65 74  ger->memDb ) set
13210 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
13220 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
13230 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
13240 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
13250 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
13260 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77  pTmpSpace = pNew
13270 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13280 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69  3PcacheSetPageSi
13290 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
132a0 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  he, pageSize);. 
132b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
132c0 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75   *pPageSize = (u
132d0 31 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  16)pPager->pageS
132e0 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ize;.  }.  retur
132f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
13300 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
13310 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
13320 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
13330 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
13340 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
13350 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
13360 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
13370 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
13380 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
13390 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
133a0 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
133b0 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
133c0 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
133d0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
133e0 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
133f0 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
13400 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
13410 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
13420 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
13430 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
13440 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
13450 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
13460 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
13470 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
13480 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
13490 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
134a0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
134b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
134c0 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
134d0 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
134e0 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
134f0 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
13500 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
13510 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
13520 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
13530 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
13540 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
13550 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
13560 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
13570 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
13580 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
13590 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
135a0 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
135b0 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
135c0 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
135d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
135e0 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
135f0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
13600 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
13610 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67  ge>0 ){.    pPag
13620 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50  er->mxPgno = mxP
13630 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  age;.  }.  sqlit
13640 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
13650 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72  (pPager, 0);.  r
13660 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78  eturn pPager->mx
13670 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Pgno;.}../*.** T
13680 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
13690 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
136a0 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
136b0 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
136c0 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
136d0 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
136e0 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
136f0 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
13700 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
13710 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
13720 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
13730 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
13740 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
13750 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
13760 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
13770 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
13780 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
13790 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
137a0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
137b0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
137c0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
137d0 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
137e0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
137f0 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
13800 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69  ved_cnt;.void di
13810 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
13820 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
13830 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
13840 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
13850 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
13860 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
13870 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
13880 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
13890 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
138a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
138b0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
138c0 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
138d0 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  se.# define disa
138e0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
138f0 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
13900 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
13910 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
13920 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
13930 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
13940 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
13950 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
13960 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
13970 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
13980 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
13990 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e  No error checkin
139a0 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72  g is done. The r
139b0 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73  ational for this
139c0 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
139d0 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62  nction .** may b
139e0 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66  e called even if
139f0 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
13a00 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74  ot exist or cont
13a10 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e  ain a header. In
13a20 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73   .** these cases
13a30 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29   sqlite3OsRead()
13a40 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20   will return an 
13a50 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20  error, to which 
13a60 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20  the correct .** 
13a70 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a  response is to z
13a80 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ero the memory a
13a90 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74  t pDest and cont
13aa0 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f  inue.  A real IO
13ab0 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20   error .** will 
13ac0 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72  presumably recur
13ad0 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75   and be picked u
13ae0 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54  p later (Todo: T
13af0 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29  hink about this)
13b00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13b10 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
13b20 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
13b30 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
13b40 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
13b50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13b60 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
13b70 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
13b80 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
13b90 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
13ba0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
13bb0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64    if( pPager->fd
13bc0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
13bd0 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44    IOTRACE(("DBHD
13be0 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50  R %p 0 %d\n", pP
13bf0 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63  ager, N)).    rc
13c00 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
13c10 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65  (pPager->fd, pDe
13c20 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69  st, N, 0);.    i
13c30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
13c40 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
13c50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
13c60 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
13c70 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
13c80 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
13c90 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
13ca0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
13cb0 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69  disk file associ
13cc0 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61  ated with.** pPa
13cd0 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ger. .**.** If t
13ce0 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  he PENDING_BYTE 
13cf0 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  lies on the page
13d00 20 64 69 72 65 63 74 6c 79 20 61 66 74 65 72 20   directly after 
13d10 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
13d20 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e  * file, then con
13d30 73 69 64 65 72 20 74 68 69 73 20 70 61 67 65 20  sider this page 
13d40 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
13d50 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c   too. For exampl
13d60 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47  e, if.** PENDING
13d70 5f 42 59 54 45 20 69 73 20 62 79 74 65 20 34 30  _BYTE is byte 40
13d80 39 36 20 28 74 68 65 20 66 69 72 73 74 20 62 79  96 (the first by
13d90 74 65 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e  te of page 5) an
13da0 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
13db0 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39  e.** file is 409
13dc0 36 20 62 79 74 65 73 2c 20 35 20 69 73 20 72 65  6 bytes, 5 is re
13dd0 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f  turned instead o
13de0 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  f 4..*/.int sqli
13df0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
13e00 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
13e10 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
13e20 20 69 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e   i64 n = 0;.  in
13e30 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
13e40 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69  pPager!=0 );.  i
13e50 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
13e60 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
13e70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
13e80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13e90 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
13ea0 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a  >dbSizeValid ){.
13eb0 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e      n = pPager->
13ec0 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65  dbSize;.  } else
13ed0 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50   {.    assert(pP
13ee0 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
13ef0 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  ds||pPager->temp
13f00 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 28  File);.    if( (
13f10 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
13f20 68 6f 64 73 29 0a 20 20 20 20 20 26 26 20 28 72  hods).     && (r
13f30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
13f40 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
13f50 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f  , &n))!=SQLITE_O
13f60 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  K ){.      pager
13f70 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
13f80 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  c);.      return
13f90 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
13fa0 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67  f( n>0 && n<pPag
13fb0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
13fc0 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20        n = 1;.   
13fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
13fe0 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  /= pPager->pageS
13ff0 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ize;.    }.    i
14000 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
14010 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
14020 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
14030 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 6e  dbSize = (Pgno)n
14040 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
14050 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 28 50 67  dbFileSize = (Pg
14060 6e 6f 29 6e 3b 0a 20 20 20 20 20 20 70 50 61 67  no)n;.      pPag
14070 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
14080 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
14090 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47   if( n==(PENDING
140a0 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61  _BYTE/pPager->pa
140b0 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e  geSize) ){.    n
140c0 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  ++;.  }.  if( n>
140d0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
140e0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
140f0 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 3b 0a  Pgno = (Pgno)n;.
14100 20 20 7d 0a 20 20 69 66 28 20 70 6e 50 61 67 65    }.  if( pnPage
14110 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65 20   ){.    *pnPage 
14120 3d 20 28 69 6e 74 29 6e 3b 0a 20 20 7d 0a 20 20  = (int)n;.  }.  
14130 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14140 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  ;.}../*.** Forwa
14150 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
14160 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
14170 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29  cJournal(Pager*)
14180 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  ;../*.** Try to 
14190 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e  obtain a lock on
141a0 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65   a file.  Invoke
141b0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
141c0 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a  ck if the lock.*
141d0 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  * is currently n
141e0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52  ot available.  R
141f0 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20  epeat until the 
14200 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
14210 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f  turns.** false o
14220 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b  r until the lock
14230 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
14240 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
14250 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
14260 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
14270 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
14280 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a  in.** the lock..
14290 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
142a0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
142b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
142c0 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
142d0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
142e0 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65  he OS lock value
142f0 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  s must be the sa
14300 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20  me as the Pager 
14310 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20  lock values */. 
14320 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53   assert( PAGER_S
14330 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f  HARED==SHARED_LO
14340 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
14350 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d  PAGER_RESERVED==
14360 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
14370 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
14380 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c  _EXCLUSIVE==EXCL
14390 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
143a0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
143b0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c  is currently unl
143c0 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73  ocked then the s
143d0 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e  ize must be unkn
143e0 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  own */.  assert(
143f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
14400 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
14410 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
14420 6c 69 64 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  lid==0 );..  if(
14430 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
14440 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
14450 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20    }else{.    do 
14470 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
14480 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
14490 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29  r->fd, locktype)
144a0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
144b0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
144c0 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
144d0 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
144e0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29  usyHandlerArg) )
144f0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
14500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14510 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
14520 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20   (u8)locktype;. 
14530 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
14540 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
14550 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29  ager, locktype))
14560 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
14570 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14580 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   Truncate the fi
14590 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  le to the number
145a0 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66   of pages specif
145b0 69 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  ied. .**.** Unle
145c0 73 73 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  ss an IO error o
145d0 63 63 75 72 73 2c 20 74 68 69 73 20 66 75 6e 63  ccurs, this func
145e0 74 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65  tion is guarante
145f0 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  ed to modify the
14600 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
14610 6c 65 20 69 74 73 65 6c 66 2e 20 49 66 20 61 6e  le itself. If an
14620 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
14630 69 73 20 6e 6f 74 20 68 65 6c 64 20 77 68 65 6e  is not held when
14640 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
14650 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 6f 6e 65  * is called, one
14660 20 69 73 20 6f 62 74 61 69 6e 65 64 20 62 65 66   is obtained bef
14670 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67 20 74  ore truncating t
14680 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  he file..*/.int 
14690 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
146a0 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
146b0 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
146c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
146d0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
146e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
146f0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
14700 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
14710 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
14720 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65   0);.  if( pPage
14730 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
14740 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
14750 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 20  rrCode;.  }else 
14760 69 66 28 20 6e 50 61 67 65 3c 70 50 61 67 65 72  if( nPage<pPager
14770 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
14780 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
14790 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
147a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
147b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
147c0 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  Get an exclusive
147d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
147e0 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 72 75  abase before tru
147f0 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ncating. */.    
14800 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
14810 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
14820 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
14830 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
14840 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14850 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
14860 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
14870 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 20 20  er, nPage);.    
14880 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
14890 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
148a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
148b0 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  ACUUM./*.** Trun
148c0 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
148d0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
148e0 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20   image to nPage 
148f0 70 61 67 65 73 2e 20 55 6e 6c 69 6b 65 0a 2a 2a  pages. Unlike.**
14900 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
14910 6e 63 61 74 65 28 29 2c 20 74 68 69 73 20 66 75  ncate(), this fu
14920 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
14930 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20  actually modify 
14940 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
14950 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74  file on disk. It
14960 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69   just sets the i
14970 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
14980 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 6f 62   the pager.** ob
14990 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65  ject so that the
149a0 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
149b0 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
149c0 65 20 63 75 72 72 65 6e 74 20 0a 2a 2a 20 74 72  e current .** tr
149d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
149e0 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  mitted..*/.void 
149f0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
14a00 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20  cateImage(Pager 
14a10 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
14a20 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
14a30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
14a40 6c 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  lid );.  assert(
14a50 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
14a60 3d 6e 50 61 67 65 20 29 3b 0a 20 20 70 50 61 67  =nPage );.  pPag
14a70 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
14a80 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ge;.}../*.** Ret
14a90 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
14aa0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
14ab0 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20  base file image 
14ac0 69 6e 20 70 61 67 65 73 2e 20 54 68 69 73 0a 2a  in pages. This.*
14ad0 2a 20 66 75 6e 63 74 69 6f 6e 20 64 69 66 66 65  * function diffe
14ae0 72 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 50  rs from sqlite3P
14af0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20  agerPagecount() 
14b00 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a 0a  in two ways:.**.
14b10 2a 2a 20 20 61 29 20 49 74 20 6d 61 79 20 6f 6e  **  a) It may on
14b20 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ly be called whe
14b30 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72  n at least one r
14b40 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 64 61  eference to a da
14b50 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 70 61  tabase.**     pa
14b60 67 65 20 69 73 20 68 65 6c 64 2e 20 54 68 69 73  ge is held. This
14b70 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
14b80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
14b90 7a 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  ze is already.**
14ba0 20 20 20 20 20 6b 6e 6f 77 6e 20 61 6e 64 20 61       known and a
14bb0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
14bc0 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 69 73 20  OsFileSize() is 
14bd0 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a  not required..**
14be0 0a 2a 2a 20 20 62 29 20 54 68 65 20 72 65 74 75  .**  b) The retu
14bf0 72 6e 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20  rn value is not 
14c00 61 64 6a 75 73 74 65 64 20 66 6f 72 20 74 68 65  adjusted for the
14c10 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 2e 0a 2a   locking page..*
14c20 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
14c30 67 65 72 49 6d 61 67 65 53 69 7a 65 28 50 61 67  gerImageSize(Pag
14c40 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
14c50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
14c60 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20  bSizeValid );.  
14c70 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 64  return pPager->d
14c80 62 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20  bSize;.}.#endif 
14c90 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54   /* ifndef SQLIT
14ca0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
14cb0 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  M */../*.** Shut
14cc0 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
14cd0 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
14ce0 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
14cf0 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
14d00 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
14d10 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
14d20 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
14d30 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
14d40 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
14d50 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
14d60 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
14d70 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
14d80 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
14d90 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
14da0 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
14db0 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
14dc0 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
14dd0 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
14de0 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
14df0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
14e00 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
14e10 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
14e20 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  edump..**.** Thi
14e30 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
14e40 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61  s succeeds. If a
14e50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
14e60 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70  active an attemp
14e70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
14e80 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66  roll it back. If
14e90 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
14ea0 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
14eb0 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a  back .** a hot j
14ec0 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65  ournal may be le
14ed0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ft in the filesy
14ee0 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f  stem but no erro
14ef0 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  r is returned.**
14f00 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
14f10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
14f20 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a  gerClose(Pager *
14f30 70 50 61 67 65 72 29 7b 0a 0a 20 20 64 69 73 61  pPager){..  disa
14f40 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
14f50 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c  _errors();.  sql
14f60 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
14f70 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67 65  alloc();.  pPage
14f80 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a  r->errCode = 0;.
14f90 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
14fa0 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70  iveMode = 0;.  p
14fb0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
14fc0 72 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42  r);.  if( !MEMDB
14fd0 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 50   ){.    /* Set P
14fe0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48 64 72 20  ager.journalHdr 
14ff0 74 6f 20 2d 31 20 66 6f 72 20 74 68 65 20 62 65  to -1 for the be
15000 6e 65 66 69 74 20 6f 66 20 74 68 65 20 70 61 67  nefit of the pag
15010 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 0a 20  er_playback() . 
15020 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68 69 63 68     ** call which
15030 20 6d 61 79 20 62 65 20 6d 61 64 65 20 66 72 6f   may be made fro
15040 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 55 6e  m within pagerUn
15050 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
15060 29 2e 20 49 66 20 69 74 0a 20 20 20 20 2a 2a 20  ). If it.    ** 
15070 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68 65 6e 20  is not -1, then 
15080 74 68 65 20 75 6e 73 79 6e 63 65 64 20 70 6f 72  the unsynced por
15090 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70 65 6e 20  tion of an open 
150a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
150b0 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c 61 79 65  .    ** be playe
150c0 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
150d0 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70  database. If a p
150e0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
150f0 75 72 73 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a  urs while.    **
15100 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
15110 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ng, the database
15120 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 72 72   may become corr
15130 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  upt..    */.    
15140 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
15150 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20 70 61 67  dr = -1;.    pag
15160 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
15170 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
15180 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  .  enable_simula
15190 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
151a0 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
151b0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 50  ignMalloc();.  P
151c0 41 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f 53  AGERTRACE2("CLOS
151d0 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  E %d\n", PAGERID
151e0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54  (pPager));.  IOT
151f0 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c  RACE(("CLOSE %p\
15200 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 69  n", pPager)).  i
15210 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
15220 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  alOpen ){.    sq
15230 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
15240 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20  ger->jfd);.  }. 
15250 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
15260 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
15270 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 73 71 6c  nJournal);.  sql
15280 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
15290 79 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79  y(pPager->pAlway
152a0 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 72 65  sRollback);.  re
152b0 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
152c0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c  t(pPager);.  sql
152d0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
152e0 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65  er->fd);.  /* Te
152f0 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74  mp files are aut
15300 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
15310 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a  ed by the OS.  *
15320 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65  * if( pPager->te
15330 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20  mpFile ){.  **  
15340 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
15350 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
15360 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f  me);.  ** }.  */
15370 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ..  sqlite3PageF
15380 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
15390 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65  Space);.  sqlite
153a0 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
153b0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
153c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
153d0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
153e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
153f0 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
15400 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
15410 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
15420 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
15430 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
15440 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e  given page data.
15450 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
15460 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
15470 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65  DbPage *p){.  re
15480 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a  turn p->pgno;.}.
15490 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
154a0 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
154b0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
154c0 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
154d0 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
154e0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
154f0 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
15500 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
15510 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
15520 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  g){.  sqlite3Pca
15530 63 68 65 52 65 66 28 70 50 67 29 3b 0a 20 20 72  cheRef(pPg);.  r
15540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
15560 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
15570 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
15580 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
15590 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
155a0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
155b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
155c0 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
155d0 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
155e0 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20  of the.** disk. 
155f0 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
15600 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72  to modify the or
15610 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
15620 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72  file until after
15630 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
15640 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
15650 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61    If the origina
15660 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f  l database is mo
15670 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a  dified before.**
15680 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
15690 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77  synced and a pow
156a0 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
156b0 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  s, the unsynced 
156c0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20  journal.** data 
156d0 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e  would be lost an
156e0 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e  d we would be un
156f0 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  able to complete
15700 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a  ly rollback the.
15710 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
15720 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63  ges.  Database c
15730 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20  orruption would 
15740 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  occur..** .** Th
15750 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
15760 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63  updates the nRec
15770 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65   field in the he
15780 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
15790 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d  nal..** (See com
157a0 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67  ments on the pag
157b0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
157c0 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
157d0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
157e0 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e  .).** If the syn
157f0 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20  c mode is FULL, 
15800 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f  two syncs will o
15810 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65  ccur.  First the
15820 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a   whole journal.*
15830 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65  * is synced, the
15840 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
15850 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65   is updated, the
15860 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20  n a second sync 
15870 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  occurs..**.** Fo
15880 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
15890 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74  bases, we do not
158a0 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20   care if we are 
158b0 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
158c0 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65  .** after a powe
158d0 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f  r failure, so no
158e0 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
158f0 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f 43 41 50  .** If the IOCAP
15900 5f 53 45 51 55 45 4e 54 49 41 4c 20 66 6c 61 67  _SEQUENTIAL flag
15910 20 69 73 20 73 65 74 20 66 6f 72 20 74 68 65 20   is set for the 
15920 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
15930 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65   on which.** the
15940 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 6f   database is sto
15950 72 65 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63  red, then OsSync
15960 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
15970 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
15980 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68  l.** file. In th
15990 69 73 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74  is case all that
159a0 20 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20   is required is 
159b0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 6e 52  to update the nR
159c0 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74  ec field in.** t
159d0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
159e0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
159f0 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
15a00 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
15a10 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
15a20 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
15a30 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
15a40 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
15a50 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
15a60 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
15a70 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53  LITE_OK;..  /* S
15a80 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
15a90 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67  before modifying
15aa0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
15ab0 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e  se.  ** (assumin
15ac0 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75  g there is a jou
15ad0 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64  rnal and it need
15ae0 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29  s to be synced.)
15af0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
15b00 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
15b10 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
15b20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
15b30 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
15b40 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
15b50 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
15b60 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
15b70 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
15b80 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
15b90 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
15ba0 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
15bb0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
15bc0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20  nalOpen );..    
15bd0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
15be0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
15bf0 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
15c00 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
15c10 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
15c20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15c30 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
15c40 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
15c50 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
15c60 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
15c70 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
15c80 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
15c90 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
15ca0 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
15cb0 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
15cc0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
15cd0 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
15ce0 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
15cf0 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
15d00 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
15d10 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
15d20 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
15d30 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
15d40 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
15d50 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
15d60 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
15d70 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
15d80 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
15d90 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
15da0 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
15db0 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
15dc0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
15dd0 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
15de0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
15df0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
15e00 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
15e10 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
15e20 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
15e30 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
15e40 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
15e50 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
15e60 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 72  /.        i64 jr
15e70 6e 6c 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69  nlOff;.        i
15e80 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
15e90 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
15ea0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
15eb0 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
15ec0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32       PAGERTRACE2
15ed0 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
15ee0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
15ef0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
15f00 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
15f10 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
15f20 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
15f30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
15f40 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
15f50 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
15f60 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
15f70 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
15f80 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
15f90 20 20 20 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20          jrnlOff 
15fa0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
15fb0 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a  lHdr + sizeof(aJ
15fc0 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20  ournalMagic);.  
15fd0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
15fe0 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
15ff0 6e 22 2c 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c  n", pPager, jrnl
16000 4f 66 66 2c 20 34 29 29 3b 0a 20 20 20 20 20 20  Off, 4));.      
16010 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
16020 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
16030 6a 72 6e 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  jrnlOff, pPager-
16040 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20  >nRec);.        
16050 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
16060 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
16070 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
16080 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
16090 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
160a0 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
160b0 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
160c0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
160d0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
160e0 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
160f0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
16100 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
16110 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
16120 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
16130 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20  sync_flags| .   
16140 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
16150 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49  sync_flags==SQLI
16160 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c  TE_SYNC_FULL?SQL
16170 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
16180 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Y:0).        );.
16190 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
161a0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
161b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
161c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
161d0 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ted = 1;.    }. 
161e0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
161f0 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
16200 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53   Erase the needS
16210 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76  ync flag from ev
16220 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ery page..    */
16230 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
16240 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
16250 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
16260 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
16270 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
16280 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61  ven a list of pa
16290 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62  ges (connected b
162a0 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
162b0 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74  ty pointer) writ
162c0 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f  e.** every one o
162d0 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75  f those pages ou
162e0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
162f0 65 20 66 69 6c 65 2e 20 4e 6f 20 63 61 6c 6c 73  e file. No calls
16300 20 61 72 65 20 6d 61 64 65 0a 2a 2a 20 74 6f 20   are made.** to 
16310 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 74  the page-cache t
16320 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 73  o mark the pages
16330 20 61 73 20 63 6c 65 61 6e 2e 20 49 74 20 69 73   as clean. It is
16340 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
16350 69 74 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61  ity.** of the ca
16360 6c 6c 65 72 20 74 6f 20 75 73 65 20 50 63 61 63  ller to use Pcac
16370 68 65 43 6c 65 61 6e 41 6c 6c 28 29 20 6f 72 20  heCleanAll() or 
16380 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
16390 29 20 74 6f 20 6d 61 72 6b 0a 2a 2a 20 74 68 65  ) to mark.** the
163a0 20 70 61 67 65 73 20 61 73 20 63 6c 65 61 6e 2e   pages as clean.
163b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
163c0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
163d0 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
163e0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
163f0 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
16400 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
16410 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16420 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69  ;.  pPager = pLi
16430 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  st->pPager;..  /
16440 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
16450 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74  there may be eit
16460 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  her a RESERVED o
16470 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
16480 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
16490 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
164a0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
164b0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
164c0 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  k, the following
164d0 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  .  ** calls to s
164e0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61  qlite3OsLock() a
164f0 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a  re no-ops..  **.
16500 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
16510 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
16520 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
16530 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
16540 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
16550 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
16560 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
16570 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
16580 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
16590 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
165a0 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
165b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
165c0 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
165d0 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
165e0 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
165f0 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
16600 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
16610 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
16620 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
16630 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
16640 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
16650 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
16660 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
16670 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
16680 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
16690 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
166a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
166b0 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
166c0 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
166d0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
166e0 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
166f0 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
16700 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
16710 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
16720 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
16730 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
16740 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
16750 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16760 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
16770 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
16780 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
16790 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
167a0 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
167b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
167c0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
167d0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
167e0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
167f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
16800 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
16810 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a  while( pList ){.
16820 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
16830 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
16840 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
16850 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20  n it now. */.   
16860 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64   if( !pPager->fd
16870 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
16880 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
16890 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
168a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
168b0 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  PagerOpentemp(pP
168c0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64  ager, pPager->fd
168d0 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61  , pPager->vfsFla
168e0 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  gs);.      if( r
168f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
16900 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
16910 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
16920 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
16930 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
16940 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
16950 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
16960 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
16970 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61   means sqlite3Pa
16980 67 65 72 54 72 75 6e 63 61 74 65 28 29 20 77 61  gerTruncate() wa
16990 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
169a0 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
169b0 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
169c0 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
169d0 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
169e0 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
169f0 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
16a00 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
16a10 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  /.    if( pList-
16a20 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
16a30 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69  bSize && 0==(pLi
16a40 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
16a50 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20  DONT_WRITE) ){. 
16a60 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
16a70 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31  = (pList->pgno-1
16a80 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
16a90 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 63  ageSize;.      c
16aa0 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44  har *pData = COD
16ab0 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73  EC2(pPager, pLis
16ac0 74 2d 3e 70 44 61 74 61 2c 20 70 4c 69 73 74 2d  t->pData, pList-
16ad0 3e 70 67 6e 6f 2c 20 36 29 3b 0a 0a 20 20 20 20  >pgno, 6);..    
16ae0 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 53    PAGERTRACE4("S
16af0 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
16b00 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
16b30 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
16b40 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
16b50 4c 69 73 74 29 29 3b 0a 20 20 20 20 20 20 49 4f  List));.      IO
16b60 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
16b70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
16b80 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pList->pgno));. 
16b90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16ba0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
16bb0 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
16bc0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
16bd0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 50 41 47  fset);.      PAG
16be0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
16bf0 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
16c00 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45  unt);.      PAGE
16c10 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
16c20 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69 66  Write);.      if
16c30 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
16c40 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
16c50 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
16c60 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32  leVers, &pData[2
16c70 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  4], sizeof(pPage
16c80 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
16c90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16ca0 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70  f( pList->pgno>p
16cb0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
16cc0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  e ){.        pPa
16cd0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
16ce0 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 20  = pList->pgno;. 
16cf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
16d00 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
16d10 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
16d20 52 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45  RTRACE3("NOSTORE
16d30 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
16d40 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
16d50 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
16d60 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
16d70 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
16d80 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
16d90 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
16da0 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
16db0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
16dc0 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
16dd0 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
16de0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
16df0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
16e00 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
16e10 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  dd the page to t
16e20 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
16e30 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72  It is the caller
16e40 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  s responsibility
16e50 20 74 6f 0a 2a 2a 20 75 73 65 20 73 75 62 6a 52   to.** use subjR
16e60 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f  equiresPage() to
16e70 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 69   check that it i
16e80 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  s really require
16e90 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 63 61 6c  d before .** cal
16ea0 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
16eb0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
16ec0 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
16ed0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
16ee0 69 6e 74 20 72 63 3b 0a 20 20 76 6f 69 64 20 2a  int rc;.  void *
16ef0 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
16f00 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ta;.  Pager *pPa
16f10 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
16f20 72 3b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  r;.  i64 offset 
16f30 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  = pPager->stmtNR
16f40 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
16f50 67 65 53 69 7a 65 29 3b 0a 20 20 63 68 61 72 20  geSize);.  char 
16f60 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32  *pData2 = CODEC2
16f70 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
16f80 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 0a  pPg->pgno, 7);..
16f90 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53    PAGERTRACE3("S
16fa0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
16fb0 61 67 65 20 25 64 20 40 20 25 64 5c 6e 22 2c 20  age %d @ %d\n", 
16fc0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
16fd0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20   pPg->pgno);..  
16fe0 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f  assert( pageInJo
16ff0 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50  urnal(pPg) || pP
17000 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
17010 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20  dbOrigSize );.  
17020 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
17030 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f  (pPager->sjfd, o
17040 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
17050 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
17060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
17070 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
17080 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
17090 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
170a0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
170b0 2b 34 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  +4);.  }.  if( r
170c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
170d0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
170e0 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65  NRec++;.    asse
170f0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
17100 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20  epoint>0 );.    
17110 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  rc = addToSavepo
17120 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
17130 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
17140 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17150 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
17160 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
17170 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  d by the pcache 
17180 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61  layer when it ha
17190 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a  s reached some.*
171a0 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69  * soft memory li
171b0 6d 69 74 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  mit. The argumen
171c0 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
171d0 6f 20 61 20 70 75 72 67 65 61 62 6c 65 20 50 61  o a purgeable Pa
171e0 67 65 72 20 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20  ger .** object. 
171f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
17200 74 65 6d 70 74 73 20 74 6f 20 6d 61 6b 65 20 61  tempts to make a
17210 20 73 69 6e 67 6c 65 20 64 69 72 74 79 20 70 61   single dirty pa
17220 67 65 20 74 68 61 74 20 68 61 73 20 6e 6f 0a 2a  ge that has no.*
17230 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  * outstanding re
17240 66 65 72 65 6e 63 65 73 20 28 69 66 20 6f 6e 65  ferences (if one
17250 20 65 78 69 73 74 73 29 20 63 6c 65 61 6e 20 73   exists) clean s
17260 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
17270 20 72 65 63 79 63 6c 65 64 20 0a 2a 2a 20 62 79   recycled .** by
17280 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   the pcache laye
17290 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
172a0 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
172b0 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
172c0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
172d0 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
172e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
172f0 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
17300 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
17310 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
17320 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
17330 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
17340 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
17350 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
17360 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
17370 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  OK ){.    if( pP
17380 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
17390 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
173a0 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
173b0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
173c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
173d0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66  _OK && pPager->f
173e0 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20 20 20  ullSync && .    
173f0 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e 6a 6f      !(pPager->jo
17400 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
17410 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
17420 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20 20 20  ORY) &&.        
17430 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  !(sqlite3OsDevic
17440 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
17450 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
17460 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
17470 50 50 45 4e 44 29 0a 20 20 20 20 20 20 29 7b 0a  PPEND).      ){.
17480 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17490 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
174a0 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
174b0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
174c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
174d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
174e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67  _OK ){.      pPg
174f0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
17500 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
17510 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o>pPager->dbSize
17520 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73   && subjRequires
17530 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
17540 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
17550 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
17560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
17570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17580 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
17590 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
175a0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ist(pPg);.      
175b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
175c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
175d0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
175e0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
175f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
17600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17610 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
17620 33 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67  3("STRESS %d pag
17630 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
17640 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
17650 67 6e 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  gno);.    sqlite
17660 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
17670 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
17680 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
17690 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  * Return 1 if th
176a0 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
176b0 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65  rnal on the give
176c0 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f  n pager..** A ho
176d0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
176e0 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
176f0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a  e played back..*
17700 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
17710 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
17720 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
17730 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
17740 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
17750 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
17760 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
17770 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
17780 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
17790 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
177a0 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65  e name.  Just de
177b0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
177c0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ..**.** Return n
177d0 65 67 61 74 69 76 65 20 69 66 20 75 6e 61 62 6c  egative if unabl
177e0 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
177f0 68 65 20 73 74 61 74 75 73 20 6f 66 20 74 68 65  he status of the
17800 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
17810 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
17820 73 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 6a  s not open the j
17830 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
17840 78 61 6d 69 6e 65 20 69 74 73 0a 2a 2a 20 63 6f  xamine its.** co
17850 6e 74 65 6e 74 2e 20 20 48 65 6e 63 65 2c 20 74  ntent.  Hence, t
17860 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
17870 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d   contain the nam
17880 65 20 6f 66 20 61 20 6d 61 73 74 65 72 0a 2a 2a  e of a master.**
17890 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
178a0 61 74 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65  at has been dele
178b0 74 65 64 2c 20 61 6e 64 20 68 65 6e 63 65 20 6e  ted, and hence n
178c0 6f 74 20 62 65 20 68 6f 74 2e 20 20 4f 72 0a 2a  ot be hot.  Or.*
178d0 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  * the header of 
178e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
178f0 74 20 62 65 20 7a 65 72 6f 65 64 20 6f 75 74 2e  t be zeroed out.
17900 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
17910 2a 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 63 6f  * does not disco
17920 76 65 72 20 74 68 65 73 65 20 63 61 73 65 73 20  ver these cases 
17930 6f 66 20 61 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75  of a non-hot jou
17940 72 6e 61 6c 20 2d 20 69 66 20 74 68 65 0a 2a 2a  rnal - if the.**
17950 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
17960 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20  ists and is not 
17970 65 6d 70 74 79 20 74 68 69 73 20 72 6f 75 74 69  empty this routi
17980 6e 65 20 61 73 73 75 6d 65 73 20 69 74 0a 2a 2a  ne assumes it.**
17990 20 69 73 20 68 6f 74 2e 20 20 54 68 65 20 70 61   is hot.  The pa
179a0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
179b0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63  outine will disc
179c0 6f 76 65 72 20 74 68 61 74 20 74 68 65 0a 2a 2a  over that the.**
179d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
179e0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20   not really hot 
179f0 61 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a  and will no-op..
17a00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
17a10 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
17a20 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
17a30 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
17a40 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
17a50 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
17a60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17a70 4f 4b 3b 0a 20 20 69 6e 74 20 65 78 69 73 74 73  OK;.  int exists
17a80 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 6f 63 6b   = 0;.  int lock
17a90 65 64 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ed = 0;.  assert
17aa0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
17ab0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17ac0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
17ad0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17ae0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b  >fd->pMethods );
17af0 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
17b00 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
17b10 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
17b20 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
17b30 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
17b40 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
17b50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17b60 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
17b70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17b80 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
17b90 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
17ba0 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 7d 0a 20   &locked);.  }. 
17bb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17bc0 4f 4b 20 26 26 20 65 78 69 73 74 73 20 26 26 20  OK && exists && 
17bd0 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 69  !locked ){.    i
17be0 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 72 63  nt nPage;.    rc
17bf0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
17c00 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
17c10 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66   &nPage);.    if
17c20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17c30 29 7b 0a 20 20 20 20 20 69 66 28 20 6e 50 61 67  ){.     if( nPag
17c40 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
17c50 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
17c60 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
17c70 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
17c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17c90 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20   *pExists = 1;. 
17ca0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
17cb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17cc0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
17cd0 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
17ce0 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64  pPg out of the d
17cf0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
17d00 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
17d10 44 62 50 61 67 65 28 50 61 67 65 72 20 2a 70 50  DbPage(Pager *pP
17d20 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67  ager, PgHdr *pPg
17d30 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
17d40 69 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 6f 66  int rc;.  i64 of
17d50 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20  fset;.  assert( 
17d60 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73  MEMDB==0 );.  as
17d70 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
17d80 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
17d90 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
17da0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d  if( !pPager->fd-
17db0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
17dc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
17dd0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
17de0 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
17df0 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
17e00 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
17e10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17e20 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
17e30 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 61   pPg->pData, pPa
17e40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
17e50 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45 52 5f  ffset);.  PAGER_
17e60 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
17e70 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29  er_readdb_count)
17e80 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70  ;.  PAGER_INCR(p
17e90 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20  Pager->nRead);. 
17ea0 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20   IOTRACE(("PGIN 
17eb0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
17ec0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20  , pgno));.  if( 
17ed0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 6d  pgno==1 ){.    m
17ee0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
17ef0 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38  bFileVers, &((u8
17f00 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34  *)pPg->pData)[24
17f10 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f40 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
17f50 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
17f60 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
17f70 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
17f80 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
17f90 50 41 47 45 52 54 52 41 43 45 34 28 22 46 45 54  PAGERTRACE4("FET
17fa0 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
17fb0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
17fd0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
17fe0 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  ->pgno, pager_pa
17ff0 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 20 20  gehash(pPg));.  
18000 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
18010 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
18020 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
18030 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61 72 65  obtain the share
18040 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65 64 20  d lock required 
18050 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d  before.** data m
18060 61 79 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ay be read from 
18070 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
18080 20 49 66 20 74 68 65 20 73 68 61 72 65 64 20 6c   If the shared l
18090 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64 79 0a  ock has already.
180a0 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ** been obtained
180b0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
180c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
180d0 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  * Immediately af
180e0 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20 74 68  ter obtaining th
180f0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 28 69  e shared lock (i
18100 66 20 72 65 71 75 69 72 65 64 29 2c 20 74 68 69  f required), thi
18110 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68  s function.** ch
18120 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d 6a  ecks for a hot-j
18130 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
18140 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e  one is found, an
18150 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62   emergency rollb
18160 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f 72  ack.** is perfor
18170 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  med immediately.
18180 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
18190 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50  agerSharedLock(P
181a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
181b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
181c0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 45 72 72  _OK;.  int isErr
181d0 6f 72 52 65 73 65 74 20 3d 20 30 3b 0a 0a 20 20  orReset = 0;..  
181e0 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
181f0 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66 6f  ase is opened fo
18200 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  r exclusive acce
18210 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  ss, has no outst
18220 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61 67  anding .  ** pag
18230 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  e references and
18240 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d   is in an error-
18250 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 74 68  state, now is th
18260 65 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61  e chance to clea
18270 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72  r.  ** the error
18280 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f  . Discard the co
18290 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
182a0 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74 72  ger-cache and tr
182b0 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65  eat any.  ** ope
182c0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  n journal file a
182d0 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e  s a hot-journal.
182e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d  .  */.  if( !MEM
182f0 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78  DB && pPager->ex
18300 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
18310 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
18320 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
18330 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 26 26 20  >pPCache)==0 && 
18340 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
18350 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  .  ){.    if( pP
18360 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
18370 6e 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72  n ){.      isErr
18380 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20  orReset = 1;.   
18390 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65   }.    pPager->e
183a0 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
183b0 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65  OK;.    pager_re
183c0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  set(pPager);.  }
183d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
183e0 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 20  ger is still in 
183f0 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  an error state, 
18400 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20  do not proceed. 
18410 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20  The error .  ** 
18420 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63 6c  state will be cl
18430 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70 6f  eared at some po
18440 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
18450 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65 20  e when all page 
18460 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  .  ** references
18470 20 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e 64   are dropped and
18480 20 74 68 65 20 63 61 63 68 65 20 63 61 6e 20 62   the cache can b
18490 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20 2a  e discarded..  *
184a0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
184b0 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
184c0 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
184d0 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72  TE_FULL ){.    r
184e0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
184f0 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66  rCode;.  }..  if
18500 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
18510 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c  =PAGER_UNLOCK ||
18520 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b   isErrorReset ){
18530 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
18540 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
18550 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 69  >pVfs;.    int i
18560 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sHotJournal = 0;
18570 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
18580 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72  MDB );.    asser
18590 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
185a0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
185b0 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a  >pPCache)==0 );.
185c0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
185d0 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20  >noReadlock ){. 
185e0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
185f0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
18600 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
18610 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
18620 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
18640 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
18650 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20  ER_UNLOCK );.   
18660 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
18670 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
18680 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
18690 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
186a0 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
186b0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 7d 0a 0a  _LOCK );.    }..
186c0 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
186d0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
186e0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
186f0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
18700 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
18710 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
18720 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
18730 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
18740 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
18750 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69     */.    if( !i
18760 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20  sErrorReset ){. 
18770 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74       rc = hasHot
18780 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
18790 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a  &isHotJournal);.
187a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
187b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
187c0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
187d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
187e0 20 20 69 66 28 20 69 73 45 72 72 6f 72 52 65 73    if( isErrorRes
187f0 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72 6e  et || isHotJourn
18800 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47  al ){.      /* G
18810 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
18820 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
18830 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
18840 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
18850 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
18860 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
18870 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
18880 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
18890 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  y to the.      *
188a0 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
188b0 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e  . If it were, an
188c0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
188d0 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20  ght open the.   
188e0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
188f0 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
18900 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
18910 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
18920 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
18930 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74  tabase is safe t
18940 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69  o read while thi
18950 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  s process is sti
18960 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20  ll rolling it . 
18970 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20       ** back..  
18980 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
18990 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
189a0 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
189b0 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
189c0 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20  equested, the.  
189d0 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72      ** second pr
189e0 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74  ocess will get t
189f0 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  o this point in 
18a00 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
18a10 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 6f 62  l to.      ** ob
18a20 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43  tain its own EXC
18a30 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
18a40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18a50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18a60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
18a70 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  te<EXCLUSIVE_LOC
18a80 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
18a90 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
18aa0 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
18ab0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
18ac0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
18ad0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18ae0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
18af0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
18b00 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
18b10 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
18b20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
18b30 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
18b40 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
18b50 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f    }. .      /* O
18b60 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
18b70 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
18b80 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62  ccess. This is b
18b90 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20  ecause in .     
18ba0 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63   ** exclusive-ac
18bb0 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
18bc0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
18bd0 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
18be0 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73  and.      ** pos
18bf0 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
18c00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
18c10 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73  er on. On some s
18c20 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20  ystems, the.    
18c30 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28    ** OsTruncate(
18c40 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65  ) call used in e
18c50 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
18c60 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72  mode also requir
18c70 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65  es.      ** a re
18c80 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61  ad/write file ha
18c90 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ndle..      */. 
18ca0 20 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f       if( !isErro
18cb0 72 52 65 73 65 74 20 26 26 20 70 50 61 67 65 72  rReset && pPager
18cc0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
18cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
18ce0 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  res;.        rc 
18cf0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
18d00 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a  s(pVfs,pPager->z
18d10 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41  Journal,SQLITE_A
18d20 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65  CCESS_EXISTS,&re
18d30 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
18d40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18d50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
18d60 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
18d70 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a    int fout = 0;.
18d80 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
18d90 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
18da0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
18db0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
18dc0 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL;.            
18dd0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
18de0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
18df0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
18e00 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
18e10 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
18e20 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
18e30 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20   f, &fout);.    
18e40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18e50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
18e60 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d   pPager->jfd->pM
18e70 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20 20  ethods );.      
18e80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18e90 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
18ea0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
18eb0 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
18ec0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18ed0 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20  E_CANTOPEN;.    
18ee0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18ef0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
18f00 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
18f10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
18f20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
18f30 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
18f40 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  nal does not exi
18f50 73 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 73  st, that means s
18f60 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
18f70 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  s.            **
18f80 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f 6c   has already rol
18f90 6c 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a 20  led it back */. 
18fa0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
18fb0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
18fc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18fd0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
18fe0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18ff0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
19000 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
19010 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
19020 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
19030 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
19040 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
19050 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
19060 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
19070 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
19080 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
19090 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
190a0 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
190b0 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
190c0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
190d0 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
190e0 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
190f0 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  e.      ** lock 
19100 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
19110 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20  e read lock..   
19120 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
19130 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
19140 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
19150 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19160 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
19170 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
19180 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
19190 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
191a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
191b0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 73  assert(pPager->s
191c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
191d0 45 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  ED || .         
191e0 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
191f0 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
19200 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53  r->state>PAGER_S
19210 48 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a  HARED).      );.
19220 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73      }..    if( s
19230 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
19240 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
19250 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20  Cache)>0 ){.    
19260 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
19270 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
19280 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74  en acquired on t
19290 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
192a0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
192b0 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
192c0 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
192d0 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
192e0 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  ous.      ** rea
192f0 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
19300 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
19310 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
19320 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
19330 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
19340 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
19350 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
19360 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
19370 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
19380 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
19390 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
193a0 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
193b0 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
193c0 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
193d0 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
193e0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
193f0 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
19400 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
19410 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
19420 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
19430 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
19440 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
19450 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
19460 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
19470 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
19480 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
19490 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
194a0 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
194b0 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
194c0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
194d0 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
194e0 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
194f0 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
19500 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
19510 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
19520 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
19530 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
19540 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
19550 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
19560 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
19570 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20    */.      char 
19580 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f  dbFileVers[sizeo
19590 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
195a0 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71  Vers)];.      sq
195b0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
195c0 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  unt(pPager, 0);.
195d0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
195e0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
195f0 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65        rc = pPage
19600 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
19610 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
19620 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
19630 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19640 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20  dbSizeValid );. 
19650 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
19660 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  >dbSize>0 ){.   
19670 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43       IOTRACE(("C
19680 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20  KVERS %p %d\n", 
19690 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64  pPager, sizeof(d
196a0 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20  bFileVers)));.  
196b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
196c0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
196d0 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73  >fd, &dbFileVers
196e0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
196f0 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20  ers), 24);.     
19700 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19710 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19720 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
19730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
19740 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
19750 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c  mset(dbFileVers,
19760 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c   0, sizeof(dbFil
19770 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
19780 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63  ..      if( memc
19790 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  mp(pPager->dbFil
197a0 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
197b0 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
197c0 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20  Vers))!=0 ){.   
197d0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
197e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
197f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
19800 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  rt( pPager->excl
19810 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
19820 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45  ger->state<=PAGE
19830 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
19840 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
19850 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
19860 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
19870 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
19880 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  HARED;.    }.  }
19890 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
198a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
198b0 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75  {.    /* pager_u
198c0 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  nlock() is a no-
198d0 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  op for exclusive
198e0 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d   mode and in-mem
198f0 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a  ory databases. *
19900 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  /.    pager_unlo
19910 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
19920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19930 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
19940 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74  we have the cont
19950 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  ent for a page. 
19960 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73   If the page was
19970 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61  .** previously a
19980 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
19990 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20  ontent==1, then 
199a0 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a  the content was.
199b0 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69  ** just initiali
199c0 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73  zed to zeros ins
199d0 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65  tead of being re
199e0 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a  ad from disk..**
199f0 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64   But now we need
19a00 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f   the real data o
19a10 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20  ff of disk.  So 
19a20 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20  make sure we.** 
19a30 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69  have it.  Read i
19a40 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f  t in if we do no
19a50 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64  t have it alread
19a60 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
19a70 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
19a80 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  nt(PgHdr *pPg){.
19a90 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
19aa0 26 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  &PGHDR_NEED_READ
19ab0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
19ac0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2d   readDbPage(pPg-
19ad0 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 50  >pPager, pPg, pP
19ae0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  g->pgno);.    if
19af0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19b00 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 66 6c  ){.      pPg->fl
19b10 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
19b20 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 7d 65 6c  ED_READ;.    }el
19b30 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
19b40 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
19b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19b60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  K;.}../*.** If t
19b70 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
19b80 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a  nt has reached z
19b90 65 72 6f 2c 20 61 6e 64 20 74 68 65 20 70 61 67  ero, and the pag
19ba0 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  er is not in the
19bb0 0a 2a 2a 20 6d 69 64 64 6c 65 20 6f 66 20 61 20  .** middle of a 
19bc0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
19bd0 6e 20 6f 72 20 6f 70 65 6e 65 64 20 69 6e 20 65  n or opened in e
19be0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 75  xclusive mode, u
19bf0 6e 6c 6f 63 6b 20 69 74 2e 0a 2a 2f 20 0a 73 74  nlock it..*/ .st
19c00 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
19c10 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61  nlockIfUnused(Pa
19c20 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
19c30 69 66 28 20 28 73 71 6c 69 74 65 33 50 63 61 63  if( (sqlite3Pcac
19c40 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
19c50 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 0a  r->pPCache)==0).
19c60 20 20 20 20 26 26 20 28 21 70 50 61 67 65 72 2d      && (!pPager-
19c70 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
19c80 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
19c90 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b 0a 20 20  lOff>0) .  ){.  
19ca0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
19cb0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
19cc0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
19cd0 72 6f 70 20 61 20 70 61 67 65 20 66 72 6f 6d 20  rop a page from 
19ce0 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20  the cache using 
19cf0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
19d00 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  p()..**.** If th
19d10 69 73 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61  is means there a
19d20 72 65 20 6e 6f 77 20 6e 6f 20 70 61 67 65 73 20  re now no pages 
19d30 77 69 74 68 20 72 65 66 65 72 65 6e 63 65 73 20  with references 
19d40 74 6f 20 74 68 65 6d 2c 20 61 20 72 6f 6c 6c 62  to them, a rollb
19d50 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 20 61 6e  ack.** occurs an
19d60 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
19d70 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  e database is re
19d80 6d 6f 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  moved..*/.static
19d90 20 76 6f 69 64 20 70 61 67 65 72 44 72 6f 70 50   void pagerDropP
19da0 61 67 65 28 44 62 50 61 67 65 20 2a 70 50 67 29  age(DbPage *pPg)
19db0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
19dc0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
19dd0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
19de0 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 70 61 67  Drop(pPg);.  pag
19df0 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
19e00 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
19e10 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
19e20 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20  e..**.** A read 
19e30 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b  lock on the disk
19e40 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65   file is obtaine
19e50 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  d when the first
19e60 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65   page is acquire
19e70 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64  d. .** This read
19e80 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64   lock is dropped
19e90 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70   when the last p
19ea0 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e  age is released.
19eb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19ec0 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e  ine works for an
19ed0 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72  y page number gr
19ee0 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49  eater than 0.  I
19ef0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
19f00 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65  * file is smalle
19f10 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
19f20 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20  sted page, then 
19f30 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a  no actual disk.*
19f40 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e  * read occurs an
19f50 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  d the memory ima
19f60 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  ge of the page i
19f70 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
19f80 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20  .** all zeros.  
19f90 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
19fa0 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
19fb0 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
19fc0 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65  ialized.** to ze
19fd0 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69  ros the first ti
19fe0 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
19ff0 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
1a000 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
1a010 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
1a020 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
1a030 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
1a040 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
1a050 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
1a060 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
1a070 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
1a080 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
1a090 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
1a0a0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
1a0b0 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
1a0c0 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
1a0d0 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
1a0e0 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
1a0f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
1a100 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
1a110 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
1a120 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
1a130 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
1a140 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
1a150 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
1a160 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
1a170 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
1a180 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
1a190 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
1a1a0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
1a1b0 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
1a1c0 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
1a1d0 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
1a1e0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
1a1f0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
1a200 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
1a210 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
1a220 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
1a230 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
1a240 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
1a250 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
1a260 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66  f noContent is f
1a270 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63  alse, the page c
1a280 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75  ontents are actu
1a290 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64  ally read from d
1a2a0 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e  isk..** If noCon
1a2b0 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
1a2c0 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
1a2d0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
1a2e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
1a2f0 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
1a300 74 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f  this time, so do
1a310 20 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72   not do a disk r
1a320 65 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ead.  Just fill 
1a330 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  in the.** page c
1a340 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
1a350 73 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65  s.  But mark the
1a360 20 66 61 63 74 20 74 68 61 74 20 77 65 20 68 61   fact that we ha
1a370 76 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a  ve not read the.
1a380 2a 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65  ** content by se
1a390 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
1a3a0 6e 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20  needRead flag.  
1a3b0 4c 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a  Later on, if .**
1a3c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1a3d0 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
1a3e0 6e 20 74 68 69 73 20 70 61 67 65 20 6f 72 20 69  n this page or i
1a3f0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
1a400 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69  s.** called agai
1a410 6e 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74  n with noContent
1a420 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ==0, that means 
1a430 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
1a440 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e   is needed.** an
1a450 64 20 74 68 65 20 64 69 73 6b 20 72 65 61 64 20  d the disk read 
1a460 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
1a470 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69  that point..*/.i
1a480 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  nt sqlite3PagerA
1a490 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20  cquire(.  Pager 
1a4a0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
1a4b0 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
1a4c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1a4d0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
1a4e0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
1a4f0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
1a500 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
1a510 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
1a520 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
1a530 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
1a540 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  re */.  int noCo
1a550 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44  ntent       /* D
1a560 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61  o not bother rea
1a570 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ding content fro
1a580 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a  m disk if true *
1a590 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  /.){.  PgHdr *pP
1a5a0 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  g = 0;.  int rc;
1a5b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1a5c0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1a5d0 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 20 20  _UNLOCK .       
1a5e0 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  || sqlite3Pcache
1a5f0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
1a600 3e 70 50 43 61 63 68 65 29 3e 30 20 0a 20 20 20  >pPCache)>0 .   
1a610 20 20 20 20 7c 7c 20 70 67 6e 6f 3d 3d 31 0a 20      || pgno==1. 
1a620 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61   );..  /* The ma
1a630 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
1a640 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
1a650 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1a660 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20   if a page.  ** 
1a670 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
1a680 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72  han this, or zer
1a690 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  o, is requested.
1a6a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
1a6b0 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
1a6c0 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  || pgno==0 || pg
1a6d0 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
1a6e0 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
1a6f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1a700 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1a710 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1a720 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74   we have not hit
1a730 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72   any critical er
1a740 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73  rors..  */ .  as
1a750 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
1a760 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
1a770 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1a780 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  is the first pag
1a790 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e  e accessed, then
1a7a0 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f   get a SHARED lo
1a7b0 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ck.  ** on the d
1a7c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61  atabase file. pa
1a7d0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20  gerSharedLock() 
1a7e0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20  is a no-op if . 
1a7f0 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c   ** a database l
1a800 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
1a810 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eld..  */.  rc =
1a820 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
1a830 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
1a840 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a850 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1a860 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
1a870 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1a880 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ER_UNLOCK );..  
1a890 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
1a8a0 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
1a8b0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31  pPCache, pgno, 1
1a8c0 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72  , &pPg);.  if( r
1a8d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a8e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a8f0 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50   }.  if( pPg->pP
1a900 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ager==0 ){.    /
1a910 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68  * The pager cach
1a920 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20  e has created a 
1a930 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f  new page. Its co
1a940 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a  ntent needs to .
1a950 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61      ** be initia
1a960 6c 69 7a 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  lized..    */.  
1a970 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20    int nMax;.    
1a980 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1a990 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70  r->nMiss);.    p
1a9a0 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
1a9b0 67 65 72 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ger;.    memset(
1a9c0 70 50 67 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20  pPg->pExtra, 0, 
1a9d0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
1a9e0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
1a9f0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1aa00 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b  (pPager, &nMax);
1aa10 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1aa20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1aa30 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1aa40 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65  f(pPg);.      re
1aa50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1aa60 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e      if( nMax<(in
1aa70 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20  t)pgno || MEMDB 
1aa80 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  || noContent ){.
1aa90 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
1aaa0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
1aab0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1aac0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
1aad0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1aae0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
1aaf0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
1ab00 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
1ab10 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1ab20 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f  e);.      if( no
1ab30 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
1ab40 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
1ab50 20 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44   PGHDR_NEED_READ
1ab60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ab70 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
1ab80 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1ab90 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
1aba0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  se{.      rc = r
1abb0 65 61 64 44 62 50 61 67 65 28 70 50 61 67 65 72  eadDbPage(pPager
1abc0 2c 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20  , pPg, pgno);.  
1abd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1abe0 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
1abf0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1ac00 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
1ac10 2f 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  /* sqlite3PagerU
1ac20 6e 72 65 66 28 70 50 67 29 3b 20 2a 2f 0a 20 20  nref(pPg); */.  
1ac30 20 20 20 20 20 20 70 61 67 65 72 44 72 6f 70 50        pagerDropP
1ac40 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
1ac50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ac60 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65     }.    }.#ifde
1ac70 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1ac80 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
1ac90 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
1aca0 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
1acb0 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
1acc0 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
1acd0 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
1ace0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
1acf0 0a 20 20 20 20 61 73 73 65 72 74 28 73 71 6c 69  .    assert(sqli
1ad00 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
1ad10 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1ad20 65 29 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29  e)>0 || pgno==1)
1ad30 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
1ad40 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
1ad50 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65      if( !noConte
1ad60 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
1ad70 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
1ad80 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  nt(pPg);.      i
1ad90 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1ada0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1adb0 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
1adc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1add0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1ade0 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a   *ppPage = pPg;.
1adf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ae00 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  OK;.}../*.** Acq
1ae10 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
1ae20 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
1ae30 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
1ae40 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
1ae50 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
1ae60 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
1ae70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1ae80 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
1ae90 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
1aea0 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  ot in cache..**.
1aeb0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
1aec0 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
1aed0 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
1aee0 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
1aef0 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
1af00 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
1af10 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
1af20 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
1af30 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
1af40 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
1af50 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
1af60 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
1af70 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
1af80 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
1af90 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
1afa0 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
1afb0 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
1afc0 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
1afd0 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
1afe0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1aff0 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
1b000 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
1b010 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
1b020 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b030 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1b040 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69   pgno!=0 );..  i
1b050 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  f( (pPager->stat
1b060 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29  e!=PAGER_UNLOCK)
1b070 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1b080 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
1b090 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72  OK || pPager->er
1b0a0 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
1b0b0 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  LL).  ){.    sql
1b0c0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
1b0d0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
1b0e0 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b   pgno, 0, &pPg);
1b0f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
1b100 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  Pg;.}../*.** Rel
1b110 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  ease a page..**.
1b120 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
1b130 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
1b140 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
1b150 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
1b160 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
1b170 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
1b180 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
1b190 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
1b1a0 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
1b1b0 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
1b1c0 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
1b1d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1b1e0 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
1b1f0 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
1b200 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
1b210 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66  Page *pPg){.  if
1b220 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67  ( pPg ){.    Pag
1b230 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1b240 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71  ->pPager;.    sq
1b250 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
1b260 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67  se(pPg);.    pag
1b270 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
1b280 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
1b290 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b2a0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1b2b0 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50  openSubJournal(P
1b2c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1b2d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1b2e0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
1b2f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
1b300 26 20 21 70 50 61 67 65 72 2d 3e 73 6a 66 64 2d  & !pPager->sjfd-
1b310 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
1b320 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1b330 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
1b340 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
1b350 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  RY ){.      sqli
1b360 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
1b370 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  n(pPager->sjfd);
1b380 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b390 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1b3a0 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
1b3b0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  er, pPager->sjfd
1b3c0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  , SQLITE_OPEN_SU
1b3d0 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  BJOURNAL);.    }
1b3e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b3f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1b400 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  e a journal file
1b410 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68   for pPager.  Th
1b420 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ere should alrea
1b430 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
1b440 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45  .** or EXCLUSIVE
1b450 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1b460 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1b470 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1b480 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
1b490 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
1b4a0 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52  f everything.  R
1b4b0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
1b4c0 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ode and release 
1b4d0 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63  the.** write loc
1b4e0 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  k if anything go
1b4f0 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
1b500 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
1b510 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
1b520 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
1b530 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
1b540 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
1b550 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
1b560 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1b570 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
1b580 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45  EXCLUSIVE|SQLITE
1b590 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 0a  _OPEN_CREATE);..
1b5a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1b5b0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1b5c0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
1b5d0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
1b5e0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1b5f0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1b600 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
1b610 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  l==0 );.  sqlite
1b620 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1b630 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 70 50  pPager, 0);.  pP
1b640 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1b650 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
1b660 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
1b670 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 50  bSize);.  if( pP
1b680 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1b690 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
1b6a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1b6b0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
1b6c0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
1b6d0 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
1b6e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
1b6f0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
1b700 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
1b710 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28        flags |= (
1b720 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1b730 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
1b740 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
1b750 41 4c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  AL);.    }else{.
1b760 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28        flags |= (
1b770 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1b780 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  _JOURNAL);.    }
1b790 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1b7a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
1b7b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1b7c0 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
1b7d0 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
1b7e0 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  lOpen(pPager->jf
1b7f0 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  d);.      rc = S
1b800 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1b810 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
1b820 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
1b830 5f 57 52 49 54 45 0a 20 20 20 20 20 20 72 63 20  _WRITE.      rc 
1b840 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
1b850 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Open(.          
1b860 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
1b870 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
1b880 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c  jfd, flags, jrnl
1b890 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
1b8a0 72 29 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73  r).      );.#els
1b8b0 65 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  e.      rc = sql
1b8c0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
1b8d0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1b8e0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
1b8f0 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69  flags, 0);.#endi
1b900 66 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  f.    }.    asse
1b910 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
1b920 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64  K || pPager->jfd
1b930 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20  ->pMethods );.  
1b940 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1b950 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50  lOff = 0;.    pP
1b960 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1b970 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1b980 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
1b990 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1b9a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b9b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
1b9c0 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  OMEM ){.        
1b9d0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
1b9e0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
1b9f0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
1ba00 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 66    }.      goto f
1ba10 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
1ba20 75 72 6e 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  urnal;.    }.  }
1ba30 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
1ba40 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50  alOpen = 1;.  pP
1ba50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
1ba60 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  rted = 0;.  pPag
1ba70 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
1ba80 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
1ba90 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
1baa0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
1bab0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
1bac0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74  errCode;.    got
1bad0 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
1bae0 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
1baf0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1bb00 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
1bb10 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  ize;..  rc = wri
1bb20 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
1bb30 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  ger);..  if( pPa
1bb40 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
1bb50 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1bb60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   ){.    rc = ope
1bb70 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67  nSubJournal(pPag
1bb80 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
1bb90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1bba0 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
1bbb0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
1bbc0 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  OERR_NOMEM ){.  
1bbd0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
1bbe0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
1bbf0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ger, 0);.    if(
1bc00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bc10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1bc20 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
1bc30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1bc40 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  ..failed_to_open
1bc50 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69  _journal:.  sqli
1bc60 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
1bc70 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
1bc80 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
1bc90 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
1bca0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1bcb0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
1bcc0 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1bcd0 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
1bce0 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64   lock is removed
1bcf0 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79   when.** the any
1bd00 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1bd10 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20  g happen:.**.** 
1bd20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1bd30 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
1bd40 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
1bd50 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1bd60 72 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63  rRollback() is c
1bd70 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
1bd80 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
1bd90 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
1bda0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
1bdb0 65 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c  erUnref() is cal
1bdc0 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20  led to on every 
1bdd0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
1bde0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
1bdf0 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  t parameter to t
1be00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1be10 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20   pointer to any 
1be20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65  open page of the
1be30 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
1be40 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e  e.  Nothing chan
1be50 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61  ges about the pa
1be60 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20  ge - it is used 
1be70 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71  merely to.** acq
1be80 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74  uire a pointer t
1be90 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1bea0 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f  cture and as pro
1beb0 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73  of that there is
1bec0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65  .** already a re
1bed0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad-lock on the d
1bee0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
1bef0 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
1bf00 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f  ter indicates ho
1bf10 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20  w much space in 
1bf20 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65  bytes to reserve
1bf30 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72   for a.** master
1bf40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61   journal file-na
1bf50 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  me at the start 
1bf60 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
1bf70 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65  hen it is create
1bf80 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e  d..**.** A journ
1bf90 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
1bfa0 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74  d if this is not
1bfb0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
1bfc0 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  e.  For temporar
1bfd0 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20  y.** files, the 
1bfe0 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a  opening of the j
1bff0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
1c000 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
1c010 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74  ere is an.** act
1c020 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74  ual need to writ
1c030 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
1c040 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
1c050 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
1c060 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  dy reserved for 
1c070 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f  writing, this ro
1c080 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1c090 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61  ..**.** If exFla
1c0a0 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68  g is true, go ah
1c0b0 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45  ead and get an E
1c0c0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1c0d0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d   the file.** imm
1c0e0 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64  ediately instead
1c0f0 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69   of waiting unti
1c100 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73  l we try to flus
1c110 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68  h the cache.  Th
1c120 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69  e.** exFlag is i
1c130 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e  gnored if a tran
1c140 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
1c150 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  dy active..*/.in
1c160 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
1c170 67 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c  gin(DbPage *pPg,
1c180 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20   int exFlag){.  
1c190 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1c1a0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
1c1b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1c1c0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  K;.  assert( pPg
1c1d0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73  ->nRef>0 );.  as
1c1e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1c1f0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
1c200 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
1c210 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1c220 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
1c230 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
1c240 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
1c250 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
1c260 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  B );.    rc = sq
1c270 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
1c280 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44  er->fd, RESERVED
1c290 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
1c2a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c2b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
1c2c0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53  tate = PAGER_RES
1c2d0 45 52 56 45 44 3b 0a 20 20 20 20 20 20 69 66 28  ERVED;.      if(
1c2e0 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
1c2f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
1c300 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
1c310 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
1c320 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
1c330 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
1c340 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c350 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c360 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  }.    pPager->di
1c370 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
1c380 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 54    PAGERTRACE2("T
1c390 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
1c3a0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1c3b0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ));.    if( pPag
1c3c0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26  er->useJournal &
1c3d0 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
1c3e0 69 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 26  ile.           &
1c3f0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
1c400 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
1c410 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
1c420 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1c430 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
1c440 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
1c450 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
1c460 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
1c470 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c480 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ff==0 ){.    /* 
1c490 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
1c4a0 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  n the pager was 
1c4b0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
1c4c0 65 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61 73  ess mode the las
1c4d0 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20  t.    ** time a 
1c4e0 28 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20  (read or write) 
1c4f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
1c500 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e  successfully con
1c510 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79  cluded.    ** by
1c520 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1c530 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c  . Instead of del
1c540 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eting the journa
1c550 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20  l file it was . 
1c560 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20     ** kept open 
1c570 61 6e 64 20 65 69 74 68 65 72 20 77 61 73 20 74  and either was t
1c580 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79  runcated to 0 by
1c590 74 65 73 20 6f 72 20 69 74 73 20 68 65 61 64 65  tes or its heade
1c5a0 72 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65  r was.    ** ove
1c5b0 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a 65  rwritten with ze
1c5c0 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
1c5d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c5e0 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  nRec==0 );.    a
1c5f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1c600 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a  bOrigSize==0 );.
1c610 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c620 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
1c630 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1c640 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1c650 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 70  Pager, 0);.    p
1c660 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
1c670 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
1c680 63 43 72 65 61 74 65 28 20 70 50 61 67 65 72 2d  cCreate( pPager-
1c690 3e 64 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 69  >dbSize );.    i
1c6a0 66 28 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a  f( !pPager->pInJ
1c6b0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
1c6c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1c6d0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
1c6e0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
1c6f0 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
1c700 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72  >dbSize;.      r
1c710 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
1c720 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
1c730 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
1c740 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
1c750 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d  lOpen || pPager-
1c760 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c  >journalOff>0 ||
1c770 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c780 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1c790 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64  ../*.** Mark a d
1c7a0 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
1c7b0 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65  eable.  The page
1c7c0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
1c7d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   the journal .**
1c7e0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
1c7f0 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68  ere already.  Th
1c800 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
1c810 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
1c820 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67   making.** chang
1c830 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a  es to a page..**
1c840 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
1c850 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
1c860 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
1c870 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e  ager creates a n
1c880 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  ew.** journal an
1c890 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53  d acquires a RES
1c8a0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
1c8b0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20  e database.  If 
1c8c0 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  the RESERVED.** 
1c8d0 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
1c8e0 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73  e acquired, this
1c8f0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1c900 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54   SQLITE_BUSY.  T
1c910 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
1c920 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b  utine must check
1c930 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e   for that return
1c940 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61   value and be ca
1c950 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20  reful not to.** 
1c960 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
1c970 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20  data until this 
1c980 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1c990 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
1c9a0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1c9b0 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  file could not b
1c9c0 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73  e written becaus
1c9d0 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75  e the disk is fu
1c9e0 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  ll,.** then this
1c9f0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1ca00 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64   SQLITE_FULL and
1ca10 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61   does an immedia
1ca20 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  te rollback..** 
1ca30 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77  All subsequent w
1ca40 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c  rite attempts al
1ca50 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  so return SQLITE
1ca60 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72  _FULL until ther
1ca70 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74  e.** is a call t
1ca80 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
1ca90 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65  mmit() or sqlite
1caa0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
1cab0 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f   to.** reset..*/
1cac0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1cad0 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
1cae0 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61  Pg){.  void *pDa
1caf0 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
1cb00 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1cb10 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1cb20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1cb30 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  E_OK;..  /* Chec
1cb40 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a  k for errors.  *
1cb50 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1cb60 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20  errCode ){ .    
1cb70 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
1cb80 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
1cb90 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  ( pPager->readOn
1cba0 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ly ){.    return
1cbb0 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
1cbc0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  }..  assert( !pP
1cbd0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1cbe0 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  );..  CHECK_PAGE
1cbf0 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  (pPg);..  /* If 
1cc00 74 68 69 73 20 70 61 67 65 20 77 61 73 20 70 72  this page was pr
1cc10 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65  eviously acquire
1cc20 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74  d with noContent
1cc30 3d 3d 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a  ==1, that means.
1cc40 20 20 2a 2a 20 77 65 20 64 69 64 6e 27 74 20 72    ** we didn't r
1cc50 65 61 6c 6c 79 20 72 65 61 64 20 69 6e 20 74 68  eally read in th
1cc60 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
1cc70 20 70 61 67 65 2e 20 20 54 68 69 73 20 63 61 6e   page.  This can
1cc80 20 68 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f   happen.  ** (fo
1cc90 72 20 65 78 61 6d 70 6c 65 29 20 77 68 65 6e 20  r example) when 
1cca0 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
1ccb0 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  g moved to the f
1ccc0 72 65 65 6c 69 73 74 2e 20 20 42 75 74 0a 20 20  reelist.  But.  
1ccd0 2a 2a 20 6e 6f 77 20 77 65 20 61 72 65 20 28 70  ** now we are (p
1cce0 65 72 68 61 70 73 29 20 6d 6f 76 69 6e 67 20 74  erhaps) moving t
1ccf0 68 65 20 70 61 67 65 20 6f 66 66 20 6f 66 20 74  he page off of t
1cd00 68 65 20 66 72 65 65 6c 69 73 74 20 66 6f 72 0a  he freelist for.
1cd10 20 20 2a 2a 20 72 65 75 73 65 20 61 6e 64 20 77    ** reuse and w
1cd20 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  e need to know i
1cd30 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74  ts original cont
1cd40 65 6e 74 20 73 6f 20 74 68 61 74 20 63 6f 6e 74  ent so that cont
1cd50 65 6e 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  ent.  ** can be 
1cd60 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f  stored in the ro
1cd70 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
1cd80 20 53 6f 20 64 6f 20 74 68 65 20 72 65 61 64 20   So do the read 
1cd90 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d  at this.  ** tim
1cda0 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  e..  */.  rc = p
1cdb0 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
1cdc0 28 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 20  (pPg);.  if( rc 
1cdd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1cde0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  ;.  }..  /* Mark
1cdf0 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
1ce00 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
1ce10 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1ce20 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
1ce30 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
1ce40 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
1ce50 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
1ce60 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
1ce70 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
1ce80 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75  .  if( pageInJou
1ce90 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75  rnal(pPg) && !su
1cea0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
1ceb0 50 67 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  Pg) ){.    pPage
1cec0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
1ced0 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  1;.    pPager->d
1cee0 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20  bModified = 1;. 
1cef0 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20   }else{..    /* 
1cf00 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
1cf10 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
1cf20 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
1cf30 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72   to be.    ** wr
1cf40 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
1cf50 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1cf60 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
1cf70 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nt journal.    *
1cf80 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a  * or both..    *
1cf90 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63  *.    ** First c
1cfa0 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74  heck to see that
1cfb0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1cfc0 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
1cfd0 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  and.    ** creat
1cfe0 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20  e it if it does 
1cff0 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  not..    */.    
1d000 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d010 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
1d020 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  OCK );.    rc = 
1d030 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1d040 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69  n(pPg, 0);.    i
1d050 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d060 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d070 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
1d080 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1d090 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
1d0a0 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  RVED );.    if( 
1d0b0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1d0c0 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
1d0d0 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
1d0e0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
1d0f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
1d100 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
1d110 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  FF ){.      rc =
1d120 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
1d130 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1d140 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d150 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1d160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
1d170 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
1d180 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
1d190 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
1d1a0 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
1d1b0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1d1c0 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
1d1d0 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
1d1e0 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
1d1f0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1d200 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
1d210 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
1d220 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
1d230 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
1d240 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1d250 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
1d260 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
1d270 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d280 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70  !pageInJournal(p
1d290 50 67 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Pg) && pPager->j
1d2a0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
1d2b0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
1d2c0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
1d2d0 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
1d2e0 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20   u32 cksum;.    
1d2f0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
1d300 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ;..        /* We
1d310 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
1d320 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
1d330 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
1d340 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
1d350 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
1d360 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
1d370 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1d380 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
1d390 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
1d3a0 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
1d3b0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1d3c0 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
1d3d0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
1d3e0 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20         pData2 = 
1d3f0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
1d400 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
1d410 20 37 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73   7);.        cks
1d420 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d  um = pager_cksum
1d430 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44  (pPager, (u8*)pD
1d440 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72  ata2);.        r
1d450 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
1d460 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
1d470 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1d480 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1d490 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d4a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d4b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d4c0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1d4d0 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
1d4e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
1d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d500 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
1d510 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1d520 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  + 4);.          
1d530 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1d540 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  ff += pPager->pa
1d550 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20  geSize+4;.      
1d560 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1d570 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d580 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1d590 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
1d5a0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
1d5b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73  >journalOff, cks
1d5c0 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  um);.          p
1d5d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1d5e0 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  f += 4;.        
1d5f0 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
1d600 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
1d610 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
1d620 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d640 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1d650 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ff, pPager->page
1d660 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
1d670 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1d680 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
1d690 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
1d6a0 50 41 47 45 52 54 52 41 43 45 35 28 22 4a 4f 55  PAGERTRACE5("JOU
1d6b0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
1d6c0 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68  needSync=%d hash
1d6d0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
1d6e0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1d6f0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1d700 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
1d710 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
1d720 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
1d730 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65  1:0), pager_page
1d740 68 61 73 68 28 70 50 67 29 29 3b 0a 0a 20 20 20  hash(pPg));..   
1d750 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20       /* Even if 
1d760 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c  an IO or diskful
1d770 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  l error occurred
1d780 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69   while journalli
1d790 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ng the.        *
1d7a0 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
1d7b0 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
1d7c0 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
1d7d0 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
1d7e0 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
1d7f0 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74  wise, when the t
1d800 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1d810 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c  lled back, the l
1d820 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20  ogic in.        
1d830 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  ** playback_one_
1d840 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e  page() will thin
1d850 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
1d860 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
1d870 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ored.        ** 
1d880 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1d890 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20  file. And if an 
1d8a0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
1d8b0 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a  while doing so,.
1d8c0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
1d8d0 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66  corruption may f
1d8e0 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a  ollow..        *
1d8f0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  /.        if( !p
1d900 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
1d910 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
1d920 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
1d930 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
1d940 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
1d950 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
1d960 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
1d970 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  An error has occ
1d980 75 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20  ured writing to 
1d990 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1d9a0 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a  . The .        *
1d9b0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
1d9c0 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
1d9d0 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61  k by the layer a
1d9e0 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
1d9f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1da00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1da10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1da20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
1da30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
1da40 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
1da50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
1da60 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
1da70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1da80 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
1da90 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
1daa0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1dab0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1dac0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
1dad0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1dae0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
1daf0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
1db00 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
1db10 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70  rc |= addToSavep
1db20 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
1db30 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
1db40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1db50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1db60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
1db70 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
1db80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1db90 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1dba0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1dbb0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
1dbc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1dbd0 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  ed && !pPager->n
1dbe0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  oSync ){.       
1dbf0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
1dc00 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
1dc10 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
1dc20 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
1dc30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1dc40 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28      PAGERTRACE4(
1dc50 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
1dc60 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
1dc70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1dc80 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1dc90 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20  r), pPg->pgno,. 
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
1dcb0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
1dcc0 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
1dcd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1dce0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
1dcf0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1dd00 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
1dd10 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1dd20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
1dd30 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
1dd40 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
1dd50 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1dd60 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
1dd70 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
1dd80 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
1dd90 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
1dda0 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
1ddb0 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
1ddc0 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
1ddd0 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
1dde0 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
1ddf0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1de00 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
1de10 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20  e(pPg) ){.      
1de20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
1de30 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
1de40 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
1de50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1de60 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
1de70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1de80 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1de90 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
1dea0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1deb0 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  e<pPg->pgno ){. 
1dec0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1ded0 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
1dee0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
1def0 62 53 69 7a 65 3d 3d 28 50 41 47 45 52 5f 4d 4a  bSize==(PAGER_MJ
1df00 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 2d 31 29  _PGNO(pPager)-1)
1df10 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1df20 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20  ->dbSize++;.    
1df30 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1df40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1df50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1df60 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61  d to mark a data
1df70 2d 70 61 67 65 20 61 73 20 77 72 69 74 61 62 6c  -page as writabl
1df80 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70  e. It uses .** p
1df90 61 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20  ager_write() to 
1dfa0 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66  open a journal f
1dfb0 69 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ile (if it is no
1dfc0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a  t already open).
1dfd0 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 65  ** and write the
1dfe0 20 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20   page *pData to 
1dff0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
1e000 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
1e010 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
1e020 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
1e030 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
1e040 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
1e050 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
1e060 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
1e070 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
1e080 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
1e090 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
1e0a0 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
1e0b0 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
1e0c0 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
1e0d0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
1e0e0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
1e0f0 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
1e100 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
1e110 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1e120 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
1e130 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
1e140 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1e150 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
1e160 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
1e170 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1e180 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
1e190 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
1e1a0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1e1b0 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
1e1c0 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67  ze);..  if( nPag
1e1d0 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a  ePerSector>1 ){.
1e1e0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f      Pgno nPageCo
1e1f0 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  unt;          /*
1e200 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1e210 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
1e220 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50  se file */.    P
1e230 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
1e240 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1e250 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
1e260 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
1e270 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ted on. */.    i
1e280 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
1e290 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e2a0 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
1e2b0 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
1e2c0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e  ournal */.    in
1e2d0 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 65  t ii;.    int ne
1e2e0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  edSync = 0;..   
1e2f0 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f   /* Set the doNo
1e300 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e  tSync flag to 1.
1e310 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
1e320 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
1e330 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a   a journal.    *
1e340 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  * header to be w
1e350 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
1e360 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
1e370 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
1e380 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1e390 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
1e3a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1e3b0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
1e3c0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
1e3d0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b  ->doNotSync = 1;
1e3e0 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72  ..    /* This tr
1e3f0 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74  ick assumes that
1e400 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73   both the page-s
1e410 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
1e420 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61  ize are.    ** a
1e430 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20  n integer power 
1e440 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61  of 2. It sets va
1e450 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68  riable pg1 to th
1e460 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20  e identifier.   
1e470 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
1e480 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
1e490 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
1e4a0 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ed on..    */.  
1e4b0 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70    pg1 = ((pPg->p
1e4c0 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65  gno-1) & ~(nPage
1e4d0 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20  PerSector-1)) + 
1e4e0 31 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50  1;..    sqlite3P
1e4f0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1e500 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50  ager, (int *)&nP
1e510 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69  ageCount);.    i
1e520 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61  f( pPg->pgno>nPa
1e530 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
1e540 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70   nPage = (pPg->p
1e550 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20  gno - pg1)+1;.  
1e560 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31    }else if( (pg1
1e570 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  +nPagePerSector-
1e580 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  1)>nPageCount ){
1e590 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
1e5a0 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b  PageCount+1-pg1;
1e5b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e5c0 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50    nPage = nPageP
1e5d0 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a  erSector;.    }.
1e5e0 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65      assert(nPage
1e5f0 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >0);.    assert(
1e600 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b  pg1<=pPg->pgno);
1e610 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31  .    assert((pg1
1e620 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e  +nPage)>pPg->pgn
1e630 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d  o);..    for(ii=
1e640 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72  0; ii<nPage && r
1e650 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69  c==SQLITE_OK; ii
1e660 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ++){.      Pgno 
1e670 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20  pg = pg1+ii;.   
1e680 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b     PgHdr *pPage;
1e690 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70  .      if( pg==p
1e6a0 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c  Pg->pgno || !sql
1e6b0 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
1e6c0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
1e6d0 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20  l, pg) ){.      
1e6e0 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f    if( pg!=PAGER_
1e6f0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
1e700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1e710 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1e720 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70  t(pPager, pg, &p
1e730 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1e740 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e750 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e760 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
1e770 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
1e780 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1e790 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
1e7a0 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
1e7b0 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
1e7c0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
1e7d0 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
1e7e0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  er->needSync);. 
1e7f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1e800 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e810 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
1e820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1e830 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e840 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20  else if( (pPage 
1e850 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1e860 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29  Pager, pg))!=0 )
1e870 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
1e880 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
1e890 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
1e8a0 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
1e8b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
1e8c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1e8d0 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
1e8e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e8f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50  .    /* If the P
1e900 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  gHdr.needSync fl
1e910 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e  ag is set for an
1e920 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70  y of the nPage p
1e930 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61  ages .    ** sta
1e940 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68  rting at pg1, th
1e950 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  en it needs to b
1e960 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66  e set for all of
1e970 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20   them. Because. 
1e980 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f     ** writing to
1e990 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50   any of these nP
1e9a0 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61  age pages may da
1e9b0 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c  mage the others,
1e9c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
1e9d0 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f  nal file must co
1e9e0 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63  ntain sync()ed c
1e9f0 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20  opies of all of 
1ea00 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f  them.    ** befo
1ea10 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63  re any of them c
1ea20 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  an be written ou
1ea30 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1ea40 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
1ea50 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
1ea60 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1ea70 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
1ea80 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a  r->noSync==0 );.
1ea90 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
1eaa0 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64  ii<nPage && need
1eab0 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Sync; ii++){.   
1eac0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
1ead0 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
1eae0 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29  (pPager, pg1+ii)
1eaf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
1eb00 61 67 65 20 29 20 70 50 61 67 65 2d 3e 66 6c 61  age ) pPage->fla
1eb10 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
1eb20 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 73  _SYNC;.        s
1eb30 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1eb40 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
1eb50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
1eb60 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b  ager->needSync);
1eb70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
1eb80 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
1eb90 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  tSync==1 );.    
1eba0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
1ebb0 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
1ebc0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1ebd0 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
1ebe0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ebf0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1ec00 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
1ec10 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
1ec20 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
1ec30 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
1ec40 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
1ec50 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
1ec60 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
1ec70 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
1ec80 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
1ec90 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
1eca0 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
1ecb0 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
1ecc0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
1ecd0 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67  able(DbPage *pPg
1ece0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
1ecf0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
1ed00 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TY;.}.#endif../*
1ed10 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1ed20 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1ed30 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1ed40 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
1ed50 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
1ed60 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1ed70 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b  on page pPg back
1ed80 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
1ed90 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
1eda0 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
1edb0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
1edc0 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
1edd0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
1ede0 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61  n.** the page ha
1edf0 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20  s been added as 
1ee00 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72  a leaf of the fr
1ee10 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74  eelist and so it
1ee20 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20  s.** content no 
1ee30 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a  longer matters..
1ee40 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
1ee50 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
1ee60 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
1ee70 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
1ee80 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
1ee90 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
1eea0 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
1eeb0 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
1eec0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
1eed0 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
1eee0 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
1eef0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1ef00 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
1ef10 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
1ef20 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
1ef30 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50   the.** sqlite3P
1ef40 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1ef50 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74  () below, more t
1ef60 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73  han double the s
1ef70 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65  peed.** of large
1ef80 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
1ef90 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65  ns and quadruple
1efa0 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
1efb0 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a  rge DELETEs..**.
1efc0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
1efd0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1efe0 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f  set the alwaysRo
1eff0 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74  llback flag to t
1f000 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65  rue..** Subseque
1f010 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
1f020 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1f030 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73  back() for the s
1f040 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c  ame page.** will
1f050 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69   thereafter be i
1f060 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73  gnored.  This is
1f070 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76   necessary to av
1f080 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a  oid a problem.**
1f090 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69   where a page wi
1f0a0 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64  th data is added
1f0b0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1f0c0 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74   during one part
1f0d0 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   of.** a transac
1f0e0 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65  tion then remove
1f0f0 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  d from the freel
1f100 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74  ist during a lat
1f110 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  er part.** of th
1f120 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
1f130 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f  on and reused fo
1f140 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
1f150 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a  pose.  When it.*
1f160 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64  * is first added
1f170 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1f180 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1f190 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20  s called.  When 
1f1a0 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73  reused,.** the s
1f1b0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1f1c0 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  ollback() routin
1f1d0 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75  e is called.  Bu
1f1e0 74 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a  t because the.**
1f1f0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63   page contains c
1f200 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65  ritical data, we
1f210 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62   still need to b
1f220 65 20 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a  e sure it gets.*
1f230 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  * rolled back in
1f240 20 73 70 69 74 65 20 6f 66 20 74 68 65 20 73 71   spite of the sq
1f250 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
1f260 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
1f270 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1f280 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61  erDontWrite(DbPa
1f290 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
1f2a0 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
1f2b0 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
1f2c0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1f2d0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
1f2e0 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
1f2f0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1f300 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
1f310 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1f320 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
1f330 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3d 3d 30  lwaysRollback==0
1f340 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1f350 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1f360 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  al );.    pPager
1f370 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ->pAlwaysRollbac
1f380 6b 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  k = sqlite3Bitve
1f390 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
1f3a0 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 20  dbOrigSize);.   
1f3b0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70 41   if( !pPager->pA
1f3c0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b  lwaysRollback ){
1f3d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f3e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1f3f0 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  }.  }.  rc = sql
1f400 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
1f410 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
1f420 6c 62 61 63 6b 2c 20 70 50 67 2d 3e 70 67 6e 6f  lback, pPg->pgno
1f430 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
1f440 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 67 2d  LITE_OK && (pPg-
1f450 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
1f460 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  TY) && pPager->n
1f470 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a  Savepoint==0 ){.
1f480 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1f490 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1f4a0 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69  _SHARED );.    i
1f4b0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1f4c0 65 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20  e==pPg->pgno && 
1f4d0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1f4e0 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
1f4f0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
1f500 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74   this pages is t
1f510 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
1f520 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  the file and the
1f530 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a   file has grown.
1f540 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20        ** during 
1f550 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1f560 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f  saction, then do
1f570 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61   NOT mark the pa
1f580 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20  ge as clean..   
1f590 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64     ** When the d
1f5a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f  atabase file gro
1f5b0 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65  ws, we must make
1f5c0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
1f5d0 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ast page.      *
1f5e0 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61  * gets written a
1f5f0 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20  t least once so 
1f600 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69  that the disk fi
1f610 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  le will be the c
1f620 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  orrect.      ** 
1f630 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20  size. If you do 
1f640 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70  not write this p
1f650 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65  age and the size
1f660 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20   of the file.   
1f670 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73     ** on the dis
1f680 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  k ends up being 
1f690 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20  too small, that 
1f6a0 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
1f6b0 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  base.      ** co
1f6c0 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20  rruption during 
1f6d0 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63  the next transac
1f6e0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1f6f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f700 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e  PAGERTRACE3("DON
1f710 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
1f720 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
1f730 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
1f740 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  ger));.      IOT
1f750 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20  RACE(("CLEAN %p 
1f760 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1f770 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20  Pg->pgno)).     
1f780 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
1f790 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b  GHDR_DONT_WRITE;
1f7a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1f7b0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20  HECK_PAGES.     
1f7c0 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
1f7d0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1f7e0 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
1f7f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f800 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  rc;.}../*.** A c
1f810 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
1f820 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
1f830 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f  ger that if a ro
1f840 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a  llback occurs,.*
1f850 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  * it is not nece
1f860 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65  ssary to restore
1f870 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65   the data on the
1f880 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68   given page.  Th
1f890 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  is.** means that
1f8a0 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
1f8b0 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f  not have to reco
1f8c0 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  rd the given pag
1f8d0 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c  e in the.** roll
1f8e0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
1f8f0 0a 2a 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e  .** If we have n
1f900 6f 74 20 79 65 74 20 61 63 74 75 61 6c 6c 79 20  ot yet actually 
1f910 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  read the content
1f920 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 28 69   of this page (i
1f930 66 0a 2a 2a 20 74 68 65 20 50 67 48 64 72 2e 6e  f.** the PgHdr.n
1f940 65 65 64 52 65 61 64 20 66 6c 61 67 20 69 73 20  eedRead flag is 
1f950 73 65 74 29 20 74 68 65 6e 20 74 68 69 73 20 72  set) then this r
1f960 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20 61  outine acts as a
1f970 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68 61 74   promise.** that
1f980 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 6e   we will never n
1f990 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 20  eed to read the 
1f9a0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20  page content in 
1f9b0 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 20 73  the future..** s
1f9c0 6f 20 74 68 65 20 6e 65 65 64 52 65 61 64 20 66  o the needRead f
1f9d0 6c 61 67 20 63 61 6e 20 62 65 20 63 6c 65 61 72  lag can be clear
1f9e0 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
1f9f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1fa00 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1fa10 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ck(DbPage *pPg){
1fa20 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1fa30 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1fa40 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20    TESTONLY( int 
1fa50 72 63 3b 20 29 20 20 2f 2a 20 52 65 74 75 72 6e  rc; )  /* Return
1fa60 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 71 6c 69   value from sqli
1fa70 74 65 33 42 69 74 76 65 63 53 65 74 28 29 20 2a  te3BitvecSet() *
1fa80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1fa90 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1faa0 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 0a 20  R_RESERVED );.. 
1fab0 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
1fac0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f  al file is not o
1fad0 70 65 6e 2c 20 6f 72 20 44 6f 6e 74 57 72 69 74  pen, or DontWrit
1fae0 65 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  e() has been cal
1faf0 6c 65 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 69 73  led on.  ** this
1fb00 20 70 61 67 65 20 28 44 6f 6e 74 57 72 69 74 65   page (DontWrite
1fb10 28 29 20 73 65 74 73 20 74 68 65 20 61 6c 77 61  () sets the alwa
1fb20 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 29  ysRollback flag)
1fb30 2c 20 74 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a  , then this.  **
1fb40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1fb50 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
1fb60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1fb70 4f 70 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 73  Open==0 .   || s
1fb80 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
1fb90 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73  (pPager->pAlways
1fba0 52 6f 6c 6c 62 61 63 6b 2c 20 70 50 67 2d 3e 70  Rollback, pPg->p
1fbb0 67 6e 6f 29 0a 20 20 20 7c 7c 20 70 50 67 2d 3e  gno).   || pPg->
1fbc0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f  pgno>pPager->dbO
1fbd0 72 69 67 53 69 7a 65 0a 20 20 29 7b 0a 20 20 20  rigSize.  ){.   
1fbe0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 23 69   return;.  }..#i
1fbf0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
1fc00 52 45 5f 44 45 4c 45 54 45 0a 20 20 69 66 28 20  RE_DELETE.  if( 
1fc10 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
1fc20 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
1fc30 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
1fc40 21 3d 30 0a 20 20 20 7c 7c 20 70 50 67 2d 3e 70  !=0.   || pPg->p
1fc50 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72  gno>pPager->dbOr
1fc60 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  igSize ){.    re
1fc70 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
1fc80 0a 0a 20 20 2f 2a 20 49 66 20 53 45 43 55 52 45  ..  /* If SECURE
1fc90 5f 44 45 4c 45 54 45 20 69 73 20 64 69 73 61 62  _DELETE is disab
1fca0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20  led, then there 
1fcb0 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74  is no way that t
1fcc0 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  his.  ** routine
1fcd0 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 6f   can be called o
1fce0 6e 20 61 20 70 61 67 65 20 66 6f 72 20 77 68 69  n a page for whi
1fcf0 63 68 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  ch sqlite3PagerD
1fd00 6f 6e 74 57 72 69 74 65 28 29 0a 20 20 2a 2a 20  ontWrite().  ** 
1fd10 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65  has not been pre
1fd20 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 64  viously called d
1fd30 75 72 69 6e 67 20 74 68 65 20 73 61 6d 65 20 74  uring the same t
1fd40 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
1fd50 20 41 6e 64 20 69 66 20 44 6f 6e 74 57 72 69 74   And if DontWrit
1fd60 65 28 29 20 68 61 73 20 70 72 65 76 69 6f 75 73  e() has previous
1fd70 6c 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  ly been called, 
1fd80 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
1fd90 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75  ** conditions mu
1fda0 73 74 20 62 65 20 6d 65 74 2e 0a 20 20 2a 2a 0a  st be met..  **.
1fdb0 20 20 2a 2a 20 28 4c 61 74 65 72 3a 29 20 20 4e    ** (Later:)  N
1fdc0 6f 74 20 74 72 75 65 2e 20 20 49 66 20 74 68 65  ot true.  If the
1fdd0 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
1fde0 72 75 70 74 65 64 20 62 79 20 68 61 76 69 6e 67  rupted by having
1fdf0 20 64 75 70 6c 69 63 61 74 65 0a 20 20 2a 2a 20   duplicate.  ** 
1fe00 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1fe10 65 6c 69 73 74 20 28 65 78 3a 20 63 6f 72 72 75  elist (ex: corru
1fe20 70 74 39 2e 74 65 73 74 29 20 74 68 65 6e 20 74  pt9.test) then t
1fe30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
1fe40 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61  not.  ** necessa
1fe50 72 69 6c 79 20 74 72 75 65 3a 0a 20 20 2a 2f 0a  rily true:.  */.
1fe60 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
1fe70 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
1fe80 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
1fe90 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  = pPager->dbOrig
1fea0 53 69 7a 65 20 29 3b 20 2a 2f 0a 0a 20 20 61 73  Size ); */..  as
1feb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
1fec0 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
1fed0 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e   pPg->flags &= ~
1fee0 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b  PGHDR_NEED_READ;
1fef0 0a 0a 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74  ..  /* Failure t
1ff00 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69  o set the bits i
1ff10 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20  n the InJournal 
1ff20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62  bit-vectors is b
1ff30 65 6e 69 67 6e 2e 0a 20 20 2a 2a 20 49 74 20 6d  enign..  ** It m
1ff40 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  erely means that
1ff50 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d   we might do som
1ff60 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20  e extra work to 
1ff70 6a 6f 75 72 6e 61 6c 20 61 20 70 61 67 65 0a 20  journal a page. 
1ff80 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f   ** that does no
1ff90 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
1ffa0 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
1ffb0 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 74  eless, be sure t
1ffc0 6f 20 74 65 73 74 20 74 68 65 0a 20 20 2a 2a 20  o test the.  ** 
1ffd0 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c  case where a mal
1ffe0 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
1fff0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
20000 20 73 65 74 20 61 20 62 69 74 20 69 6e 20 61 20   set a bit in a 
20010 0a 20 20 2a 2a 20 62 69 74 20 76 65 63 74 6f 72  .  ** bit vector
20020 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
20030 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
20040 63 28 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  c();.  TESTONLY(
20050 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42   rc = ) sqlite3B
20060 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
20070 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
20080 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63  ->pgno);.  testc
20090 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
200a0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 54 45 53 54 4f  NOMEM );.  TESTO
200b0 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54  NLY( rc = ) addT
200c0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
200d0 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
200e0 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73 65  gno);.  testcase
200f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
20100 45 4d 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  EM );.  sqlite3E
20110 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
20120 3b 0a 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  ;...  PAGERTRACE
20130 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b  3("DONT_ROLLBACK
20140 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
20150 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
20160 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
20170 20 20 49 4f 54 52 41 43 45 28 28 22 47 41 52 42    IOTRACE(("GARB
20180 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  AGE %p %d\n", pP
20190 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
201a0 29 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ).}.../*.** This
201b0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
201c0 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  ed to increment 
201d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
201e0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
201f0 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62  ,.** stored at b
20200 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61  yte 24 of the pa
20210 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ger file..*/.sta
20220 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e  tic int pager_in
20230 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
20240 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
20250 69 6e 74 20 69 73 44 69 72 65 63 74 29 7b 0a 20  int isDirect){. 
20260 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
20270 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
20280 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nter;.  int rc =
20290 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66   SQLITE_OK;..#if
202a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
202b0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
202c0 20 20 61 73 73 65 72 74 28 20 69 73 44 69 72 65    assert( isDire
202d0 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 69 73 44  ct==0 );  /* isD
202e0 69 72 65 63 74 20 69 73 20 6f 6e 6c 79 20 74 72  irect is only tr
202f0 75 65 20 66 6f 72 20 61 74 6f 6d 69 63 20 77 72  ue for atomic wr
20300 69 74 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ites */.#endif. 
20310 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68   if( !pPager->ch
20320 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26  angeCountDone &&
20330 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
20340 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  0 ){.    /* Open
20350 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
20360 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ile for writing.
20370 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
20380 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
20390 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29  ger, 1, &pPgHdr)
203a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
203b0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
203c0 20 72 63 3b 0a 0a 20 20 20 20 69 66 28 20 21 69   rc;..    if( !i
203d0 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20  sDirect ){.     
203e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
203f0 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b  erWrite(pPgHdr);
20400 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
20410 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20420 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
20430 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
20440 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
20450 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20460 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
20470 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
20480 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
20490 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
204a0 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67  24. */.    chang
204b0 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  e_counter = sqli
204c0 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a  te3Get4byte((u8*
204d0 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  )pPager->dbFileV
204e0 65 72 73 29 3b 0a 20 20 20 20 63 68 61 6e 67 65  ers);.    change
204f0 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  _counter++;.    
20500 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
20510 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
20520 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
20530 74 65 72 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ter);..#ifdef SQ
20540 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
20550 49 43 5f 57 52 49 54 45 0a 20 20 20 20 69 66 28  IC_WRITE.    if(
20560 20 69 73 44 69 72 65 63 74 20 26 26 20 70 50 61   isDirect && pPa
20570 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
20580 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  s ){.      const
20590 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 70 50   void *zBuf = pP
205a0 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20  gHdr->pData;.   
205b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
205c0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20  r->dbFileSize>0 
205d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
205e0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
205f0 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70  ger->fd, zBuf, p
20600 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
20610 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
20620 66 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  f..    /* Releas
20630 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
20640 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
20650 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
20660 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67  PgHdr);.    pPag
20670 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
20680 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  one = 1;.  }.  r
20690 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
206a0 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65  ** Sync the page
206b0 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 0a  r file to disk..
206c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
206d0 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70  gerSync(Pager *p
206e0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
206f0 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
20700 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
20710 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
20720 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20730 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
20740 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
20750 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ags);.  }.  retu
20760 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20770 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
20780 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70  e file for the p
20790 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61  ager pPager. zMa
207a0 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  ster points to t
207b0 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
207c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
207d0 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
207e0 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
207f0 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a  the individual.*
20800 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
20810 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e  zMaster may be N
20820 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e  ULL, which is in
20830 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20  terpreted as no 
20840 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
20850 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61  l (a single data
20860 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
20870 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
20880 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
20890 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
208a0 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69  s synced, all di
208b0 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74 65  rty pages writte
208c0 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  n.** to the data
208d0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
208e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
208f0 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79  synced. The only
20900 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72   thing that.** r
20910 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74  emains to commit
20920 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
20930 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
20940 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
20950 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75  or.** master jou
20960 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65  rnal file if spe
20970 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e  cified)..**.** N
20980 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73  ote that if zMas
20990 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20  ter==NULL, this 
209a0 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69  does not overwri
209b0 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61  te a previous va
209c0 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f  lue.** passed to
209d0 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72   an sqlite3Pager
209e0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
209f0 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   call..**.** If 
20a00 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  the final parame
20a10 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69  ter - noSync - i
20a20 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
20a30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
20a40 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20  tself.** is not 
20a50 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c  synced. The call
20a60 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c  er must call sql
20a70 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29 20  ite3PagerSync() 
20a80 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73  directly to.** s
20a90 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
20aa0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c   file before cal
20ab0 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65  ling CommitPhase
20ac0 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20  Two() to delete 
20ad0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
20ae0 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
20af0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20b00 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
20b10 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  One(.  Pager *pP
20b20 61 67 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 63  ager, .  const c
20b30 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 0a 20  har *zMaster, . 
20b40 20 69 6e 74 20 6e 6f 53 79 6e 63 0a 29 7b 0a 20   int noSync.){. 
20b50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20b60 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  _OK;..  if( pPag
20b70 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
20b80 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
20b90 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
20ba0 20 20 2f 2a 20 49 66 20 6e 6f 20 63 68 61 6e 67    /* If no chang
20bb0 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64  es have been mad
20bc0 65 2c 20 77 65 20 63 61 6e 20 6c 65 61 76 65 20  e, we can leave 
20bd0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
20be0 65 61 72 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  early..  */.  if
20bf0 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69  ( pPager->dbModi
20c00 66 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20 20  fied==0 &&.     
20c10 20 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72     (pPager->jour
20c20 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
20c30 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
20c40 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  E ||.          p
20c50 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
20c60 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20 20  Mode!=0) ){.    
20c70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20c80 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c  dirtyCache==0 ||
20c90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20ca0 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Open==0 );.    r
20cb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20cc0 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
20cd0 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53 59  CE4("DATABASE SY
20ce0 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73  NC: File=%s zMas
20cf0 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c  ter=%s nSize=%d\
20d00 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  n", .      pPage
20d10 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d  r->zFilename, zM
20d20 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64  aster, pPager->d
20d30 62 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  bSize);..  /* If
20d40 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
20d50 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20  emory db, or no 
20d60 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
20d70 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74  written to, or t
20d80 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
20d90 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
20da0 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
20db0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
20dc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
20dd0 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te!=PAGER_SYNCED
20de0 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50   && !MEMDB && pP
20df0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
20e00 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
20e10 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg;..#ifdef SQLI
20e20 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
20e30 5f 57 52 49 54 45 0a 20 20 20 20 2f 2a 20 54 68  _WRITE.    /* Th
20e40 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
20e50 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
20e60 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 6f  be used if all o
20e70 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c  f the.    ** fol
20e80 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
20e90 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
20ea0 20 20 2b 20 54 68 65 20 66 69 6c 65 2d 73 79 73    + The file-sys
20eb0 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65  tem supports the
20ec0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
20ed0 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a  operty for.    *
20ee0 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66  *      blocks of
20ef0 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c   size page-size,
20f00 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b   and.    **    +
20f10 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20   This commit is 
20f20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75  not part of a mu
20f30 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
20f40 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  tion, and.    **
20f50 20 20 20 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e      + Exactly on
20f60 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
20f70 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f  modified and sto
20f80 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
20f90 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
20fa0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74     ** If the opt
20fb0 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
20fc0 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20   used, then the 
20fd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
20fe0 6c 20 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20 62  l never.    ** b
20ff0 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  e created for th
21000 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
21010 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75      */.    int u
21020 73 65 41 74 6f 6d 69 63 57 72 69 74 65 3b 0a 20  seAtomicWrite;. 
21030 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
21040 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
21050 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
21060 3b 0a 20 20 20 20 75 73 65 41 74 6f 6d 69 63 57  ;.    useAtomicW
21070 72 69 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20  rite = (.       
21080 20 21 7a 4d 61 73 74 65 72 20 26 26 20 0a 20 20   !zMaster && .  
21090 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
210a0 75 72 6e 61 6c 4f 70 65 6e 20 26 26 0a 20 20 20  urnalOpen &&.   
210b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
210c0 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66  rnalOff==jrnlBuf
210d0 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20  ferSize(pPager) 
210e0 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  && .        pPag
210f0 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67  er->dbSize>=pPag
21100 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 26  er->dbFileSize &
21110 26 20 0a 20 20 20 20 20 20 20 20 28 70 50 67 3d  & .        (pPg=
21120 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 44 69 72 74  =0 || pPg->pDirt
21130 79 3d 3d 30 29 0a 20 20 20 20 29 3b 0a 20 20 20  y==0).    );.   
21140 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21150 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
21160 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
21170 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
21180 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20  ALMODE_OFF );.  
21190 20 20 69 66 28 20 75 73 65 41 74 6f 6d 69 63 57    if( useAtomicW
211a0 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rite ){.      /*
211b0 20 55 70 64 61 74 65 20 74 68 65 20 6e 52 65 63   Update the nRec
211c0 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 6a 6f   field in the jo
211d0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
211e0 20 20 20 20 20 69 6e 74 20 6f 66 66 73 65 74 20       int offset 
211f0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
21200 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a  lHdr + sizeof(aJ
21210 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20  ournalMagic);.  
21220 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
21230 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20 20 20  r->nRec==1);.   
21240 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
21250 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
21260 20 6f 66 66 73 65 74 2c 20 70 50 61 67 65 72 2d   offset, pPager-
21270 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 2f  >nRec);..      /
21280 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 62 20  * Update the db 
21290 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e  file change coun
212a0 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ter. The followi
212b0 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64  ng call will mod
212c0 69 66 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ify.      ** the
212d0 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
212e0 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67  sentation of pag
212f0 65 20 31 20 74 6f 20 69 6e 63 6c 75 64 65 20 74  e 1 to include t
21300 68 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 20  he updated.     
21310 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74   ** change count
21320 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74  er and then writ
21330 65 20 70 61 67 65 20 31 20 64 69 72 65 63 74 6c  e page 1 directl
21340 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  y to the databas
21350 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e  e.      ** file.
21360 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   Because of the 
21370 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f  atomic-write pro
21380 70 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73  perty of the hos
21390 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 0a  t file-system, .
213a0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73        ** this is
213b0 20 73 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   safe..      */.
213c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
213d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
213e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
213f0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
21400 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
21410 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
21420 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21430 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
21440 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
21450 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 75 73    }..    if( !us
21460 65 41 74 6f 6d 69 63 57 72 69 74 65 20 26 26 20  eAtomicWrite && 
21470 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 0a  rc==SQLITE_OK ).
21480 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
21490 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
214a0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73  al file name has
214b0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
214c0 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20  itten to the.   
214d0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
214e0 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69  , then no sync i
214f0 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  s required. This
21500 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74   happens when it
21510 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   is.    ** writt
21520 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  en, then the pro
21530 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70  cess fails to up
21540 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
21550 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20  ERVED to an.    
21560 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
21570 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65  k. The next time
21580 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69   the process tri
21590 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  es to commit the
215a0 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
215b0 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65  ion the m-j name
215c0 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
215d0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e  dy been written.
215e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
215f0 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
21600 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  er ){.      rc =
21610 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
21620 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
21630 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
21640 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
21650 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
21660 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
21670 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
21680 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
21690 5f 4f 46 46 20 29 7b 0a 23 69 66 6e 64 65 66 20  _OFF ){.#ifndef 
216a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
216b0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20 69  VACUUM.        i
216c0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
216d0 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  e<pPager->dbOrig
216e0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
216f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61    /* If this tra
21700 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64  nsaction has mad
21710 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
21720 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c  maller, then all
21730 20 70 61 67 65 73 0a 20 20 20 20 20 20 20 20 20   pages.         
21740 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72   ** being discar
21750 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63  ded by the trunc
21760 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72  ation must be wr
21770 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
21780 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 20 20 2a  rnal.          *
21790 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  * file..        
217a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 50    */.          P
217b0 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 20  gno i;.         
217c0 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41   Pgno iSkip = PA
217d0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
217e0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50  er);.          P
217f0 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61  gno dbSize = pPa
21800 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
21810 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 70 50         for( i=pP
21820 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 31 3b 20  ager->dbSize+1; 
21830 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  i<=pPager->dbOri
21840 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  gSize; i++ ){.  
21850 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
21860 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
21870 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
21880 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53  nal, i) && i!=iS
21890 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kip ){.         
218a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
218b0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
218c0 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  , i, &pPg);.    
218d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
218e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
218f0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
21900 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
21910 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
21920 74 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  te(pPg);.       
21930 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
21940 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
21950 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
21960 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21970 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
21980 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
21990 20 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20           } .    
219a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
219b0 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20  Size = dbSize;. 
219c0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
219d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
219e0 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
219f0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
21a00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
21a10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
21a20 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
21a30 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
21a40 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
21a50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21a60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21a70 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
21a80 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66 20 53  exit;..#ifndef S
21a90 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
21aa0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
21ab0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61  ager->dbSize<pPa
21ac0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
21ad0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
21ae0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
21af0 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
21b00 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20  r->dbSize);.    
21b10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21b20 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
21b30 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  exit;.    }.#end
21b40 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  if..    /* Write
21b50 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
21b60 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
21b70 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67   file */.    pPg
21b80 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
21b90 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
21ba0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
21bb0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
21bc0 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
21bd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21be0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
21bf0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21c00 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
21c10 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
21c20 65 72 72 6f 72 20 6d 69 67 68 74 20 68 61 76 65  error might have
21c30 20 6c 65 66 74 20 74 68 65 20 64 69 72 74 79 20   left the dirty 
21c40 6c 69 73 74 20 61 6c 6c 20 66 6f 75 6c 65 64 20  list all fouled 
21c50 75 70 20 68 65 72 65 2c 0a 20 20 20 20 20 20 2a  up here,.      *
21c60 2a 20 62 75 74 20 74 68 61 74 20 64 6f 65 73 20  * but that does 
21c70 6e 6f 74 20 6d 61 74 74 65 72 20 62 65 63 61 75  not matter becau
21c80 73 65 20 69 66 20 74 68 65 20 69 66 20 74 68 65  se if the if the
21c90 20 64 69 72 74 79 20 6c 69 73 74 20 64 69 64 0a   dirty list did.
21ca0 20 20 20 20 20 20 2a 2a 20 67 65 74 20 63 6f 72        ** get cor
21cb0 72 75 70 74 65 64 2c 20 74 68 65 6e 20 74 68 65  rupted, then the
21cc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
21cd0 6c 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6e 64 0a  l roll back and.
21ce0 20 20 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64        ** discard
21cf0 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 2e   the dirty list.
21d00 20 20 54 68 65 72 65 20 69 73 20 61 6e 20 61 73    There is an as
21d10 73 65 72 74 20 69 6e 0a 20 20 20 20 20 20 2a 2a  sert in.      **
21d20 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
21d30 69 72 74 79 5f 70 61 67 65 73 28 29 20 74 68 61  irty_pages() tha
21d40 74 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  t verifies that 
21d50 6e 6f 20 61 74 74 65 6d 70 74 0a 20 20 20 20 20  no attempt.     
21d60 20 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 75   ** is made to u
21d70 73 65 20 61 6e 20 69 6e 76 61 6c 69 64 20 64 69  se an invalid di
21d80 72 74 79 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  rty list..      
21d90 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 79  */.      goto sy
21da0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nc_exit;.    }. 
21db0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
21dc0 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d  CleanAll(pPager-
21dd0 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 20 20  >pPCache);..    
21de0 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  /* Sync the data
21df0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
21e00 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
21e10 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63  oSync && !noSync
21e20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
21e30 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
21e40 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
21e50 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
21e60 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
21e70 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20  ("DBSYNC %p\n", 
21e80 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50  pPager))..    pP
21e90 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
21ea0 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65  GER_SYNCED;.  }e
21eb0 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26  lse if( MEMDB &&
21ec0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
21ed0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
21ee0 7a 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ze ){.    rc = s
21ef0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
21f00 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  ate(pPager, pPag
21f10 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
21f20 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69  ..sync_exit:.  i
21f30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
21f40 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20  ERR_BLOCKED ){. 
21f50 20 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72     /* pager_incr
21f60 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
21f70 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
21f80 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73  obtain an exclus
21f90 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20  ive.     * lock 
21fa0 74 6f 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63  to spill the cac
21fb0 68 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f  he and return IO
21fc0 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74  ERR_BLOCKED. But
21fd0 20 73 69 6e 63 65 20 0a 20 20 20 20 20 2a 20 74   since .     * t
21fe0 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
21ff0 65 20 74 68 65 20 63 61 63 68 65 20 69 73 20 69  e the cache is i
22000 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 20  nconsistent, it 
22010 69 73 0a 20 20 20 20 20 2a 20 62 65 74 74 65 72  is.     * better
22020 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
22030 45 5f 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a  E_BUSY..     */.
22040 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22050 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BUSY;.  }.  retu
22060 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
22070 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e   Commit all chan
22080 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
22090 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ase and release 
220a0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a  the write lock..
220b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
220c0 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  mit fails for an
220d0 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c  y reason, a roll
220e0 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20  back attempt is 
220f0 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  made.** and an e
22100 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
22110 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63  urned.  If the c
22120 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51  ommit worked, SQ
22130 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
22140 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
22150 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
22160 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72 20  tPhaseTwo(Pager 
22170 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
22180 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22190 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
221a0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
221b0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
221c0 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
221d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
221e0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
221f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22200 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
22210 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  f( pPager->dbMod
22220 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20  ified==0 &&.    
22230 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75      (pPager->jou
22240 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
22250 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
22260 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  TE ||.          
22270 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
22280 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20  eMode!=0) ){.   
22290 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
222a0 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c  >dirtyCache==0 |
222b0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
222c0 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  lOpen==0 );.    
222d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
222e0 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41  ;.  }.  PAGERTRA
222f0 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e  CE2("COMMIT %d\n
22300 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
22310 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r));.  assert( p
22320 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
22330 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d 45  GER_SYNCED || ME
22340 4d 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  MDB || !pPager->
22350 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20  dirtyCache );.  
22360 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
22370 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
22380 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
22390 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61  ster);.  rc = pa
223a0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
223b0 2c 20 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  , rc);.  return 
223c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
223d0 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
223e0 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  s.  The database
223f0 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50   falls back to P
22400 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65  AGER_SHARED mode
22410 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f  ..** All in-memo
22420 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72  ry cache pages r
22430 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f  evert to their o
22440 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e  riginal data con
22450 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f  tents..** The jo
22460 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64  urnal is deleted
22470 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
22480 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
22490 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
224a0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
224b0 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  t following.** t
224c0 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69  he correct locki
224d0 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75  ng protocol or u
224e0 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
224f0 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77  .** process is w
22500 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74  riting trash int
22510 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
22520 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  le (SQLITE_CORRU
22530 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73  PT) or.** unless
22540 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28   a prior malloc(
22550 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45  ) failed (SQLITE
22560 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70  _NOMEM).  Approp
22570 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  riate error.** c
22580 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65  odes are returne
22590 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20  d for all these 
225a0 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65  occasions.  Othe
225b0 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45  rwise,.** SQLITE
225c0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
225d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
225e0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67  agerRollback(Pag
225f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
22600 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22610 4b 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  K;.  PAGERTRACE2
22620 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
22630 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
22640 29 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  ));.  if( !pPage
22650 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c  r->dirtyCache ||
22660 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
22670 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
22680 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
22690 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
226a0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
226b0 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r);.  }else if( 
226c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
226d0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
226e0 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
226f0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
22700 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
22710 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
22720 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
22730 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
22740 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 50 61    }.    rc = pPa
22750 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
22760 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
22770 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
22780 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
22790 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20        int rc2;. 
227a0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
227b0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
227c0 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d   0);.      rc2 =
227d0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
227e0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70  action(pPager, p
227f0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
22800 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
22810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22820 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
22830 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
22840 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
22850 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
22860 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ger, 0);.    }..
22870 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
22880 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
22890 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
228a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
228b0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
228c0 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42  s during a ROLLB
228d0 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c  ACK, we can no l
228e0 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20  onger trust the 
228f0 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63 61 63  pager.    ** cac
22900 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65  he. So call page
22910 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65  r_error() on the
22920 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65   way out to make
22930 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 20 20   any error .    
22940 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20  ** persistent.. 
22950 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
22960 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
22970 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  r, rc);.  }.  re
22980 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22990 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
229a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
229b0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
229c0 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  d-only.  Return 
229d0 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20  FALSE.** if the 
229e0 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20  database is (in 
229f0 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65  theory) writable
22a00 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 50  ..*/.u8 sqlite3P
22a10 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50  agerIsreadonly(P
22a20 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
22a30 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
22a40 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
22a50 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
22a60 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
22a70 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e  es to the pager.
22a80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
22a90 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67  agerRefcount(Pag
22aa0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
22ab0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
22ac0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
22ad0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
22ae0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
22af0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
22b00 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70  rences to the sp
22b10 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
22b20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
22b30 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62  rPageRefcount(Db
22b40 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
22b50 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
22b60 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
22b70 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64  (pPage);.}..#ifd
22b80 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
22b90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
22ba0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
22bb0 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
22bc0 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
22bd0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61  *sqlite3PagerSta
22be0 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
22bf0 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
22c00 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
22c10 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
22c20 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
22c30 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d  Cache);.  a[1] =
22c40 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
22c50 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
22c60 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d  pPCache);.  a[2]
22c70 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
22c80 47 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  GetCachesize(pPa
22c90 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
22ca0 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
22cb0 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20 28 69  dbSizeValid ? (i
22cc0 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69  nt) pPager->dbSi
22cd0 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20  ze : -1;.  a[4] 
22ce0 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
22cf0 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
22d00 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
22d10 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
22d20 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
22d30 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
22d40 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74   = 0;  /* Used t
22d50 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76  o be pPager->nOv
22d60 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70  fl */.  a[9] = p
22d70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
22d80 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
22d90 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
22da0 20 61 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65   a;.}.int sqlite
22db0 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61  3PagerIsMemdb(Pa
22dc0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
22dd0 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a  return MEMDB;.}.
22de0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 6e  #endif../*.** En
22df0 73 75 72 65 20 74 68 61 74 20 74 68 65 72 65 20  sure that there 
22e00 61 72 65 20 61 74 20 6c 65 61 73 74 20 6e 53 61  are at least nSa
22e10 76 65 70 6f 69 6e 74 20 73 61 76 65 70 6f 69 6e  vepoint savepoin
22e20 74 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ts open..*/.int 
22e30 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
22e40 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
22e50 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61  *pPager, int nSa
22e60 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
22e70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22e80 0a 20 20 69 66 28 20 6e 53 61 76 65 70 6f 69 6e  .  if( nSavepoin
22e90 74 3e 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  t>pPager->nSavep
22ea0 6f 69 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e  oint && pPager->
22eb0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
22ec0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 50 61    int ii;.    Pa
22ed0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e  gerSavepoint *aN
22ee0 65 77 3b 0a 0a 20 20 20 20 2f 2a 20 45 69 74 68  ew;..    /* Eith
22ef0 65 72 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  er the sub-journ
22f00 61 6c 20 69 73 20 6f 70 65 6e 20 6f 72 20 74 68  al is open or th
22f10 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76  ere are no activ
22f20 65 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 2a 2f  e savepoints. */
22f30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
22f40 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d  ger->nSavepoint=
22f50 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 6a  =0 || pPager->sj
22f60 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a  fd->pMethods );.
22f70 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
22f80 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
22f90 74 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65  t array using re
22fa0 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20  alloc(). Return 
22fb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20  SQLITE_NOMEM.   
22fc0 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63   ** if the alloc
22fd0 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68  ation fails. Oth
22fe0 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65  erwise, zero the
22ff0 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20   new portion in 
23000 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d  case a .    ** m
23010 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
23020 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c  curs while popul
23030 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20  ating it in the 
23040 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65  for(...) loop be
23050 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  low..    */.    
23060 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76  aNew = (PagerSav
23070 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33  epoint *)sqlite3
23080 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
23090 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
230a0 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65  int, sizeof(Page
230b0 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76  rSavepoint)*nSav
230c0 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20  epoint.    );.  
230d0 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20    if( !aNew ){. 
230e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
230f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
23100 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77      memset(&aNew
23110 5b 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  [pPager->nSavepo
23120 69 6e 74 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20  int], 0,.       
23130 20 28 6e 53 61 76 65 70 6f 69 6e 74 20 2d 20 70   (nSavepoint - p
23140 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
23150 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61 67 65  t) * sizeof(Page
23160 72 53 61 76 65 70 6f 69 6e 74 29 0a 20 20 20 20  rSavepoint).    
23170 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
23180 53 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77  Savepoint = aNew
23190 3b 0a 20 20 20 20 69 69 20 3d 20 70 50 61 67 65  ;.    ii = pPage
231a0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20  r->nSavepoint;. 
231b0 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
231c0 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70 6f 69  point = nSavepoi
231d0 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75  nt;..    /* Popu
231e0 6c 61 74 65 20 74 68 65 20 50 61 67 65 72 53 61  late the PagerSa
231f0 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
23200 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65  es just allocate
23210 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 2f 2a  d. */.    for(/*
23220 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 69 69 3c 6e 53   no-op */; ii<nS
23230 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
23240 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23250 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
23260 69 64 20 29 3b 0a 20 20 20 20 20 20 61 4e 65 77  id );.      aNew
23270 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70 50 61  [ii].nOrig = pPa
23280 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
23290 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
232a0 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
232b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
232c0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4e  >0 ){.        aN
232d0 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d  ew[ii].iOffset =
232e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
232f0 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Off;.      }else
23300 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69  {.        aNew[i
23310 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55  i].iOffset = JOU
23320 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
23330 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
23340 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62     aNew[ii].iSub
23350 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Rec = pPager->st
23360 6d 74 4e 52 65 63 3b 0a 20 20 20 20 20 20 61 4e  mtNRec;.      aN
23370 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  ew[ii].pInSavepo
23380 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  int = sqlite3Bit
23390 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
233a0 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 20  ->dbSize);.     
233b0 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70   if( !aNew[ii].p
233c0 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  InSavepoint ){. 
233d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
233e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
233f0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
23400 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  * Open the sub-j
23410 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
23420 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
23430 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ned. */.    rc =
23440 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
23450 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
23460 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23470 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70  .** Parameter op
23480 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
23490 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  r SAVEPOINT_ROLL
234a0 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e  BACK or SAVEPOIN
234b0 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66  T_RELEASE..** If
234c0 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
234d0 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72  _RELEASE, then r
234e0 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74 72  elease and destr
234f0 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  oy the savepoint
23500 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69   with.** index i
23510 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74  Savepoint. If it
23520 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
23530 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c  LLBACK, then rol
23540 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
23550 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6f  s.** that have o
23560 63 63 75 72 65 64 20 73 69 6e 63 65 20 73 61 76  ccured since sav
23570 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  epoint iSavepoin
23580 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a  t was created..*
23590 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
235a0 61 73 65 2c 20 61 6c 6c 20 73 61 76 65 70 6f 69  ase, all savepoi
235b0 6e 74 73 20 77 69 74 68 20 61 6e 20 69 6e 64 65  nts with an inde
235c0 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 69  x greater than i
235d0 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 61 72  Savepoint .** ar
235e0 65 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a  e destroyed..**.
235f0 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
23600 6c 65 73 73 20 74 68 61 6e 20 28 69 53 61 76 65  less than (iSave
23610 70 6f 69 6e 74 2b 31 29 20 61 63 74 69 76 65 20  point+1) active 
23620 73 61 76 65 70 6f 69 6e 74 73 20 77 68 65 6e 20  savepoints when 
23630 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
23640 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 74 20 69  n is called it i
23650 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 69  s a no-op..*/ .i
23660 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
23670 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
23680 70 50 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c 20  pPager, int op, 
23690 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
236a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
236b0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
236c0 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
236d0 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
236e0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
236f0 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76  K );..  if( iSav
23700 65 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e  epoint<pPager->n
23710 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
23720 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74   int ii;.    int
23730 20 6e 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69   nNew = iSavepoi
23740 6e 74 20 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f  nt + (op==SAVEPO
23750 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  INT_ROLLBACK);. 
23760 20 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20     for(ii=nNew; 
23770 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
23780 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
23790 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
237a0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
237b0 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
237c0 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  pInSavepoint);. 
237d0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
237e0 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e  >nSavepoint = nN
237f0 65 77 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 3d  ew;..    if( op=
23800 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
23810 41 43 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  ACK && pPager->j
23820 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
23830 20 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70        PagerSavep
23840 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
23850 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26   = (nNew==0)?0:&
23860 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
23870 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20  nt[nNew-1];.    
23880 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61 79    rc = pagerPlay
23890 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70 50  backSavepoint(pP
238a0 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e 74  ager, pSavepoint
238b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
238c0 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29  rc!=SQLITE_DONE)
238d0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
238e0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
238f0 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75  elease of the ou
23900 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e  termost savepoin
23910 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20  t, truncate .   
23920 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
23930 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  nal. */.    if( 
23940 6e 4e 65 77 3d 3d 30 20 26 26 20 6f 70 3d 3d 53  nNew==0 && op==S
23950 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
23960 20 26 26 20 70 50 61 67 65 72 2d 3e 73 6a 66 64   && pPager->sjfd
23970 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
23980 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
23990 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
239a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
239b0 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
239c0 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  ->sjfd, 0);.    
239d0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
239e0 65 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ec = 0;.    }.  
239f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
23a00 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
23a10 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
23a20 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
23a30 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
23a40 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
23a50 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72  erFilename(Pager
23a60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
23a70 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  urn pPager->zFil
23a80 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
23a90 52 65 74 75 72 6e 20 74 68 65 20 56 46 53 20 73  Return the VFS s
23aa0 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
23ab0 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   pager..*/.const
23ac0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71   sqlite3_vfs *sq
23ad0 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 50 61  lite3PagerVfs(Pa
23ae0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
23af0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
23b00 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Vfs;.}../*.** Re
23b10 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61  turn the file ha
23b20 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74  ndle for the dat
23b30 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63  abase file assoc
23b40 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
23b50 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d  e pager.  This m
23b60 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ight return NULL
23b70 20 69 66 20 74 68 65 20 66 69 6c 65 20 68 61 73   if the file has
23b80 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  .** not yet been
23b90 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69   opened..*/.sqli
23ba0 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65  te3_file *sqlite
23bb0 33 50 61 67 65 72 46 69 6c 65 28 50 61 67 65 72  3PagerFile(Pager
23bc0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
23bd0 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a  urn pPager->fd;.
23be0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
23bf0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66  the directory of
23c00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23c10 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
23c20 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44  r *sqlite3PagerD
23c30 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  irname(Pager *pP
23c40 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
23c50 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
23c60 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ry;.}../*.** Ret
23c70 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
23c80 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75  hname of the jou
23c90 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  rnal file..*/.co
23ca0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
23cb0 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d  3PagerJournalnam
23cc0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
23cd0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
23ce0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a  r->zJournal;.}..
23cf0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
23d00 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c  e if fsync() cal
23d10 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20  ls are disabled 
23d20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
23d30 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
23d40 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65   if fsync()s are
23d50 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c   executed normal
23d60 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
23d70 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61  e3PagerNosync(Pa
23d80 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
23d90 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e  return pPager->n
23da0 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  oSync;.}..#ifdef
23db0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
23dc0 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  C./*.** Set the 
23dd0 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
23de0 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ager.*/.void sql
23df0 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65  ite3PagerSetCode
23e00 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  c(.  Pager *pPag
23e10 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  er,.  void *(*xC
23e20 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
23e30 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76  *,Pgno,int),.  v
23e40 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29  oid *pCodecArg.)
23e50 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  {.  pPager->xCod
23e60 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70  ec = xCodec;.  p
23e70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67  Pager->pCodecArg
23e80 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a   = pCodecArg;.}.
23e90 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
23ea0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
23eb0 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76  VACUUM./*.** Mov
23ec0 65 20 74 68 65 20 70 61 67 65 20 70 50 67 20 74  e the page pPg t
23ed0 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20  o location pgno 
23ee0 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  in the file..**.
23ef0 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
23f00 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74   no references t
23f10 6f 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  o the page previ
23f20 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74  ously located at
23f30 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20  .** pgno (which 
23f40 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20  we call pPgOld) 
23f50 74 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65  though that page
23f60 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62   is allowed to b
23f70 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20  e.** in cache.  
23f80 49 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76  If the page prev
23f90 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61  iously located a
23fa0 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c  t pgno is not al
23fb0 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20  ready.** in the 
23fc0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
23fd0 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20  , it is not put 
23fe0 74 68 65 72 65 20 62 79 20 62 79 20 74 68 69 73  there by by this
23ff0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
24000 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  References to th
24010 65 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69  e page pPg remai
24020 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e  n valid. Updatin
24030 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61  g any.** meta-da
24040 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
24050 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74  th pPg (i.e. dat
24060 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
24070 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
24080 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
24090 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69  with the page) i
240a0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
240b0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
240c0 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e  er..**.** A tran
240d0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
240e0 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73  active when this
240f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
24100 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62  ed. It used to b
24110 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68  e.** required th
24120 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  at a statement t
24130 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e  ransaction was n
24140 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74  ot active, but t
24150 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a  his restriction.
24160 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f  ** has been remo
24170 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45  ved (CREATE INDE
24180 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20  X needs to move 
24190 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74  a page when a st
241a0 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
241b0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
241c0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
241d0 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c  fourth argument,
241e0 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f   isCommit, is no
241f0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n-zero, then thi
24200 73 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a  s page is being.
24210 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74  ** moved as part
24220 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 72   of a database r
24230 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75  eorganization ju
24240 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  st before the tr
24250 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73  ansaction .** is
24260 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
24270 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
24280 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
24290 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
242a0 73 65 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20  se page .** pPg 
242b0 72 65 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e  refers to will n
242c0 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ot be written to
242d0 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
242e0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
242f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
24300 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65  gerMovepage(Page
24310 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67  r *pPager, DbPag
24320 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  e *pPg, Pgno pgn
24330 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29  o, int isCommit)
24340 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c  {.  PgHdr *pPgOl
24350 64 3b 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  d;  /* The page 
24360 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
24370 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65  n. */.  Pgno nee
24380 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a  dSyncPgno = 0;..
24390 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
243a0 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45  Ref>0 );..  PAGE
243b0 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64  RTRACE5("MOVE %d
243c0 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79   page %d (needSy
243d0 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20  nc=%d) moves to 
243e0 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41  %d\n", .      PA
243f0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
24400 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e  Pg->pgno, (pPg->
24410 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
24420 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f  _SYNC)?1:0, pgno
24430 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d  );.  IOTRACE(("M
24440 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c  OVE %p %d %d\n",
24450 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
24460 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61  no, pgno))..  pa
24470 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
24480 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pPg);..  /* If t
24490 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
244a0 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
244b0 62 65 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d  before page pPg-
244c0 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62  >pgno can.  ** b
244d0 65 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74  e written to, st
244e0 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e  ore pPg->pgno in
244f0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20   local variable 
24500 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
24510 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69  **.  ** If the i
24520 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  sCommit flag is 
24530 73 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  set, there is no
24540 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
24550 72 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  r that.  ** the 
24560 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
24570 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
24580 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
24590 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a  e pPg->pgno .  *
245a0 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
245b0 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
245c0 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
245d0 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
245e0 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  e to it..  */.  
245f0 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
24600 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
24610 20 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b   && !isCommit ){
24620 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
24630 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
24640 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49     assert( pageI
24650 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c  nJournal(pPg) ||
24660 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
24670 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
24680 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
24690 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
246a0 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72  RTY );.    asser
246b0 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
246c0 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
246d0 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f   If the cache co
246e0 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69  ntains a page wi
246f0 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70  th page-number p
24700 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20  gno, remove it. 
24710 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73   ** from its has
24720 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69  h chain. Also, i
24730 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
24740 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72  Sync was set for
24750 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f   .  ** page pgno
24760 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76   before the 'mov
24770 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74  e' operation, it
24780 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74   needs to be ret
24790 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20  ained .  ** for 
247a0 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74  the page moved t
247b0 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  here..  */.  pPg
247c0 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
247d0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70  R_NEED_SYNC;.  p
247e0 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
247f0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
24800 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  o);.  assert( !p
24810 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d  PgOld || pPgOld-
24820 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66  >nRef==1 );.  if
24830 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
24840 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70  pPg->flags |= (p
24850 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48  PgOld->flags&PGH
24860 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20  DR_NEED_SYNC);. 
24870 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61   }..  sqlite3Pca
24880 63 68 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e  cheMove(pPg, pgn
24890 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64  o);.  if( pPgOld
248a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
248b0 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c 64  cacheDrop(pPgOld
248c0 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
248d0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
248e0 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d  (pPg);.  pPager-
248f0 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
24900 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  .  pPager->dbMod
24910 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66  ified = 1;..  if
24920 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29  ( needSyncPgno )
24930 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64  {.    /* If need
24940 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d  SyncPgno is non-
24950 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a  zero, then the j
24960 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
24970 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  s to be .    ** 
24980 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
24990 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74  any data is writ
249a0 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20  ten to database 
249b0 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79  file page needSy
249c0 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43  ncPgno..    ** C
249d0 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63  urrently, no suc
249e0 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e  h page exists in
249f0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
24a00 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
24a10 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62  "is journaled" b
24a20 69 74 76 65 63 20 66 6c 61 67 20 68 61 73 20 62  itvec flag has b
24a30 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65  een set. This ne
24a40 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69  eds to be remedi
24a50 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61  ed by.    ** loa
24a60 64 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e  ding the page in
24a70 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  to the pager-cac
24a80 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74  he and setting t
24a90 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
24aa0 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a  c .    ** flag..
24ab0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
24ac0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
24ad0 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e  load the page in
24ae0 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  to the page-cach
24af0 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20  e fails, (due.  
24b00 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63    ** to a malloc
24b10 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65  () or IO failure
24b20 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74  ), clear the bit
24b30 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e   in the pInJourn
24b40 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61  al[].    ** arra
24b50 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
24b60 20 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61   the page is loa
24b70 64 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20  ded and written 
24b80 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20  again in.    ** 
24b90 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
24ba0 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74  , it may be writ
24bb0 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
24bc0 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a  ase file before.
24bd0 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e      ** it is syn
24be0 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ced into the jou
24bf0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
24c00 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20  way, it may end 
24c10 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  up in.    ** the
24c20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77   journal file tw
24c30 69 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73  ice, but that is
24c40 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a   not a problem..
24c50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
24c60 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
24c70 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75  t() call may cau
24c80 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  se the journal t
24c90 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a  o sync. So make.
24ca0 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20      ** sure the 
24cb0 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
24cc0 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a  lag is set too..
24cd0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72      */.    int r
24ce0 63 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  c;.    PgHdr *pP
24cf0 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74  gHdr;.    assert
24d00 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
24d10 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  nc );.    rc = s
24d20 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
24d30 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50  Pager, needSyncP
24d40 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  gno, &pPgHdr);. 
24d50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24d60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
24d70 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
24d80 72 6e 61 6c 20 26 26 20 6e 65 65 64 53 79 6e 63  rnal && needSync
24d90 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  Pgno<=pPager->db
24da0 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
24db0 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
24dc0 63 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70  cClear(pPager->p
24dd0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53  InJournal, needS
24de0 79 6e 63 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  yncPgno);.      
24df0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  }.      return r
24e00 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  c;.    }.    pPa
24e10 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
24e20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
24e30 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30  Pager->noSync==0
24e40 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
24e50 20 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20    pPgHdr->flags 
24e60 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
24e70 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  NC;.    sqlite3P
24e80 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
24e90 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69  PgHdr);.    sqli
24ea0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
24eb0 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  gHdr);.  }..  re
24ec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24ed0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
24ee0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
24ef0 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72   to the data for
24f00 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
24f10 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
24f20 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
24f30 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
24f40 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
24f50 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50  Ref>0 || pPg->pP
24f60 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20  ager->memDb );. 
24f70 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61   return pPg->pDa
24f80 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ta;.}../*.** Ret
24f90 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
24fa0 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72   the Pager.nExtr
24fb0 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72  a bytes of "extr
24fc0 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c  a" space .** all
24fd0 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
24fe0 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
24ff0 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
25000 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
25010 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  tra(DbPage *pPg)
25020 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
25030 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
25040 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
25050 72 3f 70 50 67 2d 3e 70 45 78 74 72 61 3a 30 29  r?pPg->pExtra:0)
25060 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
25070 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  et the locking-m
25080 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ode for this pag
25090 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d  er. Parameter eM
250a0 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a  ode must be one.
250b0 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b  ** of PAGER_LOCK
250c0 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50  INGMODE_QUERY, P
250d0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
250e0 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50  _NORMAL or .** P
250f0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
25100 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74  _EXCLUSIVE. If t
25110 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
25120 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e  not _QUERY, then
25130 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  .** the locking-
25140 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74  mode is set to t
25150 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69  he value specifi
25160 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ed..**.** The re
25170 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
25180 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43  either PAGER_LOC
25190 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
251a0 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  or.** PAGER_LOCK
251b0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
251c0 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  E, indicating th
251d0 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
251e0 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20  bly updated).** 
251f0 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f  locking-mode..*/
25200 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
25210 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67  rLockingMode(Pag
25220 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
25230 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74  eMode){.  assert
25240 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
25250 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
25260 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
25270 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
25280 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a  KINGMODE_NORMAL.
25290 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
252a0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
252b0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
252c0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
252d0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
252e0 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73  _QUERY<0 );.  as
252f0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
25300 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d  INGMODE_NORMAL>=
25310 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49  0 && PAGER_LOCKI
25320 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
25330 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f  >=0 );.  if( eMo
25340 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72  de>=0 && !pPager
25350 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
25360 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
25370 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d  iveMode = (u8)eM
25380 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ode;.  }.  retur
25390 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65  n (int)pPager->e
253a0 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a  xclusiveMode;.}.
253b0 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
253c0 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
253d0 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
253e0 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20  Parameter eMode 
253f0 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a  must be one of:.
25400 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  **.**    PAGER_J
25410 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
25420 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
25430 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a  RNALMODE_DELETE.
25440 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
25450 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
25460 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
25470 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
25480 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
25490 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 0a  RNALMODE_OFF.**.
254a0 2a 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  ** If the parame
254b0 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52  ter is not _QUER
254c0 59 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  Y, then the jour
254d0 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 73 65 74 20  nal-mode is set 
254e0 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  to the.** value 
254f0 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
25500 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 69 6e   The returned in
25510 64 69 63 61 74 65 20 74 68 65 20 63 75 72 72 65  dicate the curre
25520 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64  nt (possibly upd
25530 61 74 65 64 29 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ated).** journal
25540 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
25550 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
25560 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  lMode(Pager *pPa
25570 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
25580 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b  .  if( !MEMDB ){
25590 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4d 6f  .    assert( eMo
255a0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
255b0 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20  LMODE_QUERY.    
255c0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
255d0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
255e0 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20  LMODE_DELETE.   
255f0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
25600 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
25610 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a  ALMODE_TRUNCATE.
25620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
25630 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
25640 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
25650 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T.              
25660 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
25670 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
25680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
25690 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
256a0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
256b0 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Y );.    assert(
256c0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
256d0 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20  DE_QUERY<0 );.  
256e0 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 29    if( eMode>=0 )
256f0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
25700 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75  journalMode = (u
25710 38 29 65 4d 6f 64 65 3b 0a 20 20 20 20 7d 65 6c  8)eMode;.    }el
25720 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
25730 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  ( eMode==PAGER_J
25740 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
25750 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
25760 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67  return (int)pPag
25770 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b  er->journalMode;
25780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
25790 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74  t the size-limit
257a0 20 75 73 65 64 20 66 6f 72 20 70 65 72 73 69 73   used for persis
257b0 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tent journal fil
257c0 65 73 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  es..*/.i64 sqlit
257d0 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69  e3PagerJournalSi
257e0 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  zeLimit(Pager *p
257f0 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69  Pager, i64 iLimi
25800 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74  t){.  if( iLimit
25810 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67  >=-1 ){.    pPag
25820 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
25830 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20  imit = iLimit;. 
25840 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67   }.  return pPag
25850 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
25860 69 6d 69 74 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  imit;.}..#endif 
25870 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
25880 49 53 4b 49 4f 20 2a 2f 0a                       ISKIO */.